A discord bot for teal.fm
discord tealfm music

another giga pr with a lot of changes

besaid.zone e4fcf3e1 5494a9fa

verified
.env.example packages/.env.example
-1
CONTRIBUTING.md
··· 66 66 ## Reporting bugs 67 67 68 68 - Open an issue with steps to reproduce, expected vs actual behavior, and relevant logs or error messages. 69 -
+55 -36
README.md
··· 3 3 This repository contains the Disco Stu Discord bot, supporting services, and shared packages used by the project. The workspace is a monorepo managed with pnpm and TypeScript; each app and package has its own package.json and build/dev scripts. 4 4 5 5 **Repository Structure** 6 + 6 7 - `apps/` : Application code (runtime programs and services) 7 - - `bot/` : Discord bot (commands, deploy script) 8 - - `tapper/` : Backfill client for Tap service 9 - - `web/` : Web server to handle OAuth 8 + - `bot/` : Discord bot (commands, deploy script) 9 + - `tapper/` : Backfill client for Tap service 10 + - `web/` : Web server to handle OAuth 10 11 - `packages/` : Shared libraries used across apps 11 - - `common/` : Logging and shared utilities 12 - - `database/` : Database access, Kysely migrations and seed scripts 13 - - `tsconfig/` : Shared TypeScript config packages 12 + - `common/` : Logging and shared utilities 13 + - `database/` : Database access, Kysely migrations and seed scripts 14 + - `tsconfig/` : Shared TypeScript config packages 14 15 15 16 **Apps** 17 + 16 18 - `apps/bot` — Discord bot 17 - - Entry: `apps/bot/main.ts`. 18 - - Key files: `apps/bot/commands/*.ts` (command handlers), `apps/bot/deploy-commands.ts` (registers commands with Discord), `apps/bot/discord.d.ts` (types). 19 - - Useful scripts (see [apps/bot/package.json](apps/bot/package.json)): 20 - - `dev` — run bot in watch mode with `tsx --watch main.ts` 21 - - `deploy-commands` — run `deploy-commands.ts` to push slash-command definitions to Discord 22 - - `build` — compile TypeScript to `dist/` 23 - - `start` — run compiled bot from `dist/main.js` 19 + - Entry: `apps/bot/main.ts`. 20 + - Key files: `apps/bot/commands/*.ts` (command handlers), `apps/bot/deploy-commands.ts` (registers commands with Discord), `apps/bot/discord.d.ts` (types). 21 + - Useful scripts (see [apps/bot/package.json](apps/bot/package.json)): 22 + - `dev` — run bot in watch mode with `tsx --watch main.ts` 23 + - `deploy-commands` — run `deploy-commands.ts` to push slash-command definitions to Discord 24 + - `build` — compile TypeScript to `dist/` 25 + - `start` — run compiled bot from `dist/main.js` 24 26 25 27 - `apps/tapper` — Tap client 26 - - Entry: `apps/tapper/index.ts`. 27 - - Purpose: Interact with tap service running at https://tap.xero.systems 28 - - Useful scripts (see [apps/tapper/package.json](apps/tapper/package.json)): 29 - - `dev` — runs `NODE_ENV=development tsx index.ts` 30 - - `start` — run compiled `dist/index.js` in production 28 + - Entry: `apps/tapper/index.ts`. 29 + - Purpose: Interact with tap service running at https://tap.xero.systems 30 + - Useful scripts (see [apps/tapper/package.json](apps/tapper/package.json)): 31 + - `dev` — runs `NODE_ENV=development tsx index.ts` 32 + - `start` — run compiled `dist/index.js` in production 31 33 32 34 - `apps/web` — Web server 33 - - Entry: `apps/web/index.ts`. 34 - - Integrates with AT Protocol APIs and provides OAuth/web endpoints. 35 - - Useful scripts (see [apps/web/package.json](apps/web/package.json)): 36 - - `dev` — `tsx --watch index.ts` to run in dev 37 - - `build` — compile TypeScript 38 - - `start` — run compiled server from `dist/index.js` 35 + - Entry: `apps/web/index.ts`. 36 + - Integrates with AT Protocol APIs and provides OAuth/web endpoints. 37 + - Useful scripts (see [apps/web/package.json](apps/web/package.json)): 38 + - `dev` — `tsx --watch index.ts` to run in dev 39 + - `build` — compile TypeScript 40 + - `start` — run compiled server from `dist/index.js` 39 41 40 42 **Packages** 43 + 41 44 - `packages/common` — shared utilities and logging 42 - - Exports logging helpers and other common utilities used by apps. Build with `pnpm --filter @tealfmbot/common build` or use workspace protocol. 43 - - Scripts: `build`, `build:watch`, `typecheck` (see [packages/common/package.json](packages/common/package.json)). 45 + - Exports logging helpers and other common utilities used by apps. Build with `pnpm --filter @tealfmbot/common build` or use workspace protocol. 46 + - Scripts: `build`, `build:watch`, `typecheck` (see [packages/common/package.json](packages/common/package.json)). 44 47 45 48 - `packages/database` — Kysely-based database layer 46 - - Contains DB helpers, `migrate.ts`, `seed.ts`, and Kysely codegen support. 47 - - Scripts (see [packages/database/package.json](packages/database/package.json)): 48 - - `migrate` — run `kysely migrate latest` to apply migrations 49 - - `codegen` — run `kysely-codegen` to regenerate `database.d.ts` 50 - - `seed` — run `tsx seed.ts` to seed data 51 - - `build`, `build:watch`, `typecheck` 49 + - Contains DB helpers, `migrate.ts`, `seed.ts`, and Kysely codegen support. 50 + - Scripts (see [packages/database/package.json](packages/database/package.json)): 51 + - `migrate` — run `kysely migrate latest` to apply migrations 52 + - `codegen` — run `kysely-codegen` to regenerate `database.d.ts` 53 + - `seed` — run `tsx seed.ts` to seed data 54 + - `build`, `build:watch`, `typecheck` 52 55 53 56 - `packages/tsconfig` — shared TypeScript configs 54 - - Provides base tsconfig settings shared by other packages. 57 + - Provides base tsconfig settings shared by other packages. 55 58 56 59 **Top-level scripts** (see [package.json](package.json)) 60 + 57 61 - `pnpm bot` — start the bot dev script (`pnpm --filter bot dev`) 58 62 - `pnpm tap` — start the tapper dev script (`pnpm --filter tapper dev`) 59 63 - `pnpm web` — start the web app dev script (`pnpm --filter web dev`) ··· 65 69 - `pnpm format` — run `oxfmt` to format code 66 70 67 71 Developer workflow 72 + 68 73 - Install dependencies: `pnpm install` (pnpm v10+ recommended) 69 74 - Develop a single app: 70 - - Bot: `pnpm --filter bot dev` or `pnpm bot` 71 - - Tapper: `pnpm --filter tapper dev` or `pnpm tap` 72 - - Web: `pnpm --filter web dev` or `pnpm web` 75 + - Bot: `pnpm --filter bot dev` or `pnpm bot` 76 + - Tapper: `pnpm --filter tapper dev` or `pnpm tap` 77 + - Web: `pnpm --filter web dev` or `pnpm web` 73 78 - Develop all apps concurrently: `pnpm dev:all` 74 79 - Build all packages and apps: `pnpm build` 75 80 76 81 Database tasks 82 + 77 83 - Migrations are managed via Kysely. Run migrations from the `packages/database` package: 78 84 79 85 ```bash ··· 87 93 ``` 88 94 89 95 Docker / deployment 96 + 90 97 - `Dockerfile` and `docker-compose.prod.yml` are included for building and deploying container images. 91 98 - The repository contains `build-and-publish-images.sh` to build and publish images (will be a CI thing eventually). 92 99 93 100 Project tooling 101 + 94 102 - `lefthook.yml` configures git hooks. 95 103 - `oxlint` and `oxfmt` are used for linting and formatting. 96 104 97 105 Notes & tips 106 + 98 107 - To deploy Discord commands after changes, run the bot package `deploy-commands` script: 99 108 100 109 ```bash ··· 111 120 git clone https://tangled.org/dane.is.extraordinarily.cool/tealfmbot 112 121 cd tealfmbot 113 122 pnpm install 123 + ``` 124 + 125 + - Start and run database migrations 126 + 127 + ```bash 128 + docker compose -f docker-compose.dev.yml up -d 129 + 130 + cd packages/database 131 + 132 + pnpm migrate 114 133 ``` 115 134 116 135 - Start individual apps in development:
+8 -18
apps/bot/commands/auth.ts
··· 1 + import { env } from "@tealfmbot/common/constants"; 1 2 import { logger } from "@tealfmbot/common/logger"; 2 - import { 3 - ChatInputCommandInteraction, 4 - InteractionContextType, 5 - SlashCommandBuilder, 6 - } from "discord.js"; 3 + import { ChatInputCommandInteraction, SlashCommandBuilder } from "discord.js"; 7 4 8 5 export default { 9 6 data: new SlashCommandBuilder() 10 - .setName("auth") 11 - .setDescription("Authenticate your account with the teal.fm bot to start tracking your listens") 12 - .addStringOption((option) => 13 - option 14 - .setName("identifier") 15 - .setDescription("e.g. 'handle.bsky.social or did:plc...'") 16 - .setRequired(true) 17 - .setMinLength(1), 18 - ) 19 - .setContexts(InteractionContextType.Guild), 7 + .setName("login") 8 + .setDescription( 9 + "Authenticate with your Atmosphere account and request your listens to be tracked", 10 + ), 20 11 async execute(interaction: ChatInputCommandInteraction) { 21 - const identifier = interaction.options.getString("identifier"); 22 - await interaction.reply(`hello ${identifier}`); 23 - logger.info(`starting authentication process for ${identifier} at ${new Date().toJSON()}`); 12 + await interaction.reply(`Log in here and request to be tracked: ${env.WEB_SERVICE_URL}:${env.WEB_SERVICE_PORT}/login`); 13 + logger.info(`starting authentication process for ${interaction.user.globalName} at ${new Date().toJSON()}`); 24 14 }, 25 15 };
+4 -6
apps/bot/deploy-commands.ts
··· 1 1 import { 2 - DISCORD_APPLICATION_ID, 3 - DISCORD_BOT_TOKEN, 4 - DISCORD_GUILD_ID, 2 + env 5 3 } from "@tealfmbot/common/constants"; 6 4 import { REST, Routes } from "discord.js"; 7 5 import fs from "node:fs"; 8 6 import path from "node:path"; 9 7 10 8 const commands = []; 11 - const commandPaths = fs.globSync("commands/**/*.js"); 9 + const commandPaths = fs.globSync("dist/commands/*.js"); 12 10 13 11 for await (const cmdPath of commandPaths) { 14 12 const absoluteCommandPath = path.join(import.meta.dirname, cmdPath); ··· 22 20 } 23 21 } 24 22 25 - const rest = new REST().setToken(DISCORD_BOT_TOKEN); 23 + const rest = new REST().setToken(env.DISCORD_BOT_TOKEN); 26 24 27 25 (async () => { 28 26 try { 29 27 console.log(`Started refreshing ${commands.length} application (/) commands.`); 30 28 31 29 const data = (await rest.put( 32 - Routes.applicationGuildCommands(DISCORD_APPLICATION_ID, DISCORD_GUILD_ID), 30 + Routes.applicationGuildCommands(env.DISCORD_APPLICATION_ID, env.DISCORD_GUILD_ID), 33 31 { body: commands }, 34 32 )) as unknown[]; 35 33
+3 -3
apps/bot/main.ts
··· 1 - import { DISCORD_BOT_TOKEN } from "@tealfmbot/common/constants"; 1 + import { env } from "@tealfmbot/common/constants"; 2 2 import { logger } from "@tealfmbot/common/logger"; 3 3 import { Client, Collection, Events, GatewayIntentBits, MessageFlags } from "discord.js"; 4 4 import fs from "node:fs"; ··· 10 10 console.log(`teal.fm bot ready and logged in as ${readyClient.user.tag}`); 11 11 }); 12 12 13 - client.login(DISCORD_BOT_TOKEN); 13 + client.login(env.DISCORD_BOT_TOKEN); 14 14 15 15 client.on(Events.InteractionCreate, async (interaction) => { 16 16 if (!interaction.isChatInputCommand()) return; ··· 39 39 40 40 client.commands = new Collection(); 41 41 42 - const commandPaths = fs.globSync("commands/*.js"); 42 + const commandPaths = fs.globSync("dist/commands/*.js"); 43 43 for await (const file of commandPaths) { 44 44 const absoluteCommandPath = path.join(import.meta.dirname, file); 45 45 const command = await import(absoluteCommandPath);
+2 -1
apps/bot/package.json
··· 7 7 "dev": "tsx --watch main.ts", 8 8 "deploy-commands": "tsx deploy-commands.ts", 9 9 "build": "tsc", 10 + "watch": "tsc --watch", 10 11 "start": "node dist/main.js", 11 12 "typecheck": "tsc --noEmit" 12 13 }, 13 14 "dependencies": { 14 15 "@tealfmbot/common": "workspace:*", 15 - "@tealfmbot/tsconfig": "workspace:*", 16 16 "discord.js": "^14.25.1" 17 17 }, 18 18 "devDependencies": { 19 + "@tealfmbot/tsconfig": "workspace:*", 19 20 "@types/node": "^25.0.3", 20 21 "tsx": "^4.21.0", 21 22 "typescript": "^5.9.3"
+2 -2
apps/tapper/index.ts
··· 1 1 import { SimpleIndexer, Tap } from "@atproto/tap"; 2 - import { TAP_ADMIN_PASSWORD } from "@tealfmbot/common/constants"; 2 + import { env } from "@tealfmbot/common/constants"; 3 3 // import { db } from "./kysely/db.ts" 4 4 5 5 const tap = new Tap("https://tap.xero.systems", { 6 - adminPassword: TAP_ADMIN_PASSWORD, 6 + adminPassword: env.TAP_ADMIN_PASSWORD, 7 7 }); 8 8 9 9 const indexer = new SimpleIndexer();
+2 -2
apps/tapper/package.json
··· 10 10 }, 11 11 "dependencies": { 12 12 "@atproto/tap": "^0.0.2", 13 - "@tealfmbot/common": "workspace:*", 14 - "@tealfmbot/tsconfig": "workspace:*" 13 + "@tealfmbot/common": "workspace:*" 15 14 }, 16 15 "devDependencies": { 16 + "@tealfmbot/tsconfig": "workspace:*", 17 17 "@types/node": "^25.0.3", 18 18 "tsx": "^4.21.0", 19 19 "typescript": "^5.9.3"
+22 -10
apps/web/client.ts
··· 5 5 NodeOAuthClient, 6 6 type OAuthClientMetadataInput, 7 7 } from "@atproto/oauth-client-node"; 8 - import { PUBLIC_URL, PRIVATE_KEYS } from "@tealfmbot/common/constants"; 8 + import { env } from "@tealfmbot/common/constants"; 9 9 import { db } from "@tealfmbot/database/db"; 10 10 import assert from "node:assert"; 11 - 12 11 import { SessionStore, StateStore } from "./storage.js"; 13 12 13 + const loadJwk = async () => { 14 + const raw = env.PRIVATE_KEYS; 15 + if (!raw) return undefined; 16 + const json = JSON.parse(raw); 17 + if (!json) return undefined; 18 + const keys = await Promise.all( 19 + json.map((jwk: string | Record<string, unknown>) => JoseKey.fromJWK(jwk)), 20 + ); 21 + return new Keyset(keys); 22 + }; 23 + 14 24 const keyset = 15 - PUBLIC_URL && PRIVATE_KEYS 16 - ? new Keyset(await Promise.all(PRIVATE_KEYS.map((jwk) => JoseKey.fromJWK(jwk)))) 25 + env.PUBLIC_URL && env.PRIVATE_KEYS 26 + ? await loadJwk() 17 27 : undefined; 18 28 19 - assert(!PUBLIC_URL || keyset?.size, "PRIVATE_KEYS environment variable must be set"); 29 + 30 + 31 + assert(!env.PUBLIC_URL || keyset?.size, "PRIVATE_KEYS environment variable must be set"); 20 32 21 33 const pk = keyset?.findPrivateKey({ usage: "sign" }); 22 34 23 - const metadata: OAuthClientMetadataInput = PUBLIC_URL 35 + const metadata: OAuthClientMetadataInput = env.PUBLIC_URL 24 36 ? { 25 37 client_name: "Disco Stu - Teal.fm Discord Bot", 26 - client_id: `${PUBLIC_URL}/oauth-client-metadata.json`, 27 - jwks_uri: `${PUBLIC_URL}/.well-known/jwks.json`, 28 - redirect_uris: [`${PUBLIC_URL}/oauth/callback`], 38 + client_id: `${env.PUBLIC_URL}/oauth-client-metadata.json`, 39 + jwks_uri: `${env.PUBLIC_URL}/.well-known/jwks.json`, 40 + redirect_uris: [`${env.PUBLIC_URL}/oauth/callback`], 29 41 scope: "atproto", 30 42 grant_types: ["authorization_code", "refresh_token"], 31 43 response_types: ["code"], ··· 36 48 } 37 49 : atprotoLoopbackClientMetadata( 38 50 `http://localhost?${new URLSearchParams([ 39 - ["redirect_uri", "http://127.0.0.1:8002/oauth/callback"], 51 + ["redirect_uri", `http://127.0.0.1:${env.WEB_SERVICE_PORT}/oauth/callback`], 40 52 ["scope", "atproto"], 41 53 ])}`, 42 54 );
+4 -4
apps/web/index.ts
··· 1 1 import { serve, type HttpBindings } from "@hono/node-server"; 2 - import { COOKIE_SECRET } from "@tealfmbot/common/constants"; 2 + import { env } from "@tealfmbot/common/constants"; 3 3 import { logger } from "@tealfmbot/common/logger"; 4 4 import { Hono } from "hono"; 5 5 import { deleteCookie, getSignedCookie } from "hono/cookie"; ··· 61 61 const params = new URLSearchParams(c.req.url.split("?")[1]); 62 62 63 63 try { 64 - const session = await getSignedCookie(c, COOKIE_SECRET, "__teal_fm_bot_session"); 64 + const session = await getSignedCookie(c, env.COOKIE_SECRET, "__teal_fm_bot_session"); 65 65 if (session) { 66 66 try { 67 67 const oauthSession = await client.restore(session); ··· 114 114 }); 115 115 return c.redirect(url.href.toString()); 116 116 } catch (error) { 117 - logger.error({ error }, "oauth authorize failed"); 117 + logger.error({error}, "oauth authorize failed"); 118 118 return c.json({ message: "oauth authorize failed" }, 500); 119 119 } 120 120 }, ··· 122 122 123 123 app.post("/logout", async (c) => { 124 124 c.header("Cache-Control", "no-store"); 125 - const session = await getSignedCookie(c, COOKIE_SECRET, "__teal_fm_bot_session"); 125 + const session = await getSignedCookie(c, env.COOKIE_SECRET, "__teal_fm_bot_session"); 126 126 if (session) { 127 127 try { 128 128 const oauthSession = await client.restore(session);
+2 -1
apps/web/package.json
··· 7 7 "dev": "tsx --watch index.ts", 8 8 "build": "tsc", 9 9 "start": "node dist/index.js", 10 + "watch": "tsc --watch", 10 11 "typecheck": "tsc --noEmit" 11 12 }, 12 13 "dependencies": { ··· 17 18 "@hono/node-server": "^1.19.7", 18 19 "@tealfmbot/common": "workspace:*", 19 20 "@tealfmbot/database": "workspace:*", 20 - "@tealfmbot/tsconfig": "workspace:*", 21 21 "hono": "^4.11.3", 22 22 "pino-http": "^11.0.0" 23 23 }, 24 24 "devDependencies": { 25 + "@tealfmbot/tsconfig": "workspace:*", 25 26 "@types/node": "^25.0.3", 26 27 "tsx": "^4.21.0", 27 28 "typescript": "^5.9.3"
+3 -3
apps/web/utils.ts
··· 3 3 import { Agent } from "@atproto/api"; 4 4 import { isAtprotoDid, isAtprotoDidWeb } from "@atproto/did"; 5 5 import { isValidHandle } from "@atproto/syntax"; 6 - import { COOKIE_SECRET } from "@tealfmbot/common/constants"; 6 + import { env } from "@tealfmbot/common/constants"; 7 7 import { logger } from "@tealfmbot/common/logger"; 8 8 import { deleteCookie, generateSignedCookie, getSignedCookie } from "hono/cookie"; 9 9 ··· 12 12 export const MAX_AGE = process.env.NODE_ENV === "production" ? 60 : 0; 13 13 14 14 export async function createSession(value: string) { 15 - const cookie = await generateSignedCookie("__teal_fm_bot_session", value, COOKIE_SECRET, { 15 + const cookie = await generateSignedCookie("__teal_fm_bot_session", value, env.COOKIE_SECRET, { 16 16 path: "/", 17 17 secure: process.env.NODE_ENV === "production", 18 18 httpOnly: true, ··· 25 25 26 26 export async function getSessionAgent(c: Context) { 27 27 c.header("Vary", "Cookie"); 28 - const session = await getSignedCookie(c, COOKIE_SECRET, "__teal_fm_bot_session"); 28 + const session = await getSignedCookie(c, env.COOKIE_SECRET, "__teal_fm_bot_session"); 29 29 if (!session) return null; 30 30 c.header("Cache-Control", `max-age=${MAX_AGE}, private`); 31 31
+3 -5
build-and-publish-images.sh
··· 1 1 SHA=$(git rev-parse HEAD) 2 2 BUILD_DATE=$(date -u +%Y-%m-%dT%H:%M:%SZ) 3 3 VERSION=$(git describe --tags --abbrev=0) 4 - REGISTRY=atcr.io/dane.is.extraordinarily.cool 4 + REGISTRY=atcr.io/besaid.zone 5 5 6 6 services=( 7 7 web ··· 12 12 echo "building container versions: ${VERSION#v}" 13 13 14 14 for svc in ${services[@]}; do 15 - podman build \ 15 + docker buildx build \ 16 16 -t $REGISTRY/discostu$svc:${VERSION#v} \ 17 17 --target $svc \ 18 18 --build-arg VERSION=${VERSION#v} \ ··· 20 20 --build-arg BUILD_DATE=$BUILD_DATE \ 21 21 --pull \ 22 22 --no-cache \ 23 - -f Dockerfile . 24 - 25 - podman push $REGISTRY/discostu$svc:${VERSION#v} 23 + --push . 26 24 done
+16
docker-compose.dev.yml
··· 1 + services: 2 + db: 3 + image: postgres:18.1 4 + healthcheck: 5 + test: ["CMD-SHELL", "pg_isready -U postgres -d tealfmbotdb"] 6 + interval: 10s 7 + retries: 5 8 + start_period: 30s 9 + timeout: 10s 10 + restart: always 11 + environment: 12 + POSTGRES_USER: postgres 13 + POSTGRES_PASSWORD: password 14 + POSTGRES_DB: tealfmbotdb 15 + ports: 16 + - 5432:5432
+1
docker-compose.prod.yml
··· 52 52 condition: service_healthy 53 53 54 54 environment: 55 + NODE_ENV: production 55 56 DISCORD_BOT_TOKEN: "${DISCORD_BOT_TOKEN:?DISCORD_BOT_TOKEN is required}" 56 57 DISCORD_APPLICATION_ID: "${DISCORD_APPLICATION_ID:?DISCORD_APPLICATION_ID is required}" 57 58 DISCORD_GUILD_ID: "${DISCORD_GUILD_ID:?DISCORD_GUILD_ID is required}"
+7 -2
package.json
··· 16 16 "tap": "pnpm --filter tapper dev", 17 17 "web": "pnpm --filter web dev", 18 18 "build": "pnpm -r build", 19 - "build:watch": "pnpm -r build:watch", 19 + "web:watch": "pnpm --filter web watch", 20 + "bot:watch": "pnpm --filter bot watch", 21 + "common:watch": "pnpm --filter common watch", 22 + "database:watch": "pnpm --filter database watch", 23 + "watch": "run-p *:watch", 20 24 "dev:all": "pnpm --filter './apps/**' dev", 21 - "typecheck": "pnpm --filter './apps/**' typecheck", 25 + "typecheck": "pnpm --filter './{packages,apps}/**' typecheck", 22 26 "lint": "oxlint", 23 27 "format": "oxfmt --no-error-on-unmatched-pattern" 24 28 }, 25 29 "devDependencies": { 26 30 "lefthook": "^2.0.13", 31 + "npm-run-all": "^4.1.5", 27 32 "oxfmt": "^0.20.0", 28 33 "oxlint": "^1.35.0", 29 34 "typescript": "^5.9.3"
+13 -8
packages/common/constants.ts
··· 1 + import { cleanEnv, str, num } from "envalid"; 1 2 import path from "node:path"; 2 3 import { loadEnvFile } from "node:process"; 3 4 ··· 5 6 loadEnvFile(path.join(import.meta.dirname, "../../.env")); 6 7 } 7 8 8 - export const DISCORD_BOT_TOKEN = process.env.DISCORD_BOT_TOKEN as string; 9 - export const DISCORD_APPLICATION_ID = process.env.DISCORD_APPLICATION_ID as string; 10 - export const DISCORD_GUILD_ID = process.env.DISCORD_GUILD_ID as string; 11 - export const TAP_ADMIN_PASSWORD = process.env.TAP_ADMIN_PASSWORD as string; 12 - export const DATABASE_URL = process.env.DATABASE_URL as string; 13 - export const PUBLIC_URL = process.env.PUBLIC_URL as string; 14 - export const COOKIE_SECRET = process.env.COOKIE_SECRET as string; 15 - export const PRIVATE_KEYS = process.env.PRIVATE_KEYS as unknown as string[]; 9 + export const env = cleanEnv(process.env, { 10 + DISCORD_BOT_TOKEN: str(), 11 + DISCORD_APPLICATION_ID: str(), 12 + DISCORD_GUILD_ID: str(), 13 + TAP_ADMIN_PASSWORD: str(), 14 + DATABASE_URL: str({ devDefault: "postgres://postgres:password@localhost:5432/tealfmbotdb" }), 15 + PUBLIC_URL: str(), 16 + COOKIE_SECRET: str({ devDefault: '00000000000000000000000000000000' }), 17 + PRIVATE_KEYS: str(), 18 + WEB_SERVICE_URL: str({ devDefault: "http://localhost" }), 19 + WEB_SERVICE_PORT: num({devDefault: 8002}) 20 + });
+2 -1
packages/common/package.json
··· 13 13 } 14 14 }, 15 15 "scripts": { 16 - "build:watch": "tsc --watch", 16 + "watch": "tsc --watch", 17 17 "build": "tsc", 18 18 "typecheck": "tsc --noEmit" 19 19 }, 20 20 "dependencies": { 21 + "envalid": "^8.1.1", 21 22 "pino": "^10.1.0" 22 23 }, 23 24 "devDependencies": {
+3 -1
packages/common/tsconfig.json
··· 1 1 { 2 2 "extends": "@tealfmbot/tsconfig/tsconfig.node.json", 3 3 "compilerOptions": { 4 - "rootDir": ".", 4 + "module": "NodeNext", 5 + "moduleResolution": "nodenext", 6 + "esModuleInterop": true, 5 7 "declaration": true, 6 8 "declarationMap": true, 7 9 "outDir": "./dist"
+2 -2
packages/database/db.ts
··· 1 - import { DATABASE_URL } from "@tealfmbot/common/constants"; 1 + import { env } from "@tealfmbot/common/constants"; 2 2 import { Kysely, PostgresDialect } from "kysely"; 3 3 import { Pool } from "pg"; 4 4 ··· 6 6 7 7 const dialect = new PostgresDialect({ 8 8 pool: new Pool({ 9 - connectionString: DATABASE_URL, 9 + connectionString: env.DATABASE_URL, 10 10 }), 11 11 }); 12 12
+2 -2
packages/database/migrate.ts
··· 1 - import { DATABASE_URL } from "@tealfmbot/common/constants.js"; 1 + import { env } from "@tealfmbot/common/constants"; 2 2 import { Kysely, Migrator, PostgresDialect, FileMigrationProvider } from "kysely"; 3 3 import { run } from "kysely-migration-cli"; 4 4 import fs from "node:fs/promises"; ··· 13 13 const db = new Kysely<DB>({ 14 14 dialect: new PostgresDialect({ 15 15 pool: new Pool({ 16 - connectionString: DATABASE_URL, 16 + connectionString: env.DATABASE_URL, 17 17 }), 18 18 }), 19 19 });
+1 -1
packages/database/package.json
··· 14 14 } 15 15 }, 16 16 "scripts": { 17 - "build:watch": "tsc --watch", 17 + "watch": "tsc --watch", 18 18 "build": "tsc", 19 19 "migrate": "kysely migrate latest", 20 20 "codegen": "kysely-codegen --dialect postgres --env-file='../../.env' --out-file ./database.d.ts",
+1119 -7
pnpm-lock.yaml
··· 12 12 lefthook: 13 13 specifier: ^2.0.13 14 14 version: 2.0.13 15 + npm-run-all: 16 + specifier: ^4.1.5 17 + version: 4.1.5 15 18 oxfmt: 16 19 specifier: ^0.20.0 17 20 version: 0.20.0 ··· 27 30 '@tealfmbot/common': 28 31 specifier: workspace:* 29 32 version: link:../../packages/common 30 - '@tealfmbot/tsconfig': 31 - specifier: workspace:* 32 - version: link:../../packages/tsconfig 33 33 discord.js: 34 34 specifier: ^14.25.1 35 35 version: 14.25.1 36 36 devDependencies: 37 + '@tealfmbot/tsconfig': 38 + specifier: workspace:* 39 + version: link:../../packages/tsconfig 37 40 '@types/node': 38 41 specifier: ^25.0.3 39 42 version: 25.0.3 ··· 52 55 '@tealfmbot/common': 53 56 specifier: workspace:* 54 57 version: link:../../packages/common 58 + devDependencies: 55 59 '@tealfmbot/tsconfig': 56 60 specifier: workspace:* 57 61 version: link:../../packages/tsconfig 58 - devDependencies: 59 62 '@types/node': 60 63 specifier: ^25.0.3 61 64 version: 25.0.3 ··· 89 92 '@tealfmbot/database': 90 93 specifier: workspace:* 91 94 version: link:../../packages/database 92 - '@tealfmbot/tsconfig': 93 - specifier: workspace:* 94 - version: link:../../packages/tsconfig 95 95 hono: 96 96 specifier: ^4.11.3 97 97 version: 4.11.3 ··· 99 99 specifier: ^11.0.0 100 100 version: 11.0.0 101 101 devDependencies: 102 + '@tealfmbot/tsconfig': 103 + specifier: workspace:* 104 + version: link:../../packages/tsconfig 102 105 '@types/node': 103 106 specifier: ^25.0.3 104 107 version: 25.0.3 ··· 111 114 112 115 packages/common: 113 116 dependencies: 117 + envalid: 118 + specifier: ^8.1.1 119 + version: 8.1.1 114 120 pino: 115 121 specifier: ^10.1.0 116 122 version: 10.1.0 ··· 585 591 argparse@2.0.1: 586 592 resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 587 593 594 + array-buffer-byte-length@1.0.2: 595 + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} 596 + engines: {node: '>= 0.4'} 597 + 598 + arraybuffer.prototype.slice@1.0.4: 599 + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} 600 + engines: {node: '>= 0.4'} 601 + 602 + async-function@1.0.0: 603 + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} 604 + engines: {node: '>= 0.4'} 605 + 588 606 atomic-sleep@1.0.0: 589 607 resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} 590 608 engines: {node: '>=8.0.0'} 591 609 610 + available-typed-arrays@1.0.7: 611 + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} 612 + engines: {node: '>= 0.4'} 613 + 592 614 await-lock@2.2.2: 593 615 resolution: {integrity: sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==} 594 616 ··· 615 637 peerDependenciesMeta: 616 638 magicast: 617 639 optional: true 640 + 641 + call-bind-apply-helpers@1.0.2: 642 + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} 643 + engines: {node: '>= 0.4'} 644 + 645 + call-bind@1.0.8: 646 + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} 647 + engines: {node: '>= 0.4'} 648 + 649 + call-bound@1.0.4: 650 + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} 651 + engines: {node: '>= 0.4'} 618 652 619 653 callsites@3.1.0: 620 654 resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} ··· 677 711 typescript: 678 712 optional: true 679 713 714 + cross-spawn@6.0.6: 715 + resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==} 716 + engines: {node: '>=4.8'} 717 + 718 + data-view-buffer@1.0.2: 719 + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} 720 + engines: {node: '>= 0.4'} 721 + 722 + data-view-byte-length@1.0.2: 723 + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} 724 + engines: {node: '>= 0.4'} 725 + 726 + data-view-byte-offset@1.0.1: 727 + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} 728 + engines: {node: '>= 0.4'} 729 + 680 730 dateformat@4.6.3: 681 731 resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} 682 732 733 + define-data-property@1.1.4: 734 + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} 735 + engines: {node: '>= 0.4'} 736 + 737 + define-properties@1.2.1: 738 + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} 739 + engines: {node: '>= 0.4'} 740 + 683 741 defu@6.1.4: 684 742 resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} 685 743 ··· 709 767 resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} 710 768 engines: {node: '>=12'} 711 769 770 + dunder-proto@1.0.1: 771 + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} 772 + engines: {node: '>= 0.4'} 773 + 712 774 end-of-stream@1.4.5: 713 775 resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} 714 776 ··· 716 778 resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} 717 779 engines: {node: '>=6'} 718 780 781 + envalid@8.1.1: 782 + resolution: {integrity: sha512-vOUfHxAFFvkBjbVQbBfgnCO9d3GcNfMMTtVfgqSU2rQGMFEVqWy9GBuoSfHnwGu7EqR0/GeukQcL3KjFBaga9w==} 783 + engines: {node: '>=18'} 784 + 719 785 error-ex@1.3.4: 720 786 resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} 721 787 788 + es-abstract@1.24.1: 789 + resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} 790 + engines: {node: '>= 0.4'} 791 + 792 + es-define-property@1.0.1: 793 + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} 794 + engines: {node: '>= 0.4'} 795 + 796 + es-errors@1.3.0: 797 + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} 798 + engines: {node: '>= 0.4'} 799 + 800 + es-object-atoms@1.1.1: 801 + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} 802 + engines: {node: '>= 0.4'} 803 + 804 + es-set-tostringtag@2.1.0: 805 + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} 806 + engines: {node: '>= 0.4'} 807 + 808 + es-to-primitive@1.3.0: 809 + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} 810 + engines: {node: '>= 0.4'} 811 + 722 812 esbuild@0.27.2: 723 813 resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} 724 814 engines: {node: '>=18'} ··· 756 846 resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 757 847 engines: {node: '>=8'} 758 848 849 + for-each@0.3.5: 850 + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} 851 + engines: {node: '>= 0.4'} 852 + 759 853 fs.realpath@1.0.0: 760 854 resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 761 855 ··· 767 861 function-bind@1.1.2: 768 862 resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 769 863 864 + function.prototype.name@1.1.8: 865 + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} 866 + engines: {node: '>= 0.4'} 867 + 868 + functions-have-names@1.2.3: 869 + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} 870 + 871 + generator-function@2.0.1: 872 + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} 873 + engines: {node: '>= 0.4'} 874 + 770 875 get-caller-file@2.0.5: 771 876 resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 772 877 engines: {node: 6.* || 8.* || >= 10.*} 773 878 879 + get-intrinsic@1.3.0: 880 + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} 881 + engines: {node: '>= 0.4'} 882 + 883 + get-proto@1.0.1: 884 + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} 885 + engines: {node: '>= 0.4'} 886 + 887 + get-symbol-description@1.1.0: 888 + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} 889 + engines: {node: '>= 0.4'} 890 + 774 891 get-tsconfig@4.13.0: 775 892 resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} 776 893 ··· 786 903 resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 787 904 deprecated: Glob versions prior to v9 are no longer supported 788 905 906 + globalthis@1.0.4: 907 + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} 908 + engines: {node: '>= 0.4'} 909 + 910 + gopd@1.2.0: 911 + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} 912 + engines: {node: '>= 0.4'} 913 + 914 + graceful-fs@4.2.11: 915 + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 916 + 917 + has-bigints@1.1.0: 918 + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} 919 + engines: {node: '>= 0.4'} 920 + 789 921 has-flag@3.0.0: 790 922 resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 791 923 engines: {node: '>=4'} ··· 794 926 resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 795 927 engines: {node: '>=8'} 796 928 929 + has-property-descriptors@1.0.2: 930 + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} 931 + 932 + has-proto@1.2.0: 933 + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} 934 + engines: {node: '>= 0.4'} 935 + 936 + has-symbols@1.1.0: 937 + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} 938 + engines: {node: '>= 0.4'} 939 + 940 + has-tostringtag@1.0.2: 941 + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} 942 + engines: {node: '>= 0.4'} 943 + 797 944 hasown@2.0.2: 798 945 resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 799 946 engines: {node: '>= 0.4'} ··· 804 951 hono@4.11.3: 805 952 resolution: {integrity: sha512-PmQi306+M/ct/m5s66Hrg+adPnkD5jiO6IjA7WhWw0gSBSo1EcRegwuI1deZ+wd5pzCGynCcn2DprnE4/yEV4w==} 806 953 engines: {node: '>=16.9.0'} 954 + 955 + hosted-git-info@2.8.9: 956 + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} 807 957 808 958 ieee754@1.2.1: 809 959 resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} ··· 818 968 819 969 inherits@2.0.4: 820 970 resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 971 + 972 + internal-slot@1.1.0: 973 + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} 974 + engines: {node: '>= 0.4'} 821 975 822 976 interpret@1.4.0: 823 977 resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} ··· 827 981 resolution: {integrity: sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==} 828 982 engines: {node: '>= 10'} 829 983 984 + is-array-buffer@3.0.5: 985 + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} 986 + engines: {node: '>= 0.4'} 987 + 830 988 is-arrayish@0.2.1: 831 989 resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} 832 990 991 + is-async-function@2.1.1: 992 + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} 993 + engines: {node: '>= 0.4'} 994 + 995 + is-bigint@1.1.0: 996 + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} 997 + engines: {node: '>= 0.4'} 998 + 999 + is-boolean-object@1.2.2: 1000 + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} 1001 + engines: {node: '>= 0.4'} 1002 + 1003 + is-callable@1.2.7: 1004 + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} 1005 + engines: {node: '>= 0.4'} 1006 + 833 1007 is-core-module@2.16.1: 834 1008 resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} 835 1009 engines: {node: '>= 0.4'} 836 1010 1011 + is-data-view@1.0.2: 1012 + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} 1013 + engines: {node: '>= 0.4'} 1014 + 1015 + is-date-object@1.1.0: 1016 + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} 1017 + engines: {node: '>= 0.4'} 1018 + 1019 + is-finalizationregistry@1.1.1: 1020 + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} 1021 + engines: {node: '>= 0.4'} 1022 + 1023 + is-generator-function@1.1.2: 1024 + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} 1025 + engines: {node: '>= 0.4'} 1026 + 1027 + is-map@2.0.3: 1028 + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} 1029 + engines: {node: '>= 0.4'} 1030 + 1031 + is-negative-zero@2.0.3: 1032 + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} 1033 + engines: {node: '>= 0.4'} 1034 + 1035 + is-number-object@1.1.1: 1036 + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} 1037 + engines: {node: '>= 0.4'} 1038 + 837 1039 is-number@7.0.0: 838 1040 resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 839 1041 engines: {node: '>=0.12.0'} 840 1042 1043 + is-regex@1.2.1: 1044 + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} 1045 + engines: {node: '>= 0.4'} 1046 + 1047 + is-set@2.0.3: 1048 + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} 1049 + engines: {node: '>= 0.4'} 1050 + 1051 + is-shared-array-buffer@1.0.4: 1052 + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} 1053 + engines: {node: '>= 0.4'} 1054 + 1055 + is-string@1.1.1: 1056 + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} 1057 + engines: {node: '>= 0.4'} 1058 + 1059 + is-symbol@1.1.1: 1060 + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} 1061 + engines: {node: '>= 0.4'} 1062 + 1063 + is-typed-array@1.1.15: 1064 + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} 1065 + engines: {node: '>= 0.4'} 1066 + 1067 + is-weakmap@2.0.2: 1068 + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} 1069 + engines: {node: '>= 0.4'} 1070 + 1071 + is-weakref@1.1.1: 1072 + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} 1073 + engines: {node: '>= 0.4'} 1074 + 1075 + is-weakset@2.0.4: 1076 + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} 1077 + engines: {node: '>= 0.4'} 1078 + 1079 + isarray@2.0.5: 1080 + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} 1081 + 1082 + isexe@2.0.0: 1083 + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1084 + 841 1085 iso-datestring-validator@2.2.2: 842 1086 resolution: {integrity: sha512-yLEMkBbLZTlVQqOnQ4FiMujR6T4DEcCb1xizmvXS+OxuhwcbtynoosRzdMA69zZCShCNAbi+gJ71FxZBBXx1SA==} 843 1087 ··· 858 1102 js-yaml@4.1.1: 859 1103 resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} 860 1104 hasBin: true 1105 + 1106 + json-parse-better-errors@1.0.2: 1107 + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} 861 1108 862 1109 json-parse-even-better-errors@2.3.1: 863 1110 resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} ··· 979 1226 lines-and-columns@1.2.4: 980 1227 resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 981 1228 1229 + load-json-file@4.0.0: 1230 + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} 1231 + engines: {node: '>=4'} 1232 + 982 1233 lodash.snakecase@4.1.1: 983 1234 resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} 984 1235 ··· 995 1246 magic-bytes.js@1.12.1: 996 1247 resolution: {integrity: sha512-ThQLOhN86ZkJ7qemtVRGYM+gRgR8GEXNli9H/PMvpnZsE44Xfh3wx9kGJaldg314v85m+bFW6WBMaVHJc/c3zA==} 997 1248 1249 + math-intrinsics@1.1.0: 1250 + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} 1251 + engines: {node: '>= 0.4'} 1252 + 1253 + memorystream@0.3.1: 1254 + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} 1255 + engines: {node: '>= 0.10.0'} 1256 + 998 1257 micromatch@4.0.8: 999 1258 resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 1000 1259 engines: {node: '>=8.6'} ··· 1008 1267 multiformats@9.9.0: 1009 1268 resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} 1010 1269 1270 + nice-try@1.0.5: 1271 + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} 1272 + 1011 1273 node-fetch-native@1.6.7: 1012 1274 resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} 1013 1275 1276 + normalize-package-data@2.5.0: 1277 + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} 1278 + 1279 + npm-run-all@4.1.5: 1280 + resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} 1281 + engines: {node: '>= 4'} 1282 + hasBin: true 1283 + 1014 1284 nypm@0.6.2: 1015 1285 resolution: {integrity: sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g==} 1016 1286 engines: {node: ^14.16.0 || >=16.10.0} 1017 1287 hasBin: true 1018 1288 1289 + object-inspect@1.13.4: 1290 + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} 1291 + engines: {node: '>= 0.4'} 1292 + 1293 + object-keys@1.1.1: 1294 + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} 1295 + engines: {node: '>= 0.4'} 1296 + 1297 + object.assign@4.1.7: 1298 + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} 1299 + engines: {node: '>= 0.4'} 1300 + 1019 1301 ofetch@1.5.1: 1020 1302 resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} 1021 1303 ··· 1028 1310 1029 1311 once@1.4.0: 1030 1312 resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1313 + 1314 + own-keys@1.0.1: 1315 + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} 1316 + engines: {node: '>= 0.4'} 1031 1317 1032 1318 oxfmt@0.20.0: 1033 1319 resolution: {integrity: sha512-+7f8eV8iaK3tENN/FUVxZM1g78HjPehybN8/+/dvEA1O893Dcvk6O7/Q1wTQOHMD7wvdwWdujKl+Uo8QMiKDrQ==} ··· 1048 1334 resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1049 1335 engines: {node: '>=6'} 1050 1336 1337 + parse-json@4.0.0: 1338 + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} 1339 + engines: {node: '>=4'} 1340 + 1051 1341 parse-json@5.2.0: 1052 1342 resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} 1053 1343 engines: {node: '>=8'} ··· 1056 1346 resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1057 1347 engines: {node: '>=0.10.0'} 1058 1348 1349 + path-key@2.0.1: 1350 + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} 1351 + engines: {node: '>=4'} 1352 + 1059 1353 path-parse@1.0.7: 1060 1354 resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1355 + 1356 + path-type@3.0.0: 1357 + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} 1358 + engines: {node: '>=4'} 1061 1359 1062 1360 pathe@2.0.3: 1063 1361 resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} ··· 1106 1404 resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1107 1405 engines: {node: '>=8.6'} 1108 1406 1407 + pidtree@0.3.1: 1408 + resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} 1409 + engines: {node: '>=0.10'} 1410 + hasBin: true 1411 + 1412 + pify@3.0.0: 1413 + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} 1414 + engines: {node: '>=4'} 1415 + 1109 1416 pino-abstract-transport@1.2.0: 1110 1417 resolution: {integrity: sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==} 1111 1418 ··· 1143 1450 resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} 1144 1451 engines: {node: '>=4'} 1145 1452 1453 + possible-typed-array-names@1.1.0: 1454 + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} 1455 + engines: {node: '>= 0.4'} 1456 + 1146 1457 postgres-array@2.0.0: 1147 1458 resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} 1148 1459 engines: {node: '>=4'} ··· 1178 1489 rc9@2.1.2: 1179 1490 resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} 1180 1491 1492 + read-pkg@3.0.0: 1493 + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} 1494 + engines: {node: '>=4'} 1495 + 1181 1496 readable-stream@4.7.0: 1182 1497 resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} 1183 1498 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} ··· 1194 1509 resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} 1195 1510 engines: {node: '>= 0.10'} 1196 1511 1512 + reflect.getprototypeof@1.0.10: 1513 + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} 1514 + engines: {node: '>= 0.4'} 1515 + 1516 + regexp.prototype.flags@1.5.4: 1517 + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} 1518 + engines: {node: '>= 0.4'} 1519 + 1197 1520 resolve-from@4.0.0: 1198 1521 resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1199 1522 engines: {node: '>=4'} ··· 1206 1529 engines: {node: '>= 0.4'} 1207 1530 hasBin: true 1208 1531 1532 + safe-array-concat@1.1.3: 1533 + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} 1534 + engines: {node: '>=0.4'} 1535 + 1209 1536 safe-buffer@5.2.1: 1210 1537 resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1211 1538 1539 + safe-push-apply@1.0.0: 1540 + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} 1541 + engines: {node: '>= 0.4'} 1542 + 1543 + safe-regex-test@1.1.0: 1544 + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} 1545 + engines: {node: '>= 0.4'} 1546 + 1212 1547 safe-stable-stringify@2.5.0: 1213 1548 resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} 1214 1549 engines: {node: '>=10'} ··· 1216 1551 secure-json-parse@4.1.0: 1217 1552 resolution: {integrity: sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==} 1218 1553 1554 + semver@5.7.2: 1555 + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} 1556 + hasBin: true 1557 + 1558 + set-function-length@1.2.2: 1559 + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} 1560 + engines: {node: '>= 0.4'} 1561 + 1562 + set-function-name@2.0.2: 1563 + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} 1564 + engines: {node: '>= 0.4'} 1565 + 1566 + set-proto@1.0.0: 1567 + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} 1568 + engines: {node: '>= 0.4'} 1569 + 1570 + shebang-command@1.2.0: 1571 + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} 1572 + engines: {node: '>=0.10.0'} 1573 + 1574 + shebang-regex@1.0.0: 1575 + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} 1576 + engines: {node: '>=0.10.0'} 1577 + 1578 + shell-quote@1.8.3: 1579 + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} 1580 + engines: {node: '>= 0.4'} 1581 + 1219 1582 shelljs.exec@1.1.8: 1220 1583 resolution: {integrity: sha512-vFILCw+lzUtiwBAHV8/Ex8JsFjelFMdhONIsgKNLgTzeRckp2AOYRQtHJE/9LhNvdMmE27AGtzWx0+DHpwIwSw==} 1221 1584 engines: {node: '>= 4.0.0'} ··· 1225 1588 engines: {node: '>=4'} 1226 1589 hasBin: true 1227 1590 1591 + side-channel-list@1.0.0: 1592 + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} 1593 + engines: {node: '>= 0.4'} 1594 + 1595 + side-channel-map@1.0.1: 1596 + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} 1597 + engines: {node: '>= 0.4'} 1598 + 1599 + side-channel-weakmap@1.0.2: 1600 + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} 1601 + engines: {node: '>= 0.4'} 1602 + 1603 + side-channel@1.1.0: 1604 + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} 1605 + engines: {node: '>= 0.4'} 1606 + 1228 1607 sonic-boom@3.8.1: 1229 1608 resolution: {integrity: sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==} 1230 1609 1231 1610 sonic-boom@4.2.0: 1232 1611 resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} 1233 1612 1613 + spdx-correct@3.2.0: 1614 + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} 1615 + 1616 + spdx-exceptions@2.5.0: 1617 + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} 1618 + 1619 + spdx-expression-parse@3.0.1: 1620 + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} 1621 + 1622 + spdx-license-ids@3.0.22: 1623 + resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} 1624 + 1234 1625 split2@4.2.0: 1235 1626 resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} 1236 1627 engines: {node: '>= 10.x'} ··· 1238 1629 std-env@3.10.0: 1239 1630 resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} 1240 1631 1632 + stop-iteration-iterator@1.1.0: 1633 + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} 1634 + engines: {node: '>= 0.4'} 1635 + 1636 + string.prototype.padend@3.1.6: 1637 + resolution: {integrity: sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==} 1638 + engines: {node: '>= 0.4'} 1639 + 1640 + string.prototype.trim@1.2.10: 1641 + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} 1642 + engines: {node: '>= 0.4'} 1643 + 1644 + string.prototype.trimend@1.0.9: 1645 + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} 1646 + engines: {node: '>= 0.4'} 1647 + 1648 + string.prototype.trimstart@1.0.8: 1649 + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} 1650 + engines: {node: '>= 0.4'} 1651 + 1241 1652 string_decoder@1.3.0: 1242 1653 resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 1654 + 1655 + strip-bom@3.0.0: 1656 + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} 1657 + engines: {node: '>=4'} 1243 1658 1244 1659 strip-json-comments@5.0.3: 1245 1660 resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} ··· 1300 1715 engines: {node: '>=18.0.0'} 1301 1716 hasBin: true 1302 1717 1718 + typed-array-buffer@1.0.3: 1719 + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} 1720 + engines: {node: '>= 0.4'} 1721 + 1722 + typed-array-byte-length@1.0.3: 1723 + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} 1724 + engines: {node: '>= 0.4'} 1725 + 1726 + typed-array-byte-offset@1.0.4: 1727 + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} 1728 + engines: {node: '>= 0.4'} 1729 + 1730 + typed-array-length@1.0.7: 1731 + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} 1732 + engines: {node: '>= 0.4'} 1733 + 1303 1734 typescript@5.9.2: 1304 1735 resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} 1305 1736 engines: {node: '>=14.17'} ··· 1316 1747 uint8arrays@3.0.0: 1317 1748 resolution: {integrity: sha512-HRCx0q6O9Bfbp+HHSfQQKD7wU70+lydKVt4EghkdOvlK/NlrF90z+eXV34mUd48rNvVJXwkrMSPpCATkct8fJA==} 1318 1749 1750 + unbox-primitive@1.1.0: 1751 + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} 1752 + engines: {node: '>= 0.4'} 1753 + 1319 1754 undici-types@6.21.0: 1320 1755 resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} 1321 1756 ··· 1328 1763 1329 1764 unicode-segmenter@0.14.4: 1330 1765 resolution: {integrity: sha512-pR5VCiCrLrKOL6FRW61jnk9+wyMtKKowq+jyFY9oc6uHbWKhDL4yVRiI4YZPksGMK72Pahh8m0cn/0JvbDDyJg==} 1766 + 1767 + validate-npm-package-license@3.0.4: 1768 + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} 1769 + 1770 + which-boxed-primitive@1.1.1: 1771 + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} 1772 + engines: {node: '>= 0.4'} 1773 + 1774 + which-builtin-type@1.2.1: 1775 + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} 1776 + engines: {node: '>= 0.4'} 1777 + 1778 + which-collection@1.0.2: 1779 + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} 1780 + engines: {node: '>= 0.4'} 1781 + 1782 + which-typed-array@1.1.19: 1783 + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} 1784 + engines: {node: '>= 0.4'} 1785 + 1786 + which@1.3.1: 1787 + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} 1788 + hasBin: true 1331 1789 1332 1790 wrappy@1.0.2: 1333 1791 resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} ··· 1772 2230 1773 2231 argparse@2.0.1: {} 1774 2232 2233 + array-buffer-byte-length@1.0.2: 2234 + dependencies: 2235 + call-bound: 1.0.4 2236 + is-array-buffer: 3.0.5 2237 + 2238 + arraybuffer.prototype.slice@1.0.4: 2239 + dependencies: 2240 + array-buffer-byte-length: 1.0.2 2241 + call-bind: 1.0.8 2242 + define-properties: 1.2.1 2243 + es-abstract: 1.24.1 2244 + es-errors: 1.3.0 2245 + get-intrinsic: 1.3.0 2246 + is-array-buffer: 3.0.5 2247 + 2248 + async-function@1.0.0: {} 2249 + 1775 2250 atomic-sleep@1.0.0: {} 2251 + 2252 + available-typed-arrays@1.0.7: 2253 + dependencies: 2254 + possible-typed-array-names: 1.1.0 1776 2255 1777 2256 await-lock@2.2.2: {} 1778 2257 ··· 1809 2288 pkg-types: 2.3.0 1810 2289 rc9: 2.1.2 1811 2290 2291 + call-bind-apply-helpers@1.0.2: 2292 + dependencies: 2293 + es-errors: 1.3.0 2294 + function-bind: 1.1.2 2295 + 2296 + call-bind@1.0.8: 2297 + dependencies: 2298 + call-bind-apply-helpers: 1.0.2 2299 + es-define-property: 1.0.1 2300 + get-intrinsic: 1.3.0 2301 + set-function-length: 1.2.2 2302 + 2303 + call-bound@1.0.4: 2304 + dependencies: 2305 + call-bind-apply-helpers: 1.0.2 2306 + get-intrinsic: 1.3.0 2307 + 1812 2308 callsites@3.1.0: {} 1813 2309 1814 2310 chalk@2.4.2: ··· 1863 2359 optionalDependencies: 1864 2360 typescript: 5.9.2 1865 2361 2362 + cross-spawn@6.0.6: 2363 + dependencies: 2364 + nice-try: 1.0.5 2365 + path-key: 2.0.1 2366 + semver: 5.7.2 2367 + shebang-command: 1.2.0 2368 + which: 1.3.1 2369 + 2370 + data-view-buffer@1.0.2: 2371 + dependencies: 2372 + call-bound: 1.0.4 2373 + es-errors: 1.3.0 2374 + is-data-view: 1.0.2 2375 + 2376 + data-view-byte-length@1.0.2: 2377 + dependencies: 2378 + call-bound: 1.0.4 2379 + es-errors: 1.3.0 2380 + is-data-view: 1.0.2 2381 + 2382 + data-view-byte-offset@1.0.1: 2383 + dependencies: 2384 + call-bound: 1.0.4 2385 + es-errors: 1.3.0 2386 + is-data-view: 1.0.2 2387 + 1866 2388 dateformat@4.6.3: {} 1867 2389 2390 + define-data-property@1.1.4: 2391 + dependencies: 2392 + es-define-property: 1.0.1 2393 + es-errors: 1.3.0 2394 + gopd: 1.2.0 2395 + 2396 + define-properties@1.2.1: 2397 + dependencies: 2398 + define-data-property: 1.1.4 2399 + has-property-descriptors: 1.0.2 2400 + object-keys: 1.1.1 2401 + 1868 2402 defu@6.1.4: {} 1869 2403 1870 2404 destr@2.0.5: {} ··· 1900 2434 1901 2435 dotenv@17.2.3: {} 1902 2436 2437 + dunder-proto@1.0.1: 2438 + dependencies: 2439 + call-bind-apply-helpers: 1.0.2 2440 + es-errors: 1.3.0 2441 + gopd: 1.2.0 2442 + 1903 2443 end-of-stream@1.4.5: 1904 2444 dependencies: 1905 2445 once: 1.4.0 1906 2446 1907 2447 env-paths@2.2.1: {} 1908 2448 2449 + envalid@8.1.1: 2450 + dependencies: 2451 + tslib: 2.8.1 2452 + 1909 2453 error-ex@1.3.4: 1910 2454 dependencies: 1911 2455 is-arrayish: 0.2.1 1912 2456 2457 + es-abstract@1.24.1: 2458 + dependencies: 2459 + array-buffer-byte-length: 1.0.2 2460 + arraybuffer.prototype.slice: 1.0.4 2461 + available-typed-arrays: 1.0.7 2462 + call-bind: 1.0.8 2463 + call-bound: 1.0.4 2464 + data-view-buffer: 1.0.2 2465 + data-view-byte-length: 1.0.2 2466 + data-view-byte-offset: 1.0.1 2467 + es-define-property: 1.0.1 2468 + es-errors: 1.3.0 2469 + es-object-atoms: 1.1.1 2470 + es-set-tostringtag: 2.1.0 2471 + es-to-primitive: 1.3.0 2472 + function.prototype.name: 1.1.8 2473 + get-intrinsic: 1.3.0 2474 + get-proto: 1.0.1 2475 + get-symbol-description: 1.1.0 2476 + globalthis: 1.0.4 2477 + gopd: 1.2.0 2478 + has-property-descriptors: 1.0.2 2479 + has-proto: 1.2.0 2480 + has-symbols: 1.1.0 2481 + hasown: 2.0.2 2482 + internal-slot: 1.1.0 2483 + is-array-buffer: 3.0.5 2484 + is-callable: 1.2.7 2485 + is-data-view: 1.0.2 2486 + is-negative-zero: 2.0.3 2487 + is-regex: 1.2.1 2488 + is-set: 2.0.3 2489 + is-shared-array-buffer: 1.0.4 2490 + is-string: 1.1.1 2491 + is-typed-array: 1.1.15 2492 + is-weakref: 1.1.1 2493 + math-intrinsics: 1.1.0 2494 + object-inspect: 1.13.4 2495 + object-keys: 1.1.1 2496 + object.assign: 4.1.7 2497 + own-keys: 1.0.1 2498 + regexp.prototype.flags: 1.5.4 2499 + safe-array-concat: 1.1.3 2500 + safe-push-apply: 1.0.0 2501 + safe-regex-test: 1.1.0 2502 + set-proto: 1.0.0 2503 + stop-iteration-iterator: 1.1.0 2504 + string.prototype.trim: 1.2.10 2505 + string.prototype.trimend: 1.0.9 2506 + string.prototype.trimstart: 1.0.8 2507 + typed-array-buffer: 1.0.3 2508 + typed-array-byte-length: 1.0.3 2509 + typed-array-byte-offset: 1.0.4 2510 + typed-array-length: 1.0.7 2511 + unbox-primitive: 1.1.0 2512 + which-typed-array: 1.1.19 2513 + 2514 + es-define-property@1.0.1: {} 2515 + 2516 + es-errors@1.3.0: {} 2517 + 2518 + es-object-atoms@1.1.1: 2519 + dependencies: 2520 + es-errors: 1.3.0 2521 + 2522 + es-set-tostringtag@2.1.0: 2523 + dependencies: 2524 + es-errors: 1.3.0 2525 + get-intrinsic: 1.3.0 2526 + has-tostringtag: 1.0.2 2527 + hasown: 2.0.2 2528 + 2529 + es-to-primitive@1.3.0: 2530 + dependencies: 2531 + is-callable: 1.2.7 2532 + is-date-object: 1.1.0 2533 + is-symbol: 1.1.1 2534 + 1913 2535 esbuild@0.27.2: 1914 2536 optionalDependencies: 1915 2537 '@esbuild/aix-ppc64': 0.27.2 ··· 1959 2581 dependencies: 1960 2582 to-regex-range: 5.0.1 1961 2583 2584 + for-each@0.3.5: 2585 + dependencies: 2586 + is-callable: 1.2.7 2587 + 1962 2588 fs.realpath@1.0.0: {} 1963 2589 1964 2590 fsevents@2.3.3: 1965 2591 optional: true 1966 2592 1967 2593 function-bind@1.1.2: {} 2594 + 2595 + function.prototype.name@1.1.8: 2596 + dependencies: 2597 + call-bind: 1.0.8 2598 + call-bound: 1.0.4 2599 + define-properties: 1.2.1 2600 + functions-have-names: 1.2.3 2601 + hasown: 2.0.2 2602 + is-callable: 1.2.7 2603 + 2604 + functions-have-names@1.2.3: {} 2605 + 2606 + generator-function@2.0.1: {} 1968 2607 1969 2608 get-caller-file@2.0.5: {} 1970 2609 2610 + get-intrinsic@1.3.0: 2611 + dependencies: 2612 + call-bind-apply-helpers: 1.0.2 2613 + es-define-property: 1.0.1 2614 + es-errors: 1.3.0 2615 + es-object-atoms: 1.1.1 2616 + function-bind: 1.1.2 2617 + get-proto: 1.0.1 2618 + gopd: 1.2.0 2619 + has-symbols: 1.1.0 2620 + hasown: 2.0.2 2621 + math-intrinsics: 1.1.0 2622 + 2623 + get-proto@1.0.1: 2624 + dependencies: 2625 + dunder-proto: 1.0.1 2626 + es-object-atoms: 1.1.1 2627 + 2628 + get-symbol-description@1.1.0: 2629 + dependencies: 2630 + call-bound: 1.0.4 2631 + es-errors: 1.3.0 2632 + get-intrinsic: 1.3.0 2633 + 1971 2634 get-tsconfig@4.13.0: 1972 2635 dependencies: 1973 2636 resolve-pkg-maps: 1.0.0 ··· 1998 2661 once: 1.4.0 1999 2662 path-is-absolute: 1.0.1 2000 2663 2664 + globalthis@1.0.4: 2665 + dependencies: 2666 + define-properties: 1.2.1 2667 + gopd: 1.2.0 2668 + 2669 + gopd@1.2.0: {} 2670 + 2671 + graceful-fs@4.2.11: {} 2672 + 2673 + has-bigints@1.1.0: {} 2674 + 2001 2675 has-flag@3.0.0: {} 2002 2676 2003 2677 has-flag@4.0.0: {} 2004 2678 2679 + has-property-descriptors@1.0.2: 2680 + dependencies: 2681 + es-define-property: 1.0.1 2682 + 2683 + has-proto@1.2.0: 2684 + dependencies: 2685 + dunder-proto: 1.0.1 2686 + 2687 + has-symbols@1.1.0: {} 2688 + 2689 + has-tostringtag@1.0.2: 2690 + dependencies: 2691 + has-symbols: 1.1.0 2692 + 2005 2693 hasown@2.0.2: 2006 2694 dependencies: 2007 2695 function-bind: 1.1.2 ··· 2009 2697 help-me@5.0.0: {} 2010 2698 2011 2699 hono@4.11.3: {} 2700 + 2701 + hosted-git-info@2.8.9: {} 2012 2702 2013 2703 ieee754@1.2.1: {} 2014 2704 ··· 2024 2714 2025 2715 inherits@2.0.4: {} 2026 2716 2717 + internal-slot@1.1.0: 2718 + dependencies: 2719 + es-errors: 1.3.0 2720 + hasown: 2.0.2 2721 + side-channel: 1.1.0 2722 + 2027 2723 interpret@1.4.0: {} 2028 2724 2029 2725 ipaddr.js@2.3.0: {} 2030 2726 2727 + is-array-buffer@3.0.5: 2728 + dependencies: 2729 + call-bind: 1.0.8 2730 + call-bound: 1.0.4 2731 + get-intrinsic: 1.3.0 2732 + 2031 2733 is-arrayish@0.2.1: {} 2032 2734 2735 + is-async-function@2.1.1: 2736 + dependencies: 2737 + async-function: 1.0.0 2738 + call-bound: 1.0.4 2739 + get-proto: 1.0.1 2740 + has-tostringtag: 1.0.2 2741 + safe-regex-test: 1.1.0 2742 + 2743 + is-bigint@1.1.0: 2744 + dependencies: 2745 + has-bigints: 1.1.0 2746 + 2747 + is-boolean-object@1.2.2: 2748 + dependencies: 2749 + call-bound: 1.0.4 2750 + has-tostringtag: 1.0.2 2751 + 2752 + is-callable@1.2.7: {} 2753 + 2033 2754 is-core-module@2.16.1: 2034 2755 dependencies: 2035 2756 hasown: 2.0.2 2036 2757 2758 + is-data-view@1.0.2: 2759 + dependencies: 2760 + call-bound: 1.0.4 2761 + get-intrinsic: 1.3.0 2762 + is-typed-array: 1.1.15 2763 + 2764 + is-date-object@1.1.0: 2765 + dependencies: 2766 + call-bound: 1.0.4 2767 + has-tostringtag: 1.0.2 2768 + 2769 + is-finalizationregistry@1.1.1: 2770 + dependencies: 2771 + call-bound: 1.0.4 2772 + 2773 + is-generator-function@1.1.2: 2774 + dependencies: 2775 + call-bound: 1.0.4 2776 + generator-function: 2.0.1 2777 + get-proto: 1.0.1 2778 + has-tostringtag: 1.0.2 2779 + safe-regex-test: 1.1.0 2780 + 2781 + is-map@2.0.3: {} 2782 + 2783 + is-negative-zero@2.0.3: {} 2784 + 2785 + is-number-object@1.1.1: 2786 + dependencies: 2787 + call-bound: 1.0.4 2788 + has-tostringtag: 1.0.2 2789 + 2037 2790 is-number@7.0.0: {} 2038 2791 2792 + is-regex@1.2.1: 2793 + dependencies: 2794 + call-bound: 1.0.4 2795 + gopd: 1.2.0 2796 + has-tostringtag: 1.0.2 2797 + hasown: 2.0.2 2798 + 2799 + is-set@2.0.3: {} 2800 + 2801 + is-shared-array-buffer@1.0.4: 2802 + dependencies: 2803 + call-bound: 1.0.4 2804 + 2805 + is-string@1.1.1: 2806 + dependencies: 2807 + call-bound: 1.0.4 2808 + has-tostringtag: 1.0.2 2809 + 2810 + is-symbol@1.1.1: 2811 + dependencies: 2812 + call-bound: 1.0.4 2813 + has-symbols: 1.1.0 2814 + safe-regex-test: 1.1.0 2815 + 2816 + is-typed-array@1.1.15: 2817 + dependencies: 2818 + which-typed-array: 1.1.19 2819 + 2820 + is-weakmap@2.0.2: {} 2821 + 2822 + is-weakref@1.1.1: 2823 + dependencies: 2824 + call-bound: 1.0.4 2825 + 2826 + is-weakset@2.0.4: 2827 + dependencies: 2828 + call-bound: 1.0.4 2829 + get-intrinsic: 1.3.0 2830 + 2831 + isarray@2.0.5: {} 2832 + 2833 + isexe@2.0.0: {} 2834 + 2039 2835 iso-datestring-validator@2.2.2: {} 2040 2836 2041 2837 jiti@2.6.1: {} ··· 2050 2846 dependencies: 2051 2847 argparse: 2.0.1 2052 2848 2849 + json-parse-better-errors@1.0.2: {} 2850 + 2053 2851 json-parse-even-better-errors@2.3.1: {} 2054 2852 2055 2853 kysely-codegen@0.19.0(kysely@0.28.9)(pg@8.16.3)(typescript@5.9.2): ··· 2139 2937 2140 2938 lines-and-columns@1.2.4: {} 2141 2939 2940 + load-json-file@4.0.0: 2941 + dependencies: 2942 + graceful-fs: 4.2.11 2943 + parse-json: 4.0.0 2944 + pify: 3.0.0 2945 + strip-bom: 3.0.0 2946 + 2142 2947 lodash.snakecase@4.1.1: {} 2143 2948 2144 2949 lodash@4.17.21: {} ··· 2149 2954 2150 2955 magic-bytes.js@1.12.1: {} 2151 2956 2957 + math-intrinsics@1.1.0: {} 2958 + 2959 + memorystream@0.3.1: {} 2960 + 2152 2961 micromatch@4.0.8: 2153 2962 dependencies: 2154 2963 braces: 3.0.3 ··· 2162 2971 2163 2972 multiformats@9.9.0: {} 2164 2973 2974 + nice-try@1.0.5: {} 2975 + 2165 2976 node-fetch-native@1.6.7: {} 2166 2977 2978 + normalize-package-data@2.5.0: 2979 + dependencies: 2980 + hosted-git-info: 2.8.9 2981 + resolve: 1.22.11 2982 + semver: 5.7.2 2983 + validate-npm-package-license: 3.0.4 2984 + 2985 + npm-run-all@4.1.5: 2986 + dependencies: 2987 + ansi-styles: 3.2.1 2988 + chalk: 2.4.2 2989 + cross-spawn: 6.0.6 2990 + memorystream: 0.3.1 2991 + minimatch: 3.1.2 2992 + pidtree: 0.3.1 2993 + read-pkg: 3.0.0 2994 + shell-quote: 1.8.3 2995 + string.prototype.padend: 3.1.6 2996 + 2167 2997 nypm@0.6.2: 2168 2998 dependencies: 2169 2999 citty: 0.1.6 ··· 2172 3002 pkg-types: 2.3.0 2173 3003 tinyexec: 1.0.2 2174 3004 3005 + object-inspect@1.13.4: {} 3006 + 3007 + object-keys@1.1.1: {} 3008 + 3009 + object.assign@4.1.7: 3010 + dependencies: 3011 + call-bind: 1.0.8 3012 + call-bound: 1.0.4 3013 + define-properties: 1.2.1 3014 + es-object-atoms: 1.1.1 3015 + has-symbols: 1.1.0 3016 + object-keys: 1.1.1 3017 + 2175 3018 ofetch@1.5.1: 2176 3019 dependencies: 2177 3020 destr: 2.0.5 ··· 2185 3028 once@1.4.0: 2186 3029 dependencies: 2187 3030 wrappy: 1.0.2 3031 + 3032 + own-keys@1.0.1: 3033 + dependencies: 3034 + get-intrinsic: 1.3.0 3035 + object-keys: 1.1.1 3036 + safe-push-apply: 1.0.0 2188 3037 2189 3038 oxfmt@0.20.0: 2190 3039 dependencies: ··· 2214 3063 dependencies: 2215 3064 callsites: 3.1.0 2216 3065 3066 + parse-json@4.0.0: 3067 + dependencies: 3068 + error-ex: 1.3.4 3069 + json-parse-better-errors: 1.0.2 3070 + 2217 3071 parse-json@5.2.0: 2218 3072 dependencies: 2219 3073 '@babel/code-frame': 7.27.1 ··· 2223 3077 2224 3078 path-is-absolute@1.0.1: {} 2225 3079 3080 + path-key@2.0.1: {} 3081 + 2226 3082 path-parse@1.0.7: {} 2227 3083 3084 + path-type@3.0.0: 3085 + dependencies: 3086 + pify: 3.0.0 3087 + 2228 3088 pathe@2.0.3: {} 2229 3089 2230 3090 perfect-debounce@2.0.0: {} ··· 2268 3128 2269 3129 picomatch@2.3.1: {} 2270 3130 3131 + pidtree@0.3.1: {} 3132 + 3133 + pify@3.0.0: {} 3134 + 2271 3135 pino-abstract-transport@1.2.0: 2272 3136 dependencies: 2273 3137 readable-stream: 4.7.0 ··· 2344 3208 2345 3209 pluralize@8.0.0: {} 2346 3210 3211 + possible-typed-array-names@1.1.0: {} 3212 + 2347 3213 postgres-array@2.0.0: {} 2348 3214 2349 3215 postgres-bytea@1.0.1: {} ··· 2372 3238 defu: 6.1.4 2373 3239 destr: 2.0.5 2374 3240 3241 + read-pkg@3.0.0: 3242 + dependencies: 3243 + load-json-file: 4.0.0 3244 + normalize-package-data: 2.5.0 3245 + path-type: 3.0.0 3246 + 2375 3247 readable-stream@4.7.0: 2376 3248 dependencies: 2377 3249 abort-controller: 3.0.0 ··· 2388 3260 dependencies: 2389 3261 resolve: 1.22.11 2390 3262 3263 + reflect.getprototypeof@1.0.10: 3264 + dependencies: 3265 + call-bind: 1.0.8 3266 + define-properties: 1.2.1 3267 + es-abstract: 1.24.1 3268 + es-errors: 1.3.0 3269 + es-object-atoms: 1.1.1 3270 + get-intrinsic: 1.3.0 3271 + get-proto: 1.0.1 3272 + which-builtin-type: 1.2.1 3273 + 3274 + regexp.prototype.flags@1.5.4: 3275 + dependencies: 3276 + call-bind: 1.0.8 3277 + define-properties: 1.2.1 3278 + es-errors: 1.3.0 3279 + get-proto: 1.0.1 3280 + gopd: 1.2.0 3281 + set-function-name: 2.0.2 3282 + 2391 3283 resolve-from@4.0.0: {} 2392 3284 2393 3285 resolve-pkg-maps@1.0.0: {} ··· 2398 3290 path-parse: 1.0.7 2399 3291 supports-preserve-symlinks-flag: 1.0.0 2400 3292 3293 + safe-array-concat@1.1.3: 3294 + dependencies: 3295 + call-bind: 1.0.8 3296 + call-bound: 1.0.4 3297 + get-intrinsic: 1.3.0 3298 + has-symbols: 1.1.0 3299 + isarray: 2.0.5 3300 + 2401 3301 safe-buffer@5.2.1: {} 2402 3302 3303 + safe-push-apply@1.0.0: 3304 + dependencies: 3305 + es-errors: 1.3.0 3306 + isarray: 2.0.5 3307 + 3308 + safe-regex-test@1.1.0: 3309 + dependencies: 3310 + call-bound: 1.0.4 3311 + es-errors: 1.3.0 3312 + is-regex: 1.2.1 3313 + 2403 3314 safe-stable-stringify@2.5.0: {} 2404 3315 2405 3316 secure-json-parse@4.1.0: {} 2406 3317 3318 + semver@5.7.2: {} 3319 + 3320 + set-function-length@1.2.2: 3321 + dependencies: 3322 + define-data-property: 1.1.4 3323 + es-errors: 1.3.0 3324 + function-bind: 1.1.2 3325 + get-intrinsic: 1.3.0 3326 + gopd: 1.2.0 3327 + has-property-descriptors: 1.0.2 3328 + 3329 + set-function-name@2.0.2: 3330 + dependencies: 3331 + define-data-property: 1.1.4 3332 + es-errors: 1.3.0 3333 + functions-have-names: 1.2.3 3334 + has-property-descriptors: 1.0.2 3335 + 3336 + set-proto@1.0.0: 3337 + dependencies: 3338 + dunder-proto: 1.0.1 3339 + es-errors: 1.3.0 3340 + es-object-atoms: 1.1.1 3341 + 3342 + shebang-command@1.2.0: 3343 + dependencies: 3344 + shebang-regex: 1.0.0 3345 + 3346 + shebang-regex@1.0.0: {} 3347 + 3348 + shell-quote@1.8.3: {} 3349 + 2407 3350 shelljs.exec@1.1.8: {} 2408 3351 2409 3352 shelljs@0.8.5: ··· 2412 3355 interpret: 1.4.0 2413 3356 rechoir: 0.6.2 2414 3357 3358 + side-channel-list@1.0.0: 3359 + dependencies: 3360 + es-errors: 1.3.0 3361 + object-inspect: 1.13.4 3362 + 3363 + side-channel-map@1.0.1: 3364 + dependencies: 3365 + call-bound: 1.0.4 3366 + es-errors: 1.3.0 3367 + get-intrinsic: 1.3.0 3368 + object-inspect: 1.13.4 3369 + 3370 + side-channel-weakmap@1.0.2: 3371 + dependencies: 3372 + call-bound: 1.0.4 3373 + es-errors: 1.3.0 3374 + get-intrinsic: 1.3.0 3375 + object-inspect: 1.13.4 3376 + side-channel-map: 1.0.1 3377 + 3378 + side-channel@1.1.0: 3379 + dependencies: 3380 + es-errors: 1.3.0 3381 + object-inspect: 1.13.4 3382 + side-channel-list: 1.0.0 3383 + side-channel-map: 1.0.1 3384 + side-channel-weakmap: 1.0.2 3385 + 2415 3386 sonic-boom@3.8.1: 2416 3387 dependencies: 2417 3388 atomic-sleep: 1.0.0 ··· 2420 3391 dependencies: 2421 3392 atomic-sleep: 1.0.0 2422 3393 3394 + spdx-correct@3.2.0: 3395 + dependencies: 3396 + spdx-expression-parse: 3.0.1 3397 + spdx-license-ids: 3.0.22 3398 + 3399 + spdx-exceptions@2.5.0: {} 3400 + 3401 + spdx-expression-parse@3.0.1: 3402 + dependencies: 3403 + spdx-exceptions: 2.5.0 3404 + spdx-license-ids: 3.0.22 3405 + 3406 + spdx-license-ids@3.0.22: {} 3407 + 2423 3408 split2@4.2.0: {} 2424 3409 2425 3410 std-env@3.10.0: {} 2426 3411 3412 + stop-iteration-iterator@1.1.0: 3413 + dependencies: 3414 + es-errors: 1.3.0 3415 + internal-slot: 1.1.0 3416 + 3417 + string.prototype.padend@3.1.6: 3418 + dependencies: 3419 + call-bind: 1.0.8 3420 + define-properties: 1.2.1 3421 + es-abstract: 1.24.1 3422 + es-object-atoms: 1.1.1 3423 + 3424 + string.prototype.trim@1.2.10: 3425 + dependencies: 3426 + call-bind: 1.0.8 3427 + call-bound: 1.0.4 3428 + define-data-property: 1.1.4 3429 + define-properties: 1.2.1 3430 + es-abstract: 1.24.1 3431 + es-object-atoms: 1.1.1 3432 + has-property-descriptors: 1.0.2 3433 + 3434 + string.prototype.trimend@1.0.9: 3435 + dependencies: 3436 + call-bind: 1.0.8 3437 + call-bound: 1.0.4 3438 + define-properties: 1.2.1 3439 + es-object-atoms: 1.1.1 3440 + 3441 + string.prototype.trimstart@1.0.8: 3442 + dependencies: 3443 + call-bind: 1.0.8 3444 + define-properties: 1.2.1 3445 + es-object-atoms: 1.1.1 3446 + 2427 3447 string_decoder@1.3.0: 2428 3448 dependencies: 2429 3449 safe-buffer: 5.2.1 3450 + 3451 + strip-bom@3.0.0: {} 2430 3452 2431 3453 strip-json-comments@5.0.3: {} 2432 3454 ··· 2473 3495 optionalDependencies: 2474 3496 fsevents: 2.3.3 2475 3497 3498 + typed-array-buffer@1.0.3: 3499 + dependencies: 3500 + call-bound: 1.0.4 3501 + es-errors: 1.3.0 3502 + is-typed-array: 1.1.15 3503 + 3504 + typed-array-byte-length@1.0.3: 3505 + dependencies: 3506 + call-bind: 1.0.8 3507 + for-each: 0.3.5 3508 + gopd: 1.2.0 3509 + has-proto: 1.2.0 3510 + is-typed-array: 1.1.15 3511 + 3512 + typed-array-byte-offset@1.0.4: 3513 + dependencies: 3514 + available-typed-arrays: 1.0.7 3515 + call-bind: 1.0.8 3516 + for-each: 0.3.5 3517 + gopd: 1.2.0 3518 + has-proto: 1.2.0 3519 + is-typed-array: 1.1.15 3520 + reflect.getprototypeof: 1.0.10 3521 + 3522 + typed-array-length@1.0.7: 3523 + dependencies: 3524 + call-bind: 1.0.8 3525 + for-each: 0.3.5 3526 + gopd: 1.2.0 3527 + is-typed-array: 1.1.15 3528 + possible-typed-array-names: 1.1.0 3529 + reflect.getprototypeof: 1.0.10 3530 + 2476 3531 typescript@5.9.2: {} 2477 3532 2478 3533 typescript@5.9.3: {} ··· 2483 3538 dependencies: 2484 3539 multiformats: 9.9.0 2485 3540 3541 + unbox-primitive@1.1.0: 3542 + dependencies: 3543 + call-bound: 1.0.4 3544 + has-bigints: 1.1.0 3545 + has-symbols: 1.1.0 3546 + which-boxed-primitive: 1.1.1 3547 + 2486 3548 undici-types@6.21.0: {} 2487 3549 2488 3550 undici-types@7.16.0: {} ··· 2490 3552 undici@6.21.3: {} 2491 3553 2492 3554 unicode-segmenter@0.14.4: {} 3555 + 3556 + validate-npm-package-license@3.0.4: 3557 + dependencies: 3558 + spdx-correct: 3.2.0 3559 + spdx-expression-parse: 3.0.1 3560 + 3561 + which-boxed-primitive@1.1.1: 3562 + dependencies: 3563 + is-bigint: 1.1.0 3564 + is-boolean-object: 1.2.2 3565 + is-number-object: 1.1.1 3566 + is-string: 1.1.1 3567 + is-symbol: 1.1.1 3568 + 3569 + which-builtin-type@1.2.1: 3570 + dependencies: 3571 + call-bound: 1.0.4 3572 + function.prototype.name: 1.1.8 3573 + has-tostringtag: 1.0.2 3574 + is-async-function: 2.1.1 3575 + is-date-object: 1.1.0 3576 + is-finalizationregistry: 1.1.1 3577 + is-generator-function: 1.1.2 3578 + is-regex: 1.2.1 3579 + is-weakref: 1.1.1 3580 + isarray: 2.0.5 3581 + which-boxed-primitive: 1.1.1 3582 + which-collection: 1.0.2 3583 + which-typed-array: 1.1.19 3584 + 3585 + which-collection@1.0.2: 3586 + dependencies: 3587 + is-map: 2.0.3 3588 + is-set: 2.0.3 3589 + is-weakmap: 2.0.2 3590 + is-weakset: 2.0.4 3591 + 3592 + which-typed-array@1.1.19: 3593 + dependencies: 3594 + available-typed-arrays: 1.0.7 3595 + call-bind: 1.0.8 3596 + call-bound: 1.0.4 3597 + for-each: 0.3.5 3598 + get-proto: 1.0.1 3599 + gopd: 1.2.0 3600 + has-tostringtag: 1.0.2 3601 + 3602 + which@1.3.1: 3603 + dependencies: 3604 + isexe: 2.0.0 2493 3605 2494 3606 wrappy@1.0.2: {} 2495 3607