diff --git a/.gitignore b/.gitignore index d823088ec..7eb6d9760 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ .idea/ .env coverage/ +dist/ sqlite/ redoc-static.html diff --git a/Dockerfile b/Dockerfile index ac8b89eea..48d9accd5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,24 +16,26 @@ FROM base as base_deps ENV CI=1 COPY .npmrc package.json pnpm-lock.yaml ./ +COPY patches/ patches/ RUN corepack enable RUN corepack prepare --activate -FROM base_deps as runtime_deps - # Install dependencies RUN --mount=type=cache,id=pnpm,target=/pnpm/store \ - pnpm install --frozen-lockfile --production + pnpm install --frozen-lockfile + +FROM base_deps as build + +COPY knexfile.js tsconfig.json tsup.config.ts ./ +COPY src/ src/ + +RUN pnpm run build FROM base_deps AS docs COPY docs/openapi.yaml docs/openapi.yaml -# Install dependencies -RUN --mount=type=cache,id=pnpm,target=/pnpm/store \ - pnpm install --frozen-lockfile - RUN --mount=type=cache,id=pnpm,target=/pnpm/store \ pnpm run docs @@ -43,7 +45,7 @@ COPY .npmrc knexfile.js package.json pnpm-lock.yaml ./ COPY src/ src/ COPY migrations/ migrations/ -COPY --from=runtime_deps /app/node_modules/ node_modules/ +COPY --from=build /app/dist dist/ COPY --from=docs /app/redoc-static.html . # Run with... @@ -52,4 +54,4 @@ ENV NODE_OPTIONS="--enable-source-maps" # Warnings disabled, we know what we're doing and they're annoying ENV NODE_NO_WARNINGS=1 -CMD ["node", "--run", "start"] +CMD ["node", "dist/index.js"] diff --git a/knexfile.js b/knexfile.js index 68a622229..257328e43 100644 --- a/knexfile.js +++ b/knexfile.js @@ -12,5 +12,9 @@ export default { useNullAsDefault: true, connection: { filename: `./sqlite/${process.env.NODE_ENV ?? "development"}.sqlite3`, + options: { + nativeBinding: + process.env.NODE_ENV === "production" ? "./dist/better_sqlite3.node" : undefined, + }, }, } diff --git a/package.json b/package.json index 7cbe7dfcf..076b5c41e 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "*.{js,cjs,mjs,ts,cts,mts,json}": ["biome check --fix"] }, "scripts": { + "build": "tsup", "dev": "node --experimental-strip-types --experimental-transform-types --watch src/index.ts", "docs": "pnpm --package=@redocly/cli dlx redocly build-docs docs/openapi.yaml", "docs:dev": "onchange --initial --kill docs/openapi.yaml -- pnpm --silent run docs", @@ -34,38 +35,38 @@ "resolutions": { "esbuild": "0.25.0" }, - "dependencies": { + "devDependencies": { + "@antfu/eslint-config": "4.4.0", + "@biomejs/biome": "1.9.4", "@hono/node-server": "1.13.8", "@hono/sentry": "1.2.0", "@hono/standard-validator": "0.1.2", "@sentry/node": "9.3.0", - "better-sqlite3": "11.8.1", - "hono": "4.7.2", - "is-ci": "4.1.0", - "knex": "3.1.0", - "ofetch": "1.4.1", - "pino": "9.6.0", - "valibot": "1.0.0-rc.3" - }, - "devDependencies": { - "@antfu/eslint-config": "4.3.0", - "@biomejs/biome": "1.9.4", "@standard-schema/spec": "1.0.0", "@tsconfig/node22": "22.0.0", "@tsconfig/strictest": "2.0.5", "@types/json-schema": "7.0.15", - "@types/node": "22.13.8", + "@types/node": "22.13.9", "@vitest/coverage-v8": "3.0.7", + "better-sqlite3": "11.8.1", "dotenv": "16.4.7", "eslint": "9.21.0", + "hono": "4.7.2", + "is-ci": "4.1.0", + "knex": "3.1.0", + "mentoss": "0.7.1", "nano-staged": "0.8.0", "onchange": "7.1.0", + "pino": "9.6.0", "pino-pretty": "13.0.0", "simple-git-hooks": "2.11.1", "tsconfig-paths": "4.2.0", - "type-fest": "4.36.0", + "tsup": "8.4.0", + "type-fest": "4.37.0", "typescript": "5.8.2", - "vitest": "3.0.7" + "valibot": "1.0.0-rc.3", + "vitest": "3.0.7", + "xior": "0.7.0" }, "pnpm": { "overrides": { @@ -83,6 +84,9 @@ "safe-buffer": "npm:@nolyfill/safe-buffer@^1" }, "onlyBuiltDependencies": ["better-sqlite3"], - "ignoredBuiltDependencies": ["@biomejs/biome", "esbuild", "simple-git-hooks"] + "ignoredBuiltDependencies": ["@biomejs/biome", "esbuild", "simple-git-hooks"], + "patchedDependencies": { + "knex": "patches/knex.patch" + } } } diff --git a/patches/knex.patch b/patches/knex.patch new file mode 100644 index 000000000..a8252261d --- /dev/null +++ b/patches/knex.patch @@ -0,0 +1,21 @@ +diff --git a/lib/dialects/index.js b/lib/dialects/index.js +index 559a366685d6517de819d1925233e972089928e7..476dcc63fd84758a7c65b1d4b493b73460f62764 100644 +--- a/lib/dialects/index.js ++++ b/lib/dialects/index.js +@@ -4,16 +4,6 @@ exports.getDialectByNameOrAlias = void 0; + const { resolveClientNameWithAliases } = require('../util/helpers'); + const dbNameToDialectLoader = Object.freeze({ + 'better-sqlite3': () => require('./better-sqlite3'), +- cockroachdb: () => require('./cockroachdb'), +- mssql: () => require('./mssql'), +- mysql: () => require('./mysql'), +- mysql2: () => require('./mysql2'), +- oracle: () => require('./oracle'), +- oracledb: () => require('./oracledb'), +- pgnative: () => require('./pgnative'), +- postgres: () => require('./postgres'), +- redshift: () => require('./redshift'), +- sqlite3: () => require('./sqlite3'), + }); + /** + * Gets the Dialect object with the given client name or throw an diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c6400bc7c..2c31e17ab 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,10 +19,21 @@ overrides: is-core-module: npm:@nolyfill/is-core-module@^1 safe-buffer: npm:@nolyfill/safe-buffer@^1 +patchedDependencies: + knex: + hash: db01a09d7d8f6a60609e1e3ea48a97742c28d90d3be6cf2cb3e330ee5a8d9082 + path: patches/knex.patch + importers: .: - dependencies: + devDependencies: + '@antfu/eslint-config': + specifier: 4.4.0 + version: 4.4.0(@typescript-eslint/utils@8.26.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2)(vitest@3.0.7(@types/debug@4.1.12)(@types/node@22.13.9)(terser@5.31.6)(yaml@2.7.0)) + '@biomejs/biome': + specifier: 1.9.4 + version: 1.9.4 '@hono/node-server': specifier: 1.13.8 version: 1.13.8(hono@4.7.2) @@ -35,34 +46,6 @@ importers: '@sentry/node': specifier: 9.3.0 version: 9.3.0 - better-sqlite3: - specifier: 11.8.1 - version: 11.8.1 - hono: - specifier: 4.7.2 - version: 4.7.2 - is-ci: - specifier: 4.1.0 - version: 4.1.0 - knex: - specifier: 3.1.0 - version: 3.1.0(better-sqlite3@11.8.1) - ofetch: - specifier: 1.4.1 - version: 1.4.1 - pino: - specifier: 9.6.0 - version: 9.6.0 - valibot: - specifier: 1.0.0-rc.3 - version: 1.0.0-rc.3(typescript@5.8.2) - devDependencies: - '@antfu/eslint-config': - specifier: 4.3.0 - version: 4.3.0(@typescript-eslint/utils@8.25.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2)(vitest@3.0.7(@types/debug@4.1.12)(@types/node@22.13.8)(terser@5.31.6)(yaml@2.7.0)) - '@biomejs/biome': - specifier: 1.9.4 - version: 1.9.4 '@standard-schema/spec': specifier: 1.0.0 version: 1.0.0 @@ -76,23 +59,41 @@ importers: specifier: 7.0.15 version: 7.0.15 '@types/node': - specifier: 22.13.8 - version: 22.13.8 + specifier: 22.13.9 + version: 22.13.9 '@vitest/coverage-v8': specifier: 3.0.7 - version: 3.0.7(vitest@3.0.7(@types/debug@4.1.12)(@types/node@22.13.8)(terser@5.31.6)(yaml@2.7.0)) + version: 3.0.7(vitest@3.0.7(@types/debug@4.1.12)(@types/node@22.13.9)(terser@5.31.6)(yaml@2.7.0)) + better-sqlite3: + specifier: 11.8.1 + version: 11.8.1 dotenv: specifier: 16.4.7 version: 16.4.7 eslint: specifier: 9.21.0 version: 9.21.0 + hono: + specifier: 4.7.2 + version: 4.7.2 + is-ci: + specifier: 4.1.0 + version: 4.1.0 + knex: + specifier: 3.1.0 + version: 3.1.0(patch_hash=db01a09d7d8f6a60609e1e3ea48a97742c28d90d3be6cf2cb3e330ee5a8d9082)(better-sqlite3@11.8.1) + mentoss: + specifier: 0.7.1 + version: 0.7.1 nano-staged: specifier: 0.8.0 version: 0.8.0 onchange: specifier: 7.1.0 version: 7.1.0 + pino: + specifier: 9.6.0 + version: 9.6.0 pino-pretty: specifier: 13.0.0 version: 13.0.0 @@ -102,15 +103,24 @@ importers: tsconfig-paths: specifier: 4.2.0 version: 4.2.0 + tsup: + specifier: 8.4.0 + version: 8.4.0(postcss@8.5.3)(typescript@5.8.2)(yaml@2.7.0) type-fest: - specifier: 4.36.0 - version: 4.36.0 + specifier: 4.37.0 + version: 4.37.0 typescript: specifier: 5.8.2 version: 5.8.2 + valibot: + specifier: 1.0.0-rc.3 + version: 1.0.0-rc.3(typescript@5.8.2) vitest: specifier: 3.0.7 - version: 3.0.7(@types/debug@4.1.12)(@types/node@22.13.8)(terser@5.31.6)(yaml@2.7.0) + version: 3.0.7(@types/debug@4.1.12)(@types/node@22.13.9)(terser@5.31.6)(yaml@2.7.0) + xior: + specifier: 0.7.0 + version: 0.7.0 packages: @@ -118,8 +128,8 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@antfu/eslint-config@4.3.0': - resolution: {integrity: sha512-x6jcUSkscXb63xEM8JekZlDALtsVETxSc19pu+DuEZjx4iv0J8gThRDMPsIolceTeSnyh9bfW4dlAGcfu2NLzg==} + '@antfu/eslint-config@4.4.0': + resolution: {integrity: sha512-UqZ517Gc6fjjcjHz4e1cDsBX6juixDxIDOpPpn9h6qIcrzTBq3Hc2RfBcU3GYuLrhsmGanmEdtCd0tSg2gJ+cg==} hasBin: true peerDependencies: '@eslint-react/eslint-plugin': ^1.19.0 @@ -546,8 +556,8 @@ packages: resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} engines: {node: '>=12.4.0'} - '@nolyfill/safe-buffer@1.0.41': - resolution: {integrity: sha512-QUutoN6a0Rf49n6kYVSppQpfraXfrtrUaxTU/GhcxIhz+3GHp+SrBVnTKE3ASB7AzgZJ7XrxhaBgwrF+hSmeKg==} + '@nolyfill/safe-buffer@1.0.44': + resolution: {integrity: sha512-SqlKXtlhNTDMeZKey9jnnuPhi8YTl1lJuEcY9zbm5i4Pqe79UJJ8IJ9oiD6DhgI8KjYc+HtLzpQJNRdNYqb/hw==} engines: {node: '>=12.4.0'} '@opentelemetry/api-logs@0.57.2': @@ -916,8 +926,8 @@ packages: '@types/mysql@2.15.26': resolution: {integrity: sha512-DSLCOXhkvfS5WNNPbfn2KdICAmk8lLc+/PNvnPnF7gOdMZCxopXduqv0OQ13y/yA/zXTSikZZqVgybUxOEg6YQ==} - '@types/node@22.13.8': - resolution: {integrity: sha512-G3EfaZS+iOGYWLLRCEAXdWK9my08oHNZ+FHluRiggIYJPOXzhOiDgpVCUHaUvyIC5/fj7C/p637jdzC666AOKQ==} + '@types/node@22.13.9': + resolution: {integrity: sha512-acBjXdRJ3A6Pb3tqnw9HZmyR3Fiol3aGxRCK1x3d+6CDAMjl7I649wpSd+yNURCjbOUGu9tqtLKnTGxmK6CyGw==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -934,51 +944,51 @@ packages: '@types/tedious@4.0.14': resolution: {integrity: sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==} - '@typescript-eslint/eslint-plugin@8.25.0': - resolution: {integrity: sha512-VM7bpzAe7JO/BFf40pIT1lJqS/z1F8OaSsUB3rpFJucQA4cOSuH2RVVVkFULN+En0Djgr29/jb4EQnedUo95KA==} + '@typescript-eslint/eslint-plugin@8.26.0': + resolution: {integrity: sha512-cLr1J6pe56zjKYajK6SSSre6nl1Gj6xDp1TY0trpgPzjVbgDwd09v2Ws37LABxzkicmUjhEeg/fAUjPJJB1v5Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/parser@8.25.0': - resolution: {integrity: sha512-4gbs64bnbSzu4FpgMiQ1A+D+urxkoJk/kqlDJ2W//5SygaEiAP2B4GoS7TEdxgwol2el03gckFV9lJ4QOMiiHg==} + '@typescript-eslint/parser@8.26.0': + resolution: {integrity: sha512-mNtXP9LTVBy14ZF3o7JG69gRPBK/2QWtQd0j0oH26HcY/foyJJau6pNUez7QrM5UHnSvwlQcJXKsk0I99B9pOA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/scope-manager@8.25.0': - resolution: {integrity: sha512-6PPeiKIGbgStEyt4NNXa2ru5pMzQ8OYKO1hX1z53HMomrmiSB+R5FmChgQAP1ro8jMtNawz+TRQo/cSXrauTpg==} + '@typescript-eslint/scope-manager@8.26.0': + resolution: {integrity: sha512-E0ntLvsfPqnPwng8b8y4OGuzh/iIOm2z8U3S9zic2TeMLW61u5IH2Q1wu0oSTkfrSzwbDJIB/Lm8O3//8BWMPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.25.0': - resolution: {integrity: sha512-d77dHgHWnxmXOPJuDWO4FDWADmGQkN5+tt6SFRZz/RtCWl4pHgFl3+WdYCn16+3teG09DY6XtEpf3gGD0a186g==} + '@typescript-eslint/type-utils@8.26.0': + resolution: {integrity: sha512-ruk0RNChLKz3zKGn2LwXuVoeBcUMh+jaqzN461uMMdxy5H9epZqIBtYj7UiPXRuOpaALXGbmRuZQhmwHhaS04Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/types@8.25.0': - resolution: {integrity: sha512-+vUe0Zb4tkNgznQwicsvLUJgZIRs6ITeWSCclX1q85pR1iOiaj+4uZJIUp//Z27QWu5Cseiw3O3AR8hVpax7Aw==} + '@typescript-eslint/types@8.26.0': + resolution: {integrity: sha512-89B1eP3tnpr9A8L6PZlSjBvnJhWXtYfZhECqlBl1D9Lme9mHO6iWlsprBtVenQvY1HMhax1mWOjhtL3fh/u+pA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.25.0': - resolution: {integrity: sha512-ZPaiAKEZ6Blt/TPAx5Ot0EIB/yGtLI2EsGoY6F7XKklfMxYQyvtL+gT/UCqkMzO0BVFHLDlzvFqQzurYahxv9Q==} + '@typescript-eslint/typescript-estree@8.26.0': + resolution: {integrity: sha512-tiJ1Hvy/V/oMVRTbEOIeemA2XoylimlDQ03CgPPNaHYZbpsc78Hmngnt+WXZfJX1pjQ711V7g0H7cSJThGYfPQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.25.0': - resolution: {integrity: sha512-syqRbrEv0J1wywiLsK60XzHnQe/kRViI3zwFALrNEgnntn1l24Ra2KvOAWwWbWZ1lBZxZljPDGOq967dsl6fkA==} + '@typescript-eslint/utils@8.26.0': + resolution: {integrity: sha512-2L2tU3FVwhvU14LndnQCA2frYC8JnPDVKyQtWFPf8IYFMt/ykEN1bPolNhNbCVgOmdzTlWdusCTKA/9nKrf8Ig==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/visitor-keys@8.25.0': - resolution: {integrity: sha512-kCYXKAum9CecGVHGij7muybDfTS2sD3t0L4bJsEZLkyrXUImiCTq1M3LG2SRtOhiHFwMR9wAFplpT6XHYjTkwQ==} + '@typescript-eslint/visitor-keys@8.26.0': + resolution: {integrity: sha512-2z8JQJWAzPdDd51dRQ/oqIJxe99/hoLIqmf8RMCAJQtYDc535W/Jt2+RTP4bP0aKeBG1F65yjIZuczOXCmbWwg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vitest/coverage-v8@3.0.7': @@ -1070,6 +1080,9 @@ packages: resolution: {integrity: sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==} engines: {node: '>=14'} + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -1136,6 +1149,12 @@ packages: resolution: {integrity: sha512-p1n8zyCkt1BVrKNFymOHjcDSAl7oq/gUvfgULv2EblgpPVQlQr9yHnWjg9IJ2MhfwPqiYqMMrr01OY7yQoK2yA==} engines: {node: '>=18.20'} + bundle-require@5.1.0: + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: 0.25.0 + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -1144,8 +1163,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001701: - resolution: {integrity: sha512-faRs/AW3jA9nTwmJBSO1PQ6L/EOgsB5HMQQq4iCu5zhPgVVgO/pZRHlmatwijZKetFw8/Pr4q6dEN8sJuq8qTw==} + caniuse-lite@1.0.30001702: + resolution: {integrity: sha512-LoPe/D7zioC0REI5W73PeR1e1MLCipRGq/VkovJnd6Df+QVqT+vT33OXCp8QUd7kA7RZrHWxb1B36OQKI/0gOA==} chai@5.2.0: resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} @@ -1163,6 +1182,10 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} @@ -1197,6 +1220,10 @@ packages: commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + comment-parser@1.4.1: resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} engines: {node: '>= 12.0.0'} @@ -1207,6 +1234,13 @@ packages: confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + confbox@0.2.1: + resolution: {integrity: sha512-hkT3yDPFbs95mNCy1+7qNKC6Pro+/ibzYxtM2iqEigpf0sVw+bg4Zh9/snjsBcf990vfIsg5+1U7VyiyBb3etg==} + + consola@3.4.0: + resolution: {integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==} + engines: {node: ^14.18.0 || >=16.10.0} + core-js-compat@3.41.0: resolution: {integrity: sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==} @@ -1258,9 +1292,6 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - destr@2.0.3: - resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} - detect-libc@2.0.3: resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} @@ -1276,8 +1307,8 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - electron-to-chromium@1.5.109: - resolution: {integrity: sha512-AidaH9JETVRr9DIPGfp1kAarm/W6hRJTPuCnkF+2MqhF4KaAgRIcBc8nvjk+YMXZhwfISof/7WG29eS4iGxQLQ==} + electron-to-chromium@1.5.112: + resolution: {integrity: sha512-oen93kVyqSb3l+ziUgzIOlWt/oOuy4zRmpwestMn4rhFWAoFJeFuCVte9F2fASjeZZo7l/Cif9TiyrdW4CwEMA==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -1362,8 +1393,8 @@ packages: peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - eslint-plugin-n@17.16.1: - resolution: {integrity: sha512-/7FVAwjUrix9P5lycnsYRIQRwFo/DZROD+ZXWLpE+/EZWLyuLvyFaRdAPYJSz+nlAdZIZp+LAzlBerQSVYUNFg==} + eslint-plugin-n@17.16.2: + resolution: {integrity: sha512-iQM5Oj+9o0KaeLoObJC/uxNGpktZCkYiTTBo8PkRWq3HwNcRxwpvSDFjBhQ5+HLJzBTy+CLDC5+bw0Z5GyhlOQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8.23.0' @@ -1464,6 +1495,9 @@ packages: resolution: {integrity: sha512-80F22aiJ3GLyVnS/B3HzgR6RelZVumzj9jkL0Rhz4h0xYbNW9PjlQz5h3J/SShErbXBc295vseR4/MIbVmUbeA==} engines: {node: '>=12.0.0'} + exsolve@1.0.1: + resolution: {integrity: sha512-Smf0iQtkQVJLaph8r/qS8C8SWfQkaq9Q/dFcD44MLbJj6DNhlWefVuaS21SjfqOsBbjVlKtbCj6L9ekXK6EZUg==} + fast-copy@3.0.2: resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} @@ -1490,6 +1524,14 @@ packages: fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + fdir@6.4.3: + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -1564,6 +1606,10 @@ packages: resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} engines: {node: '>=18'} + globals@16.0.0: + resolution: {integrity: sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==} + engines: {node: '>=18'} + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -1748,8 +1794,19 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - local-pkg@1.1.0: - resolution: {integrity: sha512-xbZBuX6gYIWrlLmZG43aAVer4ocntYO09vPy9lxd6Ns8DnR4U7N+IIeDkubinqFOHHzoMlPxTxwo0jhE7oYjAw==} + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + local-pkg@1.1.1: + resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==} engines: {node: '>=14'} locate-path@6.0.0: @@ -1759,6 +1816,9 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} @@ -1778,6 +1838,10 @@ packages: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} + mentoss@0.7.1: + resolution: {integrity: sha512-sKGcyuENfPJE8y2ZxRmTmQBIhEk8o1X6ljyBocpzvgb0gDDehPmS0+Lmuh7XKcufdPB4LWYu/K8lDNkAzdQi6g==} + engines: {node: '>=18.18'} + merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -1794,10 +1858,6 @@ packages: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} - minimatch@10.0.1: - resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} - engines: {node: 20 || >=22} - minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -1827,6 +1887,9 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + nano-staged@0.8.0: resolution: {integrity: sha512-QSEqPGTCJbkHU2yLvfY6huqYPjdBrOaTMKatO1F8nCSrkQGXeKwtCiCnsdxnuMhbg3DTVywKaeWLGCE5oJpq0g==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -1851,9 +1914,6 @@ packages: resolution: {integrity: sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==} engines: {node: '>=10'} - node-fetch-native@1.6.6: - resolution: {integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==} - node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} @@ -1865,8 +1925,9 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - ofetch@1.4.1: - resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} on-exit-leak-free@2.1.2: resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} @@ -1956,6 +2017,10 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + pino-abstract-transport@2.0.0: resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} @@ -1970,13 +2035,38 @@ packages: resolution: {integrity: sha512-i85pKRCt4qMjZ1+L7sy2Ag4t1atFcdbEt76+7iRJn1g2BvsnRMGu9p8pivl9fs63M2kF/A0OacFZhTub+m/qMg==} hasBin: true + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + pkg-types@2.1.0: + resolution: {integrity: sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==} + pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + postcss@8.5.3: resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} engines: {node: ^10 || ^12 || >=14} @@ -2016,8 +2106,8 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - quansync@0.2.7: - resolution: {integrity: sha512-KZDFlN9/Si3CgKHZsIfLBsrjWKFjqu9KA0zDGJEQoQzPm5HWNDEFc2mkLeYUBBOwEJtxNBSMaNLE/GlvArIEfQ==} + quansync@0.2.8: + resolution: {integrity: sha512-4+saucphJMazjt7iOM27mbFCk+D9dd/zmgMDCzRZ8MEoBfYp7lAvoN38et/phRQF6wOPMy/OROBGgoWeSKyluA==} queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -2045,6 +2135,10 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + real-require@0.2.0: resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} engines: {node: '>= 12.13.0'} @@ -2165,6 +2259,10 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} @@ -2190,8 +2288,8 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - std-env@3.8.0: - resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} + std-env@3.8.1: + resolution: {integrity: sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==} string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} @@ -2228,6 +2326,11 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -2264,6 +2367,13 @@ packages: resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} engines: {node: '>=18'} + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + thread-stream@3.1.0: resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} @@ -2271,12 +2381,20 @@ packages: resolution: {integrity: sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==} engines: {node: '>=8'} + tiny-lru@11.2.11: + resolution: {integrity: sha512-27BIW0dIWTYYoWNnqSmoNMKe5WIbkXsc0xaCQHd3/3xT2XMuMJrzHdrO9QBFR14emBz1Bu0dOAs2sCBBrvgPQA==} + engines: {node: '>=12'} + tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyglobby@0.2.12: + resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} + engines: {node: '>=12.0.0'} + tinypool@1.0.2: resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -2296,6 +2414,9 @@ packages: toucan-js@4.1.1: resolution: {integrity: sha512-GTPwEaCRN8IbYe5/VeGiwxYvMO0dKaC16fTeLbF+QGswjkLZ9JUqAfDhLMyH2SWukYhmetH+uxWa1Bhluv/evQ==} + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true @@ -2306,10 +2427,12 @@ packages: peerDependencies: typescript: '>=4.8.4' - ts-declaration-location@1.0.5: - resolution: {integrity: sha512-WqmlO9IoeYwCqJ2E9kHMcY9GZhhfLYItC3VnHDlPOrg6nNdUWS4wn4hhDZUPt60m1EvtjPIZyprTjpI992Bgzw==} - peerDependencies: - typescript: '>=4.0.0' + ts-deepmerge@7.0.2: + resolution: {integrity: sha512-akcpDTPuez4xzULo5NwuoKwYRtjQJ9eoNfBACiBMaXwNAx7B1PKfe5wqUFJuW5uKzQ68YjDFwPaWHDG1KnFGsA==} + engines: {node: '>=14.13.1'} + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} tsconfig-paths@4.2.0: resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} @@ -2318,6 +2441,25 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsup@8.4.0: + resolution: {integrity: sha512-b+eZbPCjz10fRryaAA7C8xlIHnf8VnsaRqydheLIqwG/Mcpfk8Z5zp3HayX7GaTygkigHl5cBUs+IhcySiIexQ==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} @@ -2325,8 +2467,8 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-fest@4.36.0: - resolution: {integrity: sha512-3T/PUdKTCnkUmhQU6FFJEHsLwadsRegktX3TNHk+2JJB9HlA8gp1/VXblXVDI93kSnXF2rdPx0GMbHtJIV2LPg==} + type-fest@4.37.0: + resolution: {integrity: sha512-S/5/0kFftkq27FPNye0XM1e2NsnoD/3FS+pBmbjmmtLT6I+i344KoOf7pvXreaFsDamWeaJX55nczA1m5PsBDg==} engines: {node: '>=16'} typescript@5.8.2: @@ -2353,6 +2495,9 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + urlpattern-polyfill@10.0.0: + resolution: {integrity: sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==} + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -2446,6 +2591,12 @@ packages: peerDependencies: eslint: '>=6.0.0' + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -2471,6 +2622,9 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + xior@0.7.0: + resolution: {integrity: sha512-23fm/GgGK/FVq5uwNspgPZeRoHsnsHKry569gPdHKAH4qK4gf3vSMLiGPdIA/FU4pC1ldx3SDq2LVxAEH/ES/A==} + xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} @@ -2491,14 +2645,14 @@ snapshots: '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 - '@antfu/eslint-config@4.3.0(@typescript-eslint/utils@8.25.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2)(vitest@3.0.7(@types/debug@4.1.12)(@types/node@22.13.8)(terser@5.31.6)(yaml@2.7.0))': + '@antfu/eslint-config@4.4.0(@typescript-eslint/utils@8.26.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2)(vitest@3.0.7(@types/debug@4.1.12)(@types/node@22.13.9)(terser@5.31.6)(yaml@2.7.0))': dependencies: '@antfu/install-pkg': 1.0.0 '@clack/prompts': 0.10.0 '@eslint-community/eslint-plugin-eslint-comments': 4.4.1(eslint@9.21.0) - '@typescript-eslint/eslint-plugin': 8.25.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2) - '@typescript-eslint/parser': 8.25.0(eslint@9.21.0)(typescript@5.8.2) - '@vitest/eslint-plugin': 1.1.36(@typescript-eslint/utils@8.25.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2)(vitest@3.0.7(@types/debug@4.1.12)(@types/node@22.13.8)(terser@5.31.6)(yaml@2.7.0)) + '@typescript-eslint/eslint-plugin': 8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2) + '@typescript-eslint/parser': 8.26.0(eslint@9.21.0)(typescript@5.8.2) + '@vitest/eslint-plugin': 1.1.36(@typescript-eslint/utils@8.26.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2)(vitest@3.0.7(@types/debug@4.1.12)(@types/node@22.13.9)(terser@5.31.6)(yaml@2.7.0)) ansis: 3.17.0 cac: 6.7.14 eslint: 9.21.0 @@ -2509,14 +2663,14 @@ snapshots: eslint-plugin-command: 3.1.0(eslint@9.21.0) eslint-plugin-import-x: 4.6.1(eslint@9.21.0)(typescript@5.8.2) eslint-plugin-jsdoc: 50.6.3(eslint@9.21.0) - eslint-plugin-n: 17.16.1(eslint@9.21.0)(typescript@5.8.2) + eslint-plugin-n: 17.16.2(eslint@9.21.0) eslint-plugin-no-only-tests: 3.3.0 eslint-plugin-perfectionist: 4.9.0(eslint@9.21.0)(typescript@5.8.2) eslint-plugin-regexp: 2.7.0(eslint@9.21.0) eslint-plugin-unicorn: 57.0.0(eslint@9.21.0) - eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.25.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0) - globals: 15.15.0 - local-pkg: 1.1.0 + eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0) + globals: 16.0.0 + local-pkg: 1.1.1 parse-gitignore: 2.0.0 vue-eslint-parser: 9.4.3(eslint@9.21.0) transitivePeerDependencies: @@ -2611,7 +2765,7 @@ snapshots: dependencies: '@types/eslint': 9.6.1 '@types/estree': 1.0.6 - '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/types': 8.26.0 comment-parser: 1.4.1 esquery: 1.6.0 jsdoc-type-pratt-parser: 4.1.0 @@ -2818,7 +2972,7 @@ snapshots: '@nolyfill/is-core-module@1.0.39': {} - '@nolyfill/safe-buffer@1.0.41': {} + '@nolyfill/safe-buffer@1.0.44': {} '@opentelemetry/api-logs@0.57.2': dependencies: @@ -3210,7 +3364,7 @@ snapshots: '@types/connect@3.4.38': dependencies: - '@types/node': 22.13.8 + '@types/node': 22.13.9 '@types/debug@4.1.12': dependencies: @@ -3233,9 +3387,9 @@ snapshots: '@types/mysql@2.15.26': dependencies: - '@types/node': 22.13.8 + '@types/node': 22.13.9 - '@types/node@22.13.8': + '@types/node@22.13.9': dependencies: undici-types: 6.20.0 @@ -3247,7 +3401,7 @@ snapshots: '@types/pg@8.6.1': dependencies: - '@types/node': 22.13.8 + '@types/node': 22.13.9 pg-protocol: 1.7.1 pg-types: 2.2.0 @@ -3255,16 +3409,16 @@ snapshots: '@types/tedious@4.0.14': dependencies: - '@types/node': 22.13.8 + '@types/node': 22.13.9 - '@typescript-eslint/eslint-plugin@8.25.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2)': + '@typescript-eslint/eslint-plugin@8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.25.0(eslint@9.21.0)(typescript@5.8.2) - '@typescript-eslint/scope-manager': 8.25.0 - '@typescript-eslint/type-utils': 8.25.0(eslint@9.21.0)(typescript@5.8.2) - '@typescript-eslint/utils': 8.25.0(eslint@9.21.0)(typescript@5.8.2) - '@typescript-eslint/visitor-keys': 8.25.0 + '@typescript-eslint/parser': 8.26.0(eslint@9.21.0)(typescript@5.8.2) + '@typescript-eslint/scope-manager': 8.26.0 + '@typescript-eslint/type-utils': 8.26.0(eslint@9.21.0)(typescript@5.8.2) + '@typescript-eslint/utils': 8.26.0(eslint@9.21.0)(typescript@5.8.2) + '@typescript-eslint/visitor-keys': 8.26.0 eslint: 9.21.0 graphemer: 1.4.0 ignore: 5.3.2 @@ -3274,27 +3428,27 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.25.0(eslint@9.21.0)(typescript@5.8.2)': + '@typescript-eslint/parser@8.26.0(eslint@9.21.0)(typescript@5.8.2)': dependencies: - '@typescript-eslint/scope-manager': 8.25.0 - '@typescript-eslint/types': 8.25.0 - '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.8.2) - '@typescript-eslint/visitor-keys': 8.25.0 + '@typescript-eslint/scope-manager': 8.26.0 + '@typescript-eslint/types': 8.26.0 + '@typescript-eslint/typescript-estree': 8.26.0(typescript@5.8.2) + '@typescript-eslint/visitor-keys': 8.26.0 debug: 4.4.0 eslint: 9.21.0 typescript: 5.8.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.25.0': + '@typescript-eslint/scope-manager@8.26.0': dependencies: - '@typescript-eslint/types': 8.25.0 - '@typescript-eslint/visitor-keys': 8.25.0 + '@typescript-eslint/types': 8.26.0 + '@typescript-eslint/visitor-keys': 8.26.0 - '@typescript-eslint/type-utils@8.25.0(eslint@9.21.0)(typescript@5.8.2)': + '@typescript-eslint/type-utils@8.26.0(eslint@9.21.0)(typescript@5.8.2)': dependencies: - '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.8.2) - '@typescript-eslint/utils': 8.25.0(eslint@9.21.0)(typescript@5.8.2) + '@typescript-eslint/typescript-estree': 8.26.0(typescript@5.8.2) + '@typescript-eslint/utils': 8.26.0(eslint@9.21.0)(typescript@5.8.2) debug: 4.4.0 eslint: 9.21.0 ts-api-utils: 2.0.1(typescript@5.8.2) @@ -3302,12 +3456,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.25.0': {} + '@typescript-eslint/types@8.26.0': {} - '@typescript-eslint/typescript-estree@8.25.0(typescript@5.8.2)': + '@typescript-eslint/typescript-estree@8.26.0(typescript@5.8.2)': dependencies: - '@typescript-eslint/types': 8.25.0 - '@typescript-eslint/visitor-keys': 8.25.0 + '@typescript-eslint/types': 8.26.0 + '@typescript-eslint/visitor-keys': 8.26.0 debug: 4.4.0 fast-glob: 3.3.3 is-glob: 4.0.3 @@ -3318,23 +3472,23 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.25.0(eslint@9.21.0)(typescript@5.8.2)': + '@typescript-eslint/utils@8.26.0(eslint@9.21.0)(typescript@5.8.2)': dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0) - '@typescript-eslint/scope-manager': 8.25.0 - '@typescript-eslint/types': 8.25.0 - '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.8.2) + '@typescript-eslint/scope-manager': 8.26.0 + '@typescript-eslint/types': 8.26.0 + '@typescript-eslint/typescript-estree': 8.26.0(typescript@5.8.2) eslint: 9.21.0 typescript: 5.8.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.25.0': + '@typescript-eslint/visitor-keys@8.26.0': dependencies: - '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/types': 8.26.0 eslint-visitor-keys: 4.2.0 - '@vitest/coverage-v8@3.0.7(vitest@3.0.7(@types/debug@4.1.12)(@types/node@22.13.8)(terser@5.31.6)(yaml@2.7.0))': + '@vitest/coverage-v8@3.0.7(vitest@3.0.7(@types/debug@4.1.12)(@types/node@22.13.9)(terser@5.31.6)(yaml@2.7.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -3345,20 +3499,20 @@ snapshots: istanbul-reports: 3.1.7 magic-string: 0.30.17 magicast: 0.3.5 - std-env: 3.8.0 + std-env: 3.8.1 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.0.7(@types/debug@4.1.12)(@types/node@22.13.8)(terser@5.31.6)(yaml@2.7.0) + vitest: 3.0.7(@types/debug@4.1.12)(@types/node@22.13.9)(terser@5.31.6)(yaml@2.7.0) transitivePeerDependencies: - supports-color - '@vitest/eslint-plugin@1.1.36(@typescript-eslint/utils@8.25.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2)(vitest@3.0.7(@types/debug@4.1.12)(@types/node@22.13.8)(terser@5.31.6)(yaml@2.7.0))': + '@vitest/eslint-plugin@1.1.36(@typescript-eslint/utils@8.26.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2)(vitest@3.0.7(@types/debug@4.1.12)(@types/node@22.13.9)(terser@5.31.6)(yaml@2.7.0))': dependencies: - '@typescript-eslint/utils': 8.25.0(eslint@9.21.0)(typescript@5.8.2) + '@typescript-eslint/utils': 8.26.0(eslint@9.21.0)(typescript@5.8.2) eslint: 9.21.0 optionalDependencies: typescript: 5.8.2 - vitest: 3.0.7(@types/debug@4.1.12)(@types/node@22.13.8)(terser@5.31.6)(yaml@2.7.0) + vitest: 3.0.7(@types/debug@4.1.12)(@types/node@22.13.9)(terser@5.31.6)(yaml@2.7.0) '@vitest/expect@3.0.7': dependencies: @@ -3367,13 +3521,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.0.7(vite@6.2.0(@types/node@22.13.8)(terser@5.31.6)(yaml@2.7.0))': + '@vitest/mocker@3.0.7(vite@6.2.0(@types/node@22.13.9)(terser@5.31.6)(yaml@2.7.0))': dependencies: '@vitest/spy': 3.0.7 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.2.0(@types/node@22.13.8)(terser@5.31.6)(yaml@2.7.0) + vite: 6.2.0(@types/node@22.13.9)(terser@5.31.6)(yaml@2.7.0) '@vitest/pretty-format@3.0.7': dependencies: @@ -3429,6 +3583,8 @@ snapshots: ansis@3.17.0: {} + any-promise@1.3.0: {} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -3480,8 +3636,8 @@ snapshots: browserslist@4.24.4: dependencies: - caniuse-lite: 1.0.30001701 - electron-to-chromium: 1.5.109 + caniuse-lite: 1.0.30001702 + electron-to-chromium: 1.5.112 node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.24.4) @@ -3495,11 +3651,16 @@ snapshots: builtin-modules@4.0.0: {} + bundle-require@5.1.0(esbuild@0.25.0): + dependencies: + esbuild: 0.25.0 + load-tsconfig: 0.2.5 + cac@6.7.14: {} callsites@3.1.0: {} - caniuse-lite@1.0.30001701: {} + caniuse-lite@1.0.30001702: {} chai@5.2.0: dependencies: @@ -3528,6 +3689,10 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + chownr@1.1.4: {} ci-info@4.1.0: {} @@ -3553,12 +3718,18 @@ snapshots: commander@2.20.3: optional: true + commander@4.1.1: {} + comment-parser@1.4.1: {} concat-map@0.0.1: {} confbox@0.1.8: {} + confbox@0.2.1: {} + + consola@3.4.0: {} + core-js-compat@3.41.0: dependencies: browserslist: 4.24.4 @@ -3593,8 +3764,6 @@ snapshots: deep-is@0.1.4: {} - destr@2.0.3: {} - detect-libc@2.0.3: {} doctrine@3.0.0: @@ -3605,7 +3774,7 @@ snapshots: eastasianwidth@0.2.0: {} - electron-to-chromium@1.5.109: {} + electron-to-chromium@1.5.112: {} emoji-regex@8.0.0: {} @@ -3701,8 +3870,8 @@ snapshots: eslint-plugin-import-x@4.6.1(eslint@9.21.0)(typescript@5.8.2): dependencies: '@types/doctrine': 0.0.9 - '@typescript-eslint/scope-manager': 8.25.0 - '@typescript-eslint/utils': 8.25.0(eslint@9.21.0)(typescript@5.8.2) + '@typescript-eslint/scope-manager': 8.26.0 + '@typescript-eslint/utils': 8.26.0(eslint@9.21.0)(typescript@5.8.2) debug: 4.4.0 doctrine: 3.0.0 enhanced-resolve: 5.18.1 @@ -3735,10 +3904,9 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-n@17.16.1(eslint@9.21.0)(typescript@5.8.2): + eslint-plugin-n@17.16.2(eslint@9.21.0): dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0) - '@typescript-eslint/utils': 8.25.0(eslint@9.21.0)(typescript@5.8.2) enhanced-resolve: 5.18.1 eslint: 9.21.0 eslint-plugin-es-x: 7.8.0(eslint@9.21.0) @@ -3747,17 +3915,13 @@ snapshots: ignore: 5.3.2 minimatch: 9.0.5 semver: 7.7.1 - ts-declaration-location: 1.0.5(typescript@5.8.2) - transitivePeerDependencies: - - supports-color - - typescript eslint-plugin-no-only-tests@3.3.0: {} eslint-plugin-perfectionist@4.9.0(eslint@9.21.0)(typescript@5.8.2): dependencies: - '@typescript-eslint/types': 8.25.0 - '@typescript-eslint/utils': 8.25.0(eslint@9.21.0)(typescript@5.8.2) + '@typescript-eslint/types': 8.26.0 + '@typescript-eslint/utils': 8.26.0(eslint@9.21.0)(typescript@5.8.2) eslint: 9.21.0 natural-orderby: 5.0.0 transitivePeerDependencies: @@ -3795,11 +3959,11 @@ snapshots: semver: 7.7.1 strip-indent: 4.0.0 - eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.25.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0): + eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0): dependencies: eslint: 9.21.0 optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.25.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2) + '@typescript-eslint/eslint-plugin': 8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2) eslint-scope@7.2.2: dependencies: @@ -3888,6 +4052,8 @@ snapshots: expect-type@1.2.0: {} + exsolve@1.0.1: {} + fast-copy@3.0.2: {} fast-deep-equal@3.1.3: {} @@ -3912,6 +4078,10 @@ snapshots: dependencies: reusify: 1.1.0 + fdir@6.4.3(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -3979,6 +4149,8 @@ snapshots: globals@15.15.0: {} + globals@16.0.0: {} + graceful-fs@4.2.11: {} graphemer@1.4.0: {} @@ -4100,7 +4272,7 @@ snapshots: dependencies: json-buffer: 3.0.1 - knex@3.1.0(better-sqlite3@11.8.1): + knex@3.1.0(patch_hash=db01a09d7d8f6a60609e1e3ea48a97742c28d90d3be6cf2cb3e330ee5a8d9082)(better-sqlite3@11.8.1): dependencies: colorette: 2.0.19 commander: 10.0.1 @@ -4126,11 +4298,17 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - local-pkg@1.1.0: + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + load-tsconfig@0.2.5: {} + + local-pkg@1.1.1: dependencies: mlly: 1.7.4 - pkg-types: 1.3.1 - quansync: 0.2.7 + pkg-types: 2.1.0 + quansync: 0.2.8 locate-path@6.0.0: dependencies: @@ -4138,6 +4316,8 @@ snapshots: lodash.merge@4.6.2: {} + lodash.sortby@4.7.0: {} + lodash@4.17.21: {} loupe@3.1.3: {} @@ -4158,6 +4338,10 @@ snapshots: dependencies: semver: 7.7.1 + mentoss@0.7.1: + dependencies: + urlpattern-polyfill: 10.0.0 + merge2@1.4.1: {} micromatch@4.0.8: @@ -4169,10 +4353,6 @@ snapshots: min-indent@1.0.1: {} - minimatch@10.0.1: - dependencies: - brace-expansion: 2.0.1 - minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -4200,6 +4380,12 @@ snapshots: ms@2.1.3: {} + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + nano-staged@0.8.0: dependencies: picocolors: 1.1.1 @@ -4216,8 +4402,6 @@ snapshots: dependencies: semver: 7.7.1 - node-fetch-native@1.6.6: {} - node-releases@2.0.19: {} normalize-package-data@6.0.2: @@ -4228,11 +4412,7 @@ snapshots: normalize-path@3.0.0: {} - ofetch@1.4.1: - dependencies: - destr: 2.0.3 - node-fetch-native: 1.6.6 - ufo: 1.5.4 + object-assign@4.1.1: {} on-exit-leak-free@2.1.2: {} @@ -4271,7 +4451,7 @@ snapshots: package-manager-detector@0.2.11: dependencies: - quansync: 0.2.7 + quansync: 0.2.8 parent-module@1.0.1: dependencies: @@ -4288,7 +4468,7 @@ snapshots: dependencies: '@babel/code-frame': 7.26.2 index-to-position: 0.1.2 - type-fest: 4.36.0 + type-fest: 4.37.0 path-exists@4.0.0: {} @@ -4323,6 +4503,8 @@ snapshots: picomatch@2.3.1: {} + picomatch@4.0.2: {} + pino-abstract-transport@2.0.0: dependencies: split2: 4.2.0 @@ -4359,14 +4541,29 @@ snapshots: sonic-boom: 4.2.0 thread-stream: 3.1.0 + pirates@4.0.6: {} + pkg-types@1.3.1: dependencies: confbox: 0.1.8 mlly: 1.7.4 pathe: 2.0.3 + pkg-types@2.1.0: + dependencies: + confbox: 0.2.1 + exsolve: 1.0.1 + pathe: 2.0.3 + pluralize@8.0.0: {} + postcss-load-config@6.0.1(postcss@8.5.3)(yaml@2.7.0): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + postcss: 8.5.3 + yaml: 2.7.0 + postcss@8.5.3: dependencies: nanoid: 3.3.8 @@ -4409,7 +4606,7 @@ snapshots: punycode@2.3.1: {} - quansync@0.2.7: {} + quansync@0.2.8: {} queue-microtask@1.2.3: {} @@ -4426,14 +4623,14 @@ snapshots: dependencies: find-up-simple: 1.0.1 read-pkg: 9.0.1 - type-fest: 4.36.0 + type-fest: 4.37.0 read-pkg@9.0.1: dependencies: '@types/normalize-package-data': 2.4.4 normalize-package-data: 6.0.2 parse-json: 8.1.0 - type-fest: 4.36.0 + type-fest: 4.37.0 unicorn-magic: 0.1.0 readable-stream@3.6.2: @@ -4446,6 +4643,8 @@ snapshots: dependencies: picomatch: 2.3.1 + readdirp@4.1.2: {} + real-require@0.2.0: {} rechoir@0.8.0: @@ -4571,6 +4770,10 @@ snapshots: source-map@0.6.1: optional: true + source-map@0.8.0-beta.0: + dependencies: + whatwg-url: 7.1.0 + spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 @@ -4596,7 +4799,7 @@ snapshots: stackback@0.0.2: {} - std-env@3.8.0: {} + std-env@3.8.1: {} string-width@4.2.3: dependencies: @@ -4612,7 +4815,7 @@ snapshots: string_decoder@1.3.0: dependencies: - safe-buffer: '@nolyfill/safe-buffer@1.0.41' + safe-buffer: '@nolyfill/safe-buffer@1.0.44' strip-ansi@6.0.1: dependencies: @@ -4632,6 +4835,16 @@ snapshots: strip-json-comments@3.1.1: {} + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -4676,16 +4889,31 @@ snapshots: glob: 10.4.5 minimatch: 9.0.5 + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + thread-stream@3.1.0: dependencies: real-require: 0.2.0 tildify@2.0.0: {} + tiny-lru@11.2.11: {} + tinybench@2.9.0: {} tinyexec@0.3.2: {} + tinyglobby@0.2.12: + dependencies: + fdir: 6.4.3(picomatch@4.0.2) + picomatch: 4.0.2 + tinypool@1.0.2: {} tinyrainbow@2.0.0: {} @@ -4702,16 +4930,19 @@ snapshots: '@sentry/types': 8.9.2 '@sentry/utils': 8.9.2 + tr46@1.0.1: + dependencies: + punycode: 2.3.1 + tree-kill@1.2.2: {} ts-api-utils@2.0.1(typescript@5.8.2): dependencies: typescript: 5.8.2 - ts-declaration-location@1.0.5(typescript@5.8.2): - dependencies: - minimatch: 10.0.1 - typescript: 5.8.2 + ts-deepmerge@7.0.2: {} + + ts-interface-checker@0.1.13: {} tsconfig-paths@4.2.0: dependencies: @@ -4721,15 +4952,42 @@ snapshots: tslib@2.8.1: {} + tsup@8.4.0(postcss@8.5.3)(typescript@5.8.2)(yaml@2.7.0): + dependencies: + bundle-require: 5.1.0(esbuild@0.25.0) + cac: 6.7.14 + chokidar: 4.0.3 + consola: 3.4.0 + debug: 4.4.0 + esbuild: 0.25.0 + joycon: 3.1.1 + picocolors: 1.1.1 + postcss-load-config: 6.0.1(postcss@8.5.3)(yaml@2.7.0) + resolve-from: 5.0.0 + rollup: 4.34.9 + source-map: 0.8.0-beta.0 + sucrase: 3.35.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.12 + tree-kill: 1.2.2 + optionalDependencies: + postcss: 8.5.3 + typescript: 5.8.2 + transitivePeerDependencies: + - jiti + - supports-color + - tsx + - yaml + tunnel-agent@0.6.0: dependencies: - safe-buffer: '@nolyfill/safe-buffer@1.0.41' + safe-buffer: '@nolyfill/safe-buffer@1.0.44' type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - type-fest@4.36.0: {} + type-fest@4.37.0: {} typescript@5.8.2: {} @@ -4749,6 +5007,8 @@ snapshots: dependencies: punycode: 2.3.1 + urlpattern-polyfill@10.0.0: {} + util-deprecate@1.0.2: {} valibot@1.0.0-rc.3(typescript@5.8.2): @@ -4760,13 +5020,13 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - vite-node@3.0.7(@types/node@22.13.8)(terser@5.31.6)(yaml@2.7.0): + vite-node@3.0.7(@types/node@22.13.9)(terser@5.31.6)(yaml@2.7.0): dependencies: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.6.0 pathe: 2.0.3 - vite: 6.2.0(@types/node@22.13.8)(terser@5.31.6)(yaml@2.7.0) + vite: 6.2.0(@types/node@22.13.9)(terser@5.31.6)(yaml@2.7.0) transitivePeerDependencies: - '@types/node' - jiti @@ -4781,21 +5041,21 @@ snapshots: - tsx - yaml - vite@6.2.0(@types/node@22.13.8)(terser@5.31.6)(yaml@2.7.0): + vite@6.2.0(@types/node@22.13.9)(terser@5.31.6)(yaml@2.7.0): dependencies: esbuild: 0.25.0 postcss: 8.5.3 rollup: 4.34.9 optionalDependencies: - '@types/node': 22.13.8 + '@types/node': 22.13.9 fsevents: 2.3.3 terser: 5.31.6 yaml: 2.7.0 - vitest@3.0.7(@types/debug@4.1.12)(@types/node@22.13.8)(terser@5.31.6)(yaml@2.7.0): + vitest@3.0.7(@types/debug@4.1.12)(@types/node@22.13.9)(terser@5.31.6)(yaml@2.7.0): dependencies: '@vitest/expect': 3.0.7 - '@vitest/mocker': 3.0.7(vite@6.2.0(@types/node@22.13.8)(terser@5.31.6)(yaml@2.7.0)) + '@vitest/mocker': 3.0.7(vite@6.2.0(@types/node@22.13.9)(terser@5.31.6)(yaml@2.7.0)) '@vitest/pretty-format': 3.0.7 '@vitest/runner': 3.0.7 '@vitest/snapshot': 3.0.7 @@ -4806,17 +5066,17 @@ snapshots: expect-type: 1.2.0 magic-string: 0.30.17 pathe: 2.0.3 - std-env: 3.8.0 + std-env: 3.8.1 tinybench: 2.9.0 tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.2.0(@types/node@22.13.8)(terser@5.31.6)(yaml@2.7.0) - vite-node: 3.0.7(@types/node@22.13.8)(terser@5.31.6)(yaml@2.7.0) + vite: 6.2.0(@types/node@22.13.9)(terser@5.31.6)(yaml@2.7.0) + vite-node: 3.0.7(@types/node@22.13.9)(terser@5.31.6)(yaml@2.7.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 22.13.8 + '@types/node': 22.13.9 transitivePeerDependencies: - jiti - less @@ -4844,6 +5104,14 @@ snapshots: transitivePeerDependencies: - supports-color + webidl-conversions@4.0.2: {} + + whatwg-url@7.1.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + which@2.0.2: dependencies: isexe: 2.0.0 @@ -4869,6 +5137,11 @@ snapshots: wrappy@1.0.2: {} + xior@0.7.0: + dependencies: + tiny-lru: 11.2.11 + ts-deepmerge: 7.0.2 + xtend@4.0.2: {} yaml@2.7.0: diff --git a/src/app.ts b/src/app.ts index 2c27d2c85..d9dda85f8 100644 --- a/src/app.ts +++ b/src/app.ts @@ -6,8 +6,6 @@ import { cors } from "hono/cors" import { HTTPException } from "hono/http-exception" import { secureHeaders } from "hono/secure-headers" -import pkgJson from "../package.json" assert { type: "json" } - import { docsRoutes } from "./docs.ts" import { logger } from "./lib/logger.ts" import { v1Routes } from "./routes/v1/ids/handler.ts" @@ -72,5 +70,5 @@ export const createApp = () => .get("/", (c) => { cacheReply(c.res, CacheTimes.WEEK * 4) - return c.redirect(pkgJson.homepage, 301) + return c.redirect(process.env.HOMEPAGE!, 301) }) diff --git a/src/lib/logger.ts b/src/lib/logger.ts index 62cda4516..620fea444 100644 --- a/src/lib/logger.ts +++ b/src/lib/logger.ts @@ -2,9 +2,10 @@ import { pino } from "pino" import { config } from "../config.ts" -const isProd = config.NODE_ENV === "production" - -const stream = !isProd ? (await import("pino-pretty")).PinoPretty() : undefined +const stream = + process.env.NODE_ENV !== "production" + ? (await import("pino-pretty")).PinoPretty() + : undefined export const logger = pino( { diff --git a/src/update.test.ts b/src/update.test.ts index a78e834b0..ae692055c 100644 --- a/src/update.test.ts +++ b/src/update.test.ts @@ -1,5 +1,5 @@ -import { $fetch } from "ofetch/node" -import { afterAll, afterEach, expect, it, vi } from "vitest" +import { FetchMocker, MockServer } from "mentoss" +import { afterAll, afterEach, beforeEach, expect, it, vi } from "vitest" import { knex, type Relation, Source } from "./db.ts" import { @@ -9,29 +9,36 @@ import { updateRelations, } from "./update.ts" -declare const fetch: (url: string) => Promise<{ json: () => Promise }> +// create a new server with the given base URL +const server = new MockServer("https://raw.githubusercontent.com") +const mocker = new FetchMocker({ servers: [server] }) -vi.mock("ofetch/node") +beforeEach(() => { + mocker.mockGlobal() +}) afterEach(async () => { + mocker.clearAll() vi.resetAllMocks() await knex.delete().from("relations") }) afterAll(async () => { + mocker.unmockGlobal() await Promise.all([knex.destroy()]) }) -const mockedFetch = vi.mocked($fetch) - it("handles bad values", async () => { - mockedFetch.mockResolvedValue([ - { anidb_id: 1337, themoviedb_id: "unknown" }, - { anidb_id: 1338, thetvdb_id: "unknown" as never }, - { anidb_id: 1339, imdb_id: "tt1337,tt1338,tt1339" }, - { anidb_id: 1340, themoviedb_id: "unknown" }, - { anidb_id: 1341, themoviedb_id: 1341 }, - ] satisfies AnimeListsSchema) + server.get("/Fribb/anime-lists/master/anime-list-full.json", { + status: 200, + body: [ + { anidb_id: 1337, themoviedb_id: "unknown" }, + { anidb_id: 1338, thetvdb_id: "unknown" as never }, + { anidb_id: 1339, imdb_id: "tt1337,tt1338,tt1339" }, + { anidb_id: 1340, themoviedb_id: "unknown" }, + { anidb_id: 1341, themoviedb_id: 1341 }, + ] satisfies AnimeListsSchema, + }) await updateRelations() @@ -74,11 +81,13 @@ it("handles bad values", async () => { }) it("handles duplicates", async () => { + mocker.unmockGlobal() + const entries: Relation[] = await fetch( "https://raw.githubusercontent.com/Fribb/anime-lists/master/anime-list-full.json", ) .then(async (r) => r.json()) - .then((e) => e.map(formatEntry)) + .then((e) => (e as any[]).map(formatEntry)) // There should be >=5 Konosuba entries const konosubaEntries = entries.filter(({ themoviedb }) => themoviedb === 65844) diff --git a/src/update.ts b/src/update.ts index 50575e701..5f65079e5 100644 --- a/src/update.ts +++ b/src/update.ts @@ -1,15 +1,18 @@ import process from "node:process" import { captureException } from "@sentry/node" -import type { FetchError } from "ofetch/node" -import { $fetch } from "ofetch/node" +import xior, { type XiorError } from "xior" +import errorRetryPlugin from "xior/plugins/error-retry" import { knex, type Relation, Source } from "./db.ts" import { logger } from "./lib/logger.ts" import { updateBasedOnManualRules } from "./manual-rules.ts" -const isFetchError = (response: T | FetchError): response is FetchError => - (response as FetchError).stack != null +const http = xior.create({ responseType: "json" }) +http.plugins.use(errorRetryPlugin({ retryTimes: 5 })) + +const isXiorError = (response: T | XiorError): response is XiorError => + "stack" in (response as XiorError) export type AnimeListsSchema = Array<{ anidb_id?: number @@ -26,15 +29,13 @@ export type AnimeListsSchema = Array<{ }> const fetchDatabase = async (): Promise => { - const response = await $fetch( - "https://raw.githubusercontent.com/Fribb/anime-lists/master/anime-list-full.json", - { - responseType: "json", - retry: 5, - }, - ).catch((error: FetchError) => error) - - if (isFetchError(response)) { + const response = await http + .get( + "https://raw.githubusercontent.com/Fribb/anime-lists/master/anime-list-full.json", + ) + .catch((error: XiorError) => error) + + if (isXiorError(response)) { const error = new Error("Could not fetch updated database!!", { cause: response, }) @@ -45,7 +46,7 @@ const fetchDatabase = async (): Promise => { return null } - return response + return response.data } const badValues = ["", "unknown", "tv special"] as const diff --git a/tsup.config.ts b/tsup.config.ts new file mode 100644 index 000000000..e51c02940 --- /dev/null +++ b/tsup.config.ts @@ -0,0 +1,49 @@ +import { cpSync } from "node:fs" +import process from "node:process" + +import { defineConfig } from "tsup" + +export default defineConfig({ + entry: ["src/index.ts"], + external: ["sqlite3"], + outDir: "dist", + + bundle: true, + sourcemap: false, + clean: true, + minify: true, + + env: { + NODE_ENV: process.env.NODE_ENV ?? "production", + DEV: (process.env.NODE_ENV === "development") as unknown as string, + PROD: (process.env.NODE_ENV === "production") as unknown as string, + TEST: false as unknown as string, + }, + + shims: true, + target: "node22", + format: ["esm"], + banner: { + js: "import {createRequire} from 'module';const require=createRequire(import.meta.url);", + }, + esbuildOptions: (options) => { + options.supported = { + // For better performance: https://github.com/evanw/esbuild/issues/951 + "object-rest-spread": false, + } + }, + esbuildPlugins: [ + { + name: "better-sqlite3-copy", + setup({ onEnd }) { + onEnd(() => { + cpSync( + "node_modules/better-sqlite3/build/Release/better_sqlite3.node", + "dist/better_sqlite3.node", + { recursive: true }, + ) + }) + }, + }, + ], +})