From ddadb82f2fcaa382631727eb5fe5f6178dd9baad Mon Sep 17 00:00:00 2001 From: beerpsi Date: Thu, 23 Nov 2023 23:35:07 +0700 Subject: [PATCH] push: rolling in hacked up title server --- .eslintignore | 3 +- package.json | 10 +- pnpm-lock.yaml | 3619 +++++++++++------ src/external/db/data-source.ts | 27 + src/external/db/db.ts | 10 - .../db/drizzle/0000_ambitious_gorilla_man.sql | 48 - .../db/drizzle/0001_modern_stryfe.sql | 29 - .../db/drizzle/meta/0000_snapshot.json | 317 -- .../db/drizzle/meta/0001_snapshot.json | 494 --- src/external/db/drizzle/meta/_journal.json | 20 - src/external/db/entity/aimedb.ts | 60 + src/external/db/entity/allnet.ts | 57 + src/external/db/entity/base.ts | 27 + src/external/db/entity/chunithm/profile.ts | 0 src/external/db/entity/chunithm/static.ts | 64 + src/external/db/schemas/aimedb.ts | 67 - src/external/db/schemas/allnet.ts | 56 - src/external/db/schemas/base.ts | 16 - src/external/db/schemas/index.ts | 3 - .../db/utils/constructable-base-entity.ts | 7 + .../utils/misc.ts => lib/constants/aimedb.ts} | 2 + src/lib/constants/felica.ts | 14 + src/lib/constants/game-versions.ts | 19 + .../middleware/request-logger.ts | 0 src/lib/setup/config.ts | 115 +- src/main.ts | 38 +- src/servers/aimedb/handlers/aime-account.ts | 71 +- src/servers/aimedb/handlers/aime-log.ts | 49 +- src/servers/aimedb/handlers/campaign.ts | 2 +- .../aimedb/handlers/felica-conversion.ts | 243 +- src/servers/aimedb/handlers/index.ts | 2 +- src/servers/aimedb/handlers/status-check.ts | 2 +- src/servers/aimedb/index.ts | 4 +- src/servers/aimedb/types/aime-account.ts | 2 +- src/servers/aimedb/types/felica-conversion.ts | 12 +- src/servers/aimedb/utils/access-code.test.ts | 16 + src/servers/aimedb/utils/access-code.ts | 61 +- src/servers/aimedb/utils/felica.ts | 25 +- src/servers/allnet/index.ts | 23 +- src/servers/allnet/middleware/dfi.ts | 108 +- .../allnet/router/report-api/Report/router.ts | 64 + .../allnet/router/report-api/router.ts | 8 + src/servers/allnet/router/router.ts | 2 + .../sys/servlet/DownloadOrder/router.ts | 27 +- .../router/sys/servlet/PowerOn/router.ts | 44 +- src/servers/allnet/types/download-report.ts | 35 + .../allnet/types/loader-state-recorder.ts | 0 src/servers/allnet/types/power-on.ts | 10 +- src/servers/index.ts | 1 + src/servers/titles/chunithm/index.ts | 218 + .../titles/chunithm/versions/100-base.ts | 197 + .../titles/chunithm/versions/125-airplus.ts | 23 + .../titles/chunithm/versions/130-amazon.ts | 23 + .../chunithm/versions/135-amazonplus.ts | 29 + .../titles/chunithm/versions/140-crystal.ts | 72 + src/servers/titles/chunithm/versions/index.ts | 14 + src/servers/titles/index.ts | 31 + src/servers/titles/types/titles.ts | 20 + src/servers/titles/utils/reflection.ts | 41 + tsconfig.json | 6 +- 60 files changed, 4018 insertions(+), 2589 deletions(-) create mode 100644 src/external/db/data-source.ts delete mode 100644 src/external/db/db.ts delete mode 100644 src/external/db/drizzle/0000_ambitious_gorilla_man.sql delete mode 100644 src/external/db/drizzle/0001_modern_stryfe.sql delete mode 100644 src/external/db/drizzle/meta/0000_snapshot.json delete mode 100644 src/external/db/drizzle/meta/0001_snapshot.json delete mode 100644 src/external/db/drizzle/meta/_journal.json create mode 100644 src/external/db/entity/aimedb.ts create mode 100644 src/external/db/entity/allnet.ts create mode 100644 src/external/db/entity/base.ts create mode 100644 src/external/db/entity/chunithm/profile.ts create mode 100644 src/external/db/entity/chunithm/static.ts delete mode 100644 src/external/db/schemas/aimedb.ts delete mode 100644 src/external/db/schemas/allnet.ts delete mode 100644 src/external/db/schemas/base.ts delete mode 100644 src/external/db/schemas/index.ts create mode 100644 src/external/db/utils/constructable-base-entity.ts rename src/{servers/aimedb/utils/misc.ts => lib/constants/aimedb.ts} (95%) create mode 100644 src/lib/constants/felica.ts create mode 100644 src/lib/constants/game-versions.ts rename src/{servers/allnet => lib}/middleware/request-logger.ts (100%) create mode 100644 src/servers/aimedb/utils/access-code.test.ts create mode 100644 src/servers/allnet/router/report-api/Report/router.ts create mode 100644 src/servers/allnet/router/report-api/router.ts create mode 100644 src/servers/allnet/types/download-report.ts create mode 100644 src/servers/allnet/types/loader-state-recorder.ts create mode 100644 src/servers/titles/chunithm/index.ts create mode 100644 src/servers/titles/chunithm/versions/100-base.ts create mode 100644 src/servers/titles/chunithm/versions/125-airplus.ts create mode 100644 src/servers/titles/chunithm/versions/130-amazon.ts create mode 100644 src/servers/titles/chunithm/versions/135-amazonplus.ts create mode 100644 src/servers/titles/chunithm/versions/140-crystal.ts create mode 100644 src/servers/titles/chunithm/versions/index.ts create mode 100644 src/servers/titles/index.ts create mode 100644 src/servers/titles/types/titles.ts create mode 100644 src/servers/titles/utils/reflection.ts diff --git a/.eslintignore b/.eslintignore index f305b10..e7b0a6c 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,4 +1,5 @@ node_modules js package.json -*.config.* \ No newline at end of file +*.config.* +plugins \ No newline at end of file diff --git a/package.json b/package.json index 2ee69e4..efa0772 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "typecheck": "tsc --project tsconfig.build.json --noEmit", "start": "pnpm build && pnpm start-no-build", "start-no-build": "node js/main.js", + "migrate": "typeorm-ts-node-esm migration:run -- -d src/external/db/data-source.ts", "test": "echo \"Error: no test specified\" && exit 1" }, "author": "beerpsi", @@ -21,9 +22,8 @@ "pnpm": "7" }, "dependencies": { - "better-sqlite3": "^9.1.1", + "compression": "^1.7.4", "dotenv": "^16.3.1", - "drizzle-orm": "^0.29.0", "express": "^4.18.2", "express-async-errors": "^3.1.1", "fletcher": "^0.0.3", @@ -32,9 +32,12 @@ "luxon": "^3.4.4", "micro-packed": "^0.3.2", "raw-body": "^2.5.2", + "reflect-metadata": "^0.1.13", "safe-json-stringify": "^1.2.0", + "sqlite3": "^5.1.6", "tsconfig-paths": "^4.2.0", "typed-struct": "^2.3.0", + "typeorm": "^0.3.17", "winston": "^3.11.0", "winston-daily-rotate-file": "^4.7.1", "zod": "^3.22.4", @@ -42,6 +45,7 @@ }, "devDependencies": { "@types/better-sqlite3": "^7.6.7", + "@types/compression": "^1.7.5", "@types/express": "^4.17.21", "@types/iconv": "^3.0.4", "@types/luxon": "^3.3.4", @@ -49,9 +53,9 @@ "@types/safe-json-stringify": "^1.1.5", "@typescript-eslint/eslint-plugin": "5.47.1", "@typescript-eslint/parser": "5.47.1", - "drizzle-kit": "^0.20.4", "eslint": "8.18.0", "eslint-plugin-cadence": "^0.1.0", + "tap": "^18.6.1", "typescript": "4.9.4" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 41ba580..1643761 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2,6 +2,7 @@ lockfileVersion: 5.4 specifiers: '@types/better-sqlite3': ^7.6.7 + '@types/compression': ^1.7.5 '@types/express': ^4.17.21 '@types/iconv': ^3.0.4 '@types/luxon': ^3.3.4 @@ -9,10 +10,8 @@ specifiers: '@types/safe-json-stringify': ^1.1.5 '@typescript-eslint/eslint-plugin': 5.47.1 '@typescript-eslint/parser': 5.47.1 - better-sqlite3: ^9.1.1 + compression: ^1.7.4 dotenv: ^16.3.1 - drizzle-kit: ^0.20.4 - drizzle-orm: ^0.29.0 eslint: 8.18.0 eslint-plugin-cadence: ^0.1.0 express: ^4.18.2 @@ -23,9 +22,13 @@ specifiers: luxon: ^3.4.4 micro-packed: ^0.3.2 raw-body: ^2.5.2 + reflect-metadata: ^0.1.13 safe-json-stringify: ^1.2.0 + sqlite3: ^5.1.6 + tap: ^18.6.1 tsconfig-paths: ^4.2.0 typed-struct: ^2.3.0 + typeorm: ^0.3.17 typescript: 4.9.4 winston: ^3.11.0 winston-daily-rotate-file: ^4.7.1 @@ -33,9 +36,8 @@ specifiers: zod-validation-error: ^2.1.0 dependencies: - better-sqlite3: 9.1.1 + compression: 1.7.4 dotenv: 16.3.1 - drizzle-orm: 0.29.0_j2ohppjkndt27e4oczafq6gzg4 express: 4.18.2 express-async-errors: 3.1.1_express@4.18.2 fletcher: 0.0.3 @@ -44,9 +46,12 @@ dependencies: luxon: 3.4.4 micro-packed: 0.3.2 raw-body: 2.5.2 + reflect-metadata: 0.1.13 safe-json-stringify: 1.2.0 + sqlite3: 5.1.6 tsconfig-paths: 4.2.0 typed-struct: 2.3.0_iconv-lite@0.6.3 + typeorm: 0.3.17_sqlite3@5.1.6 winston: 3.11.0 winston-daily-rotate-file: 4.7.1_winston@3.11.0 zod: 3.22.4 @@ -54,6 +59,7 @@ dependencies: devDependencies: '@types/better-sqlite3': 7.6.7 + '@types/compression': 1.7.5 '@types/express': 4.17.21 '@types/iconv': 3.0.4 '@types/luxon': 3.3.4 @@ -61,9 +67,9 @@ devDependencies: '@types/safe-json-stringify': 1.1.5 '@typescript-eslint/eslint-plugin': 5.47.1_o6yrxajvsx2b7l3udqdd2yq4ii '@typescript-eslint/parser': 5.47.1_4njjt2tu6ubn7rwbgcnueihm54 - drizzle-kit: 0.20.4 eslint: 8.18.0 eslint-plugin-cadence: 0.1.0_4njjt2tu6ubn7rwbgcnueihm54 + tap: 18.6.1_dlwlq4pyjtez5iosqcsauhzqda typescript: 4.9.4 packages: @@ -73,6 +79,14 @@ packages: engines: {node: '>=0.10.0'} dev: true + /@alcalzone/ansi-tokenize/0.1.3: + resolution: {integrity: sha512-3yWxPTq3UQ/FY9p1ErPxIyfT64elWaMvM9lIHnaqpyft63tkxodF5aUElYHrdisWve5cETkh1+KBw1yJuW0aRw==} + engines: {node: '>=14.13.1'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + dev: true + /@babel/code-frame/7.22.13: resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} engines: {node: '>=6.9.0'} @@ -95,62 +109,33 @@ packages: js-tokens: 4.0.0 dev: true - /@cloudflare/kv-asset-handler/0.2.0: - resolution: {integrity: sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==} + /@babel/runtime/7.23.4: + resolution: {integrity: sha512-2Yv65nlWnWlSpe3fXEyX5i7fx5kIKo4Qbcj+hMO0odwaneFjfXw5fdum+4yL20O0QiaHpia0cYQ9xpNMqrBwHg==} + engines: {node: '>=6.9.0'} dependencies: - mime: 3.0.0 + regenerator-runtime: 0.14.0 + dev: false + + /@base2/pretty-print-object/1.0.1: + resolution: {integrity: sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==} dev: true - /@cloudflare/workerd-darwin-64/1.20231030.0: - resolution: {integrity: sha512-J4PQ9utPxLya9yHdMMx3AZeC5M/6FxcoYw6jo9jbDDFTy+a4Gslqf4Im9We3aeOEdPXa3tgQHVQOSelJSZLhIw==} - engines: {node: '>=16'} - cpu: [x64] - os: [darwin] - requiresBuild: true + /@bcoe/v8-coverage/0.2.3: + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true - optional: true - - /@cloudflare/workerd-darwin-arm64/1.20231030.0: - resolution: {integrity: sha512-WSJJjm11Del4hSneiNB7wTXGtBXI4QMCH9l5qf4iT5PAW8cESGcCmdHtWDWDtGAAGcvmLT04KNvmum92vRKKQQ==} - engines: {node: '>=16'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workerd-linux-64/1.20231030.0: - resolution: {integrity: sha512-2HUeRTvoCC17fxE0qdBeR7J9dO8j4A8ZbdcvY8pZxdk+zERU6+N03RTbk/dQMU488PwiDvcC3zZqS4gwLfVT8g==} - engines: {node: '>=16'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workerd-linux-arm64/1.20231030.0: - resolution: {integrity: sha512-4/GK5zHh+9JbUI6Z5xTCM0ZmpKKHk7vu9thmHjUxtz+o8Ne9DoD7DlDvXQWgMF6XGaTubDWyp3ttn+Qv8jDFuQ==} - engines: {node: '>=16'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workerd-windows-64/1.20231030.0: - resolution: {integrity: sha512-fb/Jgj8Yqy3PO1jLhk7mTrHMkR8jklpbQFud6rL/aMAn5d6MQbaSrYOCjzkKGp0Zng8D2LIzSl+Fc0C9Sggxjg==} - engines: {node: '>=16'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true /@colors/colors/1.6.0: resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} engines: {node: '>=0.1.90'} dev: false + /@cspotcode/source-map-support/0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + dev: true + /@dabh/diagnostics/2.0.3: resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} dependencies: @@ -159,438 +144,6 @@ packages: kuler: 2.0.0 dev: false - /@drizzle-team/studio/0.0.27: - resolution: {integrity: sha512-vkgflb8g/7WCdVCuxWE6tCzjZB0q4lLIK6mwH1aleNRqIGOhEWq/E2I8HmKquz1v0GRDHLFd19ZzrVSITt2Uqg==} - dev: true - - /@esbuild-kit/core-utils/3.3.2: - resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} - dependencies: - esbuild: 0.18.20 - source-map-support: 0.5.21 - dev: true - - /@esbuild-kit/esm-loader/2.6.5: - resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} - dependencies: - '@esbuild-kit/core-utils': 3.3.2 - get-tsconfig: 4.7.2 - dev: true - - /@esbuild-plugins/node-globals-polyfill/0.2.3_esbuild@0.17.19: - resolution: {integrity: sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==} - peerDependencies: - esbuild: '*' - dependencies: - esbuild: 0.17.19 - dev: true - - /@esbuild-plugins/node-modules-polyfill/0.2.2_esbuild@0.17.19: - resolution: {integrity: sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA==} - peerDependencies: - esbuild: '*' - dependencies: - esbuild: 0.17.19 - escape-string-regexp: 4.0.0 - rollup-plugin-node-polyfills: 0.2.1 - dev: true - - /@esbuild/android-arm/0.17.19: - resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm/0.18.20: - resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm64/0.17.19: - resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm64/0.18.20: - resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-x64/0.17.19: - resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-x64/0.18.20: - resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-arm64/0.17.19: - resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-arm64/0.18.20: - resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-x64/0.17.19: - resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-x64/0.18.20: - resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-arm64/0.17.19: - resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-arm64/0.18.20: - resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-x64/0.17.19: - resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-x64/0.18.20: - resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm/0.17.19: - resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm/0.18.20: - resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm64/0.17.19: - resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm64/0.18.20: - resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ia32/0.17.19: - resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ia32/0.18.20: - resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-loong64/0.17.19: - resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-loong64/0.18.20: - resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-mips64el/0.17.19: - resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-mips64el/0.18.20: - resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ppc64/0.17.19: - resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ppc64/0.18.20: - resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-riscv64/0.17.19: - resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-riscv64/0.18.20: - resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-s390x/0.17.19: - resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-s390x/0.18.20: - resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-x64/0.17.19: - resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-x64/0.18.20: - resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/netbsd-x64/0.17.19: - resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/netbsd-x64/0.18.20: - resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/openbsd-x64/0.17.19: - resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/openbsd-x64/0.18.20: - resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/sunos-x64/0.17.19: - resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - - /@esbuild/sunos-x64/0.18.20: - resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-arm64/0.17.19: - resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-arm64/0.18.20: - resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-ia32/0.17.19: - resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-ia32/0.18.20: - resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-x64/0.17.19: - resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-x64/0.18.20: - resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@eslint/eslintrc/1.4.1: resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -608,10 +161,10 @@ packages: - supports-color dev: true - /@fastify/busboy/2.1.0: - resolution: {integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==} - engines: {node: '>=14'} - dev: true + /@gar/promisify/1.1.3: + resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} + dev: false + optional: true /@humanwhocodes/config-array/0.9.5: resolution: {integrity: sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==} @@ -628,6 +181,122 @@ packages: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true + /@isaacs/cliui/8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width/4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi/6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi/7.0.0 + dev: true + + /@isaacs/ts-node-temp-fork-for-pr-2009/10.9.5_dlwlq4pyjtez5iosqcsauhzqda: + resolution: {integrity: sha512-hEDlwpHhIabtB+Urku8muNMEkGui0LVGlYLS3KoB9QBDf0Pw3r7q0RrfoQmFuk8CvRpGzErO3/vLQd9Ys+/g4g==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=4.2' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node14': 14.1.0 + '@tsconfig/node16': 16.1.1 + '@tsconfig/node18': 18.2.2 + '@tsconfig/node20': 20.1.2 + '@types/node': 16.18.62 + acorn: 8.11.2 + acorn-walk: 8.3.0 + arg: 4.1.3 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 4.9.4 + v8-compile-cache-lib: 3.0.1 + dev: true + + /@isaacs/ts-node-temp-fork-for-pr-2009/10.9.5_f2bsk3kmnevuuqezfczji3ecy4: + resolution: {integrity: sha512-hEDlwpHhIabtB+Urku8muNMEkGui0LVGlYLS3KoB9QBDf0Pw3r7q0RrfoQmFuk8CvRpGzErO3/vLQd9Ys+/g4g==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=4.2' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node14': 14.1.0 + '@tsconfig/node16': 16.1.1 + '@tsconfig/node18': 18.2.2 + '@tsconfig/node20': 20.1.2 + '@types/node': 16.18.62 + acorn: 8.11.2 + acorn-walk: 8.3.0 + arg: 4.1.3 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.2.2 + v8-compile-cache-lib: 3.0.1 + dev: true + + /@istanbuljs/schema/0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + dev: true + + /@jridgewell/resolve-uri/3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec/1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true + + /@jridgewell/trace-mapping/0.3.20: + resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /@jridgewell/trace-mapping/0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /@mapbox/node-pre-gyp/1.0.11: + resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} + hasBin: true + dependencies: + detect-libc: 2.0.2 + https-proxy-agent: 5.0.1 + make-dir: 3.1.0 + node-fetch: 2.7.0 + nopt: 5.0.0 + npmlog: 5.0.1 + rimraf: 3.0.2 + semver: 7.5.4 + tar: 6.2.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + /@nodelib/fs.scandir/2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -649,14 +318,546 @@ packages: fastq: 1.15.0 dev: true + /@npmcli/agent/2.2.0: + resolution: {integrity: sha512-2yThA1Es98orMkpSLVqlDZAMPK3jHJhifP2gnNUdk1754uZ8yI5c+ulCoVG+WlntQA6MzhrURMXjSd9Z7dJ2/Q==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + agent-base: 7.1.0 + http-proxy-agent: 7.0.0 + https-proxy-agent: 7.0.2 + lru-cache: 10.1.0 + socks-proxy-agent: 8.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@npmcli/fs/1.1.1: + resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} + dependencies: + '@gar/promisify': 1.1.3 + semver: 7.5.4 + dev: false + optional: true + + /@npmcli/fs/3.1.0: + resolution: {integrity: sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + semver: 7.5.4 + dev: true + + /@npmcli/git/5.0.3: + resolution: {integrity: sha512-UZp9NwK+AynTrKvHn5k3KviW/hA5eENmFsu3iAPe7sWRt0lFUdsY/wXIYjpDFe7cdSNwOIzbObfwgt6eL5/2zw==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@npmcli/promise-spawn': 7.0.0 + lru-cache: 10.1.0 + npm-pick-manifest: 9.0.0 + proc-log: 3.0.0 + promise-inflight: 1.0.1 + promise-retry: 2.0.1 + semver: 7.5.4 + which: 4.0.0 + transitivePeerDependencies: + - bluebird + dev: true + + /@npmcli/installed-package-contents/2.0.2: + resolution: {integrity: sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + npm-bundled: 3.0.0 + npm-normalize-package-bin: 3.0.1 + dev: true + + /@npmcli/move-file/1.1.2: + resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==} + engines: {node: '>=10'} + deprecated: This functionality has been moved to @npmcli/fs + dependencies: + mkdirp: 1.0.4 + rimraf: 3.0.2 + dev: false + optional: true + + /@npmcli/node-gyp/3.0.0: + resolution: {integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /@npmcli/promise-spawn/7.0.0: + resolution: {integrity: sha512-wBqcGsMELZna0jDblGd7UXgOby45TQaMWmbFwWX+SEotk4HV6zG2t6rT9siyLhPk4P6YYqgfL1UO8nMWDBVJXQ==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + which: 4.0.0 + dev: true + + /@npmcli/run-script/7.0.2: + resolution: {integrity: sha512-Omu0rpA8WXvcGeY6DDzyRoY1i5DkCBkzyJ+m2u7PD6quzb0TvSqdIPOkTn8ZBOj7LbbcbMfZ3c5skwSu6m8y2w==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@npmcli/node-gyp': 3.0.0 + '@npmcli/promise-spawn': 7.0.0 + node-gyp: 10.0.1 + read-package-json-fast: 3.0.2 + which: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@pkgjs/parseargs/0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: true + optional: true + /@scure/base/1.1.3: resolution: {integrity: sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==} dev: false + /@sigstore/bundle/2.1.0: + resolution: {integrity: sha512-89uOo6yh/oxaU8AeOUnVrTdVMcGk9Q1hJa7Hkvalc6G3Z3CupWk4Xe9djSgJm9fMkH69s0P0cVHUoKSOemLdng==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@sigstore/protobuf-specs': 0.2.1 + dev: true + + /@sigstore/protobuf-specs/0.2.1: + resolution: {integrity: sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /@sigstore/sign/2.2.0: + resolution: {integrity: sha512-AAbmnEHDQv6CSfrWA5wXslGtzLPtAtHZleKOgxdQYvx/s76Fk6T6ZVt7w2IGV9j1UrFeBocTTQxaXG2oRrDhYA==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@sigstore/bundle': 2.1.0 + '@sigstore/protobuf-specs': 0.2.1 + make-fetch-happen: 13.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@sigstore/tuf/2.2.0: + resolution: {integrity: sha512-KKATZ5orWfqd9ZG6MN8PtCIx4eevWSuGRKQvofnWXRpyMyUEpmrzg5M5BrCpjM+NfZ0RbNGOh5tCz/P2uoRqOA==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@sigstore/protobuf-specs': 0.2.1 + tuf-js: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@sqltools/formatter/1.2.5: + resolution: {integrity: sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==} + dev: false + + /@tapjs/after-each/1.1.17_@tapjs+core@1.4.6: + resolution: {integrity: sha512-ia8sr00Wilni+2+wO4MKYCYikeRwUC41HamV8EPN63R2UmiBEOe/cMSf+KYADIh56JvxAiH7Xa0+GSFU+N2FQQ==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.4.6 + dependencies: + '@tapjs/core': 1.4.6_@types+node@16.18.62 + function-loop: 4.0.0 + dev: true + + /@tapjs/after/1.1.17_@tapjs+core@1.4.6: + resolution: {integrity: sha512-14qeP+mHZ8nIMDGtdCwTgvKclLlHxfARMTasb9fw//tmF/8ZDZhTemtCDxAP75wihxy5P7nzVZo/6TpVeOZrwg==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.4.6 + dependencies: + '@tapjs/core': 1.4.6_@types+node@16.18.62 + is-actual-promise: 1.0.1 + dev: true + + /@tapjs/asserts/1.1.17_@tapjs+core@1.4.6: + resolution: {integrity: sha512-eKmbWBORDXu9bUHtPTu7qFrXNj5UeeH2nABJeP9BGHIn2ydmTgMEWCO3E+ljf7tisHchY5/x672lr99+O/mbTQ==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.4.6 + dependencies: + '@tapjs/core': 1.4.6_@types+node@16.18.62 + '@tapjs/stack': 1.2.7 + is-actual-promise: 1.0.1 + tcompare: 6.4.5 + trivial-deferred: 2.0.0 + transitivePeerDependencies: + - react + - react-dom + dev: true + + /@tapjs/before-each/1.1.17_@tapjs+core@1.4.6: + resolution: {integrity: sha512-d2Um3Y2j0m563QNsSxczh+QeSg5sBngnBFGOelUtQVqmq91oNWU/7mY1pwN6ip8mMIQYD75CIhq5/Z57DGomWQ==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.4.6 + dependencies: + '@tapjs/core': 1.4.6_@types+node@16.18.62 + function-loop: 4.0.0 + dev: true + + /@tapjs/before/1.1.17_@tapjs+core@1.4.6: + resolution: {integrity: sha512-pAmEAIMIqF9MPNUgEsnuWCM00iD/FJOX0P5eXSsWexWHjuZAkv5tIT/4qpXO9KYj+9c51Lh+7YSY2Xvk1Jjolw==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.4.6 + dependencies: + '@tapjs/core': 1.4.6_@types+node@16.18.62 + is-actual-promise: 1.0.1 + dev: true + + /@tapjs/config/2.4.14_one3ln4t3xmnnnhhjohsjq6re4: + resolution: {integrity: sha512-dkjPVJGbLJC9BxCAxudAGiijnKc6XcQbpBSMAGJ/+VoRSqXlPkMWz0d8Ad3rNt7s+g2GBEWBx1kV7wcKtLlxmw==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.4.6 + '@tapjs/test': 1.3.17 + dependencies: + '@tapjs/core': 1.4.6_@types+node@16.18.62 + '@tapjs/test': 1.3.17_j4i6watdse2tu2gu6bns7tqypm + chalk: 5.3.0 + jackspeak: 2.3.6 + polite-json: 4.0.1 + tap-yaml: 2.2.1 + walk-up-path: 3.0.1 + dev: true + + /@tapjs/core/1.4.6_@types+node@16.18.62: + resolution: {integrity: sha512-cAKtdGJslrziwi/RJBU7jF930P/eSsemv295t6yLekNVP0XUCNtLFYirxuS1Xwob0nt0g/k+94xXB7o1wdTQvA==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + dependencies: + '@tapjs/processinfo': 3.1.6 + '@tapjs/stack': 1.2.7 + '@tapjs/test': 1.3.17_j4i6watdse2tu2gu6bns7tqypm + async-hook-domain: 4.0.1 + diff: 5.1.0 + is-actual-promise: 1.0.1 + minipass: 7.0.4 + signal-exit: 4.1.0 + tap-parser: 15.3.1 + tap-yaml: 2.2.1 + tcompare: 6.4.5 + trivial-deferred: 2.0.0 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - react + - react-dom + dev: true + + /@tapjs/error-serdes/1.2.1: + resolution: {integrity: sha512-/7eLEcrGo+Qz3eWrjkhDC+VSEOjabkkzr9eRADeU+OLFeZaik8L/GRk0SGhnp4YsQkv0jcNV00A42bEx2HIZcw==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + dependencies: + minipass: 7.0.4 + dev: true + + /@tapjs/filter/1.2.17_@tapjs+core@1.4.6: + resolution: {integrity: sha512-ytsqoPThV92ML1+M+cHlhAS7nOQpDNRBJiPqw20/GmNeoQXsDzVUlWR89DP3WNNUPrr/c1pCVr9XHVhCIeYk0w==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.4.6 + dependencies: + '@tapjs/core': 1.4.6_@types+node@16.18.62 + dev: true + + /@tapjs/fixture/1.2.17_@tapjs+core@1.4.6: + resolution: {integrity: sha512-eOOQxtsEcQ/sBxaZhpqdF9DCNxXAvLuiE5HgyL6d1eB4eceu57uIUKK7NDtFVv+vlbQH/NoiSTxmN/IBRbKT8w==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.4.6 + dependencies: + '@tapjs/core': 1.4.6_@types+node@16.18.62 + mkdirp: 3.0.1 + rimraf: 5.0.5 + dev: true + + /@tapjs/intercept/1.2.17_@tapjs+core@1.4.6: + resolution: {integrity: sha512-CNuYBxiFBMNALS1PxH3yGI10H8ObxOoD67C2xGWyzXeYrPJ/R4x31Sda9bqaoK3uf/vj28bC9kSECCFjRsNAEg==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.4.6 + dependencies: + '@tapjs/after': 1.1.17_@tapjs+core@1.4.6 + '@tapjs/core': 1.4.6_@types+node@16.18.62 + '@tapjs/stack': 1.2.7 + dev: true + + /@tapjs/mock/1.2.15_@tapjs+core@1.4.6: + resolution: {integrity: sha512-uXfVNDAMAbCGOu46B9jbryTau2pLSQjCdWnkAm/OUgZh/OtO0i7OORz9HdEPfEF2tuy1tLo9+vsCZm3lPU5F7w==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.4.6 + dependencies: + '@tapjs/after': 1.1.17_@tapjs+core@1.4.6 + '@tapjs/core': 1.4.6_@types+node@16.18.62 + '@tapjs/stack': 1.2.7 + resolve-import: 1.4.5 + walk-up-path: 3.0.1 + dev: true + + /@tapjs/node-serialize/1.2.6_@tapjs+core@1.4.6: + resolution: {integrity: sha512-xj1OJEsdTr0pQFlirfe/apN0dHUCMCx2Nm5H3SoiSOW4D1/FUKS65VZpWgo3mXMPxRyb/2T1DH3xON1eSGq4ww==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.4.6 + dependencies: + '@tapjs/core': 1.4.6_@types+node@16.18.62 + '@tapjs/error-serdes': 1.2.1 + '@tapjs/stack': 1.2.7 + tap-parser: 15.3.1 + dev: true + + /@tapjs/processinfo/3.1.6: + resolution: {integrity: sha512-ktDsaf79wJsLaoG1Pp+stHSRf6a1k/JydoRAaYVG5iJnd3DooL6yewZsciUi2yiN/WQc5tAXCIFTXL4uXGB8LA==} + engines: {node: '>=16.17'} + dependencies: + pirates: 4.0.6 + process-on-spawn: 1.0.0 + signal-exit: 4.1.0 + uuid: 8.3.2 + dev: true + + /@tapjs/reporter/1.3.15_one3ln4t3xmnnnhhjohsjq6re4: + resolution: {integrity: sha512-us1vXd6TW1V8wJxxnP2a8DNSP1WFTpODyYukqWg7ym5nCalREYnz2MFsn65rRNu/xJlmqsmv+9P63rupud7Zlg==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.4.6 + dependencies: + '@tapjs/config': 2.4.14_one3ln4t3xmnnnhhjohsjq6re4 + '@tapjs/core': 1.4.6_@types+node@16.18.62 + '@tapjs/stack': 1.2.7 + chalk: 5.3.0 + ink: 4.4.1_react@18.2.0 + minipass: 7.0.4 + ms: 2.1.3 + patch-console: 2.0.0 + prismjs-terminal: 1.2.3 + react: 18.2.0 + string-length: 6.0.0 + tap-parser: 15.3.1 + tap-yaml: 2.2.1 + tcompare: 6.4.5_react@18.2.0 + transitivePeerDependencies: + - '@tapjs/test' + - '@types/react' + - bufferutil + - react-devtools-core + - react-dom + - utf-8-validate + dev: true + + /@tapjs/run/1.4.16_j4i6watdse2tu2gu6bns7tqypm: + resolution: {integrity: sha512-ZTESjBDj5SitZgWz2hQdzfBoxgaFs89jQjWzqobcdfro0iF7TVRpSrvpz9GTMdo2Tu9aeFfMNfmaAtwNWnDabw==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + hasBin: true + peerDependencies: + '@tapjs/core': 1.4.6 + dependencies: + '@tapjs/after': 1.1.17_@tapjs+core@1.4.6 + '@tapjs/before': 1.1.17_@tapjs+core@1.4.6 + '@tapjs/config': 2.4.14_one3ln4t3xmnnnhhjohsjq6re4 + '@tapjs/core': 1.4.6_@types+node@16.18.62 + '@tapjs/processinfo': 3.1.6 + '@tapjs/reporter': 1.3.15_one3ln4t3xmnnnhhjohsjq6re4 + '@tapjs/spawn': 1.1.17_@tapjs+core@1.4.6 + '@tapjs/stdin': 1.1.17_@tapjs+core@1.4.6 + '@tapjs/test': 1.3.17_j4i6watdse2tu2gu6bns7tqypm + c8: 8.0.1 + chalk: 5.3.0 + chokidar: 3.5.3 + foreground-child: 3.1.1 + glob: 10.3.10 + minipass: 7.0.4 + mkdirp: 3.0.1 + opener: 1.5.2 + pacote: 17.0.4 + resolve-import: 1.4.5 + rimraf: 5.0.5 + semver: 7.5.4 + signal-exit: 4.1.0 + tap-parser: 15.3.1 + tap-yaml: 2.2.1 + tcompare: 6.4.5 + trivial-deferred: 2.0.0 + which: 4.0.0 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - '@types/react' + - bluebird + - bufferutil + - react + - react-devtools-core + - react-dom + - supports-color + - utf-8-validate + dev: true + + /@tapjs/snapshot/1.2.17_@tapjs+core@1.4.6: + resolution: {integrity: sha512-xDHys854ZA8s/1uCkE5PgBz4H1vYKChD6a4xjLVkaoRxpBHVp/IJZCD+8d69DRGnyuA4x2MGh0JLClTA9bLGrA==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.4.6 + dependencies: + '@tapjs/core': 1.4.6_@types+node@16.18.62 + is-actual-promise: 1.0.1 + tcompare: 6.4.5 + trivial-deferred: 2.0.0 + transitivePeerDependencies: + - react + - react-dom + dev: true + + /@tapjs/spawn/1.1.17_@tapjs+core@1.4.6: + resolution: {integrity: sha512-Bbyxd91bgXEcglvXYKrRl2MaNHk00RajTZJ1kKe3Scr1ivaYv0maE6ZInAl4UE0a4SJl4Dskec+uKoZY3qGUYQ==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.4.6 + dependencies: + '@tapjs/core': 1.4.6_@types+node@16.18.62 + dev: true + + /@tapjs/stack/1.2.7: + resolution: {integrity: sha512-7qUDWDmd+y7ZQ0vTrDTvFlWnJ+ND32NemS5HVuT1ZggHtBwJ62PQHIyCx/B5RopETBb6NvFPfUE21yTiex9Jkw==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + dev: true + + /@tapjs/stdin/1.1.17_@tapjs+core@1.4.6: + resolution: {integrity: sha512-mDutFFPDnlVM2oYDAfyYKA+fC+aEiyz5n08D8x6YAbwZNbTIVp+h6ucyp7ygJ04fshd4l3s1HUmCZLSmHb2xEw==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.4.6 + dependencies: + '@tapjs/core': 1.4.6_@types+node@16.18.62 + dev: true + + /@tapjs/test/1.3.17_j4i6watdse2tu2gu6bns7tqypm: + resolution: {integrity: sha512-yQ4uHC2GaDS+Gr5qwx9uMGxqvpYgnlVY+QexBReSeYZthWIN0KD8HDvnVt4An5Sx/Qhd7UlnNpNMBd6AkvPEew==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + hasBin: true + peerDependencies: + '@tapjs/core': 1.4.6 + dependencies: + '@isaacs/ts-node-temp-fork-for-pr-2009': 10.9.5_f2bsk3kmnevuuqezfczji3ecy4 + '@tapjs/after': 1.1.17_@tapjs+core@1.4.6 + '@tapjs/after-each': 1.1.17_@tapjs+core@1.4.6 + '@tapjs/asserts': 1.1.17_@tapjs+core@1.4.6 + '@tapjs/before': 1.1.17_@tapjs+core@1.4.6 + '@tapjs/before-each': 1.1.17_@tapjs+core@1.4.6 + '@tapjs/core': 1.4.6_@types+node@16.18.62 + '@tapjs/filter': 1.2.17_@tapjs+core@1.4.6 + '@tapjs/fixture': 1.2.17_@tapjs+core@1.4.6 + '@tapjs/intercept': 1.2.17_@tapjs+core@1.4.6 + '@tapjs/mock': 1.2.15_@tapjs+core@1.4.6 + '@tapjs/node-serialize': 1.2.6_@tapjs+core@1.4.6 + '@tapjs/snapshot': 1.2.17_@tapjs+core@1.4.6 + '@tapjs/spawn': 1.1.17_@tapjs+core@1.4.6 + '@tapjs/stdin': 1.1.17_@tapjs+core@1.4.6 + '@tapjs/typescript': 1.3.6_u4khjr7eh6i7qml3fr2bm7fd5y + '@tapjs/worker': 1.1.17_@tapjs+core@1.4.6 + glob: 10.3.10 + jackspeak: 2.3.6 + mkdirp: 3.0.1 + resolve-import: 1.4.5 + rimraf: 5.0.5 + sync-content: 1.0.2 + tap-parser: 15.3.1 + tshy: 1.8.1 + typescript: 5.2.2 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - react + - react-dom + dev: true + + /@tapjs/typescript/1.3.6_ovdroml3jz4t4ex4wij6ayihna: + resolution: {integrity: sha512-bHqQb06HcD1vFvSwElH0WK4cnCNthvA5OX/KBs5w1TNFHIeRHemp/hsSnGSNDwYwDETuOxD68rDZNTpNbzysBg==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.4.6 + dependencies: + '@isaacs/ts-node-temp-fork-for-pr-2009': 10.9.5_dlwlq4pyjtez5iosqcsauhzqda + '@tapjs/core': 1.4.6_@types+node@16.18.62 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - typescript + dev: true + + /@tapjs/typescript/1.3.6_u4khjr7eh6i7qml3fr2bm7fd5y: + resolution: {integrity: sha512-bHqQb06HcD1vFvSwElH0WK4cnCNthvA5OX/KBs5w1TNFHIeRHemp/hsSnGSNDwYwDETuOxD68rDZNTpNbzysBg==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.4.6 + dependencies: + '@isaacs/ts-node-temp-fork-for-pr-2009': 10.9.5_f2bsk3kmnevuuqezfczji3ecy4 + '@tapjs/core': 1.4.6_@types+node@16.18.62 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - typescript + dev: true + + /@tapjs/worker/1.1.17_@tapjs+core@1.4.6: + resolution: {integrity: sha512-DCRzEBT+OgP518rQqzlX6KawvGTegkeEjPVa/TB6Iifj8WOHJ+XtunkR7riIRGEoCEOMD49DCJXj70c+XP0jNw==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + peerDependencies: + '@tapjs/core': 1.4.6 + dependencies: + '@tapjs/core': 1.4.6_@types+node@16.18.62 + dev: true + + /@tootallnate/once/1.1.2: + resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} + engines: {node: '>= 6'} + dev: false + optional: true + + /@tsconfig/node14/14.1.0: + resolution: {integrity: sha512-VmsCG04YR58ciHBeJKBDNMWWfYbyP8FekWVuTlpstaUPlat1D0x/tXzkWP7yCMU0eSz9V4OZU0LBWTFJ3xZf6w==} + dev: true + + /@tsconfig/node16/16.1.1: + resolution: {integrity: sha512-+pio93ejHN4nINX4pXqfnR/fPLRtJBaT4ORaa5RH0Oc1zoYmo2B2koG+M328CQhHKn1Wj6FcOxCDFXAot9NhvA==} + dev: true + + /@tsconfig/node18/18.2.2: + resolution: {integrity: sha512-d6McJeGsuoRlwWZmVIeE8CUA27lu6jLjvv1JzqmpsytOYYbVi1tHZEnwCNVOXnj4pyLvneZlFlpXUK+X9wBWyw==} + dev: true + + /@tsconfig/node20/20.1.2: + resolution: {integrity: sha512-madaWq2k+LYMEhmcp0fs+OGaLFk0OenpHa4gmI4VEmCKX4PJntQ6fnnGADVFrVkBj0wIdAlQnK/MrlYTHsa1gQ==} + dev: true + + /@tufjs/canonical-json/2.0.0: + resolution: {integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==} + engines: {node: ^16.14.0 || >=18.0.0} + dev: true + + /@tufjs/models/2.0.0: + resolution: {integrity: sha512-c8nj8BaOExmZKO2DXhDfegyhSGcG9E/mPN3U13L+/PsoWm1uaGiHHjxqSHQiasDBQwDA3aHuw9+9spYAP1qvvg==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@tufjs/canonical-json': 2.0.0 + minimatch: 9.0.3 + dev: true + /@types/better-sqlite3/7.6.7: resolution: {integrity: sha512-+c2YGPWY5831v3uj2/X0HRTK94u1GXU3sCnLqu7AKlxlSfawswnAiJR//TFzSL5azWsLQkG/uS+YnnqHtuZxPw==} dependencies: '@types/node': 16.18.62 + dev: true /@types/body-parser/1.19.5: resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} @@ -665,6 +866,12 @@ packages: '@types/node': 16.18.62 dev: true + /@types/compression/1.7.5: + resolution: {integrity: sha512-AAQvK5pxMpaT+nDvhHrsBhLSYG5yQdtkaJE1WYieSNY2mVFKAgmU4ks65rkZD5oqnGCFLyQpUr1CqI4DmUMyDg==} + dependencies: + '@types/express': 4.17.21 + dev: true + /@types/connect/3.4.38: resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} dependencies: @@ -703,6 +910,10 @@ packages: '@types/node': 16.18.62 dev: true + /@types/istanbul-lib-coverage/2.0.6: + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + dev: true + /@types/json-schema/7.0.15: resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} dev: true @@ -723,14 +934,9 @@ packages: resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} dev: true - /@types/node-forge/1.3.9: - resolution: {integrity: sha512-meK88cx/sTalPSLSoCzkiUB4VPIFHmxtXm5FaaqRDqBX2i/Sy8bJ4odsan0b20RBjPh06dAQ+OTTdnyQyhJZyQ==} - dependencies: - '@types/node': 16.18.62 - dev: true - /@types/node/16.18.62: resolution: {integrity: sha512-/zbPnIBkef8sT+6vw6BxdvU3dCxRI0v6rBu/6IvXnRNtOPILucigqhUBPYxtQ/8JdAna0JLTAcNTCDmQ77QYkQ==} + dev: true /@types/normalize-package-data/2.4.4: resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -900,6 +1106,15 @@ packages: eslint-visitor-keys: 3.4.3 dev: true + /abbrev/1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: false + + /abbrev/2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + /accepts/1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -927,6 +1142,39 @@ packages: hasBin: true dev: true + /agent-base/6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + + /agent-base/7.1.0: + resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} + engines: {node: '>= 14'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /agentkeepalive/4.5.0: + resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} + engines: {node: '>= 8.0.0'} + dependencies: + humanize-ms: 1.2.1 + dev: false + optional: true + + /aggregate-error/3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + /ajv/6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: @@ -936,9 +1184,20 @@ packages: uri-js: 4.4.1 dev: true + /ansi-escapes/6.2.0: + resolution: {integrity: sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==} + engines: {node: '>=14.16'} + dependencies: + type-fest: 3.13.1 + dev: true + /ansi-regex/5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} + + /ansi-regex/6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} dev: true /ansi-styles/3.2.1: @@ -953,8 +1212,16 @@ packages: engines: {node: '>=8'} dependencies: color-convert: 2.0.1 + + /ansi-styles/6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} dev: true + /any-promise/1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: false + /anymatch/3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -963,6 +1230,36 @@ packages: picomatch: 2.3.1 dev: true + /app-root-path/3.1.0: + resolution: {integrity: sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==} + engines: {node: '>= 6.0.0'} + dev: false + + /aproba/2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + dev: false + + /are-we-there-yet/2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + dev: false + + /are-we-there-yet/3.0.1: + resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + dev: false + optional: true + + /arg/4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true + /argparse/2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true @@ -1017,16 +1314,20 @@ packages: is-shared-array-buffer: 1.0.2 dev: true - /as-table/1.0.55: - resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} - dependencies: - printable-characters: 1.0.42 + /async-hook-domain/4.0.1: + resolution: {integrity: sha512-bSktexGodAjfHWIrSrrqxqWzf1hWBZBpmPNZv+TYUMyWa2eoefFc6q6H1+KtdHYSz35lrhWdmXt/XK9wNEZvww==} + engines: {node: '>=16'} dev: true /async/3.2.5: resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} dev: false + /auto-bind/5.0.1: + resolution: {integrity: sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + /available-typed-arrays/1.0.5: resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} @@ -1034,43 +1335,16 @@ packages: /balanced-match/1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true /base64-js/1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} dev: false - /better-sqlite3/9.1.1: - resolution: {integrity: sha512-FhW7bS7cXwkB2SFnPJrSGPmQerVSCzwBgmQ1cIRcYKxLsyiKjljzCbyEqqhYXo5TTBqt5BISiBj2YE2Sy2ynaA==} - requiresBuild: true - dependencies: - bindings: 1.5.0 - prebuild-install: 7.1.1 - dev: false - /binary-extensions/2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} dev: true - /bindings/1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - dependencies: - file-uri-to-path: 1.0.0 - dev: false - - /bl/4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - dev: false - - /blake3-wasm/2.1.5: - resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} - dev: true - /body-parser/1.20.1: resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -1096,13 +1370,11 @@ packages: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - dev: true /brace-expansion/2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} dependencies: balanced-match: 1.0.2 - dev: true /braces/3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} @@ -1111,12 +1383,8 @@ packages: fill-range: 7.0.1 dev: true - /buffer-from/1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: true - - /buffer/5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + /buffer/6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} dependencies: base64-js: 1.5.1 ieee754: 1.2.1 @@ -1127,11 +1395,86 @@ packages: engines: {node: '>=6'} dev: true + /builtins/5.0.1: + resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} + dependencies: + semver: 7.5.4 + dev: true + + /bytes/3.0.0: + resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} + engines: {node: '>= 0.8'} + dev: false + /bytes/3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} dev: false + /c8/8.0.1: + resolution: {integrity: sha512-EINpopxZNH1mETuI0DzRA4MZpAUH+IFiRhnmFD3vFr3vdrgxqi3VfE3KL0AIL+zDq8rC9bZqwM/VDmmoe04y7w==} + engines: {node: '>=12'} + hasBin: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@istanbuljs/schema': 0.1.3 + find-up: 5.0.0 + foreground-child: 2.0.0 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-reports: 3.1.6 + rimraf: 3.0.2 + test-exclude: 6.0.0 + v8-to-istanbul: 9.2.0 + yargs: 17.7.2 + yargs-parser: 21.1.1 + dev: true + + /cacache/15.3.0: + resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} + engines: {node: '>= 10'} + dependencies: + '@npmcli/fs': 1.1.1 + '@npmcli/move-file': 1.1.2 + chownr: 2.0.0 + fs-minipass: 2.1.0 + glob: 7.2.3 + infer-owner: 1.0.4 + lru-cache: 6.0.0 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + mkdirp: 1.0.4 + p-map: 4.0.0 + promise-inflight: 1.0.1 + rimraf: 3.0.2 + ssri: 8.0.1 + tar: 6.2.0 + unique-filename: 1.1.1 + transitivePeerDependencies: + - bluebird + dev: false + optional: true + + /cacache/18.0.0: + resolution: {integrity: sha512-I7mVOPl3PUCeRub1U8YoGz2Lqv9WOBpobZ8RyWFXmReuILz+3OAyTa5oH3QPdtKZD7N0Yk00aLfzn0qvp8dZ1w==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@npmcli/fs': 3.1.0 + fs-minipass: 3.0.3 + glob: 10.3.10 + lru-cache: 10.1.0 + minipass: 7.0.4 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + p-map: 4.0.0 + ssri: 10.0.5 + tar: 6.2.0 + unique-filename: 3.0.0 + dev: true + /call-bind/1.0.5: resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} dependencies: @@ -1144,20 +1487,6 @@ packages: engines: {node: '>=6'} dev: true - /camelcase/7.0.1: - resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} - engines: {node: '>=14.16'} - dev: true - - /capnp-ts/0.7.0: - resolution: {integrity: sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==} - dependencies: - debug: 4.3.4 - tslib: 2.6.2 - transitivePeerDependencies: - - supports-color - dev: true - /chalk/2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -1173,7 +1502,6 @@ packages: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - dev: true /chalk/5.3.0: resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} @@ -1195,9 +1523,9 @@ packages: fsevents: 2.3.3 dev: true - /chownr/1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - dev: false + /chownr/2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} /ci-info/3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} @@ -1211,15 +1539,64 @@ packages: escape-string-regexp: 1.0.5 dev: true - /cli-color/2.0.3: - resolution: {integrity: sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==} - engines: {node: '>=0.10'} + /clean-stack/2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + /cli-boxes/3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + dev: true + + /cli-cursor/4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: - d: 1.0.1 - es5-ext: 0.10.62 - es6-iterator: 2.0.3 - memoizee: 0.4.15 - timers-ext: 0.1.7 + restore-cursor: 4.0.0 + dev: true + + /cli-highlight/2.1.11: + resolution: {integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==} + engines: {node: '>=8.0.0', npm: '>=5.0.0'} + hasBin: true + dependencies: + chalk: 4.1.2 + highlight.js: 10.7.3 + mz: 2.7.0 + parse5: 5.1.1 + parse5-htmlparser2-tree-adapter: 6.0.1 + yargs: 16.2.0 + dev: false + + /cli-truncate/3.1.0: + resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + slice-ansi: 5.0.0 + string-width: 5.1.2 + dev: true + + /cliui/7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: false + + /cliui/8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + /code-excerpt/4.0.0: + resolution: {integrity: sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + convert-to-spaces: 2.0.1 dev: true /color-convert/1.9.3: @@ -1232,7 +1609,6 @@ packages: engines: {node: '>=7.0.0'} dependencies: color-name: 1.1.4 - dev: true /color-name/1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} @@ -1247,6 +1623,11 @@ packages: simple-swizzle: 0.2.2 dev: false + /color-support/1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + dev: false + /color/3.2.1: resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} dependencies: @@ -1261,14 +1642,34 @@ packages: text-hex: 1.0.0 dev: false - /commander/9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} - dev: true + /compressible/2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: false + + /compression/1.7.4: + resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} + engines: {node: '>= 0.8.0'} + dependencies: + accepts: 1.3.8 + bytes: 3.0.0 + compressible: 2.0.18 + debug: 2.6.9 + on-headers: 1.0.2 + safe-buffer: 5.1.2 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: false /concat-map/0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true + + /console-control-strings/1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + dev: false /content-disposition/0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} @@ -1282,6 +1683,15 @@ packages: engines: {node: '>= 0.6'} dev: false + /convert-source-map/2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + + /convert-to-spaces/2.0.1: + resolution: {integrity: sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + /cookie-signature/1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} dev: false @@ -1289,6 +1699,7 @@ packages: /cookie/0.5.0: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} + dev: false /cross-spawn/7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} @@ -1299,16 +1710,12 @@ packages: which: 2.0.2 dev: true - /d/1.0.1: - resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} + /date-fns/2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} dependencies: - es5-ext: 0.10.62 - type: 1.2.0 - dev: true - - /data-uri-to-buffer/2.0.2: - resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==} - dev: true + '@babel/runtime': 7.23.4 + dev: false /debug/2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} @@ -1341,19 +1748,6 @@ packages: optional: true dependencies: ms: 2.1.2 - dev: true - - /decompress-response/6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - dependencies: - mimic-response: 3.1.0 - dev: false - - /deep-extend/0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - dev: false /deep-is/0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -1376,6 +1770,10 @@ packages: object-keys: 1.1.1 dev: true + /delegates/1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + dev: false + /depd/2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} @@ -1391,10 +1789,14 @@ packages: engines: {node: '>=8'} dev: false - /difflib/0.2.4: - resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} - dependencies: - heap: 0.2.7 + /diff/4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + + /diff/5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} + engines: {node: '>=0.3.1'} dev: true /dir-glob/3.0.1: @@ -1423,106 +1825,21 @@ packages: engines: {node: '>=12'} dev: false - /dreamopt/0.8.0: - resolution: {integrity: sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==} - engines: {node: '>=0.4.0'} - dependencies: - wordwrap: 1.0.0 + /eastasianwidth/0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true - /drizzle-kit/0.20.4: - resolution: {integrity: sha512-pfaryOMS4jtQ6PNIanggsXqZnl34nMeoFd6Mmc9mZA+amSym0izLTuOO3xnivPT2BDsDVOoPhrC47QzKij7fRA==} - hasBin: true - dependencies: - '@drizzle-team/studio': 0.0.27 - '@esbuild-kit/esm-loader': 2.6.5 - camelcase: 7.0.1 - chalk: 5.3.0 - commander: 9.5.0 - esbuild: 0.18.20 - esbuild-register: 3.5.0_esbuild@0.18.20 - glob: 8.1.0 - hanji: 0.0.5 - json-diff: 0.9.0 - minimatch: 7.4.6 - wrangler: 3.16.0 - zod: 3.22.4 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - /drizzle-orm/0.29.0_j2ohppjkndt27e4oczafq6gzg4: - resolution: {integrity: sha512-AC+CuW4GezVjsZDGU9u9B4HyikudOyYVhjm6he3Xn1D6Kky7bHGKob97MMX2piO+t9b6UuajLzlii/T/lu1qwA==} - peerDependencies: - '@aws-sdk/client-rds-data': '>=3' - '@cloudflare/workers-types': '>=3' - '@libsql/client': '*' - '@neondatabase/serverless': '>=0.1' - '@opentelemetry/api': ^1.4.1 - '@planetscale/database': '>=1' - '@types/better-sqlite3': '*' - '@types/pg': '*' - '@types/sql.js': '*' - '@vercel/postgres': '*' - better-sqlite3: '>=7' - bun-types: '*' - knex: '*' - kysely: '*' - mysql2: '>=2' - pg: '>=8' - postgres: '>=3' - sql.js: '>=1' - sqlite3: '>=5' - peerDependenciesMeta: - '@aws-sdk/client-rds-data': - optional: true - '@cloudflare/workers-types': - optional: true - '@libsql/client': - optional: true - '@neondatabase/serverless': - optional: true - '@opentelemetry/api': - optional: true - '@planetscale/database': - optional: true - '@types/better-sqlite3': - optional: true - '@types/pg': - optional: true - '@types/sql.js': - optional: true - '@vercel/postgres': - optional: true - better-sqlite3: - optional: true - bun-types: - optional: true - knex: - optional: true - kysely: - optional: true - mysql2: - optional: true - pg: - optional: true - postgres: - optional: true - sql.js: - optional: true - sqlite3: - optional: true - dependencies: - '@types/better-sqlite3': 7.6.7 - better-sqlite3: 9.1.1 - dev: false - /ee-first/1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: false + /emoji-regex/8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + /emoji-regex/9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + /enabled/2.0.0: resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} dev: false @@ -1532,11 +1849,19 @@ packages: engines: {node: '>= 0.8'} dev: false - /end-of-stream/1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + /encoding/0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + requiresBuild: true dependencies: - once: 1.4.0 - dev: false + iconv-lite: 0.6.3 + optional: true + + /env-paths/2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + /err-code/2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} /error-ex/1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} @@ -1613,110 +1938,9 @@ packages: is-symbol: 1.0.4 dev: true - /es5-ext/0.10.62: - resolution: {integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==} - engines: {node: '>=0.10'} - requiresBuild: true - dependencies: - es6-iterator: 2.0.3 - es6-symbol: 3.1.3 - next-tick: 1.1.0 - dev: true - - /es6-iterator/2.0.3: - resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} - dependencies: - d: 1.0.1 - es5-ext: 0.10.62 - es6-symbol: 3.1.3 - dev: true - - /es6-symbol/3.1.3: - resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} - dependencies: - d: 1.0.1 - ext: 1.7.0 - dev: true - - /es6-weak-map/2.0.3: - resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} - dependencies: - d: 1.0.1 - es5-ext: 0.10.62 - es6-iterator: 2.0.3 - es6-symbol: 3.1.3 - dev: true - - /esbuild-register/3.5.0_esbuild@0.18.20: - resolution: {integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==} - peerDependencies: - esbuild: '>=0.12 <1' - dependencies: - debug: 4.3.4 - esbuild: 0.18.20 - transitivePeerDependencies: - - supports-color - dev: true - - /esbuild/0.17.19: - resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.17.19 - '@esbuild/android-arm64': 0.17.19 - '@esbuild/android-x64': 0.17.19 - '@esbuild/darwin-arm64': 0.17.19 - '@esbuild/darwin-x64': 0.17.19 - '@esbuild/freebsd-arm64': 0.17.19 - '@esbuild/freebsd-x64': 0.17.19 - '@esbuild/linux-arm': 0.17.19 - '@esbuild/linux-arm64': 0.17.19 - '@esbuild/linux-ia32': 0.17.19 - '@esbuild/linux-loong64': 0.17.19 - '@esbuild/linux-mips64el': 0.17.19 - '@esbuild/linux-ppc64': 0.17.19 - '@esbuild/linux-riscv64': 0.17.19 - '@esbuild/linux-s390x': 0.17.19 - '@esbuild/linux-x64': 0.17.19 - '@esbuild/netbsd-x64': 0.17.19 - '@esbuild/openbsd-x64': 0.17.19 - '@esbuild/sunos-x64': 0.17.19 - '@esbuild/win32-arm64': 0.17.19 - '@esbuild/win32-ia32': 0.17.19 - '@esbuild/win32-x64': 0.17.19 - dev: true - - /esbuild/0.18.20: - resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.18.20 - '@esbuild/android-arm64': 0.18.20 - '@esbuild/android-x64': 0.18.20 - '@esbuild/darwin-arm64': 0.18.20 - '@esbuild/darwin-x64': 0.18.20 - '@esbuild/freebsd-arm64': 0.18.20 - '@esbuild/freebsd-x64': 0.18.20 - '@esbuild/linux-arm': 0.18.20 - '@esbuild/linux-arm64': 0.18.20 - '@esbuild/linux-ia32': 0.18.20 - '@esbuild/linux-loong64': 0.18.20 - '@esbuild/linux-mips64el': 0.18.20 - '@esbuild/linux-ppc64': 0.18.20 - '@esbuild/linux-riscv64': 0.18.20 - '@esbuild/linux-s390x': 0.18.20 - '@esbuild/linux-x64': 0.18.20 - '@esbuild/netbsd-x64': 0.18.20 - '@esbuild/openbsd-x64': 0.18.20 - '@esbuild/sunos-x64': 0.18.20 - '@esbuild/win32-arm64': 0.18.20 - '@esbuild/win32-ia32': 0.18.20 - '@esbuild/win32-x64': 0.18.20 - dev: true + /escalade/3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} /escape-html/1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} @@ -1727,6 +1951,11 @@ packages: engines: {node: '>=0.8.0'} dev: true + /escape-string-regexp/2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + dev: true + /escape-string-regexp/4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -2037,10 +2266,6 @@ packages: engines: {node: '>=4.0'} dev: true - /estree-walker/0.6.1: - resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} - dev: true - /esutils/2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -2051,23 +2276,15 @@ packages: engines: {node: '>= 0.6'} dev: false - /event-emitter/0.3.5: - resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} - dependencies: - d: 1.0.1 - es5-ext: 0.10.62 + /events-to-array/2.0.3: + resolution: {integrity: sha512-f/qE2gImHRa4Cp2y1stEOSgw8wTFyUdVJX7G//bMwbaV9JqISFxg99NbmVQeP7YLnDUZ2un851jlaDrlpmGehQ==} + engines: {node: '>=12'} dev: true - /exit-hook/2.2.1: - resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} - engines: {node: '>=6'} + /exponential-backoff/3.1.1: + resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} dev: true - /expand-template/2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} - dev: false - /express-async-errors/3.1.1_express@4.18.2: resolution: {integrity: sha512-h6aK1da4tpqWSbyCa3FxB/V6Ehd4EEB15zyQq9qe75OZBp0krinNKuH4rAY+S/U/2I36vdLAUFSjQJ+TFmODng==} peerDependencies: @@ -2115,12 +2332,6 @@ packages: - supports-color dev: false - /ext/1.7.0: - resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} - dependencies: - type: 2.7.2 - dev: true - /fast-deep-equal/3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true @@ -2171,10 +2382,6 @@ packages: moment: 2.29.4 dev: false - /file-uri-to-path/1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - dev: false - /fill-range/7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} @@ -2205,6 +2412,14 @@ packages: path-exists: 4.0.0 dev: true + /find-up/5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + /flat-cache/3.2.0: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} @@ -2232,6 +2447,22 @@ packages: is-callable: 1.2.7 dev: true + /foreground-child/2.0.0: + resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} + engines: {node: '>=8.0.0'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 3.0.7 + dev: true + + /foreground-child/3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + dev: true + /forwarded/0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -2242,13 +2473,25 @@ packages: engines: {node: '>= 0.6'} dev: false - /fs-constants/1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - dev: false + /fromentries/1.3.2: + resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} + dev: true + + /fs-minipass/2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + + /fs-minipass/3.0.3: + resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + minipass: 7.0.4 + dev: true /fs.realpath/1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true /fsevents/2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} @@ -2261,6 +2504,10 @@ packages: /function-bind/1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + /function-loop/4.0.0: + resolution: {integrity: sha512-f34iQBedYF3XcI93uewZZOnyscDragxgTK/eTvVB74k3fCD0ZorOi5BV9GS4M8rz/JoNi0Kl3qX5Y9MH3S/CLQ==} + dev: true + /function.prototype.name/1.1.6: resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} engines: {node: '>= 0.4'} @@ -2279,6 +2526,40 @@ packages: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} dev: true + /gauge/3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + dev: false + + /gauge/4.0.4: + resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + dev: false + optional: true + + /get-caller-file/2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + /get-intrinsic/1.2.2: resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} dependencies: @@ -2287,13 +2568,6 @@ packages: has-symbols: 1.0.3 hasown: 2.0.0 - /get-source/2.0.12: - resolution: {integrity: sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==} - dependencies: - data-uri-to-buffer: 2.0.2 - source-map: 0.6.1 - dev: true - /get-symbol-description/1.0.0: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} engines: {node: '>= 0.4'} @@ -2302,16 +2576,6 @@ packages: get-intrinsic: 1.2.2 dev: true - /get-tsconfig/4.7.2: - resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} - dependencies: - resolve-pkg-maps: 1.0.0 - dev: true - - /github-from-package/0.0.0: - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - dev: false - /glob-parent/5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -2326,8 +2590,16 @@ packages: is-glob: 4.0.3 dev: true - /glob-to-regexp/0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + /glob/10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.3 + minipass: 7.0.4 + path-scurry: 1.10.1 dev: true /glob/7.2.3: @@ -2339,7 +2611,6 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 - dev: true /glob/8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} @@ -2350,7 +2621,7 @@ packages: inherits: 2.0.4 minimatch: 5.1.6 once: 1.4.0 - dev: true + dev: false /globals/13.23.0: resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} @@ -2383,12 +2654,8 @@ packages: dependencies: get-intrinsic: 1.2.2 - /hanji/0.0.5: - resolution: {integrity: sha512-Abxw1Lq+TnYiL4BueXqMau222fPSPMFtya8HdpWsz/xVAhifXou71mPh/kY2+08RgFcVccjG3uZHs6K5HAe3zw==} - dependencies: - lodash.throttle: 4.1.1 - sisteransi: 1.0.5 - dev: true + /graceful-fs/4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} /has-bigints/1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} @@ -2402,7 +2669,6 @@ packages: /has-flag/4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - dev: true /has-property-descriptors/1.0.1: resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} @@ -2424,6 +2690,10 @@ packages: has-symbols: 1.0.3 dev: true + /has-unicode/2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + dev: false + /has/1.0.4: resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} engines: {node: '>= 0.4.0'} @@ -2435,14 +2705,28 @@ packages: dependencies: function-bind: 1.1.2 - /heap/0.2.7: - resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} - dev: true + /highlight.js/10.7.3: + resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + dev: false /hosted-git-info/2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} dev: true + /hosted-git-info/7.0.1: + resolution: {integrity: sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + lru-cache: 10.1.0 + dev: true + + /html-escaper/2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + dev: true + + /http-cache-semantics/4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + /http-errors/2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} @@ -2454,6 +2738,55 @@ packages: toidentifier: 1.0.1 dev: false + /http-proxy-agent/4.0.1: + resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} + engines: {node: '>= 6'} + dependencies: + '@tootallnate/once': 1.1.2 + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + optional: true + + /http-proxy-agent/7.0.0: + resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /https-proxy-agent/5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + + /https-proxy-agent/7.0.2: + resolution: {integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /humanize-ms/1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + dependencies: + ms: 2.1.3 + dev: false + optional: true + /iconv-lite/0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -2466,12 +2799,18 @@ packages: engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 - dev: false /ieee754/1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} dev: false + /ignore-walk/6.0.3: + resolution: {integrity: sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + minimatch: 9.0.3 + dev: true + /ignore/5.3.0: resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} engines: {node: '>= 4'} @@ -2488,26 +2827,73 @@ packages: /imurmurhash/0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - dev: true /indent-string/4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} + + /indent-string/5.0.0: + resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} + engines: {node: '>=12'} dev: true + /infer-owner/1.0.4: + resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} + dev: false + optional: true + /inflight/1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: once: 1.4.0 wrappy: 1.0.2 - dev: true /inherits/2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - /ini/1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: false + /ink/4.4.1_react@18.2.0: + resolution: {integrity: sha512-rXckvqPBB0Krifk5rn/5LvQGmyXwCUpBfmTwbkQNBY9JY8RSl3b8OftBNEYxg4+SWUhEKcPifgope28uL9inlA==} + engines: {node: '>=14.16'} + peerDependencies: + '@types/react': '>=18.0.0' + react: '>=18.0.0' + react-devtools-core: ^4.19.1 + peerDependenciesMeta: + '@types/react': + optional: true + react-devtools-core: + optional: true + dependencies: + '@alcalzone/ansi-tokenize': 0.1.3 + ansi-escapes: 6.2.0 + auto-bind: 5.0.1 + chalk: 5.3.0 + cli-boxes: 3.0.0 + cli-cursor: 4.0.0 + cli-truncate: 3.1.0 + code-excerpt: 4.0.0 + indent-string: 5.0.0 + is-ci: 3.0.1 + is-lower-case: 2.0.2 + is-upper-case: 2.0.2 + lodash: 4.17.21 + patch-console: 2.0.0 + react: 18.2.0 + react-reconciler: 0.29.0_react@18.2.0 + scheduler: 0.23.0 + signal-exit: 3.0.7 + slice-ansi: 6.0.0 + stack-utils: 2.0.6 + string-width: 5.1.2 + type-fest: 0.12.0 + widest-line: 4.0.1 + wrap-ansi: 8.1.0 + ws: 8.14.2 + yoga-wasm-web: 0.3.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true /internal-slot/1.0.6: resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} @@ -2518,11 +2904,20 @@ packages: side-channel: 1.0.4 dev: true + /ip/2.0.0: + resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} + /ipaddr.js/1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} dev: false + /is-actual-promise/1.0.1: + resolution: {integrity: sha512-PlsL4tNv62lx5yN2HSqaRSTgIpUAPW7U6+crVB8HfWm5161rZpeqWbl0ZSqH2MAfRKXWSZVPRNbE/r8qPcb13g==} + dependencies: + tshy: 1.8.1 + dev: true + /is-array-buffer/3.0.2: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: @@ -2572,6 +2967,13 @@ packages: engines: {node: '>= 0.4'} dev: true + /is-ci/3.0.1: + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + hasBin: true + dependencies: + ci-info: 3.9.0 + dev: true + /is-core-module/2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} dependencies: @@ -2590,6 +2992,15 @@ packages: engines: {node: '>=0.10.0'} dev: true + /is-fullwidth-code-point/3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + /is-fullwidth-code-point/4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + dev: true + /is-glob/4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -2597,6 +3008,15 @@ packages: is-extglob: 2.1.1 dev: true + /is-lambda/1.0.1: + resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} + + /is-lower-case/2.0.2: + resolution: {integrity: sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ==} + dependencies: + tslib: 2.6.2 + dev: true + /is-negative-zero/2.0.2: resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} engines: {node: '>= 0.4'} @@ -2614,8 +3034,9 @@ packages: engines: {node: '>=0.12.0'} dev: true - /is-promise/2.2.2: - resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + /is-plain-object/5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} dev: true /is-regex/1.1.4: @@ -2658,6 +3079,12 @@ packages: which-typed-array: 1.1.13 dev: true + /is-upper-case/2.0.2: + resolution: {integrity: sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ==} + dependencies: + tslib: 2.6.2 + dev: true + /is-weakref/1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: @@ -2670,6 +3097,41 @@ packages: /isexe/2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + /isexe/3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} + dev: true + + /istanbul-lib-coverage/3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + dev: true + + /istanbul-lib-report/3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + dev: true + + /istanbul-reports/3.1.6: + resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + dev: true + + /jackspeak/2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 dev: true /js-tokens/4.0.0: @@ -2687,19 +3149,15 @@ packages: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} dev: true - /json-diff/0.9.0: - resolution: {integrity: sha512-cVnggDrVkAAA3OvFfHpFEhOnmcsUpleEKq4d4O8sQWWSH40MBrWstKigVB1kGrgLWzuom+7rRdaCsnBD6VyObQ==} - hasBin: true - dependencies: - cli-color: 2.0.3 - difflib: 0.2.4 - dreamopt: 0.8.0 - dev: true - /json-parse-even-better-errors/2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} dev: true + /json-parse-even-better-errors/3.0.0: + resolution: {integrity: sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + /json-schema-traverse/0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: true @@ -2721,6 +3179,11 @@ packages: hasBin: true dev: false + /jsonparse/1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + dev: true + /keyv/4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} dependencies: @@ -2750,12 +3213,15 @@ packages: p-locate: 4.1.0 dev: true - /lodash.merge/4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + /locate-path/6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 dev: true - /lodash.throttle/4.1.1: - resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + /lodash.merge/4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true /lodash/4.17.21: @@ -2774,47 +3240,97 @@ packages: triple-beam: 1.4.1 dev: false + /loose-envify/1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: true + + /lru-cache/10.1.0: + resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} + engines: {node: 14 || >=16.14} + dev: true + /lru-cache/6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} dependencies: yallist: 4.0.0 - /lru-queue/0.1.0: - resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} - dependencies: - es5-ext: 0.10.62 - dev: true - /luxon/3.4.4: resolution: {integrity: sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==} engines: {node: '>=12'} dev: false - /magic-string/0.25.9: - resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + /make-dir/3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} dependencies: - sourcemap-codec: 1.4.8 + semver: 6.3.1 + dev: false + + /make-dir/4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 dev: true + /make-error/1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + + /make-fetch-happen/13.0.0: + resolution: {integrity: sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@npmcli/agent': 2.2.0 + cacache: 18.0.0 + http-cache-semantics: 4.1.1 + is-lambda: 1.0.1 + minipass: 7.0.4 + minipass-fetch: 3.0.4 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.3 + promise-retry: 2.0.1 + ssri: 10.0.5 + transitivePeerDependencies: + - supports-color + dev: true + + /make-fetch-happen/9.1.0: + resolution: {integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==} + engines: {node: '>= 10'} + dependencies: + agentkeepalive: 4.5.0 + cacache: 15.3.0 + http-cache-semantics: 4.1.1 + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.1 + is-lambda: 1.0.1 + lru-cache: 6.0.0 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-fetch: 1.4.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.3 + promise-retry: 2.0.1 + socks-proxy-agent: 6.2.1 + ssri: 8.0.1 + transitivePeerDependencies: + - bluebird + - supports-color + dev: false + optional: true + /media-typer/0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} dev: false - /memoizee/0.4.15: - resolution: {integrity: sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==} - dependencies: - d: 1.0.1 - es5-ext: 0.10.62 - es6-weak-map: 2.0.3 - event-emitter: 0.3.5 - is-promise: 2.2.2 - lru-queue: 0.1.0 - next-tick: 1.1.0 - timers-ext: 0.1.7 - dev: true - /merge-descriptors/1.0.1: resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} dev: false @@ -2861,61 +3377,31 @@ packages: hasBin: true dev: false - /mime/3.0.0: - resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} - engines: {node: '>=10.0.0'} - hasBin: true + /mimic-fn/2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} dev: true - /mimic-response/3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - dev: false - /min-indent/1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} dev: true - /miniflare/3.20231030.0: - resolution: {integrity: sha512-iCg1dNauUG+kNp7jizcNmV/1XFItuTDvD/6xIC34PrszgKxYCbBO2R72y5NEDJTwaqr5ohQI/320wuJ8GEe7nQ==} - engines: {node: '>=16.13'} - hasBin: true - dependencies: - acorn: 8.11.2 - acorn-walk: 8.3.0 - capnp-ts: 0.7.0 - exit-hook: 2.2.1 - glob-to-regexp: 0.4.1 - source-map-support: 0.5.21 - stoppable: 1.1.0 - undici: 5.27.2 - workerd: 1.20231030.0 - ws: 8.14.2 - youch: 3.3.3 - zod: 3.22.4 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - /minimatch/3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 - dev: true /minimatch/5.1.6: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 - dev: true + dev: false - /minimatch/7.4.6: - resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} - engines: {node: '>=10'} + /minimatch/9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 dev: true @@ -2923,9 +3409,98 @@ packages: /minimist/1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - /mkdirp-classic/0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + /minipass-collect/1.0.2: + resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + + /minipass-fetch/1.4.1: + resolution: {integrity: sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==} + engines: {node: '>=8'} + dependencies: + minipass: 3.3.6 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 dev: false + optional: true + + /minipass-fetch/3.0.4: + resolution: {integrity: sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + minipass: 7.0.4 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 + dev: true + + /minipass-flush/1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + + /minipass-json-stream/1.0.1: + resolution: {integrity: sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==} + dependencies: + jsonparse: 1.3.1 + minipass: 3.3.6 + dev: true + + /minipass-pipeline/1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + dependencies: + minipass: 3.3.6 + + /minipass-sized/1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + dependencies: + minipass: 3.3.6 + + /minipass/3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + dependencies: + yallist: 4.0.0 + + /minipass/5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + /minipass/7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + dev: true + + /minizlib/2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + /mkdirp/1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + /mkdirp/2.1.6: + resolution: {integrity: sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==} + engines: {node: '>=10'} + hasBin: true + dev: false + + /mkdirp/3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + dev: true /moment/2.29.4: resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} @@ -2936,24 +3511,16 @@ packages: /ms/2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: true /ms/2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - /mustache/4.2.0: - resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} - hasBin: true - dev: true - - /nanoid/3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: true - - /napi-build-utils/1.0.2: - resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + /mz/2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 dev: false /natural-compare-lite/1.4.0: @@ -2967,22 +3534,78 @@ packages: /negotiator/0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} + + /node-addon-api/4.3.0: + resolution: {integrity: sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==} dev: false - /next-tick/1.1.0: - resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + /node-fetch/2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: false + + /node-gyp/10.0.1: + resolution: {integrity: sha512-gg3/bHehQfZivQVfqIyy8wTdSymF9yTyP4CJifK73imyNMU8AIGQE2pUa7dNWfmMeG9cDVF2eehiRMv0LC1iAg==} + engines: {node: ^16.14.0 || >=18.0.0} + hasBin: true + dependencies: + env-paths: 2.2.1 + exponential-backoff: 3.1.1 + glob: 10.3.10 + graceful-fs: 4.2.11 + make-fetch-happen: 13.0.0 + nopt: 7.2.0 + proc-log: 3.0.0 + semver: 7.5.4 + tar: 6.2.0 + which: 4.0.0 + transitivePeerDependencies: + - supports-color dev: true - /node-abi/3.51.0: - resolution: {integrity: sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA==} - engines: {node: '>=10'} + /node-gyp/8.4.1: + resolution: {integrity: sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==} + engines: {node: '>= 10.12.0'} + hasBin: true + requiresBuild: true dependencies: + env-paths: 2.2.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + make-fetch-happen: 9.1.0 + nopt: 5.0.0 + npmlog: 6.0.2 + rimraf: 3.0.2 semver: 7.5.4 + tar: 6.2.0 + which: 2.0.2 + transitivePeerDependencies: + - bluebird + - supports-color + dev: false + optional: true + + /nopt/5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + dependencies: + abbrev: 1.1.1 dev: false - /node-forge/1.3.1: - resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} - engines: {node: '>= 6.13.0'} + /nopt/7.2.0: + resolution: {integrity: sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + abbrev: 2.0.0 dev: true /normalize-package-data/2.5.0: @@ -2994,11 +3617,107 @@ packages: validate-npm-package-license: 3.0.4 dev: true + /normalize-package-data/6.0.0: + resolution: {integrity: sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + hosted-git-info: 7.0.1 + is-core-module: 2.13.1 + semver: 7.5.4 + validate-npm-package-license: 3.0.4 + dev: true + /normalize-path/3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} dev: true + /npm-bundled/3.0.0: + resolution: {integrity: sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + npm-normalize-package-bin: 3.0.1 + dev: true + + /npm-install-checks/6.3.0: + resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + semver: 7.5.4 + dev: true + + /npm-normalize-package-bin/3.0.1: + resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /npm-package-arg/11.0.1: + resolution: {integrity: sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + hosted-git-info: 7.0.1 + proc-log: 3.0.0 + semver: 7.5.4 + validate-npm-package-name: 5.0.0 + dev: true + + /npm-packlist/8.0.0: + resolution: {integrity: sha512-ErAGFB5kJUciPy1mmx/C2YFbvxoJ0QJ9uwkCZOeR6CqLLISPZBOiFModAbSXnjjlwW5lOhuhXva+fURsSGJqyw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + ignore-walk: 6.0.3 + dev: true + + /npm-pick-manifest/9.0.0: + resolution: {integrity: sha512-VfvRSs/b6n9ol4Qb+bDwNGUXutpy76x6MARw/XssevE0TnctIKcmklJZM5Z7nqs5z5aW+0S63pgCNbpkUNNXBg==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + npm-install-checks: 6.3.0 + npm-normalize-package-bin: 3.0.1 + npm-package-arg: 11.0.1 + semver: 7.5.4 + dev: true + + /npm-registry-fetch/16.1.0: + resolution: {integrity: sha512-PQCELXKt8Azvxnt5Y85GseQDJJlglTFM9L9U9gkv2y4e9s0k3GVDdOx3YoB6gm2Do0hlkzC39iCGXby+Wve1Bw==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + make-fetch-happen: 13.0.0 + minipass: 7.0.4 + minipass-fetch: 3.0.4 + minipass-json-stream: 1.0.1 + minizlib: 2.1.2 + npm-package-arg: 11.0.1 + proc-log: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /npmlog/5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + dependencies: + are-we-there-yet: 2.0.0 + console-control-strings: 1.1.0 + gauge: 3.0.2 + set-blocking: 2.0.0 + dev: false + + /npmlog/6.0.2: + resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + are-we-there-yet: 3.0.1 + console-control-strings: 1.1.0 + gauge: 4.0.4 + set-blocking: 2.0.0 + dev: false + optional: true + + /object-assign/4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: false + /object-hash/2.2.0: resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==} engines: {node: '>= 6'} @@ -3038,6 +3757,11 @@ packages: ee-first: 1.1.1 dev: false + /on-headers/1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + dev: false + /once/1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: @@ -3049,6 +3773,18 @@ packages: fn.name: 1.1.0 dev: false + /onetime/5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /opener/1.5.2: + resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} + hasBin: true + dev: true + /optionator/0.9.3: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} @@ -3068,6 +3804,13 @@ packages: p-try: 2.2.0 dev: true + /p-limit/3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + /p-locate/4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -3075,11 +3818,52 @@ packages: p-limit: 2.3.0 dev: true + /p-locate/5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /p-map/4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + dependencies: + aggregate-error: 3.1.0 + /p-try/2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} dev: true + /pacote/17.0.4: + resolution: {integrity: sha512-eGdLHrV/g5b5MtD5cTPyss+JxOlaOloSMG3UwPMAvL8ywaLJ6beONPF40K4KKl/UI6q5hTKCJq5rCu8tkF+7Dg==} + engines: {node: ^16.14.0 || >=18.0.0} + hasBin: true + dependencies: + '@npmcli/git': 5.0.3 + '@npmcli/installed-package-contents': 2.0.2 + '@npmcli/promise-spawn': 7.0.0 + '@npmcli/run-script': 7.0.2 + cacache: 18.0.0 + fs-minipass: 3.0.3 + minipass: 7.0.4 + npm-package-arg: 11.0.1 + npm-packlist: 8.0.0 + npm-pick-manifest: 9.0.0 + npm-registry-fetch: 16.1.0 + proc-log: 3.0.0 + promise-retry: 2.0.1 + read-package-json: 7.0.0 + read-package-json-fast: 3.0.2 + sigstore: 2.1.0 + ssri: 10.0.5 + tar: 6.2.0 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + /parent-module/1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -3097,11 +3881,30 @@ packages: lines-and-columns: 1.2.4 dev: true + /parse5-htmlparser2-tree-adapter/6.0.1: + resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} + dependencies: + parse5: 6.0.1 + dev: false + + /parse5/5.1.1: + resolution: {integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==} + dev: false + + /parse5/6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + dev: false + /parseurl/1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} dev: false + /patch-console/2.0.0: + resolution: {integrity: sha512-0YNdUceMdaQwoKce1gatDScmMo5pu/tfABfnzEqeG0gtTmd7mh/WcwgUjtAeOU7N8nFFlbQBnFK2gXW5fGvmMA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + /path-exists/4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -3110,7 +3913,6 @@ packages: /path-is-absolute/1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} - dev: true /path-key/3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} @@ -3121,14 +3923,18 @@ packages: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true + /path-scurry/1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + lru-cache: 10.1.0 + minipass: 7.0.4 + dev: true + /path-to-regexp/0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} dev: false - /path-to-regexp/6.2.1: - resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} - dev: true - /path-type/4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -3139,29 +3945,20 @@ packages: engines: {node: '>=8.6'} dev: true + /pirates/4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + dev: true + /pluralize/8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} dev: true - /prebuild-install/7.1.1: - resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} - engines: {node: '>=10'} - hasBin: true - dependencies: - detect-libc: 2.0.2 - expand-template: 2.0.3 - github-from-package: 0.0.0 - minimist: 1.2.8 - mkdirp-classic: 0.5.3 - napi-build-utils: 1.0.2 - node-abi: 3.51.0 - pump: 3.0.0 - rc: 1.2.8 - simple-get: 4.0.1 - tar-fs: 2.1.1 - tunnel-agent: 0.6.0 - dev: false + /polite-json/4.0.1: + resolution: {integrity: sha512-8LI5ZeCPBEb4uBbcYKNVwk4jgqNx1yHReWoW4H4uUihWlSqZsUDfSITrRhjliuPgxsNPFhNSudGO2Zu4cbWinQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true /prelude-ls/1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} @@ -3181,10 +3978,47 @@ packages: hasBin: true dev: true - /printable-characters/1.0.42: - resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} + /prismjs-terminal/1.2.3: + resolution: {integrity: sha512-xc0zuJ5FMqvW+DpiRkvxURlz98DdfDsZcFHdO699+oL+ykbFfgI7O4VDEgUyc07BSL2NHl3zdb8m/tZ/aaqUrw==} + engines: {node: '>=16'} + dependencies: + chalk: 5.3.0 + prismjs: 1.29.0 + string-length: 6.0.0 dev: true + /prismjs/1.29.0: + resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} + engines: {node: '>=6'} + dev: true + + /proc-log/3.0.0: + resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /process-on-spawn/1.0.0: + resolution: {integrity: sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==} + engines: {node: '>=8'} + dependencies: + fromentries: 1.3.2 + dev: true + + /promise-inflight/1.0.1: + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + + /promise-retry/2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + /proxy-addr/2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -3193,13 +4027,6 @@ packages: ipaddr.js: 1.9.1 dev: false - /pump/3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - dev: false - /punycode/2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -3241,15 +4068,68 @@ packages: unpipe: 1.0.0 dev: false - /rc/1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true + /react-element-to-jsx-string/15.0.0: + resolution: {integrity: sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ==} + peerDependencies: + react: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0 + react-dom: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0 dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - dev: false + '@base2/pretty-print-object': 1.0.1 + is-plain-object: 5.0.0 + react-is: 18.1.0 + dev: true + + /react-element-to-jsx-string/15.0.0_react@18.2.0: + resolution: {integrity: sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ==} + peerDependencies: + react: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0 + react-dom: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0 + dependencies: + '@base2/pretty-print-object': 1.0.1 + is-plain-object: 5.0.0 + react: 18.2.0 + react-is: 18.1.0 + dev: true + + /react-is/18.1.0: + resolution: {integrity: sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==} + dev: true + + /react-reconciler/0.29.0_react@18.2.0: + resolution: {integrity: sha512-wa0fGj7Zht1EYMRhKWwoo1H9GApxYLBuhoAuXN0TlltESAjDssB+Apf0T/DngVqaMyPypDmabL37vw/2aRM98Q==} + engines: {node: '>=0.10.0'} + peerDependencies: + react: ^18.2.0 + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + dev: true + + /react/18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + dev: true + + /read-package-json-fast/3.0.2: + resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + json-parse-even-better-errors: 3.0.0 + npm-normalize-package-bin: 3.0.1 + dev: true + + /read-package-json/7.0.0: + resolution: {integrity: sha512-uL4Z10OKV4p6vbdvIXB+OzhInYtIozl/VxUBPgNkBuUi2DeRonnuspmaVAMcrkmfjKGNmRndyQAbE7/AmzGwFg==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + glob: 10.3.10 + json-parse-even-better-errors: 3.0.0 + normalize-package-data: 6.0.0 + npm-normalize-package-bin: 3.0.1 + dev: true /read-pkg-up/7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} @@ -3286,6 +4166,14 @@ packages: picomatch: 2.3.1 dev: true + /reflect-metadata/0.1.13: + resolution: {integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==} + dev: false + + /regenerator-runtime/0.14.0: + resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} + dev: false + /regexp-tree/0.1.27: resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} hasBin: true @@ -3305,18 +4193,21 @@ packages: engines: {node: '>=8'} dev: true + /require-directory/2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + /resolve-from/4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} dev: true - /resolve-pkg-maps/1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - dev: true - - /resolve.exports/2.0.2: - resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} - engines: {node: '>=10'} + /resolve-import/1.4.5: + resolution: {integrity: sha512-HXb4YqODuuXT7Icq1Z++0g2JmhgbUHSs3VT2xR83gqvAPUikYT2Xk+562KHQgiaNkbBOlPddYrDLsC44qQggzw==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + dependencies: + glob: 10.3.10 + walk-up-path: 3.0.1 dev: true /resolve/1.22.8: @@ -3328,6 +4219,18 @@ packages: supports-preserve-symlinks-flag: 1.0.0 dev: true + /restore-cursor/4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: true + + /retry/0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + /reusify/1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -3338,27 +4241,13 @@ packages: hasBin: true dependencies: glob: 7.2.3 - dev: true - /rollup-plugin-inject/3.0.2: - resolution: {integrity: sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==} - deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject. + /rimraf/5.0.5: + resolution: {integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==} + engines: {node: '>=14'} + hasBin: true dependencies: - estree-walker: 0.6.1 - magic-string: 0.25.9 - rollup-pluginutils: 2.8.2 - dev: true - - /rollup-plugin-node-polyfills/0.2.1: - resolution: {integrity: sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==} - dependencies: - rollup-plugin-inject: 3.0.2 - dev: true - - /rollup-pluginutils/2.8.2: - resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} - dependencies: - estree-walker: 0.6.1 + glob: 10.3.10 dev: true /run-parallel/1.2.0: @@ -3377,6 +4266,10 @@ packages: isarray: 2.0.5 dev: true + /safe-buffer/5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: false + /safe-buffer/5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} dev: false @@ -3406,14 +4299,11 @@ packages: /safer-buffer/2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: false - /selfsigned/2.4.1: - resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} - engines: {node: '>=10'} + /scheduler/0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} dependencies: - '@types/node-forge': 1.3.9 - node-forge: 1.3.1 + loose-envify: 1.4.0 dev: true /semver/5.7.2: @@ -3424,7 +4314,6 @@ packages: /semver/6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - dev: true /semver/7.5.4: resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} @@ -3466,6 +4355,10 @@ packages: - supports-color dev: false + /set-blocking/2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: false + /set-function-length/1.1.1: resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} engines: {node: '>= 0.4'} @@ -3488,6 +4381,14 @@ packages: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} dev: false + /sha.js/2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: false + /shebang-command/2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -3507,17 +4408,25 @@ packages: get-intrinsic: 1.2.2 object-inspect: 1.13.1 - /simple-concat/1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - dev: false + /signal-exit/3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - /simple-get/4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + /signal-exit/4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: true + + /sigstore/2.1.0: + resolution: {integrity: sha512-kPIj+ZLkyI3QaM0qX8V/nSsweYND3W448pwkDgS6CQ74MfhEkIR8ToK5Iyx46KJYRjseVcD3Rp9zAmUAj6ZjPw==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 - dev: false + '@sigstore/bundle': 2.1.0 + '@sigstore/protobuf-specs': 0.2.1 + '@sigstore/sign': 2.2.0 + '@sigstore/tuf': 2.2.0 + transitivePeerDependencies: + - supports-color + dev: true /simple-swizzle/0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} @@ -3525,32 +4434,61 @@ packages: is-arrayish: 0.3.2 dev: false - /sisteransi/1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - dev: true - /slash/3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} dev: true - /source-map-support/0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + /slice-ansi/5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 dev: true - /source-map/0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} + /slice-ansi/6.0.0: + resolution: {integrity: sha512-6bn4hRfkTvDfUoEQYkERg0BVF1D0vrX9HEkMl08uDiNWvVvjylLHvZFZWkDo6wjT8tUctbYl1nCOuE66ZTaUtA==} + engines: {node: '>=14.16'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 dev: true - /sourcemap-codec/1.4.8: - resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} - deprecated: Please use @jridgewell/sourcemap-codec instead + /smart-buffer/4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + /socks-proxy-agent/6.2.1: + resolution: {integrity: sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==} + engines: {node: '>= 10'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + socks: 2.7.1 + transitivePeerDependencies: + - supports-color + dev: false + optional: true + + /socks-proxy-agent/8.0.2: + resolution: {integrity: sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4 + socks: 2.7.1 + transitivePeerDependencies: + - supports-color dev: true + /socks/2.7.1: + resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} + engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} + dependencies: + ip: 2.0.0 + smart-buffer: 4.2.0 + /spdx-correct/3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} dependencies: @@ -3573,15 +4511,48 @@ packages: resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} dev: true + /sqlite3/5.1.6: + resolution: {integrity: sha512-olYkWoKFVNSSSQNvxVUfjiVbz3YtBwTJj+mfV5zpHmqW3sELx2Cf4QCdirMelhM5Zh+KDVaKgQHqCxrqiWHybw==} + requiresBuild: true + peerDependenciesMeta: + node-gyp: + optional: true + dependencies: + '@mapbox/node-pre-gyp': 1.0.11 + node-addon-api: 4.3.0 + tar: 6.2.0 + optionalDependencies: + node-gyp: 8.4.1 + transitivePeerDependencies: + - bluebird + - encoding + - supports-color + dev: false + + /ssri/10.0.5: + resolution: {integrity: sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + minipass: 7.0.4 + dev: true + + /ssri/8.0.1: + resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: false + optional: true + /stack-trace/0.0.10: resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} dev: false - /stacktracey/2.1.8: - resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==} + /stack-utils/2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} dependencies: - as-table: 1.0.55 - get-source: 2.0.12 + escape-string-regexp: 2.0.0 dev: true /statuses/2.0.1: @@ -3589,9 +4560,28 @@ packages: engines: {node: '>= 0.8'} dev: false - /stoppable/1.1.0: - resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} - engines: {node: '>=4', npm: '>=6'} + /string-length/6.0.0: + resolution: {integrity: sha512-1U361pxZHEQ+FeSjzqRpV+cu2vTzYeWeafXFLykiFlv4Vc0n3njgU8HrMbyik5uwm77naWMuVG8fhEF+Ovb1Kg==} + engines: {node: '>=16'} + dependencies: + strip-ansi: 7.1.0 + dev: true + + /string-width/4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + /string-width/5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 dev: true /string.prototype.trim/1.2.8: @@ -3630,6 +4620,12 @@ packages: engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 + + /strip-ansi/7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 dev: true /strip-bom/3.0.0: @@ -3643,11 +4639,6 @@ packages: min-indent: 1.0.1 dev: true - /strip-json-comments/2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - dev: false - /strip-json-comments/3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -3665,32 +4656,120 @@ packages: engines: {node: '>=8'} dependencies: has-flag: 4.0.0 - dev: true /supports-preserve-symlinks-flag/1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} dev: true - /tar-fs/2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + /sync-content/1.0.2: + resolution: {integrity: sha512-znd3rYiiSxU3WteWyS9a6FXkTA/Wjk8WQsOyzHbineeL837dLn3DA4MRhsIX3qGcxDMH6+uuFV4axztssk7wEQ==} + engines: {node: '>=14'} + hasBin: true dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.0 - tar-stream: 2.2.0 - dev: false + glob: 10.3.10 + mkdirp: 3.0.1 + path-scurry: 1.10.1 + rimraf: 5.0.5 + dev: true - /tar-stream/2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} + /tap-parser/15.3.1: + resolution: {integrity: sha512-hwAtXX5TBGt2MJeYvASc7DjP48PUzA7P8RTbLxQcgKCEH7ICD5IsRco7l5YvkzjHlZbUbeI9wzO8B4hw2sKgnQ==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + hasBin: true dependencies: - bl: 4.1.0 - end-of-stream: 1.4.4 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - dev: false + events-to-array: 2.0.3 + tap-yaml: 2.2.1 + dev: true + + /tap-yaml/2.2.1: + resolution: {integrity: sha512-ovZuUMLAIH59jnFHXKEGJ+WyDYl6Cuduwg9qpvnqkZOUA1nU84q02Sry1HT0KXcdv2uB91bEKKxnIybBgrb6oA==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + dependencies: + yaml: 2.3.4 + yaml-types: 0.3.0_yaml@2.3.4 + dev: true + + /tap/18.6.1_dlwlq4pyjtez5iosqcsauhzqda: + resolution: {integrity: sha512-5cBQhJ1gdbsrTR3tA5kZZTts0HyOML6bcM7pEF7GF8d6y1ajfRMjbInS1Ty7/x2Ip0ko3cY1dYjPJ9JFNPsm7w==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + hasBin: true + dependencies: + '@tapjs/after': 1.1.17_@tapjs+core@1.4.6 + '@tapjs/after-each': 1.1.17_@tapjs+core@1.4.6 + '@tapjs/asserts': 1.1.17_@tapjs+core@1.4.6 + '@tapjs/before': 1.1.17_@tapjs+core@1.4.6 + '@tapjs/before-each': 1.1.17_@tapjs+core@1.4.6 + '@tapjs/core': 1.4.6_@types+node@16.18.62 + '@tapjs/filter': 1.2.17_@tapjs+core@1.4.6 + '@tapjs/fixture': 1.2.17_@tapjs+core@1.4.6 + '@tapjs/intercept': 1.2.17_@tapjs+core@1.4.6 + '@tapjs/mock': 1.2.15_@tapjs+core@1.4.6 + '@tapjs/node-serialize': 1.2.6_@tapjs+core@1.4.6 + '@tapjs/run': 1.4.16_j4i6watdse2tu2gu6bns7tqypm + '@tapjs/snapshot': 1.2.17_@tapjs+core@1.4.6 + '@tapjs/spawn': 1.1.17_@tapjs+core@1.4.6 + '@tapjs/stdin': 1.1.17_@tapjs+core@1.4.6 + '@tapjs/test': 1.3.17_j4i6watdse2tu2gu6bns7tqypm + '@tapjs/typescript': 1.3.6_ovdroml3jz4t4ex4wij6ayihna + '@tapjs/worker': 1.1.17_@tapjs+core@1.4.6 + resolve-import: 1.4.5 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - '@types/node' + - '@types/react' + - bluebird + - bufferutil + - react + - react-devtools-core + - react-dom + - supports-color + - typescript + - utf-8-validate + dev: true + + /tar/6.2.0: + resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} + engines: {node: '>=10'} + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + /tcompare/6.4.5: + resolution: {integrity: sha512-Whuz9xlKKI2XXICKDSDRKjXdBuC6gBNOgmEUtH7UFyQeYzfUMQ19DyjZULarGKDGFhgOg3CJ+IQUEfpkOPg0Uw==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + dependencies: + diff: 5.1.0 + react-element-to-jsx-string: 15.0.0 + transitivePeerDependencies: + - react + - react-dom + dev: true + + /tcompare/6.4.5_react@18.2.0: + resolution: {integrity: sha512-Whuz9xlKKI2XXICKDSDRKjXdBuC6gBNOgmEUtH7UFyQeYzfUMQ19DyjZULarGKDGFhgOg3CJ+IQUEfpkOPg0Uw==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + dependencies: + diff: 5.1.0 + react-element-to-jsx-string: 15.0.0_react@18.2.0 + transitivePeerDependencies: + - react + - react-dom + dev: true + + /test-exclude/6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + dev: true /text-hex/1.0.0: resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} @@ -3700,12 +4779,18 @@ packages: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true - /timers-ext/0.1.7: - resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==} + /thenify-all/1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} dependencies: - es5-ext: 0.10.62 - next-tick: 1.1.0 - dev: true + thenify: 3.3.1 + dev: false + + /thenify/3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: false /to-regex-range/5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} @@ -3719,11 +4804,20 @@ packages: engines: {node: '>=0.6'} dev: false + /tr46/0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: false + /triple-beam/1.4.1: resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} engines: {node: '>= 14.0.0'} dev: false + /trivial-deferred/2.0.0: + resolution: {integrity: sha512-iGbM7X2slv9ORDVj2y2FFUq3cP/ypbtu2nQ8S38ufjL0glBABvmR9pTdsib1XtS2LUhhLMbelaBUaf/s5J3dSw==} + engines: {node: '>= 8'} + dev: true + /tsconfig-paths/3.14.2: resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} dependencies: @@ -3742,13 +4836,28 @@ packages: strip-bom: 3.0.0 dev: false + /tshy/1.8.1: + resolution: {integrity: sha512-O9WxN6r0v1r0e77xvSo3FpFkMqKX0ZFMbOcHD4SGQqPCF5fnyHAMzb7CygZ8Po8jVFoJVcahWG+qDRNaPp66Og==} + engines: {node: 16 >=16.17 || 18 >=18.15.0 || >=20.6.1} + hasBin: true + dependencies: + chalk: 5.3.0 + chokidar: 3.5.3 + foreground-child: 3.1.1 + mkdirp: 3.0.1 + resolve-import: 1.4.5 + rimraf: 5.0.5 + sync-content: 1.0.2 + typescript: 5.2.2 + walk-up-path: 3.0.1 + dev: true + /tslib/1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true /tslib/2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - dev: true /tsutils/3.21.0_typescript@4.9.4: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} @@ -3760,11 +4869,16 @@ packages: typescript: 4.9.4 dev: true - /tunnel-agent/0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + /tuf-js/2.1.0: + resolution: {integrity: sha512-eD7YPPjVlMzdggrOeE8zwoegUaG/rt6Bt3jwoQPunRiNVzgcCE009UDFJKJjG+Gk9wFu6W/Vi+P5d/5QpdD9jA==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: - safe-buffer: 5.2.1 - dev: false + '@tufjs/models': 2.0.0 + debug: 4.3.4 + make-fetch-happen: 13.0.0 + transitivePeerDependencies: + - supports-color + dev: true /type-check/0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} @@ -3773,6 +4887,11 @@ packages: prelude-ls: 1.2.1 dev: true + /type-fest/0.12.0: + resolution: {integrity: sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg==} + engines: {node: '>=10'} + dev: true + /type-fest/0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} @@ -3788,6 +4907,11 @@ packages: engines: {node: '>=8'} dev: true + /type-fest/3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + engines: {node: '>=14.16'} + dev: true + /type-is/1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -3796,14 +4920,6 @@ packages: mime-types: 2.1.35 dev: false - /type/1.2.0: - resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} - dev: true - - /type/2.7.2: - resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} - dev: true - /typed-array-buffer/1.0.0: resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} engines: {node: '>= 0.4'} @@ -3857,12 +4973,96 @@ packages: iconv-lite: 0.6.3 dev: false + /typeorm/0.3.17_sqlite3@5.1.6: + resolution: {integrity: sha512-UDjUEwIQalO9tWw9O2A4GU+sT3oyoUXheHJy4ft+RFdnRdQctdQ34L9SqE2p7LdwzafHx1maxT+bqXON+Qnmig==} + engines: {node: '>= 12.9.0'} + hasBin: true + peerDependencies: + '@google-cloud/spanner': ^5.18.0 + '@sap/hana-client': ^2.12.25 + better-sqlite3: ^7.1.2 || ^8.0.0 + hdb-pool: ^0.1.6 + ioredis: ^5.0.4 + mongodb: ^5.2.0 + mssql: ^9.1.1 + mysql2: ^2.2.5 || ^3.0.1 + oracledb: ^5.1.0 + pg: ^8.5.1 + pg-native: ^3.0.0 + pg-query-stream: ^4.0.0 + redis: ^3.1.1 || ^4.0.0 + sql.js: ^1.4.0 + sqlite3: ^5.0.3 + ts-node: ^10.7.0 + typeorm-aurora-data-api-driver: ^2.0.0 + peerDependenciesMeta: + '@google-cloud/spanner': + optional: true + '@sap/hana-client': + optional: true + better-sqlite3: + optional: true + hdb-pool: + optional: true + ioredis: + optional: true + mongodb: + optional: true + mssql: + optional: true + mysql2: + optional: true + oracledb: + optional: true + pg: + optional: true + pg-native: + optional: true + pg-query-stream: + optional: true + redis: + optional: true + sql.js: + optional: true + sqlite3: + optional: true + ts-node: + optional: true + typeorm-aurora-data-api-driver: + optional: true + dependencies: + '@sqltools/formatter': 1.2.5 + app-root-path: 3.1.0 + buffer: 6.0.3 + chalk: 4.1.2 + cli-highlight: 2.1.11 + date-fns: 2.30.0 + debug: 4.3.4 + dotenv: 16.3.1 + glob: 8.1.0 + mkdirp: 2.1.6 + reflect-metadata: 0.1.13 + sha.js: 2.4.11 + sqlite3: 5.1.6 + tslib: 2.6.2 + uuid: 9.0.1 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + dev: false + /typescript/4.9.4: resolution: {integrity: sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==} engines: {node: '>=4.2.0'} hasBin: true dev: true + /typescript/5.2.2: + resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + /unbox-primitive/1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: @@ -3872,11 +5072,32 @@ packages: which-boxed-primitive: 1.0.2 dev: true - /undici/5.27.2: - resolution: {integrity: sha512-iS857PdOEy/y3wlM3yRp+6SNQQ6xU0mmZcwRSriqk+et/cwWAtwmIGf6WkoDN2EK/AMdCO/dfXzIwi+rFMrjjQ==} - engines: {node: '>=14.0'} + /unique-filename/1.1.1: + resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} dependencies: - '@fastify/busboy': 2.1.0 + unique-slug: 2.0.2 + dev: false + optional: true + + /unique-filename/3.0.0: + resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + unique-slug: 4.0.0 + dev: true + + /unique-slug/2.0.2: + resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==} + dependencies: + imurmurhash: 0.1.4 + dev: false + optional: true + + /unique-slug/4.0.0: + resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + imurmurhash: 0.1.4 dev: true /unpipe/1.0.0: @@ -3899,10 +5120,33 @@ packages: engines: {node: '>= 0.4.0'} dev: false + /uuid/8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + dev: true + + /uuid/9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + dev: false + + /v8-compile-cache-lib/3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: true + /v8-compile-cache/2.4.0: resolution: {integrity: sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==} dev: true + /v8-to-istanbul/9.2.0: + resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} + engines: {node: '>=10.12.0'} + dependencies: + '@jridgewell/trace-mapping': 0.3.20 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + dev: true + /validate-npm-package-license/3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: @@ -3910,11 +5154,33 @@ packages: spdx-expression-parse: 3.0.1 dev: true + /validate-npm-package-name/5.0.0: + resolution: {integrity: sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + builtins: 5.0.1 + dev: true + /vary/1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} dev: false + /walk-up-path/3.0.1: + resolution: {integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==} + dev: true + + /webidl-conversions/3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: false + + /whatwg-url/5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: false + /which-boxed-primitive/1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} dependencies: @@ -3942,6 +5208,26 @@ packages: hasBin: true dependencies: isexe: 2.0.0 + + /which/4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + isexe: 3.1.1 + dev: true + + /wide-align/1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + dependencies: + string-width: 4.2.3 + dev: false + + /widest-line/4.0.1: + resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 dev: true /winston-daily-rotate-file/4.7.1_winston@3.11.0: @@ -3983,48 +5269,21 @@ packages: winston-transport: 4.6.0 dev: false - /wordwrap/1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - dev: true - - /workerd/1.20231030.0: - resolution: {integrity: sha512-+FSW+d31f8RrjHanFf/R9A+Z0csf3OtsvzdPmAKuwuZm/5HrBv83cvG9fFeTxl7/nI6irUUXIRF9xcj/NomQzQ==} - engines: {node: '>=16'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20231030.0 - '@cloudflare/workerd-darwin-arm64': 1.20231030.0 - '@cloudflare/workerd-linux-64': 1.20231030.0 - '@cloudflare/workerd-linux-arm64': 1.20231030.0 - '@cloudflare/workerd-windows-64': 1.20231030.0 - dev: true - - /wrangler/3.16.0: - resolution: {integrity: sha512-MIx35sSdFKE3hnfWB6xWUnrt3OiyKK+PQnc9kFLjksLESX0tLmEk1gdvThYHliY90kkelS+nbH48SUGTFAI5BA==} - engines: {node: '>=16.17.0'} - hasBin: true + /wrap-ansi/7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} dependencies: - '@cloudflare/kv-asset-handler': 0.2.0 - '@esbuild-plugins/node-globals-polyfill': 0.2.3_esbuild@0.17.19 - '@esbuild-plugins/node-modules-polyfill': 0.2.2_esbuild@0.17.19 - blake3-wasm: 2.1.5 - chokidar: 3.5.3 - esbuild: 0.17.19 - miniflare: 3.20231030.0 - nanoid: 3.3.7 - path-to-regexp: 6.2.1 - resolve.exports: 2.0.2 - selfsigned: 2.4.1 - source-map: 0.6.1 - source-map-support: 0.5.21 - xxhash-wasm: 1.0.2 - optionalDependencies: - fsevents: 2.3.3 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + /wrap-ansi/8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 dev: true /wrappy/1.0.2: @@ -4043,19 +5302,68 @@ packages: optional: true dev: true - /xxhash-wasm/1.0.2: - resolution: {integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==} - dev: true + /y18n/5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} /yallist/4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - /youch/3.3.3: - resolution: {integrity: sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==} + /yaml-types/0.3.0_yaml@2.3.4: + resolution: {integrity: sha512-i9RxAO/LZBiE0NJUy9pbN5jFz5EasYDImzRkj8Y81kkInTi1laia3P3K/wlMKzOxFQutZip8TejvQP/DwgbU7A==} + engines: {node: '>= 16', npm: '>= 7'} + peerDependencies: + yaml: ^2.3.0 dependencies: - cookie: 0.5.0 - mustache: 4.2.0 - stacktracey: 2.1.8 + yaml: 2.3.4 + dev: true + + /yaml/2.3.4: + resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} + engines: {node: '>= 14'} + dev: true + + /yargs-parser/20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: false + + /yargs-parser/21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + /yargs/16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + dependencies: + cliui: 7.0.4 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + dev: false + + /yargs/17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + /yocto-queue/0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true + + /yoga-wasm-web/0.3.3: + resolution: {integrity: sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA==} dev: true /zod-validation-error/2.1.0_zod@3.22.4: @@ -4069,3 +5377,4 @@ packages: /zod/3.22.4: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + dev: false diff --git a/src/external/db/data-source.ts b/src/external/db/data-source.ts new file mode 100644 index 0000000..8726423 --- /dev/null +++ b/src/external/db/data-source.ts @@ -0,0 +1,27 @@ +import "reflect-metadata"; +import { AimeCard, AimeUser, FelicaCardLookup, FelicaMobileLookup } from "./entity/aimedb"; +import { Arcade, Machine } from "./entity/allnet"; +import { EventLog } from "./entity/base"; +import { ChunithmStaticEvent } from "./entity/chunithm/static"; +import { Config } from "lib/setup/config"; +import { DataSource } from "typeorm"; + +export const AppDataSource = new DataSource({ + type: "sqlite", + database: Config.DATABASE_PATH, + synchronize: true, + logging: false, + entities: [ + Arcade, + AimeCard, + AimeUser, + ChunithmStaticEvent, + EventLog, + FelicaCardLookup, + FelicaMobileLookup, + Machine, + ], + migrations: [], + subscribers: [], + enableWAL: true, +}); diff --git a/src/external/db/db.ts b/src/external/db/db.ts deleted file mode 100644 index c73dd9d..0000000 --- a/src/external/db/db.ts +++ /dev/null @@ -1,10 +0,0 @@ -import Database from "better-sqlite3"; -import { drizzle } from "drizzle-orm/better-sqlite3"; -import { migrate } from "drizzle-orm/better-sqlite3/migrator"; -import { Config } from "lib/setup/config"; - -const sqlite = new Database(Config.DATABASE_PATH); - -export const db = drizzle(sqlite); - -migrate(db, { migrationsFolder: "src/external/db/drizzle" }); diff --git a/src/external/db/drizzle/0000_ambitious_gorilla_man.sql b/src/external/db/drizzle/0000_ambitious_gorilla_man.sql deleted file mode 100644 index 1b50588..0000000 --- a/src/external/db/drizzle/0000_ambitious_gorilla_man.sql +++ /dev/null @@ -1,48 +0,0 @@ -CREATE TABLE `aimedb_felica_card_lookup` ( - `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, - `idm` text(16) NOT NULL, - `access_code` text(20) NOT NULL -); ---> statement-breakpoint -CREATE TABLE `aimedb_felica_mobile_lookup` ( - `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, - `idm` text(16) NOT NULL, - `access_code` text(20) NOT NULL -); ---> statement-breakpoint -CREATE TABLE `allnet_arcade` ( - `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, - `name` text(60) DEFAULT 'Random arcade at nowhere', - `nickname` text(40) DEFAULT 'Please send help', - `country` text(3) DEFAULT 'JPN', - `region_id` integer DEFAULT 1, - `region_name0` text(48) DEFAULT 'W', - `region_name1` text(48) DEFAULT '', - `region_name2` text(48) DEFAULT '', - `region_name3` text(48) DEFAULT '', - `utc_offset` real DEFAULT 9 -); ---> statement-breakpoint -CREATE TABLE `allnet_arcade_ip` ( - `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, - `arcade_id` integer, - `ip` text(15), - FOREIGN KEY (`arcade_id`) REFERENCES `allnet_arcade`(`id`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -CREATE TABLE `allnet_machine` ( - `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, - `arcade_id` integer, - `serial` text(11), - `game` text(5), - `can_venue_hop` integer, - `last_authenticated` integer, - FOREIGN KEY (`arcade_id`) REFERENCES `allnet_arcade`(`id`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -CREATE UNIQUE INDEX `aimedb_felica_card_lookup_idm_unique` ON `aimedb_felica_card_lookup` (`idm`);--> statement-breakpoint -CREATE UNIQUE INDEX `aimedb_felica_card_lookup_access_code_unique` ON `aimedb_felica_card_lookup` (`access_code`);--> statement-breakpoint -CREATE UNIQUE INDEX `aimedb_felica_mobile_lookup_idm_unique` ON `aimedb_felica_mobile_lookup` (`idm`);--> statement-breakpoint -CREATE UNIQUE INDEX `aimedb_felica_mobile_lookup_access_code_unique` ON `aimedb_felica_mobile_lookup` (`access_code`);--> statement-breakpoint -CREATE UNIQUE INDEX `allnet_arcade_ip_ip_unique` ON `allnet_arcade_ip` (`ip`);--> statement-breakpoint -CREATE UNIQUE INDEX `allnet_machine_serial_unique` ON `allnet_machine` (`serial`); \ No newline at end of file diff --git a/src/external/db/drizzle/0001_modern_stryfe.sql b/src/external/db/drizzle/0001_modern_stryfe.sql deleted file mode 100644 index d57778e..0000000 --- a/src/external/db/drizzle/0001_modern_stryfe.sql +++ /dev/null @@ -1,29 +0,0 @@ -CREATE TABLE `aimedb_card` ( - `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, - `user_id` integer, - `access_code` text(20) NOT NULL, - `created_date` integer NOT NULL, - `last_login_date` integer NOT NULL, - `is_locked` integer DEFAULT false NOT NULL, - `is_banned` integer DEFAULT false NOT NULL, - FOREIGN KEY (`user_id`) REFERENCES `aimedb_user`(`id`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -CREATE TABLE `aimedb_user` ( - `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, - `created_date` integer NOT NULL, - `last_login_date` integer NOT NULL, - `suspend_expiration_date` integer -); ---> statement-breakpoint -CREATE TABLE `event_log` ( - `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, - `timestamp` integer NOT NULL, - `system` text NOT NULL, - `type` text NOT NULL, - `severity` text NOT NULL, - `message` text, - `details` text -); ---> statement-breakpoint -CREATE UNIQUE INDEX `aimedb_card_access_code_unique` ON `aimedb_card` (`access_code`); \ No newline at end of file diff --git a/src/external/db/drizzle/meta/0000_snapshot.json b/src/external/db/drizzle/meta/0000_snapshot.json deleted file mode 100644 index e813d6a..0000000 --- a/src/external/db/drizzle/meta/0000_snapshot.json +++ /dev/null @@ -1,317 +0,0 @@ -{ - "version": "5", - "dialect": "sqlite", - "id": "a691ce52-7207-49ee-8450-d679c38b147a", - "prevId": "00000000-0000-0000-0000-000000000000", - "tables": { - "aimedb_felica_card_lookup": { - "name": "aimedb_felica_card_lookup", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "autoincrement": true - }, - "idm": { - "name": "idm", - "type": "text(16)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "access_code": { - "name": "access_code", - "type": "text(20)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "aimedb_felica_card_lookup_idm_unique": { - "name": "aimedb_felica_card_lookup_idm_unique", - "columns": [ - "idm" - ], - "isUnique": true - }, - "aimedb_felica_card_lookup_access_code_unique": { - "name": "aimedb_felica_card_lookup_access_code_unique", - "columns": [ - "access_code" - ], - "isUnique": true - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "aimedb_felica_mobile_lookup": { - "name": "aimedb_felica_mobile_lookup", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "autoincrement": true - }, - "idm": { - "name": "idm", - "type": "text(16)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "access_code": { - "name": "access_code", - "type": "text(20)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "aimedb_felica_mobile_lookup_idm_unique": { - "name": "aimedb_felica_mobile_lookup_idm_unique", - "columns": [ - "idm" - ], - "isUnique": true - }, - "aimedb_felica_mobile_lookup_access_code_unique": { - "name": "aimedb_felica_mobile_lookup_access_code_unique", - "columns": [ - "access_code" - ], - "isUnique": true - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "allnet_arcade": { - "name": "allnet_arcade", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "autoincrement": true - }, - "name": { - "name": "name", - "type": "text(60)", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": "'Random arcade at nowhere'" - }, - "nickname": { - "name": "nickname", - "type": "text(40)", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": "'Please send help'" - }, - "country": { - "name": "country", - "type": "text(3)", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": "'JPN'" - }, - "region_id": { - "name": "region_id", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 1 - }, - "region_name0": { - "name": "region_name0", - "type": "text(48)", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": "'W'" - }, - "region_name1": { - "name": "region_name1", - "type": "text(48)", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": "''" - }, - "region_name2": { - "name": "region_name2", - "type": "text(48)", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": "''" - }, - "region_name3": { - "name": "region_name3", - "type": "text(48)", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": "''" - }, - "utc_offset": { - "name": "utc_offset", - "type": "real", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 9 - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "allnet_arcade_ip": { - "name": "allnet_arcade_ip", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "autoincrement": true - }, - "arcade_id": { - "name": "arcade_id", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "ip": { - "name": "ip", - "type": "text(15)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "allnet_arcade_ip_ip_unique": { - "name": "allnet_arcade_ip_ip_unique", - "columns": [ - "ip" - ], - "isUnique": true - } - }, - "foreignKeys": { - "allnet_arcade_ip_arcade_id_allnet_arcade_id_fk": { - "name": "allnet_arcade_ip_arcade_id_allnet_arcade_id_fk", - "tableFrom": "allnet_arcade_ip", - "tableTo": "allnet_arcade", - "columnsFrom": [ - "arcade_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "allnet_machine": { - "name": "allnet_machine", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "autoincrement": true - }, - "arcade_id": { - "name": "arcade_id", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "serial": { - "name": "serial", - "type": "text(11)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "game": { - "name": "game", - "type": "text(5)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "can_venue_hop": { - "name": "can_venue_hop", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "last_authenticated": { - "name": "last_authenticated", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "allnet_machine_serial_unique": { - "name": "allnet_machine_serial_unique", - "columns": [ - "serial" - ], - "isUnique": true - } - }, - "foreignKeys": { - "allnet_machine_arcade_id_allnet_arcade_id_fk": { - "name": "allnet_machine_arcade_id_allnet_arcade_id_fk", - "tableFrom": "allnet_machine", - "tableTo": "allnet_arcade", - "columnsFrom": [ - "arcade_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - } - }, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - } -} \ No newline at end of file diff --git a/src/external/db/drizzle/meta/0001_snapshot.json b/src/external/db/drizzle/meta/0001_snapshot.json deleted file mode 100644 index a7cfd14..0000000 --- a/src/external/db/drizzle/meta/0001_snapshot.json +++ /dev/null @@ -1,494 +0,0 @@ -{ - "version": "5", - "dialect": "sqlite", - "id": "ca3c0d34-cebd-4ea7-806e-f4eb141e586b", - "prevId": "a691ce52-7207-49ee-8450-d679c38b147a", - "tables": { - "aimedb_card": { - "name": "aimedb_card", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "autoincrement": true - }, - "user_id": { - "name": "user_id", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "access_code": { - "name": "access_code", - "type": "text(20)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created_date": { - "name": "created_date", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "last_login_date": { - "name": "last_login_date", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_locked": { - "name": "is_locked", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "is_banned": { - "name": "is_banned", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - } - }, - "indexes": { - "aimedb_card_access_code_unique": { - "name": "aimedb_card_access_code_unique", - "columns": [ - "access_code" - ], - "isUnique": true - } - }, - "foreignKeys": { - "aimedb_card_user_id_aimedb_user_id_fk": { - "name": "aimedb_card_user_id_aimedb_user_id_fk", - "tableFrom": "aimedb_card", - "tableTo": "aimedb_user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "aimedb_felica_card_lookup": { - "name": "aimedb_felica_card_lookup", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "autoincrement": true - }, - "idm": { - "name": "idm", - "type": "text(16)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "access_code": { - "name": "access_code", - "type": "text(20)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "aimedb_felica_card_lookup_idm_unique": { - "name": "aimedb_felica_card_lookup_idm_unique", - "columns": [ - "idm" - ], - "isUnique": true - }, - "aimedb_felica_card_lookup_access_code_unique": { - "name": "aimedb_felica_card_lookup_access_code_unique", - "columns": [ - "access_code" - ], - "isUnique": true - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "aimedb_felica_mobile_lookup": { - "name": "aimedb_felica_mobile_lookup", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "autoincrement": true - }, - "idm": { - "name": "idm", - "type": "text(16)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "access_code": { - "name": "access_code", - "type": "text(20)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "aimedb_felica_mobile_lookup_idm_unique": { - "name": "aimedb_felica_mobile_lookup_idm_unique", - "columns": [ - "idm" - ], - "isUnique": true - }, - "aimedb_felica_mobile_lookup_access_code_unique": { - "name": "aimedb_felica_mobile_lookup_access_code_unique", - "columns": [ - "access_code" - ], - "isUnique": true - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "aimedb_user": { - "name": "aimedb_user", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "autoincrement": true - }, - "created_date": { - "name": "created_date", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "last_login_date": { - "name": "last_login_date", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "suspend_expiration_date": { - "name": "suspend_expiration_date", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "allnet_arcade": { - "name": "allnet_arcade", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "autoincrement": true - }, - "name": { - "name": "name", - "type": "text(60)", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": "'Random arcade at nowhere'" - }, - "nickname": { - "name": "nickname", - "type": "text(40)", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": "'Please send help'" - }, - "country": { - "name": "country", - "type": "text(3)", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": "'JPN'" - }, - "region_id": { - "name": "region_id", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 1 - }, - "region_name0": { - "name": "region_name0", - "type": "text(48)", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": "'W'" - }, - "region_name1": { - "name": "region_name1", - "type": "text(48)", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": "''" - }, - "region_name2": { - "name": "region_name2", - "type": "text(48)", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": "''" - }, - "region_name3": { - "name": "region_name3", - "type": "text(48)", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": "''" - }, - "utc_offset": { - "name": "utc_offset", - "type": "real", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 9 - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "allnet_arcade_ip": { - "name": "allnet_arcade_ip", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "autoincrement": true - }, - "arcade_id": { - "name": "arcade_id", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "ip": { - "name": "ip", - "type": "text(15)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "allnet_arcade_ip_ip_unique": { - "name": "allnet_arcade_ip_ip_unique", - "columns": [ - "ip" - ], - "isUnique": true - } - }, - "foreignKeys": { - "allnet_arcade_ip_arcade_id_allnet_arcade_id_fk": { - "name": "allnet_arcade_ip_arcade_id_allnet_arcade_id_fk", - "tableFrom": "allnet_arcade_ip", - "tableTo": "allnet_arcade", - "columnsFrom": [ - "arcade_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "allnet_machine": { - "name": "allnet_machine", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "autoincrement": true - }, - "arcade_id": { - "name": "arcade_id", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "serial": { - "name": "serial", - "type": "text(11)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "game": { - "name": "game", - "type": "text(5)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "can_venue_hop": { - "name": "can_venue_hop", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "last_authenticated": { - "name": "last_authenticated", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "allnet_machine_serial_unique": { - "name": "allnet_machine_serial_unique", - "columns": [ - "serial" - ], - "isUnique": true - } - }, - "foreignKeys": { - "allnet_machine_arcade_id_allnet_arcade_id_fk": { - "name": "allnet_machine_arcade_id_allnet_arcade_id_fk", - "tableFrom": "allnet_machine", - "tableTo": "allnet_arcade", - "columnsFrom": [ - "arcade_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "event_log": { - "name": "event_log", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "autoincrement": true - }, - "timestamp": { - "name": "timestamp", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "system": { - "name": "system", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "type": { - "name": "type", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "severity": { - "name": "severity", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "message": { - "name": "message", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "details": { - "name": "details", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - } - }, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - } -} \ No newline at end of file diff --git a/src/external/db/drizzle/meta/_journal.json b/src/external/db/drizzle/meta/_journal.json deleted file mode 100644 index 4b27e44..0000000 --- a/src/external/db/drizzle/meta/_journal.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "version": "5", - "dialect": "sqlite", - "entries": [ - { - "idx": 0, - "version": "5", - "when": 1700532948929, - "tag": "0000_ambitious_gorilla_man", - "breakpoints": true - }, - { - "idx": 1, - "version": "5", - "when": 1700570200478, - "tag": "0001_modern_stryfe", - "breakpoints": true - } - ] -} \ No newline at end of file diff --git a/src/external/db/entity/aimedb.ts b/src/external/db/entity/aimedb.ts new file mode 100644 index 0000000..18bed01 --- /dev/null +++ b/src/external/db/entity/aimedb.ts @@ -0,0 +1,60 @@ +import { ConstructableBaseEntity } from "../utils/constructable-base-entity"; +import { + Entity, + PrimaryGeneratedColumn, + Column, + ManyToOne, + CreateDateColumn, + OneToMany, +} from "typeorm"; +import { integer } from "types/misc"; + +@Entity("aimedb_user") +export class AimeUser extends ConstructableBaseEntity { + @PrimaryGeneratedColumn() + id!: integer; + + @CreateDateColumn() + createdDate!: Date; + + @OneToMany(() => AimeCard, (card) => card.user) + cards!: Array; +} + +@Entity("aimedb_card") +export class AimeCard extends ConstructableBaseEntity { + @PrimaryGeneratedColumn() + id!: integer; + + @ManyToOne(() => AimeUser, (user) => user.cards, { eager: true, nullable: true }) + user!: AimeUser | null; + + @Column({ unique: true, length: 20 }) + accessCode!: string; + + @CreateDateColumn() + createdDate!: Date; + + @Column({ type: "boolean", default: false }) + isLocked!: boolean; + + @Column({ type: "boolean", default: false }) + isBanned!: boolean; +} + +export class FelicaBaseLookup extends ConstructableBaseEntity { + @PrimaryGeneratedColumn() + id!: integer; + + @Column({ unique: true, length: 16 }) + idm!: string; + + @Column({ unique: true, length: 20 }) + accessCode!: string; +} + +@Entity("aimedb_felica_mobile_lookup") +export class FelicaMobileLookup extends FelicaBaseLookup {} + +@Entity("aimedb_felica_card_lookup") +export class FelicaCardLookup extends FelicaBaseLookup {} diff --git a/src/external/db/entity/allnet.ts b/src/external/db/entity/allnet.ts new file mode 100644 index 0000000..934506a --- /dev/null +++ b/src/external/db/entity/allnet.ts @@ -0,0 +1,57 @@ +import { ConstructableBaseEntity } from "../utils/constructable-base-entity"; +import { Entity, PrimaryGeneratedColumn, Column, OneToMany, OneToOne } from "typeorm"; +import { integer } from "types/misc"; + +@Entity("allnet_arcade") +export class Arcade extends ConstructableBaseEntity { + @PrimaryGeneratedColumn() + id!: integer; + + @Column({ length: 60 }) + name!: string; + + @Column({ length: 40 }) + nickname!: string; + + @Column({ length: 3 }) + country!: string; + + @Column() + regionId!: integer; + + @Column({ length: 48 }) + regionName0!: string; + + @Column({ length: 48 }) + regionName1!: string; + + @Column({ length: 48 }) + regionName2!: string; + + @Column({ length: 48 }) + regionName3!: string; + + @OneToMany(() => Machine, (machine) => machine.arcade) + machines!: Array; +} + +@Entity("allnet_machine") +export class Machine extends ConstructableBaseEntity { + @PrimaryGeneratedColumn() + id!: integer; + + @OneToOne(() => Arcade) + arcade!: Arcade; + + @Column({ length: 11, unique: true }) + serial!: string; + + @Column({ length: 5 }) + game!: string; + + @Column({ default: false }) + canVenueHop!: boolean; + + @Column({ type: "datetime", nullable: true }) + lastAuthenticated!: Date | null; +} diff --git a/src/external/db/entity/base.ts b/src/external/db/entity/base.ts new file mode 100644 index 0000000..c7e0d94 --- /dev/null +++ b/src/external/db/entity/base.ts @@ -0,0 +1,27 @@ +import { ConstructableBaseEntity } from "../utils/constructable-base-entity"; +import { Column, CreateDateColumn, Entity, PrimaryGeneratedColumn } from "typeorm"; +import { integer } from "types/misc"; + +@Entity("event_log") +export class EventLog extends ConstructableBaseEntity { + @PrimaryGeneratedColumn() + id!: integer; + + @CreateDateColumn() + datetime!: Date; + + @Column({ type: "text" }) + system!: string; + + @Column({ type: "text" }) + type!: string; + + @Column({ length: 10 }) + severity!: string; + + @Column({ type: "text" }) + message!: string; + + @Column({ type: "simple-json" }) + details!: Record; +} diff --git a/src/external/db/entity/chunithm/profile.ts b/src/external/db/entity/chunithm/profile.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/external/db/entity/chunithm/static.ts b/src/external/db/entity/chunithm/static.ts new file mode 100644 index 0000000..dbdf1e4 --- /dev/null +++ b/src/external/db/entity/chunithm/static.ts @@ -0,0 +1,64 @@ +import { ConstructableBaseEntity } from "../../utils/constructable-base-entity"; +import { + Entity, + PrimaryGeneratedColumn, + Column, + ManyToOne, + CreateDateColumn, + OneToMany, + Unique, +} from "typeorm"; +import { integer } from "types/misc"; + +@Entity("chunithm_static_events") +@Unique(["version", "eventId"]) +export class ChunithmStaticEvent extends ConstructableBaseEntity { + @PrimaryGeneratedColumn() + id!: integer; + + @Column() + version!: integer; + + @Column() + eventId!: integer; + + @Column() + type!: integer; + + @Column({ type: "text" }) + name!: string; + + @Column({ type: "datetime", default: () => "CURRENT_TIMESTAMP" }) + startDate!: Date; + + @Column({ type: "boolean", default: true }) + enabled!: boolean; +} + +@Entity("chunithm_static_events") +@Unique(["version", "chargeId"]) +export class ChunithmStaticCharge extends ConstructableBaseEntity { + @PrimaryGeneratedColumn() + id!: integer; + + @Column() + version!: integer; + + @Column() + chargeId!: integer; + + @Column({ type: "text" }) + name!: string; + + @Column() + expirationDays!: integer; + + @Column() + consumeType!: integer; + + @Column({ type: "boolean" }) + sellingAppeal!: boolean; + + @Column({ type: "boolean", default: true }) + enabled!: boolean; +} diff --git a/src/external/db/schemas/aimedb.ts b/src/external/db/schemas/aimedb.ts deleted file mode 100644 index 6c970e1..0000000 --- a/src/external/db/schemas/aimedb.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { integer, sqliteTable, text, unique } from "drizzle-orm/sqlite-core"; - -export const felicaCardLookup = sqliteTable( - "aimedb_felica_card_lookup", - { - id: integer("id").primaryKey({ autoIncrement: true }), - idm: text("idm", { length: 16 }).notNull(), - accessCode: text("access_code", { length: 20 }).notNull(), - }, - (t) => ({ - unqIdm: unique().on(t.idm), - unqAc: unique().on(t.accessCode), - }) -); - -export type FelicaCardLookup = typeof felicaMobileLookup.$inferSelect; -export type NewFelicaCardLookup = typeof felicaMobileLookup.$inferSelect; - -export const felicaMobileLookup = sqliteTable( - "aimedb_felica_mobile_lookup", - { - id: integer("id").primaryKey({ autoIncrement: true }), - idm: text("idm", { length: 16 }).notNull(), - accessCode: text("access_code", { length: 20 }).notNull(), - }, - (t) => ({ - unqIdm: unique().on(t.idm), - unqAc: unique().on(t.accessCode), - }) -); - -export type FelicaMobileLookup = typeof felicaMobileLookup.$inferSelect; -export type NewFelicaMobileLookup = typeof felicaMobileLookup.$inferInsert; - -export const user = sqliteTable("aimedb_user", { - id: integer("id").primaryKey({ autoIncrement: true }), - createdDate: integer("created_date", { mode: "timestamp" }) - .notNull() - .$default(() => new Date()), - lastLoginDate: integer("last_login_date", { mode: "timestamp" }) - .notNull() - .$default(() => new Date()), - suspendExpirationDate: integer("suspend_expiration_date", { mode: "timestamp" }), -}); - -export type AimeUser = typeof user.$inferSelect; -export type NewAimeUser = typeof user.$inferInsert; - -export const card = sqliteTable( - "aimedb_card", - { - id: integer("id").primaryKey({ autoIncrement: true }), - userId: integer("user_id").references(() => user.id), - accessCode: text("access_code", { length: 20 }).notNull(), - createdDate: integer("created_date", { mode: "timestamp" }) - .notNull() - .$default(() => new Date()), - lastLoginDate: integer("last_login_date", { mode: "timestamp" }) - .notNull() - .$default(() => new Date()), - isLocked: integer("is_locked", { mode: "boolean" }).default(false).notNull(), - isBanned: integer("is_banned", { mode: "boolean" }).default(false).notNull(), - }, - (t) => ({ - unqAc: unique().on(t.accessCode), - }) -); diff --git a/src/external/db/schemas/allnet.ts b/src/external/db/schemas/allnet.ts deleted file mode 100644 index 4a640c9..0000000 --- a/src/external/db/schemas/allnet.ts +++ /dev/null @@ -1,56 +0,0 @@ -/** - * In theory you should be able to just modify the imports here if you want to - * use a different database driver. - */ -import { integer, text, real, sqliteTable } from "drizzle-orm/sqlite-core"; - -export const arcade = sqliteTable("allnet_arcade", { - id: integer("id").primaryKey({ autoIncrement: true }), - - name: text("name", { length: 60 }).default("Random arcade at nowhere"), - nickname: text("nickname", { length: 40 }).default("Please send help"), - country: text("country", { length: 3 }).default("JPN"), - - /** - * Largest to smallest units of administrative division - */ - regionId: integer("region_id").default(1), - regionName0: text("region_name0", { length: 48 }).default("W"), - regionName1: text("region_name1", { length: 48 }).default(""), - regionName2: text("region_name2", { length: 48 }).default(""), - regionName3: text("region_name3", { length: 48 }).default(""), - - /** - * Client timezone. There's probably no arcades that span - * 2 timezones, right...? - */ - utcOffset: real("utc_offset").default(9), -}); - -export type Arcade = typeof arcade.$inferSelect; -export type NewArcade = typeof arcade.$inferInsert; - -export const arcadeIp = sqliteTable("allnet_arcade_ip", { - id: integer("id").primaryKey({ autoIncrement: true }), - - arcade_id: integer("arcade_id").references(() => arcade.id), - ip: text("ip", { length: 15 }).unique(), -}); - -export type ArcadeIp = typeof arcadeIp.$inferSelect; -export type NewArcadeIp = typeof arcadeIp.$inferInsert; - -export const machine = sqliteTable("allnet_machine", { - id: integer("id").primaryKey({ autoIncrement: true }), - arcade_id: integer("arcade_id").references(() => arcade.id), - - serial: text("serial", { length: 11 }).unique(), - game: text("game", { length: 5 }), - - canVenueHop: integer("can_venue_hop", { mode: "boolean" }), - - lastAuthenticated: integer("last_authenticated", { mode: "timestamp" }), -}); - -export type Machine = typeof machine.$inferSelect; -export type NewMachine = typeof machine.$inferInsert; diff --git a/src/external/db/schemas/base.ts b/src/external/db/schemas/base.ts deleted file mode 100644 index 5862679..0000000 --- a/src/external/db/schemas/base.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { integer, text, sqliteTable } from "drizzle-orm/sqlite-core"; - -export const eventLog = sqliteTable("event_log", { - id: integer("id").primaryKey({ autoIncrement: true }), - timestamp: integer("timestamp", { mode: "timestamp" }) - .notNull() - .$default(() => new Date()), - system: text("system").notNull(), - type: text("type").notNull(), - severity: text("severity").notNull(), - message: text("message"), - details: text("details", { mode: "json" }), -}); - -export type EventLog = typeof eventLog.$inferSelect; -export type NewEventLog = typeof eventLog.$inferInsert; diff --git a/src/external/db/schemas/index.ts b/src/external/db/schemas/index.ts deleted file mode 100644 index eeab0b1..0000000 --- a/src/external/db/schemas/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./aimedb"; -export * from "./allnet"; -export * from "./base"; diff --git a/src/external/db/utils/constructable-base-entity.ts b/src/external/db/utils/constructable-base-entity.ts new file mode 100644 index 0000000..a95ff42 --- /dev/null +++ b/src/external/db/utils/constructable-base-entity.ts @@ -0,0 +1,7 @@ +import { BaseEntity } from "typeorm"; + +export class ConstructableBaseEntity extends BaseEntity { + static construct(this: new () => T, params: Partial): T { + return Object.assign(new this(), params); + } +} diff --git a/src/servers/aimedb/utils/misc.ts b/src/lib/constants/aimedb.ts similarity index 95% rename from src/servers/aimedb/utils/misc.ts rename to src/lib/constants/aimedb.ts index 4737a7b..4d941fe 100644 --- a/src/servers/aimedb/utils/misc.ts +++ b/src/lib/constants/aimedb.ts @@ -63,6 +63,8 @@ export const enum PortalRegistration { } export const enum CompanyCodes { + /** Not really, could be FeliCa Mobile. */ + INVALID = 0, SEGA = 1, BANDAI_NAMCO = 2, KONAMI = 3, diff --git a/src/lib/constants/felica.ts b/src/lib/constants/felica.ts new file mode 100644 index 0000000..e306ae7 --- /dev/null +++ b/src/lib/constants/felica.ts @@ -0,0 +1,14 @@ +import { CompanyCodes } from "./aimedb"; + +export const FELICA_MOBILE_IC_TYPES = [ + 0x06, 0x07, 0x10, 0x12, 0x13, 0x14, 0x15, 0x17, 0x18, +] as const; +export const FELICA_CARD_IC_TYPES = [0x20, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7] as const; + +export const DATA_FORMAT_CODE_MAP: Record = { + 0x002a: CompanyCodes.BANDAI_NAMCO, + 0x003a: CompanyCodes.BANDAI_NAMCO, + 0x8ca2: CompanyCodes.BANDAI_NAMCO, + 0x0068: CompanyCodes.KONAMI, + 0x0078: CompanyCodes.SEGA, +}; diff --git a/src/lib/constants/game-versions.ts b/src/lib/constants/game-versions.ts new file mode 100644 index 0000000..20d6818 --- /dev/null +++ b/src/lib/constants/game-versions.ts @@ -0,0 +1,19 @@ +export const enum ChunithmVersions { + CHUNITHM = 100, + CHUNITHM_PLUS = 105, + AIR = 110, + AIR_PLUS = 115, + STAR = 120, + STAR_PLUS = 125, + AMAZON = 130, + AMAZON_PLUS = 135, + CRYSTAL = 140, + CRYSTAL_PLUS = 145, + /** + * @note PARADISE and PARADISE LOST share the same game version. + */ + PARADISE = 150, + NEW = 200, + NEW_PLUS = 205, + SUN = 210, +} diff --git a/src/servers/allnet/middleware/request-logger.ts b/src/lib/middleware/request-logger.ts similarity index 100% rename from src/servers/allnet/middleware/request-logger.ts rename to src/lib/middleware/request-logger.ts diff --git a/src/lib/setup/config.ts b/src/lib/setup/config.ts index 4f07e61..7703d6b 100644 --- a/src/lib/setup/config.ts +++ b/src/lib/setup/config.ts @@ -24,34 +24,89 @@ const config: unknown = JSON5.parse(configFile); const zod16bitNumber = z.number().gt(0).lte(65535); const zodLogLevel = z.enum(["crit", "debug", "error", "info", "verbose", "warn"]); -const zodOptionalHexString16 = z - .string() - .length(16) - .regex(/^[0-9a-z]+$/iu, "value is not a hex string") - .optional(); +const zodHexString = z.string().regex(/^[0-9a-z]+$/iu, "value is not a hex string"); +const zodHexString16 = zodHexString.length(16); const configSchema = z.object({ - NAME: z.string(), - DATABASE_PATH: z.string(), - LISTEN_ADDRESS: z.string().ip(), + NAME: z.string().default("Kozukata Toa"), + DATABASE_PATH: z.string().default("data/db.sqlite3"), + LISTEN_ADDRESS: z.string().ip().default("0.0.0.0"), LOGGER_CONFIG: z.object({ - LOG_LEVEL: zodLogLevel, - CONSOLE: z.boolean(), - FOLDER: z.string().optional(), + LOG_LEVEL: zodLogLevel.default("info"), + CONSOLE: z.boolean().default(true), + FOLDER: z.string().default("logs"), }), ALLNET_CONFIG: z.object({ - ENABLED: z.boolean(), - PORT: zod16bitNumber, - ALLOW_UNREGISTERED_SERIALS: z.boolean(), + ENABLED: z.boolean().default(true), + PORT: zod16bitNumber.default(80), + ALLOW_UNREGISTERED_SERIALS: z.boolean().default(true), UPDATE_CFG_FOLDER: z.string().optional(), }), AIMEDB_CONFIG: z.object({ - ENABLED: z.boolean(), - PORT: zod16bitNumber, - KEY: z.string().length(16).optional(), - AIME_MOBILE_CARD_KEY: zodOptionalHexString16, - RESERVED_CARD_PREFIX: z.string().length(5).optional(), - RESERVED_CARD_KEY: zodOptionalHexString16, + ENABLED: z.boolean().default(true), + PORT: zod16bitNumber.default(22345), + KEY: z.string().length(16).default("Copyright(C)SEGA"), + AIME_MOBILE_CARD_KEY: zodHexString16.default("5CD3E81B9024F67A"), + RESERVED_CARD_PREFIX: z.string().length(5).default("01053"), + RESERVED_CARD_KEY: zodHexString16.default("E8179645DB3FC02A"), + }), + TITLES_CONFIG: z.object({ + ENABLED: z.boolean().default(true), + PORT: zod16bitNumber.default(8080), + HOSTNAME: z.string().default("localhost"), + }), + CHUNITHM_CONFIG: z.object({ + ENABLE: z.boolean().default(true), + MODS: z + .object({ + TEAM_NAME: z.string().optional(), + USE_LOGIN_BONUS: z.boolean().default(false), + FORCE_UNLOCK_ALL: z.boolean().default(false), + }) + .default({ USE_LOGIN_BONUS: false, FORCE_UNLOCK_ALL: false }), + VERSIONS: z + .record( + z.object({ + rom: z.string(), + data: z.string(), + }) + ) + .default({ + "200": { + rom: "2.00.00", + data: "2.00.00", + }, + "205": { + rom: "2.05.00", + data: "2.05.00", + }, + "210": { + rom: "2.10.00", + data: "2.10.00", + }, + }), + CRYPTO: z + .object({ + ENCRYPTED_ONLY: z.boolean().default(false), + KEYS: z.record(z.array(zodHexString).min(2).max(3)).optional(), + }) + .refine((arg) => { + if (arg.ENCRYPTED_ONLY) { + return !!arg.KEYS && Object.keys(arg.KEYS).length >= 1; + } + + return true; + }, "Must provide keys for at least one version if running in encrypted only mode.") + .default({ + ENCRYPTED_ONLY: false, + KEYS: { + "210": [ + "75695c3d265f434c3953454c5830522b4b3c4d7b42482a312e5627216b2b4060", + "31277c37707044377141595058345a6b", + "04780206ca5f36f4", + ], + }, + }), }), }); @@ -64,3 +119,23 @@ if (!parseResult.success) { } export const Config = parseResult.data; + +// Environment Variable Validation + +const nodeEnv = process.env.NODE_ENV ?? ""; + +if (!nodeEnv) { + logger.error(`No NODE_ENV specified in environment. Terminating.`); + process.exit(1); +} + +if (!["dev", "production", "staging", "test"].includes(nodeEnv)) { + logger.error( + `Invalid NODE_ENV set in environment. Expected dev, production, test or staging. Got ${nodeEnv}.` + ); + process.exit(1); +} + +export const Environment = { + nodeEnv: nodeEnv as "dev" | "production" | "staging" | "test", +}; diff --git a/src/main.ts b/src/main.ts index 9185728..ee24fd2 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,19 +1,41 @@ -import { aimeDbServerFactory, allnetServer } from "./servers/index"; +import { aimeDbServerFactory, allnetServer, titleServer } from "./servers/index"; +import { AppDataSource } from "external/db/data-source"; import CreateLogCtx from "lib/logger/logger"; import { Config } from "lib/setup/config"; import net from "net"; +import "reflect-metadata"; const logger = CreateLogCtx(__filename); logger.info(`Booting ${Config.NAME}.`, { bootInfo: true }); logger.info(`Log level is set to ${Config.LOGGER_CONFIG.LOG_LEVEL}.`, { bootInfo: true }); -if (Config.ALLNET_CONFIG.ENABLED) { - allnetServer.listen(Config.ALLNET_CONFIG.PORT, Config.LISTEN_ADDRESS); -} +const start = process.hrtime.bigint(); -if (Config.AIMEDB_CONFIG.ENABLED) { - const server = net.createServer(aimeDbServerFactory()); +logger.info("Initializing database connection..."); +void AppDataSource.initialize().then(() => { + const end = process.hrtime.bigint(); - server.listen(Config.AIMEDB_CONFIG.PORT, Config.LISTEN_ADDRESS); -} + logger.info(`Database connected in ${(end - start) / 1000000n}ms`); + + if (Config.ALLNET_CONFIG.ENABLED) { + logger.info( + `Starting ALL.Net server on ${Config.LISTEN_ADDRESS}:${Config.ALLNET_CONFIG.PORT}.` + ); + allnetServer.listen(Config.ALLNET_CONFIG.PORT, Config.LISTEN_ADDRESS); + } + + if (Config.TITLES_CONFIG.ENABLED) { + logger.info( + `Starting title server on ${Config.LISTEN_ADDRESS}:${Config.ALLNET_CONFIG.PORT}.` + ); + titleServer.listen(Config.TITLES_CONFIG.PORT, Config.LISTEN_ADDRESS); + } + + if (Config.AIMEDB_CONFIG.ENABLED) { + const server = net.createServer(aimeDbServerFactory()); + + logger.info(`Starting AimeDB on ${Config.LISTEN_ADDRESS}:${Config.ALLNET_CONFIG.PORT}.`); + server.listen(Config.AIMEDB_CONFIG.PORT, Config.LISTEN_ADDRESS); + } +}); diff --git a/src/servers/aimedb/handlers/aime-account.ts b/src/servers/aimedb/handlers/aime-account.ts index b86bc21..8b5c877 100644 --- a/src/servers/aimedb/handlers/aime-account.ts +++ b/src/servers/aimedb/handlers/aime-account.ts @@ -5,10 +5,8 @@ import { AimeAccountExtendedQueryStruct, } from "../types/aime-account"; import { PacketHeaderStruct } from "../types/header"; -import { CommandId, PortalRegistration, ResultCodes } from "../utils/misc"; -import { eq } from "drizzle-orm"; -import { db } from "external/db/db"; -import { card } from "external/db/schemas"; +import { CommandId, PortalRegistration, ResultCodes } from "../../../lib/constants/aimedb"; +import { AimeCard } from "external/db/entity/aimedb"; import CreateLogCtx from "lib/logger/logger"; import type { AimeDBHandlerFn } from "../types/handlers"; @@ -39,25 +37,23 @@ export const GetAimeAccountHandler: AimeDBHandlerFn<"AimeAccountResponse"> = asy const accessCode = Buffer.from(req.accessCode).toString("hex"); - const cardRow = await db - .select() - .from(card) - .where(eq(card.accessCode, accessCode)) - .then((r) => r[0]); + const card = await AimeCard.findOne({ + where: { accessCode }, + }); - if (!cardRow) { + if (!card) { return resp; } - if (cardRow.isBanned && cardRow.isLocked) { + if (card.isBanned && card.isLocked) { header.result = ResultCodes.BAN_SYSTEM_AND_USER_LOCK; - } else if (cardRow.isBanned) { + } else if (card.isBanned) { header.result = ResultCodes.BAN_SYSTEM_LOCK; - } else if (cardRow.isLocked) { + } else if (card.isLocked) { header.result = ResultCodes.USER_LOCK; } - resp.accountId = cardRow.id; + resp.accountId = card.id; return resp; }; @@ -86,31 +82,29 @@ export const RegisterAimeAccountHandler: AimeDBHandlerFn<"AimeAccountResponse"> const accessCode = Buffer.from(req.accessCode).toString("hex"); - const cardRow = await db - .select() - .from(card) - .where(eq(card.accessCode, accessCode)) - .then((r) => r[0]); + const card = await AimeCard.findOne({ + where: { + accessCode, + }, + }); - if (cardRow) { + if (card) { header.result = ResultCodes.ID_ALREADY_REGISTERED; - resp.accountId = cardRow.id; + resp.accountId = card.id; return resp; } - const newCardRow = await db - .insert(card) - .values({ accessCode }) - .returning() - .then((r) => r[0]); + const newCard = AimeCard.construct({ accessCode }); - if (!newCardRow) { - logger.crit("Failed to insert new lookup entry into the database.", { accessCode }); + try { + await newCard.save(); + } catch (err) { + logger.crit("Failed to insert new lookup entry into the database.", { err }); header.result = ResultCodes.UNKNOWN_ERROR; return resp; } - resp.accountId = newCardRow.id; + resp.accountId = newCard.id; return resp; }; @@ -126,7 +120,6 @@ export const GetAimeAccountExtendedHandler: AimeDBHandlerFn<"AimeAccountExtended const resp = new AimeAccountExtendedResponseStruct(); // TODO: Actually handle portal state when we get a webUI - // TODO: What the fuck is an auth key resp.portalRegistered = PortalRegistration.UNREGISTERED; resp.accountId = -1; @@ -140,25 +133,23 @@ export const GetAimeAccountExtendedHandler: AimeDBHandlerFn<"AimeAccountExtended const accessCode = Buffer.from(req.accessCode).toString("hex"); - const cardRow = await db - .select() - .from(card) - .where(eq(card.accessCode, accessCode)) - .then((r) => r[0]); + const card = await AimeCard.findOne({ + where: { accessCode }, + }); - if (!cardRow) { + if (!card) { resp.accountId = -1; return resp; } - if (cardRow.isBanned && cardRow.isLocked) { + if (card.isBanned && card.isLocked) { header.result = ResultCodes.BAN_SYSTEM_AND_USER_LOCK; - } else if (cardRow.isBanned) { + } else if (card.isBanned) { header.result = ResultCodes.BAN_SYSTEM_LOCK; - } else if (cardRow.isLocked) { + } else if (card.isLocked) { header.result = ResultCodes.USER_LOCK; } - resp.accountId = cardRow.id; + resp.accountId = card.id; return resp; }; diff --git a/src/servers/aimedb/handlers/aime-log.ts b/src/servers/aimedb/handlers/aime-log.ts index 629700e..35dd55e 100644 --- a/src/servers/aimedb/handlers/aime-log.ts +++ b/src/servers/aimedb/handlers/aime-log.ts @@ -5,9 +5,9 @@ import { StatusLogStruct, } from "../types/aime-log"; import { PacketHeaderStruct } from "../types/header"; -import { CommandId, LogStatus, ResultCodes } from "../utils/misc"; -import { db } from "external/db/db"; -import { eventLog } from "external/db/schemas"; +import { CommandId, LogStatus, ResultCodes } from "../../../lib/constants/aimedb"; +import { AppDataSource } from "external/db/data-source"; +import { EventLog } from "external/db/entity/base"; import CreateLogCtx from "lib/logger/logger"; import type { AimeDBHandlerFn } from "../types/handlers"; @@ -27,13 +27,15 @@ export const StatusLogHandler: AimeDBHandlerFn = async (header, data) => { return null; } - await db.insert(eventLog).values({ + const eventLog = EventLog.construct({ system: "aimedb", - type: `AIMEDB_LOG_${statusName}`, + type: `LOG_${statusName}`, severity: "info", details: { aimeId: req.aimeId }, }); + await eventLog.save(); + return null; }; @@ -51,9 +53,9 @@ export const AimeLogHandler: AimeDBHandlerFn = async (header, data) => { return null; } - await db.insert(eventLog).values({ + const eventLog = EventLog.construct({ system: "aimedb", - type: `AIMEDB_LOG_${statusName}`, + type: `LOG_${statusName}`, severity: "info", details: { aimeId: req.aimeId, @@ -64,6 +66,8 @@ export const AimeLogHandler: AimeDBHandlerFn = async (header, data) => { }, }); + await eventLog.save(); + return null; }; @@ -78,7 +82,7 @@ export const AimeExtendedLogHandler: AimeDBHandlerFn<"AimeLogExtendedResponse"> const req = new ExtendedAimeLogStruct(data); const resp = new AimeLogExtendedResponseStruct(); - await db.transaction(async (tx) => { + await AppDataSource.transaction(async (em) => { const ops = []; for (let i = 0; i < req.count; i++) { @@ -100,21 +104,20 @@ export const AimeExtendedLogHandler: AimeDBHandlerFn<"AimeLogExtendedResponse"> continue; } - ops.push( - tx.insert(eventLog).values({ - system: "aimedb", - type: `AIMEDB_LOG_${statusName}`, - severity: "info", - details: { - aimeId: entry.aimeId, - userId: entry.userId.toString(), - creditCount: entry.creditCount, - betCount: entry.betCount, - wonCount: entry.wonCount, - }, - }) - ); - resp.result[i] = 1; + const eventLog = EventLog.construct({ + system: "aimedb", + type: `LOG_${statusName}`, + severity: "info", + details: { + aimeId: entry.aimeId, + userId: entry.userId.toString(), + creditCount: entry.creditCount, + betCount: entry.betCount, + wonCount: entry.wonCount, + }, + }); + + ops.push(em.save(eventLog)); } await Promise.all(ops); diff --git a/src/servers/aimedb/handlers/campaign.ts b/src/servers/aimedb/handlers/campaign.ts index 1fa15c0..64f7380 100644 --- a/src/servers/aimedb/handlers/campaign.ts +++ b/src/servers/aimedb/handlers/campaign.ts @@ -5,7 +5,7 @@ import { OldCampaignResponseStruct, } from "../types/campaign"; import { PacketHeaderStruct } from "../types/header"; -import { CommandId, ResultCodes } from "../utils/misc"; +import { CommandId, ResultCodes } from "../../../lib/constants/aimedb"; import type { AimeDBHandlerFn } from "../types/handlers"; export const GetCampaignInfoHandler: AimeDBHandlerFn<"CampaignResponse" | "OldCampaignResponse"> = ( diff --git a/src/servers/aimedb/handlers/felica-conversion.ts b/src/servers/aimedb/handlers/felica-conversion.ts index fcf9323..12e28cd 100644 --- a/src/servers/aimedb/handlers/felica-conversion.ts +++ b/src/servers/aimedb/handlers/felica-conversion.ts @@ -17,29 +17,29 @@ import { import { PacketHeaderStruct } from "../types/header"; import { CalculateAccessCode } from "../utils/access-code"; import { IsSupportedFelicaMobile, IsSupportedFelica } from "../utils/felica"; -import { CommandId, CompanyCodes, PortalRegistration, ResultCodes } from "../utils/misc"; -import { desc, eq } from "drizzle-orm"; -import { db } from "external/db/db"; -import { card, felicaCardLookup, felicaMobileLookup } from "external/db/schemas/index"; +import { AimeCard, FelicaCardLookup, FelicaMobileLookup } from "external/db/entity/aimedb"; +import { CommandId, CompanyCodes, PortalRegistration, ResultCodes } from "lib/constants/aimedb"; +import { DATA_FORMAT_CODE_MAP } from "lib/constants/felica"; import CreateLogCtx from "lib/logger/logger"; import { Config } from "lib/setup/config"; import type { AimeDBHandlerFn } from "../types/handlers"; +import type { ValidFeliCaIcTypes } from "../utils/felica"; +import type { FelicaBaseLookup } from "external/db/entity/aimedb"; const logger = CreateLogCtx(__filename); -async function createAndInsertNewAccessCode( - table: typeof felicaCardLookup | typeof felicaMobileLookup, +async function generateAndInsertNewAccessCode( + table: T, cardType: "FeliCa Card" | "FeliCa Mobile", idm: bigint, prefix: string, key: string -) { - const mostRecentRow = await db - .select() - .from(table) - .orderBy(desc(table.id)) - .limit(1) - .then((r) => r[0]); +): Promise { + const mostRecentRow = await table.findOne({ + order: { + id: "desc", + }, + }); const nextId = mostRecentRow ? mostRecentRow.id + 1 : 1; @@ -50,21 +50,59 @@ async function createAndInsertNewAccessCode( accessCode, }); - const value = { idm: idm.toString(16), accessCode }; + const card = table.construct({ idm: idm.toString(16), accessCode }); - const result = await db - .insert(felicaCardLookup) - .values(value) - .returning() - .then((r) => r[0]); - - if (!result) { - logger.crit("Failed to insert new lookup entry into the database.", value); + try { + await card.save(); + } catch (err) { + logger.error("Failed to insert new lookup entry into the database.", { err }); return null; } - return result; + return card; +} + +async function generateNewFeliCa(idm: bigint, icType: ValidFeliCaIcTypes) { + if (!IsSupportedFelica(icType)) { + throw new Error("Invalid IC type."); + } + + if (IsSupportedFelicaMobile(icType)) { + if (!Config.AIMEDB_CONFIG.AIME_MOBILE_CARD_KEY) { + logger.error( + "AIMEDB_CONFIG.AIME_MOBILE_CARD_KEY is not set in config file. Cannot generate a new access code.", + { idm, icType } + ); + + return null; + } + + return generateAndInsertNewAccessCode( + FelicaMobileLookup, + "FeliCa Mobile", + idm, + "01035", + Config.AIMEDB_CONFIG.AIME_MOBILE_CARD_KEY + ); + } + + if (!Config.AIMEDB_CONFIG.RESERVED_CARD_KEY || !Config.AIMEDB_CONFIG.RESERVED_CARD_PREFIX) { + logger.error( + "AIMEDB_CONFIG.RESERVED_CARD_KEY or AIMEDB_CONFIG.RESERVED_CARD_PREFIX is not set in config file. Cannot generate a new access code.", + { idm, icType } + ); + + return null; + } + + return generateAndInsertNewAccessCode( + FelicaCardLookup, + "FeliCa Card", + idm, + Config.AIMEDB_CONFIG.RESERVED_CARD_PREFIX, + Config.AIMEDB_CONFIG.RESERVED_CARD_KEY + ); } // This is supposed to be just a lookup handler, but my guess is that most games assume that there @@ -82,44 +120,22 @@ export const FelicaLookupHandler: AimeDBHandlerFn<"FelicaLookupResponse"> = asyn const req = new FelicaLookupRequestStruct(data); const resp = new FelicaLookupResponseStruct(); - if (!IsSupportedFelica(req.osVer)) { + if (!IsSupportedFelica(req.icType)) { header.result = ResultCodes.INVALID_AIME_ID; resp.felicaIndex = -1; return resp; } - const table = IsSupportedFelicaMobile(req.osVer) ? felicaMobileLookup : felicaCardLookup; + const table = IsSupportedFelicaMobile(req.icType) ? FelicaMobileLookup : FelicaCardLookup; - let result = await db - .select() - .from(table) - .where(eq(table.idm, req.idm.toString(16))) - .then((r) => r[0]); + let result: FelicaBaseLookup | null = await table.findOne({ + where: { + idm: req.idm.toString(16), + }, + }); if (!result) { - // Exit early if card is FeliCa mobile, so the game can use the register endpoint - if (IsSupportedFelicaMobile(req.osVer)) { - resp.felicaIndex = -1; - return resp; - } - - if (!Config.AIMEDB_CONFIG.RESERVED_CARD_KEY || !Config.AIMEDB_CONFIG.RESERVED_CARD_PREFIX) { - logger.error( - "AIMEDB_CONFIG.RESERVED_CARD_KEY or AIMEDB_CONFIG.RESERVED_CARD_PREFIX is not set in config file. Cannot generate a new access code.", - { req } - ); - - header.result = ResultCodes.INVALID_AIME_ID; - return resp; - } - - const tmp = await createAndInsertNewAccessCode( - felicaCardLookup, - "FeliCa Card", - req.idm, - Config.AIMEDB_CONFIG.RESERVED_CARD_PREFIX, - Config.AIMEDB_CONFIG.RESERVED_CARD_KEY - ); + const tmp = await generateNewFeliCa(req.idm, req.icType); if (!tmp) { header.result = ResultCodes.UNKNOWN_ERROR; @@ -160,94 +176,46 @@ export const FelicaExtendedLookupHandler: AimeDBHandlerFn<"FelicaExtendedLookupR return resp; } - if (!IsSupportedFelica(req.osVer)) { + if (!IsSupportedFelica(req.icType)) { header.result = ResultCodes.INVALID_AIME_ID; return resp; } - let result; + const table = IsSupportedFelicaMobile(req.icType) ? FelicaMobileLookup : FelicaCardLookup; - if (IsSupportedFelicaMobile(req.osVer)) { - result = await db - .select() - .from(felicaMobileLookup) - .where(eq(felicaMobileLookup.idm, req.idm.toString(16))) - .leftJoin(card, eq(card.accessCode, felicaMobileLookup.accessCode)) - .then((r) => r[0]); - } else { - result = await db - .select() - .from(felicaCardLookup) - .where(eq(felicaCardLookup.idm, req.idm.toString(16))) - .leftJoin(card, eq(card.accessCode, felicaCardLookup.accessCode)) - .then((r) => r[0]); - } + const result: FelicaBaseLookup | null = await table.findOne({ + where: { + idm: req.idm.toString(16), + }, + }); + + let accessCode; if (result) { - const lookupResult = - "aimedb_felica_mobile_lookup" in result - ? result.aimedb_felica_mobile_lookup - : result.aimedb_felica_card_lookup; - const cardResult = result.aimedb_card; + accessCode = result.accessCode; + } else { + const row = await generateNewFeliCa(req.idm, req.icType); - // HACK: Since we cannot possibly know who made it (even AICC cards have - // the same manufacturer code `01:2e`!), we're just going to treat everything - // as a SEGA card. - resp.companyCode = CompanyCodes.SEGA; - resp.accessCode.set(Buffer.from(lookupResult.accessCode, "hex")); - - if (cardResult) { - resp.accountId = cardResult.id; - resp.portalRegistered = PortalRegistration.UNREGISTERED; + if (!row) { + header.result = ResultCodes.UNKNOWN_ERROR; + return resp; } - return resp; + accessCode = row.accessCode; } - // Assuming that FeliCa Mobile is handled by their own registration endpoint... - if (IsSupportedFelicaMobile(req.osVer)) { - return resp; - } + // HACK: What does official AimeDB do if the DFC is not valid? + resp.companyCode = DATA_FORMAT_CODE_MAP[req.dataFormatCode] ?? CompanyCodes.SEGA; + resp.accessCode.set(Buffer.from(accessCode, "hex")); - // Card is not in the lookup tables, register a new card... - if (!Config.AIMEDB_CONFIG.RESERVED_CARD_KEY || !Config.AIMEDB_CONFIG.RESERVED_CARD_PREFIX) { - logger.error( - "AIMEDB_CONFIG.RESERVED_CARD_KEY or AIMEDB_CONFIG.RESERVED_CARD_PREFIX is not set in config file. Cannot generate a new access code.", - { req } - ); + const maybeCard = await AimeCard.findOne({ + where: { accessCode }, + }); - header.result = ResultCodes.INVALID_AIME_ID; - return resp; - } - - const row = await createAndInsertNewAccessCode( - felicaCardLookup, - "FeliCa Card", - req.idm, - Config.AIMEDB_CONFIG.RESERVED_CARD_PREFIX, - Config.AIMEDB_CONFIG.RESERVED_CARD_KEY - ); - - if (!row) { - header.result = ResultCodes.UNKNOWN_ERROR; - return resp; - } - - // HACK: Since we cannot possibly know who made it (even AICC cards have - // the same manufacturer code `01:2e`!), we're just going to treat everything - // as a SEGA card. - resp.companyCode = CompanyCodes.SEGA; - resp.accessCode.set(Buffer.from(row.accessCode, "hex")); - - const cardResult = await db - .select() - .from(card) - .where(eq(card.accessCode, row.accessCode)) - .then((r) => r[0]); - - if (cardResult) { - resp.accountId = cardResult.id; + if (maybeCard) { + // TODO: Actually handle portal state when we get a webUI resp.portalRegistered = PortalRegistration.UNREGISTERED; + resp.accountId = maybeCard.id; } return resp; @@ -263,11 +231,11 @@ export const FelicaRegisterHandler: AimeDBHandlerFn<"FelicaLookupResponse"> = as const req = new FelicaLookupRequestStruct(data); const resp = new FelicaLookupResponseStruct(); - if (!IsSupportedFelicaMobile(req.osVer)) { + if (!IsSupportedFelicaMobile(req.icType)) { logger.error("Rejecting card because it is not FeliCa Mobile.", { idm: req.idm, - chipCode: req.chipCode, - osVer: req.osVer, + romType: req.romType, + icType: req.icType, timing: req.timing, }); @@ -276,12 +244,11 @@ export const FelicaRegisterHandler: AimeDBHandlerFn<"FelicaLookupResponse"> = as return resp; } - const result = await db - .select() - .from(felicaMobileLookup) - .where(eq(felicaMobileLookup.idm, req.idm.toString(16))) - .limit(1) - .then((r) => r[0]); + const result = await FelicaMobileLookup.findOne({ + where: { + idm: req.idm.toString(16), + }, + }); if (result) { header.result = ResultCodes.ID_ALREADY_REGISTERED; @@ -297,13 +264,13 @@ export const FelicaRegisterHandler: AimeDBHandlerFn<"FelicaLookupResponse"> = as { req } ); - header.result = ResultCodes.INVALID_AIME_ID; + header.result = ResultCodes.UNKNOWN_ERROR; resp.felicaIndex = -1; return resp; } - const row = await createAndInsertNewAccessCode( - felicaMobileLookup, + const row = await generateAndInsertNewAccessCode( + FelicaMobileLookup, "FeliCa Mobile", req.idm, "01035", diff --git a/src/servers/aimedb/handlers/index.ts b/src/servers/aimedb/handlers/index.ts index 98380dc..78b6e69 100644 --- a/src/servers/aimedb/handlers/index.ts +++ b/src/servers/aimedb/handlers/index.ts @@ -11,7 +11,7 @@ import { FelicaRegisterHandler, } from "./felica-conversion"; import { ServiceHealthCheckHandler } from "./status-check"; -import { CommandId } from "../utils/misc"; +import { CommandId } from "../../../lib/constants/aimedb"; import type { AimeDBHandlerFn, AimeDBReturnTypes } from "../types/handlers"; type CommandIdRequest = { diff --git a/src/servers/aimedb/handlers/status-check.ts b/src/servers/aimedb/handlers/status-check.ts index eff7012..cdfa850 100644 --- a/src/servers/aimedb/handlers/status-check.ts +++ b/src/servers/aimedb/handlers/status-check.ts @@ -1,5 +1,5 @@ import { PacketHeaderStruct } from "../types/header"; -import { CommandId, ResultCodes } from "../utils/misc"; +import { CommandId, ResultCodes } from "../../../lib/constants/aimedb"; import type { AimeDBHandlerFn } from "../types/handlers"; export const ServiceHealthCheckHandler: AimeDBHandlerFn = (header, _) => { diff --git a/src/servers/aimedb/index.ts b/src/servers/aimedb/index.ts index 3f991c5..1530e2e 100644 --- a/src/servers/aimedb/index.ts +++ b/src/servers/aimedb/index.ts @@ -1,7 +1,7 @@ import { AIMEDB_HANDLERS, EXPECTED_PACKET_LENGTH } from "./handlers"; import { PacketHeaderStruct } from "./types/header"; import { decryptPacket, encryptPacket } from "./utils/crypto"; -import { CommandId, ResultCodes } from "./utils/misc"; +import { CommandId, ResultCodes } from "../../lib/constants/aimedb"; import CreateLogCtx from "lib/logger/logger"; import { Config } from "lib/setup/config"; import { createHash } from "crypto"; @@ -124,7 +124,7 @@ const AimeDBServerFactory = () => { } if (header.keychipId === "ABCD1234567" || header.storeId === 0xfff0) { - logger.warning("Received request from uninitialized AMLib.", { + logger.warn("Received request from uninitialized AMLib.", { ip: socket.remoteAddress, header, body: packet.slice(0, 32).toString("hex"), diff --git a/src/servers/aimedb/types/aime-account.ts b/src/servers/aimedb/types/aime-account.ts index a17ebac..1f98b63 100644 --- a/src/servers/aimedb/types/aime-account.ts +++ b/src/servers/aimedb/types/aime-account.ts @@ -24,7 +24,7 @@ export const AimeAccountExtendedResponseStruct = new Struct("AimeAccountExtended .UInt32LE("accountId") .UInt8("portalRegistered") .UInt8Array("padding", 3) - .UInt8Array("authKey", 256) + .UInt8Array("segaIdAuthKey", 256) .UInt32LE("relationId1") .UInt32LE("relationId2") .compile(); diff --git a/src/servers/aimedb/types/felica-conversion.ts b/src/servers/aimedb/types/felica-conversion.ts index 61e9cfa..74ca864 100644 --- a/src/servers/aimedb/types/felica-conversion.ts +++ b/src/servers/aimedb/types/felica-conversion.ts @@ -2,8 +2,8 @@ import Struct from "typed-struct"; export const FelicaLookupRequestStruct = new Struct("FelicaLookupRequest") .BigUInt64LE("idm") - .UInt8("chipCode") - .UInt8("osVer") + .UInt8("romType") + .UInt8("icType") .UInt8Array("timing", 6) .compile(); @@ -16,15 +16,15 @@ export const FelicaLookupResponseStruct = new Struct("FelicaLookupResponse") export const FelicaExtendedLookupRequestStruct = new Struct("FelicaExtendedLookupRequest") .UInt8Array("randomChallenge", 16) .BigUInt64LE("idm") - .UInt8("chipCode") - .UInt8("osVer") + .UInt8("romType") + .UInt8("icType") .UInt8Array("timing", 6) .UInt8Array("cardKeyVersion", 16) .UInt8Array("writeCount", 16) .BigUInt64LE("maca") .UInt8("companyCode") .UInt8("readerFirmwareVersion") - .UInt16LE("DFC") + .UInt16LE("dataFormatCode") .UInt8Array("padding", 4) .compile(); @@ -36,5 +36,5 @@ export const FelicaExtendedLookupResponseStruct = new Struct("FelicaExtendedLook .UInt8("portalRegistered") .UInt8("companyCode") .UInt8Array("padding", 8) - .UInt8Array("authKey", 256) + .UInt8Array("segaIdAuthKey", 256) .compile(); diff --git a/src/servers/aimedb/utils/access-code.test.ts b/src/servers/aimedb/utils/access-code.test.ts new file mode 100644 index 0000000..5b42794 --- /dev/null +++ b/src/servers/aimedb/utils/access-code.test.ts @@ -0,0 +1,16 @@ +import { CalculateAccessCode, CalculateCardKey } from "./access-code"; +import t from "tap"; + +const TEST_CARD_KEY = "5B8CDAEF32960471"; + +t.test("#CalculateCardKey", (t) => { + t.equal(CalculateCardKey(1, TEST_CARD_KEY), "3653373"); + + t.end(); +}); + +t.test("#CalculateAccessCode", (t) => { + t.ok(CalculateAccessCode(1, "02019", TEST_CARD_KEY), "02019068568453653373"); + + t.end(); +}); diff --git a/src/servers/aimedb/utils/access-code.ts b/src/servers/aimedb/utils/access-code.ts index 5b59331..f44e7a7 100644 --- a/src/servers/aimedb/utils/access-code.ts +++ b/src/servers/aimedb/utils/access-code.ts @@ -2,19 +2,29 @@ import { Solitaire } from "./crypto"; import { createHash } from "crypto"; import type { integer } from "types/misc"; -function reverseString(data: string) { - return Array.from(data).reverse().join(""); -} - -function CalculateCardKey(serial: integer, key: string) { +/* eslint-disable no-bitwise */ +export function CalculateCardKey(serial: integer, key: string) { + const keyBuffer = Buffer.from(key, "hex"); const paddedSerial = serial.toString().padStart(8, "0"); - const realDigest = createHash("md5").update(paddedSerial).digest(); + const digest = createHash("md5").update(paddedSerial).digest(); - const digest = new Array(16); + let hash = 0; + let num = 0; + let storedBits = 0; for (let i = 0; i < 16; i++) { - const idx = Number(`0x${key[i]}`); - const nib = realDigest[idx]; + // Extract the i-th hexadecimal digit of the key... + const byte = keyBuffer[Math.trunc(i / 2)]; + + if (byte === undefined) { + throw new Error("Buffer.from returned an undefined value in a Buffer?"); + } + + // Extract the upper byte and lower byte respectively... + const idx = i % 2 === 0 ? byte >>> 4 : byte & 0xf; + + // Using it as the index to shuffle the serial MD5... + const nib = digest[idx]; if (nib === undefined) { throw new Error( @@ -22,26 +32,25 @@ function CalculateCardKey(serial: integer, key: string) { ); } - digest[i] = nib; + // Store the byte into a temporary little-endian number... + num = num | (nib << storedBits); + storedBits = storedBits + 8; + + // XOR every 23 bits or if it's the final iteration + if (storedBits > 23 || i === 15) { + // 0x7fffff is mask to extract the last 23 bits of num. + hash = hash ^ (num & 0x7fffff); + + // Removed the bits we worked on + num = num >>> 23; + + storedBits = storedBits - 23; + } } - // nasty ass bit string hacks that i am not good enough at math to replace - let bitstring = reverseString( - digest.map((n) => reverseString(n.toString(2).padStart(8, "0"))).join("") - ).padStart(6 * 23, "0"); - let computed = 0; - - while (bitstring) { - const work = Number(`0b${bitstring.slice(0, 23)}`); - - // eslint-disable-next-line no-bitwise - computed = computed ^ work; - - bitstring = bitstring.slice(23); - } - - return computed.toString().padStart(7, "0"); + return hash.toString().padStart(7, "0"); } +/* eslint-enable no-bitwise */ export function CalculateAccessCode(serial: integer, prefix: string, key: string): string { const digest = CalculateCardKey(serial, key); diff --git a/src/servers/aimedb/utils/felica.ts b/src/servers/aimedb/utils/felica.ts index d23d62d..6edbf47 100644 --- a/src/servers/aimedb/utils/felica.ts +++ b/src/servers/aimedb/utils/felica.ts @@ -1,20 +1,21 @@ -const FELICA_MOBILE_OS_VERSIONS = [0x06, 0x07, 0x10, 0x12, 0x13, 0x14, 0x15, 0x17, 0x18] as const; -const FELICA_CARD_OS_VERSIONS = [0x20, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7] as const; +import { FELICA_CARD_IC_TYPES, FELICA_MOBILE_IC_TYPES } from "lib/constants/felica"; + +export type ValidFeliCaIcTypes = + | typeof FELICA_CARD_IC_TYPES[number] + | typeof FELICA_MOBILE_IC_TYPES[number]; export function IsSupportedFelicaMobile( - osVer: number -): osVer is typeof FELICA_MOBILE_OS_VERSIONS[number] { - return (FELICA_MOBILE_OS_VERSIONS as ReadonlyArray).includes(osVer); + icType: number +): icType is typeof FELICA_MOBILE_IC_TYPES[number] { + return (FELICA_MOBILE_IC_TYPES as ReadonlyArray).includes(icType); } export function IsSupportedFelicaCard( - osVer: number -): osVer is typeof FELICA_CARD_OS_VERSIONS[number] { - return (FELICA_CARD_OS_VERSIONS as ReadonlyArray).includes(osVer); + icType: number +): icType is typeof FELICA_CARD_IC_TYPES[number] { + return (FELICA_CARD_IC_TYPES as ReadonlyArray).includes(icType); } -export function IsSupportedFelica( - osVer: number -): osVer is typeof FELICA_CARD_OS_VERSIONS[number] | typeof FELICA_MOBILE_OS_VERSIONS[number] { - return IsSupportedFelicaMobile(osVer) || IsSupportedFelicaCard(osVer); +export function IsSupportedFelica(icType: number): icType is ValidFeliCaIcTypes { + return IsSupportedFelicaMobile(icType) || IsSupportedFelicaCard(icType); } diff --git a/src/servers/allnet/index.ts b/src/servers/allnet/index.ts index f4fd266..873dfcf 100644 --- a/src/servers/allnet/index.ts +++ b/src/servers/allnet/index.ts @@ -4,12 +4,11 @@ import express from "express"; import "express-async-errors"; -// eslint-disable-next-line import/order import mainRouter from "./router/router"; import CreateLogCtx from "lib/logger/logger"; import { DFIRequestResponse } from "./middleware/dfi"; import type { Express } from "express"; -import { RequestLoggerMiddleware } from "./middleware/request-logger"; +import { RequestLoggerMiddleware } from "../../lib/middleware/request-logger"; import { IsRecord } from "utils/misc"; const logger = CreateLogCtx(__filename); @@ -30,10 +29,16 @@ process.on("unhandledRejection", (reason, promise) => { logger.error(reason, { promise }); }); -// ALL.Net sends a form body that is sometimes deflated and base64-encoded. -// This also does some special handling to prevent keys/values from being -// URL-escaped, which ALL.Net doesn't do. Pray they don't need an & or a =. -app.use(DFIRequestResponse); +// We do the body handling here so logging is properly handled. +app.use((req, res, next) => { + if (req.path === "/sys/servlet/PowerOn") { + DFIRequestResponse(true)(req, res, next); + } else if (req.path === "/report-api/Report") { + express.json({ limit: "4mb", type: (_) => true })(req, res, next); + } else { + DFIRequestResponse(false)(req, res, next); + } +}); app.use((req, res, next) => { if (req.method !== "GET" && (typeof req.body !== "object" || req.body === null)) { @@ -50,6 +55,12 @@ app.use(RequestLoggerMiddleware); app.use("/", mainRouter); const MAIN_ERR_HANDLER: express.ErrorRequestHandler = (err, req, res, _next) => { + // eslint-disable-next-line cadence/no-instanceof + if (err instanceof SyntaxError && req.path === "/report-api/Report") { + logger.error("Could not parse download report as JSON.", { err }); + return res.status(200).send("NG"); + } + logger.info(`MAIN_ERR_HANDLER hit by request.`, { url: req.originalUrl }); const unknownErr = err as unknown; diff --git a/src/servers/allnet/middleware/dfi.ts b/src/servers/allnet/middleware/dfi.ts index 6a477d7..5936bb4 100644 --- a/src/servers/allnet/middleware/dfi.ts +++ b/src/servers/allnet/middleware/dfi.ts @@ -6,59 +6,61 @@ import type { RequestHandler } from "express"; const inflateAsync = promisify(inflate); -export const DFIRequestResponse: RequestHandler = async (req, res, next) => { - if (Number(req.headers["content-length"] ?? 0) === 0) { +export const DFIRequestResponse: (mustUseDfi: boolean) => RequestHandler = (mustUseDfi) => { + return async (req, res, next) => { + if (Number(req.headers["content-length"] ?? 0) === 0) { + next(); + return; + } + + const isUsingDfi = req.headers.pragma?.toUpperCase() === "DFI"; + + if (mustUseDfi && !isUsingDfi) { + return res.status(200).send(""); + } + + const rawBody = await getRawBody(req, { encoding: "utf-8" }); + + let body: string; + + if (isUsingDfi) { + const compressedBuffer = Buffer.from(rawBody, "base64"); + const buffer = await inflateAsync(compressedBuffer); + + body = buffer.toString("utf-8").trim(); + } else { + body = rawBody.trim(); + } + + // Keys and values are not URL escaped. + // This should be fine. I think. + // eslint-disable-next-line require-atomic-updates + req.body = Object.fromEntries(body.split("&").map((s) => s.split("="))); + req.safeBody = req.body as Record; + + const originalSend = res.send; + + res.send = (params) => { + const body = `${new URLSearchParams(params).toString()}\n`; + + const encoding = req.body.encode ?? "EUC-JP"; + const encodedBody = iconv.encode(body, encoding); + + res.header("Content-Type", `text/plain; charset=${encoding}`); + + // TODO: I don't know what black magic SEGA did, but I have been woefully + // unable to DFI-encode my responses... + return originalSend.apply(res, [encodedBody]); + + // if (req.headers.pragma?.toUpperCase() !== "DFI") { + // return originalSend.apply(res, [encodedBody]); + // } + + // res.header("Pragma", "DFI"); + + // return originalSend.apply(res, [deflateSync(encodedBody).toString("base64")]); + }; + next(); - return; - } - - const isUsingDfi = req.headers.pragma?.toUpperCase() === "DFI"; - - const rawBody = await getRawBody(req, { encoding: "utf-8" }); - - let body: string; - - if (isUsingDfi) { - const compressedBuffer = Buffer.from(rawBody, "base64"); - const buffer = await inflateAsync(compressedBuffer); - - body = buffer.toString("utf-8").trim(); - } else { - body = rawBody.trim(); - } - - // Keys and values are not URL escaped. - // This should be fine. I think. - // eslint-disable-next-line require-atomic-updates - req.body = Object.fromEntries(body.split("&").map((s) => s.split("="))); - - const originalSend = res.send; - - res.send = (params) => { - const body = - typeof params === "object" - ? `${Object.entries(params) - .map(([k, v]) => `${k}=${v}`) - .join("&")}\n` - : params; - - const encoding = req.body.encode ?? "EUC-JP"; - const encodedBody = iconv.encode(body, encoding); - - res.header("Content-Type", `text/plain; charset=${encoding}`); - - // TODO: I don't know what black magic SEGA did, but I have been woefully - // unable to DFI-encode my responses... - return originalSend.apply(res, [encodedBody]); - - // if (req.headers.pragma?.toUpperCase() !== "DFI") { - // return originalSend.apply(res, [encodedBody]); - // } - - // res.header("Pragma", "DFI"); - - // return originalSend.apply(res, [deflateSync(encodedBody).toString("base64")]); }; - - next(); }; diff --git a/src/servers/allnet/router/report-api/Report/router.ts b/src/servers/allnet/router/report-api/Report/router.ts new file mode 100644 index 0000000..5a1ae78 --- /dev/null +++ b/src/servers/allnet/router/report-api/Report/router.ts @@ -0,0 +1,64 @@ +import { Router } from "express"; +import { Machine } from "external/db/entity/allnet"; +import { EventLog } from "external/db/entity/base"; +import CreateLogCtx from "lib/logger/logger"; +import { Config } from "lib/setup/config"; +import { DownloadReportSchema } from "servers/allnet/types/download-report"; +import { fromZodError } from "zod-validation-error"; + +const logger = CreateLogCtx(__filename); + +const router: Router = Router({ mergeParams: true }); + +router.post("/", async (req, res) => { + const parseResult = DownloadReportSchema.safeParse(req.safeBody); + + if (!parseResult.success) { + logger.error("Invalid download progress report.", { + err: fromZodError(parseResult.error).message, + }); + return res.status(200).send("NG"); + } + + const reportData = parseResult.data.appimage ?? parseResult.data.optimage; + + if (!reportData) { + logger.error( + "Invalid download progress report. Neither appimage nor optimage was available." + ); + return res.status(200).send("NG"); + } + + if (!Config.ALLNET_CONFIG.ALLOW_UNREGISTERED_SERIALS) { + const machine = await Machine.findOne({ + where: { + serial: reportData.serial, + }, + }); + + if (!machine) { + logger.error("Rejected download progress report from unknown serial.", { reportData }); + return res.status(200).send("NG"); + } + } + + const message = `${reportData.serial} reported download state for ${reportData.gd} v${ + reportData.dav + }: ${reportData.tdsc}/${reportData.tsc} segments downloaded for working files ${ + reportData.wfl + } with ${reportData.dfl ?? "none"} complete.`; + + const eventLog = EventLog.construct({ + system: "allnet", + type: "DOWNLOAD_REPORT", + severity: "info", + message, + details: reportData, + }); + + await eventLog.save(); + + return res.status(200).send("OK"); +}); + +export default router; diff --git a/src/servers/allnet/router/report-api/router.ts b/src/servers/allnet/router/report-api/router.ts new file mode 100644 index 0000000..71295dc --- /dev/null +++ b/src/servers/allnet/router/report-api/router.ts @@ -0,0 +1,8 @@ +import reportRouter from "./Report/router"; +import { Router } from "express"; + +const router: Router = Router({ mergeParams: true }); + +router.use("/Report", reportRouter); + +export default router; diff --git a/src/servers/allnet/router/router.ts b/src/servers/allnet/router/router.ts index cb0013e..bb2b5af 100644 --- a/src/servers/allnet/router/router.ts +++ b/src/servers/allnet/router/router.ts @@ -1,3 +1,4 @@ +import reportRouter from "./report-api/router"; import sysServletRouter from "./sys/servlet/router"; import { Router } from "express"; @@ -8,5 +9,6 @@ router.all("/naomitest.html", (_, res) => { }); router.use("/sys/servlet", sysServletRouter); +router.use("/report-api", reportRouter); export default router; diff --git a/src/servers/allnet/router/sys/servlet/DownloadOrder/router.ts b/src/servers/allnet/router/sys/servlet/DownloadOrder/router.ts index 498c93c..2fe9d59 100644 --- a/src/servers/allnet/router/sys/servlet/DownloadOrder/router.ts +++ b/src/servers/allnet/router/sys/servlet/DownloadOrder/router.ts @@ -1,19 +1,44 @@ import { Router } from "express"; +import { Machine } from "external/db/entity/allnet"; +import CreateLogCtx from "lib/logger/logger"; +import { Config } from "lib/setup/config"; import { DownloadOrderRequestSchema, DownloadOrderStatus, } from "servers/allnet/types/download-order"; +import { fromZodError } from "zod-validation-error"; import type { DownloadOrderResponse } from "servers/allnet/types/download-order"; +const logger = CreateLogCtx(__filename); + const router: Router = Router({ mergeParams: true }); -router.post("/", (req, res) => { +router.post("/", async (req, res) => { const parseResult = DownloadOrderRequestSchema.safeParse(req.safeBody); if (!parseResult.success) { + logger.error("Received invalid download order request.", { + error: fromZodError(parseResult.error).message, + body: req.safeBody, + }); return res.status(403).send(""); } + const data = parseResult.data; + + if (!Config.ALLNET_CONFIG.ALLOW_UNREGISTERED_SERIALS) { + const machine = await Machine.findOne({ + where: { + serial: data.serial, + }, + }); + + if (!machine) { + logger.error("Rejected download order request from unknown serial.", { data }); + return res.status(200).send({ stat: 1, serial: "", uri: "null" }); + } + } + // TODO: Allow network delivery. const response = { stat: DownloadOrderStatus.FAILURE, diff --git a/src/servers/allnet/router/sys/servlet/PowerOn/router.ts b/src/servers/allnet/router/sys/servlet/PowerOn/router.ts index 448b847..0a16794 100644 --- a/src/servers/allnet/router/sys/servlet/PowerOn/router.ts +++ b/src/servers/allnet/router/sys/servlet/PowerOn/router.ts @@ -1,7 +1,5 @@ -import { eq } from "drizzle-orm"; import { Router } from "express"; -import { db } from "external/db/db"; -import { arcade, machine } from "external/db/schemas"; +import { Machine } from "external/db/entity/allnet"; import CreateLogCtx from "lib/logger/logger"; import { Config } from "lib/setup/config"; import { DateTime } from "luxon"; @@ -33,11 +31,10 @@ router.post("/", async (req, res) => { return res.status(500).send(); } - const formatVer = req.safeBody.format_ver ?? "1"; + const formatVer = (req.safeBody.format_ver as string | undefined) ?? "1"; let parseResult; - // TODO: ALL.Net China if (formatVer === "1") { parseResult = PowerOnRequestV1Schema.safeParse(req.safeBody); } else if (formatVer === "2") { @@ -57,8 +54,10 @@ router.post("/", async (req, res) => { } if (!parseResult.success) { - logger.error(`Received invalid PowerOn request: ${fromZodError(parseResult.error)}`, { + logger.error(`Received invalid PowerOn request.`, { + err: fromZodError(parseResult.error).message, formatVer, + body: req.safeBody, }); return res.status(400).send(""); } @@ -96,14 +95,13 @@ router.post("/", async (req, res) => { // TODO: Implement store authentication + fetch arcade information // Reference implementation: https://sega.bsnk.me/allnet/auth/power-on // For now, we just check if there's a cab registered in the database. - const cabAndStore = await db - .select() - .from(machine) - .leftJoin(arcade, eq(arcade.id, machine.arcade_id)) - .where(eq(machine.serial, serial)) - .then((r) => r[0]); + const result = await Machine.findOne({ + where: { + serial, + }, + }); - if (!cabAndStore && !Config.ALLNET_CONFIG.ALLOW_UNREGISTERED_SERIALS) { + if (!result && !Config.ALLNET_CONFIG.ALLOW_UNREGISTERED_SERIALS) { logger.error("Unregistered serial attempted ALL.Net authentication.", { gameId, serial, @@ -115,21 +113,19 @@ router.post("/", async (req, res) => { // TODO: Verify that title exists and is enabled. const serverTime = DateTime.now().setZone("Asia/Tokyo"); const baseResponse = { - // Same thing stat: 1, - - place_id: (0x123).toString(16), + place_id: (result?.arcade.id ?? 0x123).toString(16).toUpperCase(), // uri: `http://localhost:8080/${gameId}/${titleVer.replace(/\./u, "")}/`, uri: `http://localhost:8080/${titleVer.replace(/\./u, "")}/`, host: "localhost:8080", - name: cabAndStore?.allnet_arcade?.name ?? Config.NAME, - nickname: cabAndStore?.allnet_arcade?.nickname ?? "kozukata-toa", + name: result?.arcade.name ?? Config.NAME, + nickname: result?.arcade.nickname ?? "kozukatatoa", setting: 1, - region0: cabAndStore?.allnet_arcade?.regionId ?? 1, - region_name0: cabAndStore?.allnet_arcade?.regionName0 ?? "W", - region_name1: cabAndStore?.allnet_arcade?.regionName1 ?? "", - region_name2: cabAndStore?.allnet_arcade?.regionName2 ?? "", - region_name3: cabAndStore?.allnet_arcade?.regionName3 ?? "", + region0: result?.arcade.regionId ?? 1, + region_name0: result?.arcade.regionName0 ?? "W", + region_name1: result?.arcade.regionName1 ?? "", + region_name2: result?.arcade.regionName2 ?? "", + region_name3: result?.arcade.regionName3 ?? "", }; let response; @@ -164,7 +160,7 @@ router.post("/", async (req, res) => { allnet_id: 456, utc_time: serverTime.toFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"), country: "JPN", - client_timezone: "+0900", + client_timezone: " 0900", token: request.token ?? "null", } satisfies PowerOnResponseV3; } else if (request.format_ver === "3" && "game_ver" in request) { diff --git a/src/servers/allnet/types/download-report.ts b/src/servers/allnet/types/download-report.ts new file mode 100644 index 0000000..145a08a --- /dev/null +++ b/src/servers/allnet/types/download-report.ts @@ -0,0 +1,35 @@ +import { z } from "zod"; + +const zodOptionalInteger = z.number().int().optional(); + +export const DownloadOptImageReportSchema = z.object({ + serial: z.string().min(1).max(11), + dfl: z.array(z.string().min(1)).optional(), + wfl: z.array(z.string().min(1)).optional(), + tsc: z.number().int(), + tdsc: z.number().int(), + at: zodOptionalInteger, + ot: zodOptionalInteger, + rt: zodOptionalInteger, + as: z.number().int().gte(1).lte(2), + rf_state: zodOptionalInteger, + gd: z.string(), + dav: z.string(), + dov: z.string(), +}); + +export const DownloadAppImageReportSchema = DownloadOptImageReportSchema.extend({ + wdav: z.string(), + wdov: z.string(), +}); + +export const DownloadReportSchema = z + .object({ + appimage: DownloadAppImageReportSchema.optional(), + optimage: DownloadOptImageReportSchema.optional(), + }) + // One of these must be present + .refine( + (arg) => !!arg.appimage || !!arg.optimage, + "At least one of 'appimage' or 'optimage' must be available" + ); diff --git a/src/servers/allnet/types/loader-state-recorder.ts b/src/servers/allnet/types/loader-state-recorder.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/servers/allnet/types/power-on.ts b/src/servers/allnet/types/power-on.ts index fc24f6b..02d5b11 100644 --- a/src/servers/allnet/types/power-on.ts +++ b/src/servers/allnet/types/power-on.ts @@ -1,16 +1,18 @@ import { z } from "zod"; import type { integer } from "types/misc"; +const zodCoerceOptionalFiveDigitInteger = z.coerce.number().int().gte(-99999).lte(99999).optional(); + export const PowerOnRequestV1Schema = z.object({ game_id: z.string().max(5), ver: z.string().max(5), serial: z.string().max(11), ip: z.string().ip(), - firm_ver: z.coerce.number().optional(), - boot_ver: z.coerce.number().optional(), + firm_ver: zodCoerceOptionalFiveDigitInteger, + boot_ver: zodCoerceOptionalFiveDigitInteger, encode: z.enum(["Shift_JIS", "EUC-JP", "UTF-8"]).default("EUC-JP"), - format_ver: z.literal("1"), - hops: z.coerce.number().default(-1), + format_ver: z.literal("1").optional(), + hops: z.coerce.number().int().gte(-99999).lte(99999).default(-1), }); export type PowerOnRequestV1 = z.infer; diff --git a/src/servers/index.ts b/src/servers/index.ts index fb3a1b8..8af922c 100644 --- a/src/servers/index.ts +++ b/src/servers/index.ts @@ -1,2 +1,3 @@ export { default as allnetServer } from "./allnet"; export { default as aimeDbServerFactory } from "./aimedb"; +export { default as titleServer } from "./titles"; diff --git a/src/servers/titles/chunithm/index.ts b/src/servers/titles/chunithm/index.ts new file mode 100644 index 0000000..0fb48d1 --- /dev/null +++ b/src/servers/titles/chunithm/index.ts @@ -0,0 +1,218 @@ +import { VERSIONS } from "./versions"; +import { GetClassMethods } from "../utils/reflection"; +import compression from "compression"; +import { Router, json } from "express"; +import { ChunithmVersions } from "lib/constants/game-versions"; +import CreateLogCtx from "lib/logger/logger"; +import { RequestLoggerMiddleware } from "lib/middleware/request-logger"; +import { Config, Environment } from "lib/setup/config"; +import getRawBody from "raw-body"; +import { createDecipheriv, pbkdf2Sync } from "crypto"; +import type { RequestHandler } from "express"; + +const logger = CreateLogCtx(__filename); + +const router: Router = Router({ mergeParams: false }); + +router.use(compression({ threshold: 0 })); + +router.use(async (req, res, next) => { + if ((req.headers["content-length"] ?? 0) === 0) { + next(); + return; + } + + // /SDHD/210/UpsertUserAllApi + const splitPath = req.path.split("/"); + const version = splitPath[2]; + const versionNum = Number(version); + const endpoint = splitPath.at(-1); + + if (!endpoint || !version || Number.isNaN(versionNum)) { + next(); + return; + } + + const isEncryptedRequest = + endpoint.length === 32 && [...endpoint].every((c) => "0123456789abcdefABCDEF".includes(c)); + + if ( + !isEncryptedRequest && + Config.CHUNITHM_CONFIG.CRYPTO.ENCRYPTED_ONLY && + versionNum >= ChunithmVersions.CRYSTAL_PLUS + ) { + logger.error( + "Rejecting unencrypted request, because the server is configured to accept only encrypted requests.", + { version, endpoint } + ); + + return res.status(200).send({ stat: "0" }); + } + + if (!isEncryptedRequest) { + next(); + return; + } + + logger.debug("Received encrypted request.", { version, endpoint }); + + const keys = Config.CHUNITHM_CONFIG.CRYPTO.KEYS?.[version]; + + if (!keys) { + logger.error("No keys were configured for the requested version.", { + version, + endpoint, + }); + return res.status(200).send({ stat: "0" }); + } + + // Mostly as a convenience, so versions PARADISE LOST and older don't have to provide + // the path salt. + const userAgent = req.headers["user-agent"]; + + if (versionNum <= ChunithmVersions.PARADISE && userAgent) { + const unhashedEndpoint = userAgent.split("#")[0]; + + if (unhashedEndpoint) { + req.url = req.url.replace(endpoint, unhashedEndpoint); + } else { + logger.warn( + "User-Agent did not contain the unhashed endpoint for version PARADISE (LOST) or older?", + { version, userAgent } + ); + + return res.status(200).send({ stat: "0" }); + } + } + + const key = keys[0]; + const iv = keys[1]; + + if (!key || !iv) { + logger.error("Key or IV was not provided for the requested version.", { + version, + key, + iv, + }); + + return res.status(200).send({ stat: "0" }); + } + + const cipher = createDecipheriv("aes-256-cbc", Buffer.from(key, "hex"), Buffer.from(iv, "hex")); + const body = await getRawBody(req); + + // eslint-disable-next-line require-atomic-updates + req.body = Buffer.concat([cipher.update(body), cipher.final()]); + + // TODO: Encrypt response + + next(); +}); + +router.use((req, res, next) => { + if (Environment.nodeEnv === "dev" && req.header("x-debug") !== undefined) { + next(); + return; + } + + // Get express.json() to recognize + req.headers["content-encoding"] = "deflate"; + + next(); +}); + +// All requests to the title server will be JSON, I promise! +router.use(json({ type: (_) => true })); + +router.use((req, res, next) => { + // Always mount an empty req body. We operate under the assumption that req.body is + // always defined as atleast an object. + if (req.method !== "GET" && (typeof req.body !== "object" || req.body === null)) { + req.body = {}; + } + + // req.safeBody *is* just a type-safe req.body! + req.safeBody = req.body as Record; + + next(); +}); + +router.use(RequestLoggerMiddleware); + +for (const Title of VERSIONS) { + const inst = new Title(); + + const endpointSaltString = Config.CHUNITHM_CONFIG.CRYPTO.KEYS?.[inst.version]?.[2]; + const iterations = inst.numericVersion >= ChunithmVersions.SUN ? 70 : 44; + + const key = Config.CHUNITHM_CONFIG.CRYPTO.KEYS?.[inst.version]?.[0]; + const iv = Config.CHUNITHM_CONFIG.CRYPTO.KEYS?.[inst.version]?.[1]; + + if ( + Config.CHUNITHM_CONFIG.CRYPTO.ENCRYPTED_ONLY && + inst.numericVersion >= ChunithmVersions.CRYSTAL_PLUS && + (!key || !iv) + ) { + logger.warn( + `Disabling ${inst.gameCode} v${inst.version}, because ENCRYPTED_ONLY was enabled but no keys are provided.`, + { + gameCode: inst.gameCode, + version: inst.version, + } + ); + continue; + } + + if ( + Config.CHUNITHM_CONFIG.CRYPTO.ENCRYPTED_ONLY && + inst.numericVersion >= ChunithmVersions.NEW && + !endpointSaltString + ) { + logger.warn( + `Disabling ${inst.gameCode} v${inst.version}, because ENCRYPTED_ONLY was enabled but no endpoint salt was provided.`, + { + gameCode: inst.gameCode, + version: inst.version, + } + ); + } + + const subrouter: Router = Router({ mergeParams: false }); + const methods = GetClassMethods(Title).filter((m) => m.startsWith("handle_")); + const endpointSalt = endpointSaltString ? Buffer.from(endpointSaltString, "hex") : null; + + for (const method of methods) { + const methodName = method.split("_")[1]; + + if (!methodName) { + logger.warn( + "Method starts with 'handle_', but cannot get the part after the underscore?", + { + method, + } + ); + continue; + } + + const impl = (inst as unknown as Record)[method] as RequestHandler; + const implWrapper: RequestHandler = (req, res, next) => { + impl.apply(inst, [req, res, next]); + }; + + subrouter.post(`/${methodName}`, implWrapper); + + if (endpointSalt) { + const hash = pbkdf2Sync(methodName, endpointSalt, iterations, 16, "sha1").toString( + "hex" + ); + + subrouter.post(`/${hash}`, implWrapper); + } + } + + router.use(`/${inst.gameCode}/${inst.version}/${inst.servletName}`, subrouter); + + // TODO: Add to a title registry +} + +export default router; diff --git a/src/servers/titles/chunithm/versions/100-base.ts b/src/servers/titles/chunithm/versions/100-base.ts new file mode 100644 index 0000000..ed96f13 --- /dev/null +++ b/src/servers/titles/chunithm/versions/100-base.ts @@ -0,0 +1,197 @@ +import { ChunithmStaticCharge, ChunithmStaticEvent } from "external/db/entity/chunithm/static"; +import CreateLogCtx from "lib/logger/logger"; +import { DateTime } from "luxon"; +import { BaseTitle } from "servers/titles/types/titles"; +import type { Request, Response } from "express"; +import type { ITitle } from "servers/titles/types/titles"; + +const logger = CreateLogCtx(__filename); + +export class Chunithm extends BaseTitle implements ITitle { + private readonly dateTimeFormat = "yyyy-MM-dd HH:mm:ss"; + + constructor(gameCode?: string, version?: string, servletName?: string) { + super(gameCode ?? "SDBT", version ?? "100", servletName ?? "ChuniServlet"); + } + + protected createGetGameSettingsApiResponse(_req: Request, _res: Response) { + // HACK: This is not the way to go if you're somehow hosting an arcade server + // from my code, and wants your machines to actually restart sometimes. + const rebootStartTime = DateTime.now().minus({ hours: 4 }).toFormat(this.dateTimeFormat); + const rebootEndTime = DateTime.now().minus({ hours: 3 }).toFormat(this.dateTimeFormat); + + return { + gameSetting: { + dataVersion: "1.00.00", + isMaintenance: "false", + requestInterval: "10", + rebootStartTime, + rebootEndTime, + isBackgroundDistribute: "false", + maxCountCharacter: "300", + maxCountItem: "300", + maxCountMusic: "300", + }, + isDumpUpload: "false", + isAou: "false", + }; + } + + /** + * @note override {@link createGetGameSettingsApiResponse} in order to modify this + * method's response + * @since CHUNITHM + */ + handle_GetGameSettingsApi(req: Request, res: Response) { + const resp = this.createGetGameSettingsApiResponse(req, res); + + return res.status(200).send(resp); + } + + handle_UpsertClientSettingApi(req: Request, res: Response) { + return res.status(200).send({ returnCode: "1" }); + } + + handle_UpsertClientTestmodeApi(req: Request, res: Response) { + return res.status(200).send({ returnCode: "1" }); + } + + handle_GetGameIdlistApi(req: Request, res: Response) { + return res.status(200).send({ type: req.safeBody.type, length: "0", gameIdlistList: [] }); + } + + async handle_GetGameEventApi(req: Request, res: Response) { + const events = await ChunithmStaticEvent.find({ + where: { + enabled: true, + version: this.numericVersion, + }, + }); + + if (events.length === 0) { + logger.warn("No events are enabled.", { + gameCode: this.gameCode, + version: this.version, + }); + } + + // HACK: We may want to rotate events... + return res.send({ + type: req.safeBody.type, + length: events.length.toString(), + gameEventList: events.map((e) => ({ + id: e.eventId.toString(), + type: e.type.toString(), + startDate: DateTime.fromJSDate(e.startDate).toFormat(this.dateTimeFormat), + endDate: "2099-12-31 00:00:00", + })), + }); + } + + handle_GetGameRankingApi(req: Request, res: Response) { + // TODO + return res.send({ + type: req.safeBody.type, + length: "0", + gameRankingList: [], + }); + } + + async handle_GetGameChargeApi(req: Request, res: Response) { + const charges = await ChunithmStaticCharge.find({ + where: { + enabled: true, + version: this.numericVersion, + }, + }); + + if (charges.length === 0) { + logger.warn("No charges (tickets) are enabled.", { + gameCode: this.gameCode, + version: this.version, + }); + } + + // HACK + return res.send({ + length: charges.length.toString(), + gameChargeList: charges.map((c, i) => ({ + orderId: i.toString(), + chargeId: c.chargeId.toString(), + price: "1", + startDate: "2017-12-05 07:00:00.0", + endDate: "2099-12-31 00:00:00.0", + salePrice: "1", + saleStartDate: "2017-12-05 07:00:00.0", + saleEndDate: "2099-12-31 00:00:00.0", + })), + }); + } + + handle_GetUserPreviewApi(req: Request, res: Response) { + throw new Error("Unimplemented"); + } + + handle_GameLoginApi(req: Request, res: Response) { + throw new Error("Unimplemented"); + } + + handle_GetUserDataApi(req: Request, res: Response) { + throw new Error("Unimplemented"); + } + + handle_GetUserOptionApi(req: Request, res: Response) { + throw new Error("Unimplemented"); + } + + handle_GetUserCharacterApi(req: Request, res: Response) { + throw new Error("Unimplemented"); + } + + handle_GetUserActivityApi(req: Request, res: Response) { + throw new Error("Unimplemented"); + } + + handle_GetUserItemApi(req: Request, res: Response) { + throw new Error("Unimplemented"); + } + + handle_GetUserRecentRatingApi(req: Request, res: Response) { + throw new Error("Unimplemented"); + } + + handle_GetUserMusicApi(req: Request, res: Response) { + throw new Error("Unimplemented"); + } + + handle_GetUserRegionApi(req: Request, res: Response) { + throw new Error("Unimplemented"); + } + + handle_GetUserFavoriteItemApi(req: Request, res: Response) { + throw new Error("Unimplemented"); + } + + handle_GetUserLoginBonusApi(req: Request, res: Response) { + throw new Error("Unimplemented"); + } + + handle_GetUserMapAreaApi(req: Request, res: Response) { + throw new Error("Unimplemented"); + } + + handle_GetUserSymbolChatSettingApi(req: Request, res: Response) { + throw new Error("Unimplemented"); + } + + /** + * @since NEW + */ + handle_GetUserNetBattleDataApi(req: Request, res: Response) { + throw new Error("Unimplemented"); + } + + handle_GameLogoutApi(req: Request, res: Response) { + return res.status(200).send({ returnCode: "1" }); + } +} diff --git a/src/servers/titles/chunithm/versions/125-airplus.ts b/src/servers/titles/chunithm/versions/125-airplus.ts new file mode 100644 index 0000000..63cc7b1 --- /dev/null +++ b/src/servers/titles/chunithm/versions/125-airplus.ts @@ -0,0 +1,23 @@ +import { Chunithm } from "./100-base"; +import type { Request, Response } from "express"; + +export class ChunithmAirPlus extends Chunithm { + constructor(gameCode?: string, version?: string, servletName?: string) { + super(gameCode ?? "SDBT", version ?? "125", servletName ?? "ChuniServlet"); + } + + override createGetGameSettingsApiResponse(req: Request, res: Response) { + const resp = super.createGetGameSettingsApiResponse(req, res); + + resp.gameSetting.dataVersion = "1.25.00"; + + return resp; + } + + /** + * @since AIR PLUS + */ + handle_GetUserCourseApi(req: Request, res: Response) { + throw new Error("Unimplemented"); + } +} diff --git a/src/servers/titles/chunithm/versions/130-amazon.ts b/src/servers/titles/chunithm/versions/130-amazon.ts new file mode 100644 index 0000000..7e3eab0 --- /dev/null +++ b/src/servers/titles/chunithm/versions/130-amazon.ts @@ -0,0 +1,23 @@ +import { ChunithmAirPlus } from "./125-airplus"; +import type { Request, Response } from "express"; + +export class ChunithmAmazon extends ChunithmAirPlus { + constructor(gameCode?: string, version?: string, servletName?: string) { + super(gameCode ?? "SDBT", version ?? "130", servletName ?? "ChuniServlet"); + } + + override createGetGameSettingsApiResponse(req: Request, res: Response) { + const resp = super.createGetGameSettingsApiResponse(req, res); + + resp.gameSetting.dataVersion = "1.30.00"; + + return resp; + } + + /** + * @since AMAZON + */ + handle_GetUserDuelApi(req: Request, res: Response) { + throw new Error("Unimplemented"); + } +} diff --git a/src/servers/titles/chunithm/versions/135-amazonplus.ts b/src/servers/titles/chunithm/versions/135-amazonplus.ts new file mode 100644 index 0000000..ca9d67d --- /dev/null +++ b/src/servers/titles/chunithm/versions/135-amazonplus.ts @@ -0,0 +1,29 @@ +import { ChunithmAmazon } from "./130-amazon"; +import type { Request, Response } from "express"; + +export class ChunithmAmazonPlus extends ChunithmAmazon { + constructor(gameCode?: string, version?: string, servletName?: string) { + super(gameCode ?? "SDBT", version ?? "135", servletName ?? "ChuniServlet"); + } + + override createGetGameSettingsApiResponse(req: Request, res: Response) { + const resp = super.createGetGameSettingsApiResponse(req, res); + + resp.gameSetting.dataVersion = "1.35.00"; + + return resp; + } + + /** + * @since AMAZON PLUS + */ + handle_GetUserFavoriteMusicApi(req: Request, res: Response) { + // TODO: Add a web UI for favorites + + return res.send({ + userId: req.safeBody.userId, + length: "0", + userFavoriteMusicList: [], + }); + } +} diff --git a/src/servers/titles/chunithm/versions/140-crystal.ts b/src/servers/titles/chunithm/versions/140-crystal.ts new file mode 100644 index 0000000..3e74bb1 --- /dev/null +++ b/src/servers/titles/chunithm/versions/140-crystal.ts @@ -0,0 +1,72 @@ +import { ChunithmAmazonPlus } from "./135-amazonplus"; +import { Config } from "lib/setup/config"; +import type { Request, Response } from "express"; + +export class ChunithmCrystal extends ChunithmAmazonPlus { + constructor(gameCode?: string, version?: string, servletName?: string) { + super(gameCode ?? "SDBT", version ?? "140", servletName ?? "ChuniServlet"); + } + + override createGetGameSettingsApiResponse(req: Request, res: Response) { + const resp = super.createGetGameSettingsApiResponse(req, res); + + resp.gameSetting.dataVersion = "1.40.00"; + + return resp; + } + + /** + * @since CRYSTAL + */ + handle_GetUserTeamApi(req: Request, res: Response) { + // TODO + const teamName = Config.CHUNITHM_CONFIG.MODS.TEAM_NAME; + + if (!teamName) { + return res.send({ + userId: req.safeBody.userId, + teamId: "0", + }); + } + + return res.send({ + userId: req.safeBody.userId, + teamId: "1", + teamRank: "1", + teamName, + userTeamPoint: { + userId: req.safeBody.userId, + teamId: 1, + orderId: 1, + teamPoint: 1, + aggrDate: req.safeBody.playDate, + }, + }); + } + + /** + * @since CRYSTAL + */ + handle_GetTeamCourseSettingApi(req: Request, res: Response) { + // TODO + return res.send({ + userId: req.safeBody.userId, + length: "0", + nextIndex: "0", + teamCourseSettingList: [], + }); + } + + /** + * @since CRYSTAL + */ + handle_GetTeamCourseRuleApi(req: Request, res: Response) { + // TODO + return res.send({ + userId: req.safeBody.userId, + length: "0", + nextIndex: "0", + teamCourseRuleList: [], + }); + } +} diff --git a/src/servers/titles/chunithm/versions/index.ts b/src/servers/titles/chunithm/versions/index.ts new file mode 100644 index 0000000..f5e2a9a --- /dev/null +++ b/src/servers/titles/chunithm/versions/index.ts @@ -0,0 +1,14 @@ +import { Chunithm } from "./100-base"; +import { ChunithmAirPlus } from "./125-airplus"; +import { ChunithmAmazon } from "./130-amazon"; +import { ChunithmAmazonPlus } from "./135-amazonplus"; +import { ChunithmCrystal } from "./140-crystal"; +import type { BaseTitle } from "servers/titles/types/titles"; + +export const VERSIONS: Array = [ + Chunithm, + ChunithmAirPlus, + ChunithmAmazon, + ChunithmAmazonPlus, + ChunithmCrystal, +]; diff --git a/src/servers/titles/index.ts b/src/servers/titles/index.ts new file mode 100644 index 0000000..33420c9 --- /dev/null +++ b/src/servers/titles/index.ts @@ -0,0 +1,31 @@ +// THIS IMPORT **MUST** GO HERE. DO NOT MOVE IT. IT MUST OCCUR BEFORE ANYTHING HAPPENS WITH EXPRESS +// BUT AFTER EXPRESS IS IMPORTED. +/* eslint-disable import/order */ +import express from "express"; +import "express-async-errors"; + +import chunithmRouter from "./chunithm"; +import CreateLogCtx from "lib/logger/logger"; +import type { Express } from "express"; + +const logger = CreateLogCtx(__filename); + +const app: Express = express(); + +// Pass the IP of the user up our increasingly insane chain of nginx/docker nonsense +app.set("trust proxy", ["loopback", "linklocal", "uniquelocal"]); + +// we don't allow nesting in query strings. +app.set("query parser", "simple"); + +// taken from https://nodejs.org/api/process.html#process_event_unhandledrejection +// to avoid future deprecation. +process.on("unhandledRejection", (reason, promise) => { + // @ts-expect-error reason is an error, and the logger can handle errors + // it just refuses. + logger.error(reason, { promise }); +}); + +app.use("/", chunithmRouter); + +export default app; diff --git a/src/servers/titles/types/titles.ts b/src/servers/titles/types/titles.ts new file mode 100644 index 0000000..1a0cd01 --- /dev/null +++ b/src/servers/titles/types/titles.ts @@ -0,0 +1,20 @@ +export interface ITitle { + gameCode: string; + version: string; + servletName: string; +} + +export class BaseTitle implements ITitle { + gameCode: string; + version: string; + servletName: string; + numericVersion: number; + + constructor(gameCode?: string, version?: string, servletName?: string) { + this.gameCode = gameCode ?? ""; + this.version = version?.replace(/\./gu, "") ?? ""; + this.servletName = servletName ?? ""; + + this.numericVersion = Number(this.version); + } +} diff --git a/src/servers/titles/utils/reflection.ts b/src/servers/titles/utils/reflection.ts new file mode 100644 index 0000000..e51b133 --- /dev/null +++ b/src/servers/titles/utils/reflection.ts @@ -0,0 +1,41 @@ +/* eslint-disable cadence/no-instanceof */ + +function IsRecord(v: unknown): v is Record { + return v !== null && typeof v === "object" && !Array.isArray(v); +} + +export function GetClassMethods(className: unknown): Array { + if (typeof className !== "function" || !("prototype" in className)) { + throw new Error("Not a class"); + } + + if (!IsRecord(className.prototype)) { + throw new Error("Not a class"); + } + + const ret = new Set(); + + function methods(obj: Record | null | undefined) { + if (obj === null || obj === undefined) { + return; + } + + const ps = Object.getOwnPropertyNames(obj); + + for (const p of ps) { + try { + if (obj[p] instanceof Function) { + ret.add(p); + } + } catch { + continue; + } + } + + methods(Object.getPrototypeOf(obj)); + } + + methods(className.prototype); + + return Array.from(ret); +} diff --git a/tsconfig.json b/tsconfig.json index a0ca8e4..fd7be92 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -15,8 +15,8 @@ "target": "es2020", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ "lib": ["ES2019"], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ // "jsx": "preserve", /* Specify what JSX code is generated. */ - // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ - // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ + "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ @@ -85,7 +85,7 @@ /* Type Checking */ "strict": true, /* Enable all strict type-checking options. */ // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ - // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */