From 1a40749b0b473cf66764b9584fa686d36040e3c9 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sat, 24 Jun 2023 00:52:36 +0100 Subject: [PATCH 001/318] feat: improve search query by checking DB --- pnpm-lock.yaml | 4300 +++++++++++++++++++------------- src/handler.ts | 8 +- src/lib/d1/checkRow.ts | 31 - src/lib/d1/checkTable.ts | 13 - src/lib/d1/getAssetRequests.ts | 26 - src/lib/types/asset.ts | 12 +- src/routes/games/getAsset.ts | 93 - src/routes/games/getGameId.ts | 144 -- src/routes/games/getGames.ts | 101 - src/routes/search/search.ts | 63 + wrangler.toml | 4 +- 11 files changed, 2609 insertions(+), 2186 deletions(-) delete mode 100644 src/lib/d1/checkRow.ts delete mode 100644 src/lib/d1/checkTable.ts delete mode 100644 src/lib/d1/getAssetRequests.ts delete mode 100644 src/routes/games/getAsset.ts delete mode 100644 src/routes/games/getGameId.ts delete mode 100644 src/routes/games/getGames.ts create mode 100644 src/routes/search/search.ts diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7d5794a..b8cd016 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,1781 +1,2551 @@ -lockfileVersion: '6.0' +lockfileVersion: "6.0" settings: - autoInstallPeers: true - excludeLinksFromLockfile: false + autoInstallPeers: true + excludeLinksFromLockfile: false dependencies: - '@typescript-eslint/eslint-plugin': - specifier: ^5.59.11 - version: 5.59.11(@typescript-eslint/parser@5.59.11)(eslint@8.42.0)(typescript@5.1.3) - itty-router: - specifier: ^4.0.9 - version: 4.0.9 - prettier: - specifier: ^2.8.8 - version: 2.8.8 - render2: - specifier: ^1.2.1 - version: 1.2.1 + "@typescript-eslint/eslint-plugin": + specifier: ^5.59.11 + version: 5.59.11(@typescript-eslint/parser@5.59.11)(eslint@8.42.0)(typescript@5.1.3) + itty-router: + specifier: ^4.0.9 + version: 4.0.9 + prettier: + specifier: ^2.8.8 + version: 2.8.8 + render2: + specifier: ^1.2.1 + version: 1.2.1 devDependencies: - '@cloudflare/workers-types': - specifier: ^4.20230518.0 - version: 4.20230518.0 - eslint: - specifier: ^8.42.0 - version: 8.42.0 - eslint-config-google: - specifier: ^0.14.0 - version: 0.14.0(eslint@8.42.0) - eslint-plugin-json: - specifier: ^3.1.0 - version: 3.1.0 - typescript: - specifier: ^5.1.3 - version: 5.1.3 - wrangler: - specifier: 3.1.1 - version: 3.1.1 + "@cloudflare/workers-types": + specifier: ^4.20230518.0 + version: 4.20230518.0 + eslint: + specifier: ^8.42.0 + version: 8.42.0 + eslint-config-google: + specifier: ^0.14.0 + version: 0.14.0(eslint@8.42.0) + eslint-plugin-json: + specifier: ^3.1.0 + version: 3.1.0 + typescript: + specifier: ^5.1.3 + version: 5.1.3 + wrangler: + specifier: 3.1.1 + version: 3.1.1 packages: + /@cloudflare/kv-asset-handler@0.2.0: + resolution: + { + integrity: sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==, + } + dependencies: + mime: 3.0.0 + dev: true + + /@cloudflare/workerd-darwin-64@1.20230518.0: + resolution: + { + integrity: sha512-reApIf2/do6GjLlajU6LbRYh8gm/XcaRtzGbF8jo5IzyDSsdStmfNuvq7qssZXG92219Yp1kuTgR9+D1GGZGbg==, + } + engines: { node: ">=16" } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@cloudflare/workerd-darwin-arm64@1.20230518.0: + resolution: + { + integrity: sha512-1l+xdbmPddqb2YIHd1YJ3YG/Fl1nhayzcxfL30xfNS89zJn9Xn3JomM0XMD4mk0d5GruBP3q8BQZ1Uo4rRLF3A==, + } + engines: { node: ">=16" } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@cloudflare/workerd-linux-64@1.20230518.0: + resolution: + { + integrity: sha512-/pfR+YBpMOPr2cAlwjtInil0hRZjD8KX9LqK9JkfkEiaBH8CYhnJQcOdNHZI+3OjcY09JnQtEVC5xC4nbW7Bvw==, + } + engines: { node: ">=16" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@cloudflare/workerd-linux-arm64@1.20230518.0: + resolution: + { + integrity: sha512-q3HQvn3J4uEkE0cfDAGG8zqzSZrD47cavB/Tzv4mNutqwg6B4wL3ifjtGeB55tnP2K2KL0GVmX4tObcvpUF4BA==, + } + engines: { node: ">=16" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@cloudflare/workerd-windows-64@1.20230518.0: + resolution: + { + integrity: sha512-vNEHKS5gKKduNOBYtQjcBopAmFT1iScuPWMZa2nJboSjOB9I/5oiVsUpSyk5Y2ARyrohXNz0y8D7p87YzTASWw==, + } + engines: { node: ">=16" } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@cloudflare/workers-types@4.20230518.0: + resolution: + { + integrity: sha512-A0w1V+5SUawGaaPRlhFhSC/SCDT9oQG8TMoWOKFLA4qbqagELqEAFD4KySBIkeVOvCBLT1DZSYBMCxbXddl0kw==, + } + dev: true + + /@esbuild-plugins/node-globals-polyfill@0.1.1(esbuild@0.16.3): + resolution: + { + integrity: sha512-MR0oAA+mlnJWrt1RQVQ+4VYuRJW/P2YmRTv1AsplObyvuBMnPHiizUF95HHYiSsMGLhyGtWufaq2XQg6+iurBg==, + } + peerDependencies: + esbuild: "*" + dependencies: + esbuild: 0.16.3 + dev: true + + /@esbuild-plugins/node-modules-polyfill@0.1.4(esbuild@0.16.3): + resolution: + { + integrity: sha512-uZbcXi0zbmKC/050p3gJnne5Qdzw8vkXIv+c2BW0Lsc1ji1SkrxbKPUy5Efr0blbTu1SL8w4eyfpnSdPg3G0Qg==, + } + peerDependencies: + esbuild: "*" + dependencies: + esbuild: 0.16.3 + escape-string-regexp: 4.0.0 + rollup-plugin-node-polyfills: 0.2.1 + dev: true + + /@esbuild/android-arm64@0.16.3: + resolution: + { + integrity: sha512-RolFVeinkeraDvN/OoRf1F/lP0KUfGNb5jxy/vkIMeRRChkrX/HTYN6TYZosRJs3a1+8wqpxAo5PI5hFmxyPRg==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.16.3: + resolution: + { + integrity: sha512-mueuEoh+s1eRbSJqq9KNBQwI4QhQV6sRXIfTyLXSHGMpyew61rOK4qY21uKbXl1iBoMb0AdL1deWFCQVlN2qHA==, + } + engines: { node: ">=12" } + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.16.3: + resolution: + { + integrity: sha512-SFpTUcIT1bIJuCCBMCQWq1bL2gPTjWoLZdjmIhjdcQHaUfV41OQfho6Ici5uvvkMmZRXIUGpM3GxysP/EU7ifQ==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.16.3: + resolution: + { + integrity: sha512-DO8WykMyB+N9mIDfI/Hug70Dk1KipavlGAecxS3jDUwAbTpDXj0Lcwzw9svkhxfpCagDmpaTMgxWK8/C/XcXvw==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.16.3: + resolution: + { + integrity: sha512-uEqZQ2omc6BvWqdCiyZ5+XmxuHEi1SPzpVxXCSSV2+Sh7sbXbpeNhHIeFrIpRjAs0lI1FmA1iIOxFozKBhKgRQ==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.16.3: + resolution: + { + integrity: sha512-nJansp3sSXakNkOD5i5mIz2Is/HjzIhFs49b1tjrPrpCmwgBmH9SSzhC/Z1UqlkivqMYkhfPwMw1dGFUuwmXhw==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.16.3: + resolution: + { + integrity: sha512-TfoDzLw+QHfc4a8aKtGSQ96Wa+6eimljjkq9HKR0rHlU83vw8aldMOUSJTUDxbcUdcgnJzPaX8/vGWm7vyV7ug==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.16.3: + resolution: + { + integrity: sha512-7I3RlsnxEFCHVZNBLb2w7unamgZ5sVwO0/ikE2GaYvYuUQs9Qte/w7TqWcXHtCwxvZx/2+F97ndiUQAWs47ZfQ==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.16.3: + resolution: + { + integrity: sha512-VwswmSYwVAAq6LysV59Fyqk3UIjbhuc6wb3vEcJ7HEJUtFuLK9uXWuFoH1lulEbE4+5GjtHi3MHX+w1gNHdOWQ==, + } + engines: { node: ">=12" } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.16.3: + resolution: + { + integrity: sha512-X8FDDxM9cqda2rJE+iblQhIMYY49LfvW4kaEjoFbTTQ4Go8G96Smj2w3BRTwA8IHGoi9dPOPGAX63dhuv19UqA==, + } + engines: { node: ">=12" } + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.16.3: + resolution: + { + integrity: sha512-hIbeejCOyO0X9ujfIIOKjBjNAs9XD/YdJ9JXAy1lHA+8UXuOqbFe4ErMCqMr8dhlMGBuvcQYGF7+kO7waj2KHw==, + } + engines: { node: ">=12" } + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.16.3: + resolution: + { + integrity: sha512-znFRzICT/V8VZQMt6rjb21MtAVJv/3dmKRMlohlShrbVXdBuOdDrGb+C2cZGQAR8RFyRe7HS6klmHq103WpmVw==, + } + engines: { node: ">=12" } + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.16.3: + resolution: + { + integrity: sha512-EV7LuEybxhXrVTDpbqWF2yehYRNz5e5p+u3oQUS2+ZFpknyi1NXxr8URk4ykR8Efm7iu04//4sBg249yNOwy5Q==, + } + engines: { node: ">=12" } + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.16.3: + resolution: + { + integrity: sha512-uDxqFOcLzFIJ+r/pkTTSE9lsCEaV/Y6rMlQjUI9BkzASEChYL/aSQjZjchtEmdnVxDKETnUAmsaZ4pqK1eE5BQ==, + } + engines: { node: ">=12" } + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.16.3: + resolution: + { + integrity: sha512-NbeREhzSxYwFhnCAQOQZmajsPYtX71Ufej3IQ8W2Gxskfz9DK58ENEju4SbpIj48VenktRASC52N5Fhyf/aliQ==, + } + engines: { node: ">=12" } + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true - /@cloudflare/kv-asset-handler@0.2.0: - resolution: {integrity: sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==} - dependencies: - mime: 3.0.0 - dev: true - - /@cloudflare/workerd-darwin-64@1.20230518.0: - resolution: {integrity: sha512-reApIf2/do6GjLlajU6LbRYh8gm/XcaRtzGbF8jo5IzyDSsdStmfNuvq7qssZXG92219Yp1kuTgR9+D1GGZGbg==} - engines: {node: '>=16'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workerd-darwin-arm64@1.20230518.0: - resolution: {integrity: sha512-1l+xdbmPddqb2YIHd1YJ3YG/Fl1nhayzcxfL30xfNS89zJn9Xn3JomM0XMD4mk0d5GruBP3q8BQZ1Uo4rRLF3A==} - engines: {node: '>=16'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workerd-linux-64@1.20230518.0: - resolution: {integrity: sha512-/pfR+YBpMOPr2cAlwjtInil0hRZjD8KX9LqK9JkfkEiaBH8CYhnJQcOdNHZI+3OjcY09JnQtEVC5xC4nbW7Bvw==} - engines: {node: '>=16'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workerd-linux-arm64@1.20230518.0: - resolution: {integrity: sha512-q3HQvn3J4uEkE0cfDAGG8zqzSZrD47cavB/Tzv4mNutqwg6B4wL3ifjtGeB55tnP2K2KL0GVmX4tObcvpUF4BA==} - engines: {node: '>=16'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workerd-windows-64@1.20230518.0: - resolution: {integrity: sha512-vNEHKS5gKKduNOBYtQjcBopAmFT1iScuPWMZa2nJboSjOB9I/5oiVsUpSyk5Y2ARyrohXNz0y8D7p87YzTASWw==} - engines: {node: '>=16'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workers-types@4.20230518.0: - resolution: {integrity: sha512-A0w1V+5SUawGaaPRlhFhSC/SCDT9oQG8TMoWOKFLA4qbqagELqEAFD4KySBIkeVOvCBLT1DZSYBMCxbXddl0kw==} - dev: true - - /@esbuild-plugins/node-globals-polyfill@0.1.1(esbuild@0.16.3): - resolution: {integrity: sha512-MR0oAA+mlnJWrt1RQVQ+4VYuRJW/P2YmRTv1AsplObyvuBMnPHiizUF95HHYiSsMGLhyGtWufaq2XQg6+iurBg==} - peerDependencies: - esbuild: '*' - dependencies: - esbuild: 0.16.3 - dev: true - - /@esbuild-plugins/node-modules-polyfill@0.1.4(esbuild@0.16.3): - resolution: {integrity: sha512-uZbcXi0zbmKC/050p3gJnne5Qdzw8vkXIv+c2BW0Lsc1ji1SkrxbKPUy5Efr0blbTu1SL8w4eyfpnSdPg3G0Qg==} - peerDependencies: - esbuild: '*' - dependencies: - esbuild: 0.16.3 - escape-string-regexp: 4.0.0 - rollup-plugin-node-polyfills: 0.2.1 - dev: true - - /@esbuild/android-arm64@0.16.3: - resolution: {integrity: sha512-RolFVeinkeraDvN/OoRf1F/lP0KUfGNb5jxy/vkIMeRRChkrX/HTYN6TYZosRJs3a1+8wqpxAo5PI5hFmxyPRg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm@0.16.3: - resolution: {integrity: sha512-mueuEoh+s1eRbSJqq9KNBQwI4QhQV6sRXIfTyLXSHGMpyew61rOK4qY21uKbXl1iBoMb0AdL1deWFCQVlN2qHA==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-x64@0.16.3: - resolution: {integrity: sha512-SFpTUcIT1bIJuCCBMCQWq1bL2gPTjWoLZdjmIhjdcQHaUfV41OQfho6Ici5uvvkMmZRXIUGpM3GxysP/EU7ifQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-arm64@0.16.3: - resolution: {integrity: sha512-DO8WykMyB+N9mIDfI/Hug70Dk1KipavlGAecxS3jDUwAbTpDXj0Lcwzw9svkhxfpCagDmpaTMgxWK8/C/XcXvw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-x64@0.16.3: - resolution: {integrity: sha512-uEqZQ2omc6BvWqdCiyZ5+XmxuHEi1SPzpVxXCSSV2+Sh7sbXbpeNhHIeFrIpRjAs0lI1FmA1iIOxFozKBhKgRQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-arm64@0.16.3: - resolution: {integrity: sha512-nJansp3sSXakNkOD5i5mIz2Is/HjzIhFs49b1tjrPrpCmwgBmH9SSzhC/Z1UqlkivqMYkhfPwMw1dGFUuwmXhw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-x64@0.16.3: - resolution: {integrity: sha512-TfoDzLw+QHfc4a8aKtGSQ96Wa+6eimljjkq9HKR0rHlU83vw8aldMOUSJTUDxbcUdcgnJzPaX8/vGWm7vyV7ug==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm64@0.16.3: - resolution: {integrity: sha512-7I3RlsnxEFCHVZNBLb2w7unamgZ5sVwO0/ikE2GaYvYuUQs9Qte/w7TqWcXHtCwxvZx/2+F97ndiUQAWs47ZfQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm@0.16.3: - resolution: {integrity: sha512-VwswmSYwVAAq6LysV59Fyqk3UIjbhuc6wb3vEcJ7HEJUtFuLK9uXWuFoH1lulEbE4+5GjtHi3MHX+w1gNHdOWQ==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ia32@0.16.3: - resolution: {integrity: sha512-X8FDDxM9cqda2rJE+iblQhIMYY49LfvW4kaEjoFbTTQ4Go8G96Smj2w3BRTwA8IHGoi9dPOPGAX63dhuv19UqA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-loong64@0.16.3: - resolution: {integrity: sha512-hIbeejCOyO0X9ujfIIOKjBjNAs9XD/YdJ9JXAy1lHA+8UXuOqbFe4ErMCqMr8dhlMGBuvcQYGF7+kO7waj2KHw==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-mips64el@0.16.3: - resolution: {integrity: sha512-znFRzICT/V8VZQMt6rjb21MtAVJv/3dmKRMlohlShrbVXdBuOdDrGb+C2cZGQAR8RFyRe7HS6klmHq103WpmVw==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ppc64@0.16.3: - resolution: {integrity: sha512-EV7LuEybxhXrVTDpbqWF2yehYRNz5e5p+u3oQUS2+ZFpknyi1NXxr8URk4ykR8Efm7iu04//4sBg249yNOwy5Q==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-riscv64@0.16.3: - resolution: {integrity: sha512-uDxqFOcLzFIJ+r/pkTTSE9lsCEaV/Y6rMlQjUI9BkzASEChYL/aSQjZjchtEmdnVxDKETnUAmsaZ4pqK1eE5BQ==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-s390x@0.16.3: - resolution: {integrity: sha512-NbeREhzSxYwFhnCAQOQZmajsPYtX71Ufej3IQ8W2Gxskfz9DK58ENEju4SbpIj48VenktRASC52N5Fhyf/aliQ==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-x64@0.16.3: - resolution: {integrity: sha512-SDiG0nCixYO9JgpehoKgScwic7vXXndfasjnD5DLbp1xltANzqZ425l7LSdHynt19UWOcDjG9wJJzSElsPvk0w==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/netbsd-x64@0.16.3: - resolution: {integrity: sha512-AzbsJqiHEq1I/tUvOfAzCY15h4/7Ivp3ff/o1GpP16n48JMNAtbW0qui2WCgoIZArEHD0SUQ95gvR0oSO7ZbdA==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/openbsd-x64@0.16.3: - resolution: {integrity: sha512-gSABi8qHl8k3Cbi/4toAzHiykuBuWLZs43JomTcXkjMZVkp0gj3gg9mO+9HJW/8GB5H89RX/V0QP4JGL7YEEVg==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/sunos-x64@0.16.3: - resolution: {integrity: sha512-SF9Kch5Ete4reovvRO6yNjMxrvlfT0F0Flm+NPoUw5Z4Q3r1d23LFTgaLwm3Cp0iGbrU/MoUI+ZqwCv5XJijCw==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-arm64@0.16.3: - resolution: {integrity: sha512-u5aBonZIyGopAZyOnoPAA6fGsDeHByZ9CnEzyML9NqntK6D/xl5jteZUKm/p6nD09+v3pTM6TuUIqSPcChk5gg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-ia32@0.16.3: - resolution: {integrity: sha512-GlgVq1WpvOEhNioh74TKelwla9KDuAaLZrdxuuUgsP2vayxeLgVc+rbpIv0IYF4+tlIzq2vRhofV+KGLD+37EQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-x64@0.16.3: - resolution: {integrity: sha512-5/JuTd8OWW8UzEtyf19fbrtMJENza+C9JoPIkvItgTBQ1FO2ZLvjbPO6Xs54vk0s5JB5QsfieUEshRQfu7ZHow==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@eslint-community/eslint-utils@4.4.0(eslint@8.42.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.42.0 - eslint-visitor-keys: 3.4.1 - - /@eslint-community/regexpp@4.5.1: - resolution: {integrity: sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - /@eslint/eslintrc@2.0.3: - resolution: {integrity: sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.5.2 - globals: 13.20.0 - ignore: 5.2.4 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - /@eslint/js@8.42.0: - resolution: {integrity: sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - /@humanwhocodes/config-array@0.11.10: - resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} - engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - /@humanwhocodes/object-schema@1.2.1: - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} - - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 - - /@types/json-schema@7.0.12: - resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} - dev: false - - /@types/semver@7.5.0: - resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} - dev: false - - /@typescript-eslint/eslint-plugin@5.59.11(@typescript-eslint/parser@5.59.11)(eslint@8.42.0)(typescript@5.1.3): - resolution: {integrity: sha512-XxuOfTkCUiOSyBWIvHlUraLw/JT/6Io1365RO6ZuI88STKMavJZPNMU0lFcUTeQXEhHiv64CbxYxBNoDVSmghg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: + /@esbuild/linux-x64@0.16.3: + resolution: + { + integrity: sha512-SDiG0nCixYO9JgpehoKgScwic7vXXndfasjnD5DLbp1xltANzqZ425l7LSdHynt19UWOcDjG9wJJzSElsPvk0w==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true optional: true - dependencies: - '@eslint-community/regexpp': 4.5.1 - '@typescript-eslint/parser': 5.59.11(eslint@8.42.0)(typescript@5.1.3) - '@typescript-eslint/scope-manager': 5.59.11 - '@typescript-eslint/type-utils': 5.59.11(eslint@8.42.0)(typescript@5.1.3) - '@typescript-eslint/utils': 5.59.11(eslint@8.42.0)(typescript@5.1.3) - debug: 4.3.4 - eslint: 8.42.0 - grapheme-splitter: 1.0.4 - ignore: 5.2.4 - natural-compare-lite: 1.4.0 - semver: 7.5.1 - tsutils: 3.21.0(typescript@5.1.3) - typescript: 5.1.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/parser@5.59.11(eslint@8.42.0)(typescript@5.1.3): - resolution: {integrity: sha512-s9ZF3M+Nym6CAZEkJJeO2TFHHDsKAM3ecNkLuH4i4s8/RCPnF5JRip2GyviYkeEAcwGMJxkqG9h2dAsnA1nZpA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: + + /@esbuild/netbsd-x64@0.16.3: + resolution: + { + integrity: sha512-AzbsJqiHEq1I/tUvOfAzCY15h4/7Ivp3ff/o1GpP16n48JMNAtbW0qui2WCgoIZArEHD0SUQ95gvR0oSO7ZbdA==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.16.3: + resolution: + { + integrity: sha512-gSABi8qHl8k3Cbi/4toAzHiykuBuWLZs43JomTcXkjMZVkp0gj3gg9mO+9HJW/8GB5H89RX/V0QP4JGL7YEEVg==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true optional: true - dependencies: - '@typescript-eslint/scope-manager': 5.59.11 - '@typescript-eslint/types': 5.59.11 - '@typescript-eslint/typescript-estree': 5.59.11(typescript@5.1.3) - debug: 4.3.4 - eslint: 8.42.0 - typescript: 5.1.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/scope-manager@5.59.11: - resolution: {integrity: sha512-dHFOsxoLFtrIcSj5h0QoBT/89hxQONwmn3FOQ0GOQcLOOXm+MIrS8zEAhs4tWl5MraxCY3ZJpaXQQdFMc2Tu+Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.59.11 - '@typescript-eslint/visitor-keys': 5.59.11 - dev: false - - /@typescript-eslint/type-utils@5.59.11(eslint@8.42.0)(typescript@5.1.3): - resolution: {integrity: sha512-LZqVY8hMiVRF2a7/swmkStMYSoXMFlzL6sXV6U/2gL5cwnLWQgLEG8tjWPpaE4rMIdZ6VKWwcffPlo1jPfk43g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: + + /@esbuild/sunos-x64@0.16.3: + resolution: + { + integrity: sha512-SF9Kch5Ete4reovvRO6yNjMxrvlfT0F0Flm+NPoUw5Z4Q3r1d23LFTgaLwm3Cp0iGbrU/MoUI+ZqwCv5XJijCw==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true optional: true - dependencies: - '@typescript-eslint/typescript-estree': 5.59.11(typescript@5.1.3) - '@typescript-eslint/utils': 5.59.11(eslint@8.42.0)(typescript@5.1.3) - debug: 4.3.4 - eslint: 8.42.0 - tsutils: 3.21.0(typescript@5.1.3) - typescript: 5.1.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/types@5.59.11: - resolution: {integrity: sha512-epoN6R6tkvBYSc+cllrz+c2sOFWkbisJZWkOE+y3xHtvYaOE6Wk6B8e114McRJwFRjGvYdJwLXQH5c9osME/AA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: false - - /@typescript-eslint/typescript-estree@5.59.11(typescript@5.1.3): - resolution: {integrity: sha512-YupOpot5hJO0maupJXixi6l5ETdrITxeo5eBOeuV7RSKgYdU3G5cxO49/9WRnJq9EMrB7AuTSLH/bqOsXi7wPA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: + + /@esbuild/win32-arm64@0.16.3: + resolution: + { + integrity: sha512-u5aBonZIyGopAZyOnoPAA6fGsDeHByZ9CnEzyML9NqntK6D/xl5jteZUKm/p6nD09+v3pTM6TuUIqSPcChk5gg==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true optional: true - dependencies: - '@typescript-eslint/types': 5.59.11 - '@typescript-eslint/visitor-keys': 5.59.11 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.5.1 - tsutils: 3.21.0(typescript@5.1.3) - typescript: 5.1.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/utils@5.59.11(eslint@8.42.0)(typescript@5.1.3): - resolution: {integrity: sha512-didu2rHSOMUdJThLk4aZ1Or8IcO3HzCw/ZvEjTTIfjIrcdd5cvSIwwDy2AOlE7htSNp7QIZ10fLMyRCveesMLg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.42.0) - '@types/json-schema': 7.0.12 - '@types/semver': 7.5.0 - '@typescript-eslint/scope-manager': 5.59.11 - '@typescript-eslint/types': 5.59.11 - '@typescript-eslint/typescript-estree': 5.59.11(typescript@5.1.3) - eslint: 8.42.0 - eslint-scope: 5.1.1 - semver: 7.5.1 - transitivePeerDependencies: - - supports-color - - typescript - dev: false - - /@typescript-eslint/visitor-keys@5.59.11: - resolution: {integrity: sha512-KGYniTGG3AMTuKF9QBD7EIrvufkB6O6uX3knP73xbKLMpH+QRPcgnCxjWXSHjMRuOxFLovljqQgQpR0c7GvjoA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.59.11 - eslint-visitor-keys: 3.4.1 - dev: false - - /acorn-jsx@5.3.2(acorn@8.8.2): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.8.2 - - /acorn-walk@8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} - engines: {node: '>=0.4.0'} - dev: true - - /acorn@8.8.2: - resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} - engines: {node: '>=0.4.0'} - hasBin: true - - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: false - - /as-table@1.0.55: - resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} - dependencies: - printable-characters: 1.0.42 - dev: true - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: true - - /better-sqlite3@8.4.0: - resolution: {integrity: sha512-NmsNW1CQvqMszu/CFAJ3pLct6NEFlNfuGM6vw72KHkjOD1UDnL96XNN1BMQc1hiHo8vE2GbOWQYIpZ+YM5wrZw==} - requiresBuild: true - dependencies: - bindings: 1.5.0 - prebuild-install: 7.1.1 - dev: true - - /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: true - - /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: true - - /blake3-wasm@2.1.5: - resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} - dev: true - - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: true - - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: true - - /busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} - dependencies: - streamsearch: 1.1.0 - dev: true - - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - - /capnp-ts@0.7.0: - resolution: {integrity: sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==} - dependencies: - debug: 4.3.4 - tslib: 2.5.3 - transitivePeerDependencies: - - supports-color - dev: true - - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - dev: true - - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - /cookie@0.5.0: - resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} - engines: {node: '>= 0.6'} - dev: true - - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - /data-uri-to-buffer@2.0.2: - resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==} - dev: true - - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: + + /@esbuild/win32-ia32@0.16.3: + resolution: + { + integrity: sha512-GlgVq1WpvOEhNioh74TKelwla9KDuAaLZrdxuuUgsP2vayxeLgVc+rbpIv0IYF4+tlIzq2vRhofV+KGLD+37EQ==, + } + engines: { node: ">=12" } + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true optional: true - dependencies: - ms: 2.1.2 - - /decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - dependencies: - mimic-response: 3.1.0 - dev: true - - /deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - dev: true - - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - - /detect-libc@2.0.1: - resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} - engines: {node: '>=8'} - dev: true - - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - dev: false - - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dependencies: - esutils: 2.0.3 - - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - dependencies: - once: 1.4.0 - dev: true - - /esbuild@0.16.3: - resolution: {integrity: sha512-71f7EjPWTiSguen8X/kxEpkAS7BFHwtQKisCDDV3Y4GLGWBaoSCyD5uXkaUew6JDzA9FEN1W23mdnSwW9kqCeg==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.16.3 - '@esbuild/android-arm64': 0.16.3 - '@esbuild/android-x64': 0.16.3 - '@esbuild/darwin-arm64': 0.16.3 - '@esbuild/darwin-x64': 0.16.3 - '@esbuild/freebsd-arm64': 0.16.3 - '@esbuild/freebsd-x64': 0.16.3 - '@esbuild/linux-arm': 0.16.3 - '@esbuild/linux-arm64': 0.16.3 - '@esbuild/linux-ia32': 0.16.3 - '@esbuild/linux-loong64': 0.16.3 - '@esbuild/linux-mips64el': 0.16.3 - '@esbuild/linux-ppc64': 0.16.3 - '@esbuild/linux-riscv64': 0.16.3 - '@esbuild/linux-s390x': 0.16.3 - '@esbuild/linux-x64': 0.16.3 - '@esbuild/netbsd-x64': 0.16.3 - '@esbuild/openbsd-x64': 0.16.3 - '@esbuild/sunos-x64': 0.16.3 - '@esbuild/win32-arm64': 0.16.3 - '@esbuild/win32-ia32': 0.16.3 - '@esbuild/win32-x64': 0.16.3 - dev: true - - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - /eslint-config-google@0.14.0(eslint@8.42.0): - resolution: {integrity: sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==} - engines: {node: '>=0.10.0'} - peerDependencies: - eslint: '>=5.16.0' - dependencies: - eslint: 8.42.0 - dev: true - - /eslint-plugin-json@3.1.0: - resolution: {integrity: sha512-MrlG2ynFEHe7wDGwbUuFPsaT2b1uhuEFhJ+W1f1u+1C2EkXmTYJp4B1aAdQQ8M+CC3t//N/oRKiIVw14L2HR1g==} - engines: {node: '>=12.0'} - dependencies: - lodash: 4.17.21 - vscode-json-languageservice: 4.2.1 - dev: true - - /eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - dev: false - - /eslint-scope@7.2.0: - resolution: {integrity: sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - /eslint-visitor-keys@3.4.1: - resolution: {integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - /eslint@8.42.0: - resolution: {integrity: sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.42.0) - '@eslint-community/regexpp': 4.5.1 - '@eslint/eslintrc': 2.0.3 - '@eslint/js': 8.42.0 - '@humanwhocodes/config-array': 0.11.10 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.0 - eslint-visitor-keys: 3.4.1 - espree: 9.5.2 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.20.0 - graphemer: 1.4.0 - ignore: 5.2.4 - import-fresh: 3.3.0 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.1 - strip-ansi: 6.0.1 - strip-json-comments: 3.1.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - - /espree@9.5.2: - resolution: {integrity: sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - acorn: 8.8.2 - acorn-jsx: 5.3.2(acorn@8.8.2) - eslint-visitor-keys: 3.4.1 - - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} - dependencies: - estraverse: 5.3.0 - - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - dependencies: - estraverse: 5.3.0 - - /estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - dev: false - - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - /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'} - - /exit-hook@2.2.1: - resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} - engines: {node: '>=6'} - dev: true - - /expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} - dev: true - - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - /fast-glob@3.2.12: - resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: false - - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} - dependencies: - reusify: 1.0.4 - - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flat-cache: 3.0.4 - - /file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - dev: true - - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - - /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 - - /flat-cache@3.0.4: - resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flatted: 3.2.7 - rimraf: 3.0.2 - - /flatted@3.2.7: - resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} - - /fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - dev: true - - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /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 - - /github-from-package@0.0.0: - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - dev: true - - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - dependencies: - is-glob: 4.0.3 - - /glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - dev: true - - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - /globals@13.20.0: - resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.20.2 - - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.2.12 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 3.0.0 - dev: false - - /grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} - dev: false - - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - /http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - dev: true - - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: true - - /ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} - engines: {node: '>= 4'} - - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: true - - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - dependencies: - binary-extensions: 2.2.0 - dev: true - - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - /itty-router@4.0.9: - resolution: {integrity: sha512-al8PIAJEWuWZcg4iwLcLiF7R9njsIQxrT27ik2Vfp1Mi5CBEVr1BDKbA1xpOyqkRbj9cCBQiTRpLIKnNO2YKlQ==} - dev: false - - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - dependencies: - argparse: 2.0.1 - - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - dev: true - - /kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - dev: true - - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - dependencies: - p-locate: 5.0.0 - - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: true - - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - - /magic-string@0.25.9: - resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} - dependencies: - sourcemap-codec: 1.4.8 - dev: true - - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: false - - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - dev: false - - /mime@3.0.0: - resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} - engines: {node: '>=10.0.0'} - hasBin: true - dev: true - - /mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - dev: true - - /miniflare@3.0.1: - resolution: {integrity: sha512-aLOB8d26lOTn493GOv1LmpGHVLSxmeT4MixPG/k3Ze10j0wDKnMj8wsFgbZ6Q4cr1N4faf8O3IbNRJuQ+rLoJA==} - engines: {node: '>=16.13'} - dependencies: - acorn: 8.8.2 - acorn-walk: 8.2.0 - better-sqlite3: 8.4.0 - capnp-ts: 0.7.0 - exit-hook: 2.2.1 - glob-to-regexp: 0.4.1 - http-cache-semantics: 4.1.1 - kleur: 4.1.5 - source-map-support: 0.5.21 - stoppable: 1.1.0 - undici: 5.22.1 - workerd: 1.20230518.0 - ws: 8.13.0 - youch: 3.2.3 - zod: 3.21.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 - - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true - - /mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - dev: true - - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - /mustache@4.2.0: - resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} - hasBin: true - dev: true - - /nanoid@3.3.6: - resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} - 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==} - dev: true - - /natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - dev: false - - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - - /node-abi@3.44.0: - resolution: {integrity: sha512-MYjZTiAETGG28/7fBH1RjuY7vzDwYC5q5U4whCgM4jNEQcC0gAvN339LxXukmL2T2tGpzYTfp+LZ5RN7E5DwEg==} - engines: {node: '>=10'} - dependencies: - semver: 7.5.1 - dev: true - - /node-forge@1.3.1: - resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} - engines: {node: '>= 6.13.0'} - dev: true - - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: true - - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - - /optionator@0.9.1: - resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} - engines: {node: '>= 0.8.0'} - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.3 - - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - dependencies: - yocto-queue: 0.1.0 - - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - dependencies: - p-limit: 3.1.0 - - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - dependencies: - callsites: 3.1.0 - - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - /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'} - dev: false - - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - /prebuild-install@7.1.1: - resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} - engines: {node: '>=10'} - hasBin: true - dependencies: - detect-libc: 2.0.1 - 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.44.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: true - - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - - /prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - dev: false - - /printable-characters@1.0.42: - resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} - dev: true - - /pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - dev: true - - /punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} - engines: {node: '>=6'} - - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - /range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - dev: false - - /rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - dev: true - - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - dev: true - - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - dev: true - - /render2@1.2.1: - resolution: {integrity: sha512-HfLOYtG6p6jx6GG6uub7YGJ4iv+GlOwFmDtGdtSe2NQJ6peMZ0u76k7GAZ0z7GSf4e9UfeCcQxme4Mayh7DLqw==} - dependencies: - range-parser: 1.2.1 - dev: false - - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true - dependencies: - glob: 7.2.3 - - /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. - 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 - dev: true - - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - dependencies: - queue-microtask: 1.2.3 - - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: true - - /selfsigned@2.1.1: - resolution: {integrity: sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==} - engines: {node: '>=10'} - dependencies: - node-forge: 1.3.1 - dev: true - - /semver@7.5.1: - resolution: {integrity: sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - /simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - dev: true - - /simple-get@4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 - dev: true - - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: false - - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - dev: true - - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - dev: true - - /source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} - dev: true - - /sourcemap-codec@1.4.8: - resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} - deprecated: Please use @jridgewell/sourcemap-codec instead - dev: true - - /stacktracey@2.1.8: - resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==} - dependencies: - as-table: 1.0.55 - get-source: 2.0.12 - dev: true - - /stoppable@1.1.0: - resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} - engines: {node: '>=4', npm: '>=6'} - dev: true - - /streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} - dev: true - - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - - /strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - dev: true - - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - - /tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.0 - tar-stream: 2.2.0 - dev: true - - /tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - 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: true - - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - - /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: false - - /tslib@2.5.3: - resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} - dev: true - - /tsutils@3.21.0(typescript@5.1.3): - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - dependencies: - tslib: 1.14.1 - typescript: 5.1.3 - dev: false - - /tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - - /typescript@5.1.3: - resolution: {integrity: sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==} - engines: {node: '>=14.17'} - hasBin: true - - /undici@5.22.1: - resolution: {integrity: sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==} - engines: {node: '>=14.0'} - dependencies: - busboy: 1.6.0 - dev: true - - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - dependencies: - punycode: 2.3.0 - - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: true - - /vscode-json-languageservice@4.2.1: - resolution: {integrity: sha512-xGmv9QIWs2H8obGbWg+sIPI/3/pFgj/5OWBhNzs00BkYQ9UaB2F6JJaGB/2/YOZJ3BvLXQTC4Q7muqU25QgAhA==} - dependencies: - jsonc-parser: 3.2.0 - vscode-languageserver-textdocument: 1.0.8 - vscode-languageserver-types: 3.17.3 - vscode-nls: 5.2.0 - vscode-uri: 3.0.7 - dev: true - - /vscode-languageserver-textdocument@1.0.8: - resolution: {integrity: sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==} - dev: true - - /vscode-languageserver-types@3.17.3: - resolution: {integrity: sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA==} - dev: true - - /vscode-nls@5.2.0: - resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==} - dev: true - - /vscode-uri@3.0.7: - resolution: {integrity: sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==} - dev: true - - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - - /word-wrap@1.2.3: - resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} - engines: {node: '>=0.10.0'} - - /workerd@1.20230518.0: - resolution: {integrity: sha512-VNmK0zoNZXrwEEx77O/oQDVUzzyDjf5kKKK8bty+FmKCd5EQJCpqi8NlRKWLGMyyYrKm86MFz0kAsreTEs7HHA==} - engines: {node: '>=16'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20230518.0 - '@cloudflare/workerd-darwin-arm64': 1.20230518.0 - '@cloudflare/workerd-linux-64': 1.20230518.0 - '@cloudflare/workerd-linux-arm64': 1.20230518.0 - '@cloudflare/workerd-windows-64': 1.20230518.0 - dev: true - - /wrangler@3.1.1: - resolution: {integrity: sha512-iG6QGOt+qgSm7UroJ8IJ+JdXEcDcW7yp9ilP0V7alCGhKm8shqa/M1iyMOpukZSCSZo8Vmn5nH2C9OY1PR3dQQ==} - engines: {node: '>=16.13.0'} - hasBin: true - dependencies: - '@cloudflare/kv-asset-handler': 0.2.0 - '@esbuild-plugins/node-globals-polyfill': 0.1.1(esbuild@0.16.3) - '@esbuild-plugins/node-modules-polyfill': 0.1.4(esbuild@0.16.3) - blake3-wasm: 2.1.5 - chokidar: 3.5.3 - esbuild: 0.16.3 - miniflare: 3.0.1 - nanoid: 3.3.6 - path-to-regexp: 6.2.1 - selfsigned: 2.1.1 - source-map: 0.7.4 - xxhash-wasm: 1.0.2 - optionalDependencies: - fsevents: 2.3.2 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - /ws@8.13.0: - resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: + + /@esbuild/win32-x64@0.16.3: + resolution: + { + integrity: sha512-5/JuTd8OWW8UzEtyf19fbrtMJENza+C9JoPIkvItgTBQ1FO2ZLvjbPO6Xs54vk0s5JB5QsfieUEshRQfu7ZHow==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true optional: true - utf-8-validate: + + /@eslint-community/eslint-utils@4.4.0(eslint@8.42.0): + resolution: + { + integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.42.0 + eslint-visitor-keys: 3.4.1 + + /@eslint-community/regexpp@4.5.1: + resolution: + { + integrity: sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==, + } + engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } + + /@eslint/eslintrc@2.0.3: + resolution: + { + integrity: sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.5.2 + globals: 13.20.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + /@eslint/js@8.42.0: + resolution: + { + integrity: sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + + /@humanwhocodes/config-array@0.11.10: + resolution: + { + integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==, + } + engines: { node: ">=10.10.0" } + dependencies: + "@humanwhocodes/object-schema": 1.2.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + /@humanwhocodes/module-importer@1.0.1: + resolution: + { + integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, + } + engines: { node: ">=12.22" } + + /@humanwhocodes/object-schema@1.2.1: + resolution: + { + integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==, + } + + /@nodelib/fs.scandir@2.1.5: + resolution: + { + integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, + } + engines: { node: ">= 8" } + dependencies: + "@nodelib/fs.stat": 2.0.5 + run-parallel: 1.2.0 + + /@nodelib/fs.stat@2.0.5: + resolution: + { + integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, + } + engines: { node: ">= 8" } + + /@nodelib/fs.walk@1.2.8: + resolution: + { + integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, + } + engines: { node: ">= 8" } + dependencies: + "@nodelib/fs.scandir": 2.1.5 + fastq: 1.15.0 + + /@types/json-schema@7.0.12: + resolution: + { + integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==, + } + dev: false + + /@types/semver@7.5.0: + resolution: + { + integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==, + } + dev: false + + /@typescript-eslint/eslint-plugin@5.59.11(@typescript-eslint/parser@5.59.11)(eslint@8.42.0)(typescript@5.1.3): + resolution: + { + integrity: sha512-XxuOfTkCUiOSyBWIvHlUraLw/JT/6Io1365RO6ZuI88STKMavJZPNMU0lFcUTeQXEhHiv64CbxYxBNoDVSmghg==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + "@typescript-eslint/parser": ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@eslint-community/regexpp": 4.5.1 + "@typescript-eslint/parser": 5.59.11(eslint@8.42.0)(typescript@5.1.3) + "@typescript-eslint/scope-manager": 5.59.11 + "@typescript-eslint/type-utils": 5.59.11(eslint@8.42.0)(typescript@5.1.3) + "@typescript-eslint/utils": 5.59.11(eslint@8.42.0)(typescript@5.1.3) + debug: 4.3.4 + eslint: 8.42.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.4 + natural-compare-lite: 1.4.0 + semver: 7.5.1 + tsutils: 3.21.0(typescript@5.1.3) + typescript: 5.1.3 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/parser@5.59.11(eslint@8.42.0)(typescript@5.1.3): + resolution: + { + integrity: sha512-s9ZF3M+Nym6CAZEkJJeO2TFHHDsKAM3ecNkLuH4i4s8/RCPnF5JRip2GyviYkeEAcwGMJxkqG9h2dAsnA1nZpA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@typescript-eslint/scope-manager": 5.59.11 + "@typescript-eslint/types": 5.59.11 + "@typescript-eslint/typescript-estree": 5.59.11(typescript@5.1.3) + debug: 4.3.4 + eslint: 8.42.0 + typescript: 5.1.3 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/scope-manager@5.59.11: + resolution: + { + integrity: sha512-dHFOsxoLFtrIcSj5h0QoBT/89hxQONwmn3FOQ0GOQcLOOXm+MIrS8zEAhs4tWl5MraxCY3ZJpaXQQdFMc2Tu+Q==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + "@typescript-eslint/types": 5.59.11 + "@typescript-eslint/visitor-keys": 5.59.11 + dev: false + + /@typescript-eslint/type-utils@5.59.11(eslint@8.42.0)(typescript@5.1.3): + resolution: + { + integrity: sha512-LZqVY8hMiVRF2a7/swmkStMYSoXMFlzL6sXV6U/2gL5cwnLWQgLEG8tjWPpaE4rMIdZ6VKWwcffPlo1jPfk43g==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + eslint: "*" + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@typescript-eslint/typescript-estree": 5.59.11(typescript@5.1.3) + "@typescript-eslint/utils": 5.59.11(eslint@8.42.0)(typescript@5.1.3) + debug: 4.3.4 + eslint: 8.42.0 + tsutils: 3.21.0(typescript@5.1.3) + typescript: 5.1.3 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/types@5.59.11: + resolution: + { + integrity: sha512-epoN6R6tkvBYSc+cllrz+c2sOFWkbisJZWkOE+y3xHtvYaOE6Wk6B8e114McRJwFRjGvYdJwLXQH5c9osME/AA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dev: false + + /@typescript-eslint/typescript-estree@5.59.11(typescript@5.1.3): + resolution: + { + integrity: sha512-YupOpot5hJO0maupJXixi6l5ETdrITxeo5eBOeuV7RSKgYdU3G5cxO49/9WRnJq9EMrB7AuTSLH/bqOsXi7wPA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@typescript-eslint/types": 5.59.11 + "@typescript-eslint/visitor-keys": 5.59.11 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.1 + tsutils: 3.21.0(typescript@5.1.3) + typescript: 5.1.3 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/utils@5.59.11(eslint@8.42.0)(typescript@5.1.3): + resolution: + { + integrity: sha512-didu2rHSOMUdJThLk4aZ1Or8IcO3HzCw/ZvEjTTIfjIrcdd5cvSIwwDy2AOlE7htSNp7QIZ10fLMyRCveesMLg==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + "@eslint-community/eslint-utils": 4.4.0(eslint@8.42.0) + "@types/json-schema": 7.0.12 + "@types/semver": 7.5.0 + "@typescript-eslint/scope-manager": 5.59.11 + "@typescript-eslint/types": 5.59.11 + "@typescript-eslint/typescript-estree": 5.59.11(typescript@5.1.3) + eslint: 8.42.0 + eslint-scope: 5.1.1 + semver: 7.5.1 + transitivePeerDependencies: + - supports-color + - typescript + dev: false + + /@typescript-eslint/visitor-keys@5.59.11: + resolution: + { + integrity: sha512-KGYniTGG3AMTuKF9QBD7EIrvufkB6O6uX3knP73xbKLMpH+QRPcgnCxjWXSHjMRuOxFLovljqQgQpR0c7GvjoA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + "@typescript-eslint/types": 5.59.11 + eslint-visitor-keys: 3.4.1 + dev: false + + /acorn-jsx@5.3.2(acorn@8.8.2): + resolution: + { + integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, + } + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.8.2 + + /acorn-walk@8.2.0: + resolution: + { + integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==, + } + engines: { node: ">=0.4.0" } + dev: true + + /acorn@8.8.2: + resolution: + { + integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==, + } + engines: { node: ">=0.4.0" } + hasBin: true + + /ajv@6.12.6: + resolution: + { + integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, + } + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + /ansi-regex@5.0.1: + resolution: + { + integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, + } + engines: { node: ">=8" } + + /ansi-styles@4.3.0: + resolution: + { + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, + } + engines: { node: ">=8" } + dependencies: + color-convert: 2.0.1 + + /anymatch@3.1.3: + resolution: + { + integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, + } + engines: { node: ">= 8" } + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /argparse@2.0.1: + resolution: + { + integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, + } + + /array-union@2.1.0: + resolution: + { + integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, + } + engines: { node: ">=8" } + dev: false + + /as-table@1.0.55: + resolution: + { + integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==, + } + dependencies: + printable-characters: 1.0.42 + dev: true + + /balanced-match@1.0.2: + resolution: + { + integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, + } + + /base64-js@1.5.1: + resolution: + { + integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, + } + dev: true + + /better-sqlite3@8.4.0: + resolution: + { + integrity: sha512-NmsNW1CQvqMszu/CFAJ3pLct6NEFlNfuGM6vw72KHkjOD1UDnL96XNN1BMQc1hiHo8vE2GbOWQYIpZ+YM5wrZw==, + } + requiresBuild: true + dependencies: + bindings: 1.5.0 + prebuild-install: 7.1.1 + dev: true + + /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: true + + /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: true + + /blake3-wasm@2.1.5: + resolution: + { + integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==, + } + dev: true + + /brace-expansion@1.1.11: + resolution: + { + integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, + } + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /braces@3.0.2: + resolution: + { + integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==, + } + engines: { node: ">=8" } + dependencies: + fill-range: 7.0.1 + + /buffer-from@1.1.2: + resolution: + { + integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, + } + dev: true + + /buffer@5.7.1: + resolution: + { + integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, + } + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + + /busboy@1.6.0: + resolution: + { + integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==, + } + engines: { node: ">=10.16.0" } + dependencies: + streamsearch: 1.1.0 + dev: true + + /callsites@3.1.0: + resolution: + { + integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, + } + engines: { node: ">=6" } + + /capnp-ts@0.7.0: + resolution: + { + integrity: sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==, + } + dependencies: + debug: 4.3.4 + tslib: 2.5.3 + transitivePeerDependencies: + - supports-color + dev: true + + /chalk@4.1.2: + resolution: + { + integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, + } + engines: { node: ">=10" } + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /chokidar@3.5.3: + resolution: + { + integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, + } + engines: { node: ">= 8.10.0" } + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /chownr@1.1.4: + resolution: + { + integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==, + } + dev: true + + /color-convert@2.0.1: + resolution: + { + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, + } + engines: { node: ">=7.0.0" } + dependencies: + color-name: 1.1.4 + + /color-name@1.1.4: + resolution: + { + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, + } + + /concat-map@0.0.1: + resolution: + { + integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, + } + + /cookie@0.5.0: + resolution: + { + integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==, + } + engines: { node: ">= 0.6" } + dev: true + + /cross-spawn@7.0.3: + resolution: + { + integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, + } + engines: { node: ">= 8" } + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + /data-uri-to-buffer@2.0.2: + resolution: + { + integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==, + } + dev: true + + /debug@4.3.4: + resolution: + { + integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, + } + engines: { node: ">=6.0" } + peerDependencies: + supports-color: "*" + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /decompress-response@6.0.0: + resolution: + { + integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==, + } + engines: { node: ">=10" } + dependencies: + mimic-response: 3.1.0 + dev: true + + /deep-extend@0.6.0: + resolution: + { + integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==, + } + engines: { node: ">=4.0.0" } + dev: true + + /deep-is@0.1.4: + resolution: + { + integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, + } + + /detect-libc@2.0.1: + resolution: + { + integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==, + } + engines: { node: ">=8" } + dev: true + + /dir-glob@3.0.1: + resolution: + { + integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, + } + engines: { node: ">=8" } + dependencies: + path-type: 4.0.0 + dev: false + + /doctrine@3.0.0: + resolution: + { + integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==, + } + engines: { node: ">=6.0.0" } + dependencies: + esutils: 2.0.3 + + /end-of-stream@1.4.4: + resolution: + { + integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, + } + dependencies: + once: 1.4.0 + dev: true + + /esbuild@0.16.3: + resolution: + { + integrity: sha512-71f7EjPWTiSguen8X/kxEpkAS7BFHwtQKisCDDV3Y4GLGWBaoSCyD5uXkaUew6JDzA9FEN1W23mdnSwW9kqCeg==, + } + engines: { node: ">=12" } + hasBin: true + requiresBuild: true + optionalDependencies: + "@esbuild/android-arm": 0.16.3 + "@esbuild/android-arm64": 0.16.3 + "@esbuild/android-x64": 0.16.3 + "@esbuild/darwin-arm64": 0.16.3 + "@esbuild/darwin-x64": 0.16.3 + "@esbuild/freebsd-arm64": 0.16.3 + "@esbuild/freebsd-x64": 0.16.3 + "@esbuild/linux-arm": 0.16.3 + "@esbuild/linux-arm64": 0.16.3 + "@esbuild/linux-ia32": 0.16.3 + "@esbuild/linux-loong64": 0.16.3 + "@esbuild/linux-mips64el": 0.16.3 + "@esbuild/linux-ppc64": 0.16.3 + "@esbuild/linux-riscv64": 0.16.3 + "@esbuild/linux-s390x": 0.16.3 + "@esbuild/linux-x64": 0.16.3 + "@esbuild/netbsd-x64": 0.16.3 + "@esbuild/openbsd-x64": 0.16.3 + "@esbuild/sunos-x64": 0.16.3 + "@esbuild/win32-arm64": 0.16.3 + "@esbuild/win32-ia32": 0.16.3 + "@esbuild/win32-x64": 0.16.3 + dev: true + + /escape-string-regexp@4.0.0: + resolution: + { + integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, + } + engines: { node: ">=10" } + + /eslint-config-google@0.14.0(eslint@8.42.0): + resolution: + { + integrity: sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==, + } + engines: { node: ">=0.10.0" } + peerDependencies: + eslint: ">=5.16.0" + dependencies: + eslint: 8.42.0 + dev: true + + /eslint-plugin-json@3.1.0: + resolution: + { + integrity: sha512-MrlG2ynFEHe7wDGwbUuFPsaT2b1uhuEFhJ+W1f1u+1C2EkXmTYJp4B1aAdQQ8M+CC3t//N/oRKiIVw14L2HR1g==, + } + engines: { node: ">=12.0" } + dependencies: + lodash: 4.17.21 + vscode-json-languageservice: 4.2.1 + dev: true + + /eslint-scope@5.1.1: + resolution: + { + integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==, + } + engines: { node: ">=8.0.0" } + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: false + + /eslint-scope@7.2.0: + resolution: + { + integrity: sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + /eslint-visitor-keys@3.4.1: + resolution: + { + integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + + /eslint@8.42.0: + resolution: + { + integrity: sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + hasBin: true + dependencies: + "@eslint-community/eslint-utils": 4.4.0(eslint@8.42.0) + "@eslint-community/regexpp": 4.5.1 + "@eslint/eslintrc": 2.0.3 + "@eslint/js": 8.42.0 + "@humanwhocodes/config-array": 0.11.10 + "@humanwhocodes/module-importer": 1.0.1 + "@nodelib/fs.walk": 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.0 + eslint-visitor-keys: 3.4.1 + espree: 9.5.2 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.20.0 + graphemer: 1.4.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.1 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + /espree@9.5.2: + resolution: + { + integrity: sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + acorn: 8.8.2 + acorn-jsx: 5.3.2(acorn@8.8.2) + eslint-visitor-keys: 3.4.1 + + /esquery@1.5.0: + resolution: + { + integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==, + } + engines: { node: ">=0.10" } + dependencies: + estraverse: 5.3.0 + + /esrecurse@4.3.0: + resolution: + { + integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, + } + engines: { node: ">=4.0" } + dependencies: + estraverse: 5.3.0 + + /estraverse@4.3.0: + resolution: + { + integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==, + } + engines: { node: ">=4.0" } + dev: false + + /estraverse@5.3.0: + resolution: + { + integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, + } + engines: { node: ">=4.0" } + + /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" } + + /exit-hook@2.2.1: + resolution: + { + integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==, + } + engines: { node: ">=6" } + dev: true + + /expand-template@2.0.3: + resolution: + { + integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==, + } + engines: { node: ">=6" } + dev: true + + /fast-deep-equal@3.1.3: + resolution: + { + integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, + } + + /fast-glob@3.2.12: + resolution: + { + integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==, + } + engines: { node: ">=8.6.0" } + dependencies: + "@nodelib/fs.stat": 2.0.5 + "@nodelib/fs.walk": 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: false + + /fast-json-stable-stringify@2.1.0: + resolution: + { + integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, + } + + /fast-levenshtein@2.0.6: + resolution: + { + integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, + } + + /fastq@1.15.0: + resolution: + { + integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==, + } + dependencies: + reusify: 1.0.4 + + /file-entry-cache@6.0.1: + resolution: + { + integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==, + } + engines: { node: ^10.12.0 || >=12.0.0 } + dependencies: + flat-cache: 3.0.4 + + /file-uri-to-path@1.0.0: + resolution: + { + integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==, + } + dev: true + + /fill-range@7.0.1: + resolution: + { + integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==, + } + engines: { node: ">=8" } + dependencies: + to-regex-range: 5.0.1 + + /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 + + /flat-cache@3.0.4: + resolution: + { + integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==, + } + engines: { node: ^10.12.0 || >=12.0.0 } + dependencies: + flatted: 3.2.7 + rimraf: 3.0.2 + + /flatted@3.2.7: + resolution: + { + integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==, + } + + /fs-constants@1.0.0: + resolution: + { + integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==, + } + dev: true + + /fs.realpath@1.0.0: + resolution: + { + integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, + } + + /fsevents@2.3.2: + resolution: + { + integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==, + } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + os: [darwin] + requiresBuild: true + dev: true optional: true - dev: true - - /xxhash-wasm@1.0.2: - resolution: {integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==} - dev: true - - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - - /youch@3.2.3: - resolution: {integrity: sha512-ZBcWz/uzZaQVdCvfV4uk616Bbpf2ee+F/AvuKDR5EwX/Y4v06xWdtMluqTD7+KlZdM93lLm9gMZYo0sKBS0pgw==} - dependencies: - cookie: 0.5.0 - mustache: 4.2.0 - stacktracey: 2.1.8 - dev: true - - /zod@3.21.4: - resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} - dev: true + + /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 + + /github-from-package@0.0.0: + resolution: + { + integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==, + } + dev: true + + /glob-parent@5.1.2: + resolution: + { + integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, + } + engines: { node: ">= 6" } + dependencies: + is-glob: 4.0.3 + + /glob-parent@6.0.2: + resolution: + { + integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, + } + engines: { node: ">=10.13.0" } + dependencies: + is-glob: 4.0.3 + + /glob-to-regexp@0.4.1: + resolution: + { + integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==, + } + dev: true + + /glob@7.2.3: + resolution: + { + integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, + } + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /globals@13.20.0: + resolution: + { + integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==, + } + engines: { node: ">=8" } + dependencies: + type-fest: 0.20.2 + + /globby@11.1.0: + resolution: + { + integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, + } + engines: { node: ">=10" } + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.2.12 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: false + + /grapheme-splitter@1.0.4: + resolution: + { + integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==, + } + dev: false + + /graphemer@1.4.0: + resolution: + { + integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, + } + + /has-flag@4.0.0: + resolution: + { + integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, + } + engines: { node: ">=8" } + + /http-cache-semantics@4.1.1: + resolution: + { + integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==, + } + dev: true + + /ieee754@1.2.1: + resolution: + { + integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, + } + dev: true + + /ignore@5.2.4: + resolution: + { + integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==, + } + engines: { node: ">= 4" } + + /import-fresh@3.3.0: + resolution: + { + integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, + } + engines: { node: ">=6" } + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + /imurmurhash@0.1.4: + resolution: + { + integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, + } + engines: { node: ">=0.8.19" } + + /inflight@1.0.6: + resolution: + { + integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, + } + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits@2.0.4: + resolution: + { + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, + } + + /ini@1.3.8: + resolution: + { + integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, + } + dev: true + + /is-binary-path@2.1.0: + resolution: + { + integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, + } + engines: { node: ">=8" } + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-extglob@2.1.1: + resolution: + { + integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, + } + engines: { node: ">=0.10.0" } + + /is-glob@4.0.3: + resolution: + { + integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, + } + engines: { node: ">=0.10.0" } + dependencies: + is-extglob: 2.1.1 + + /is-number@7.0.0: + resolution: + { + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, + } + engines: { node: ">=0.12.0" } + + /is-path-inside@3.0.3: + resolution: + { + integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, + } + engines: { node: ">=8" } + + /isexe@2.0.0: + resolution: + { + integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, + } + + /itty-router@4.0.9: + resolution: + { + integrity: sha512-al8PIAJEWuWZcg4iwLcLiF7R9njsIQxrT27ik2Vfp1Mi5CBEVr1BDKbA1xpOyqkRbj9cCBQiTRpLIKnNO2YKlQ==, + } + dev: false + + /js-yaml@4.1.0: + resolution: + { + integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, + } + hasBin: true + dependencies: + argparse: 2.0.1 + + /json-schema-traverse@0.4.1: + resolution: + { + integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, + } + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: + { + integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, + } + + /jsonc-parser@3.2.0: + resolution: + { + integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==, + } + dev: true + + /kleur@4.1.5: + resolution: + { + integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==, + } + engines: { node: ">=6" } + dev: true + + /levn@0.4.1: + resolution: + { + integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, + } + engines: { node: ">= 0.8.0" } + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + /locate-path@6.0.0: + resolution: + { + integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, + } + engines: { node: ">=10" } + dependencies: + p-locate: 5.0.0 + + /lodash.merge@4.6.2: + resolution: + { + integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, + } + + /lodash@4.17.21: + resolution: + { + integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, + } + dev: true + + /lru-cache@6.0.0: + resolution: + { + integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, + } + engines: { node: ">=10" } + dependencies: + yallist: 4.0.0 + + /magic-string@0.25.9: + resolution: + { + integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==, + } + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /merge2@1.4.1: + resolution: + { + integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, + } + engines: { node: ">= 8" } + dev: false + + /micromatch@4.0.5: + resolution: + { + integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, + } + engines: { node: ">=8.6" } + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: false + + /mime@3.0.0: + resolution: + { + integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==, + } + engines: { node: ">=10.0.0" } + hasBin: true + dev: true + + /mimic-response@3.1.0: + resolution: + { + integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==, + } + engines: { node: ">=10" } + dev: true + + /miniflare@3.0.1: + resolution: + { + integrity: sha512-aLOB8d26lOTn493GOv1LmpGHVLSxmeT4MixPG/k3Ze10j0wDKnMj8wsFgbZ6Q4cr1N4faf8O3IbNRJuQ+rLoJA==, + } + engines: { node: ">=16.13" } + dependencies: + acorn: 8.8.2 + acorn-walk: 8.2.0 + better-sqlite3: 8.4.0 + capnp-ts: 0.7.0 + exit-hook: 2.2.1 + glob-to-regexp: 0.4.1 + http-cache-semantics: 4.1.1 + kleur: 4.1.5 + source-map-support: 0.5.21 + stoppable: 1.1.0 + undici: 5.22.1 + workerd: 1.20230518.0 + ws: 8.13.0 + youch: 3.2.3 + zod: 3.21.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 + + /minimist@1.2.8: + resolution: + { + integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, + } + dev: true + + /mkdirp-classic@0.5.3: + resolution: + { + integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==, + } + dev: true + + /ms@2.1.2: + resolution: + { + integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, + } + + /mustache@4.2.0: + resolution: + { + integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==, + } + hasBin: true + dev: true + + /nanoid@3.3.6: + resolution: + { + integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==, + } + 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==, + } + dev: true + + /natural-compare-lite@1.4.0: + resolution: + { + integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==, + } + dev: false + + /natural-compare@1.4.0: + resolution: + { + integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, + } + + /node-abi@3.44.0: + resolution: + { + integrity: sha512-MYjZTiAETGG28/7fBH1RjuY7vzDwYC5q5U4whCgM4jNEQcC0gAvN339LxXukmL2T2tGpzYTfp+LZ5RN7E5DwEg==, + } + engines: { node: ">=10" } + dependencies: + semver: 7.5.1 + dev: true + + /node-forge@1.3.1: + resolution: + { + integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==, + } + engines: { node: ">= 6.13.0" } + dev: true + + /normalize-path@3.0.0: + resolution: + { + integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, + } + engines: { node: ">=0.10.0" } + dev: true + + /once@1.4.0: + resolution: + { + integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, + } + dependencies: + wrappy: 1.0.2 + + /optionator@0.9.1: + resolution: + { + integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==, + } + engines: { node: ">= 0.8.0" } + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.3 + + /p-limit@3.1.0: + resolution: + { + integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, + } + engines: { node: ">=10" } + dependencies: + yocto-queue: 0.1.0 + + /p-locate@5.0.0: + resolution: + { + integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, + } + engines: { node: ">=10" } + dependencies: + p-limit: 3.1.0 + + /parent-module@1.0.1: + resolution: + { + integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, + } + engines: { node: ">=6" } + dependencies: + callsites: 3.1.0 + + /path-exists@4.0.0: + resolution: + { + integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, + } + engines: { node: ">=8" } + + /path-is-absolute@1.0.1: + resolution: + { + integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, + } + engines: { node: ">=0.10.0" } + + /path-key@3.1.1: + resolution: + { + integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, + } + engines: { node: ">=8" } + + /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" } + dev: false + + /picomatch@2.3.1: + resolution: + { + integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, + } + engines: { node: ">=8.6" } + + /prebuild-install@7.1.1: + resolution: + { + integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==, + } + engines: { node: ">=10" } + hasBin: true + dependencies: + detect-libc: 2.0.1 + 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.44.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: true + + /prelude-ls@1.2.1: + resolution: + { + integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, + } + engines: { node: ">= 0.8.0" } + + /prettier@2.8.8: + resolution: + { + integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==, + } + engines: { node: ">=10.13.0" } + hasBin: true + dev: false + + /printable-characters@1.0.42: + resolution: + { + integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==, + } + dev: true + + /pump@3.0.0: + resolution: + { + integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==, + } + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + + /punycode@2.3.0: + resolution: + { + integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==, + } + engines: { node: ">=6" } + + /queue-microtask@1.2.3: + resolution: + { + integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, + } + + /range-parser@1.2.1: + resolution: + { + integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==, + } + engines: { node: ">= 0.6" } + dev: false + + /rc@1.2.8: + resolution: + { + integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==, + } + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: true + + /readable-stream@3.6.2: + resolution: + { + integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, + } + engines: { node: ">= 6" } + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: true + + /readdirp@3.6.0: + resolution: + { + integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, + } + engines: { node: ">=8.10.0" } + dependencies: + picomatch: 2.3.1 + dev: true + + /render2@1.2.1: + resolution: + { + integrity: sha512-HfLOYtG6p6jx6GG6uub7YGJ4iv+GlOwFmDtGdtSe2NQJ6peMZ0u76k7GAZ0z7GSf4e9UfeCcQxme4Mayh7DLqw==, + } + dependencies: + range-parser: 1.2.1 + dev: false + + /resolve-from@4.0.0: + resolution: + { + integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, + } + engines: { node: ">=4" } + + /reusify@1.0.4: + resolution: + { + integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, + } + engines: { iojs: ">=1.0.0", node: ">=0.10.0" } + + /rimraf@3.0.2: + resolution: + { + integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, + } + hasBin: true + dependencies: + glob: 7.2.3 + + /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. + 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 + dev: true + + /run-parallel@1.2.0: + resolution: + { + integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, + } + dependencies: + queue-microtask: 1.2.3 + + /safe-buffer@5.2.1: + resolution: + { + integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, + } + dev: true + + /selfsigned@2.1.1: + resolution: + { + integrity: sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==, + } + engines: { node: ">=10" } + dependencies: + node-forge: 1.3.1 + dev: true + + /semver@7.5.1: + resolution: + { + integrity: sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==, + } + engines: { node: ">=10" } + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /shebang-command@2.0.0: + resolution: + { + integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, + } + engines: { node: ">=8" } + dependencies: + shebang-regex: 3.0.0 + + /shebang-regex@3.0.0: + resolution: + { + integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, + } + engines: { node: ">=8" } + + /simple-concat@1.0.1: + resolution: + { + integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==, + } + dev: true + + /simple-get@4.0.1: + resolution: + { + integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==, + } + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: true + + /slash@3.0.0: + resolution: + { + integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==, + } + engines: { node: ">=8" } + dev: false + + /source-map-support@0.5.21: + resolution: + { + integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, + } + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map@0.6.1: + resolution: + { + integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, + } + engines: { node: ">=0.10.0" } + dev: true + + /source-map@0.7.4: + resolution: + { + integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==, + } + engines: { node: ">= 8" } + dev: true + + /sourcemap-codec@1.4.8: + resolution: + { + integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==, + } + deprecated: Please use @jridgewell/sourcemap-codec instead + dev: true + + /stacktracey@2.1.8: + resolution: + { + integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==, + } + dependencies: + as-table: 1.0.55 + get-source: 2.0.12 + dev: true + + /stoppable@1.1.0: + resolution: + { + integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==, + } + engines: { node: ">=4", npm: ">=6" } + dev: true + + /streamsearch@1.1.0: + resolution: + { + integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==, + } + engines: { node: ">=10.0.0" } + dev: true + + /string_decoder@1.3.0: + resolution: + { + integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, + } + dependencies: + safe-buffer: 5.2.1 + dev: true + + /strip-ansi@6.0.1: + resolution: + { + integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, + } + engines: { node: ">=8" } + dependencies: + ansi-regex: 5.0.1 + + /strip-json-comments@2.0.1: + resolution: + { + integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==, + } + engines: { node: ">=0.10.0" } + dev: true + + /strip-json-comments@3.1.1: + resolution: + { + integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, + } + engines: { node: ">=8" } + + /supports-color@7.2.0: + resolution: + { + integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, + } + engines: { node: ">=8" } + dependencies: + has-flag: 4.0.0 + + /tar-fs@2.1.1: + resolution: + { + integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==, + } + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: true + + /tar-stream@2.2.0: + resolution: + { + integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==, + } + engines: { node: ">=6" } + 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: true + + /text-table@0.2.0: + resolution: + { + integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, + } + + /to-regex-range@5.0.1: + resolution: + { + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, + } + engines: { node: ">=8.0" } + dependencies: + is-number: 7.0.0 + + /tslib@1.14.1: + resolution: + { + integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==, + } + dev: false + + /tslib@2.5.3: + resolution: + { + integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==, + } + dev: true + + /tsutils@3.21.0(typescript@5.1.3): + resolution: + { + integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==, + } + engines: { node: ">= 6" } + peerDependencies: + typescript: ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + dependencies: + tslib: 1.14.1 + typescript: 5.1.3 + dev: false + + /tunnel-agent@0.6.0: + resolution: + { + integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==, + } + dependencies: + safe-buffer: 5.2.1 + dev: true + + /type-check@0.4.0: + resolution: + { + integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, + } + engines: { node: ">= 0.8.0" } + dependencies: + prelude-ls: 1.2.1 + + /type-fest@0.20.2: + resolution: + { + integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==, + } + engines: { node: ">=10" } + + /typescript@5.1.3: + resolution: + { + integrity: sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==, + } + engines: { node: ">=14.17" } + hasBin: true + + /undici@5.22.1: + resolution: + { + integrity: sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==, + } + engines: { node: ">=14.0" } + dependencies: + busboy: 1.6.0 + dev: true + + /uri-js@4.4.1: + resolution: + { + integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, + } + dependencies: + punycode: 2.3.0 + + /util-deprecate@1.0.2: + resolution: + { + integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, + } + dev: true + + /vscode-json-languageservice@4.2.1: + resolution: + { + integrity: sha512-xGmv9QIWs2H8obGbWg+sIPI/3/pFgj/5OWBhNzs00BkYQ9UaB2F6JJaGB/2/YOZJ3BvLXQTC4Q7muqU25QgAhA==, + } + dependencies: + jsonc-parser: 3.2.0 + vscode-languageserver-textdocument: 1.0.8 + vscode-languageserver-types: 3.17.3 + vscode-nls: 5.2.0 + vscode-uri: 3.0.7 + dev: true + + /vscode-languageserver-textdocument@1.0.8: + resolution: + { + integrity: sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==, + } + dev: true + + /vscode-languageserver-types@3.17.3: + resolution: + { + integrity: sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA==, + } + dev: true + + /vscode-nls@5.2.0: + resolution: + { + integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==, + } + dev: true + + /vscode-uri@3.0.7: + resolution: + { + integrity: sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==, + } + dev: true + + /which@2.0.2: + resolution: + { + integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, + } + engines: { node: ">= 8" } + hasBin: true + dependencies: + isexe: 2.0.0 + + /word-wrap@1.2.3: + resolution: + { + integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==, + } + engines: { node: ">=0.10.0" } + + /workerd@1.20230518.0: + resolution: + { + integrity: sha512-VNmK0zoNZXrwEEx77O/oQDVUzzyDjf5kKKK8bty+FmKCd5EQJCpqi8NlRKWLGMyyYrKm86MFz0kAsreTEs7HHA==, + } + engines: { node: ">=16" } + hasBin: true + requiresBuild: true + optionalDependencies: + "@cloudflare/workerd-darwin-64": 1.20230518.0 + "@cloudflare/workerd-darwin-arm64": 1.20230518.0 + "@cloudflare/workerd-linux-64": 1.20230518.0 + "@cloudflare/workerd-linux-arm64": 1.20230518.0 + "@cloudflare/workerd-windows-64": 1.20230518.0 + dev: true + + /wrangler@3.1.1: + resolution: + { + integrity: sha512-iG6QGOt+qgSm7UroJ8IJ+JdXEcDcW7yp9ilP0V7alCGhKm8shqa/M1iyMOpukZSCSZo8Vmn5nH2C9OY1PR3dQQ==, + } + engines: { node: ">=16.13.0" } + hasBin: true + dependencies: + "@cloudflare/kv-asset-handler": 0.2.0 + "@esbuild-plugins/node-globals-polyfill": 0.1.1(esbuild@0.16.3) + "@esbuild-plugins/node-modules-polyfill": 0.1.4(esbuild@0.16.3) + blake3-wasm: 2.1.5 + chokidar: 3.5.3 + esbuild: 0.16.3 + miniflare: 3.0.1 + nanoid: 3.3.6 + path-to-regexp: 6.2.1 + selfsigned: 2.1.1 + source-map: 0.7.4 + xxhash-wasm: 1.0.2 + optionalDependencies: + fsevents: 2.3.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /wrappy@1.0.2: + resolution: + { + integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, + } + + /ws@8.13.0: + resolution: + { + integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==, + } + engines: { node: ">=10.0.0" } + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + + /xxhash-wasm@1.0.2: + resolution: + { + integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==, + } + dev: true + + /yallist@4.0.0: + resolution: + { + integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, + } + + /yocto-queue@0.1.0: + resolution: + { + integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, + } + engines: { node: ">=10" } + + /youch@3.2.3: + resolution: + { + integrity: sha512-ZBcWz/uzZaQVdCvfV4uk616Bbpf2ee+F/AvuKDR5EwX/Y4v06xWdtMluqTD7+KlZdM93lLm9gMZYo0sKBS0pgw==, + } + dependencies: + cookie: 0.5.0 + mustache: 4.2.0 + stacktracey: 2.1.8 + dev: true + + /zod@3.21.4: + resolution: + { + integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==, + } + dev: true diff --git a/src/handler.ts b/src/handler.ts index f6a8f68..c0a7318 100644 --- a/src/handler.ts +++ b/src/handler.ts @@ -3,22 +3,18 @@ import { errorHandler } from "@/middleware/errorHandler"; import { responseHeaders } from "@/lib/responseHeaders"; import { getContributors } from "@/routes/discord/contributors"; import { index } from "@/routes/index"; -import { getGameId } from "@/routes/games/getGameId"; -import { getAsset } from "@/routes/games/getAsset"; -import { getGames } from "@/routes/games/getGames"; import { getGeneratorGameId } from "@/routes/oc-generators/getGameId"; import { getGenerators } from "@/routes/oc-generators/getGenerators"; +import { getSearch } from "@/routes/search/search"; const router = Router(); router .get("/", errorHandler(index)) - .get("/games", errorHandler(getGames)) - .get("/game/:gameId", errorHandler(getGameId)) - .get("/game/:gameId/:asset", errorHandler(getAsset)) .get("/oc-generators", errorHandler(getGenerators)) .get("/oc-generator/:gameId", errorHandler(getGeneratorGameId)) .get("/discord/contributors", errorHandler(getContributors)) + .get("/search", errorHandler(getSearch)) .all("*", (): Response => { return new Response( JSON.stringify({ diff --git a/src/lib/d1/checkRow.ts b/src/lib/d1/checkRow.ts deleted file mode 100644 index 629eebe..0000000 --- a/src/lib/d1/checkRow.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { rename } from "@/lib/helpers/rename"; - -export const checkRow = async ( - db: D1Database, - gameId: string, - asset: string -): Promise => { - const tableName: string = rename(gameId); - const location: string = rename(asset); - - const row: D1Result<{ requests: number }> = await db - .prepare(`SELECT requests FROM ${tableName} WHERE location = ?`) - .bind(location) - .all(); - - if (Array.isArray(row) && row.length === 0) { - await db - .prepare( - `INSERT INTO ${tableName} (location, requests) VALUES (?, 0)` - ) - .bind(location) - .run(); - } - - await db - .prepare( - `UPDATE ${tableName} SET requests = requests + 1 WHERE location = ?` - ) - .bind(location) - .run(); -}; diff --git a/src/lib/d1/checkTable.ts b/src/lib/d1/checkTable.ts deleted file mode 100644 index 22534ee..0000000 --- a/src/lib/d1/checkTable.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { rename } from "@/lib/helpers/rename"; - -export const checkTable = async ( - db: D1Database, - gameId: string -): Promise => { - const tableName: string = rename(gameId); - await db - .prepare( - `CREATE TABLE IF NOT EXISTS ${tableName} (location TEXT, requests INTEGER)` - ) - .run(); -}; diff --git a/src/lib/d1/getAssetRequests.ts b/src/lib/d1/getAssetRequests.ts deleted file mode 100644 index bbcfa26..0000000 --- a/src/lib/d1/getAssetRequests.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { rename } from "@/lib/helpers/rename"; - -export const getAssetRequests = async ( - db: D1Database, - gameId: string, - asset: string -): Promise => { - const tableName: string = rename(gameId); - const location: string = rename(asset); - - const requests: { results?: { requests: number }[] } = await db - .prepare(`SELECT requests FROM ${tableName} WHERE location = ?`) - .bind(location) - .all(); - - if (requests.results?.length === 0) { - await db - .prepare( - `INSERT INTO ${tableName} (location, requests) VALUES (?, 0)` - ) - .bind(location) - .run(); - } - - return requests?.results[0]?.requests ?? 0; -}; diff --git a/src/lib/types/asset.ts b/src/lib/types/asset.ts index f511ac0..3348507 100644 --- a/src/lib/types/asset.ts +++ b/src/lib/types/asset.ts @@ -1,7 +1,9 @@ -export interface Image { +export interface Asset { + uid: number; name: string; - nameWithExtension: string; - path: string; - uploaded: number; - size: number; + url: string; + tags: string; + verified: string; + uploaded_by: number; + uploaded_date: string; } diff --git a/src/routes/games/getAsset.ts b/src/routes/games/getAsset.ts deleted file mode 100644 index 1a1a817..0000000 --- a/src/routes/games/getAsset.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { responseHeaders } from "@/lib/responseHeaders"; -import { listBucket } from "@/lib/listBucket"; -import { checkTable } from "@/lib/d1/checkTable"; -import { checkRow } from "@/lib/d1/checkRow"; -import type { Image } from "@/lib/types/asset"; - -export const getAsset = async ( - request: Request, - env: Env -): Promise => { - const url = new URL(request.url); - const pathSegments = url.pathname - .split("/") - .filter((segment) => segment !== ""); - - if (pathSegments.length !== 3 || pathSegments[0] !== "game") { - return new Response( - JSON.stringify({ - success: false, - status: "error", - path: url.pathname, - error: "Invalid URL path", - }), - { - headers: responseHeaders, - } - ); - } - - const [, gameId, asset] = pathSegments; - - const cacheKey = new Request(url.toString(), request); - const cache = caches.default; - let response = await cache.match(cacheKey); - - if (response) { - return response; - } - - const files = await listBucket(env.bucket, { - prefix: `${gameId}/${asset}/`, - }); - - if (files.objects.length === 0) { - response = new Response( - JSON.stringify({ - success: false, - status: "error", - path: `/game/${gameId}/${asset}`, - error: "404 Not Found", - }), - { - headers: responseHeaders, - } - ); - } else { - const images: Image[] = files.objects.map((file) => ({ - name: file.key.split("/").pop().replace(".png", ""), - nameWithExtension: file.key.split("/").pop(), - path: `https://cdn.wanderer.moe/${file.key}`, - uploaded: file.uploaded, - size: file.size, - })); - - const lastUploaded = images.sort((a, b) => b.uploaded - a.uploaded)[0]; - - try { - await checkTable(env.database, gameId); - await checkRow(env.database, gameId, asset); - } catch (e) { - console.error(e); - } - - response = new Response( - JSON.stringify({ - success: true, - status: "ok", - path: `/game/${gameId}/${asset}`, - game: gameId, - asset, - lastUploaded, - images, - }), - { - headers: responseHeaders, - } - ); - - await cache.put(cacheKey, response.clone()); - } - - return response; -}; diff --git a/src/routes/games/getGameId.ts b/src/routes/games/getGameId.ts deleted file mode 100644 index c9434a5..0000000 --- a/src/routes/games/getGameId.ts +++ /dev/null @@ -1,144 +0,0 @@ -import { responseHeaders } from "@/lib/responseHeaders"; -import { listBucket } from "@/lib/listBucket"; -import { checkTable } from "@/lib/d1/checkTable"; -import { getAssetRequests } from "@/lib/d1/getAssetRequests"; -import type { Location } from "@/lib/types/game"; - -export const getGameId = async ( - request: Request, - env: Env -): Promise => { - const url = new URL(request.url); - const pathSegments = url.pathname - .split("/") - .filter((segment) => segment !== ""); - - if (pathSegments.length !== 2 || pathSegments[0] !== "game") { - return new Response( - JSON.stringify({ - success: false, - status: "error", - path: url.pathname, - error: "Invalid URL path", - }), - { - headers: responseHeaders, - } - ); - } - - const [, gameId] = pathSegments; - - const cacheKey = new Request(url.toString(), request); - const cache = caches.default; - let response = await cache.match(cacheKey); - - if (response) { - return response; - } - - const files = await listBucket(env.bucket, { - prefix: `${gameId}/`, - delimiter: "/", - }); - - const locations = files.delimitedPrefixes.map(async (file) => { - const subfolderFiles = await listBucket(env.bucket, { - prefix: `${file}`, - }); - - const fileCount = subfolderFiles.objects.length; - const lastUploaded = subfolderFiles.objects.reduce( - (prev, current) => { - const prevDate = new Date(prev.uploaded); - const currentDate = new Date(current.uploaded); - return prevDate > currentDate ? prev : current; - }, - { uploaded: 0 } - ); - - const name = file.replace(`${gameId}/`, "").replace("/", ""); - - try { - await checkTable(env.database, gameId); - } catch (e) { - console.error(e); - } - - let popularity = 0; - try { - const requestsCount = await getAssetRequests( - env.database, - gameId, - name - ); - popularity = requestsCount; - } catch (e) { - console.error(e); - } - - return { - name, - path: `https://api.wanderer.moe/game/${gameId}/${file - .replace(`${gameId}/`, "") - .replace("/", "")}`, - fileCount, - popularity, - lastUploaded: lastUploaded.uploaded, - } as Location; - }); - - const locationsWithFileCount = await Promise.all(locations); - locationsWithFileCount.sort((a, b) => b.popularity - a.popularity); - - locationsWithFileCount.forEach((location, index) => { - location.popularity = index + 1; - }); - - const totalFiles = locationsWithFileCount.reduce( - (total, location) => total + location.fileCount, - 0 - ); - - if (files.objects.length === 0) { - response = new Response( - JSON.stringify({ - success: false, - status: "error", - path: `/game/${gameId}`, - error: "404 Not Found", - }), - { - headers: responseHeaders, - } - ); - } else { - const lastUploaded = locationsWithFileCount.reduce( - (prev, current) => { - const prevDate = new Date(prev.lastUploaded); - const currentDate = new Date(current.lastUploaded); - return prevDate > currentDate ? prev : current; - }, - { lastUploaded: 0 } - ); - - response = new Response( - JSON.stringify({ - success: true, - status: "ok", - path: `/game/${gameId}`, - game: gameId, - totalFiles, - lastUploaded: lastUploaded.lastUploaded, - locations: locationsWithFileCount, - }), - { - headers: responseHeaders, - } - ); - - await cache.put(cacheKey, response.clone()); - } - - return response; -}; diff --git a/src/routes/games/getGames.ts b/src/routes/games/getGames.ts deleted file mode 100644 index cdbdf13..0000000 --- a/src/routes/games/getGames.ts +++ /dev/null @@ -1,101 +0,0 @@ -import { responseHeaders } from "@/lib/responseHeaders"; -import { listBucket } from "@/lib/listBucket"; -import { unwantedPrefixes } from "@/middleware/unwantedPrefixes"; -import type { Subfolder, Game } from "@/lib/types/game"; - -export const getGames = async ( - request: Request, - env: Env -): Promise => { - const url = new URL(request.url); - const cacheKey = new Request(url.toString(), request); - const cache = caches.default; - let response = await cache.match(cacheKey); - - if (response) { - return response; - } - - const files = await listBucket(env.bucket, { - prefix: "", - delimiter: "/", - }); - - const rootLocations = files.delimitedPrefixes - .filter((game) => !unwantedPrefixes.includes(game)) - .map(async (game) => { - const gameFiles = await listBucket(env.bucket, { - prefix: `${game}`, - delimiter: "/", - }); - - const tags = gameFiles.delimitedPrefixes.some((subfolder) => - subfolder.includes("sheets") - ) - ? ["Has Sheets"] - : []; - - const subfolders = await Promise.all( - gameFiles.delimitedPrefixes.map(async (subfolder) => { - const subfolderFiles = await listBucket(env.bucket, { - prefix: `${subfolder}`, - }); - const lastUploaded = subfolderFiles.objects.reduce( - (prev, current) => { - const prevDate = new Date(prev.uploaded); - const currentDate = new Date(current.uploaded); - return prevDate > currentDate ? prev : current; - }, - { uploaded: 0 } - ); - return { - name: subfolder.replace(game, "").replace("/", ""), - path: `https://api.wanderer.moe/game/${subfolder}`, - fileCount: subfolderFiles.objects.length, - lastUploaded: lastUploaded.uploaded, - } as Subfolder; - }) - ); - - const totalFiles = subfolders.reduce( - (total, subfolder) => total + subfolder.fileCount, - 0 - ); - - const lastUploaded = subfolders.reduce( - (prev, current) => { - const prevDate = new Date(prev.lastUploaded); - const currentDate = new Date(current.lastUploaded); - return prevDate > currentDate ? prev : current; - }, - { lastUploaded: 0 } - ); - - return { - name: game.replace("/", ""), - path: `https://api.wanderer.moe/game/${game}`, - tags, - totalFiles, - lastUploaded: lastUploaded.lastUploaded, - subfolders, - } as Game; - }); - - const games = await Promise.all(rootLocations); - - response = new Response( - JSON.stringify({ - success: true, - status: "ok", - path: "/games", - games, - }), - { - headers: responseHeaders, - } - ); - - await cache.put(cacheKey, response.clone()); - - return response; -}; diff --git a/src/routes/search/search.ts b/src/routes/search/search.ts new file mode 100644 index 0000000..3d3fb66 --- /dev/null +++ b/src/routes/search/search.ts @@ -0,0 +1,63 @@ +import { responseHeaders } from "@/lib/responseHeaders"; +import { Asset } from "@/lib/types/asset"; + +export const getSearch = async ( + request: Request, + env: Env +): Promise => { + const url = new URL(request.url); + const query = url.searchParams.get("query") || ""; + let tags = url.searchParams.get("tags") || ""; + let results: Asset[] = []; + + const cacheKey = new Request(url.toString(), request); + const cache = caches.default; + let response = await cache.match(cacheKey); + + if (response) { + return response; + } + + let sqlQuery = `SELECT * FROM assets WHERE 1=1`; + + if (query) { + sqlQuery += ` AND name LIKE '%${query}%'`; + } + + if (tags) { + sqlQuery += ` AND tags LIKE '%${tags}%'`; + } + + sqlQuery += ` ORDER BY uid DESC LIMIT 50`; + + const row: D1Result = await env.database + .prepare(`${sqlQuery}`) + .run(); + + results = row.results.map((result) => ({ + uid: result.uid, + name: result.name, + url: result.url, + tags: result.tags, + verified: result.verified, + uploaded_by: result.uploaded_by, + uploaded_date: result.uploaded_date, + })); + + response = new Response( + JSON.stringify({ + success: true, + status: "ok", + sqlQuery, + path: "/search", + query, + tags, + results, + }), + { + headers: responseHeaders, + } + ); + + return response; +}; diff --git a/wrangler.toml b/wrangler.toml index e04a438..15b9d3c 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -12,7 +12,7 @@ preview_bucket_name = 'wanderer-moe' [[d1_databases]] binding = 'database' -database_name = 'wanderer-moe-requests' -database_id = '9c180d14-7f79-45c6-b2f5-809b4e75941b' +database_name = 'wanderer-moe' +database_id = 'df7af4d9-3546-42d2-bf0d-8376091a7875' [vars] \ No newline at end of file From e27a9d53e594a6bd90774d1591676892de9ff5c9 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sat, 24 Jun 2023 01:31:22 +0100 Subject: [PATCH 002/318] feat: `after` param on search & `camelCase` vars --- src/lib/types/asset.ts | 4 ++-- src/routes/index.ts | 4 +--- src/routes/search/search.ts | 31 +++++++++++++++++++------------ 3 files changed, 22 insertions(+), 17 deletions(-) diff --git a/src/lib/types/asset.ts b/src/lib/types/asset.ts index 3348507..f7df244 100644 --- a/src/lib/types/asset.ts +++ b/src/lib/types/asset.ts @@ -4,6 +4,6 @@ export interface Asset { url: string; tags: string; verified: string; - uploaded_by: number; - uploaded_date: string; + uploadedBy: number; + uploadedDate: string; } diff --git a/src/routes/index.ts b/src/routes/index.ts index 638b7ba..bd6b1bd 100644 --- a/src/routes/index.ts +++ b/src/routes/index.ts @@ -1,9 +1,7 @@ import { responseHeaders } from "@/lib/responseHeaders"; const routes: string[] = [ - "https://api.wanderer.moe/games", - "https://api.wanderer.moe/game/{gameId}", - "https://api.wanderer.moe/game/{gameId}/{asset}", + "https://api.wanderer.moe/search", "https://api.wanderer.moe/oc-generators", "https://api.wanderer.moe/oc-generator/{gameId}", ]; diff --git a/src/routes/search/search.ts b/src/routes/search/search.ts index 3d3fb66..b2cd5fa 100644 --- a/src/routes/search/search.ts +++ b/src/routes/search/search.ts @@ -7,7 +7,8 @@ export const getSearch = async ( ): Promise => { const url = new URL(request.url); const query = url.searchParams.get("query") || ""; - let tags = url.searchParams.get("tags") || ""; + const tags = url.searchParams.get("tags") || ""; + const after = url.searchParams.get("after") || ""; let results: Asset[] = []; const cacheKey = new Request(url.toString(), request); @@ -28,27 +29,33 @@ export const getSearch = async ( sqlQuery += ` AND tags LIKE '%${tags}%'`; } - sqlQuery += ` ORDER BY uid DESC LIMIT 50`; + if (after) { + sqlQuery += ` AND uid > ${after}`; + } + + sqlQuery += ` ORDER BY uid ASC LIMIT 200`; // Fetching 200 results to ensure enough results are available after filtering const row: D1Result = await env.database .prepare(`${sqlQuery}`) .run(); - results = row.results.map((result) => ({ - uid: result.uid, - name: result.name, - url: result.url, - tags: result.tags, - verified: result.verified, - uploaded_by: result.uploaded_by, - uploaded_date: result.uploaded_date, - })); + results = row.results + .slice(parseInt(after, 10)) // Converting `after` to an integer and slicing the array + .map((result) => ({ + uid: result.uid, + name: result.name, + url: result.url, + tags: result.tags, + verified: result.verified, + uploadedBy: result.uploadedBy, + uploadedDate: result.uploadedDate, + })); response = new Response( JSON.stringify({ success: true, status: "ok", - sqlQuery, + // sqlQuery, path: "/search", query, tags, From ab8218618c55c8834b22b85e71819d99bfadb8e3 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sat, 24 Jun 2023 01:44:15 +0100 Subject: [PATCH 003/318] parameter binding to prevent sql injection --- src/routes/search/search.ts | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/src/routes/search/search.ts b/src/routes/search/search.ts index b2cd5fa..eaf9344 100644 --- a/src/routes/search/search.ts +++ b/src/routes/search/search.ts @@ -19,37 +19,40 @@ export const getSearch = async ( return response; } + const parameters = []; let sqlQuery = `SELECT * FROM assets WHERE 1=1`; if (query) { - sqlQuery += ` AND name LIKE '%${query}%'`; + sqlQuery += ` AND name LIKE '%' || ? || '%'`; + parameters.push(query); } if (tags) { - sqlQuery += ` AND tags LIKE '%${tags}%'`; + sqlQuery += ` AND tags LIKE '%' || ? || '%'`; + parameters.push(tags); } if (after) { - sqlQuery += ` AND uid > ${after}`; + sqlQuery += ` AND uid > ?`; + parameters.push(after); } - sqlQuery += ` ORDER BY uid ASC LIMIT 200`; // Fetching 200 results to ensure enough results are available after filtering + sqlQuery += ` ORDER BY uid ASC LIMIT 200`; const row: D1Result = await env.database - .prepare(`${sqlQuery}`) + .prepare(sqlQuery) + .bind(...parameters) .run(); - results = row.results - .slice(parseInt(after, 10)) // Converting `after` to an integer and slicing the array - .map((result) => ({ - uid: result.uid, - name: result.name, - url: result.url, - tags: result.tags, - verified: result.verified, - uploadedBy: result.uploadedBy, - uploadedDate: result.uploadedDate, - })); + results = row.results.slice(parseInt(after, 10)).map((result) => ({ + uid: result.uid, + name: result.name, + url: result.url, + tags: result.tags, + verified: result.verified, + uploadedBy: result.uploadedBy, + uploadedDate: result.uploadedDate, + })); response = new Response( JSON.stringify({ From 3014832ac57127e8f208b5789be94a3a92139cd0 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sat, 24 Jun 2023 02:04:33 +0100 Subject: [PATCH 004/318] feat: `/download` route for download count --- src/handler.ts | 2 ++ src/lib/types/ocGenerator.ts | 7 +++++ src/routes/download/downloadFile.ts | 45 +++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+) create mode 100644 src/lib/types/ocGenerator.ts create mode 100644 src/routes/download/downloadFile.ts diff --git a/src/handler.ts b/src/handler.ts index c0a7318..c3947b3 100644 --- a/src/handler.ts +++ b/src/handler.ts @@ -6,6 +6,7 @@ import { index } from "@/routes/index"; import { getGeneratorGameId } from "@/routes/oc-generators/getGameId"; import { getGenerators } from "@/routes/oc-generators/getGenerators"; import { getSearch } from "@/routes/search/search"; +import { downloadFile } from "./routes/download/downloadFile"; const router = Router(); @@ -15,6 +16,7 @@ router .get("/oc-generator/:gameId", errorHandler(getGeneratorGameId)) .get("/discord/contributors", errorHandler(getContributors)) .get("/search", errorHandler(getSearch)) + .get("/download", errorHandler(downloadFile)) .all("*", (): Response => { return new Response( JSON.stringify({ diff --git a/src/lib/types/ocGenerator.ts b/src/lib/types/ocGenerator.ts new file mode 100644 index 0000000..9eb16f0 --- /dev/null +++ b/src/lib/types/ocGenerator.ts @@ -0,0 +1,7 @@ +export interface Generator { + name: string; + data: string; + uploadedBy: number; + uploadedDate: string; + verified: string; +} diff --git a/src/routes/download/downloadFile.ts b/src/routes/download/downloadFile.ts new file mode 100644 index 0000000..3421b4e --- /dev/null +++ b/src/routes/download/downloadFile.ts @@ -0,0 +1,45 @@ +import { responseHeaders } from "@/lib/responseHeaders"; +import type { Asset } from "@/lib/types/asset"; + +export const downloadFile = async ( + request: Request, + env: Env +): Promise => { + const url = new URL(request.url); + const id = url.searchParams.get("id") || ""; + + const row: D1Result = await env.database + .prepare(`SELECT * FROM assets WHERE uid = ?`) + .bind(id) + .run(); + + if (!row.results[0]) { + return new Response( + JSON.stringify({ + success: false, + status: "error", + error: "no_file", + }), + { + status: 404, + headers: responseHeaders, + } + ); + } + + await env.database + .prepare( + `UPDATE assets SET downloadCount = downloadCount + 1 WHERE uid = ?` + ) + .bind(id) + .run(); + + const response = await fetch(row.results[0].url); + const headers = new Headers(response.headers); + headers.set("Content-Disposition", "attachment"); + const blob = await response.blob(); + + return new Response(blob, { + headers: headers, + }); +}; From e951f1fd50be17dddcb3d7373045081ffa584e2b Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sat, 24 Jun 2023 02:23:24 +0100 Subject: [PATCH 005/318] feat: migrate oc gen data from cdn to database --- src/handler.ts | 4 +- src/routes/oc-generators/getGameId.ts | 70 ----------------------- src/routes/oc-generators/getGenerator.ts | 47 +++++++++++++++ src/routes/oc-generators/getGenerators.ts | 39 ++++--------- src/routes/search/search.ts | 4 +- 5 files changed, 63 insertions(+), 101 deletions(-) delete mode 100644 src/routes/oc-generators/getGameId.ts create mode 100644 src/routes/oc-generators/getGenerator.ts diff --git a/src/handler.ts b/src/handler.ts index c3947b3..d32af1a 100644 --- a/src/handler.ts +++ b/src/handler.ts @@ -3,7 +3,7 @@ import { errorHandler } from "@/middleware/errorHandler"; import { responseHeaders } from "@/lib/responseHeaders"; import { getContributors } from "@/routes/discord/contributors"; import { index } from "@/routes/index"; -import { getGeneratorGameId } from "@/routes/oc-generators/getGameId"; +import { getGenerator } from "@/routes/oc-generators/getGenerator"; import { getGenerators } from "@/routes/oc-generators/getGenerators"; import { getSearch } from "@/routes/search/search"; import { downloadFile } from "./routes/download/downloadFile"; @@ -13,7 +13,7 @@ const router = Router(); router .get("/", errorHandler(index)) .get("/oc-generators", errorHandler(getGenerators)) - .get("/oc-generator/:gameId", errorHandler(getGeneratorGameId)) + .get("/oc-generator/:gameId", errorHandler(getGenerator)) .get("/discord/contributors", errorHandler(getContributors)) .get("/search", errorHandler(getSearch)) .get("/download", errorHandler(downloadFile)) diff --git a/src/routes/oc-generators/getGameId.ts b/src/routes/oc-generators/getGameId.ts deleted file mode 100644 index 2217095..0000000 --- a/src/routes/oc-generators/getGameId.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { responseHeaders } from "@/lib/responseHeaders"; -import { listBucket } from "@/lib/listBucket"; - -export const getGeneratorGameId = async ( - request: Request, - env: Env -): Promise => { - const url = new URL(request.url); - const pathSegments = url.pathname - .split("/") - .filter((segment) => segment !== ""); - - if (pathSegments.length !== 2 || pathSegments[0] !== "oc-generator") { - return new Response( - JSON.stringify({ - success: false, - status: "error", - path: url.pathname, - error: "Invalid URL path", - }), - { - headers: responseHeaders, - } - ); - } - - const [, gameId] = pathSegments; - - const cacheKey = new Request(url.toString(), request); - const cache = caches.default; - let response = await cache.match(cacheKey); - - if (response) { - return response; - } - - const files = await listBucket(env.bucket, { - prefix: `oc-generator/${gameId}/list.json`, - }); - - if (files.objects.length === 0) { - response = new Response( - JSON.stringify({ - success: false, - status: "error", - error: "404 Not Found", - }), - { - headers: responseHeaders, - } - ); - } else { - response = new Response( - JSON.stringify({ - success: true, - status: "ok", - path: `/oc-generator/${gameId}`, - game: gameId, - json: `https://cdn.wanderer.moe/oc-generator/${gameId}/list.json`, - }), - { - headers: responseHeaders, - } - ); - } - - await cache.put(cacheKey, response.clone()); - - return response; -}; diff --git a/src/routes/oc-generators/getGenerator.ts b/src/routes/oc-generators/getGenerator.ts new file mode 100644 index 0000000..de50946 --- /dev/null +++ b/src/routes/oc-generators/getGenerator.ts @@ -0,0 +1,47 @@ +import { responseHeaders } from "@/lib/responseHeaders"; +import type { Generator } from "@/lib/types/ocGenerator"; + +export const getGenerator = async ( + request: Request, + env: Env +): Promise => { + const url = new URL(request.url); + const gameId = url.pathname.split("/")[2]; + + const row: D1Result = await env.database + .prepare(`SELECT * FROM ocGenerators WHERE name = ?`) + .bind(gameId) + .run(); + + if (!row) { + return new Response( + JSON.stringify({ + success: false, + status: "error", + error: "404 Not Found", + }), + { + headers: responseHeaders, + } + ); + } + + const results = row.results.map((result) => ({ + name: result.name, + data: JSON.parse(result.data), + uploadedBy: result.uploadedBy, + uploadedDate: result.uploadedDate, + verified: result.verified, + })); + + return new Response( + JSON.stringify({ + success: true, + status: "ok", + results: results, + }), + { + headers: responseHeaders, + } + ); +}; diff --git a/src/routes/oc-generators/getGenerators.ts b/src/routes/oc-generators/getGenerators.ts index 710d2a6..6b40e59 100644 --- a/src/routes/oc-generators/getGenerators.ts +++ b/src/routes/oc-generators/getGenerators.ts @@ -1,45 +1,30 @@ import { responseHeaders } from "@/lib/responseHeaders"; -import { listBucket } from "@/lib/listBucket"; -import type { Location } from "@/lib/types/game"; +import type { Generator } from "@/lib/types/ocGenerator"; export const getGenerators = async ( request: Request, env: Env ): Promise => { - const url = new URL(request.url); - const cacheKey = new Request(url.toString(), request); - const cache = caches.default; - let response = await cache.match(cacheKey); + const row: D1Result = await env.database + .prepare(`SELECT * FROM ocGenerators`) + .run(); - if (response) { - return response; - } - - const files = await listBucket(env.bucket, { - prefix: "oc-generator/", - delimiter: "/", - }); - - const locations: Location[] = files.delimitedPrefixes.map((file) => ({ - name: file.replace("oc-generator/", "").replace("/", ""), - path: `https://api.wanderer.moe/oc-generator/${file - .replace("oc-generator/", "") - .replace("/", "")}`, + const results = row.results.map((result) => ({ + name: result.name, + path: `/oc-generator/${result.name}`, + uploadedBy: result.uploadedBy, + uploadedDate: result.uploadedDate, + verified: result.verified, })); - response = new Response( + return new Response( JSON.stringify({ success: true, status: "ok", - path: "/oc-generators", - locations, + results: results, }), { headers: responseHeaders, } ); - - await cache.put(cacheKey, response.clone()); - - return response; }; diff --git a/src/routes/search/search.ts b/src/routes/search/search.ts index eaf9344..60f4292 100644 --- a/src/routes/search/search.ts +++ b/src/routes/search/search.ts @@ -1,5 +1,5 @@ import { responseHeaders } from "@/lib/responseHeaders"; -import { Asset } from "@/lib/types/asset"; +import type { Asset } from "@/lib/types/asset"; export const getSearch = async ( request: Request, @@ -37,7 +37,7 @@ export const getSearch = async ( parameters.push(after); } - sqlQuery += ` ORDER BY uid ASC LIMIT 200`; + sqlQuery += ` ORDER BY uid ASC LIMIT 100`; const row: D1Result = await env.database .prepare(sqlQuery) From 9cb89f1f69fb6d43e8dd62e0480d7b8570bfe6d0 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sat, 24 Jun 2023 03:15:32 +0100 Subject: [PATCH 006/318] feat: user search (name & id) implementation --- src/handler.ts | 8 +++- src/lib/types/user.ts | 10 +++++ src/routes/user/getUserById.ts | 64 +++++++++++++++++++++++++++++ src/routes/user/getUsersBySearch.ts | 54 ++++++++++++++++++++++++ 4 files changed, 134 insertions(+), 2 deletions(-) create mode 100644 src/lib/types/user.ts create mode 100644 src/routes/user/getUserById.ts create mode 100644 src/routes/user/getUsersBySearch.ts diff --git a/src/handler.ts b/src/handler.ts index d32af1a..a021ca7 100644 --- a/src/handler.ts +++ b/src/handler.ts @@ -7,16 +7,20 @@ import { getGenerator } from "@/routes/oc-generators/getGenerator"; import { getGenerators } from "@/routes/oc-generators/getGenerators"; import { getSearch } from "@/routes/search/search"; import { downloadFile } from "./routes/download/downloadFile"; +import { getUserById } from "./routes/user/getUserById"; +import { getUserBySearch } from "./routes/user/getUsersBySearch"; const router = Router(); router .get("/", errorHandler(index)) + .get("/user/:id", errorHandler(getUserById)) + .get("/user/search/:name", errorHandler(getUserBySearch)) + .get("/search", errorHandler(getSearch)) + .get("/download", errorHandler(downloadFile)) .get("/oc-generators", errorHandler(getGenerators)) .get("/oc-generator/:gameId", errorHandler(getGenerator)) .get("/discord/contributors", errorHandler(getContributors)) - .get("/search", errorHandler(getSearch)) - .get("/download", errorHandler(downloadFile)) .all("*", (): Response => { return new Response( JSON.stringify({ diff --git a/src/lib/types/user.ts b/src/lib/types/user.ts new file mode 100644 index 0000000..6fd6790 --- /dev/null +++ b/src/lib/types/user.ts @@ -0,0 +1,10 @@ +export interface User { + id: number; + displayName: string; + name: string; + avatarUrl: string; + discordId: number; + bio: string; + assetsUploaded: number; + roles: string; +} diff --git a/src/routes/user/getUserById.ts b/src/routes/user/getUserById.ts new file mode 100644 index 0000000..5ab428f --- /dev/null +++ b/src/routes/user/getUserById.ts @@ -0,0 +1,64 @@ +import { responseHeaders } from "@/lib/responseHeaders"; +import type { User } from "@/lib/types/user"; + +export const getUserById = async ( + request: Request, + env: Env +): Promise => { + const url = new URL(request.url); + const id = url.pathname.split("/")[2]; + console.log(id); + + if (!id) { + return new Response( + JSON.stringify({ + success: false, + status: "error", + error: "400 Bad Request", + }), + { + headers: responseHeaders, + } + ); + } + + const row: D1Result = await env.database + .prepare(`SELECT * FROM users WHERE id = ?`) + .bind(id) + .run(); + + if (!row) { + return new Response( + JSON.stringify({ + success: false, + status: "error", + error: "404 Not Found", + }), + { + headers: responseHeaders, + } + ); + } + + const results = row.results.map((result) => ({ + id: result.id, + displayName: result.displayName, + name: result.name, + avatarUrl: result.avatarUrl, + discordId: result.discordId, + bio: result.bio, + assetsUploaded: result.assetsUploaded, + roles: result.roles, + })); + + return new Response( + JSON.stringify({ + success: true, + status: "ok", + results: results, + }), + { + headers: responseHeaders, + } + ); +}; diff --git a/src/routes/user/getUsersBySearch.ts b/src/routes/user/getUsersBySearch.ts new file mode 100644 index 0000000..d538814 --- /dev/null +++ b/src/routes/user/getUsersBySearch.ts @@ -0,0 +1,54 @@ +import { responseHeaders } from "@/lib/responseHeaders"; +import type { User } from "@/lib/types/user"; + +export const getUserBySearch = async ( + request: Request, + env: Env +): Promise => { + const url = new URL(request.url); + const name = url.pathname.split("/")[3]; + + const row: D1Result = await env.database + .prepare( + `SELECT * FROM users WHERE displayName = ? OR name = ? OR name LIKE ?` + ) + .bind(name, name, `%${name}%`) + .run(); + + if (!row.results.length) { + return new Response( + JSON.stringify({ + success: false, + status: "error", + error: "404 Not Found", + }), + { + headers: responseHeaders, + } + ); + } + + const results = row.results.map((result) => ({ + id: result.id, + displayName: result.displayName, + name: result.name, + avatarUrl: result.avatarUrl, + discordId: result.discordId, + bio: result.bio, + assetsUploaded: result.assetsUploaded, + roles: result.roles, + })); + + results.sort((a, b) => (a.name === name ? -1 : b.name === name ? 1 : 0)); + + return new Response( + JSON.stringify({ + success: true, + status: "ok", + results: results, + }), + { + headers: responseHeaders, + } + ); +}; From 590b7f9a82873b1109ffa285709b554ef04a4261 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sat, 24 Jun 2023 03:25:06 +0100 Subject: [PATCH 007/318] refactor: simplify query with ternary operators --- src/lib/types/asset.ts | 1 + src/routes/search/search.ts | 13 +++++-------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/lib/types/asset.ts b/src/lib/types/asset.ts index f7df244..8fb3e24 100644 --- a/src/lib/types/asset.ts +++ b/src/lib/types/asset.ts @@ -1,6 +1,7 @@ export interface Asset { uid: number; name: string; + game: string; url: string; tags: string; verified: string; diff --git a/src/routes/search/search.ts b/src/routes/search/search.ts index 60f4292..8a02833 100644 --- a/src/routes/search/search.ts +++ b/src/routes/search/search.ts @@ -27,15 +27,11 @@ export const getSearch = async ( parameters.push(query); } - if (tags) { - sqlQuery += ` AND tags LIKE '%' || ? || '%'`; - parameters.push(tags); - } + sqlQuery += tags ? ` AND tags LIKE '%' || ? || '%'` : ""; + tags && parameters.push(tags); - if (after) { - sqlQuery += ` AND uid > ?`; - parameters.push(after); - } + sqlQuery += after ? ` AND uid > ?` : ""; + after && parameters.push(after); sqlQuery += ` ORDER BY uid ASC LIMIT 100`; @@ -47,6 +43,7 @@ export const getSearch = async ( results = row.results.slice(parseInt(after, 10)).map((result) => ({ uid: result.uid, name: result.name, + game: result.game, url: result.url, tags: result.tags, verified: result.verified, From d3f64c320e97b05f08e51248e8eff2d3a430c56e Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sat, 24 Jun 2023 03:34:40 +0100 Subject: [PATCH 008/318] feat(docs): update readme to reference v2 api --- README.md | 51 +++++++++++++++++++++++++++++++++---------- src/lib/types/game.ts | 23 ------------------- 2 files changed, 39 insertions(+), 35 deletions(-) delete mode 100644 src/lib/types/game.ts diff --git a/README.md b/README.md index ee5368d..c86eb62 100644 --- a/README.md +++ b/README.md @@ -27,34 +27,61 @@ Configuration is in `wrangler.toml` - this includes the R2 Bucket and D1 Databas ## API Reference -### Games +### Search (Assets) -#### Get all games +#### Search Assets ```http - GET api.wanderer.moe/games +GET /search/assets?query=query&tags=tag1,tag2&after=after ``` -#### Get game data +| Parameter | Type | Description | +| :-------- | :------- | :--------------------------------------------------------------------------------------------- | +| `query` | `string` | **Optional**. Search query for assets | +| `tags` | `string` | **Optional**. Comma-separated list of tags to filter by (in order of `game`, `asset-category`) | +| `after` | `string` | **Optional**. Cursor to paginate through results | + +If no query is provided, the API will return a list of 100 most recently uploaded assets. + +### Search Users + +#### Search Users (Name) ```http - GET api.wanderer.moe/game/${gameId} +GET /user/search/:query ``` -| Parameter | Type | Description | -| :-------- | :------- | :---------------------------------- | -| `gameId` | `string` | **Required** — game to get data for | +| Parameter | Type | Description | +| :-------- | :------- | :----------------------------------- | +| `query` | `string` | **Required**. Search query for users | -#### Get a game's asset data +#### Get User Data (ID) ```http - GET api.wanderer.moe/game/${gameId}/${asset} +GET /user/:id ``` | Parameter | Type | Description | | :-------- | :------- | :----------------------------------- | -| `gameId` | `string` | **Required** — game to get data for | -| `asset` | `string` | **Required** — asset to get data for | +| `id` | `string` | **Required**. Search query for users | + +### OC Generator + +#### Get All OC Generators + +```http +GET /oc-generators/ +``` + +#### Get OC Generator + +```http +GET /oc-generators/:id +``` + +| Parameter | Type | Description | +| :-------- | :------- | :----------------------------------------------- | +| `id` | `string` | **Required**. Game Name of OC Generator to fetch | ## Authors diff --git a/src/lib/types/game.ts b/src/lib/types/game.ts deleted file mode 100644 index eaad28c..0000000 --- a/src/lib/types/game.ts +++ /dev/null @@ -1,23 +0,0 @@ -export interface Subfolder { - name: string; - path: string; - fileCount: number; - lastUploaded: number; -} - -export interface Game { - name: string; - path: string; - tags: string[]; - totalFiles: number; - lastUploaded: number; - subfolders: Subfolder[]; -} - -export interface Location { - name: string; - path: string; - fileCount: number; - popularity: number; - lastUploaded: number; -} From ab3a07ca8d7e890f5a8d2ecbf50d33d7e681d114 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sat, 24 Jun 2023 04:26:20 +0100 Subject: [PATCH 009/318] feat: recently uploaded to `/user/:id` route --- src/routes/user/getUserById.ts | 17 +++++++++++++++++ src/routes/user/getUsersBySearch.ts | 1 + 2 files changed, 18 insertions(+) diff --git a/src/routes/user/getUserById.ts b/src/routes/user/getUserById.ts index 5ab428f..3b7bf1d 100644 --- a/src/routes/user/getUserById.ts +++ b/src/routes/user/getUserById.ts @@ -1,5 +1,6 @@ import { responseHeaders } from "@/lib/responseHeaders"; import type { User } from "@/lib/types/user"; +import type { Asset } from "@/lib/types/asset"; export const getUserById = async ( request: Request, @@ -40,6 +41,21 @@ export const getUserById = async ( ); } + const assets: D1Result = await env.database + .prepare( + `SELECT * FROM assets WHERE uploadedBy = ? ORDER BY uid DESC LIMIT 20` + ) + .bind(id) + .run(); + + const assetsUploaded = assets.results.map((asset) => ({ + uid: asset.uid, + name: asset.name, + tags: asset.tags, + verified: asset.verified, + uploadedDate: asset.uploadedDate, + })); + const results = row.results.map((result) => ({ id: result.id, displayName: result.displayName, @@ -49,6 +65,7 @@ export const getUserById = async ( bio: result.bio, assetsUploaded: result.assetsUploaded, roles: result.roles, + recentAssets: assetsUploaded || [], })); return new Response( diff --git a/src/routes/user/getUsersBySearch.ts b/src/routes/user/getUsersBySearch.ts index d538814..c885916 100644 --- a/src/routes/user/getUsersBySearch.ts +++ b/src/routes/user/getUsersBySearch.ts @@ -32,6 +32,7 @@ export const getUserBySearch = async ( id: result.id, displayName: result.displayName, name: result.name, + url: `/user/${result.id}`, avatarUrl: result.avatarUrl, discordId: result.discordId, bio: result.bio, From cb0637ff8374595ada94292502949a0a8f42ece5 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sat, 24 Jun 2023 04:53:43 +0100 Subject: [PATCH 010/318] feat: reimplement `/games` --- src/handler.ts | 2 ++ src/routes/games/allGames.ts | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 src/routes/games/allGames.ts diff --git a/src/handler.ts b/src/handler.ts index a021ca7..460f1e6 100644 --- a/src/handler.ts +++ b/src/handler.ts @@ -9,11 +9,13 @@ import { getSearch } from "@/routes/search/search"; import { downloadFile } from "./routes/download/downloadFile"; import { getUserById } from "./routes/user/getUserById"; import { getUserBySearch } from "./routes/user/getUsersBySearch"; +import { allGames } from "./routes/games/allGames"; const router = Router(); router .get("/", errorHandler(index)) + .get("/games", errorHandler(allGames)) .get("/user/:id", errorHandler(getUserById)) .get("/user/search/:name", errorHandler(getUserBySearch)) .get("/search", errorHandler(getSearch)) diff --git a/src/routes/games/allGames.ts b/src/routes/games/allGames.ts new file mode 100644 index 0000000..93a0b25 --- /dev/null +++ b/src/routes/games/allGames.ts @@ -0,0 +1,33 @@ +import { listBucket } from "@/lib/listBucket"; +import { responseHeaders } from "@/lib/responseHeaders"; +import { unwantedPrefixes } from "@/middleware/unwantedPrefixes"; + +export const allGames = async ( + request: Request, + env: Env +): Promise => { + const games = await listBucket(env.bucket, { + prefix: "", + delimiter: "/", + }); + + console.log(games.objects) + + const gameList = games.delimitedPrefixes + .filter((game) => !unwantedPrefixes.includes(game)) + .map((game) => { + return { + name: game.replace("/", ""), + }; + }); + return new Response( + JSON.stringify({ + success: true, + status: "ok", + results: gameList, + }), + { + headers: responseHeaders, + }); +} + \ No newline at end of file From 3b50075ba9aa726a615e7c47ce657bad8e53ab42 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sat, 24 Jun 2023 23:46:18 +0100 Subject: [PATCH 011/318] feat: update columns --- .gitignore | 3 ++ src/handler.ts | 11 ++-- src/lib/types/asset.ts | 10 ++-- src/routes/download/downloadFile.ts | 4 +- src/routes/games/allGames.ts | 12 ++--- src/routes/search/search.ts | 83 +++++++++++++++++++++++++++-- src/routes/user/getUserById.ts | 2 +- 7 files changed, 103 insertions(+), 22 deletions(-) diff --git a/.gitignore b/.gitignore index f70d5b1..4b4c676 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,9 @@ .wrangler .dev.vars +# temp +src/routes/check.ts + # Logs logs diff --git a/src/handler.ts b/src/handler.ts index 460f1e6..bff2027 100644 --- a/src/handler.ts +++ b/src/handler.ts @@ -5,11 +5,11 @@ import { getContributors } from "@/routes/discord/contributors"; import { index } from "@/routes/index"; import { getGenerator } from "@/routes/oc-generators/getGenerator"; import { getGenerators } from "@/routes/oc-generators/getGenerators"; -import { getSearch } from "@/routes/search/search"; -import { downloadFile } from "./routes/download/downloadFile"; -import { getUserById } from "./routes/user/getUserById"; -import { getUserBySearch } from "./routes/user/getUsersBySearch"; -import { allGames } from "./routes/games/allGames"; +import { getSearch, getRecentAssets } from "@/routes/search/search"; +import { downloadFile } from "@/routes/download/downloadFile"; +import { getUserById } from "@/routes/user/getUserById"; +import { getUserBySearch } from "@/routes/user/getUsersBySearch"; +import { allGames } from "@/routes/games/allGames"; const router = Router(); @@ -17,6 +17,7 @@ router .get("/", errorHandler(index)) .get("/games", errorHandler(allGames)) .get("/user/:id", errorHandler(getUserById)) + .get("/recent", errorHandler(getRecentAssets)) .get("/user/search/:name", errorHandler(getUserBySearch)) .get("/search", errorHandler(getSearch)) .get("/download", errorHandler(downloadFile)) diff --git a/src/lib/types/asset.ts b/src/lib/types/asset.ts index 8fb3e24..d93e9e5 100644 --- a/src/lib/types/asset.ts +++ b/src/lib/types/asset.ts @@ -1,10 +1,14 @@ export interface Asset { - uid: number; + id: number; name: string; game: string; - url: string; + asset: string; tags: string; + url: string; verified: string; - uploadedBy: number; + uploadedBy: string; uploadedDate: string; + viewCount?: number; + downloadCount?: number; + fileSize: number; } diff --git a/src/routes/download/downloadFile.ts b/src/routes/download/downloadFile.ts index 3421b4e..b3d920e 100644 --- a/src/routes/download/downloadFile.ts +++ b/src/routes/download/downloadFile.ts @@ -9,7 +9,7 @@ export const downloadFile = async ( const id = url.searchParams.get("id") || ""; const row: D1Result = await env.database - .prepare(`SELECT * FROM assets WHERE uid = ?`) + .prepare(`SELECT * FROM assets WHERE id = ?`) .bind(id) .run(); @@ -29,7 +29,7 @@ export const downloadFile = async ( await env.database .prepare( - `UPDATE assets SET downloadCount = downloadCount + 1 WHERE uid = ?` + `UPDATE assets SET downloadCount = downloadCount + 1 WHERE id = ?` ) .bind(id) .run(); diff --git a/src/routes/games/allGames.ts b/src/routes/games/allGames.ts index 93a0b25..9b76ca1 100644 --- a/src/routes/games/allGames.ts +++ b/src/routes/games/allGames.ts @@ -11,7 +11,7 @@ export const allGames = async ( delimiter: "/", }); - console.log(games.objects) + // console.log(games.objects); const gameList = games.delimitedPrefixes .filter((game) => !unwantedPrefixes.includes(game)) @@ -26,8 +26,8 @@ export const allGames = async ( status: "ok", results: gameList, }), - { - headers: responseHeaders, - }); -} - \ No newline at end of file + { + headers: responseHeaders, + } + ); +}; diff --git a/src/routes/search/search.ts b/src/routes/search/search.ts index 8a02833..3d2c83e 100644 --- a/src/routes/search/search.ts +++ b/src/routes/search/search.ts @@ -7,6 +7,8 @@ export const getSearch = async ( ): Promise => { const url = new URL(request.url); const query = url.searchParams.get("query") || ""; + const game = url.searchParams.get("game") || ""; + const asset = url.searchParams.get("asset") || ""; const tags = url.searchParams.get("tags") || ""; const after = url.searchParams.get("after") || ""; let results: Asset[] = []; @@ -27,13 +29,23 @@ export const getSearch = async ( parameters.push(query); } + if (game) { + sqlQuery += ` AND game LIKE '%' || ? || '%'`; + parameters.push(game); + } + + if (asset) { + sqlQuery += ` AND asset LIKE '%' || ? || '%'`; + parameters.push(asset); + } + sqlQuery += tags ? ` AND tags LIKE '%' || ? || '%'` : ""; tags && parameters.push(tags); - sqlQuery += after ? ` AND uid > ?` : ""; + sqlQuery += after ? ` AND id > ?` : ""; after && parameters.push(after); - sqlQuery += ` ORDER BY uid ASC LIMIT 100`; + sqlQuery += ` ORDER BY id ASC LIMIT 100`; const row: D1Result = await env.database .prepare(sqlQuery) @@ -41,23 +53,26 @@ export const getSearch = async ( .run(); results = row.results.slice(parseInt(after, 10)).map((result) => ({ - uid: result.uid, + id: result.id, name: result.name, game: result.game, - url: result.url, + asset: result.asset, tags: result.tags, + url: result.url, verified: result.verified, uploadedBy: result.uploadedBy, uploadedDate: result.uploadedDate, + fileSize: result.fileSize, })); response = new Response( JSON.stringify({ success: true, status: "ok", - // sqlQuery, path: "/search", query, + game, + asset, tags, results, }), @@ -68,3 +83,61 @@ export const getSearch = async ( return response; }; + +export const getRecentAssets = async ( + request: Request, + env: Env +): Promise => { + const url = new URL(request.url); + const after = url.searchParams.get("after") || ""; + let results: Asset[] = []; + + const cacheKey = new Request(url.toString(), request); + const cache = caches.default; + let response = await cache.match(cacheKey); + + if (response) { + return response; + } + + const parameters = []; + let sqlQuery = `SELECT * FROM assets WHERE 1=1`; + + sqlQuery += after ? ` AND id > ?` : ""; + after && parameters.push(after); + + sqlQuery += ` ORDER BY id DESC LIMIT 100`; + + const row: D1Result = await env.database + .prepare(sqlQuery) + .bind(...parameters) + .run(); + + results = row.results.slice(parseInt(after, 10)).map((result) => ({ + id: result.id, + name: result.name, + game: result.game, + asset: result.asset, + tags: result.tags, + url: result.url, + verified: result.verified, + uploadedBy: result.uploadedBy, + uploadedDate: result.uploadedDate, + fileSize: result.fileSize, + })); + + response = new Response( + JSON.stringify({ + success: true, + status: "ok", + path: "/search", + after, + results, + }), + { + headers: responseHeaders, + } + ); + + return response; +}; diff --git a/src/routes/user/getUserById.ts b/src/routes/user/getUserById.ts index 3b7bf1d..aa8969b 100644 --- a/src/routes/user/getUserById.ts +++ b/src/routes/user/getUserById.ts @@ -49,7 +49,7 @@ export const getUserById = async ( .run(); const assetsUploaded = assets.results.map((asset) => ({ - uid: asset.uid, + id: asset.id, name: asset.name, tags: asset.tags, verified: asset.verified, From fd524afbb74210251047f85bcd3e83484f6e4c73 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 25 Jun 2023 02:04:14 +0100 Subject: [PATCH 012/318] `getRecentAssets` returns `30` instead of `100` --- src/routes/search/search.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/search/search.ts b/src/routes/search/search.ts index 3d2c83e..bbee05d 100644 --- a/src/routes/search/search.ts +++ b/src/routes/search/search.ts @@ -106,7 +106,7 @@ export const getRecentAssets = async ( sqlQuery += after ? ` AND id > ?` : ""; after && parameters.push(after); - sqlQuery += ` ORDER BY id DESC LIMIT 100`; + sqlQuery += ` ORDER BY id DESC LIMIT 30`; const row: D1Result = await env.database .prepare(sqlQuery) From 021787d05377a08596ce330c5fdc668be6b8b765 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Tue, 27 Jun 2023 16:30:48 +0100 Subject: [PATCH 013/318] feat: append asset categoires & rm `after` --- src/lib/types/game.ts | 4 ++++ src/routes/games/allGames.ts | 33 +++++++++++++++++++-------------- src/routes/search/search.ts | 17 ++++------------- 3 files changed, 27 insertions(+), 27 deletions(-) create mode 100644 src/lib/types/game.ts diff --git a/src/lib/types/game.ts b/src/lib/types/game.ts new file mode 100644 index 0000000..3eea414 --- /dev/null +++ b/src/lib/types/game.ts @@ -0,0 +1,4 @@ +export interface Game { + name: string; + id: number; +} diff --git a/src/routes/games/allGames.ts b/src/routes/games/allGames.ts index 9b76ca1..0202a8b 100644 --- a/src/routes/games/allGames.ts +++ b/src/routes/games/allGames.ts @@ -1,25 +1,30 @@ -import { listBucket } from "@/lib/listBucket"; import { responseHeaders } from "@/lib/responseHeaders"; -import { unwantedPrefixes } from "@/middleware/unwantedPrefixes"; +import { Game } from "@/lib/types/game"; +import { listBucket } from "@/lib/listBucket"; export const allGames = async ( request: Request, env: Env ): Promise => { - const games = await listBucket(env.bucket, { - prefix: "", - delimiter: "/", - }); + const row: D1Result = await env.database + .prepare(`SELECT * FROM games`) + .run(); - // console.log(games.objects); + const gameList = await Promise.all( + row.results.map(async (result) => ({ + name: result.name, + id: result.id, + assetCategories: await listBucket(env.bucket, { + prefix: `${result.name}/`, + delimiter: "/", + }).then((data) => + data.delimitedPrefixes.map((prefix) => + prefix.replace(`${result.name}/`, "").replace("/", "") + ) + ), + })) + ); - const gameList = games.delimitedPrefixes - .filter((game) => !unwantedPrefixes.includes(game)) - .map((game) => { - return { - name: game.replace("/", ""), - }; - }); return new Response( JSON.stringify({ success: true, diff --git a/src/routes/search/search.ts b/src/routes/search/search.ts index bbee05d..fea2e7e 100644 --- a/src/routes/search/search.ts +++ b/src/routes/search/search.ts @@ -10,7 +10,6 @@ export const getSearch = async ( const game = url.searchParams.get("game") || ""; const asset = url.searchParams.get("asset") || ""; const tags = url.searchParams.get("tags") || ""; - const after = url.searchParams.get("after") || ""; let results: Asset[] = []; const cacheKey = new Request(url.toString(), request); @@ -42,17 +41,14 @@ export const getSearch = async ( sqlQuery += tags ? ` AND tags LIKE '%' || ? || '%'` : ""; tags && parameters.push(tags); - sqlQuery += after ? ` AND id > ?` : ""; - after && parameters.push(after); - - sqlQuery += ` ORDER BY id ASC LIMIT 100`; + sqlQuery += ` ORDER BY uploadedDate DESC LIMIT 100`; const row: D1Result = await env.database .prepare(sqlQuery) .bind(...parameters) .run(); - results = row.results.slice(parseInt(after, 10)).map((result) => ({ + results = row.results.map((result) => ({ id: result.id, name: result.name, game: result.game, @@ -89,7 +85,6 @@ export const getRecentAssets = async ( env: Env ): Promise => { const url = new URL(request.url); - const after = url.searchParams.get("after") || ""; let results: Asset[] = []; const cacheKey = new Request(url.toString(), request); @@ -103,17 +98,14 @@ export const getRecentAssets = async ( const parameters = []; let sqlQuery = `SELECT * FROM assets WHERE 1=1`; - sqlQuery += after ? ` AND id > ?` : ""; - after && parameters.push(after); - - sqlQuery += ` ORDER BY id DESC LIMIT 30`; + sqlQuery += ` ORDER BY uploadedDate DESC LIMIT 30`; const row: D1Result = await env.database .prepare(sqlQuery) .bind(...parameters) .run(); - results = row.results.slice(parseInt(after, 10)).map((result) => ({ + results = row.results.map((result) => ({ id: result.id, name: result.name, game: result.game, @@ -131,7 +123,6 @@ export const getRecentAssets = async ( success: true, status: "ok", path: "/search", - after, results, }), { From f3846bef358251492d24ae8081cb4cb6b791a590 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Wed, 28 Jun 2023 00:33:01 +0100 Subject: [PATCH 014/318] fix caching, upd search for more specific queries --- src/lib/responseHeaders.ts | 1 - src/routes/games/allGames.ts | 17 +++++++++++- src/routes/oc-generators/getGenerator.ts | 16 ++++++++++-- src/routes/oc-generators/getGenerators.ts | 16 +++++++++++- src/routes/search/search.ts | 32 +++++++++++++---------- src/routes/user/getUserById.ts | 16 ++++++++++-- src/routes/user/getUsersBySearch.ts | 15 ++++++++++- 7 files changed, 91 insertions(+), 22 deletions(-) diff --git a/src/lib/responseHeaders.ts b/src/lib/responseHeaders.ts index 42ccd2c..a913dc9 100644 --- a/src/lib/responseHeaders.ts +++ b/src/lib/responseHeaders.ts @@ -3,5 +3,4 @@ export const responseHeaders: Record = { "Referrer-Policy": "strict-origin-when-cross-origin", "content-type": "application/json;charset=UTF-8", "access-control-allow-origin": "*", - "Cache-Control": `max-age=${60 * 60 * 12}`, }; diff --git a/src/routes/games/allGames.ts b/src/routes/games/allGames.ts index 0202a8b..76df156 100644 --- a/src/routes/games/allGames.ts +++ b/src/routes/games/allGames.ts @@ -6,6 +6,16 @@ export const allGames = async ( request: Request, env: Env ): Promise => { + const url = new URL(request.url); + const cacheKey = new Request(url.toString(), request); + const cache = caches.default; + + let response = await cache.match(cacheKey); + + if (response) { + return response; + } + const row: D1Result = await env.database .prepare(`SELECT * FROM games`) .run(); @@ -25,7 +35,7 @@ export const allGames = async ( })) ); - return new Response( + response = new Response( JSON.stringify({ success: true, status: "ok", @@ -35,4 +45,9 @@ export const allGames = async ( headers: responseHeaders, } ); + + response.headers.set("Cache-Control", "s-maxage=600"); + await cache.put(cacheKey, response.clone()); + + return response; }; diff --git a/src/routes/oc-generators/getGenerator.ts b/src/routes/oc-generators/getGenerator.ts index de50946..7fcaccb 100644 --- a/src/routes/oc-generators/getGenerator.ts +++ b/src/routes/oc-generators/getGenerator.ts @@ -7,13 +7,20 @@ export const getGenerator = async ( ): Promise => { const url = new URL(request.url); const gameId = url.pathname.split("/")[2]; + const cacheKey = new Request(url.toString(), request); + const cache = caches.default; + let response = await cache.match(cacheKey); + + if (response) { + return response; + } const row: D1Result = await env.database .prepare(`SELECT * FROM ocGenerators WHERE name = ?`) .bind(gameId) .run(); - if (!row) { + if (!row.results.length) { return new Response( JSON.stringify({ success: false, @@ -34,7 +41,7 @@ export const getGenerator = async ( verified: result.verified, })); - return new Response( + response = new Response( JSON.stringify({ success: true, status: "ok", @@ -44,4 +51,9 @@ export const getGenerator = async ( headers: responseHeaders, } ); + + response.headers.set("Cache-Control", "s-maxage=3600"); + await cache.put(cacheKey, response.clone()); + + return response; }; diff --git a/src/routes/oc-generators/getGenerators.ts b/src/routes/oc-generators/getGenerators.ts index 6b40e59..3831486 100644 --- a/src/routes/oc-generators/getGenerators.ts +++ b/src/routes/oc-generators/getGenerators.ts @@ -5,6 +5,15 @@ export const getGenerators = async ( request: Request, env: Env ): Promise => { + const url = new URL(request.url); + const cacheKey = new Request(url.toString(), request); + const cache = caches.default; + + let response = await cache.match(cacheKey); + + if (response) { + return response; + } const row: D1Result = await env.database .prepare(`SELECT * FROM ocGenerators`) .run(); @@ -17,7 +26,7 @@ export const getGenerators = async ( verified: result.verified, })); - return new Response( + response = new Response( JSON.stringify({ success: true, status: "ok", @@ -27,4 +36,9 @@ export const getGenerators = async ( headers: responseHeaders, } ); + + response.headers.set("Cache-Control", "s-maxage=3600"); + await cache.put(cacheKey, response.clone()); + + return response; }; diff --git a/src/routes/search/search.ts b/src/routes/search/search.ts index fea2e7e..09fb84e 100644 --- a/src/routes/search/search.ts +++ b/src/routes/search/search.ts @@ -7,9 +7,9 @@ export const getSearch = async ( ): Promise => { const url = new URL(request.url); const query = url.searchParams.get("query") || ""; - const game = url.searchParams.get("game") || ""; - const asset = url.searchParams.get("asset") || ""; - const tags = url.searchParams.get("tags") || ""; + const game = url.searchParams.get("game")?.split(",") || []; + const asset = url.searchParams.get("asset")?.split(",") || []; + const tags = url.searchParams.get("tags")?.split(",") || []; let results: Asset[] = []; const cacheKey = new Request(url.toString(), request); @@ -24,24 +24,26 @@ export const getSearch = async ( let sqlQuery = `SELECT * FROM assets WHERE 1=1`; if (query) { - sqlQuery += ` AND name LIKE '%' || ? || '%'`; - parameters.push(query); + sqlQuery += ` AND name LIKE ?`; + parameters.push(`%${query}%`); } - if (game) { - sqlQuery += ` AND game LIKE '%' || ? || '%'`; - parameters.push(game); + if (game.length) { + sqlQuery += ` AND game IN (${game.map(() => "?").join(",")})`; + parameters.push(...game); } - if (asset) { - sqlQuery += ` AND asset LIKE '%' || ? || '%'`; - parameters.push(asset); + if (asset.length) { + sqlQuery += ` AND asset IN (${asset.map(() => "?").join(",")})`; + parameters.push(...asset); } - sqlQuery += tags ? ` AND tags LIKE '%' || ? || '%'` : ""; - tags && parameters.push(tags); + sqlQuery += tags.length + ? ` AND tags IN (${tags.map(() => "?").join(",")})` + : ""; + tags.length && parameters.push(...tags); - sqlQuery += ` ORDER BY uploadedDate DESC LIMIT 100`; + sqlQuery += ` ORDER BY uploadedDate DESC`; const row: D1Result = await env.database .prepare(sqlQuery) @@ -130,5 +132,7 @@ export const getRecentAssets = async ( } ); + response.headers.set("Cache-Control", "s-maxage=3600"); + await cache.put(cacheKey, response.clone()); return response; }; diff --git a/src/routes/user/getUserById.ts b/src/routes/user/getUserById.ts index aa8969b..dcf492e 100644 --- a/src/routes/user/getUserById.ts +++ b/src/routes/user/getUserById.ts @@ -8,7 +8,6 @@ export const getUserById = async ( ): Promise => { const url = new URL(request.url); const id = url.pathname.split("/")[2]; - console.log(id); if (!id) { return new Response( @@ -23,6 +22,14 @@ export const getUserById = async ( ); } + const cacheKey = new Request(url.toString(), request); + const cache = caches.default; + + let response = await cache.match(cacheKey); + + if (response) { + return response; + } const row: D1Result = await env.database .prepare(`SELECT * FROM users WHERE id = ?`) .bind(id) @@ -68,7 +75,7 @@ export const getUserById = async ( recentAssets: assetsUploaded || [], })); - return new Response( + response = new Response( JSON.stringify({ success: true, status: "ok", @@ -78,4 +85,9 @@ export const getUserById = async ( headers: responseHeaders, } ); + + response.headers.set("Cache-Control", "s-maxage=60"); + await cache.put(cacheKey, response.clone()); + + return response; }; diff --git a/src/routes/user/getUsersBySearch.ts b/src/routes/user/getUsersBySearch.ts index c885916..b70ef45 100644 --- a/src/routes/user/getUsersBySearch.ts +++ b/src/routes/user/getUsersBySearch.ts @@ -8,6 +8,14 @@ export const getUserBySearch = async ( const url = new URL(request.url); const name = url.pathname.split("/")[3]; + const cacheKey = new Request(url.toString(), request); + const cache = caches.default; + + let response = await cache.match(cacheKey); + + if (response) { + return response; + } const row: D1Result = await env.database .prepare( `SELECT * FROM users WHERE displayName = ? OR name = ? OR name LIKE ?` @@ -42,7 +50,7 @@ export const getUserBySearch = async ( results.sort((a, b) => (a.name === name ? -1 : b.name === name ? 1 : 0)); - return new Response( + response = new Response( JSON.stringify({ success: true, status: "ok", @@ -52,4 +60,9 @@ export const getUserBySearch = async ( headers: responseHeaders, } ); + + response.headers.set("Cache-Control", "s-maxage=60"); + await cache.put(cacheKey, response.clone()); + + return response; }; From 4b61ac5fbb4206afb26ade223c225eaf990b0552 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sat, 1 Jul 2023 15:05:23 +0100 Subject: [PATCH 015/318] `/asset`, `/download` ++ `:id` route, upd caching --- src/handler.ts | 4 +- src/routes/asset/getAssetFromId.ts | 77 +++++++++++++++++++++++ src/routes/download/downloadFile.ts | 21 +++++-- src/routes/oc-generators/getGenerator.ts | 2 +- src/routes/oc-generators/getGenerators.ts | 2 +- 5 files changed, 97 insertions(+), 9 deletions(-) create mode 100644 src/routes/asset/getAssetFromId.ts diff --git a/src/handler.ts b/src/handler.ts index bff2027..3d458c7 100644 --- a/src/handler.ts +++ b/src/handler.ts @@ -10,6 +10,7 @@ import { downloadFile } from "@/routes/download/downloadFile"; import { getUserById } from "@/routes/user/getUserById"; import { getUserBySearch } from "@/routes/user/getUsersBySearch"; import { allGames } from "@/routes/games/allGames"; +import { getAssetFromId } from "@/routes/asset/getAssetFromId"; const router = Router(); @@ -18,9 +19,10 @@ router .get("/games", errorHandler(allGames)) .get("/user/:id", errorHandler(getUserById)) .get("/recent", errorHandler(getRecentAssets)) + .get("/asset/:id", errorHandler(getAssetFromId)) .get("/user/search/:name", errorHandler(getUserBySearch)) .get("/search", errorHandler(getSearch)) - .get("/download", errorHandler(downloadFile)) + .get("/download/:id", errorHandler(downloadFile)) .get("/oc-generators", errorHandler(getGenerators)) .get("/oc-generator/:gameId", errorHandler(getGenerator)) .get("/discord/contributors", errorHandler(getContributors)) diff --git a/src/routes/asset/getAssetFromId.ts b/src/routes/asset/getAssetFromId.ts new file mode 100644 index 0000000..820a858 --- /dev/null +++ b/src/routes/asset/getAssetFromId.ts @@ -0,0 +1,77 @@ +import { responseHeaders } from "@/lib/responseHeaders"; +import type { Asset } from "@/lib/types/asset"; + +export const getAssetFromId = async ( + request: Request, + env: Env +): Promise => { + let row: D1Result; + const url = new URL(request.url); + const id = url.pathname.split("/")[2]; + console.log(id); + + const cacheKey = new Request(url.toString(), request); + const cache = caches.default; + + let response = await cache.match(cacheKey); + + if (response) { + return response; + } + + try { + row = await env.database + .prepare(`SELECT * FROM assets WHERE id = ?`) + .bind(id) + .run(); + } catch (e) { + throw new Error(`Error getting asset from id`); + } + + if (!row.results[0]) { + return new Response( + JSON.stringify({ + success: false, + status: "not found", + message: "Asset not found", + }), + { + headers: responseHeaders, + } + ); + } + + await env.database + .prepare(`UPDATE assets SET viewCount = viewCount + 1 WHERE id = ?`) + .bind(id) + .run(); + + const asset: Asset = { + id: row.results[0].id, + name: row.results[0].name, + game: row.results[0].game, + asset: row.results[0].asset, + tags: row.results[0].tags, + url: row.results[0].url, + verified: row.results[0].verified, + uploadedBy: row.results[0].uploadedBy, + uploadedDate: row.results[0].uploadedDate, + fileSize: row.results[0].fileSize, + }; + + response = new Response( + JSON.stringify({ + success: true, + status: "ok", + asset, + }), + { + headers: responseHeaders, + } + ); + + response.headers.set("Cache-Control", "s-maxage=28800"); + await cache.put(cacheKey, response.clone()); + + return response; +}; diff --git a/src/routes/download/downloadFile.ts b/src/routes/download/downloadFile.ts index b3d920e..4e293c8 100644 --- a/src/routes/download/downloadFile.ts +++ b/src/routes/download/downloadFile.ts @@ -5,13 +5,19 @@ export const downloadFile = async ( request: Request, env: Env ): Promise => { + let row: D1Result; const url = new URL(request.url); - const id = url.searchParams.get("id") || ""; + const id = url.pathname.split("/")[2]; + // console.log(id); - const row: D1Result = await env.database - .prepare(`SELECT * FROM assets WHERE id = ?`) - .bind(id) - .run(); + try { + row = await env.database + .prepare(`SELECT * FROM assets WHERE id = ?`) + .bind(id) + .run(); + } catch (e) { + throw new Error(`Error getting asset from id`); + } if (!row.results[0]) { return new Response( @@ -36,7 +42,10 @@ export const downloadFile = async ( const response = await fetch(row.results[0].url); const headers = new Headers(response.headers); - headers.set("Content-Disposition", "attachment"); + headers.set( + "Content-Disposition", + `attachment; filename="${row.results[0].name}"` + ); const blob = await response.blob(); return new Response(blob, { diff --git a/src/routes/oc-generators/getGenerator.ts b/src/routes/oc-generators/getGenerator.ts index 7fcaccb..3514e2f 100644 --- a/src/routes/oc-generators/getGenerator.ts +++ b/src/routes/oc-generators/getGenerator.ts @@ -52,7 +52,7 @@ export const getGenerator = async ( } ); - response.headers.set("Cache-Control", "s-maxage=3600"); + response.headers.set("Cache-Control", "s-maxage=28800"); await cache.put(cacheKey, response.clone()); return response; diff --git a/src/routes/oc-generators/getGenerators.ts b/src/routes/oc-generators/getGenerators.ts index 3831486..9860e24 100644 --- a/src/routes/oc-generators/getGenerators.ts +++ b/src/routes/oc-generators/getGenerators.ts @@ -37,7 +37,7 @@ export const getGenerators = async ( } ); - response.headers.set("Cache-Control", "s-maxage=3600"); + response.headers.set("Cache-Control", "s-maxage=28800"); await cache.put(cacheKey, response.clone()); return response; From a1cf20f5bc4ced768298833b6cf8ac5e5c9db7f8 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sat, 1 Jul 2023 21:04:19 +0100 Subject: [PATCH 016/318] feat: similar assets reccomendation --- src/routes/asset/getAssetFromId.ts | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/routes/asset/getAssetFromId.ts b/src/routes/asset/getAssetFromId.ts index 820a858..bb271e9 100644 --- a/src/routes/asset/getAssetFromId.ts +++ b/src/routes/asset/getAssetFromId.ts @@ -46,6 +46,7 @@ export const getAssetFromId = async ( .bind(id) .run(); + // doing this as we don't want to append viewCount & downloadCount const asset: Asset = { id: row.results[0].id, name: row.results[0].name, @@ -59,11 +60,38 @@ export const getAssetFromId = async ( fileSize: row.results[0].fileSize, }; + // similarAssets: random 4 random assets from the same game & asset type + const similarAssets: D1Result = await env.database + .prepare( + `SELECT * FROM assets WHERE game = ? AND asset = ? ORDER BY RANDOM() LIMIT 4` + ) + .bind(asset.game, asset.asset) + .all(); + + const similarAssetsArray: Asset[] = []; + + // as above, don't want to append viewCount & downloadCount + similarAssets.results.forEach((asset) => { + similarAssetsArray.push({ + id: asset.id, + name: asset.name, + game: asset.game, + asset: asset.asset, + tags: asset.tags, + url: asset.url, + verified: asset.verified, + uploadedBy: asset.uploadedBy, + uploadedDate: asset.uploadedDate, + fileSize: asset.fileSize, + }); + }); + response = new Response( JSON.stringify({ success: true, status: "ok", asset, + similarAssets: similarAssetsArray, }), { headers: responseHeaders, From 429cd5346d09a87acdb8357104268dceef59ed61 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sat, 1 Jul 2023 21:15:43 +0100 Subject: [PATCH 017/318] feat: increase `similarAssets` from `4 -> 6` --- src/routes/asset/getAssetFromId.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/asset/getAssetFromId.ts b/src/routes/asset/getAssetFromId.ts index bb271e9..8002227 100644 --- a/src/routes/asset/getAssetFromId.ts +++ b/src/routes/asset/getAssetFromId.ts @@ -63,7 +63,7 @@ export const getAssetFromId = async ( // similarAssets: random 4 random assets from the same game & asset type const similarAssets: D1Result = await env.database .prepare( - `SELECT * FROM assets WHERE game = ? AND asset = ? ORDER BY RANDOM() LIMIT 4` + `SELECT * FROM assets WHERE game = ? AND asset = ? ORDER BY RANDOM() LIMIT 6` ) .bind(asset.game, asset.asset) .all(); From d5d5c520dce6a6ca31e7237bd3246256b14b5d98 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sat, 1 Jul 2023 22:40:00 +0100 Subject: [PATCH 018/318] fix: exclude current asset from `similarAssets` --- src/routes/asset/getAssetFromId.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/routes/asset/getAssetFromId.ts b/src/routes/asset/getAssetFromId.ts index 8002227..14fb032 100644 --- a/src/routes/asset/getAssetFromId.ts +++ b/src/routes/asset/getAssetFromId.ts @@ -60,12 +60,12 @@ export const getAssetFromId = async ( fileSize: row.results[0].fileSize, }; - // similarAssets: random 4 random assets from the same game & asset type + // similarAssets: random 6 random assets from the same game & asset type const similarAssets: D1Result = await env.database .prepare( - `SELECT * FROM assets WHERE game = ? AND asset = ? ORDER BY RANDOM() LIMIT 6` + `SELECT * FROM assets WHERE game = ? AND asset = ? AND id != ? ORDER BY RANDOM() LIMIT 6` ) - .bind(asset.game, asset.asset) + .bind(asset.game, asset.asset, asset.id) .all(); const similarAssetsArray: Asset[] = []; From 2c3440bf9615399c6c1eb161f9799bc9a1bb0834 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Mon, 3 Jul 2023 02:49:29 +0100 Subject: [PATCH 019/318] disable user search --- src/handler.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/handler.ts b/src/handler.ts index 3d458c7..03b619d 100644 --- a/src/handler.ts +++ b/src/handler.ts @@ -17,10 +17,10 @@ const router = Router(); router .get("/", errorHandler(index)) .get("/games", errorHandler(allGames)) - .get("/user/:id", errorHandler(getUserById)) + // .get("/user/:id", errorHandler(getUserById)) .get("/recent", errorHandler(getRecentAssets)) .get("/asset/:id", errorHandler(getAssetFromId)) - .get("/user/search/:name", errorHandler(getUserBySearch)) + // .get("/user/search/:name", errorHandler(getUserBySearch)) .get("/search", errorHandler(getSearch)) .get("/download/:id", errorHandler(downloadFile)) .get("/oc-generators", errorHandler(getGenerators)) From 16fcffef4d8b4d499e0c6d3ba59aa2ccb6529175 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Mon, 3 Jul 2023 05:42:03 +0100 Subject: [PATCH 020/318] return `2500` assets max per `/search` req return `2500` assets at one time when more than 1 game or query is selected to circumvent abuse --- src/routes/search/search.ts | 5 +++++ wrangler.toml | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/routes/search/search.ts b/src/routes/search/search.ts index 09fb84e..dfbd583 100644 --- a/src/routes/search/search.ts +++ b/src/routes/search/search.ts @@ -45,6 +45,11 @@ export const getSearch = async ( sqlQuery += ` ORDER BY uploadedDate DESC`; + // if there are more than 1 game or asset, limited to 2500 results to prevent abuse of the API + if (game.length > 1 || asset.length > 1) { + sqlQuery += ` LIMIT 2500`; + } + const row: D1Result = await env.database .prepare(sqlQuery) .bind(...parameters) diff --git a/wrangler.toml b/wrangler.toml index 15b9d3c..3db572e 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -15,4 +15,4 @@ binding = 'database' database_name = 'wanderer-moe' database_id = 'df7af4d9-3546-42d2-bf0d-8376091a7875' -[vars] \ No newline at end of file +[vars] From b7e9f478177cb53bdda8e948a376dd439667dfda Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Mon, 3 Jul 2023 05:43:37 +0100 Subject: [PATCH 021/318] stop codefactor from complaining --- src/handler.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/handler.ts b/src/handler.ts index 03b619d..33905dc 100644 --- a/src/handler.ts +++ b/src/handler.ts @@ -7,8 +7,8 @@ import { getGenerator } from "@/routes/oc-generators/getGenerator"; import { getGenerators } from "@/routes/oc-generators/getGenerators"; import { getSearch, getRecentAssets } from "@/routes/search/search"; import { downloadFile } from "@/routes/download/downloadFile"; -import { getUserById } from "@/routes/user/getUserById"; -import { getUserBySearch } from "@/routes/user/getUsersBySearch"; +// import { getUserById } from "@/routes/user/getUserById"; +// import { getUserBySearch } from "@/routes/user/getUsersBySearch"; import { allGames } from "@/routes/games/allGames"; import { getAssetFromId } from "@/routes/asset/getAssetFromId"; From 429c2057ebb9b7c118df13c0ee85b4da77c87754 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Mon, 3 Jul 2023 19:27:38 +0100 Subject: [PATCH 022/318] fix: return 30 assets if no params provided in search --- package.json | 8 +- pnpm-lock.yaml | 4296 ++++++++++++++--------------------- src/routes/search/search.ts | 5 + 3 files changed, 1770 insertions(+), 2539 deletions(-) diff --git a/package.json b/package.json index 94de552..89d82fd 100644 --- a/package.json +++ b/package.json @@ -10,16 +10,16 @@ }, "devDependencies": { "@cloudflare/workers-types": "^4.20230518.0", - "eslint": "^8.42.0", + "eslint": "^8.44.0", "eslint-config-google": "^0.14.0", "eslint-plugin-json": "^3.1.0", - "typescript": "^5.1.3", + "typescript": "^5.1.6", "wrangler": "3.1.1" }, "private": true, "dependencies": { - "@typescript-eslint/eslint-plugin": "^5.59.11", - "itty-router": "^4.0.9", + "@typescript-eslint/eslint-plugin": "^5.61.0", + "itty-router": "^4.0.13", "prettier": "^2.8.8", "render2": "^1.2.1" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b8cd016..43aabcb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,2551 +1,1777 @@ -lockfileVersion: "6.0" +lockfileVersion: '6.1' settings: - autoInstallPeers: true - excludeLinksFromLockfile: false + autoInstallPeers: true + excludeLinksFromLockfile: false dependencies: - "@typescript-eslint/eslint-plugin": - specifier: ^5.59.11 - version: 5.59.11(@typescript-eslint/parser@5.59.11)(eslint@8.42.0)(typescript@5.1.3) - itty-router: - specifier: ^4.0.9 - version: 4.0.9 - prettier: - specifier: ^2.8.8 - version: 2.8.8 - render2: - specifier: ^1.2.1 - version: 1.2.1 + '@typescript-eslint/eslint-plugin': + specifier: ^5.61.0 + version: 5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.44.0)(typescript@5.1.6) + itty-router: + specifier: ^4.0.13 + version: 4.0.13 + prettier: + specifier: ^2.8.8 + version: 2.8.8 + render2: + specifier: ^1.2.1 + version: 1.2.1 devDependencies: - "@cloudflare/workers-types": - specifier: ^4.20230518.0 - version: 4.20230518.0 - eslint: - specifier: ^8.42.0 - version: 8.42.0 - eslint-config-google: - specifier: ^0.14.0 - version: 0.14.0(eslint@8.42.0) - eslint-plugin-json: - specifier: ^3.1.0 - version: 3.1.0 - typescript: - specifier: ^5.1.3 - version: 5.1.3 - wrangler: - specifier: 3.1.1 - version: 3.1.1 + '@cloudflare/workers-types': + specifier: ^4.20230518.0 + version: 4.20230518.0 + eslint: + specifier: ^8.44.0 + version: 8.44.0 + eslint-config-google: + specifier: ^0.14.0 + version: 0.14.0(eslint@8.44.0) + eslint-plugin-json: + specifier: ^3.1.0 + version: 3.1.0 + typescript: + specifier: ^5.1.6 + version: 5.1.6 + wrangler: + specifier: 3.1.1 + version: 3.1.1 packages: - /@cloudflare/kv-asset-handler@0.2.0: - resolution: - { - integrity: sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==, - } - dependencies: - mime: 3.0.0 - dev: true - - /@cloudflare/workerd-darwin-64@1.20230518.0: - resolution: - { - integrity: sha512-reApIf2/do6GjLlajU6LbRYh8gm/XcaRtzGbF8jo5IzyDSsdStmfNuvq7qssZXG92219Yp1kuTgR9+D1GGZGbg==, - } - engines: { node: ">=16" } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workerd-darwin-arm64@1.20230518.0: - resolution: - { - integrity: sha512-1l+xdbmPddqb2YIHd1YJ3YG/Fl1nhayzcxfL30xfNS89zJn9Xn3JomM0XMD4mk0d5GruBP3q8BQZ1Uo4rRLF3A==, - } - engines: { node: ">=16" } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workerd-linux-64@1.20230518.0: - resolution: - { - integrity: sha512-/pfR+YBpMOPr2cAlwjtInil0hRZjD8KX9LqK9JkfkEiaBH8CYhnJQcOdNHZI+3OjcY09JnQtEVC5xC4nbW7Bvw==, - } - engines: { node: ">=16" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workerd-linux-arm64@1.20230518.0: - resolution: - { - integrity: sha512-q3HQvn3J4uEkE0cfDAGG8zqzSZrD47cavB/Tzv4mNutqwg6B4wL3ifjtGeB55tnP2K2KL0GVmX4tObcvpUF4BA==, - } - engines: { node: ">=16" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workerd-windows-64@1.20230518.0: - resolution: - { - integrity: sha512-vNEHKS5gKKduNOBYtQjcBopAmFT1iScuPWMZa2nJboSjOB9I/5oiVsUpSyk5Y2ARyrohXNz0y8D7p87YzTASWw==, - } - engines: { node: ">=16" } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workers-types@4.20230518.0: - resolution: - { - integrity: sha512-A0w1V+5SUawGaaPRlhFhSC/SCDT9oQG8TMoWOKFLA4qbqagELqEAFD4KySBIkeVOvCBLT1DZSYBMCxbXddl0kw==, - } - dev: true - - /@esbuild-plugins/node-globals-polyfill@0.1.1(esbuild@0.16.3): - resolution: - { - integrity: sha512-MR0oAA+mlnJWrt1RQVQ+4VYuRJW/P2YmRTv1AsplObyvuBMnPHiizUF95HHYiSsMGLhyGtWufaq2XQg6+iurBg==, - } - peerDependencies: - esbuild: "*" - dependencies: - esbuild: 0.16.3 - dev: true - - /@esbuild-plugins/node-modules-polyfill@0.1.4(esbuild@0.16.3): - resolution: - { - integrity: sha512-uZbcXi0zbmKC/050p3gJnne5Qdzw8vkXIv+c2BW0Lsc1ji1SkrxbKPUy5Efr0blbTu1SL8w4eyfpnSdPg3G0Qg==, - } - peerDependencies: - esbuild: "*" - dependencies: - esbuild: 0.16.3 - escape-string-regexp: 4.0.0 - rollup-plugin-node-polyfills: 0.2.1 - dev: true - - /@esbuild/android-arm64@0.16.3: - resolution: - { - integrity: sha512-RolFVeinkeraDvN/OoRf1F/lP0KUfGNb5jxy/vkIMeRRChkrX/HTYN6TYZosRJs3a1+8wqpxAo5PI5hFmxyPRg==, - } - engines: { node: ">=12" } - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm@0.16.3: - resolution: - { - integrity: sha512-mueuEoh+s1eRbSJqq9KNBQwI4QhQV6sRXIfTyLXSHGMpyew61rOK4qY21uKbXl1iBoMb0AdL1deWFCQVlN2qHA==, - } - engines: { node: ">=12" } - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-x64@0.16.3: - resolution: - { - integrity: sha512-SFpTUcIT1bIJuCCBMCQWq1bL2gPTjWoLZdjmIhjdcQHaUfV41OQfho6Ici5uvvkMmZRXIUGpM3GxysP/EU7ifQ==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-arm64@0.16.3: - resolution: - { - integrity: sha512-DO8WykMyB+N9mIDfI/Hug70Dk1KipavlGAecxS3jDUwAbTpDXj0Lcwzw9svkhxfpCagDmpaTMgxWK8/C/XcXvw==, - } - engines: { node: ">=12" } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-x64@0.16.3: - resolution: - { - integrity: sha512-uEqZQ2omc6BvWqdCiyZ5+XmxuHEi1SPzpVxXCSSV2+Sh7sbXbpeNhHIeFrIpRjAs0lI1FmA1iIOxFozKBhKgRQ==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-arm64@0.16.3: - resolution: - { - integrity: sha512-nJansp3sSXakNkOD5i5mIz2Is/HjzIhFs49b1tjrPrpCmwgBmH9SSzhC/Z1UqlkivqMYkhfPwMw1dGFUuwmXhw==, - } - engines: { node: ">=12" } - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-x64@0.16.3: - resolution: - { - integrity: sha512-TfoDzLw+QHfc4a8aKtGSQ96Wa+6eimljjkq9HKR0rHlU83vw8aldMOUSJTUDxbcUdcgnJzPaX8/vGWm7vyV7ug==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm64@0.16.3: - resolution: - { - integrity: sha512-7I3RlsnxEFCHVZNBLb2w7unamgZ5sVwO0/ikE2GaYvYuUQs9Qte/w7TqWcXHtCwxvZx/2+F97ndiUQAWs47ZfQ==, - } - engines: { node: ">=12" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm@0.16.3: - resolution: - { - integrity: sha512-VwswmSYwVAAq6LysV59Fyqk3UIjbhuc6wb3vEcJ7HEJUtFuLK9uXWuFoH1lulEbE4+5GjtHi3MHX+w1gNHdOWQ==, - } - engines: { node: ">=12" } - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ia32@0.16.3: - resolution: - { - integrity: sha512-X8FDDxM9cqda2rJE+iblQhIMYY49LfvW4kaEjoFbTTQ4Go8G96Smj2w3BRTwA8IHGoi9dPOPGAX63dhuv19UqA==, - } - engines: { node: ">=12" } - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-loong64@0.16.3: - resolution: - { - integrity: sha512-hIbeejCOyO0X9ujfIIOKjBjNAs9XD/YdJ9JXAy1lHA+8UXuOqbFe4ErMCqMr8dhlMGBuvcQYGF7+kO7waj2KHw==, - } - engines: { node: ">=12" } - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-mips64el@0.16.3: - resolution: - { - integrity: sha512-znFRzICT/V8VZQMt6rjb21MtAVJv/3dmKRMlohlShrbVXdBuOdDrGb+C2cZGQAR8RFyRe7HS6klmHq103WpmVw==, - } - engines: { node: ">=12" } - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ppc64@0.16.3: - resolution: - { - integrity: sha512-EV7LuEybxhXrVTDpbqWF2yehYRNz5e5p+u3oQUS2+ZFpknyi1NXxr8URk4ykR8Efm7iu04//4sBg249yNOwy5Q==, - } - engines: { node: ">=12" } - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-riscv64@0.16.3: - resolution: - { - integrity: sha512-uDxqFOcLzFIJ+r/pkTTSE9lsCEaV/Y6rMlQjUI9BkzASEChYL/aSQjZjchtEmdnVxDKETnUAmsaZ4pqK1eE5BQ==, - } - engines: { node: ">=12" } - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-s390x@0.16.3: - resolution: - { - integrity: sha512-NbeREhzSxYwFhnCAQOQZmajsPYtX71Ufej3IQ8W2Gxskfz9DK58ENEju4SbpIj48VenktRASC52N5Fhyf/aliQ==, - } - engines: { node: ">=12" } - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-x64@0.16.3: - resolution: - { - integrity: sha512-SDiG0nCixYO9JgpehoKgScwic7vXXndfasjnD5DLbp1xltANzqZ425l7LSdHynt19UWOcDjG9wJJzSElsPvk0w==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + + /@cloudflare/kv-asset-handler@0.2.0: + resolution: {integrity: sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==} + dependencies: + mime: 3.0.0 + dev: true + + /@cloudflare/workerd-darwin-64@1.20230518.0: + resolution: {integrity: sha512-reApIf2/do6GjLlajU6LbRYh8gm/XcaRtzGbF8jo5IzyDSsdStmfNuvq7qssZXG92219Yp1kuTgR9+D1GGZGbg==} + engines: {node: '>=16'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@cloudflare/workerd-darwin-arm64@1.20230518.0: + resolution: {integrity: sha512-1l+xdbmPddqb2YIHd1YJ3YG/Fl1nhayzcxfL30xfNS89zJn9Xn3JomM0XMD4mk0d5GruBP3q8BQZ1Uo4rRLF3A==} + engines: {node: '>=16'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@cloudflare/workerd-linux-64@1.20230518.0: + resolution: {integrity: sha512-/pfR+YBpMOPr2cAlwjtInil0hRZjD8KX9LqK9JkfkEiaBH8CYhnJQcOdNHZI+3OjcY09JnQtEVC5xC4nbW7Bvw==} + engines: {node: '>=16'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@cloudflare/workerd-linux-arm64@1.20230518.0: + resolution: {integrity: sha512-q3HQvn3J4uEkE0cfDAGG8zqzSZrD47cavB/Tzv4mNutqwg6B4wL3ifjtGeB55tnP2K2KL0GVmX4tObcvpUF4BA==} + engines: {node: '>=16'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@cloudflare/workerd-windows-64@1.20230518.0: + resolution: {integrity: sha512-vNEHKS5gKKduNOBYtQjcBopAmFT1iScuPWMZa2nJboSjOB9I/5oiVsUpSyk5Y2ARyrohXNz0y8D7p87YzTASWw==} + engines: {node: '>=16'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@cloudflare/workers-types@4.20230518.0: + resolution: {integrity: sha512-A0w1V+5SUawGaaPRlhFhSC/SCDT9oQG8TMoWOKFLA4qbqagELqEAFD4KySBIkeVOvCBLT1DZSYBMCxbXddl0kw==} + dev: true + + /@esbuild-plugins/node-globals-polyfill@0.1.1(esbuild@0.16.3): + resolution: {integrity: sha512-MR0oAA+mlnJWrt1RQVQ+4VYuRJW/P2YmRTv1AsplObyvuBMnPHiizUF95HHYiSsMGLhyGtWufaq2XQg6+iurBg==} + peerDependencies: + esbuild: '*' + dependencies: + esbuild: 0.16.3 + dev: true + + /@esbuild-plugins/node-modules-polyfill@0.1.4(esbuild@0.16.3): + resolution: {integrity: sha512-uZbcXi0zbmKC/050p3gJnne5Qdzw8vkXIv+c2BW0Lsc1ji1SkrxbKPUy5Efr0blbTu1SL8w4eyfpnSdPg3G0Qg==} + peerDependencies: + esbuild: '*' + dependencies: + esbuild: 0.16.3 + escape-string-regexp: 4.0.0 + rollup-plugin-node-polyfills: 0.2.1 + dev: true + + /@esbuild/android-arm64@0.16.3: + resolution: {integrity: sha512-RolFVeinkeraDvN/OoRf1F/lP0KUfGNb5jxy/vkIMeRRChkrX/HTYN6TYZosRJs3a1+8wqpxAo5PI5hFmxyPRg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.16.3: + resolution: {integrity: sha512-mueuEoh+s1eRbSJqq9KNBQwI4QhQV6sRXIfTyLXSHGMpyew61rOK4qY21uKbXl1iBoMb0AdL1deWFCQVlN2qHA==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.16.3: + resolution: {integrity: sha512-SFpTUcIT1bIJuCCBMCQWq1bL2gPTjWoLZdjmIhjdcQHaUfV41OQfho6Ici5uvvkMmZRXIUGpM3GxysP/EU7ifQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.16.3: + resolution: {integrity: sha512-DO8WykMyB+N9mIDfI/Hug70Dk1KipavlGAecxS3jDUwAbTpDXj0Lcwzw9svkhxfpCagDmpaTMgxWK8/C/XcXvw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.16.3: + resolution: {integrity: sha512-uEqZQ2omc6BvWqdCiyZ5+XmxuHEi1SPzpVxXCSSV2+Sh7sbXbpeNhHIeFrIpRjAs0lI1FmA1iIOxFozKBhKgRQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.16.3: + resolution: {integrity: sha512-nJansp3sSXakNkOD5i5mIz2Is/HjzIhFs49b1tjrPrpCmwgBmH9SSzhC/Z1UqlkivqMYkhfPwMw1dGFUuwmXhw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.16.3: + resolution: {integrity: sha512-TfoDzLw+QHfc4a8aKtGSQ96Wa+6eimljjkq9HKR0rHlU83vw8aldMOUSJTUDxbcUdcgnJzPaX8/vGWm7vyV7ug==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.16.3: + resolution: {integrity: sha512-7I3RlsnxEFCHVZNBLb2w7unamgZ5sVwO0/ikE2GaYvYuUQs9Qte/w7TqWcXHtCwxvZx/2+F97ndiUQAWs47ZfQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.16.3: + resolution: {integrity: sha512-VwswmSYwVAAq6LysV59Fyqk3UIjbhuc6wb3vEcJ7HEJUtFuLK9uXWuFoH1lulEbE4+5GjtHi3MHX+w1gNHdOWQ==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.16.3: + resolution: {integrity: sha512-X8FDDxM9cqda2rJE+iblQhIMYY49LfvW4kaEjoFbTTQ4Go8G96Smj2w3BRTwA8IHGoi9dPOPGAX63dhuv19UqA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.16.3: + resolution: {integrity: sha512-hIbeejCOyO0X9ujfIIOKjBjNAs9XD/YdJ9JXAy1lHA+8UXuOqbFe4ErMCqMr8dhlMGBuvcQYGF7+kO7waj2KHw==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.16.3: + resolution: {integrity: sha512-znFRzICT/V8VZQMt6rjb21MtAVJv/3dmKRMlohlShrbVXdBuOdDrGb+C2cZGQAR8RFyRe7HS6klmHq103WpmVw==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.16.3: + resolution: {integrity: sha512-EV7LuEybxhXrVTDpbqWF2yehYRNz5e5p+u3oQUS2+ZFpknyi1NXxr8URk4ykR8Efm7iu04//4sBg249yNOwy5Q==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.16.3: + resolution: {integrity: sha512-uDxqFOcLzFIJ+r/pkTTSE9lsCEaV/Y6rMlQjUI9BkzASEChYL/aSQjZjchtEmdnVxDKETnUAmsaZ4pqK1eE5BQ==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.16.3: + resolution: {integrity: sha512-NbeREhzSxYwFhnCAQOQZmajsPYtX71Ufej3IQ8W2Gxskfz9DK58ENEju4SbpIj48VenktRASC52N5Fhyf/aliQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.16.3: + resolution: {integrity: sha512-SDiG0nCixYO9JgpehoKgScwic7vXXndfasjnD5DLbp1xltANzqZ425l7LSdHynt19UWOcDjG9wJJzSElsPvk0w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.16.3: + resolution: {integrity: sha512-AzbsJqiHEq1I/tUvOfAzCY15h4/7Ivp3ff/o1GpP16n48JMNAtbW0qui2WCgoIZArEHD0SUQ95gvR0oSO7ZbdA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.16.3: + resolution: {integrity: sha512-gSABi8qHl8k3Cbi/4toAzHiykuBuWLZs43JomTcXkjMZVkp0gj3gg9mO+9HJW/8GB5H89RX/V0QP4JGL7YEEVg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.16.3: + resolution: {integrity: sha512-SF9Kch5Ete4reovvRO6yNjMxrvlfT0F0Flm+NPoUw5Z4Q3r1d23LFTgaLwm3Cp0iGbrU/MoUI+ZqwCv5XJijCw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.16.3: + resolution: {integrity: sha512-u5aBonZIyGopAZyOnoPAA6fGsDeHByZ9CnEzyML9NqntK6D/xl5jteZUKm/p6nD09+v3pTM6TuUIqSPcChk5gg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.16.3: + resolution: {integrity: sha512-GlgVq1WpvOEhNioh74TKelwla9KDuAaLZrdxuuUgsP2vayxeLgVc+rbpIv0IYF4+tlIzq2vRhofV+KGLD+37EQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.16.3: + resolution: {integrity: sha512-5/JuTd8OWW8UzEtyf19fbrtMJENza+C9JoPIkvItgTBQ1FO2ZLvjbPO6Xs54vk0s5JB5QsfieUEshRQfu7ZHow==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.44.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.44.0 + eslint-visitor-keys: 3.4.1 + + /@eslint-community/regexpp@4.5.1: + resolution: {integrity: sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + /@eslint/eslintrc@2.1.0: + resolution: {integrity: sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.0 + globals: 13.20.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + /@eslint/js@8.44.0: + resolution: {integrity: sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + /@humanwhocodes/config-array@0.11.10: + resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + /@humanwhocodes/object-schema@1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + + /@types/json-schema@7.0.12: + resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} + dev: false + + /@types/semver@7.5.0: + resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} + dev: false + + /@typescript-eslint/eslint-plugin@5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.44.0)(typescript@5.1.6): + resolution: {integrity: sha512-A5l/eUAug103qtkwccSCxn8ZRwT+7RXWkFECdA4Cvl1dOlDUgTpAOfSEElZn2uSUxhdDpnCdetrf0jvU4qrL+g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: optional: true - - /@esbuild/netbsd-x64@0.16.3: - resolution: - { - integrity: sha512-AzbsJqiHEq1I/tUvOfAzCY15h4/7Ivp3ff/o1GpP16n48JMNAtbW0qui2WCgoIZArEHD0SUQ95gvR0oSO7ZbdA==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/openbsd-x64@0.16.3: - resolution: - { - integrity: sha512-gSABi8qHl8k3Cbi/4toAzHiykuBuWLZs43JomTcXkjMZVkp0gj3gg9mO+9HJW/8GB5H89RX/V0QP4JGL7YEEVg==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true + dependencies: + '@eslint-community/regexpp': 4.5.1 + '@typescript-eslint/parser': 5.61.0(eslint@8.44.0)(typescript@5.1.6) + '@typescript-eslint/scope-manager': 5.61.0 + '@typescript-eslint/type-utils': 5.61.0(eslint@8.44.0)(typescript@5.1.6) + '@typescript-eslint/utils': 5.61.0(eslint@8.44.0)(typescript@5.1.6) + debug: 4.3.4 + eslint: 8.44.0 + graphemer: 1.4.0 + ignore: 5.2.4 + natural-compare-lite: 1.4.0 + semver: 7.5.3 + tsutils: 3.21.0(typescript@5.1.6) + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/parser@5.61.0(eslint@8.44.0)(typescript@5.1.6): + resolution: {integrity: sha512-yGr4Sgyh8uO6fSi9hw3jAFXNBHbCtKKFMdX2IkT3ZqpKmtAq3lHS4ixB/COFuAIJpwl9/AqF7j72ZDWYKmIfvg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: optional: true - - /@esbuild/sunos-x64@0.16.3: - resolution: - { - integrity: sha512-SF9Kch5Ete4reovvRO6yNjMxrvlfT0F0Flm+NPoUw5Z4Q3r1d23LFTgaLwm3Cp0iGbrU/MoUI+ZqwCv5XJijCw==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true + dependencies: + '@typescript-eslint/scope-manager': 5.61.0 + '@typescript-eslint/types': 5.61.0 + '@typescript-eslint/typescript-estree': 5.61.0(typescript@5.1.6) + debug: 4.3.4 + eslint: 8.44.0 + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/scope-manager@5.61.0: + resolution: {integrity: sha512-W8VoMjoSg7f7nqAROEmTt6LoBpn81AegP7uKhhW5KzYlehs8VV0ZW0fIDVbcZRcaP3aPSW+JZFua+ysQN+m/Nw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.61.0 + '@typescript-eslint/visitor-keys': 5.61.0 + dev: false + + /@typescript-eslint/type-utils@5.61.0(eslint@8.44.0)(typescript@5.1.6): + resolution: {integrity: sha512-kk8u//r+oVK2Aj3ph/26XdH0pbAkC2RiSjUYhKD+PExemG4XSjpGFeyZ/QM8lBOa7O8aGOU+/yEbMJgQv/DnCg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: optional: true - - /@esbuild/win32-arm64@0.16.3: - resolution: - { - integrity: sha512-u5aBonZIyGopAZyOnoPAA6fGsDeHByZ9CnEzyML9NqntK6D/xl5jteZUKm/p6nD09+v3pTM6TuUIqSPcChk5gg==, - } - engines: { node: ">=12" } - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true + dependencies: + '@typescript-eslint/typescript-estree': 5.61.0(typescript@5.1.6) + '@typescript-eslint/utils': 5.61.0(eslint@8.44.0)(typescript@5.1.6) + debug: 4.3.4 + eslint: 8.44.0 + tsutils: 3.21.0(typescript@5.1.6) + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/types@5.61.0: + resolution: {integrity: sha512-ldyueo58KjngXpzloHUog/h9REmHl59G1b3a5Sng1GfBo14BkS3ZbMEb3693gnP1k//97lh7bKsp6/V/0v1veQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: false + + /@typescript-eslint/typescript-estree@5.61.0(typescript@5.1.6): + resolution: {integrity: sha512-Fud90PxONnnLZ36oR5ClJBLTLfU4pIWBmnvGwTbEa2cXIqj70AEDEmOmpkFComjBZ/037ueKrOdHuYmSFVD7Rw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: optional: true - - /@esbuild/win32-ia32@0.16.3: - resolution: - { - integrity: sha512-GlgVq1WpvOEhNioh74TKelwla9KDuAaLZrdxuuUgsP2vayxeLgVc+rbpIv0IYF4+tlIzq2vRhofV+KGLD+37EQ==, - } - engines: { node: ">=12" } - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true + dependencies: + '@typescript-eslint/types': 5.61.0 + '@typescript-eslint/visitor-keys': 5.61.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.3 + tsutils: 3.21.0(typescript@5.1.6) + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/utils@5.61.0(eslint@8.44.0)(typescript@5.1.6): + resolution: {integrity: sha512-mV6O+6VgQmVE6+xzlA91xifndPW9ElFW8vbSF0xCT/czPXVhwDewKila1jOyRwa9AE19zKnrr7Cg5S3pJVrTWQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.44.0) + '@types/json-schema': 7.0.12 + '@types/semver': 7.5.0 + '@typescript-eslint/scope-manager': 5.61.0 + '@typescript-eslint/types': 5.61.0 + '@typescript-eslint/typescript-estree': 5.61.0(typescript@5.1.6) + eslint: 8.44.0 + eslint-scope: 5.1.1 + semver: 7.5.3 + transitivePeerDependencies: + - supports-color + - typescript + dev: false + + /@typescript-eslint/visitor-keys@5.61.0: + resolution: {integrity: sha512-50XQ5VdbWrX06mQXhy93WywSFZZGsv3EOjq+lqp6WC2t+j3mb6A9xYVdrRxafvK88vg9k9u+CT4l6D8PEatjKg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.61.0 + eslint-visitor-keys: 3.4.1 + dev: false + + /acorn-jsx@5.3.2(acorn@8.9.0): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.9.0 + + /acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@8.9.0: + resolution: {integrity: sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==} + engines: {node: '>=0.4.0'} + hasBin: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: false + + /as-table@1.0.55: + resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} + dependencies: + printable-characters: 1.0.42 + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: true + + /better-sqlite3@8.4.0: + resolution: {integrity: sha512-NmsNW1CQvqMszu/CFAJ3pLct6NEFlNfuGM6vw72KHkjOD1UDnL96XNN1BMQc1hiHo8vE2GbOWQYIpZ+YM5wrZw==} + requiresBuild: true + dependencies: + bindings: 1.5.0 + prebuild-install: 7.1.1 + dev: true + + /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: true + + /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: true + + /blake3-wasm@2.1.5: + resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} + dev: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + + /busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + dependencies: + streamsearch: 1.1.0 + dev: true + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + /capnp-ts@0.7.0: + resolution: {integrity: sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==} + dependencies: + debug: 4.3.4 + tslib: 2.6.0 + transitivePeerDependencies: + - supports-color + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: true + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + /cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + dev: true + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + /data-uri-to-buffer@2.0.2: + resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==} + dev: true + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: optional: true - - /@esbuild/win32-x64@0.16.3: - resolution: - { - integrity: sha512-5/JuTd8OWW8UzEtyf19fbrtMJENza+C9JoPIkvItgTBQ1FO2ZLvjbPO6Xs54vk0s5JB5QsfieUEshRQfu7ZHow==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true + dependencies: + ms: 2.1.2 + + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + dev: true + + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: true + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + /detect-libc@2.0.1: + resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} + engines: {node: '>=8'} + dev: true + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: false + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: true + + /esbuild@0.16.3: + resolution: {integrity: sha512-71f7EjPWTiSguen8X/kxEpkAS7BFHwtQKisCDDV3Y4GLGWBaoSCyD5uXkaUew6JDzA9FEN1W23mdnSwW9kqCeg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.16.3 + '@esbuild/android-arm64': 0.16.3 + '@esbuild/android-x64': 0.16.3 + '@esbuild/darwin-arm64': 0.16.3 + '@esbuild/darwin-x64': 0.16.3 + '@esbuild/freebsd-arm64': 0.16.3 + '@esbuild/freebsd-x64': 0.16.3 + '@esbuild/linux-arm': 0.16.3 + '@esbuild/linux-arm64': 0.16.3 + '@esbuild/linux-ia32': 0.16.3 + '@esbuild/linux-loong64': 0.16.3 + '@esbuild/linux-mips64el': 0.16.3 + '@esbuild/linux-ppc64': 0.16.3 + '@esbuild/linux-riscv64': 0.16.3 + '@esbuild/linux-s390x': 0.16.3 + '@esbuild/linux-x64': 0.16.3 + '@esbuild/netbsd-x64': 0.16.3 + '@esbuild/openbsd-x64': 0.16.3 + '@esbuild/sunos-x64': 0.16.3 + '@esbuild/win32-arm64': 0.16.3 + '@esbuild/win32-ia32': 0.16.3 + '@esbuild/win32-x64': 0.16.3 + dev: true + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + /eslint-config-google@0.14.0(eslint@8.44.0): + resolution: {integrity: sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==} + engines: {node: '>=0.10.0'} + peerDependencies: + eslint: '>=5.16.0' + dependencies: + eslint: 8.44.0 + dev: true + + /eslint-plugin-json@3.1.0: + resolution: {integrity: sha512-MrlG2ynFEHe7wDGwbUuFPsaT2b1uhuEFhJ+W1f1u+1C2EkXmTYJp4B1aAdQQ8M+CC3t//N/oRKiIVw14L2HR1g==} + engines: {node: '>=12.0'} + dependencies: + lodash: 4.17.21 + vscode-json-languageservice: 4.2.1 + dev: true + + /eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: false + + /eslint-scope@7.2.0: + resolution: {integrity: sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + /eslint-visitor-keys@3.4.1: + resolution: {integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + /eslint@8.44.0: + resolution: {integrity: sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.44.0) + '@eslint-community/regexpp': 4.5.1 + '@eslint/eslintrc': 2.1.0 + '@eslint/js': 8.44.0 + '@humanwhocodes/config-array': 0.11.10 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.0 + eslint-visitor-keys: 3.4.1 + espree: 9.6.0 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.20.0 + graphemer: 1.4.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + /espree@9.6.0: + resolution: {integrity: sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.9.0 + acorn-jsx: 5.3.2(acorn@8.9.0) + eslint-visitor-keys: 3.4.1 + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + + /estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + dev: false + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + /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'} + + /exit-hook@2.2.1: + resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} + engines: {node: '>=6'} + dev: true + + /expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + dev: true + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + /fast-glob@3.3.0: + resolution: {integrity: sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: false + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.0.4 + + /file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + dev: true + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + + /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 + + /flat-cache@3.0.4: + resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.7 + rimraf: 3.0.2 + + /flatted@3.2.7: + resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /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 + + /github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + + /glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /globals@13.20.0: + resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.0 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: false + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + /http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + dev: true + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true + + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + /itty-router@4.0.13: + resolution: {integrity: sha512-iiQ9k1nQgaal/MteVft5pwYkvzuZx3idPT9tYpKWl7rKH74tyz5VVSVUCXUO0iBh5HDXjHYsix90UrFKPfThHg==} + dev: false + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: true + + /kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + dev: true + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + + /magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: false + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: false + + /mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + dev: true + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: true + + /miniflare@3.0.2: + resolution: {integrity: sha512-tSwmK+JPwHsV2KR7/dSZFGtTF/2M30OShjPDY7e5lAxyGE8SkHqXn/ckjg2TVltc9B8rXCSffMnCfYW1pH7R4A==} + engines: {node: '>=16.13'} + dependencies: + acorn: 8.9.0 + acorn-walk: 8.2.0 + better-sqlite3: 8.4.0 + capnp-ts: 0.7.0 + exit-hook: 2.2.1 + glob-to-regexp: 0.4.1 + http-cache-semantics: 4.1.1 + kleur: 4.1.5 + source-map-support: 0.5.21 + stoppable: 1.1.0 + undici: 5.22.1 + workerd: 1.20230518.0 + ws: 8.13.0 + youch: 3.2.3 + zod: 3.21.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 + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /mustache@4.2.0: + resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} + hasBin: true + dev: true + + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + 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==} + dev: true + + /natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + dev: false + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + /node-abi@3.45.0: + resolution: {integrity: sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.3 + dev: true + + /node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + /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'} + dev: false + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + /prebuild-install@7.1.1: + resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + detect-libc: 2.0.1 + 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.45.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: true + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + /prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: false + + /printable-characters@1.0.42: + resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} + dev: true + + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + + /punycode@2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: '>=6'} + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + /range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + dev: false + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: true + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: true + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /render2@1.2.1: + resolution: {integrity: sha512-HfLOYtG6p6jx6GG6uub7YGJ4iv+GlOwFmDtGdtSe2NQJ6peMZ0u76k7GAZ0z7GSf4e9UfeCcQxme4Mayh7DLqw==} + dependencies: + range-parser: 1.2.1 + dev: false + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + + /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. + 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 + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true + + /selfsigned@2.1.1: + resolution: {integrity: sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==} + engines: {node: '>=10'} + dependencies: + node-forge: 1.3.1 + dev: true + + /semver@7.5.3: + resolution: {integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: true + + /simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: true + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: false + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + dev: true + + /sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + dev: true + + /stacktracey@2.1.8: + resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==} + dependencies: + as-table: 1.0.55 + get-source: 2.0.12 + dev: true + + /stoppable@1.1.0: + resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} + engines: {node: '>=4', npm: '>=6'} + dev: true + + /streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + dev: true + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + + /tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: true + + /tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + 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: true + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: false + + /tslib@2.6.0: + resolution: {integrity: sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==} + dev: true + + /tsutils@3.21.0(typescript@5.1.6): + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 5.1.6 + dev: false + + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + /typescript@5.1.6: + resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} + engines: {node: '>=14.17'} + hasBin: true + + /undici@5.22.1: + resolution: {integrity: sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==} + engines: {node: '>=14.0'} + dependencies: + busboy: 1.6.0 + dev: true + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.0 + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /vscode-json-languageservice@4.2.1: + resolution: {integrity: sha512-xGmv9QIWs2H8obGbWg+sIPI/3/pFgj/5OWBhNzs00BkYQ9UaB2F6JJaGB/2/YOZJ3BvLXQTC4Q7muqU25QgAhA==} + dependencies: + jsonc-parser: 3.2.0 + vscode-languageserver-textdocument: 1.0.8 + vscode-languageserver-types: 3.17.3 + vscode-nls: 5.2.0 + vscode-uri: 3.0.7 + dev: true + + /vscode-languageserver-textdocument@1.0.8: + resolution: {integrity: sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==} + dev: true + + /vscode-languageserver-types@3.17.3: + resolution: {integrity: sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA==} + dev: true + + /vscode-nls@5.2.0: + resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==} + dev: true + + /vscode-uri@3.0.7: + resolution: {integrity: sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==} + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + + /workerd@1.20230518.0: + resolution: {integrity: sha512-VNmK0zoNZXrwEEx77O/oQDVUzzyDjf5kKKK8bty+FmKCd5EQJCpqi8NlRKWLGMyyYrKm86MFz0kAsreTEs7HHA==} + engines: {node: '>=16'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@cloudflare/workerd-darwin-64': 1.20230518.0 + '@cloudflare/workerd-darwin-arm64': 1.20230518.0 + '@cloudflare/workerd-linux-64': 1.20230518.0 + '@cloudflare/workerd-linux-arm64': 1.20230518.0 + '@cloudflare/workerd-windows-64': 1.20230518.0 + dev: true + + /wrangler@3.1.1: + resolution: {integrity: sha512-iG6QGOt+qgSm7UroJ8IJ+JdXEcDcW7yp9ilP0V7alCGhKm8shqa/M1iyMOpukZSCSZo8Vmn5nH2C9OY1PR3dQQ==} + engines: {node: '>=16.13.0'} + hasBin: true + dependencies: + '@cloudflare/kv-asset-handler': 0.2.0 + '@esbuild-plugins/node-globals-polyfill': 0.1.1(esbuild@0.16.3) + '@esbuild-plugins/node-modules-polyfill': 0.1.4(esbuild@0.16.3) + blake3-wasm: 2.1.5 + chokidar: 3.5.3 + esbuild: 0.16.3 + miniflare: 3.0.2 + nanoid: 3.3.6 + path-to-regexp: 6.2.1 + selfsigned: 2.1.1 + source-map: 0.7.4 + xxhash-wasm: 1.0.2 + optionalDependencies: + fsevents: 2.3.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /ws@8.13.0: + resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: optional: true - - /@eslint-community/eslint-utils@4.4.0(eslint@8.42.0): - resolution: - { - integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.42.0 - eslint-visitor-keys: 3.4.1 - - /@eslint-community/regexpp@4.5.1: - resolution: - { - integrity: sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==, - } - engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } - - /@eslint/eslintrc@2.0.3: - resolution: - { - integrity: sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.5.2 - globals: 13.20.0 - ignore: 5.2.4 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - /@eslint/js@8.42.0: - resolution: - { - integrity: sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - - /@humanwhocodes/config-array@0.11.10: - resolution: - { - integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==, - } - engines: { node: ">=10.10.0" } - dependencies: - "@humanwhocodes/object-schema": 1.2.1 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - /@humanwhocodes/module-importer@1.0.1: - resolution: - { - integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, - } - engines: { node: ">=12.22" } - - /@humanwhocodes/object-schema@1.2.1: - resolution: - { - integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==, - } - - /@nodelib/fs.scandir@2.1.5: - resolution: - { - integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, - } - engines: { node: ">= 8" } - dependencies: - "@nodelib/fs.stat": 2.0.5 - run-parallel: 1.2.0 - - /@nodelib/fs.stat@2.0.5: - resolution: - { - integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, - } - engines: { node: ">= 8" } - - /@nodelib/fs.walk@1.2.8: - resolution: - { - integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, - } - engines: { node: ">= 8" } - dependencies: - "@nodelib/fs.scandir": 2.1.5 - fastq: 1.15.0 - - /@types/json-schema@7.0.12: - resolution: - { - integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==, - } - dev: false - - /@types/semver@7.5.0: - resolution: - { - integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==, - } - dev: false - - /@typescript-eslint/eslint-plugin@5.59.11(@typescript-eslint/parser@5.59.11)(eslint@8.42.0)(typescript@5.1.3): - resolution: - { - integrity: sha512-XxuOfTkCUiOSyBWIvHlUraLw/JT/6Io1365RO6ZuI88STKMavJZPNMU0lFcUTeQXEhHiv64CbxYxBNoDVSmghg==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - "@typescript-eslint/parser": ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - dependencies: - "@eslint-community/regexpp": 4.5.1 - "@typescript-eslint/parser": 5.59.11(eslint@8.42.0)(typescript@5.1.3) - "@typescript-eslint/scope-manager": 5.59.11 - "@typescript-eslint/type-utils": 5.59.11(eslint@8.42.0)(typescript@5.1.3) - "@typescript-eslint/utils": 5.59.11(eslint@8.42.0)(typescript@5.1.3) - debug: 4.3.4 - eslint: 8.42.0 - grapheme-splitter: 1.0.4 - ignore: 5.2.4 - natural-compare-lite: 1.4.0 - semver: 7.5.1 - tsutils: 3.21.0(typescript@5.1.3) - typescript: 5.1.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/parser@5.59.11(eslint@8.42.0)(typescript@5.1.3): - resolution: - { - integrity: sha512-s9ZF3M+Nym6CAZEkJJeO2TFHHDsKAM3ecNkLuH4i4s8/RCPnF5JRip2GyviYkeEAcwGMJxkqG9h2dAsnA1nZpA==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - dependencies: - "@typescript-eslint/scope-manager": 5.59.11 - "@typescript-eslint/types": 5.59.11 - "@typescript-eslint/typescript-estree": 5.59.11(typescript@5.1.3) - debug: 4.3.4 - eslint: 8.42.0 - typescript: 5.1.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/scope-manager@5.59.11: - resolution: - { - integrity: sha512-dHFOsxoLFtrIcSj5h0QoBT/89hxQONwmn3FOQ0GOQcLOOXm+MIrS8zEAhs4tWl5MraxCY3ZJpaXQQdFMc2Tu+Q==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - "@typescript-eslint/types": 5.59.11 - "@typescript-eslint/visitor-keys": 5.59.11 - dev: false - - /@typescript-eslint/type-utils@5.59.11(eslint@8.42.0)(typescript@5.1.3): - resolution: - { - integrity: sha512-LZqVY8hMiVRF2a7/swmkStMYSoXMFlzL6sXV6U/2gL5cwnLWQgLEG8tjWPpaE4rMIdZ6VKWwcffPlo1jPfk43g==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - eslint: "*" - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - dependencies: - "@typescript-eslint/typescript-estree": 5.59.11(typescript@5.1.3) - "@typescript-eslint/utils": 5.59.11(eslint@8.42.0)(typescript@5.1.3) - debug: 4.3.4 - eslint: 8.42.0 - tsutils: 3.21.0(typescript@5.1.3) - typescript: 5.1.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/types@5.59.11: - resolution: - { - integrity: sha512-epoN6R6tkvBYSc+cllrz+c2sOFWkbisJZWkOE+y3xHtvYaOE6Wk6B8e114McRJwFRjGvYdJwLXQH5c9osME/AA==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dev: false - - /@typescript-eslint/typescript-estree@5.59.11(typescript@5.1.3): - resolution: - { - integrity: sha512-YupOpot5hJO0maupJXixi6l5ETdrITxeo5eBOeuV7RSKgYdU3G5cxO49/9WRnJq9EMrB7AuTSLH/bqOsXi7wPA==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - dependencies: - "@typescript-eslint/types": 5.59.11 - "@typescript-eslint/visitor-keys": 5.59.11 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.5.1 - tsutils: 3.21.0(typescript@5.1.3) - typescript: 5.1.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/utils@5.59.11(eslint@8.42.0)(typescript@5.1.3): - resolution: - { - integrity: sha512-didu2rHSOMUdJThLk4aZ1Or8IcO3HzCw/ZvEjTTIfjIrcdd5cvSIwwDy2AOlE7htSNp7QIZ10fLMyRCveesMLg==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.42.0) - "@types/json-schema": 7.0.12 - "@types/semver": 7.5.0 - "@typescript-eslint/scope-manager": 5.59.11 - "@typescript-eslint/types": 5.59.11 - "@typescript-eslint/typescript-estree": 5.59.11(typescript@5.1.3) - eslint: 8.42.0 - eslint-scope: 5.1.1 - semver: 7.5.1 - transitivePeerDependencies: - - supports-color - - typescript - dev: false - - /@typescript-eslint/visitor-keys@5.59.11: - resolution: - { - integrity: sha512-KGYniTGG3AMTuKF9QBD7EIrvufkB6O6uX3knP73xbKLMpH+QRPcgnCxjWXSHjMRuOxFLovljqQgQpR0c7GvjoA==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - "@typescript-eslint/types": 5.59.11 - eslint-visitor-keys: 3.4.1 - dev: false - - /acorn-jsx@5.3.2(acorn@8.8.2): - resolution: - { - integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, - } - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.8.2 - - /acorn-walk@8.2.0: - resolution: - { - integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==, - } - engines: { node: ">=0.4.0" } - dev: true - - /acorn@8.8.2: - resolution: - { - integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==, - } - engines: { node: ">=0.4.0" } - hasBin: true - - /ajv@6.12.6: - resolution: - { - integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, - } - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - - /ansi-regex@5.0.1: - resolution: - { - integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, - } - engines: { node: ">=8" } - - /ansi-styles@4.3.0: - resolution: - { - integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, - } - engines: { node: ">=8" } - dependencies: - color-convert: 2.0.1 - - /anymatch@3.1.3: - resolution: - { - integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, - } - engines: { node: ">= 8" } - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - - /argparse@2.0.1: - resolution: - { - integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, - } - - /array-union@2.1.0: - resolution: - { - integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, - } - engines: { node: ">=8" } - dev: false - - /as-table@1.0.55: - resolution: - { - integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==, - } - dependencies: - printable-characters: 1.0.42 - dev: true - - /balanced-match@1.0.2: - resolution: - { - integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, - } - - /base64-js@1.5.1: - resolution: - { - integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, - } - dev: true - - /better-sqlite3@8.4.0: - resolution: - { - integrity: sha512-NmsNW1CQvqMszu/CFAJ3pLct6NEFlNfuGM6vw72KHkjOD1UDnL96XNN1BMQc1hiHo8vE2GbOWQYIpZ+YM5wrZw==, - } - requiresBuild: true - dependencies: - bindings: 1.5.0 - prebuild-install: 7.1.1 - dev: true - - /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: true - - /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: true - - /blake3-wasm@2.1.5: - resolution: - { - integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==, - } - dev: true - - /brace-expansion@1.1.11: - resolution: - { - integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, - } - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - /braces@3.0.2: - resolution: - { - integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==, - } - engines: { node: ">=8" } - dependencies: - fill-range: 7.0.1 - - /buffer-from@1.1.2: - resolution: - { - integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, - } - dev: true - - /buffer@5.7.1: - resolution: - { - integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, - } - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: true - - /busboy@1.6.0: - resolution: - { - integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==, - } - engines: { node: ">=10.16.0" } - dependencies: - streamsearch: 1.1.0 - dev: true - - /callsites@3.1.0: - resolution: - { - integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, - } - engines: { node: ">=6" } - - /capnp-ts@0.7.0: - resolution: - { - integrity: sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==, - } - dependencies: - debug: 4.3.4 - tslib: 2.5.3 - transitivePeerDependencies: - - supports-color - dev: true - - /chalk@4.1.2: - resolution: - { - integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, - } - engines: { node: ">=10" } - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - /chokidar@3.5.3: - resolution: - { - integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, - } - engines: { node: ">= 8.10.0" } - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /chownr@1.1.4: - resolution: - { - integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==, - } - dev: true - - /color-convert@2.0.1: - resolution: - { - integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, - } - engines: { node: ">=7.0.0" } - dependencies: - color-name: 1.1.4 - - /color-name@1.1.4: - resolution: - { - integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, - } - - /concat-map@0.0.1: - resolution: - { - integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, - } - - /cookie@0.5.0: - resolution: - { - integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==, - } - engines: { node: ">= 0.6" } - dev: true - - /cross-spawn@7.0.3: - resolution: - { - integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, - } - engines: { node: ">= 8" } - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - /data-uri-to-buffer@2.0.2: - resolution: - { - integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==, - } - dev: true - - /debug@4.3.4: - resolution: - { - integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, - } - engines: { node: ">=6.0" } - peerDependencies: - supports-color: "*" - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - - /decompress-response@6.0.0: - resolution: - { - integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==, - } - engines: { node: ">=10" } - dependencies: - mimic-response: 3.1.0 - dev: true - - /deep-extend@0.6.0: - resolution: - { - integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==, - } - engines: { node: ">=4.0.0" } - dev: true - - /deep-is@0.1.4: - resolution: - { - integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, - } - - /detect-libc@2.0.1: - resolution: - { - integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==, - } - engines: { node: ">=8" } - dev: true - - /dir-glob@3.0.1: - resolution: - { - integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, - } - engines: { node: ">=8" } - dependencies: - path-type: 4.0.0 - dev: false - - /doctrine@3.0.0: - resolution: - { - integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==, - } - engines: { node: ">=6.0.0" } - dependencies: - esutils: 2.0.3 - - /end-of-stream@1.4.4: - resolution: - { - integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, - } - dependencies: - once: 1.4.0 - dev: true - - /esbuild@0.16.3: - resolution: - { - integrity: sha512-71f7EjPWTiSguen8X/kxEpkAS7BFHwtQKisCDDV3Y4GLGWBaoSCyD5uXkaUew6JDzA9FEN1W23mdnSwW9kqCeg==, - } - engines: { node: ">=12" } - hasBin: true - requiresBuild: true - optionalDependencies: - "@esbuild/android-arm": 0.16.3 - "@esbuild/android-arm64": 0.16.3 - "@esbuild/android-x64": 0.16.3 - "@esbuild/darwin-arm64": 0.16.3 - "@esbuild/darwin-x64": 0.16.3 - "@esbuild/freebsd-arm64": 0.16.3 - "@esbuild/freebsd-x64": 0.16.3 - "@esbuild/linux-arm": 0.16.3 - "@esbuild/linux-arm64": 0.16.3 - "@esbuild/linux-ia32": 0.16.3 - "@esbuild/linux-loong64": 0.16.3 - "@esbuild/linux-mips64el": 0.16.3 - "@esbuild/linux-ppc64": 0.16.3 - "@esbuild/linux-riscv64": 0.16.3 - "@esbuild/linux-s390x": 0.16.3 - "@esbuild/linux-x64": 0.16.3 - "@esbuild/netbsd-x64": 0.16.3 - "@esbuild/openbsd-x64": 0.16.3 - "@esbuild/sunos-x64": 0.16.3 - "@esbuild/win32-arm64": 0.16.3 - "@esbuild/win32-ia32": 0.16.3 - "@esbuild/win32-x64": 0.16.3 - dev: true - - /escape-string-regexp@4.0.0: - resolution: - { - integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, - } - engines: { node: ">=10" } - - /eslint-config-google@0.14.0(eslint@8.42.0): - resolution: - { - integrity: sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==, - } - engines: { node: ">=0.10.0" } - peerDependencies: - eslint: ">=5.16.0" - dependencies: - eslint: 8.42.0 - dev: true - - /eslint-plugin-json@3.1.0: - resolution: - { - integrity: sha512-MrlG2ynFEHe7wDGwbUuFPsaT2b1uhuEFhJ+W1f1u+1C2EkXmTYJp4B1aAdQQ8M+CC3t//N/oRKiIVw14L2HR1g==, - } - engines: { node: ">=12.0" } - dependencies: - lodash: 4.17.21 - vscode-json-languageservice: 4.2.1 - dev: true - - /eslint-scope@5.1.1: - resolution: - { - integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==, - } - engines: { node: ">=8.0.0" } - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - dev: false - - /eslint-scope@7.2.0: - resolution: - { - integrity: sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - /eslint-visitor-keys@3.4.1: - resolution: - { - integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - - /eslint@8.42.0: - resolution: - { - integrity: sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - hasBin: true - dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.42.0) - "@eslint-community/regexpp": 4.5.1 - "@eslint/eslintrc": 2.0.3 - "@eslint/js": 8.42.0 - "@humanwhocodes/config-array": 0.11.10 - "@humanwhocodes/module-importer": 1.0.1 - "@nodelib/fs.walk": 1.2.8 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.0 - eslint-visitor-keys: 3.4.1 - espree: 9.5.2 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.20.0 - graphemer: 1.4.0 - ignore: 5.2.4 - import-fresh: 3.3.0 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.1 - strip-ansi: 6.0.1 - strip-json-comments: 3.1.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - - /espree@9.5.2: - resolution: - { - integrity: sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - acorn: 8.8.2 - acorn-jsx: 5.3.2(acorn@8.8.2) - eslint-visitor-keys: 3.4.1 - - /esquery@1.5.0: - resolution: - { - integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==, - } - engines: { node: ">=0.10" } - dependencies: - estraverse: 5.3.0 - - /esrecurse@4.3.0: - resolution: - { - integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, - } - engines: { node: ">=4.0" } - dependencies: - estraverse: 5.3.0 - - /estraverse@4.3.0: - resolution: - { - integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==, - } - engines: { node: ">=4.0" } - dev: false - - /estraverse@5.3.0: - resolution: - { - integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, - } - engines: { node: ">=4.0" } - - /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" } - - /exit-hook@2.2.1: - resolution: - { - integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==, - } - engines: { node: ">=6" } - dev: true - - /expand-template@2.0.3: - resolution: - { - integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==, - } - engines: { node: ">=6" } - dev: true - - /fast-deep-equal@3.1.3: - resolution: - { - integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, - } - - /fast-glob@3.2.12: - resolution: - { - integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==, - } - engines: { node: ">=8.6.0" } - dependencies: - "@nodelib/fs.stat": 2.0.5 - "@nodelib/fs.walk": 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: false - - /fast-json-stable-stringify@2.1.0: - resolution: - { - integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, - } - - /fast-levenshtein@2.0.6: - resolution: - { - integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, - } - - /fastq@1.15.0: - resolution: - { - integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==, - } - dependencies: - reusify: 1.0.4 - - /file-entry-cache@6.0.1: - resolution: - { - integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==, - } - engines: { node: ^10.12.0 || >=12.0.0 } - dependencies: - flat-cache: 3.0.4 - - /file-uri-to-path@1.0.0: - resolution: - { - integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==, - } - dev: true - - /fill-range@7.0.1: - resolution: - { - integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==, - } - engines: { node: ">=8" } - dependencies: - to-regex-range: 5.0.1 - - /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 - - /flat-cache@3.0.4: - resolution: - { - integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==, - } - engines: { node: ^10.12.0 || >=12.0.0 } - dependencies: - flatted: 3.2.7 - rimraf: 3.0.2 - - /flatted@3.2.7: - resolution: - { - integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==, - } - - /fs-constants@1.0.0: - resolution: - { - integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==, - } - dev: true - - /fs.realpath@1.0.0: - resolution: - { - integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, - } - - /fsevents@2.3.2: - resolution: - { - integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==, - } - engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } - os: [darwin] - requiresBuild: true - dev: true + utf-8-validate: optional: true - - /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 - - /github-from-package@0.0.0: - resolution: - { - integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==, - } - dev: true - - /glob-parent@5.1.2: - resolution: - { - integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, - } - engines: { node: ">= 6" } - dependencies: - is-glob: 4.0.3 - - /glob-parent@6.0.2: - resolution: - { - integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, - } - engines: { node: ">=10.13.0" } - dependencies: - is-glob: 4.0.3 - - /glob-to-regexp@0.4.1: - resolution: - { - integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==, - } - dev: true - - /glob@7.2.3: - resolution: - { - integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, - } - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - /globals@13.20.0: - resolution: - { - integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==, - } - engines: { node: ">=8" } - dependencies: - type-fest: 0.20.2 - - /globby@11.1.0: - resolution: - { - integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, - } - engines: { node: ">=10" } - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.2.12 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 3.0.0 - dev: false - - /grapheme-splitter@1.0.4: - resolution: - { - integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==, - } - dev: false - - /graphemer@1.4.0: - resolution: - { - integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, - } - - /has-flag@4.0.0: - resolution: - { - integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, - } - engines: { node: ">=8" } - - /http-cache-semantics@4.1.1: - resolution: - { - integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==, - } - dev: true - - /ieee754@1.2.1: - resolution: - { - integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, - } - dev: true - - /ignore@5.2.4: - resolution: - { - integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==, - } - engines: { node: ">= 4" } - - /import-fresh@3.3.0: - resolution: - { - integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, - } - engines: { node: ">=6" } - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - /imurmurhash@0.1.4: - resolution: - { - integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, - } - engines: { node: ">=0.8.19" } - - /inflight@1.0.6: - resolution: - { - integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, - } - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - /inherits@2.0.4: - resolution: - { - integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, - } - - /ini@1.3.8: - resolution: - { - integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, - } - dev: true - - /is-binary-path@2.1.0: - resolution: - { - integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, - } - engines: { node: ">=8" } - dependencies: - binary-extensions: 2.2.0 - dev: true - - /is-extglob@2.1.1: - resolution: - { - integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, - } - engines: { node: ">=0.10.0" } - - /is-glob@4.0.3: - resolution: - { - integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, - } - engines: { node: ">=0.10.0" } - dependencies: - is-extglob: 2.1.1 - - /is-number@7.0.0: - resolution: - { - integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, - } - engines: { node: ">=0.12.0" } - - /is-path-inside@3.0.3: - resolution: - { - integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, - } - engines: { node: ">=8" } - - /isexe@2.0.0: - resolution: - { - integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, - } - - /itty-router@4.0.9: - resolution: - { - integrity: sha512-al8PIAJEWuWZcg4iwLcLiF7R9njsIQxrT27ik2Vfp1Mi5CBEVr1BDKbA1xpOyqkRbj9cCBQiTRpLIKnNO2YKlQ==, - } - dev: false - - /js-yaml@4.1.0: - resolution: - { - integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, - } - hasBin: true - dependencies: - argparse: 2.0.1 - - /json-schema-traverse@0.4.1: - resolution: - { - integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, - } - - /json-stable-stringify-without-jsonify@1.0.1: - resolution: - { - integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, - } - - /jsonc-parser@3.2.0: - resolution: - { - integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==, - } - dev: true - - /kleur@4.1.5: - resolution: - { - integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==, - } - engines: { node: ">=6" } - dev: true - - /levn@0.4.1: - resolution: - { - integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, - } - engines: { node: ">= 0.8.0" } - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - - /locate-path@6.0.0: - resolution: - { - integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, - } - engines: { node: ">=10" } - dependencies: - p-locate: 5.0.0 - - /lodash.merge@4.6.2: - resolution: - { - integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, - } - - /lodash@4.17.21: - resolution: - { - integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, - } - dev: true - - /lru-cache@6.0.0: - resolution: - { - integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, - } - engines: { node: ">=10" } - dependencies: - yallist: 4.0.0 - - /magic-string@0.25.9: - resolution: - { - integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==, - } - dependencies: - sourcemap-codec: 1.4.8 - dev: true - - /merge2@1.4.1: - resolution: - { - integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, - } - engines: { node: ">= 8" } - dev: false - - /micromatch@4.0.5: - resolution: - { - integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, - } - engines: { node: ">=8.6" } - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - dev: false - - /mime@3.0.0: - resolution: - { - integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==, - } - engines: { node: ">=10.0.0" } - hasBin: true - dev: true - - /mimic-response@3.1.0: - resolution: - { - integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==, - } - engines: { node: ">=10" } - dev: true - - /miniflare@3.0.1: - resolution: - { - integrity: sha512-aLOB8d26lOTn493GOv1LmpGHVLSxmeT4MixPG/k3Ze10j0wDKnMj8wsFgbZ6Q4cr1N4faf8O3IbNRJuQ+rLoJA==, - } - engines: { node: ">=16.13" } - dependencies: - acorn: 8.8.2 - acorn-walk: 8.2.0 - better-sqlite3: 8.4.0 - capnp-ts: 0.7.0 - exit-hook: 2.2.1 - glob-to-regexp: 0.4.1 - http-cache-semantics: 4.1.1 - kleur: 4.1.5 - source-map-support: 0.5.21 - stoppable: 1.1.0 - undici: 5.22.1 - workerd: 1.20230518.0 - ws: 8.13.0 - youch: 3.2.3 - zod: 3.21.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 - - /minimist@1.2.8: - resolution: - { - integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, - } - dev: true - - /mkdirp-classic@0.5.3: - resolution: - { - integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==, - } - dev: true - - /ms@2.1.2: - resolution: - { - integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, - } - - /mustache@4.2.0: - resolution: - { - integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==, - } - hasBin: true - dev: true - - /nanoid@3.3.6: - resolution: - { - integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==, - } - 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==, - } - dev: true - - /natural-compare-lite@1.4.0: - resolution: - { - integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==, - } - dev: false - - /natural-compare@1.4.0: - resolution: - { - integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, - } - - /node-abi@3.44.0: - resolution: - { - integrity: sha512-MYjZTiAETGG28/7fBH1RjuY7vzDwYC5q5U4whCgM4jNEQcC0gAvN339LxXukmL2T2tGpzYTfp+LZ5RN7E5DwEg==, - } - engines: { node: ">=10" } - dependencies: - semver: 7.5.1 - dev: true - - /node-forge@1.3.1: - resolution: - { - integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==, - } - engines: { node: ">= 6.13.0" } - dev: true - - /normalize-path@3.0.0: - resolution: - { - integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, - } - engines: { node: ">=0.10.0" } - dev: true - - /once@1.4.0: - resolution: - { - integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, - } - dependencies: - wrappy: 1.0.2 - - /optionator@0.9.1: - resolution: - { - integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==, - } - engines: { node: ">= 0.8.0" } - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.3 - - /p-limit@3.1.0: - resolution: - { - integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, - } - engines: { node: ">=10" } - dependencies: - yocto-queue: 0.1.0 - - /p-locate@5.0.0: - resolution: - { - integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, - } - engines: { node: ">=10" } - dependencies: - p-limit: 3.1.0 - - /parent-module@1.0.1: - resolution: - { - integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, - } - engines: { node: ">=6" } - dependencies: - callsites: 3.1.0 - - /path-exists@4.0.0: - resolution: - { - integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, - } - engines: { node: ">=8" } - - /path-is-absolute@1.0.1: - resolution: - { - integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, - } - engines: { node: ">=0.10.0" } - - /path-key@3.1.1: - resolution: - { - integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, - } - engines: { node: ">=8" } - - /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" } - dev: false - - /picomatch@2.3.1: - resolution: - { - integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, - } - engines: { node: ">=8.6" } - - /prebuild-install@7.1.1: - resolution: - { - integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==, - } - engines: { node: ">=10" } - hasBin: true - dependencies: - detect-libc: 2.0.1 - 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.44.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: true - - /prelude-ls@1.2.1: - resolution: - { - integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, - } - engines: { node: ">= 0.8.0" } - - /prettier@2.8.8: - resolution: - { - integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==, - } - engines: { node: ">=10.13.0" } - hasBin: true - dev: false - - /printable-characters@1.0.42: - resolution: - { - integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==, - } - dev: true - - /pump@3.0.0: - resolution: - { - integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==, - } - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - dev: true - - /punycode@2.3.0: - resolution: - { - integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==, - } - engines: { node: ">=6" } - - /queue-microtask@1.2.3: - resolution: - { - integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, - } - - /range-parser@1.2.1: - resolution: - { - integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==, - } - engines: { node: ">= 0.6" } - dev: false - - /rc@1.2.8: - resolution: - { - integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==, - } - hasBin: true - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - dev: true - - /readable-stream@3.6.2: - resolution: - { - integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, - } - engines: { node: ">= 6" } - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - dev: true - - /readdirp@3.6.0: - resolution: - { - integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, - } - engines: { node: ">=8.10.0" } - dependencies: - picomatch: 2.3.1 - dev: true - - /render2@1.2.1: - resolution: - { - integrity: sha512-HfLOYtG6p6jx6GG6uub7YGJ4iv+GlOwFmDtGdtSe2NQJ6peMZ0u76k7GAZ0z7GSf4e9UfeCcQxme4Mayh7DLqw==, - } - dependencies: - range-parser: 1.2.1 - dev: false - - /resolve-from@4.0.0: - resolution: - { - integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, - } - engines: { node: ">=4" } - - /reusify@1.0.4: - resolution: - { - integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, - } - engines: { iojs: ">=1.0.0", node: ">=0.10.0" } - - /rimraf@3.0.2: - resolution: - { - integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, - } - hasBin: true - dependencies: - glob: 7.2.3 - - /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. - 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 - dev: true - - /run-parallel@1.2.0: - resolution: - { - integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, - } - dependencies: - queue-microtask: 1.2.3 - - /safe-buffer@5.2.1: - resolution: - { - integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, - } - dev: true - - /selfsigned@2.1.1: - resolution: - { - integrity: sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==, - } - engines: { node: ">=10" } - dependencies: - node-forge: 1.3.1 - dev: true - - /semver@7.5.1: - resolution: - { - integrity: sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==, - } - engines: { node: ">=10" } - hasBin: true - dependencies: - lru-cache: 6.0.0 - - /shebang-command@2.0.0: - resolution: - { - integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, - } - engines: { node: ">=8" } - dependencies: - shebang-regex: 3.0.0 - - /shebang-regex@3.0.0: - resolution: - { - integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, - } - engines: { node: ">=8" } - - /simple-concat@1.0.1: - resolution: - { - integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==, - } - dev: true - - /simple-get@4.0.1: - resolution: - { - integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==, - } - dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 - dev: true - - /slash@3.0.0: - resolution: - { - integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==, - } - engines: { node: ">=8" } - dev: false - - /source-map-support@0.5.21: - resolution: - { - integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, - } - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - dev: true - - /source-map@0.6.1: - resolution: - { - integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, - } - engines: { node: ">=0.10.0" } - dev: true - - /source-map@0.7.4: - resolution: - { - integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==, - } - engines: { node: ">= 8" } - dev: true - - /sourcemap-codec@1.4.8: - resolution: - { - integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==, - } - deprecated: Please use @jridgewell/sourcemap-codec instead - dev: true - - /stacktracey@2.1.8: - resolution: - { - integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==, - } - dependencies: - as-table: 1.0.55 - get-source: 2.0.12 - dev: true - - /stoppable@1.1.0: - resolution: - { - integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==, - } - engines: { node: ">=4", npm: ">=6" } - dev: true - - /streamsearch@1.1.0: - resolution: - { - integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==, - } - engines: { node: ">=10.0.0" } - dev: true - - /string_decoder@1.3.0: - resolution: - { - integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, - } - dependencies: - safe-buffer: 5.2.1 - dev: true - - /strip-ansi@6.0.1: - resolution: - { - integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, - } - engines: { node: ">=8" } - dependencies: - ansi-regex: 5.0.1 - - /strip-json-comments@2.0.1: - resolution: - { - integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==, - } - engines: { node: ">=0.10.0" } - dev: true - - /strip-json-comments@3.1.1: - resolution: - { - integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, - } - engines: { node: ">=8" } - - /supports-color@7.2.0: - resolution: - { - integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, - } - engines: { node: ">=8" } - dependencies: - has-flag: 4.0.0 - - /tar-fs@2.1.1: - resolution: - { - integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==, - } - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.0 - tar-stream: 2.2.0 - dev: true - - /tar-stream@2.2.0: - resolution: - { - integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==, - } - engines: { node: ">=6" } - 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: true - - /text-table@0.2.0: - resolution: - { - integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, - } - - /to-regex-range@5.0.1: - resolution: - { - integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, - } - engines: { node: ">=8.0" } - dependencies: - is-number: 7.0.0 - - /tslib@1.14.1: - resolution: - { - integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==, - } - dev: false - - /tslib@2.5.3: - resolution: - { - integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==, - } - dev: true - - /tsutils@3.21.0(typescript@5.1.3): - resolution: - { - integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==, - } - engines: { node: ">= 6" } - peerDependencies: - typescript: ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - dependencies: - tslib: 1.14.1 - typescript: 5.1.3 - dev: false - - /tunnel-agent@0.6.0: - resolution: - { - integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==, - } - dependencies: - safe-buffer: 5.2.1 - dev: true - - /type-check@0.4.0: - resolution: - { - integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, - } - engines: { node: ">= 0.8.0" } - dependencies: - prelude-ls: 1.2.1 - - /type-fest@0.20.2: - resolution: - { - integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==, - } - engines: { node: ">=10" } - - /typescript@5.1.3: - resolution: - { - integrity: sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==, - } - engines: { node: ">=14.17" } - hasBin: true - - /undici@5.22.1: - resolution: - { - integrity: sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==, - } - engines: { node: ">=14.0" } - dependencies: - busboy: 1.6.0 - dev: true - - /uri-js@4.4.1: - resolution: - { - integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, - } - dependencies: - punycode: 2.3.0 - - /util-deprecate@1.0.2: - resolution: - { - integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, - } - dev: true - - /vscode-json-languageservice@4.2.1: - resolution: - { - integrity: sha512-xGmv9QIWs2H8obGbWg+sIPI/3/pFgj/5OWBhNzs00BkYQ9UaB2F6JJaGB/2/YOZJ3BvLXQTC4Q7muqU25QgAhA==, - } - dependencies: - jsonc-parser: 3.2.0 - vscode-languageserver-textdocument: 1.0.8 - vscode-languageserver-types: 3.17.3 - vscode-nls: 5.2.0 - vscode-uri: 3.0.7 - dev: true - - /vscode-languageserver-textdocument@1.0.8: - resolution: - { - integrity: sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==, - } - dev: true - - /vscode-languageserver-types@3.17.3: - resolution: - { - integrity: sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA==, - } - dev: true - - /vscode-nls@5.2.0: - resolution: - { - integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==, - } - dev: true - - /vscode-uri@3.0.7: - resolution: - { - integrity: sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==, - } - dev: true - - /which@2.0.2: - resolution: - { - integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, - } - engines: { node: ">= 8" } - hasBin: true - dependencies: - isexe: 2.0.0 - - /word-wrap@1.2.3: - resolution: - { - integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==, - } - engines: { node: ">=0.10.0" } - - /workerd@1.20230518.0: - resolution: - { - integrity: sha512-VNmK0zoNZXrwEEx77O/oQDVUzzyDjf5kKKK8bty+FmKCd5EQJCpqi8NlRKWLGMyyYrKm86MFz0kAsreTEs7HHA==, - } - engines: { node: ">=16" } - hasBin: true - requiresBuild: true - optionalDependencies: - "@cloudflare/workerd-darwin-64": 1.20230518.0 - "@cloudflare/workerd-darwin-arm64": 1.20230518.0 - "@cloudflare/workerd-linux-64": 1.20230518.0 - "@cloudflare/workerd-linux-arm64": 1.20230518.0 - "@cloudflare/workerd-windows-64": 1.20230518.0 - dev: true - - /wrangler@3.1.1: - resolution: - { - integrity: sha512-iG6QGOt+qgSm7UroJ8IJ+JdXEcDcW7yp9ilP0V7alCGhKm8shqa/M1iyMOpukZSCSZo8Vmn5nH2C9OY1PR3dQQ==, - } - engines: { node: ">=16.13.0" } - hasBin: true - dependencies: - "@cloudflare/kv-asset-handler": 0.2.0 - "@esbuild-plugins/node-globals-polyfill": 0.1.1(esbuild@0.16.3) - "@esbuild-plugins/node-modules-polyfill": 0.1.4(esbuild@0.16.3) - blake3-wasm: 2.1.5 - chokidar: 3.5.3 - esbuild: 0.16.3 - miniflare: 3.0.1 - nanoid: 3.3.6 - path-to-regexp: 6.2.1 - selfsigned: 2.1.1 - source-map: 0.7.4 - xxhash-wasm: 1.0.2 - optionalDependencies: - fsevents: 2.3.2 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - /wrappy@1.0.2: - resolution: - { - integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, - } - - /ws@8.13.0: - resolution: - { - integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==, - } - engines: { node: ">=10.0.0" } - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: true - - /xxhash-wasm@1.0.2: - resolution: - { - integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==, - } - dev: true - - /yallist@4.0.0: - resolution: - { - integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, - } - - /yocto-queue@0.1.0: - resolution: - { - integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, - } - engines: { node: ">=10" } - - /youch@3.2.3: - resolution: - { - integrity: sha512-ZBcWz/uzZaQVdCvfV4uk616Bbpf2ee+F/AvuKDR5EwX/Y4v06xWdtMluqTD7+KlZdM93lLm9gMZYo0sKBS0pgw==, - } - dependencies: - cookie: 0.5.0 - mustache: 4.2.0 - stacktracey: 2.1.8 - dev: true - - /zod@3.21.4: - resolution: - { - integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==, - } - dev: true + dev: true + + /xxhash-wasm@1.0.2: + resolution: {integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==} + dev: true + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + /youch@3.2.3: + resolution: {integrity: sha512-ZBcWz/uzZaQVdCvfV4uk616Bbpf2ee+F/AvuKDR5EwX/Y4v06xWdtMluqTD7+KlZdM93lLm9gMZYo0sKBS0pgw==} + dependencies: + cookie: 0.5.0 + mustache: 4.2.0 + stacktracey: 2.1.8 + dev: true + + /zod@3.21.4: + resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} + dev: true diff --git a/src/routes/search/search.ts b/src/routes/search/search.ts index dfbd583..ea106b4 100644 --- a/src/routes/search/search.ts +++ b/src/routes/search/search.ts @@ -50,6 +50,11 @@ export const getSearch = async ( sqlQuery += ` LIMIT 2500`; } + // if no parameters are entered, return 30 most recent results instead of all results + if (!query && !game.length && !asset.length && !tags.length) { + sqlQuery = `SELECT * FROM assets ORDER BY uploadedDate DESC LIMIT 30`; + } + const row: D1Result = await env.database .prepare(sqlQuery) .bind(...parameters) From ae089c07c4fb938f93c6340178c43eaf5ff186b6 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Mon, 3 Jul 2023 19:41:55 +0100 Subject: [PATCH 023/318] refactor: split search function --- pnpm-lock.yaml | 4289 +++++++++++++++++++++-------------- src/lib/query.ts | 103 + src/routes/search/search.ts | 71 +- 3 files changed, 2640 insertions(+), 1823 deletions(-) create mode 100644 src/lib/query.ts diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 43aabcb..0ef5daf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,1777 +1,2544 @@ -lockfileVersion: '6.1' +lockfileVersion: "6.1" settings: - autoInstallPeers: true - excludeLinksFromLockfile: false + autoInstallPeers: true + excludeLinksFromLockfile: false dependencies: - '@typescript-eslint/eslint-plugin': - specifier: ^5.61.0 - version: 5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.44.0)(typescript@5.1.6) - itty-router: - specifier: ^4.0.13 - version: 4.0.13 - prettier: - specifier: ^2.8.8 - version: 2.8.8 - render2: - specifier: ^1.2.1 - version: 1.2.1 + "@typescript-eslint/eslint-plugin": + specifier: ^5.61.0 + version: 5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.44.0)(typescript@5.1.6) + itty-router: + specifier: ^4.0.13 + version: 4.0.13 + prettier: + specifier: ^2.8.8 + version: 2.8.8 + render2: + specifier: ^1.2.1 + version: 1.2.1 devDependencies: - '@cloudflare/workers-types': - specifier: ^4.20230518.0 - version: 4.20230518.0 - eslint: - specifier: ^8.44.0 - version: 8.44.0 - eslint-config-google: - specifier: ^0.14.0 - version: 0.14.0(eslint@8.44.0) - eslint-plugin-json: - specifier: ^3.1.0 - version: 3.1.0 - typescript: - specifier: ^5.1.6 - version: 5.1.6 - wrangler: - specifier: 3.1.1 - version: 3.1.1 + "@cloudflare/workers-types": + specifier: ^4.20230518.0 + version: 4.20230518.0 + eslint: + specifier: ^8.44.0 + version: 8.44.0 + eslint-config-google: + specifier: ^0.14.0 + version: 0.14.0(eslint@8.44.0) + eslint-plugin-json: + specifier: ^3.1.0 + version: 3.1.0 + typescript: + specifier: ^5.1.6 + version: 5.1.6 + wrangler: + specifier: 3.1.1 + version: 3.1.1 packages: + /@aashutoshrathi/word-wrap@1.2.6: + resolution: + { + integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==, + } + engines: { node: ">=0.10.0" } + + /@cloudflare/kv-asset-handler@0.2.0: + resolution: + { + integrity: sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==, + } + dependencies: + mime: 3.0.0 + dev: true + + /@cloudflare/workerd-darwin-64@1.20230518.0: + resolution: + { + integrity: sha512-reApIf2/do6GjLlajU6LbRYh8gm/XcaRtzGbF8jo5IzyDSsdStmfNuvq7qssZXG92219Yp1kuTgR9+D1GGZGbg==, + } + engines: { node: ">=16" } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@cloudflare/workerd-darwin-arm64@1.20230518.0: + resolution: + { + integrity: sha512-1l+xdbmPddqb2YIHd1YJ3YG/Fl1nhayzcxfL30xfNS89zJn9Xn3JomM0XMD4mk0d5GruBP3q8BQZ1Uo4rRLF3A==, + } + engines: { node: ">=16" } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@cloudflare/workerd-linux-64@1.20230518.0: + resolution: + { + integrity: sha512-/pfR+YBpMOPr2cAlwjtInil0hRZjD8KX9LqK9JkfkEiaBH8CYhnJQcOdNHZI+3OjcY09JnQtEVC5xC4nbW7Bvw==, + } + engines: { node: ">=16" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@cloudflare/workerd-linux-arm64@1.20230518.0: + resolution: + { + integrity: sha512-q3HQvn3J4uEkE0cfDAGG8zqzSZrD47cavB/Tzv4mNutqwg6B4wL3ifjtGeB55tnP2K2KL0GVmX4tObcvpUF4BA==, + } + engines: { node: ">=16" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@cloudflare/workerd-windows-64@1.20230518.0: + resolution: + { + integrity: sha512-vNEHKS5gKKduNOBYtQjcBopAmFT1iScuPWMZa2nJboSjOB9I/5oiVsUpSyk5Y2ARyrohXNz0y8D7p87YzTASWw==, + } + engines: { node: ">=16" } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@cloudflare/workers-types@4.20230518.0: + resolution: + { + integrity: sha512-A0w1V+5SUawGaaPRlhFhSC/SCDT9oQG8TMoWOKFLA4qbqagELqEAFD4KySBIkeVOvCBLT1DZSYBMCxbXddl0kw==, + } + dev: true + + /@esbuild-plugins/node-globals-polyfill@0.1.1(esbuild@0.16.3): + resolution: + { + integrity: sha512-MR0oAA+mlnJWrt1RQVQ+4VYuRJW/P2YmRTv1AsplObyvuBMnPHiizUF95HHYiSsMGLhyGtWufaq2XQg6+iurBg==, + } + peerDependencies: + esbuild: "*" + dependencies: + esbuild: 0.16.3 + dev: true + + /@esbuild-plugins/node-modules-polyfill@0.1.4(esbuild@0.16.3): + resolution: + { + integrity: sha512-uZbcXi0zbmKC/050p3gJnne5Qdzw8vkXIv+c2BW0Lsc1ji1SkrxbKPUy5Efr0blbTu1SL8w4eyfpnSdPg3G0Qg==, + } + peerDependencies: + esbuild: "*" + dependencies: + esbuild: 0.16.3 + escape-string-regexp: 4.0.0 + rollup-plugin-node-polyfills: 0.2.1 + dev: true + + /@esbuild/android-arm64@0.16.3: + resolution: + { + integrity: sha512-RolFVeinkeraDvN/OoRf1F/lP0KUfGNb5jxy/vkIMeRRChkrX/HTYN6TYZosRJs3a1+8wqpxAo5PI5hFmxyPRg==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.16.3: + resolution: + { + integrity: sha512-mueuEoh+s1eRbSJqq9KNBQwI4QhQV6sRXIfTyLXSHGMpyew61rOK4qY21uKbXl1iBoMb0AdL1deWFCQVlN2qHA==, + } + engines: { node: ">=12" } + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.16.3: + resolution: + { + integrity: sha512-SFpTUcIT1bIJuCCBMCQWq1bL2gPTjWoLZdjmIhjdcQHaUfV41OQfho6Ici5uvvkMmZRXIUGpM3GxysP/EU7ifQ==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.16.3: + resolution: + { + integrity: sha512-DO8WykMyB+N9mIDfI/Hug70Dk1KipavlGAecxS3jDUwAbTpDXj0Lcwzw9svkhxfpCagDmpaTMgxWK8/C/XcXvw==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.16.3: + resolution: + { + integrity: sha512-uEqZQ2omc6BvWqdCiyZ5+XmxuHEi1SPzpVxXCSSV2+Sh7sbXbpeNhHIeFrIpRjAs0lI1FmA1iIOxFozKBhKgRQ==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.16.3: + resolution: + { + integrity: sha512-nJansp3sSXakNkOD5i5mIz2Is/HjzIhFs49b1tjrPrpCmwgBmH9SSzhC/Z1UqlkivqMYkhfPwMw1dGFUuwmXhw==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.16.3: + resolution: + { + integrity: sha512-TfoDzLw+QHfc4a8aKtGSQ96Wa+6eimljjkq9HKR0rHlU83vw8aldMOUSJTUDxbcUdcgnJzPaX8/vGWm7vyV7ug==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.16.3: + resolution: + { + integrity: sha512-7I3RlsnxEFCHVZNBLb2w7unamgZ5sVwO0/ikE2GaYvYuUQs9Qte/w7TqWcXHtCwxvZx/2+F97ndiUQAWs47ZfQ==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.16.3: + resolution: + { + integrity: sha512-VwswmSYwVAAq6LysV59Fyqk3UIjbhuc6wb3vEcJ7HEJUtFuLK9uXWuFoH1lulEbE4+5GjtHi3MHX+w1gNHdOWQ==, + } + engines: { node: ">=12" } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.16.3: + resolution: + { + integrity: sha512-X8FDDxM9cqda2rJE+iblQhIMYY49LfvW4kaEjoFbTTQ4Go8G96Smj2w3BRTwA8IHGoi9dPOPGAX63dhuv19UqA==, + } + engines: { node: ">=12" } + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.16.3: + resolution: + { + integrity: sha512-hIbeejCOyO0X9ujfIIOKjBjNAs9XD/YdJ9JXAy1lHA+8UXuOqbFe4ErMCqMr8dhlMGBuvcQYGF7+kO7waj2KHw==, + } + engines: { node: ">=12" } + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.16.3: + resolution: + { + integrity: sha512-znFRzICT/V8VZQMt6rjb21MtAVJv/3dmKRMlohlShrbVXdBuOdDrGb+C2cZGQAR8RFyRe7HS6klmHq103WpmVw==, + } + engines: { node: ">=12" } + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.16.3: + resolution: + { + integrity: sha512-EV7LuEybxhXrVTDpbqWF2yehYRNz5e5p+u3oQUS2+ZFpknyi1NXxr8URk4ykR8Efm7iu04//4sBg249yNOwy5Q==, + } + engines: { node: ">=12" } + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.16.3: + resolution: + { + integrity: sha512-uDxqFOcLzFIJ+r/pkTTSE9lsCEaV/Y6rMlQjUI9BkzASEChYL/aSQjZjchtEmdnVxDKETnUAmsaZ4pqK1eE5BQ==, + } + engines: { node: ">=12" } + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.16.3: + resolution: + { + integrity: sha512-NbeREhzSxYwFhnCAQOQZmajsPYtX71Ufej3IQ8W2Gxskfz9DK58ENEju4SbpIj48VenktRASC52N5Fhyf/aliQ==, + } + engines: { node: ">=12" } + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true - /@aashutoshrathi/word-wrap@1.2.6: - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - - /@cloudflare/kv-asset-handler@0.2.0: - resolution: {integrity: sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==} - dependencies: - mime: 3.0.0 - dev: true - - /@cloudflare/workerd-darwin-64@1.20230518.0: - resolution: {integrity: sha512-reApIf2/do6GjLlajU6LbRYh8gm/XcaRtzGbF8jo5IzyDSsdStmfNuvq7qssZXG92219Yp1kuTgR9+D1GGZGbg==} - engines: {node: '>=16'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workerd-darwin-arm64@1.20230518.0: - resolution: {integrity: sha512-1l+xdbmPddqb2YIHd1YJ3YG/Fl1nhayzcxfL30xfNS89zJn9Xn3JomM0XMD4mk0d5GruBP3q8BQZ1Uo4rRLF3A==} - engines: {node: '>=16'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workerd-linux-64@1.20230518.0: - resolution: {integrity: sha512-/pfR+YBpMOPr2cAlwjtInil0hRZjD8KX9LqK9JkfkEiaBH8CYhnJQcOdNHZI+3OjcY09JnQtEVC5xC4nbW7Bvw==} - engines: {node: '>=16'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workerd-linux-arm64@1.20230518.0: - resolution: {integrity: sha512-q3HQvn3J4uEkE0cfDAGG8zqzSZrD47cavB/Tzv4mNutqwg6B4wL3ifjtGeB55tnP2K2KL0GVmX4tObcvpUF4BA==} - engines: {node: '>=16'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workerd-windows-64@1.20230518.0: - resolution: {integrity: sha512-vNEHKS5gKKduNOBYtQjcBopAmFT1iScuPWMZa2nJboSjOB9I/5oiVsUpSyk5Y2ARyrohXNz0y8D7p87YzTASWw==} - engines: {node: '>=16'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workers-types@4.20230518.0: - resolution: {integrity: sha512-A0w1V+5SUawGaaPRlhFhSC/SCDT9oQG8TMoWOKFLA4qbqagELqEAFD4KySBIkeVOvCBLT1DZSYBMCxbXddl0kw==} - dev: true - - /@esbuild-plugins/node-globals-polyfill@0.1.1(esbuild@0.16.3): - resolution: {integrity: sha512-MR0oAA+mlnJWrt1RQVQ+4VYuRJW/P2YmRTv1AsplObyvuBMnPHiizUF95HHYiSsMGLhyGtWufaq2XQg6+iurBg==} - peerDependencies: - esbuild: '*' - dependencies: - esbuild: 0.16.3 - dev: true - - /@esbuild-plugins/node-modules-polyfill@0.1.4(esbuild@0.16.3): - resolution: {integrity: sha512-uZbcXi0zbmKC/050p3gJnne5Qdzw8vkXIv+c2BW0Lsc1ji1SkrxbKPUy5Efr0blbTu1SL8w4eyfpnSdPg3G0Qg==} - peerDependencies: - esbuild: '*' - dependencies: - esbuild: 0.16.3 - escape-string-regexp: 4.0.0 - rollup-plugin-node-polyfills: 0.2.1 - dev: true - - /@esbuild/android-arm64@0.16.3: - resolution: {integrity: sha512-RolFVeinkeraDvN/OoRf1F/lP0KUfGNb5jxy/vkIMeRRChkrX/HTYN6TYZosRJs3a1+8wqpxAo5PI5hFmxyPRg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm@0.16.3: - resolution: {integrity: sha512-mueuEoh+s1eRbSJqq9KNBQwI4QhQV6sRXIfTyLXSHGMpyew61rOK4qY21uKbXl1iBoMb0AdL1deWFCQVlN2qHA==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-x64@0.16.3: - resolution: {integrity: sha512-SFpTUcIT1bIJuCCBMCQWq1bL2gPTjWoLZdjmIhjdcQHaUfV41OQfho6Ici5uvvkMmZRXIUGpM3GxysP/EU7ifQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-arm64@0.16.3: - resolution: {integrity: sha512-DO8WykMyB+N9mIDfI/Hug70Dk1KipavlGAecxS3jDUwAbTpDXj0Lcwzw9svkhxfpCagDmpaTMgxWK8/C/XcXvw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-x64@0.16.3: - resolution: {integrity: sha512-uEqZQ2omc6BvWqdCiyZ5+XmxuHEi1SPzpVxXCSSV2+Sh7sbXbpeNhHIeFrIpRjAs0lI1FmA1iIOxFozKBhKgRQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-arm64@0.16.3: - resolution: {integrity: sha512-nJansp3sSXakNkOD5i5mIz2Is/HjzIhFs49b1tjrPrpCmwgBmH9SSzhC/Z1UqlkivqMYkhfPwMw1dGFUuwmXhw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-x64@0.16.3: - resolution: {integrity: sha512-TfoDzLw+QHfc4a8aKtGSQ96Wa+6eimljjkq9HKR0rHlU83vw8aldMOUSJTUDxbcUdcgnJzPaX8/vGWm7vyV7ug==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm64@0.16.3: - resolution: {integrity: sha512-7I3RlsnxEFCHVZNBLb2w7unamgZ5sVwO0/ikE2GaYvYuUQs9Qte/w7TqWcXHtCwxvZx/2+F97ndiUQAWs47ZfQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm@0.16.3: - resolution: {integrity: sha512-VwswmSYwVAAq6LysV59Fyqk3UIjbhuc6wb3vEcJ7HEJUtFuLK9uXWuFoH1lulEbE4+5GjtHi3MHX+w1gNHdOWQ==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ia32@0.16.3: - resolution: {integrity: sha512-X8FDDxM9cqda2rJE+iblQhIMYY49LfvW4kaEjoFbTTQ4Go8G96Smj2w3BRTwA8IHGoi9dPOPGAX63dhuv19UqA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-loong64@0.16.3: - resolution: {integrity: sha512-hIbeejCOyO0X9ujfIIOKjBjNAs9XD/YdJ9JXAy1lHA+8UXuOqbFe4ErMCqMr8dhlMGBuvcQYGF7+kO7waj2KHw==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-mips64el@0.16.3: - resolution: {integrity: sha512-znFRzICT/V8VZQMt6rjb21MtAVJv/3dmKRMlohlShrbVXdBuOdDrGb+C2cZGQAR8RFyRe7HS6klmHq103WpmVw==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ppc64@0.16.3: - resolution: {integrity: sha512-EV7LuEybxhXrVTDpbqWF2yehYRNz5e5p+u3oQUS2+ZFpknyi1NXxr8URk4ykR8Efm7iu04//4sBg249yNOwy5Q==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-riscv64@0.16.3: - resolution: {integrity: sha512-uDxqFOcLzFIJ+r/pkTTSE9lsCEaV/Y6rMlQjUI9BkzASEChYL/aSQjZjchtEmdnVxDKETnUAmsaZ4pqK1eE5BQ==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-s390x@0.16.3: - resolution: {integrity: sha512-NbeREhzSxYwFhnCAQOQZmajsPYtX71Ufej3IQ8W2Gxskfz9DK58ENEju4SbpIj48VenktRASC52N5Fhyf/aliQ==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-x64@0.16.3: - resolution: {integrity: sha512-SDiG0nCixYO9JgpehoKgScwic7vXXndfasjnD5DLbp1xltANzqZ425l7LSdHynt19UWOcDjG9wJJzSElsPvk0w==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/netbsd-x64@0.16.3: - resolution: {integrity: sha512-AzbsJqiHEq1I/tUvOfAzCY15h4/7Ivp3ff/o1GpP16n48JMNAtbW0qui2WCgoIZArEHD0SUQ95gvR0oSO7ZbdA==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/openbsd-x64@0.16.3: - resolution: {integrity: sha512-gSABi8qHl8k3Cbi/4toAzHiykuBuWLZs43JomTcXkjMZVkp0gj3gg9mO+9HJW/8GB5H89RX/V0QP4JGL7YEEVg==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/sunos-x64@0.16.3: - resolution: {integrity: sha512-SF9Kch5Ete4reovvRO6yNjMxrvlfT0F0Flm+NPoUw5Z4Q3r1d23LFTgaLwm3Cp0iGbrU/MoUI+ZqwCv5XJijCw==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-arm64@0.16.3: - resolution: {integrity: sha512-u5aBonZIyGopAZyOnoPAA6fGsDeHByZ9CnEzyML9NqntK6D/xl5jteZUKm/p6nD09+v3pTM6TuUIqSPcChk5gg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-ia32@0.16.3: - resolution: {integrity: sha512-GlgVq1WpvOEhNioh74TKelwla9KDuAaLZrdxuuUgsP2vayxeLgVc+rbpIv0IYF4+tlIzq2vRhofV+KGLD+37EQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-x64@0.16.3: - resolution: {integrity: sha512-5/JuTd8OWW8UzEtyf19fbrtMJENza+C9JoPIkvItgTBQ1FO2ZLvjbPO6Xs54vk0s5JB5QsfieUEshRQfu7ZHow==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@eslint-community/eslint-utils@4.4.0(eslint@8.44.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.44.0 - eslint-visitor-keys: 3.4.1 - - /@eslint-community/regexpp@4.5.1: - resolution: {integrity: sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - /@eslint/eslintrc@2.1.0: - resolution: {integrity: sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.6.0 - globals: 13.20.0 - ignore: 5.2.4 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - /@eslint/js@8.44.0: - resolution: {integrity: sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - /@humanwhocodes/config-array@0.11.10: - resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} - engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - /@humanwhocodes/object-schema@1.2.1: - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} - - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 - - /@types/json-schema@7.0.12: - resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} - dev: false - - /@types/semver@7.5.0: - resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} - dev: false - - /@typescript-eslint/eslint-plugin@5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.44.0)(typescript@5.1.6): - resolution: {integrity: sha512-A5l/eUAug103qtkwccSCxn8ZRwT+7RXWkFECdA4Cvl1dOlDUgTpAOfSEElZn2uSUxhdDpnCdetrf0jvU4qrL+g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: + /@esbuild/linux-x64@0.16.3: + resolution: + { + integrity: sha512-SDiG0nCixYO9JgpehoKgScwic7vXXndfasjnD5DLbp1xltANzqZ425l7LSdHynt19UWOcDjG9wJJzSElsPvk0w==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true optional: true - dependencies: - '@eslint-community/regexpp': 4.5.1 - '@typescript-eslint/parser': 5.61.0(eslint@8.44.0)(typescript@5.1.6) - '@typescript-eslint/scope-manager': 5.61.0 - '@typescript-eslint/type-utils': 5.61.0(eslint@8.44.0)(typescript@5.1.6) - '@typescript-eslint/utils': 5.61.0(eslint@8.44.0)(typescript@5.1.6) - debug: 4.3.4 - eslint: 8.44.0 - graphemer: 1.4.0 - ignore: 5.2.4 - natural-compare-lite: 1.4.0 - semver: 7.5.3 - tsutils: 3.21.0(typescript@5.1.6) - typescript: 5.1.6 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/parser@5.61.0(eslint@8.44.0)(typescript@5.1.6): - resolution: {integrity: sha512-yGr4Sgyh8uO6fSi9hw3jAFXNBHbCtKKFMdX2IkT3ZqpKmtAq3lHS4ixB/COFuAIJpwl9/AqF7j72ZDWYKmIfvg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: + + /@esbuild/netbsd-x64@0.16.3: + resolution: + { + integrity: sha512-AzbsJqiHEq1I/tUvOfAzCY15h4/7Ivp3ff/o1GpP16n48JMNAtbW0qui2WCgoIZArEHD0SUQ95gvR0oSO7ZbdA==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.16.3: + resolution: + { + integrity: sha512-gSABi8qHl8k3Cbi/4toAzHiykuBuWLZs43JomTcXkjMZVkp0gj3gg9mO+9HJW/8GB5H89RX/V0QP4JGL7YEEVg==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true optional: true - dependencies: - '@typescript-eslint/scope-manager': 5.61.0 - '@typescript-eslint/types': 5.61.0 - '@typescript-eslint/typescript-estree': 5.61.0(typescript@5.1.6) - debug: 4.3.4 - eslint: 8.44.0 - typescript: 5.1.6 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/scope-manager@5.61.0: - resolution: {integrity: sha512-W8VoMjoSg7f7nqAROEmTt6LoBpn81AegP7uKhhW5KzYlehs8VV0ZW0fIDVbcZRcaP3aPSW+JZFua+ysQN+m/Nw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.61.0 - '@typescript-eslint/visitor-keys': 5.61.0 - dev: false - - /@typescript-eslint/type-utils@5.61.0(eslint@8.44.0)(typescript@5.1.6): - resolution: {integrity: sha512-kk8u//r+oVK2Aj3ph/26XdH0pbAkC2RiSjUYhKD+PExemG4XSjpGFeyZ/QM8lBOa7O8aGOU+/yEbMJgQv/DnCg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: + + /@esbuild/sunos-x64@0.16.3: + resolution: + { + integrity: sha512-SF9Kch5Ete4reovvRO6yNjMxrvlfT0F0Flm+NPoUw5Z4Q3r1d23LFTgaLwm3Cp0iGbrU/MoUI+ZqwCv5XJijCw==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true optional: true - dependencies: - '@typescript-eslint/typescript-estree': 5.61.0(typescript@5.1.6) - '@typescript-eslint/utils': 5.61.0(eslint@8.44.0)(typescript@5.1.6) - debug: 4.3.4 - eslint: 8.44.0 - tsutils: 3.21.0(typescript@5.1.6) - typescript: 5.1.6 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/types@5.61.0: - resolution: {integrity: sha512-ldyueo58KjngXpzloHUog/h9REmHl59G1b3a5Sng1GfBo14BkS3ZbMEb3693gnP1k//97lh7bKsp6/V/0v1veQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: false - - /@typescript-eslint/typescript-estree@5.61.0(typescript@5.1.6): - resolution: {integrity: sha512-Fud90PxONnnLZ36oR5ClJBLTLfU4pIWBmnvGwTbEa2cXIqj70AEDEmOmpkFComjBZ/037ueKrOdHuYmSFVD7Rw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: + + /@esbuild/win32-arm64@0.16.3: + resolution: + { + integrity: sha512-u5aBonZIyGopAZyOnoPAA6fGsDeHByZ9CnEzyML9NqntK6D/xl5jteZUKm/p6nD09+v3pTM6TuUIqSPcChk5gg==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true optional: true - dependencies: - '@typescript-eslint/types': 5.61.0 - '@typescript-eslint/visitor-keys': 5.61.0 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.5.3 - tsutils: 3.21.0(typescript@5.1.6) - typescript: 5.1.6 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/utils@5.61.0(eslint@8.44.0)(typescript@5.1.6): - resolution: {integrity: sha512-mV6O+6VgQmVE6+xzlA91xifndPW9ElFW8vbSF0xCT/czPXVhwDewKila1jOyRwa9AE19zKnrr7Cg5S3pJVrTWQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.44.0) - '@types/json-schema': 7.0.12 - '@types/semver': 7.5.0 - '@typescript-eslint/scope-manager': 5.61.0 - '@typescript-eslint/types': 5.61.0 - '@typescript-eslint/typescript-estree': 5.61.0(typescript@5.1.6) - eslint: 8.44.0 - eslint-scope: 5.1.1 - semver: 7.5.3 - transitivePeerDependencies: - - supports-color - - typescript - dev: false - - /@typescript-eslint/visitor-keys@5.61.0: - resolution: {integrity: sha512-50XQ5VdbWrX06mQXhy93WywSFZZGsv3EOjq+lqp6WC2t+j3mb6A9xYVdrRxafvK88vg9k9u+CT4l6D8PEatjKg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.61.0 - eslint-visitor-keys: 3.4.1 - dev: false - - /acorn-jsx@5.3.2(acorn@8.9.0): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.9.0 - - /acorn-walk@8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} - engines: {node: '>=0.4.0'} - dev: true - - /acorn@8.9.0: - resolution: {integrity: sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==} - engines: {node: '>=0.4.0'} - hasBin: true - - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: false - - /as-table@1.0.55: - resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} - dependencies: - printable-characters: 1.0.42 - dev: true - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: true - - /better-sqlite3@8.4.0: - resolution: {integrity: sha512-NmsNW1CQvqMszu/CFAJ3pLct6NEFlNfuGM6vw72KHkjOD1UDnL96XNN1BMQc1hiHo8vE2GbOWQYIpZ+YM5wrZw==} - requiresBuild: true - dependencies: - bindings: 1.5.0 - prebuild-install: 7.1.1 - dev: true - - /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: true - - /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: true - - /blake3-wasm@2.1.5: - resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} - dev: true - - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: true - - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: true - - /busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} - dependencies: - streamsearch: 1.1.0 - dev: true - - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - - /capnp-ts@0.7.0: - resolution: {integrity: sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==} - dependencies: - debug: 4.3.4 - tslib: 2.6.0 - transitivePeerDependencies: - - supports-color - dev: true - - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - dev: true - - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - /cookie@0.5.0: - resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} - engines: {node: '>= 0.6'} - dev: true - - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - /data-uri-to-buffer@2.0.2: - resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==} - dev: true - - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: + + /@esbuild/win32-ia32@0.16.3: + resolution: + { + integrity: sha512-GlgVq1WpvOEhNioh74TKelwla9KDuAaLZrdxuuUgsP2vayxeLgVc+rbpIv0IYF4+tlIzq2vRhofV+KGLD+37EQ==, + } + engines: { node: ">=12" } + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true optional: true - dependencies: - ms: 2.1.2 - - /decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - dependencies: - mimic-response: 3.1.0 - dev: true - - /deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - dev: true - - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - - /detect-libc@2.0.1: - resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} - engines: {node: '>=8'} - dev: true - - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - dev: false - - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dependencies: - esutils: 2.0.3 - - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - dependencies: - once: 1.4.0 - dev: true - - /esbuild@0.16.3: - resolution: {integrity: sha512-71f7EjPWTiSguen8X/kxEpkAS7BFHwtQKisCDDV3Y4GLGWBaoSCyD5uXkaUew6JDzA9FEN1W23mdnSwW9kqCeg==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.16.3 - '@esbuild/android-arm64': 0.16.3 - '@esbuild/android-x64': 0.16.3 - '@esbuild/darwin-arm64': 0.16.3 - '@esbuild/darwin-x64': 0.16.3 - '@esbuild/freebsd-arm64': 0.16.3 - '@esbuild/freebsd-x64': 0.16.3 - '@esbuild/linux-arm': 0.16.3 - '@esbuild/linux-arm64': 0.16.3 - '@esbuild/linux-ia32': 0.16.3 - '@esbuild/linux-loong64': 0.16.3 - '@esbuild/linux-mips64el': 0.16.3 - '@esbuild/linux-ppc64': 0.16.3 - '@esbuild/linux-riscv64': 0.16.3 - '@esbuild/linux-s390x': 0.16.3 - '@esbuild/linux-x64': 0.16.3 - '@esbuild/netbsd-x64': 0.16.3 - '@esbuild/openbsd-x64': 0.16.3 - '@esbuild/sunos-x64': 0.16.3 - '@esbuild/win32-arm64': 0.16.3 - '@esbuild/win32-ia32': 0.16.3 - '@esbuild/win32-x64': 0.16.3 - dev: true - - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - /eslint-config-google@0.14.0(eslint@8.44.0): - resolution: {integrity: sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==} - engines: {node: '>=0.10.0'} - peerDependencies: - eslint: '>=5.16.0' - dependencies: - eslint: 8.44.0 - dev: true - - /eslint-plugin-json@3.1.0: - resolution: {integrity: sha512-MrlG2ynFEHe7wDGwbUuFPsaT2b1uhuEFhJ+W1f1u+1C2EkXmTYJp4B1aAdQQ8M+CC3t//N/oRKiIVw14L2HR1g==} - engines: {node: '>=12.0'} - dependencies: - lodash: 4.17.21 - vscode-json-languageservice: 4.2.1 - dev: true - - /eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - dev: false - - /eslint-scope@7.2.0: - resolution: {integrity: sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - /eslint-visitor-keys@3.4.1: - resolution: {integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - /eslint@8.44.0: - resolution: {integrity: sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.44.0) - '@eslint-community/regexpp': 4.5.1 - '@eslint/eslintrc': 2.1.0 - '@eslint/js': 8.44.0 - '@humanwhocodes/config-array': 0.11.10 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.0 - eslint-visitor-keys: 3.4.1 - espree: 9.6.0 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.20.0 - graphemer: 1.4.0 - ignore: 5.2.4 - import-fresh: 3.3.0 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.3 - strip-ansi: 6.0.1 - strip-json-comments: 3.1.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - - /espree@9.6.0: - resolution: {integrity: sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - acorn: 8.9.0 - acorn-jsx: 5.3.2(acorn@8.9.0) - eslint-visitor-keys: 3.4.1 - - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} - dependencies: - estraverse: 5.3.0 - - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - dependencies: - estraverse: 5.3.0 - - /estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - dev: false - - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - /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'} - - /exit-hook@2.2.1: - resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} - engines: {node: '>=6'} - dev: true - - /expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} - dev: true - - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - /fast-glob@3.3.0: - resolution: {integrity: sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: false - - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} - dependencies: - reusify: 1.0.4 - - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flat-cache: 3.0.4 - - /file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - dev: true - - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - - /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 - - /flat-cache@3.0.4: - resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flatted: 3.2.7 - rimraf: 3.0.2 - - /flatted@3.2.7: - resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} - - /fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - dev: true - - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /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 - - /github-from-package@0.0.0: - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - dev: true - - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - dependencies: - is-glob: 4.0.3 - - /glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - dev: true - - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - /globals@13.20.0: - resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.20.2 - - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.0 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 3.0.0 - dev: false - - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - /http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - dev: true - - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: true - - /ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} - engines: {node: '>= 4'} - - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: true - - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - dependencies: - binary-extensions: 2.2.0 - dev: true - - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - /itty-router@4.0.13: - resolution: {integrity: sha512-iiQ9k1nQgaal/MteVft5pwYkvzuZx3idPT9tYpKWl7rKH74tyz5VVSVUCXUO0iBh5HDXjHYsix90UrFKPfThHg==} - dev: false - - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - dependencies: - argparse: 2.0.1 - - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - dev: true - - /kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - dev: true - - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - dependencies: - p-locate: 5.0.0 - - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: true - - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - - /magic-string@0.25.9: - resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} - dependencies: - sourcemap-codec: 1.4.8 - dev: true - - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: false - - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - dev: false - - /mime@3.0.0: - resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} - engines: {node: '>=10.0.0'} - hasBin: true - dev: true - - /mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - dev: true - - /miniflare@3.0.2: - resolution: {integrity: sha512-tSwmK+JPwHsV2KR7/dSZFGtTF/2M30OShjPDY7e5lAxyGE8SkHqXn/ckjg2TVltc9B8rXCSffMnCfYW1pH7R4A==} - engines: {node: '>=16.13'} - dependencies: - acorn: 8.9.0 - acorn-walk: 8.2.0 - better-sqlite3: 8.4.0 - capnp-ts: 0.7.0 - exit-hook: 2.2.1 - glob-to-regexp: 0.4.1 - http-cache-semantics: 4.1.1 - kleur: 4.1.5 - source-map-support: 0.5.21 - stoppable: 1.1.0 - undici: 5.22.1 - workerd: 1.20230518.0 - ws: 8.13.0 - youch: 3.2.3 - zod: 3.21.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 - - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true - - /mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - dev: true - - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - /mustache@4.2.0: - resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} - hasBin: true - dev: true - - /nanoid@3.3.6: - resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} - 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==} - dev: true - - /natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - dev: false - - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - - /node-abi@3.45.0: - resolution: {integrity: sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==} - engines: {node: '>=10'} - dependencies: - semver: 7.5.3 - dev: true - - /node-forge@1.3.1: - resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} - engines: {node: '>= 6.13.0'} - dev: true - - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: true - - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} - dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - dependencies: - yocto-queue: 0.1.0 - - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - dependencies: - p-limit: 3.1.0 - - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - dependencies: - callsites: 3.1.0 - - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - /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'} - dev: false - - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - /prebuild-install@7.1.1: - resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} - engines: {node: '>=10'} - hasBin: true - dependencies: - detect-libc: 2.0.1 - 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.45.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: true - - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - - /prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - dev: false - - /printable-characters@1.0.42: - resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} - dev: true - - /pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - dev: true - - /punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} - engines: {node: '>=6'} - - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - /range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - dev: false - - /rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - dev: true - - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - dev: true - - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - dev: true - - /render2@1.2.1: - resolution: {integrity: sha512-HfLOYtG6p6jx6GG6uub7YGJ4iv+GlOwFmDtGdtSe2NQJ6peMZ0u76k7GAZ0z7GSf4e9UfeCcQxme4Mayh7DLqw==} - dependencies: - range-parser: 1.2.1 - dev: false - - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true - dependencies: - glob: 7.2.3 - - /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. - 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 - dev: true - - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - dependencies: - queue-microtask: 1.2.3 - - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: true - - /selfsigned@2.1.1: - resolution: {integrity: sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==} - engines: {node: '>=10'} - dependencies: - node-forge: 1.3.1 - dev: true - - /semver@7.5.3: - resolution: {integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - /simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - dev: true - - /simple-get@4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 - dev: true - - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: false - - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - dev: true - - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - dev: true - - /source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} - dev: true - - /sourcemap-codec@1.4.8: - resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} - deprecated: Please use @jridgewell/sourcemap-codec instead - dev: true - - /stacktracey@2.1.8: - resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==} - dependencies: - as-table: 1.0.55 - get-source: 2.0.12 - dev: true - - /stoppable@1.1.0: - resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} - engines: {node: '>=4', npm: '>=6'} - dev: true - - /streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} - dev: true - - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - - /strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - dev: true - - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - - /tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.0 - tar-stream: 2.2.0 - dev: true - - /tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - 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: true - - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - - /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: false - - /tslib@2.6.0: - resolution: {integrity: sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==} - dev: true - - /tsutils@3.21.0(typescript@5.1.6): - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - dependencies: - tslib: 1.14.1 - typescript: 5.1.6 - dev: false - - /tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - - /typescript@5.1.6: - resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} - engines: {node: '>=14.17'} - hasBin: true - - /undici@5.22.1: - resolution: {integrity: sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==} - engines: {node: '>=14.0'} - dependencies: - busboy: 1.6.0 - dev: true - - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - dependencies: - punycode: 2.3.0 - - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: true - - /vscode-json-languageservice@4.2.1: - resolution: {integrity: sha512-xGmv9QIWs2H8obGbWg+sIPI/3/pFgj/5OWBhNzs00BkYQ9UaB2F6JJaGB/2/YOZJ3BvLXQTC4Q7muqU25QgAhA==} - dependencies: - jsonc-parser: 3.2.0 - vscode-languageserver-textdocument: 1.0.8 - vscode-languageserver-types: 3.17.3 - vscode-nls: 5.2.0 - vscode-uri: 3.0.7 - dev: true - - /vscode-languageserver-textdocument@1.0.8: - resolution: {integrity: sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==} - dev: true - - /vscode-languageserver-types@3.17.3: - resolution: {integrity: sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA==} - dev: true - - /vscode-nls@5.2.0: - resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==} - dev: true - - /vscode-uri@3.0.7: - resolution: {integrity: sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==} - dev: true - - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - - /workerd@1.20230518.0: - resolution: {integrity: sha512-VNmK0zoNZXrwEEx77O/oQDVUzzyDjf5kKKK8bty+FmKCd5EQJCpqi8NlRKWLGMyyYrKm86MFz0kAsreTEs7HHA==} - engines: {node: '>=16'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20230518.0 - '@cloudflare/workerd-darwin-arm64': 1.20230518.0 - '@cloudflare/workerd-linux-64': 1.20230518.0 - '@cloudflare/workerd-linux-arm64': 1.20230518.0 - '@cloudflare/workerd-windows-64': 1.20230518.0 - dev: true - - /wrangler@3.1.1: - resolution: {integrity: sha512-iG6QGOt+qgSm7UroJ8IJ+JdXEcDcW7yp9ilP0V7alCGhKm8shqa/M1iyMOpukZSCSZo8Vmn5nH2C9OY1PR3dQQ==} - engines: {node: '>=16.13.0'} - hasBin: true - dependencies: - '@cloudflare/kv-asset-handler': 0.2.0 - '@esbuild-plugins/node-globals-polyfill': 0.1.1(esbuild@0.16.3) - '@esbuild-plugins/node-modules-polyfill': 0.1.4(esbuild@0.16.3) - blake3-wasm: 2.1.5 - chokidar: 3.5.3 - esbuild: 0.16.3 - miniflare: 3.0.2 - nanoid: 3.3.6 - path-to-regexp: 6.2.1 - selfsigned: 2.1.1 - source-map: 0.7.4 - xxhash-wasm: 1.0.2 - optionalDependencies: - fsevents: 2.3.2 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - /ws@8.13.0: - resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: + + /@esbuild/win32-x64@0.16.3: + resolution: + { + integrity: sha512-5/JuTd8OWW8UzEtyf19fbrtMJENza+C9JoPIkvItgTBQ1FO2ZLvjbPO6Xs54vk0s5JB5QsfieUEshRQfu7ZHow==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true optional: true - utf-8-validate: + + /@eslint-community/eslint-utils@4.4.0(eslint@8.44.0): + resolution: + { + integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.44.0 + eslint-visitor-keys: 3.4.1 + + /@eslint-community/regexpp@4.5.1: + resolution: + { + integrity: sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==, + } + engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } + + /@eslint/eslintrc@2.1.0: + resolution: + { + integrity: sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.0 + globals: 13.20.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + /@eslint/js@8.44.0: + resolution: + { + integrity: sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + + /@humanwhocodes/config-array@0.11.10: + resolution: + { + integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==, + } + engines: { node: ">=10.10.0" } + dependencies: + "@humanwhocodes/object-schema": 1.2.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + /@humanwhocodes/module-importer@1.0.1: + resolution: + { + integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, + } + engines: { node: ">=12.22" } + + /@humanwhocodes/object-schema@1.2.1: + resolution: + { + integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==, + } + + /@nodelib/fs.scandir@2.1.5: + resolution: + { + integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, + } + engines: { node: ">= 8" } + dependencies: + "@nodelib/fs.stat": 2.0.5 + run-parallel: 1.2.0 + + /@nodelib/fs.stat@2.0.5: + resolution: + { + integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, + } + engines: { node: ">= 8" } + + /@nodelib/fs.walk@1.2.8: + resolution: + { + integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, + } + engines: { node: ">= 8" } + dependencies: + "@nodelib/fs.scandir": 2.1.5 + fastq: 1.15.0 + + /@types/json-schema@7.0.12: + resolution: + { + integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==, + } + dev: false + + /@types/semver@7.5.0: + resolution: + { + integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==, + } + dev: false + + /@typescript-eslint/eslint-plugin@5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.44.0)(typescript@5.1.6): + resolution: + { + integrity: sha512-A5l/eUAug103qtkwccSCxn8ZRwT+7RXWkFECdA4Cvl1dOlDUgTpAOfSEElZn2uSUxhdDpnCdetrf0jvU4qrL+g==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + "@typescript-eslint/parser": ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@eslint-community/regexpp": 4.5.1 + "@typescript-eslint/parser": 5.61.0(eslint@8.44.0)(typescript@5.1.6) + "@typescript-eslint/scope-manager": 5.61.0 + "@typescript-eslint/type-utils": 5.61.0(eslint@8.44.0)(typescript@5.1.6) + "@typescript-eslint/utils": 5.61.0(eslint@8.44.0)(typescript@5.1.6) + debug: 4.3.4 + eslint: 8.44.0 + graphemer: 1.4.0 + ignore: 5.2.4 + natural-compare-lite: 1.4.0 + semver: 7.5.3 + tsutils: 3.21.0(typescript@5.1.6) + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/parser@5.61.0(eslint@8.44.0)(typescript@5.1.6): + resolution: + { + integrity: sha512-yGr4Sgyh8uO6fSi9hw3jAFXNBHbCtKKFMdX2IkT3ZqpKmtAq3lHS4ixB/COFuAIJpwl9/AqF7j72ZDWYKmIfvg==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@typescript-eslint/scope-manager": 5.61.0 + "@typescript-eslint/types": 5.61.0 + "@typescript-eslint/typescript-estree": 5.61.0(typescript@5.1.6) + debug: 4.3.4 + eslint: 8.44.0 + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/scope-manager@5.61.0: + resolution: + { + integrity: sha512-W8VoMjoSg7f7nqAROEmTt6LoBpn81AegP7uKhhW5KzYlehs8VV0ZW0fIDVbcZRcaP3aPSW+JZFua+ysQN+m/Nw==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + "@typescript-eslint/types": 5.61.0 + "@typescript-eslint/visitor-keys": 5.61.0 + dev: false + + /@typescript-eslint/type-utils@5.61.0(eslint@8.44.0)(typescript@5.1.6): + resolution: + { + integrity: sha512-kk8u//r+oVK2Aj3ph/26XdH0pbAkC2RiSjUYhKD+PExemG4XSjpGFeyZ/QM8lBOa7O8aGOU+/yEbMJgQv/DnCg==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + eslint: "*" + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@typescript-eslint/typescript-estree": 5.61.0(typescript@5.1.6) + "@typescript-eslint/utils": 5.61.0(eslint@8.44.0)(typescript@5.1.6) + debug: 4.3.4 + eslint: 8.44.0 + tsutils: 3.21.0(typescript@5.1.6) + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/types@5.61.0: + resolution: + { + integrity: sha512-ldyueo58KjngXpzloHUog/h9REmHl59G1b3a5Sng1GfBo14BkS3ZbMEb3693gnP1k//97lh7bKsp6/V/0v1veQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dev: false + + /@typescript-eslint/typescript-estree@5.61.0(typescript@5.1.6): + resolution: + { + integrity: sha512-Fud90PxONnnLZ36oR5ClJBLTLfU4pIWBmnvGwTbEa2cXIqj70AEDEmOmpkFComjBZ/037ueKrOdHuYmSFVD7Rw==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@typescript-eslint/types": 5.61.0 + "@typescript-eslint/visitor-keys": 5.61.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.3 + tsutils: 3.21.0(typescript@5.1.6) + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/utils@5.61.0(eslint@8.44.0)(typescript@5.1.6): + resolution: + { + integrity: sha512-mV6O+6VgQmVE6+xzlA91xifndPW9ElFW8vbSF0xCT/czPXVhwDewKila1jOyRwa9AE19zKnrr7Cg5S3pJVrTWQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + "@eslint-community/eslint-utils": 4.4.0(eslint@8.44.0) + "@types/json-schema": 7.0.12 + "@types/semver": 7.5.0 + "@typescript-eslint/scope-manager": 5.61.0 + "@typescript-eslint/types": 5.61.0 + "@typescript-eslint/typescript-estree": 5.61.0(typescript@5.1.6) + eslint: 8.44.0 + eslint-scope: 5.1.1 + semver: 7.5.3 + transitivePeerDependencies: + - supports-color + - typescript + dev: false + + /@typescript-eslint/visitor-keys@5.61.0: + resolution: + { + integrity: sha512-50XQ5VdbWrX06mQXhy93WywSFZZGsv3EOjq+lqp6WC2t+j3mb6A9xYVdrRxafvK88vg9k9u+CT4l6D8PEatjKg==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + "@typescript-eslint/types": 5.61.0 + eslint-visitor-keys: 3.4.1 + dev: false + + /acorn-jsx@5.3.2(acorn@8.9.0): + resolution: + { + integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, + } + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.9.0 + + /acorn-walk@8.2.0: + resolution: + { + integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==, + } + engines: { node: ">=0.4.0" } + dev: true + + /acorn@8.9.0: + resolution: + { + integrity: sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==, + } + engines: { node: ">=0.4.0" } + hasBin: true + + /ajv@6.12.6: + resolution: + { + integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, + } + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + /ansi-regex@5.0.1: + resolution: + { + integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, + } + engines: { node: ">=8" } + + /ansi-styles@4.3.0: + resolution: + { + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, + } + engines: { node: ">=8" } + dependencies: + color-convert: 2.0.1 + + /anymatch@3.1.3: + resolution: + { + integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, + } + engines: { node: ">= 8" } + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /argparse@2.0.1: + resolution: + { + integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, + } + + /array-union@2.1.0: + resolution: + { + integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, + } + engines: { node: ">=8" } + dev: false + + /as-table@1.0.55: + resolution: + { + integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==, + } + dependencies: + printable-characters: 1.0.42 + dev: true + + /balanced-match@1.0.2: + resolution: + { + integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, + } + + /base64-js@1.5.1: + resolution: + { + integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, + } + dev: true + + /better-sqlite3@8.4.0: + resolution: + { + integrity: sha512-NmsNW1CQvqMszu/CFAJ3pLct6NEFlNfuGM6vw72KHkjOD1UDnL96XNN1BMQc1hiHo8vE2GbOWQYIpZ+YM5wrZw==, + } + requiresBuild: true + dependencies: + bindings: 1.5.0 + prebuild-install: 7.1.1 + dev: true + + /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: true + + /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: true + + /blake3-wasm@2.1.5: + resolution: + { + integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==, + } + dev: true + + /brace-expansion@1.1.11: + resolution: + { + integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, + } + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /braces@3.0.2: + resolution: + { + integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==, + } + engines: { node: ">=8" } + dependencies: + fill-range: 7.0.1 + + /buffer-from@1.1.2: + resolution: + { + integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, + } + dev: true + + /buffer@5.7.1: + resolution: + { + integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, + } + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + + /busboy@1.6.0: + resolution: + { + integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==, + } + engines: { node: ">=10.16.0" } + dependencies: + streamsearch: 1.1.0 + dev: true + + /callsites@3.1.0: + resolution: + { + integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, + } + engines: { node: ">=6" } + + /capnp-ts@0.7.0: + resolution: + { + integrity: sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==, + } + dependencies: + debug: 4.3.4 + tslib: 2.6.0 + transitivePeerDependencies: + - supports-color + dev: true + + /chalk@4.1.2: + resolution: + { + integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, + } + engines: { node: ">=10" } + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /chokidar@3.5.3: + resolution: + { + integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, + } + engines: { node: ">= 8.10.0" } + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /chownr@1.1.4: + resolution: + { + integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==, + } + dev: true + + /color-convert@2.0.1: + resolution: + { + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, + } + engines: { node: ">=7.0.0" } + dependencies: + color-name: 1.1.4 + + /color-name@1.1.4: + resolution: + { + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, + } + + /concat-map@0.0.1: + resolution: + { + integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, + } + + /cookie@0.5.0: + resolution: + { + integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==, + } + engines: { node: ">= 0.6" } + dev: true + + /cross-spawn@7.0.3: + resolution: + { + integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, + } + engines: { node: ">= 8" } + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + /data-uri-to-buffer@2.0.2: + resolution: + { + integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==, + } + dev: true + + /debug@4.3.4: + resolution: + { + integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, + } + engines: { node: ">=6.0" } + peerDependencies: + supports-color: "*" + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /decompress-response@6.0.0: + resolution: + { + integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==, + } + engines: { node: ">=10" } + dependencies: + mimic-response: 3.1.0 + dev: true + + /deep-extend@0.6.0: + resolution: + { + integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==, + } + engines: { node: ">=4.0.0" } + dev: true + + /deep-is@0.1.4: + resolution: + { + integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, + } + + /detect-libc@2.0.1: + resolution: + { + integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==, + } + engines: { node: ">=8" } + dev: true + + /dir-glob@3.0.1: + resolution: + { + integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, + } + engines: { node: ">=8" } + dependencies: + path-type: 4.0.0 + dev: false + + /doctrine@3.0.0: + resolution: + { + integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==, + } + engines: { node: ">=6.0.0" } + dependencies: + esutils: 2.0.3 + + /end-of-stream@1.4.4: + resolution: + { + integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, + } + dependencies: + once: 1.4.0 + dev: true + + /esbuild@0.16.3: + resolution: + { + integrity: sha512-71f7EjPWTiSguen8X/kxEpkAS7BFHwtQKisCDDV3Y4GLGWBaoSCyD5uXkaUew6JDzA9FEN1W23mdnSwW9kqCeg==, + } + engines: { node: ">=12" } + hasBin: true + requiresBuild: true + optionalDependencies: + "@esbuild/android-arm": 0.16.3 + "@esbuild/android-arm64": 0.16.3 + "@esbuild/android-x64": 0.16.3 + "@esbuild/darwin-arm64": 0.16.3 + "@esbuild/darwin-x64": 0.16.3 + "@esbuild/freebsd-arm64": 0.16.3 + "@esbuild/freebsd-x64": 0.16.3 + "@esbuild/linux-arm": 0.16.3 + "@esbuild/linux-arm64": 0.16.3 + "@esbuild/linux-ia32": 0.16.3 + "@esbuild/linux-loong64": 0.16.3 + "@esbuild/linux-mips64el": 0.16.3 + "@esbuild/linux-ppc64": 0.16.3 + "@esbuild/linux-riscv64": 0.16.3 + "@esbuild/linux-s390x": 0.16.3 + "@esbuild/linux-x64": 0.16.3 + "@esbuild/netbsd-x64": 0.16.3 + "@esbuild/openbsd-x64": 0.16.3 + "@esbuild/sunos-x64": 0.16.3 + "@esbuild/win32-arm64": 0.16.3 + "@esbuild/win32-ia32": 0.16.3 + "@esbuild/win32-x64": 0.16.3 + dev: true + + /escape-string-regexp@4.0.0: + resolution: + { + integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, + } + engines: { node: ">=10" } + + /eslint-config-google@0.14.0(eslint@8.44.0): + resolution: + { + integrity: sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==, + } + engines: { node: ">=0.10.0" } + peerDependencies: + eslint: ">=5.16.0" + dependencies: + eslint: 8.44.0 + dev: true + + /eslint-plugin-json@3.1.0: + resolution: + { + integrity: sha512-MrlG2ynFEHe7wDGwbUuFPsaT2b1uhuEFhJ+W1f1u+1C2EkXmTYJp4B1aAdQQ8M+CC3t//N/oRKiIVw14L2HR1g==, + } + engines: { node: ">=12.0" } + dependencies: + lodash: 4.17.21 + vscode-json-languageservice: 4.2.1 + dev: true + + /eslint-scope@5.1.1: + resolution: + { + integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==, + } + engines: { node: ">=8.0.0" } + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: false + + /eslint-scope@7.2.0: + resolution: + { + integrity: sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + /eslint-visitor-keys@3.4.1: + resolution: + { + integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + + /eslint@8.44.0: + resolution: + { + integrity: sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + hasBin: true + dependencies: + "@eslint-community/eslint-utils": 4.4.0(eslint@8.44.0) + "@eslint-community/regexpp": 4.5.1 + "@eslint/eslintrc": 2.1.0 + "@eslint/js": 8.44.0 + "@humanwhocodes/config-array": 0.11.10 + "@humanwhocodes/module-importer": 1.0.1 + "@nodelib/fs.walk": 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.0 + eslint-visitor-keys: 3.4.1 + espree: 9.6.0 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.20.0 + graphemer: 1.4.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + /espree@9.6.0: + resolution: + { + integrity: sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + acorn: 8.9.0 + acorn-jsx: 5.3.2(acorn@8.9.0) + eslint-visitor-keys: 3.4.1 + + /esquery@1.5.0: + resolution: + { + integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==, + } + engines: { node: ">=0.10" } + dependencies: + estraverse: 5.3.0 + + /esrecurse@4.3.0: + resolution: + { + integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, + } + engines: { node: ">=4.0" } + dependencies: + estraverse: 5.3.0 + + /estraverse@4.3.0: + resolution: + { + integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==, + } + engines: { node: ">=4.0" } + dev: false + + /estraverse@5.3.0: + resolution: + { + integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, + } + engines: { node: ">=4.0" } + + /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" } + + /exit-hook@2.2.1: + resolution: + { + integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==, + } + engines: { node: ">=6" } + dev: true + + /expand-template@2.0.3: + resolution: + { + integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==, + } + engines: { node: ">=6" } + dev: true + + /fast-deep-equal@3.1.3: + resolution: + { + integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, + } + + /fast-glob@3.3.0: + resolution: + { + integrity: sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==, + } + engines: { node: ">=8.6.0" } + dependencies: + "@nodelib/fs.stat": 2.0.5 + "@nodelib/fs.walk": 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: false + + /fast-json-stable-stringify@2.1.0: + resolution: + { + integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, + } + + /fast-levenshtein@2.0.6: + resolution: + { + integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, + } + + /fastq@1.15.0: + resolution: + { + integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==, + } + dependencies: + reusify: 1.0.4 + + /file-entry-cache@6.0.1: + resolution: + { + integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==, + } + engines: { node: ^10.12.0 || >=12.0.0 } + dependencies: + flat-cache: 3.0.4 + + /file-uri-to-path@1.0.0: + resolution: + { + integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==, + } + dev: true + + /fill-range@7.0.1: + resolution: + { + integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==, + } + engines: { node: ">=8" } + dependencies: + to-regex-range: 5.0.1 + + /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 + + /flat-cache@3.0.4: + resolution: + { + integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==, + } + engines: { node: ^10.12.0 || >=12.0.0 } + dependencies: + flatted: 3.2.7 + rimraf: 3.0.2 + + /flatted@3.2.7: + resolution: + { + integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==, + } + + /fs-constants@1.0.0: + resolution: + { + integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==, + } + dev: true + + /fs.realpath@1.0.0: + resolution: + { + integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, + } + + /fsevents@2.3.2: + resolution: + { + integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==, + } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + os: [darwin] + requiresBuild: true + dev: true optional: true - dev: true - - /xxhash-wasm@1.0.2: - resolution: {integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==} - dev: true - - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - - /youch@3.2.3: - resolution: {integrity: sha512-ZBcWz/uzZaQVdCvfV4uk616Bbpf2ee+F/AvuKDR5EwX/Y4v06xWdtMluqTD7+KlZdM93lLm9gMZYo0sKBS0pgw==} - dependencies: - cookie: 0.5.0 - mustache: 4.2.0 - stacktracey: 2.1.8 - dev: true - - /zod@3.21.4: - resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} - dev: true + + /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 + + /github-from-package@0.0.0: + resolution: + { + integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==, + } + dev: true + + /glob-parent@5.1.2: + resolution: + { + integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, + } + engines: { node: ">= 6" } + dependencies: + is-glob: 4.0.3 + + /glob-parent@6.0.2: + resolution: + { + integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, + } + engines: { node: ">=10.13.0" } + dependencies: + is-glob: 4.0.3 + + /glob-to-regexp@0.4.1: + resolution: + { + integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==, + } + dev: true + + /glob@7.2.3: + resolution: + { + integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, + } + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /globals@13.20.0: + resolution: + { + integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==, + } + engines: { node: ">=8" } + dependencies: + type-fest: 0.20.2 + + /globby@11.1.0: + resolution: + { + integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, + } + engines: { node: ">=10" } + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.0 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: false + + /graphemer@1.4.0: + resolution: + { + integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, + } + + /has-flag@4.0.0: + resolution: + { + integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, + } + engines: { node: ">=8" } + + /http-cache-semantics@4.1.1: + resolution: + { + integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==, + } + dev: true + + /ieee754@1.2.1: + resolution: + { + integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, + } + dev: true + + /ignore@5.2.4: + resolution: + { + integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==, + } + engines: { node: ">= 4" } + + /import-fresh@3.3.0: + resolution: + { + integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, + } + engines: { node: ">=6" } + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + /imurmurhash@0.1.4: + resolution: + { + integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, + } + engines: { node: ">=0.8.19" } + + /inflight@1.0.6: + resolution: + { + integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, + } + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits@2.0.4: + resolution: + { + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, + } + + /ini@1.3.8: + resolution: + { + integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, + } + dev: true + + /is-binary-path@2.1.0: + resolution: + { + integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, + } + engines: { node: ">=8" } + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-extglob@2.1.1: + resolution: + { + integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, + } + engines: { node: ">=0.10.0" } + + /is-glob@4.0.3: + resolution: + { + integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, + } + engines: { node: ">=0.10.0" } + dependencies: + is-extglob: 2.1.1 + + /is-number@7.0.0: + resolution: + { + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, + } + engines: { node: ">=0.12.0" } + + /is-path-inside@3.0.3: + resolution: + { + integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, + } + engines: { node: ">=8" } + + /isexe@2.0.0: + resolution: + { + integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, + } + + /itty-router@4.0.13: + resolution: + { + integrity: sha512-iiQ9k1nQgaal/MteVft5pwYkvzuZx3idPT9tYpKWl7rKH74tyz5VVSVUCXUO0iBh5HDXjHYsix90UrFKPfThHg==, + } + dev: false + + /js-yaml@4.1.0: + resolution: + { + integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, + } + hasBin: true + dependencies: + argparse: 2.0.1 + + /json-schema-traverse@0.4.1: + resolution: + { + integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, + } + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: + { + integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, + } + + /jsonc-parser@3.2.0: + resolution: + { + integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==, + } + dev: true + + /kleur@4.1.5: + resolution: + { + integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==, + } + engines: { node: ">=6" } + dev: true + + /levn@0.4.1: + resolution: + { + integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, + } + engines: { node: ">= 0.8.0" } + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + /locate-path@6.0.0: + resolution: + { + integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, + } + engines: { node: ">=10" } + dependencies: + p-locate: 5.0.0 + + /lodash.merge@4.6.2: + resolution: + { + integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, + } + + /lodash@4.17.21: + resolution: + { + integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, + } + dev: true + + /lru-cache@6.0.0: + resolution: + { + integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, + } + engines: { node: ">=10" } + dependencies: + yallist: 4.0.0 + + /magic-string@0.25.9: + resolution: + { + integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==, + } + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /merge2@1.4.1: + resolution: + { + integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, + } + engines: { node: ">= 8" } + dev: false + + /micromatch@4.0.5: + resolution: + { + integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, + } + engines: { node: ">=8.6" } + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: false + + /mime@3.0.0: + resolution: + { + integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==, + } + engines: { node: ">=10.0.0" } + hasBin: true + dev: true + + /mimic-response@3.1.0: + resolution: + { + integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==, + } + engines: { node: ">=10" } + dev: true + + /miniflare@3.0.2: + resolution: + { + integrity: sha512-tSwmK+JPwHsV2KR7/dSZFGtTF/2M30OShjPDY7e5lAxyGE8SkHqXn/ckjg2TVltc9B8rXCSffMnCfYW1pH7R4A==, + } + engines: { node: ">=16.13" } + dependencies: + acorn: 8.9.0 + acorn-walk: 8.2.0 + better-sqlite3: 8.4.0 + capnp-ts: 0.7.0 + exit-hook: 2.2.1 + glob-to-regexp: 0.4.1 + http-cache-semantics: 4.1.1 + kleur: 4.1.5 + source-map-support: 0.5.21 + stoppable: 1.1.0 + undici: 5.22.1 + workerd: 1.20230518.0 + ws: 8.13.0 + youch: 3.2.3 + zod: 3.21.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 + + /minimist@1.2.8: + resolution: + { + integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, + } + dev: true + + /mkdirp-classic@0.5.3: + resolution: + { + integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==, + } + dev: true + + /ms@2.1.2: + resolution: + { + integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, + } + + /mustache@4.2.0: + resolution: + { + integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==, + } + hasBin: true + dev: true + + /nanoid@3.3.6: + resolution: + { + integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==, + } + 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==, + } + dev: true + + /natural-compare-lite@1.4.0: + resolution: + { + integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==, + } + dev: false + + /natural-compare@1.4.0: + resolution: + { + integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, + } + + /node-abi@3.45.0: + resolution: + { + integrity: sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==, + } + engines: { node: ">=10" } + dependencies: + semver: 7.5.3 + dev: true + + /node-forge@1.3.1: + resolution: + { + integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==, + } + engines: { node: ">= 6.13.0" } + dev: true + + /normalize-path@3.0.0: + resolution: + { + integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, + } + engines: { node: ">=0.10.0" } + dev: true + + /once@1.4.0: + resolution: + { + integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, + } + dependencies: + wrappy: 1.0.2 + + /optionator@0.9.3: + resolution: + { + integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==, + } + engines: { node: ">= 0.8.0" } + dependencies: + "@aashutoshrathi/word-wrap": 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + + /p-limit@3.1.0: + resolution: + { + integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, + } + engines: { node: ">=10" } + dependencies: + yocto-queue: 0.1.0 + + /p-locate@5.0.0: + resolution: + { + integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, + } + engines: { node: ">=10" } + dependencies: + p-limit: 3.1.0 + + /parent-module@1.0.1: + resolution: + { + integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, + } + engines: { node: ">=6" } + dependencies: + callsites: 3.1.0 + + /path-exists@4.0.0: + resolution: + { + integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, + } + engines: { node: ">=8" } + + /path-is-absolute@1.0.1: + resolution: + { + integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, + } + engines: { node: ">=0.10.0" } + + /path-key@3.1.1: + resolution: + { + integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, + } + engines: { node: ">=8" } + + /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" } + dev: false + + /picomatch@2.3.1: + resolution: + { + integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, + } + engines: { node: ">=8.6" } + + /prebuild-install@7.1.1: + resolution: + { + integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==, + } + engines: { node: ">=10" } + hasBin: true + dependencies: + detect-libc: 2.0.1 + 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.45.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: true + + /prelude-ls@1.2.1: + resolution: + { + integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, + } + engines: { node: ">= 0.8.0" } + + /prettier@2.8.8: + resolution: + { + integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==, + } + engines: { node: ">=10.13.0" } + hasBin: true + dev: false + + /printable-characters@1.0.42: + resolution: + { + integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==, + } + dev: true + + /pump@3.0.0: + resolution: + { + integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==, + } + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + + /punycode@2.3.0: + resolution: + { + integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==, + } + engines: { node: ">=6" } + + /queue-microtask@1.2.3: + resolution: + { + integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, + } + + /range-parser@1.2.1: + resolution: + { + integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==, + } + engines: { node: ">= 0.6" } + dev: false + + /rc@1.2.8: + resolution: + { + integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==, + } + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: true + + /readable-stream@3.6.2: + resolution: + { + integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, + } + engines: { node: ">= 6" } + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: true + + /readdirp@3.6.0: + resolution: + { + integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, + } + engines: { node: ">=8.10.0" } + dependencies: + picomatch: 2.3.1 + dev: true + + /render2@1.2.1: + resolution: + { + integrity: sha512-HfLOYtG6p6jx6GG6uub7YGJ4iv+GlOwFmDtGdtSe2NQJ6peMZ0u76k7GAZ0z7GSf4e9UfeCcQxme4Mayh7DLqw==, + } + dependencies: + range-parser: 1.2.1 + dev: false + + /resolve-from@4.0.0: + resolution: + { + integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, + } + engines: { node: ">=4" } + + /reusify@1.0.4: + resolution: + { + integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, + } + engines: { iojs: ">=1.0.0", node: ">=0.10.0" } + + /rimraf@3.0.2: + resolution: + { + integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, + } + hasBin: true + dependencies: + glob: 7.2.3 + + /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. + 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 + dev: true + + /run-parallel@1.2.0: + resolution: + { + integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, + } + dependencies: + queue-microtask: 1.2.3 + + /safe-buffer@5.2.1: + resolution: + { + integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, + } + dev: true + + /selfsigned@2.1.1: + resolution: + { + integrity: sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==, + } + engines: { node: ">=10" } + dependencies: + node-forge: 1.3.1 + dev: true + + /semver@7.5.3: + resolution: + { + integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==, + } + engines: { node: ">=10" } + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /shebang-command@2.0.0: + resolution: + { + integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, + } + engines: { node: ">=8" } + dependencies: + shebang-regex: 3.0.0 + + /shebang-regex@3.0.0: + resolution: + { + integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, + } + engines: { node: ">=8" } + + /simple-concat@1.0.1: + resolution: + { + integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==, + } + dev: true + + /simple-get@4.0.1: + resolution: + { + integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==, + } + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: true + + /slash@3.0.0: + resolution: + { + integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==, + } + engines: { node: ">=8" } + dev: false + + /source-map-support@0.5.21: + resolution: + { + integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, + } + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map@0.6.1: + resolution: + { + integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, + } + engines: { node: ">=0.10.0" } + dev: true + + /source-map@0.7.4: + resolution: + { + integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==, + } + engines: { node: ">= 8" } + dev: true + + /sourcemap-codec@1.4.8: + resolution: + { + integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==, + } + deprecated: Please use @jridgewell/sourcemap-codec instead + dev: true + + /stacktracey@2.1.8: + resolution: + { + integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==, + } + dependencies: + as-table: 1.0.55 + get-source: 2.0.12 + dev: true + + /stoppable@1.1.0: + resolution: + { + integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==, + } + engines: { node: ">=4", npm: ">=6" } + dev: true + + /streamsearch@1.1.0: + resolution: + { + integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==, + } + engines: { node: ">=10.0.0" } + dev: true + + /string_decoder@1.3.0: + resolution: + { + integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, + } + dependencies: + safe-buffer: 5.2.1 + dev: true + + /strip-ansi@6.0.1: + resolution: + { + integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, + } + engines: { node: ">=8" } + dependencies: + ansi-regex: 5.0.1 + + /strip-json-comments@2.0.1: + resolution: + { + integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==, + } + engines: { node: ">=0.10.0" } + dev: true + + /strip-json-comments@3.1.1: + resolution: + { + integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, + } + engines: { node: ">=8" } + + /supports-color@7.2.0: + resolution: + { + integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, + } + engines: { node: ">=8" } + dependencies: + has-flag: 4.0.0 + + /tar-fs@2.1.1: + resolution: + { + integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==, + } + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: true + + /tar-stream@2.2.0: + resolution: + { + integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==, + } + engines: { node: ">=6" } + 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: true + + /text-table@0.2.0: + resolution: + { + integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, + } + + /to-regex-range@5.0.1: + resolution: + { + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, + } + engines: { node: ">=8.0" } + dependencies: + is-number: 7.0.0 + + /tslib@1.14.1: + resolution: + { + integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==, + } + dev: false + + /tslib@2.6.0: + resolution: + { + integrity: sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==, + } + dev: true + + /tsutils@3.21.0(typescript@5.1.6): + resolution: + { + integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==, + } + engines: { node: ">= 6" } + peerDependencies: + typescript: ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + dependencies: + tslib: 1.14.1 + typescript: 5.1.6 + dev: false + + /tunnel-agent@0.6.0: + resolution: + { + integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==, + } + dependencies: + safe-buffer: 5.2.1 + dev: true + + /type-check@0.4.0: + resolution: + { + integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, + } + engines: { node: ">= 0.8.0" } + dependencies: + prelude-ls: 1.2.1 + + /type-fest@0.20.2: + resolution: + { + integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==, + } + engines: { node: ">=10" } + + /typescript@5.1.6: + resolution: + { + integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==, + } + engines: { node: ">=14.17" } + hasBin: true + + /undici@5.22.1: + resolution: + { + integrity: sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==, + } + engines: { node: ">=14.0" } + dependencies: + busboy: 1.6.0 + dev: true + + /uri-js@4.4.1: + resolution: + { + integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, + } + dependencies: + punycode: 2.3.0 + + /util-deprecate@1.0.2: + resolution: + { + integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, + } + dev: true + + /vscode-json-languageservice@4.2.1: + resolution: + { + integrity: sha512-xGmv9QIWs2H8obGbWg+sIPI/3/pFgj/5OWBhNzs00BkYQ9UaB2F6JJaGB/2/YOZJ3BvLXQTC4Q7muqU25QgAhA==, + } + dependencies: + jsonc-parser: 3.2.0 + vscode-languageserver-textdocument: 1.0.8 + vscode-languageserver-types: 3.17.3 + vscode-nls: 5.2.0 + vscode-uri: 3.0.7 + dev: true + + /vscode-languageserver-textdocument@1.0.8: + resolution: + { + integrity: sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==, + } + dev: true + + /vscode-languageserver-types@3.17.3: + resolution: + { + integrity: sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA==, + } + dev: true + + /vscode-nls@5.2.0: + resolution: + { + integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==, + } + dev: true + + /vscode-uri@3.0.7: + resolution: + { + integrity: sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==, + } + dev: true + + /which@2.0.2: + resolution: + { + integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, + } + engines: { node: ">= 8" } + hasBin: true + dependencies: + isexe: 2.0.0 + + /workerd@1.20230518.0: + resolution: + { + integrity: sha512-VNmK0zoNZXrwEEx77O/oQDVUzzyDjf5kKKK8bty+FmKCd5EQJCpqi8NlRKWLGMyyYrKm86MFz0kAsreTEs7HHA==, + } + engines: { node: ">=16" } + hasBin: true + requiresBuild: true + optionalDependencies: + "@cloudflare/workerd-darwin-64": 1.20230518.0 + "@cloudflare/workerd-darwin-arm64": 1.20230518.0 + "@cloudflare/workerd-linux-64": 1.20230518.0 + "@cloudflare/workerd-linux-arm64": 1.20230518.0 + "@cloudflare/workerd-windows-64": 1.20230518.0 + dev: true + + /wrangler@3.1.1: + resolution: + { + integrity: sha512-iG6QGOt+qgSm7UroJ8IJ+JdXEcDcW7yp9ilP0V7alCGhKm8shqa/M1iyMOpukZSCSZo8Vmn5nH2C9OY1PR3dQQ==, + } + engines: { node: ">=16.13.0" } + hasBin: true + dependencies: + "@cloudflare/kv-asset-handler": 0.2.0 + "@esbuild-plugins/node-globals-polyfill": 0.1.1(esbuild@0.16.3) + "@esbuild-plugins/node-modules-polyfill": 0.1.4(esbuild@0.16.3) + blake3-wasm: 2.1.5 + chokidar: 3.5.3 + esbuild: 0.16.3 + miniflare: 3.0.2 + nanoid: 3.3.6 + path-to-regexp: 6.2.1 + selfsigned: 2.1.1 + source-map: 0.7.4 + xxhash-wasm: 1.0.2 + optionalDependencies: + fsevents: 2.3.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /wrappy@1.0.2: + resolution: + { + integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, + } + + /ws@8.13.0: + resolution: + { + integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==, + } + engines: { node: ">=10.0.0" } + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + + /xxhash-wasm@1.0.2: + resolution: + { + integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==, + } + dev: true + + /yallist@4.0.0: + resolution: + { + integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, + } + + /yocto-queue@0.1.0: + resolution: + { + integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, + } + engines: { node: ">=10" } + + /youch@3.2.3: + resolution: + { + integrity: sha512-ZBcWz/uzZaQVdCvfV4uk616Bbpf2ee+F/AvuKDR5EwX/Y4v06xWdtMluqTD7+KlZdM93lLm9gMZYo0sKBS0pgw==, + } + dependencies: + cookie: 0.5.0 + mustache: 4.2.0 + stacktracey: 2.1.8 + dev: true + + /zod@3.21.4: + resolution: + { + integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==, + } + dev: true diff --git a/src/lib/query.ts b/src/lib/query.ts new file mode 100644 index 0000000..aff6c2d --- /dev/null +++ b/src/lib/query.ts @@ -0,0 +1,103 @@ +import type { Asset } from "@/lib/types/asset"; + +export const getSearchResults = async ( + query: string, + game: string[], + asset: string[], + tags: string[], + env: Env +): Promise => { + let sqlQuery = `SELECT * FROM assets WHERE 1=1`; + const parameters = []; + + sqlQuery = addQueryToSqlQuery(query, sqlQuery, parameters); + sqlQuery = addGameToSqlQuery(game, sqlQuery, parameters); + sqlQuery = addAssetToSqlQuery(asset, sqlQuery, parameters); + sqlQuery = addTagsToSqlQuery(tags, sqlQuery, parameters); + + sqlQuery += ` ORDER BY uploadedDate DESC`; + + sqlQuery = limitResults(sqlQuery, game, asset, tags); + + if (!query && !game.length && !asset.length && !tags.length) { + sqlQuery = `SELECT * FROM assets ORDER BY uploadedDate DESC LIMIT 30`; + } + + const row: D1Result = await env.database + .prepare(sqlQuery) + .bind(...parameters) + .run(); + + return row.results.map((result) => ({ + id: result.id, + name: result.name, + game: result.game, + asset: result.asset, + tags: result.tags, + url: result.url, + verified: result.verified, + uploadedBy: result.uploadedBy, + uploadedDate: result.uploadedDate, + fileSize: result.fileSize, + })); +}; + +const addQueryToSqlQuery = ( + query: string, + sqlQuery: string, + parameters: any[] +): string => { + if (query) { + sqlQuery += ` AND name LIKE ?`; + parameters.push(`%${query}%`); + } + return sqlQuery; +}; + +const addGameToSqlQuery = ( + game: string[], + sqlQuery: string, + parameters: any[] +): string => { + if (game.length) { + sqlQuery += ` AND game IN (${game.map(() => "?").join(",")})`; + parameters.push(...game); + } + return sqlQuery; +}; + +const addAssetToSqlQuery = ( + asset: string[], + sqlQuery: string, + parameters: any[] +): string => { + if (asset.length) { + sqlQuery += ` AND asset IN (${asset.map(() => "?").join(",")})`; + parameters.push(...asset); + } + return sqlQuery; +}; + +const addTagsToSqlQuery = ( + tags: string[], + sqlQuery: string, + parameters: any[] +): string => { + if (tags.length) { + sqlQuery += ` AND tags IN (${tags.map(() => "?").join(",")})`; + parameters.push(...tags); + } + return sqlQuery; +}; + +const limitResults = ( + sqlQuery: string, + game: string[], + asset: string[], + tags: string[] +): string => { + // if (game.length > 1 || asset.length > 1 || tags.length > 1) { + // sqlQuery += ` LIMIT 2500`; + // } + return (sqlQuery += ` LIMIT 2500`); +}; diff --git a/src/routes/search/search.ts b/src/routes/search/search.ts index ea106b4..774c081 100644 --- a/src/routes/search/search.ts +++ b/src/routes/search/search.ts @@ -1,5 +1,6 @@ import { responseHeaders } from "@/lib/responseHeaders"; import type { Asset } from "@/lib/types/asset"; +import * as queryLib from "@/lib/query"; export const getSearch = async ( request: Request, @@ -10,70 +11,16 @@ export const getSearch = async ( const game = url.searchParams.get("game")?.split(",") || []; const asset = url.searchParams.get("asset")?.split(",") || []; const tags = url.searchParams.get("tags")?.split(",") || []; - let results: Asset[] = []; - - const cacheKey = new Request(url.toString(), request); - const cache = caches.default; - let response = await cache.match(cacheKey); - - if (response) { - return response; - } - - const parameters = []; - let sqlQuery = `SELECT * FROM assets WHERE 1=1`; - - if (query) { - sqlQuery += ` AND name LIKE ?`; - parameters.push(`%${query}%`); - } - - if (game.length) { - sqlQuery += ` AND game IN (${game.map(() => "?").join(",")})`; - parameters.push(...game); - } - - if (asset.length) { - sqlQuery += ` AND asset IN (${asset.map(() => "?").join(",")})`; - parameters.push(...asset); - } - - sqlQuery += tags.length - ? ` AND tags IN (${tags.map(() => "?").join(",")})` - : ""; - tags.length && parameters.push(...tags); - - sqlQuery += ` ORDER BY uploadedDate DESC`; - - // if there are more than 1 game or asset, limited to 2500 results to prevent abuse of the API - if (game.length > 1 || asset.length > 1) { - sqlQuery += ` LIMIT 2500`; - } - // if no parameters are entered, return 30 most recent results instead of all results - if (!query && !game.length && !asset.length && !tags.length) { - sqlQuery = `SELECT * FROM assets ORDER BY uploadedDate DESC LIMIT 30`; - } - - const row: D1Result = await env.database - .prepare(sqlQuery) - .bind(...parameters) - .run(); - - results = row.results.map((result) => ({ - id: result.id, - name: result.name, - game: result.game, - asset: result.asset, - tags: result.tags, - url: result.url, - verified: result.verified, - uploadedBy: result.uploadedBy, - uploadedDate: result.uploadedDate, - fileSize: result.fileSize, - })); + const results = await queryLib.getSearchResults( + query, + game, + asset, + tags, + env + ); - response = new Response( + const response = new Response( JSON.stringify({ success: true, status: "ok", From c43cab75b60b68f97e71b52f8b1c4cee2a817254 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Mon, 3 Jul 2023 19:49:17 +0100 Subject: [PATCH 024/318] create `queryParameter` type --- src/lib/query.ts | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/lib/query.ts b/src/lib/query.ts index aff6c2d..9bf2d4b 100644 --- a/src/lib/query.ts +++ b/src/lib/query.ts @@ -1,5 +1,7 @@ import type { Asset } from "@/lib/types/asset"; +type queryParameter = string | number; + export const getSearchResults = async ( query: string, game: string[], @@ -17,7 +19,7 @@ export const getSearchResults = async ( sqlQuery += ` ORDER BY uploadedDate DESC`; - sqlQuery = limitResults(sqlQuery, game, asset, tags); + sqlQuery = limitResults(sqlQuery); if (!query && !game.length && !asset.length && !tags.length) { sqlQuery = `SELECT * FROM assets ORDER BY uploadedDate DESC LIMIT 30`; @@ -45,7 +47,7 @@ export const getSearchResults = async ( const addQueryToSqlQuery = ( query: string, sqlQuery: string, - parameters: any[] + parameters: queryParameter[] ): string => { if (query) { sqlQuery += ` AND name LIKE ?`; @@ -57,7 +59,7 @@ const addQueryToSqlQuery = ( const addGameToSqlQuery = ( game: string[], sqlQuery: string, - parameters: any[] + parameters: queryParameter[] ): string => { if (game.length) { sqlQuery += ` AND game IN (${game.map(() => "?").join(",")})`; @@ -69,7 +71,7 @@ const addGameToSqlQuery = ( const addAssetToSqlQuery = ( asset: string[], sqlQuery: string, - parameters: any[] + parameters: queryParameter[] ): string => { if (asset.length) { sqlQuery += ` AND asset IN (${asset.map(() => "?").join(",")})`; @@ -81,7 +83,7 @@ const addAssetToSqlQuery = ( const addTagsToSqlQuery = ( tags: string[], sqlQuery: string, - parameters: any[] + parameters: queryParameter[] ): string => { if (tags.length) { sqlQuery += ` AND tags IN (${tags.map(() => "?").join(",")})`; @@ -90,12 +92,7 @@ const addTagsToSqlQuery = ( return sqlQuery; }; -const limitResults = ( - sqlQuery: string, - game: string[], - asset: string[], - tags: string[] -): string => { +const limitResults = (sqlQuery: string): string => { // if (game.length > 1 || asset.length > 1 || tags.length > 1) { // sqlQuery += ` LIMIT 2500`; // } From 01f65ff410239f99d0ed5c1c756d804a414c8a66 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Fri, 7 Jul 2023 21:46:17 +0100 Subject: [PATCH 025/318] planetscale reusable `getConnection` func --- package.json | 1 + pnpm-lock.yaml | 11 +++++++++++ src/lib/planetscale.ts | 16 ++++++++++++++++ wrangler.toml | 2 +- 4 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 src/lib/planetscale.ts diff --git a/package.json b/package.json index 89d82fd..d7fccff 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ }, "private": true, "dependencies": { + "@planetscale/database": "^1.8.0", "@typescript-eslint/eslint-plugin": "^5.61.0", "itty-router": "^4.0.13", "prettier": "^2.8.8", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0ef5daf..7663a28 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,6 +5,9 @@ settings: excludeLinksFromLockfile: false dependencies: + "@planetscale/database": + specifier: ^1.8.0 + version: 1.8.0 "@typescript-eslint/eslint-plugin": specifier: ^5.61.0 version: 5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.44.0)(typescript@5.1.6) @@ -508,6 +511,14 @@ packages: "@nodelib/fs.scandir": 2.1.5 fastq: 1.15.0 + /@planetscale/database@1.8.0: + resolution: + { + integrity: sha512-+zk04eXRiaJGaRnJZkCxXbBtBvQDQJXCoxqlXhLY3HzAovXfsBnh6DjXRujPRQQ7GKtT8/tOlyvZ9h6ReM+GLQ==, + } + engines: { node: ">=16" } + dev: false + /@types/json-schema@7.0.12: resolution: { diff --git a/src/lib/planetscale.ts b/src/lib/planetscale.ts new file mode 100644 index 0000000..67499be --- /dev/null +++ b/src/lib/planetscale.ts @@ -0,0 +1,16 @@ +import { connect } from "@planetscale/database"; + +// useful wrapper for planetscale connection +export function getConnection(env) { + const config = { + // this can be set with "wrangler secret put" or through the planetscale integration on cf dashboard + host: env.DATABASE_HOST, + username: env.DATABASE_USERNAME, + password: env.DATABASE_PASSWORD, + fetch: (url, init) => { + delete init["cache"]; + return fetch(url, init); + }, + }; + return connect(config); +} diff --git a/wrangler.toml b/wrangler.toml index 3db572e..f2203c8 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -1,4 +1,4 @@ -name = "api-wanderer-moe" +name = "api" main = "./src/index.ts" compatibility_date = "2023-04-24" From 1cce64c07a2b8db4c217a00117986ad29ba97103 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Fri, 14 Jul 2023 21:56:49 +0100 Subject: [PATCH 026/318] feat: migrate `/[download, asset]/[id]` to new DB --- .eslintrc.json | 2 +- package.json | 2 + pnpm-lock.yaml | 26 +++++++ src/lib/types/asset.ts | 14 ++-- src/routes/asset/getAssetFromId.ts | 101 ++++++++++++++-------------- src/routes/download/downloadFile.ts | 55 ++++++++------- 6 files changed, 116 insertions(+), 84 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 27eeeef..6d37209 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -5,7 +5,7 @@ "plugins": ["json"], "rules": { "no-const-assign": "error", - "camelcase": "error", + "camelcase": "off", "no-extra-semi": "error" }, "parserOptions": { diff --git a/package.json b/package.json index d7fccff..155e846 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "scripts": { "prettier": "prettier --write .", "dev": "wrangler dev --remote", + "publish": "wrangler publish --minify", "lint": "eslint . --ext .ts", "prettier:check": "prettier --check .", "typecheck": "tsc --noEmit" @@ -19,6 +20,7 @@ "private": true, "dependencies": { "@planetscale/database": "^1.8.0", + "@prisma/client": "^4.16.2", "@typescript-eslint/eslint-plugin": "^5.61.0", "itty-router": "^4.0.13", "prettier": "^2.8.8", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7663a28..97309a4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ dependencies: "@planetscale/database": specifier: ^1.8.0 version: 1.8.0 + "@prisma/client": + specifier: ^4.16.2 + version: 4.16.2 "@typescript-eslint/eslint-plugin": specifier: ^5.61.0 version: 5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.44.0)(typescript@5.1.6) @@ -519,6 +522,29 @@ packages: engines: { node: ">=16" } dev: false + /@prisma/client@4.16.2: + resolution: + { + integrity: sha512-qCoEyxv1ZrQ4bKy39GnylE8Zq31IRmm8bNhNbZx7bF2cU5aiCCnSa93J2imF88MBjn7J9eUQneNxUQVJdl/rPQ==, + } + engines: { node: ">=14.17" } + requiresBuild: true + peerDependencies: + prisma: "*" + peerDependenciesMeta: + prisma: + optional: true + dependencies: + "@prisma/engines-version": 4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81 + dev: false + + /@prisma/engines-version@4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81: + resolution: + { + integrity: sha512-q617EUWfRIDTriWADZ4YiWRZXCa/WuhNgLTVd+HqWLffjMSPzyM5uOWoauX91wvQClSKZU4pzI4JJLQ9Kl62Qg==, + } + dev: false + /@types/json-schema@7.0.12: resolution: { diff --git a/src/lib/types/asset.ts b/src/lib/types/asset.ts index d93e9e5..a4235fc 100644 --- a/src/lib/types/asset.ts +++ b/src/lib/types/asset.ts @@ -2,13 +2,13 @@ export interface Asset { id: number; name: string; game: string; - asset: string; + asset_category: string; tags: string; url: string; - verified: string; - uploadedBy: string; - uploadedDate: string; - viewCount?: number; - downloadCount?: number; - fileSize: number; + status: string; + uploaded_by: string; + uploaded_date: string; + view_count: number; + download_count: number; + file_size: number; } diff --git a/src/routes/asset/getAssetFromId.ts b/src/routes/asset/getAssetFromId.ts index 14fb032..e87e8df 100644 --- a/src/routes/asset/getAssetFromId.ts +++ b/src/routes/asset/getAssetFromId.ts @@ -1,14 +1,26 @@ import { responseHeaders } from "@/lib/responseHeaders"; import type { Asset } from "@/lib/types/asset"; +import { getConnection } from "@/lib/planetscale"; export const getAssetFromId = async ( request: Request, env: Env ): Promise => { - let row: D1Result; const url = new URL(request.url); const id = url.pathname.split("/")[2]; - console.log(id); + + if (isNaN(parseInt(id))) { + return new Response( + JSON.stringify({ + success: false, + status: "error", + error: "404 Not Found", + }), + { + headers: responseHeaders, + } + ); + } const cacheKey = new Request(url.toString(), request); const cache = caches.default; @@ -19,21 +31,18 @@ export const getAssetFromId = async ( return response; } - try { - row = await env.database - .prepare(`SELECT * FROM assets WHERE id = ?`) - .bind(id) - .run(); - } catch (e) { - throw new Error(`Error getting asset from id`); - } + const db = await getConnection(env); - if (!row.results[0]) { + const row = await db + .execute("SELECT * FROM assets WHERE id = ?", [id]) + .then((row) => row.rows[0] as Asset | undefined); + + if (!row) { return new Response( JSON.stringify({ success: false, - status: "not found", - message: "Asset not found", + status: "error", + error: "404 Not Found", }), { headers: responseHeaders, @@ -41,49 +50,39 @@ export const getAssetFromId = async ( ); } - await env.database - .prepare(`UPDATE assets SET viewCount = viewCount + 1 WHERE id = ?`) - .bind(id) - .run(); - - // doing this as we don't want to append viewCount & downloadCount - const asset: Asset = { - id: row.results[0].id, - name: row.results[0].name, - game: row.results[0].game, - asset: row.results[0].asset, - tags: row.results[0].tags, - url: row.results[0].url, - verified: row.results[0].verified, - uploadedBy: row.results[0].uploadedBy, - uploadedDate: row.results[0].uploadedDate, - fileSize: row.results[0].fileSize, + const asset = { + id: row.id, + name: row.name, + game: row.game, + assetCategory: row.asset_category, + url: row.url, + tags: row.tags, + status: row.status, + uploadedBy: row.uploaded_by, + uploadedDate: row.uploaded_date, + fileSize: row.file_size, }; - // similarAssets: random 6 random assets from the same game & asset type - const similarAssets: D1Result = await env.database - .prepare( - `SELECT * FROM assets WHERE game = ? AND asset = ? AND id != ? ORDER BY RANDOM() LIMIT 6` - ) - .bind(asset.game, asset.asset, asset.id) - .all(); - - const similarAssetsArray: Asset[] = []; - - // as above, don't want to append viewCount & downloadCount - similarAssets.results.forEach((asset) => { - similarAssetsArray.push({ + const similarAssets = await ( + await db + .execute( + "SELECT * FROM assets WHERE game = ? AND asset_category = ? AND id != ? ORDER BY RAND() LIMIT 3", + [row.game, row.asset_category, row.id] + ) + .then((row) => row.rows as Asset[]) + ).map((asset) => { + return { id: asset.id, name: asset.name, game: asset.game, - asset: asset.asset, - tags: asset.tags, + assetCategory: asset.asset_category, url: asset.url, - verified: asset.verified, - uploadedBy: asset.uploadedBy, - uploadedDate: asset.uploadedDate, - fileSize: asset.fileSize, - }); + tags: asset.tags, + status: asset.status, + uploadedBy: asset.uploaded_by, + uploadedDate: asset.uploaded_date, + fileSize: asset.file_size, + }; }); response = new Response( @@ -91,7 +90,7 @@ export const getAssetFromId = async ( success: true, status: "ok", asset, - similarAssets: similarAssetsArray, + similarAssets, }), { headers: responseHeaders, diff --git a/src/routes/download/downloadFile.ts b/src/routes/download/downloadFile.ts index 4e293c8..df77386 100644 --- a/src/routes/download/downloadFile.ts +++ b/src/routes/download/downloadFile.ts @@ -1,53 +1,58 @@ import { responseHeaders } from "@/lib/responseHeaders"; import type { Asset } from "@/lib/types/asset"; +import { getConnection } from "@/lib/planetscale"; export const downloadFile = async ( request: Request, env: Env ): Promise => { - let row: D1Result; const url = new URL(request.url); const id = url.pathname.split("/")[2]; - // console.log(id); - - try { - row = await env.database - .prepare(`SELECT * FROM assets WHERE id = ?`) - .bind(id) - .run(); - } catch (e) { - throw new Error(`Error getting asset from id`); - } - if (!row.results[0]) { + if (isNaN(parseInt(id))) { return new Response( JSON.stringify({ success: false, status: "error", - error: "no_file", + error: "404 Not Found", }), { - status: 404, headers: responseHeaders, } ); } - await env.database - .prepare( - `UPDATE assets SET downloadCount = downloadCount + 1 WHERE id = ?` - ) - .bind(id) - .run(); + const db = await getConnection(env); + + const row = await db + .execute("SELECT * FROM assets WHERE id = ?", [id]) + .then((row) => row.rows[0] as Asset | undefined); + + console.log(row); - const response = await fetch(row.results[0].url); + if (!row) { + return new Response( + JSON.stringify({ + success: false, + status: "error", + error: "404 Not Found", + }), + { + headers: responseHeaders, + } + ); + } + + const response = await fetch(`https://cdn.wanderer.moe/${row.url}`); const headers = new Headers(response.headers); - headers.set( - "Content-Disposition", - `attachment; filename="${row.results[0].name}"` - ); + headers.set("Content-Disposition", `attachment; filename="${row.name}"`); const blob = await response.blob(); + await db.execute( + "UPDATE assets SET download_count = download_count + 1 WHERE id = ?", + [id] + ); + return new Response(blob, { headers: headers, }); From e854749db562fbe60f2017d82567e1959a78c2ba Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Fri, 14 Jul 2023 22:26:29 +0100 Subject: [PATCH 027/318] feat: update `/users` routes to use new DB --- src/handler.ts | 8 +-- src/lib/types/user.ts | 18 +++--- src/routes/asset/getAssetFromId.ts | 13 +--- src/routes/download/downloadFile.ts | 13 +--- src/routes/user/getUserById.ts | 93 -------------------------- src/routes/user/getUserByUsername.ts | 97 ++++++++++++++++++++++++++++ src/routes/user/getUsersBySearch.ts | 54 +++++++--------- 7 files changed, 140 insertions(+), 156 deletions(-) delete mode 100644 src/routes/user/getUserById.ts create mode 100644 src/routes/user/getUserByUsername.ts diff --git a/src/handler.ts b/src/handler.ts index 33905dc..9960da8 100644 --- a/src/handler.ts +++ b/src/handler.ts @@ -7,8 +7,8 @@ import { getGenerator } from "@/routes/oc-generators/getGenerator"; import { getGenerators } from "@/routes/oc-generators/getGenerators"; import { getSearch, getRecentAssets } from "@/routes/search/search"; import { downloadFile } from "@/routes/download/downloadFile"; -// import { getUserById } from "@/routes/user/getUserById"; -// import { getUserBySearch } from "@/routes/user/getUsersBySearch"; +import { getUserByUsername } from "@/routes/user/getUserByUsername"; +import { getUserBySearch } from "@/routes/user/getUsersBySearch"; import { allGames } from "@/routes/games/allGames"; import { getAssetFromId } from "@/routes/asset/getAssetFromId"; @@ -17,10 +17,10 @@ const router = Router(); router .get("/", errorHandler(index)) .get("/games", errorHandler(allGames)) - // .get("/user/:id", errorHandler(getUserById)) + .get("/user/:name", errorHandler(getUserByUsername)) .get("/recent", errorHandler(getRecentAssets)) .get("/asset/:id", errorHandler(getAssetFromId)) - // .get("/user/search/:name", errorHandler(getUserBySearch)) + .get("/user/s/:name", errorHandler(getUserBySearch)) .get("/search", errorHandler(getSearch)) .get("/download/:id", errorHandler(downloadFile)) .get("/oc-generators", errorHandler(getGenerators)) diff --git a/src/lib/types/user.ts b/src/lib/types/user.ts index 6fd6790..1440767 100644 --- a/src/lib/types/user.ts +++ b/src/lib/types/user.ts @@ -1,10 +1,12 @@ export interface User { - id: number; - displayName: string; - name: string; - avatarUrl: string; - discordId: number; - bio: string; - assetsUploaded: number; - roles: string; + id: string; + avatar_url: string | null; + banner_url: string | null; + username: string; + username_colour: string; + bio: string | null; + pronouns: string | null; + verified: number; + date_joined: string; + role: string; } diff --git a/src/routes/asset/getAssetFromId.ts b/src/routes/asset/getAssetFromId.ts index e87e8df..f88d330 100644 --- a/src/routes/asset/getAssetFromId.ts +++ b/src/routes/asset/getAssetFromId.ts @@ -9,17 +9,8 @@ export const getAssetFromId = async ( const url = new URL(request.url); const id = url.pathname.split("/")[2]; - if (isNaN(parseInt(id))) { - return new Response( - JSON.stringify({ - success: false, - status: "error", - error: "404 Not Found", - }), - { - headers: responseHeaders, - } - ); + if (!id || isNaN(parseInt(id))) { + throw new Error("No ID provided"); } const cacheKey = new Request(url.toString(), request); diff --git a/src/routes/download/downloadFile.ts b/src/routes/download/downloadFile.ts index df77386..7ef27e7 100644 --- a/src/routes/download/downloadFile.ts +++ b/src/routes/download/downloadFile.ts @@ -9,17 +9,8 @@ export const downloadFile = async ( const url = new URL(request.url); const id = url.pathname.split("/")[2]; - if (isNaN(parseInt(id))) { - return new Response( - JSON.stringify({ - success: false, - status: "error", - error: "404 Not Found", - }), - { - headers: responseHeaders, - } - ); + if (!id || isNaN(parseInt(id))) { + throw new Error("No ID provided"); } const db = await getConnection(env); diff --git a/src/routes/user/getUserById.ts b/src/routes/user/getUserById.ts deleted file mode 100644 index dcf492e..0000000 --- a/src/routes/user/getUserById.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { responseHeaders } from "@/lib/responseHeaders"; -import type { User } from "@/lib/types/user"; -import type { Asset } from "@/lib/types/asset"; - -export const getUserById = async ( - request: Request, - env: Env -): Promise => { - const url = new URL(request.url); - const id = url.pathname.split("/")[2]; - - if (!id) { - return new Response( - JSON.stringify({ - success: false, - status: "error", - error: "400 Bad Request", - }), - { - headers: responseHeaders, - } - ); - } - - const cacheKey = new Request(url.toString(), request); - const cache = caches.default; - - let response = await cache.match(cacheKey); - - if (response) { - return response; - } - const row: D1Result = await env.database - .prepare(`SELECT * FROM users WHERE id = ?`) - .bind(id) - .run(); - - if (!row) { - return new Response( - JSON.stringify({ - success: false, - status: "error", - error: "404 Not Found", - }), - { - headers: responseHeaders, - } - ); - } - - const assets: D1Result = await env.database - .prepare( - `SELECT * FROM assets WHERE uploadedBy = ? ORDER BY uid DESC LIMIT 20` - ) - .bind(id) - .run(); - - const assetsUploaded = assets.results.map((asset) => ({ - id: asset.id, - name: asset.name, - tags: asset.tags, - verified: asset.verified, - uploadedDate: asset.uploadedDate, - })); - - const results = row.results.map((result) => ({ - id: result.id, - displayName: result.displayName, - name: result.name, - avatarUrl: result.avatarUrl, - discordId: result.discordId, - bio: result.bio, - assetsUploaded: result.assetsUploaded, - roles: result.roles, - recentAssets: assetsUploaded || [], - })); - - response = new Response( - JSON.stringify({ - success: true, - status: "ok", - results: results, - }), - { - headers: responseHeaders, - } - ); - - response.headers.set("Cache-Control", "s-maxage=60"); - await cache.put(cacheKey, response.clone()); - - return response; -}; diff --git a/src/routes/user/getUserByUsername.ts b/src/routes/user/getUserByUsername.ts new file mode 100644 index 0000000..f21422c --- /dev/null +++ b/src/routes/user/getUserByUsername.ts @@ -0,0 +1,97 @@ +import { responseHeaders } from "@/lib/responseHeaders"; +import type { User } from "@/lib/types/user"; +import type { Asset } from "@/lib/types/asset"; +import { getConnection } from "@/lib/planetscale"; + +export const getUserByUsername = async ( + request: Request, + env: Env +): Promise => { + const url = new URL(request.url); + const name = url.pathname.split("/")[2]; + + if (!name) { + throw new Error("No Name provided"); + } + + const cacheKey = new Request(url.toString(), request); + + const cache = caches.default; + + let response = await cache.match(cacheKey); + + if (response) { + return response; + } + + const db = await getConnection(env); + + const row = await db + .execute("SELECT * FROM auth_user WHERE username = ?", [name]) + .then((row) => row.rows[0] as User | undefined); + + const user = { + id: row.id, + username: row.username, + avatar_url: row.avatar_url || null, + banner_url: row.banner_url || null, + bio: row.bio || null, + pronouns: row.pronouns || null, + verified: row.verified, + date_joined: row.date_joined, + roles: row.role, + }; + + const uploadedAssets = await db + .execute( + "SELECT * FROM assets WHERE uploaded_by = ? ORDER BY uploaded_date DESC LIMIT 5", + [user.id] + ) + .then((row) => row.rows as Asset[] | undefined) + .then((row) => + row?.map((asset) => { + return { + id: asset.id, + name: asset.name, + game: asset.game, + assetCategory: asset.asset_category, + url: asset.url, + tags: asset.tags, + status: asset.status, + uploadedBy: asset.uploaded_by, + uploadedDate: asset.uploaded_date, + fileSize: asset.file_size, + }; + }) + ); + + if (!row) { + return new Response( + JSON.stringify({ + success: false, + status: "error", + error: "404 Not Found", + }), + { + headers: responseHeaders, + } + ); + } + + response = new Response( + JSON.stringify({ + success: true, + status: "ok", + user, + uploadedAssets, + }), + { + headers: responseHeaders, + } + ); + + response.headers.set("Cache-Control", "s-maxage=60"); + await cache.put(cacheKey, response.clone()); + + return response; +}; diff --git a/src/routes/user/getUsersBySearch.ts b/src/routes/user/getUsersBySearch.ts index b70ef45..9576cd0 100644 --- a/src/routes/user/getUsersBySearch.ts +++ b/src/routes/user/getUsersBySearch.ts @@ -1,5 +1,6 @@ import { responseHeaders } from "@/lib/responseHeaders"; import type { User } from "@/lib/types/user"; +import { getConnection } from "@/lib/planetscale"; export const getUserBySearch = async ( request: Request, @@ -16,39 +17,34 @@ export const getUserBySearch = async ( if (response) { return response; } - const row: D1Result = await env.database - .prepare( - `SELECT * FROM users WHERE displayName = ? OR name = ? OR name LIKE ?` - ) - .bind(name, name, `%${name}%`) - .run(); - if (!row.results.length) { - return new Response( - JSON.stringify({ - success: false, - status: "error", - error: "404 Not Found", - }), - { - headers: responseHeaders, - } - ); + const db = await getConnection(env); + + const row = await db + .execute("SELECT * FROM auth_user WHERE username LIKE ?", [name]) + .then((row) => row.rows as User[] | undefined); + + if (!row) { + throw new Error("No User found"); } - const results = row.results.map((result) => ({ - id: result.id, - displayName: result.displayName, - name: result.name, - url: `/user/${result.id}`, - avatarUrl: result.avatarUrl, - discordId: result.discordId, - bio: result.bio, - assetsUploaded: result.assetsUploaded, - roles: result.roles, - })); + const results = row?.map((user) => { + return { + id: user.id, + username: user.username, + avatar_url: user.avatar_url || null, + banner_url: user.banner_url || null, + bio: user.bio || null, + pronouns: user.pronouns || null, + verified: user.verified, + date_joined: user.date_joined, + roles: user.role, + }; + }); - results.sort((a, b) => (a.name === name ? -1 : b.name === name ? 1 : 0)); + results.sort((a, b) => + a.username === name ? -1 : b.username === name ? 1 : 0 + ); response = new Response( JSON.stringify({ From f0fa95e37708dde0f514a03787fdc457d23278a8 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Fri, 14 Jul 2023 23:13:43 +0100 Subject: [PATCH 028/318] feat: update search query to use new DB --- src/lib/query.ts | 42 ++++++++++-------------- src/lib/types/asset.ts | 4 +-- src/routes/search/search.ts | 65 ++++++++++++++++++++++--------------- 3 files changed, 58 insertions(+), 53 deletions(-) diff --git a/src/lib/query.ts b/src/lib/query.ts index 9bf2d4b..b377c86 100644 --- a/src/lib/query.ts +++ b/src/lib/query.ts @@ -1,4 +1,5 @@ import type { Asset } from "@/lib/types/asset"; +import { getConnection } from "@/lib/planetscale"; type queryParameter = string | number; @@ -17,31 +18,22 @@ export const getSearchResults = async ( sqlQuery = addAssetToSqlQuery(asset, sqlQuery, parameters); sqlQuery = addTagsToSqlQuery(tags, sqlQuery, parameters); - sqlQuery += ` ORDER BY uploadedDate DESC`; + sqlQuery += ` ORDER BY uploaded_date DESC`; sqlQuery = limitResults(sqlQuery); if (!query && !game.length && !asset.length && !tags.length) { - sqlQuery = `SELECT * FROM assets ORDER BY uploadedDate DESC LIMIT 30`; + sqlQuery = `SELECT * FROM assets ORDER BY uploaded_date DESC LIMIT 30`; } - const row: D1Result = await env.database - .prepare(sqlQuery) - .bind(...parameters) - .run(); + const db = await getConnection(env); - return row.results.map((result) => ({ - id: result.id, - name: result.name, - game: result.game, - asset: result.asset, - tags: result.tags, - url: result.url, - verified: result.verified, - uploadedBy: result.uploadedBy, - uploadedDate: result.uploadedDate, - fileSize: result.fileSize, - })); + console.log(sqlQuery, parameters); + const row = await db + .execute(sqlQuery, parameters) + .then((row) => row.rows as Asset[]); + + return row; }; const addQueryToSqlQuery = ( @@ -74,7 +66,9 @@ const addAssetToSqlQuery = ( parameters: queryParameter[] ): string => { if (asset.length) { - sqlQuery += ` AND asset IN (${asset.map(() => "?").join(",")})`; + sqlQuery += ` AND asset_category IN (${asset + .map(() => "?") + .join(",")})`; parameters.push(...asset); } return sqlQuery; @@ -86,15 +80,15 @@ const addTagsToSqlQuery = ( parameters: queryParameter[] ): string => { if (tags.length) { - sqlQuery += ` AND tags IN (${tags.map(() => "?").join(",")})`; + sqlQuery += ` AND tags IN (${tags + .map(() => "?") + .join(",") + .toUpperCase()})`; parameters.push(...tags); } return sqlQuery; }; const limitResults = (sqlQuery: string): string => { - // if (game.length > 1 || asset.length > 1 || tags.length > 1) { - // sqlQuery += ` LIMIT 2500`; - // } - return (sqlQuery += ` LIMIT 2500`); + return (sqlQuery += ` LIMIT 1500`); }; diff --git a/src/lib/types/asset.ts b/src/lib/types/asset.ts index a4235fc..5ade10a 100644 --- a/src/lib/types/asset.ts +++ b/src/lib/types/asset.ts @@ -8,7 +8,7 @@ export interface Asset { status: string; uploaded_by: string; uploaded_date: string; - view_count: number; - download_count: number; + view_count?: number; + download_count?: number; file_size: number; } diff --git a/src/routes/search/search.ts b/src/routes/search/search.ts index 774c081..90bd200 100644 --- a/src/routes/search/search.ts +++ b/src/routes/search/search.ts @@ -1,6 +1,7 @@ import { responseHeaders } from "@/lib/responseHeaders"; import type { Asset } from "@/lib/types/asset"; import * as queryLib from "@/lib/query"; +import { getConnection } from "@/lib/planetscale"; export const getSearch = async ( request: Request, @@ -12,13 +13,21 @@ export const getSearch = async ( const asset = url.searchParams.get("asset")?.split(",") || []; const tags = url.searchParams.get("tags")?.split(",") || []; - const results = await queryLib.getSearchResults( - query, - game, - asset, - tags, - env - ); + const results = await ( + await queryLib.getSearchResults(query, game, asset, tags, env) + ).map((results) => { + return { + id: results.id, + name: results.name, + game: results.game, + asset_category: results.asset_category, + url: results.url, + tags: results.tags, + status: results.status, + uploaded_by: results.uploaded_by, + uploaded_date: results.uploaded_date, + }; + }); const response = new Response( JSON.stringify({ @@ -44,7 +53,6 @@ export const getRecentAssets = async ( env: Env ): Promise => { const url = new URL(request.url); - let results: Asset[] = []; const cacheKey = new Request(url.toString(), request); const cache = caches.default; @@ -54,28 +62,31 @@ export const getRecentAssets = async ( return response; } - const parameters = []; - let sqlQuery = `SELECT * FROM assets WHERE 1=1`; + const db = await getConnection(env); - sqlQuery += ` ORDER BY uploadedDate DESC LIMIT 30`; + const row = await db + .execute( + "SELECT * FROM assets WHERE 1=1 ORDER BY uploaded_date DESC LIMIT 30" + ) + .then((row) => row.rows as Asset[] | undefined); - const row: D1Result = await env.database - .prepare(sqlQuery) - .bind(...parameters) - .run(); + if (!row) { + throw new Error("No results found"); + } - results = row.results.map((result) => ({ - id: result.id, - name: result.name, - game: result.game, - asset: result.asset, - tags: result.tags, - url: result.url, - verified: result.verified, - uploadedBy: result.uploadedBy, - uploadedDate: result.uploadedDate, - fileSize: result.fileSize, - })); + const results = row.map((asset) => { + return { + id: asset.id, + name: asset.name, + game: asset.game, + asset_category: asset.asset_category, + url: asset.url, + tags: asset.tags, + status: asset.status, + uploaded_by: asset.uploaded_by, + uploaded_date: asset.uploaded_date, + }; + }); response = new Response( JSON.stringify({ From 7eb67e012dea3340e4f714a8eabd63ca4dffa667 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Fri, 14 Jul 2023 23:34:19 +0100 Subject: [PATCH 029/318] fix: inconsistencies in asset --- src/routes/asset/getAssetFromId.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/routes/asset/getAssetFromId.ts b/src/routes/asset/getAssetFromId.ts index f88d330..07c9db0 100644 --- a/src/routes/asset/getAssetFromId.ts +++ b/src/routes/asset/getAssetFromId.ts @@ -45,19 +45,19 @@ export const getAssetFromId = async ( id: row.id, name: row.name, game: row.game, - assetCategory: row.asset_category, + asset_category: row.asset_category, url: row.url, tags: row.tags, status: row.status, - uploadedBy: row.uploaded_by, - uploadedDate: row.uploaded_date, - fileSize: row.file_size, + uploaded_by: row.uploaded_by, + uploaded_date: row.uploaded_date, + file_size: row.file_size, }; const similarAssets = await ( await db .execute( - "SELECT * FROM assets WHERE game = ? AND asset_category = ? AND id != ? ORDER BY RAND() LIMIT 3", + "SELECT * FROM assets WHERE game = ? AND asset_category = ? AND id != ? ORDER BY RAND() LIMIT 4", [row.game, row.asset_category, row.id] ) .then((row) => row.rows as Asset[]) @@ -66,13 +66,13 @@ export const getAssetFromId = async ( id: asset.id, name: asset.name, game: asset.game, - assetCategory: asset.asset_category, + asset_category: asset.asset_category, url: asset.url, tags: asset.tags, status: asset.status, - uploadedBy: asset.uploaded_by, - uploadedDate: asset.uploaded_date, - fileSize: asset.file_size, + uploaded_by: asset.uploaded_by, + uploaded_date: asset.uploaded_date, + file_size: asset.file_size, }; }); From e1163fe127428f4aebd7604103a98aec2ee29938 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Fri, 14 Jul 2023 23:36:40 +0100 Subject: [PATCH 030/318] fix: missing asset `file_size` entry --- src/routes/search/search.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/routes/search/search.ts b/src/routes/search/search.ts index 90bd200..08e2a60 100644 --- a/src/routes/search/search.ts +++ b/src/routes/search/search.ts @@ -26,6 +26,7 @@ export const getSearch = async ( status: results.status, uploaded_by: results.uploaded_by, uploaded_date: results.uploaded_date, + file_size: results.file_size, }; }); @@ -85,6 +86,7 @@ export const getRecentAssets = async ( status: asset.status, uploaded_by: asset.uploaded_by, uploaded_date: asset.uploaded_date, + file_size: asset.file_size, }; }); From 192fb5b8b2fd3c407964f8ec2b07f82e7706350c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 14 Jul 2023 23:52:55 +0100 Subject: [PATCH 031/318] chore(deps): update dependencies (#25) * fix(deps): update dependency prettier to v3 * chore(deps): update dependency wrangler to v3.2.0 * update all depdendencies * check prettier --------- Co-authored-by: Marcel <65048232+dromzeh@users.noreply.github.com> --- package.json | 14 +- pnpm-lock.yaml | 307 ++++++++++++++------------- src/routes/user/getUserByUsername.ts | 31 +-- 3 files changed, 181 insertions(+), 171 deletions(-) diff --git a/package.json b/package.json index 155e846..e12f89e 100644 --- a/package.json +++ b/package.json @@ -10,20 +10,20 @@ "typecheck": "tsc --noEmit" }, "devDependencies": { - "@cloudflare/workers-types": "^4.20230518.0", - "eslint": "^8.44.0", + "@cloudflare/workers-types": "^4.20230710.1", + "eslint": "^8.45.0", "eslint-config-google": "^0.14.0", "eslint-plugin-json": "^3.1.0", "typescript": "^5.1.6", - "wrangler": "3.1.1" + "wrangler": "3.2.0" }, "private": true, "dependencies": { "@planetscale/database": "^1.8.0", - "@prisma/client": "^4.16.2", - "@typescript-eslint/eslint-plugin": "^5.61.0", - "itty-router": "^4.0.13", - "prettier": "^2.8.8", + "@prisma/client": "^5.0.0", + "@typescript-eslint/eslint-plugin": "^6.0.0", + "itty-router": "^4.0.14", + "prettier": "^3.0.0", "render2": "^1.2.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 97309a4..ba6392b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,31 +9,31 @@ dependencies: specifier: ^1.8.0 version: 1.8.0 "@prisma/client": - specifier: ^4.16.2 - version: 4.16.2 + specifier: ^5.0.0 + version: 5.0.0 "@typescript-eslint/eslint-plugin": - specifier: ^5.61.0 - version: 5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.44.0)(typescript@5.1.6) + specifier: ^6.0.0 + version: 6.0.0(@typescript-eslint/parser@6.0.0)(eslint@8.45.0)(typescript@5.1.6) itty-router: - specifier: ^4.0.13 - version: 4.0.13 + specifier: ^4.0.14 + version: 4.0.14 prettier: - specifier: ^2.8.8 - version: 2.8.8 + specifier: ^3.0.0 + version: 3.0.0 render2: specifier: ^1.2.1 version: 1.2.1 devDependencies: "@cloudflare/workers-types": - specifier: ^4.20230518.0 - version: 4.20230518.0 + specifier: ^4.20230710.1 + version: 4.20230710.1 eslint: - specifier: ^8.44.0 - version: 8.44.0 + specifier: ^8.45.0 + version: 8.45.0 eslint-config-google: specifier: ^0.14.0 - version: 0.14.0(eslint@8.44.0) + version: 0.14.0(eslint@8.45.0) eslint-plugin-json: specifier: ^3.1.0 version: 3.1.0 @@ -41,8 +41,8 @@ devDependencies: specifier: ^5.1.6 version: 5.1.6 wrangler: - specifier: 3.1.1 - version: 3.1.1 + specifier: 3.2.0 + version: 3.2.0 packages: /@aashutoshrathi/word-wrap@1.2.6: @@ -61,10 +61,10 @@ packages: mime: 3.0.0 dev: true - /@cloudflare/workerd-darwin-64@1.20230518.0: + /@cloudflare/workerd-darwin-64@1.20230710.0: resolution: { - integrity: sha512-reApIf2/do6GjLlajU6LbRYh8gm/XcaRtzGbF8jo5IzyDSsdStmfNuvq7qssZXG92219Yp1kuTgR9+D1GGZGbg==, + integrity: sha512-TDEgTfzTkveW+U0qtg9/60PXbl2klnEso0oio501zAnY2SOC1x7M0qb8UkhvjHFUVpwdykUzTPWPIWFBcF1ibA==, } engines: { node: ">=16" } cpu: [x64] @@ -73,10 +73,10 @@ packages: dev: true optional: true - /@cloudflare/workerd-darwin-arm64@1.20230518.0: + /@cloudflare/workerd-darwin-arm64@1.20230710.0: resolution: { - integrity: sha512-1l+xdbmPddqb2YIHd1YJ3YG/Fl1nhayzcxfL30xfNS89zJn9Xn3JomM0XMD4mk0d5GruBP3q8BQZ1Uo4rRLF3A==, + integrity: sha512-dxBwnKcj7TiM1JGiODg0LASa25A9P0XLeMkmF8YCECZoq+3QLH/uY4Vbm1xeEy8iXUZrt/uYN72bBE83vY4HIQ==, } engines: { node: ">=16" } cpu: [arm64] @@ -85,10 +85,10 @@ packages: dev: true optional: true - /@cloudflare/workerd-linux-64@1.20230518.0: + /@cloudflare/workerd-linux-64@1.20230710.0: resolution: { - integrity: sha512-/pfR+YBpMOPr2cAlwjtInil0hRZjD8KX9LqK9JkfkEiaBH8CYhnJQcOdNHZI+3OjcY09JnQtEVC5xC4nbW7Bvw==, + integrity: sha512-WrKZwL76i51jQLFpSxklpRSm2s8T9Xf6tVzQaiLTtpguKZSF/CTAyjjEOVfS7FXk+Te8lyAJAFQnj5QHoJ3pzA==, } engines: { node: ">=16" } cpu: [x64] @@ -97,10 +97,10 @@ packages: dev: true optional: true - /@cloudflare/workerd-linux-arm64@1.20230518.0: + /@cloudflare/workerd-linux-arm64@1.20230710.0: resolution: { - integrity: sha512-q3HQvn3J4uEkE0cfDAGG8zqzSZrD47cavB/Tzv4mNutqwg6B4wL3ifjtGeB55tnP2K2KL0GVmX4tObcvpUF4BA==, + integrity: sha512-eWdbOoqFqQ4m1/Wwy2dRDaOVXjOmWGjwBliU8pvm2m9RjfRTdfik7z6E3vOkalxqJDHiJ0f8SUykKz2oM1lD0A==, } engines: { node: ">=16" } cpu: [arm64] @@ -109,10 +109,10 @@ packages: dev: true optional: true - /@cloudflare/workerd-windows-64@1.20230518.0: + /@cloudflare/workerd-windows-64@1.20230710.0: resolution: { - integrity: sha512-vNEHKS5gKKduNOBYtQjcBopAmFT1iScuPWMZa2nJboSjOB9I/5oiVsUpSyk5Y2ARyrohXNz0y8D7p87YzTASWw==, + integrity: sha512-P5ihH98Pb72HrsVsvb/HCSezvAvEtPeVQVBKgIclNE9e0fkA4zX9QMzBBFvLy3yr0YLf4r7MO2tNnt7JFnheGA==, } engines: { node: ">=16" } cpu: [x64] @@ -121,10 +121,10 @@ packages: dev: true optional: true - /@cloudflare/workers-types@4.20230518.0: + /@cloudflare/workers-types@4.20230710.1: resolution: { - integrity: sha512-A0w1V+5SUawGaaPRlhFhSC/SCDT9oQG8TMoWOKFLA4qbqagELqEAFD4KySBIkeVOvCBLT1DZSYBMCxbXddl0kw==, + integrity: sha512-VqEY/ZqyHKBn6ivdePSWebpqojwbCXVEuwLkMYHs0UoOAqcGylkVcabdZYdQJKeNxXcOUZ9UBId/x9UsPUm2XQ==, } dev: true @@ -416,7 +416,7 @@ packages: dev: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.44.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.45.0): resolution: { integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, @@ -425,7 +425,7 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.44.0 + eslint: 8.45.0 eslint-visitor-keys: 3.4.1 /@eslint-community/regexpp@4.5.1: @@ -444,7 +444,7 @@ packages: dependencies: ajv: 6.12.6 debug: 4.3.4 - espree: 9.6.0 + espree: 9.6.1 globals: 13.20.0 ignore: 5.2.4 import-fresh: 3.3.0 @@ -522,12 +522,12 @@ packages: engines: { node: ">=16" } dev: false - /@prisma/client@4.16.2: + /@prisma/client@5.0.0: resolution: { - integrity: sha512-qCoEyxv1ZrQ4bKy39GnylE8Zq31IRmm8bNhNbZx7bF2cU5aiCCnSa93J2imF88MBjn7J9eUQneNxUQVJdl/rPQ==, + integrity: sha512-XlO5ELNAQ7rV4cXIDJUNBEgdLwX3pjtt9Q/RHqDpGf43szpNJx2hJnggfFs7TKNx0cOFsl6KJCSfqr5duEU/bQ==, } - engines: { node: ">=14.17" } + engines: { node: ">=16.13" } requiresBuild: true peerDependencies: prisma: "*" @@ -535,13 +535,13 @@ packages: prisma: optional: true dependencies: - "@prisma/engines-version": 4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81 + "@prisma/engines-version": 4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584 dev: false - /@prisma/engines-version@4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81: + /@prisma/engines-version@4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584: resolution: { - integrity: sha512-q617EUWfRIDTriWADZ4YiWRZXCa/WuhNgLTVd+HqWLffjMSPzyM5uOWoauX91wvQClSKZU4pzI4JJLQ9Kl62Qg==, + integrity: sha512-HHiUF6NixsldsP3JROq07TYBLEjXFKr6PdH8H4gK/XAoTmIplOJBCgrIUMrsRAnEuGyRoRLXKXWUb943+PFoKQ==, } dev: false @@ -559,161 +559,165 @@ packages: } dev: false - /@typescript-eslint/eslint-plugin@5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.44.0)(typescript@5.1.6): + /@typescript-eslint/eslint-plugin@6.0.0(@typescript-eslint/parser@6.0.0)(eslint@8.45.0)(typescript@5.1.6): resolution: { - integrity: sha512-A5l/eUAug103qtkwccSCxn8ZRwT+7RXWkFECdA4Cvl1dOlDUgTpAOfSEElZn2uSUxhdDpnCdetrf0jvU4qrL+g==, + integrity: sha512-xuv6ghKGoiq856Bww/yVYnXGsKa588kY3M0XK7uUW/3fJNNULKRfZfSBkMTSpqGG/8ZCXCadfh8G/z/B4aqS/A==, } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: - "@typescript-eslint/parser": ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 typescript: "*" peerDependenciesMeta: typescript: optional: true dependencies: "@eslint-community/regexpp": 4.5.1 - "@typescript-eslint/parser": 5.61.0(eslint@8.44.0)(typescript@5.1.6) - "@typescript-eslint/scope-manager": 5.61.0 - "@typescript-eslint/type-utils": 5.61.0(eslint@8.44.0)(typescript@5.1.6) - "@typescript-eslint/utils": 5.61.0(eslint@8.44.0)(typescript@5.1.6) + "@typescript-eslint/parser": 6.0.0(eslint@8.45.0)(typescript@5.1.6) + "@typescript-eslint/scope-manager": 6.0.0 + "@typescript-eslint/type-utils": 6.0.0(eslint@8.45.0)(typescript@5.1.6) + "@typescript-eslint/utils": 6.0.0(eslint@8.45.0)(typescript@5.1.6) + "@typescript-eslint/visitor-keys": 6.0.0 debug: 4.3.4 - eslint: 8.44.0 + eslint: 8.45.0 + grapheme-splitter: 1.0.4 graphemer: 1.4.0 ignore: 5.2.4 + natural-compare: 1.4.0 natural-compare-lite: 1.4.0 - semver: 7.5.3 - tsutils: 3.21.0(typescript@5.1.6) + semver: 7.5.4 + ts-api-utils: 1.0.1(typescript@5.1.6) typescript: 5.1.6 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/parser@5.61.0(eslint@8.44.0)(typescript@5.1.6): + /@typescript-eslint/parser@6.0.0(eslint@8.45.0)(typescript@5.1.6): resolution: { - integrity: sha512-yGr4Sgyh8uO6fSi9hw3jAFXNBHbCtKKFMdX2IkT3ZqpKmtAq3lHS4ixB/COFuAIJpwl9/AqF7j72ZDWYKmIfvg==, + integrity: sha512-TNaufYSPrr1U8n+3xN+Yp9g31vQDJqhXzzPSHfQDLcaO4tU+mCfODPxCwf4H530zo7aUBE3QIdxCXamEnG04Tg==, } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: ^7.0.0 || ^8.0.0 typescript: "*" peerDependenciesMeta: typescript: optional: true dependencies: - "@typescript-eslint/scope-manager": 5.61.0 - "@typescript-eslint/types": 5.61.0 - "@typescript-eslint/typescript-estree": 5.61.0(typescript@5.1.6) + "@typescript-eslint/scope-manager": 6.0.0 + "@typescript-eslint/types": 6.0.0 + "@typescript-eslint/typescript-estree": 6.0.0(typescript@5.1.6) + "@typescript-eslint/visitor-keys": 6.0.0 debug: 4.3.4 - eslint: 8.44.0 + eslint: 8.45.0 typescript: 5.1.6 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/scope-manager@5.61.0: + /@typescript-eslint/scope-manager@6.0.0: resolution: { - integrity: sha512-W8VoMjoSg7f7nqAROEmTt6LoBpn81AegP7uKhhW5KzYlehs8VV0ZW0fIDVbcZRcaP3aPSW+JZFua+ysQN+m/Nw==, + integrity: sha512-o4q0KHlgCZTqjuaZ25nw5W57NeykZT9LiMEG4do/ovwvOcPnDO1BI5BQdCsUkjxFyrCL0cSzLjvIMfR9uo7cWg==, } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + engines: { node: ^16.0.0 || >=18.0.0 } dependencies: - "@typescript-eslint/types": 5.61.0 - "@typescript-eslint/visitor-keys": 5.61.0 + "@typescript-eslint/types": 6.0.0 + "@typescript-eslint/visitor-keys": 6.0.0 dev: false - /@typescript-eslint/type-utils@5.61.0(eslint@8.44.0)(typescript@5.1.6): + /@typescript-eslint/type-utils@6.0.0(eslint@8.45.0)(typescript@5.1.6): resolution: { - integrity: sha512-kk8u//r+oVK2Aj3ph/26XdH0pbAkC2RiSjUYhKD+PExemG4XSjpGFeyZ/QM8lBOa7O8aGOU+/yEbMJgQv/DnCg==, + integrity: sha512-ah6LJvLgkoZ/pyJ9GAdFkzeuMZ8goV6BH7eC9FPmojrnX9yNCIsfjB+zYcnex28YO3RFvBkV6rMV6WpIqkPvoQ==, } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: - eslint: "*" + eslint: ^7.0.0 || ^8.0.0 typescript: "*" peerDependenciesMeta: typescript: optional: true dependencies: - "@typescript-eslint/typescript-estree": 5.61.0(typescript@5.1.6) - "@typescript-eslint/utils": 5.61.0(eslint@8.44.0)(typescript@5.1.6) + "@typescript-eslint/typescript-estree": 6.0.0(typescript@5.1.6) + "@typescript-eslint/utils": 6.0.0(eslint@8.45.0)(typescript@5.1.6) debug: 4.3.4 - eslint: 8.44.0 - tsutils: 3.21.0(typescript@5.1.6) + eslint: 8.45.0 + ts-api-utils: 1.0.1(typescript@5.1.6) typescript: 5.1.6 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/types@5.61.0: + /@typescript-eslint/types@6.0.0: resolution: { - integrity: sha512-ldyueo58KjngXpzloHUog/h9REmHl59G1b3a5Sng1GfBo14BkS3ZbMEb3693gnP1k//97lh7bKsp6/V/0v1veQ==, + integrity: sha512-Zk9KDggyZM6tj0AJWYYKgF0yQyrcnievdhG0g5FqyU3Y2DRxJn4yWY21sJC0QKBckbsdKKjYDV2yVrrEvuTgxg==, } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + engines: { node: ^16.0.0 || >=18.0.0 } dev: false - /@typescript-eslint/typescript-estree@5.61.0(typescript@5.1.6): + /@typescript-eslint/typescript-estree@6.0.0(typescript@5.1.6): resolution: { - integrity: sha512-Fud90PxONnnLZ36oR5ClJBLTLfU4pIWBmnvGwTbEa2cXIqj70AEDEmOmpkFComjBZ/037ueKrOdHuYmSFVD7Rw==, + integrity: sha512-2zq4O7P6YCQADfmJ5OTDQTP3ktajnXIRrYAtHM9ofto/CJZV3QfJ89GEaM2BNGeSr1KgmBuLhEkz5FBkS2RQhQ==, } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: typescript: "*" peerDependenciesMeta: typescript: optional: true dependencies: - "@typescript-eslint/types": 5.61.0 - "@typescript-eslint/visitor-keys": 5.61.0 + "@typescript-eslint/types": 6.0.0 + "@typescript-eslint/visitor-keys": 6.0.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.5.3 - tsutils: 3.21.0(typescript@5.1.6) + semver: 7.5.4 + ts-api-utils: 1.0.1(typescript@5.1.6) typescript: 5.1.6 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/utils@5.61.0(eslint@8.44.0)(typescript@5.1.6): + /@typescript-eslint/utils@6.0.0(eslint@8.45.0)(typescript@5.1.6): resolution: { - integrity: sha512-mV6O+6VgQmVE6+xzlA91xifndPW9ElFW8vbSF0xCT/czPXVhwDewKila1jOyRwa9AE19zKnrr7Cg5S3pJVrTWQ==, + integrity: sha512-SOr6l4NB6HE4H/ktz0JVVWNXqCJTOo/mHnvIte1ZhBQ0Cvd04x5uKZa3zT6tiodL06zf5xxdK8COiDvPnQ27JQ==, } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: ^7.0.0 || ^8.0.0 dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.44.0) + "@eslint-community/eslint-utils": 4.4.0(eslint@8.45.0) "@types/json-schema": 7.0.12 "@types/semver": 7.5.0 - "@typescript-eslint/scope-manager": 5.61.0 - "@typescript-eslint/types": 5.61.0 - "@typescript-eslint/typescript-estree": 5.61.0(typescript@5.1.6) - eslint: 8.44.0 + "@typescript-eslint/scope-manager": 6.0.0 + "@typescript-eslint/types": 6.0.0 + "@typescript-eslint/typescript-estree": 6.0.0(typescript@5.1.6) + eslint: 8.45.0 eslint-scope: 5.1.1 - semver: 7.5.3 + semver: 7.5.4 transitivePeerDependencies: - supports-color - typescript dev: false - /@typescript-eslint/visitor-keys@5.61.0: + /@typescript-eslint/visitor-keys@6.0.0: resolution: { - integrity: sha512-50XQ5VdbWrX06mQXhy93WywSFZZGsv3EOjq+lqp6WC2t+j3mb6A9xYVdrRxafvK88vg9k9u+CT4l6D8PEatjKg==, + integrity: sha512-cvJ63l8c0yXdeT5POHpL0Q1cZoRcmRKFCtSjNGJxPkcP571EfZMcNbzWAc7oK3D1dRzm/V5EwtkANTZxqvuuUA==, } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + engines: { node: ^16.0.0 || >=18.0.0 } dependencies: - "@typescript-eslint/types": 5.61.0 + "@typescript-eslint/types": 6.0.0 eslint-visitor-keys: 3.4.1 dev: false - /acorn-jsx@5.3.2(acorn@8.9.0): + /acorn-jsx@5.3.2(acorn@8.10.0): resolution: { integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, @@ -721,7 +725,7 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.9.0 + acorn: 8.10.0 /acorn-walk@8.2.0: resolution: @@ -731,10 +735,10 @@ packages: engines: { node: ">=0.4.0" } dev: true - /acorn@8.9.0: + /acorn@8.10.0: resolution: { - integrity: sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==, + integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==, } engines: { node: ">=0.4.0" } hasBin: true @@ -1119,7 +1123,7 @@ packages: } engines: { node: ">=10" } - /eslint-config-google@0.14.0(eslint@8.44.0): + /eslint-config-google@0.14.0(eslint@8.45.0): resolution: { integrity: sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==, @@ -1128,7 +1132,7 @@ packages: peerDependencies: eslint: ">=5.16.0" dependencies: - eslint: 8.44.0 + eslint: 8.45.0 dev: true /eslint-plugin-json@3.1.0: @@ -1153,10 +1157,10 @@ packages: estraverse: 4.3.0 dev: false - /eslint-scope@7.2.0: + /eslint-scope@7.2.1: resolution: { - integrity: sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==, + integrity: sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dependencies: @@ -1170,15 +1174,15 @@ packages: } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - /eslint@8.44.0: + /eslint@8.45.0: resolution: { - integrity: sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==, + integrity: sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } hasBin: true dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.44.0) + "@eslint-community/eslint-utils": 4.4.0(eslint@8.45.0) "@eslint-community/regexpp": 4.5.1 "@eslint/eslintrc": 2.1.0 "@eslint/js": 8.44.0 @@ -1191,9 +1195,9 @@ packages: debug: 4.3.4 doctrine: 3.0.0 escape-string-regexp: 4.0.0 - eslint-scope: 7.2.0 + eslint-scope: 7.2.1 eslint-visitor-keys: 3.4.1 - espree: 9.6.0 + espree: 9.6.1 esquery: 1.5.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -1203,7 +1207,6 @@ packages: globals: 13.20.0 graphemer: 1.4.0 ignore: 5.2.4 - import-fresh: 3.3.0 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 @@ -1215,20 +1218,19 @@ packages: natural-compare: 1.4.0 optionator: 0.9.3 strip-ansi: 6.0.1 - strip-json-comments: 3.1.1 text-table: 0.2.0 transitivePeerDependencies: - supports-color - /espree@9.6.0: + /espree@9.6.1: resolution: { - integrity: sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==, + integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dependencies: - acorn: 8.9.0 - acorn-jsx: 5.3.2(acorn@8.9.0) + acorn: 8.10.0 + acorn-jsx: 5.3.2(acorn@8.10.0) eslint-visitor-keys: 3.4.1 /esquery@1.5.0: @@ -1488,6 +1490,13 @@ packages: slash: 3.0.0 dev: false + /grapheme-splitter@1.0.4: + resolution: + { + integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==, + } + dev: false + /graphemer@1.4.0: resolution: { @@ -1607,10 +1616,10 @@ packages: integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, } - /itty-router@4.0.13: + /itty-router@4.0.14: resolution: { - integrity: sha512-iiQ9k1nQgaal/MteVft5pwYkvzuZx3idPT9tYpKWl7rKH74tyz5VVSVUCXUO0iBh5HDXjHYsix90UrFKPfThHg==, + integrity: sha512-s8DfaLkQp+E3kBhjwto3Z91ozulotCLAmlS8AIr230NqwFJssiGIoewo1P+CEkZ3YrzghS9k/RVvmMlvKQxueQ==, } dev: false @@ -1736,14 +1745,14 @@ packages: engines: { node: ">=10" } dev: true - /miniflare@3.0.2: + /miniflare@3.20230710.0: resolution: { - integrity: sha512-tSwmK+JPwHsV2KR7/dSZFGtTF/2M30OShjPDY7e5lAxyGE8SkHqXn/ckjg2TVltc9B8rXCSffMnCfYW1pH7R4A==, + integrity: sha512-kVxJoJFeepK+rGJp9UN0D8d3sL6hjFbzd3qcLUUUKosp0ouoleOa6uPNK0b8fEBWWqFUD2W4V4ziN7UvXFB4pg==, } engines: { node: ">=16.13" } dependencies: - acorn: 8.9.0 + acorn: 8.10.0 acorn-walk: 8.2.0 better-sqlite3: 8.4.0 capnp-ts: 0.7.0 @@ -1751,10 +1760,11 @@ packages: glob-to-regexp: 0.4.1 http-cache-semantics: 4.1.1 kleur: 4.1.5 + set-cookie-parser: 2.6.0 source-map-support: 0.5.21 stoppable: 1.1.0 undici: 5.22.1 - workerd: 1.20230518.0 + workerd: 1.20230710.0 ws: 8.13.0 youch: 3.2.3 zod: 3.21.4 @@ -1836,7 +1846,7 @@ packages: } engines: { node: ">=10" } dependencies: - semver: 7.5.3 + semver: 7.5.4 dev: true /node-forge@1.3.1: @@ -1976,12 +1986,12 @@ packages: } engines: { node: ">= 0.8.0" } - /prettier@2.8.8: + /prettier@3.0.0: resolution: { - integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==, + integrity: sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==, } - engines: { node: ">=10.13.0" } + engines: { node: ">=14" } hasBin: true dev: false @@ -2145,16 +2155,23 @@ packages: node-forge: 1.3.1 dev: true - /semver@7.5.3: + /semver@7.5.4: resolution: { - integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==, + integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==, } engines: { node: ">=10" } hasBin: true dependencies: lru-cache: 6.0.0 + /set-cookie-parser@2.6.0: + resolution: + { + integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==, + } + dev: true + /shebang-command@2.0.0: resolution: { @@ -2340,11 +2357,16 @@ packages: dependencies: is-number: 7.0.0 - /tslib@1.14.1: + /ts-api-utils@1.0.1(typescript@5.1.6): resolution: { - integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==, + integrity: sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==, } + engines: { node: ">=16.13.0" } + peerDependencies: + typescript: ">=4.2.0" + dependencies: + typescript: 5.1.6 dev: false /tslib@2.6.0: @@ -2354,19 +2376,6 @@ packages: } dev: true - /tsutils@3.21.0(typescript@5.1.6): - resolution: - { - integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==, - } - engines: { node: ">= 6" } - peerDependencies: - typescript: ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - dependencies: - tslib: 1.14.1 - typescript: 5.1.6 - dev: false - /tunnel-agent@0.6.0: resolution: { @@ -2476,26 +2485,26 @@ packages: dependencies: isexe: 2.0.0 - /workerd@1.20230518.0: + /workerd@1.20230710.0: resolution: { - integrity: sha512-VNmK0zoNZXrwEEx77O/oQDVUzzyDjf5kKKK8bty+FmKCd5EQJCpqi8NlRKWLGMyyYrKm86MFz0kAsreTEs7HHA==, + integrity: sha512-4iC+8w3UNixJ+b6GA2VOG2B6rnfSbSnm7Fnvsvq9iJuolG34fnD9xrfaXu6oN7H3Wyby3z8OIm0fy3szTvuRcg==, } engines: { node: ">=16" } hasBin: true requiresBuild: true optionalDependencies: - "@cloudflare/workerd-darwin-64": 1.20230518.0 - "@cloudflare/workerd-darwin-arm64": 1.20230518.0 - "@cloudflare/workerd-linux-64": 1.20230518.0 - "@cloudflare/workerd-linux-arm64": 1.20230518.0 - "@cloudflare/workerd-windows-64": 1.20230518.0 + "@cloudflare/workerd-darwin-64": 1.20230710.0 + "@cloudflare/workerd-darwin-arm64": 1.20230710.0 + "@cloudflare/workerd-linux-64": 1.20230710.0 + "@cloudflare/workerd-linux-arm64": 1.20230710.0 + "@cloudflare/workerd-windows-64": 1.20230710.0 dev: true - /wrangler@3.1.1: + /wrangler@3.2.0: resolution: { - integrity: sha512-iG6QGOt+qgSm7UroJ8IJ+JdXEcDcW7yp9ilP0V7alCGhKm8shqa/M1iyMOpukZSCSZo8Vmn5nH2C9OY1PR3dQQ==, + integrity: sha512-Fne5c91uolV4+E0B60F/meWbD/sr/oSPBfr6x1gapu6I7Ipu5uUt29K/fuGRgXRQcVVKnd5k3fS++ruuLODoxA==, } engines: { node: ">=16.13.0" } hasBin: true @@ -2506,7 +2515,7 @@ packages: blake3-wasm: 2.1.5 chokidar: 3.5.3 esbuild: 0.16.3 - miniflare: 3.0.2 + miniflare: 3.20230710.0 nanoid: 3.3.6 path-to-regexp: 6.2.1 selfsigned: 2.1.1 diff --git a/src/routes/user/getUserByUsername.ts b/src/routes/user/getUserByUsername.ts index f21422c..cdbc8f2 100644 --- a/src/routes/user/getUserByUsername.ts +++ b/src/routes/user/getUserByUsername.ts @@ -48,21 +48,22 @@ export const getUserByUsername = async ( [user.id] ) .then((row) => row.rows as Asset[] | undefined) - .then((row) => - row?.map((asset) => { - return { - id: asset.id, - name: asset.name, - game: asset.game, - assetCategory: asset.asset_category, - url: asset.url, - tags: asset.tags, - status: asset.status, - uploadedBy: asset.uploaded_by, - uploadedDate: asset.uploaded_date, - fileSize: asset.file_size, - }; - }) + .then( + (row) => + row?.map((asset) => { + return { + id: asset.id, + name: asset.name, + game: asset.game, + assetCategory: asset.asset_category, + url: asset.url, + tags: asset.tags, + status: asset.status, + uploadedBy: asset.uploaded_by, + uploadedDate: asset.uploaded_date, + fileSize: asset.file_size, + }; + }) ); if (!row) { From 4ab71334711cd677473b44db0039fa5a2631b819 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sat, 15 Jul 2023 04:56:19 +0100 Subject: [PATCH 032/318] refactor, better caching --- src/handler.ts | 14 ++------ src/lib/helpers/getQueryParams.ts | 4 +++ src/lib/helpers/responses/notFoundResponse.ts | 12 +++++++ src/lib/types/game.ts | 1 + src/lib/types/ocGenerator.ts | 4 +-- src/middleware/unwantedPrefixes.ts | 1 + src/routes/asset/getAssetFromId.ts | 28 ++++----------- src/routes/download/downloadFile.ts | 21 +++--------- src/routes/games/allGames.ts | 8 ++--- src/routes/index.ts | 15 ++++++-- src/routes/oc-generators/getGenerator.ts | 13 ++++--- src/routes/oc-generators/getGenerators.ts | 11 +++--- src/routes/search/search.ts | 34 ++++++++++++++----- src/routes/user/getUserByUsername.ts | 26 +++----------- src/routes/user/getUsersBySearch.ts | 12 +++---- 15 files changed, 95 insertions(+), 109 deletions(-) create mode 100644 src/lib/helpers/getQueryParams.ts create mode 100644 src/lib/helpers/responses/notFoundResponse.ts diff --git a/src/handler.ts b/src/handler.ts index 9960da8..8d40bfb 100644 --- a/src/handler.ts +++ b/src/handler.ts @@ -2,7 +2,7 @@ import { Router } from "itty-router"; import { errorHandler } from "@/middleware/errorHandler"; import { responseHeaders } from "@/lib/responseHeaders"; import { getContributors } from "@/routes/discord/contributors"; -import { index } from "@/routes/index"; +import { index } from "@/routes"; import { getGenerator } from "@/routes/oc-generators/getGenerator"; import { getGenerators } from "@/routes/oc-generators/getGenerators"; import { getSearch, getRecentAssets } from "@/routes/search/search"; @@ -11,6 +11,7 @@ import { getUserByUsername } from "@/routes/user/getUserByUsername"; import { getUserBySearch } from "@/routes/user/getUsersBySearch"; import { allGames } from "@/routes/games/allGames"; import { getAssetFromId } from "@/routes/asset/getAssetFromId"; +import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse"; const router = Router(); @@ -27,16 +28,7 @@ router .get("/oc-generator/:gameId", errorHandler(getGenerator)) .get("/discord/contributors", errorHandler(getContributors)) .all("*", (): Response => { - return new Response( - JSON.stringify({ - success: false, - status: "error", - error: "404 Not Found", - }), - { - headers: responseHeaders, - } - ); + return createNotFoundResponse("Route doesn't exist", responseHeaders); }); addEventListener("fetch", (event: FetchEvent) => { diff --git a/src/lib/helpers/getQueryParams.ts b/src/lib/helpers/getQueryParams.ts new file mode 100644 index 0000000..50f2d8a --- /dev/null +++ b/src/lib/helpers/getQueryParams.ts @@ -0,0 +1,4 @@ +export function getQueryParam(url, param) { + const value = url.searchParams.get(param); + return value ? value.split(",") : []; +} diff --git a/src/lib/helpers/responses/notFoundResponse.ts b/src/lib/helpers/responses/notFoundResponse.ts new file mode 100644 index 0000000..68ae234 --- /dev/null +++ b/src/lib/helpers/responses/notFoundResponse.ts @@ -0,0 +1,12 @@ +export function createNotFoundResponse(errorMessage, responseHeaders) { + const responseBody = { + success: false, + status: "error", + error: "404 Not Found", + message: errorMessage, + }; + + return new Response(JSON.stringify(responseBody), { + headers: responseHeaders, + }); +} diff --git a/src/lib/types/game.ts b/src/lib/types/game.ts index 3eea414..6b51221 100644 --- a/src/lib/types/game.ts +++ b/src/lib/types/game.ts @@ -1,4 +1,5 @@ export interface Game { name: string; id: number; + asset_categories?: string[]; } diff --git a/src/lib/types/ocGenerator.ts b/src/lib/types/ocGenerator.ts index 9eb16f0..dab0b11 100644 --- a/src/lib/types/ocGenerator.ts +++ b/src/lib/types/ocGenerator.ts @@ -1,7 +1,7 @@ export interface Generator { name: string; data: string; - uploadedBy: number; - uploadedDate: string; + uploaded_by: number; + uploaded_date: string; verified: string; } diff --git a/src/middleware/unwantedPrefixes.ts b/src/middleware/unwantedPrefixes.ts index db27045..aefba91 100644 --- a/src/middleware/unwantedPrefixes.ts +++ b/src/middleware/unwantedPrefixes.ts @@ -1,3 +1,4 @@ +// TODO: deprecate this file as R2 listing buckets will no longer be used export const unwantedPrefixes: string[] = [ "other/", "locales/", diff --git a/src/routes/asset/getAssetFromId.ts b/src/routes/asset/getAssetFromId.ts index 07c9db0..e8346d9 100644 --- a/src/routes/asset/getAssetFromId.ts +++ b/src/routes/asset/getAssetFromId.ts @@ -1,6 +1,7 @@ import { responseHeaders } from "@/lib/responseHeaders"; import type { Asset } from "@/lib/types/asset"; import { getConnection } from "@/lib/planetscale"; +import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse"; export const getAssetFromId = async ( request: Request, @@ -9,18 +10,13 @@ export const getAssetFromId = async ( const url = new URL(request.url); const id = url.pathname.split("/")[2]; - if (!id || isNaN(parseInt(id))) { - throw new Error("No ID provided"); - } + if (!id || isNaN(parseInt(id))) throw new Error("No ID provided"); const cacheKey = new Request(url.toString(), request); const cache = caches.default; - let response = await cache.match(cacheKey); - if (response) { - return response; - } + if (response) return response; const db = await getConnection(env); @@ -28,18 +24,8 @@ export const getAssetFromId = async ( .execute("SELECT * FROM assets WHERE id = ?", [id]) .then((row) => row.rows[0] as Asset | undefined); - if (!row) { - return new Response( - JSON.stringify({ - success: false, - status: "error", - error: "404 Not Found", - }), - { - headers: responseHeaders, - } - ); - } + if (!row) + return createNotFoundResponse("Asset ID not found", responseHeaders); const asset = { id: row.id, @@ -54,7 +40,7 @@ export const getAssetFromId = async ( file_size: row.file_size, }; - const similarAssets = await ( + const similarAssets = ( await db .execute( "SELECT * FROM assets WHERE game = ? AND asset_category = ? AND id != ? ORDER BY RAND() LIMIT 4", @@ -88,7 +74,7 @@ export const getAssetFromId = async ( } ); - response.headers.set("Cache-Control", "s-maxage=28800"); + response.headers.set("Cache-Control", "s-maxage=604800"); await cache.put(cacheKey, response.clone()); return response; diff --git a/src/routes/download/downloadFile.ts b/src/routes/download/downloadFile.ts index 7ef27e7..7a00901 100644 --- a/src/routes/download/downloadFile.ts +++ b/src/routes/download/downloadFile.ts @@ -1,6 +1,7 @@ import { responseHeaders } from "@/lib/responseHeaders"; import type { Asset } from "@/lib/types/asset"; import { getConnection } from "@/lib/planetscale"; +import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse"; export const downloadFile = async ( request: Request, @@ -9,9 +10,7 @@ export const downloadFile = async ( const url = new URL(request.url); const id = url.pathname.split("/")[2]; - if (!id || isNaN(parseInt(id))) { - throw new Error("No ID provided"); - } + if (!id || isNaN(parseInt(id))) throw new Error("No ID provided"); const db = await getConnection(env); @@ -19,20 +18,8 @@ export const downloadFile = async ( .execute("SELECT * FROM assets WHERE id = ?", [id]) .then((row) => row.rows[0] as Asset | undefined); - console.log(row); - - if (!row) { - return new Response( - JSON.stringify({ - success: false, - status: "error", - error: "404 Not Found", - }), - { - headers: responseHeaders, - } - ); - } + if (!row) + return createNotFoundResponse("Asset ID not found", responseHeaders); const response = await fetch(`https://cdn.wanderer.moe/${row.url}`); const headers = new Headers(response.headers); diff --git a/src/routes/games/allGames.ts b/src/routes/games/allGames.ts index 76df156..e93815f 100644 --- a/src/routes/games/allGames.ts +++ b/src/routes/games/allGames.ts @@ -7,14 +7,12 @@ export const allGames = async ( env: Env ): Promise => { const url = new URL(request.url); + const cacheKey = new Request(url.toString(), request); const cache = caches.default; - let response = await cache.match(cacheKey); - if (response) { - return response; - } + if (response) return response; const row: D1Result = await env.database .prepare(`SELECT * FROM games`) @@ -46,7 +44,7 @@ export const allGames = async ( } ); - response.headers.set("Cache-Control", "s-maxage=600"); + response.headers.set("Cache-Control", "s-maxage=1200"); await cache.put(cacheKey, response.clone()); return response; diff --git a/src/routes/index.ts b/src/routes/index.ts index bd6b1bd..c65f4d3 100644 --- a/src/routes/index.ts +++ b/src/routes/index.ts @@ -1,9 +1,16 @@ import { responseHeaders } from "@/lib/responseHeaders"; const routes: string[] = [ - "https://api.wanderer.moe/search", - "https://api.wanderer.moe/oc-generators", - "https://api.wanderer.moe/oc-generator/{gameId}", + "/search[?query=''&tags=''&game=''&asset='']", + "/user/[username]", + "/user/s/[search]", + "/recent", + "/asset/[assetId]", + "/download/[assetId]", + "/discord/contributors", + "/games", + "/oc-generators", + "/oc-generator/[gameId]", ]; export const index = async (): Promise => { @@ -12,6 +19,8 @@ export const index = async (): Promise => { success: true, status: "ok", path: "/", + description: + "Please read the API documentation on the site/github repository if you're unsure how to use this API.", routes, }), { diff --git a/src/routes/oc-generators/getGenerator.ts b/src/routes/oc-generators/getGenerator.ts index 3514e2f..8797653 100644 --- a/src/routes/oc-generators/getGenerator.ts +++ b/src/routes/oc-generators/getGenerator.ts @@ -7,14 +7,13 @@ export const getGenerator = async ( ): Promise => { const url = new URL(request.url); const gameId = url.pathname.split("/")[2]; + const cacheKey = new Request(url.toString(), request); const cache = caches.default; - let response = await cache.match(cacheKey); - if (response) { - return response; - } + if (response) return response; + const row: D1Result = await env.database .prepare(`SELECT * FROM ocGenerators WHERE name = ?`) .bind(gameId) @@ -36,8 +35,8 @@ export const getGenerator = async ( const results = row.results.map((result) => ({ name: result.name, data: JSON.parse(result.data), - uploadedBy: result.uploadedBy, - uploadedDate: result.uploadedDate, + uploaded_by: result.uploaded_by, + uploaded_date: result.uploaded_date, verified: result.verified, })); @@ -52,7 +51,7 @@ export const getGenerator = async ( } ); - response.headers.set("Cache-Control", "s-maxage=28800"); + response.headers.set("Cache-Control", "s-maxage=604800"); await cache.put(cacheKey, response.clone()); return response; diff --git a/src/routes/oc-generators/getGenerators.ts b/src/routes/oc-generators/getGenerators.ts index 9860e24..0369704 100644 --- a/src/routes/oc-generators/getGenerators.ts +++ b/src/routes/oc-generators/getGenerators.ts @@ -6,14 +6,13 @@ export const getGenerators = async ( env: Env ): Promise => { const url = new URL(request.url); + const cacheKey = new Request(url.toString(), request); const cache = caches.default; - let response = await cache.match(cacheKey); - if (response) { - return response; - } + if (response) return response; + const row: D1Result = await env.database .prepare(`SELECT * FROM ocGenerators`) .run(); @@ -21,8 +20,8 @@ export const getGenerators = async ( const results = row.results.map((result) => ({ name: result.name, path: `/oc-generator/${result.name}`, - uploadedBy: result.uploadedBy, - uploadedDate: result.uploadedDate, + uploaded_by: result.uploaded_by, + uploaded_date: result.uploaded_date, verified: result.verified, })); diff --git a/src/routes/search/search.ts b/src/routes/search/search.ts index 08e2a60..b03b71a 100644 --- a/src/routes/search/search.ts +++ b/src/routes/search/search.ts @@ -2,18 +2,32 @@ import { responseHeaders } from "@/lib/responseHeaders"; import type { Asset } from "@/lib/types/asset"; import * as queryLib from "@/lib/query"; import { getConnection } from "@/lib/planetscale"; +import { getQueryParam } from "@/lib/helpers/getQueryParams"; export const getSearch = async ( request: Request, env: Env ): Promise => { const url = new URL(request.url); - const query = url.searchParams.get("query") || ""; - const game = url.searchParams.get("game")?.split(",") || []; - const asset = url.searchParams.get("asset")?.split(",") || []; - const tags = url.searchParams.get("tags")?.split(",") || []; + const paramNames = ["query", "game", "asset", "tags"]; - const results = await ( + const params = {}; + for (const paramName of paramNames) { + params[paramName] = getQueryParam(url, paramName); + } + + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + const { query, game, asset, tags } = params; + + const cacheKey = new Request(url.toString(), request); + const cache = caches.default; + + let response = await cache.match(cacheKey); + + if (response) return response; + + const results = ( await queryLib.getSearchResults(query, game, asset, tags, env) ).map((results) => { return { @@ -30,7 +44,7 @@ export const getSearch = async ( }; }); - const response = new Response( + response = new Response( JSON.stringify({ success: true, status: "ok", @@ -46,6 +60,9 @@ export const getSearch = async ( } ); + response.headers.set("Cache-Control", "s-maxage=3600"); + await cache.put(cacheKey, response.clone()); + return response; }; @@ -59,9 +76,7 @@ export const getRecentAssets = async ( const cache = caches.default; let response = await cache.match(cacheKey); - if (response) { - return response; - } + if (response) return response; const db = await getConnection(env); @@ -104,5 +119,6 @@ export const getRecentAssets = async ( response.headers.set("Cache-Control", "s-maxage=3600"); await cache.put(cacheKey, response.clone()); + return response; }; diff --git a/src/routes/user/getUserByUsername.ts b/src/routes/user/getUserByUsername.ts index cdbc8f2..70d3023 100644 --- a/src/routes/user/getUserByUsername.ts +++ b/src/routes/user/getUserByUsername.ts @@ -2,6 +2,7 @@ import { responseHeaders } from "@/lib/responseHeaders"; import type { User } from "@/lib/types/user"; import type { Asset } from "@/lib/types/asset"; import { getConnection } from "@/lib/planetscale"; +import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse"; export const getUserByUsername = async ( request: Request, @@ -10,19 +11,13 @@ export const getUserByUsername = async ( const url = new URL(request.url); const name = url.pathname.split("/")[2]; - if (!name) { - throw new Error("No Name provided"); - } + if (!name) throw new Error("No username provided"); const cacheKey = new Request(url.toString(), request); - const cache = caches.default; - let response = await cache.match(cacheKey); - if (response) { - return response; - } + if (response) return response; const db = await getConnection(env); @@ -66,18 +61,7 @@ export const getUserByUsername = async ( }) ); - if (!row) { - return new Response( - JSON.stringify({ - success: false, - status: "error", - error: "404 Not Found", - }), - { - headers: responseHeaders, - } - ); - } + if (!row) return createNotFoundResponse("User not found", responseHeaders); response = new Response( JSON.stringify({ @@ -91,7 +75,7 @@ export const getUserByUsername = async ( } ); - response.headers.set("Cache-Control", "s-maxage=60"); + response.headers.set("Cache-Control", "s-maxage=300"); await cache.put(cacheKey, response.clone()); return response; diff --git a/src/routes/user/getUsersBySearch.ts b/src/routes/user/getUsersBySearch.ts index 9576cd0..f12b0c7 100644 --- a/src/routes/user/getUsersBySearch.ts +++ b/src/routes/user/getUsersBySearch.ts @@ -1,5 +1,6 @@ import { responseHeaders } from "@/lib/responseHeaders"; import type { User } from "@/lib/types/user"; +import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse"; import { getConnection } from "@/lib/planetscale"; export const getUserBySearch = async ( @@ -9,14 +10,13 @@ export const getUserBySearch = async ( const url = new URL(request.url); const name = url.pathname.split("/")[3]; + if (!name) throw new Error("No username provided"); + const cacheKey = new Request(url.toString(), request); const cache = caches.default; - let response = await cache.match(cacheKey); - if (response) { - return response; - } + if (response) return response; const db = await getConnection(env); @@ -24,9 +24,7 @@ export const getUserBySearch = async ( .execute("SELECT * FROM auth_user WHERE username LIKE ?", [name]) .then((row) => row.rows as User[] | undefined); - if (!row) { - throw new Error("No User found"); - } + if (!row) return createNotFoundResponse("User not found", responseHeaders); const results = row?.map((user) => { return { From 547c19ddfb983e85fd7744b5bfc9db41f5b3eacd Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sat, 15 Jul 2023 05:03:41 +0100 Subject: [PATCH 033/318] fix[?]: exclude `node_modules` in typecheck --- tsconfig.json | 1 + 1 file changed, 1 insertion(+) diff --git a/tsconfig.json b/tsconfig.json index 4cdf957..ee2b46a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,5 +1,6 @@ { "compilerOptions": { + "skipLibCheck": true, "target": "es2021", "module": "es2022", "moduleResolution": "node", From 08a460a219de152b27d712d27444c5e6e4c9144c Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Tue, 18 Jul 2023 20:31:41 +0100 Subject: [PATCH 034/318] update user table name --- src/lib/listBucket.ts | 3 +-- src/lib/query.ts | 5 +---- src/routes/user/getUserByUsername.ts | 2 +- src/routes/user/getUsersBySearch.ts | 2 +- 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/lib/listBucket.ts b/src/lib/listBucket.ts index 7d1827d..ba1dbeb 100644 --- a/src/lib/listBucket.ts +++ b/src/lib/listBucket.ts @@ -1,4 +1,3 @@ export const listBucket = async (bucket, options) => { - const files = await bucket.list(options); - return files; + return await bucket.list(options); }; diff --git a/src/lib/query.ts b/src/lib/query.ts index b377c86..95cb13a 100644 --- a/src/lib/query.ts +++ b/src/lib/query.ts @@ -28,12 +28,9 @@ export const getSearchResults = async ( const db = await getConnection(env); - console.log(sqlQuery, parameters); - const row = await db + return await db .execute(sqlQuery, parameters) .then((row) => row.rows as Asset[]); - - return row; }; const addQueryToSqlQuery = ( diff --git a/src/routes/user/getUserByUsername.ts b/src/routes/user/getUserByUsername.ts index 70d3023..b6992ea 100644 --- a/src/routes/user/getUserByUsername.ts +++ b/src/routes/user/getUserByUsername.ts @@ -22,7 +22,7 @@ export const getUserByUsername = async ( const db = await getConnection(env); const row = await db - .execute("SELECT * FROM auth_user WHERE username = ?", [name]) + .execute("SELECT * FROM user WHERE username = ?", [name]) .then((row) => row.rows[0] as User | undefined); const user = { diff --git a/src/routes/user/getUsersBySearch.ts b/src/routes/user/getUsersBySearch.ts index f12b0c7..8a9a0cd 100644 --- a/src/routes/user/getUsersBySearch.ts +++ b/src/routes/user/getUsersBySearch.ts @@ -21,7 +21,7 @@ export const getUserBySearch = async ( const db = await getConnection(env); const row = await db - .execute("SELECT * FROM auth_user WHERE username LIKE ?", [name]) + .execute("SELECT * FROM user WHERE username LIKE ?", [name]) .then((row) => row.rows as User[] | undefined); if (!row) return createNotFoundResponse("User not found", responseHeaders); From c7016150d3583884bf31df512280ffe283a09182 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Thu, 20 Jul 2023 23:52:55 +0100 Subject: [PATCH 035/318] fix: incorrect user table name --- src/routes/user/getUserByUsername.ts | 2 +- src/routes/user/getUsersBySearch.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/routes/user/getUserByUsername.ts b/src/routes/user/getUserByUsername.ts index b6992ea..071c868 100644 --- a/src/routes/user/getUserByUsername.ts +++ b/src/routes/user/getUserByUsername.ts @@ -22,7 +22,7 @@ export const getUserByUsername = async ( const db = await getConnection(env); const row = await db - .execute("SELECT * FROM user WHERE username = ?", [name]) + .execute("SELECT * FROM User WHERE username = ?", [name]) .then((row) => row.rows[0] as User | undefined); const user = { diff --git a/src/routes/user/getUsersBySearch.ts b/src/routes/user/getUsersBySearch.ts index 8a9a0cd..8e916ae 100644 --- a/src/routes/user/getUsersBySearch.ts +++ b/src/routes/user/getUsersBySearch.ts @@ -21,7 +21,7 @@ export const getUserBySearch = async ( const db = await getConnection(env); const row = await db - .execute("SELECT * FROM user WHERE username LIKE ?", [name]) + .execute("SELECT * FROM User WHERE username LIKE ?", [name]) .then((row) => row.rows as User[] | undefined); if (!row) return createNotFoundResponse("User not found", responseHeaders); From e7a39f125544c34c7cb62d5129a17d3a510ef7e7 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Wed, 26 Jul 2023 08:36:11 +0100 Subject: [PATCH 036/318] update oc gen and games to use new R2 bucket --- src/lib/types/ocGenerator.ts | 7 ---- src/routes/games/allGames.ts | 6 ++- src/routes/oc-generators/getGenerator.ts | 46 +++++++++-------------- src/routes/oc-generators/getGenerators.ts | 28 ++++++++------ wrangler.toml | 4 +- 5 files changed, 40 insertions(+), 51 deletions(-) delete mode 100644 src/lib/types/ocGenerator.ts diff --git a/src/lib/types/ocGenerator.ts b/src/lib/types/ocGenerator.ts deleted file mode 100644 index dab0b11..0000000 --- a/src/lib/types/ocGenerator.ts +++ /dev/null @@ -1,7 +0,0 @@ -export interface Generator { - name: string; - data: string; - uploaded_by: number; - uploaded_date: string; - verified: string; -} diff --git a/src/routes/games/allGames.ts b/src/routes/games/allGames.ts index e93815f..2d293e7 100644 --- a/src/routes/games/allGames.ts +++ b/src/routes/games/allGames.ts @@ -23,11 +23,13 @@ export const allGames = async ( name: result.name, id: result.id, assetCategories: await listBucket(env.bucket, { - prefix: `${result.name}/`, + prefix: `assets/${result.name}/`, delimiter: "/", }).then((data) => data.delimitedPrefixes.map((prefix) => - prefix.replace(`${result.name}/`, "").replace("/", "") + prefix + .replace(`assets/${result.name}/`, "") + .replace("/", "") ) ), })) diff --git a/src/routes/oc-generators/getGenerator.ts b/src/routes/oc-generators/getGenerator.ts index 8797653..b1c8c0e 100644 --- a/src/routes/oc-generators/getGenerator.ts +++ b/src/routes/oc-generators/getGenerator.ts @@ -1,5 +1,6 @@ import { responseHeaders } from "@/lib/responseHeaders"; -import type { Generator } from "@/lib/types/ocGenerator"; +import { listBucket } from "@/lib/listBucket"; +import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse"; export const getGenerator = async ( request: Request, @@ -14,44 +15,33 @@ export const getGenerator = async ( if (response) return response; - const row: D1Result = await env.database - .prepare(`SELECT * FROM ocGenerators WHERE name = ?`) - .bind(gameId) - .run(); - - if (!row.results.length) { - return new Response( - JSON.stringify({ - success: false, - status: "error", - error: "404 Not Found", - }), - { - headers: responseHeaders, - } - ); - } - - const results = row.results.map((result) => ({ - name: result.name, - data: JSON.parse(result.data), - uploaded_by: result.uploaded_by, - uploaded_date: result.uploaded_date, - verified: result.verified, - })); + const files = await listBucket(env.bucket, { + prefix: `oc-generators/${gameId}/list.json`, + }); + + if (files.objects.length === 0) + return createNotFoundResponse("Generator not found", responseHeaders); + + const data = await fetch( + `https://files.wanderer.moe/${files.objects[0].key}` + ); + + const generatorData = await data.json(); response = new Response( JSON.stringify({ success: true, status: "ok", - results: results, + uploaded: files.objects[0].uploaded, + key: files.objects[0].key, + data: generatorData, }), { headers: responseHeaders, } ); - response.headers.set("Cache-Control", "s-maxage=604800"); + response.headers.set("Cache-Control", "s-maxage=604800"); // the content of this file is unlikely to change, so caching is fine await cache.put(cacheKey, response.clone()); return response; diff --git a/src/routes/oc-generators/getGenerators.ts b/src/routes/oc-generators/getGenerators.ts index 0369704..63048f7 100644 --- a/src/routes/oc-generators/getGenerators.ts +++ b/src/routes/oc-generators/getGenerators.ts @@ -1,5 +1,5 @@ import { responseHeaders } from "@/lib/responseHeaders"; -import type { Generator } from "@/lib/types/ocGenerator"; +import { listBucket } from "@/lib/listBucket"; export const getGenerators = async ( request: Request, @@ -13,17 +13,21 @@ export const getGenerators = async ( if (response) return response; - const row: D1Result = await env.database - .prepare(`SELECT * FROM ocGenerators`) - .run(); - - const results = row.results.map((result) => ({ - name: result.name, - path: `/oc-generator/${result.name}`, - uploaded_by: result.uploaded_by, - uploaded_date: result.uploaded_date, - verified: result.verified, - })); + const files = await listBucket(env.bucket, { + prefix: "oc-generators/", + delimiter: "/", + }); + + // console.log(files); + + const results = files.delimitedPrefixes.map((file) => { + return { + name: file.replace("oc-generators/", "").replace("/", ""), + path: `/oc-generators/${file + .replace("oc-generators/", "") + .replace("/", "")}`, + }; + }); response = new Response( JSON.stringify({ diff --git a/wrangler.toml b/wrangler.toml index f2203c8..1ddc058 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -7,8 +7,8 @@ workers_dev = true [[r2_buckets]] binding = 'bucket' -bucket_name = 'wanderer-moe' -preview_bucket_name = 'wanderer-moe' +bucket_name = 'files' +preview_bucket_name = 'files' [[d1_databases]] binding = 'database' From 73034b48c6fb3c84604fb103a0cf72bdb896a074 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Mon, 31 Jul 2023 23:14:27 +0100 Subject: [PATCH 037/318] add comments, update readme --- README.md | 48 +++++++++++++------ src/lib/helpers/responses/notFoundResponse.ts | 1 + src/middleware/errorHandler.ts | 1 + src/middleware/unwantedPrefixes.ts | 6 --- src/routes/download/downloadFile.ts | 4 +- src/routes/games/allGames.ts | 1 + src/routes/oc-generators/getGenerators.ts | 2 + src/routes/search/search.ts | 35 +++++++------- 8 files changed, 59 insertions(+), 39 deletions(-) delete mode 100644 src/middleware/unwantedPrefixes.ts diff --git a/README.md b/README.md index c86eb62..b444c5b 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ ![Quality] ![API Response] ![CDN Response] -Source code for the API powering [**wanderer.moe**](https://wanderer.moe) — using **Cloudflare Workers** with **R2 Storage** for the CDN, and **D1** for the Database. +Source code for the API powering [**wanderer.moe**](https://wanderer.moe) — using **Cloudflare Workers** with **R2 Storage** for the CDN, and **Planetscale** for the Database. @@ -16,6 +16,8 @@ Source code for the API powering [**wanderer.moe**](https://wanderer.moe) — us Configuration is in `wrangler.toml` - this includes the R2 Bucket and D1 Database. +You will need to setup environment variables for the Discord Bot Token for `/contributors` route: `DISCORD_TOKEN` using `wrangler secret put`. + - Run `wrangler dev` to preview locally. - Run `wrangler deploy` to publish to Cloudflare Workers. @@ -27,43 +29,59 @@ Configuration is in `wrangler.toml` - this includes the R2 Bucket and D1 Databas ## API Reference -### Search (Assets) +### Assets #### Search Assets ```http -GET /search/assets?query=query&tags=tag1,tag2&after=after +GET /search?query=query&game=game1,game2&asset=asset +``` + +| Parameter | Type | Description | +| :-------- | :------- | :----------------------------------------------------------------------- | +| `query` | `string` | **Optional**. Search query for assets | +| `game` | `string` | **Optional**. Can be a comma seperated list of game names to search for | +| `asset` | `string` | **Optional**. Can be a comma seperated list of asset types to search for | + +The max response the API will give is always 1500 assets. + +### Recent Assets + +``` +GET /recent ``` -| Parameter | Type | Description | -| :-------- | :------- | :--------------------------------------------------------------------------------------------- | -| `query` | `string` | **Optional**. Search query for assets | -| `tags` | `string` | **Optional**. Comma-separated list of tags to filter by (in order of `game`, `asset-category`) | -| `after` | `string` | **Optional**. Cursor to paginate through results | +Returns the 30 most recent assets based off of the `uploaded_date` field. -If no query is provided, the API will return a list of 100 most recently uploaded assets. +### Download Asset + +```http +GET /download/:assetId +``` + +Downloads the asset with the given `assetId`. ### Search Users #### Search Users (Name) ```http -GET /user/search/:query +GET /user/s/:query ``` | Parameter | Type | Description | | :-------- | :------- | :----------------------------------- | | `query` | `string` | **Required**. Search query for users | -#### Get User Data (ID) +#### Get Username ```http -GET /user/:id +GET /user/:username ``` -| Parameter | Type | Description | -| :-------- | :------- | :----------------------------------- | -| `id` | `string` | **Required**. Search query for users | +| Parameter | Type | Description | +| :--------- | :------- | :--------------------- | +| `username` | `string` | **Required**. Username | ### OC Generator diff --git a/src/lib/helpers/responses/notFoundResponse.ts b/src/lib/helpers/responses/notFoundResponse.ts index 68ae234..3adc697 100644 --- a/src/lib/helpers/responses/notFoundResponse.ts +++ b/src/lib/helpers/responses/notFoundResponse.ts @@ -1,3 +1,4 @@ +// helper function to create a 404 Not Found response export function createNotFoundResponse(errorMessage, responseHeaders) { const responseBody = { success: false, diff --git a/src/middleware/errorHandler.ts b/src/middleware/errorHandler.ts index 0f829e9..30e7f22 100644 --- a/src/middleware/errorHandler.ts +++ b/src/middleware/errorHandler.ts @@ -1,5 +1,6 @@ import { responseHeaders } from "@/lib/responseHeaders"; +// generic error handler wrapper export const errorHandler = (handler: (request: Request, env: Env) => Promise) => async (request: Request, env: Env): Promise => { diff --git a/src/middleware/unwantedPrefixes.ts b/src/middleware/unwantedPrefixes.ts deleted file mode 100644 index aefba91..0000000 --- a/src/middleware/unwantedPrefixes.ts +++ /dev/null @@ -1,6 +0,0 @@ -// TODO: deprecate this file as R2 listing buckets will no longer be used -export const unwantedPrefixes: string[] = [ - "other/", - "locales/", - "oc-generator/", -]; diff --git a/src/routes/download/downloadFile.ts b/src/routes/download/downloadFile.ts index 7a00901..0a9278c 100644 --- a/src/routes/download/downloadFile.ts +++ b/src/routes/download/downloadFile.ts @@ -21,7 +21,9 @@ export const downloadFile = async ( if (!row) return createNotFoundResponse("Asset ID not found", responseHeaders); - const response = await fetch(`https://cdn.wanderer.moe/${row.url}`); + const response = await fetch( + `https://files.wanderer.moe/assets/${row.url}` + ); const headers = new Headers(response.headers); headers.set("Content-Disposition", `attachment; filename="${row.name}"`); const blob = await response.blob(); diff --git a/src/routes/games/allGames.ts b/src/routes/games/allGames.ts index 2d293e7..cc4ad0f 100644 --- a/src/routes/games/allGames.ts +++ b/src/routes/games/allGames.ts @@ -14,6 +14,7 @@ export const allGames = async ( if (response) return response; + // TODO: fix getting data from old D1 database but using Planetscale DB const row: D1Result = await env.database .prepare(`SELECT * FROM games`) .run(); diff --git a/src/routes/oc-generators/getGenerators.ts b/src/routes/oc-generators/getGenerators.ts index 63048f7..6fc478d 100644 --- a/src/routes/oc-generators/getGenerators.ts +++ b/src/routes/oc-generators/getGenerators.ts @@ -13,6 +13,8 @@ export const getGenerators = async ( if (response) return response; + // listing all files inside of oc-generators subfolder, as they can't be manually inputted + // by users but instead stored on the oc-generators repo const files = await listBucket(env.bucket, { prefix: "oc-generators/", delimiter: "/", diff --git a/src/routes/search/search.ts b/src/routes/search/search.ts index b03b71a..1daff11 100644 --- a/src/routes/search/search.ts +++ b/src/routes/search/search.ts @@ -1,6 +1,6 @@ import { responseHeaders } from "@/lib/responseHeaders"; import type { Asset } from "@/lib/types/asset"; -import * as queryLib from "@/lib/query"; +import { getSearchResults } from "@/lib/query"; import { getConnection } from "@/lib/planetscale"; import { getQueryParam } from "@/lib/helpers/getQueryParams"; @@ -16,6 +16,7 @@ export const getSearch = async ( params[paramName] = getQueryParam(url, paramName); } + // TODO: fix this cuz idk what's going on here // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore const { query, game, asset, tags } = params; @@ -27,22 +28,22 @@ export const getSearch = async ( if (response) return response; - const results = ( - await queryLib.getSearchResults(query, game, asset, tags, env) - ).map((results) => { - return { - id: results.id, - name: results.name, - game: results.game, - asset_category: results.asset_category, - url: results.url, - tags: results.tags, - status: results.status, - uploaded_by: results.uploaded_by, - uploaded_date: results.uploaded_date, - file_size: results.file_size, - }; - }); + const results = (await getSearchResults(query, game, asset, tags, env)).map( + (results) => { + return { + id: results.id, + name: results.name, + game: results.game, + asset_category: results.asset_category, + url: results.url, + tags: results.tags, + status: results.status, + uploaded_by: results.uploaded_by, + uploaded_date: results.uploaded_date, + file_size: results.file_size, + }; + } + ); response = new Response( JSON.stringify({ From f8ef2588d8e4123365b1b00861c494229f2fc9b2 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sat, 5 Aug 2023 18:21:27 +0100 Subject: [PATCH 038/318] relocate auth to API (#30) [closes #29] * relocate prisma and lucia config * feat: nice auth route implementation * add status code into responses * [skip ci] prettier fix * impl regex, resend, s3 * feat: convert roles to bitwise flags * fix: update user interface with new userattributes * update search to `assetSearch` * feat: rewrite to hono sdflkjfsd; * feat: update authroutes and assetype * finally update `/games/all` to use new db the procastination was real with this & cleaned up schema * feat: add `has_generator` bool to `/games/all` * fix game interface name * feat: help me (drizzle cfg setup) * reimpl schema relations * del s3 client, replace db credentials --- .gitignore | 3 + README.md | 80 +- drizzle.config.ts | 16 + package.json | 20 +- pnpm-lock.yaml | 3645 +++++++++++++++-- src/db/migrations/meta/_journal.json | 1 + src/db/migrations/schema.ts | 272 ++ src/handler.ts | 38 - src/index.ts | 42 +- src/lib/auth/lucia.ts | 54 + src/lib/auth/roleFlags.ts | 42 + src/lib/helpers/getQueryParams.ts | 4 - src/lib/helpers/responses/notFoundResponse.ts | 21 +- src/lib/planetscale.ts | 18 +- src/lib/query.ts | 48 +- src/lib/regex/accountValidation.ts | 18 + src/lib/resend/email.ts | 67 + src/lib/types/asset.ts | 2 + src/lib/types/auth.ts | 8 + src/lib/types/game.ts | 8 +- src/lib/types/user.ts | 13 +- src/lucia.d.ts | 19 + src/middleware/errorHandler.ts | 22 - src/routes/asset/assetRoute.ts | 15 + .../downloadAsset.ts} | 21 +- src/routes/asset/getAssetFromId.ts | 31 +- src/routes/auth/authRoute.ts | 25 + src/routes/auth/login.ts | 47 + src/routes/auth/logout.ts | 17 + src/routes/auth/signup.ts | 66 + src/routes/auth/validate.ts | 22 + src/routes/discord/contributors.ts | 21 +- src/routes/discord/discordRoute.ts | 10 + src/routes/games/allGames.ts | 73 +- src/routes/games/gamesRoute.ts | 10 + src/routes/index.ts | 30 - src/routes/oc-generators/getGenerator.ts | 30 +- src/routes/oc-generators/getGenerators.ts | 26 +- src/routes/oc-generators/ocGeneratorRoutes.ts | 15 + src/routes/search/assetSearch.ts | 112 + src/routes/search/search.ts | 125 - src/routes/search/searchRoute.ts | 15 + src/routes/user/getUserByUsername.ts | 33 +- src/routes/user/getUsersBySearch.ts | 38 +- src/routes/user/userRoute.ts | 15 + src/worker-configuration.d.ts | 8 +- wrangler.toml | 5 - 47 files changed, 4421 insertions(+), 850 deletions(-) create mode 100644 drizzle.config.ts create mode 100644 src/db/migrations/meta/_journal.json create mode 100644 src/db/migrations/schema.ts delete mode 100644 src/handler.ts create mode 100644 src/lib/auth/lucia.ts create mode 100644 src/lib/auth/roleFlags.ts delete mode 100644 src/lib/helpers/getQueryParams.ts create mode 100644 src/lib/regex/accountValidation.ts create mode 100644 src/lib/resend/email.ts create mode 100644 src/lib/types/auth.ts create mode 100644 src/lucia.d.ts delete mode 100644 src/middleware/errorHandler.ts create mode 100644 src/routes/asset/assetRoute.ts rename src/routes/{download/downloadFile.ts => asset/downloadAsset.ts} (64%) create mode 100644 src/routes/auth/authRoute.ts create mode 100644 src/routes/auth/login.ts create mode 100644 src/routes/auth/logout.ts create mode 100644 src/routes/auth/signup.ts create mode 100644 src/routes/auth/validate.ts create mode 100644 src/routes/discord/discordRoute.ts create mode 100644 src/routes/games/gamesRoute.ts delete mode 100644 src/routes/index.ts create mode 100644 src/routes/oc-generators/ocGeneratorRoutes.ts create mode 100644 src/routes/search/assetSearch.ts delete mode 100644 src/routes/search/search.ts create mode 100644 src/routes/search/searchRoute.ts create mode 100644 src/routes/user/userRoute.ts diff --git a/.gitignore b/.gitignore index 4b4c676..66a78be 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +# webstorm +.idea + # Wrangler .wrangler diff --git a/README.md b/README.md index b444c5b..a5eb6d5 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ ![Quality] ![API Response] ![CDN Response] -Source code for the API powering [**wanderer.moe**](https://wanderer.moe) — using **Cloudflare Workers** with **R2 Storage** for the CDN, and **Planetscale** for the Database. +Source code for the API powering [**wanderer.moe**](https://wanderer.moe) — using **Cloudflare Workers** and **Hono** with **R2 Storage** for the CDN, and **Planetscale** for the Database. @@ -14,9 +14,9 @@ Source code for the API powering [**wanderer.moe**](https://wanderer.moe) — us #### Wrangler -Configuration is in `wrangler.toml` - this includes the R2 Bucket and D1 Database. +Configuration is in `wrangler.toml`. -You will need to setup environment variables for the Discord Bot Token for `/contributors` route: `DISCORD_TOKEN` using `wrangler secret put`. +You will need to setup environment variables for the Discord Bot Token for `/contributors` route: `DISCORD_TOKEN` and for Planetscale, using `wrangler secret put`. - Run `wrangler dev` to preview locally. - Run `wrangler deploy` to publish to Cloudflare Workers. @@ -27,80 +27,6 @@ You will need to setup environment variables for the Discord Bot Token for `/con - If you're using Github Actions, you will have to setup a secret with a Cloudflare API token. You can generate the API token [here][Cloudflare API Token] — use the `Edit Cloudflare Workers` template. -## API Reference - -### Assets - -#### Search Assets - -```http -GET /search?query=query&game=game1,game2&asset=asset -``` - -| Parameter | Type | Description | -| :-------- | :------- | :----------------------------------------------------------------------- | -| `query` | `string` | **Optional**. Search query for assets | -| `game` | `string` | **Optional**. Can be a comma seperated list of game names to search for | -| `asset` | `string` | **Optional**. Can be a comma seperated list of asset types to search for | - -The max response the API will give is always 1500 assets. - -### Recent Assets - -``` -GET /recent -``` - -Returns the 30 most recent assets based off of the `uploaded_date` field. - -### Download Asset - -```http -GET /download/:assetId -``` - -Downloads the asset with the given `assetId`. - -### Search Users - -#### Search Users (Name) - -```http -GET /user/s/:query -``` - -| Parameter | Type | Description | -| :-------- | :------- | :----------------------------------- | -| `query` | `string` | **Required**. Search query for users | - -#### Get Username - -```http -GET /user/:username -``` - -| Parameter | Type | Description | -| :--------- | :------- | :--------------------- | -| `username` | `string` | **Required**. Username | - -### OC Generator - -#### Get All OC Generators - -```http -GET /oc-generators/ -``` - -#### Get OC Generator - -```http -GET /oc-generators/:id -``` - -| Parameter | Type | Description | -| :-------- | :------- | :----------------------------------------------- | -| `id` | `string` | **Required**. Game Name of OC Generator to fetch | - ## Authors - [@dromzeh][Dromzeh] diff --git a/drizzle.config.ts b/drizzle.config.ts new file mode 100644 index 0000000..8288cc9 --- /dev/null +++ b/drizzle.config.ts @@ -0,0 +1,16 @@ +import "dotenv/config"; + +import type { Config } from "drizzle-kit"; + +export default { + out: "./src/db/migrations", + schema: "./src/db/schema.ts", + breakpoints: true, + driver: "mysql2", + dbCredentials: { + host: process.env.DATABASE_HOST!, + user: process.env.DATABASE_USERNAME!, + password: process.env.DATABASE_PASSWORD!, + database: "planetscale", + }, +} satisfies Config; diff --git a/package.json b/package.json index e12f89e..4996b26 100644 --- a/package.json +++ b/package.json @@ -2,15 +2,18 @@ "name": "wanderer-moe-api", "version": "1.0.1b", "scripts": { - "prettier": "prettier --write .", + "prettier:fmt": "prettier --write .", "dev": "wrangler dev --remote", "publish": "wrangler publish --minify", "lint": "eslint . --ext .ts", "prettier:check": "prettier --check .", - "typecheck": "tsc --noEmit" + "typecheck": "tsc --noEmit", + "prisma:generate": "npx prisma generate --accelerate", + "prisma:push": "npx prisma db push" }, "devDependencies": { "@cloudflare/workers-types": "^4.20230710.1", + "@types/node": "^20.4.8", "eslint": "^8.45.0", "eslint-config-google": "^0.14.0", "eslint-plugin-json": "^3.1.0", @@ -19,11 +22,20 @@ }, "private": true, "dependencies": { + "@aws-sdk/client-s3": "^3.382.0", + "@lucia-auth/adapter-mysql": "^2.0.0", + "@lucia-auth/adapter-prisma": "^3.0.0", "@planetscale/database": "^1.8.0", "@prisma/client": "^5.0.0", "@typescript-eslint/eslint-plugin": "^6.0.0", - "itty-router": "^4.0.14", + "dotenv": "^16.3.1", + "drizzle-kit": "^0.19.12", + "drizzle-orm": "^0.27.2", + "hono": "^3.3.4", + "lucia": "^2.0.0", + "mysql2": "^3.6.0", "prettier": "^3.0.0", - "render2": "^1.2.1" + "render2": "^1.2.1", + "resend": "^0.17.2" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ba6392b..19076ec 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,6 +5,15 @@ settings: excludeLinksFromLockfile: false dependencies: + "@aws-sdk/client-s3": + specifier: ^3.382.0 + version: 3.382.0 + "@lucia-auth/adapter-mysql": + specifier: ^2.0.0 + version: 2.0.0(@planetscale/database@1.8.0)(lucia@2.0.0)(mysql2@3.6.0) + "@lucia-auth/adapter-prisma": + specifier: ^3.0.0 + version: 3.0.0(@prisma/client@5.0.0)(lucia@2.0.0) "@planetscale/database": specifier: ^1.8.0 version: 1.8.0 @@ -14,20 +23,41 @@ dependencies: "@typescript-eslint/eslint-plugin": specifier: ^6.0.0 version: 6.0.0(@typescript-eslint/parser@6.0.0)(eslint@8.45.0)(typescript@5.1.6) - itty-router: - specifier: ^4.0.14 - version: 4.0.14 + dotenv: + specifier: ^16.3.1 + version: 16.3.1 + drizzle-kit: + specifier: ^0.19.12 + version: 0.19.12 + drizzle-orm: + specifier: ^0.27.2 + version: 0.27.2(@cloudflare/workers-types@4.20230710.1)(@planetscale/database@1.8.0)(mysql2@3.6.0) + hono: + specifier: ^3.3.4 + version: 3.3.4 + lucia: + specifier: ^2.0.0 + version: 2.0.0 + mysql2: + specifier: ^3.6.0 + version: 3.6.0 prettier: specifier: ^3.0.0 version: 3.0.0 render2: specifier: ^1.2.1 version: 1.2.1 + resend: + specifier: ^0.17.2 + version: 0.17.2 devDependencies: "@cloudflare/workers-types": specifier: ^4.20230710.1 version: 4.20230710.1 + "@types/node": + specifier: ^20.4.8 + version: 20.4.8 eslint: specifier: ^8.45.0 version: 8.45.0 @@ -52,497 +82,2363 @@ packages: } engines: { node: ">=0.10.0" } - /@cloudflare/kv-asset-handler@0.2.0: + /@aws-crypto/crc32@3.0.0: resolution: { - integrity: sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==, + integrity: sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==, } dependencies: - mime: 3.0.0 - dev: true + "@aws-crypto/util": 3.0.0 + "@aws-sdk/types": 3.378.0 + tslib: 1.14.1 + dev: false - /@cloudflare/workerd-darwin-64@1.20230710.0: + /@aws-crypto/crc32c@3.0.0: resolution: { - integrity: sha512-TDEgTfzTkveW+U0qtg9/60PXbl2klnEso0oio501zAnY2SOC1x7M0qb8UkhvjHFUVpwdykUzTPWPIWFBcF1ibA==, + integrity: sha512-ENNPPManmnVJ4BTXlOjAgD7URidbAznURqD0KvfREyc4o20DPYdEldU1f5cQ7Jbj0CJJSPaMIk/9ZshdB3210w==, } - engines: { node: ">=16" } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true + dependencies: + "@aws-crypto/util": 3.0.0 + "@aws-sdk/types": 3.378.0 + tslib: 1.14.1 + dev: false - /@cloudflare/workerd-darwin-arm64@1.20230710.0: + /@aws-crypto/ie11-detection@3.0.0: resolution: { - integrity: sha512-dxBwnKcj7TiM1JGiODg0LASa25A9P0XLeMkmF8YCECZoq+3QLH/uY4Vbm1xeEy8iXUZrt/uYN72bBE83vY4HIQ==, + integrity: sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==, } - engines: { node: ">=16" } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true + dependencies: + tslib: 1.14.1 + dev: false - /@cloudflare/workerd-linux-64@1.20230710.0: + /@aws-crypto/sha1-browser@3.0.0: resolution: { - integrity: sha512-WrKZwL76i51jQLFpSxklpRSm2s8T9Xf6tVzQaiLTtpguKZSF/CTAyjjEOVfS7FXk+Te8lyAJAFQnj5QHoJ3pzA==, + integrity: sha512-NJth5c997GLHs6nOYTzFKTbYdMNA6/1XlKVgnZoaZcQ7z7UJlOgj2JdbHE8tiYLS3fzXNCguct77SPGat2raSw==, } - engines: { node: ">=16" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true + dependencies: + "@aws-crypto/ie11-detection": 3.0.0 + "@aws-crypto/supports-web-crypto": 3.0.0 + "@aws-crypto/util": 3.0.0 + "@aws-sdk/types": 3.378.0 + "@aws-sdk/util-locate-window": 3.310.0 + "@aws-sdk/util-utf8-browser": 3.259.0 + tslib: 1.14.1 + dev: false - /@cloudflare/workerd-linux-arm64@1.20230710.0: + /@aws-crypto/sha256-browser@3.0.0: resolution: { - integrity: sha512-eWdbOoqFqQ4m1/Wwy2dRDaOVXjOmWGjwBliU8pvm2m9RjfRTdfik7z6E3vOkalxqJDHiJ0f8SUykKz2oM1lD0A==, + integrity: sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==, } - engines: { node: ">=16" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true + dependencies: + "@aws-crypto/ie11-detection": 3.0.0 + "@aws-crypto/sha256-js": 3.0.0 + "@aws-crypto/supports-web-crypto": 3.0.0 + "@aws-crypto/util": 3.0.0 + "@aws-sdk/types": 3.378.0 + "@aws-sdk/util-locate-window": 3.310.0 + "@aws-sdk/util-utf8-browser": 3.259.0 + tslib: 1.14.1 + dev: false - /@cloudflare/workerd-windows-64@1.20230710.0: + /@aws-crypto/sha256-js@3.0.0: resolution: { - integrity: sha512-P5ihH98Pb72HrsVsvb/HCSezvAvEtPeVQVBKgIclNE9e0fkA4zX9QMzBBFvLy3yr0YLf4r7MO2tNnt7JFnheGA==, + integrity: sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==, } - engines: { node: ">=16" } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true + dependencies: + "@aws-crypto/util": 3.0.0 + "@aws-sdk/types": 3.378.0 + tslib: 1.14.1 + dev: false - /@cloudflare/workers-types@4.20230710.1: + /@aws-crypto/supports-web-crypto@3.0.0: resolution: { - integrity: sha512-VqEY/ZqyHKBn6ivdePSWebpqojwbCXVEuwLkMYHs0UoOAqcGylkVcabdZYdQJKeNxXcOUZ9UBId/x9UsPUm2XQ==, + integrity: sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==, } - dev: true + dependencies: + tslib: 1.14.1 + dev: false - /@esbuild-plugins/node-globals-polyfill@0.1.1(esbuild@0.16.3): + /@aws-crypto/util@3.0.0: resolution: { - integrity: sha512-MR0oAA+mlnJWrt1RQVQ+4VYuRJW/P2YmRTv1AsplObyvuBMnPHiizUF95HHYiSsMGLhyGtWufaq2XQg6+iurBg==, + integrity: sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==, } - peerDependencies: - esbuild: "*" dependencies: - esbuild: 0.16.3 - dev: true + "@aws-sdk/types": 3.378.0 + "@aws-sdk/util-utf8-browser": 3.259.0 + tslib: 1.14.1 + dev: false - /@esbuild-plugins/node-modules-polyfill@0.1.4(esbuild@0.16.3): + /@aws-sdk/client-s3@3.382.0: resolution: { - integrity: sha512-uZbcXi0zbmKC/050p3gJnne5Qdzw8vkXIv+c2BW0Lsc1ji1SkrxbKPUy5Efr0blbTu1SL8w4eyfpnSdPg3G0Qg==, + integrity: sha512-7s5DI1dw5HUF9+tHuZzkJaZBcaE3kuGsMw17/enEa8YdF0CtL5rW46FlzQ3/7NYIKc9rhDtb0UMakEej1cWFtg==, } - peerDependencies: - esbuild: "*" + engines: { node: ">=14.0.0" } dependencies: - esbuild: 0.16.3 - escape-string-regexp: 4.0.0 - rollup-plugin-node-polyfills: 0.2.1 - dev: true + "@aws-crypto/sha1-browser": 3.0.0 + "@aws-crypto/sha256-browser": 3.0.0 + "@aws-crypto/sha256-js": 3.0.0 + "@aws-sdk/client-sts": 3.382.0 + "@aws-sdk/credential-provider-node": 3.382.0 + "@aws-sdk/middleware-bucket-endpoint": 3.378.0 + "@aws-sdk/middleware-expect-continue": 3.378.0 + "@aws-sdk/middleware-flexible-checksums": 3.378.0 + "@aws-sdk/middleware-host-header": 3.379.1 + "@aws-sdk/middleware-location-constraint": 3.379.1 + "@aws-sdk/middleware-logger": 3.378.0 + "@aws-sdk/middleware-recursion-detection": 3.378.0 + "@aws-sdk/middleware-sdk-s3": 3.379.1 + "@aws-sdk/middleware-signing": 3.379.1 + "@aws-sdk/middleware-ssec": 3.378.0 + "@aws-sdk/middleware-user-agent": 3.382.0 + "@aws-sdk/signature-v4-multi-region": 3.378.0 + "@aws-sdk/types": 3.378.0 + "@aws-sdk/util-endpoints": 3.382.0 + "@aws-sdk/util-user-agent-browser": 3.378.0 + "@aws-sdk/util-user-agent-node": 3.378.0 + "@aws-sdk/xml-builder": 3.310.0 + "@smithy/config-resolver": 2.0.1 + "@smithy/eventstream-serde-browser": 2.0.1 + "@smithy/eventstream-serde-config-resolver": 2.0.1 + "@smithy/eventstream-serde-node": 2.0.1 + "@smithy/fetch-http-handler": 2.0.1 + "@smithy/hash-blob-browser": 2.0.1 + "@smithy/hash-node": 2.0.1 + "@smithy/hash-stream-node": 2.0.1 + "@smithy/invalid-dependency": 2.0.1 + "@smithy/md5-js": 2.0.1 + "@smithy/middleware-content-length": 2.0.1 + "@smithy/middleware-endpoint": 2.0.1 + "@smithy/middleware-retry": 2.0.1 + "@smithy/middleware-serde": 2.0.1 + "@smithy/middleware-stack": 2.0.0 + "@smithy/node-config-provider": 2.0.1 + "@smithy/node-http-handler": 2.0.1 + "@smithy/protocol-http": 2.0.1 + "@smithy/smithy-client": 2.0.1 + "@smithy/types": 2.0.2 + "@smithy/url-parser": 2.0.1 + "@smithy/util-base64": 2.0.0 + "@smithy/util-body-length-browser": 2.0.0 + "@smithy/util-body-length-node": 2.0.0 + "@smithy/util-defaults-mode-browser": 2.0.1 + "@smithy/util-defaults-mode-node": 2.0.1 + "@smithy/util-retry": 2.0.0 + "@smithy/util-stream": 2.0.1 + "@smithy/util-utf8": 2.0.0 + "@smithy/util-waiter": 2.0.1 + fast-xml-parser: 4.2.5 + tslib: 2.6.0 + transitivePeerDependencies: + - "@aws-sdk/signature-v4-crt" + - aws-crt + dev: false - /@esbuild/android-arm64@0.16.3: + /@aws-sdk/client-sso-oidc@3.382.0: resolution: { - integrity: sha512-RolFVeinkeraDvN/OoRf1F/lP0KUfGNb5jxy/vkIMeRRChkrX/HTYN6TYZosRJs3a1+8wqpxAo5PI5hFmxyPRg==, + integrity: sha512-hTfvB1ftbrqaz7qiEkmRobzUQwG34oZlByobn8Frdr5ZQbJk969bX6evQAPyKlJEr26+kL9TnaX+rbLR/+gwHQ==, } - engines: { node: ">=12" } - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true + engines: { node: ">=14.0.0" } + dependencies: + "@aws-crypto/sha256-browser": 3.0.0 + "@aws-crypto/sha256-js": 3.0.0 + "@aws-sdk/middleware-host-header": 3.379.1 + "@aws-sdk/middleware-logger": 3.378.0 + "@aws-sdk/middleware-recursion-detection": 3.378.0 + "@aws-sdk/middleware-user-agent": 3.382.0 + "@aws-sdk/types": 3.378.0 + "@aws-sdk/util-endpoints": 3.382.0 + "@aws-sdk/util-user-agent-browser": 3.378.0 + "@aws-sdk/util-user-agent-node": 3.378.0 + "@smithy/config-resolver": 2.0.1 + "@smithy/fetch-http-handler": 2.0.1 + "@smithy/hash-node": 2.0.1 + "@smithy/invalid-dependency": 2.0.1 + "@smithy/middleware-content-length": 2.0.1 + "@smithy/middleware-endpoint": 2.0.1 + "@smithy/middleware-retry": 2.0.1 + "@smithy/middleware-serde": 2.0.1 + "@smithy/middleware-stack": 2.0.0 + "@smithy/node-config-provider": 2.0.1 + "@smithy/node-http-handler": 2.0.1 + "@smithy/protocol-http": 2.0.1 + "@smithy/smithy-client": 2.0.1 + "@smithy/types": 2.0.2 + "@smithy/url-parser": 2.0.1 + "@smithy/util-base64": 2.0.0 + "@smithy/util-body-length-browser": 2.0.0 + "@smithy/util-body-length-node": 2.0.0 + "@smithy/util-defaults-mode-browser": 2.0.1 + "@smithy/util-defaults-mode-node": 2.0.1 + "@smithy/util-retry": 2.0.0 + "@smithy/util-utf8": 2.0.0 + tslib: 2.6.0 + transitivePeerDependencies: + - aws-crt + dev: false - /@esbuild/android-arm@0.16.3: + /@aws-sdk/client-sso@3.382.0: resolution: { - integrity: sha512-mueuEoh+s1eRbSJqq9KNBQwI4QhQV6sRXIfTyLXSHGMpyew61rOK4qY21uKbXl1iBoMb0AdL1deWFCQVlN2qHA==, + integrity: sha512-ge11t4hJllOF8pBNF0p1X52lLqUsLGAoey24fvk3fyvvczeLpegGYh2kdLG0iwFTDgRxaUqK+kboH5Wy9ux/pw==, } - engines: { node: ">=12" } - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true + engines: { node: ">=14.0.0" } + dependencies: + "@aws-crypto/sha256-browser": 3.0.0 + "@aws-crypto/sha256-js": 3.0.0 + "@aws-sdk/middleware-host-header": 3.379.1 + "@aws-sdk/middleware-logger": 3.378.0 + "@aws-sdk/middleware-recursion-detection": 3.378.0 + "@aws-sdk/middleware-user-agent": 3.382.0 + "@aws-sdk/types": 3.378.0 + "@aws-sdk/util-endpoints": 3.382.0 + "@aws-sdk/util-user-agent-browser": 3.378.0 + "@aws-sdk/util-user-agent-node": 3.378.0 + "@smithy/config-resolver": 2.0.1 + "@smithy/fetch-http-handler": 2.0.1 + "@smithy/hash-node": 2.0.1 + "@smithy/invalid-dependency": 2.0.1 + "@smithy/middleware-content-length": 2.0.1 + "@smithy/middleware-endpoint": 2.0.1 + "@smithy/middleware-retry": 2.0.1 + "@smithy/middleware-serde": 2.0.1 + "@smithy/middleware-stack": 2.0.0 + "@smithy/node-config-provider": 2.0.1 + "@smithy/node-http-handler": 2.0.1 + "@smithy/protocol-http": 2.0.1 + "@smithy/smithy-client": 2.0.1 + "@smithy/types": 2.0.2 + "@smithy/url-parser": 2.0.1 + "@smithy/util-base64": 2.0.0 + "@smithy/util-body-length-browser": 2.0.0 + "@smithy/util-body-length-node": 2.0.0 + "@smithy/util-defaults-mode-browser": 2.0.1 + "@smithy/util-defaults-mode-node": 2.0.1 + "@smithy/util-retry": 2.0.0 + "@smithy/util-utf8": 2.0.0 + tslib: 2.6.0 + transitivePeerDependencies: + - aws-crt + dev: false - /@esbuild/android-x64@0.16.3: + /@aws-sdk/client-sts@3.382.0: resolution: { - integrity: sha512-SFpTUcIT1bIJuCCBMCQWq1bL2gPTjWoLZdjmIhjdcQHaUfV41OQfho6Ici5uvvkMmZRXIUGpM3GxysP/EU7ifQ==, + integrity: sha512-G5wgahrOqmrljjyLVGASIZUXIIdalbCo0z4PuFHdb2R2CVfwO8renfgrmk4brT9tIxIfen5bRA7ftXMe7yrgRA==, } - engines: { node: ">=12" } - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true + engines: { node: ">=14.0.0" } + dependencies: + "@aws-crypto/sha256-browser": 3.0.0 + "@aws-crypto/sha256-js": 3.0.0 + "@aws-sdk/credential-provider-node": 3.382.0 + "@aws-sdk/middleware-host-header": 3.379.1 + "@aws-sdk/middleware-logger": 3.378.0 + "@aws-sdk/middleware-recursion-detection": 3.378.0 + "@aws-sdk/middleware-sdk-sts": 3.379.1 + "@aws-sdk/middleware-signing": 3.379.1 + "@aws-sdk/middleware-user-agent": 3.382.0 + "@aws-sdk/types": 3.378.0 + "@aws-sdk/util-endpoints": 3.382.0 + "@aws-sdk/util-user-agent-browser": 3.378.0 + "@aws-sdk/util-user-agent-node": 3.378.0 + "@smithy/config-resolver": 2.0.1 + "@smithy/fetch-http-handler": 2.0.1 + "@smithy/hash-node": 2.0.1 + "@smithy/invalid-dependency": 2.0.1 + "@smithy/middleware-content-length": 2.0.1 + "@smithy/middleware-endpoint": 2.0.1 + "@smithy/middleware-retry": 2.0.1 + "@smithy/middleware-serde": 2.0.1 + "@smithy/middleware-stack": 2.0.0 + "@smithy/node-config-provider": 2.0.1 + "@smithy/node-http-handler": 2.0.1 + "@smithy/protocol-http": 2.0.1 + "@smithy/smithy-client": 2.0.1 + "@smithy/types": 2.0.2 + "@smithy/url-parser": 2.0.1 + "@smithy/util-base64": 2.0.0 + "@smithy/util-body-length-browser": 2.0.0 + "@smithy/util-body-length-node": 2.0.0 + "@smithy/util-defaults-mode-browser": 2.0.1 + "@smithy/util-defaults-mode-node": 2.0.1 + "@smithy/util-retry": 2.0.0 + "@smithy/util-utf8": 2.0.0 + fast-xml-parser: 4.2.5 + tslib: 2.6.0 + transitivePeerDependencies: + - aws-crt + dev: false - /@esbuild/darwin-arm64@0.16.3: + /@aws-sdk/credential-provider-env@3.378.0: resolution: { - integrity: sha512-DO8WykMyB+N9mIDfI/Hug70Dk1KipavlGAecxS3jDUwAbTpDXj0Lcwzw9svkhxfpCagDmpaTMgxWK8/C/XcXvw==, + integrity: sha512-B2OVdO9kBClDwGgWTBLAQwFV8qYTYGyVujg++1FZFSFMt8ORFdZ5fNpErvJtiSjYiOOQMzyBeSNhKyYNXCiJjQ==, } - engines: { node: ">=12" } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true + engines: { node: ">=14.0.0" } + dependencies: + "@aws-sdk/types": 3.378.0 + "@smithy/property-provider": 2.0.1 + "@smithy/types": 2.0.2 + tslib: 2.6.0 + dev: false - /@esbuild/darwin-x64@0.16.3: + /@aws-sdk/credential-provider-ini@3.382.0: resolution: { - integrity: sha512-uEqZQ2omc6BvWqdCiyZ5+XmxuHEi1SPzpVxXCSSV2+Sh7sbXbpeNhHIeFrIpRjAs0lI1FmA1iIOxFozKBhKgRQ==, + integrity: sha512-31pi44WWri2WQmagqptUv7x3Nq8pQ6H06OCQx5goEm77SosSdwQwyBPrS9Pg0yI9aljFAxF+rZ75degsCorbQg==, } - engines: { node: ">=12" } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true + engines: { node: ">=14.0.0" } + dependencies: + "@aws-sdk/credential-provider-env": 3.378.0 + "@aws-sdk/credential-provider-process": 3.378.0 + "@aws-sdk/credential-provider-sso": 3.382.0 + "@aws-sdk/credential-provider-web-identity": 3.378.0 + "@aws-sdk/types": 3.378.0 + "@smithy/credential-provider-imds": 2.0.1 + "@smithy/property-provider": 2.0.1 + "@smithy/shared-ini-file-loader": 2.0.1 + "@smithy/types": 2.0.2 + tslib: 2.6.0 + transitivePeerDependencies: + - aws-crt + dev: false - /@esbuild/freebsd-arm64@0.16.3: + /@aws-sdk/credential-provider-node@3.382.0: resolution: { - integrity: sha512-nJansp3sSXakNkOD5i5mIz2Is/HjzIhFs49b1tjrPrpCmwgBmH9SSzhC/Z1UqlkivqMYkhfPwMw1dGFUuwmXhw==, + integrity: sha512-q6AWCCb0E0cH/Y5Dtln0QssbCBXDbV4PoTV3EdRuGoJcHyNfHJ8X0mqcc7k44wG4Piazu+ufZThvn43W7W9a4g==, } - engines: { node: ">=12" } - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true + engines: { node: ">=14.0.0" } + dependencies: + "@aws-sdk/credential-provider-env": 3.378.0 + "@aws-sdk/credential-provider-ini": 3.382.0 + "@aws-sdk/credential-provider-process": 3.378.0 + "@aws-sdk/credential-provider-sso": 3.382.0 + "@aws-sdk/credential-provider-web-identity": 3.378.0 + "@aws-sdk/types": 3.378.0 + "@smithy/credential-provider-imds": 2.0.1 + "@smithy/property-provider": 2.0.1 + "@smithy/shared-ini-file-loader": 2.0.1 + "@smithy/types": 2.0.2 + tslib: 2.6.0 + transitivePeerDependencies: + - aws-crt + dev: false - /@esbuild/freebsd-x64@0.16.3: + /@aws-sdk/credential-provider-process@3.378.0: resolution: { - integrity: sha512-TfoDzLw+QHfc4a8aKtGSQ96Wa+6eimljjkq9HKR0rHlU83vw8aldMOUSJTUDxbcUdcgnJzPaX8/vGWm7vyV7ug==, + integrity: sha512-KFTIy7u+wXj3eDua4rgS0tODzMnXtXhAm1RxzCW9FL5JLBBrd82ymCj1Dp72217Sw5Do6NjCnDTTNkCHZMA77w==, } - engines: { node: ">=12" } - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true + engines: { node: ">=14.0.0" } + dependencies: + "@aws-sdk/types": 3.378.0 + "@smithy/property-provider": 2.0.1 + "@smithy/shared-ini-file-loader": 2.0.1 + "@smithy/types": 2.0.2 + tslib: 2.6.0 + dev: false - /@esbuild/linux-arm64@0.16.3: + /@aws-sdk/credential-provider-sso@3.382.0: resolution: { - integrity: sha512-7I3RlsnxEFCHVZNBLb2w7unamgZ5sVwO0/ikE2GaYvYuUQs9Qte/w7TqWcXHtCwxvZx/2+F97ndiUQAWs47ZfQ==, + integrity: sha512-tKCQKqxnAHeRD7pQNmDmLWwC7pt5koo6yiQTVQ382U+8xx7BNsApE1zdC4LrtrVN1FYqVbw5kXjYFtSCtaUxGA==, } - engines: { node: ">=12" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true + engines: { node: ">=14.0.0" } + dependencies: + "@aws-sdk/client-sso": 3.382.0 + "@aws-sdk/token-providers": 3.382.0 + "@aws-sdk/types": 3.378.0 + "@smithy/property-provider": 2.0.1 + "@smithy/shared-ini-file-loader": 2.0.1 + "@smithy/types": 2.0.2 + tslib: 2.6.0 + transitivePeerDependencies: + - aws-crt + dev: false - /@esbuild/linux-arm@0.16.3: + /@aws-sdk/credential-provider-web-identity@3.378.0: resolution: { - integrity: sha512-VwswmSYwVAAq6LysV59Fyqk3UIjbhuc6wb3vEcJ7HEJUtFuLK9uXWuFoH1lulEbE4+5GjtHi3MHX+w1gNHdOWQ==, + integrity: sha512-GWjydOszhc4xDF8xuPtBvboglXQr0gwCW1oHAvmLcOT38+Hd6qnKywnMSeoXYRPgoKfF9TkWQgW1jxplzCG0UA==, } - engines: { node: ">=12" } - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true + engines: { node: ">=14.0.0" } + dependencies: + "@aws-sdk/types": 3.378.0 + "@smithy/property-provider": 2.0.1 + "@smithy/types": 2.0.2 + tslib: 2.6.0 + dev: false - /@esbuild/linux-ia32@0.16.3: + /@aws-sdk/middleware-bucket-endpoint@3.378.0: resolution: { - integrity: sha512-X8FDDxM9cqda2rJE+iblQhIMYY49LfvW4kaEjoFbTTQ4Go8G96Smj2w3BRTwA8IHGoi9dPOPGAX63dhuv19UqA==, + integrity: sha512-3o+AYU6JWUsPM49bWglCUOgNvySiHkbIma0J6F9a68e30vEDD0FUQtKzyHPZkF7iYDyesEl166gYjwVNAmASzw==, } - engines: { node: ">=12" } - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true + engines: { node: ">=14.0.0" } + dependencies: + "@aws-sdk/types": 3.378.0 + "@aws-sdk/util-arn-parser": 3.310.0 + "@smithy/protocol-http": 2.0.1 + "@smithy/types": 2.0.2 + "@smithy/util-config-provider": 2.0.0 + tslib: 2.6.0 + dev: false - /@esbuild/linux-loong64@0.16.3: + /@aws-sdk/middleware-expect-continue@3.378.0: resolution: { - integrity: sha512-hIbeejCOyO0X9ujfIIOKjBjNAs9XD/YdJ9JXAy1lHA+8UXuOqbFe4ErMCqMr8dhlMGBuvcQYGF7+kO7waj2KHw==, + integrity: sha512-8maaNQvza3/IGDbIyVQkUbGlo+Oc6SY1gVG50UMcTUX8nwZrD1/ko+ft+pd2EDb2n+0JritoDj4bjr6pdesNBg==, } - engines: { node: ">=12" } - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true + engines: { node: ">=14.0.0" } + dependencies: + "@aws-sdk/types": 3.378.0 + "@smithy/protocol-http": 2.0.1 + "@smithy/types": 2.0.2 + tslib: 2.6.0 + dev: false - /@esbuild/linux-mips64el@0.16.3: + /@aws-sdk/middleware-flexible-checksums@3.378.0: resolution: { - integrity: sha512-znFRzICT/V8VZQMt6rjb21MtAVJv/3dmKRMlohlShrbVXdBuOdDrGb+C2cZGQAR8RFyRe7HS6klmHq103WpmVw==, + integrity: sha512-pHkcVTu2T+x/1fpPHMpRDpXY5zxDsjijv3C6Nz/nm3gQrZvQ3fYDrQdV3Oj6Xeg40B3kkcp/bzgDo7MDzG088A==, } - engines: { node: ">=12" } - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true + engines: { node: ">=14.0.0" } + dependencies: + "@aws-crypto/crc32": 3.0.0 + "@aws-crypto/crc32c": 3.0.0 + "@aws-sdk/types": 3.378.0 + "@smithy/is-array-buffer": 2.0.0 + "@smithy/protocol-http": 2.0.1 + "@smithy/types": 2.0.2 + "@smithy/util-utf8": 2.0.0 + tslib: 2.6.0 + dev: false - /@esbuild/linux-ppc64@0.16.3: + /@aws-sdk/middleware-host-header@3.379.1: resolution: { - integrity: sha512-EV7LuEybxhXrVTDpbqWF2yehYRNz5e5p+u3oQUS2+ZFpknyi1NXxr8URk4ykR8Efm7iu04//4sBg249yNOwy5Q==, + integrity: sha512-LI4KpAFWNWVr2aH2vRVblr0Y8tvDz23lj8LOmbDmCrzd5M21nxuocI/8nEAQj55LiTIf9Zs+dHCdsyegnFXdrA==, } - engines: { node: ">=12" } - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true + engines: { node: ">=14.0.0" } + dependencies: + "@aws-sdk/types": 3.378.0 + "@smithy/protocol-http": 2.0.1 + "@smithy/types": 2.0.2 + tslib: 2.6.0 + dev: false - /@esbuild/linux-riscv64@0.16.3: + /@aws-sdk/middleware-location-constraint@3.379.1: resolution: { - integrity: sha512-uDxqFOcLzFIJ+r/pkTTSE9lsCEaV/Y6rMlQjUI9BkzASEChYL/aSQjZjchtEmdnVxDKETnUAmsaZ4pqK1eE5BQ==, + integrity: sha512-+bmy8DjX9jtqJk8WiDaHoP9M5ZcqjHSJf4mkv8IUZ/FNTUl9j6Dll//bG/JxuAw5e5shtCDjmZ027W5d9ITp0g==, } - engines: { node: ">=12" } - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true + engines: { node: ">=14.0.0" } + dependencies: + "@aws-sdk/types": 3.378.0 + "@smithy/types": 2.0.2 + tslib: 2.6.0 + dev: false - /@esbuild/linux-s390x@0.16.3: + /@aws-sdk/middleware-logger@3.378.0: resolution: { - integrity: sha512-NbeREhzSxYwFhnCAQOQZmajsPYtX71Ufej3IQ8W2Gxskfz9DK58ENEju4SbpIj48VenktRASC52N5Fhyf/aliQ==, + integrity: sha512-l1DyaDLm3KeBMNMuANI3scWh8Xvu248x+vw6Z7ExWOhGXFmQ1MW7YvASg/SdxWkhlF9HmkkTif1LdMB22x6QDA==, } - engines: { node: ">=12" } - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true + engines: { node: ">=14.0.0" } + dependencies: + "@aws-sdk/types": 3.378.0 + "@smithy/types": 2.0.2 + tslib: 2.6.0 + dev: false - /@esbuild/linux-x64@0.16.3: + /@aws-sdk/middleware-recursion-detection@3.378.0: resolution: { - integrity: sha512-SDiG0nCixYO9JgpehoKgScwic7vXXndfasjnD5DLbp1xltANzqZ425l7LSdHynt19UWOcDjG9wJJzSElsPvk0w==, + integrity: sha512-mUMfHAz0oGNIWiTZHTVJb+I515Hqs2zx1j36Le4MMiiaMkPW1SRUF1FIwGuc1wh6E8jB5q+XfEMriDjRi4TZRA==, } - engines: { node: ">=12" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true + engines: { node: ">=14.0.0" } + dependencies: + "@aws-sdk/types": 3.378.0 + "@smithy/protocol-http": 2.0.1 + "@smithy/types": 2.0.2 + tslib: 2.6.0 + dev: false - /@esbuild/netbsd-x64@0.16.3: + /@aws-sdk/middleware-sdk-s3@3.379.1: resolution: { - integrity: sha512-AzbsJqiHEq1I/tUvOfAzCY15h4/7Ivp3ff/o1GpP16n48JMNAtbW0qui2WCgoIZArEHD0SUQ95gvR0oSO7ZbdA==, + integrity: sha512-NVHRpNLfkHCqr3CE1Bmlf8Fhys8lL78kDX7UONnTZXvSiSXmCS7EbNtGDghZ8IKi+V9S/ifB4sLsX3tfzY0i6Q==, } - engines: { node: ">=12" } - cpu: [x64] - os: [netbsd] - requiresBuild: true + engines: { node: ">=14.0.0" } + dependencies: + "@aws-sdk/types": 3.378.0 + "@aws-sdk/util-arn-parser": 3.310.0 + "@smithy/protocol-http": 2.0.1 + "@smithy/types": 2.0.2 + tslib: 2.6.0 + dev: false + + /@aws-sdk/middleware-sdk-sts@3.379.1: + resolution: + { + integrity: sha512-SK3gSyT0XbLiY12+AjLFYL9YngxOXHnZF3Z33Cdd4a+AUYrVBV7JBEEGD1Nlwrcmko+3XgaKlmgUaR5s91MYvg==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@aws-sdk/middleware-signing": 3.379.1 + "@aws-sdk/types": 3.378.0 + "@smithy/types": 2.0.2 + tslib: 2.6.0 + dev: false + + /@aws-sdk/middleware-signing@3.379.1: + resolution: + { + integrity: sha512-kBk2ZUvR84EM4fICjr8K+Ykpf8SI1UzzPp2/UVYZ0X+4H/ZCjfSqohGRwHykMqeplne9qHSL7/rGJs1H3l3gPg==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@aws-sdk/types": 3.378.0 + "@smithy/property-provider": 2.0.1 + "@smithy/protocol-http": 2.0.1 + "@smithy/signature-v4": 2.0.1 + "@smithy/types": 2.0.2 + "@smithy/util-middleware": 2.0.0 + tslib: 2.6.0 + dev: false + + /@aws-sdk/middleware-ssec@3.378.0: + resolution: + { + integrity: sha512-WDT2LOd6OxlY1zkrRG9ZtW2vFms/dsqMg9VyE88RKG2oATxSXEhkr5zLbNVh3TyuUKnV9jydate56d/ECwHOHg==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@aws-sdk/types": 3.378.0 + "@smithy/types": 2.0.2 + tslib: 2.6.0 + dev: false + + /@aws-sdk/middleware-user-agent@3.382.0: + resolution: + { + integrity: sha512-LFRW1jmXOrOAd3911ktn6oaYmuurNnulbdRMOUdwz99GGdLVFipQhOi9idKswb8IOhPa4jEVQt25Kcv7ctvu0A==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@aws-sdk/types": 3.378.0 + "@aws-sdk/util-endpoints": 3.382.0 + "@smithy/protocol-http": 2.0.1 + "@smithy/types": 2.0.2 + tslib: 2.6.0 + dev: false + + /@aws-sdk/signature-v4-multi-region@3.378.0: + resolution: + { + integrity: sha512-gtuABS7EeYZQeNzTrabY3Ruv4wWmoz4u8OMSGl47gYPDWA70WYEZ0aoi4zSGuKhXiqtVvTsO9wGEMIInwV5phQ==, + } + engines: { node: ">=14.0.0" } + peerDependencies: + "@aws-sdk/signature-v4-crt": ^3.118.0 + peerDependenciesMeta: + "@aws-sdk/signature-v4-crt": + optional: true + dependencies: + "@aws-sdk/types": 3.378.0 + "@smithy/protocol-http": 2.0.1 + "@smithy/signature-v4": 2.0.1 + "@smithy/types": 2.0.2 + tslib: 2.6.0 + dev: false + + /@aws-sdk/token-providers@3.382.0: + resolution: + { + integrity: sha512-axn4IyPpHdkXi8G06KCB3tPz79DipZFFH9N9YVDpLMnDYTdfX36HGdYzINaQc+z+XPbEpa1ZpoIzWScHRjFjdg==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@aws-sdk/client-sso-oidc": 3.382.0 + "@aws-sdk/types": 3.378.0 + "@smithy/property-provider": 2.0.1 + "@smithy/shared-ini-file-loader": 2.0.1 + "@smithy/types": 2.0.2 + tslib: 2.6.0 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/types@3.378.0: + resolution: + { + integrity: sha512-qP0CvR/ItgktmN8YXpGQglzzR/6s0nrsQ4zIfx3HMwpsBTwuouYahcCtF1Vr82P4NFcoDA412EJahJ2pIqEd+w==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/types": 2.0.2 + tslib: 2.6.0 + dev: false + + /@aws-sdk/util-arn-parser@3.310.0: + resolution: + { + integrity: sha512-jL8509owp/xB9+Or0pvn3Fe+b94qfklc2yPowZZIFAkFcCSIdkIglz18cPDWnYAcy9JGewpMS1COXKIUhZkJsA==, + } + engines: { node: ">=14.0.0" } + dependencies: + tslib: 2.6.0 + dev: false + + /@aws-sdk/util-endpoints@3.382.0: + resolution: + { + integrity: sha512-flajPyjmjNG67fXk7l4GoTB/7J11VBqtFZXuuAZKhKU07Ia3IQupsFqNf5lV8D44ZgjnKH0fTGnv3dUALjW7Wg==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@aws-sdk/types": 3.378.0 + tslib: 2.6.0 + dev: false + + /@aws-sdk/util-locate-window@3.310.0: + resolution: + { + integrity: sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==, + } + engines: { node: ">=14.0.0" } + dependencies: + tslib: 2.6.0 + dev: false + + /@aws-sdk/util-user-agent-browser@3.378.0: + resolution: + { + integrity: sha512-FSCpagzftK1W+m7Ar6lpX7/Gr9y5P56nhFYz8U4EYQ4PkufS6czWX9YW+/FA5OYV0vlQ/SvPqMnzoHIPUNhZrQ==, + } + dependencies: + "@aws-sdk/types": 3.378.0 + "@smithy/types": 2.0.2 + bowser: 2.11.0 + tslib: 2.6.0 + dev: false + + /@aws-sdk/util-user-agent-node@3.378.0: + resolution: + { + integrity: sha512-IdwVJV0E96MkJeFte4dlWqvB+oiqCiZ5lOlheY3W9NynTuuX0GGYNC8Y9yIsV8Oava1+ujpJq0ww6qXdYxmO4A==, + } + engines: { node: ">=14.0.0" } + peerDependencies: + aws-crt: ">=1.0.0" + peerDependenciesMeta: + aws-crt: + optional: true + dependencies: + "@aws-sdk/types": 3.378.0 + "@smithy/node-config-provider": 2.0.1 + "@smithy/types": 2.0.2 + tslib: 2.6.0 + dev: false + + /@aws-sdk/util-utf8-browser@3.259.0: + resolution: + { + integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==, + } + dependencies: + tslib: 2.6.0 + dev: false + + /@aws-sdk/xml-builder@3.310.0: + resolution: + { + integrity: sha512-TqELu4mOuSIKQCqj63fGVs86Yh+vBx5nHRpWKNUNhB2nPTpfbziTs5c1X358be3peVWA4wPxW7Nt53KIg1tnNw==, + } + engines: { node: ">=14.0.0" } + dependencies: + tslib: 2.6.0 + dev: false + + /@cloudflare/kv-asset-handler@0.2.0: + resolution: + { + integrity: sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==, + } + dependencies: + mime: 3.0.0 dev: true - optional: true - /@esbuild/openbsd-x64@0.16.3: + /@cloudflare/workerd-darwin-64@1.20230710.0: resolution: { - integrity: sha512-gSABi8qHl8k3Cbi/4toAzHiykuBuWLZs43JomTcXkjMZVkp0gj3gg9mO+9HJW/8GB5H89RX/V0QP4JGL7YEEVg==, + integrity: sha512-TDEgTfzTkveW+U0qtg9/60PXbl2klnEso0oio501zAnY2SOC1x7M0qb8UkhvjHFUVpwdykUzTPWPIWFBcF1ibA==, } - engines: { node: ">=12" } + engines: { node: ">=16" } cpu: [x64] - os: [openbsd] + os: [darwin] requiresBuild: true dev: true optional: true - /@esbuild/sunos-x64@0.16.3: + /@cloudflare/workerd-darwin-arm64@1.20230710.0: resolution: { - integrity: sha512-SF9Kch5Ete4reovvRO6yNjMxrvlfT0F0Flm+NPoUw5Z4Q3r1d23LFTgaLwm3Cp0iGbrU/MoUI+ZqwCv5XJijCw==, + integrity: sha512-dxBwnKcj7TiM1JGiODg0LASa25A9P0XLeMkmF8YCECZoq+3QLH/uY4Vbm1xeEy8iXUZrt/uYN72bBE83vY4HIQ==, } - engines: { node: ">=12" } - cpu: [x64] - os: [sunos] + engines: { node: ">=16" } + cpu: [arm64] + os: [darwin] requiresBuild: true dev: true optional: true - /@esbuild/win32-arm64@0.16.3: + /@cloudflare/workerd-linux-64@1.20230710.0: resolution: { - integrity: sha512-u5aBonZIyGopAZyOnoPAA6fGsDeHByZ9CnEzyML9NqntK6D/xl5jteZUKm/p6nD09+v3pTM6TuUIqSPcChk5gg==, + integrity: sha512-WrKZwL76i51jQLFpSxklpRSm2s8T9Xf6tVzQaiLTtpguKZSF/CTAyjjEOVfS7FXk+Te8lyAJAFQnj5QHoJ3pzA==, } - engines: { node: ">=12" } - cpu: [arm64] - os: [win32] + engines: { node: ">=16" } + cpu: [x64] + os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/win32-ia32@0.16.3: + /@cloudflare/workerd-linux-arm64@1.20230710.0: resolution: { - integrity: sha512-GlgVq1WpvOEhNioh74TKelwla9KDuAaLZrdxuuUgsP2vayxeLgVc+rbpIv0IYF4+tlIzq2vRhofV+KGLD+37EQ==, + integrity: sha512-eWdbOoqFqQ4m1/Wwy2dRDaOVXjOmWGjwBliU8pvm2m9RjfRTdfik7z6E3vOkalxqJDHiJ0f8SUykKz2oM1lD0A==, } - engines: { node: ">=12" } - cpu: [ia32] - os: [win32] + engines: { node: ">=16" } + cpu: [arm64] + os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/win32-x64@0.16.3: + /@cloudflare/workerd-windows-64@1.20230710.0: resolution: { - integrity: sha512-5/JuTd8OWW8UzEtyf19fbrtMJENza+C9JoPIkvItgTBQ1FO2ZLvjbPO6Xs54vk0s5JB5QsfieUEshRQfu7ZHow==, + integrity: sha512-P5ihH98Pb72HrsVsvb/HCSezvAvEtPeVQVBKgIclNE9e0fkA4zX9QMzBBFvLy3yr0YLf4r7MO2tNnt7JFnheGA==, } - engines: { node: ">=12" } + engines: { node: ">=16" } cpu: [x64] os: [win32] requiresBuild: true dev: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.45.0): + /@cloudflare/workers-types@4.20230710.1: resolution: { - integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, + integrity: sha512-VqEY/ZqyHKBn6ivdePSWebpqojwbCXVEuwLkMYHs0UoOAqcGylkVcabdZYdQJKeNxXcOUZ9UBId/x9UsPUm2XQ==, } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.45.0 - eslint-visitor-keys: 3.4.1 - /@eslint-community/regexpp@4.5.1: + /@drizzle-team/studio@0.0.5: resolution: { - integrity: sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==, + integrity: sha512-ps5qF0tMxWRVu+V5gvCRrQNqlY92aTnIKdq27gm9LZMSdaKYZt6AVvSK1dlUMzs6Rt0Jm80b+eWct6xShBKhIw==, } - engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } + dev: false - /@eslint/eslintrc@2.1.0: + /@esbuild-kit/core-utils@3.1.0: resolution: { - integrity: sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==, + integrity: sha512-Uuk8RpCg/7fdHSceR1M6XbSZFSuMrxcePFuGgyvsBn+u339dk5OeL4jv2EojwTN2st/unJGsVm4qHWjWNmJ/tw==, } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.6.1 - globals: 13.20.0 - ignore: 5.2.4 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color + esbuild: 0.17.19 + source-map-support: 0.5.21 + dev: false - /@eslint/js@8.44.0: + /@esbuild-kit/esm-loader@2.5.5: resolution: { - integrity: sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==, + integrity: sha512-Qwfvj/qoPbClxCRNuac1Du01r9gvNOT+pMYtJDapfB1eoGN1YlJ1BixLyL9WVENRx5RXgNLdfYdx/CuswlGhMw==, } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + "@esbuild-kit/core-utils": 3.1.0 + get-tsconfig: 4.6.2 + dev: false - /@humanwhocodes/config-array@0.11.10: + /@esbuild-plugins/node-globals-polyfill@0.1.1(esbuild@0.16.3): resolution: { - integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==, + integrity: sha512-MR0oAA+mlnJWrt1RQVQ+4VYuRJW/P2YmRTv1AsplObyvuBMnPHiizUF95HHYiSsMGLhyGtWufaq2XQg6+iurBg==, } - engines: { node: ">=10.10.0" } + peerDependencies: + esbuild: "*" dependencies: - "@humanwhocodes/object-schema": 1.2.1 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color + esbuild: 0.16.3 + dev: true - /@humanwhocodes/module-importer@1.0.1: + /@esbuild-plugins/node-modules-polyfill@0.1.4(esbuild@0.16.3): resolution: { - integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, + integrity: sha512-uZbcXi0zbmKC/050p3gJnne5Qdzw8vkXIv+c2BW0Lsc1ji1SkrxbKPUy5Efr0blbTu1SL8w4eyfpnSdPg3G0Qg==, } - engines: { node: ">=12.22" } + peerDependencies: + esbuild: "*" + dependencies: + esbuild: 0.16.3 + escape-string-regexp: 4.0.0 + rollup-plugin-node-polyfills: 0.2.1 + dev: true - /@humanwhocodes/object-schema@1.2.1: + /@esbuild/android-arm64@0.16.3: resolution: { - integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==, + integrity: sha512-RolFVeinkeraDvN/OoRf1F/lP0KUfGNb5jxy/vkIMeRRChkrX/HTYN6TYZosRJs3a1+8wqpxAo5PI5hFmxyPRg==, } + engines: { node: ">=12" } + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true - /@nodelib/fs.scandir@2.1.5: + /@esbuild/android-arm64@0.17.19: resolution: { - integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, + integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==, } - engines: { node: ">= 8" } - dependencies: - "@nodelib/fs.stat": 2.0.5 - run-parallel: 1.2.0 + engines: { node: ">=12" } + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true - /@nodelib/fs.stat@2.0.5: + /@esbuild/android-arm64@0.18.17: + resolution: + { + integrity: sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-arm@0.16.3: + resolution: + { + integrity: sha512-mueuEoh+s1eRbSJqq9KNBQwI4QhQV6sRXIfTyLXSHGMpyew61rOK4qY21uKbXl1iBoMb0AdL1deWFCQVlN2qHA==, + } + engines: { node: ">=12" } + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.17.19: + resolution: + { + integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==, + } + engines: { node: ">=12" } + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-arm@0.18.17: + resolution: + { + integrity: sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg==, + } + engines: { node: ">=12" } + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-x64@0.16.3: + resolution: + { + integrity: sha512-SFpTUcIT1bIJuCCBMCQWq1bL2gPTjWoLZdjmIhjdcQHaUfV41OQfho6Ici5uvvkMmZRXIUGpM3GxysP/EU7ifQ==, + } + engines: { node: ">=12" } + cpu: [x64] + 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: false + optional: true + + /@esbuild/android-x64@0.18.17: + resolution: + { + integrity: sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-arm64@0.16.3: + resolution: + { + integrity: sha512-DO8WykMyB+N9mIDfI/Hug70Dk1KipavlGAecxS3jDUwAbTpDXj0Lcwzw9svkhxfpCagDmpaTMgxWK8/C/XcXvw==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [darwin] + 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: false + optional: true + + /@esbuild/darwin-arm64@0.18.17: + resolution: + { + integrity: sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-x64@0.16.3: + resolution: + { + integrity: sha512-uEqZQ2omc6BvWqdCiyZ5+XmxuHEi1SPzpVxXCSSV2+Sh7sbXbpeNhHIeFrIpRjAs0lI1FmA1iIOxFozKBhKgRQ==, + } + engines: { node: ">=12" } + cpu: [x64] + 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: false + optional: true + + /@esbuild/darwin-x64@0.18.17: + resolution: + { + integrity: sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-arm64@0.16.3: + resolution: + { + integrity: sha512-nJansp3sSXakNkOD5i5mIz2Is/HjzIhFs49b1tjrPrpCmwgBmH9SSzhC/Z1UqlkivqMYkhfPwMw1dGFUuwmXhw==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [freebsd] + 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: false + optional: true + + /@esbuild/freebsd-arm64@0.18.17: + resolution: + { + integrity: sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-x64@0.16.3: + resolution: + { + integrity: sha512-TfoDzLw+QHfc4a8aKtGSQ96Wa+6eimljjkq9HKR0rHlU83vw8aldMOUSJTUDxbcUdcgnJzPaX8/vGWm7vyV7ug==, + } + engines: { node: ">=12" } + cpu: [x64] + 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: false + optional: true + + /@esbuild/freebsd-x64@0.18.17: + resolution: + { + integrity: sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm64@0.16.3: + resolution: + { + integrity: sha512-7I3RlsnxEFCHVZNBLb2w7unamgZ5sVwO0/ikE2GaYvYuUQs9Qte/w7TqWcXHtCwxvZx/2+F97ndiUQAWs47ZfQ==, + } + engines: { node: ">=12" } + cpu: [arm64] + 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: false + optional: true + + /@esbuild/linux-arm64@0.18.17: + resolution: + { + integrity: sha512-c9w3tE7qA3CYWjT+M3BMbwMt+0JYOp3vCMKgVBrCl1nwjAlOMYzEo+gG7QaZ9AtqZFj5MbUc885wuBBmu6aADQ==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm@0.16.3: + resolution: + { + integrity: sha512-VwswmSYwVAAq6LysV59Fyqk3UIjbhuc6wb3vEcJ7HEJUtFuLK9uXWuFoH1lulEbE4+5GjtHi3MHX+w1gNHdOWQ==, + } + engines: { node: ">=12" } + cpu: [arm] + os: [linux] + 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: false + optional: true + + /@esbuild/linux-arm@0.18.17: + resolution: + { + integrity: sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg==, + } + engines: { node: ">=12" } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ia32@0.16.3: + resolution: + { + integrity: sha512-X8FDDxM9cqda2rJE+iblQhIMYY49LfvW4kaEjoFbTTQ4Go8G96Smj2w3BRTwA8IHGoi9dPOPGAX63dhuv19UqA==, + } + engines: { node: ">=12" } + cpu: [ia32] + 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: false + optional: true + + /@esbuild/linux-ia32@0.18.17: + resolution: + { + integrity: sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg==, + } + engines: { node: ">=12" } + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-loong64@0.16.3: + resolution: + { + integrity: sha512-hIbeejCOyO0X9ujfIIOKjBjNAs9XD/YdJ9JXAy1lHA+8UXuOqbFe4ErMCqMr8dhlMGBuvcQYGF7+kO7waj2KHw==, + } + engines: { node: ">=12" } + cpu: [loong64] + 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: false + optional: true + + /@esbuild/linux-loong64@0.18.17: + resolution: + { + integrity: sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg==, + } + engines: { node: ">=12" } + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-mips64el@0.16.3: + resolution: + { + integrity: sha512-znFRzICT/V8VZQMt6rjb21MtAVJv/3dmKRMlohlShrbVXdBuOdDrGb+C2cZGQAR8RFyRe7HS6klmHq103WpmVw==, + } + engines: { node: ">=12" } + cpu: [mips64el] + 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: false + optional: true + + /@esbuild/linux-mips64el@0.18.17: + resolution: + { + integrity: sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ==, + } + engines: { node: ">=12" } + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ppc64@0.16.3: + resolution: + { + integrity: sha512-EV7LuEybxhXrVTDpbqWF2yehYRNz5e5p+u3oQUS2+ZFpknyi1NXxr8URk4ykR8Efm7iu04//4sBg249yNOwy5Q==, + } + engines: { node: ">=12" } + cpu: [ppc64] + 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: false + optional: true + + /@esbuild/linux-ppc64@0.18.17: + resolution: + { + integrity: sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ==, + } + engines: { node: ">=12" } + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-riscv64@0.16.3: + resolution: + { + integrity: sha512-uDxqFOcLzFIJ+r/pkTTSE9lsCEaV/Y6rMlQjUI9BkzASEChYL/aSQjZjchtEmdnVxDKETnUAmsaZ4pqK1eE5BQ==, + } + engines: { node: ">=12" } + cpu: [riscv64] + 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: false + optional: true + + /@esbuild/linux-riscv64@0.18.17: + resolution: + { + integrity: sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g==, + } + engines: { node: ">=12" } + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-s390x@0.16.3: + resolution: + { + integrity: sha512-NbeREhzSxYwFhnCAQOQZmajsPYtX71Ufej3IQ8W2Gxskfz9DK58ENEju4SbpIj48VenktRASC52N5Fhyf/aliQ==, + } + engines: { node: ">=12" } + cpu: [s390x] + 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: false + optional: true + + /@esbuild/linux-s390x@0.18.17: + resolution: + { + integrity: sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg==, + } + engines: { node: ">=12" } + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-x64@0.16.3: + resolution: + { + integrity: sha512-SDiG0nCixYO9JgpehoKgScwic7vXXndfasjnD5DLbp1xltANzqZ425l7LSdHynt19UWOcDjG9wJJzSElsPvk0w==, + } + engines: { node: ">=12" } + cpu: [x64] + 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: false + optional: true + + /@esbuild/linux-x64@0.18.17: + resolution: + { + integrity: sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/netbsd-x64@0.16.3: + resolution: + { + integrity: sha512-AzbsJqiHEq1I/tUvOfAzCY15h4/7Ivp3ff/o1GpP16n48JMNAtbW0qui2WCgoIZArEHD0SUQ95gvR0oSO7ZbdA==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [netbsd] + 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: false + optional: true + + /@esbuild/netbsd-x64@0.18.17: + resolution: + { + integrity: sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/openbsd-x64@0.16.3: + resolution: + { + integrity: sha512-gSABi8qHl8k3Cbi/4toAzHiykuBuWLZs43JomTcXkjMZVkp0gj3gg9mO+9HJW/8GB5H89RX/V0QP4JGL7YEEVg==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [openbsd] + 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: false + optional: true + + /@esbuild/openbsd-x64@0.18.17: + resolution: + { + integrity: sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/sunos-x64@0.16.3: + resolution: + { + integrity: sha512-SF9Kch5Ete4reovvRO6yNjMxrvlfT0F0Flm+NPoUw5Z4Q3r1d23LFTgaLwm3Cp0iGbrU/MoUI+ZqwCv5XJijCw==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [sunos] + 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: false + optional: true + + /@esbuild/sunos-x64@0.18.17: + resolution: + { + integrity: sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-arm64@0.16.3: + resolution: + { + integrity: sha512-u5aBonZIyGopAZyOnoPAA6fGsDeHByZ9CnEzyML9NqntK6D/xl5jteZUKm/p6nD09+v3pTM6TuUIqSPcChk5gg==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [win32] + 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: false + optional: true + + /@esbuild/win32-arm64@0.18.17: + resolution: + { + integrity: sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-ia32@0.16.3: + resolution: + { + integrity: sha512-GlgVq1WpvOEhNioh74TKelwla9KDuAaLZrdxuuUgsP2vayxeLgVc+rbpIv0IYF4+tlIzq2vRhofV+KGLD+37EQ==, + } + engines: { node: ">=12" } + cpu: [ia32] + 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: false + optional: true + + /@esbuild/win32-ia32@0.18.17: + resolution: + { + integrity: sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg==, + } + engines: { node: ">=12" } + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-x64@0.16.3: + resolution: + { + integrity: sha512-5/JuTd8OWW8UzEtyf19fbrtMJENza+C9JoPIkvItgTBQ1FO2ZLvjbPO6Xs54vk0s5JB5QsfieUEshRQfu7ZHow==, + } + engines: { node: ">=12" } + cpu: [x64] + 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: false + optional: true + + /@esbuild/win32-x64@0.18.17: + resolution: + { + integrity: sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.45.0): + resolution: + { + integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.45.0 + eslint-visitor-keys: 3.4.1 + + /@eslint-community/regexpp@4.5.1: + resolution: + { + integrity: sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==, + } + engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } + + /@eslint/eslintrc@2.1.0: + resolution: + { + integrity: sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.20.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + /@eslint/js@8.44.0: + resolution: + { + integrity: sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + + /@humanwhocodes/config-array@0.11.10: + resolution: + { + integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==, + } + engines: { node: ">=10.10.0" } + dependencies: + "@humanwhocodes/object-schema": 1.2.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + /@humanwhocodes/module-importer@1.0.1: + resolution: + { + integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, + } + engines: { node: ">=12.22" } + + /@humanwhocodes/object-schema@1.2.1: + resolution: + { + integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==, + } + + /@lucia-auth/adapter-mysql@2.0.0(@planetscale/database@1.8.0)(lucia@2.0.0)(mysql2@3.6.0): + resolution: + { + integrity: sha512-8a4JZ3VjDyRu/mAop2hEt/jOJO2HXwWIAid6a4wGiR8wgnlyOws9brRc+/wxQHSOlWUlrWemrfDvXLs5mMtkeQ==, + } + peerDependencies: + "@planetscale/database": ^1.0.0 + lucia: ^2.0.0 + mysql2: ^3.0.0 + peerDependenciesMeta: + "@planetscale/database": + optional: true + mysql2: + optional: true + dependencies: + "@planetscale/database": 1.8.0 + lucia: 2.0.0 + mysql2: 3.6.0 + dev: false + + /@lucia-auth/adapter-prisma@3.0.0(@prisma/client@5.0.0)(lucia@2.0.0): + resolution: + { + integrity: sha512-qrFA5IID4AulINQbLQLQPIXqE9+M3zjmN558VDhrS3Y7Fdn5dyObPbHijUWw7lGYgOrhxDox9UUG8oyZ3+D1MA==, + } + peerDependencies: + "@prisma/client": ^4.2.0 || ^5.0.0 + lucia: ^2.0.0 + dependencies: + "@prisma/client": 5.0.0 + lucia: 2.0.0 + dev: false + + /@nodelib/fs.scandir@2.1.5: + resolution: + { + integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, + } + engines: { node: ">= 8" } + dependencies: + "@nodelib/fs.stat": 2.0.5 + run-parallel: 1.2.0 + + /@nodelib/fs.stat@2.0.5: resolution: { integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, } - engines: { node: ">= 8" } + engines: { node: ">= 8" } + + /@nodelib/fs.walk@1.2.8: + resolution: + { + integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, + } + engines: { node: ">= 8" } + dependencies: + "@nodelib/fs.scandir": 2.1.5 + fastq: 1.15.0 + + /@one-ini/wasm@0.1.1: + resolution: + { + integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==, + } + dev: false + + /@planetscale/database@1.8.0: + resolution: + { + integrity: sha512-+zk04eXRiaJGaRnJZkCxXbBtBvQDQJXCoxqlXhLY3HzAovXfsBnh6DjXRujPRQQ7GKtT8/tOlyvZ9h6ReM+GLQ==, + } + engines: { node: ">=16" } + dev: false + + /@prisma/client@5.0.0: + resolution: + { + integrity: sha512-XlO5ELNAQ7rV4cXIDJUNBEgdLwX3pjtt9Q/RHqDpGf43szpNJx2hJnggfFs7TKNx0cOFsl6KJCSfqr5duEU/bQ==, + } + engines: { node: ">=16.13" } + requiresBuild: true + peerDependencies: + prisma: "*" + peerDependenciesMeta: + prisma: + optional: true + dependencies: + "@prisma/engines-version": 4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584 + dev: false + + /@prisma/engines-version@4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584: + resolution: + { + integrity: sha512-HHiUF6NixsldsP3JROq07TYBLEjXFKr6PdH8H4gK/XAoTmIplOJBCgrIUMrsRAnEuGyRoRLXKXWUb943+PFoKQ==, + } + dev: false + + /@react-email/render@0.0.7: + resolution: + { + integrity: sha512-hMMhxk6TpOcDC5qnKzXPVJoVGEwfm+U5bGOPH+MyTTlx0F02RLQygcATBKsbP7aI/mvkmBAZoFbgPIHop7ovug==, + } + engines: { node: ">=16.0.0" } + dependencies: + html-to-text: 9.0.3 + pretty: 2.0.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@selderee/plugin-htmlparser2@0.10.0: + resolution: + { + integrity: sha512-gW69MEamZ4wk1OsOq1nG1jcyhXIQcnrsX5JwixVw/9xaiav8TCyjESAruu1Rz9yyInhgBXxkNwMeygKnN2uxNA==, + } + dependencies: + domhandler: 5.0.3 + selderee: 0.10.0 + dev: false + + /@smithy/abort-controller@2.0.1: + resolution: + { + integrity: sha512-0s7XjIbsTwZyUW9OwXQ8J6x1UiA1TNCh60Vaw56nHahL7kUZsLhmTlWiaxfLkFtO2Utkj8YewcpHTYpxaTzO+w==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/types": 2.0.2 + tslib: 2.6.0 + dev: false + + /@smithy/chunked-blob-reader-native@2.0.0: + resolution: + { + integrity: sha512-HM8V2Rp1y8+1343tkZUKZllFhEQPNmpNdgFAncbTsxkZ18/gqjk23XXv3qGyXWp412f3o43ZZ1UZHVcHrpRnCQ==, + } + dependencies: + "@smithy/util-base64": 2.0.0 + tslib: 2.6.0 + dev: false + + /@smithy/chunked-blob-reader@2.0.0: + resolution: + { + integrity: sha512-k+J4GHJsMSAIQPChGBrjEmGS+WbPonCXesoqP9fynIqjn7rdOThdH8FAeCmokP9mxTYKQAKoHCLPzNlm6gh7Wg==, + } + dependencies: + tslib: 2.6.0 + dev: false + + /@smithy/config-resolver@2.0.1: + resolution: + { + integrity: sha512-l83Pm7hV+8CBQOCmBRopWDtF+CURUJol7NsuPYvimiDhkC2F8Ba9T1imSFE+pD1UIJ9jlsDPAnZfPJT5cjnuEw==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/types": 2.0.2 + "@smithy/util-config-provider": 2.0.0 + "@smithy/util-middleware": 2.0.0 + tslib: 2.6.0 + dev: false + + /@smithy/credential-provider-imds@2.0.1: + resolution: + { + integrity: sha512-8VxriuRINNEfVZjEFKBY75y9ZWAx73DZ5K/u+3LmB6r8WR2h3NaFxFKMlwlq0uzNdGhD1ouKBn9XWEGYHKiPLw==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/node-config-provider": 2.0.1 + "@smithy/property-provider": 2.0.1 + "@smithy/types": 2.0.2 + "@smithy/url-parser": 2.0.1 + tslib: 2.6.0 + dev: false + + /@smithy/eventstream-codec@2.0.1: + resolution: + { + integrity: sha512-/IiNB7gQM2y2ZC/GAWOWDa8+iXfhr1g9Xe5979cQEOdCWDISvrAiv18cn3OtIQUhbYOR3gm7QtCpkq1to2takQ==, + } + dependencies: + "@aws-crypto/crc32": 3.0.0 + "@smithy/types": 2.0.2 + "@smithy/util-hex-encoding": 2.0.0 + tslib: 2.6.0 + dev: false + + /@smithy/eventstream-serde-browser@2.0.1: + resolution: + { + integrity: sha512-9E1/6ZGF7nB/Td3G1kcatU7VjjP8eZ/p/Q+0KsZc1AUPyv4lR15pmWnWj3iGBEGYI9qZBJ/7a/wPEPayabmA3Q==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/eventstream-serde-universal": 2.0.1 + "@smithy/types": 2.0.2 + tslib: 2.6.0 + dev: false + + /@smithy/eventstream-serde-config-resolver@2.0.1: + resolution: + { + integrity: sha512-J8a+8HH8oDPIgq8Px/nPLfu9vpIjQ7XUPtP3orbs8KUh0GznNthSTy1xZP5RXjRqGQEkxPvsHf1po2+QOsgNFw==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/types": 2.0.2 + tslib: 2.6.0 + dev: false + + /@smithy/eventstream-serde-node@2.0.1: + resolution: + { + integrity: sha512-wklowUz0zXJuqC7FMpriz66J8OAko3z6INTg+iMJWYB1bWv4pc5V7q36PxlZ0RKRbj0u+EThlozWgzE7Stz2Sw==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/eventstream-serde-universal": 2.0.1 + "@smithy/types": 2.0.2 + tslib: 2.6.0 + dev: false + + /@smithy/eventstream-serde-universal@2.0.1: + resolution: + { + integrity: sha512-WPPylIgVZ6wOYVgpF0Rs1LlocYyj248MRtKEEehnDvC+0tV7wmGt7H/SchCh10W4y4YUxuzPlW+mUvVMGmLSVg==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/eventstream-codec": 2.0.1 + "@smithy/types": 2.0.2 + tslib: 2.6.0 + dev: false + + /@smithy/fetch-http-handler@2.0.1: + resolution: + { + integrity: sha512-/SoU/ClazgcdOxgE4zA7RX8euiELwpsrKCSvulVQvu9zpmqJRyEJn8ZTWYFV17/eHOBdHTs9kqodhNhsNT+cUw==, + } + dependencies: + "@smithy/protocol-http": 2.0.1 + "@smithy/querystring-builder": 2.0.1 + "@smithy/types": 2.0.2 + "@smithy/util-base64": 2.0.0 + tslib: 2.6.0 + dev: false + + /@smithy/hash-blob-browser@2.0.1: + resolution: + { + integrity: sha512-i/o2+sHb4jDRz5nf2ilTTbC0nVmm4LO//FbODCAB7pbzMdywxbZ6z+q56FmEa8R+aFbtApxQ1SJ3umEiNz6IPg==, + } + dependencies: + "@smithy/chunked-blob-reader": 2.0.0 + "@smithy/chunked-blob-reader-native": 2.0.0 + "@smithy/types": 2.0.2 + tslib: 2.6.0 + dev: false + + /@smithy/hash-node@2.0.1: + resolution: + { + integrity: sha512-oTKYimQdF4psX54ZonpcIE+MXjMUWFxLCNosjPkJPFQ9whRX0K/PFX/+JZGRQh3zO9RlEOEUIbhy9NO+Wha6hw==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/types": 2.0.2 + "@smithy/util-buffer-from": 2.0.0 + "@smithy/util-utf8": 2.0.0 + tslib: 2.6.0 + dev: false + + /@smithy/hash-stream-node@2.0.1: + resolution: + { + integrity: sha512-AequnQdPRuXf4AuvvFlSjnkWI460xxhAd6y362gFtOE4jjJLLXblbMAXVFrkV8/pDMGNjpVegVSpRmHXZsbKhg==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/types": 2.0.2 + "@smithy/util-utf8": 2.0.0 + tslib: 2.6.0 + dev: false + + /@smithy/invalid-dependency@2.0.1: + resolution: + { + integrity: sha512-2q/Eb0AE662zwyMV+z+TL7deBwcHCgaZZGc0RItamBE8kak3MzCi/EZCNoFWoBfxgQ4jfR12wm8KKsSXhJzJtQ==, + } + dependencies: + "@smithy/types": 2.0.2 + tslib: 2.6.0 + dev: false + + /@smithy/is-array-buffer@2.0.0: + resolution: + { + integrity: sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==, + } + engines: { node: ">=14.0.0" } + dependencies: + tslib: 2.6.0 + dev: false + + /@smithy/md5-js@2.0.1: + resolution: + { + integrity: sha512-8WWOtwWMmIDgTkRv1o3opy3ABsRXs4/XunETK53ckxQRAiOML1PlnqLBK9Uwk9bvOD6cpmsC6dioIfmKGpJ25w==, + } + dependencies: + "@smithy/types": 2.0.2 + "@smithy/util-utf8": 2.0.0 + tslib: 2.6.0 + dev: false + + /@smithy/middleware-content-length@2.0.1: + resolution: + { + integrity: sha512-IZhRSk5GkVBcrKaqPXddBS2uKhaqwBgaSgbBb1OJyGsKe7SxRFbclWS0LqOR9fKUkDl+3lL8E2ffpo6EQg0igw==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/protocol-http": 2.0.1 + "@smithy/types": 2.0.2 + tslib: 2.6.0 + dev: false + + /@smithy/middleware-endpoint@2.0.1: + resolution: + { + integrity: sha512-uz/KI1MBd9WHrrkVFZO4L4Wyv24raf0oR4EsOYEeG5jPJO5U+C7MZGLcMxX8gWERDn1sycBDqmGv8fjUMLxT6w==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/middleware-serde": 2.0.1 + "@smithy/types": 2.0.2 + "@smithy/url-parser": 2.0.1 + "@smithy/util-middleware": 2.0.0 + tslib: 2.6.0 + dev: false + + /@smithy/middleware-retry@2.0.1: + resolution: + { + integrity: sha512-NKHF4i0gjSyjO6C0ZyjEpNqzGgIu7s8HOK6oT/1Jqws2Q1GynR1xV8XTUs1gKXeaNRzbzKQRewHHmfPwZjOtHA==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/protocol-http": 2.0.1 + "@smithy/service-error-classification": 2.0.0 + "@smithy/types": 2.0.2 + "@smithy/util-middleware": 2.0.0 + "@smithy/util-retry": 2.0.0 + tslib: 2.6.0 + uuid: 8.3.2 + dev: false + + /@smithy/middleware-serde@2.0.1: + resolution: + { + integrity: sha512-uKxPaC6ItH9ZXdpdqNtf8sda7GcU4SPMp0tomq/5lUg9oiMa/Q7+kD35MUrpKaX3IVXVrwEtkjCU9dogZ/RAUA==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/types": 2.0.2 + tslib: 2.6.0 + dev: false + + /@smithy/middleware-stack@2.0.0: + resolution: + { + integrity: sha512-31XC1xNF65nlbc16yuh3wwTudmqs6qy4EseQUGF8A/p2m/5wdd/cnXJqpniy/XvXVwkHPz/GwV36HqzHtIKATQ==, + } + engines: { node: ">=14.0.0" } + dependencies: + tslib: 2.6.0 + dev: false + + /@smithy/node-config-provider@2.0.1: + resolution: + { + integrity: sha512-Zoel4CPkKRTQ2XxmozZUfqBYqjPKL53/SvTDhJHj+VBSiJy6MXRav1iDCyFPS92t40Uh+Yi+Km5Ch3hQ+c/zSA==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/property-provider": 2.0.1 + "@smithy/shared-ini-file-loader": 2.0.1 + "@smithy/types": 2.0.2 + tslib: 2.6.0 + dev: false + + /@smithy/node-http-handler@2.0.1: + resolution: + { + integrity: sha512-Zv3fxk3p9tsmPT2CKMsbuwbbxnq2gzLDIulxv+yI6aE+02WPYorObbbe9gh7SW3weadMODL1vTfOoJ9yFypDzg==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/abort-controller": 2.0.1 + "@smithy/protocol-http": 2.0.1 + "@smithy/querystring-builder": 2.0.1 + "@smithy/types": 2.0.2 + tslib: 2.6.0 + dev: false + + /@smithy/property-provider@2.0.1: + resolution: + { + integrity: sha512-pmJRyY9SF6sutWIktIhe+bUdSQDxv/qZ4mYr3/u+u45riTPN7nmRxPo+e4sjWVoM0caKFjRSlj3tf5teRFy0Vg==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/types": 2.0.2 + tslib: 2.6.0 + dev: false + + /@smithy/protocol-http@2.0.1: + resolution: + { + integrity: sha512-mrkMAp0wtaDEIkgRObWYxI1Kun1tm6Iu6rK+X4utb6Ah7Uc3Kk4VIWwK/rBHdYGReiLIrxFCB1rq4a2gyZnSgg==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/types": 2.0.2 + tslib: 2.6.0 + dev: false + + /@smithy/querystring-builder@2.0.1: + resolution: + { + integrity: sha512-bp+93WFzx1FojVEIeFPtG0A1pKsFdCUcZvVdZdRlmNooOUrz9Mm9bneRd8hDwAQ37pxiZkCOxopSXXRQN10mYw==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/types": 2.0.2 + "@smithy/util-uri-escape": 2.0.0 + tslib: 2.6.0 + dev: false + + /@smithy/querystring-parser@2.0.1: + resolution: + { + integrity: sha512-h+e7k1z+IvI2sSbUBG9Aq46JsgLl4UqIUl6aigAlRBj+P6ocNXpM6Yn1vMBw5ijtXeZbYpd1YvCxwDgdw3jhmg==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/types": 2.0.2 + tslib: 2.6.0 + dev: false + + /@smithy/service-error-classification@2.0.0: + resolution: + { + integrity: sha512-2z5Nafy1O0cTf69wKyNjGW/sNVMiqDnb4jgwfMG8ye8KnFJ5qmJpDccwIbJNhXIfbsxTg9SEec2oe1cexhMJvw==, + } + engines: { node: ">=14.0.0" } + dev: false + + /@smithy/shared-ini-file-loader@2.0.1: + resolution: + { + integrity: sha512-a463YiZrPGvM+F336rIF8pLfQsHAdCRAn/BiI/EWzg5xLoxbC7GSxIgliDDXrOu0z8gT3nhVsif85eU6jyct3A==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/types": 2.0.2 + tslib: 2.6.0 + dev: false + + /@smithy/signature-v4@2.0.1: + resolution: + { + integrity: sha512-jztv5Mirca42ilxmMDjzLdXcoAmRhZskGafGL49sRo5u7swEZcToEFrq6vtX5YMbSyTVrE9Teog5EFexY5Ff2Q==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/eventstream-codec": 2.0.1 + "@smithy/is-array-buffer": 2.0.0 + "@smithy/types": 2.0.2 + "@smithy/util-hex-encoding": 2.0.0 + "@smithy/util-middleware": 2.0.0 + "@smithy/util-uri-escape": 2.0.0 + "@smithy/util-utf8": 2.0.0 + tslib: 2.6.0 + dev: false + + /@smithy/smithy-client@2.0.1: + resolution: + { + integrity: sha512-LHC5m6tYpEu1iNbONfvMbwtErboyTZJfEIPoD78Ei5MVr36vZQCaCla5mvo36+q/a2NAk2//fA5Rx3I1Kf7+lQ==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/middleware-stack": 2.0.0 + "@smithy/types": 2.0.2 + "@smithy/util-stream": 2.0.1 + tslib: 2.6.0 + dev: false + + /@smithy/types@2.0.2: + resolution: + { + integrity: sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==, + } + engines: { node: ">=14.0.0" } + dependencies: + tslib: 2.6.0 + dev: false + + /@smithy/url-parser@2.0.1: + resolution: + { + integrity: sha512-NpHVOAwddo+OyyIoujDL9zGL96piHWrTNXqltWmBvlUoWgt1HPyBuKs6oHjioyFnNZXUqveTOkEEq0U5w6Uv8A==, + } + dependencies: + "@smithy/querystring-parser": 2.0.1 + "@smithy/types": 2.0.2 + tslib: 2.6.0 + dev: false + + /@smithy/util-base64@2.0.0: + resolution: + { + integrity: sha512-Zb1E4xx+m5Lud8bbeYi5FkcMJMnn+1WUnJF3qD7rAdXpaL7UjkFQLdmW5fHadoKbdHpwH9vSR8EyTJFHJs++tA==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/util-buffer-from": 2.0.0 + tslib: 2.6.0 + dev: false + + /@smithy/util-body-length-browser@2.0.0: + resolution: + { + integrity: sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==, + } + dependencies: + tslib: 2.6.0 + dev: false + + /@smithy/util-body-length-node@2.0.0: + resolution: + { + integrity: sha512-ZV7Z/WHTMxHJe/xL/56qZwSUcl63/5aaPAGjkfynJm4poILjdD4GmFI+V+YWabh2WJIjwTKZ5PNsuvPQKt93Mg==, + } + engines: { node: ">=14.0.0" } + dependencies: + tslib: 2.6.0 + dev: false + + /@smithy/util-buffer-from@2.0.0: + resolution: + { + integrity: sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==, + } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/is-array-buffer": 2.0.0 + tslib: 2.6.0 + dev: false + + /@smithy/util-config-provider@2.0.0: + resolution: + { + integrity: sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==, + } + engines: { node: ">=14.0.0" } + dependencies: + tslib: 2.6.0 + dev: false + + /@smithy/util-defaults-mode-browser@2.0.1: + resolution: + { + integrity: sha512-w72Qwsb+IaEYEFtYICn0Do42eFju78hTaBzzJfT107lFOPdbjWjKnFutV+6GL/nZd5HWXY7ccAKka++C3NrjHw==, + } + engines: { node: ">= 10.0.0" } + dependencies: + "@smithy/property-provider": 2.0.1 + "@smithy/types": 2.0.2 + bowser: 2.11.0 + tslib: 2.6.0 + dev: false + + /@smithy/util-defaults-mode-node@2.0.1: + resolution: + { + integrity: sha512-dNF45caelEBambo0SgkzQ0v76m4YM+aFKZNTtSafy7P5dVF8TbjZuR2UX1A5gJABD9XK6lzN+v/9Yfzj/EDgGg==, + } + engines: { node: ">= 10.0.0" } + dependencies: + "@smithy/config-resolver": 2.0.1 + "@smithy/credential-provider-imds": 2.0.1 + "@smithy/node-config-provider": 2.0.1 + "@smithy/property-provider": 2.0.1 + "@smithy/types": 2.0.2 + tslib: 2.6.0 + dev: false + + /@smithy/util-hex-encoding@2.0.0: + resolution: + { + integrity: sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==, + } + engines: { node: ">=14.0.0" } + dependencies: + tslib: 2.6.0 + dev: false + + /@smithy/util-middleware@2.0.0: + resolution: + { + integrity: sha512-eCWX4ECuDHn1wuyyDdGdUWnT4OGyIzV0LN1xRttBFMPI9Ff/4heSHVxneyiMtOB//zpXWCha1/SWHJOZstG7kA==, + } + engines: { node: ">=14.0.0" } + dependencies: + tslib: 2.6.0 + dev: false + + /@smithy/util-retry@2.0.0: + resolution: + { + integrity: sha512-/dvJ8afrElasuiiIttRJeoS2sy8YXpksQwiM/TcepqdRVp7u4ejd9C4IQURHNjlfPUT7Y6lCDSa2zQJbdHhVTg==, + } + engines: { node: ">= 14.0.0" } + dependencies: + "@smithy/service-error-classification": 2.0.0 + tslib: 2.6.0 + dev: false - /@nodelib/fs.walk@1.2.8: + /@smithy/util-stream@2.0.1: resolution: { - integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, + integrity: sha512-2a0IOtwIKC46EEo7E7cxDN8u2jwOiYYJqcFKA6rd5rdXqKakHT2Gc+AqHWngr0IEHUfW92zX12wRQKwyoqZf2Q==, } - engines: { node: ">= 8" } + engines: { node: ">=14.0.0" } dependencies: - "@nodelib/fs.scandir": 2.1.5 - fastq: 1.15.0 + "@smithy/fetch-http-handler": 2.0.1 + "@smithy/node-http-handler": 2.0.1 + "@smithy/types": 2.0.2 + "@smithy/util-base64": 2.0.0 + "@smithy/util-buffer-from": 2.0.0 + "@smithy/util-hex-encoding": 2.0.0 + "@smithy/util-utf8": 2.0.0 + tslib: 2.6.0 + dev: false - /@planetscale/database@1.8.0: + /@smithy/util-uri-escape@2.0.0: resolution: { - integrity: sha512-+zk04eXRiaJGaRnJZkCxXbBtBvQDQJXCoxqlXhLY3HzAovXfsBnh6DjXRujPRQQ7GKtT8/tOlyvZ9h6ReM+GLQ==, + integrity: sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==, } - engines: { node: ">=16" } + engines: { node: ">=14.0.0" } + dependencies: + tslib: 2.6.0 dev: false - /@prisma/client@5.0.0: + /@smithy/util-utf8@2.0.0: resolution: { - integrity: sha512-XlO5ELNAQ7rV4cXIDJUNBEgdLwX3pjtt9Q/RHqDpGf43szpNJx2hJnggfFs7TKNx0cOFsl6KJCSfqr5duEU/bQ==, + integrity: sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ==, } - engines: { node: ">=16.13" } - requiresBuild: true - peerDependencies: - prisma: "*" - peerDependenciesMeta: - prisma: - optional: true + engines: { node: ">=14.0.0" } dependencies: - "@prisma/engines-version": 4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584 + "@smithy/util-buffer-from": 2.0.0 + tslib: 2.6.0 dev: false - /@prisma/engines-version@4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584: + /@smithy/util-waiter@2.0.1: resolution: { - integrity: sha512-HHiUF6NixsldsP3JROq07TYBLEjXFKr6PdH8H4gK/XAoTmIplOJBCgrIUMrsRAnEuGyRoRLXKXWUb943+PFoKQ==, + integrity: sha512-bSyGFicPRYuGFFWAr72UvYI7tE7KmEeFJJ5iaLuTTdo8RGaNBZ2kE25coGtzrejYh9AhwSfckBvbxgEDxIxhlA==, } + engines: { node: ">=14.0.0" } + dependencies: + "@smithy/abort-controller": 2.0.1 + "@smithy/types": 2.0.2 + tslib: 2.6.0 dev: false /@types/json-schema@7.0.12: @@ -552,6 +2448,13 @@ packages: } dev: false + /@types/node@20.4.8: + resolution: + { + integrity: sha512-0mHckf6D2DiIAzh8fM8f3HQCvMKDpK94YQ0DSVkfWTG9BZleYIWudw9cJxX8oCk9bM+vAkDyujDV6dmKHbvQpg==, + } + dev: true + /@types/semver@7.5.0: resolution: { @@ -717,6 +2620,13 @@ packages: eslint-visitor-keys: 3.4.1 dev: false + /abbrev@1.1.1: + resolution: + { + integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==, + } + dev: false + /acorn-jsx@5.3.2(acorn@8.10.0): resolution: { @@ -804,6 +2714,26 @@ packages: printable-characters: 1.0.42 dev: true + /asynckit@0.4.0: + resolution: + { + integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, + } + dev: false + + /axios@1.4.0: + resolution: + { + integrity: sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==, + } + dependencies: + follow-redirects: 1.15.2 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + /balanced-match@1.0.2: resolution: { @@ -863,6 +2793,13 @@ packages: } dev: true + /bowser@2.11.0: + resolution: + { + integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==, + } + dev: false + /brace-expansion@1.1.11: resolution: { @@ -872,6 +2809,15 @@ packages: balanced-match: 1.0.2 concat-map: 0.0.1 + /brace-expansion@2.0.1: + resolution: + { + integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, + } + dependencies: + balanced-match: 1.0.2 + dev: false + /braces@3.0.2: resolution: { @@ -886,7 +2832,6 @@ packages: { integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, } - dev: true /buffer@5.7.1: resolution: @@ -915,6 +2860,14 @@ packages: } engines: { node: ">=6" } + /camelcase@7.0.1: + resolution: + { + integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==, + } + engines: { node: ">=14.16" } + dev: false + /capnp-ts@0.7.0: resolution: { @@ -937,6 +2890,14 @@ packages: ansi-styles: 4.3.0 supports-color: 7.2.0 + /chalk@5.3.0: + resolution: + { + integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==, + } + engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } + dev: false + /chokidar@3.5.3: resolution: { @@ -962,6 +2923,20 @@ packages: } dev: true + /cli-color@2.0.3: + resolution: + { + integrity: sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==, + } + engines: { node: ">=0.10" } + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-iterator: 2.0.3 + memoizee: 0.4.15 + timers-ext: 0.1.7 + dev: false + /color-convert@2.0.1: resolution: { @@ -977,111 +2952,434 @@ packages: integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, } - /concat-map@0.0.1: + /combined-stream@1.0.8: + resolution: + { + integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, + } + engines: { node: ">= 0.8" } + dependencies: + delayed-stream: 1.0.0 + dev: false + + /commander@10.0.1: + resolution: + { + integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==, + } + engines: { node: ">=14" } + dev: false + + /commander@9.5.0: + resolution: + { + integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==, + } + engines: { node: ^12.20.0 || >=14 } + dev: false + + /concat-map@0.0.1: + resolution: + { + integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, + } + + /condense-newlines@0.2.1: + resolution: + { + integrity: sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==, + } + engines: { node: ">=0.10.0" } + dependencies: + extend-shallow: 2.0.1 + is-whitespace: 0.3.0 + kind-of: 3.2.2 + dev: false + + /config-chain@1.1.13: + resolution: + { + integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==, + } + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + dev: false + + /cookie@0.5.0: + resolution: + { + integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==, + } + engines: { node: ">= 0.6" } + dev: true + + /cross-spawn@7.0.3: + resolution: + { + integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, + } + engines: { node: ">= 8" } + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + /d@1.0.1: + resolution: + { + integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==, + } + dependencies: + es5-ext: 0.10.62 + type: 1.2.0 + dev: false + + /data-uri-to-buffer@2.0.2: + resolution: + { + integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==, + } + dev: true + + /debug@4.3.4: + resolution: + { + integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, + } + engines: { node: ">=6.0" } + peerDependencies: + supports-color: "*" + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /decompress-response@6.0.0: + resolution: + { + integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==, + } + engines: { node: ">=10" } + dependencies: + mimic-response: 3.1.0 + dev: true + + /deep-extend@0.6.0: + resolution: + { + integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==, + } + engines: { node: ">=4.0.0" } + dev: true + + /deep-is@0.1.4: + resolution: + { + integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, + } + + /deepmerge@4.3.1: + resolution: + { + integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==, + } + engines: { node: ">=0.10.0" } + dev: false + + /delayed-stream@1.0.0: + resolution: + { + integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, + } + engines: { node: ">=0.4.0" } + dev: false + + /denque@2.1.0: + resolution: + { + integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==, + } + engines: { node: ">=0.10" } + dev: false + + /detect-libc@2.0.1: + resolution: + { + integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==, + } + engines: { node: ">=8" } + dev: true + + /difflib@0.2.4: + resolution: + { + integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==, + } + dependencies: + heap: 0.2.7 + dev: false + + /dir-glob@3.0.1: + resolution: + { + integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, + } + engines: { node: ">=8" } + dependencies: + path-type: 4.0.0 + dev: false + + /doctrine@3.0.0: + resolution: + { + integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==, + } + engines: { node: ">=6.0.0" } + dependencies: + esutils: 2.0.3 + + /dom-serializer@2.0.0: + resolution: + { + integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==, + } + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + dev: false + + /domelementtype@2.3.0: + resolution: + { + integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==, + } + dev: false + + /domhandler@5.0.3: + resolution: + { + integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==, + } + engines: { node: ">= 4" } + dependencies: + domelementtype: 2.3.0 + dev: false + + /domutils@3.1.0: resolution: { - integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, + integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==, } + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dev: false - /cookie@0.5.0: + /dotenv@16.3.1: resolution: { - integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==, + integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==, } - engines: { node: ">= 0.6" } - dev: true + engines: { node: ">=12" } + dev: false - /cross-spawn@7.0.3: + /dreamopt@0.8.0: resolution: { - integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, + integrity: sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==, } - engines: { node: ">= 8" } + engines: { node: ">=0.4.0" } dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 + wordwrap: 1.0.0 + dev: false - /data-uri-to-buffer@2.0.2: + /drizzle-kit@0.19.12: resolution: { - integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==, + integrity: sha512-rcsmh5gUIkvuD0WrbEc+aLpqY2q2J8ltynRcJiJo2l01hhsYvPnX0sgxWlFXlfAIa5ZXNw2nJZhYlslI6tG3MA==, } - dev: true + hasBin: true + dependencies: + "@drizzle-team/studio": 0.0.5 + "@esbuild-kit/esm-loader": 2.5.5 + camelcase: 7.0.1 + chalk: 5.3.0 + commander: 9.5.0 + esbuild: 0.18.17 + esbuild-register: 3.4.2(esbuild@0.18.17) + glob: 8.1.0 + hanji: 0.0.5 + json-diff: 0.9.0 + minimatch: 7.4.6 + zod: 3.21.4 + transitivePeerDependencies: + - supports-color + dev: false - /debug@4.3.4: + /drizzle-orm@0.27.2(@cloudflare/workers-types@4.20230710.1)(@planetscale/database@1.8.0)(mysql2@3.6.0): resolution: { - integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, + integrity: sha512-ZvBvceff+JlgP7FxHKe0zOU9CkZ4RcOtibumIrqfYzDGuOeF0YUY0F9iMqYpRM7pxnLRfC+oO7rWOUH3T5oFQA==, } - engines: { node: ">=6.0" } peerDependencies: - supports-color: "*" + "@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: - supports-color: + "@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: - ms: 2.1.2 + "@cloudflare/workers-types": 4.20230710.1 + "@planetscale/database": 1.8.0 + mysql2: 3.6.0 + dev: false - /decompress-response@6.0.0: + /editorconfig@1.0.4: resolution: { - integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==, + integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==, } - engines: { node: ">=10" } + engines: { node: ">=14" } + hasBin: true dependencies: - mimic-response: 3.1.0 - dev: true + "@one-ini/wasm": 0.1.1 + commander: 10.0.1 + minimatch: 9.0.1 + semver: 7.5.4 + dev: false - /deep-extend@0.6.0: + /end-of-stream@1.4.4: resolution: { - integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==, + integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, } - engines: { node: ">=4.0.0" } + dependencies: + once: 1.4.0 dev: true - /deep-is@0.1.4: + /entities@4.5.0: resolution: { - integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, + integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==, } + engines: { node: ">=0.12" } + dev: false - /detect-libc@2.0.1: + /es5-ext@0.10.62: resolution: { - integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==, + integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==, } - engines: { node: ">=8" } - dev: true + engines: { node: ">=0.10" } + requiresBuild: true + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.3 + next-tick: 1.1.0 + dev: false - /dir-glob@3.0.1: + /es6-iterator@2.0.3: resolution: { - integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, + integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==, } - engines: { node: ">=8" } dependencies: - path-type: 4.0.0 + d: 1.0.1 + es5-ext: 0.10.62 + es6-symbol: 3.1.3 dev: false - /doctrine@3.0.0: + /es6-symbol@3.1.3: resolution: { - integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==, + integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==, } - engines: { node: ">=6.0.0" } dependencies: - esutils: 2.0.3 + d: 1.0.1 + ext: 1.7.0 + dev: false - /end-of-stream@1.4.4: + /es6-weak-map@2.0.3: resolution: { - integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, + integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==, } dependencies: - once: 1.4.0 - dev: true + d: 1.0.1 + es5-ext: 0.10.62 + es6-iterator: 2.0.3 + es6-symbol: 3.1.3 + dev: false + + /esbuild-register@3.4.2(esbuild@0.18.17): + resolution: + { + integrity: sha512-kG/XyTDyz6+YDuyfB9ZoSIOOmgyFCH+xPRtsCa8W85HLRV5Csp+o3jWVbOSHgSLfyLc5DmP+KFDNwty4mEjC+Q==, + } + peerDependencies: + esbuild: ">=0.12 <1" + dependencies: + debug: 4.3.4 + esbuild: 0.18.17 + transitivePeerDependencies: + - supports-color + dev: false /esbuild@0.16.3: resolution: @@ -1116,6 +3414,72 @@ packages: "@esbuild/win32-x64": 0.16.3 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: false + + /esbuild@0.18.17: + resolution: + { + integrity: sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==, + } + engines: { node: ">=12" } + hasBin: true + requiresBuild: true + optionalDependencies: + "@esbuild/android-arm": 0.18.17 + "@esbuild/android-arm64": 0.18.17 + "@esbuild/android-x64": 0.18.17 + "@esbuild/darwin-arm64": 0.18.17 + "@esbuild/darwin-x64": 0.18.17 + "@esbuild/freebsd-arm64": 0.18.17 + "@esbuild/freebsd-x64": 0.18.17 + "@esbuild/linux-arm": 0.18.17 + "@esbuild/linux-arm64": 0.18.17 + "@esbuild/linux-ia32": 0.18.17 + "@esbuild/linux-loong64": 0.18.17 + "@esbuild/linux-mips64el": 0.18.17 + "@esbuild/linux-ppc64": 0.18.17 + "@esbuild/linux-riscv64": 0.18.17 + "@esbuild/linux-s390x": 0.18.17 + "@esbuild/linux-x64": 0.18.17 + "@esbuild/netbsd-x64": 0.18.17 + "@esbuild/openbsd-x64": 0.18.17 + "@esbuild/sunos-x64": 0.18.17 + "@esbuild/win32-arm64": 0.18.17 + "@esbuild/win32-ia32": 0.18.17 + "@esbuild/win32-x64": 0.18.17 + dev: false + /escape-string-regexp@4.0.0: resolution: { @@ -1280,6 +3644,16 @@ packages: } engines: { node: ">=0.10.0" } + /event-emitter@0.3.5: + resolution: + { + integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==, + } + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + dev: false + /exit-hook@2.2.1: resolution: { @@ -1296,6 +3670,25 @@ packages: engines: { node: ">=6" } dev: true + /ext@1.7.0: + resolution: + { + integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==, + } + dependencies: + type: 2.7.2 + dev: false + + /extend-shallow@2.0.1: + resolution: + { + integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==, + } + engines: { node: ">=0.10.0" } + dependencies: + is-extendable: 0.1.1 + dev: false + /fast-deep-equal@3.1.3: resolution: { @@ -1328,6 +3721,16 @@ packages: integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, } + /fast-xml-parser@4.2.5: + resolution: + { + integrity: sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==, + } + hasBin: true + dependencies: + strnum: 1.0.5 + dev: false + /fastq@1.15.0: resolution: { @@ -1387,6 +3790,31 @@ packages: integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==, } + /follow-redirects@1.15.2: + resolution: + { + integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==, + } + engines: { node: ">=4.0" } + peerDependencies: + debug: "*" + peerDependenciesMeta: + debug: + optional: true + dev: false + + /form-data@4.0.0: + resolution: + { + integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==, + } + engines: { node: ">= 6" } + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + /fs-constants@1.0.0: resolution: { @@ -1411,6 +3839,15 @@ packages: dev: true optional: true + /generate-function@2.3.1: + resolution: + { + integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==, + } + dependencies: + is-property: 1.0.2 + dev: false + /get-source@2.0.12: resolution: { @@ -1421,6 +3858,15 @@ packages: source-map: 0.6.1 dev: true + /get-tsconfig@4.6.2: + resolution: + { + integrity: sha512-E5XrT4CbbXcXWy+1jChlZmrmCwd5KGx502kDCXJJ7y898TtWW9FwoG5HfOLVRKmlmDGkWN2HM9Ho+/Y8F0sJDg==, + } + dependencies: + resolve-pkg-maps: 1.0.0 + dev: false + /github-from-package@0.0.0: resolution: { @@ -1466,6 +3912,20 @@ packages: once: 1.4.0 path-is-absolute: 1.0.1 + /glob@8.1.0: + resolution: + { + integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==, + } + engines: { node: ">=12" } + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + dev: false + /globals@13.20.0: resolution: { @@ -1503,6 +3963,16 @@ packages: integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, } + /hanji@0.0.5: + resolution: + { + integrity: sha512-Abxw1Lq+TnYiL4BueXqMau222fPSPMFtya8HdpWsz/xVAhifXou71mPh/kY2+08RgFcVccjG3uZHs6K5HAe3zw==, + } + dependencies: + lodash.throttle: 4.1.1 + sisteransi: 1.0.5 + dev: false + /has-flag@4.0.0: resolution: { @@ -1510,6 +3980,47 @@ packages: } engines: { node: ">=8" } + /heap@0.2.7: + resolution: + { + integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==, + } + dev: false + + /hono@3.3.4: + resolution: + { + integrity: sha512-lqvcsQrXS0bSydj/MkOXi3opAwrlauIjZefhXMMRj9prABfBWdrYHSrWk/xfxgxNPs4yuEMh2Z5zV0L2b1Jmdw==, + } + engines: { node: ">=16.0.0" } + dev: false + + /html-to-text@9.0.3: + resolution: + { + integrity: sha512-hxDF1kVCF2uw4VUJ3vr2doc91pXf2D5ngKcNviSitNkhP9OMOaJkDrFIFL6RMvko7NisWTEiqGpQ9LAxcVok1w==, + } + engines: { node: ">=14" } + dependencies: + "@selderee/plugin-htmlparser2": 0.10.0 + deepmerge: 4.3.1 + dom-serializer: 2.0.0 + htmlparser2: 8.0.2 + selderee: 0.10.0 + dev: false + + /htmlparser2@8.0.2: + resolution: + { + integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==, + } + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + entities: 4.5.0 + dev: false + /http-cache-semantics@4.1.1: resolution: { @@ -1517,6 +4028,16 @@ packages: } dev: true + /iconv-lite@0.6.3: + resolution: + { + integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, + } + engines: { node: ">=0.10.0" } + dependencies: + safer-buffer: 2.1.2 + dev: false + /ieee754@1.2.1: resolution: { @@ -1568,7 +4089,6 @@ packages: { integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, } - dev: true /is-binary-path@2.1.0: resolution: @@ -1580,6 +4100,21 @@ packages: binary-extensions: 2.2.0 dev: true + /is-buffer@1.1.6: + resolution: + { + integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==, + } + dev: false + + /is-extendable@0.1.1: + resolution: + { + integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==, + } + engines: { node: ">=0.10.0" } + dev: false + /is-extglob@2.1.1: resolution: { @@ -1610,16 +4145,52 @@ packages: } engines: { node: ">=8" } + /is-promise@2.2.2: + resolution: + { + integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==, + } + dev: false + + /is-property@1.0.2: + resolution: + { + integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==, + } + dev: false + + /is-whitespace@0.3.0: + resolution: + { + integrity: sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==, + } + engines: { node: ">=0.10.0" } + dev: false + /isexe@2.0.0: resolution: { integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, } - /itty-router@4.0.14: + /js-beautify@1.14.9: + resolution: + { + integrity: sha512-coM7xq1syLcMyuVGyToxcj2AlzhkDjmfklL8r0JgJ7A76wyGMpJ1oA35mr4APdYNO/o/4YY8H54NQIJzhMbhBg==, + } + engines: { node: ">=12" } + hasBin: true + dependencies: + config-chain: 1.1.13 + editorconfig: 1.0.4 + glob: 8.1.0 + nopt: 6.0.0 + dev: false + + /js-tokens@4.0.0: resolution: { - integrity: sha512-s8DfaLkQp+E3kBhjwto3Z91ozulotCLAmlS8AIr230NqwFJssiGIoewo1P+CEkZ3YrzghS9k/RVvmMlvKQxueQ==, + integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, } dev: false @@ -1632,6 +4203,18 @@ packages: dependencies: argparse: 2.0.1 + /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: false + /json-schema-traverse@0.4.1: resolution: { @@ -1651,6 +4234,16 @@ packages: } dev: true + /kind-of@3.2.2: + resolution: + { + integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==, + } + engines: { node: ">=0.10.0" } + dependencies: + is-buffer: 1.1.6 + dev: false + /kleur@4.1.5: resolution: { @@ -1659,6 +4252,13 @@ packages: engines: { node: ">=6" } dev: true + /leac@0.6.0: + resolution: + { + integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==, + } + dev: false + /levn@0.4.1: resolution: { @@ -1684,6 +4284,13 @@ packages: integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, } + /lodash.throttle@4.1.1: + resolution: + { + integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==, + } + dev: false + /lodash@4.17.21: resolution: { @@ -1691,6 +4298,23 @@ packages: } dev: true + /long@5.2.3: + resolution: + { + integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==, + } + dev: false + + /loose-envify@1.4.0: + resolution: + { + integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==, + } + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: false + /lru-cache@6.0.0: resolution: { @@ -1700,6 +4324,38 @@ packages: dependencies: yallist: 4.0.0 + /lru-cache@7.18.3: + resolution: + { + integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==, + } + engines: { node: ">=12" } + dev: false + + /lru-cache@8.0.5: + resolution: + { + integrity: sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==, + } + engines: { node: ">=16.14" } + dev: false + + /lru-queue@0.1.0: + resolution: + { + integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==, + } + dependencies: + es5-ext: 0.10.62 + dev: false + + /lucia@2.0.0: + resolution: + { + integrity: sha512-WRBMoZIgTHH6y2bAEHZWgWcMH6tDsQ+wf45juUgmn3ycjipn/e6OGpWki4XSjEuRm50WXghH+2EF9LCjCHUsUw==, + } + dev: false + /magic-string@0.25.9: resolution: { @@ -1709,6 +4365,22 @@ packages: sourcemap-codec: 1.4.8 dev: true + /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: false + /merge2@1.4.1: resolution: { @@ -1728,6 +4400,24 @@ packages: picomatch: 2.3.1 dev: false + /mime-db@1.52.0: + resolution: + { + integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, + } + engines: { node: ">= 0.6" } + dev: false + + /mime-types@2.1.35: + resolution: + { + integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, + } + engines: { node: ">= 0.6" } + dependencies: + mime-db: 1.52.0 + dev: false + /mime@3.0.0: resolution: { @@ -1782,6 +4472,36 @@ packages: dependencies: brace-expansion: 1.1.11 + /minimatch@5.1.6: + resolution: + { + integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==, + } + engines: { node: ">=10" } + dependencies: + brace-expansion: 2.0.1 + dev: false + + /minimatch@7.4.6: + resolution: + { + integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==, + } + engines: { node: ">=10" } + dependencies: + brace-expansion: 2.0.1 + dev: false + + /minimatch@9.0.1: + resolution: + { + integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==, + } + engines: { node: ">=16 || 14 >=14.17" } + dependencies: + brace-expansion: 2.0.1 + dev: false + /minimist@1.2.8: resolution: { @@ -1810,6 +4530,33 @@ packages: hasBin: true dev: true + /mysql2@3.6.0: + resolution: + { + integrity: sha512-EWUGAhv6SphezurlfI2Fpt0uJEWLmirrtQR7SkbTHFC+4/mJBrPiSzHESHKAWKG7ALVD6xaG/NBjjd1DGJGQQQ==, + } + engines: { node: ">= 8.0" } + dependencies: + denque: 2.1.0 + generate-function: 2.3.1 + iconv-lite: 0.6.3 + long: 5.2.3 + lru-cache: 8.0.5 + named-placeholders: 1.1.3 + seq-queue: 0.0.5 + sqlstring: 2.3.3 + dev: false + + /named-placeholders@1.1.3: + resolution: + { + integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==, + } + engines: { node: ">=12.0.0" } + dependencies: + lru-cache: 7.18.3 + dev: false + /nanoid@3.3.6: resolution: { @@ -1839,6 +4586,13 @@ packages: integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, } + /next-tick@1.1.0: + resolution: + { + integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==, + } + dev: false + /node-abi@3.45.0: resolution: { @@ -1857,6 +4611,17 @@ packages: engines: { node: ">= 6.13.0" } dev: true + /nopt@6.0.0: + resolution: + { + integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: false + /normalize-path@3.0.0: resolution: { @@ -1914,6 +4679,16 @@ packages: dependencies: callsites: 3.1.0 + /parseley@0.11.0: + resolution: + { + integrity: sha512-VfcwXlBWgTF+unPcr7yu3HSSA6QUdDaDnrHcytVfj5Z8azAyKBDrYnSIfeSxlrEayndNcLmrXzg+Vxbo6DWRXQ==, + } + dependencies: + leac: 0.6.0 + peberminta: 0.8.0 + dev: false + /path-exists@4.0.0: resolution: { @@ -1950,6 +4725,13 @@ packages: engines: { node: ">=8" } dev: false + /peberminta@0.8.0: + resolution: + { + integrity: sha512-YYEs+eauIjDH5nUEGi18EohWE0nV2QbGTqmxQcqgZ/0g+laPCQmuIqq7EBLVi9uim9zMgfJv0QBZEnQ3uHw/Tw==, + } + dev: false + /picomatch@2.3.1: resolution: { @@ -1995,6 +4777,18 @@ packages: hasBin: true dev: false + /pretty@2.0.0: + resolution: + { + integrity: sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==, + } + engines: { node: ">=0.10.0" } + dependencies: + condense-newlines: 0.2.1 + extend-shallow: 2.0.1 + js-beautify: 1.14.9 + dev: false + /printable-characters@1.0.42: resolution: { @@ -2002,6 +4796,20 @@ packages: } dev: true + /proto-list@1.2.4: + resolution: + { + integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==, + } + dev: false + + /proxy-from-env@1.1.0: + resolution: + { + integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==, + } + dev: false + /pump@3.0.0: resolution: { @@ -2046,6 +4854,29 @@ packages: strip-json-comments: 2.0.1 dev: true + /react-dom@18.2.0(react@18.2.0): + resolution: + { + integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==, + } + peerDependencies: + react: ^18.2.0 + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + dev: false + + /react@18.2.0: + resolution: + { + integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==, + } + engines: { node: ">=0.10.0" } + dependencies: + loose-envify: 1.4.0 + dev: false + /readable-stream@3.6.2: resolution: { @@ -2077,6 +4908,19 @@ packages: range-parser: 1.2.1 dev: false + /resend@0.17.2: + resolution: + { + integrity: sha512-lakm76u4MiIDeMF1s2tCmjtksOhwZOs4WcAXkA7aUTvl+63/h+0h6Q6WnkB8RGtj6GakUhQuUkiZshfXgtIrGw==, + } + dependencies: + "@react-email/render": 0.0.7 + axios: 1.4.0 + type-fest: 3.13.0 + transitivePeerDependencies: + - debug + dev: false + /resolve-from@4.0.0: resolution: { @@ -2084,6 +4928,13 @@ packages: } engines: { node: ">=4" } + /resolve-pkg-maps@1.0.0: + resolution: + { + integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==, + } + dev: false + /reusify@1.0.4: resolution: { @@ -2145,6 +4996,31 @@ packages: } dev: true + /safer-buffer@2.1.2: + resolution: + { + integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, + } + dev: false + + /scheduler@0.23.0: + resolution: + { + integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==, + } + dependencies: + loose-envify: 1.4.0 + dev: false + + /selderee@0.10.0: + resolution: + { + integrity: sha512-DEL/RW/f4qLw/NrVg97xKaEBC8IpzIG2fvxnzCp3Z4yk4jQ3MXom+Imav9wApjxX2dfS3eW7x0DXafJr85i39A==, + } + dependencies: + parseley: 0.11.0 + dev: false + /selfsigned@2.1.1: resolution: { @@ -2165,6 +5041,13 @@ packages: dependencies: lru-cache: 6.0.0 + /seq-queue@0.0.5: + resolution: + { + integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==, + } + dev: false + /set-cookie-parser@2.6.0: resolution: { @@ -2206,6 +5089,13 @@ packages: simple-concat: 1.0.1 dev: true + /sisteransi@1.0.5: + resolution: + { + integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==, + } + dev: false + /slash@3.0.0: resolution: { @@ -2222,7 +5112,6 @@ packages: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - dev: true /source-map@0.6.1: resolution: @@ -2230,7 +5119,6 @@ packages: integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, } engines: { node: ">=0.10.0" } - dev: true /source-map@0.7.4: resolution: @@ -2248,6 +5136,14 @@ packages: deprecated: Please use @jridgewell/sourcemap-codec instead dev: true + /sqlstring@2.3.3: + resolution: + { + integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==, + } + engines: { node: ">= 0.6" } + dev: false + /stacktracey@2.1.8: resolution: { @@ -2307,6 +5203,13 @@ packages: } engines: { node: ">=8" } + /strnum@1.0.5: + resolution: + { + integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==, + } + dev: false + /supports-color@7.2.0: resolution: { @@ -2348,6 +5251,16 @@ packages: integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, } + /timers-ext@0.1.7: + resolution: + { + integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==, + } + dependencies: + es5-ext: 0.10.62 + next-tick: 1.1.0 + dev: false + /to-regex-range@5.0.1: resolution: { @@ -2369,12 +5282,18 @@ packages: typescript: 5.1.6 dev: false + /tslib@1.14.1: + resolution: + { + integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==, + } + dev: false + /tslib@2.6.0: resolution: { integrity: sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==, } - dev: true /tunnel-agent@0.6.0: resolution: @@ -2401,6 +5320,28 @@ packages: } engines: { node: ">=10" } + /type-fest@3.13.0: + resolution: + { + integrity: sha512-Gur3yQGM9qiLNs0KPP7LPgeRbio2QTt4xXouobMCarR0/wyW3F+F/+OWwshg3NG0Adon7uQfSZBpB46NfhoF1A==, + } + engines: { node: ">=14.16" } + dev: false + + /type@1.2.0: + resolution: + { + integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==, + } + dev: false + + /type@2.7.2: + resolution: + { + integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==, + } + dev: false + /typescript@5.1.6: resolution: { @@ -2434,6 +5375,14 @@ packages: } dev: true + /uuid@8.3.2: + resolution: + { + integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==, + } + hasBin: true + dev: false + /vscode-json-languageservice@4.2.1: resolution: { @@ -2485,6 +5434,13 @@ packages: dependencies: isexe: 2.0.0 + /wordwrap@1.0.0: + resolution: + { + integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==, + } + dev: false + /workerd@1.20230710.0: resolution: { @@ -2587,4 +5543,3 @@ packages: { integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==, } - dev: true diff --git a/src/db/migrations/meta/_journal.json b/src/db/migrations/meta/_journal.json new file mode 100644 index 0000000..d55cb7e --- /dev/null +++ b/src/db/migrations/meta/_journal.json @@ -0,0 +1 @@ +{ "version": "5", "dialect": "mysql", "entries": [] } diff --git a/src/db/migrations/schema.ts b/src/db/migrations/schema.ts new file mode 100644 index 0000000..2aea8b8 --- /dev/null +++ b/src/db/migrations/schema.ts @@ -0,0 +1,272 @@ +import { + mysqlTable, + index, + primaryKey, + int, + varchar, + mysqlEnum, + unique, + bigint, + datetime, +} from "drizzle-orm/mysql-core"; +// import { sql } from "drizzle-orm"; + +export const tableNames = { + assets: "assets", + authKey: "authKey", + authSession: "authSession", + authUser: "authUser", + emailVerificationToken: "emailVerificationToken", + follower: "follower", + following: "following", + games: "games", + passwordResetToken: "passwordResetToken", + savedOcGenerators: "savedOcGenerators", + socialsConnection: "socialsConnection", +}; + +export const assets = mysqlTable( + tableNames.assets, + { + id: int("id").autoincrement().notNull(), + name: varchar("name", { length: 191 }).notNull(), + game: varchar("game", { length: 191 }).notNull(), + assetCategory: varchar("asset_category", { length: 191 }).notNull(), + tags: mysqlEnum("tags", ["OFFICIAL", "FANMADE"]) + .default("OFFICIAL") + .notNull(), + url: varchar("url", { length: 191 }).notNull(), + status: mysqlEnum("status", ["PENDING", "APPROVED", "REJECTED"]) + .default("PENDING") + .notNull(), + uploadedBy: varchar("uploaded_by", { length: 191 }) + .notNull() + .references(() => authUser.id), + uploadedDate: varchar("uploaded_date", { length: 191 }).notNull(), + viewCount: int("view_count").default(0).notNull(), + downloadCount: int("download_count").default(0).notNull(), + fileSize: int("file_size").notNull(), + width: int("width").default(0).notNull(), + height: int("height").default(0).notNull(), + }, + (table) => { + return { + idIdx: index("assets_id_idx").on(table.id), + nameIdx: index("assets_name_idx").on(table.name), + gameIdx: index("assets_game_idx").on(table.game), + statusIdx: index("assets_status_idx").on(table.status), + tagsIdx: index("assets_tags_idx").on(table.tags), + uploadedByIdx: index("assets_uploaded_by_idx").on(table.uploadedBy), + assetsId: primaryKey(table.id), + }; + } +); + +export const authKey = mysqlTable( + tableNames.authKey, + { + id: varchar("id", { length: 191 }).notNull(), + hashedPassword: varchar("hashed_password", { length: 191 }), + userId: varchar("user_id", { length: 191 }) + .notNull() + .references(() => authUser.id), + }, + (table) => { + return { + userIdIdx: index("authKey_user_id_idx").on(table.userId), + authKeyId: primaryKey(table.id), + authKeyIdKey: unique("authKey_id_key").on(table.id), + }; + } +); + +export const authSession = mysqlTable( + tableNames.authSession, + { + id: varchar("id", { length: 191 }).notNull(), + userId: varchar("user_id", { length: 191 }) + .notNull() + .references(() => authUser.id), + activeExpires: bigint("active_expires", { mode: "number" }).notNull(), + idleExpires: bigint("idle_expires", { mode: "number" }).notNull(), + }, + (table) => { + return { + userIdIdx: index("authSession_user_id_idx").on(table.userId), + authSessionId: primaryKey(table.id), + authSessionIdKey: unique("authSession_id_key").on(table.id), + }; + } +); + +export const authUser = mysqlTable( + tableNames.authUser, + { + id: varchar("id", { length: 191 }).notNull(), + avatarUrl: varchar("avatar_url", { length: 191 }), + bannerUrl: varchar("banner_url", { length: 191 }), + username: varchar("username", { length: 191 }).notNull(), + usernameColour: varchar("username_colour", { length: 191 }), + email: varchar("email", { length: 191 }).notNull(), + emailVerified: int("email_verified").default(0).notNull(), + pronouns: varchar("pronouns", { length: 191 }), + verified: int("verified").default(0).notNull(), + bio: varchar("bio", { length: 191 }).default(""), + dateJoined: datetime("date_joined", { + mode: "string", + fsp: 3, + }).notNull(), + roleFlags: int("role_flags").default(1).notNull(), + selfAssignableRoleFlags: int("self_assignable_role_flags"), + }, + (table) => { + return { + authUserId: primaryKey(table.id), + authUserIdKey: unique("authUser_id_key").on(table.id), + authUserUsernameKey: unique("authUser_username_key").on( + table.username + ), + authUserEmailKey: unique("authUser_email_key").on(table.email), + }; + } +); + +export const emailVerificationToken = mysqlTable( + tableNames.emailVerificationToken, + { + id: varchar("id", { length: 191 }).notNull(), + userId: varchar("user_id", { length: 191 }) + .notNull() + .references(() => authUser.id), + expires: bigint("expires", { mode: "number" }).notNull(), + }, + (table) => { + return { + userIdIdx: index("emailVerificationToken_user_id_idx").on( + table.userId + ), + emailVerificationTokenId: primaryKey(table.id), + emailVerificationTokenIdKey: unique( + "emailVerificationToken_id_key" + ).on(table.id), + }; + } +); + +export const follower = mysqlTable( + tableNames.follower, + { + id: varchar("id", { length: 191 }).notNull(), + userId: varchar("user_id", { length: 191 }) + .notNull() + .references(() => authUser.id), + }, + (table) => { + return { + userIdIdx: index("follower_user_id_idx").on(table.userId), + followerId: primaryKey(table.id), + followerIdKey: unique("follower_id_key").on(table.id), + }; + } +); + +export const following = mysqlTable( + tableNames.following, + { + id: varchar("id", { length: 191 }).notNull(), + userId: varchar("user_id", { length: 191 }).notNull(), + }, + (table) => { + return { + userIdIdx: index("following_user_id_idx").on(table.userId), + followingId: primaryKey(table.id), + followingIdKey: unique("following_id_key").on(table.id), + }; + } +); + +export const games = mysqlTable( + tableNames.games, + { + id: int("id").autoincrement().notNull(), + name: varchar("name", { length: 191 }).notNull(), + assetCount: int("asset_count").default(0).notNull(), + assetCategories: varchar("asset_categories", { length: 191 }) // minor inconvenience + .default("") + .notNull(), + lastUpdated: datetime("last_updated", { + mode: "string", + fsp: 3, + }).notNull(), + categoryCount: int("category_count").default(0).notNull(), + }, + (table) => { + return { + idIdx: index("games_id_idx").on(table.id), + nameIdx: index("games_name_idx").on(table.name), + gamesId: primaryKey(table.id), + }; + } +); + +export const passwordResetToken = mysqlTable( + tableNames.passwordResetToken, + { + id: varchar("id", { length: 191 }).notNull(), + userId: varchar("user_id", { length: 191 }) + .notNull() + .references(() => authUser.id), + expires: bigint("expires", { mode: "number" }).notNull(), + }, + (table) => { + return { + userIdIdx: index("passwordResetToken_user_id_idx").on(table.userId), + passwordResetTokenId: primaryKey(table.id), + passwordResetTokenIdKey: unique("passwordResetToken_id_key").on( + table.id + ), + }; + } +); + +export const savedOcGenerators = mysqlTable( + tableNames.savedOcGenerators, + { + id: int("id").autoincrement().notNull(), + game: varchar("game", { length: 191 }).notNull(), + data: varchar("data", { length: 191 }).notNull(), // data will be stored in opt index -> response index e.g 1:1,2:4,3:1,4:2 + userId: varchar("user_id", { length: 191 }) + .notNull() + .references(() => authUser.id), + savedDate: datetime("saved_date", { mode: "string", fsp: 3 }).notNull(), + }, + (table) => { + return { + idIdx: index("savedOCGenerators_id_idx").on(table.id), + gameIdx: index("savedOCGenerators_game_idx").on(table.game), + userIdIdx: index("savedOCGenerators_user_id_idx").on(table.userId), + savedOcGeneratorsId: primaryKey(table.id), + }; + } +); + +export const socialsConnection = mysqlTable( + tableNames.socialsConnection, + { + id: varchar("id", { length: 191 }).notNull(), + userId: varchar("user_id", { length: 191 }) + .notNull() + .references(() => authUser.id), + tiktok: varchar("tiktok", { length: 191 }), + discord: varchar("discord", { length: 191 }), + }, + (table) => { + return { + userIdIdx: index("socialsConnection_user_id_idx").on(table.userId), + socialsConnectionId: primaryKey(table.id), + socialsConnectionIdKey: unique("socialsConnection_id_key").on( + table.id + ), + }; + } +); diff --git a/src/handler.ts b/src/handler.ts deleted file mode 100644 index 8d40bfb..0000000 --- a/src/handler.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { Router } from "itty-router"; -import { errorHandler } from "@/middleware/errorHandler"; -import { responseHeaders } from "@/lib/responseHeaders"; -import { getContributors } from "@/routes/discord/contributors"; -import { index } from "@/routes"; -import { getGenerator } from "@/routes/oc-generators/getGenerator"; -import { getGenerators } from "@/routes/oc-generators/getGenerators"; -import { getSearch, getRecentAssets } from "@/routes/search/search"; -import { downloadFile } from "@/routes/download/downloadFile"; -import { getUserByUsername } from "@/routes/user/getUserByUsername"; -import { getUserBySearch } from "@/routes/user/getUsersBySearch"; -import { allGames } from "@/routes/games/allGames"; -import { getAssetFromId } from "@/routes/asset/getAssetFromId"; -import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse"; - -const router = Router(); - -router - .get("/", errorHandler(index)) - .get("/games", errorHandler(allGames)) - .get("/user/:name", errorHandler(getUserByUsername)) - .get("/recent", errorHandler(getRecentAssets)) - .get("/asset/:id", errorHandler(getAssetFromId)) - .get("/user/s/:name", errorHandler(getUserBySearch)) - .get("/search", errorHandler(getSearch)) - .get("/download/:id", errorHandler(downloadFile)) - .get("/oc-generators", errorHandler(getGenerators)) - .get("/oc-generator/:gameId", errorHandler(getGenerator)) - .get("/discord/contributors", errorHandler(getContributors)) - .all("*", (): Response => { - return createNotFoundResponse("Route doesn't exist", responseHeaders); - }); - -addEventListener("fetch", (event: FetchEvent) => { - event.respondWith(router.handle(event.request)); -}); - -export { router }; diff --git a/src/index.ts b/src/index.ts index 93b077a..23dfd75 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,39 @@ -import { router } from "@/handler"; +import { Hono } from "hono"; +import { Env } from "./worker-configuration"; +import assetRoute from "./routes/asset/assetRoute"; +import discordRoute from "./routes/discord/discordRoute"; +import ocGeneratorRoute from "./routes/oc-generators/ocGeneratorRoutes"; +import searchRoute from "./routes/search/searchRoute"; +import gamesRoute from "./routes/games/gamesRoute"; +import userRoute from "./routes/user/userRoute"; +// import authRoute from "./routes/auth/authRoute"; +interface Bindings extends Env { + [key: string]: unknown; +} -export default { - fetch: router.handle, -}; +const app = new Hono<{ Bindings: Bindings }>(); + +app.get("/status", (c) => { + c.status(200); + return c.json({ status: "ok" }); +}); +app.get("/", (c) => { + c.status(200); + return c.json({ success: "true", status: "ok", routes: app.routes }); +}); +app.route("/asset", assetRoute); +app.route("/discord", discordRoute); +app.route("/oc-generators", ocGeneratorRoute); +app.route("/search", searchRoute); +app.route("/games", gamesRoute); +app.route("/user", userRoute); +// app.route("/auth", authRoute); +app.all("*", (c) => { + c.status(404); + return c.json({ status: "not found" }); +}); + +// https://hono.dev/api/hono#showroutes +app.showRoutes(); + +export default app; diff --git a/src/lib/auth/lucia.ts b/src/lib/auth/lucia.ts new file mode 100644 index 0000000..0041edb --- /dev/null +++ b/src/lib/auth/lucia.ts @@ -0,0 +1,54 @@ +import { lucia } from "lucia"; +import { web } from "lucia/middleware"; +import { planetscale } from "@lucia-auth/adapter-mysql"; +import { getConnection } from "../planetscale"; +import { Env } from "@/worker-configuration"; + +export const authorizationTokenNames = { + csrf: "__csrf_token", + session: "__session_token", +}; + +export const auth = (env: Env) => { + const db = getConnection(env); + const connection = db.planetscale; + + return lucia({ + adapter: planetscale(connection, { + key: "authKey", + user: "authUser", + session: "authSession", + }), + middleware: web(), + sessionExpiresIn: { + idlePeriod: 0, + activePeriod: 30 * 24 * 60 * 60 * 1000, // 30 days + }, + sessionCookie: { + name: authorizationTokenNames.session, + expires: false, + }, + env: env.ENVIRONMENT === "DEV" ? "DEV" : "PROD", + experimental: { + debugMode: env.ENVIRONMENT === "DEV" ? true : false, + }, + getUserAttributes: (dbUser) => { + return { + username: dbUser.username, + usernameColour: dbUser.username_colour, + avatarUrl: dbUser.avatar_url, + bannerUrl: dbUser.banner_url, + email: dbUser.email, + emailVerified: dbUser.email_verified, + pronouns: dbUser.pronouns, + verified: dbUser.verified, + bio: dbUser.bio, + roleFlags: dbUser.role_flags, + selfAssignableRoleFlags: dbUser.self_assignable_role_flags, + dateJoined: dbUser.date_joined, + }; + }, + }); +}; + +export type Auth = typeof auth; diff --git a/src/lib/auth/roleFlags.ts b/src/lib/auth/roleFlags.ts new file mode 100644 index 0000000..8d088b9 --- /dev/null +++ b/src/lib/auth/roleFlags.ts @@ -0,0 +1,42 @@ +// bitwise for role flags allows for multiple roles to be assigned to a user, and for easy checking of roles + +// permission based roles +export const roleFlags = { + USER: 1 << 0, + CONTRIBUTOR: 1 << 1, + TRANSLATOR: 1 << 2, + STAFF: 1 << 3, + DEVELOPER: 1 << 4, + CREATOR: 1 << 5, +}; + +export const roleFlagsToArray = (roleFlagsInt: number): string[] => { + const roles: string[] = []; + + for (const [role, flag] of Object.entries(roleFlags)) { + if (roleFlagsInt & flag) roles.push(role); + } + + return roles; +}; + +// self assignable roles +export const SelfAssignableRoleFlags = { + CONTENT_CREATOR: 1 << 0, + ARTIST: 1 << 1, + WRITER: 1 << 2, + DEVELOPER: 1 << 3, + DESIGNER: 1 << 4, +}; + +export const SelfAssignableRoleFlagsToArray = ( + roleFlagsInt: number +): string[] => { + const roles: string[] = []; + + for (const [role, flag] of Object.entries(SelfAssignableRoleFlags)) { + if (roleFlagsInt & flag) roles.push(role); + } + + return roles; +}; diff --git a/src/lib/helpers/getQueryParams.ts b/src/lib/helpers/getQueryParams.ts deleted file mode 100644 index 50f2d8a..0000000 --- a/src/lib/helpers/getQueryParams.ts +++ /dev/null @@ -1,4 +0,0 @@ -export function getQueryParam(url, param) { - const value = url.searchParams.get(param); - return value ? value.split(",") : []; -} diff --git a/src/lib/helpers/responses/notFoundResponse.ts b/src/lib/helpers/responses/notFoundResponse.ts index 3adc697..4818a79 100644 --- a/src/lib/helpers/responses/notFoundResponse.ts +++ b/src/lib/helpers/responses/notFoundResponse.ts @@ -1,13 +1,14 @@ // helper function to create a 404 Not Found response export function createNotFoundResponse(errorMessage, responseHeaders) { - const responseBody = { - success: false, - status: "error", - error: "404 Not Found", - message: errorMessage, - }; - - return new Response(JSON.stringify(responseBody), { - headers: responseHeaders, - }); + return new Response( + JSON.stringify({ + success: false, + status: "error", + error: errorMessage, + }), + { + status: 404, + headers: responseHeaders, + } + ); } diff --git a/src/lib/planetscale.ts b/src/lib/planetscale.ts index 67499be..2e86629 100644 --- a/src/lib/planetscale.ts +++ b/src/lib/planetscale.ts @@ -1,8 +1,11 @@ import { connect } from "@planetscale/database"; +import { Env } from "../worker-configuration"; +import * as schema from "@/db/migrations/schema"; +import { drizzle } from "drizzle-orm/planetscale-serverless"; // useful wrapper for planetscale connection -export function getConnection(env) { - const config = { +export function getConnection(env: Env) { + const client = connect({ // this can be set with "wrangler secret put" or through the planetscale integration on cf dashboard host: env.DATABASE_HOST, username: env.DATABASE_USERNAME, @@ -11,6 +14,15 @@ export function getConnection(env) { delete init["cache"]; return fetch(url, init); }, + }); + + const db = drizzle(client, { + schema, + logger: true, + }); + + return { + drizzle: db, + planetscale: client, }; - return connect(config); } diff --git a/src/lib/query.ts b/src/lib/query.ts index 95cb13a..811a10b 100644 --- a/src/lib/query.ts +++ b/src/lib/query.ts @@ -5,28 +5,34 @@ type queryParameter = string | number; export const getSearchResults = async ( query: string, - game: string[], - asset: string[], - tags: string[], - env: Env + gameArray: string[], + assetArray: string[], + tagsArray: string[], + c ): Promise => { let sqlQuery = `SELECT * FROM assets WHERE 1=1`; const parameters = []; sqlQuery = addQueryToSqlQuery(query, sqlQuery, parameters); - sqlQuery = addGameToSqlQuery(game, sqlQuery, parameters); - sqlQuery = addAssetToSqlQuery(asset, sqlQuery, parameters); - sqlQuery = addTagsToSqlQuery(tags, sqlQuery, parameters); + sqlQuery = addGameToSqlQuery(gameArray, sqlQuery, parameters); + sqlQuery = addAssetToSqlQuery(assetArray, sqlQuery, parameters); + sqlQuery = addTagsToSqlQuery(tagsArray, sqlQuery, parameters); sqlQuery += ` ORDER BY uploaded_date DESC`; sqlQuery = limitResults(sqlQuery); - if (!query && !game.length && !asset.length && !tags.length) { + if ( + !query && + !gameArray.length && + !assetArray.length && + !tagsArray.length + ) { sqlQuery = `SELECT * FROM assets ORDER BY uploaded_date DESC LIMIT 30`; } - const db = await getConnection(env); + const conn = await getConnection(c.env); + const db = conn.planetscale; return await db .execute(sqlQuery, parameters) @@ -46,42 +52,42 @@ const addQueryToSqlQuery = ( }; const addGameToSqlQuery = ( - game: string[], + gameArray: string[], sqlQuery: string, parameters: queryParameter[] ): string => { - if (game.length) { - sqlQuery += ` AND game IN (${game.map(() => "?").join(",")})`; - parameters.push(...game); + if (gameArray.length) { + sqlQuery += ` AND game IN (${gameArray.map(() => "?").join(",")})`; + parameters.push(...gameArray); } return sqlQuery; }; const addAssetToSqlQuery = ( - asset: string[], + assetArray: string[], sqlQuery: string, parameters: queryParameter[] ): string => { - if (asset.length) { - sqlQuery += ` AND asset_category IN (${asset + if (assetArray.length) { + sqlQuery += ` AND asset_category IN (${assetArray .map(() => "?") .join(",")})`; - parameters.push(...asset); + parameters.push(...assetArray); } return sqlQuery; }; const addTagsToSqlQuery = ( - tags: string[], + tagsArray: string[], sqlQuery: string, parameters: queryParameter[] ): string => { - if (tags.length) { - sqlQuery += ` AND tags IN (${tags + if (tagsArray.length) { + sqlQuery += ` AND tags IN (${tagsArray .map(() => "?") .join(",") .toUpperCase()})`; - parameters.push(...tags); + parameters.push(...tagsArray); } return sqlQuery; }; diff --git a/src/lib/regex/accountValidation.ts b/src/lib/regex/accountValidation.ts new file mode 100644 index 0000000..6f3cf13 --- /dev/null +++ b/src/lib/regex/accountValidation.ts @@ -0,0 +1,18 @@ +// must have @ and . inside to be considered an email +export function email(email: string) { + const emailRegex = /\S+@\S+\.\S+/; + return emailRegex.test(email); +} + +// minimum eight characters, at least one uppercase letter, one lowercase letter, one number and one special character +export function password(password: string) { + const passwordRegex = + /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$/; + return passwordRegex.test(password); +} + +// 5 to 16 characters which contain only characters, numeric digits, underscore and first character must be a letter +export function username(username: string) { + const usernameRegex = /^[a-zA-Z0-9]{5,16}$/; + return usernameRegex.test(username); +} diff --git a/src/lib/resend/email.ts b/src/lib/resend/email.ts new file mode 100644 index 0000000..ea955cd --- /dev/null +++ b/src/lib/resend/email.ts @@ -0,0 +1,67 @@ +import { Resend } from "resend"; + +// TODO: use react email w/ tailwind +export const resend = new Resend(""); + +export const sendPasswordResetEmail = async ( + email: string, + link: string, + username: string +) => { + try { + await resend.emails.send({ + from: "Test ", + to: email, + subject: "Password Reset Request", + html: `Password reset for ${username}
Click here to reset your password`, + }); + } catch (error) { + throw new Error("Error sending password reset email."); + } +}; + +export const sendPasswordChangeEmail = async ( + email: string, + username: string +) => { + try { + await resend.emails.send({ + from: "Test ", + to: email, + subject: "Password Updated Confirmation", + html: `Your password for ${username} has been updated.
Wasn't you? Contact us at support@wanderer.moe`, + }); + } catch (error) { + throw new Error("Error sending password change email."); + } +}; + +export const sendEmailChangeEmail = async (email: string, username: string) => { + try { + await resend.emails.send({ + from: "Test ", + to: email, + subject: "Email Change Request", + html: `Your email address for ${username} has been changed.
Wasn't you? Contact us at support@wanderer.moe`, + }); + } catch (error) { + throw new Error("Error sending email change email."); + } +}; + +export const sendEmailConfirmationEmail = async ( + email: string, + link: string, + username: string +) => { + try { + await resend.emails.send({ + from: "Test ", + to: email, + subject: "Email Confirmation", + html: `Email confirmation for ${username}
Click here to confirm your email`, + }); + } catch (error) { + throw new Error("Error sending email confirmation email."); + } +}; diff --git a/src/lib/types/asset.ts b/src/lib/types/asset.ts index 5ade10a..94e1cd3 100644 --- a/src/lib/types/asset.ts +++ b/src/lib/types/asset.ts @@ -11,4 +11,6 @@ export interface Asset { view_count?: number; download_count?: number; file_size: number; + width: number; + height: number; } diff --git a/src/lib/types/auth.ts b/src/lib/types/auth.ts new file mode 100644 index 0000000..647ff9f --- /dev/null +++ b/src/lib/types/auth.ts @@ -0,0 +1,8 @@ +export interface LoginBody { + username: string; + password: string; +} +export interface RegisterBody extends LoginBody { + email: string; + passwordConfirm: string; +} diff --git a/src/lib/types/game.ts b/src/lib/types/game.ts index 6b51221..8f915c4 100644 --- a/src/lib/types/game.ts +++ b/src/lib/types/game.ts @@ -1,5 +1,9 @@ export interface Game { - name: string; id: number; - asset_categories?: string[]; + name: string; + asset_count: number; + asset_categories: string; // comma separated category1,category2,category3 + category_count: number; + last_updated: string; + has_generator: boolean; } diff --git a/src/lib/types/user.ts b/src/lib/types/user.ts index 1440767..2743d0e 100644 --- a/src/lib/types/user.ts +++ b/src/lib/types/user.ts @@ -1,12 +1,15 @@ export interface User { id: string; + username: string; + username_colour: string | null; avatar_url: string | null; banner_url: string | null; - username: string; - username_colour: string; - bio: string | null; + email: string; + email_verified: number; pronouns: string | null; verified: number; - date_joined: string; - role: string; + bio: string | null; + role_flags: number; + self_assignable_role_flags: number; + date_joined: Date; } diff --git a/src/lucia.d.ts b/src/lucia.d.ts new file mode 100644 index 0000000..2ef1bbf --- /dev/null +++ b/src/lucia.d.ts @@ -0,0 +1,19 @@ +/// +declare namespace Lucia { + type Auth = import("./lib/auth/lucia").Auth; + type DatabaseUserAttributes = { + username: string; + username_colour: string | null; + avatar_url: string | null; + banner_url: string | null; + email: string; + email_verified: number; + pronouns: string | null; + verified: number; + bio: string | null; + role_flags: number; + self_assignable_role_flags: number | null; + date_joined: Date; + }; + // type DatabaseSessionAttributes = {} +} diff --git a/src/middleware/errorHandler.ts b/src/middleware/errorHandler.ts deleted file mode 100644 index 30e7f22..0000000 --- a/src/middleware/errorHandler.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { responseHeaders } from "@/lib/responseHeaders"; - -// generic error handler wrapper -export const errorHandler = - (handler: (request: Request, env: Env) => Promise) => - async (request: Request, env: Env): Promise => { - try { - return await handler(request, env); - } catch (error) { - console.error(error); - return new Response( - JSON.stringify({ - success: false, - status: "error", - error: "500 Internal Server Error", - }), - { - headers: responseHeaders, - } - ); - } - }; diff --git a/src/routes/asset/assetRoute.ts b/src/routes/asset/assetRoute.ts new file mode 100644 index 0000000..3545601 --- /dev/null +++ b/src/routes/asset/assetRoute.ts @@ -0,0 +1,15 @@ +import { Hono } from "hono"; +import { getAssetFromId } from "./getAssetFromId"; +import { downloadAsset } from "./downloadAsset"; + +const assetRoute = new Hono(); + +assetRoute.get("/:id", async (c) => { + return getAssetFromId(c); +}); + +assetRoute.get("/download/:assetId", async (c) => { + return downloadAsset(c); +}); + +export default assetRoute; diff --git a/src/routes/download/downloadFile.ts b/src/routes/asset/downloadAsset.ts similarity index 64% rename from src/routes/download/downloadFile.ts rename to src/routes/asset/downloadAsset.ts index 0a9278c..a756014 100644 --- a/src/routes/download/downloadFile.ts +++ b/src/routes/asset/downloadAsset.ts @@ -2,20 +2,16 @@ import { responseHeaders } from "@/lib/responseHeaders"; import type { Asset } from "@/lib/types/asset"; import { getConnection } from "@/lib/planetscale"; import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse"; +import { Context } from "hono"; -export const downloadFile = async ( - request: Request, - env: Env -): Promise => { - const url = new URL(request.url); - const id = url.pathname.split("/")[2]; +export const downloadAsset = async (c: Context) => { + const { assetId } = c.req.param(); - if (!id || isNaN(parseInt(id))) throw new Error("No ID provided"); - - const db = await getConnection(env); + const conn = await getConnection(c.env); + const db = conn.planetscale; const row = await db - .execute("SELECT * FROM assets WHERE id = ?", [id]) + .execute("SELECT * FROM assets WHERE id = ?", [assetId]) .then((row) => row.rows[0] as Asset | undefined); if (!row) @@ -24,13 +20,14 @@ export const downloadFile = async ( const response = await fetch( `https://files.wanderer.moe/assets/${row.url}` ); + const headers = new Headers(response.headers); headers.set("Content-Disposition", `attachment; filename="${row.name}"`); const blob = await response.blob(); await db.execute( - "UPDATE assets SET download_count = download_count + 1 WHERE id = ?", - [id] + "UPDATE assets SET downloads = downloads + 1 WHERE id = ?", + [assetId] ); return new Response(blob, { diff --git a/src/routes/asset/getAssetFromId.ts b/src/routes/asset/getAssetFromId.ts index e8346d9..6b92758 100644 --- a/src/routes/asset/getAssetFromId.ts +++ b/src/routes/asset/getAssetFromId.ts @@ -3,22 +3,16 @@ import type { Asset } from "@/lib/types/asset"; import { getConnection } from "@/lib/planetscale"; import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse"; -export const getAssetFromId = async ( - request: Request, - env: Env -): Promise => { - const url = new URL(request.url); - const id = url.pathname.split("/")[2]; - - if (!id || isNaN(parseInt(id))) throw new Error("No ID provided"); - - const cacheKey = new Request(url.toString(), request); +export const getAssetFromId = async (c) => { + const { id } = c.req.param(); + const cacheKey = new Request(c.req.url.toString(), c.req); const cache = caches.default; let response = await cache.match(cacheKey); if (response) return response; - const db = await getConnection(env); + const conn = await getConnection(c.env); + const db = conn.planetscale; const row = await db .execute("SELECT * FROM assets WHERE id = ?", [id]) @@ -38,6 +32,8 @@ export const getAssetFromId = async ( uploaded_by: row.uploaded_by, uploaded_date: row.uploaded_date, file_size: row.file_size, + width: row.width, + height: row.height, }; const similarAssets = ( @@ -59,19 +55,20 @@ export const getAssetFromId = async ( uploaded_by: asset.uploaded_by, uploaded_date: asset.uploaded_date, file_size: asset.file_size, + width: asset.width, + height: asset.height, }; }); - response = new Response( - JSON.stringify({ + response = c.json( + { success: true, status: "ok", asset, similarAssets, - }), - { - headers: responseHeaders, - } + }, + 200, + responseHeaders ); response.headers.set("Cache-Control", "s-maxage=604800"); diff --git a/src/routes/auth/authRoute.ts b/src/routes/auth/authRoute.ts new file mode 100644 index 0000000..69d4056 --- /dev/null +++ b/src/routes/auth/authRoute.ts @@ -0,0 +1,25 @@ +import { Hono } from "hono"; +import { login } from "./login"; +import { logout } from "./logout"; +import { signup } from "./signup"; +import { validate } from "./validate"; + +const authRoute = new Hono(); + +authRoute.post("/login", async (c) => { + return login(c); +}); + +authRoute.post("/signup", async (c) => { + return signup(c); +}); + +authRoute.get("/validate", async (c) => { + return validate(c); +}); + +authRoute.get("/logout", async (c) => { + return logout(c); +}); + +export default authRoute; diff --git a/src/routes/auth/login.ts b/src/routes/auth/login.ts new file mode 100644 index 0000000..612763e --- /dev/null +++ b/src/routes/auth/login.ts @@ -0,0 +1,47 @@ +import { auth, authorizationTokenNames } from "@/lib/auth/lucia"; +import type { LoginBody } from "@/lib/types/auth"; +import { Context } from "hono"; +import { setCookie } from "hono/cookie"; +import * as validate from "@/lib/regex/accountValidation"; + +export const login = async (c: Context): Promise => { + const body = (await c.req.json()) as LoginBody; + const { username, password } = body; + + const validSession = await auth(c.env).handleRequest(c.req.raw).validate(); + + if (validSession) { + return c.redirect("/"); + } + + if (!validate.username(username) || !validate.password(password)) { + return c.json( + { + success: false, + status: "error", + error: "400 Bad Request", + }, + 400 + ); + } + + const user = await auth(c.env).useKey( + "username", + username.toLowerCase(), + password + ); + + const newSession = await auth(c.env).createSession({ + userId: user.userId, + attributes: {}, + }); + + setCookie(c, authorizationTokenNames.csrf, newSession.sessionId, { + expires: newSession.activePeriodExpiresAt, + httpOnly: true, + secure: true, + sameSite: "Lax", + }); + + return c.redirect("/"); +}; diff --git a/src/routes/auth/logout.ts b/src/routes/auth/logout.ts new file mode 100644 index 0000000..8feb653 --- /dev/null +++ b/src/routes/auth/logout.ts @@ -0,0 +1,17 @@ +import { auth } from "@/lib/auth/lucia"; +import { Context } from "hono"; +import { deleteCookie } from "hono/cookie"; +import { authorizationTokenNames } from "@/lib/auth/lucia"; + +export const logout = async (c: Context): Promise => { + const authRequest = auth(c.env).handleRequest(c.req.raw); + const session = await authRequest.validate(); + + if (!session) { + return c.redirect("/login"); + } + + deleteCookie(c, authorizationTokenNames.session); + await auth(c.env).invalidateSession(session.sessionId); + return c.redirect("/login"); +}; diff --git a/src/routes/auth/signup.ts b/src/routes/auth/signup.ts new file mode 100644 index 0000000..0519d8b --- /dev/null +++ b/src/routes/auth/signup.ts @@ -0,0 +1,66 @@ +import { auth, authorizationTokenNames } from "@/lib/auth/lucia"; +import type { RegisterBody } from "@/lib/types/auth"; +import { Context } from "hono"; +import { setCookie } from "hono/cookie"; +import * as validate from "@/lib/regex/accountValidation"; + +export const signup = async (c: Context) => { + const body = (await c.req.json()) as RegisterBody; + + const { username, password, email, passwordConfirm } = body; + const validSession = await auth(c.env).handleRequest(c.req.raw).validate(); + + if (validSession) return c.redirect("/"); + + if ( + !validate.username(username) || + !validate.password(password) || + !validate.email(email) || + password !== passwordConfirm + ) { + return c.json( + { + success: false, + status: "error", + error: "400 Bad Request", + }, + 400 + ); + } + + const user = await auth(c.env).createUser({ + key: { + providerId: "username", + providerUserId: username.toLowerCase(), + password, + }, + attributes: { + username, + email, + email_verified: 0, + date_joined: new Date(), + verified: 0, + role_flags: 0, + self_assignable_role_flags: null, + username_colour: null, + avatar_url: null, + banner_url: null, + pronouns: null, + bio: null, + }, + }); + + const newSession = await auth(c.env).createSession({ + userId: user.userId, + attributes: {}, + }); + + setCookie(c, authorizationTokenNames.csrf, newSession.sessionId, { + expires: newSession.activePeriodExpiresAt, + httpOnly: true, + secure: true, + sameSite: "Lax", + }); + + return c.redirect("/"); +}; diff --git a/src/routes/auth/validate.ts b/src/routes/auth/validate.ts new file mode 100644 index 0000000..521fbab --- /dev/null +++ b/src/routes/auth/validate.ts @@ -0,0 +1,22 @@ +import { auth, authorizationTokenNames } from "@/lib/auth/lucia"; +import { Context } from "hono"; +import { deleteCookie } from "hono/cookie"; + +export const validate = async (c: Context): Promise => { + const authRequest = auth(c.env).handleRequest(c.req.raw); + + const session = await authRequest.validate(); + + if (!session) { + deleteCookie(c, authorizationTokenNames.session); + } + + if (session.state === "idle") { + await auth(c.env).invalidateSession(session.sessionId); + + deleteCookie(c, authorizationTokenNames.session); + return c.redirect("/login"); + } + + return c.json(session, 200); +}; diff --git a/src/routes/discord/contributors.ts b/src/routes/discord/contributors.ts index 5259c51..275b088 100644 --- a/src/routes/discord/contributors.ts +++ b/src/routes/discord/contributors.ts @@ -1,11 +1,9 @@ import { responseHeaders } from "@/lib/responseHeaders"; import { roles, guildId } from "@/lib/discord"; import type { Contributor, GuildMember } from "@/lib/types/discord"; +import { Context } from "hono"; -export const getContributors = async ( - request: Request, - env: Env -): Promise => { +export const contributors = async (c: Context) => { const members: Contributor[] = []; let after: string | null = null; @@ -18,7 +16,7 @@ export const getContributors = async ( }`, { headers: { - Authorization: `Bot ${env.DISCORD_TOKEN}`, + Authorization: `Bot ${c.env.DISCORD_TOKEN}`, }, } ); @@ -36,6 +34,7 @@ export const getContributors = async ( .map((role) => roles[role]) .filter((role) => role); + // TODO: support animated avatars return { id: member.user.id, username: member.user.username, @@ -57,15 +56,13 @@ export const getContributors = async ( after = guildMembers[guildMembers.length - 1]?.user?.id; } - return new Response( - JSON.stringify({ + return c.json( + { success: true, status: "ok", - path: `/discord/contributors`, contributors: members, - }), - { - headers: responseHeaders, - } + }, + 200, + responseHeaders ); }; diff --git a/src/routes/discord/discordRoute.ts b/src/routes/discord/discordRoute.ts new file mode 100644 index 0000000..fbe37d0 --- /dev/null +++ b/src/routes/discord/discordRoute.ts @@ -0,0 +1,10 @@ +import { Hono } from "hono"; +import { contributors } from "./contributors"; + +const discordRoute = new Hono(); + +discordRoute.get("/contributors", async (c) => { + return contributors(c); +}); + +export default discordRoute; diff --git a/src/routes/games/allGames.ts b/src/routes/games/allGames.ts index cc4ad0f..a96bccf 100644 --- a/src/routes/games/allGames.ts +++ b/src/routes/games/allGames.ts @@ -1,50 +1,51 @@ import { responseHeaders } from "@/lib/responseHeaders"; -import { Game } from "@/lib/types/game"; +import { getConnection } from "@/lib/planetscale"; +import { Context } from "hono"; import { listBucket } from "@/lib/listBucket"; +import { Game } from "@/lib/types/game"; -export const allGames = async ( - request: Request, - env: Env -): Promise => { - const url = new URL(request.url); - - const cacheKey = new Request(url.toString(), request); +export const getAllGames = async (c: Context) => { + const cacheKey = new Request(c.req.url.toString(), c.req); const cache = caches.default; let response = await cache.match(cacheKey); if (response) return response; - // TODO: fix getting data from old D1 database but using Planetscale DB - const row: D1Result = await env.database - .prepare(`SELECT * FROM games`) - .run(); - - const gameList = await Promise.all( - row.results.map(async (result) => ({ - name: result.name, - id: result.id, - assetCategories: await listBucket(env.bucket, { - prefix: `assets/${result.name}/`, - delimiter: "/", - }).then((data) => - data.delimitedPrefixes.map((prefix) => - prefix - .replace(`assets/${result.name}/`, "") - .replace("/", "") - ) - ), - })) - ); - - response = new Response( - JSON.stringify({ + const files = await listBucket(c.env.bucket, { + prefix: "oc-generators/", + delimiter: "/", + }); + + const results = files.delimitedPrefixes.map((file) => { + return { + name: file.replace("oc-generators/", "").replace("/", ""), + }; + }); + + const conn = await getConnection(c.env); + const db = conn.planetscale; + + const gameList = await db + .execute("SELECT * FROM games ORDER BY last_updated ASC") + .then((row) => + row.rows.map((game: Game) => ({ + ...game, + // asset categories are stored as a comma separated string in the database, so we need to split them into an array + asset_categories: game.asset_categories.split(","), + has_generator: results.some( + (generator) => generator.name === game.name + ), + })) + ); + + response = c.json( + { success: true, status: "ok", results: gameList, - }), - { - headers: responseHeaders, - } + }, + 200, + responseHeaders ); response.headers.set("Cache-Control", "s-maxage=1200"); diff --git a/src/routes/games/gamesRoute.ts b/src/routes/games/gamesRoute.ts new file mode 100644 index 0000000..cc18fa3 --- /dev/null +++ b/src/routes/games/gamesRoute.ts @@ -0,0 +1,10 @@ +import { Hono } from "hono"; +import { getAllGames } from "./allGames"; + +const gamesRoute = new Hono(); + +gamesRoute.get("/all", async (c) => { + return getAllGames(c); +}); + +export default gamesRoute; diff --git a/src/routes/index.ts b/src/routes/index.ts deleted file mode 100644 index c65f4d3..0000000 --- a/src/routes/index.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { responseHeaders } from "@/lib/responseHeaders"; - -const routes: string[] = [ - "/search[?query=''&tags=''&game=''&asset='']", - "/user/[username]", - "/user/s/[search]", - "/recent", - "/asset/[assetId]", - "/download/[assetId]", - "/discord/contributors", - "/games", - "/oc-generators", - "/oc-generator/[gameId]", -]; - -export const index = async (): Promise => { - return new Response( - JSON.stringify({ - success: true, - status: "ok", - path: "/", - description: - "Please read the API documentation on the site/github repository if you're unsure how to use this API.", - routes, - }), - { - headers: responseHeaders, - } - ); -}; diff --git a/src/routes/oc-generators/getGenerator.ts b/src/routes/oc-generators/getGenerator.ts index b1c8c0e..330d194 100644 --- a/src/routes/oc-generators/getGenerator.ts +++ b/src/routes/oc-generators/getGenerator.ts @@ -1,22 +1,18 @@ import { responseHeaders } from "@/lib/responseHeaders"; import { listBucket } from "@/lib/listBucket"; import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse"; +import { Context } from "hono"; -export const getGenerator = async ( - request: Request, - env: Env -): Promise => { - const url = new URL(request.url); - const gameId = url.pathname.split("/")[2]; - - const cacheKey = new Request(url.toString(), request); +export const getGeneratorFromName = async (c: Context) => { + const { gameName } = c.req.param(); + const cacheKey = new Request(c.req.url.toString(), c.req); const cache = caches.default; let response = await cache.match(cacheKey); if (response) return response; - const files = await listBucket(env.bucket, { - prefix: `oc-generators/${gameId}/list.json`, + const files = await listBucket(c.env.bucket, { + prefix: `oc-generators/${gameName}/list.json`, }); if (files.objects.length === 0) @@ -28,17 +24,13 @@ export const getGenerator = async ( const generatorData = await data.json(); - response = new Response( - JSON.stringify({ - success: true, + response = c.json( + { status: "ok", - uploaded: files.objects[0].uploaded, - key: files.objects[0].key, data: generatorData, - }), - { - headers: responseHeaders, - } + }, + 200, + responseHeaders ); response.headers.set("Cache-Control", "s-maxage=604800"); // the content of this file is unlikely to change, so caching is fine diff --git a/src/routes/oc-generators/getGenerators.ts b/src/routes/oc-generators/getGenerators.ts index 6fc478d..df2125a 100644 --- a/src/routes/oc-generators/getGenerators.ts +++ b/src/routes/oc-generators/getGenerators.ts @@ -1,13 +1,9 @@ import { responseHeaders } from "@/lib/responseHeaders"; import { listBucket } from "@/lib/listBucket"; +import { Context } from "hono"; -export const getGenerators = async ( - request: Request, - env: Env -): Promise => { - const url = new URL(request.url); - - const cacheKey = new Request(url.toString(), request); +export const getGenerators = async (c: Context) => { + const cacheKey = new Request(c.req.url.toString(), c.req); const cache = caches.default; let response = await cache.match(cacheKey); @@ -15,7 +11,7 @@ export const getGenerators = async ( // listing all files inside of oc-generators subfolder, as they can't be manually inputted // by users but instead stored on the oc-generators repo - const files = await listBucket(env.bucket, { + const files = await listBucket(c.env.bucket, { prefix: "oc-generators/", delimiter: "/", }); @@ -31,15 +27,13 @@ export const getGenerators = async ( }; }); - response = new Response( - JSON.stringify({ - success: true, - status: "ok", - results: results, - }), + response = c.json( { - headers: responseHeaders, - } + status: "ok", + data: results, + }, + 200, + responseHeaders ); response.headers.set("Cache-Control", "s-maxage=28800"); diff --git a/src/routes/oc-generators/ocGeneratorRoutes.ts b/src/routes/oc-generators/ocGeneratorRoutes.ts new file mode 100644 index 0000000..7e76329 --- /dev/null +++ b/src/routes/oc-generators/ocGeneratorRoutes.ts @@ -0,0 +1,15 @@ +import { Hono } from "hono"; +import { getGeneratorFromName } from "./getGenerator"; +import { getGenerators } from "./getGenerators"; + +const ocGeneratorRoute = new Hono(); + +ocGeneratorRoute.get("/", async (c) => { + return getGenerators(c); +}); + +ocGeneratorRoute.get("/:gameName", async (c) => { + return getGeneratorFromName(c); +}); + +export default ocGeneratorRoute; diff --git a/src/routes/search/assetSearch.ts b/src/routes/search/assetSearch.ts new file mode 100644 index 0000000..551f4ba --- /dev/null +++ b/src/routes/search/assetSearch.ts @@ -0,0 +1,112 @@ +import { responseHeaders } from "@/lib/responseHeaders"; +import type { Asset } from "@/lib/types/asset"; +import { getSearchResults } from "@/lib/query"; +import { getConnection } from "@/lib/planetscale"; +import { Context } from "hono"; + +export const getAssetSearch = async (c: Context) => { + const queryParams = c.req.query(); + // console.log(queryParams); + const { query, game, asset, tags } = queryParams; + + // Convert game and asset parameters to arrays + const gameArray = game ? game.split(",") : []; + const assetArray = asset ? asset.split(",") : []; + const tagsArray = tags ? tags.split(",") : []; + + const cacheKey = new Request(c.req.url.toString(), c.req); + const cache = caches.default; + let response = await cache.match(cacheKey); + + if (response) return response; + + // console.log(query, gameArray, assetArray, tags); + + const results = ( + await getSearchResults(query, gameArray, assetArray, tagsArray, c) + ).map((results) => { + return { + id: results.id, + name: results.name, + game: results.game, + asset_category: results.asset_category, + url: results.url, + tags: results.tags, + status: results.status, + uploaded_by: results.uploaded_by, + uploaded_date: results.uploaded_date, + file_size: results.file_size, + width: results.width, + height: results.height, + }; + }); + + response = c.json( + { + success: true, + status: "ok", + query, + game, + asset, + tags, + results, + }, + 200, + responseHeaders + ); + + response.headers.set("Cache-Control", "s-maxage=3600"); + await cache.put(cacheKey, response.clone()); + + return response; +}; + +export const recentAssets = async (c) => { + const cacheKey = new Request(c.req.url.toString(), c.req); + const cache = caches.default; + let response = await cache.match(cacheKey); + if (response) return response; + + const conn = await getConnection(c.env); + const db = conn.planetscale; + + const row = await db + .execute( + "SELECT * FROM assets WHERE 1=1 ORDER BY uploaded_date DESC LIMIT 30" + ) + .then((row) => row.rows as Asset[] | undefined); + + if (!row) throw new Error("No results found"); + + const results = row.map((asset) => { + return { + id: asset.id, + name: asset.name, + game: asset.game, + asset_category: asset.asset_category, + url: asset.url, + tags: asset.tags, + status: asset.status, + uploaded_by: asset.uploaded_by, + uploaded_date: asset.uploaded_date, + file_size: asset.file_size, + width: asset.width, + height: asset.height, + }; + }); + + response = c.json( + { + success: true, + status: "ok", + results, + }, + 200, + responseHeaders + ); + + response.headers.set("Cache-Control", "s-maxage=3600"); + await cache.put(cacheKey, response.clone()); + + return response; +}; diff --git a/src/routes/search/search.ts b/src/routes/search/search.ts deleted file mode 100644 index 1daff11..0000000 --- a/src/routes/search/search.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { responseHeaders } from "@/lib/responseHeaders"; -import type { Asset } from "@/lib/types/asset"; -import { getSearchResults } from "@/lib/query"; -import { getConnection } from "@/lib/planetscale"; -import { getQueryParam } from "@/lib/helpers/getQueryParams"; - -export const getSearch = async ( - request: Request, - env: Env -): Promise => { - const url = new URL(request.url); - const paramNames = ["query", "game", "asset", "tags"]; - - const params = {}; - for (const paramName of paramNames) { - params[paramName] = getQueryParam(url, paramName); - } - - // TODO: fix this cuz idk what's going on here - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - const { query, game, asset, tags } = params; - - const cacheKey = new Request(url.toString(), request); - const cache = caches.default; - - let response = await cache.match(cacheKey); - - if (response) return response; - - const results = (await getSearchResults(query, game, asset, tags, env)).map( - (results) => { - return { - id: results.id, - name: results.name, - game: results.game, - asset_category: results.asset_category, - url: results.url, - tags: results.tags, - status: results.status, - uploaded_by: results.uploaded_by, - uploaded_date: results.uploaded_date, - file_size: results.file_size, - }; - } - ); - - response = new Response( - JSON.stringify({ - success: true, - status: "ok", - path: "/search", - query, - game, - asset, - tags, - results, - }), - { - headers: responseHeaders, - } - ); - - response.headers.set("Cache-Control", "s-maxage=3600"); - await cache.put(cacheKey, response.clone()); - - return response; -}; - -export const getRecentAssets = async ( - request: Request, - env: Env -): Promise => { - const url = new URL(request.url); - - const cacheKey = new Request(url.toString(), request); - const cache = caches.default; - let response = await cache.match(cacheKey); - - if (response) return response; - - const db = await getConnection(env); - - const row = await db - .execute( - "SELECT * FROM assets WHERE 1=1 ORDER BY uploaded_date DESC LIMIT 30" - ) - .then((row) => row.rows as Asset[] | undefined); - - if (!row) { - throw new Error("No results found"); - } - - const results = row.map((asset) => { - return { - id: asset.id, - name: asset.name, - game: asset.game, - asset_category: asset.asset_category, - url: asset.url, - tags: asset.tags, - status: asset.status, - uploaded_by: asset.uploaded_by, - uploaded_date: asset.uploaded_date, - file_size: asset.file_size, - }; - }); - - response = new Response( - JSON.stringify({ - success: true, - status: "ok", - path: "/search", - results, - }), - { - headers: responseHeaders, - } - ); - - response.headers.set("Cache-Control", "s-maxage=3600"); - await cache.put(cacheKey, response.clone()); - - return response; -}; diff --git a/src/routes/search/searchRoute.ts b/src/routes/search/searchRoute.ts new file mode 100644 index 0000000..3adbfed --- /dev/null +++ b/src/routes/search/searchRoute.ts @@ -0,0 +1,15 @@ +import { Hono } from "hono"; +import { getAssetSearch } from "./assetSearch"; +import { recentAssets } from "./assetSearch"; + +const searchRoute = new Hono(); + +searchRoute.get("/assets", async (c) => { + return getAssetSearch(c); +}); + +searchRoute.get("/recent", async (c) => { + return recentAssets(c); +}); + +export default searchRoute; diff --git a/src/routes/user/getUserByUsername.ts b/src/routes/user/getUserByUsername.ts index 071c868..2b6256d 100644 --- a/src/routes/user/getUserByUsername.ts +++ b/src/routes/user/getUserByUsername.ts @@ -1,28 +1,23 @@ import { responseHeaders } from "@/lib/responseHeaders"; import type { User } from "@/lib/types/user"; import type { Asset } from "@/lib/types/asset"; +import { Context } from "hono"; import { getConnection } from "@/lib/planetscale"; import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse"; -export const getUserByUsername = async ( - request: Request, - env: Env -): Promise => { - const url = new URL(request.url); - const name = url.pathname.split("/")[2]; - - if (!name) throw new Error("No username provided"); - - const cacheKey = new Request(url.toString(), request); +export const getUserByUsername = async (c: Context) => { + const { name } = c.req.param(); + const cacheKey = new Request(c.req.url.toString(), c.req); const cache = caches.default; let response = await cache.match(cacheKey); if (response) return response; - const db = await getConnection(env); + const conn = await getConnection(c.env); + const db = conn.planetscale; const row = await db - .execute("SELECT * FROM User WHERE username = ?", [name]) + .execute("SELECT * FROM authUser WHERE username = ?", [name]) .then((row) => row.rows[0] as User | undefined); const user = { @@ -34,7 +29,8 @@ export const getUserByUsername = async ( pronouns: row.pronouns || null, verified: row.verified, date_joined: row.date_joined, - roles: row.role, + role_flags: row.role_flags, + self_assignable_role_flags: row.self_assignable_role_flags || null, }; const uploadedAssets = await db @@ -63,16 +59,15 @@ export const getUserByUsername = async ( if (!row) return createNotFoundResponse("User not found", responseHeaders); - response = new Response( - JSON.stringify({ + response = c.json( + { success: true, status: "ok", user, uploadedAssets, - }), - { - headers: responseHeaders, - } + }, + 200, + responseHeaders ); response.headers.set("Cache-Control", "s-maxage=300"); diff --git a/src/routes/user/getUsersBySearch.ts b/src/routes/user/getUsersBySearch.ts index 8e916ae..4b412c8 100644 --- a/src/routes/user/getUsersBySearch.ts +++ b/src/routes/user/getUsersBySearch.ts @@ -2,26 +2,20 @@ import { responseHeaders } from "@/lib/responseHeaders"; import type { User } from "@/lib/types/user"; import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse"; import { getConnection } from "@/lib/planetscale"; +import { Context } from "hono"; -export const getUserBySearch = async ( - request: Request, - env: Env -): Promise => { - const url = new URL(request.url); - const name = url.pathname.split("/")[3]; - - if (!name) throw new Error("No username provided"); - - const cacheKey = new Request(url.toString(), request); +export const getUsersBySearch = async (c: Context) => { + const cacheKey = new Request(c.req.url.toString(), c.req); const cache = caches.default; let response = await cache.match(cacheKey); - if (response) return response; - const db = await getConnection(env); + const { query } = c.req.param(); + const conn = await getConnection(c.env); + const db = conn.planetscale; const row = await db - .execute("SELECT * FROM User WHERE username LIKE ?", [name]) + .execute("SELECT * FROM authUser WHERE username LIKE ?", [query]) .then((row) => row.rows as User[] | undefined); if (!row) return createNotFoundResponse("User not found", responseHeaders); @@ -36,23 +30,23 @@ export const getUserBySearch = async ( pronouns: user.pronouns || null, verified: user.verified, date_joined: user.date_joined, - roles: user.role, + role_flags: user.role_flags, }; }); results.sort((a, b) => - a.username === name ? -1 : b.username === name ? 1 : 0 + a.username === query ? -1 : b.username === query ? 1 : 0 ); - response = new Response( - JSON.stringify({ + response = c.json( + { success: true, status: "ok", - results: results, - }), - { - headers: responseHeaders, - } + query, + results, + }, + 200, + responseHeaders ); response.headers.set("Cache-Control", "s-maxage=60"); diff --git a/src/routes/user/userRoute.ts b/src/routes/user/userRoute.ts new file mode 100644 index 0000000..cdbf7e8 --- /dev/null +++ b/src/routes/user/userRoute.ts @@ -0,0 +1,15 @@ +import { Hono } from "hono"; +import { getUsersBySearch } from "./getUsersBySearch"; +import { getUserByUsername } from "./getUserByUsername"; + +const userRoute = new Hono(); + +userRoute.get("/u/:name", async (c) => { + return getUserByUsername(c); +}); + +userRoute.get("/s/:query", async (c) => { + return getUsersBySearch(c); +}); + +export default userRoute; diff --git a/src/worker-configuration.d.ts b/src/worker-configuration.d.ts index 5f5b5a0..7f55361 100644 --- a/src/worker-configuration.d.ts +++ b/src/worker-configuration.d.ts @@ -1,5 +1,9 @@ -interface Env { +export interface Env { DISCORD_TOKEN: string; bucket: R2Bucket; - database: D1Database; + DATABASE_URL: string; + DATABASE_PASSWORD: string; + DATABASE_USERNAME: string; + DATABASE_HOST: string; + ENVIRONMENT: string; } diff --git a/wrangler.toml b/wrangler.toml index 1ddc058..cd2e080 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -10,9 +10,4 @@ binding = 'bucket' bucket_name = 'files' preview_bucket_name = 'files' -[[d1_databases]] -binding = 'database' -database_name = 'wanderer-moe' -database_id = 'df7af4d9-3546-42d2-bf0d-8376091a7875' - [vars] From 35179864bfa148807e6be721a4ce1882d3d4628e Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 6 Aug 2023 04:29:24 +0100 Subject: [PATCH 039/318] update asset search endpoints --- drizzle.config.ts | 6 +++--- src/db/migrations/schema.ts | 15 +-------------- src/index.ts | 4 ++-- src/lib/auth/lucia.ts | 2 ++ src/lib/drizzle.ts | 15 +++++++++++++++ src/routes/games/allGames.ts | 2 +- src/routes/search/{ => asset}/assetSearch.ts | 0 src/routes/search/{ => asset}/searchRoute.ts | 8 ++++---- 8 files changed, 28 insertions(+), 24 deletions(-) create mode 100644 src/lib/drizzle.ts rename src/routes/search/{ => asset}/assetSearch.ts (100%) rename src/routes/search/{ => asset}/searchRoute.ts (54%) diff --git a/drizzle.config.ts b/drizzle.config.ts index 8288cc9..67aedb6 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -8,9 +8,9 @@ export default { breakpoints: true, driver: "mysql2", dbCredentials: { - host: process.env.DATABASE_HOST!, - user: process.env.DATABASE_USERNAME!, - password: process.env.DATABASE_PASSWORD!, + host: process.env.DATABASE_HOST! || "", + user: process.env.DATABASE_USERNAME || "", + password: process.env.DATABASE_PASSWORD || "", database: "planetscale", }, } satisfies Config; diff --git a/src/db/migrations/schema.ts b/src/db/migrations/schema.ts index 2aea8b8..a10e234 100644 --- a/src/db/migrations/schema.ts +++ b/src/db/migrations/schema.ts @@ -9,22 +9,9 @@ import { bigint, datetime, } from "drizzle-orm/mysql-core"; +import { tableNames } from "@/lib/drizzle"; // import { sql } from "drizzle-orm"; -export const tableNames = { - assets: "assets", - authKey: "authKey", - authSession: "authSession", - authUser: "authUser", - emailVerificationToken: "emailVerificationToken", - follower: "follower", - following: "following", - games: "games", - passwordResetToken: "passwordResetToken", - savedOcGenerators: "savedOcGenerators", - socialsConnection: "socialsConnection", -}; - export const assets = mysqlTable( tableNames.assets, { diff --git a/src/index.ts b/src/index.ts index 23dfd75..ce20359 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,7 +3,7 @@ import { Env } from "./worker-configuration"; import assetRoute from "./routes/asset/assetRoute"; import discordRoute from "./routes/discord/discordRoute"; import ocGeneratorRoute from "./routes/oc-generators/ocGeneratorRoutes"; -import searchRoute from "./routes/search/searchRoute"; +import assetSearchRoute from "./routes/search/asset/searchRoute"; import gamesRoute from "./routes/games/gamesRoute"; import userRoute from "./routes/user/userRoute"; // import authRoute from "./routes/auth/authRoute"; @@ -24,7 +24,7 @@ app.get("/", (c) => { app.route("/asset", assetRoute); app.route("/discord", discordRoute); app.route("/oc-generators", ocGeneratorRoute); -app.route("/search", searchRoute); +app.route("/search/assets", assetSearchRoute); app.route("/games", gamesRoute); app.route("/user", userRoute); // app.route("/auth", authRoute); diff --git a/src/lib/auth/lucia.ts b/src/lib/auth/lucia.ts index 0041edb..c385d0d 100644 --- a/src/lib/auth/lucia.ts +++ b/src/lib/auth/lucia.ts @@ -9,6 +9,8 @@ export const authorizationTokenNames = { session: "__session_token", }; +// this is so we can pass in env during requests, +// so: it would be called: auth(c.env)... instead of auth export const auth = (env: Env) => { const db = getConnection(env); const connection = db.planetscale; diff --git a/src/lib/drizzle.ts b/src/lib/drizzle.ts new file mode 100644 index 0000000..d5deacd --- /dev/null +++ b/src/lib/drizzle.ts @@ -0,0 +1,15 @@ +export const tableNames = { + assets: "assets", + authKey: "authKey", + authSession: "authSession", + authUser: "authUser", + emailVerificationToken: "emailVerificationToken", + follower: "follower", + following: "following", + games: "games", + passwordResetToken: "passwordResetToken", + savedOcGenerators: "savedOcGenerators", + socialsConnection: "socialsConnection", +}; + +export * as schema from "@/db/migrations/schema"; diff --git a/src/routes/games/allGames.ts b/src/routes/games/allGames.ts index a96bccf..104efcf 100644 --- a/src/routes/games/allGames.ts +++ b/src/routes/games/allGames.ts @@ -26,7 +26,7 @@ export const getAllGames = async (c: Context) => { const db = conn.planetscale; const gameList = await db - .execute("SELECT * FROM games ORDER BY last_updated ASC") + .execute("SELECT * FROM games ORDER BY asset_count DESC") .then((row) => row.rows.map((game: Game) => ({ ...game, diff --git a/src/routes/search/assetSearch.ts b/src/routes/search/asset/assetSearch.ts similarity index 100% rename from src/routes/search/assetSearch.ts rename to src/routes/search/asset/assetSearch.ts diff --git a/src/routes/search/searchRoute.ts b/src/routes/search/asset/searchRoute.ts similarity index 54% rename from src/routes/search/searchRoute.ts rename to src/routes/search/asset/searchRoute.ts index 3adbfed..8cf6813 100644 --- a/src/routes/search/searchRoute.ts +++ b/src/routes/search/asset/searchRoute.ts @@ -2,14 +2,14 @@ import { Hono } from "hono"; import { getAssetSearch } from "./assetSearch"; import { recentAssets } from "./assetSearch"; -const searchRoute = new Hono(); +const assetSearchRoute = new Hono(); -searchRoute.get("/assets", async (c) => { +assetSearchRoute.get("/", async (c) => { return getAssetSearch(c); }); -searchRoute.get("/recent", async (c) => { +assetSearchRoute.get("/recent", async (c) => { return recentAssets(c); }); -export default searchRoute; +export default assetSearchRoute; From 658d8e979442e0db36bb6daa95b366f71ed53881 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 6 Aug 2023 19:32:33 +0100 Subject: [PATCH 040/318] update redirects to json responses --- src/index.ts | 4 ++-- src/lib/auth/lucia.ts | 7 ++++--- src/routes/auth/login.ts | 4 ++-- src/routes/auth/logout.ts | 4 ++-- src/routes/auth/signup.ts | 5 +++-- src/routes/auth/validate.ts | 11 ++++++++--- 6 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src/index.ts b/src/index.ts index ce20359..0eb5693 100644 --- a/src/index.ts +++ b/src/index.ts @@ -6,7 +6,7 @@ import ocGeneratorRoute from "./routes/oc-generators/ocGeneratorRoutes"; import assetSearchRoute from "./routes/search/asset/searchRoute"; import gamesRoute from "./routes/games/gamesRoute"; import userRoute from "./routes/user/userRoute"; -// import authRoute from "./routes/auth/authRoute"; +import authRoute from "./routes/auth/authRoute"; interface Bindings extends Env { [key: string]: unknown; } @@ -27,7 +27,7 @@ app.route("/oc-generators", ocGeneratorRoute); app.route("/search/assets", assetSearchRoute); app.route("/games", gamesRoute); app.route("/user", userRoute); -// app.route("/auth", authRoute); +app.route("/auth", authRoute); app.all("*", (c) => { c.status(404); return c.json({ status: "not found" }); diff --git a/src/lib/auth/lucia.ts b/src/lib/auth/lucia.ts index c385d0d..bae2e91 100644 --- a/src/lib/auth/lucia.ts +++ b/src/lib/auth/lucia.ts @@ -3,6 +3,7 @@ import { web } from "lucia/middleware"; import { planetscale } from "@lucia-auth/adapter-mysql"; import { getConnection } from "../planetscale"; import { Env } from "@/worker-configuration"; +import { tableNames } from "../drizzle"; export const authorizationTokenNames = { csrf: "__csrf_token", @@ -17,9 +18,9 @@ export const auth = (env: Env) => { return lucia({ adapter: planetscale(connection, { - key: "authKey", - user: "authUser", - session: "authSession", + key: tableNames.authKey, + user: tableNames.authUser, + session: tableNames.authSession, }), middleware: web(), sessionExpiresIn: { diff --git a/src/routes/auth/login.ts b/src/routes/auth/login.ts index 612763e..1d74999 100644 --- a/src/routes/auth/login.ts +++ b/src/routes/auth/login.ts @@ -11,7 +11,7 @@ export const login = async (c: Context): Promise => { const validSession = await auth(c.env).handleRequest(c.req.raw).validate(); if (validSession) { - return c.redirect("/"); + return c.json({ success: false, state: "already logged in" }, 200); } if (!validate.username(username) || !validate.password(password)) { @@ -43,5 +43,5 @@ export const login = async (c: Context): Promise => { sameSite: "Lax", }); - return c.redirect("/"); + return c.json({ success: true, state: "logged in" }, 200); }; diff --git a/src/routes/auth/logout.ts b/src/routes/auth/logout.ts index 8feb653..8cf2684 100644 --- a/src/routes/auth/logout.ts +++ b/src/routes/auth/logout.ts @@ -8,10 +8,10 @@ export const logout = async (c: Context): Promise => { const session = await authRequest.validate(); if (!session) { - return c.redirect("/login"); + return c.json({ success: false, state: "invalid session" }, 200); } deleteCookie(c, authorizationTokenNames.session); await auth(c.env).invalidateSession(session.sessionId); - return c.redirect("/login"); + return c.json({ success: true, state: "logged out" }, 200); }; diff --git a/src/routes/auth/signup.ts b/src/routes/auth/signup.ts index 0519d8b..b9329c3 100644 --- a/src/routes/auth/signup.ts +++ b/src/routes/auth/signup.ts @@ -10,7 +10,8 @@ export const signup = async (c: Context) => { const { username, password, email, passwordConfirm } = body; const validSession = await auth(c.env).handleRequest(c.req.raw).validate(); - if (validSession) return c.redirect("/"); + if (validSession) + return c.json({ success: false, state: "already logged in" }, 200); if ( !validate.username(username) || @@ -62,5 +63,5 @@ export const signup = async (c: Context) => { sameSite: "Lax", }); - return c.redirect("/"); + return c.json({ success: true, tate: "logged in" }, 200); }; diff --git a/src/routes/auth/validate.ts b/src/routes/auth/validate.ts index 521fbab..e38680f 100644 --- a/src/routes/auth/validate.ts +++ b/src/routes/auth/validate.ts @@ -1,6 +1,6 @@ import { auth, authorizationTokenNames } from "@/lib/auth/lucia"; import { Context } from "hono"; -import { deleteCookie } from "hono/cookie"; +import { getCookie, deleteCookie } from "hono/cookie"; export const validate = async (c: Context): Promise => { const authRequest = auth(c.env).handleRequest(c.req.raw); @@ -8,14 +8,19 @@ export const validate = async (c: Context): Promise => { const session = await authRequest.validate(); if (!session) { - deleteCookie(c, authorizationTokenNames.session); + // get the cookie, if it exists, and delete it + const cookie = getCookie(c, authorizationTokenNames.session); + if (cookie) { + deleteCookie(c, authorizationTokenNames.session); + } + return c.json({ success: true, state: "invalid session" }, 200); } if (session.state === "idle") { await auth(c.env).invalidateSession(session.sessionId); deleteCookie(c, authorizationTokenNames.session); - return c.redirect("/login"); + return c.json({ success: true, state: "invalid session" }, 200); } return c.json(session, 200); From 370221e3746a99aaff3f0d105c2a2c03ae172681 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 6 Aug 2023 23:10:56 +0100 Subject: [PATCH 041/318] fix: auth routes, setup cors --- src/lib/types/auth.ts | 8 --- src/routes/auth/authRoute.ts | 9 ++++ src/routes/auth/login.ts | 11 +++-- src/routes/auth/signup.ts | 96 ++++++++++++++++++++++-------------- src/routes/auth/validate.ts | 6 +-- 5 files changed, 79 insertions(+), 51 deletions(-) delete mode 100644 src/lib/types/auth.ts diff --git a/src/lib/types/auth.ts b/src/lib/types/auth.ts deleted file mode 100644 index 647ff9f..0000000 --- a/src/lib/types/auth.ts +++ /dev/null @@ -1,8 +0,0 @@ -export interface LoginBody { - username: string; - password: string; -} -export interface RegisterBody extends LoginBody { - email: string; - passwordConfirm: string; -} diff --git a/src/routes/auth/authRoute.ts b/src/routes/auth/authRoute.ts index 69d4056..29233a3 100644 --- a/src/routes/auth/authRoute.ts +++ b/src/routes/auth/authRoute.ts @@ -2,10 +2,19 @@ import { Hono } from "hono"; import { login } from "./login"; import { logout } from "./logout"; import { signup } from "./signup"; +import { cors } from "hono/cors"; import { validate } from "./validate"; const authRoute = new Hono(); +authRoute.use( + "*", + cors({ + // "http://localhost:3000", + origin: ["https://next.wanderer.moe"], + }) +); + authRoute.post("/login", async (c) => { return login(c); }); diff --git a/src/routes/auth/login.ts b/src/routes/auth/login.ts index 1d74999..e7149da 100644 --- a/src/routes/auth/login.ts +++ b/src/routes/auth/login.ts @@ -1,15 +1,18 @@ import { auth, authorizationTokenNames } from "@/lib/auth/lucia"; -import type { LoginBody } from "@/lib/types/auth"; import { Context } from "hono"; import { setCookie } from "hono/cookie"; import * as validate from "@/lib/regex/accountValidation"; export const login = async (c: Context): Promise => { - const body = (await c.req.json()) as LoginBody; - const { username, password } = body; + const formData = await c.req.formData(); + + const username = formData.get("username") as string; + const password = formData.get("password") as string; const validSession = await auth(c.env).handleRequest(c.req.raw).validate(); + console.log(validSession); + if (validSession) { return c.json({ success: false, state: "already logged in" }, 200); } @@ -40,7 +43,7 @@ export const login = async (c: Context): Promise => { expires: newSession.activePeriodExpiresAt, httpOnly: true, secure: true, - sameSite: "Lax", + // sameSite: "Lax", }); return c.json({ success: true, state: "logged in" }, 200); diff --git a/src/routes/auth/signup.ts b/src/routes/auth/signup.ts index b9329c3..b477b1d 100644 --- a/src/routes/auth/signup.ts +++ b/src/routes/auth/signup.ts @@ -1,13 +1,17 @@ import { auth, authorizationTokenNames } from "@/lib/auth/lucia"; -import type { RegisterBody } from "@/lib/types/auth"; import { Context } from "hono"; import { setCookie } from "hono/cookie"; import * as validate from "@/lib/regex/accountValidation"; +import { LuciaError } from "lucia"; export const signup = async (c: Context) => { - const body = (await c.req.json()) as RegisterBody; + const body = await c.req.formData(); + + const username = body.get("username") as string; + const password = body.get("password") as string; + const passwordConfirm = body.get("passwordConfirm") as string; + const email = body.get("email") as string; - const { username, password, email, passwordConfirm } = body; const validSession = await auth(c.env).handleRequest(c.req.raw).validate(); if (validSession) @@ -29,39 +33,59 @@ export const signup = async (c: Context) => { ); } - const user = await auth(c.env).createUser({ - key: { - providerId: "username", - providerUserId: username.toLowerCase(), - password, - }, - attributes: { - username, - email, - email_verified: 0, - date_joined: new Date(), - verified: 0, - role_flags: 0, - self_assignable_role_flags: null, - username_colour: null, - avatar_url: null, - banner_url: null, - pronouns: null, - bio: null, - }, - }); - - const newSession = await auth(c.env).createSession({ - userId: user.userId, - attributes: {}, - }); + try { + const user = await auth(c.env).createUser({ + key: { + providerId: "username", + providerUserId: username.toLowerCase(), + password, + }, + attributes: { + username, + email, + email_verified: 0, + date_joined: new Date(), + verified: 0, + role_flags: 0, + self_assignable_role_flags: null, + username_colour: null, + avatar_url: null, + banner_url: null, + pronouns: null, + bio: null, + }, + }); + const newSession = await auth(c.env).createSession({ + userId: user.userId, + attributes: {}, + }); - setCookie(c, authorizationTokenNames.csrf, newSession.sessionId, { - expires: newSession.activePeriodExpiresAt, - httpOnly: true, - secure: true, - sameSite: "Lax", - }); + setCookie(c, authorizationTokenNames.csrf, newSession.sessionId, { + expires: newSession.activePeriodExpiresAt, + httpOnly: true, + secure: true, + // sameSite: "Lax", + }); - return c.json({ success: true, tate: "logged in" }, 200); + return c.json({ success: true, tate: "logged in" }, 200); + } catch (e) { + if (e instanceof LuciaError) { + return c.json( + { + success: false, + status: "error", + error: "Account creation error, most likely already exists", + }, + 500 + ); + } + return c.json( + { + success: false, + status: "error", + error: "500 Internal Server Error", + }, + 500 + ); + } }; diff --git a/src/routes/auth/validate.ts b/src/routes/auth/validate.ts index e38680f..f1d7de9 100644 --- a/src/routes/auth/validate.ts +++ b/src/routes/auth/validate.ts @@ -13,15 +13,15 @@ export const validate = async (c: Context): Promise => { if (cookie) { deleteCookie(c, authorizationTokenNames.session); } - return c.json({ success: true, state: "invalid session" }, 200); + return c.json({ success: false, state: "invalid session" }, 200); } if (session.state === "idle") { await auth(c.env).invalidateSession(session.sessionId); deleteCookie(c, authorizationTokenNames.session); - return c.json({ success: true, state: "invalid session" }, 200); + return c.json({ success: false, state: "invalid session" }, 200); } - return c.json(session, 200); + return c.json({ success: true, state: "valid session", session }, 200); }; From 3c05f4e5e3b0463beb7ed33d116de7b03fb8819c Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Tue, 8 Aug 2023 00:45:53 +0100 Subject: [PATCH 042/318] fix: download count updating --- README.md | 2 ++ drizzle.config.ts | 2 +- src/routes/asset/downloadAsset.ts | 2 +- src/routes/auth/login.ts | 3 ++- src/routes/auth/signup.ts | 4 ++-- 5 files changed, 8 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index a5eb6d5..209a547 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,8 @@ Source code for the API powering [**wanderer.moe**](https://wanderer.moe) — us Configuration is in `wrangler.toml`. +You will require either a workers paid plan **or to set your worker to unbound** for authentication and password hashing to work. + You will need to setup environment variables for the Discord Bot Token for `/contributors` route: `DISCORD_TOKEN` and for Planetscale, using `wrangler secret put`. - Run `wrangler dev` to preview locally. diff --git a/drizzle.config.ts b/drizzle.config.ts index 67aedb6..e14981a 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -8,7 +8,7 @@ export default { breakpoints: true, driver: "mysql2", dbCredentials: { - host: process.env.DATABASE_HOST! || "", + host: process.env.DATABASE_HOST || "", user: process.env.DATABASE_USERNAME || "", password: process.env.DATABASE_PASSWORD || "", database: "planetscale", diff --git a/src/routes/asset/downloadAsset.ts b/src/routes/asset/downloadAsset.ts index a756014..56f10eb 100644 --- a/src/routes/asset/downloadAsset.ts +++ b/src/routes/asset/downloadAsset.ts @@ -26,7 +26,7 @@ export const downloadAsset = async (c: Context) => { const blob = await response.blob(); await db.execute( - "UPDATE assets SET downloads = downloads + 1 WHERE id = ?", + "UPDATE assets SET download_count = download_count + 1 WHERE id = ?", [assetId] ); diff --git a/src/routes/auth/login.ts b/src/routes/auth/login.ts index e7149da..2f41fe1 100644 --- a/src/routes/auth/login.ts +++ b/src/routes/auth/login.ts @@ -41,9 +41,10 @@ export const login = async (c: Context): Promise => { setCookie(c, authorizationTokenNames.csrf, newSession.sessionId, { expires: newSession.activePeriodExpiresAt, + sameSite: "Lax", httpOnly: true, + path: "/", secure: true, - // sameSite: "Lax", }); return c.json({ success: true, state: "logged in" }, 200); diff --git a/src/routes/auth/signup.ts b/src/routes/auth/signup.ts index b477b1d..5bbef50 100644 --- a/src/routes/auth/signup.ts +++ b/src/routes/auth/signup.ts @@ -64,10 +64,10 @@ export const signup = async (c: Context) => { expires: newSession.activePeriodExpiresAt, httpOnly: true, secure: true, - // sameSite: "Lax", + sameSite: "Lax", }); - return c.json({ success: true, tate: "logged in" }, 200); + return c.json({ success: true, state: "logged in" }, 200); } catch (e) { if (e instanceof LuciaError) { return c.json( From 56a3648605420795024a0b5bf4a31d021a906dd3 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Tue, 8 Aug 2023 01:02:56 +0100 Subject: [PATCH 043/318] feat: update view count on /asset/[id] request --- src/routes/asset/assetRoute.ts | 1 + src/routes/asset/getAssetFromId.ts | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/src/routes/asset/assetRoute.ts b/src/routes/asset/assetRoute.ts index 3545601..ef48672 100644 --- a/src/routes/asset/assetRoute.ts +++ b/src/routes/asset/assetRoute.ts @@ -8,6 +8,7 @@ assetRoute.get("/:id", async (c) => { return getAssetFromId(c); }); +// setting both of these to id returns "duplicate param name" error, will fix later assetRoute.get("/download/:assetId", async (c) => { return downloadAsset(c); }); diff --git a/src/routes/asset/getAssetFromId.ts b/src/routes/asset/getAssetFromId.ts index 6b92758..564fcd5 100644 --- a/src/routes/asset/getAssetFromId.ts +++ b/src/routes/asset/getAssetFromId.ts @@ -60,6 +60,11 @@ export const getAssetFromId = async (c) => { }; }); + await db.execute( + "UPDATE assets SET view_count = view_count + 1 WHERE id = ?", + [id] + ); + response = c.json( { success: true, From 5fe78bbd9b3304c48b463dc942c14fe61a4713a5 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Tue, 8 Aug 2023 16:48:25 +0100 Subject: [PATCH 044/318] update dependencies, use hono middleware --- package.json | 24 +- pnpm-lock.yaml | 1223 ++++++++++++++++------------------- src/lib/auth/lucia.ts | 13 +- src/routes/auth/login.ts | 14 +- src/routes/auth/logout.ts | 5 +- src/routes/auth/signup.ts | 14 +- src/routes/auth/validate.ts | 12 +- 7 files changed, 599 insertions(+), 706 deletions(-) diff --git a/package.json b/package.json index 4996b26..88ea841 100644 --- a/package.json +++ b/package.json @@ -12,29 +12,29 @@ "prisma:push": "npx prisma db push" }, "devDependencies": { - "@cloudflare/workers-types": "^4.20230710.1", + "@cloudflare/workers-types": "^4.20230807.0", "@types/node": "^20.4.8", - "eslint": "^8.45.0", + "eslint": "^8.46.0", "eslint-config-google": "^0.14.0", "eslint-plugin-json": "^3.1.0", "typescript": "^5.1.6", - "wrangler": "3.2.0" + "wrangler": "3.4.0" }, "private": true, "dependencies": { - "@aws-sdk/client-s3": "^3.382.0", + "@aws-sdk/client-s3": "^3.386.0", "@lucia-auth/adapter-mysql": "^2.0.0", - "@lucia-auth/adapter-prisma": "^3.0.0", - "@planetscale/database": "^1.8.0", - "@prisma/client": "^5.0.0", - "@typescript-eslint/eslint-plugin": "^6.0.0", + "@lucia-auth/adapter-prisma": "^3.0.1", + "@planetscale/database": "^1.10.0", + "@prisma/client": "^5.1.1", + "@typescript-eslint/eslint-plugin": "^6.3.0", "dotenv": "^16.3.1", "drizzle-kit": "^0.19.12", - "drizzle-orm": "^0.27.2", - "hono": "^3.3.4", - "lucia": "^2.0.0", + "drizzle-orm": "^0.28.1", + "hono": "^3.4.1", + "lucia": "^2.2.0", "mysql2": "^3.6.0", - "prettier": "^3.0.0", + "prettier": "^3.0.1", "render2": "^1.2.1", "resend": "^0.17.2" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 19076ec..8ee6445 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,23 +6,23 @@ settings: dependencies: "@aws-sdk/client-s3": - specifier: ^3.382.0 - version: 3.382.0 + specifier: ^3.386.0 + version: 3.386.0 "@lucia-auth/adapter-mysql": specifier: ^2.0.0 - version: 2.0.0(@planetscale/database@1.8.0)(lucia@2.0.0)(mysql2@3.6.0) + version: 2.0.0(@planetscale/database@1.10.0)(lucia@2.2.0)(mysql2@3.6.0) "@lucia-auth/adapter-prisma": - specifier: ^3.0.0 - version: 3.0.0(@prisma/client@5.0.0)(lucia@2.0.0) + specifier: ^3.0.1 + version: 3.0.1(@prisma/client@5.1.1)(lucia@2.2.0) "@planetscale/database": - specifier: ^1.8.0 - version: 1.8.0 + specifier: ^1.10.0 + version: 1.10.0 "@prisma/client": - specifier: ^5.0.0 - version: 5.0.0 + specifier: ^5.1.1 + version: 5.1.1 "@typescript-eslint/eslint-plugin": - specifier: ^6.0.0 - version: 6.0.0(@typescript-eslint/parser@6.0.0)(eslint@8.45.0)(typescript@5.1.6) + specifier: ^6.3.0 + version: 6.3.0(@typescript-eslint/parser@6.3.0)(eslint@8.46.0)(typescript@5.1.6) dotenv: specifier: ^16.3.1 version: 16.3.1 @@ -30,20 +30,20 @@ dependencies: specifier: ^0.19.12 version: 0.19.12 drizzle-orm: - specifier: ^0.27.2 - version: 0.27.2(@cloudflare/workers-types@4.20230710.1)(@planetscale/database@1.8.0)(mysql2@3.6.0) + specifier: ^0.28.1 + version: 0.28.1(@cloudflare/workers-types@4.20230807.0)(@planetscale/database@1.10.0)(mysql2@3.6.0) hono: - specifier: ^3.3.4 - version: 3.3.4 + specifier: ^3.4.1 + version: 3.4.1 lucia: - specifier: ^2.0.0 - version: 2.0.0 + specifier: ^2.2.0 + version: 2.2.0 mysql2: specifier: ^3.6.0 version: 3.6.0 prettier: - specifier: ^3.0.0 - version: 3.0.0 + specifier: ^3.0.1 + version: 3.0.1 render2: specifier: ^1.2.1 version: 1.2.1 @@ -53,17 +53,17 @@ dependencies: devDependencies: "@cloudflare/workers-types": - specifier: ^4.20230710.1 - version: 4.20230710.1 + specifier: ^4.20230807.0 + version: 4.20230807.0 "@types/node": specifier: ^20.4.8 version: 20.4.8 eslint: - specifier: ^8.45.0 - version: 8.45.0 + specifier: ^8.46.0 + version: 8.46.0 eslint-config-google: specifier: ^0.14.0 - version: 0.14.0(eslint@8.45.0) + version: 0.14.0(eslint@8.46.0) eslint-plugin-json: specifier: ^3.1.0 version: 3.1.0 @@ -71,8 +71,8 @@ devDependencies: specifier: ^5.1.6 version: 5.1.6 wrangler: - specifier: 3.2.0 - version: 3.2.0 + specifier: 3.4.0 + version: 3.4.0 packages: /@aashutoshrathi/word-wrap@1.2.6: @@ -175,21 +175,21 @@ packages: tslib: 1.14.1 dev: false - /@aws-sdk/client-s3@3.382.0: + /@aws-sdk/client-s3@3.386.0: resolution: { - integrity: sha512-7s5DI1dw5HUF9+tHuZzkJaZBcaE3kuGsMw17/enEa8YdF0CtL5rW46FlzQ3/7NYIKc9rhDtb0UMakEej1cWFtg==, + integrity: sha512-c9c7bm3fsZwvl8pffl6OXUtxlLD1FVr8GM+0Pu+J2R76B5NkDsIvvVUa2fTcNjc0jVkvB6EkvUE4WfOCdKqEDQ==, } engines: { node: ">=14.0.0" } dependencies: "@aws-crypto/sha1-browser": 3.0.0 "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.382.0 - "@aws-sdk/credential-provider-node": 3.382.0 + "@aws-sdk/client-sts": 3.386.0 + "@aws-sdk/credential-provider-node": 3.386.0 "@aws-sdk/middleware-bucket-endpoint": 3.378.0 "@aws-sdk/middleware-expect-continue": 3.378.0 - "@aws-sdk/middleware-flexible-checksums": 3.378.0 + "@aws-sdk/middleware-flexible-checksums": 3.383.0 "@aws-sdk/middleware-host-header": 3.379.1 "@aws-sdk/middleware-location-constraint": 3.379.1 "@aws-sdk/middleware-logger": 3.378.0 @@ -197,98 +197,54 @@ packages: "@aws-sdk/middleware-sdk-s3": 3.379.1 "@aws-sdk/middleware-signing": 3.379.1 "@aws-sdk/middleware-ssec": 3.378.0 - "@aws-sdk/middleware-user-agent": 3.382.0 + "@aws-sdk/middleware-user-agent": 3.386.0 "@aws-sdk/signature-v4-multi-region": 3.378.0 "@aws-sdk/types": 3.378.0 - "@aws-sdk/util-endpoints": 3.382.0 + "@aws-sdk/util-endpoints": 3.386.0 "@aws-sdk/util-user-agent-browser": 3.378.0 "@aws-sdk/util-user-agent-node": 3.378.0 "@aws-sdk/xml-builder": 3.310.0 - "@smithy/config-resolver": 2.0.1 - "@smithy/eventstream-serde-browser": 2.0.1 - "@smithy/eventstream-serde-config-resolver": 2.0.1 - "@smithy/eventstream-serde-node": 2.0.1 - "@smithy/fetch-http-handler": 2.0.1 - "@smithy/hash-blob-browser": 2.0.1 - "@smithy/hash-node": 2.0.1 - "@smithy/hash-stream-node": 2.0.1 - "@smithy/invalid-dependency": 2.0.1 - "@smithy/md5-js": 2.0.1 - "@smithy/middleware-content-length": 2.0.1 - "@smithy/middleware-endpoint": 2.0.1 - "@smithy/middleware-retry": 2.0.1 - "@smithy/middleware-serde": 2.0.1 + "@smithy/config-resolver": 2.0.2 + "@smithy/eventstream-serde-browser": 2.0.2 + "@smithy/eventstream-serde-config-resolver": 2.0.2 + "@smithy/eventstream-serde-node": 2.0.2 + "@smithy/fetch-http-handler": 2.0.2 + "@smithy/hash-blob-browser": 2.0.2 + "@smithy/hash-node": 2.0.2 + "@smithy/hash-stream-node": 2.0.2 + "@smithy/invalid-dependency": 2.0.2 + "@smithy/md5-js": 2.0.2 + "@smithy/middleware-content-length": 2.0.2 + "@smithy/middleware-endpoint": 2.0.2 + "@smithy/middleware-retry": 2.0.2 + "@smithy/middleware-serde": 2.0.2 "@smithy/middleware-stack": 2.0.0 - "@smithy/node-config-provider": 2.0.1 - "@smithy/node-http-handler": 2.0.1 - "@smithy/protocol-http": 2.0.1 - "@smithy/smithy-client": 2.0.1 - "@smithy/types": 2.0.2 - "@smithy/url-parser": 2.0.1 + "@smithy/node-config-provider": 2.0.2 + "@smithy/node-http-handler": 2.0.2 + "@smithy/protocol-http": 2.0.2 + "@smithy/smithy-client": 2.0.2 + "@smithy/types": 2.1.0 + "@smithy/url-parser": 2.0.2 "@smithy/util-base64": 2.0.0 "@smithy/util-body-length-browser": 2.0.0 "@smithy/util-body-length-node": 2.0.0 - "@smithy/util-defaults-mode-browser": 2.0.1 - "@smithy/util-defaults-mode-node": 2.0.1 + "@smithy/util-defaults-mode-browser": 2.0.2 + "@smithy/util-defaults-mode-node": 2.0.2 "@smithy/util-retry": 2.0.0 - "@smithy/util-stream": 2.0.1 + "@smithy/util-stream": 2.0.2 "@smithy/util-utf8": 2.0.0 - "@smithy/util-waiter": 2.0.1 + "@smithy/util-waiter": 2.0.2 fast-xml-parser: 4.2.5 - tslib: 2.6.0 + tslib: 2.6.1 transitivePeerDependencies: - "@aws-sdk/signature-v4-crt" - aws-crt dev: false - /@aws-sdk/client-sso-oidc@3.382.0: - resolution: - { - integrity: sha512-hTfvB1ftbrqaz7qiEkmRobzUQwG34oZlByobn8Frdr5ZQbJk969bX6evQAPyKlJEr26+kL9TnaX+rbLR/+gwHQ==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@aws-crypto/sha256-browser": 3.0.0 - "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/middleware-host-header": 3.379.1 - "@aws-sdk/middleware-logger": 3.378.0 - "@aws-sdk/middleware-recursion-detection": 3.378.0 - "@aws-sdk/middleware-user-agent": 3.382.0 - "@aws-sdk/types": 3.378.0 - "@aws-sdk/util-endpoints": 3.382.0 - "@aws-sdk/util-user-agent-browser": 3.378.0 - "@aws-sdk/util-user-agent-node": 3.378.0 - "@smithy/config-resolver": 2.0.1 - "@smithy/fetch-http-handler": 2.0.1 - "@smithy/hash-node": 2.0.1 - "@smithy/invalid-dependency": 2.0.1 - "@smithy/middleware-content-length": 2.0.1 - "@smithy/middleware-endpoint": 2.0.1 - "@smithy/middleware-retry": 2.0.1 - "@smithy/middleware-serde": 2.0.1 - "@smithy/middleware-stack": 2.0.0 - "@smithy/node-config-provider": 2.0.1 - "@smithy/node-http-handler": 2.0.1 - "@smithy/protocol-http": 2.0.1 - "@smithy/smithy-client": 2.0.1 - "@smithy/types": 2.0.2 - "@smithy/url-parser": 2.0.1 - "@smithy/util-base64": 2.0.0 - "@smithy/util-body-length-browser": 2.0.0 - "@smithy/util-body-length-node": 2.0.0 - "@smithy/util-defaults-mode-browser": 2.0.1 - "@smithy/util-defaults-mode-node": 2.0.1 - "@smithy/util-retry": 2.0.0 - "@smithy/util-utf8": 2.0.0 - tslib: 2.6.0 - transitivePeerDependencies: - - aws-crt - dev: false - - /@aws-sdk/client-sso@3.382.0: + /@aws-sdk/client-sso@3.386.0: resolution: { - integrity: sha512-ge11t4hJllOF8pBNF0p1X52lLqUsLGAoey24fvk3fyvvczeLpegGYh2kdLG0iwFTDgRxaUqK+kboH5Wy9ux/pw==, + integrity: sha512-UBgRo0q/XSle9CHCpoFhzq9wCfdc4kJw40cpPoHJPbb5m3JMcDu0mq4LTY7Nwnoy9jBThfRVYf3EF2BMF8fo6A==, } engines: { node: ">=14.0.0" } dependencies: @@ -297,82 +253,82 @@ packages: "@aws-sdk/middleware-host-header": 3.379.1 "@aws-sdk/middleware-logger": 3.378.0 "@aws-sdk/middleware-recursion-detection": 3.378.0 - "@aws-sdk/middleware-user-agent": 3.382.0 + "@aws-sdk/middleware-user-agent": 3.386.0 "@aws-sdk/types": 3.378.0 - "@aws-sdk/util-endpoints": 3.382.0 + "@aws-sdk/util-endpoints": 3.386.0 "@aws-sdk/util-user-agent-browser": 3.378.0 "@aws-sdk/util-user-agent-node": 3.378.0 - "@smithy/config-resolver": 2.0.1 - "@smithy/fetch-http-handler": 2.0.1 - "@smithy/hash-node": 2.0.1 - "@smithy/invalid-dependency": 2.0.1 - "@smithy/middleware-content-length": 2.0.1 - "@smithy/middleware-endpoint": 2.0.1 - "@smithy/middleware-retry": 2.0.1 - "@smithy/middleware-serde": 2.0.1 + "@smithy/config-resolver": 2.0.2 + "@smithy/fetch-http-handler": 2.0.2 + "@smithy/hash-node": 2.0.2 + "@smithy/invalid-dependency": 2.0.2 + "@smithy/middleware-content-length": 2.0.2 + "@smithy/middleware-endpoint": 2.0.2 + "@smithy/middleware-retry": 2.0.2 + "@smithy/middleware-serde": 2.0.2 "@smithy/middleware-stack": 2.0.0 - "@smithy/node-config-provider": 2.0.1 - "@smithy/node-http-handler": 2.0.1 - "@smithy/protocol-http": 2.0.1 - "@smithy/smithy-client": 2.0.1 - "@smithy/types": 2.0.2 - "@smithy/url-parser": 2.0.1 + "@smithy/node-config-provider": 2.0.2 + "@smithy/node-http-handler": 2.0.2 + "@smithy/protocol-http": 2.0.2 + "@smithy/smithy-client": 2.0.2 + "@smithy/types": 2.1.0 + "@smithy/url-parser": 2.0.2 "@smithy/util-base64": 2.0.0 "@smithy/util-body-length-browser": 2.0.0 "@smithy/util-body-length-node": 2.0.0 - "@smithy/util-defaults-mode-browser": 2.0.1 - "@smithy/util-defaults-mode-node": 2.0.1 + "@smithy/util-defaults-mode-browser": 2.0.2 + "@smithy/util-defaults-mode-node": 2.0.2 "@smithy/util-retry": 2.0.0 "@smithy/util-utf8": 2.0.0 - tslib: 2.6.0 + tslib: 2.6.1 transitivePeerDependencies: - aws-crt dev: false - /@aws-sdk/client-sts@3.382.0: + /@aws-sdk/client-sts@3.386.0: resolution: { - integrity: sha512-G5wgahrOqmrljjyLVGASIZUXIIdalbCo0z4PuFHdb2R2CVfwO8renfgrmk4brT9tIxIfen5bRA7ftXMe7yrgRA==, + integrity: sha512-VK+tdZaI971IDP/1WqpYNorf+Q5uoJTqcp3y/bQY4Hr5bf8N3aztDrX7a2GaA07zgSdUa82VkScMKzW31jhsxw==, } engines: { node: ">=14.0.0" } dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/credential-provider-node": 3.382.0 + "@aws-sdk/credential-provider-node": 3.386.0 "@aws-sdk/middleware-host-header": 3.379.1 "@aws-sdk/middleware-logger": 3.378.0 "@aws-sdk/middleware-recursion-detection": 3.378.0 "@aws-sdk/middleware-sdk-sts": 3.379.1 "@aws-sdk/middleware-signing": 3.379.1 - "@aws-sdk/middleware-user-agent": 3.382.0 + "@aws-sdk/middleware-user-agent": 3.386.0 "@aws-sdk/types": 3.378.0 - "@aws-sdk/util-endpoints": 3.382.0 + "@aws-sdk/util-endpoints": 3.386.0 "@aws-sdk/util-user-agent-browser": 3.378.0 "@aws-sdk/util-user-agent-node": 3.378.0 - "@smithy/config-resolver": 2.0.1 - "@smithy/fetch-http-handler": 2.0.1 - "@smithy/hash-node": 2.0.1 - "@smithy/invalid-dependency": 2.0.1 - "@smithy/middleware-content-length": 2.0.1 - "@smithy/middleware-endpoint": 2.0.1 - "@smithy/middleware-retry": 2.0.1 - "@smithy/middleware-serde": 2.0.1 + "@smithy/config-resolver": 2.0.2 + "@smithy/fetch-http-handler": 2.0.2 + "@smithy/hash-node": 2.0.2 + "@smithy/invalid-dependency": 2.0.2 + "@smithy/middleware-content-length": 2.0.2 + "@smithy/middleware-endpoint": 2.0.2 + "@smithy/middleware-retry": 2.0.2 + "@smithy/middleware-serde": 2.0.2 "@smithy/middleware-stack": 2.0.0 - "@smithy/node-config-provider": 2.0.1 - "@smithy/node-http-handler": 2.0.1 - "@smithy/protocol-http": 2.0.1 - "@smithy/smithy-client": 2.0.1 - "@smithy/types": 2.0.2 - "@smithy/url-parser": 2.0.1 + "@smithy/node-config-provider": 2.0.2 + "@smithy/node-http-handler": 2.0.2 + "@smithy/protocol-http": 2.0.2 + "@smithy/smithy-client": 2.0.2 + "@smithy/types": 2.1.0 + "@smithy/url-parser": 2.0.2 "@smithy/util-base64": 2.0.0 "@smithy/util-body-length-browser": 2.0.0 "@smithy/util-body-length-node": 2.0.0 - "@smithy/util-defaults-mode-browser": 2.0.1 - "@smithy/util-defaults-mode-node": 2.0.1 + "@smithy/util-defaults-mode-browser": 2.0.2 + "@smithy/util-defaults-mode-node": 2.0.2 "@smithy/util-retry": 2.0.0 "@smithy/util-utf8": 2.0.0 fast-xml-parser: 4.2.5 - tslib: 2.6.0 + tslib: 2.6.1 transitivePeerDependencies: - aws-crt dev: false @@ -385,50 +341,50 @@ packages: engines: { node: ">=14.0.0" } dependencies: "@aws-sdk/types": 3.378.0 - "@smithy/property-provider": 2.0.1 - "@smithy/types": 2.0.2 - tslib: 2.6.0 + "@smithy/property-provider": 2.0.2 + "@smithy/types": 2.1.0 + tslib: 2.6.1 dev: false - /@aws-sdk/credential-provider-ini@3.382.0: + /@aws-sdk/credential-provider-ini@3.386.0: resolution: { - integrity: sha512-31pi44WWri2WQmagqptUv7x3Nq8pQ6H06OCQx5goEm77SosSdwQwyBPrS9Pg0yI9aljFAxF+rZ75degsCorbQg==, + integrity: sha512-TDeOFwCq6Ri58OP4CvVIAbc+iJPld7TpOFB+YYQ+q0ut+92zaVTNrNoWZkygPCXKmeHUGZcwC9Mjt/4L+fBAkg==, } engines: { node: ">=14.0.0" } dependencies: "@aws-sdk/credential-provider-env": 3.378.0 "@aws-sdk/credential-provider-process": 3.378.0 - "@aws-sdk/credential-provider-sso": 3.382.0 + "@aws-sdk/credential-provider-sso": 3.386.0 "@aws-sdk/credential-provider-web-identity": 3.378.0 "@aws-sdk/types": 3.378.0 - "@smithy/credential-provider-imds": 2.0.1 - "@smithy/property-provider": 2.0.1 - "@smithy/shared-ini-file-loader": 2.0.1 - "@smithy/types": 2.0.2 - tslib: 2.6.0 + "@smithy/credential-provider-imds": 2.0.2 + "@smithy/property-provider": 2.0.2 + "@smithy/shared-ini-file-loader": 2.0.2 + "@smithy/types": 2.1.0 + tslib: 2.6.1 transitivePeerDependencies: - aws-crt dev: false - /@aws-sdk/credential-provider-node@3.382.0: + /@aws-sdk/credential-provider-node@3.386.0: resolution: { - integrity: sha512-q6AWCCb0E0cH/Y5Dtln0QssbCBXDbV4PoTV3EdRuGoJcHyNfHJ8X0mqcc7k44wG4Piazu+ufZThvn43W7W9a4g==, + integrity: sha512-dvYSN+T1B96TqiZE5tBV8bHCNU6TKq5meeI06AdClHz3VPvPKDN/EL0undXpl/GnlvuhKUftmVwdUBefG3otZA==, } engines: { node: ">=14.0.0" } dependencies: "@aws-sdk/credential-provider-env": 3.378.0 - "@aws-sdk/credential-provider-ini": 3.382.0 + "@aws-sdk/credential-provider-ini": 3.386.0 "@aws-sdk/credential-provider-process": 3.378.0 - "@aws-sdk/credential-provider-sso": 3.382.0 + "@aws-sdk/credential-provider-sso": 3.386.0 "@aws-sdk/credential-provider-web-identity": 3.378.0 "@aws-sdk/types": 3.378.0 - "@smithy/credential-provider-imds": 2.0.1 - "@smithy/property-provider": 2.0.1 - "@smithy/shared-ini-file-loader": 2.0.1 - "@smithy/types": 2.0.2 - tslib: 2.6.0 + "@smithy/credential-provider-imds": 2.0.2 + "@smithy/property-provider": 2.0.2 + "@smithy/shared-ini-file-loader": 2.0.2 + "@smithy/types": 2.1.0 + tslib: 2.6.1 transitivePeerDependencies: - aws-crt dev: false @@ -441,26 +397,26 @@ packages: engines: { node: ">=14.0.0" } dependencies: "@aws-sdk/types": 3.378.0 - "@smithy/property-provider": 2.0.1 - "@smithy/shared-ini-file-loader": 2.0.1 - "@smithy/types": 2.0.2 - tslib: 2.6.0 + "@smithy/property-provider": 2.0.2 + "@smithy/shared-ini-file-loader": 2.0.2 + "@smithy/types": 2.1.0 + tslib: 2.6.1 dev: false - /@aws-sdk/credential-provider-sso@3.382.0: + /@aws-sdk/credential-provider-sso@3.386.0: resolution: { - integrity: sha512-tKCQKqxnAHeRD7pQNmDmLWwC7pt5koo6yiQTVQ382U+8xx7BNsApE1zdC4LrtrVN1FYqVbw5kXjYFtSCtaUxGA==, + integrity: sha512-7PvtrxMFpphQP8D5Zu5WpqZ/p7FBWiOQ2UQhzGKEry/9JIyTKiIZWsCu7OIWcfEx8RqSnLu3pDydc6HSTNs+lw==, } engines: { node: ">=14.0.0" } dependencies: - "@aws-sdk/client-sso": 3.382.0 - "@aws-sdk/token-providers": 3.382.0 + "@aws-sdk/client-sso": 3.386.0 + "@aws-sdk/token-providers": 3.386.0 "@aws-sdk/types": 3.378.0 - "@smithy/property-provider": 2.0.1 - "@smithy/shared-ini-file-loader": 2.0.1 - "@smithy/types": 2.0.2 - tslib: 2.6.0 + "@smithy/property-provider": 2.0.2 + "@smithy/shared-ini-file-loader": 2.0.2 + "@smithy/types": 2.1.0 + tslib: 2.6.1 transitivePeerDependencies: - aws-crt dev: false @@ -473,9 +429,9 @@ packages: engines: { node: ">=14.0.0" } dependencies: "@aws-sdk/types": 3.378.0 - "@smithy/property-provider": 2.0.1 - "@smithy/types": 2.0.2 - tslib: 2.6.0 + "@smithy/property-provider": 2.0.2 + "@smithy/types": 2.1.0 + tslib: 2.6.1 dev: false /@aws-sdk/middleware-bucket-endpoint@3.378.0: @@ -487,10 +443,10 @@ packages: dependencies: "@aws-sdk/types": 3.378.0 "@aws-sdk/util-arn-parser": 3.310.0 - "@smithy/protocol-http": 2.0.1 - "@smithy/types": 2.0.2 + "@smithy/protocol-http": 2.0.2 + "@smithy/types": 2.1.0 "@smithy/util-config-provider": 2.0.0 - tslib: 2.6.0 + tslib: 2.6.1 dev: false /@aws-sdk/middleware-expect-continue@3.378.0: @@ -501,15 +457,15 @@ packages: engines: { node: ">=14.0.0" } dependencies: "@aws-sdk/types": 3.378.0 - "@smithy/protocol-http": 2.0.1 - "@smithy/types": 2.0.2 - tslib: 2.6.0 + "@smithy/protocol-http": 2.0.2 + "@smithy/types": 2.1.0 + tslib: 2.6.1 dev: false - /@aws-sdk/middleware-flexible-checksums@3.378.0: + /@aws-sdk/middleware-flexible-checksums@3.383.0: resolution: { - integrity: sha512-pHkcVTu2T+x/1fpPHMpRDpXY5zxDsjijv3C6Nz/nm3gQrZvQ3fYDrQdV3Oj6Xeg40B3kkcp/bzgDo7MDzG088A==, + integrity: sha512-RxIuby6Nz4pgKqNtt9Rdr2gWtOLrl9shZrteVuPh42n/dSOtCIhsG0fffKqy247I6oUghicoVJK9v0mxfINu/w==, } engines: { node: ">=14.0.0" } dependencies: @@ -517,10 +473,10 @@ packages: "@aws-crypto/crc32c": 3.0.0 "@aws-sdk/types": 3.378.0 "@smithy/is-array-buffer": 2.0.0 - "@smithy/protocol-http": 2.0.1 - "@smithy/types": 2.0.2 + "@smithy/protocol-http": 2.0.2 + "@smithy/types": 2.1.0 "@smithy/util-utf8": 2.0.0 - tslib: 2.6.0 + tslib: 2.6.1 dev: false /@aws-sdk/middleware-host-header@3.379.1: @@ -531,9 +487,9 @@ packages: engines: { node: ">=14.0.0" } dependencies: "@aws-sdk/types": 3.378.0 - "@smithy/protocol-http": 2.0.1 - "@smithy/types": 2.0.2 - tslib: 2.6.0 + "@smithy/protocol-http": 2.0.2 + "@smithy/types": 2.1.0 + tslib: 2.6.1 dev: false /@aws-sdk/middleware-location-constraint@3.379.1: @@ -544,8 +500,8 @@ packages: engines: { node: ">=14.0.0" } dependencies: "@aws-sdk/types": 3.378.0 - "@smithy/types": 2.0.2 - tslib: 2.6.0 + "@smithy/types": 2.1.0 + tslib: 2.6.1 dev: false /@aws-sdk/middleware-logger@3.378.0: @@ -556,8 +512,8 @@ packages: engines: { node: ">=14.0.0" } dependencies: "@aws-sdk/types": 3.378.0 - "@smithy/types": 2.0.2 - tslib: 2.6.0 + "@smithy/types": 2.1.0 + tslib: 2.6.1 dev: false /@aws-sdk/middleware-recursion-detection@3.378.0: @@ -568,9 +524,9 @@ packages: engines: { node: ">=14.0.0" } dependencies: "@aws-sdk/types": 3.378.0 - "@smithy/protocol-http": 2.0.1 - "@smithy/types": 2.0.2 - tslib: 2.6.0 + "@smithy/protocol-http": 2.0.2 + "@smithy/types": 2.1.0 + tslib: 2.6.1 dev: false /@aws-sdk/middleware-sdk-s3@3.379.1: @@ -582,9 +538,9 @@ packages: dependencies: "@aws-sdk/types": 3.378.0 "@aws-sdk/util-arn-parser": 3.310.0 - "@smithy/protocol-http": 2.0.1 - "@smithy/types": 2.0.2 - tslib: 2.6.0 + "@smithy/protocol-http": 2.0.2 + "@smithy/types": 2.1.0 + tslib: 2.6.1 dev: false /@aws-sdk/middleware-sdk-sts@3.379.1: @@ -596,8 +552,8 @@ packages: dependencies: "@aws-sdk/middleware-signing": 3.379.1 "@aws-sdk/types": 3.378.0 - "@smithy/types": 2.0.2 - tslib: 2.6.0 + "@smithy/types": 2.1.0 + tslib: 2.6.1 dev: false /@aws-sdk/middleware-signing@3.379.1: @@ -608,12 +564,12 @@ packages: engines: { node: ">=14.0.0" } dependencies: "@aws-sdk/types": 3.378.0 - "@smithy/property-provider": 2.0.1 - "@smithy/protocol-http": 2.0.1 - "@smithy/signature-v4": 2.0.1 - "@smithy/types": 2.0.2 + "@smithy/property-provider": 2.0.2 + "@smithy/protocol-http": 2.0.2 + "@smithy/signature-v4": 2.0.2 + "@smithy/types": 2.1.0 "@smithy/util-middleware": 2.0.0 - tslib: 2.6.0 + tslib: 2.6.1 dev: false /@aws-sdk/middleware-ssec@3.378.0: @@ -624,22 +580,22 @@ packages: engines: { node: ">=14.0.0" } dependencies: "@aws-sdk/types": 3.378.0 - "@smithy/types": 2.0.2 - tslib: 2.6.0 + "@smithy/types": 2.1.0 + tslib: 2.6.1 dev: false - /@aws-sdk/middleware-user-agent@3.382.0: + /@aws-sdk/middleware-user-agent@3.386.0: resolution: { - integrity: sha512-LFRW1jmXOrOAd3911ktn6oaYmuurNnulbdRMOUdwz99GGdLVFipQhOi9idKswb8IOhPa4jEVQt25Kcv7ctvu0A==, + integrity: sha512-h6nVr5dvzrSLM+5BGbyqISh1p2NoTNv0+IZkMcGyig2jpdhbkMOPvvoOGMg16/cmelUQCguT26Jr7WYpLFDsTg==, } engines: { node: ">=14.0.0" } dependencies: "@aws-sdk/types": 3.378.0 - "@aws-sdk/util-endpoints": 3.382.0 - "@smithy/protocol-http": 2.0.1 - "@smithy/types": 2.0.2 - tslib: 2.6.0 + "@aws-sdk/util-endpoints": 3.386.0 + "@smithy/protocol-http": 2.0.2 + "@smithy/types": 2.1.0 + tslib: 2.6.1 dev: false /@aws-sdk/signature-v4-multi-region@3.378.0: @@ -655,27 +611,24 @@ packages: optional: true dependencies: "@aws-sdk/types": 3.378.0 - "@smithy/protocol-http": 2.0.1 - "@smithy/signature-v4": 2.0.1 - "@smithy/types": 2.0.2 - tslib: 2.6.0 + "@smithy/protocol-http": 2.0.2 + "@smithy/signature-v4": 2.0.2 + "@smithy/types": 2.1.0 + tslib: 2.6.1 dev: false - /@aws-sdk/token-providers@3.382.0: + /@aws-sdk/token-providers@3.386.0: resolution: { - integrity: sha512-axn4IyPpHdkXi8G06KCB3tPz79DipZFFH9N9YVDpLMnDYTdfX36HGdYzINaQc+z+XPbEpa1ZpoIzWScHRjFjdg==, + integrity: sha512-DStdqBtpO0FRC4mDCIPtrpLCFMnYJFo4cYlUyr9CKvKvh2IzPMU4rsKQjUhtmzdjLEvPTAcdfRx2Q9/sJkfe9Q==, } engines: { node: ">=14.0.0" } dependencies: - "@aws-sdk/client-sso-oidc": 3.382.0 "@aws-sdk/types": 3.378.0 - "@smithy/property-provider": 2.0.1 - "@smithy/shared-ini-file-loader": 2.0.1 - "@smithy/types": 2.0.2 - tslib: 2.6.0 - transitivePeerDependencies: - - aws-crt + "@smithy/property-provider": 2.0.2 + "@smithy/shared-ini-file-loader": 2.0.2 + "@smithy/types": 2.1.0 + tslib: 2.6.1 dev: false /@aws-sdk/types@3.378.0: @@ -685,8 +638,8 @@ packages: } engines: { node: ">=14.0.0" } dependencies: - "@smithy/types": 2.0.2 - tslib: 2.6.0 + "@smithy/types": 2.1.0 + tslib: 2.6.1 dev: false /@aws-sdk/util-arn-parser@3.310.0: @@ -696,18 +649,18 @@ packages: } engines: { node: ">=14.0.0" } dependencies: - tslib: 2.6.0 + tslib: 2.6.1 dev: false - /@aws-sdk/util-endpoints@3.382.0: + /@aws-sdk/util-endpoints@3.386.0: resolution: { - integrity: sha512-flajPyjmjNG67fXk7l4GoTB/7J11VBqtFZXuuAZKhKU07Ia3IQupsFqNf5lV8D44ZgjnKH0fTGnv3dUALjW7Wg==, + integrity: sha512-FDQRC9f78Kx12KsR43MukLRfqF3BNz5VfFdKP9ZYx3KK+bMjU1czjmjOS8bNMJWYM1Sn+nobBpPS3e2uupBtpg==, } engines: { node: ">=14.0.0" } dependencies: "@aws-sdk/types": 3.378.0 - tslib: 2.6.0 + tslib: 2.6.1 dev: false /@aws-sdk/util-locate-window@3.310.0: @@ -717,7 +670,7 @@ packages: } engines: { node: ">=14.0.0" } dependencies: - tslib: 2.6.0 + tslib: 2.6.1 dev: false /@aws-sdk/util-user-agent-browser@3.378.0: @@ -727,9 +680,9 @@ packages: } dependencies: "@aws-sdk/types": 3.378.0 - "@smithy/types": 2.0.2 + "@smithy/types": 2.1.0 bowser: 2.11.0 - tslib: 2.6.0 + tslib: 2.6.1 dev: false /@aws-sdk/util-user-agent-node@3.378.0: @@ -745,9 +698,9 @@ packages: optional: true dependencies: "@aws-sdk/types": 3.378.0 - "@smithy/node-config-provider": 2.0.1 - "@smithy/types": 2.0.2 - tslib: 2.6.0 + "@smithy/node-config-provider": 2.0.2 + "@smithy/types": 2.1.0 + tslib: 2.6.1 dev: false /@aws-sdk/util-utf8-browser@3.259.0: @@ -756,7 +709,7 @@ packages: integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==, } dependencies: - tslib: 2.6.0 + tslib: 2.6.1 dev: false /@aws-sdk/xml-builder@3.310.0: @@ -766,7 +719,7 @@ packages: } engines: { node: ">=14.0.0" } dependencies: - tslib: 2.6.0 + tslib: 2.6.1 dev: false /@cloudflare/kv-asset-handler@0.2.0: @@ -778,10 +731,10 @@ packages: mime: 3.0.0 dev: true - /@cloudflare/workerd-darwin-64@1.20230710.0: + /@cloudflare/workerd-darwin-64@1.20230724.0: resolution: { - integrity: sha512-TDEgTfzTkveW+U0qtg9/60PXbl2klnEso0oio501zAnY2SOC1x7M0qb8UkhvjHFUVpwdykUzTPWPIWFBcF1ibA==, + integrity: sha512-DQmFZWHhs8waQFYRb/Z8QmbitAvBMXnbUMUentp+3lS4eCYI0/iurTaQDiz5+ldUn9FTxD+1XuYZlTHzVNxoHw==, } engines: { node: ">=16" } cpu: [x64] @@ -790,10 +743,10 @@ packages: dev: true optional: true - /@cloudflare/workerd-darwin-arm64@1.20230710.0: + /@cloudflare/workerd-darwin-arm64@1.20230724.0: resolution: { - integrity: sha512-dxBwnKcj7TiM1JGiODg0LASa25A9P0XLeMkmF8YCECZoq+3QLH/uY4Vbm1xeEy8iXUZrt/uYN72bBE83vY4HIQ==, + integrity: sha512-C7T0v/lMjEX7c4iROSZKgIF1eGw3+sj/gFpBD6xwxfbIcrKBjncMypeLQNpRTCdBQr1W3sNpg9jagwuVX5ByZQ==, } engines: { node: ">=16" } cpu: [arm64] @@ -802,10 +755,10 @@ packages: dev: true optional: true - /@cloudflare/workerd-linux-64@1.20230710.0: + /@cloudflare/workerd-linux-64@1.20230724.0: resolution: { - integrity: sha512-WrKZwL76i51jQLFpSxklpRSm2s8T9Xf6tVzQaiLTtpguKZSF/CTAyjjEOVfS7FXk+Te8lyAJAFQnj5QHoJ3pzA==, + integrity: sha512-o0F/hj73UXOQwkPkYqZuIxpjG8gAs2eoAGqxX1HSIYRf7iUhfFcPrupwjqlNqf7Oo1h46M+sClSFjr/ZU/LCjg==, } engines: { node: ">=16" } cpu: [x64] @@ -814,10 +767,10 @@ packages: dev: true optional: true - /@cloudflare/workerd-linux-arm64@1.20230710.0: + /@cloudflare/workerd-linux-arm64@1.20230724.0: resolution: { - integrity: sha512-eWdbOoqFqQ4m1/Wwy2dRDaOVXjOmWGjwBliU8pvm2m9RjfRTdfik7z6E3vOkalxqJDHiJ0f8SUykKz2oM1lD0A==, + integrity: sha512-UpzCoo7LOuPWxFPw84TZQTPIawIDQNSb3XnC6ffMjUH/FVwHmHdngIFZxW+xjLHKMIzGNAqSn3eRHekKgO3QqA==, } engines: { node: ">=16" } cpu: [arm64] @@ -826,10 +779,10 @@ packages: dev: true optional: true - /@cloudflare/workerd-windows-64@1.20230710.0: + /@cloudflare/workerd-windows-64@1.20230724.0: resolution: { - integrity: sha512-P5ihH98Pb72HrsVsvb/HCSezvAvEtPeVQVBKgIclNE9e0fkA4zX9QMzBBFvLy3yr0YLf4r7MO2tNnt7JFnheGA==, + integrity: sha512-wVpPNu19fnvgsD8V6NiGPSuET0bzKmgn3wJ6RwAwQA+GQ0hdDIDVYd13aImhgO6jLfQvkduCDxeZluGZ7PPojQ==, } engines: { node: ">=16" } cpu: [x64] @@ -838,10 +791,10 @@ packages: dev: true optional: true - /@cloudflare/workers-types@4.20230710.1: + /@cloudflare/workers-types@4.20230807.0: resolution: { - integrity: sha512-VqEY/ZqyHKBn6ivdePSWebpqojwbCXVEuwLkMYHs0UoOAqcGylkVcabdZYdQJKeNxXcOUZ9UBId/x9UsPUm2XQ==, + integrity: sha512-gQczWuGE2rxmpzOCNn0zLbx8Xz0gqspdE9S7tu4Xax39q1csgO/E9flcS+KG3GHB522ugOh84inmABDhpeJnvQ==, } /@drizzle-team/studio@0.0.5: @@ -919,10 +872,10 @@ packages: dev: false optional: true - /@esbuild/android-arm64@0.18.17: + /@esbuild/android-arm64@0.18.20: resolution: { - integrity: sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg==, + integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==, } engines: { node: ">=12" } cpu: [arm64] @@ -955,10 +908,10 @@ packages: dev: false optional: true - /@esbuild/android-arm@0.18.17: + /@esbuild/android-arm@0.18.20: resolution: { - integrity: sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg==, + integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==, } engines: { node: ">=12" } cpu: [arm] @@ -991,10 +944,10 @@ packages: dev: false optional: true - /@esbuild/android-x64@0.18.17: + /@esbuild/android-x64@0.18.20: resolution: { - integrity: sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw==, + integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==, } engines: { node: ">=12" } cpu: [x64] @@ -1027,10 +980,10 @@ packages: dev: false optional: true - /@esbuild/darwin-arm64@0.18.17: + /@esbuild/darwin-arm64@0.18.20: resolution: { - integrity: sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g==, + integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==, } engines: { node: ">=12" } cpu: [arm64] @@ -1063,10 +1016,10 @@ packages: dev: false optional: true - /@esbuild/darwin-x64@0.18.17: + /@esbuild/darwin-x64@0.18.20: resolution: { - integrity: sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g==, + integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==, } engines: { node: ">=12" } cpu: [x64] @@ -1099,10 +1052,10 @@ packages: dev: false optional: true - /@esbuild/freebsd-arm64@0.18.17: + /@esbuild/freebsd-arm64@0.18.20: resolution: { - integrity: sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ==, + integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==, } engines: { node: ">=12" } cpu: [arm64] @@ -1135,10 +1088,10 @@ packages: dev: false optional: true - /@esbuild/freebsd-x64@0.18.17: + /@esbuild/freebsd-x64@0.18.20: resolution: { - integrity: sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA==, + integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==, } engines: { node: ">=12" } cpu: [x64] @@ -1171,10 +1124,10 @@ packages: dev: false optional: true - /@esbuild/linux-arm64@0.18.17: + /@esbuild/linux-arm64@0.18.20: resolution: { - integrity: sha512-c9w3tE7qA3CYWjT+M3BMbwMt+0JYOp3vCMKgVBrCl1nwjAlOMYzEo+gG7QaZ9AtqZFj5MbUc885wuBBmu6aADQ==, + integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==, } engines: { node: ">=12" } cpu: [arm64] @@ -1207,10 +1160,10 @@ packages: dev: false optional: true - /@esbuild/linux-arm@0.18.17: + /@esbuild/linux-arm@0.18.20: resolution: { - integrity: sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg==, + integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==, } engines: { node: ">=12" } cpu: [arm] @@ -1243,10 +1196,10 @@ packages: dev: false optional: true - /@esbuild/linux-ia32@0.18.17: + /@esbuild/linux-ia32@0.18.20: resolution: { - integrity: sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg==, + integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==, } engines: { node: ">=12" } cpu: [ia32] @@ -1279,10 +1232,10 @@ packages: dev: false optional: true - /@esbuild/linux-loong64@0.18.17: + /@esbuild/linux-loong64@0.18.20: resolution: { - integrity: sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg==, + integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==, } engines: { node: ">=12" } cpu: [loong64] @@ -1315,10 +1268,10 @@ packages: dev: false optional: true - /@esbuild/linux-mips64el@0.18.17: + /@esbuild/linux-mips64el@0.18.20: resolution: { - integrity: sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ==, + integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==, } engines: { node: ">=12" } cpu: [mips64el] @@ -1351,10 +1304,10 @@ packages: dev: false optional: true - /@esbuild/linux-ppc64@0.18.17: + /@esbuild/linux-ppc64@0.18.20: resolution: { - integrity: sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ==, + integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==, } engines: { node: ">=12" } cpu: [ppc64] @@ -1387,10 +1340,10 @@ packages: dev: false optional: true - /@esbuild/linux-riscv64@0.18.17: + /@esbuild/linux-riscv64@0.18.20: resolution: { - integrity: sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g==, + integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==, } engines: { node: ">=12" } cpu: [riscv64] @@ -1423,10 +1376,10 @@ packages: dev: false optional: true - /@esbuild/linux-s390x@0.18.17: + /@esbuild/linux-s390x@0.18.20: resolution: { - integrity: sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg==, + integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==, } engines: { node: ">=12" } cpu: [s390x] @@ -1459,10 +1412,10 @@ packages: dev: false optional: true - /@esbuild/linux-x64@0.18.17: + /@esbuild/linux-x64@0.18.20: resolution: { - integrity: sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ==, + integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==, } engines: { node: ">=12" } cpu: [x64] @@ -1495,10 +1448,10 @@ packages: dev: false optional: true - /@esbuild/netbsd-x64@0.18.17: + /@esbuild/netbsd-x64@0.18.20: resolution: { - integrity: sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ==, + integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==, } engines: { node: ">=12" } cpu: [x64] @@ -1531,10 +1484,10 @@ packages: dev: false optional: true - /@esbuild/openbsd-x64@0.18.17: + /@esbuild/openbsd-x64@0.18.20: resolution: { - integrity: sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA==, + integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==, } engines: { node: ">=12" } cpu: [x64] @@ -1567,10 +1520,10 @@ packages: dev: false optional: true - /@esbuild/sunos-x64@0.18.17: + /@esbuild/sunos-x64@0.18.20: resolution: { - integrity: sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g==, + integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==, } engines: { node: ">=12" } cpu: [x64] @@ -1603,10 +1556,10 @@ packages: dev: false optional: true - /@esbuild/win32-arm64@0.18.17: + /@esbuild/win32-arm64@0.18.20: resolution: { - integrity: sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw==, + integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==, } engines: { node: ">=12" } cpu: [arm64] @@ -1639,10 +1592,10 @@ packages: dev: false optional: true - /@esbuild/win32-ia32@0.18.17: + /@esbuild/win32-ia32@0.18.20: resolution: { - integrity: sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg==, + integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==, } engines: { node: ">=12" } cpu: [ia32] @@ -1675,10 +1628,10 @@ packages: dev: false optional: true - /@esbuild/win32-x64@0.18.17: + /@esbuild/win32-x64@0.18.20: resolution: { - integrity: sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==, + integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==, } engines: { node: ">=12" } cpu: [x64] @@ -1687,7 +1640,7 @@ packages: dev: false optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.45.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.46.0): resolution: { integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, @@ -1696,20 +1649,20 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.45.0 - eslint-visitor-keys: 3.4.1 + eslint: 8.46.0 + eslint-visitor-keys: 3.4.2 - /@eslint-community/regexpp@4.5.1: + /@eslint-community/regexpp@4.6.2: resolution: { - integrity: sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==, + integrity: sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==, } engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } - /@eslint/eslintrc@2.1.0: + /@eslint/eslintrc@2.1.1: resolution: { - integrity: sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==, + integrity: sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dependencies: @@ -1725,10 +1678,10 @@ packages: transitivePeerDependencies: - supports-color - /@eslint/js@8.44.0: + /@eslint/js@8.46.0: resolution: { - integrity: sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==, + integrity: sha512-a8TLtmPi8xzPkCbp/OGFUo5yhRkHM2Ko9kOWP4znJr0WAhWyThaw3PnwX4vOTWOAMsV2uRt32PPDcEz63esSaA==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } @@ -1758,7 +1711,7 @@ packages: integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==, } - /@lucia-auth/adapter-mysql@2.0.0(@planetscale/database@1.8.0)(lucia@2.0.0)(mysql2@3.6.0): + /@lucia-auth/adapter-mysql@2.0.0(@planetscale/database@1.10.0)(lucia@2.2.0)(mysql2@3.6.0): resolution: { integrity: sha512-8a4JZ3VjDyRu/mAop2hEt/jOJO2HXwWIAid6a4wGiR8wgnlyOws9brRc+/wxQHSOlWUlrWemrfDvXLs5mMtkeQ==, @@ -1773,22 +1726,22 @@ packages: mysql2: optional: true dependencies: - "@planetscale/database": 1.8.0 - lucia: 2.0.0 + "@planetscale/database": 1.10.0 + lucia: 2.2.0 mysql2: 3.6.0 dev: false - /@lucia-auth/adapter-prisma@3.0.0(@prisma/client@5.0.0)(lucia@2.0.0): + /@lucia-auth/adapter-prisma@3.0.1(@prisma/client@5.1.1)(lucia@2.2.0): resolution: { - integrity: sha512-qrFA5IID4AulINQbLQLQPIXqE9+M3zjmN558VDhrS3Y7Fdn5dyObPbHijUWw7lGYgOrhxDox9UUG8oyZ3+D1MA==, + integrity: sha512-JZNl+721M5ApjtNiH+WUYstiC8cffcI/Y9IzKsa0uUhQMIHl2ObCrgO0R3fgHnjWHBjhQoK36g/r/iSJIDppBA==, } peerDependencies: "@prisma/client": ^4.2.0 || ^5.0.0 lucia: ^2.0.0 dependencies: - "@prisma/client": 5.0.0 - lucia: 2.0.0 + "@prisma/client": 5.1.1 + lucia: 2.2.0 dev: false /@nodelib/fs.scandir@2.1.5: @@ -1825,18 +1778,18 @@ packages: } dev: false - /@planetscale/database@1.8.0: + /@planetscale/database@1.10.0: resolution: { - integrity: sha512-+zk04eXRiaJGaRnJZkCxXbBtBvQDQJXCoxqlXhLY3HzAovXfsBnh6DjXRujPRQQ7GKtT8/tOlyvZ9h6ReM+GLQ==, + integrity: sha512-XMfNRjIPgGTga6g1YpGr7E21CcnHZcHZdyhRUIiZ/AlpD+ts65UF2B3wKjcu7MKMynmmcOGs6R9kAT6D1OTlZQ==, } engines: { node: ">=16" } dev: false - /@prisma/client@5.0.0: + /@prisma/client@5.1.1: resolution: { - integrity: sha512-XlO5ELNAQ7rV4cXIDJUNBEgdLwX3pjtt9Q/RHqDpGf43szpNJx2hJnggfFs7TKNx0cOFsl6KJCSfqr5duEU/bQ==, + integrity: sha512-fxcCeK5pMQGcgCqCrWsi+I2rpIbk0rAhdrN+ke7f34tIrgPwA68ensrpin+9+fZvuV2OtzHmuipwduSY6HswdA==, } engines: { node: ">=16.13" } requiresBuild: true @@ -1846,13 +1799,13 @@ packages: prisma: optional: true dependencies: - "@prisma/engines-version": 4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584 + "@prisma/engines-version": 5.1.1-1.6a3747c37ff169c90047725a05a6ef02e32ac97e dev: false - /@prisma/engines-version@4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584: + /@prisma/engines-version@5.1.1-1.6a3747c37ff169c90047725a05a6ef02e32ac97e: resolution: { - integrity: sha512-HHiUF6NixsldsP3JROq07TYBLEjXFKr6PdH8H4gK/XAoTmIplOJBCgrIUMrsRAnEuGyRoRLXKXWUb943+PFoKQ==, + integrity: sha512-owZqbY/wucbr65bXJ/ljrHPgQU5xXTSkmcE/JcbqE1kusuAXV/TLN3/exmz21SZ5rJ7WDkyk70J2G/n68iogbQ==, } dev: false @@ -1879,15 +1832,15 @@ packages: selderee: 0.10.0 dev: false - /@smithy/abort-controller@2.0.1: + /@smithy/abort-controller@2.0.2: resolution: { - integrity: sha512-0s7XjIbsTwZyUW9OwXQ8J6x1UiA1TNCh60Vaw56nHahL7kUZsLhmTlWiaxfLkFtO2Utkj8YewcpHTYpxaTzO+w==, + integrity: sha512-ln5Cob0mksym62sLr7NiPOSqJ0jKao4qjfcNLDdgINM1lQI12hXrZBlKdPHbXJqpKhKiECDgonMoqCM8bigq4g==, } engines: { node: ">=14.0.0" } dependencies: - "@smithy/types": 2.0.2 - tslib: 2.6.0 + "@smithy/types": 2.1.0 + tslib: 2.6.1 dev: false /@smithy/chunked-blob-reader-native@2.0.0: @@ -1897,7 +1850,7 @@ packages: } dependencies: "@smithy/util-base64": 2.0.0 - tslib: 2.6.0 + tslib: 2.6.1 dev: false /@smithy/chunked-blob-reader@2.0.0: @@ -1906,153 +1859,153 @@ packages: integrity: sha512-k+J4GHJsMSAIQPChGBrjEmGS+WbPonCXesoqP9fynIqjn7rdOThdH8FAeCmokP9mxTYKQAKoHCLPzNlm6gh7Wg==, } dependencies: - tslib: 2.6.0 + tslib: 2.6.1 dev: false - /@smithy/config-resolver@2.0.1: + /@smithy/config-resolver@2.0.2: resolution: { - integrity: sha512-l83Pm7hV+8CBQOCmBRopWDtF+CURUJol7NsuPYvimiDhkC2F8Ba9T1imSFE+pD1UIJ9jlsDPAnZfPJT5cjnuEw==, + integrity: sha512-0kdsqBL6BdmSbdU6YaDkodVBMua5MuQQluC3nocJ7OJ6PnOuM7i2FEQHE46LBadLqT+CimlDSM+6j91uHNL1ng==, } engines: { node: ">=14.0.0" } dependencies: - "@smithy/types": 2.0.2 + "@smithy/types": 2.1.0 "@smithy/util-config-provider": 2.0.0 "@smithy/util-middleware": 2.0.0 - tslib: 2.6.0 + tslib: 2.6.1 dev: false - /@smithy/credential-provider-imds@2.0.1: + /@smithy/credential-provider-imds@2.0.2: resolution: { - integrity: sha512-8VxriuRINNEfVZjEFKBY75y9ZWAx73DZ5K/u+3LmB6r8WR2h3NaFxFKMlwlq0uzNdGhD1ouKBn9XWEGYHKiPLw==, + integrity: sha512-mbWFYEZ00LBRDk3WvcXViwpdpkJQcfrM3seuKzFxZnF6wIBLMwrcWcsj+OUC/1L+86m8aQY9imXMAaQsAoGxow==, } engines: { node: ">=14.0.0" } dependencies: - "@smithy/node-config-provider": 2.0.1 - "@smithy/property-provider": 2.0.1 - "@smithy/types": 2.0.2 - "@smithy/url-parser": 2.0.1 - tslib: 2.6.0 + "@smithy/node-config-provider": 2.0.2 + "@smithy/property-provider": 2.0.2 + "@smithy/types": 2.1.0 + "@smithy/url-parser": 2.0.2 + tslib: 2.6.1 dev: false - /@smithy/eventstream-codec@2.0.1: + /@smithy/eventstream-codec@2.0.2: resolution: { - integrity: sha512-/IiNB7gQM2y2ZC/GAWOWDa8+iXfhr1g9Xe5979cQEOdCWDISvrAiv18cn3OtIQUhbYOR3gm7QtCpkq1to2takQ==, + integrity: sha512-PQZiKx7fMnNwx4zxcUCm82VjnqK6wV4MEHSmMy3taj5dKfXV782IjRGyaDT+8TsmNqVdZIkve5zLRAzh+7kOhA==, } dependencies: "@aws-crypto/crc32": 3.0.0 - "@smithy/types": 2.0.2 + "@smithy/types": 2.1.0 "@smithy/util-hex-encoding": 2.0.0 - tslib: 2.6.0 + tslib: 2.6.1 dev: false - /@smithy/eventstream-serde-browser@2.0.1: + /@smithy/eventstream-serde-browser@2.0.2: resolution: { - integrity: sha512-9E1/6ZGF7nB/Td3G1kcatU7VjjP8eZ/p/Q+0KsZc1AUPyv4lR15pmWnWj3iGBEGYI9qZBJ/7a/wPEPayabmA3Q==, + integrity: sha512-qaHlcFI+ILE+gZV2B/aZMVXc9LG4v1Owa20dHlP0dLOiJ9WByOjtD2qZmYA/HO4qkkDZHEL/0baWc63aqLCHKQ==, } engines: { node: ">=14.0.0" } dependencies: - "@smithy/eventstream-serde-universal": 2.0.1 - "@smithy/types": 2.0.2 - tslib: 2.6.0 + "@smithy/eventstream-serde-universal": 2.0.2 + "@smithy/types": 2.1.0 + tslib: 2.6.1 dev: false - /@smithy/eventstream-serde-config-resolver@2.0.1: + /@smithy/eventstream-serde-config-resolver@2.0.2: resolution: { - integrity: sha512-J8a+8HH8oDPIgq8Px/nPLfu9vpIjQ7XUPtP3orbs8KUh0GznNthSTy1xZP5RXjRqGQEkxPvsHf1po2+QOsgNFw==, + integrity: sha512-iVC7/NFNWfSXllAxFNUuC4QlREdZjMmAOdISb6fwny/4mUDt1EtYLCrXq7gN1mIzhRPwMpL9YvQ8jpgvfA0Jdw==, } engines: { node: ">=14.0.0" } dependencies: - "@smithy/types": 2.0.2 - tslib: 2.6.0 + "@smithy/types": 2.1.0 + tslib: 2.6.1 dev: false - /@smithy/eventstream-serde-node@2.0.1: + /@smithy/eventstream-serde-node@2.0.2: resolution: { - integrity: sha512-wklowUz0zXJuqC7FMpriz66J8OAko3z6INTg+iMJWYB1bWv4pc5V7q36PxlZ0RKRbj0u+EThlozWgzE7Stz2Sw==, + integrity: sha512-p7py8jDpIS1bRewskwgEgJx1OkFvockA2bJnXtOAPJib42DtyRpp8oV14s2ZpjMq57r9KMCQy2j02g554DNavg==, } engines: { node: ">=14.0.0" } dependencies: - "@smithy/eventstream-serde-universal": 2.0.1 - "@smithy/types": 2.0.2 - tslib: 2.6.0 + "@smithy/eventstream-serde-universal": 2.0.2 + "@smithy/types": 2.1.0 + tslib: 2.6.1 dev: false - /@smithy/eventstream-serde-universal@2.0.1: + /@smithy/eventstream-serde-universal@2.0.2: resolution: { - integrity: sha512-WPPylIgVZ6wOYVgpF0Rs1LlocYyj248MRtKEEehnDvC+0tV7wmGt7H/SchCh10W4y4YUxuzPlW+mUvVMGmLSVg==, + integrity: sha512-zf/hm5VIDsvl+XpI1rop4xwXLKiBUe5pxgjRFdHi7AC1p6Zc8uJfyCExLiMUP/QspoIrVV1xGwFFxRCeddDH3g==, } engines: { node: ">=14.0.0" } dependencies: - "@smithy/eventstream-codec": 2.0.1 - "@smithy/types": 2.0.2 - tslib: 2.6.0 + "@smithy/eventstream-codec": 2.0.2 + "@smithy/types": 2.1.0 + tslib: 2.6.1 dev: false - /@smithy/fetch-http-handler@2.0.1: + /@smithy/fetch-http-handler@2.0.2: resolution: { - integrity: sha512-/SoU/ClazgcdOxgE4zA7RX8euiELwpsrKCSvulVQvu9zpmqJRyEJn8ZTWYFV17/eHOBdHTs9kqodhNhsNT+cUw==, + integrity: sha512-Wo2m1RaiXNSLF4J3D62LpdSoj/YYb+6tn0H8is1tSrzr7eXAdiYVBc0wIa23N0wT4zmN0iG/yNY6gTCDQ6799A==, } dependencies: - "@smithy/protocol-http": 2.0.1 - "@smithy/querystring-builder": 2.0.1 - "@smithy/types": 2.0.2 + "@smithy/protocol-http": 2.0.2 + "@smithy/querystring-builder": 2.0.2 + "@smithy/types": 2.1.0 "@smithy/util-base64": 2.0.0 - tslib: 2.6.0 + tslib: 2.6.1 dev: false - /@smithy/hash-blob-browser@2.0.1: + /@smithy/hash-blob-browser@2.0.2: resolution: { - integrity: sha512-i/o2+sHb4jDRz5nf2ilTTbC0nVmm4LO//FbODCAB7pbzMdywxbZ6z+q56FmEa8R+aFbtApxQ1SJ3umEiNz6IPg==, + integrity: sha512-CmVGWbiyiEySGDRg3o2C3DLZYW+mH8fMoIEZrmwnBM8bQsepZGOME40tbpvv12BIhZIInJV8srMMHpQ6aKObLA==, } dependencies: "@smithy/chunked-blob-reader": 2.0.0 "@smithy/chunked-blob-reader-native": 2.0.0 - "@smithy/types": 2.0.2 - tslib: 2.6.0 + "@smithy/types": 2.1.0 + tslib: 2.6.1 dev: false - /@smithy/hash-node@2.0.1: + /@smithy/hash-node@2.0.2: resolution: { - integrity: sha512-oTKYimQdF4psX54ZonpcIE+MXjMUWFxLCNosjPkJPFQ9whRX0K/PFX/+JZGRQh3zO9RlEOEUIbhy9NO+Wha6hw==, + integrity: sha512-JKDzZ1YVR7JzOBaJoWy3ToJCE86OQE6D4kOBvvVsu93a3lcF9kv6KYTKBYEWAjwOn/CpK4NH7mKB01OQ8H+aiA==, } engines: { node: ">=14.0.0" } dependencies: - "@smithy/types": 2.0.2 + "@smithy/types": 2.1.0 "@smithy/util-buffer-from": 2.0.0 "@smithy/util-utf8": 2.0.0 - tslib: 2.6.0 + tslib: 2.6.1 dev: false - /@smithy/hash-stream-node@2.0.1: + /@smithy/hash-stream-node@2.0.2: resolution: { - integrity: sha512-AequnQdPRuXf4AuvvFlSjnkWI460xxhAd6y362gFtOE4jjJLLXblbMAXVFrkV8/pDMGNjpVegVSpRmHXZsbKhg==, + integrity: sha512-cDfGE81BbykXKZ50+eLU5Yat8WGiDFQpNa+5S3AfDIzz5h4D73DpxWwcwV4qYB7GoAw2chFqTCAGWgU/MgRS9g==, } engines: { node: ">=14.0.0" } dependencies: - "@smithy/types": 2.0.2 + "@smithy/types": 2.1.0 "@smithy/util-utf8": 2.0.0 - tslib: 2.6.0 + tslib: 2.6.1 dev: false - /@smithy/invalid-dependency@2.0.1: + /@smithy/invalid-dependency@2.0.2: resolution: { - integrity: sha512-2q/Eb0AE662zwyMV+z+TL7deBwcHCgaZZGc0RItamBE8kak3MzCi/EZCNoFWoBfxgQ4jfR12wm8KKsSXhJzJtQ==, + integrity: sha512-inQZQ5gCO3WRWuXpsc1YJ4KBjsvj2qsoU32yTIKznBWTCQe/D5Dp+sSaysqBqxe0VTZ+8nFEHdUMWUX2BxQThw==, } dependencies: - "@smithy/types": 2.0.2 - tslib: 2.6.0 + "@smithy/types": 2.1.0 + tslib: 2.6.1 dev: false /@smithy/is-array-buffer@2.0.0: @@ -2062,71 +2015,71 @@ packages: } engines: { node: ">=14.0.0" } dependencies: - tslib: 2.6.0 + tslib: 2.6.1 dev: false - /@smithy/md5-js@2.0.1: + /@smithy/md5-js@2.0.2: resolution: { - integrity: sha512-8WWOtwWMmIDgTkRv1o3opy3ABsRXs4/XunETK53ckxQRAiOML1PlnqLBK9Uwk9bvOD6cpmsC6dioIfmKGpJ25w==, + integrity: sha512-qm9845tzkYOm3HM/nFiZVMsA9nE7klO69T1qrrbrQKpUJpEFV87XDInbnRpYzBAFUH4DRodbZ9spEnjF7ffoww==, } dependencies: - "@smithy/types": 2.0.2 + "@smithy/types": 2.1.0 "@smithy/util-utf8": 2.0.0 - tslib: 2.6.0 + tslib: 2.6.1 dev: false - /@smithy/middleware-content-length@2.0.1: + /@smithy/middleware-content-length@2.0.2: resolution: { - integrity: sha512-IZhRSk5GkVBcrKaqPXddBS2uKhaqwBgaSgbBb1OJyGsKe7SxRFbclWS0LqOR9fKUkDl+3lL8E2ffpo6EQg0igw==, + integrity: sha512-FmHlNfuvYgDZE3fIx0G3rD/wLXfAmBYE4mVc/w6d7RllA7TygPzq2pfHL1iCMzWkWTdoAVnt3h4aavAZnhaxEQ==, } engines: { node: ">=14.0.0" } dependencies: - "@smithy/protocol-http": 2.0.1 - "@smithy/types": 2.0.2 - tslib: 2.6.0 + "@smithy/protocol-http": 2.0.2 + "@smithy/types": 2.1.0 + tslib: 2.6.1 dev: false - /@smithy/middleware-endpoint@2.0.1: + /@smithy/middleware-endpoint@2.0.2: resolution: { - integrity: sha512-uz/KI1MBd9WHrrkVFZO4L4Wyv24raf0oR4EsOYEeG5jPJO5U+C7MZGLcMxX8gWERDn1sycBDqmGv8fjUMLxT6w==, + integrity: sha512-ropE7/c+g22QeluZ+By/B/WvVep0UFreX+IeRMGIO7EbOUPgqtJRXpbJFdG6JKB1uC+CdaJLn4MnZnVBpcyjuA==, } engines: { node: ">=14.0.0" } dependencies: - "@smithy/middleware-serde": 2.0.1 - "@smithy/types": 2.0.2 - "@smithy/url-parser": 2.0.1 + "@smithy/middleware-serde": 2.0.2 + "@smithy/types": 2.1.0 + "@smithy/url-parser": 2.0.2 "@smithy/util-middleware": 2.0.0 - tslib: 2.6.0 + tslib: 2.6.1 dev: false - /@smithy/middleware-retry@2.0.1: + /@smithy/middleware-retry@2.0.2: resolution: { - integrity: sha512-NKHF4i0gjSyjO6C0ZyjEpNqzGgIu7s8HOK6oT/1Jqws2Q1GynR1xV8XTUs1gKXeaNRzbzKQRewHHmfPwZjOtHA==, + integrity: sha512-wtBUXqtZVriiXppYaFkUrybAPhFVX7vebnW/yVPliLMWMcguOMS58qhOYPZe3t9Wki2+mASfyu+kO3An8lAg2A==, } engines: { node: ">=14.0.0" } dependencies: - "@smithy/protocol-http": 2.0.1 + "@smithy/protocol-http": 2.0.2 "@smithy/service-error-classification": 2.0.0 - "@smithy/types": 2.0.2 + "@smithy/types": 2.1.0 "@smithy/util-middleware": 2.0.0 "@smithy/util-retry": 2.0.0 - tslib: 2.6.0 + tslib: 2.6.1 uuid: 8.3.2 dev: false - /@smithy/middleware-serde@2.0.1: + /@smithy/middleware-serde@2.0.2: resolution: { - integrity: sha512-uKxPaC6ItH9ZXdpdqNtf8sda7GcU4SPMp0tomq/5lUg9oiMa/Q7+kD35MUrpKaX3IVXVrwEtkjCU9dogZ/RAUA==, + integrity: sha512-Kw9xLdlueIaivUWslKB67WZ/cCUg3QnzYVIA3t5KfgsseEEuU4UxXw8NSTvIt71gqQloY+Um8ugS+idgxrWWnw==, } engines: { node: ">=14.0.0" } dependencies: - "@smithy/types": 2.0.2 - tslib: 2.6.0 + "@smithy/types": 2.1.0 + tslib: 2.6.1 dev: false /@smithy/middleware-stack@2.0.0: @@ -2136,79 +2089,79 @@ packages: } engines: { node: ">=14.0.0" } dependencies: - tslib: 2.6.0 + tslib: 2.6.1 dev: false - /@smithy/node-config-provider@2.0.1: + /@smithy/node-config-provider@2.0.2: resolution: { - integrity: sha512-Zoel4CPkKRTQ2XxmozZUfqBYqjPKL53/SvTDhJHj+VBSiJy6MXRav1iDCyFPS92t40Uh+Yi+Km5Ch3hQ+c/zSA==, + integrity: sha512-9wVJccASfuCctNWrzR0zrDkf0ox3HCHGEhFlWL2LBoghUYuK28pVRBbG69wvnkhlHnB8dDZHagxH+Nq9dm7eWw==, } engines: { node: ">=14.0.0" } dependencies: - "@smithy/property-provider": 2.0.1 - "@smithy/shared-ini-file-loader": 2.0.1 - "@smithy/types": 2.0.2 - tslib: 2.6.0 + "@smithy/property-provider": 2.0.2 + "@smithy/shared-ini-file-loader": 2.0.2 + "@smithy/types": 2.1.0 + tslib: 2.6.1 dev: false - /@smithy/node-http-handler@2.0.1: + /@smithy/node-http-handler@2.0.2: resolution: { - integrity: sha512-Zv3fxk3p9tsmPT2CKMsbuwbbxnq2gzLDIulxv+yI6aE+02WPYorObbbe9gh7SW3weadMODL1vTfOoJ9yFypDzg==, + integrity: sha512-lpZjmtmyZqSAtMPsbrLhb7XoAQ2kAHeuLY/csW6I2k+QyFvOk7cZeQsqEngWmZ9SJaeYiDCBINxAIM61i5WGLw==, } engines: { node: ">=14.0.0" } dependencies: - "@smithy/abort-controller": 2.0.1 - "@smithy/protocol-http": 2.0.1 - "@smithy/querystring-builder": 2.0.1 - "@smithy/types": 2.0.2 - tslib: 2.6.0 + "@smithy/abort-controller": 2.0.2 + "@smithy/protocol-http": 2.0.2 + "@smithy/querystring-builder": 2.0.2 + "@smithy/types": 2.1.0 + tslib: 2.6.1 dev: false - /@smithy/property-provider@2.0.1: + /@smithy/property-provider@2.0.2: resolution: { - integrity: sha512-pmJRyY9SF6sutWIktIhe+bUdSQDxv/qZ4mYr3/u+u45riTPN7nmRxPo+e4sjWVoM0caKFjRSlj3tf5teRFy0Vg==, + integrity: sha512-DfaZ8cO+d/mgnMzIllcXcU4OYP+omiOl2LYdn/fTGpw/EAQSVzscYV2muV3sDDnuPYQ/r014hUqIxnF+pzh+SQ==, } engines: { node: ">=14.0.0" } dependencies: - "@smithy/types": 2.0.2 - tslib: 2.6.0 + "@smithy/types": 2.1.0 + tslib: 2.6.1 dev: false - /@smithy/protocol-http@2.0.1: + /@smithy/protocol-http@2.0.2: resolution: { - integrity: sha512-mrkMAp0wtaDEIkgRObWYxI1Kun1tm6Iu6rK+X4utb6Ah7Uc3Kk4VIWwK/rBHdYGReiLIrxFCB1rq4a2gyZnSgg==, + integrity: sha512-qWu8g1FUy+m36KpO1sREJSF7BaLmjw9AqOuwxLVVSdYz+nUQjc9tFAZ9LB6jJXKdsZFSjfkjHJBbhD78QdE7Rw==, } engines: { node: ">=14.0.0" } dependencies: - "@smithy/types": 2.0.2 - tslib: 2.6.0 + "@smithy/types": 2.1.0 + tslib: 2.6.1 dev: false - /@smithy/querystring-builder@2.0.1: + /@smithy/querystring-builder@2.0.2: resolution: { - integrity: sha512-bp+93WFzx1FojVEIeFPtG0A1pKsFdCUcZvVdZdRlmNooOUrz9Mm9bneRd8hDwAQ37pxiZkCOxopSXXRQN10mYw==, + integrity: sha512-H99LOMWEssfwqkOoTs4Y12UiZ7CTGQSX5Nrx5UkYgRbUEpC1GnnaprHiYrqclC58/xr4K76aNchdPyioxewMzA==, } engines: { node: ">=14.0.0" } dependencies: - "@smithy/types": 2.0.2 + "@smithy/types": 2.1.0 "@smithy/util-uri-escape": 2.0.0 - tslib: 2.6.0 + tslib: 2.6.1 dev: false - /@smithy/querystring-parser@2.0.1: + /@smithy/querystring-parser@2.0.2: resolution: { - integrity: sha512-h+e7k1z+IvI2sSbUBG9Aq46JsgLl4UqIUl6aigAlRBj+P6ocNXpM6Yn1vMBw5ijtXeZbYpd1YvCxwDgdw3jhmg==, + integrity: sha512-L4VtKQ8O4/aWPQJbiFymbhAmxdfLnEaROh/Vs0OstJ7jtOZeBl2QJmuWY2V7hjt64W7V+tEn2sv6vVvnxkm/xQ==, } engines: { node: ">=14.0.0" } dependencies: - "@smithy/types": 2.0.2 - tslib: 2.6.0 + "@smithy/types": 2.1.0 + tslib: 2.6.1 dev: false /@smithy/service-error-classification@2.0.0: @@ -2219,66 +2172,66 @@ packages: engines: { node: ">=14.0.0" } dev: false - /@smithy/shared-ini-file-loader@2.0.1: + /@smithy/shared-ini-file-loader@2.0.2: resolution: { - integrity: sha512-a463YiZrPGvM+F336rIF8pLfQsHAdCRAn/BiI/EWzg5xLoxbC7GSxIgliDDXrOu0z8gT3nhVsif85eU6jyct3A==, + integrity: sha512-2VkNOM/82u4vatVdK5nfusgGIlvR48Fkq6me17Oc+V1iyxfR/1x0pG6LzW0br1qlGtzBYFZKmDyviBRcPVFTVw==, } engines: { node: ">=14.0.0" } dependencies: - "@smithy/types": 2.0.2 - tslib: 2.6.0 + "@smithy/types": 2.1.0 + tslib: 2.6.1 dev: false - /@smithy/signature-v4@2.0.1: + /@smithy/signature-v4@2.0.2: resolution: { - integrity: sha512-jztv5Mirca42ilxmMDjzLdXcoAmRhZskGafGL49sRo5u7swEZcToEFrq6vtX5YMbSyTVrE9Teog5EFexY5Ff2Q==, + integrity: sha512-YMooDEw/UmGxcXY4qWnSXkbPFsRloluSvyXVT678YPDN/K2AS1GzKfRsvSU7fbccOB4WF8MHZf2UqcRGEltE3Q==, } engines: { node: ">=14.0.0" } dependencies: - "@smithy/eventstream-codec": 2.0.1 + "@smithy/eventstream-codec": 2.0.2 "@smithy/is-array-buffer": 2.0.0 - "@smithy/types": 2.0.2 + "@smithy/types": 2.1.0 "@smithy/util-hex-encoding": 2.0.0 "@smithy/util-middleware": 2.0.0 "@smithy/util-uri-escape": 2.0.0 "@smithy/util-utf8": 2.0.0 - tslib: 2.6.0 + tslib: 2.6.1 dev: false - /@smithy/smithy-client@2.0.1: + /@smithy/smithy-client@2.0.2: resolution: { - integrity: sha512-LHC5m6tYpEu1iNbONfvMbwtErboyTZJfEIPoD78Ei5MVr36vZQCaCla5mvo36+q/a2NAk2//fA5Rx3I1Kf7+lQ==, + integrity: sha512-mDfokI8WwLU5C0gcQ4ww/zJI/WLGSh2+vdIA42JRnjfYUjJNH/rKfX9YOnn2eBOxl3loATERVUqkHmKe+P8s2Q==, } engines: { node: ">=14.0.0" } dependencies: "@smithy/middleware-stack": 2.0.0 - "@smithy/types": 2.0.2 - "@smithy/util-stream": 2.0.1 - tslib: 2.6.0 + "@smithy/types": 2.1.0 + "@smithy/util-stream": 2.0.2 + tslib: 2.6.1 dev: false - /@smithy/types@2.0.2: + /@smithy/types@2.1.0: resolution: { - integrity: sha512-wcymEjIXQ9+NEfE5Yt5TInAqe1o4n+Nh+rh00AwoazppmUt8tdo6URhc5gkDcOYrcvlDVAZE7uG69nDpEGUKxw==, + integrity: sha512-KLsCsqxX0j2l99iP8s0f7LBlcsp7a7ceXGn0LPYPyVOsqmIKvSaPQajq0YevlL4T9Bm+DtcyXfBTbtBcLX1I7A==, } engines: { node: ">=14.0.0" } dependencies: - tslib: 2.6.0 + tslib: 2.6.1 dev: false - /@smithy/url-parser@2.0.1: + /@smithy/url-parser@2.0.2: resolution: { - integrity: sha512-NpHVOAwddo+OyyIoujDL9zGL96piHWrTNXqltWmBvlUoWgt1HPyBuKs6oHjioyFnNZXUqveTOkEEq0U5w6Uv8A==, + integrity: sha512-X1mHCzrSVDlhVy7d3S7Vq+dTfYzwh4n7xGHhyJumu77nJqIss0lazVug85Pwo0DKIoO314wAOvMnBxNYDa+7wA==, } dependencies: - "@smithy/querystring-parser": 2.0.1 - "@smithy/types": 2.0.2 - tslib: 2.6.0 + "@smithy/querystring-parser": 2.0.2 + "@smithy/types": 2.1.0 + tslib: 2.6.1 dev: false /@smithy/util-base64@2.0.0: @@ -2289,7 +2242,7 @@ packages: engines: { node: ">=14.0.0" } dependencies: "@smithy/util-buffer-from": 2.0.0 - tslib: 2.6.0 + tslib: 2.6.1 dev: false /@smithy/util-body-length-browser@2.0.0: @@ -2298,7 +2251,7 @@ packages: integrity: sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==, } dependencies: - tslib: 2.6.0 + tslib: 2.6.1 dev: false /@smithy/util-body-length-node@2.0.0: @@ -2308,7 +2261,7 @@ packages: } engines: { node: ">=14.0.0" } dependencies: - tslib: 2.6.0 + tslib: 2.6.1 dev: false /@smithy/util-buffer-from@2.0.0: @@ -2319,7 +2272,7 @@ packages: engines: { node: ">=14.0.0" } dependencies: "@smithy/is-array-buffer": 2.0.0 - tslib: 2.6.0 + tslib: 2.6.1 dev: false /@smithy/util-config-provider@2.0.0: @@ -2329,35 +2282,35 @@ packages: } engines: { node: ">=14.0.0" } dependencies: - tslib: 2.6.0 + tslib: 2.6.1 dev: false - /@smithy/util-defaults-mode-browser@2.0.1: + /@smithy/util-defaults-mode-browser@2.0.2: resolution: { - integrity: sha512-w72Qwsb+IaEYEFtYICn0Do42eFju78hTaBzzJfT107lFOPdbjWjKnFutV+6GL/nZd5HWXY7ccAKka++C3NrjHw==, + integrity: sha512-c2tMMjb624XLuzmlRoZpnFOkejVxcgw3WQKdmgdGZYZapcLzXyC0H9JhnXMjQCt30GqLTlsILRNVBYwFRbw/4Q==, } engines: { node: ">= 10.0.0" } dependencies: - "@smithy/property-provider": 2.0.1 - "@smithy/types": 2.0.2 + "@smithy/property-provider": 2.0.2 + "@smithy/types": 2.1.0 bowser: 2.11.0 - tslib: 2.6.0 + tslib: 2.6.1 dev: false - /@smithy/util-defaults-mode-node@2.0.1: + /@smithy/util-defaults-mode-node@2.0.2: resolution: { - integrity: sha512-dNF45caelEBambo0SgkzQ0v76m4YM+aFKZNTtSafy7P5dVF8TbjZuR2UX1A5gJABD9XK6lzN+v/9Yfzj/EDgGg==, + integrity: sha512-gt7m5LLqUtEKldJLyc14DE4kb85vxwomvt9AfEMEvWM4VwfWS1kGJqiStZFb5KNqnQPXw8vvpgLTi8NrWAOXqg==, } engines: { node: ">= 10.0.0" } dependencies: - "@smithy/config-resolver": 2.0.1 - "@smithy/credential-provider-imds": 2.0.1 - "@smithy/node-config-provider": 2.0.1 - "@smithy/property-provider": 2.0.1 - "@smithy/types": 2.0.2 - tslib: 2.6.0 + "@smithy/config-resolver": 2.0.2 + "@smithy/credential-provider-imds": 2.0.2 + "@smithy/node-config-provider": 2.0.2 + "@smithy/property-provider": 2.0.2 + "@smithy/types": 2.1.0 + tslib: 2.6.1 dev: false /@smithy/util-hex-encoding@2.0.0: @@ -2367,7 +2320,7 @@ packages: } engines: { node: ">=14.0.0" } dependencies: - tslib: 2.6.0 + tslib: 2.6.1 dev: false /@smithy/util-middleware@2.0.0: @@ -2377,7 +2330,7 @@ packages: } engines: { node: ">=14.0.0" } dependencies: - tslib: 2.6.0 + tslib: 2.6.1 dev: false /@smithy/util-retry@2.0.0: @@ -2388,24 +2341,24 @@ packages: engines: { node: ">= 14.0.0" } dependencies: "@smithy/service-error-classification": 2.0.0 - tslib: 2.6.0 + tslib: 2.6.1 dev: false - /@smithy/util-stream@2.0.1: + /@smithy/util-stream@2.0.2: resolution: { - integrity: sha512-2a0IOtwIKC46EEo7E7cxDN8u2jwOiYYJqcFKA6rd5rdXqKakHT2Gc+AqHWngr0IEHUfW92zX12wRQKwyoqZf2Q==, + integrity: sha512-Mg9IJcKIu4YKlbzvpp1KLvh4JZLdcPgpxk+LICuDwzZCfxe47R9enVK8dNEiuyiIGK2ExbfvzCVT8IBru62vZw==, } engines: { node: ">=14.0.0" } dependencies: - "@smithy/fetch-http-handler": 2.0.1 - "@smithy/node-http-handler": 2.0.1 - "@smithy/types": 2.0.2 + "@smithy/fetch-http-handler": 2.0.2 + "@smithy/node-http-handler": 2.0.2 + "@smithy/types": 2.1.0 "@smithy/util-base64": 2.0.0 "@smithy/util-buffer-from": 2.0.0 "@smithy/util-hex-encoding": 2.0.0 "@smithy/util-utf8": 2.0.0 - tslib: 2.6.0 + tslib: 2.6.1 dev: false /@smithy/util-uri-escape@2.0.0: @@ -2415,7 +2368,7 @@ packages: } engines: { node: ">=14.0.0" } dependencies: - tslib: 2.6.0 + tslib: 2.6.1 dev: false /@smithy/util-utf8@2.0.0: @@ -2426,19 +2379,19 @@ packages: engines: { node: ">=14.0.0" } dependencies: "@smithy/util-buffer-from": 2.0.0 - tslib: 2.6.0 + tslib: 2.6.1 dev: false - /@smithy/util-waiter@2.0.1: + /@smithy/util-waiter@2.0.2: resolution: { - integrity: sha512-bSyGFicPRYuGFFWAr72UvYI7tE7KmEeFJJ5iaLuTTdo8RGaNBZ2kE25coGtzrejYh9AhwSfckBvbxgEDxIxhlA==, + integrity: sha512-7XCEVXDLguf3Og0NIF/KYEAHtrzNXmCdtEwMfOXr4iBKOUWYzNj91YB9O7tLrct8VGvysGA0x2xYzbxMbvF0QQ==, } engines: { node: ">=14.0.0" } dependencies: - "@smithy/abort-controller": 2.0.1 - "@smithy/types": 2.0.2 - tslib: 2.6.0 + "@smithy/abort-controller": 2.0.2 + "@smithy/types": 2.1.0 + tslib: 2.6.1 dev: false /@types/json-schema@7.0.12: @@ -2462,10 +2415,10 @@ packages: } dev: false - /@typescript-eslint/eslint-plugin@6.0.0(@typescript-eslint/parser@6.0.0)(eslint@8.45.0)(typescript@5.1.6): + /@typescript-eslint/eslint-plugin@6.3.0(@typescript-eslint/parser@6.3.0)(eslint@8.46.0)(typescript@5.1.6): resolution: { - integrity: sha512-xuv6ghKGoiq856Bww/yVYnXGsKa588kY3M0XK7uUW/3fJNNULKRfZfSBkMTSpqGG/8ZCXCadfh8G/z/B4aqS/A==, + integrity: sha512-IZYjYZ0ifGSLZbwMqIip/nOamFiWJ9AH+T/GYNZBWkVcyNQOFGtSMoWV7RvY4poYCMZ/4lHzNl796WOSNxmk8A==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -2476,15 +2429,14 @@ packages: typescript: optional: true dependencies: - "@eslint-community/regexpp": 4.5.1 - "@typescript-eslint/parser": 6.0.0(eslint@8.45.0)(typescript@5.1.6) - "@typescript-eslint/scope-manager": 6.0.0 - "@typescript-eslint/type-utils": 6.0.0(eslint@8.45.0)(typescript@5.1.6) - "@typescript-eslint/utils": 6.0.0(eslint@8.45.0)(typescript@5.1.6) - "@typescript-eslint/visitor-keys": 6.0.0 + "@eslint-community/regexpp": 4.6.2 + "@typescript-eslint/parser": 6.3.0(eslint@8.46.0)(typescript@5.1.6) + "@typescript-eslint/scope-manager": 6.3.0 + "@typescript-eslint/type-utils": 6.3.0(eslint@8.46.0)(typescript@5.1.6) + "@typescript-eslint/utils": 6.3.0(eslint@8.46.0)(typescript@5.1.6) + "@typescript-eslint/visitor-keys": 6.3.0 debug: 4.3.4 - eslint: 8.45.0 - grapheme-splitter: 1.0.4 + eslint: 8.46.0 graphemer: 1.4.0 ignore: 5.2.4 natural-compare: 1.4.0 @@ -2496,10 +2448,10 @@ packages: - supports-color dev: false - /@typescript-eslint/parser@6.0.0(eslint@8.45.0)(typescript@5.1.6): + /@typescript-eslint/parser@6.3.0(eslint@8.46.0)(typescript@5.1.6): resolution: { - integrity: sha512-TNaufYSPrr1U8n+3xN+Yp9g31vQDJqhXzzPSHfQDLcaO4tU+mCfODPxCwf4H530zo7aUBE3QIdxCXamEnG04Tg==, + integrity: sha512-ibP+y2Gr6p0qsUkhs7InMdXrwldjxZw66wpcQq9/PzAroM45wdwyu81T+7RibNCh8oc0AgrsyCwJByncY0Ongg==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -2509,32 +2461,32 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/scope-manager": 6.0.0 - "@typescript-eslint/types": 6.0.0 - "@typescript-eslint/typescript-estree": 6.0.0(typescript@5.1.6) - "@typescript-eslint/visitor-keys": 6.0.0 + "@typescript-eslint/scope-manager": 6.3.0 + "@typescript-eslint/types": 6.3.0 + "@typescript-eslint/typescript-estree": 6.3.0(typescript@5.1.6) + "@typescript-eslint/visitor-keys": 6.3.0 debug: 4.3.4 - eslint: 8.45.0 + eslint: 8.46.0 typescript: 5.1.6 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/scope-manager@6.0.0: + /@typescript-eslint/scope-manager@6.3.0: resolution: { - integrity: sha512-o4q0KHlgCZTqjuaZ25nw5W57NeykZT9LiMEG4do/ovwvOcPnDO1BI5BQdCsUkjxFyrCL0cSzLjvIMfR9uo7cWg==, + integrity: sha512-WlNFgBEuGu74ahrXzgefiz/QlVb+qg8KDTpknKwR7hMH+lQygWyx0CQFoUmMn1zDkQjTBBIn75IxtWss77iBIQ==, } engines: { node: ^16.0.0 || >=18.0.0 } dependencies: - "@typescript-eslint/types": 6.0.0 - "@typescript-eslint/visitor-keys": 6.0.0 + "@typescript-eslint/types": 6.3.0 + "@typescript-eslint/visitor-keys": 6.3.0 dev: false - /@typescript-eslint/type-utils@6.0.0(eslint@8.45.0)(typescript@5.1.6): + /@typescript-eslint/type-utils@6.3.0(eslint@8.46.0)(typescript@5.1.6): resolution: { - integrity: sha512-ah6LJvLgkoZ/pyJ9GAdFkzeuMZ8goV6BH7eC9FPmojrnX9yNCIsfjB+zYcnex28YO3RFvBkV6rMV6WpIqkPvoQ==, + integrity: sha512-7Oj+1ox1T2Yc8PKpBvOKWhoI/4rWFd1j7FA/rPE0lbBPXTKjdbtC+7Ev0SeBjEKkIhKWVeZSP+mR7y1Db1CdfQ==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -2544,28 +2496,28 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/typescript-estree": 6.0.0(typescript@5.1.6) - "@typescript-eslint/utils": 6.0.0(eslint@8.45.0)(typescript@5.1.6) + "@typescript-eslint/typescript-estree": 6.3.0(typescript@5.1.6) + "@typescript-eslint/utils": 6.3.0(eslint@8.46.0)(typescript@5.1.6) debug: 4.3.4 - eslint: 8.45.0 + eslint: 8.46.0 ts-api-utils: 1.0.1(typescript@5.1.6) typescript: 5.1.6 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/types@6.0.0: + /@typescript-eslint/types@6.3.0: resolution: { - integrity: sha512-Zk9KDggyZM6tj0AJWYYKgF0yQyrcnievdhG0g5FqyU3Y2DRxJn4yWY21sJC0QKBckbsdKKjYDV2yVrrEvuTgxg==, + integrity: sha512-K6TZOvfVyc7MO9j60MkRNWyFSf86IbOatTKGrpTQnzarDZPYPVy0oe3myTMq7VjhfsUAbNUW8I5s+2lZvtx1gg==, } engines: { node: ^16.0.0 || >=18.0.0 } dev: false - /@typescript-eslint/typescript-estree@6.0.0(typescript@5.1.6): + /@typescript-eslint/typescript-estree@6.3.0(typescript@5.1.6): resolution: { - integrity: sha512-2zq4O7P6YCQADfmJ5OTDQTP3ktajnXIRrYAtHM9ofto/CJZV3QfJ89GEaM2BNGeSr1KgmBuLhEkz5FBkS2RQhQ==, + integrity: sha512-Xh4NVDaC4eYKY4O3QGPuQNp5NxBAlEvNQYOqJquR2MePNxO11E5K3t5x4M4Mx53IZvtpW+mBxIT0s274fLUocg==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -2574,8 +2526,8 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/types": 6.0.0 - "@typescript-eslint/visitor-keys": 6.0.0 + "@typescript-eslint/types": 6.3.0 + "@typescript-eslint/visitor-keys": 6.3.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -2586,38 +2538,37 @@ packages: - supports-color dev: false - /@typescript-eslint/utils@6.0.0(eslint@8.45.0)(typescript@5.1.6): + /@typescript-eslint/utils@6.3.0(eslint@8.46.0)(typescript@5.1.6): resolution: { - integrity: sha512-SOr6l4NB6HE4H/ktz0JVVWNXqCJTOo/mHnvIte1ZhBQ0Cvd04x5uKZa3zT6tiodL06zf5xxdK8COiDvPnQ27JQ==, + integrity: sha512-hLLg3BZE07XHnpzglNBG8P/IXq/ZVXraEbgY7FM0Cnc1ehM8RMdn9mat3LubJ3KBeYXXPxV1nugWbQPjGeJk6Q==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.45.0) + "@eslint-community/eslint-utils": 4.4.0(eslint@8.46.0) "@types/json-schema": 7.0.12 "@types/semver": 7.5.0 - "@typescript-eslint/scope-manager": 6.0.0 - "@typescript-eslint/types": 6.0.0 - "@typescript-eslint/typescript-estree": 6.0.0(typescript@5.1.6) - eslint: 8.45.0 - eslint-scope: 5.1.1 + "@typescript-eslint/scope-manager": 6.3.0 + "@typescript-eslint/types": 6.3.0 + "@typescript-eslint/typescript-estree": 6.3.0(typescript@5.1.6) + eslint: 8.46.0 semver: 7.5.4 transitivePeerDependencies: - supports-color - typescript dev: false - /@typescript-eslint/visitor-keys@6.0.0: + /@typescript-eslint/visitor-keys@6.3.0: resolution: { - integrity: sha512-cvJ63l8c0yXdeT5POHpL0Q1cZoRcmRKFCtSjNGJxPkcP571EfZMcNbzWAc7oK3D1dRzm/V5EwtkANTZxqvuuUA==, + integrity: sha512-kEhRRj7HnvaSjux1J9+7dBen15CdWmDnwrpyiHsFX6Qx2iW5LOBUgNefOFeh2PjWPlNwN8TOn6+4eBU3J/gupw==, } engines: { node: ^16.0.0 || >=18.0.0 } dependencies: - "@typescript-eslint/types": 6.0.0 - eslint-visitor-keys: 3.4.1 + "@typescript-eslint/types": 6.3.0 + eslint-visitor-keys: 3.4.2 dev: false /abbrev@1.1.1: @@ -2747,10 +2698,10 @@ packages: } dev: true - /better-sqlite3@8.4.0: + /better-sqlite3@8.5.0: resolution: { - integrity: sha512-NmsNW1CQvqMszu/CFAJ3pLct6NEFlNfuGM6vw72KHkjOD1UDnL96XNN1BMQc1hiHo8vE2GbOWQYIpZ+YM5wrZw==, + integrity: sha512-vbPcv/Hx5WYdyNg/NbcfyaBZyv9s/NVbxb7yCeC5Bq1pVocNxeL2tZmSu3Rlm4IEOTjYdGyzWQgyx0OSdORBzw==, } requiresBuild: true dependencies: @@ -2875,7 +2826,7 @@ packages: } dependencies: debug: 4.3.4 - tslib: 2.6.0 + tslib: 2.6.1 transitivePeerDependencies: - supports-color dev: true @@ -3104,10 +3055,10 @@ packages: engines: { node: ">=0.10" } dev: false - /detect-libc@2.0.1: + /detect-libc@2.0.2: resolution: { - integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==, + integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==, } engines: { node: ">=8" } dev: true @@ -3209,8 +3160,8 @@ packages: camelcase: 7.0.1 chalk: 5.3.0 commander: 9.5.0 - esbuild: 0.18.17 - esbuild-register: 3.4.2(esbuild@0.18.17) + esbuild: 0.18.20 + esbuild-register: 3.4.2(esbuild@0.18.20) glob: 8.1.0 hanji: 0.0.5 json-diff: 0.9.0 @@ -3220,10 +3171,10 @@ packages: - supports-color dev: false - /drizzle-orm@0.27.2(@cloudflare/workers-types@4.20230710.1)(@planetscale/database@1.8.0)(mysql2@3.6.0): + /drizzle-orm@0.28.1(@cloudflare/workers-types@4.20230807.0)(@planetscale/database@1.10.0)(mysql2@3.6.0): resolution: { - integrity: sha512-ZvBvceff+JlgP7FxHKe0zOU9CkZ4RcOtibumIrqfYzDGuOeF0YUY0F9iMqYpRM7pxnLRfC+oO7rWOUH3T5oFQA==, + integrity: sha512-6ms2pVxvkBJtuP1BZTUCzLLkr+iK/cNgd+tCw+I5/PoM8PB9kXaYoW9yNe/cnaXb0TLJ1gDEndDIyQdRX7zCdQ==, } peerDependencies: "@aws-sdk/client-rds-data": ">=3" @@ -3285,8 +3236,8 @@ packages: sqlite3: optional: true dependencies: - "@cloudflare/workers-types": 4.20230710.1 - "@planetscale/database": 1.8.0 + "@cloudflare/workers-types": 4.20230807.0 + "@planetscale/database": 1.10.0 mysql2: 3.6.0 dev: false @@ -3367,7 +3318,7 @@ packages: es6-symbol: 3.1.3 dev: false - /esbuild-register@3.4.2(esbuild@0.18.17): + /esbuild-register@3.4.2(esbuild@0.18.20): resolution: { integrity: sha512-kG/XyTDyz6+YDuyfB9ZoSIOOmgyFCH+xPRtsCa8W85HLRV5Csp+o3jWVbOSHgSLfyLc5DmP+KFDNwty4mEjC+Q==, @@ -3376,7 +3327,7 @@ packages: esbuild: ">=0.12 <1" dependencies: debug: 4.3.4 - esbuild: 0.18.17 + esbuild: 0.18.20 transitivePeerDependencies: - supports-color dev: false @@ -3447,37 +3398,37 @@ packages: "@esbuild/win32-x64": 0.17.19 dev: false - /esbuild@0.18.17: + /esbuild@0.18.20: resolution: { - integrity: sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==, + integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==, } engines: { node: ">=12" } hasBin: true requiresBuild: true optionalDependencies: - "@esbuild/android-arm": 0.18.17 - "@esbuild/android-arm64": 0.18.17 - "@esbuild/android-x64": 0.18.17 - "@esbuild/darwin-arm64": 0.18.17 - "@esbuild/darwin-x64": 0.18.17 - "@esbuild/freebsd-arm64": 0.18.17 - "@esbuild/freebsd-x64": 0.18.17 - "@esbuild/linux-arm": 0.18.17 - "@esbuild/linux-arm64": 0.18.17 - "@esbuild/linux-ia32": 0.18.17 - "@esbuild/linux-loong64": 0.18.17 - "@esbuild/linux-mips64el": 0.18.17 - "@esbuild/linux-ppc64": 0.18.17 - "@esbuild/linux-riscv64": 0.18.17 - "@esbuild/linux-s390x": 0.18.17 - "@esbuild/linux-x64": 0.18.17 - "@esbuild/netbsd-x64": 0.18.17 - "@esbuild/openbsd-x64": 0.18.17 - "@esbuild/sunos-x64": 0.18.17 - "@esbuild/win32-arm64": 0.18.17 - "@esbuild/win32-ia32": 0.18.17 - "@esbuild/win32-x64": 0.18.17 + "@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: false /escape-string-regexp@4.0.0: @@ -3487,7 +3438,7 @@ packages: } engines: { node: ">=10" } - /eslint-config-google@0.14.0(eslint@8.45.0): + /eslint-config-google@0.14.0(eslint@8.46.0): resolution: { integrity: sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==, @@ -3496,7 +3447,7 @@ packages: peerDependencies: eslint: ">=5.16.0" dependencies: - eslint: 8.45.0 + eslint: 8.46.0 dev: true /eslint-plugin-json@3.1.0: @@ -3510,46 +3461,35 @@ packages: vscode-json-languageservice: 4.2.1 dev: true - /eslint-scope@5.1.1: - resolution: - { - integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==, - } - engines: { node: ">=8.0.0" } - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - dev: false - - /eslint-scope@7.2.1: + /eslint-scope@7.2.2: resolution: { - integrity: sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==, + integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - /eslint-visitor-keys@3.4.1: + /eslint-visitor-keys@3.4.2: resolution: { - integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==, + integrity: sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - /eslint@8.45.0: + /eslint@8.46.0: resolution: { - integrity: sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==, + integrity: sha512-cIO74PvbW0qU8e0mIvk5IV3ToWdCq5FYG6gWPHHkx6gNdjlbAYvtfHmlCMXxjcoVaIdwy/IAt3+mDkZkfvb2Dg==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } hasBin: true dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.45.0) - "@eslint-community/regexpp": 4.5.1 - "@eslint/eslintrc": 2.1.0 - "@eslint/js": 8.44.0 + "@eslint-community/eslint-utils": 4.4.0(eslint@8.46.0) + "@eslint-community/regexpp": 4.6.2 + "@eslint/eslintrc": 2.1.1 + "@eslint/js": 8.46.0 "@humanwhocodes/config-array": 0.11.10 "@humanwhocodes/module-importer": 1.0.1 "@nodelib/fs.walk": 1.2.8 @@ -3559,8 +3499,8 @@ packages: debug: 4.3.4 doctrine: 3.0.0 escape-string-regexp: 4.0.0 - eslint-scope: 7.2.1 - eslint-visitor-keys: 3.4.1 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.2 espree: 9.6.1 esquery: 1.5.0 esutils: 2.0.3 @@ -3595,7 +3535,7 @@ packages: dependencies: acorn: 8.10.0 acorn-jsx: 5.3.2(acorn@8.10.0) - eslint-visitor-keys: 3.4.1 + eslint-visitor-keys: 3.4.2 /esquery@1.5.0: resolution: @@ -3615,14 +3555,6 @@ packages: dependencies: estraverse: 5.3.0 - /estraverse@4.3.0: - resolution: - { - integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==, - } - engines: { node: ">=4.0" } - dev: false - /estraverse@5.3.0: resolution: { @@ -3695,10 +3627,10 @@ packages: integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, } - /fast-glob@3.3.0: + /fast-glob@3.3.1: resolution: { - integrity: sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==, + integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==, } engines: { node: ">=8.6.0" } dependencies: @@ -3944,19 +3876,12 @@ packages: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.3.0 + fast-glob: 3.3.1 ignore: 5.2.4 merge2: 1.4.1 slash: 3.0.0 dev: false - /grapheme-splitter@1.0.4: - resolution: - { - integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==, - } - dev: false - /graphemer@1.4.0: resolution: { @@ -3987,10 +3912,10 @@ packages: } dev: false - /hono@3.3.4: + /hono@3.4.1: resolution: { - integrity: sha512-lqvcsQrXS0bSydj/MkOXi3opAwrlauIjZefhXMMRj9prABfBWdrYHSrWk/xfxgxNPs4yuEMh2Z5zV0L2b1Jmdw==, + integrity: sha512-fA7/cfgNg060mt12cYykdstwqM/bRvqYmQlPpEjoKIwMs6QF1rPJzZjppCrFuZZJvKE1vEP6kEAaaDH96XRg7Q==, } engines: { node: ">=16.0.0" } dev: false @@ -4349,10 +4274,10 @@ packages: es5-ext: 0.10.62 dev: false - /lucia@2.0.0: + /lucia@2.2.0: resolution: { - integrity: sha512-WRBMoZIgTHH6y2bAEHZWgWcMH6tDsQ+wf45juUgmn3ycjipn/e6OGpWki4XSjEuRm50WXghH+2EF9LCjCHUsUw==, + integrity: sha512-bCKSbWGpUQl+YbWaIy4t9eqqZQwKa5XKTBMTAjhAWwg9rEgPWu6L7vH55SueRsvB+2XNa2NA71ASdBUyS2fwLA==, } dev: false @@ -4435,16 +4360,16 @@ packages: engines: { node: ">=10" } dev: true - /miniflare@3.20230710.0: + /miniflare@3.20230724.0: resolution: { - integrity: sha512-kVxJoJFeepK+rGJp9UN0D8d3sL6hjFbzd3qcLUUUKosp0ouoleOa6uPNK0b8fEBWWqFUD2W4V4ziN7UvXFB4pg==, + integrity: sha512-YU8yUwoVJCiuzY2i9ZBJ+McjL/mqwKnMJfn23QedSCvx82Mys8GAlkHCH69mqSqzlSw8IVcdxec330meRRf9bg==, } engines: { node: ">=16.13" } dependencies: acorn: 8.10.0 acorn-walk: 8.2.0 - better-sqlite3: 8.4.0 + better-sqlite3: 8.5.0 capnp-ts: 0.7.0 exit-hook: 2.2.1 glob-to-regexp: 0.4.1 @@ -4453,8 +4378,8 @@ packages: set-cookie-parser: 2.6.0 source-map-support: 0.5.21 stoppable: 1.1.0 - undici: 5.22.1 - workerd: 1.20230710.0 + undici: 5.23.0 + workerd: 1.20230724.0 ws: 8.13.0 youch: 3.2.3 zod: 3.21.4 @@ -4747,7 +4672,7 @@ packages: engines: { node: ">=10" } hasBin: true dependencies: - detect-libc: 2.0.1 + detect-libc: 2.0.2 expand-template: 2.0.3 github-from-package: 0.0.0 minimist: 1.2.8 @@ -4768,10 +4693,10 @@ packages: } engines: { node: ">= 0.8.0" } - /prettier@3.0.0: + /prettier@3.0.1: resolution: { - integrity: sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==, + integrity: sha512-fcOWSnnpCrovBsmFZIGIy9UqK2FaI7Hqax+DIO0A9UxeVoY4iweyaFjS5TavZN97Hfehph0nhsZnjlVKzEQSrQ==, } engines: { node: ">=14" } hasBin: true @@ -5289,10 +5214,10 @@ packages: } dev: false - /tslib@2.6.0: + /tslib@2.6.1: resolution: { - integrity: sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==, + integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==, } /tunnel-agent@0.6.0: @@ -5350,10 +5275,10 @@ packages: engines: { node: ">=14.17" } hasBin: true - /undici@5.22.1: + /undici@5.23.0: resolution: { - integrity: sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==, + integrity: sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==, } engines: { node: ">=14.0" } dependencies: @@ -5441,26 +5366,26 @@ packages: } dev: false - /workerd@1.20230710.0: + /workerd@1.20230724.0: resolution: { - integrity: sha512-4iC+8w3UNixJ+b6GA2VOG2B6rnfSbSnm7Fnvsvq9iJuolG34fnD9xrfaXu6oN7H3Wyby3z8OIm0fy3szTvuRcg==, + integrity: sha512-++D7JqS4/dk7zvtGpk+i/7G9bZtEl6lTtgAsIoSSGR1qJAxxEu21ktm9+FH0EYh7uKfizuM5H9lrTsR+3u44PA==, } engines: { node: ">=16" } hasBin: true requiresBuild: true optionalDependencies: - "@cloudflare/workerd-darwin-64": 1.20230710.0 - "@cloudflare/workerd-darwin-arm64": 1.20230710.0 - "@cloudflare/workerd-linux-64": 1.20230710.0 - "@cloudflare/workerd-linux-arm64": 1.20230710.0 - "@cloudflare/workerd-windows-64": 1.20230710.0 + "@cloudflare/workerd-darwin-64": 1.20230724.0 + "@cloudflare/workerd-darwin-arm64": 1.20230724.0 + "@cloudflare/workerd-linux-64": 1.20230724.0 + "@cloudflare/workerd-linux-arm64": 1.20230724.0 + "@cloudflare/workerd-windows-64": 1.20230724.0 dev: true - /wrangler@3.2.0: + /wrangler@3.4.0: resolution: { - integrity: sha512-Fne5c91uolV4+E0B60F/meWbD/sr/oSPBfr6x1gapu6I7Ipu5uUt29K/fuGRgXRQcVVKnd5k3fS++ruuLODoxA==, + integrity: sha512-sATQ84zH/zFUHSaa4hY3V24TBrad3R9HhGV47U6Ek7XRQDLQHBm0jt84mJD3sSV/hhaq5s+xidIYulhm+m1/Tg==, } engines: { node: ">=16.13.0" } hasBin: true @@ -5471,7 +5396,7 @@ packages: blake3-wasm: 2.1.5 chokidar: 3.5.3 esbuild: 0.16.3 - miniflare: 3.20230710.0 + miniflare: 3.20230724.0 nanoid: 3.3.6 path-to-regexp: 6.2.1 selfsigned: 2.1.1 diff --git a/src/lib/auth/lucia.ts b/src/lib/auth/lucia.ts index bae2e91..5f034dc 100644 --- a/src/lib/auth/lucia.ts +++ b/src/lib/auth/lucia.ts @@ -1,15 +1,10 @@ import { lucia } from "lucia"; -import { web } from "lucia/middleware"; +import { hono } from "lucia/middleware"; import { planetscale } from "@lucia-auth/adapter-mysql"; import { getConnection } from "../planetscale"; import { Env } from "@/worker-configuration"; import { tableNames } from "../drizzle"; -export const authorizationTokenNames = { - csrf: "__csrf_token", - session: "__session_token", -}; - // this is so we can pass in env during requests, // so: it would be called: auth(c.env)... instead of auth export const auth = (env: Env) => { @@ -22,15 +17,11 @@ export const auth = (env: Env) => { user: tableNames.authUser, session: tableNames.authSession, }), - middleware: web(), + middleware: hono(), sessionExpiresIn: { idlePeriod: 0, activePeriod: 30 * 24 * 60 * 60 * 1000, // 30 days }, - sessionCookie: { - name: authorizationTokenNames.session, - expires: false, - }, env: env.ENVIRONMENT === "DEV" ? "DEV" : "PROD", experimental: { debugMode: env.ENVIRONMENT === "DEV" ? true : false, diff --git a/src/routes/auth/login.ts b/src/routes/auth/login.ts index 2f41fe1..e16389c 100644 --- a/src/routes/auth/login.ts +++ b/src/routes/auth/login.ts @@ -1,6 +1,5 @@ -import { auth, authorizationTokenNames } from "@/lib/auth/lucia"; +import { auth } from "@/lib/auth/lucia"; import { Context } from "hono"; -import { setCookie } from "hono/cookie"; import * as validate from "@/lib/regex/accountValidation"; export const login = async (c: Context): Promise => { @@ -9,7 +8,7 @@ export const login = async (c: Context): Promise => { const username = formData.get("username") as string; const password = formData.get("password") as string; - const validSession = await auth(c.env).handleRequest(c.req.raw).validate(); + const validSession = await auth(c.env).handleRequest(c).validate(); console.log(validSession); @@ -39,13 +38,8 @@ export const login = async (c: Context): Promise => { attributes: {}, }); - setCookie(c, authorizationTokenNames.csrf, newSession.sessionId, { - expires: newSession.activePeriodExpiresAt, - sameSite: "Lax", - httpOnly: true, - path: "/", - secure: true, - }); + const authRequest = await auth(c.env).handleRequest(c); + authRequest.setSession(newSession); return c.json({ success: true, state: "logged in" }, 200); }; diff --git a/src/routes/auth/logout.ts b/src/routes/auth/logout.ts index 8cf2684..0aaf471 100644 --- a/src/routes/auth/logout.ts +++ b/src/routes/auth/logout.ts @@ -1,17 +1,14 @@ import { auth } from "@/lib/auth/lucia"; import { Context } from "hono"; -import { deleteCookie } from "hono/cookie"; -import { authorizationTokenNames } from "@/lib/auth/lucia"; export const logout = async (c: Context): Promise => { - const authRequest = auth(c.env).handleRequest(c.req.raw); + const authRequest = auth(c.env).handleRequest(c); const session = await authRequest.validate(); if (!session) { return c.json({ success: false, state: "invalid session" }, 200); } - deleteCookie(c, authorizationTokenNames.session); await auth(c.env).invalidateSession(session.sessionId); return c.json({ success: true, state: "logged out" }, 200); }; diff --git a/src/routes/auth/signup.ts b/src/routes/auth/signup.ts index 5bbef50..33319a4 100644 --- a/src/routes/auth/signup.ts +++ b/src/routes/auth/signup.ts @@ -1,6 +1,5 @@ -import { auth, authorizationTokenNames } from "@/lib/auth/lucia"; +import { auth } from "@/lib/auth/lucia"; import { Context } from "hono"; -import { setCookie } from "hono/cookie"; import * as validate from "@/lib/regex/accountValidation"; import { LuciaError } from "lucia"; @@ -12,7 +11,7 @@ export const signup = async (c: Context) => { const passwordConfirm = body.get("passwordConfirm") as string; const email = body.get("email") as string; - const validSession = await auth(c.env).handleRequest(c.req.raw).validate(); + const validSession = await auth(c.env).handleRequest(c).validate(); if (validSession) return c.json({ success: false, state: "already logged in" }, 200); @@ -60,13 +59,8 @@ export const signup = async (c: Context) => { attributes: {}, }); - setCookie(c, authorizationTokenNames.csrf, newSession.sessionId, { - expires: newSession.activePeriodExpiresAt, - httpOnly: true, - secure: true, - sameSite: "Lax", - }); - + const authRequest = auth(c.env).handleRequest(c); + authRequest.setSession(newSession); return c.json({ success: true, state: "logged in" }, 200); } catch (e) { if (e instanceof LuciaError) { diff --git a/src/routes/auth/validate.ts b/src/routes/auth/validate.ts index f1d7de9..e780b69 100644 --- a/src/routes/auth/validate.ts +++ b/src/routes/auth/validate.ts @@ -1,25 +1,17 @@ -import { auth, authorizationTokenNames } from "@/lib/auth/lucia"; +import { auth } from "@/lib/auth/lucia"; import { Context } from "hono"; -import { getCookie, deleteCookie } from "hono/cookie"; export const validate = async (c: Context): Promise => { - const authRequest = auth(c.env).handleRequest(c.req.raw); + const authRequest = auth(c.env).handleRequest(c); const session = await authRequest.validate(); if (!session) { - // get the cookie, if it exists, and delete it - const cookie = getCookie(c, authorizationTokenNames.session); - if (cookie) { - deleteCookie(c, authorizationTokenNames.session); - } return c.json({ success: false, state: "invalid session" }, 200); } if (session.state === "idle") { await auth(c.env).invalidateSession(session.sessionId); - - deleteCookie(c, authorizationTokenNames.session); return c.json({ success: false, state: "invalid session" }, 200); } From 8c051603b277311fe59e3efe1bd1b82668b85b03 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Tue, 8 Aug 2023 22:32:30 +0100 Subject: [PATCH 045/318] feat: update schema, reinit authentication routes --- src/db/migrations/schema.ts | 3 +++ src/lib/auth/lucia.ts | 4 ++++ src/routes/auth/authRoute.ts | 2 +- src/routes/auth/login.ts | 19 ++++++++++++++----- src/routes/auth/signup.ts | 29 ++++++++++------------------- src/routes/auth/validate.ts | 4 ++++ 6 files changed, 36 insertions(+), 25 deletions(-) diff --git a/src/db/migrations/schema.ts b/src/db/migrations/schema.ts index a10e234..674d516 100644 --- a/src/db/migrations/schema.ts +++ b/src/db/migrations/schema.ts @@ -41,6 +41,9 @@ export const assets = mysqlTable( idIdx: index("assets_id_idx").on(table.id), nameIdx: index("assets_name_idx").on(table.name), gameIdx: index("assets_game_idx").on(table.game), + assetCategoryIdx: index("assets_asset_category_idx").on( + table.assetCategory + ), statusIdx: index("assets_status_idx").on(table.status), tagsIdx: index("assets_tags_idx").on(table.tags), uploadedByIdx: index("assets_uploaded_by_idx").on(table.uploadedBy), diff --git a/src/lib/auth/lucia.ts b/src/lib/auth/lucia.ts index 5f034dc..498f1d1 100644 --- a/src/lib/auth/lucia.ts +++ b/src/lib/auth/lucia.ts @@ -26,6 +26,10 @@ export const auth = (env: Env) => { experimental: { debugMode: env.ENVIRONMENT === "DEV" ? true : false, }, + // csrfProtection: { + // baseDomain: env.ENVIRONMENT === "DEV" ? "localhost" : "wanderer.moe", + // allowedSubDomains: ["*"], + // }, getUserAttributes: (dbUser) => { return { username: dbUser.username, diff --git a/src/routes/auth/authRoute.ts b/src/routes/auth/authRoute.ts index 29233a3..f81db53 100644 --- a/src/routes/auth/authRoute.ts +++ b/src/routes/auth/authRoute.ts @@ -10,7 +10,7 @@ const authRoute = new Hono(); authRoute.use( "*", cors({ - // "http://localhost:3000", + credentials: true, origin: ["https://next.wanderer.moe"], }) ); diff --git a/src/routes/auth/login.ts b/src/routes/auth/login.ts index e16389c..08121ea 100644 --- a/src/routes/auth/login.ts +++ b/src/routes/auth/login.ts @@ -7,21 +7,19 @@ export const login = async (c: Context): Promise => { const username = formData.get("username") as string; const password = formData.get("password") as string; + // console.log(username, password); const validSession = await auth(c.env).handleRequest(c).validate(); - console.log(validSession); - - if (validSession) { + if (validSession) return c.json({ success: false, state: "already logged in" }, 200); - } if (!validate.username(username) || !validate.password(password)) { return c.json( { success: false, status: "error", - error: "400 Bad Request", + error: "Invalid credentials", }, 400 ); @@ -33,6 +31,17 @@ export const login = async (c: Context): Promise => { password ); + if (!user) { + return c.json( + { + success: false, + status: "error", + error: "Invalid credentials", + }, + 400 + ); + } + const newSession = await auth(c.env).createSession({ userId: user.userId, attributes: {}, diff --git a/src/routes/auth/signup.ts b/src/routes/auth/signup.ts index 33319a4..03437f8 100644 --- a/src/routes/auth/signup.ts +++ b/src/routes/auth/signup.ts @@ -1,18 +1,17 @@ import { auth } from "@/lib/auth/lucia"; import { Context } from "hono"; import * as validate from "@/lib/regex/accountValidation"; -import { LuciaError } from "lucia"; export const signup = async (c: Context) => { - const body = await c.req.formData(); + const formData = await c.req.formData(); - const username = body.get("username") as string; - const password = body.get("password") as string; - const passwordConfirm = body.get("passwordConfirm") as string; - const email = body.get("email") as string; + const username = formData.get("username") as string; + const email = formData.get("email") as string; + const password = formData.get("password") as string; + const passwordConfirm = formData.get("passwordConfirm") as string; + // console.log(username, email, password, passwordConfirm); const validSession = await auth(c.env).handleRequest(c).validate(); - if (validSession) return c.json({ success: false, state: "already logged in" }, 200); @@ -26,7 +25,7 @@ export const signup = async (c: Context) => { { success: false, status: "error", - error: "400 Bad Request", + error: "Invalid credentials", }, 400 ); @@ -54,6 +53,7 @@ export const signup = async (c: Context) => { bio: null, }, }); + const newSession = await auth(c.env).createSession({ userId: user.userId, attributes: {}, @@ -63,21 +63,12 @@ export const signup = async (c: Context) => { authRequest.setSession(newSession); return c.json({ success: true, state: "logged in" }, 200); } catch (e) { - if (e instanceof LuciaError) { - return c.json( - { - success: false, - status: "error", - error: "Account creation error, most likely already exists", - }, - 500 - ); - } + console.log(e); return c.json( { success: false, status: "error", - error: "500 Internal Server Error", + error: "Error creating user", }, 500 ); diff --git a/src/routes/auth/validate.ts b/src/routes/auth/validate.ts index e780b69..78157e2 100644 --- a/src/routes/auth/validate.ts +++ b/src/routes/auth/validate.ts @@ -2,8 +2,12 @@ import { auth } from "@/lib/auth/lucia"; import { Context } from "hono"; export const validate = async (c: Context): Promise => { + console.log(c); const authRequest = auth(c.env).handleRequest(c); + // console.log("validate") + // console.log(authRequest); + const session = await authRequest.validate(); if (!session) { From 9c404a8b8dbc2dbd2580430e5e40929b7ee9940d Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Wed, 9 Aug 2023 00:54:16 +0100 Subject: [PATCH 046/318] feat: a true work of art --- src/routes/auth/authRoute.ts | 2 +- src/routes/auth/signup.ts | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/routes/auth/authRoute.ts b/src/routes/auth/authRoute.ts index f81db53..83e8b82 100644 --- a/src/routes/auth/authRoute.ts +++ b/src/routes/auth/authRoute.ts @@ -11,7 +11,7 @@ authRoute.use( "*", cors({ credentials: true, - origin: ["https://next.wanderer.moe"], + origin: ["https://next.wanderer.moe", "https://wanderer.moe", "http://localhost:3000"], }) ); diff --git a/src/routes/auth/signup.ts b/src/routes/auth/signup.ts index 03437f8..6c90cb8 100644 --- a/src/routes/auth/signup.ts +++ b/src/routes/auth/signup.ts @@ -5,16 +5,30 @@ import * as validate from "@/lib/regex/accountValidation"; export const signup = async (c: Context) => { const formData = await c.req.formData(); + const secretKeyRequiredForSignup = c.env.get("VERY_SECRET_SIGNUP_KEY"); + const username = formData.get("username") as string; const email = formData.get("email") as string; const password = formData.get("password") as string; const passwordConfirm = formData.get("passwordConfirm") as string; + const secretKey = formData.get("secretKey") as string; // console.log(username, email, password, passwordConfirm); const validSession = await auth(c.env).handleRequest(c).validate(); if (validSession) return c.json({ success: false, state: "already logged in" }, 200); + if (secretKeyRequiredForSignup !== secretKey) { + return c.json( + { + success: false, + status: "error", + error: "Invalid secret key", + }, + 400 + ); + } + if ( !validate.username(username) || !validate.password(password) || @@ -44,7 +58,7 @@ export const signup = async (c: Context) => { email_verified: 0, date_joined: new Date(), verified: 0, - role_flags: 0, + role_flags: 1, self_assignable_role_flags: null, username_colour: null, avatar_url: null, From ea8cd87a851c09ad67034cc87c404c22aa7f2b7c Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Wed, 9 Aug 2023 01:02:53 +0100 Subject: [PATCH 047/318] we dont talk about this --- src/routes/auth/authRoute.ts | 6 +++++- src/routes/auth/signup.ts | 2 +- src/worker-configuration.d.ts | 1 + 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/routes/auth/authRoute.ts b/src/routes/auth/authRoute.ts index 83e8b82..080adee 100644 --- a/src/routes/auth/authRoute.ts +++ b/src/routes/auth/authRoute.ts @@ -11,7 +11,11 @@ authRoute.use( "*", cors({ credentials: true, - origin: ["https://next.wanderer.moe", "https://wanderer.moe", "http://localhost:3000"], + origin: [ + "https://next.wanderer.moe", + "https://wanderer.moe", + "http://localhost:3000", + ], }) ); diff --git a/src/routes/auth/signup.ts b/src/routes/auth/signup.ts index 6c90cb8..4b765f8 100644 --- a/src/routes/auth/signup.ts +++ b/src/routes/auth/signup.ts @@ -5,7 +5,7 @@ import * as validate from "@/lib/regex/accountValidation"; export const signup = async (c: Context) => { const formData = await c.req.formData(); - const secretKeyRequiredForSignup = c.env.get("VERY_SECRET_SIGNUP_KEY"); + const secretKeyRequiredForSignup = c.env.VERY_SECRET_SIGNUP_KEY; const username = formData.get("username") as string; const email = formData.get("email") as string; diff --git a/src/worker-configuration.d.ts b/src/worker-configuration.d.ts index 7f55361..54bbb4c 100644 --- a/src/worker-configuration.d.ts +++ b/src/worker-configuration.d.ts @@ -6,4 +6,5 @@ export interface Env { DATABASE_USERNAME: string; DATABASE_HOST: string; ENVIRONMENT: string; + VERY_SECRET_SIGNUP_KEY: string; } From fe20e91f494997a09def3142674ad74964d9b5ad Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sat, 12 Aug 2023 13:52:54 +0100 Subject: [PATCH 048/318] invalidate stolen sessions, login throttling might work, might not --- src/lib/auth/lucia.ts | 6 +++ .../regexValidation.ts} | 0 src/lucia.d.ts | 5 ++- src/routes/auth/authRoute.ts | 8 +--- src/routes/auth/login.ts | 39 ++++++++++++++++--- src/routes/auth/logout.ts | 2 + src/routes/auth/signup.ts | 32 +++++++-------- src/routes/auth/validate.ts | 17 ++++++++ 8 files changed, 80 insertions(+), 29 deletions(-) rename src/lib/{regex/accountValidation.ts => validate/regexValidation.ts} (100%) diff --git a/src/lib/auth/lucia.ts b/src/lib/auth/lucia.ts index 498f1d1..093be05 100644 --- a/src/lib/auth/lucia.ts +++ b/src/lib/auth/lucia.ts @@ -46,6 +46,12 @@ export const auth = (env: Env) => { dateJoined: dbUser.date_joined, }; }, + getSessionAttributes: (dbSession) => { + return { + userAgentHash: dbSession.user_agent_hash as unknown as string, // md5 + countryCode: dbSession.country_code as string, + }; + }, }); }; diff --git a/src/lib/regex/accountValidation.ts b/src/lib/validate/regexValidation.ts similarity index 100% rename from src/lib/regex/accountValidation.ts rename to src/lib/validate/regexValidation.ts diff --git a/src/lucia.d.ts b/src/lucia.d.ts index 2ef1bbf..10ac99d 100644 --- a/src/lucia.d.ts +++ b/src/lucia.d.ts @@ -15,5 +15,8 @@ declare namespace Lucia { self_assignable_role_flags: number | null; date_joined: Date; }; - // type DatabaseSessionAttributes = {} + type DatabaseSessionAttributes = { + country_code: string; + user_agent_hash: ArrayBuffer; + }; } diff --git a/src/routes/auth/authRoute.ts b/src/routes/auth/authRoute.ts index 080adee..99e8a45 100644 --- a/src/routes/auth/authRoute.ts +++ b/src/routes/auth/authRoute.ts @@ -11,11 +11,7 @@ authRoute.use( "*", cors({ credentials: true, - origin: [ - "https://next.wanderer.moe", - "https://wanderer.moe", - "http://localhost:3000", - ], + origin: ["https://next.wanderer.moe"], }) ); @@ -31,7 +27,7 @@ authRoute.get("/validate", async (c) => { return validate(c); }); -authRoute.get("/logout", async (c) => { +authRoute.post("/logout", async (c) => { return logout(c); }); diff --git a/src/routes/auth/login.ts b/src/routes/auth/login.ts index 08121ea..2f2dee4 100644 --- a/src/routes/auth/login.ts +++ b/src/routes/auth/login.ts @@ -1,6 +1,14 @@ import { auth } from "@/lib/auth/lucia"; import { Context } from "hono"; -import * as validate from "@/lib/regex/accountValidation"; +// import * as validate from "@/lib/regex/accountValidation"; + +const usernameThrottling = new Map< + string, + { + timeoutUntil: number; + timeoutSeconds: number; + } +>(); export const login = async (c: Context): Promise => { const formData = await c.req.formData(); @@ -14,12 +22,17 @@ export const login = async (c: Context): Promise => { if (validSession) return c.json({ success: false, state: "already logged in" }, 200); - if (!validate.username(username) || !validate.password(password)) { + const storedThrottling = usernameThrottling.get(username); + const timeoutUntil = storedThrottling?.timeoutUntil ?? 0; + + if (timeoutUntil > Date.now()) { return c.json( { success: false, status: "error", - error: "Invalid credentials", + error: `Too many login attempts - wait ${ + (timeoutUntil - Date.now()) / 1000 + } seconds`, }, 400 ); @@ -32,19 +45,35 @@ export const login = async (c: Context): Promise => { ); if (!user) { + const timeoutSeconds = storedThrottling + ? storedThrottling.timeoutSeconds * 2 + : 1; + usernameThrottling.set(username, { + timeoutUntil: Date.now() + timeoutSeconds * 1000, + timeoutSeconds, + }); return c.json( { success: false, status: "error", - error: "Invalid credentials", + error: `Invalid credentials - wait ${timeoutSeconds} seconds`, }, 400 ); } + const userAgentHash = await crypto.subtle.digest( + { name: "MD5" }, + new TextEncoder().encode(c.req.headers.get("user-agent") ?? "") + ); + const countryCode = c.req.headers.get("cf-ipcountry") ?? ""; + const newSession = await auth(c.env).createSession({ userId: user.userId, - attributes: {}, + attributes: { + country_code: countryCode, + user_agent_hash: userAgentHash, + }, }); const authRequest = await auth(c.env).handleRequest(c); diff --git a/src/routes/auth/logout.ts b/src/routes/auth/logout.ts index 0aaf471..624c263 100644 --- a/src/routes/auth/logout.ts +++ b/src/routes/auth/logout.ts @@ -10,5 +10,7 @@ export const logout = async (c: Context): Promise => { } await auth(c.env).invalidateSession(session.sessionId); + authRequest.setSession(null); + return c.json({ success: true, state: "logged out" }, 200); }; diff --git a/src/routes/auth/signup.ts b/src/routes/auth/signup.ts index 4b765f8..6a5d5d1 100644 --- a/src/routes/auth/signup.ts +++ b/src/routes/auth/signup.ts @@ -1,6 +1,6 @@ import { auth } from "@/lib/auth/lucia"; import { Context } from "hono"; -import * as validate from "@/lib/regex/accountValidation"; +// import * as validate from "@/lib/regex/accountValidation"; export const signup = async (c: Context) => { const formData = await c.req.formData(); @@ -18,22 +18,9 @@ export const signup = async (c: Context) => { if (validSession) return c.json({ success: false, state: "already logged in" }, 200); - if (secretKeyRequiredForSignup !== secretKey) { - return c.json( - { - success: false, - status: "error", - error: "Invalid secret key", - }, - 400 - ); - } - if ( - !validate.username(username) || - !validate.password(password) || - !validate.email(email) || - password !== passwordConfirm + secretKeyRequiredForSignup !== secretKey || + passwordConfirm !== password ) { return c.json( { @@ -45,6 +32,8 @@ export const signup = async (c: Context) => { ); } + console.log("creating user"); + try { const user = await auth(c.env).createUser({ key: { @@ -68,9 +57,18 @@ export const signup = async (c: Context) => { }, }); + const userAgentHash = await crypto.subtle.digest( + { name: "MD5" }, + new TextEncoder().encode(c.req.headers.get("user-agent") ?? "") + ); + const countryCode = c.req.headers.get("cf-ipcountry") ?? ""; + const newSession = await auth(c.env).createSession({ userId: user.userId, - attributes: {}, + attributes: { + country_code: countryCode, + user_agent_hash: userAgentHash, + }, }); const authRequest = auth(c.env).handleRequest(c); diff --git a/src/routes/auth/validate.ts b/src/routes/auth/validate.ts index 78157e2..39e4ef5 100644 --- a/src/routes/auth/validate.ts +++ b/src/routes/auth/validate.ts @@ -10,12 +10,29 @@ export const validate = async (c: Context): Promise => { const session = await authRequest.validate(); + const userAgentHash = await crypto.subtle.digest( + { name: "MD5" }, + new TextEncoder().encode(c.req.headers.get("user-agent") ?? "") + ); + const countryCode = c.req.headers.get("cf-ipcountry") ?? ""; + if (!session) { + authRequest.setSession(null); + return c.json({ success: false, state: "invalid session" }, 200); + } + + if ( + session.userAgentHash !== userAgentHash || + session.countryCode !== countryCode + ) { + await auth(c.env).invalidateSession(session.sessionId); + authRequest.setSession(null); return c.json({ success: false, state: "invalid session" }, 200); } if (session.state === "idle") { await auth(c.env).invalidateSession(session.sessionId); + authRequest.setSession(null); return c.json({ success: false, state: "invalid session" }, 200); } From 7d2e2bbf44c11d1b7127c98204cf8e0bb709f7b3 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Wed, 23 Aug 2023 23:32:10 +0100 Subject: [PATCH 049/318] upd lucia to sqlite, begin migration to drizzle --- README.md | 6 +- drizzle.config.ts | 12 +- package.json | 36 +- pnpm-lock.yaml | 2068 ++++------------- src/{lib => db}/drizzle.ts | 11 +- src/db/migrations/meta/_journal.json | 1 - src/db/migrations/schema.ts | 262 --- src/db/schema.ts | 366 +++ src/db/turso.ts | 22 + src/index.ts | 6 +- src/lib/auth/lucia.ts | 20 +- src/lib/helpers/responses/notFoundResponse.ts | 14 +- src/lib/planetscale.ts | 28 - src/lib/query.ts | 2 +- src/lucia.d.ts | 5 +- src/routes/asset/downloadAsset.ts | 35 +- src/routes/asset/getAssetFromId.ts | 82 +- src/routes/auth/authRoute.ts | 7 +- src/routes/auth/login.ts | 12 +- src/routes/auth/logout.ts | 5 +- src/routes/auth/signup.ts | 14 +- src/routes/auth/updateUserAttributes.ts | 32 + src/routes/auth/validate.ts | 15 +- src/routes/discord/contributors.ts | 3 +- src/routes/games/allGames.ts | 21 +- src/routes/oc-generators/getGenerator.ts | 9 +- src/routes/oc-generators/getGenerators.ts | 3 +- src/routes/search/asset/assetSearch.ts | 5 +- src/routes/user/getUserByUsername.ts | 63 +- src/routes/user/getUsersBySearch.ts | 42 +- src/routes/user/userRoute.ts | 2 +- src/worker-configuration.d.ts | 7 +- 32 files changed, 1012 insertions(+), 2204 deletions(-) rename src/{lib => db}/drizzle.ts (53%) delete mode 100644 src/db/migrations/meta/_journal.json delete mode 100644 src/db/migrations/schema.ts create mode 100644 src/db/schema.ts create mode 100644 src/db/turso.ts delete mode 100644 src/lib/planetscale.ts create mode 100644 src/routes/auth/updateUserAttributes.ts diff --git a/README.md b/README.md index 209a547..23f07b3 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,9 @@ ![Banner] -![Quality] ![API Response] ![CDN Response] +![Quality] -Source code for the API powering [**wanderer.moe**](https://wanderer.moe) — using **Cloudflare Workers** and **Hono** with **R2 Storage** for the CDN, and **Planetscale** for the Database. +Source code for the API powering [**wanderer.moe**](https://wanderer.moe) — using **Cloudflare Workers** and **Hono** with **R2 Storage** for the CDN, **Turso** and **Drizzle** for the Database. @@ -40,8 +40,6 @@ You will need to setup environment variables for the Discord Bot Token for `/con [Banner]: https://files.catbox.moe/qa3eus.svg [API Status]: https://status.wanderer.moe/history/api [CDN Status]: https://status.wanderer.moe/history/cdn -[API Response]: https://img.shields.io/endpoint?label=API%20Response&style=for-the-badge&url=https%3A%2F%2Fraw.githubusercontent.com%2Fwanderer-moe%2Fstatus%2FHEAD%2Fapi%2Fapi%2Fresponse-time.json -[CDN Response]: https://img.shields.io/endpoint?label=CDN%20Response&style=for-the-badge&url=https%3A%2F%2Fraw.githubusercontent.com%2Fwanderer-moe%2Fstatus%2FHEAD%2Fapi%2Fcdn%2Fresponse-time.json [Quality]: https://img.shields.io/codefactor/grade/github/wanderer-moe/api?label=quality&style=for-the-badge [Cloudflare API Token]: https://dash.cloudflare.com/profile/api-tokens [Dromzeh]: https://github.com/dromzeh diff --git a/drizzle.config.ts b/drizzle.config.ts index e14981a..334f708 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -1,16 +1,10 @@ -import "dotenv/config"; - import type { Config } from "drizzle-kit"; export default { out: "./src/db/migrations", schema: "./src/db/schema.ts", + driver: "turso", breakpoints: true, - driver: "mysql2", - dbCredentials: { - host: process.env.DATABASE_HOST || "", - user: process.env.DATABASE_USERNAME || "", - password: process.env.DATABASE_PASSWORD || "", - database: "planetscale", - }, + strict: true, + verbose: true, } satisfies Config; diff --git a/package.json b/package.json index 88ea841..308b094 100644 --- a/package.json +++ b/package.json @@ -8,34 +8,30 @@ "lint": "eslint . --ext .ts", "prettier:check": "prettier --check .", "typecheck": "tsc --noEmit", - "prisma:generate": "npx prisma generate --accelerate", - "prisma:push": "npx prisma db push" + "drizzle:generate": "drizzle-kit generate:sqlite" }, "devDependencies": { - "@cloudflare/workers-types": "^4.20230807.0", - "@types/node": "^20.4.8", - "eslint": "^8.46.0", + "@cloudflare/workers-types": "^4.20230821.0", + "@types/node": "^20.5.3", + "dotenv": "^16.3.1", + "drizzle-kit": "^0.19.13", + "eslint": "^8.47.0", "eslint-config-google": "^0.14.0", "eslint-plugin-json": "^3.1.0", + "tsx": "^3.12.7", "typescript": "^5.1.6", - "wrangler": "3.4.0" + "wrangler": "3.5.1" }, "private": true, "dependencies": { - "@aws-sdk/client-s3": "^3.386.0", - "@lucia-auth/adapter-mysql": "^2.0.0", - "@lucia-auth/adapter-prisma": "^3.0.1", - "@planetscale/database": "^1.10.0", - "@prisma/client": "^5.1.1", - "@typescript-eslint/eslint-plugin": "^6.3.0", - "dotenv": "^16.3.1", - "drizzle-kit": "^0.19.12", - "drizzle-orm": "^0.28.1", - "hono": "^3.4.1", - "lucia": "^2.2.0", + "@libsql/client": "^0.3.1", + "@lucia-auth/adapter-sqlite": "^2.0.0", + "@typescript-eslint/eslint-plugin": "^6.4.1", + "drizzle-orm": "^0.28.3", + "hono": "^3.5.1", + "lucia": "^2.4.0", "mysql2": "^3.6.0", - "prettier": "^3.0.1", - "render2": "^1.2.1", - "resend": "^0.17.2" + "prettier": "^3.0.2", + "resend": "^1.0.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8ee6445..b2451d8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,74 +5,65 @@ settings: excludeLinksFromLockfile: false dependencies: - "@aws-sdk/client-s3": - specifier: ^3.386.0 - version: 3.386.0 - "@lucia-auth/adapter-mysql": + "@libsql/client": + specifier: ^0.3.1 + version: 0.3.1 + "@lucia-auth/adapter-sqlite": specifier: ^2.0.0 - version: 2.0.0(@planetscale/database@1.10.0)(lucia@2.2.0)(mysql2@3.6.0) - "@lucia-auth/adapter-prisma": - specifier: ^3.0.1 - version: 3.0.1(@prisma/client@5.1.1)(lucia@2.2.0) - "@planetscale/database": - specifier: ^1.10.0 - version: 1.10.0 - "@prisma/client": - specifier: ^5.1.1 - version: 5.1.1 + version: 2.0.0(@libsql/client@0.3.1)(lucia@2.4.0) "@typescript-eslint/eslint-plugin": - specifier: ^6.3.0 - version: 6.3.0(@typescript-eslint/parser@6.3.0)(eslint@8.46.0)(typescript@5.1.6) - dotenv: - specifier: ^16.3.1 - version: 16.3.1 - drizzle-kit: - specifier: ^0.19.12 - version: 0.19.12 + specifier: ^6.4.1 + version: 6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.1.6) drizzle-orm: - specifier: ^0.28.1 - version: 0.28.1(@cloudflare/workers-types@4.20230807.0)(@planetscale/database@1.10.0)(mysql2@3.6.0) + specifier: ^0.28.3 + version: 0.28.3(@cloudflare/workers-types@4.20230821.0)(@libsql/client@0.3.1)(mysql2@3.6.0) hono: - specifier: ^3.4.1 - version: 3.4.1 + specifier: ^3.5.1 + version: 3.5.1 lucia: - specifier: ^2.2.0 - version: 2.2.0 + specifier: ^2.4.0 + version: 2.4.0 mysql2: specifier: ^3.6.0 version: 3.6.0 prettier: - specifier: ^3.0.1 - version: 3.0.1 - render2: - specifier: ^1.2.1 - version: 1.2.1 + specifier: ^3.0.2 + version: 3.0.2 resend: - specifier: ^0.17.2 - version: 0.17.2 + specifier: ^1.0.0 + version: 1.0.0 devDependencies: "@cloudflare/workers-types": - specifier: ^4.20230807.0 - version: 4.20230807.0 + specifier: ^4.20230821.0 + version: 4.20230821.0 "@types/node": - specifier: ^20.4.8 - version: 20.4.8 + specifier: ^20.5.3 + version: 20.5.3 + dotenv: + specifier: ^16.3.1 + version: 16.3.1 + drizzle-kit: + specifier: ^0.19.13 + version: 0.19.13 eslint: - specifier: ^8.46.0 - version: 8.46.0 + specifier: ^8.47.0 + version: 8.47.0 eslint-config-google: specifier: ^0.14.0 - version: 0.14.0(eslint@8.46.0) + version: 0.14.0(eslint@8.47.0) eslint-plugin-json: specifier: ^3.1.0 version: 3.1.0 + tsx: + specifier: ^3.12.7 + version: 3.12.7 typescript: specifier: ^5.1.6 version: 5.1.6 wrangler: - specifier: 3.4.0 - version: 3.4.0 + specifier: 3.5.1 + version: 3.5.1 packages: /@aashutoshrathi/word-wrap@1.2.6: @@ -82,646 +73,6 @@ packages: } engines: { node: ">=0.10.0" } - /@aws-crypto/crc32@3.0.0: - resolution: - { - integrity: sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==, - } - dependencies: - "@aws-crypto/util": 3.0.0 - "@aws-sdk/types": 3.378.0 - tslib: 1.14.1 - dev: false - - /@aws-crypto/crc32c@3.0.0: - resolution: - { - integrity: sha512-ENNPPManmnVJ4BTXlOjAgD7URidbAznURqD0KvfREyc4o20DPYdEldU1f5cQ7Jbj0CJJSPaMIk/9ZshdB3210w==, - } - dependencies: - "@aws-crypto/util": 3.0.0 - "@aws-sdk/types": 3.378.0 - tslib: 1.14.1 - dev: false - - /@aws-crypto/ie11-detection@3.0.0: - resolution: - { - integrity: sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==, - } - dependencies: - tslib: 1.14.1 - dev: false - - /@aws-crypto/sha1-browser@3.0.0: - resolution: - { - integrity: sha512-NJth5c997GLHs6nOYTzFKTbYdMNA6/1XlKVgnZoaZcQ7z7UJlOgj2JdbHE8tiYLS3fzXNCguct77SPGat2raSw==, - } - dependencies: - "@aws-crypto/ie11-detection": 3.0.0 - "@aws-crypto/supports-web-crypto": 3.0.0 - "@aws-crypto/util": 3.0.0 - "@aws-sdk/types": 3.378.0 - "@aws-sdk/util-locate-window": 3.310.0 - "@aws-sdk/util-utf8-browser": 3.259.0 - tslib: 1.14.1 - dev: false - - /@aws-crypto/sha256-browser@3.0.0: - resolution: - { - integrity: sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==, - } - dependencies: - "@aws-crypto/ie11-detection": 3.0.0 - "@aws-crypto/sha256-js": 3.0.0 - "@aws-crypto/supports-web-crypto": 3.0.0 - "@aws-crypto/util": 3.0.0 - "@aws-sdk/types": 3.378.0 - "@aws-sdk/util-locate-window": 3.310.0 - "@aws-sdk/util-utf8-browser": 3.259.0 - tslib: 1.14.1 - dev: false - - /@aws-crypto/sha256-js@3.0.0: - resolution: - { - integrity: sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==, - } - dependencies: - "@aws-crypto/util": 3.0.0 - "@aws-sdk/types": 3.378.0 - tslib: 1.14.1 - dev: false - - /@aws-crypto/supports-web-crypto@3.0.0: - resolution: - { - integrity: sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==, - } - dependencies: - tslib: 1.14.1 - dev: false - - /@aws-crypto/util@3.0.0: - resolution: - { - integrity: sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==, - } - dependencies: - "@aws-sdk/types": 3.378.0 - "@aws-sdk/util-utf8-browser": 3.259.0 - tslib: 1.14.1 - dev: false - - /@aws-sdk/client-s3@3.386.0: - resolution: - { - integrity: sha512-c9c7bm3fsZwvl8pffl6OXUtxlLD1FVr8GM+0Pu+J2R76B5NkDsIvvVUa2fTcNjc0jVkvB6EkvUE4WfOCdKqEDQ==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@aws-crypto/sha1-browser": 3.0.0 - "@aws-crypto/sha256-browser": 3.0.0 - "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.386.0 - "@aws-sdk/credential-provider-node": 3.386.0 - "@aws-sdk/middleware-bucket-endpoint": 3.378.0 - "@aws-sdk/middleware-expect-continue": 3.378.0 - "@aws-sdk/middleware-flexible-checksums": 3.383.0 - "@aws-sdk/middleware-host-header": 3.379.1 - "@aws-sdk/middleware-location-constraint": 3.379.1 - "@aws-sdk/middleware-logger": 3.378.0 - "@aws-sdk/middleware-recursion-detection": 3.378.0 - "@aws-sdk/middleware-sdk-s3": 3.379.1 - "@aws-sdk/middleware-signing": 3.379.1 - "@aws-sdk/middleware-ssec": 3.378.0 - "@aws-sdk/middleware-user-agent": 3.386.0 - "@aws-sdk/signature-v4-multi-region": 3.378.0 - "@aws-sdk/types": 3.378.0 - "@aws-sdk/util-endpoints": 3.386.0 - "@aws-sdk/util-user-agent-browser": 3.378.0 - "@aws-sdk/util-user-agent-node": 3.378.0 - "@aws-sdk/xml-builder": 3.310.0 - "@smithy/config-resolver": 2.0.2 - "@smithy/eventstream-serde-browser": 2.0.2 - "@smithy/eventstream-serde-config-resolver": 2.0.2 - "@smithy/eventstream-serde-node": 2.0.2 - "@smithy/fetch-http-handler": 2.0.2 - "@smithy/hash-blob-browser": 2.0.2 - "@smithy/hash-node": 2.0.2 - "@smithy/hash-stream-node": 2.0.2 - "@smithy/invalid-dependency": 2.0.2 - "@smithy/md5-js": 2.0.2 - "@smithy/middleware-content-length": 2.0.2 - "@smithy/middleware-endpoint": 2.0.2 - "@smithy/middleware-retry": 2.0.2 - "@smithy/middleware-serde": 2.0.2 - "@smithy/middleware-stack": 2.0.0 - "@smithy/node-config-provider": 2.0.2 - "@smithy/node-http-handler": 2.0.2 - "@smithy/protocol-http": 2.0.2 - "@smithy/smithy-client": 2.0.2 - "@smithy/types": 2.1.0 - "@smithy/url-parser": 2.0.2 - "@smithy/util-base64": 2.0.0 - "@smithy/util-body-length-browser": 2.0.0 - "@smithy/util-body-length-node": 2.0.0 - "@smithy/util-defaults-mode-browser": 2.0.2 - "@smithy/util-defaults-mode-node": 2.0.2 - "@smithy/util-retry": 2.0.0 - "@smithy/util-stream": 2.0.2 - "@smithy/util-utf8": 2.0.0 - "@smithy/util-waiter": 2.0.2 - fast-xml-parser: 4.2.5 - tslib: 2.6.1 - transitivePeerDependencies: - - "@aws-sdk/signature-v4-crt" - - aws-crt - dev: false - - /@aws-sdk/client-sso@3.386.0: - resolution: - { - integrity: sha512-UBgRo0q/XSle9CHCpoFhzq9wCfdc4kJw40cpPoHJPbb5m3JMcDu0mq4LTY7Nwnoy9jBThfRVYf3EF2BMF8fo6A==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@aws-crypto/sha256-browser": 3.0.0 - "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/middleware-host-header": 3.379.1 - "@aws-sdk/middleware-logger": 3.378.0 - "@aws-sdk/middleware-recursion-detection": 3.378.0 - "@aws-sdk/middleware-user-agent": 3.386.0 - "@aws-sdk/types": 3.378.0 - "@aws-sdk/util-endpoints": 3.386.0 - "@aws-sdk/util-user-agent-browser": 3.378.0 - "@aws-sdk/util-user-agent-node": 3.378.0 - "@smithy/config-resolver": 2.0.2 - "@smithy/fetch-http-handler": 2.0.2 - "@smithy/hash-node": 2.0.2 - "@smithy/invalid-dependency": 2.0.2 - "@smithy/middleware-content-length": 2.0.2 - "@smithy/middleware-endpoint": 2.0.2 - "@smithy/middleware-retry": 2.0.2 - "@smithy/middleware-serde": 2.0.2 - "@smithy/middleware-stack": 2.0.0 - "@smithy/node-config-provider": 2.0.2 - "@smithy/node-http-handler": 2.0.2 - "@smithy/protocol-http": 2.0.2 - "@smithy/smithy-client": 2.0.2 - "@smithy/types": 2.1.0 - "@smithy/url-parser": 2.0.2 - "@smithy/util-base64": 2.0.0 - "@smithy/util-body-length-browser": 2.0.0 - "@smithy/util-body-length-node": 2.0.0 - "@smithy/util-defaults-mode-browser": 2.0.2 - "@smithy/util-defaults-mode-node": 2.0.2 - "@smithy/util-retry": 2.0.0 - "@smithy/util-utf8": 2.0.0 - tslib: 2.6.1 - transitivePeerDependencies: - - aws-crt - dev: false - - /@aws-sdk/client-sts@3.386.0: - resolution: - { - integrity: sha512-VK+tdZaI971IDP/1WqpYNorf+Q5uoJTqcp3y/bQY4Hr5bf8N3aztDrX7a2GaA07zgSdUa82VkScMKzW31jhsxw==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@aws-crypto/sha256-browser": 3.0.0 - "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/credential-provider-node": 3.386.0 - "@aws-sdk/middleware-host-header": 3.379.1 - "@aws-sdk/middleware-logger": 3.378.0 - "@aws-sdk/middleware-recursion-detection": 3.378.0 - "@aws-sdk/middleware-sdk-sts": 3.379.1 - "@aws-sdk/middleware-signing": 3.379.1 - "@aws-sdk/middleware-user-agent": 3.386.0 - "@aws-sdk/types": 3.378.0 - "@aws-sdk/util-endpoints": 3.386.0 - "@aws-sdk/util-user-agent-browser": 3.378.0 - "@aws-sdk/util-user-agent-node": 3.378.0 - "@smithy/config-resolver": 2.0.2 - "@smithy/fetch-http-handler": 2.0.2 - "@smithy/hash-node": 2.0.2 - "@smithy/invalid-dependency": 2.0.2 - "@smithy/middleware-content-length": 2.0.2 - "@smithy/middleware-endpoint": 2.0.2 - "@smithy/middleware-retry": 2.0.2 - "@smithy/middleware-serde": 2.0.2 - "@smithy/middleware-stack": 2.0.0 - "@smithy/node-config-provider": 2.0.2 - "@smithy/node-http-handler": 2.0.2 - "@smithy/protocol-http": 2.0.2 - "@smithy/smithy-client": 2.0.2 - "@smithy/types": 2.1.0 - "@smithy/url-parser": 2.0.2 - "@smithy/util-base64": 2.0.0 - "@smithy/util-body-length-browser": 2.0.0 - "@smithy/util-body-length-node": 2.0.0 - "@smithy/util-defaults-mode-browser": 2.0.2 - "@smithy/util-defaults-mode-node": 2.0.2 - "@smithy/util-retry": 2.0.0 - "@smithy/util-utf8": 2.0.0 - fast-xml-parser: 4.2.5 - tslib: 2.6.1 - transitivePeerDependencies: - - aws-crt - dev: false - - /@aws-sdk/credential-provider-env@3.378.0: - resolution: - { - integrity: sha512-B2OVdO9kBClDwGgWTBLAQwFV8qYTYGyVujg++1FZFSFMt8ORFdZ5fNpErvJtiSjYiOOQMzyBeSNhKyYNXCiJjQ==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@aws-sdk/types": 3.378.0 - "@smithy/property-provider": 2.0.2 - "@smithy/types": 2.1.0 - tslib: 2.6.1 - dev: false - - /@aws-sdk/credential-provider-ini@3.386.0: - resolution: - { - integrity: sha512-TDeOFwCq6Ri58OP4CvVIAbc+iJPld7TpOFB+YYQ+q0ut+92zaVTNrNoWZkygPCXKmeHUGZcwC9Mjt/4L+fBAkg==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@aws-sdk/credential-provider-env": 3.378.0 - "@aws-sdk/credential-provider-process": 3.378.0 - "@aws-sdk/credential-provider-sso": 3.386.0 - "@aws-sdk/credential-provider-web-identity": 3.378.0 - "@aws-sdk/types": 3.378.0 - "@smithy/credential-provider-imds": 2.0.2 - "@smithy/property-provider": 2.0.2 - "@smithy/shared-ini-file-loader": 2.0.2 - "@smithy/types": 2.1.0 - tslib: 2.6.1 - transitivePeerDependencies: - - aws-crt - dev: false - - /@aws-sdk/credential-provider-node@3.386.0: - resolution: - { - integrity: sha512-dvYSN+T1B96TqiZE5tBV8bHCNU6TKq5meeI06AdClHz3VPvPKDN/EL0undXpl/GnlvuhKUftmVwdUBefG3otZA==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@aws-sdk/credential-provider-env": 3.378.0 - "@aws-sdk/credential-provider-ini": 3.386.0 - "@aws-sdk/credential-provider-process": 3.378.0 - "@aws-sdk/credential-provider-sso": 3.386.0 - "@aws-sdk/credential-provider-web-identity": 3.378.0 - "@aws-sdk/types": 3.378.0 - "@smithy/credential-provider-imds": 2.0.2 - "@smithy/property-provider": 2.0.2 - "@smithy/shared-ini-file-loader": 2.0.2 - "@smithy/types": 2.1.0 - tslib: 2.6.1 - transitivePeerDependencies: - - aws-crt - dev: false - - /@aws-sdk/credential-provider-process@3.378.0: - resolution: - { - integrity: sha512-KFTIy7u+wXj3eDua4rgS0tODzMnXtXhAm1RxzCW9FL5JLBBrd82ymCj1Dp72217Sw5Do6NjCnDTTNkCHZMA77w==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@aws-sdk/types": 3.378.0 - "@smithy/property-provider": 2.0.2 - "@smithy/shared-ini-file-loader": 2.0.2 - "@smithy/types": 2.1.0 - tslib: 2.6.1 - dev: false - - /@aws-sdk/credential-provider-sso@3.386.0: - resolution: - { - integrity: sha512-7PvtrxMFpphQP8D5Zu5WpqZ/p7FBWiOQ2UQhzGKEry/9JIyTKiIZWsCu7OIWcfEx8RqSnLu3pDydc6HSTNs+lw==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@aws-sdk/client-sso": 3.386.0 - "@aws-sdk/token-providers": 3.386.0 - "@aws-sdk/types": 3.378.0 - "@smithy/property-provider": 2.0.2 - "@smithy/shared-ini-file-loader": 2.0.2 - "@smithy/types": 2.1.0 - tslib: 2.6.1 - transitivePeerDependencies: - - aws-crt - dev: false - - /@aws-sdk/credential-provider-web-identity@3.378.0: - resolution: - { - integrity: sha512-GWjydOszhc4xDF8xuPtBvboglXQr0gwCW1oHAvmLcOT38+Hd6qnKywnMSeoXYRPgoKfF9TkWQgW1jxplzCG0UA==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@aws-sdk/types": 3.378.0 - "@smithy/property-provider": 2.0.2 - "@smithy/types": 2.1.0 - tslib: 2.6.1 - dev: false - - /@aws-sdk/middleware-bucket-endpoint@3.378.0: - resolution: - { - integrity: sha512-3o+AYU6JWUsPM49bWglCUOgNvySiHkbIma0J6F9a68e30vEDD0FUQtKzyHPZkF7iYDyesEl166gYjwVNAmASzw==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@aws-sdk/types": 3.378.0 - "@aws-sdk/util-arn-parser": 3.310.0 - "@smithy/protocol-http": 2.0.2 - "@smithy/types": 2.1.0 - "@smithy/util-config-provider": 2.0.0 - tslib: 2.6.1 - dev: false - - /@aws-sdk/middleware-expect-continue@3.378.0: - resolution: - { - integrity: sha512-8maaNQvza3/IGDbIyVQkUbGlo+Oc6SY1gVG50UMcTUX8nwZrD1/ko+ft+pd2EDb2n+0JritoDj4bjr6pdesNBg==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@aws-sdk/types": 3.378.0 - "@smithy/protocol-http": 2.0.2 - "@smithy/types": 2.1.0 - tslib: 2.6.1 - dev: false - - /@aws-sdk/middleware-flexible-checksums@3.383.0: - resolution: - { - integrity: sha512-RxIuby6Nz4pgKqNtt9Rdr2gWtOLrl9shZrteVuPh42n/dSOtCIhsG0fffKqy247I6oUghicoVJK9v0mxfINu/w==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@aws-crypto/crc32": 3.0.0 - "@aws-crypto/crc32c": 3.0.0 - "@aws-sdk/types": 3.378.0 - "@smithy/is-array-buffer": 2.0.0 - "@smithy/protocol-http": 2.0.2 - "@smithy/types": 2.1.0 - "@smithy/util-utf8": 2.0.0 - tslib: 2.6.1 - dev: false - - /@aws-sdk/middleware-host-header@3.379.1: - resolution: - { - integrity: sha512-LI4KpAFWNWVr2aH2vRVblr0Y8tvDz23lj8LOmbDmCrzd5M21nxuocI/8nEAQj55LiTIf9Zs+dHCdsyegnFXdrA==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@aws-sdk/types": 3.378.0 - "@smithy/protocol-http": 2.0.2 - "@smithy/types": 2.1.0 - tslib: 2.6.1 - dev: false - - /@aws-sdk/middleware-location-constraint@3.379.1: - resolution: - { - integrity: sha512-+bmy8DjX9jtqJk8WiDaHoP9M5ZcqjHSJf4mkv8IUZ/FNTUl9j6Dll//bG/JxuAw5e5shtCDjmZ027W5d9ITp0g==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@aws-sdk/types": 3.378.0 - "@smithy/types": 2.1.0 - tslib: 2.6.1 - dev: false - - /@aws-sdk/middleware-logger@3.378.0: - resolution: - { - integrity: sha512-l1DyaDLm3KeBMNMuANI3scWh8Xvu248x+vw6Z7ExWOhGXFmQ1MW7YvASg/SdxWkhlF9HmkkTif1LdMB22x6QDA==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@aws-sdk/types": 3.378.0 - "@smithy/types": 2.1.0 - tslib: 2.6.1 - dev: false - - /@aws-sdk/middleware-recursion-detection@3.378.0: - resolution: - { - integrity: sha512-mUMfHAz0oGNIWiTZHTVJb+I515Hqs2zx1j36Le4MMiiaMkPW1SRUF1FIwGuc1wh6E8jB5q+XfEMriDjRi4TZRA==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@aws-sdk/types": 3.378.0 - "@smithy/protocol-http": 2.0.2 - "@smithy/types": 2.1.0 - tslib: 2.6.1 - dev: false - - /@aws-sdk/middleware-sdk-s3@3.379.1: - resolution: - { - integrity: sha512-NVHRpNLfkHCqr3CE1Bmlf8Fhys8lL78kDX7UONnTZXvSiSXmCS7EbNtGDghZ8IKi+V9S/ifB4sLsX3tfzY0i6Q==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@aws-sdk/types": 3.378.0 - "@aws-sdk/util-arn-parser": 3.310.0 - "@smithy/protocol-http": 2.0.2 - "@smithy/types": 2.1.0 - tslib: 2.6.1 - dev: false - - /@aws-sdk/middleware-sdk-sts@3.379.1: - resolution: - { - integrity: sha512-SK3gSyT0XbLiY12+AjLFYL9YngxOXHnZF3Z33Cdd4a+AUYrVBV7JBEEGD1Nlwrcmko+3XgaKlmgUaR5s91MYvg==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@aws-sdk/middleware-signing": 3.379.1 - "@aws-sdk/types": 3.378.0 - "@smithy/types": 2.1.0 - tslib: 2.6.1 - dev: false - - /@aws-sdk/middleware-signing@3.379.1: - resolution: - { - integrity: sha512-kBk2ZUvR84EM4fICjr8K+Ykpf8SI1UzzPp2/UVYZ0X+4H/ZCjfSqohGRwHykMqeplne9qHSL7/rGJs1H3l3gPg==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@aws-sdk/types": 3.378.0 - "@smithy/property-provider": 2.0.2 - "@smithy/protocol-http": 2.0.2 - "@smithy/signature-v4": 2.0.2 - "@smithy/types": 2.1.0 - "@smithy/util-middleware": 2.0.0 - tslib: 2.6.1 - dev: false - - /@aws-sdk/middleware-ssec@3.378.0: - resolution: - { - integrity: sha512-WDT2LOd6OxlY1zkrRG9ZtW2vFms/dsqMg9VyE88RKG2oATxSXEhkr5zLbNVh3TyuUKnV9jydate56d/ECwHOHg==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@aws-sdk/types": 3.378.0 - "@smithy/types": 2.1.0 - tslib: 2.6.1 - dev: false - - /@aws-sdk/middleware-user-agent@3.386.0: - resolution: - { - integrity: sha512-h6nVr5dvzrSLM+5BGbyqISh1p2NoTNv0+IZkMcGyig2jpdhbkMOPvvoOGMg16/cmelUQCguT26Jr7WYpLFDsTg==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@aws-sdk/types": 3.378.0 - "@aws-sdk/util-endpoints": 3.386.0 - "@smithy/protocol-http": 2.0.2 - "@smithy/types": 2.1.0 - tslib: 2.6.1 - dev: false - - /@aws-sdk/signature-v4-multi-region@3.378.0: - resolution: - { - integrity: sha512-gtuABS7EeYZQeNzTrabY3Ruv4wWmoz4u8OMSGl47gYPDWA70WYEZ0aoi4zSGuKhXiqtVvTsO9wGEMIInwV5phQ==, - } - engines: { node: ">=14.0.0" } - peerDependencies: - "@aws-sdk/signature-v4-crt": ^3.118.0 - peerDependenciesMeta: - "@aws-sdk/signature-v4-crt": - optional: true - dependencies: - "@aws-sdk/types": 3.378.0 - "@smithy/protocol-http": 2.0.2 - "@smithy/signature-v4": 2.0.2 - "@smithy/types": 2.1.0 - tslib: 2.6.1 - dev: false - - /@aws-sdk/token-providers@3.386.0: - resolution: - { - integrity: sha512-DStdqBtpO0FRC4mDCIPtrpLCFMnYJFo4cYlUyr9CKvKvh2IzPMU4rsKQjUhtmzdjLEvPTAcdfRx2Q9/sJkfe9Q==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@aws-sdk/types": 3.378.0 - "@smithy/property-provider": 2.0.2 - "@smithy/shared-ini-file-loader": 2.0.2 - "@smithy/types": 2.1.0 - tslib: 2.6.1 - dev: false - - /@aws-sdk/types@3.378.0: - resolution: - { - integrity: sha512-qP0CvR/ItgktmN8YXpGQglzzR/6s0nrsQ4zIfx3HMwpsBTwuouYahcCtF1Vr82P4NFcoDA412EJahJ2pIqEd+w==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@smithy/types": 2.1.0 - tslib: 2.6.1 - dev: false - - /@aws-sdk/util-arn-parser@3.310.0: - resolution: - { - integrity: sha512-jL8509owp/xB9+Or0pvn3Fe+b94qfklc2yPowZZIFAkFcCSIdkIglz18cPDWnYAcy9JGewpMS1COXKIUhZkJsA==, - } - engines: { node: ">=14.0.0" } - dependencies: - tslib: 2.6.1 - dev: false - - /@aws-sdk/util-endpoints@3.386.0: - resolution: - { - integrity: sha512-FDQRC9f78Kx12KsR43MukLRfqF3BNz5VfFdKP9ZYx3KK+bMjU1czjmjOS8bNMJWYM1Sn+nobBpPS3e2uupBtpg==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@aws-sdk/types": 3.378.0 - tslib: 2.6.1 - dev: false - - /@aws-sdk/util-locate-window@3.310.0: - resolution: - { - integrity: sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==, - } - engines: { node: ">=14.0.0" } - dependencies: - tslib: 2.6.1 - dev: false - - /@aws-sdk/util-user-agent-browser@3.378.0: - resolution: - { - integrity: sha512-FSCpagzftK1W+m7Ar6lpX7/Gr9y5P56nhFYz8U4EYQ4PkufS6czWX9YW+/FA5OYV0vlQ/SvPqMnzoHIPUNhZrQ==, - } - dependencies: - "@aws-sdk/types": 3.378.0 - "@smithy/types": 2.1.0 - bowser: 2.11.0 - tslib: 2.6.1 - dev: false - - /@aws-sdk/util-user-agent-node@3.378.0: - resolution: - { - integrity: sha512-IdwVJV0E96MkJeFte4dlWqvB+oiqCiZ5lOlheY3W9NynTuuX0GGYNC8Y9yIsV8Oava1+ujpJq0ww6qXdYxmO4A==, - } - engines: { node: ">=14.0.0" } - peerDependencies: - aws-crt: ">=1.0.0" - peerDependenciesMeta: - aws-crt: - optional: true - dependencies: - "@aws-sdk/types": 3.378.0 - "@smithy/node-config-provider": 2.0.2 - "@smithy/types": 2.1.0 - tslib: 2.6.1 - dev: false - - /@aws-sdk/util-utf8-browser@3.259.0: - resolution: - { - integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==, - } - dependencies: - tslib: 2.6.1 - dev: false - - /@aws-sdk/xml-builder@3.310.0: - resolution: - { - integrity: sha512-TqELu4mOuSIKQCqj63fGVs86Yh+vBx5nHRpWKNUNhB2nPTpfbziTs5c1X358be3peVWA4wPxW7Nt53KIg1tnNw==, - } - engines: { node: ">=14.0.0" } - dependencies: - tslib: 2.6.1 - dev: false - /@cloudflare/kv-asset-handler@0.2.0: resolution: { @@ -731,10 +82,10 @@ packages: mime: 3.0.0 dev: true - /@cloudflare/workerd-darwin-64@1.20230724.0: + /@cloudflare/workerd-darwin-64@1.20230814.1: resolution: { - integrity: sha512-DQmFZWHhs8waQFYRb/Z8QmbitAvBMXnbUMUentp+3lS4eCYI0/iurTaQDiz5+ldUn9FTxD+1XuYZlTHzVNxoHw==, + integrity: sha512-aQUO7q7qXl+SVtOiMMlVKLNOSeL6GX43RKeflwzsD74dGgyHPiSfw5KCvXhkVbyN7u+yYF6HyFdaIvHLfn5jyA==, } engines: { node: ">=16" } cpu: [x64] @@ -743,10 +94,10 @@ packages: dev: true optional: true - /@cloudflare/workerd-darwin-arm64@1.20230724.0: + /@cloudflare/workerd-darwin-arm64@1.20230814.1: resolution: { - integrity: sha512-C7T0v/lMjEX7c4iROSZKgIF1eGw3+sj/gFpBD6xwxfbIcrKBjncMypeLQNpRTCdBQr1W3sNpg9jagwuVX5ByZQ==, + integrity: sha512-U2mcgi+AiuI/4EY5Wk/GmygiNoCNw/V2mcHmxESqe4r6XbJYOzBdEsjnqJ05rqd0JlEM8m64jRtE6/qBnQHygg==, } engines: { node: ">=16" } cpu: [arm64] @@ -755,10 +106,10 @@ packages: dev: true optional: true - /@cloudflare/workerd-linux-64@1.20230724.0: + /@cloudflare/workerd-linux-64@1.20230814.1: resolution: { - integrity: sha512-o0F/hj73UXOQwkPkYqZuIxpjG8gAs2eoAGqxX1HSIYRf7iUhfFcPrupwjqlNqf7Oo1h46M+sClSFjr/ZU/LCjg==, + integrity: sha512-Q4kITXLTCuG2i2Z01fbb5AjVRRIf3+lS4ZVsFbTbIwtcOOG4Ozcw7ee7tKsFES7hFqR4Eg9gMG4/aS0mmi+L2g==, } engines: { node: ">=16" } cpu: [x64] @@ -767,10 +118,10 @@ packages: dev: true optional: true - /@cloudflare/workerd-linux-arm64@1.20230724.0: + /@cloudflare/workerd-linux-arm64@1.20230814.1: resolution: { - integrity: sha512-UpzCoo7LOuPWxFPw84TZQTPIawIDQNSb3XnC6ffMjUH/FVwHmHdngIFZxW+xjLHKMIzGNAqSn3eRHekKgO3QqA==, + integrity: sha512-BX5SaksXw+pkREVw3Rw2eSNXplqZw+14CcwW/5x/4oq/C6yn5qCvKxJfM7pukJGMI4wkJPOYops7B3g27FB/HA==, } engines: { node: ">=16" } cpu: [arm64] @@ -779,10 +130,10 @@ packages: dev: true optional: true - /@cloudflare/workerd-windows-64@1.20230724.0: + /@cloudflare/workerd-windows-64@1.20230814.1: resolution: { - integrity: sha512-wVpPNu19fnvgsD8V6NiGPSuET0bzKmgn3wJ6RwAwQA+GQ0hdDIDVYd13aImhgO6jLfQvkduCDxeZluGZ7PPojQ==, + integrity: sha512-GWHqfyhsG/1wm2W8afkYX3q3fWXUWWD8NGtHfAs6ZVTHdW3mmYyMhKR0lc6ptBwz5i5aXRlP2S+CxxxwwDbKpw==, } engines: { node: ">=16" } cpu: [x64] @@ -791,10 +142,10 @@ packages: dev: true optional: true - /@cloudflare/workers-types@4.20230807.0: + /@cloudflare/workers-types@4.20230821.0: resolution: { - integrity: sha512-gQczWuGE2rxmpzOCNn0zLbx8Xz0gqspdE9S7tu4Xax39q1csgO/E9flcS+KG3GHB522ugOh84inmABDhpeJnvQ==, + integrity: sha512-lVQSyr5E4CEkQw7WIdsrMTj+kHjsm28mJ0B5AhNFByKR+16KTFsU/RW/nGLKHHW2jxT5lvYI+HjNQMzC9QR8Ng==, } /@drizzle-team/studio@0.0.5: @@ -802,7 +153,17 @@ packages: { integrity: sha512-ps5qF0tMxWRVu+V5gvCRrQNqlY92aTnIKdq27gm9LZMSdaKYZt6AVvSK1dlUMzs6Rt0Jm80b+eWct6xShBKhIw==, } - dev: false + dev: true + + /@esbuild-kit/cjs-loader@2.4.2: + resolution: + { + integrity: sha512-BDXFbYOJzT/NBEtp71cvsrGPwGAMGRB/349rwKuoxNSiKjPraNNnlK6MIIabViCjqZugu6j+xeMDlEkWdHHJSg==, + } + dependencies: + "@esbuild-kit/core-utils": 3.1.0 + get-tsconfig: 4.7.0 + dev: true /@esbuild-kit/core-utils@3.1.0: resolution: @@ -812,7 +173,7 @@ packages: dependencies: esbuild: 0.17.19 source-map-support: 0.5.21 - dev: false + dev: true /@esbuild-kit/esm-loader@2.5.5: resolution: @@ -821,8 +182,8 @@ packages: } dependencies: "@esbuild-kit/core-utils": 3.1.0 - get-tsconfig: 4.6.2 - dev: false + get-tsconfig: 4.7.0 + dev: true /@esbuild-plugins/node-globals-polyfill@0.1.1(esbuild@0.16.3): resolution: @@ -869,7 +230,7 @@ packages: cpu: [arm64] os: [android] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/android-arm64@0.18.20: @@ -881,7 +242,7 @@ packages: cpu: [arm64] os: [android] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/android-arm@0.16.3: @@ -905,7 +266,7 @@ packages: cpu: [arm] os: [android] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/android-arm@0.18.20: @@ -917,7 +278,7 @@ packages: cpu: [arm] os: [android] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/android-x64@0.16.3: @@ -941,7 +302,7 @@ packages: cpu: [x64] os: [android] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/android-x64@0.18.20: @@ -953,7 +314,7 @@ packages: cpu: [x64] os: [android] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/darwin-arm64@0.16.3: @@ -977,7 +338,7 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/darwin-arm64@0.18.20: @@ -989,7 +350,7 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/darwin-x64@0.16.3: @@ -1013,7 +374,7 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/darwin-x64@0.18.20: @@ -1025,7 +386,7 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/freebsd-arm64@0.16.3: @@ -1049,7 +410,7 @@ packages: cpu: [arm64] os: [freebsd] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/freebsd-arm64@0.18.20: @@ -1061,7 +422,7 @@ packages: cpu: [arm64] os: [freebsd] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/freebsd-x64@0.16.3: @@ -1085,7 +446,7 @@ packages: cpu: [x64] os: [freebsd] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/freebsd-x64@0.18.20: @@ -1097,7 +458,7 @@ packages: cpu: [x64] os: [freebsd] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/linux-arm64@0.16.3: @@ -1121,7 +482,7 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/linux-arm64@0.18.20: @@ -1133,7 +494,7 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/linux-arm@0.16.3: @@ -1157,7 +518,7 @@ packages: cpu: [arm] os: [linux] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/linux-arm@0.18.20: @@ -1169,7 +530,7 @@ packages: cpu: [arm] os: [linux] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/linux-ia32@0.16.3: @@ -1193,7 +554,7 @@ packages: cpu: [ia32] os: [linux] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/linux-ia32@0.18.20: @@ -1205,7 +566,7 @@ packages: cpu: [ia32] os: [linux] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/linux-loong64@0.16.3: @@ -1229,7 +590,7 @@ packages: cpu: [loong64] os: [linux] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/linux-loong64@0.18.20: @@ -1241,7 +602,7 @@ packages: cpu: [loong64] os: [linux] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/linux-mips64el@0.16.3: @@ -1265,7 +626,7 @@ packages: cpu: [mips64el] os: [linux] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/linux-mips64el@0.18.20: @@ -1277,7 +638,7 @@ packages: cpu: [mips64el] os: [linux] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/linux-ppc64@0.16.3: @@ -1301,7 +662,7 @@ packages: cpu: [ppc64] os: [linux] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/linux-ppc64@0.18.20: @@ -1313,7 +674,7 @@ packages: cpu: [ppc64] os: [linux] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/linux-riscv64@0.16.3: @@ -1337,7 +698,7 @@ packages: cpu: [riscv64] os: [linux] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/linux-riscv64@0.18.20: @@ -1349,7 +710,7 @@ packages: cpu: [riscv64] os: [linux] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/linux-s390x@0.16.3: @@ -1373,7 +734,7 @@ packages: cpu: [s390x] os: [linux] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/linux-s390x@0.18.20: @@ -1385,7 +746,7 @@ packages: cpu: [s390x] os: [linux] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/linux-x64@0.16.3: @@ -1409,7 +770,7 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/linux-x64@0.18.20: @@ -1421,7 +782,7 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/netbsd-x64@0.16.3: @@ -1445,7 +806,7 @@ packages: cpu: [x64] os: [netbsd] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/netbsd-x64@0.18.20: @@ -1457,7 +818,7 @@ packages: cpu: [x64] os: [netbsd] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/openbsd-x64@0.16.3: @@ -1481,7 +842,7 @@ packages: cpu: [x64] os: [openbsd] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/openbsd-x64@0.18.20: @@ -1493,7 +854,7 @@ packages: cpu: [x64] os: [openbsd] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/sunos-x64@0.16.3: @@ -1517,7 +878,7 @@ packages: cpu: [x64] os: [sunos] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/sunos-x64@0.18.20: @@ -1529,7 +890,7 @@ packages: cpu: [x64] os: [sunos] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/win32-arm64@0.16.3: @@ -1553,7 +914,7 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/win32-arm64@0.18.20: @@ -1565,7 +926,7 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/win32-ia32@0.16.3: @@ -1589,7 +950,7 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/win32-ia32@0.18.20: @@ -1601,7 +962,7 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/win32-x64@0.16.3: @@ -1625,7 +986,7 @@ packages: cpu: [x64] os: [win32] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/win32-x64@0.18.20: @@ -1637,10 +998,10 @@ packages: cpu: [x64] os: [win32] requiresBuild: true - dev: false + dev: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.46.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.47.0): resolution: { integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, @@ -1649,27 +1010,27 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.46.0 - eslint-visitor-keys: 3.4.2 + eslint: 8.47.0 + eslint-visitor-keys: 3.4.3 - /@eslint-community/regexpp@4.6.2: + /@eslint-community/regexpp@4.7.0: resolution: { - integrity: sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==, + integrity: sha512-+HencqxU7CFJnQb7IKtuNBqS6Yx3Tz4kOL8BJXo+JyeiBm5MEX6pO8onXDkjrkCRlfYXS1Axro15ZjVFe9YgsA==, } engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } - /@eslint/eslintrc@2.1.1: + /@eslint/eslintrc@2.1.2: resolution: { - integrity: sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA==, + integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dependencies: ajv: 6.12.6 debug: 4.3.4 espree: 9.6.1 - globals: 13.20.0 + globals: 13.21.0 ignore: 5.2.4 import-fresh: 3.3.0 js-yaml: 4.1.0 @@ -1678,10 +1039,10 @@ packages: transitivePeerDependencies: - supports-color - /@eslint/js@8.46.0: + /@eslint/js@8.47.0: resolution: { - integrity: sha512-a8TLtmPi8xzPkCbp/OGFUo5yhRkHM2Ko9kOWP4znJr0WAhWyThaw3PnwX4vOTWOAMsV2uRt32PPDcEz63esSaA==, + integrity: sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } @@ -1711,714 +1072,180 @@ packages: integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==, } - /@lucia-auth/adapter-mysql@2.0.0(@planetscale/database@1.10.0)(lucia@2.2.0)(mysql2@3.6.0): + /@libsql/client@0.3.1: resolution: { - integrity: sha512-8a4JZ3VjDyRu/mAop2hEt/jOJO2HXwWIAid6a4wGiR8wgnlyOws9brRc+/wxQHSOlWUlrWemrfDvXLs5mMtkeQ==, + integrity: sha512-43/zF8fJguXd6ENwYhddpbR05bDVx3BQQUZ/BsJ0b4zLJge+WFa2smC3ILVGqvVu4ZoixbC0sfLTdVPdd2NjDA==, } - peerDependencies: - "@planetscale/database": ^1.0.0 - lucia: ^2.0.0 - mysql2: ^3.0.0 - peerDependenciesMeta: - "@planetscale/database": - optional: true - mysql2: - optional: true dependencies: - "@planetscale/database": 1.10.0 - lucia: 2.2.0 - mysql2: 3.6.0 + "@libsql/hrana-client": 0.4.4 + better-sqlite3: 8.5.1 + js-base64: 3.7.5 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate dev: false - /@lucia-auth/adapter-prisma@3.0.1(@prisma/client@5.1.1)(lucia@2.2.0): + /@libsql/hrana-client@0.4.4: resolution: { - integrity: sha512-JZNl+721M5ApjtNiH+WUYstiC8cffcI/Y9IzKsa0uUhQMIHl2ObCrgO0R3fgHnjWHBjhQoK36g/r/iSJIDppBA==, + integrity: sha512-BevUg0UBRLs5AEqn0fjrMcl49xCtwuFavgK4MzCb3PTtxpEbQ24oGXctspN9drBiUVmqSZr7go887aiLLzSO3A==, } - peerDependencies: - "@prisma/client": ^4.2.0 || ^5.0.0 - lucia: ^2.0.0 dependencies: - "@prisma/client": 5.1.1 - lucia: 2.2.0 + "@libsql/isomorphic-fetch": 0.1.6 + "@libsql/isomorphic-ws": 0.1.3 + js-base64: 3.7.5 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate dev: false - /@nodelib/fs.scandir@2.1.5: + /@libsql/isomorphic-fetch@0.1.6: resolution: { - integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, + integrity: sha512-8qhxEDmVBDb54E9xdW1xqw3zLNShkMZpf5YQU3PvwjtKNLOPde59Oqez+RnZHsYkt9zQxxOF+7gSHVJeP/UWqg==, } - engines: { node: ">= 8" } - dependencies: - "@nodelib/fs.stat": 2.0.5 - run-parallel: 1.2.0 - - /@nodelib/fs.stat@2.0.5: - resolution: - { - integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, - } - engines: { node: ">= 8" } - - /@nodelib/fs.walk@1.2.8: - resolution: - { - integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, - } - engines: { node: ">= 8" } dependencies: - "@nodelib/fs.scandir": 2.1.5 - fastq: 1.15.0 - - /@one-ini/wasm@0.1.1: - resolution: - { - integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==, - } + "@types/node-fetch": 2.6.4 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding dev: false - /@planetscale/database@1.10.0: + /@libsql/isomorphic-ws@0.1.3: resolution: { - integrity: sha512-XMfNRjIPgGTga6g1YpGr7E21CcnHZcHZdyhRUIiZ/AlpD+ts65UF2B3wKjcu7MKMynmmcOGs6R9kAT6D1OTlZQ==, + integrity: sha512-54dZXgYwWDKsnfWv8GCVYvhn6RDlqFDGAc8EQMd941yvGMsGzo06Gn6Iyjw//nJ1iJO97FbXgoQ1apikoFD/WA==, } - engines: { node: ">=16" } + dependencies: + "@types/ws": 8.5.5 + ws: 8.13.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate dev: false - /@prisma/client@5.1.1: + /@lucia-auth/adapter-sqlite@2.0.0(@libsql/client@0.3.1)(lucia@2.4.0): resolution: { - integrity: sha512-fxcCeK5pMQGcgCqCrWsi+I2rpIbk0rAhdrN+ke7f34tIrgPwA68ensrpin+9+fZvuV2OtzHmuipwduSY6HswdA==, + integrity: sha512-Hiy8WND/1mi25r0M2ruSml+Ab5GJLr4XZEHApYw1lxybF+VlPUyX7oTtIVCSgvq/SWiP/tvnyPwnXAPmNr8/bg==, } - engines: { node: ">=16.13" } - requiresBuild: true peerDependencies: - prisma: "*" + "@libsql/client": ^0.3.0 + better-sqlite3: ^8.0.0 + lucia: ^2.0.0 peerDependenciesMeta: - prisma: + "@libsql/client": + optional: true + better-sqlite3: optional: true dependencies: - "@prisma/engines-version": 5.1.1-1.6a3747c37ff169c90047725a05a6ef02e32ac97e - dev: false - - /@prisma/engines-version@5.1.1-1.6a3747c37ff169c90047725a05a6ef02e32ac97e: - resolution: - { - integrity: sha512-owZqbY/wucbr65bXJ/ljrHPgQU5xXTSkmcE/JcbqE1kusuAXV/TLN3/exmz21SZ5rJ7WDkyk70J2G/n68iogbQ==, - } - dev: false - - /@react-email/render@0.0.7: - resolution: - { - integrity: sha512-hMMhxk6TpOcDC5qnKzXPVJoVGEwfm+U5bGOPH+MyTTlx0F02RLQygcATBKsbP7aI/mvkmBAZoFbgPIHop7ovug==, - } - engines: { node: ">=16.0.0" } - dependencies: - html-to-text: 9.0.3 - pretty: 2.0.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@selderee/plugin-htmlparser2@0.10.0: - resolution: - { - integrity: sha512-gW69MEamZ4wk1OsOq1nG1jcyhXIQcnrsX5JwixVw/9xaiav8TCyjESAruu1Rz9yyInhgBXxkNwMeygKnN2uxNA==, - } - dependencies: - domhandler: 5.0.3 - selderee: 0.10.0 - dev: false - - /@smithy/abort-controller@2.0.2: - resolution: - { - integrity: sha512-ln5Cob0mksym62sLr7NiPOSqJ0jKao4qjfcNLDdgINM1lQI12hXrZBlKdPHbXJqpKhKiECDgonMoqCM8bigq4g==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@smithy/types": 2.1.0 - tslib: 2.6.1 - dev: false - - /@smithy/chunked-blob-reader-native@2.0.0: - resolution: - { - integrity: sha512-HM8V2Rp1y8+1343tkZUKZllFhEQPNmpNdgFAncbTsxkZ18/gqjk23XXv3qGyXWp412f3o43ZZ1UZHVcHrpRnCQ==, - } - dependencies: - "@smithy/util-base64": 2.0.0 - tslib: 2.6.1 - dev: false - - /@smithy/chunked-blob-reader@2.0.0: - resolution: - { - integrity: sha512-k+J4GHJsMSAIQPChGBrjEmGS+WbPonCXesoqP9fynIqjn7rdOThdH8FAeCmokP9mxTYKQAKoHCLPzNlm6gh7Wg==, - } - dependencies: - tslib: 2.6.1 - dev: false - - /@smithy/config-resolver@2.0.2: - resolution: - { - integrity: sha512-0kdsqBL6BdmSbdU6YaDkodVBMua5MuQQluC3nocJ7OJ6PnOuM7i2FEQHE46LBadLqT+CimlDSM+6j91uHNL1ng==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@smithy/types": 2.1.0 - "@smithy/util-config-provider": 2.0.0 - "@smithy/util-middleware": 2.0.0 - tslib: 2.6.1 - dev: false - - /@smithy/credential-provider-imds@2.0.2: - resolution: - { - integrity: sha512-mbWFYEZ00LBRDk3WvcXViwpdpkJQcfrM3seuKzFxZnF6wIBLMwrcWcsj+OUC/1L+86m8aQY9imXMAaQsAoGxow==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@smithy/node-config-provider": 2.0.2 - "@smithy/property-provider": 2.0.2 - "@smithy/types": 2.1.0 - "@smithy/url-parser": 2.0.2 - tslib: 2.6.1 - dev: false - - /@smithy/eventstream-codec@2.0.2: - resolution: - { - integrity: sha512-PQZiKx7fMnNwx4zxcUCm82VjnqK6wV4MEHSmMy3taj5dKfXV782IjRGyaDT+8TsmNqVdZIkve5zLRAzh+7kOhA==, - } - dependencies: - "@aws-crypto/crc32": 3.0.0 - "@smithy/types": 2.1.0 - "@smithy/util-hex-encoding": 2.0.0 - tslib: 2.6.1 - dev: false - - /@smithy/eventstream-serde-browser@2.0.2: - resolution: - { - integrity: sha512-qaHlcFI+ILE+gZV2B/aZMVXc9LG4v1Owa20dHlP0dLOiJ9WByOjtD2qZmYA/HO4qkkDZHEL/0baWc63aqLCHKQ==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@smithy/eventstream-serde-universal": 2.0.2 - "@smithy/types": 2.1.0 - tslib: 2.6.1 - dev: false - - /@smithy/eventstream-serde-config-resolver@2.0.2: - resolution: - { - integrity: sha512-iVC7/NFNWfSXllAxFNUuC4QlREdZjMmAOdISb6fwny/4mUDt1EtYLCrXq7gN1mIzhRPwMpL9YvQ8jpgvfA0Jdw==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@smithy/types": 2.1.0 - tslib: 2.6.1 - dev: false - - /@smithy/eventstream-serde-node@2.0.2: - resolution: - { - integrity: sha512-p7py8jDpIS1bRewskwgEgJx1OkFvockA2bJnXtOAPJib42DtyRpp8oV14s2ZpjMq57r9KMCQy2j02g554DNavg==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@smithy/eventstream-serde-universal": 2.0.2 - "@smithy/types": 2.1.0 - tslib: 2.6.1 - dev: false - - /@smithy/eventstream-serde-universal@2.0.2: - resolution: - { - integrity: sha512-zf/hm5VIDsvl+XpI1rop4xwXLKiBUe5pxgjRFdHi7AC1p6Zc8uJfyCExLiMUP/QspoIrVV1xGwFFxRCeddDH3g==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@smithy/eventstream-codec": 2.0.2 - "@smithy/types": 2.1.0 - tslib: 2.6.1 - dev: false - - /@smithy/fetch-http-handler@2.0.2: - resolution: - { - integrity: sha512-Wo2m1RaiXNSLF4J3D62LpdSoj/YYb+6tn0H8is1tSrzr7eXAdiYVBc0wIa23N0wT4zmN0iG/yNY6gTCDQ6799A==, - } - dependencies: - "@smithy/protocol-http": 2.0.2 - "@smithy/querystring-builder": 2.0.2 - "@smithy/types": 2.1.0 - "@smithy/util-base64": 2.0.0 - tslib: 2.6.1 - dev: false - - /@smithy/hash-blob-browser@2.0.2: - resolution: - { - integrity: sha512-CmVGWbiyiEySGDRg3o2C3DLZYW+mH8fMoIEZrmwnBM8bQsepZGOME40tbpvv12BIhZIInJV8srMMHpQ6aKObLA==, - } - dependencies: - "@smithy/chunked-blob-reader": 2.0.0 - "@smithy/chunked-blob-reader-native": 2.0.0 - "@smithy/types": 2.1.0 - tslib: 2.6.1 - dev: false - - /@smithy/hash-node@2.0.2: - resolution: - { - integrity: sha512-JKDzZ1YVR7JzOBaJoWy3ToJCE86OQE6D4kOBvvVsu93a3lcF9kv6KYTKBYEWAjwOn/CpK4NH7mKB01OQ8H+aiA==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@smithy/types": 2.1.0 - "@smithy/util-buffer-from": 2.0.0 - "@smithy/util-utf8": 2.0.0 - tslib: 2.6.1 - dev: false - - /@smithy/hash-stream-node@2.0.2: - resolution: - { - integrity: sha512-cDfGE81BbykXKZ50+eLU5Yat8WGiDFQpNa+5S3AfDIzz5h4D73DpxWwcwV4qYB7GoAw2chFqTCAGWgU/MgRS9g==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@smithy/types": 2.1.0 - "@smithy/util-utf8": 2.0.0 - tslib: 2.6.1 - dev: false - - /@smithy/invalid-dependency@2.0.2: - resolution: - { - integrity: sha512-inQZQ5gCO3WRWuXpsc1YJ4KBjsvj2qsoU32yTIKznBWTCQe/D5Dp+sSaysqBqxe0VTZ+8nFEHdUMWUX2BxQThw==, - } - dependencies: - "@smithy/types": 2.1.0 - tslib: 2.6.1 - dev: false - - /@smithy/is-array-buffer@2.0.0: - resolution: - { - integrity: sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==, - } - engines: { node: ">=14.0.0" } - dependencies: - tslib: 2.6.1 - dev: false - - /@smithy/md5-js@2.0.2: - resolution: - { - integrity: sha512-qm9845tzkYOm3HM/nFiZVMsA9nE7klO69T1qrrbrQKpUJpEFV87XDInbnRpYzBAFUH4DRodbZ9spEnjF7ffoww==, - } - dependencies: - "@smithy/types": 2.1.0 - "@smithy/util-utf8": 2.0.0 - tslib: 2.6.1 - dev: false - - /@smithy/middleware-content-length@2.0.2: - resolution: - { - integrity: sha512-FmHlNfuvYgDZE3fIx0G3rD/wLXfAmBYE4mVc/w6d7RllA7TygPzq2pfHL1iCMzWkWTdoAVnt3h4aavAZnhaxEQ==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@smithy/protocol-http": 2.0.2 - "@smithy/types": 2.1.0 - tslib: 2.6.1 - dev: false - - /@smithy/middleware-endpoint@2.0.2: - resolution: - { - integrity: sha512-ropE7/c+g22QeluZ+By/B/WvVep0UFreX+IeRMGIO7EbOUPgqtJRXpbJFdG6JKB1uC+CdaJLn4MnZnVBpcyjuA==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@smithy/middleware-serde": 2.0.2 - "@smithy/types": 2.1.0 - "@smithy/url-parser": 2.0.2 - "@smithy/util-middleware": 2.0.0 - tslib: 2.6.1 - dev: false - - /@smithy/middleware-retry@2.0.2: - resolution: - { - integrity: sha512-wtBUXqtZVriiXppYaFkUrybAPhFVX7vebnW/yVPliLMWMcguOMS58qhOYPZe3t9Wki2+mASfyu+kO3An8lAg2A==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@smithy/protocol-http": 2.0.2 - "@smithy/service-error-classification": 2.0.0 - "@smithy/types": 2.1.0 - "@smithy/util-middleware": 2.0.0 - "@smithy/util-retry": 2.0.0 - tslib: 2.6.1 - uuid: 8.3.2 - dev: false - - /@smithy/middleware-serde@2.0.2: - resolution: - { - integrity: sha512-Kw9xLdlueIaivUWslKB67WZ/cCUg3QnzYVIA3t5KfgsseEEuU4UxXw8NSTvIt71gqQloY+Um8ugS+idgxrWWnw==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@smithy/types": 2.1.0 - tslib: 2.6.1 - dev: false - - /@smithy/middleware-stack@2.0.0: - resolution: - { - integrity: sha512-31XC1xNF65nlbc16yuh3wwTudmqs6qy4EseQUGF8A/p2m/5wdd/cnXJqpniy/XvXVwkHPz/GwV36HqzHtIKATQ==, - } - engines: { node: ">=14.0.0" } - dependencies: - tslib: 2.6.1 - dev: false - - /@smithy/node-config-provider@2.0.2: - resolution: - { - integrity: sha512-9wVJccASfuCctNWrzR0zrDkf0ox3HCHGEhFlWL2LBoghUYuK28pVRBbG69wvnkhlHnB8dDZHagxH+Nq9dm7eWw==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@smithy/property-provider": 2.0.2 - "@smithy/shared-ini-file-loader": 2.0.2 - "@smithy/types": 2.1.0 - tslib: 2.6.1 - dev: false - - /@smithy/node-http-handler@2.0.2: - resolution: - { - integrity: sha512-lpZjmtmyZqSAtMPsbrLhb7XoAQ2kAHeuLY/csW6I2k+QyFvOk7cZeQsqEngWmZ9SJaeYiDCBINxAIM61i5WGLw==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@smithy/abort-controller": 2.0.2 - "@smithy/protocol-http": 2.0.2 - "@smithy/querystring-builder": 2.0.2 - "@smithy/types": 2.1.0 - tslib: 2.6.1 - dev: false - - /@smithy/property-provider@2.0.2: - resolution: - { - integrity: sha512-DfaZ8cO+d/mgnMzIllcXcU4OYP+omiOl2LYdn/fTGpw/EAQSVzscYV2muV3sDDnuPYQ/r014hUqIxnF+pzh+SQ==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@smithy/types": 2.1.0 - tslib: 2.6.1 - dev: false - - /@smithy/protocol-http@2.0.2: - resolution: - { - integrity: sha512-qWu8g1FUy+m36KpO1sREJSF7BaLmjw9AqOuwxLVVSdYz+nUQjc9tFAZ9LB6jJXKdsZFSjfkjHJBbhD78QdE7Rw==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@smithy/types": 2.1.0 - tslib: 2.6.1 - dev: false - - /@smithy/querystring-builder@2.0.2: - resolution: - { - integrity: sha512-H99LOMWEssfwqkOoTs4Y12UiZ7CTGQSX5Nrx5UkYgRbUEpC1GnnaprHiYrqclC58/xr4K76aNchdPyioxewMzA==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@smithy/types": 2.1.0 - "@smithy/util-uri-escape": 2.0.0 - tslib: 2.6.1 - dev: false - - /@smithy/querystring-parser@2.0.2: - resolution: - { - integrity: sha512-L4VtKQ8O4/aWPQJbiFymbhAmxdfLnEaROh/Vs0OstJ7jtOZeBl2QJmuWY2V7hjt64W7V+tEn2sv6vVvnxkm/xQ==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@smithy/types": 2.1.0 - tslib: 2.6.1 - dev: false - - /@smithy/service-error-classification@2.0.0: - resolution: - { - integrity: sha512-2z5Nafy1O0cTf69wKyNjGW/sNVMiqDnb4jgwfMG8ye8KnFJ5qmJpDccwIbJNhXIfbsxTg9SEec2oe1cexhMJvw==, - } - engines: { node: ">=14.0.0" } - dev: false - - /@smithy/shared-ini-file-loader@2.0.2: - resolution: - { - integrity: sha512-2VkNOM/82u4vatVdK5nfusgGIlvR48Fkq6me17Oc+V1iyxfR/1x0pG6LzW0br1qlGtzBYFZKmDyviBRcPVFTVw==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@smithy/types": 2.1.0 - tslib: 2.6.1 - dev: false - - /@smithy/signature-v4@2.0.2: - resolution: - { - integrity: sha512-YMooDEw/UmGxcXY4qWnSXkbPFsRloluSvyXVT678YPDN/K2AS1GzKfRsvSU7fbccOB4WF8MHZf2UqcRGEltE3Q==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@smithy/eventstream-codec": 2.0.2 - "@smithy/is-array-buffer": 2.0.0 - "@smithy/types": 2.1.0 - "@smithy/util-hex-encoding": 2.0.0 - "@smithy/util-middleware": 2.0.0 - "@smithy/util-uri-escape": 2.0.0 - "@smithy/util-utf8": 2.0.0 - tslib: 2.6.1 - dev: false - - /@smithy/smithy-client@2.0.2: - resolution: - { - integrity: sha512-mDfokI8WwLU5C0gcQ4ww/zJI/WLGSh2+vdIA42JRnjfYUjJNH/rKfX9YOnn2eBOxl3loATERVUqkHmKe+P8s2Q==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@smithy/middleware-stack": 2.0.0 - "@smithy/types": 2.1.0 - "@smithy/util-stream": 2.0.2 - tslib: 2.6.1 - dev: false - - /@smithy/types@2.1.0: - resolution: - { - integrity: sha512-KLsCsqxX0j2l99iP8s0f7LBlcsp7a7ceXGn0LPYPyVOsqmIKvSaPQajq0YevlL4T9Bm+DtcyXfBTbtBcLX1I7A==, - } - engines: { node: ">=14.0.0" } - dependencies: - tslib: 2.6.1 - dev: false - - /@smithy/url-parser@2.0.2: - resolution: - { - integrity: sha512-X1mHCzrSVDlhVy7d3S7Vq+dTfYzwh4n7xGHhyJumu77nJqIss0lazVug85Pwo0DKIoO314wAOvMnBxNYDa+7wA==, - } - dependencies: - "@smithy/querystring-parser": 2.0.2 - "@smithy/types": 2.1.0 - tslib: 2.6.1 - dev: false - - /@smithy/util-base64@2.0.0: - resolution: - { - integrity: sha512-Zb1E4xx+m5Lud8bbeYi5FkcMJMnn+1WUnJF3qD7rAdXpaL7UjkFQLdmW5fHadoKbdHpwH9vSR8EyTJFHJs++tA==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@smithy/util-buffer-from": 2.0.0 - tslib: 2.6.1 - dev: false - - /@smithy/util-body-length-browser@2.0.0: - resolution: - { - integrity: sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==, - } - dependencies: - tslib: 2.6.1 - dev: false - - /@smithy/util-body-length-node@2.0.0: - resolution: - { - integrity: sha512-ZV7Z/WHTMxHJe/xL/56qZwSUcl63/5aaPAGjkfynJm4poILjdD4GmFI+V+YWabh2WJIjwTKZ5PNsuvPQKt93Mg==, - } - engines: { node: ">=14.0.0" } - dependencies: - tslib: 2.6.1 - dev: false - - /@smithy/util-buffer-from@2.0.0: - resolution: - { - integrity: sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==, - } - engines: { node: ">=14.0.0" } - dependencies: - "@smithy/is-array-buffer": 2.0.0 - tslib: 2.6.1 - dev: false - - /@smithy/util-config-provider@2.0.0: - resolution: - { - integrity: sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==, - } - engines: { node: ">=14.0.0" } - dependencies: - tslib: 2.6.1 - dev: false - - /@smithy/util-defaults-mode-browser@2.0.2: - resolution: - { - integrity: sha512-c2tMMjb624XLuzmlRoZpnFOkejVxcgw3WQKdmgdGZYZapcLzXyC0H9JhnXMjQCt30GqLTlsILRNVBYwFRbw/4Q==, - } - engines: { node: ">= 10.0.0" } - dependencies: - "@smithy/property-provider": 2.0.2 - "@smithy/types": 2.1.0 - bowser: 2.11.0 - tslib: 2.6.1 + "@libsql/client": 0.3.1 + lucia: 2.4.0 dev: false - /@smithy/util-defaults-mode-node@2.0.2: + /@nodelib/fs.scandir@2.1.5: resolution: { - integrity: sha512-gt7m5LLqUtEKldJLyc14DE4kb85vxwomvt9AfEMEvWM4VwfWS1kGJqiStZFb5KNqnQPXw8vvpgLTi8NrWAOXqg==, + integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, } - engines: { node: ">= 10.0.0" } + engines: { node: ">= 8" } dependencies: - "@smithy/config-resolver": 2.0.2 - "@smithy/credential-provider-imds": 2.0.2 - "@smithy/node-config-provider": 2.0.2 - "@smithy/property-provider": 2.0.2 - "@smithy/types": 2.1.0 - tslib: 2.6.1 - dev: false + "@nodelib/fs.stat": 2.0.5 + run-parallel: 1.2.0 - /@smithy/util-hex-encoding@2.0.0: + /@nodelib/fs.stat@2.0.5: resolution: { - integrity: sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==, + integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, } - engines: { node: ">=14.0.0" } - dependencies: - tslib: 2.6.1 - dev: false + engines: { node: ">= 8" } - /@smithy/util-middleware@2.0.0: + /@nodelib/fs.walk@1.2.8: resolution: { - integrity: sha512-eCWX4ECuDHn1wuyyDdGdUWnT4OGyIzV0LN1xRttBFMPI9Ff/4heSHVxneyiMtOB//zpXWCha1/SWHJOZstG7kA==, + integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, } - engines: { node: ">=14.0.0" } + engines: { node: ">= 8" } dependencies: - tslib: 2.6.1 - dev: false + "@nodelib/fs.scandir": 2.1.5 + fastq: 1.15.0 - /@smithy/util-retry@2.0.0: + /@one-ini/wasm@0.1.1: resolution: { - integrity: sha512-/dvJ8afrElasuiiIttRJeoS2sy8YXpksQwiM/TcepqdRVp7u4ejd9C4IQURHNjlfPUT7Y6lCDSa2zQJbdHhVTg==, + integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==, } - engines: { node: ">= 14.0.0" } - dependencies: - "@smithy/service-error-classification": 2.0.0 - tslib: 2.6.1 dev: false - /@smithy/util-stream@2.0.2: + /@react-email/render@0.0.7: resolution: { - integrity: sha512-Mg9IJcKIu4YKlbzvpp1KLvh4JZLdcPgpxk+LICuDwzZCfxe47R9enVK8dNEiuyiIGK2ExbfvzCVT8IBru62vZw==, + integrity: sha512-hMMhxk6TpOcDC5qnKzXPVJoVGEwfm+U5bGOPH+MyTTlx0F02RLQygcATBKsbP7aI/mvkmBAZoFbgPIHop7ovug==, } - engines: { node: ">=14.0.0" } + engines: { node: ">=16.0.0" } dependencies: - "@smithy/fetch-http-handler": 2.0.2 - "@smithy/node-http-handler": 2.0.2 - "@smithy/types": 2.1.0 - "@smithy/util-base64": 2.0.0 - "@smithy/util-buffer-from": 2.0.0 - "@smithy/util-hex-encoding": 2.0.0 - "@smithy/util-utf8": 2.0.0 - tslib: 2.6.1 + html-to-text: 9.0.3 + pretty: 2.0.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /@smithy/util-uri-escape@2.0.0: + /@selderee/plugin-htmlparser2@0.10.0: resolution: { - integrity: sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==, + integrity: sha512-gW69MEamZ4wk1OsOq1nG1jcyhXIQcnrsX5JwixVw/9xaiav8TCyjESAruu1Rz9yyInhgBXxkNwMeygKnN2uxNA==, } - engines: { node: ">=14.0.0" } dependencies: - tslib: 2.6.1 + domhandler: 5.0.3 + selderee: 0.10.0 dev: false - /@smithy/util-utf8@2.0.0: + /@types/json-schema@7.0.12: resolution: { - integrity: sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ==, + integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==, } - engines: { node: ">=14.0.0" } - dependencies: - "@smithy/util-buffer-from": 2.0.0 - tslib: 2.6.1 dev: false - /@smithy/util-waiter@2.0.2: + /@types/node-fetch@2.6.4: resolution: { - integrity: sha512-7XCEVXDLguf3Og0NIF/KYEAHtrzNXmCdtEwMfOXr4iBKOUWYzNj91YB9O7tLrct8VGvysGA0x2xYzbxMbvF0QQ==, + integrity: sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==, } - engines: { node: ">=14.0.0" } dependencies: - "@smithy/abort-controller": 2.0.2 - "@smithy/types": 2.1.0 - tslib: 2.6.1 + "@types/node": 20.5.3 + form-data: 3.0.1 dev: false - /@types/json-schema@7.0.12: + /@types/node@20.5.3: resolution: { - integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==, + integrity: sha512-ITI7rbWczR8a/S6qjAW7DMqxqFMjjTo61qZVWJ1ubPvbIQsL5D/TvwjYEalM8Kthpe3hTzOGrF2TGbAu2uyqeA==, } - dev: false - /@types/node@20.4.8: + /@types/semver@7.5.0: resolution: { - integrity: sha512-0mHckf6D2DiIAzh8fM8f3HQCvMKDpK94YQ0DSVkfWTG9BZleYIWudw9cJxX8oCk9bM+vAkDyujDV6dmKHbvQpg==, + integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==, } - dev: true + dev: false - /@types/semver@7.5.0: + /@types/ws@8.5.5: resolution: { - integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==, + integrity: sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==, } + dependencies: + "@types/node": 20.5.3 dev: false - /@typescript-eslint/eslint-plugin@6.3.0(@typescript-eslint/parser@6.3.0)(eslint@8.46.0)(typescript@5.1.6): + /@typescript-eslint/eslint-plugin@6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.1.6): resolution: { - integrity: sha512-IZYjYZ0ifGSLZbwMqIip/nOamFiWJ9AH+T/GYNZBWkVcyNQOFGtSMoWV7RvY4poYCMZ/4lHzNl796WOSNxmk8A==, + integrity: sha512-3F5PtBzUW0dYlq77Lcqo13fv+58KDwUib3BddilE8ajPJT+faGgxmI9Sw+I8ZS22BYwoir9ZhNXcLi+S+I2bkw==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -2429,29 +1256,28 @@ packages: typescript: optional: true dependencies: - "@eslint-community/regexpp": 4.6.2 - "@typescript-eslint/parser": 6.3.0(eslint@8.46.0)(typescript@5.1.6) - "@typescript-eslint/scope-manager": 6.3.0 - "@typescript-eslint/type-utils": 6.3.0(eslint@8.46.0)(typescript@5.1.6) - "@typescript-eslint/utils": 6.3.0(eslint@8.46.0)(typescript@5.1.6) - "@typescript-eslint/visitor-keys": 6.3.0 + "@eslint-community/regexpp": 4.7.0 + "@typescript-eslint/parser": 6.4.1(eslint@8.47.0)(typescript@5.1.6) + "@typescript-eslint/scope-manager": 6.4.1 + "@typescript-eslint/type-utils": 6.4.1(eslint@8.47.0)(typescript@5.1.6) + "@typescript-eslint/utils": 6.4.1(eslint@8.47.0)(typescript@5.1.6) + "@typescript-eslint/visitor-keys": 6.4.1 debug: 4.3.4 - eslint: 8.46.0 + eslint: 8.47.0 graphemer: 1.4.0 ignore: 5.2.4 natural-compare: 1.4.0 - natural-compare-lite: 1.4.0 semver: 7.5.4 - ts-api-utils: 1.0.1(typescript@5.1.6) + ts-api-utils: 1.0.2(typescript@5.1.6) typescript: 5.1.6 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/parser@6.3.0(eslint@8.46.0)(typescript@5.1.6): + /@typescript-eslint/parser@6.4.1(eslint@8.47.0)(typescript@5.1.6): resolution: { - integrity: sha512-ibP+y2Gr6p0qsUkhs7InMdXrwldjxZw66wpcQq9/PzAroM45wdwyu81T+7RibNCh8oc0AgrsyCwJByncY0Ongg==, + integrity: sha512-610G6KHymg9V7EqOaNBMtD1GgpAmGROsmfHJPXNLCU9bfIuLrkdOygltK784F6Crboyd5tBFayPB7Sf0McrQwg==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -2461,32 +1287,32 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/scope-manager": 6.3.0 - "@typescript-eslint/types": 6.3.0 - "@typescript-eslint/typescript-estree": 6.3.0(typescript@5.1.6) - "@typescript-eslint/visitor-keys": 6.3.0 + "@typescript-eslint/scope-manager": 6.4.1 + "@typescript-eslint/types": 6.4.1 + "@typescript-eslint/typescript-estree": 6.4.1(typescript@5.1.6) + "@typescript-eslint/visitor-keys": 6.4.1 debug: 4.3.4 - eslint: 8.46.0 + eslint: 8.47.0 typescript: 5.1.6 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/scope-manager@6.3.0: + /@typescript-eslint/scope-manager@6.4.1: resolution: { - integrity: sha512-WlNFgBEuGu74ahrXzgefiz/QlVb+qg8KDTpknKwR7hMH+lQygWyx0CQFoUmMn1zDkQjTBBIn75IxtWss77iBIQ==, + integrity: sha512-p/OavqOQfm4/Hdrr7kvacOSFjwQ2rrDVJRPxt/o0TOWdFnjJptnjnZ+sYDR7fi4OimvIuKp+2LCkc+rt9fIW+A==, } engines: { node: ^16.0.0 || >=18.0.0 } dependencies: - "@typescript-eslint/types": 6.3.0 - "@typescript-eslint/visitor-keys": 6.3.0 + "@typescript-eslint/types": 6.4.1 + "@typescript-eslint/visitor-keys": 6.4.1 dev: false - /@typescript-eslint/type-utils@6.3.0(eslint@8.46.0)(typescript@5.1.6): + /@typescript-eslint/type-utils@6.4.1(eslint@8.47.0)(typescript@5.1.6): resolution: { - integrity: sha512-7Oj+1ox1T2Yc8PKpBvOKWhoI/4rWFd1j7FA/rPE0lbBPXTKjdbtC+7Ev0SeBjEKkIhKWVeZSP+mR7y1Db1CdfQ==, + integrity: sha512-7ON8M8NXh73SGZ5XvIqWHjgX2f+vvaOarNliGhjrJnv1vdjG0LVIz+ToYfPirOoBi56jxAKLfsLm40+RvxVVXA==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -2496,28 +1322,28 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/typescript-estree": 6.3.0(typescript@5.1.6) - "@typescript-eslint/utils": 6.3.0(eslint@8.46.0)(typescript@5.1.6) + "@typescript-eslint/typescript-estree": 6.4.1(typescript@5.1.6) + "@typescript-eslint/utils": 6.4.1(eslint@8.47.0)(typescript@5.1.6) debug: 4.3.4 - eslint: 8.46.0 - ts-api-utils: 1.0.1(typescript@5.1.6) + eslint: 8.47.0 + ts-api-utils: 1.0.2(typescript@5.1.6) typescript: 5.1.6 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/types@6.3.0: + /@typescript-eslint/types@6.4.1: resolution: { - integrity: sha512-K6TZOvfVyc7MO9j60MkRNWyFSf86IbOatTKGrpTQnzarDZPYPVy0oe3myTMq7VjhfsUAbNUW8I5s+2lZvtx1gg==, + integrity: sha512-zAAopbNuYu++ijY1GV2ylCsQsi3B8QvfPHVqhGdDcbx/NK5lkqMnCGU53amAjccSpk+LfeONxwzUhDzArSfZJg==, } engines: { node: ^16.0.0 || >=18.0.0 } dev: false - /@typescript-eslint/typescript-estree@6.3.0(typescript@5.1.6): + /@typescript-eslint/typescript-estree@6.4.1(typescript@5.1.6): resolution: { - integrity: sha512-Xh4NVDaC4eYKY4O3QGPuQNp5NxBAlEvNQYOqJquR2MePNxO11E5K3t5x4M4Mx53IZvtpW+mBxIT0s274fLUocg==, + integrity: sha512-xF6Y7SatVE/OyV93h1xGgfOkHr2iXuo8ip0gbfzaKeGGuKiAnzS+HtVhSPx8Www243bwlW8IF7X0/B62SzFftg==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -2526,49 +1352,49 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/types": 6.3.0 - "@typescript-eslint/visitor-keys": 6.3.0 + "@typescript-eslint/types": 6.4.1 + "@typescript-eslint/visitor-keys": 6.4.1 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.4 - ts-api-utils: 1.0.1(typescript@5.1.6) + ts-api-utils: 1.0.2(typescript@5.1.6) typescript: 5.1.6 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/utils@6.3.0(eslint@8.46.0)(typescript@5.1.6): + /@typescript-eslint/utils@6.4.1(eslint@8.47.0)(typescript@5.1.6): resolution: { - integrity: sha512-hLLg3BZE07XHnpzglNBG8P/IXq/ZVXraEbgY7FM0Cnc1ehM8RMdn9mat3LubJ3KBeYXXPxV1nugWbQPjGeJk6Q==, + integrity: sha512-F/6r2RieNeorU0zhqZNv89s9bDZSovv3bZQpUNOmmQK1L80/cV4KEu95YUJWi75u5PhboFoKUJBnZ4FQcoqhDw==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.46.0) + "@eslint-community/eslint-utils": 4.4.0(eslint@8.47.0) "@types/json-schema": 7.0.12 "@types/semver": 7.5.0 - "@typescript-eslint/scope-manager": 6.3.0 - "@typescript-eslint/types": 6.3.0 - "@typescript-eslint/typescript-estree": 6.3.0(typescript@5.1.6) - eslint: 8.46.0 + "@typescript-eslint/scope-manager": 6.4.1 + "@typescript-eslint/types": 6.4.1 + "@typescript-eslint/typescript-estree": 6.4.1(typescript@5.1.6) + eslint: 8.47.0 semver: 7.5.4 transitivePeerDependencies: - supports-color - typescript dev: false - /@typescript-eslint/visitor-keys@6.3.0: + /@typescript-eslint/visitor-keys@6.4.1: resolution: { - integrity: sha512-kEhRRj7HnvaSjux1J9+7dBen15CdWmDnwrpyiHsFX6Qx2iW5LOBUgNefOFeh2PjWPlNwN8TOn6+4eBU3J/gupw==, + integrity: sha512-y/TyRJsbZPkJIZQXrHfdnxVnxyKegnpEvnRGNam7s3TRR2ykGefEWOhaef00/UUN3IZxizS7BTO3svd3lCOJRQ==, } engines: { node: ^16.0.0 || >=18.0.0 } dependencies: - "@typescript-eslint/types": 6.3.0 - eslint-visitor-keys: 3.4.2 + "@typescript-eslint/types": 6.4.1 + eslint-visitor-keys: 3.4.3 dev: false /abbrev@1.1.1: @@ -2672,19 +1498,6 @@ packages: } dev: false - /axios@1.4.0: - resolution: - { - integrity: sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==, - } - dependencies: - follow-redirects: 1.15.2 - form-data: 4.0.0 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - dev: false - /balanced-match@1.0.2: resolution: { @@ -2696,18 +1509,16 @@ packages: { integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, } - dev: true - /better-sqlite3@8.5.0: + /better-sqlite3@8.5.1: resolution: { - integrity: sha512-vbPcv/Hx5WYdyNg/NbcfyaBZyv9s/NVbxb7yCeC5Bq1pVocNxeL2tZmSu3Rlm4IEOTjYdGyzWQgyx0OSdORBzw==, + integrity: sha512-aDfC67xfll6bugnOqRJhdUWioQZnkhLkrwZ+oo6yZbNMtyktbwkDO4SfBcCVWbm4BlsCjCNTJchlHaBt+vB4Iw==, } requiresBuild: true dependencies: bindings: 1.5.0 prebuild-install: 7.1.1 - dev: true /binary-extensions@2.2.0: resolution: @@ -2724,7 +1535,6 @@ packages: } dependencies: file-uri-to-path: 1.0.0 - dev: true /bl@4.1.0: resolution: @@ -2735,7 +1545,6 @@ packages: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 - dev: true /blake3-wasm@2.1.5: resolution: @@ -2744,13 +1553,6 @@ packages: } dev: true - /bowser@2.11.0: - resolution: - { - integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==, - } - dev: false - /brace-expansion@1.1.11: resolution: { @@ -2767,7 +1569,6 @@ packages: } dependencies: balanced-match: 1.0.2 - dev: false /braces@3.0.2: resolution: @@ -2783,6 +1584,7 @@ packages: { integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, } + dev: true /buffer@5.7.1: resolution: @@ -2792,7 +1594,6 @@ packages: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - dev: true /busboy@1.6.0: resolution: @@ -2817,7 +1618,7 @@ packages: integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==, } engines: { node: ">=14.16" } - dev: false + dev: true /capnp-ts@0.7.0: resolution: @@ -2826,7 +1627,7 @@ packages: } dependencies: debug: 4.3.4 - tslib: 2.6.1 + tslib: 2.6.2 transitivePeerDependencies: - supports-color dev: true @@ -2847,7 +1648,7 @@ packages: integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==, } engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } - dev: false + dev: true /chokidar@3.5.3: resolution: @@ -2864,7 +1665,7 @@ packages: normalize-path: 3.0.0 readdirp: 3.6.0 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: true /chownr@1.1.4: @@ -2872,7 +1673,6 @@ packages: { integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==, } - dev: true /cli-color@2.0.3: resolution: @@ -2886,7 +1686,7 @@ packages: es6-iterator: 2.0.3 memoizee: 0.4.15 timers-ext: 0.1.7 - dev: false + dev: true /color-convert@2.0.1: resolution: @@ -2927,7 +1727,7 @@ packages: integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==, } engines: { node: ^12.20.0 || >=14 } - dev: false + dev: true /concat-map@0.0.1: resolution: @@ -2984,7 +1784,7 @@ packages: dependencies: es5-ext: 0.10.62 type: 1.2.0 - dev: false + dev: true /data-uri-to-buffer@2.0.2: resolution: @@ -3015,7 +1815,6 @@ packages: engines: { node: ">=10" } dependencies: mimic-response: 3.1.0 - dev: true /deep-extend@0.6.0: resolution: @@ -3023,7 +1822,6 @@ packages: integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==, } engines: { node: ">=4.0.0" } - dev: true /deep-is@0.1.4: resolution: @@ -3061,7 +1859,6 @@ packages: integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==, } engines: { node: ">=8" } - dev: true /difflib@0.2.4: resolution: @@ -3070,7 +1867,7 @@ packages: } dependencies: heap: 0.2.7 - dev: false + dev: true /dir-glob@3.0.1: resolution: @@ -3136,7 +1933,7 @@ packages: integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==, } engines: { node: ">=12" } - dev: false + dev: true /dreamopt@0.8.0: resolution: @@ -3146,12 +1943,12 @@ packages: engines: { node: ">=0.4.0" } dependencies: wordwrap: 1.0.0 - dev: false + dev: true - /drizzle-kit@0.19.12: + /drizzle-kit@0.19.13: resolution: { - integrity: sha512-rcsmh5gUIkvuD0WrbEc+aLpqY2q2J8ltynRcJiJo2l01hhsYvPnX0sgxWlFXlfAIa5ZXNw2nJZhYlslI6tG3MA==, + integrity: sha512-Rba5VW1O2JfJlwVBeZ8Zwt2E2us5oZ08PQBDiVSGlug53TOc8hzXjblZFuF+dnll9/RQEHrkzBmJFgqTvn5Rxg==, } hasBin: true dependencies: @@ -3166,15 +1963,15 @@ packages: hanji: 0.0.5 json-diff: 0.9.0 minimatch: 7.4.6 - zod: 3.21.4 + zod: 3.22.2 transitivePeerDependencies: - supports-color - dev: false + dev: true - /drizzle-orm@0.28.1(@cloudflare/workers-types@4.20230807.0)(@planetscale/database@1.10.0)(mysql2@3.6.0): + /drizzle-orm@0.28.3(@cloudflare/workers-types@4.20230821.0)(@libsql/client@0.3.1)(mysql2@3.6.0): resolution: { - integrity: sha512-6ms2pVxvkBJtuP1BZTUCzLLkr+iK/cNgd+tCw+I5/PoM8PB9kXaYoW9yNe/cnaXb0TLJ1gDEndDIyQdRX7zCdQ==, + integrity: sha512-7LwNEBJH5EFvkD0vm7RdKWDZsFP9CYR4AWN2fMwns/ezexoX3+UNoVOWGRPJf1qsj357SESldrNEueFvUDfZxA==, } peerDependencies: "@aws-sdk/client-rds-data": ">=3" @@ -3236,8 +2033,8 @@ packages: sqlite3: optional: true dependencies: - "@cloudflare/workers-types": 4.20230807.0 - "@planetscale/database": 1.10.0 + "@cloudflare/workers-types": 4.20230821.0 + "@libsql/client": 0.3.1 mysql2: 3.6.0 dev: false @@ -3262,7 +2059,6 @@ packages: } dependencies: once: 1.4.0 - dev: true /entities@4.5.0: resolution: @@ -3283,7 +2079,7 @@ packages: es6-iterator: 2.0.3 es6-symbol: 3.1.3 next-tick: 1.1.0 - dev: false + dev: true /es6-iterator@2.0.3: resolution: @@ -3294,7 +2090,7 @@ packages: d: 1.0.1 es5-ext: 0.10.62 es6-symbol: 3.1.3 - dev: false + dev: true /es6-symbol@3.1.3: resolution: @@ -3304,7 +2100,7 @@ packages: dependencies: d: 1.0.1 ext: 1.7.0 - dev: false + dev: true /es6-weak-map@2.0.3: resolution: @@ -3316,7 +2112,7 @@ packages: es5-ext: 0.10.62 es6-iterator: 2.0.3 es6-symbol: 3.1.3 - dev: false + dev: true /esbuild-register@3.4.2(esbuild@0.18.20): resolution: @@ -3330,7 +2126,7 @@ packages: esbuild: 0.18.20 transitivePeerDependencies: - supports-color - dev: false + dev: true /esbuild@0.16.3: resolution: @@ -3396,7 +2192,7 @@ packages: "@esbuild/win32-arm64": 0.17.19 "@esbuild/win32-ia32": 0.17.19 "@esbuild/win32-x64": 0.17.19 - dev: false + dev: true /esbuild@0.18.20: resolution: @@ -3429,7 +2225,7 @@ packages: "@esbuild/win32-arm64": 0.18.20 "@esbuild/win32-ia32": 0.18.20 "@esbuild/win32-x64": 0.18.20 - dev: false + dev: true /escape-string-regexp@4.0.0: resolution: @@ -3438,7 +2234,7 @@ packages: } engines: { node: ">=10" } - /eslint-config-google@0.14.0(eslint@8.46.0): + /eslint-config-google@0.14.0(eslint@8.47.0): resolution: { integrity: sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==, @@ -3447,7 +2243,7 @@ packages: peerDependencies: eslint: ">=5.16.0" dependencies: - eslint: 8.46.0 + eslint: 8.47.0 dev: true /eslint-plugin-json@3.1.0: @@ -3471,25 +2267,25 @@ packages: esrecurse: 4.3.0 estraverse: 5.3.0 - /eslint-visitor-keys@3.4.2: + /eslint-visitor-keys@3.4.3: resolution: { - integrity: sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==, + integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - /eslint@8.46.0: + /eslint@8.47.0: resolution: { - integrity: sha512-cIO74PvbW0qU8e0mIvk5IV3ToWdCq5FYG6gWPHHkx6gNdjlbAYvtfHmlCMXxjcoVaIdwy/IAt3+mDkZkfvb2Dg==, + integrity: sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } hasBin: true dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.46.0) - "@eslint-community/regexpp": 4.6.2 - "@eslint/eslintrc": 2.1.1 - "@eslint/js": 8.46.0 + "@eslint-community/eslint-utils": 4.4.0(eslint@8.47.0) + "@eslint-community/regexpp": 4.7.0 + "@eslint/eslintrc": 2.1.2 + "@eslint/js": 8.47.0 "@humanwhocodes/config-array": 0.11.10 "@humanwhocodes/module-importer": 1.0.1 "@nodelib/fs.walk": 1.2.8 @@ -3500,7 +2296,7 @@ packages: doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.2 + eslint-visitor-keys: 3.4.3 espree: 9.6.1 esquery: 1.5.0 esutils: 2.0.3 @@ -3508,7 +2304,7 @@ packages: file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.20.0 + globals: 13.21.0 graphemer: 1.4.0 ignore: 5.2.4 imurmurhash: 0.1.4 @@ -3535,7 +2331,7 @@ packages: dependencies: acorn: 8.10.0 acorn-jsx: 5.3.2(acorn@8.10.0) - eslint-visitor-keys: 3.4.2 + eslint-visitor-keys: 3.4.3 /esquery@1.5.0: resolution: @@ -3584,7 +2380,7 @@ packages: dependencies: d: 1.0.1 es5-ext: 0.10.62 - dev: false + dev: true /exit-hook@2.2.1: resolution: @@ -3600,7 +2396,6 @@ packages: integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==, } engines: { node: ">=6" } - dev: true /ext@1.7.0: resolution: @@ -3609,7 +2404,7 @@ packages: } dependencies: type: 2.7.2 - dev: false + dev: true /extend-shallow@2.0.1: resolution: @@ -3653,16 +2448,6 @@ packages: integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, } - /fast-xml-parser@4.2.5: - resolution: - { - integrity: sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==, - } - hasBin: true - dependencies: - strnum: 1.0.5 - dev: false - /fastq@1.15.0: resolution: { @@ -3685,7 +2470,6 @@ packages: { integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==, } - dev: true /fill-range@7.0.1: resolution: @@ -3722,23 +2506,10 @@ packages: integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==, } - /follow-redirects@1.15.2: - resolution: - { - integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==, - } - engines: { node: ">=4.0" } - peerDependencies: - debug: "*" - peerDependenciesMeta: - debug: - optional: true - dev: false - - /form-data@4.0.0: + /form-data@3.0.1: resolution: { - integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==, + integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==, } engines: { node: ">= 6" } dependencies: @@ -3752,7 +2523,6 @@ packages: { integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==, } - dev: true /fs.realpath@1.0.0: resolution: @@ -3760,10 +2530,10 @@ packages: integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, } - /fsevents@2.3.2: + /fsevents@2.3.3: resolution: { - integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==, + integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, } engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } os: [darwin] @@ -3790,21 +2560,20 @@ packages: source-map: 0.6.1 dev: true - /get-tsconfig@4.6.2: + /get-tsconfig@4.7.0: resolution: { - integrity: sha512-E5XrT4CbbXcXWy+1jChlZmrmCwd5KGx502kDCXJJ7y898TtWW9FwoG5HfOLVRKmlmDGkWN2HM9Ho+/Y8F0sJDg==, + integrity: sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw==, } dependencies: resolve-pkg-maps: 1.0.0 - dev: false + dev: true /github-from-package@0.0.0: resolution: { integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==, } - dev: true /glob-parent@5.1.2: resolution: @@ -3856,12 +2625,11 @@ packages: inherits: 2.0.4 minimatch: 5.1.6 once: 1.4.0 - dev: false - /globals@13.20.0: + /globals@13.21.0: resolution: { - integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==, + integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==, } engines: { node: ">=8" } dependencies: @@ -3896,7 +2664,7 @@ packages: dependencies: lodash.throttle: 4.1.1 sisteransi: 1.0.5 - dev: false + dev: true /has-flag@4.0.0: resolution: @@ -3910,12 +2678,12 @@ packages: { integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==, } - dev: false + dev: true - /hono@3.4.1: + /hono@3.5.1: resolution: { - integrity: sha512-fA7/cfgNg060mt12cYykdstwqM/bRvqYmQlPpEjoKIwMs6QF1rPJzZjppCrFuZZJvKE1vEP6kEAaaDH96XRg7Q==, + integrity: sha512-L31KJg1Qu1ZHYKlpHYymqyDPR9U5SOy+X6c6+HQxBOGMGrJFawd5BvfcP+0rrGcw1bN5xk61+k3oKW4jFWyUkw==, } engines: { node: ">=16.0.0" } dev: false @@ -3968,7 +2736,6 @@ packages: { integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, } - dev: true /ignore@5.2.4: resolution: @@ -4075,7 +2842,7 @@ packages: { integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==, } - dev: false + dev: true /is-property@1.0.2: resolution: @@ -4098,6 +2865,13 @@ packages: integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, } + /js-base64@3.7.5: + resolution: + { + integrity: sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==, + } + dev: false + /js-beautify@1.14.9: resolution: { @@ -4138,7 +2912,7 @@ packages: cli-color: 2.0.3 difflib: 0.2.4 dreamopt: 0.8.0 - dev: false + dev: true /json-schema-traverse@0.4.1: resolution: @@ -4214,7 +2988,7 @@ packages: { integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==, } - dev: false + dev: true /lodash@4.17.21: resolution: @@ -4272,12 +3046,12 @@ packages: } dependencies: es5-ext: 0.10.62 - dev: false + dev: true - /lucia@2.2.0: + /lucia@2.4.0: resolution: { - integrity: sha512-bCKSbWGpUQl+YbWaIy4t9eqqZQwKa5XKTBMTAjhAWwg9rEgPWu6L7vH55SueRsvB+2XNa2NA71ASdBUyS2fwLA==, + integrity: sha512-v2pyFQVF734+EU3m9GeeJQorFR7zLt7JoOJ1UD5ttR5Z+w4IkOyExiXyFe+zssKpony66u94wcxyws3lZSpzzg==, } dev: false @@ -4304,7 +3078,7 @@ packages: lru-queue: 0.1.0 next-tick: 1.1.0 timers-ext: 0.1.7 - dev: false + dev: true /merge2@1.4.1: resolution: @@ -4358,18 +3132,17 @@ packages: integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==, } engines: { node: ">=10" } - dev: true - /miniflare@3.20230724.0: + /miniflare@3.20230814.1: resolution: { - integrity: sha512-YU8yUwoVJCiuzY2i9ZBJ+McjL/mqwKnMJfn23QedSCvx82Mys8GAlkHCH69mqSqzlSw8IVcdxec330meRRf9bg==, + integrity: sha512-LMgqd1Ut0+fnlvQepVbbBYQczQnyuuap8bgUwOyPETka0S9NR9NxMQSNaBgVZ0uOaG7xMJ/OVTRlz+TGB86PWA==, } engines: { node: ">=16.13" } dependencies: acorn: 8.10.0 acorn-walk: 8.2.0 - better-sqlite3: 8.5.0 + better-sqlite3: 8.5.1 capnp-ts: 0.7.0 exit-hook: 2.2.1 glob-to-regexp: 0.4.1 @@ -4379,10 +3152,10 @@ packages: source-map-support: 0.5.21 stoppable: 1.1.0 undici: 5.23.0 - workerd: 1.20230724.0 + workerd: 1.20230814.1 ws: 8.13.0 youch: 3.2.3 - zod: 3.21.4 + zod: 3.22.2 transitivePeerDependencies: - bufferutil - supports-color @@ -4405,7 +3178,6 @@ packages: engines: { node: ">=10" } dependencies: brace-expansion: 2.0.1 - dev: false /minimatch@7.4.6: resolution: @@ -4415,7 +3187,7 @@ packages: engines: { node: ">=10" } dependencies: brace-expansion: 2.0.1 - dev: false + dev: true /minimatch@9.0.1: resolution: @@ -4432,14 +3204,12 @@ packages: { integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, } - dev: true /mkdirp-classic@0.5.3: resolution: { integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==, } - dev: true /ms@2.1.2: resolution: @@ -4496,14 +3266,6 @@ packages: { integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==, } - dev: true - - /natural-compare-lite@1.4.0: - resolution: - { - integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==, - } - dev: false /natural-compare@1.4.0: resolution: @@ -4516,17 +3278,46 @@ packages: { integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==, } - dev: false + dev: true - /node-abi@3.45.0: + /node-abi@3.47.0: resolution: { - integrity: sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==, + integrity: sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==, } engines: { node: ">=10" } dependencies: semver: 7.5.4 - dev: true + + /node-fetch@2.6.12: + resolution: + { + integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==, + } + 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-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-forge@1.3.1: resolution: @@ -4678,13 +3469,12 @@ packages: minimist: 1.2.8 mkdirp-classic: 0.5.3 napi-build-utils: 1.0.2 - node-abi: 3.45.0 + node-abi: 3.47.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: true /prelude-ls@1.2.1: resolution: @@ -4693,10 +3483,10 @@ packages: } engines: { node: ">= 0.8.0" } - /prettier@3.0.1: + /prettier@3.0.2: resolution: { - integrity: sha512-fcOWSnnpCrovBsmFZIGIy9UqK2FaI7Hqax+DIO0A9UxeVoY4iweyaFjS5TavZN97Hfehph0nhsZnjlVKzEQSrQ==, + integrity: sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ==, } engines: { node: ">=14" } hasBin: true @@ -4728,13 +3518,6 @@ packages: } dev: false - /proxy-from-env@1.1.0: - resolution: - { - integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==, - } - dev: false - /pump@3.0.0: resolution: { @@ -4743,7 +3526,6 @@ packages: dependencies: end-of-stream: 1.4.4 once: 1.4.0 - dev: true /punycode@2.3.0: resolution: @@ -4758,14 +3540,6 @@ packages: integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, } - /range-parser@1.2.1: - resolution: - { - integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==, - } - engines: { node: ">= 0.6" } - dev: false - /rc@1.2.8: resolution: { @@ -4777,7 +3551,6 @@ packages: ini: 1.3.8 minimist: 1.2.8 strip-json-comments: 2.0.1 - dev: true /react-dom@18.2.0(react@18.2.0): resolution: @@ -4812,7 +3585,6 @@ packages: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - dev: true /readdirp@3.6.0: resolution: @@ -4824,26 +3596,18 @@ packages: picomatch: 2.3.1 dev: true - /render2@1.2.1: - resolution: - { - integrity: sha512-HfLOYtG6p6jx6GG6uub7YGJ4iv+GlOwFmDtGdtSe2NQJ6peMZ0u76k7GAZ0z7GSf4e9UfeCcQxme4Mayh7DLqw==, - } - dependencies: - range-parser: 1.2.1 - dev: false - - /resend@0.17.2: + /resend@1.0.0: resolution: { - integrity: sha512-lakm76u4MiIDeMF1s2tCmjtksOhwZOs4WcAXkA7aUTvl+63/h+0h6Q6WnkB8RGtj6GakUhQuUkiZshfXgtIrGw==, + integrity: sha512-8LEE4gncmcm8bsvxvahZFpFk5hxUrKdagqWoX/MRXVU2YZ9coYxqZDeDYXG9pexz1A694bjE1hiQbBAA+bHAow==, } + engines: { node: ">=16" } dependencies: "@react-email/render": 0.0.7 - axios: 1.4.0 + node-fetch: 2.6.12 type-fest: 3.13.0 transitivePeerDependencies: - - debug + - encoding dev: false /resolve-from@4.0.0: @@ -4858,7 +3622,7 @@ packages: { integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==, } - dev: false + dev: true /reusify@1.0.4: resolution: @@ -4919,7 +3683,6 @@ packages: { integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, } - dev: true /safer-buffer@2.1.2: resolution: @@ -5001,7 +3764,6 @@ packages: { integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==, } - dev: true /simple-get@4.0.1: resolution: @@ -5012,14 +3774,13 @@ packages: decompress-response: 6.0.0 once: 1.4.0 simple-concat: 1.0.1 - dev: true /sisteransi@1.0.5: resolution: { integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==, } - dev: false + dev: true /slash@3.0.0: resolution: @@ -5037,6 +3798,7 @@ packages: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 + dev: true /source-map@0.6.1: resolution: @@ -5044,6 +3806,7 @@ packages: integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, } engines: { node: ">=0.10.0" } + dev: true /source-map@0.7.4: resolution: @@ -5102,7 +3865,6 @@ packages: } dependencies: safe-buffer: 5.2.1 - dev: true /strip-ansi@6.0.1: resolution: @@ -5119,7 +3881,6 @@ packages: integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==, } engines: { node: ">=0.10.0" } - dev: true /strip-json-comments@3.1.1: resolution: @@ -5128,13 +3889,6 @@ packages: } engines: { node: ">=8" } - /strnum@1.0.5: - resolution: - { - integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==, - } - dev: false - /supports-color@7.2.0: resolution: { @@ -5154,7 +3908,6 @@ packages: mkdirp-classic: 0.5.3 pump: 3.0.0 tar-stream: 2.2.0 - dev: true /tar-stream@2.2.0: resolution: @@ -5168,7 +3921,6 @@ packages: fs-constants: 1.0.0 inherits: 2.0.4 readable-stream: 3.6.2 - dev: true /text-table@0.2.0: resolution: @@ -5184,7 +3936,7 @@ packages: dependencies: es5-ext: 0.10.62 next-tick: 1.1.0 - dev: false + dev: true /to-regex-range@5.0.1: resolution: @@ -5195,10 +3947,17 @@ packages: dependencies: is-number: 7.0.0 - /ts-api-utils@1.0.1(typescript@5.1.6): + /tr46@0.0.3: resolution: { - integrity: sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==, + integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, + } + dev: false + + /ts-api-utils@1.0.2(typescript@5.1.6): + resolution: + { + integrity: sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==, } engines: { node: ">=16.13.0" } peerDependencies: @@ -5207,18 +3966,26 @@ packages: typescript: 5.1.6 dev: false - /tslib@1.14.1: + /tslib@2.6.2: resolution: { - integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==, + integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==, } - dev: false + dev: true - /tslib@2.6.1: + /tsx@3.12.7: resolution: { - integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==, + integrity: sha512-C2Ip+jPmqKd1GWVQDvz/Eyc6QJbGfE7NrR3fx5BpEHMZsEHoIxHL1j+lKdGobr8ovEyqeNkPLSKp6SCSOt7gmw==, } + hasBin: true + dependencies: + "@esbuild-kit/cjs-loader": 2.4.2 + "@esbuild-kit/core-utils": 3.1.0 + "@esbuild-kit/esm-loader": 2.5.5 + optionalDependencies: + fsevents: 2.3.3 + dev: true /tunnel-agent@0.6.0: resolution: @@ -5227,7 +3994,6 @@ packages: } dependencies: safe-buffer: 5.2.1 - dev: true /type-check@0.4.0: resolution: @@ -5258,14 +4024,14 @@ packages: { integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==, } - dev: false + dev: true /type@2.7.2: resolution: { integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==, } - dev: false + dev: true /typescript@5.1.6: resolution: @@ -5298,15 +4064,6 @@ packages: { integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, } - dev: true - - /uuid@8.3.2: - resolution: - { - integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==, - } - hasBin: true - dev: false /vscode-json-languageservice@4.2.1: resolution: @@ -5349,6 +4106,23 @@ packages: } 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@2.0.2: resolution: { @@ -5364,28 +4138,28 @@ packages: { integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==, } - dev: false + dev: true - /workerd@1.20230724.0: + /workerd@1.20230814.1: resolution: { - integrity: sha512-++D7JqS4/dk7zvtGpk+i/7G9bZtEl6lTtgAsIoSSGR1qJAxxEu21ktm9+FH0EYh7uKfizuM5H9lrTsR+3u44PA==, + integrity: sha512-zJeSEteXuAD+bpYJT8WvzTAHvIAkKPVxOV+Jy6zCLKz5e08N3OUbAF+wrvGWc8b2aB1sj+IYsdXfkv4puH+qXQ==, } engines: { node: ">=16" } hasBin: true requiresBuild: true optionalDependencies: - "@cloudflare/workerd-darwin-64": 1.20230724.0 - "@cloudflare/workerd-darwin-arm64": 1.20230724.0 - "@cloudflare/workerd-linux-64": 1.20230724.0 - "@cloudflare/workerd-linux-arm64": 1.20230724.0 - "@cloudflare/workerd-windows-64": 1.20230724.0 + "@cloudflare/workerd-darwin-64": 1.20230814.1 + "@cloudflare/workerd-darwin-arm64": 1.20230814.1 + "@cloudflare/workerd-linux-64": 1.20230814.1 + "@cloudflare/workerd-linux-arm64": 1.20230814.1 + "@cloudflare/workerd-windows-64": 1.20230814.1 dev: true - /wrangler@3.4.0: + /wrangler@3.5.1: resolution: { - integrity: sha512-sATQ84zH/zFUHSaa4hY3V24TBrad3R9HhGV47U6Ek7XRQDLQHBm0jt84mJD3sSV/hhaq5s+xidIYulhm+m1/Tg==, + integrity: sha512-CnrKId+pmjTfLSidM9Ut7lUDCFWEtJyY3JT3Dk+TgYHvu2zVmMgUeQQZHZfvpVN5eaEZifNQr90KEvMLy7MhHw==, } engines: { node: ">=16.13.0" } hasBin: true @@ -5396,14 +4170,14 @@ packages: blake3-wasm: 2.1.5 chokidar: 3.5.3 esbuild: 0.16.3 - miniflare: 3.20230724.0 + miniflare: 3.20230814.1 nanoid: 3.3.6 path-to-regexp: 6.2.1 selfsigned: 2.1.1 source-map: 0.7.4 xxhash-wasm: 1.0.2 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 transitivePeerDependencies: - bufferutil - supports-color @@ -5430,7 +4204,6 @@ packages: optional: true utf-8-validate: optional: true - dev: true /xxhash-wasm@1.0.2: resolution: @@ -5463,8 +4236,9 @@ packages: stacktracey: 2.1.8 dev: true - /zod@3.21.4: + /zod@3.22.2: resolution: { - integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==, + integrity: sha512-wvWkphh5WQsJbVk1tbx1l1Ly4yg+XecD+Mq280uBGt9wa5BKSWf4Mhp6GmrkPixhMxmabYY7RbzlwVP32pbGCg==, } + dev: true diff --git a/src/lib/drizzle.ts b/src/db/drizzle.ts similarity index 53% rename from src/lib/drizzle.ts rename to src/db/drizzle.ts index d5deacd..1756bd3 100644 --- a/src/lib/drizzle.ts +++ b/src/db/drizzle.ts @@ -3,13 +3,20 @@ export const tableNames = { authKey: "authKey", authSession: "authSession", authUser: "authUser", - emailVerificationToken: "emailVerificationToken", + emailVerificationTokens: "emailVerificationToken", follower: "follower", following: "following", + gameAssetCategories: "gameAssetCategories", games: "games", + emailVerificationToken: "emailVerificationToken", passwordResetToken: "passwordResetToken", + assetCategories: "assetCategories", + passwordResetTokens: "passwordResetToken", savedOcGenerators: "savedOcGenerators", + savedAssets: "savedAssets", + assetCollection: "assetCollection", + assetCollectionAsset: "assetCollectionAsset", socialsConnection: "socialsConnection", }; -export * as schema from "@/db/migrations/schema"; +export * as schema from "@/db/schema"; diff --git a/src/db/migrations/meta/_journal.json b/src/db/migrations/meta/_journal.json deleted file mode 100644 index d55cb7e..0000000 --- a/src/db/migrations/meta/_journal.json +++ /dev/null @@ -1 +0,0 @@ -{ "version": "5", "dialect": "mysql", "entries": [] } diff --git a/src/db/migrations/schema.ts b/src/db/migrations/schema.ts deleted file mode 100644 index 674d516..0000000 --- a/src/db/migrations/schema.ts +++ /dev/null @@ -1,262 +0,0 @@ -import { - mysqlTable, - index, - primaryKey, - int, - varchar, - mysqlEnum, - unique, - bigint, - datetime, -} from "drizzle-orm/mysql-core"; -import { tableNames } from "@/lib/drizzle"; -// import { sql } from "drizzle-orm"; - -export const assets = mysqlTable( - tableNames.assets, - { - id: int("id").autoincrement().notNull(), - name: varchar("name", { length: 191 }).notNull(), - game: varchar("game", { length: 191 }).notNull(), - assetCategory: varchar("asset_category", { length: 191 }).notNull(), - tags: mysqlEnum("tags", ["OFFICIAL", "FANMADE"]) - .default("OFFICIAL") - .notNull(), - url: varchar("url", { length: 191 }).notNull(), - status: mysqlEnum("status", ["PENDING", "APPROVED", "REJECTED"]) - .default("PENDING") - .notNull(), - uploadedBy: varchar("uploaded_by", { length: 191 }) - .notNull() - .references(() => authUser.id), - uploadedDate: varchar("uploaded_date", { length: 191 }).notNull(), - viewCount: int("view_count").default(0).notNull(), - downloadCount: int("download_count").default(0).notNull(), - fileSize: int("file_size").notNull(), - width: int("width").default(0).notNull(), - height: int("height").default(0).notNull(), - }, - (table) => { - return { - idIdx: index("assets_id_idx").on(table.id), - nameIdx: index("assets_name_idx").on(table.name), - gameIdx: index("assets_game_idx").on(table.game), - assetCategoryIdx: index("assets_asset_category_idx").on( - table.assetCategory - ), - statusIdx: index("assets_status_idx").on(table.status), - tagsIdx: index("assets_tags_idx").on(table.tags), - uploadedByIdx: index("assets_uploaded_by_idx").on(table.uploadedBy), - assetsId: primaryKey(table.id), - }; - } -); - -export const authKey = mysqlTable( - tableNames.authKey, - { - id: varchar("id", { length: 191 }).notNull(), - hashedPassword: varchar("hashed_password", { length: 191 }), - userId: varchar("user_id", { length: 191 }) - .notNull() - .references(() => authUser.id), - }, - (table) => { - return { - userIdIdx: index("authKey_user_id_idx").on(table.userId), - authKeyId: primaryKey(table.id), - authKeyIdKey: unique("authKey_id_key").on(table.id), - }; - } -); - -export const authSession = mysqlTable( - tableNames.authSession, - { - id: varchar("id", { length: 191 }).notNull(), - userId: varchar("user_id", { length: 191 }) - .notNull() - .references(() => authUser.id), - activeExpires: bigint("active_expires", { mode: "number" }).notNull(), - idleExpires: bigint("idle_expires", { mode: "number" }).notNull(), - }, - (table) => { - return { - userIdIdx: index("authSession_user_id_idx").on(table.userId), - authSessionId: primaryKey(table.id), - authSessionIdKey: unique("authSession_id_key").on(table.id), - }; - } -); - -export const authUser = mysqlTable( - tableNames.authUser, - { - id: varchar("id", { length: 191 }).notNull(), - avatarUrl: varchar("avatar_url", { length: 191 }), - bannerUrl: varchar("banner_url", { length: 191 }), - username: varchar("username", { length: 191 }).notNull(), - usernameColour: varchar("username_colour", { length: 191 }), - email: varchar("email", { length: 191 }).notNull(), - emailVerified: int("email_verified").default(0).notNull(), - pronouns: varchar("pronouns", { length: 191 }), - verified: int("verified").default(0).notNull(), - bio: varchar("bio", { length: 191 }).default(""), - dateJoined: datetime("date_joined", { - mode: "string", - fsp: 3, - }).notNull(), - roleFlags: int("role_flags").default(1).notNull(), - selfAssignableRoleFlags: int("self_assignable_role_flags"), - }, - (table) => { - return { - authUserId: primaryKey(table.id), - authUserIdKey: unique("authUser_id_key").on(table.id), - authUserUsernameKey: unique("authUser_username_key").on( - table.username - ), - authUserEmailKey: unique("authUser_email_key").on(table.email), - }; - } -); - -export const emailVerificationToken = mysqlTable( - tableNames.emailVerificationToken, - { - id: varchar("id", { length: 191 }).notNull(), - userId: varchar("user_id", { length: 191 }) - .notNull() - .references(() => authUser.id), - expires: bigint("expires", { mode: "number" }).notNull(), - }, - (table) => { - return { - userIdIdx: index("emailVerificationToken_user_id_idx").on( - table.userId - ), - emailVerificationTokenId: primaryKey(table.id), - emailVerificationTokenIdKey: unique( - "emailVerificationToken_id_key" - ).on(table.id), - }; - } -); - -export const follower = mysqlTable( - tableNames.follower, - { - id: varchar("id", { length: 191 }).notNull(), - userId: varchar("user_id", { length: 191 }) - .notNull() - .references(() => authUser.id), - }, - (table) => { - return { - userIdIdx: index("follower_user_id_idx").on(table.userId), - followerId: primaryKey(table.id), - followerIdKey: unique("follower_id_key").on(table.id), - }; - } -); - -export const following = mysqlTable( - tableNames.following, - { - id: varchar("id", { length: 191 }).notNull(), - userId: varchar("user_id", { length: 191 }).notNull(), - }, - (table) => { - return { - userIdIdx: index("following_user_id_idx").on(table.userId), - followingId: primaryKey(table.id), - followingIdKey: unique("following_id_key").on(table.id), - }; - } -); - -export const games = mysqlTable( - tableNames.games, - { - id: int("id").autoincrement().notNull(), - name: varchar("name", { length: 191 }).notNull(), - assetCount: int("asset_count").default(0).notNull(), - assetCategories: varchar("asset_categories", { length: 191 }) // minor inconvenience - .default("") - .notNull(), - lastUpdated: datetime("last_updated", { - mode: "string", - fsp: 3, - }).notNull(), - categoryCount: int("category_count").default(0).notNull(), - }, - (table) => { - return { - idIdx: index("games_id_idx").on(table.id), - nameIdx: index("games_name_idx").on(table.name), - gamesId: primaryKey(table.id), - }; - } -); - -export const passwordResetToken = mysqlTable( - tableNames.passwordResetToken, - { - id: varchar("id", { length: 191 }).notNull(), - userId: varchar("user_id", { length: 191 }) - .notNull() - .references(() => authUser.id), - expires: bigint("expires", { mode: "number" }).notNull(), - }, - (table) => { - return { - userIdIdx: index("passwordResetToken_user_id_idx").on(table.userId), - passwordResetTokenId: primaryKey(table.id), - passwordResetTokenIdKey: unique("passwordResetToken_id_key").on( - table.id - ), - }; - } -); - -export const savedOcGenerators = mysqlTable( - tableNames.savedOcGenerators, - { - id: int("id").autoincrement().notNull(), - game: varchar("game", { length: 191 }).notNull(), - data: varchar("data", { length: 191 }).notNull(), // data will be stored in opt index -> response index e.g 1:1,2:4,3:1,4:2 - userId: varchar("user_id", { length: 191 }) - .notNull() - .references(() => authUser.id), - savedDate: datetime("saved_date", { mode: "string", fsp: 3 }).notNull(), - }, - (table) => { - return { - idIdx: index("savedOCGenerators_id_idx").on(table.id), - gameIdx: index("savedOCGenerators_game_idx").on(table.game), - userIdIdx: index("savedOCGenerators_user_id_idx").on(table.userId), - savedOcGeneratorsId: primaryKey(table.id), - }; - } -); - -export const socialsConnection = mysqlTable( - tableNames.socialsConnection, - { - id: varchar("id", { length: 191 }).notNull(), - userId: varchar("user_id", { length: 191 }) - .notNull() - .references(() => authUser.id), - tiktok: varchar("tiktok", { length: 191 }), - discord: varchar("discord", { length: 191 }), - }, - (table) => { - return { - userIdIdx: index("socialsConnection_user_id_idx").on(table.userId), - socialsConnectionId: primaryKey(table.id), - socialsConnectionIdKey: unique("socialsConnection_id_key").on( - table.id - ), - }; - } -); diff --git a/src/db/schema.ts b/src/db/schema.ts new file mode 100644 index 0000000..aef8c4d --- /dev/null +++ b/src/db/schema.ts @@ -0,0 +1,366 @@ +import { tableNames } from "@/db/drizzle"; +import { relations } from "drizzle-orm"; +import { + sqliteTable, + text, + integer, + uniqueIndex, +} from "drizzle-orm/sqlite-core"; + +// users, games, categories, assets etc, i will clean this up later, sorry for anyone looking at this +export const users = sqliteTable( + tableNames.authUser, + { + id: text("id").primaryKey(), + avatarUrl: text("avatar_url"), + bannerUrl: text("banner_url"), + username: text("username").notNull(), + usernameColour: text("username_colour"), + email: text("email").notNull(), + emailVerified: integer("email_verified").default(0).notNull(), + pronouns: text("pronouns"), + verified: integer("verified").default(0).notNull(), + bio: text("bio").default("No bio set").notNull(), + dateJoined: integer("date_joined").notNull(), + roleFlags: integer("role_flags").default(1).notNull(), + isContributor: integer("is_contributor").default(0).notNull(), + selfAssignableRoleFlags: integer("self_assignable_role_flags"), + }, + (user) => { + return { + userIdx: uniqueIndex("user_idx").on(user.id), + usernameIdx: uniqueIndex("username_idx").on(user.username), + emailIdx: uniqueIndex("email_idx").on(user.email), + }; + } +); + +export const sessions = sqliteTable( + tableNames.authSession, + { + id: text("id").primaryKey(), + userId: text("user_id") + .notNull() + .references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + activeExpires: integer("active_expires").notNull(), + idleExpires: integer("idle_expires").notNull(), + }, + (session) => { + return { + userIdx: uniqueIndex("session_user_idx").on(session.userId), + }; + } +); + +export const keys = sqliteTable( + tableNames.authKey, + { + id: text("id").primaryKey(), + userId: text("user_id") + .notNull() + .references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + hashedPassword: text("hashed_password"), + }, + (key) => { + return { + userIdx: uniqueIndex("keys_user_idx").on(key.userId), + }; + } +); + +export const socialsConnection = sqliteTable(tableNames.socialsConnection, { + id: text("id").primaryKey(), + userId: text("user_id") + .notNull() + .references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + discordId: text("discord_id"), +}); + +export const games = sqliteTable( + tableNames.games, + { + id: text("id").primaryKey(), + name: text("name").notNull(), + assetCount: integer("asset_count").default(0).notNull(), + lastUpdated: integer("last_updated").notNull(), + }, + (game) => { + return { + gameIdx: uniqueIndex("game_idx").on(game.id), + nameIdx: uniqueIndex("name_idx").on(game.name), + }; + } +); + +export const assetCategories = sqliteTable( + tableNames.assetCategories, + { + id: text("id").primaryKey(), + name: text("name").notNull(), // e.g genshin-impact, honkai-impact-3rd + formattedName: text("formatted_name").notNull(), // e.g Genshin Impact, Honkai Impact 3rd + assetCount: integer("asset_count").default(0).notNull(), + lastUpdated: integer("last_updated").notNull(), + }, + (assetCategory) => { + return { + assetCategoryIdx: uniqueIndex("asset_category_idx").on( + assetCategory.id + ), + nameIdx: uniqueIndex("name_idx").on(assetCategory.name), + }; + } +); + +export const gameAssetCategories = sqliteTable( + tableNames.gameAssetCategories, + { + id: text("id").primaryKey(), + gameId: text("game_id") + .notNull() + .references(() => games.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + assetCategoryId: text("asset_category_id") + .notNull() + .references(() => assetCategories.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + }, + (gameAssetCategory) => { + return { + gameAssetCategoryIdx: uniqueIndex("game_asset_category_idx").on( + gameAssetCategory.id + ), + gameIdx: uniqueIndex("game_idx").on(gameAssetCategory.gameId), + assetCategoryIdx: uniqueIndex("asset_category_idx").on( + gameAssetCategory.assetCategoryId + ), + }; + } +); + +export const assets = sqliteTable( + tableNames.assets, + { + id: integer("id").notNull(), + name: text("name").notNull(), + game: text("game") + .notNull() + .references(() => games.name, { + onUpdate: "cascade", + onDelete: "cascade", + }), + assetCategory: text("asset_category") + .notNull() + .references(() => assetCategories.name, { + onUpdate: "cascade", + onDelete: "cascade", + }), + tags: text("tags").notNull(), + url: text("url").notNull(), + status: text("status").notNull(), + uploadedById: text("uploaded_by").references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + uploadedDate: text("uploaded_date").notNull(), + viewCount: integer("view_count").default(0).notNull(), + downloadCount: integer("download_count").default(0).notNull(), + fileSize: integer("file_size").default(0).notNull(), + width: integer("width").default(0).notNull(), + height: integer("height").default(0).notNull(), + }, + (table) => { + return { + idIdx: uniqueIndex("assets_id_idx").on(table.id), + nameIdx: uniqueIndex("assets_name_idx").on(table.name), + gameIdx: uniqueIndex("assets_game_idx").on(table.game), + assetCategoryIdx: uniqueIndex("assets_asset_category_idx").on( + table.assetCategory + ), + downloadCountIdx: uniqueIndex("assets_download_count_idx").on( + table.downloadCount + ), + statusIdx: uniqueIndex("assets_status_idx").on(table.status), + tagsIdx: uniqueIndex("assets_tags_idx").on(table.tags), + uploadedByIdx: uniqueIndex("assets_uploaded_by_idx").on( + table.uploadedById + ), + }; + } +); + +export const following = sqliteTable( + tableNames.following, + { + id: text("id").primaryKey(), + followerId: text("follower_id") + .notNull() + .references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + followingId: text("following_id") + .notNull() + .references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + }, + (following) => { + return { + followerIdx: uniqueIndex("follower_idx").on(following.followerId), + followingIdx: uniqueIndex("following_idx").on( + following.followingId + ), + }; + } +); + +export const follower = sqliteTable( + tableNames.follower, + { + id: text("id").primaryKey(), + followerId: text("follower_id") + .notNull() + .references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + followingId: text("following_id").notNull(), + }, + (follower) => { + return { + followerIdx: uniqueIndex("follower_idx").on(follower.followerId), + followingIdx: uniqueIndex("following_idx").on(follower.followingId), + }; + } +); + +export const collections = sqliteTable( + tableNames.assetCollection, + { + id: text("id").primaryKey(), + name: text("name").notNull(), + userId: text("user_id") + .notNull() + .references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + }, + (collection) => { + return { + collectionIdx: uniqueIndex("collection_idx").on(collection.id), + userCollectionIdx: uniqueIndex("user_collection_idx").on( + collection.userId + ), + }; + } +); + +export const collectionAssets = sqliteTable( + tableNames.assetCollectionAsset, + { + collectionId: text("collection_id") + .notNull() + .references(() => collections.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + assetId: integer("asset_id") + .notNull() + .references(() => assets.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + }, + (collectionAsset) => { + return { + collectionAssetIdx: uniqueIndex("collection_asset_idx").on( + collectionAsset.collectionId, + collectionAsset.assetId + ), + }; + } +); + +export const savedOcGenerators = sqliteTable( + tableNames.savedOcGenerators, + { + id: text("id").primaryKey(), + userId: text("user_id") + .notNull() + .references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + game: text("game").notNull(), + content: text("content").notNull(), // this is stored as json + }, + (savedOcGenerators) => { + return { + savedOcGeneratorsIdx: uniqueIndex("saved_oc_generators_idx").on( + savedOcGenerators.id + ), + savedOcGeneratorsUserIdx: uniqueIndex( + "saved_oc_generators_user_idx" + ).on(savedOcGenerators.userId), + }; + } +); + +// relations + +export const gameRelations = relations(games, ({ many }) => ({ + assetCategories: many(gameAssetCategories), +})); + +export const assetCategoryRelations = relations( + assetCategories, + ({ many }) => ({ + games: many(gameAssetCategories), + }) +); + +export const assetRelations = relations(assets, ({ one }) => ({ + uploadedBy: one(users, { + fields: [assets.uploadedById], + references: [users.id], + }), +})); + +export const sessionsRelations = relations(sessions, ({ one }) => ({ + user: one(users, { + fields: [sessions.userId], + references: [users.id], + }), +})); + +export const keysRelations = relations(keys, ({ one }) => ({ + user: one(users, { + fields: [keys.userId], + references: [users.id], + }), +})); + +export const usersRelations = relations(users, ({ many }) => ({ + session: many(sessions), + key: many(keys), + assets: many(assets), + follower: many(follower), + following: many(following), + collections: many(collections), + savedOcGenerators: many(savedOcGenerators), +})); diff --git a/src/db/turso.ts b/src/db/turso.ts new file mode 100644 index 0000000..2cb4bc9 --- /dev/null +++ b/src/db/turso.ts @@ -0,0 +1,22 @@ +import { Env } from "../worker-configuration"; +import * as schema from "@/db/schema"; +import { drizzle as drizzleORM } from "drizzle-orm/libsql"; +import { createClient } from "@libsql/client/web"; // because we're in a worker + +// wrapper for turso & drizzle +export function getConnection(env: Env) { + const turso = createClient({ + url: env.TURSO_DATABASE_URL, + authToken: env.TURSO_DATABASE_AUTH_TOKEN, + }); + + const drizzle = drizzleORM(turso, { + schema, + logger: true, + }); + + return { + drizzle, + turso, + }; +} diff --git a/src/index.ts b/src/index.ts index 0eb5693..dc72451 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,7 +3,7 @@ import { Env } from "./worker-configuration"; import assetRoute from "./routes/asset/assetRoute"; import discordRoute from "./routes/discord/discordRoute"; import ocGeneratorRoute from "./routes/oc-generators/ocGeneratorRoutes"; -import assetSearchRoute from "./routes/search/asset/searchRoute"; +// import assetSearchRoute from "./routes/search/asset/searchRoute"; import gamesRoute from "./routes/games/gamesRoute"; import userRoute from "./routes/user/userRoute"; import authRoute from "./routes/auth/authRoute"; @@ -11,7 +11,7 @@ interface Bindings extends Env { [key: string]: unknown; } -const app = new Hono<{ Bindings: Bindings }>(); +const app = new Hono<{ Bindings: Bindings; Env: Env }>(); app.get("/status", (c) => { c.status(200); @@ -24,7 +24,7 @@ app.get("/", (c) => { app.route("/asset", assetRoute); app.route("/discord", discordRoute); app.route("/oc-generators", ocGeneratorRoute); -app.route("/search/assets", assetSearchRoute); +// app.route("/search/assets", assetSearchRoute); app.route("/games", gamesRoute); app.route("/user", userRoute); app.route("/auth", authRoute); diff --git a/src/lib/auth/lucia.ts b/src/lib/auth/lucia.ts index 093be05..bf5e677 100644 --- a/src/lib/auth/lucia.ts +++ b/src/lib/auth/lucia.ts @@ -1,21 +1,21 @@ import { lucia } from "lucia"; import { hono } from "lucia/middleware"; -import { planetscale } from "@lucia-auth/adapter-mysql"; -import { getConnection } from "../planetscale"; +import { getConnection } from "@/db/turso"; import { Env } from "@/worker-configuration"; -import { tableNames } from "../drizzle"; +import { tableNames } from "@/db/drizzle"; +import { libsql } from "@lucia-auth/adapter-sqlite"; // this is so we can pass in env during requests, -// so: it would be called: auth(c.env)... instead of auth +// so, it would be called: auth(c.env)... instead of auth export const auth = (env: Env) => { const db = getConnection(env); - const connection = db.planetscale; + const connection = db.turso; return lucia({ - adapter: planetscale(connection, { + adapter: libsql(connection, { key: tableNames.authKey, - user: tableNames.authUser, session: tableNames.authSession, + user: tableNames.authUser, }), middleware: hono(), sessionExpiresIn: { @@ -26,10 +26,6 @@ export const auth = (env: Env) => { experimental: { debugMode: env.ENVIRONMENT === "DEV" ? true : false, }, - // csrfProtection: { - // baseDomain: env.ENVIRONMENT === "DEV" ? "localhost" : "wanderer.moe", - // allowedSubDomains: ["*"], - // }, getUserAttributes: (dbUser) => { return { username: dbUser.username, @@ -48,7 +44,7 @@ export const auth = (env: Env) => { }, getSessionAttributes: (dbSession) => { return { - userAgentHash: dbSession.user_agent_hash as unknown as string, // md5 + userAgent: dbSession.user_agent as unknown as string, // md5 countryCode: dbSession.country_code as string, }; }, diff --git a/src/lib/helpers/responses/notFoundResponse.ts b/src/lib/helpers/responses/notFoundResponse.ts index 4818a79..009a301 100644 --- a/src/lib/helpers/responses/notFoundResponse.ts +++ b/src/lib/helpers/responses/notFoundResponse.ts @@ -1,14 +1,12 @@ // helper function to create a 404 Not Found response -export function createNotFoundResponse(errorMessage, responseHeaders) { - return new Response( - JSON.stringify({ +export function createNotFoundResponse(c, errorMessage, responseHeaders) { + return c.json( + { success: false, status: "error", error: errorMessage, - }), - { - status: 404, - headers: responseHeaders, - } + }, + 404, + responseHeaders ); } diff --git a/src/lib/planetscale.ts b/src/lib/planetscale.ts deleted file mode 100644 index 2e86629..0000000 --- a/src/lib/planetscale.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { connect } from "@planetscale/database"; -import { Env } from "../worker-configuration"; -import * as schema from "@/db/migrations/schema"; -import { drizzle } from "drizzle-orm/planetscale-serverless"; - -// useful wrapper for planetscale connection -export function getConnection(env: Env) { - const client = connect({ - // this can be set with "wrangler secret put" or through the planetscale integration on cf dashboard - host: env.DATABASE_HOST, - username: env.DATABASE_USERNAME, - password: env.DATABASE_PASSWORD, - fetch: (url, init) => { - delete init["cache"]; - return fetch(url, init); - }, - }); - - const db = drizzle(client, { - schema, - logger: true, - }); - - return { - drizzle: db, - planetscale: client, - }; -} diff --git a/src/lib/query.ts b/src/lib/query.ts index 811a10b..d406bbf 100644 --- a/src/lib/query.ts +++ b/src/lib/query.ts @@ -1,5 +1,5 @@ import type { Asset } from "@/lib/types/asset"; -import { getConnection } from "@/lib/planetscale"; +import { getConnection } from "@/db/turso"; type queryParameter = string | number; diff --git a/src/lucia.d.ts b/src/lucia.d.ts index 10ac99d..c2d7f7b 100644 --- a/src/lucia.d.ts +++ b/src/lucia.d.ts @@ -9,14 +9,15 @@ declare namespace Lucia { email: string; email_verified: number; pronouns: string | null; + is_contributor: number; verified: number; bio: string | null; role_flags: number; self_assignable_role_flags: number | null; - date_joined: Date; + date_joined: number; }; type DatabaseSessionAttributes = { country_code: string; - user_agent_hash: ArrayBuffer; + user_agent: string; }; } diff --git a/src/routes/asset/downloadAsset.ts b/src/routes/asset/downloadAsset.ts index 56f10eb..33e2848 100644 --- a/src/routes/asset/downloadAsset.ts +++ b/src/routes/asset/downloadAsset.ts @@ -1,34 +1,31 @@ import { responseHeaders } from "@/lib/responseHeaders"; -import type { Asset } from "@/lib/types/asset"; -import { getConnection } from "@/lib/planetscale"; +import { getConnection } from "@/db/turso"; import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse"; -import { Context } from "hono"; +import { eq } from "drizzle-orm"; +import { assets } from "@/db/schema"; -export const downloadAsset = async (c: Context) => { +export const downloadAsset = async (c) => { const { assetId } = c.req.param(); const conn = await getConnection(c.env); - const db = conn.planetscale; + const { drizzle } = conn; - const row = await db - .execute("SELECT * FROM assets WHERE id = ?", [assetId]) - .then((row) => row.rows[0] as Asset | undefined); + const asset = await drizzle + .select() + .from(assets) + .where(eq(assets.id, assetId)) + .execute(); - if (!row) - return createNotFoundResponse("Asset ID not found", responseHeaders); + if (!asset) { + return createNotFoundResponse(c, "Asset not found", responseHeaders); + } - const response = await fetch( - `https://files.wanderer.moe/assets/${row.url}` - ); + const response = await fetch(asset[0].url); - const headers = new Headers(response.headers); - headers.set("Content-Disposition", `attachment; filename="${row.name}"`); const blob = await response.blob(); - await db.execute( - "UPDATE assets SET download_count = download_count + 1 WHERE id = ?", - [assetId] - ); + const headers = new Headers(); + headers.set("Content-Disposition", `attachment; filename=${asset[0].name}`); return new Response(blob, { headers: headers, diff --git a/src/routes/asset/getAssetFromId.ts b/src/routes/asset/getAssetFromId.ts index 564fcd5..d165e04 100644 --- a/src/routes/asset/getAssetFromId.ts +++ b/src/routes/asset/getAssetFromId.ts @@ -1,7 +1,8 @@ import { responseHeaders } from "@/lib/responseHeaders"; -import type { Asset } from "@/lib/types/asset"; -import { getConnection } from "@/lib/planetscale"; +import { getConnection } from "@/db/turso"; +import { assets } from "@/db/schema"; import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse"; +import { eq, desc } from "drizzle-orm"; export const getAssetFromId = async (c) => { const { id } = c.req.param(); @@ -12,58 +13,31 @@ export const getAssetFromId = async (c) => { if (response) return response; const conn = await getConnection(c.env); - const db = conn.planetscale; - - const row = await db - .execute("SELECT * FROM assets WHERE id = ?", [id]) - .then((row) => row.rows[0] as Asset | undefined); - - if (!row) - return createNotFoundResponse("Asset ID not found", responseHeaders); - - const asset = { - id: row.id, - name: row.name, - game: row.game, - asset_category: row.asset_category, - url: row.url, - tags: row.tags, - status: row.status, - uploaded_by: row.uploaded_by, - uploaded_date: row.uploaded_date, - file_size: row.file_size, - width: row.width, - height: row.height, - }; - - const similarAssets = ( - await db - .execute( - "SELECT * FROM assets WHERE game = ? AND asset_category = ? AND id != ? ORDER BY RAND() LIMIT 4", - [row.game, row.asset_category, row.id] - ) - .then((row) => row.rows as Asset[]) - ).map((asset) => { - return { - id: asset.id, - name: asset.name, - game: asset.game, - asset_category: asset.asset_category, - url: asset.url, - tags: asset.tags, - status: asset.status, - uploaded_by: asset.uploaded_by, - uploaded_date: asset.uploaded_date, - file_size: asset.file_size, - width: asset.width, - height: asset.height, - }; - }); - - await db.execute( - "UPDATE assets SET view_count = view_count + 1 WHERE id = ?", - [id] - ); + const { drizzle } = conn; + + const asset = await drizzle + .select() + .from(assets) + .where(eq(assets.id, id)) + .execute(); + + if (!asset) { + response = createNotFoundResponse( + c, + "Asset not found", + responseHeaders + ); + await cache.put(cacheKey, response.clone()); + return response; + } + + const similarAssets = await drizzle + .select() + .from(assets) + .where(eq(assets.assetCategory, asset[0].assetCategory)) + .limit(6) + .orderBy(desc(assets.id)) + .execute(); response = c.json( { diff --git a/src/routes/auth/authRoute.ts b/src/routes/auth/authRoute.ts index 99e8a45..309c137 100644 --- a/src/routes/auth/authRoute.ts +++ b/src/routes/auth/authRoute.ts @@ -4,6 +4,7 @@ import { logout } from "./logout"; import { signup } from "./signup"; import { cors } from "hono/cors"; import { validate } from "./validate"; +import { updateUserAttributes } from "./updateUserAttributes"; const authRoute = new Hono(); @@ -11,7 +12,7 @@ authRoute.use( "*", cors({ credentials: true, - origin: ["https://next.wanderer.moe"], + origin: ["https://next.wanderer.moe", "http://localhost:3000"], }) ); @@ -19,6 +20,10 @@ authRoute.post("/login", async (c) => { return login(c); }); +authRoute.post("/updateattributes", async (c) => { + return updateUserAttributes(c); +}); + authRoute.post("/signup", async (c) => { return signup(c); }); diff --git a/src/routes/auth/login.ts b/src/routes/auth/login.ts index 2f2dee4..7a1f497 100644 --- a/src/routes/auth/login.ts +++ b/src/routes/auth/login.ts @@ -1,5 +1,4 @@ import { auth } from "@/lib/auth/lucia"; -import { Context } from "hono"; // import * as validate from "@/lib/regex/accountValidation"; const usernameThrottling = new Map< @@ -10,7 +9,7 @@ const usernameThrottling = new Map< } >(); -export const login = async (c: Context): Promise => { +export const login = async (c): Promise => { const formData = await c.req.formData(); const username = formData.get("username") as string; @@ -62,20 +61,19 @@ export const login = async (c: Context): Promise => { ); } - const userAgentHash = await crypto.subtle.digest( - { name: "MD5" }, - new TextEncoder().encode(c.req.headers.get("user-agent") ?? "") - ); + const userAgent = c.req.headers.get("user-agent") ?? ""; const countryCode = c.req.headers.get("cf-ipcountry") ?? ""; const newSession = await auth(c.env).createSession({ userId: user.userId, attributes: { country_code: countryCode, - user_agent_hash: userAgentHash, + user_agent: userAgent, }, }); + console.log("valid session created", countryCode, userAgent); + const authRequest = await auth(c.env).handleRequest(c); authRequest.setSession(newSession); diff --git a/src/routes/auth/logout.ts b/src/routes/auth/logout.ts index 624c263..08a5316 100644 --- a/src/routes/auth/logout.ts +++ b/src/routes/auth/logout.ts @@ -1,7 +1,6 @@ import { auth } from "@/lib/auth/lucia"; -import { Context } from "hono"; -export const logout = async (c: Context): Promise => { +export const logout = async (c): Promise => { const authRequest = auth(c.env).handleRequest(c); const session = await authRequest.validate(); @@ -9,6 +8,8 @@ export const logout = async (c: Context): Promise => { return c.json({ success: false, state: "invalid session" }, 200); } + // this is useful to clean up dead sessions that are still in the database + await auth(c.env).deleteDeadUserSessions(session.userId); await auth(c.env).invalidateSession(session.sessionId); authRequest.setSession(null); diff --git a/src/routes/auth/signup.ts b/src/routes/auth/signup.ts index 6a5d5d1..10c6fb5 100644 --- a/src/routes/auth/signup.ts +++ b/src/routes/auth/signup.ts @@ -1,8 +1,7 @@ import { auth } from "@/lib/auth/lucia"; -import { Context } from "hono"; // import * as validate from "@/lib/regex/accountValidation"; -export const signup = async (c: Context) => { +export const signup = async (c) => { const formData = await c.req.formData(); const secretKeyRequiredForSignup = c.env.VERY_SECRET_SIGNUP_KEY; @@ -12,7 +11,6 @@ export const signup = async (c: Context) => { const password = formData.get("password") as string; const passwordConfirm = formData.get("passwordConfirm") as string; const secretKey = formData.get("secretKey") as string; - // console.log(username, email, password, passwordConfirm); const validSession = await auth(c.env).handleRequest(c).validate(); if (validSession) @@ -45,9 +43,10 @@ export const signup = async (c: Context) => { username, email, email_verified: 0, - date_joined: new Date(), + date_joined: Date.now(), verified: 0, role_flags: 1, + is_contributor: 0, self_assignable_role_flags: null, username_colour: null, avatar_url: null, @@ -57,17 +56,14 @@ export const signup = async (c: Context) => { }, }); - const userAgentHash = await crypto.subtle.digest( - { name: "MD5" }, - new TextEncoder().encode(c.req.headers.get("user-agent") ?? "") - ); + const userAgent = c.req.headers.get("user-agent") ?? ""; const countryCode = c.req.headers.get("cf-ipcountry") ?? ""; const newSession = await auth(c.env).createSession({ userId: user.userId, attributes: { country_code: countryCode, - user_agent_hash: userAgentHash, + user_agent: userAgent, }, }); diff --git a/src/routes/auth/updateUserAttributes.ts b/src/routes/auth/updateUserAttributes.ts new file mode 100644 index 0000000..ba5dab0 --- /dev/null +++ b/src/routes/auth/updateUserAttributes.ts @@ -0,0 +1,32 @@ +import { auth } from "@/lib/auth/lucia"; + +export const updateUserAttributes = async (c) => { + const authRequest = auth(c.env).handleRequest(c); + const session = await authRequest.validate(); + + if (!session) { + authRequest.setSession(null); + return c.json({ success: false, state: "invalid session" }, 200); + } + + const formData = await c.req.formData(); + + const attributes = { + username: formData.get("username") as string | null, + username_colour: formData.get("username_colour") as string | null, + pronouns: formData.get("pronouns") as string | null, + bio: formData.get("bio") as string | null, + }; + + // remove null values from attributes + Object.keys(attributes).forEach((key) => { + if (attributes[key] === null) delete attributes[key]; + }); + + await auth(c.env).updateUserAttributes(session.userId, attributes); + + return c.json( + { success: true, state: "updated user attributes", session }, + 200 + ); +}; diff --git a/src/routes/auth/validate.ts b/src/routes/auth/validate.ts index 39e4ef5..e898faf 100644 --- a/src/routes/auth/validate.ts +++ b/src/routes/auth/validate.ts @@ -1,28 +1,23 @@ import { auth } from "@/lib/auth/lucia"; -import { Context } from "hono"; -export const validate = async (c: Context): Promise => { +export const validate = async (c): Promise => { console.log(c); const authRequest = auth(c.env).handleRequest(c); - // console.log("validate") - // console.log(authRequest); - const session = await authRequest.validate(); - const userAgentHash = await crypto.subtle.digest( - { name: "MD5" }, - new TextEncoder().encode(c.req.headers.get("user-agent") ?? "") - ); const countryCode = c.req.headers.get("cf-ipcountry") ?? ""; + const userAgent = c.req.headers.get("user-agent") ?? ""; if (!session) { authRequest.setSession(null); return c.json({ success: false, state: "invalid session" }, 200); } + // console.log(session); + if ( - session.userAgentHash !== userAgentHash || + session.userAgent !== userAgent || session.countryCode !== countryCode ) { await auth(c.env).invalidateSession(session.sessionId); diff --git a/src/routes/discord/contributors.ts b/src/routes/discord/contributors.ts index 275b088..552446f 100644 --- a/src/routes/discord/contributors.ts +++ b/src/routes/discord/contributors.ts @@ -1,9 +1,8 @@ import { responseHeaders } from "@/lib/responseHeaders"; import { roles, guildId } from "@/lib/discord"; import type { Contributor, GuildMember } from "@/lib/types/discord"; -import { Context } from "hono"; -export const contributors = async (c: Context) => { +export const contributors = async (c) => { const members: Contributor[] = []; let after: string | null = null; diff --git a/src/routes/games/allGames.ts b/src/routes/games/allGames.ts index 104efcf..c599f50 100644 --- a/src/routes/games/allGames.ts +++ b/src/routes/games/allGames.ts @@ -1,10 +1,9 @@ import { responseHeaders } from "@/lib/responseHeaders"; -import { getConnection } from "@/lib/planetscale"; -import { Context } from "hono"; +import { getConnection } from "@/db/turso"; import { listBucket } from "@/lib/listBucket"; -import { Game } from "@/lib/types/game"; +import { games } from "@/db/schema"; -export const getAllGames = async (c: Context) => { +export const getAllGames = async (c) => { const cacheKey = new Request(c.req.url.toString(), c.req); const cache = caches.default; let response = await cache.match(cacheKey); @@ -23,15 +22,15 @@ export const getAllGames = async (c: Context) => { }); const conn = await getConnection(c.env); - const db = conn.planetscale; + const { drizzle } = conn; - const gameList = await db - .execute("SELECT * FROM games ORDER BY asset_count DESC") + const gamesList = await drizzle + .select() + .from(games) + .execute() .then((row) => - row.rows.map((game: Game) => ({ + row.map((game) => ({ ...game, - // asset categories are stored as a comma separated string in the database, so we need to split them into an array - asset_categories: game.asset_categories.split(","), has_generator: results.some( (generator) => generator.name === game.name ), @@ -42,7 +41,7 @@ export const getAllGames = async (c: Context) => { { success: true, status: "ok", - results: gameList, + results: gamesList, }, 200, responseHeaders diff --git a/src/routes/oc-generators/getGenerator.ts b/src/routes/oc-generators/getGenerator.ts index 330d194..a30c784 100644 --- a/src/routes/oc-generators/getGenerator.ts +++ b/src/routes/oc-generators/getGenerator.ts @@ -1,9 +1,8 @@ import { responseHeaders } from "@/lib/responseHeaders"; import { listBucket } from "@/lib/listBucket"; import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse"; -import { Context } from "hono"; -export const getGeneratorFromName = async (c: Context) => { +export const getGeneratorFromName = async (c) => { const { gameName } = c.req.param(); const cacheKey = new Request(c.req.url.toString(), c.req); const cache = caches.default; @@ -16,7 +15,11 @@ export const getGeneratorFromName = async (c: Context) => { }); if (files.objects.length === 0) - return createNotFoundResponse("Generator not found", responseHeaders); + return createNotFoundResponse( + c, + "Generator not found", + responseHeaders + ); const data = await fetch( `https://files.wanderer.moe/${files.objects[0].key}` diff --git a/src/routes/oc-generators/getGenerators.ts b/src/routes/oc-generators/getGenerators.ts index df2125a..96f5938 100644 --- a/src/routes/oc-generators/getGenerators.ts +++ b/src/routes/oc-generators/getGenerators.ts @@ -1,8 +1,7 @@ import { responseHeaders } from "@/lib/responseHeaders"; import { listBucket } from "@/lib/listBucket"; -import { Context } from "hono"; -export const getGenerators = async (c: Context) => { +export const getGenerators = async (c) => { const cacheKey = new Request(c.req.url.toString(), c.req); const cache = caches.default; let response = await cache.match(cacheKey); diff --git a/src/routes/search/asset/assetSearch.ts b/src/routes/search/asset/assetSearch.ts index 551f4ba..5b6f822 100644 --- a/src/routes/search/asset/assetSearch.ts +++ b/src/routes/search/asset/assetSearch.ts @@ -1,10 +1,9 @@ import { responseHeaders } from "@/lib/responseHeaders"; import type { Asset } from "@/lib/types/asset"; import { getSearchResults } from "@/lib/query"; -import { getConnection } from "@/lib/planetscale"; -import { Context } from "hono"; +import { getConnection } from "@/db/turso"; -export const getAssetSearch = async (c: Context) => { +export const getAssetSearch = async (c) => { const queryParams = c.req.query(); // console.log(queryParams); const { query, game, asset, tags } = queryParams; diff --git a/src/routes/user/getUserByUsername.ts b/src/routes/user/getUserByUsername.ts index 2b6256d..f3abea4 100644 --- a/src/routes/user/getUserByUsername.ts +++ b/src/routes/user/getUserByUsername.ts @@ -1,12 +1,11 @@ import { responseHeaders } from "@/lib/responseHeaders"; -import type { User } from "@/lib/types/user"; -import type { Asset } from "@/lib/types/asset"; -import { Context } from "hono"; -import { getConnection } from "@/lib/planetscale"; +import { getConnection } from "@/db/turso"; +import { users } from "@/db/schema"; +import { eq } from "drizzle-orm"; import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse"; -export const getUserByUsername = async (c: Context) => { - const { name } = c.req.param(); +export const getUserByUsername = async (c) => { + const { username } = c.req.param(); const cacheKey = new Request(c.req.url.toString(), c.req); const cache = caches.default; let response = await cache.match(cacheKey); @@ -14,57 +13,23 @@ export const getUserByUsername = async (c: Context) => { if (response) return response; const conn = await getConnection(c.env); - const db = conn.planetscale; + const { drizzle } = conn; - const row = await db - .execute("SELECT * FROM authUser WHERE username = ?", [name]) - .then((row) => row.rows[0] as User | undefined); + const user = await drizzle + .select() + .from(users) + .where(eq(users.username, username)) + .execute(); - const user = { - id: row.id, - username: row.username, - avatar_url: row.avatar_url || null, - banner_url: row.banner_url || null, - bio: row.bio || null, - pronouns: row.pronouns || null, - verified: row.verified, - date_joined: row.date_joined, - role_flags: row.role_flags, - self_assignable_role_flags: row.self_assignable_role_flags || null, - }; - - const uploadedAssets = await db - .execute( - "SELECT * FROM assets WHERE uploaded_by = ? ORDER BY uploaded_date DESC LIMIT 5", - [user.id] - ) - .then((row) => row.rows as Asset[] | undefined) - .then( - (row) => - row?.map((asset) => { - return { - id: asset.id, - name: asset.name, - game: asset.game, - assetCategory: asset.asset_category, - url: asset.url, - tags: asset.tags, - status: asset.status, - uploadedBy: asset.uploaded_by, - uploadedDate: asset.uploaded_date, - fileSize: asset.file_size, - }; - }) - ); - - if (!row) return createNotFoundResponse("User not found", responseHeaders); + if (!user) { + return createNotFoundResponse(c, "User not found", responseHeaders); + } response = c.json( { success: true, status: "ok", user, - uploadedAssets, }, 200, responseHeaders diff --git a/src/routes/user/getUsersBySearch.ts b/src/routes/user/getUsersBySearch.ts index 4b412c8..9f989ba 100644 --- a/src/routes/user/getUsersBySearch.ts +++ b/src/routes/user/getUsersBySearch.ts @@ -1,10 +1,10 @@ import { responseHeaders } from "@/lib/responseHeaders"; -import type { User } from "@/lib/types/user"; import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse"; -import { getConnection } from "@/lib/planetscale"; -import { Context } from "hono"; +import { like } from "drizzle-orm"; +import { getConnection } from "@/db/turso"; +import { users } from "@/db/schema"; -export const getUsersBySearch = async (c: Context) => { +export const getUsersBySearch = async (c) => { const cacheKey = new Request(c.req.url.toString(), c.req); const cache = caches.default; let response = await cache.match(cacheKey); @@ -12,38 +12,24 @@ export const getUsersBySearch = async (c: Context) => { const { query } = c.req.param(); const conn = await getConnection(c.env); - const db = conn.planetscale; + const { drizzle } = conn; - const row = await db - .execute("SELECT * FROM authUser WHERE username LIKE ?", [query]) - .then((row) => row.rows as User[] | undefined); + const userList = await drizzle + .select() + .from(users) + .where(like(users.username, `%${query}%`)) + .execute(); - if (!row) return createNotFoundResponse("User not found", responseHeaders); - - const results = row?.map((user) => { - return { - id: user.id, - username: user.username, - avatar_url: user.avatar_url || null, - banner_url: user.banner_url || null, - bio: user.bio || null, - pronouns: user.pronouns || null, - verified: user.verified, - date_joined: user.date_joined, - role_flags: user.role_flags, - }; - }); - - results.sort((a, b) => - a.username === query ? -1 : b.username === query ? 1 : 0 - ); + if (!userList) { + return createNotFoundResponse(c, "Users not found", responseHeaders); + } response = c.json( { success: true, status: "ok", query, - results, + results: userList, }, 200, responseHeaders diff --git a/src/routes/user/userRoute.ts b/src/routes/user/userRoute.ts index cdbf7e8..6eeb362 100644 --- a/src/routes/user/userRoute.ts +++ b/src/routes/user/userRoute.ts @@ -4,7 +4,7 @@ import { getUserByUsername } from "./getUserByUsername"; const userRoute = new Hono(); -userRoute.get("/u/:name", async (c) => { +userRoute.get("/u/:username", async (c) => { return getUserByUsername(c); }); diff --git a/src/worker-configuration.d.ts b/src/worker-configuration.d.ts index 54bbb4c..eda041f 100644 --- a/src/worker-configuration.d.ts +++ b/src/worker-configuration.d.ts @@ -1,10 +1,9 @@ export interface Env { DISCORD_TOKEN: string; bucket: R2Bucket; - DATABASE_URL: string; - DATABASE_PASSWORD: string; - DATABASE_USERNAME: string; - DATABASE_HOST: string; ENVIRONMENT: string; VERY_SECRET_SIGNUP_KEY: string; + TURSO_DATABASE_URL: string; + TURSO_DATABASE_AUTH_TOKEN: string; + // object: DurableObject; } From 9fa92a6c6646be3342610616c104906566ce4a1f Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Thu, 24 Aug 2023 23:39:02 +0100 Subject: [PATCH 050/318] remove semis, upd deps, upload asset route --- .prettierrc | 1 + drizzle.config.ts | 4 +- package.json | 9 +- pnpm-lock.yaml | 28 +++--- src/db/drizzle.ts | 4 +- src/db/schema.ts | 74 ++++++++-------- src/db/turso.ts | 14 +-- src/index.ts | 54 ++++++------ src/lib/auth/lucia.ts | 26 +++--- src/lib/auth/roleFlags.ts | 20 ++--- src/lib/discord.ts | 4 +- src/lib/helpers/rename.ts | 4 +- src/lib/helpers/responses/notFoundResponse.ts | 2 +- src/lib/listBucket.ts | 4 +- src/lib/query.ts | 68 +++++++-------- src/lib/resend/email.ts | 28 +++--- src/lib/responseHeaders.ts | 2 +- src/lib/types/asset.ts | 28 +++--- src/lib/types/discord.ts | 22 ++--- src/lib/types/game.ts | 14 +-- src/lib/types/user.ts | 26 +++--- src/lib/validate/regexValidation.ts | 12 +-- src/lucia.d.ts | 36 ++++---- src/routes/asset/assetRoute.ts | 18 ++-- src/routes/asset/downloadAsset.ts | 34 ++++---- src/routes/asset/getAssetFromId.ts | 47 +++++----- src/routes/auth/authRoute.ts | 40 ++++----- src/routes/auth/login.ts | 48 +++++----- src/routes/auth/logout.ts | 18 ++-- src/routes/auth/signup.ts | 48 +++++----- src/routes/auth/updateUserAttributes.ts | 24 ++--- src/routes/auth/uploadAsset.ts | 87 +++++++++++++++++++ src/routes/auth/validate.ts | 32 +++---- src/routes/discord/contributors.ts | 36 ++++---- src/routes/discord/discordRoute.ts | 12 +-- src/routes/games/allGames.ts | 38 ++++---- src/routes/games/gamesRoute.ts | 12 +-- src/routes/oc-generators/getGenerator.ts | 38 ++++---- src/routes/oc-generators/getGenerators.ts | 28 +++--- src/routes/oc-generators/ocGeneratorRoutes.ts | 18 ++-- src/routes/search/asset/assetSearch.ts | 70 +++++++-------- src/routes/search/asset/searchRoute.ts | 18 ++-- src/routes/user/getUserByUsername.ts | 41 +++++---- src/routes/user/getUsersBySearch.ts | 38 ++++---- src/routes/user/userRoute.ts | 18 ++-- src/worker-configuration.d.ts | 12 +-- 46 files changed, 671 insertions(+), 588 deletions(-) create mode 100644 src/routes/auth/uploadAsset.ts diff --git a/.prettierrc b/.prettierrc index d2b1642..c29022a 100644 --- a/.prettierrc +++ b/.prettierrc @@ -4,5 +4,6 @@ "trailingComma": "es5", "endOfLine": "lf", "tabWidth": 4, + "semi": false, "plugins": [] } diff --git a/drizzle.config.ts b/drizzle.config.ts index 334f708..22ca621 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -1,4 +1,4 @@ -import type { Config } from "drizzle-kit"; +import type { Config } from "drizzle-kit" export default { out: "./src/db/migrations", @@ -7,4 +7,4 @@ export default { breakpoints: true, strict: true, verbose: true, -} satisfies Config; +} satisfies Config diff --git a/package.json b/package.json index 308b094..08355e8 100644 --- a/package.json +++ b/package.json @@ -8,11 +8,12 @@ "lint": "eslint . --ext .ts", "prettier:check": "prettier --check .", "typecheck": "tsc --noEmit", - "drizzle:generate": "drizzle-kit generate:sqlite" + "drizzle:generate": "drizzle-kit generate:sqlite", + "drizzle:push": "drizzle-kit push:sqlite" }, "devDependencies": { "@cloudflare/workers-types": "^4.20230821.0", - "@types/node": "^20.5.3", + "@types/node": "^20.5.4", "dotenv": "^16.3.1", "drizzle-kit": "^0.19.13", "eslint": "^8.47.0", @@ -27,8 +28,8 @@ "@libsql/client": "^0.3.1", "@lucia-auth/adapter-sqlite": "^2.0.0", "@typescript-eslint/eslint-plugin": "^6.4.1", - "drizzle-orm": "^0.28.3", - "hono": "^3.5.1", + "drizzle-orm": "^0.28.5", + "hono": "^3.5.4", "lucia": "^2.4.0", "mysql2": "^3.6.0", "prettier": "^3.0.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b2451d8..3c272f4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,11 +15,11 @@ dependencies: specifier: ^6.4.1 version: 6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.1.6) drizzle-orm: - specifier: ^0.28.3 - version: 0.28.3(@cloudflare/workers-types@4.20230821.0)(@libsql/client@0.3.1)(mysql2@3.6.0) + specifier: ^0.28.5 + version: 0.28.5(@cloudflare/workers-types@4.20230821.0)(@libsql/client@0.3.1)(mysql2@3.6.0) hono: - specifier: ^3.5.1 - version: 3.5.1 + specifier: ^3.5.4 + version: 3.5.4 lucia: specifier: ^2.4.0 version: 2.4.0 @@ -38,8 +38,8 @@ devDependencies: specifier: ^4.20230821.0 version: 4.20230821.0 "@types/node": - specifier: ^20.5.3 - version: 20.5.3 + specifier: ^20.5.4 + version: 20.5.4 dotenv: specifier: ^16.3.1 version: 16.3.1 @@ -1216,14 +1216,14 @@ packages: integrity: sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==, } dependencies: - "@types/node": 20.5.3 + "@types/node": 20.5.4 form-data: 3.0.1 dev: false - /@types/node@20.5.3: + /@types/node@20.5.4: resolution: { - integrity: sha512-ITI7rbWczR8a/S6qjAW7DMqxqFMjjTo61qZVWJ1ubPvbIQsL5D/TvwjYEalM8Kthpe3hTzOGrF2TGbAu2uyqeA==, + integrity: sha512-Y9vbIAoM31djQZrPYjpTLo0XlaSwOIsrlfE3LpulZeRblttsLQRFRlBAppW0LOxyT3ALj2M5vU1ucQQayQH3jA==, } /@types/semver@7.5.0: @@ -1239,7 +1239,7 @@ packages: integrity: sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==, } dependencies: - "@types/node": 20.5.3 + "@types/node": 20.5.4 dev: false /@typescript-eslint/eslint-plugin@6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.1.6): @@ -1968,10 +1968,10 @@ packages: - supports-color dev: true - /drizzle-orm@0.28.3(@cloudflare/workers-types@4.20230821.0)(@libsql/client@0.3.1)(mysql2@3.6.0): + /drizzle-orm@0.28.5(@cloudflare/workers-types@4.20230821.0)(@libsql/client@0.3.1)(mysql2@3.6.0): resolution: { - integrity: sha512-7LwNEBJH5EFvkD0vm7RdKWDZsFP9CYR4AWN2fMwns/ezexoX3+UNoVOWGRPJf1qsj357SESldrNEueFvUDfZxA==, + integrity: sha512-6r6Iw4c38NAmW6TiKH3TUpGUQ1YdlEoLJOQptn8XPx3Z63+vFNKfAiANqrIiYZiMjKR9+NYAL219nFrmo1duXA==, } peerDependencies: "@aws-sdk/client-rds-data": ">=3" @@ -2680,10 +2680,10 @@ packages: } dev: true - /hono@3.5.1: + /hono@3.5.4: resolution: { - integrity: sha512-L31KJg1Qu1ZHYKlpHYymqyDPR9U5SOy+X6c6+HQxBOGMGrJFawd5BvfcP+0rrGcw1bN5xk61+k3oKW4jFWyUkw==, + integrity: sha512-GrRBIJhZ+tG+8RtoyPQjvqPGwppERmayyTiPKano4egmpkJf1XiptESUYK5vKHICNaJksAKB9jzy1CmOdQENPA==, } engines: { node: ">=16.0.0" } dev: false diff --git a/src/db/drizzle.ts b/src/db/drizzle.ts index 1756bd3..c2c26e0 100644 --- a/src/db/drizzle.ts +++ b/src/db/drizzle.ts @@ -17,6 +17,6 @@ export const tableNames = { assetCollection: "assetCollection", assetCollectionAsset: "assetCollectionAsset", socialsConnection: "socialsConnection", -}; +} -export * as schema from "@/db/schema"; +export * as schema from "@/db/schema" diff --git a/src/db/schema.ts b/src/db/schema.ts index aef8c4d..df5fa83 100644 --- a/src/db/schema.ts +++ b/src/db/schema.ts @@ -1,11 +1,11 @@ -import { tableNames } from "@/db/drizzle"; -import { relations } from "drizzle-orm"; +import { tableNames } from "@/db/drizzle" +import { relations } from "drizzle-orm" import { sqliteTable, text, integer, uniqueIndex, -} from "drizzle-orm/sqlite-core"; +} from "drizzle-orm/sqlite-core" // users, games, categories, assets etc, i will clean this up later, sorry for anyone looking at this export const users = sqliteTable( @@ -31,9 +31,9 @@ export const users = sqliteTable( userIdx: uniqueIndex("user_idx").on(user.id), usernameIdx: uniqueIndex("username_idx").on(user.username), emailIdx: uniqueIndex("email_idx").on(user.email), - }; + } } -); +) export const sessions = sqliteTable( tableNames.authSession, @@ -47,13 +47,15 @@ export const sessions = sqliteTable( }), activeExpires: integer("active_expires").notNull(), idleExpires: integer("idle_expires").notNull(), + userAgent: text("user_agent").notNull(), + countryCode: text("country_code").notNull(), }, (session) => { return { userIdx: uniqueIndex("session_user_idx").on(session.userId), - }; + } } -); +) export const keys = sqliteTable( tableNames.authKey, @@ -70,9 +72,9 @@ export const keys = sqliteTable( (key) => { return { userIdx: uniqueIndex("keys_user_idx").on(key.userId), - }; + } } -); +) export const socialsConnection = sqliteTable(tableNames.socialsConnection, { id: text("id").primaryKey(), @@ -83,7 +85,7 @@ export const socialsConnection = sqliteTable(tableNames.socialsConnection, { onDelete: "cascade", }), discordId: text("discord_id"), -}); +}) export const games = sqliteTable( tableNames.games, @@ -97,9 +99,9 @@ export const games = sqliteTable( return { gameIdx: uniqueIndex("game_idx").on(game.id), nameIdx: uniqueIndex("name_idx").on(game.name), - }; + } } -); +) export const assetCategories = sqliteTable( tableNames.assetCategories, @@ -116,9 +118,9 @@ export const assetCategories = sqliteTable( assetCategory.id ), nameIdx: uniqueIndex("name_idx").on(assetCategory.name), - }; + } } -); +) export const gameAssetCategories = sqliteTable( tableNames.gameAssetCategories, @@ -146,14 +148,14 @@ export const gameAssetCategories = sqliteTable( assetCategoryIdx: uniqueIndex("asset_category_idx").on( gameAssetCategory.assetCategoryId ), - }; + } } -); +) export const assets = sqliteTable( tableNames.assets, { - id: integer("id").notNull(), + id: integer("id").primaryKey().notNull(), // primary key auto increments on sqlite name: text("name").notNull(), game: text("game") .notNull() @@ -174,7 +176,7 @@ export const assets = sqliteTable( onUpdate: "cascade", onDelete: "cascade", }), - uploadedDate: text("uploaded_date").notNull(), + uploadedDate: integer("uploaded_date").notNull(), viewCount: integer("view_count").default(0).notNull(), downloadCount: integer("download_count").default(0).notNull(), fileSize: integer("file_size").default(0).notNull(), @@ -197,9 +199,9 @@ export const assets = sqliteTable( uploadedByIdx: uniqueIndex("assets_uploaded_by_idx").on( table.uploadedById ), - }; + } } -); +) export const following = sqliteTable( tableNames.following, @@ -224,9 +226,9 @@ export const following = sqliteTable( followingIdx: uniqueIndex("following_idx").on( following.followingId ), - }; + } } -); +) export const follower = sqliteTable( tableNames.follower, @@ -244,9 +246,9 @@ export const follower = sqliteTable( return { followerIdx: uniqueIndex("follower_idx").on(follower.followerId), followingIdx: uniqueIndex("following_idx").on(follower.followingId), - }; + } } -); +) export const collections = sqliteTable( tableNames.assetCollection, @@ -266,9 +268,9 @@ export const collections = sqliteTable( userCollectionIdx: uniqueIndex("user_collection_idx").on( collection.userId ), - }; + } } -); +) export const collectionAssets = sqliteTable( tableNames.assetCollectionAsset, @@ -292,9 +294,9 @@ export const collectionAssets = sqliteTable( collectionAsset.collectionId, collectionAsset.assetId ), - }; + } } -); +) export const savedOcGenerators = sqliteTable( tableNames.savedOcGenerators, @@ -317,43 +319,43 @@ export const savedOcGenerators = sqliteTable( savedOcGeneratorsUserIdx: uniqueIndex( "saved_oc_generators_user_idx" ).on(savedOcGenerators.userId), - }; + } } -); +) // relations export const gameRelations = relations(games, ({ many }) => ({ assetCategories: many(gameAssetCategories), -})); +})) export const assetCategoryRelations = relations( assetCategories, ({ many }) => ({ games: many(gameAssetCategories), }) -); +) export const assetRelations = relations(assets, ({ one }) => ({ uploadedBy: one(users, { fields: [assets.uploadedById], references: [users.id], }), -})); +})) export const sessionsRelations = relations(sessions, ({ one }) => ({ user: one(users, { fields: [sessions.userId], references: [users.id], }), -})); +})) export const keysRelations = relations(keys, ({ one }) => ({ user: one(users, { fields: [keys.userId], references: [users.id], }), -})); +})) export const usersRelations = relations(users, ({ many }) => ({ session: many(sessions), @@ -363,4 +365,4 @@ export const usersRelations = relations(users, ({ many }) => ({ following: many(following), collections: many(collections), savedOcGenerators: many(savedOcGenerators), -})); +})) diff --git a/src/db/turso.ts b/src/db/turso.ts index 2cb4bc9..1e56d2b 100644 --- a/src/db/turso.ts +++ b/src/db/turso.ts @@ -1,22 +1,22 @@ -import { Env } from "../worker-configuration"; -import * as schema from "@/db/schema"; -import { drizzle as drizzleORM } from "drizzle-orm/libsql"; -import { createClient } from "@libsql/client/web"; // because we're in a worker +import { Env } from "../worker-configuration" +import * as schema from "@/db/schema" +import { drizzle as drizzleORM } from "drizzle-orm/libsql" +import { createClient } from "@libsql/client/web" // because we're in a worker // wrapper for turso & drizzle export function getConnection(env: Env) { const turso = createClient({ url: env.TURSO_DATABASE_URL, authToken: env.TURSO_DATABASE_AUTH_TOKEN, - }); + }) const drizzle = drizzleORM(turso, { schema, logger: true, - }); + }) return { drizzle, turso, - }; + } } diff --git a/src/index.ts b/src/index.ts index dc72451..787aaf0 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,39 +1,39 @@ -import { Hono } from "hono"; -import { Env } from "./worker-configuration"; -import assetRoute from "./routes/asset/assetRoute"; -import discordRoute from "./routes/discord/discordRoute"; -import ocGeneratorRoute from "./routes/oc-generators/ocGeneratorRoutes"; +import { Hono } from "hono" +import { Env } from "./worker-configuration" +import assetRoute from "./routes/asset/assetRoute" +import discordRoute from "./routes/discord/discordRoute" +import ocGeneratorRoute from "./routes/oc-generators/ocGeneratorRoutes" // import assetSearchRoute from "./routes/search/asset/searchRoute"; -import gamesRoute from "./routes/games/gamesRoute"; -import userRoute from "./routes/user/userRoute"; -import authRoute from "./routes/auth/authRoute"; +import gamesRoute from "./routes/games/gamesRoute" +import userRoute from "./routes/user/userRoute" +import authRoute from "./routes/auth/authRoute" interface Bindings extends Env { - [key: string]: unknown; + [key: string]: unknown } -const app = new Hono<{ Bindings: Bindings; Env: Env }>(); +const app = new Hono<{ Bindings: Bindings; Env: Env }>() app.get("/status", (c) => { - c.status(200); - return c.json({ status: "ok" }); -}); + c.status(200) + return c.json({ status: "ok" }) +}) app.get("/", (c) => { - c.status(200); - return c.json({ success: "true", status: "ok", routes: app.routes }); -}); -app.route("/asset", assetRoute); -app.route("/discord", discordRoute); -app.route("/oc-generators", ocGeneratorRoute); + c.status(200) + return c.json({ success: "true", status: "ok", routes: app.routes }) +}) +app.route("/asset", assetRoute) +app.route("/discord", discordRoute) +app.route("/oc-generators", ocGeneratorRoute) // app.route("/search/assets", assetSearchRoute); -app.route("/games", gamesRoute); -app.route("/user", userRoute); -app.route("/auth", authRoute); +app.route("/games", gamesRoute) +app.route("/user", userRoute) +app.route("/auth", authRoute) app.all("*", (c) => { - c.status(404); - return c.json({ status: "not found" }); -}); + c.status(404) + return c.json({ status: "not found" }) +}) // https://hono.dev/api/hono#showroutes -app.showRoutes(); +app.showRoutes() -export default app; +export default app diff --git a/src/lib/auth/lucia.ts b/src/lib/auth/lucia.ts index bf5e677..4eceeab 100644 --- a/src/lib/auth/lucia.ts +++ b/src/lib/auth/lucia.ts @@ -1,15 +1,15 @@ -import { lucia } from "lucia"; -import { hono } from "lucia/middleware"; -import { getConnection } from "@/db/turso"; -import { Env } from "@/worker-configuration"; -import { tableNames } from "@/db/drizzle"; -import { libsql } from "@lucia-auth/adapter-sqlite"; +import { lucia } from "lucia" +import { hono } from "lucia/middleware" +import { getConnection } from "@/db/turso" +import { Env } from "@/worker-configuration" +import { tableNames } from "@/db/drizzle" +import { libsql } from "@lucia-auth/adapter-sqlite" // this is so we can pass in env during requests, // so, it would be called: auth(c.env)... instead of auth export const auth = (env: Env) => { - const db = getConnection(env); - const connection = db.turso; + const db = getConnection(env) + const connection = db.turso return lucia({ adapter: libsql(connection, { @@ -40,15 +40,15 @@ export const auth = (env: Env) => { roleFlags: dbUser.role_flags, selfAssignableRoleFlags: dbUser.self_assignable_role_flags, dateJoined: dbUser.date_joined, - }; + } }, getSessionAttributes: (dbSession) => { return { userAgent: dbSession.user_agent as unknown as string, // md5 countryCode: dbSession.country_code as string, - }; + } }, - }); -}; + }) +} -export type Auth = typeof auth; +export type Auth = typeof auth diff --git a/src/lib/auth/roleFlags.ts b/src/lib/auth/roleFlags.ts index 8d088b9..d0160e0 100644 --- a/src/lib/auth/roleFlags.ts +++ b/src/lib/auth/roleFlags.ts @@ -8,17 +8,17 @@ export const roleFlags = { STAFF: 1 << 3, DEVELOPER: 1 << 4, CREATOR: 1 << 5, -}; +} export const roleFlagsToArray = (roleFlagsInt: number): string[] => { - const roles: string[] = []; + const roles: string[] = [] for (const [role, flag] of Object.entries(roleFlags)) { - if (roleFlagsInt & flag) roles.push(role); + if (roleFlagsInt & flag) roles.push(role) } - return roles; -}; + return roles +} // self assignable roles export const SelfAssignableRoleFlags = { @@ -27,16 +27,16 @@ export const SelfAssignableRoleFlags = { WRITER: 1 << 2, DEVELOPER: 1 << 3, DESIGNER: 1 << 4, -}; +} export const SelfAssignableRoleFlagsToArray = ( roleFlagsInt: number ): string[] => { - const roles: string[] = []; + const roles: string[] = [] for (const [role, flag] of Object.entries(SelfAssignableRoleFlags)) { - if (roleFlagsInt & flag) roles.push(role); + if (roleFlagsInt & flag) roles.push(role) } - return roles; -}; + return roles +} diff --git a/src/lib/discord.ts b/src/lib/discord.ts index 8dac8b4..0a273c9 100644 --- a/src/lib/discord.ts +++ b/src/lib/discord.ts @@ -7,6 +7,6 @@ export const roles: { [key: string]: string } = { "1088105796908355584": "Translator", "1005805438031364129": "Contributor", "983883539772751912": "Server Booster", -}; +} -export const guildId = "982385887000272956"; +export const guildId = "982385887000272956" diff --git a/src/lib/helpers/rename.ts b/src/lib/helpers/rename.ts index b111207..074e438 100644 --- a/src/lib/helpers/rename.ts +++ b/src/lib/helpers/rename.ts @@ -1,3 +1,3 @@ export const rename = (name: string): string => { - return name.replace(/-/g, "_"); -}; + return name.replace(/-/g, "_") +} diff --git a/src/lib/helpers/responses/notFoundResponse.ts b/src/lib/helpers/responses/notFoundResponse.ts index 009a301..2195a25 100644 --- a/src/lib/helpers/responses/notFoundResponse.ts +++ b/src/lib/helpers/responses/notFoundResponse.ts @@ -8,5 +8,5 @@ export function createNotFoundResponse(c, errorMessage, responseHeaders) { }, 404, responseHeaders - ); + ) } diff --git a/src/lib/listBucket.ts b/src/lib/listBucket.ts index ba1dbeb..38d79ca 100644 --- a/src/lib/listBucket.ts +++ b/src/lib/listBucket.ts @@ -1,3 +1,3 @@ export const listBucket = async (bucket, options) => { - return await bucket.list(options); -}; + return await bucket.list(options) +} diff --git a/src/lib/query.ts b/src/lib/query.ts index d406bbf..4455551 100644 --- a/src/lib/query.ts +++ b/src/lib/query.ts @@ -1,7 +1,7 @@ -import type { Asset } from "@/lib/types/asset"; -import { getConnection } from "@/db/turso"; +import type { Asset } from "@/lib/types/asset" +import { getConnection } from "@/db/turso" -type queryParameter = string | number; +type queryParameter = string | number export const getSearchResults = async ( query: string, @@ -10,17 +10,17 @@ export const getSearchResults = async ( tagsArray: string[], c ): Promise => { - let sqlQuery = `SELECT * FROM assets WHERE 1=1`; - const parameters = []; + let sqlQuery = `SELECT * FROM assets WHERE 1=1` + const parameters = [] - sqlQuery = addQueryToSqlQuery(query, sqlQuery, parameters); - sqlQuery = addGameToSqlQuery(gameArray, sqlQuery, parameters); - sqlQuery = addAssetToSqlQuery(assetArray, sqlQuery, parameters); - sqlQuery = addTagsToSqlQuery(tagsArray, sqlQuery, parameters); + sqlQuery = addQueryToSqlQuery(query, sqlQuery, parameters) + sqlQuery = addGameToSqlQuery(gameArray, sqlQuery, parameters) + sqlQuery = addAssetToSqlQuery(assetArray, sqlQuery, parameters) + sqlQuery = addTagsToSqlQuery(tagsArray, sqlQuery, parameters) - sqlQuery += ` ORDER BY uploaded_date DESC`; + sqlQuery += ` ORDER BY uploaded_date DESC` - sqlQuery = limitResults(sqlQuery); + sqlQuery = limitResults(sqlQuery) if ( !query && @@ -28,16 +28,16 @@ export const getSearchResults = async ( !assetArray.length && !tagsArray.length ) { - sqlQuery = `SELECT * FROM assets ORDER BY uploaded_date DESC LIMIT 30`; + sqlQuery = `SELECT * FROM assets ORDER BY uploaded_date DESC LIMIT 30` } - const conn = await getConnection(c.env); - const db = conn.planetscale; + const conn = await getConnection(c.env) + const db = conn.planetscale return await db .execute(sqlQuery, parameters) - .then((row) => row.rows as Asset[]); -}; + .then((row) => row.rows as Asset[]) +} const addQueryToSqlQuery = ( query: string, @@ -45,11 +45,11 @@ const addQueryToSqlQuery = ( parameters: queryParameter[] ): string => { if (query) { - sqlQuery += ` AND name LIKE ?`; - parameters.push(`%${query}%`); + sqlQuery += ` AND name LIKE ?` + parameters.push(`%${query}%`) } - return sqlQuery; -}; + return sqlQuery +} const addGameToSqlQuery = ( gameArray: string[], @@ -57,11 +57,11 @@ const addGameToSqlQuery = ( parameters: queryParameter[] ): string => { if (gameArray.length) { - sqlQuery += ` AND game IN (${gameArray.map(() => "?").join(",")})`; - parameters.push(...gameArray); + sqlQuery += ` AND game IN (${gameArray.map(() => "?").join(",")})` + parameters.push(...gameArray) } - return sqlQuery; -}; + return sqlQuery +} const addAssetToSqlQuery = ( assetArray: string[], @@ -71,11 +71,11 @@ const addAssetToSqlQuery = ( if (assetArray.length) { sqlQuery += ` AND asset_category IN (${assetArray .map(() => "?") - .join(",")})`; - parameters.push(...assetArray); + .join(",")})` + parameters.push(...assetArray) } - return sqlQuery; -}; + return sqlQuery +} const addTagsToSqlQuery = ( tagsArray: string[], @@ -86,12 +86,12 @@ const addTagsToSqlQuery = ( sqlQuery += ` AND tags IN (${tagsArray .map(() => "?") .join(",") - .toUpperCase()})`; - parameters.push(...tagsArray); + .toUpperCase()})` + parameters.push(...tagsArray) } - return sqlQuery; -}; + return sqlQuery +} const limitResults = (sqlQuery: string): string => { - return (sqlQuery += ` LIMIT 1500`); -}; + return (sqlQuery += ` LIMIT 1500`) +} diff --git a/src/lib/resend/email.ts b/src/lib/resend/email.ts index ea955cd..4a1d315 100644 --- a/src/lib/resend/email.ts +++ b/src/lib/resend/email.ts @@ -1,7 +1,7 @@ -import { Resend } from "resend"; +import { Resend } from "resend" // TODO: use react email w/ tailwind -export const resend = new Resend(""); +export const resend = new Resend("") export const sendPasswordResetEmail = async ( email: string, @@ -14,11 +14,11 @@ export const sendPasswordResetEmail = async ( to: email, subject: "Password Reset Request", html: `Password reset for ${username}
Click here to reset your password`, - }); + }) } catch (error) { - throw new Error("Error sending password reset email."); + throw new Error("Error sending password reset email.") } -}; +} export const sendPasswordChangeEmail = async ( email: string, @@ -30,11 +30,11 @@ export const sendPasswordChangeEmail = async ( to: email, subject: "Password Updated Confirmation", html: `Your password for ${username} has been updated.
Wasn't you? Contact us at support@wanderer.moe`, - }); + }) } catch (error) { - throw new Error("Error sending password change email."); + throw new Error("Error sending password change email.") } -}; +} export const sendEmailChangeEmail = async (email: string, username: string) => { try { @@ -43,11 +43,11 @@ export const sendEmailChangeEmail = async (email: string, username: string) => { to: email, subject: "Email Change Request", html: `Your email address for ${username} has been changed.
Wasn't you? Contact us at support@wanderer.moe`, - }); + }) } catch (error) { - throw new Error("Error sending email change email."); + throw new Error("Error sending email change email.") } -}; +} export const sendEmailConfirmationEmail = async ( email: string, @@ -60,8 +60,8 @@ export const sendEmailConfirmationEmail = async ( to: email, subject: "Email Confirmation", html: `Email confirmation for ${username}
Click here to confirm your email`, - }); + }) } catch (error) { - throw new Error("Error sending email confirmation email."); + throw new Error("Error sending email confirmation email.") } -}; +} diff --git a/src/lib/responseHeaders.ts b/src/lib/responseHeaders.ts index a913dc9..9a968a5 100644 --- a/src/lib/responseHeaders.ts +++ b/src/lib/responseHeaders.ts @@ -3,4 +3,4 @@ export const responseHeaders: Record = { "Referrer-Policy": "strict-origin-when-cross-origin", "content-type": "application/json;charset=UTF-8", "access-control-allow-origin": "*", -}; +} diff --git a/src/lib/types/asset.ts b/src/lib/types/asset.ts index 94e1cd3..2250bd4 100644 --- a/src/lib/types/asset.ts +++ b/src/lib/types/asset.ts @@ -1,16 +1,16 @@ export interface Asset { - id: number; - name: string; - game: string; - asset_category: string; - tags: string; - url: string; - status: string; - uploaded_by: string; - uploaded_date: string; - view_count?: number; - download_count?: number; - file_size: number; - width: number; - height: number; + id: number + name: string + game: string + asset_category: string + tags: string + url: string + status: string + uploaded_by: string + uploaded_date: string + view_count?: number + download_count?: number + file_size: number + width: number + height: number } diff --git a/src/lib/types/discord.ts b/src/lib/types/discord.ts index a0bc932..470e292 100644 --- a/src/lib/types/discord.ts +++ b/src/lib/types/discord.ts @@ -1,17 +1,17 @@ export interface Contributor { - id: string; - username: string; - globalname: string | null; - avatar: string; - roles: string[]; + id: string + username: string + globalname: string | null + avatar: string + roles: string[] } export interface GuildMember { - roles: string[]; + roles: string[] user: { - id: string; - username: string; - global_name: string | null; - avatar: string; - }; + id: string + username: string + global_name: string | null + avatar: string + } } diff --git a/src/lib/types/game.ts b/src/lib/types/game.ts index 8f915c4..f282afb 100644 --- a/src/lib/types/game.ts +++ b/src/lib/types/game.ts @@ -1,9 +1,9 @@ export interface Game { - id: number; - name: string; - asset_count: number; - asset_categories: string; // comma separated category1,category2,category3 - category_count: number; - last_updated: string; - has_generator: boolean; + id: number + name: string + asset_count: number + asset_categories: string // comma separated category1,category2,category3 + category_count: number + last_updated: string + has_generator: boolean } diff --git a/src/lib/types/user.ts b/src/lib/types/user.ts index 2743d0e..b2d97ee 100644 --- a/src/lib/types/user.ts +++ b/src/lib/types/user.ts @@ -1,15 +1,15 @@ export interface User { - id: string; - username: string; - username_colour: string | null; - avatar_url: string | null; - banner_url: string | null; - email: string; - email_verified: number; - pronouns: string | null; - verified: number; - bio: string | null; - role_flags: number; - self_assignable_role_flags: number; - date_joined: Date; + id: string + username: string + username_colour: string | null + avatar_url: string | null + banner_url: string | null + email: string + email_verified: number + pronouns: string | null + verified: number + bio: string | null + role_flags: number + self_assignable_role_flags: number + date_joined: Date } diff --git a/src/lib/validate/regexValidation.ts b/src/lib/validate/regexValidation.ts index 6f3cf13..a8d10ea 100644 --- a/src/lib/validate/regexValidation.ts +++ b/src/lib/validate/regexValidation.ts @@ -1,18 +1,18 @@ // must have @ and . inside to be considered an email export function email(email: string) { - const emailRegex = /\S+@\S+\.\S+/; - return emailRegex.test(email); + const emailRegex = /\S+@\S+\.\S+/ + return emailRegex.test(email) } // minimum eight characters, at least one uppercase letter, one lowercase letter, one number and one special character export function password(password: string) { const passwordRegex = - /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$/; - return passwordRegex.test(password); + /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$/ + return passwordRegex.test(password) } // 5 to 16 characters which contain only characters, numeric digits, underscore and first character must be a letter export function username(username: string) { - const usernameRegex = /^[a-zA-Z0-9]{5,16}$/; - return usernameRegex.test(username); + const usernameRegex = /^[a-zA-Z0-9]{5,16}$/ + return usernameRegex.test(username) } diff --git a/src/lucia.d.ts b/src/lucia.d.ts index c2d7f7b..d7f5905 100644 --- a/src/lucia.d.ts +++ b/src/lucia.d.ts @@ -1,23 +1,23 @@ /// declare namespace Lucia { - type Auth = import("./lib/auth/lucia").Auth; + type Auth = import("./lib/auth/lucia").Auth type DatabaseUserAttributes = { - username: string; - username_colour: string | null; - avatar_url: string | null; - banner_url: string | null; - email: string; - email_verified: number; - pronouns: string | null; - is_contributor: number; - verified: number; - bio: string | null; - role_flags: number; - self_assignable_role_flags: number | null; - date_joined: number; - }; + username: string + username_colour: string | null + avatar_url: string | null + banner_url: string | null + email: string + email_verified: number + pronouns: string | null + is_contributor: number + verified: number + bio: string | null + role_flags: number + self_assignable_role_flags: number | null + date_joined: number + } type DatabaseSessionAttributes = { - country_code: string; - user_agent: string; - }; + country_code: string + user_agent: string + } } diff --git a/src/routes/asset/assetRoute.ts b/src/routes/asset/assetRoute.ts index ef48672..708d6a6 100644 --- a/src/routes/asset/assetRoute.ts +++ b/src/routes/asset/assetRoute.ts @@ -1,16 +1,16 @@ -import { Hono } from "hono"; -import { getAssetFromId } from "./getAssetFromId"; -import { downloadAsset } from "./downloadAsset"; +import { Hono } from "hono" +import { getAssetFromId } from "./getAssetFromId" +import { downloadAsset } from "./downloadAsset" -const assetRoute = new Hono(); +const assetRoute = new Hono() assetRoute.get("/:id", async (c) => { - return getAssetFromId(c); -}); + return getAssetFromId(c) +}) // setting both of these to id returns "duplicate param name" error, will fix later assetRoute.get("/download/:assetId", async (c) => { - return downloadAsset(c); -}); + return downloadAsset(c) +}) -export default assetRoute; +export default assetRoute diff --git a/src/routes/asset/downloadAsset.ts b/src/routes/asset/downloadAsset.ts index 33e2848..196049c 100644 --- a/src/routes/asset/downloadAsset.ts +++ b/src/routes/asset/downloadAsset.ts @@ -1,33 +1,31 @@ -import { responseHeaders } from "@/lib/responseHeaders"; -import { getConnection } from "@/db/turso"; -import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse"; -import { eq } from "drizzle-orm"; -import { assets } from "@/db/schema"; +import { responseHeaders } from "@/lib/responseHeaders" +import { getConnection } from "@/db/turso" +import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse" +import { eq } from "drizzle-orm" +import { assets } from "@/db/schema" export const downloadAsset = async (c) => { - const { assetId } = c.req.param(); + const { assetId } = c.req.param() - const conn = await getConnection(c.env); - const { drizzle } = conn; + const drizzle = await getConnection(c.env).drizzle const asset = await drizzle .select() .from(assets) .where(eq(assets.id, assetId)) - .execute(); + .execute() - if (!asset) { - return createNotFoundResponse(c, "Asset not found", responseHeaders); - } + if (!asset) + return createNotFoundResponse(c, "Asset not found", responseHeaders) - const response = await fetch(asset[0].url); + const response = await fetch(asset[0].url) - const blob = await response.blob(); + const blob = await response.blob() - const headers = new Headers(); - headers.set("Content-Disposition", `attachment; filename=${asset[0].name}`); + const headers = new Headers() + headers.set("Content-Disposition", `attachment; filename=${asset[0].name}`) return new Response(blob, { headers: headers, - }); -}; + }) +} diff --git a/src/routes/asset/getAssetFromId.ts b/src/routes/asset/getAssetFromId.ts index d165e04..7896169 100644 --- a/src/routes/asset/getAssetFromId.ts +++ b/src/routes/asset/getAssetFromId.ts @@ -1,34 +1,29 @@ -import { responseHeaders } from "@/lib/responseHeaders"; -import { getConnection } from "@/db/turso"; -import { assets } from "@/db/schema"; -import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse"; -import { eq, desc } from "drizzle-orm"; +import { responseHeaders } from "@/lib/responseHeaders" +import { getConnection } from "@/db/turso" +import { assets } from "@/db/schema" +import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse" +import { eq, desc } from "drizzle-orm" export const getAssetFromId = async (c) => { - const { id } = c.req.param(); - const cacheKey = new Request(c.req.url.toString(), c.req); - const cache = caches.default; - let response = await cache.match(cacheKey); + const { id } = c.req.param() + const cacheKey = new Request(c.req.url.toString(), c.req) + const cache = caches.default + let response = await cache.match(cacheKey) - if (response) return response; + if (response) return response - const conn = await getConnection(c.env); - const { drizzle } = conn; + const drizzle = await getConnection(c.env).drizzle const asset = await drizzle .select() .from(assets) .where(eq(assets.id, id)) - .execute(); + .execute() if (!asset) { - response = createNotFoundResponse( - c, - "Asset not found", - responseHeaders - ); - await cache.put(cacheKey, response.clone()); - return response; + response = createNotFoundResponse(c, "Asset not found", responseHeaders) + await cache.put(cacheKey, response.clone()) + return response } const similarAssets = await drizzle @@ -37,7 +32,7 @@ export const getAssetFromId = async (c) => { .where(eq(assets.assetCategory, asset[0].assetCategory)) .limit(6) .orderBy(desc(assets.id)) - .execute(); + .execute() response = c.json( { @@ -48,10 +43,10 @@ export const getAssetFromId = async (c) => { }, 200, responseHeaders - ); + ) - response.headers.set("Cache-Control", "s-maxage=604800"); - await cache.put(cacheKey, response.clone()); + response.headers.set("Cache-Control", "s-maxage=604800") + await cache.put(cacheKey, response.clone()) - return response; -}; + return response +} diff --git a/src/routes/auth/authRoute.ts b/src/routes/auth/authRoute.ts index 309c137..cecca92 100644 --- a/src/routes/auth/authRoute.ts +++ b/src/routes/auth/authRoute.ts @@ -1,12 +1,12 @@ -import { Hono } from "hono"; -import { login } from "./login"; -import { logout } from "./logout"; -import { signup } from "./signup"; -import { cors } from "hono/cors"; -import { validate } from "./validate"; -import { updateUserAttributes } from "./updateUserAttributes"; +import { Hono } from "hono" +import { login } from "./login" +import { logout } from "./logout" +import { signup } from "./signup" +import { cors } from "hono/cors" +import { validate } from "./validate" +import { updateUserAttributes } from "./updateUserAttributes" -const authRoute = new Hono(); +const authRoute = new Hono() authRoute.use( "*", @@ -14,26 +14,26 @@ authRoute.use( credentials: true, origin: ["https://next.wanderer.moe", "http://localhost:3000"], }) -); +) authRoute.post("/login", async (c) => { - return login(c); -}); + return login(c) +}) authRoute.post("/updateattributes", async (c) => { - return updateUserAttributes(c); -}); + return updateUserAttributes(c) +}) authRoute.post("/signup", async (c) => { - return signup(c); -}); + return signup(c) +}) authRoute.get("/validate", async (c) => { - return validate(c); -}); + return validate(c) +}) authRoute.post("/logout", async (c) => { - return logout(c); -}); + return logout(c) +}) -export default authRoute; +export default authRoute diff --git a/src/routes/auth/login.ts b/src/routes/auth/login.ts index 7a1f497..38f4c59 100644 --- a/src/routes/auth/login.ts +++ b/src/routes/auth/login.ts @@ -1,28 +1,28 @@ -import { auth } from "@/lib/auth/lucia"; +import { auth } from "@/lib/auth/lucia" // import * as validate from "@/lib/regex/accountValidation"; const usernameThrottling = new Map< string, { - timeoutUntil: number; - timeoutSeconds: number; + timeoutUntil: number + timeoutSeconds: number } ->(); +>() export const login = async (c): Promise => { - const formData = await c.req.formData(); + const formData = await c.req.formData() - const username = formData.get("username") as string; - const password = formData.get("password") as string; + const username = formData.get("username") as string + const password = formData.get("password") as string // console.log(username, password); - const validSession = await auth(c.env).handleRequest(c).validate(); + const validSession = await auth(c.env).handleRequest(c).validate() if (validSession) - return c.json({ success: false, state: "already logged in" }, 200); + return c.json({ success: false, state: "already logged in" }, 200) - const storedThrottling = usernameThrottling.get(username); - const timeoutUntil = storedThrottling?.timeoutUntil ?? 0; + const storedThrottling = usernameThrottling.get(username) + const timeoutUntil = storedThrottling?.timeoutUntil ?? 0 if (timeoutUntil > Date.now()) { return c.json( @@ -34,23 +34,23 @@ export const login = async (c): Promise => { } seconds`, }, 400 - ); + ) } const user = await auth(c.env).useKey( "username", username.toLowerCase(), password - ); + ) if (!user) { const timeoutSeconds = storedThrottling ? storedThrottling.timeoutSeconds * 2 - : 1; + : 1 usernameThrottling.set(username, { timeoutUntil: Date.now() + timeoutSeconds * 1000, timeoutSeconds, - }); + }) return c.json( { success: false, @@ -58,11 +58,11 @@ export const login = async (c): Promise => { error: `Invalid credentials - wait ${timeoutSeconds} seconds`, }, 400 - ); + ) } - const userAgent = c.req.headers.get("user-agent") ?? ""; - const countryCode = c.req.headers.get("cf-ipcountry") ?? ""; + const userAgent = c.req.headers.get("user-agent") ?? "" + const countryCode = c.req.headers.get("cf-ipcountry") ?? "" const newSession = await auth(c.env).createSession({ userId: user.userId, @@ -70,12 +70,12 @@ export const login = async (c): Promise => { country_code: countryCode, user_agent: userAgent, }, - }); + }) - console.log("valid session created", countryCode, userAgent); + console.log("valid session created", countryCode, userAgent) - const authRequest = await auth(c.env).handleRequest(c); - authRequest.setSession(newSession); + const authRequest = await auth(c.env).handleRequest(c) + authRequest.setSession(newSession) - return c.json({ success: true, state: "logged in" }, 200); -}; + return c.json({ success: true, state: "logged in" }, 200) +} diff --git a/src/routes/auth/logout.ts b/src/routes/auth/logout.ts index 08a5316..ae27857 100644 --- a/src/routes/auth/logout.ts +++ b/src/routes/auth/logout.ts @@ -1,17 +1,17 @@ -import { auth } from "@/lib/auth/lucia"; +import { auth } from "@/lib/auth/lucia" export const logout = async (c): Promise => { - const authRequest = auth(c.env).handleRequest(c); - const session = await authRequest.validate(); + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() if (!session) { - return c.json({ success: false, state: "invalid session" }, 200); + return c.json({ success: false, state: "invalid session" }, 200) } // this is useful to clean up dead sessions that are still in the database - await auth(c.env).deleteDeadUserSessions(session.userId); - await auth(c.env).invalidateSession(session.sessionId); - authRequest.setSession(null); + await auth(c.env).deleteDeadUserSessions(session.userId) + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) - return c.json({ success: true, state: "logged out" }, 200); -}; + return c.json({ success: true, state: "logged out" }, 200) +} diff --git a/src/routes/auth/signup.ts b/src/routes/auth/signup.ts index 10c6fb5..d440c11 100644 --- a/src/routes/auth/signup.ts +++ b/src/routes/auth/signup.ts @@ -1,20 +1,20 @@ -import { auth } from "@/lib/auth/lucia"; +import { auth } from "@/lib/auth/lucia" // import * as validate from "@/lib/regex/accountValidation"; export const signup = async (c) => { - const formData = await c.req.formData(); + const formData = await c.req.formData() - const secretKeyRequiredForSignup = c.env.VERY_SECRET_SIGNUP_KEY; + const secretKeyRequiredForSignup = c.env.VERY_SECRET_SIGNUP_KEY - const username = formData.get("username") as string; - const email = formData.get("email") as string; - const password = formData.get("password") as string; - const passwordConfirm = formData.get("passwordConfirm") as string; - const secretKey = formData.get("secretKey") as string; + const username = formData.get("username") as string + const email = formData.get("email") as string + const password = formData.get("password") as string + const passwordConfirm = formData.get("passwordConfirm") as string + const secretKey = formData.get("secretKey") as string - const validSession = await auth(c.env).handleRequest(c).validate(); + const validSession = await auth(c.env).handleRequest(c).validate() if (validSession) - return c.json({ success: false, state: "already logged in" }, 200); + return c.json({ success: false, state: "already logged in" }, 200) if ( secretKeyRequiredForSignup !== secretKey || @@ -27,10 +27,10 @@ export const signup = async (c) => { error: "Invalid credentials", }, 400 - ); + ) } - console.log("creating user"); + console.log("creating user") try { const user = await auth(c.env).createUser({ @@ -51,13 +51,13 @@ export const signup = async (c) => { username_colour: null, avatar_url: null, banner_url: null, - pronouns: null, - bio: null, + pronouns: null, // we can splice this into possesive, subject, and object pronouns by "/" + bio: "No bio set", }, - }); + }) - const userAgent = c.req.headers.get("user-agent") ?? ""; - const countryCode = c.req.headers.get("cf-ipcountry") ?? ""; + const userAgent = c.req.headers.get("user-agent") ?? "" + const countryCode = c.req.headers.get("cf-ipcountry") ?? "" const newSession = await auth(c.env).createSession({ userId: user.userId, @@ -65,13 +65,13 @@ export const signup = async (c) => { country_code: countryCode, user_agent: userAgent, }, - }); + }) - const authRequest = auth(c.env).handleRequest(c); - authRequest.setSession(newSession); - return c.json({ success: true, state: "logged in" }, 200); + const authRequest = auth(c.env).handleRequest(c) + authRequest.setSession(newSession) + return c.json({ success: true, state: "logged in" }, 200) } catch (e) { - console.log(e); + console.log(e) return c.json( { success: false, @@ -79,6 +79,6 @@ export const signup = async (c) => { error: "Error creating user", }, 500 - ); + ) } -}; +} diff --git a/src/routes/auth/updateUserAttributes.ts b/src/routes/auth/updateUserAttributes.ts index ba5dab0..ecee066 100644 --- a/src/routes/auth/updateUserAttributes.ts +++ b/src/routes/auth/updateUserAttributes.ts @@ -1,32 +1,32 @@ -import { auth } from "@/lib/auth/lucia"; +import { auth } from "@/lib/auth/lucia" export const updateUserAttributes = async (c) => { - const authRequest = auth(c.env).handleRequest(c); - const session = await authRequest.validate(); + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() if (!session) { - authRequest.setSession(null); - return c.json({ success: false, state: "invalid session" }, 200); + authRequest.setSession(null) + return c.json({ success: false, state: "invalid session" }, 200) } - const formData = await c.req.formData(); + const formData = await c.req.formData() const attributes = { username: formData.get("username") as string | null, username_colour: formData.get("username_colour") as string | null, pronouns: formData.get("pronouns") as string | null, bio: formData.get("bio") as string | null, - }; + } // remove null values from attributes Object.keys(attributes).forEach((key) => { - if (attributes[key] === null) delete attributes[key]; - }); + if (attributes[key] === null) delete attributes[key] + }) - await auth(c.env).updateUserAttributes(session.userId, attributes); + await auth(c.env).updateUserAttributes(session.userId, attributes) return c.json( { success: true, state: "updated user attributes", session }, 200 - ); -}; + ) +} diff --git a/src/routes/auth/uploadAsset.ts b/src/routes/auth/uploadAsset.ts new file mode 100644 index 0000000..1f3ae38 --- /dev/null +++ b/src/routes/auth/uploadAsset.ts @@ -0,0 +1,87 @@ +import { auth } from "@/lib/auth/lucia" +import { getConnection } from "@/db/turso" +import { eq, and } from "drizzle-orm" +import { assets } from "@/db/schema" + +export const uploadAsset = async (c) => { + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() + + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + return c.json({ success: false, state: "invalid session" }, 200) + } + + // return unauthorized if user is not a contributor + if (session.user.is_contributor !== 1) + return c.json({ success: false, state: "unauthorized" }, 401) + + const bypassApproval = session.user.is_contributor === 1 + + const drizzle = await getConnection(c.env).drizzle + + const formData = await c.req.formData() + const asset = formData.get("asset") as File + + // clear out metadata + const metadata = { + title: formData.get("title") as string, // e.g keqing + extension: formData.get("extension") as string, // e.g png + tags: formData.get("tags") as string, // e.g no-background, fanmade, official + category: formData.get("category") as string, // e.g splash-art + game: formData.get("game") as string, // e.g genshin-impact + size: formData.get("size") as number, // e.g 1024 + width: formData.get("width") as number, // e.g 1920 + height: formData.get("height") as number, // e.g 1080 + } + + const newAsset = { + name: `${metadata.title}.${metadata.extension}`, + game: metadata.game, + assetCategory: metadata.category, + tags: metadata.tags, + url: `/assets/${metadata.game}/${metadata.category}/${metadata.title}.${metadata.extension}`, + uploadedById: session.userId, + status: bypassApproval ? "approved" : "pending", + uploadedDate: new Date().getTime(), + fileSize: asset.size, // stored in bytes + width: metadata.width, + height: metadata.height, + } + + // rename file name to match metadata + const newAssetFile = new File([asset], newAsset.name, { + type: asset.type, + }) + + // check if asset already exists with same name, game, and category + const duplicateAsset = await drizzle + .select() + .from(assets) + .where( + and( + eq(assets.name, newAsset.name), + eq(assets.game, newAsset.game), + eq(assets.assetCategory, newAsset.assetCategory) + ) + ) + + if (duplicateAsset) + return c.json({ success: false, state: "duplicate asset" }, 400) + + try { + await c.env.bucket.put( + `/assets/${metadata.game}/${metadata.category}/${metadata.title}.${metadata.extension}`, + newAssetFile + ) + + await drizzle.insert(assets).values(newAsset) + } catch (e) { + return c.json({ success: false, state: "failed to upload asset" }, 500) + } + + return c.json({ success: true, state: "uploaded asset" }, 200) +} diff --git a/src/routes/auth/validate.ts b/src/routes/auth/validate.ts index e898faf..d5f8f6a 100644 --- a/src/routes/auth/validate.ts +++ b/src/routes/auth/validate.ts @@ -1,17 +1,17 @@ -import { auth } from "@/lib/auth/lucia"; +import { auth } from "@/lib/auth/lucia" export const validate = async (c): Promise => { - console.log(c); - const authRequest = auth(c.env).handleRequest(c); + console.log(c) + const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate(); + const session = await authRequest.validate() - const countryCode = c.req.headers.get("cf-ipcountry") ?? ""; - const userAgent = c.req.headers.get("user-agent") ?? ""; + const countryCode = c.req.headers.get("cf-ipcountry") ?? "" + const userAgent = c.req.headers.get("user-agent") ?? "" if (!session) { - authRequest.setSession(null); - return c.json({ success: false, state: "invalid session" }, 200); + authRequest.setSession(null) + return c.json({ success: false, state: "invalid session" }, 200) } // console.log(session); @@ -20,16 +20,16 @@ export const validate = async (c): Promise => { session.userAgent !== userAgent || session.countryCode !== countryCode ) { - await auth(c.env).invalidateSession(session.sessionId); - authRequest.setSession(null); - return c.json({ success: false, state: "invalid session" }, 200); + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + return c.json({ success: false, state: "invalid session" }, 200) } if (session.state === "idle") { - await auth(c.env).invalidateSession(session.sessionId); - authRequest.setSession(null); - return c.json({ success: false, state: "invalid session" }, 200); + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + return c.json({ success: false, state: "invalid session" }, 200) } - return c.json({ success: true, state: "valid session", session }, 200); -}; + return c.json({ success: true, state: "valid session", session }, 200) +} diff --git a/src/routes/discord/contributors.ts b/src/routes/discord/contributors.ts index 552446f..63c86a6 100644 --- a/src/routes/discord/contributors.ts +++ b/src/routes/discord/contributors.ts @@ -1,12 +1,12 @@ -import { responseHeaders } from "@/lib/responseHeaders"; -import { roles, guildId } from "@/lib/discord"; -import type { Contributor, GuildMember } from "@/lib/types/discord"; +import { responseHeaders } from "@/lib/responseHeaders" +import { roles, guildId } from "@/lib/discord" +import type { Contributor, GuildMember } from "@/lib/types/discord" export const contributors = async (c) => { - const members: Contributor[] = []; + const members: Contributor[] = [] - let after: string | null = null; - let fetchUsers = true; + let after: string | null = null + let fetchUsers = true while (fetchUsers) { const response = await fetch( @@ -18,20 +18,20 @@ export const contributors = async (c) => { Authorization: `Bot ${c.env.DISCORD_TOKEN}`, }, } - ); + ) - const guildMembers: GuildMember[] = await response.json(); + const guildMembers: GuildMember[] = await response.json() const filteredMembers: GuildMember[] = guildMembers.filter((member) => { return member.roles.some((role) => Object.keys(roles).includes(role) - ); - }); + ) + }) const contributors: Contributor[] = filteredMembers.map((member) => { const rolesArray = member.roles .map((role) => roles[role]) - .filter((role) => role); + .filter((role) => role) // TODO: support animated avatars return { @@ -40,19 +40,19 @@ export const contributors = async (c) => { globalname: member.user.global_name || null, avatar: `https://cdn.discordapp.com/avatars/${member.user.id}/${member.user.avatar}.webp`, roles: rolesArray, - }; - }); + } + }) - members.push(...contributors); + members.push(...contributors) if ( !guildMembers.length || !guildMembers[guildMembers.length - 1].user ) { - fetchUsers = false; + fetchUsers = false } - after = guildMembers[guildMembers.length - 1]?.user?.id; + after = guildMembers[guildMembers.length - 1]?.user?.id } return c.json( @@ -63,5 +63,5 @@ export const contributors = async (c) => { }, 200, responseHeaders - ); -}; + ) +} diff --git a/src/routes/discord/discordRoute.ts b/src/routes/discord/discordRoute.ts index fbe37d0..4a48d93 100644 --- a/src/routes/discord/discordRoute.ts +++ b/src/routes/discord/discordRoute.ts @@ -1,10 +1,10 @@ -import { Hono } from "hono"; -import { contributors } from "./contributors"; +import { Hono } from "hono" +import { contributors } from "./contributors" -const discordRoute = new Hono(); +const discordRoute = new Hono() discordRoute.get("/contributors", async (c) => { - return contributors(c); -}); + return contributors(c) +}) -export default discordRoute; +export default discordRoute diff --git a/src/routes/games/allGames.ts b/src/routes/games/allGames.ts index c599f50..2286bde 100644 --- a/src/routes/games/allGames.ts +++ b/src/routes/games/allGames.ts @@ -1,28 +1,28 @@ -import { responseHeaders } from "@/lib/responseHeaders"; -import { getConnection } from "@/db/turso"; -import { listBucket } from "@/lib/listBucket"; -import { games } from "@/db/schema"; +import { responseHeaders } from "@/lib/responseHeaders" +import { getConnection } from "@/db/turso" +import { listBucket } from "@/lib/listBucket" +import { games } from "@/db/schema" export const getAllGames = async (c) => { - const cacheKey = new Request(c.req.url.toString(), c.req); - const cache = caches.default; - let response = await cache.match(cacheKey); + const cacheKey = new Request(c.req.url.toString(), c.req) + const cache = caches.default + let response = await cache.match(cacheKey) - if (response) return response; + if (response) return response const files = await listBucket(c.env.bucket, { prefix: "oc-generators/", delimiter: "/", - }); + }) const results = files.delimitedPrefixes.map((file) => { return { name: file.replace("oc-generators/", "").replace("/", ""), - }; - }); + } + }) - const conn = await getConnection(c.env); - const { drizzle } = conn; + const conn = await getConnection(c.env) + const { drizzle } = conn const gamesList = await drizzle .select() @@ -35,7 +35,7 @@ export const getAllGames = async (c) => { (generator) => generator.name === game.name ), })) - ); + ) response = c.json( { @@ -45,10 +45,10 @@ export const getAllGames = async (c) => { }, 200, responseHeaders - ); + ) - response.headers.set("Cache-Control", "s-maxage=1200"); - await cache.put(cacheKey, response.clone()); + response.headers.set("Cache-Control", "s-maxage=1200") + await cache.put(cacheKey, response.clone()) - return response; -}; + return response +} diff --git a/src/routes/games/gamesRoute.ts b/src/routes/games/gamesRoute.ts index cc18fa3..ba2ce74 100644 --- a/src/routes/games/gamesRoute.ts +++ b/src/routes/games/gamesRoute.ts @@ -1,10 +1,10 @@ -import { Hono } from "hono"; -import { getAllGames } from "./allGames"; +import { Hono } from "hono" +import { getAllGames } from "./allGames" -const gamesRoute = new Hono(); +const gamesRoute = new Hono() gamesRoute.get("/all", async (c) => { - return getAllGames(c); -}); + return getAllGames(c) +}) -export default gamesRoute; +export default gamesRoute diff --git a/src/routes/oc-generators/getGenerator.ts b/src/routes/oc-generators/getGenerator.ts index a30c784..4019238 100644 --- a/src/routes/oc-generators/getGenerator.ts +++ b/src/routes/oc-generators/getGenerator.ts @@ -1,31 +1,27 @@ -import { responseHeaders } from "@/lib/responseHeaders"; -import { listBucket } from "@/lib/listBucket"; -import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse"; +import { responseHeaders } from "@/lib/responseHeaders" +import { listBucket } from "@/lib/listBucket" +import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse" export const getGeneratorFromName = async (c) => { - const { gameName } = c.req.param(); - const cacheKey = new Request(c.req.url.toString(), c.req); - const cache = caches.default; - let response = await cache.match(cacheKey); + const { gameName } = c.req.param() + const cacheKey = new Request(c.req.url.toString(), c.req) + const cache = caches.default + let response = await cache.match(cacheKey) - if (response) return response; + if (response) return response const files = await listBucket(c.env.bucket, { prefix: `oc-generators/${gameName}/list.json`, - }); + }) if (files.objects.length === 0) - return createNotFoundResponse( - c, - "Generator not found", - responseHeaders - ); + return createNotFoundResponse(c, "Generator not found", responseHeaders) const data = await fetch( `https://files.wanderer.moe/${files.objects[0].key}` - ); + ) - const generatorData = await data.json(); + const generatorData = await data.json() response = c.json( { @@ -34,10 +30,10 @@ export const getGeneratorFromName = async (c) => { }, 200, responseHeaders - ); + ) - response.headers.set("Cache-Control", "s-maxage=604800"); // the content of this file is unlikely to change, so caching is fine - await cache.put(cacheKey, response.clone()); + response.headers.set("Cache-Control", "s-maxage=604800") // the content of this file is unlikely to change, so caching is fine + await cache.put(cacheKey, response.clone()) - return response; -}; + return response +} diff --git a/src/routes/oc-generators/getGenerators.ts b/src/routes/oc-generators/getGenerators.ts index 96f5938..b5f5e80 100644 --- a/src/routes/oc-generators/getGenerators.ts +++ b/src/routes/oc-generators/getGenerators.ts @@ -1,19 +1,19 @@ -import { responseHeaders } from "@/lib/responseHeaders"; -import { listBucket } from "@/lib/listBucket"; +import { responseHeaders } from "@/lib/responseHeaders" +import { listBucket } from "@/lib/listBucket" export const getGenerators = async (c) => { - const cacheKey = new Request(c.req.url.toString(), c.req); - const cache = caches.default; - let response = await cache.match(cacheKey); + const cacheKey = new Request(c.req.url.toString(), c.req) + const cache = caches.default + let response = await cache.match(cacheKey) - if (response) return response; + if (response) return response // listing all files inside of oc-generators subfolder, as they can't be manually inputted // by users but instead stored on the oc-generators repo const files = await listBucket(c.env.bucket, { prefix: "oc-generators/", delimiter: "/", - }); + }) // console.log(files); @@ -23,8 +23,8 @@ export const getGenerators = async (c) => { path: `/oc-generators/${file .replace("oc-generators/", "") .replace("/", "")}`, - }; - }); + } + }) response = c.json( { @@ -33,10 +33,10 @@ export const getGenerators = async (c) => { }, 200, responseHeaders - ); + ) - response.headers.set("Cache-Control", "s-maxage=28800"); - await cache.put(cacheKey, response.clone()); + response.headers.set("Cache-Control", "s-maxage=28800") + await cache.put(cacheKey, response.clone()) - return response; -}; + return response +} diff --git a/src/routes/oc-generators/ocGeneratorRoutes.ts b/src/routes/oc-generators/ocGeneratorRoutes.ts index 7e76329..ecb8505 100644 --- a/src/routes/oc-generators/ocGeneratorRoutes.ts +++ b/src/routes/oc-generators/ocGeneratorRoutes.ts @@ -1,15 +1,15 @@ -import { Hono } from "hono"; -import { getGeneratorFromName } from "./getGenerator"; -import { getGenerators } from "./getGenerators"; +import { Hono } from "hono" +import { getGeneratorFromName } from "./getGenerator" +import { getGenerators } from "./getGenerators" -const ocGeneratorRoute = new Hono(); +const ocGeneratorRoute = new Hono() ocGeneratorRoute.get("/", async (c) => { - return getGenerators(c); -}); + return getGenerators(c) +}) ocGeneratorRoute.get("/:gameName", async (c) => { - return getGeneratorFromName(c); -}); + return getGeneratorFromName(c) +}) -export default ocGeneratorRoute; +export default ocGeneratorRoute diff --git a/src/routes/search/asset/assetSearch.ts b/src/routes/search/asset/assetSearch.ts index 5b6f822..14a9f9c 100644 --- a/src/routes/search/asset/assetSearch.ts +++ b/src/routes/search/asset/assetSearch.ts @@ -1,23 +1,23 @@ -import { responseHeaders } from "@/lib/responseHeaders"; -import type { Asset } from "@/lib/types/asset"; -import { getSearchResults } from "@/lib/query"; -import { getConnection } from "@/db/turso"; +import { responseHeaders } from "@/lib/responseHeaders" +import type { Asset } from "@/lib/types/asset" +import { getSearchResults } from "@/lib/query" +import { getConnection } from "@/db/turso" export const getAssetSearch = async (c) => { - const queryParams = c.req.query(); + const queryParams = c.req.query() // console.log(queryParams); - const { query, game, asset, tags } = queryParams; + const { query, game, asset, tags } = queryParams // Convert game and asset parameters to arrays - const gameArray = game ? game.split(",") : []; - const assetArray = asset ? asset.split(",") : []; - const tagsArray = tags ? tags.split(",") : []; + const gameArray = game ? game.split(",") : [] + const assetArray = asset ? asset.split(",") : [] + const tagsArray = tags ? tags.split(",") : [] - const cacheKey = new Request(c.req.url.toString(), c.req); - const cache = caches.default; - let response = await cache.match(cacheKey); + const cacheKey = new Request(c.req.url.toString(), c.req) + const cache = caches.default + let response = await cache.match(cacheKey) - if (response) return response; + if (response) return response // console.log(query, gameArray, assetArray, tags); @@ -37,8 +37,8 @@ export const getAssetSearch = async (c) => { file_size: results.file_size, width: results.width, height: results.height, - }; - }); + } + }) response = c.json( { @@ -52,30 +52,30 @@ export const getAssetSearch = async (c) => { }, 200, responseHeaders - ); + ) - response.headers.set("Cache-Control", "s-maxage=3600"); - await cache.put(cacheKey, response.clone()); + response.headers.set("Cache-Control", "s-maxage=3600") + await cache.put(cacheKey, response.clone()) - return response; -}; + return response +} export const recentAssets = async (c) => { - const cacheKey = new Request(c.req.url.toString(), c.req); - const cache = caches.default; - let response = await cache.match(cacheKey); - if (response) return response; + const cacheKey = new Request(c.req.url.toString(), c.req) + const cache = caches.default + let response = await cache.match(cacheKey) + if (response) return response - const conn = await getConnection(c.env); - const db = conn.planetscale; + const conn = await getConnection(c.env) + const db = conn.planetscale const row = await db .execute( "SELECT * FROM assets WHERE 1=1 ORDER BY uploaded_date DESC LIMIT 30" ) - .then((row) => row.rows as Asset[] | undefined); + .then((row) => row.rows as Asset[] | undefined) - if (!row) throw new Error("No results found"); + if (!row) throw new Error("No results found") const results = row.map((asset) => { return { @@ -91,8 +91,8 @@ export const recentAssets = async (c) => { file_size: asset.file_size, width: asset.width, height: asset.height, - }; - }); + } + }) response = c.json( { @@ -102,10 +102,10 @@ export const recentAssets = async (c) => { }, 200, responseHeaders - ); + ) - response.headers.set("Cache-Control", "s-maxage=3600"); - await cache.put(cacheKey, response.clone()); + response.headers.set("Cache-Control", "s-maxage=3600") + await cache.put(cacheKey, response.clone()) - return response; -}; + return response +} diff --git a/src/routes/search/asset/searchRoute.ts b/src/routes/search/asset/searchRoute.ts index 8cf6813..de5a343 100644 --- a/src/routes/search/asset/searchRoute.ts +++ b/src/routes/search/asset/searchRoute.ts @@ -1,15 +1,15 @@ -import { Hono } from "hono"; -import { getAssetSearch } from "./assetSearch"; -import { recentAssets } from "./assetSearch"; +import { Hono } from "hono" +import { getAssetSearch } from "./assetSearch" +import { recentAssets } from "./assetSearch" -const assetSearchRoute = new Hono(); +const assetSearchRoute = new Hono() assetSearchRoute.get("/", async (c) => { - return getAssetSearch(c); -}); + return getAssetSearch(c) +}) assetSearchRoute.get("/recent", async (c) => { - return recentAssets(c); -}); + return recentAssets(c) +}) -export default assetSearchRoute; +export default assetSearchRoute diff --git a/src/routes/user/getUserByUsername.ts b/src/routes/user/getUserByUsername.ts index f3abea4..c4fe0d8 100644 --- a/src/routes/user/getUserByUsername.ts +++ b/src/routes/user/getUserByUsername.ts @@ -1,30 +1,33 @@ -import { responseHeaders } from "@/lib/responseHeaders"; -import { getConnection } from "@/db/turso"; -import { users } from "@/db/schema"; -import { eq } from "drizzle-orm"; -import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse"; +import { responseHeaders } from "@/lib/responseHeaders" +import { getConnection } from "@/db/turso" +import { users } from "@/db/schema" +import { eq } from "drizzle-orm" +import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse" export const getUserByUsername = async (c) => { - const { username } = c.req.param(); - const cacheKey = new Request(c.req.url.toString(), c.req); - const cache = caches.default; - let response = await cache.match(cacheKey); + const { username } = c.req.param() + const cacheKey = new Request(c.req.url.toString(), c.req) + const cache = caches.default + let response = await cache.match(cacheKey) - if (response) return response; + if (response) return response - const conn = await getConnection(c.env); - const { drizzle } = conn; + const drizzle = await getConnection(c.env).drizzle const user = await drizzle .select() .from(users) .where(eq(users.username, username)) - .execute(); + .execute() if (!user) { - return createNotFoundResponse(c, "User not found", responseHeaders); + return createNotFoundResponse(c, "User not found", responseHeaders) } + // removing email-related fields + user[0].email = undefined + user[0].emailVerified = undefined + response = c.json( { success: true, @@ -33,10 +36,10 @@ export const getUserByUsername = async (c) => { }, 200, responseHeaders - ); + ) - response.headers.set("Cache-Control", "s-maxage=300"); - await cache.put(cacheKey, response.clone()); + response.headers.set("Cache-Control", "s-maxage=300") + await cache.put(cacheKey, response.clone()) - return response; -}; + return response +} diff --git a/src/routes/user/getUsersBySearch.ts b/src/routes/user/getUsersBySearch.ts index 9f989ba..33f3d6c 100644 --- a/src/routes/user/getUsersBySearch.ts +++ b/src/routes/user/getUsersBySearch.ts @@ -1,27 +1,27 @@ -import { responseHeaders } from "@/lib/responseHeaders"; -import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse"; -import { like } from "drizzle-orm"; -import { getConnection } from "@/db/turso"; -import { users } from "@/db/schema"; +import { responseHeaders } from "@/lib/responseHeaders" +import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse" +import { like } from "drizzle-orm" +import { getConnection } from "@/db/turso" +import { users } from "@/db/schema" export const getUsersBySearch = async (c) => { - const cacheKey = new Request(c.req.url.toString(), c.req); - const cache = caches.default; - let response = await cache.match(cacheKey); - if (response) return response; + const cacheKey = new Request(c.req.url.toString(), c.req) + const cache = caches.default + let response = await cache.match(cacheKey) + if (response) return response - const { query } = c.req.param(); - const conn = await getConnection(c.env); - const { drizzle } = conn; + const { query } = c.req.param() + const conn = await getConnection(c.env) + const { drizzle } = conn const userList = await drizzle .select() .from(users) .where(like(users.username, `%${query}%`)) - .execute(); + .execute() if (!userList) { - return createNotFoundResponse(c, "Users not found", responseHeaders); + return createNotFoundResponse(c, "Users not found", responseHeaders) } response = c.json( @@ -33,10 +33,10 @@ export const getUsersBySearch = async (c) => { }, 200, responseHeaders - ); + ) - response.headers.set("Cache-Control", "s-maxage=60"); - await cache.put(cacheKey, response.clone()); + response.headers.set("Cache-Control", "s-maxage=60") + await cache.put(cacheKey, response.clone()) - return response; -}; + return response +} diff --git a/src/routes/user/userRoute.ts b/src/routes/user/userRoute.ts index 6eeb362..f087fcc 100644 --- a/src/routes/user/userRoute.ts +++ b/src/routes/user/userRoute.ts @@ -1,15 +1,15 @@ -import { Hono } from "hono"; -import { getUsersBySearch } from "./getUsersBySearch"; -import { getUserByUsername } from "./getUserByUsername"; +import { Hono } from "hono" +import { getUsersBySearch } from "./getUsersBySearch" +import { getUserByUsername } from "./getUserByUsername" -const userRoute = new Hono(); +const userRoute = new Hono() userRoute.get("/u/:username", async (c) => { - return getUserByUsername(c); -}); + return getUserByUsername(c) +}) userRoute.get("/s/:query", async (c) => { - return getUsersBySearch(c); -}); + return getUsersBySearch(c) +}) -export default userRoute; +export default userRoute diff --git a/src/worker-configuration.d.ts b/src/worker-configuration.d.ts index eda041f..7ffd3cb 100644 --- a/src/worker-configuration.d.ts +++ b/src/worker-configuration.d.ts @@ -1,9 +1,9 @@ export interface Env { - DISCORD_TOKEN: string; - bucket: R2Bucket; - ENVIRONMENT: string; - VERY_SECRET_SIGNUP_KEY: string; - TURSO_DATABASE_URL: string; - TURSO_DATABASE_AUTH_TOKEN: string; + DISCORD_TOKEN: string + bucket: R2Bucket + ENVIRONMENT: string + VERY_SECRET_SIGNUP_KEY: string + TURSO_DATABASE_URL: string + TURSO_DATABASE_AUTH_TOKEN: string // object: DurableObject; } From aed77d92af20ff4ad69b89db591b89fe997ebfc3 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Thu, 24 Aug 2023 23:48:18 +0100 Subject: [PATCH 051/318] user upload avatar & update self assignable roles --- src/routes/auth/updateUserAttributes.ts | 4 ++- src/routes/auth/uploadAvatar.ts | 33 +++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 src/routes/auth/uploadAvatar.ts diff --git a/src/routes/auth/updateUserAttributes.ts b/src/routes/auth/updateUserAttributes.ts index ecee066..d796ff5 100644 --- a/src/routes/auth/updateUserAttributes.ts +++ b/src/routes/auth/updateUserAttributes.ts @@ -13,8 +13,10 @@ export const updateUserAttributes = async (c) => { const attributes = { username: formData.get("username") as string | null, - username_colour: formData.get("username_colour") as string | null, pronouns: formData.get("pronouns") as string | null, + self_assignable_role_flags: formData.get("self_assignable_roles") as + | number + | null, bio: formData.get("bio") as string | null, } diff --git a/src/routes/auth/uploadAvatar.ts b/src/routes/auth/uploadAvatar.ts new file mode 100644 index 0000000..03005fb --- /dev/null +++ b/src/routes/auth/uploadAvatar.ts @@ -0,0 +1,33 @@ +import { auth } from "@/lib/auth/lucia" + +export const uploadProfileImage = async (c): Promise => { + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() + + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + return c.json({ success: false, state: "invalid session" }, 200) + } + + const formData = await c.req.formData() + + const avatar = formData.get("avatar") as File | null + + const newAvatar = new File([avatar], `${session.userId}.png`) + const newAvatarURL = `/avatars/${session.userId}.png` + + if (!session.user.avatar_url) { + await auth(c.env).updateUserAttributes(session.userId, { + avatar_url: newAvatarURL, + }) + } + + await c.env.bucket.put(newAvatarURL, newAvatar, { + contentType: "image/png", + }) + + return c.json({ success: true, state: "uploaded new profile image" }, 200) +} From b89fec0f87830ef5627cdfe0fe5ef15de01b73a1 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Thu, 24 Aug 2023 23:53:16 +0100 Subject: [PATCH 052/318] response promises & check for file type --- src/routes/asset/downloadAsset.ts | 2 +- src/routes/asset/getAssetFromId.ts | 2 +- src/routes/auth/signup.ts | 2 +- src/routes/auth/updateUserAttributes.ts | 2 +- src/routes/auth/uploadAsset.ts | 8 ++++++-- src/routes/auth/uploadAvatar.ts | 4 ++++ src/routes/discord/contributors.ts | 2 +- src/routes/games/allGames.ts | 2 +- src/routes/oc-generators/getGenerator.ts | 2 +- src/routes/oc-generators/getGenerators.ts | 2 +- src/routes/search/asset/assetSearch.ts | 4 ++-- src/routes/user/getUserByUsername.ts | 2 +- src/routes/user/getUsersBySearch.ts | 2 +- 13 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/routes/asset/downloadAsset.ts b/src/routes/asset/downloadAsset.ts index 196049c..a9e72ab 100644 --- a/src/routes/asset/downloadAsset.ts +++ b/src/routes/asset/downloadAsset.ts @@ -4,7 +4,7 @@ import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse import { eq } from "drizzle-orm" import { assets } from "@/db/schema" -export const downloadAsset = async (c) => { +export const downloadAsset = async (c): Promise => { const { assetId } = c.req.param() const drizzle = await getConnection(c.env).drizzle diff --git a/src/routes/asset/getAssetFromId.ts b/src/routes/asset/getAssetFromId.ts index 7896169..6bc71d9 100644 --- a/src/routes/asset/getAssetFromId.ts +++ b/src/routes/asset/getAssetFromId.ts @@ -4,7 +4,7 @@ import { assets } from "@/db/schema" import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse" import { eq, desc } from "drizzle-orm" -export const getAssetFromId = async (c) => { +export const getAssetFromId = async (c): Promise => { const { id } = c.req.param() const cacheKey = new Request(c.req.url.toString(), c.req) const cache = caches.default diff --git a/src/routes/auth/signup.ts b/src/routes/auth/signup.ts index d440c11..f76203b 100644 --- a/src/routes/auth/signup.ts +++ b/src/routes/auth/signup.ts @@ -1,7 +1,7 @@ import { auth } from "@/lib/auth/lucia" // import * as validate from "@/lib/regex/accountValidation"; -export const signup = async (c) => { +export const signup = async (c): Promise => { const formData = await c.req.formData() const secretKeyRequiredForSignup = c.env.VERY_SECRET_SIGNUP_KEY diff --git a/src/routes/auth/updateUserAttributes.ts b/src/routes/auth/updateUserAttributes.ts index d796ff5..4ab5310 100644 --- a/src/routes/auth/updateUserAttributes.ts +++ b/src/routes/auth/updateUserAttributes.ts @@ -1,6 +1,6 @@ import { auth } from "@/lib/auth/lucia" -export const updateUserAttributes = async (c) => { +export const updateUserAttributes = async (c): Promise => { const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() diff --git a/src/routes/auth/uploadAsset.ts b/src/routes/auth/uploadAsset.ts index 1f3ae38..19f6767 100644 --- a/src/routes/auth/uploadAsset.ts +++ b/src/routes/auth/uploadAsset.ts @@ -3,7 +3,7 @@ import { getConnection } from "@/db/turso" import { eq, and } from "drizzle-orm" import { assets } from "@/db/schema" -export const uploadAsset = async (c) => { +export const uploadAsset = async (c): Promise => { const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() @@ -24,7 +24,11 @@ export const uploadAsset = async (c) => { const drizzle = await getConnection(c.env).drizzle const formData = await c.req.formData() - const asset = formData.get("asset") as File + const asset = formData.get("asset") as File | null + + if (!asset || asset.type !== "image/png") { + return c.json({ success: false, state: "invalid asset" }, 200) + } // clear out metadata const metadata = { diff --git a/src/routes/auth/uploadAvatar.ts b/src/routes/auth/uploadAvatar.ts index 03005fb..e2ed69d 100644 --- a/src/routes/auth/uploadAvatar.ts +++ b/src/routes/auth/uploadAvatar.ts @@ -16,6 +16,10 @@ export const uploadProfileImage = async (c): Promise => { const avatar = formData.get("avatar") as File | null + if (!avatar || avatar.type !== "image/png") { + return c.json({ success: false, state: "invalid avatar" }, 200) + } + const newAvatar = new File([avatar], `${session.userId}.png`) const newAvatarURL = `/avatars/${session.userId}.png` diff --git a/src/routes/discord/contributors.ts b/src/routes/discord/contributors.ts index 63c86a6..4b60630 100644 --- a/src/routes/discord/contributors.ts +++ b/src/routes/discord/contributors.ts @@ -2,7 +2,7 @@ import { responseHeaders } from "@/lib/responseHeaders" import { roles, guildId } from "@/lib/discord" import type { Contributor, GuildMember } from "@/lib/types/discord" -export const contributors = async (c) => { +export const contributors = async (c): Promise => { const members: Contributor[] = [] let after: string | null = null diff --git a/src/routes/games/allGames.ts b/src/routes/games/allGames.ts index 2286bde..0b9a082 100644 --- a/src/routes/games/allGames.ts +++ b/src/routes/games/allGames.ts @@ -3,7 +3,7 @@ import { getConnection } from "@/db/turso" import { listBucket } from "@/lib/listBucket" import { games } from "@/db/schema" -export const getAllGames = async (c) => { +export const getAllGames = async (c): Promise => { const cacheKey = new Request(c.req.url.toString(), c.req) const cache = caches.default let response = await cache.match(cacheKey) diff --git a/src/routes/oc-generators/getGenerator.ts b/src/routes/oc-generators/getGenerator.ts index 4019238..061bcf1 100644 --- a/src/routes/oc-generators/getGenerator.ts +++ b/src/routes/oc-generators/getGenerator.ts @@ -2,7 +2,7 @@ import { responseHeaders } from "@/lib/responseHeaders" import { listBucket } from "@/lib/listBucket" import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse" -export const getGeneratorFromName = async (c) => { +export const getGeneratorFromName = async (c): Promise => { const { gameName } = c.req.param() const cacheKey = new Request(c.req.url.toString(), c.req) const cache = caches.default diff --git a/src/routes/oc-generators/getGenerators.ts b/src/routes/oc-generators/getGenerators.ts index b5f5e80..d305f15 100644 --- a/src/routes/oc-generators/getGenerators.ts +++ b/src/routes/oc-generators/getGenerators.ts @@ -1,7 +1,7 @@ import { responseHeaders } from "@/lib/responseHeaders" import { listBucket } from "@/lib/listBucket" -export const getGenerators = async (c) => { +export const getGenerators = async (c): Promise => { const cacheKey = new Request(c.req.url.toString(), c.req) const cache = caches.default let response = await cache.match(cacheKey) diff --git a/src/routes/search/asset/assetSearch.ts b/src/routes/search/asset/assetSearch.ts index 14a9f9c..97b9edd 100644 --- a/src/routes/search/asset/assetSearch.ts +++ b/src/routes/search/asset/assetSearch.ts @@ -3,7 +3,7 @@ import type { Asset } from "@/lib/types/asset" import { getSearchResults } from "@/lib/query" import { getConnection } from "@/db/turso" -export const getAssetSearch = async (c) => { +export const getAssetSearch = async (c): Promise => { const queryParams = c.req.query() // console.log(queryParams); const { query, game, asset, tags } = queryParams @@ -60,7 +60,7 @@ export const getAssetSearch = async (c) => { return response } -export const recentAssets = async (c) => { +export const recentAssets = async (c): Promise => { const cacheKey = new Request(c.req.url.toString(), c.req) const cache = caches.default let response = await cache.match(cacheKey) diff --git a/src/routes/user/getUserByUsername.ts b/src/routes/user/getUserByUsername.ts index c4fe0d8..963f838 100644 --- a/src/routes/user/getUserByUsername.ts +++ b/src/routes/user/getUserByUsername.ts @@ -4,7 +4,7 @@ import { users } from "@/db/schema" import { eq } from "drizzle-orm" import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse" -export const getUserByUsername = async (c) => { +export const getUserByUsername = async (c): Promise => { const { username } = c.req.param() const cacheKey = new Request(c.req.url.toString(), c.req) const cache = caches.default diff --git a/src/routes/user/getUsersBySearch.ts b/src/routes/user/getUsersBySearch.ts index 33f3d6c..38936f3 100644 --- a/src/routes/user/getUsersBySearch.ts +++ b/src/routes/user/getUsersBySearch.ts @@ -4,7 +4,7 @@ import { like } from "drizzle-orm" import { getConnection } from "@/db/turso" import { users } from "@/db/schema" -export const getUsersBySearch = async (c) => { +export const getUsersBySearch = async (c): Promise => { const cacheKey = new Request(c.req.url.toString(), c.req) const cache = caches.default let response = await cache.match(cacheKey) From 83798ee20617c1603b08ee1f98fd87d3f8644158 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Fri, 25 Aug 2023 00:00:20 +0100 Subject: [PATCH 053/318] upload banner route --- src/routes/auth/authRoute.ts | 17 +++++++++++- src/routes/auth/uploadAvatar.ts | 1 + src/routes/auth/uploadBanner.ts | 42 ++++++++++++++++++++++++++++++ src/routes/discord/contributors.ts | 1 + 4 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 src/routes/auth/uploadBanner.ts diff --git a/src/routes/auth/authRoute.ts b/src/routes/auth/authRoute.ts index cecca92..2378655 100644 --- a/src/routes/auth/authRoute.ts +++ b/src/routes/auth/authRoute.ts @@ -4,7 +4,10 @@ import { logout } from "./logout" import { signup } from "./signup" import { cors } from "hono/cors" import { validate } from "./validate" +import { uploadProfileImage } from "./uploadAvatar" +import { uploadBannerImage } from "./uploadBanner" import { updateUserAttributes } from "./updateUserAttributes" +import { uploadAsset } from "./uploadAsset" const authRoute = new Hono() @@ -20,10 +23,22 @@ authRoute.post("/login", async (c) => { return login(c) }) -authRoute.post("/updateattributes", async (c) => { +authRoute.post("/update/attributes", async (c) => { return updateUserAttributes(c) }) +authRoute.post("/upload/asset", async (c) => { + return uploadAsset(c) +}) + +authRoute.post("/upload/avatar", async (c) => { + return uploadProfileImage(c) +}) + +authRoute.post("/upload/banner", async (c) => { + return uploadBannerImage(c) +}) + authRoute.post("/signup", async (c) => { return signup(c) }) diff --git a/src/routes/auth/uploadAvatar.ts b/src/routes/auth/uploadAvatar.ts index e2ed69d..a190d80 100644 --- a/src/routes/auth/uploadAvatar.ts +++ b/src/routes/auth/uploadAvatar.ts @@ -1,5 +1,6 @@ import { auth } from "@/lib/auth/lucia" +// TODO: add support for animated avatars export const uploadProfileImage = async (c): Promise => { const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() diff --git a/src/routes/auth/uploadBanner.ts b/src/routes/auth/uploadBanner.ts new file mode 100644 index 0000000..f8cfa53 --- /dev/null +++ b/src/routes/auth/uploadBanner.ts @@ -0,0 +1,42 @@ +import { auth } from "@/lib/auth/lucia" + +// TODO: add support for animated banners +export const uploadBannerImage = async (c): Promise => { + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() + + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + return c.json({ success: false, state: "invalid session" }, 200) + } + + if (session.user.is_contributor !== 1) { + return c.json({ success: false, state: "unauthorized" }, 401) + } + + const formData = await c.req.formData() + + const banner = formData.get("banner") as File | null + + if (!banner || banner.type !== "image/png") { + return c.json({ success: false, state: "invalid banner" }, 200) + } + + const newBanner = new File([banner], `${session.userId}.png`) + const newBannerURL = `/banners/${session.userId}.png` + + if (!session.user.banner_url) { + await auth(c.env).updateUserAttributes(session.userId, { + banner_url: newBannerURL, + }) + } + + await c.env.bucket.put(newBannerURL, newBanner, { + contentType: "image/png", + }) + + return c.json({ success: true, state: "uploaded new banner" }, 200) +} diff --git a/src/routes/discord/contributors.ts b/src/routes/discord/contributors.ts index 4b60630..a78c836 100644 --- a/src/routes/discord/contributors.ts +++ b/src/routes/discord/contributors.ts @@ -2,6 +2,7 @@ import { responseHeaders } from "@/lib/responseHeaders" import { roles, guildId } from "@/lib/discord" import type { Contributor, GuildMember } from "@/lib/types/discord" +// TODO: replace discord contributors with roles on the site export const contributors = async (c): Promise => { const members: Contributor[] = [] From 89937aa90d53bc659c22df464823cdb2ab731cf9 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Fri, 25 Aug 2023 00:04:47 +0100 Subject: [PATCH 054/318] update const routes to funcs --- src/routes/asset/downloadAsset.ts | 2 +- src/routes/asset/getAssetFromId.ts | 2 +- src/routes/auth/login.ts | 2 +- src/routes/auth/logout.ts | 2 +- src/routes/auth/signup.ts | 2 +- src/routes/auth/updateUserAttributes.ts | 2 +- src/routes/auth/uploadAsset.ts | 2 +- src/routes/auth/uploadAvatar.ts | 3 +-- src/routes/auth/uploadBanner.ts | 2 +- src/routes/auth/validate.ts | 2 +- src/routes/discord/contributors.ts | 2 +- src/routes/games/allGames.ts | 2 +- src/routes/oc-generators/getGenerator.ts | 2 +- src/routes/oc-generators/getGenerators.ts | 2 +- src/routes/search/asset/assetSearch.ts | 4 ++-- src/routes/user/getUserByUsername.ts | 2 +- src/routes/user/getUsersBySearch.ts | 2 +- 17 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/routes/asset/downloadAsset.ts b/src/routes/asset/downloadAsset.ts index a9e72ab..c2fa1b8 100644 --- a/src/routes/asset/downloadAsset.ts +++ b/src/routes/asset/downloadAsset.ts @@ -4,7 +4,7 @@ import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse import { eq } from "drizzle-orm" import { assets } from "@/db/schema" -export const downloadAsset = async (c): Promise => { +export async function downloadAsset(c): Promise { const { assetId } = c.req.param() const drizzle = await getConnection(c.env).drizzle diff --git a/src/routes/asset/getAssetFromId.ts b/src/routes/asset/getAssetFromId.ts index 6bc71d9..7c1f518 100644 --- a/src/routes/asset/getAssetFromId.ts +++ b/src/routes/asset/getAssetFromId.ts @@ -4,7 +4,7 @@ import { assets } from "@/db/schema" import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse" import { eq, desc } from "drizzle-orm" -export const getAssetFromId = async (c): Promise => { +export async function getAssetFromId(c): Promise { const { id } = c.req.param() const cacheKey = new Request(c.req.url.toString(), c.req) const cache = caches.default diff --git a/src/routes/auth/login.ts b/src/routes/auth/login.ts index 38f4c59..c465ea1 100644 --- a/src/routes/auth/login.ts +++ b/src/routes/auth/login.ts @@ -9,7 +9,7 @@ const usernameThrottling = new Map< } >() -export const login = async (c): Promise => { +export async function login(c): Promise { const formData = await c.req.formData() const username = formData.get("username") as string diff --git a/src/routes/auth/logout.ts b/src/routes/auth/logout.ts index ae27857..c9dc557 100644 --- a/src/routes/auth/logout.ts +++ b/src/routes/auth/logout.ts @@ -1,6 +1,6 @@ import { auth } from "@/lib/auth/lucia" -export const logout = async (c): Promise => { +export async function logout(c): Promise { const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() diff --git a/src/routes/auth/signup.ts b/src/routes/auth/signup.ts index f76203b..a34fd55 100644 --- a/src/routes/auth/signup.ts +++ b/src/routes/auth/signup.ts @@ -1,7 +1,7 @@ import { auth } from "@/lib/auth/lucia" // import * as validate from "@/lib/regex/accountValidation"; -export const signup = async (c): Promise => { +export async function signup(c): Promise { const formData = await c.req.formData() const secretKeyRequiredForSignup = c.env.VERY_SECRET_SIGNUP_KEY diff --git a/src/routes/auth/updateUserAttributes.ts b/src/routes/auth/updateUserAttributes.ts index 4ab5310..d229a87 100644 --- a/src/routes/auth/updateUserAttributes.ts +++ b/src/routes/auth/updateUserAttributes.ts @@ -1,6 +1,6 @@ import { auth } from "@/lib/auth/lucia" -export const updateUserAttributes = async (c): Promise => { +export async function updateUserAttributes(c): Promise { const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() diff --git a/src/routes/auth/uploadAsset.ts b/src/routes/auth/uploadAsset.ts index 19f6767..1650ccd 100644 --- a/src/routes/auth/uploadAsset.ts +++ b/src/routes/auth/uploadAsset.ts @@ -3,7 +3,7 @@ import { getConnection } from "@/db/turso" import { eq, and } from "drizzle-orm" import { assets } from "@/db/schema" -export const uploadAsset = async (c): Promise => { +export async function uploadAsset(c): Promise { const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() diff --git a/src/routes/auth/uploadAvatar.ts b/src/routes/auth/uploadAvatar.ts index a190d80..35e7372 100644 --- a/src/routes/auth/uploadAvatar.ts +++ b/src/routes/auth/uploadAvatar.ts @@ -1,8 +1,7 @@ import { auth } from "@/lib/auth/lucia" // TODO: add support for animated avatars -export const uploadProfileImage = async (c): Promise => { - const authRequest = auth(c.env).handleRequest(c) +export async function uploadProfileImage(c): Promise { const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() if (!session || session.state === "idle" || session.state === "invalid") { diff --git a/src/routes/auth/uploadBanner.ts b/src/routes/auth/uploadBanner.ts index f8cfa53..e041ee5 100644 --- a/src/routes/auth/uploadBanner.ts +++ b/src/routes/auth/uploadBanner.ts @@ -1,7 +1,7 @@ import { auth } from "@/lib/auth/lucia" // TODO: add support for animated banners -export const uploadBannerImage = async (c): Promise => { +export async function uploadBannerImage(c): Promise { const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() diff --git a/src/routes/auth/validate.ts b/src/routes/auth/validate.ts index d5f8f6a..94e1d40 100644 --- a/src/routes/auth/validate.ts +++ b/src/routes/auth/validate.ts @@ -1,6 +1,6 @@ import { auth } from "@/lib/auth/lucia" -export const validate = async (c): Promise => { +export async function validate(c): Promise { console.log(c) const authRequest = auth(c.env).handleRequest(c) diff --git a/src/routes/discord/contributors.ts b/src/routes/discord/contributors.ts index a78c836..9c8ed82 100644 --- a/src/routes/discord/contributors.ts +++ b/src/routes/discord/contributors.ts @@ -3,7 +3,7 @@ import { roles, guildId } from "@/lib/discord" import type { Contributor, GuildMember } from "@/lib/types/discord" // TODO: replace discord contributors with roles on the site -export const contributors = async (c): Promise => { +export async function contributors(c): Promise { const members: Contributor[] = [] let after: string | null = null diff --git a/src/routes/games/allGames.ts b/src/routes/games/allGames.ts index 0b9a082..bd1a99f 100644 --- a/src/routes/games/allGames.ts +++ b/src/routes/games/allGames.ts @@ -3,7 +3,7 @@ import { getConnection } from "@/db/turso" import { listBucket } from "@/lib/listBucket" import { games } from "@/db/schema" -export const getAllGames = async (c): Promise => { +export async function getAllGames(c): Promise { const cacheKey = new Request(c.req.url.toString(), c.req) const cache = caches.default let response = await cache.match(cacheKey) diff --git a/src/routes/oc-generators/getGenerator.ts b/src/routes/oc-generators/getGenerator.ts index 061bcf1..08a32ea 100644 --- a/src/routes/oc-generators/getGenerator.ts +++ b/src/routes/oc-generators/getGenerator.ts @@ -2,7 +2,7 @@ import { responseHeaders } from "@/lib/responseHeaders" import { listBucket } from "@/lib/listBucket" import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse" -export const getGeneratorFromName = async (c): Promise => { +export async function getGeneratorFromName(c): Promise { const { gameName } = c.req.param() const cacheKey = new Request(c.req.url.toString(), c.req) const cache = caches.default diff --git a/src/routes/oc-generators/getGenerators.ts b/src/routes/oc-generators/getGenerators.ts index d305f15..f8fa464 100644 --- a/src/routes/oc-generators/getGenerators.ts +++ b/src/routes/oc-generators/getGenerators.ts @@ -1,7 +1,7 @@ import { responseHeaders } from "@/lib/responseHeaders" import { listBucket } from "@/lib/listBucket" -export const getGenerators = async (c): Promise => { +export async function getGenerators(c): Promise { const cacheKey = new Request(c.req.url.toString(), c.req) const cache = caches.default let response = await cache.match(cacheKey) diff --git a/src/routes/search/asset/assetSearch.ts b/src/routes/search/asset/assetSearch.ts index 97b9edd..89dfe69 100644 --- a/src/routes/search/asset/assetSearch.ts +++ b/src/routes/search/asset/assetSearch.ts @@ -3,7 +3,7 @@ import type { Asset } from "@/lib/types/asset" import { getSearchResults } from "@/lib/query" import { getConnection } from "@/db/turso" -export const getAssetSearch = async (c): Promise => { +export async function getAssetSearch(c): Promise { const queryParams = c.req.query() // console.log(queryParams); const { query, game, asset, tags } = queryParams @@ -60,7 +60,7 @@ export const getAssetSearch = async (c): Promise => { return response } -export const recentAssets = async (c): Promise => { +export async function recentAssets(c): Promise { const cacheKey = new Request(c.req.url.toString(), c.req) const cache = caches.default let response = await cache.match(cacheKey) diff --git a/src/routes/user/getUserByUsername.ts b/src/routes/user/getUserByUsername.ts index 963f838..286148a 100644 --- a/src/routes/user/getUserByUsername.ts +++ b/src/routes/user/getUserByUsername.ts @@ -4,7 +4,7 @@ import { users } from "@/db/schema" import { eq } from "drizzle-orm" import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse" -export const getUserByUsername = async (c): Promise => { +export async function getUserByUsername(c): Promise { const { username } = c.req.param() const cacheKey = new Request(c.req.url.toString(), c.req) const cache = caches.default diff --git a/src/routes/user/getUsersBySearch.ts b/src/routes/user/getUsersBySearch.ts index 38936f3..b321908 100644 --- a/src/routes/user/getUsersBySearch.ts +++ b/src/routes/user/getUsersBySearch.ts @@ -4,7 +4,7 @@ import { like } from "drizzle-orm" import { getConnection } from "@/db/turso" import { users } from "@/db/schema" -export const getUsersBySearch = async (c): Promise => { +export async function getUsersBySearch(c): Promise { const cacheKey = new Request(c.req.url.toString(), c.req) const cache = caches.default let response = await cache.match(cacheKey) From f049f82ecc6b45f0ff3775eb666c72396faf94c1 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Thu, 31 Aug 2023 00:21:37 +0100 Subject: [PATCH 055/318] upd deps tempfix bindings csrf protection --- package.json | 16 +- pnpm-lock.yaml | 558 +++++------------- src/db/turso.ts | 2 +- src/index.ts | 13 +- src/lib/auth/lucia.ts | 6 +- src/lib/query.ts | 97 --- src/routes/asset/assetRoute.ts | 3 +- src/routes/asset/downloadAsset.ts | 5 +- src/routes/asset/getAssetFromId.ts | 5 +- src/routes/auth/authRoute.ts | 3 +- src/routes/auth/login.ts | 6 +- src/routes/auth/logout.ts | 3 +- src/routes/auth/signup.ts | 6 +- src/routes/auth/updateUserAttributes.ts | 9 +- src/routes/auth/uploadAsset.ts | 45 +- src/routes/auth/uploadAvatar.ts | 6 +- src/routes/auth/uploadBanner.ts | 5 +- src/routes/auth/validate.ts | 5 +- src/routes/discord/contributors.ts | 3 +- src/routes/discord/discordRoute.ts | 3 +- src/routes/games/allGames.ts | 3 +- src/routes/games/gamesRoute.ts | 3 +- src/routes/oc-generators/getGenerator.ts | 3 +- src/routes/oc-generators/getGenerators.ts | 3 +- src/routes/oc-generators/ocGeneratorRoutes.ts | 3 +- src/routes/search/asset/assetSearch.ts | 223 +++---- src/routes/search/asset/searchRoute.ts | 22 +- src/routes/user/getUserByUsername.ts | 3 +- src/routes/user/getUsersBySearch.ts | 3 +- src/routes/user/userRoute.ts | 3 +- src/worker-configuration.d.ts | 3 +- 31 files changed, 369 insertions(+), 702 deletions(-) delete mode 100644 src/lib/query.ts diff --git a/package.json b/package.json index 08355e8..f8bd149 100644 --- a/package.json +++ b/package.json @@ -13,26 +13,26 @@ }, "devDependencies": { "@cloudflare/workers-types": "^4.20230821.0", - "@types/node": "^20.5.4", + "@types/node": "^20.5.7", "dotenv": "^16.3.1", "drizzle-kit": "^0.19.13", - "eslint": "^8.47.0", + "eslint": "^8.48.0", "eslint-config-google": "^0.14.0", "eslint-plugin-json": "^3.1.0", "tsx": "^3.12.7", - "typescript": "^5.1.6", - "wrangler": "3.5.1" + "typescript": "^5.2.2", + "wrangler": "3.6.0" }, "private": true, "dependencies": { - "@libsql/client": "^0.3.1", + "@libsql/client": "^0.3.2", "@lucia-auth/adapter-sqlite": "^2.0.0", - "@typescript-eslint/eslint-plugin": "^6.4.1", + "@typescript-eslint/eslint-plugin": "^6.5.0", "drizzle-orm": "^0.28.5", - "hono": "^3.5.4", + "hono": "^3.5.6", "lucia": "^2.4.0", "mysql2": "^3.6.0", - "prettier": "^3.0.2", + "prettier": "^3.0.3", "resend": "^1.0.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3c272f4..233e3cd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,20 +6,20 @@ settings: dependencies: "@libsql/client": - specifier: ^0.3.1 - version: 0.3.1 + specifier: ^0.3.2 + version: 0.3.2 "@lucia-auth/adapter-sqlite": specifier: ^2.0.0 - version: 2.0.0(@libsql/client@0.3.1)(lucia@2.4.0) + version: 2.0.0(@libsql/client@0.3.2)(lucia@2.4.0) "@typescript-eslint/eslint-plugin": - specifier: ^6.4.1 - version: 6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.1.6) + specifier: ^6.5.0 + version: 6.5.0(@typescript-eslint/parser@6.5.0)(eslint@8.48.0)(typescript@5.2.2) drizzle-orm: specifier: ^0.28.5 - version: 0.28.5(@cloudflare/workers-types@4.20230821.0)(@libsql/client@0.3.1)(mysql2@3.6.0) + version: 0.28.5(@cloudflare/workers-types@4.20230821.0)(@libsql/client@0.3.2)(mysql2@3.6.0) hono: - specifier: ^3.5.4 - version: 3.5.4 + specifier: ^3.5.6 + version: 3.5.6 lucia: specifier: ^2.4.0 version: 2.4.0 @@ -27,8 +27,8 @@ dependencies: specifier: ^3.6.0 version: 3.6.0 prettier: - specifier: ^3.0.2 - version: 3.0.2 + specifier: ^3.0.3 + version: 3.0.3 resend: specifier: ^1.0.0 version: 1.0.0 @@ -38,8 +38,8 @@ devDependencies: specifier: ^4.20230821.0 version: 4.20230821.0 "@types/node": - specifier: ^20.5.4 - version: 20.5.4 + specifier: ^20.5.7 + version: 20.5.7 dotenv: specifier: ^16.3.1 version: 16.3.1 @@ -47,11 +47,11 @@ devDependencies: specifier: ^0.19.13 version: 0.19.13 eslint: - specifier: ^8.47.0 - version: 8.47.0 + specifier: ^8.48.0 + version: 8.48.0 eslint-config-google: specifier: ^0.14.0 - version: 0.14.0(eslint@8.47.0) + version: 0.14.0(eslint@8.48.0) eslint-plugin-json: specifier: ^3.1.0 version: 3.1.0 @@ -59,11 +59,11 @@ devDependencies: specifier: ^3.12.7 version: 3.12.7 typescript: - specifier: ^5.1.6 - version: 5.1.6 + specifier: ^5.2.2 + version: 5.2.2 wrangler: - specifier: 3.5.1 - version: 3.5.1 + specifier: 3.6.0 + version: 3.6.0 packages: /@aashutoshrathi/word-wrap@1.2.6: @@ -161,17 +161,17 @@ packages: integrity: sha512-BDXFbYOJzT/NBEtp71cvsrGPwGAMGRB/349rwKuoxNSiKjPraNNnlK6MIIabViCjqZugu6j+xeMDlEkWdHHJSg==, } dependencies: - "@esbuild-kit/core-utils": 3.1.0 + "@esbuild-kit/core-utils": 3.2.2 get-tsconfig: 4.7.0 dev: true - /@esbuild-kit/core-utils@3.1.0: + /@esbuild-kit/core-utils@3.2.2: resolution: { - integrity: sha512-Uuk8RpCg/7fdHSceR1M6XbSZFSuMrxcePFuGgyvsBn+u339dk5OeL4jv2EojwTN2st/unJGsVm4qHWjWNmJ/tw==, + integrity: sha512-Ub6LaRaAgF80dTSzUdXpFLM1pVDdmEVB9qb5iAzSpyDlX/mfJTFGOnZ516O05p5uWWteNviMKi4PAyEuRxI5gA==, } dependencies: - esbuild: 0.17.19 + esbuild: 0.18.20 source-map-support: 0.5.21 dev: true @@ -181,7 +181,7 @@ packages: integrity: sha512-Qwfvj/qoPbClxCRNuac1Du01r9gvNOT+pMYtJDapfB1eoGN1YlJ1BixLyL9WVENRx5RXgNLdfYdx/CuswlGhMw==, } dependencies: - "@esbuild-kit/core-utils": 3.1.0 + "@esbuild-kit/core-utils": 3.2.2 get-tsconfig: 4.7.0 dev: true @@ -221,18 +221,6 @@ packages: 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: { @@ -257,18 +245,6 @@ packages: dev: true optional: 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: { @@ -293,18 +269,6 @@ packages: 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: { @@ -329,18 +293,6 @@ packages: 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: { @@ -365,18 +317,6 @@ packages: 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: { @@ -401,18 +341,6 @@ packages: 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: { @@ -437,18 +365,6 @@ packages: 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: { @@ -473,18 +389,6 @@ packages: 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: { @@ -509,18 +413,6 @@ packages: 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: { @@ -545,18 +437,6 @@ packages: 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: { @@ -581,18 +461,6 @@ packages: 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: { @@ -617,18 +485,6 @@ packages: 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: { @@ -653,18 +509,6 @@ packages: 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: { @@ -689,18 +533,6 @@ packages: 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: { @@ -725,18 +557,6 @@ packages: 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: { @@ -761,18 +581,6 @@ packages: 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: { @@ -797,18 +605,6 @@ packages: 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: { @@ -833,18 +629,6 @@ packages: 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: { @@ -869,18 +653,6 @@ packages: 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: { @@ -905,18 +677,6 @@ packages: 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: { @@ -941,18 +701,6 @@ packages: 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: { @@ -977,18 +725,6 @@ packages: 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: { @@ -1001,7 +737,7 @@ packages: dev: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.47.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.48.0): resolution: { integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, @@ -1010,13 +746,13 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.47.0 + eslint: 8.48.0 eslint-visitor-keys: 3.4.3 - /@eslint-community/regexpp@4.7.0: + /@eslint-community/regexpp@4.8.0: resolution: { - integrity: sha512-+HencqxU7CFJnQb7IKtuNBqS6Yx3Tz4kOL8BJXo+JyeiBm5MEX6pO8onXDkjrkCRlfYXS1Axro15ZjVFe9YgsA==, + integrity: sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==, } engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } @@ -1039,17 +775,17 @@ packages: transitivePeerDependencies: - supports-color - /@eslint/js@8.47.0: + /@eslint/js@8.48.0: resolution: { - integrity: sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==, + integrity: sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - /@humanwhocodes/config-array@0.11.10: + /@humanwhocodes/config-array@0.11.11: resolution: { - integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==, + integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==, } engines: { node: ">=10.10.0" } dependencies: @@ -1072,14 +808,14 @@ packages: integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==, } - /@libsql/client@0.3.1: + /@libsql/client@0.3.2: resolution: { - integrity: sha512-43/zF8fJguXd6ENwYhddpbR05bDVx3BQQUZ/BsJ0b4zLJge+WFa2smC3ILVGqvVu4ZoixbC0sfLTdVPdd2NjDA==, + integrity: sha512-e0qgf7gFOwhu0ueU/RK68TmD0PnjX3RaeM5lrJowGMEZjvh/shZ4BhwPA26Ec0nSa4oiZ0s0zn/T5YjcgY1bTw==, } dependencies: - "@libsql/hrana-client": 0.4.4 - better-sqlite3: 8.5.1 + "@libsql/hrana-client": 0.5.0 + better-sqlite3: 8.5.2 js-base64: 3.7.5 transitivePeerDependencies: - bufferutil @@ -1087,10 +823,10 @@ packages: - utf-8-validate dev: false - /@libsql/hrana-client@0.4.4: + /@libsql/hrana-client@0.5.0: resolution: { - integrity: sha512-BevUg0UBRLs5AEqn0fjrMcl49xCtwuFavgK4MzCb3PTtxpEbQ24oGXctspN9drBiUVmqSZr7go887aiLLzSO3A==, + integrity: sha512-o9yXH+9XBPnMSrBkY17q2xknfNXJaCHQv4rFJikt1g8M0d80hwp4ZZ1jHwacuL61wRa4j6qKMFqh9ti+CoTH1A==, } dependencies: "@libsql/isomorphic-fetch": 0.1.6 @@ -1127,7 +863,7 @@ packages: - utf-8-validate dev: false - /@lucia-auth/adapter-sqlite@2.0.0(@libsql/client@0.3.1)(lucia@2.4.0): + /@lucia-auth/adapter-sqlite@2.0.0(@libsql/client@0.3.2)(lucia@2.4.0): resolution: { integrity: sha512-Hiy8WND/1mi25r0M2ruSml+Ab5GJLr4XZEHApYw1lxybF+VlPUyX7oTtIVCSgvq/SWiP/tvnyPwnXAPmNr8/bg==, @@ -1142,7 +878,7 @@ packages: better-sqlite3: optional: true dependencies: - "@libsql/client": 0.3.1 + "@libsql/client": 0.3.2 lucia: 2.4.0 dev: false @@ -1216,20 +952,20 @@ packages: integrity: sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==, } dependencies: - "@types/node": 20.5.4 + "@types/node": 20.5.7 form-data: 3.0.1 dev: false - /@types/node@20.5.4: + /@types/node@20.5.7: resolution: { - integrity: sha512-Y9vbIAoM31djQZrPYjpTLo0XlaSwOIsrlfE3LpulZeRblttsLQRFRlBAppW0LOxyT3ALj2M5vU1ucQQayQH3jA==, + integrity: sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==, } - /@types/semver@7.5.0: + /@types/semver@7.5.1: resolution: { - integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==, + integrity: sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==, } dev: false @@ -1239,13 +975,13 @@ packages: integrity: sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==, } dependencies: - "@types/node": 20.5.4 + "@types/node": 20.5.7 dev: false - /@typescript-eslint/eslint-plugin@6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.1.6): + /@typescript-eslint/eslint-plugin@6.5.0(@typescript-eslint/parser@6.5.0)(eslint@8.48.0)(typescript@5.2.2): resolution: { - integrity: sha512-3F5PtBzUW0dYlq77Lcqo13fv+58KDwUib3BddilE8ajPJT+faGgxmI9Sw+I8ZS22BYwoir9ZhNXcLi+S+I2bkw==, + integrity: sha512-2pktILyjvMaScU6iK3925uvGU87E+N9rh372uGZgiMYwafaw9SXq86U04XPq3UH6tzRvNgBsub6x2DacHc33lw==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -1256,28 +992,28 @@ packages: typescript: optional: true dependencies: - "@eslint-community/regexpp": 4.7.0 - "@typescript-eslint/parser": 6.4.1(eslint@8.47.0)(typescript@5.1.6) - "@typescript-eslint/scope-manager": 6.4.1 - "@typescript-eslint/type-utils": 6.4.1(eslint@8.47.0)(typescript@5.1.6) - "@typescript-eslint/utils": 6.4.1(eslint@8.47.0)(typescript@5.1.6) - "@typescript-eslint/visitor-keys": 6.4.1 + "@eslint-community/regexpp": 4.8.0 + "@typescript-eslint/parser": 6.5.0(eslint@8.48.0)(typescript@5.2.2) + "@typescript-eslint/scope-manager": 6.5.0 + "@typescript-eslint/type-utils": 6.5.0(eslint@8.48.0)(typescript@5.2.2) + "@typescript-eslint/utils": 6.5.0(eslint@8.48.0)(typescript@5.2.2) + "@typescript-eslint/visitor-keys": 6.5.0 debug: 4.3.4 - eslint: 8.47.0 + eslint: 8.48.0 graphemer: 1.4.0 ignore: 5.2.4 natural-compare: 1.4.0 semver: 7.5.4 - ts-api-utils: 1.0.2(typescript@5.1.6) - typescript: 5.1.6 + ts-api-utils: 1.0.2(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/parser@6.4.1(eslint@8.47.0)(typescript@5.1.6): + /@typescript-eslint/parser@6.5.0(eslint@8.48.0)(typescript@5.2.2): resolution: { - integrity: sha512-610G6KHymg9V7EqOaNBMtD1GgpAmGROsmfHJPXNLCU9bfIuLrkdOygltK784F6Crboyd5tBFayPB7Sf0McrQwg==, + integrity: sha512-LMAVtR5GN8nY0G0BadkG0XIe4AcNMeyEy3DyhKGAh9k4pLSMBO7rF29JvDBpZGCmp5Pgz5RLHP6eCpSYZJQDuQ==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -1287,32 +1023,32 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/scope-manager": 6.4.1 - "@typescript-eslint/types": 6.4.1 - "@typescript-eslint/typescript-estree": 6.4.1(typescript@5.1.6) - "@typescript-eslint/visitor-keys": 6.4.1 + "@typescript-eslint/scope-manager": 6.5.0 + "@typescript-eslint/types": 6.5.0 + "@typescript-eslint/typescript-estree": 6.5.0(typescript@5.2.2) + "@typescript-eslint/visitor-keys": 6.5.0 debug: 4.3.4 - eslint: 8.47.0 - typescript: 5.1.6 + eslint: 8.48.0 + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/scope-manager@6.4.1: + /@typescript-eslint/scope-manager@6.5.0: resolution: { - integrity: sha512-p/OavqOQfm4/Hdrr7kvacOSFjwQ2rrDVJRPxt/o0TOWdFnjJptnjnZ+sYDR7fi4OimvIuKp+2LCkc+rt9fIW+A==, + integrity: sha512-A8hZ7OlxURricpycp5kdPTH3XnjG85UpJS6Fn4VzeoH4T388gQJ/PGP4ole5NfKt4WDVhmLaQ/dBLNDC4Xl/Kw==, } engines: { node: ^16.0.0 || >=18.0.0 } dependencies: - "@typescript-eslint/types": 6.4.1 - "@typescript-eslint/visitor-keys": 6.4.1 + "@typescript-eslint/types": 6.5.0 + "@typescript-eslint/visitor-keys": 6.5.0 dev: false - /@typescript-eslint/type-utils@6.4.1(eslint@8.47.0)(typescript@5.1.6): + /@typescript-eslint/type-utils@6.5.0(eslint@8.48.0)(typescript@5.2.2): resolution: { - integrity: sha512-7ON8M8NXh73SGZ5XvIqWHjgX2f+vvaOarNliGhjrJnv1vdjG0LVIz+ToYfPirOoBi56jxAKLfsLm40+RvxVVXA==, + integrity: sha512-f7OcZOkRivtujIBQ4yrJNIuwyCQO1OjocVqntl9dgSIZAdKqicj3xFDqDOzHDlGCZX990LqhLQXWRnQvsapq8A==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -1322,28 +1058,28 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/typescript-estree": 6.4.1(typescript@5.1.6) - "@typescript-eslint/utils": 6.4.1(eslint@8.47.0)(typescript@5.1.6) + "@typescript-eslint/typescript-estree": 6.5.0(typescript@5.2.2) + "@typescript-eslint/utils": 6.5.0(eslint@8.48.0)(typescript@5.2.2) debug: 4.3.4 - eslint: 8.47.0 - ts-api-utils: 1.0.2(typescript@5.1.6) - typescript: 5.1.6 + eslint: 8.48.0 + ts-api-utils: 1.0.2(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/types@6.4.1: + /@typescript-eslint/types@6.5.0: resolution: { - integrity: sha512-zAAopbNuYu++ijY1GV2ylCsQsi3B8QvfPHVqhGdDcbx/NK5lkqMnCGU53amAjccSpk+LfeONxwzUhDzArSfZJg==, + integrity: sha512-eqLLOEF5/lU8jW3Bw+8auf4lZSbbljHR2saKnYqON12G/WsJrGeeDHWuQePoEf9ro22+JkbPfWQwKEC5WwLQ3w==, } engines: { node: ^16.0.0 || >=18.0.0 } dev: false - /@typescript-eslint/typescript-estree@6.4.1(typescript@5.1.6): + /@typescript-eslint/typescript-estree@6.5.0(typescript@5.2.2): resolution: { - integrity: sha512-xF6Y7SatVE/OyV93h1xGgfOkHr2iXuo8ip0gbfzaKeGGuKiAnzS+HtVhSPx8Www243bwlW8IF7X0/B62SzFftg==, + integrity: sha512-q0rGwSe9e5Kk/XzliB9h2LBc9tmXX25G0833r7kffbl5437FPWb2tbpIV9wAATebC/018pGa9fwPDuvGN+LxWQ==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -1352,48 +1088,48 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/types": 6.4.1 - "@typescript-eslint/visitor-keys": 6.4.1 + "@typescript-eslint/types": 6.5.0 + "@typescript-eslint/visitor-keys": 6.5.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.4 - ts-api-utils: 1.0.2(typescript@5.1.6) - typescript: 5.1.6 + ts-api-utils: 1.0.2(typescript@5.2.2) + typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/utils@6.4.1(eslint@8.47.0)(typescript@5.1.6): + /@typescript-eslint/utils@6.5.0(eslint@8.48.0)(typescript@5.2.2): resolution: { - integrity: sha512-F/6r2RieNeorU0zhqZNv89s9bDZSovv3bZQpUNOmmQK1L80/cV4KEu95YUJWi75u5PhboFoKUJBnZ4FQcoqhDw==, + integrity: sha512-9nqtjkNykFzeVtt9Pj6lyR9WEdd8npPhhIPM992FWVkZuS6tmxHfGVnlUcjpUP2hv8r4w35nT33mlxd+Be1ACQ==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.47.0) + "@eslint-community/eslint-utils": 4.4.0(eslint@8.48.0) "@types/json-schema": 7.0.12 - "@types/semver": 7.5.0 - "@typescript-eslint/scope-manager": 6.4.1 - "@typescript-eslint/types": 6.4.1 - "@typescript-eslint/typescript-estree": 6.4.1(typescript@5.1.6) - eslint: 8.47.0 + "@types/semver": 7.5.1 + "@typescript-eslint/scope-manager": 6.5.0 + "@typescript-eslint/types": 6.5.0 + "@typescript-eslint/typescript-estree": 6.5.0(typescript@5.2.2) + eslint: 8.48.0 semver: 7.5.4 transitivePeerDependencies: - supports-color - typescript dev: false - /@typescript-eslint/visitor-keys@6.4.1: + /@typescript-eslint/visitor-keys@6.5.0: resolution: { - integrity: sha512-y/TyRJsbZPkJIZQXrHfdnxVnxyKegnpEvnRGNam7s3TRR2ykGefEWOhaef00/UUN3IZxizS7BTO3svd3lCOJRQ==, + integrity: sha512-yCB/2wkbv3hPsh02ZS8dFQnij9VVQXJMN/gbQsaaY+zxALkZnxa/wagvLEFsAWMPv7d7lxQmNsIzGU1w/T/WyA==, } engines: { node: ^16.0.0 || >=18.0.0 } dependencies: - "@typescript-eslint/types": 6.4.1 + "@typescript-eslint/types": 6.5.0 eslint-visitor-keys: 3.4.3 dev: false @@ -1510,10 +1246,10 @@ packages: integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, } - /better-sqlite3@8.5.1: + /better-sqlite3@8.5.2: resolution: { - integrity: sha512-aDfC67xfll6bugnOqRJhdUWioQZnkhLkrwZ+oo6yZbNMtyktbwkDO4SfBcCVWbm4BlsCjCNTJchlHaBt+vB4Iw==, + integrity: sha512-w/EZ/jwuZF+/47mAVC2+rhR2X/gwkZ+fd1pbX7Y90D5NRaRzDQcxrHY10t6ijGiYIonCVsBSF5v1cay07bP5sg==, } requiresBuild: true dependencies: @@ -1968,7 +1704,7 @@ packages: - supports-color dev: true - /drizzle-orm@0.28.5(@cloudflare/workers-types@4.20230821.0)(@libsql/client@0.3.1)(mysql2@3.6.0): + /drizzle-orm@0.28.5(@cloudflare/workers-types@4.20230821.0)(@libsql/client@0.3.2)(mysql2@3.6.0): resolution: { integrity: sha512-6r6Iw4c38NAmW6TiKH3TUpGUQ1YdlEoLJOQptn8XPx3Z63+vFNKfAiANqrIiYZiMjKR9+NYAL219nFrmo1duXA==, @@ -2034,7 +1770,7 @@ packages: optional: true dependencies: "@cloudflare/workers-types": 4.20230821.0 - "@libsql/client": 0.3.1 + "@libsql/client": 0.3.2 mysql2: 3.6.0 dev: false @@ -2161,39 +1897,6 @@ packages: "@esbuild/win32-x64": 0.16.3 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: { @@ -2234,7 +1937,7 @@ packages: } engines: { node: ">=10" } - /eslint-config-google@0.14.0(eslint@8.47.0): + /eslint-config-google@0.14.0(eslint@8.48.0): resolution: { integrity: sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==, @@ -2243,7 +1946,7 @@ packages: peerDependencies: eslint: ">=5.16.0" dependencies: - eslint: 8.47.0 + eslint: 8.48.0 dev: true /eslint-plugin-json@3.1.0: @@ -2274,19 +1977,19 @@ packages: } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - /eslint@8.47.0: + /eslint@8.48.0: resolution: { - integrity: sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==, + integrity: sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } hasBin: true dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.47.0) - "@eslint-community/regexpp": 4.7.0 + "@eslint-community/eslint-utils": 4.4.0(eslint@8.48.0) + "@eslint-community/regexpp": 4.8.0 "@eslint/eslintrc": 2.1.2 - "@eslint/js": 8.47.0 - "@humanwhocodes/config-array": 0.11.10 + "@eslint/js": 8.48.0 + "@humanwhocodes/config-array": 0.11.11 "@humanwhocodes/module-importer": 1.0.1 "@nodelib/fs.walk": 1.2.8 ajv: 6.12.6 @@ -2463,7 +2166,7 @@ packages: } engines: { node: ^10.12.0 || >=12.0.0 } dependencies: - flat-cache: 3.0.4 + flat-cache: 3.1.0 /file-uri-to-path@1.0.0: resolution: @@ -2490,14 +2193,15 @@ packages: locate-path: 6.0.0 path-exists: 4.0.0 - /flat-cache@3.0.4: + /flat-cache@3.1.0: resolution: { - integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==, + integrity: sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==, } - engines: { node: ^10.12.0 || >=12.0.0 } + engines: { node: ">=12.0.0" } dependencies: flatted: 3.2.7 + keyv: 4.5.3 rimraf: 3.0.2 /flatted@3.2.7: @@ -2680,10 +2384,10 @@ packages: } dev: true - /hono@3.5.4: + /hono@3.5.6: resolution: { - integrity: sha512-GrRBIJhZ+tG+8RtoyPQjvqPGwppERmayyTiPKano4egmpkJf1XiptESUYK5vKHICNaJksAKB9jzy1CmOdQENPA==, + integrity: sha512-ycTOpIZJ6yLbjzoE+ojsesC7G7ZXfGSoCIDyvqmzlHc5Mk4Aj48Ed9R5g7gw3v7rOkS81pjcYIvWef/karq1iA==, } engines: { node: ">=16.0.0" } dev: false @@ -2902,6 +2606,12 @@ packages: dependencies: argparse: 2.0.1 + /json-buffer@3.0.1: + resolution: + { + integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, + } + /json-diff@0.9.0: resolution: { @@ -2933,6 +2643,14 @@ packages: } dev: true + /keyv@4.5.3: + resolution: + { + integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==, + } + dependencies: + json-buffer: 3.0.1 + /kind-of@3.2.2: resolution: { @@ -3142,7 +2860,7 @@ packages: dependencies: acorn: 8.10.0 acorn-walk: 8.2.0 - better-sqlite3: 8.5.1 + better-sqlite3: 8.5.2 capnp-ts: 0.7.0 exit-hook: 2.2.1 glob-to-regexp: 0.4.1 @@ -3483,10 +3201,10 @@ packages: } engines: { node: ">= 0.8.0" } - /prettier@3.0.2: + /prettier@3.0.3: resolution: { - integrity: sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ==, + integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==, } engines: { node: ">=14" } hasBin: true @@ -3954,7 +3672,7 @@ packages: } dev: false - /ts-api-utils@1.0.2(typescript@5.1.6): + /ts-api-utils@1.0.2(typescript@5.2.2): resolution: { integrity: sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==, @@ -3963,7 +3681,7 @@ packages: peerDependencies: typescript: ">=4.2.0" dependencies: - typescript: 5.1.6 + typescript: 5.2.2 dev: false /tslib@2.6.2: @@ -3981,7 +3699,7 @@ packages: hasBin: true dependencies: "@esbuild-kit/cjs-loader": 2.4.2 - "@esbuild-kit/core-utils": 3.1.0 + "@esbuild-kit/core-utils": 3.2.2 "@esbuild-kit/esm-loader": 2.5.5 optionalDependencies: fsevents: 2.3.3 @@ -4033,10 +3751,10 @@ packages: } dev: true - /typescript@5.1.6: + /typescript@5.2.2: resolution: { - integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==, + integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==, } engines: { node: ">=14.17" } hasBin: true @@ -4156,10 +3874,10 @@ packages: "@cloudflare/workerd-windows-64": 1.20230814.1 dev: true - /wrangler@3.5.1: + /wrangler@3.6.0: resolution: { - integrity: sha512-CnrKId+pmjTfLSidM9Ut7lUDCFWEtJyY3JT3Dk+TgYHvu2zVmMgUeQQZHZfvpVN5eaEZifNQr90KEvMLy7MhHw==, + integrity: sha512-GWs4+gIUK+086svW/TgFhhxxrl/hdW2L7WASbdc10dJT7yFmCXse0SnHiqWUxbFu3ScP2t3a3LszJ08wwolWHg==, } engines: { node: ">=16.13.0" } hasBin: true diff --git a/src/db/turso.ts b/src/db/turso.ts index 1e56d2b..ac1972e 100644 --- a/src/db/turso.ts +++ b/src/db/turso.ts @@ -1,4 +1,4 @@ -import { Env } from "../worker-configuration" +import { Bindings as Env } from "@/worker-configuration" import * as schema from "@/db/schema" import { drizzle as drizzleORM } from "drizzle-orm/libsql" import { createClient } from "@libsql/client/web" // because we're in a worker diff --git a/src/index.ts b/src/index.ts index 787aaf0..0aeba6a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,4 @@ import { Hono } from "hono" -import { Env } from "./worker-configuration" import assetRoute from "./routes/asset/assetRoute" import discordRoute from "./routes/discord/discordRoute" import ocGeneratorRoute from "./routes/oc-generators/ocGeneratorRoutes" @@ -7,15 +6,17 @@ import ocGeneratorRoute from "./routes/oc-generators/ocGeneratorRoutes" import gamesRoute from "./routes/games/gamesRoute" import userRoute from "./routes/user/userRoute" import authRoute from "./routes/auth/authRoute" -interface Bindings extends Env { - [key: string]: unknown -} +import { getRuntimeKey } from "hono/adapter" +import { Bindings } from "@/worker-configuration" -const app = new Hono<{ Bindings: Bindings; Env: Env }>() +const app = new Hono<{ Bindings: Bindings }>() app.get("/status", (c) => { c.status(200) - return c.json({ status: "ok" }) + return c.json({ + status: "ok", + runtime: getRuntimeKey(), + }) }) app.get("/", (c) => { c.status(200) diff --git a/src/lib/auth/lucia.ts b/src/lib/auth/lucia.ts index 4eceeab..1673f07 100644 --- a/src/lib/auth/lucia.ts +++ b/src/lib/auth/lucia.ts @@ -26,6 +26,10 @@ export const auth = (env: Env) => { experimental: { debugMode: env.ENVIRONMENT === "DEV" ? true : false, }, + csrfProtection: { + enabled: true, + allowedSubDomains: ["*"], + }, getUserAttributes: (dbUser) => { return { username: dbUser.username, @@ -44,7 +48,7 @@ export const auth = (env: Env) => { }, getSessionAttributes: (dbSession) => { return { - userAgent: dbSession.user_agent as unknown as string, // md5 + userAgent: dbSession.user_agent as string, countryCode: dbSession.country_code as string, } }, diff --git a/src/lib/query.ts b/src/lib/query.ts deleted file mode 100644 index 4455551..0000000 --- a/src/lib/query.ts +++ /dev/null @@ -1,97 +0,0 @@ -import type { Asset } from "@/lib/types/asset" -import { getConnection } from "@/db/turso" - -type queryParameter = string | number - -export const getSearchResults = async ( - query: string, - gameArray: string[], - assetArray: string[], - tagsArray: string[], - c -): Promise => { - let sqlQuery = `SELECT * FROM assets WHERE 1=1` - const parameters = [] - - sqlQuery = addQueryToSqlQuery(query, sqlQuery, parameters) - sqlQuery = addGameToSqlQuery(gameArray, sqlQuery, parameters) - sqlQuery = addAssetToSqlQuery(assetArray, sqlQuery, parameters) - sqlQuery = addTagsToSqlQuery(tagsArray, sqlQuery, parameters) - - sqlQuery += ` ORDER BY uploaded_date DESC` - - sqlQuery = limitResults(sqlQuery) - - if ( - !query && - !gameArray.length && - !assetArray.length && - !tagsArray.length - ) { - sqlQuery = `SELECT * FROM assets ORDER BY uploaded_date DESC LIMIT 30` - } - - const conn = await getConnection(c.env) - const db = conn.planetscale - - return await db - .execute(sqlQuery, parameters) - .then((row) => row.rows as Asset[]) -} - -const addQueryToSqlQuery = ( - query: string, - sqlQuery: string, - parameters: queryParameter[] -): string => { - if (query) { - sqlQuery += ` AND name LIKE ?` - parameters.push(`%${query}%`) - } - return sqlQuery -} - -const addGameToSqlQuery = ( - gameArray: string[], - sqlQuery: string, - parameters: queryParameter[] -): string => { - if (gameArray.length) { - sqlQuery += ` AND game IN (${gameArray.map(() => "?").join(",")})` - parameters.push(...gameArray) - } - return sqlQuery -} - -const addAssetToSqlQuery = ( - assetArray: string[], - sqlQuery: string, - parameters: queryParameter[] -): string => { - if (assetArray.length) { - sqlQuery += ` AND asset_category IN (${assetArray - .map(() => "?") - .join(",")})` - parameters.push(...assetArray) - } - return sqlQuery -} - -const addTagsToSqlQuery = ( - tagsArray: string[], - sqlQuery: string, - parameters: queryParameter[] -): string => { - if (tagsArray.length) { - sqlQuery += ` AND tags IN (${tagsArray - .map(() => "?") - .join(",") - .toUpperCase()})` - parameters.push(...tagsArray) - } - return sqlQuery -} - -const limitResults = (sqlQuery: string): string => { - return (sqlQuery += ` LIMIT 1500`) -} diff --git a/src/routes/asset/assetRoute.ts b/src/routes/asset/assetRoute.ts index 708d6a6..91c59f2 100644 --- a/src/routes/asset/assetRoute.ts +++ b/src/routes/asset/assetRoute.ts @@ -1,8 +1,9 @@ import { Hono } from "hono" import { getAssetFromId } from "./getAssetFromId" import { downloadAsset } from "./downloadAsset" +import { Bindings } from "@/worker-configuration" -const assetRoute = new Hono() +const assetRoute = new Hono<{ Bindings: Bindings }>() assetRoute.get("/:id", async (c) => { return getAssetFromId(c) diff --git a/src/routes/asset/downloadAsset.ts b/src/routes/asset/downloadAsset.ts index c2fa1b8..9e69db2 100644 --- a/src/routes/asset/downloadAsset.ts +++ b/src/routes/asset/downloadAsset.ts @@ -3,8 +3,9 @@ import { getConnection } from "@/db/turso" import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse" import { eq } from "drizzle-orm" import { assets } from "@/db/schema" +import type { Context } from "hono" -export async function downloadAsset(c): Promise { +export async function downloadAsset(c: Context): Promise { const { assetId } = c.req.param() const drizzle = await getConnection(c.env).drizzle @@ -12,7 +13,7 @@ export async function downloadAsset(c): Promise { const asset = await drizzle .select() .from(assets) - .where(eq(assets.id, assetId)) + .where(eq(assets.id, parseInt(assetId))) .execute() if (!asset) diff --git a/src/routes/asset/getAssetFromId.ts b/src/routes/asset/getAssetFromId.ts index 7c1f518..7cb5887 100644 --- a/src/routes/asset/getAssetFromId.ts +++ b/src/routes/asset/getAssetFromId.ts @@ -3,8 +3,9 @@ import { getConnection } from "@/db/turso" import { assets } from "@/db/schema" import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse" import { eq, desc } from "drizzle-orm" +import type { Context } from "hono" -export async function getAssetFromId(c): Promise { +export async function getAssetFromId(c: Context): Promise { const { id } = c.req.param() const cacheKey = new Request(c.req.url.toString(), c.req) const cache = caches.default @@ -17,7 +18,7 @@ export async function getAssetFromId(c): Promise { const asset = await drizzle .select() .from(assets) - .where(eq(assets.id, id)) + .where(eq(assets.id, parseInt(id))) .execute() if (!asset) { diff --git a/src/routes/auth/authRoute.ts b/src/routes/auth/authRoute.ts index 2378655..a499cd7 100644 --- a/src/routes/auth/authRoute.ts +++ b/src/routes/auth/authRoute.ts @@ -8,8 +8,9 @@ import { uploadProfileImage } from "./uploadAvatar" import { uploadBannerImage } from "./uploadBanner" import { updateUserAttributes } from "./updateUserAttributes" import { uploadAsset } from "./uploadAsset" +import { Bindings } from "@/worker-configuration" -const authRoute = new Hono() +const authRoute = new Hono<{ Bindings: Bindings }>() authRoute.use( "*", diff --git a/src/routes/auth/login.ts b/src/routes/auth/login.ts index c465ea1..7a313f5 100644 --- a/src/routes/auth/login.ts +++ b/src/routes/auth/login.ts @@ -1,5 +1,5 @@ import { auth } from "@/lib/auth/lucia" -// import * as validate from "@/lib/regex/accountValidation"; +import type { Context } from "hono" const usernameThrottling = new Map< string, @@ -9,13 +9,11 @@ const usernameThrottling = new Map< } >() -export async function login(c): Promise { +export async function login(c: Context): Promise { const formData = await c.req.formData() const username = formData.get("username") as string const password = formData.get("password") as string - // console.log(username, password); - const validSession = await auth(c.env).handleRequest(c).validate() if (validSession) diff --git a/src/routes/auth/logout.ts b/src/routes/auth/logout.ts index c9dc557..eb14706 100644 --- a/src/routes/auth/logout.ts +++ b/src/routes/auth/logout.ts @@ -1,6 +1,7 @@ import { auth } from "@/lib/auth/lucia" +import type { Context } from "hono" -export async function logout(c): Promise { +export async function logout(c: Context): Promise { const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() diff --git a/src/routes/auth/signup.ts b/src/routes/auth/signup.ts index a34fd55..f029cf9 100644 --- a/src/routes/auth/signup.ts +++ b/src/routes/auth/signup.ts @@ -1,7 +1,8 @@ import { auth } from "@/lib/auth/lucia" +import type { Context } from "hono" // import * as validate from "@/lib/regex/accountValidation"; -export async function signup(c): Promise { +export async function signup(c: Context): Promise { const formData = await c.req.formData() const secretKeyRequiredForSignup = c.env.VERY_SECRET_SIGNUP_KEY @@ -51,7 +52,7 @@ export async function signup(c): Promise { username_colour: null, avatar_url: null, banner_url: null, - pronouns: null, // we can splice this into possesive, subject, and object pronouns by "/" + pronouns: null, // we can splice this into possesive, subject, and object pronouns by "/", e.g "he/him/his" => {subject: "he", object: "him", possesive: "his"} bio: "No bio set", }, }) @@ -59,6 +60,7 @@ export async function signup(c): Promise { const userAgent = c.req.headers.get("user-agent") ?? "" const countryCode = c.req.headers.get("cf-ipcountry") ?? "" + // TODO: encrypt session attributes with sha256 const newSession = await auth(c.env).createSession({ userId: user.userId, attributes: { diff --git a/src/routes/auth/updateUserAttributes.ts b/src/routes/auth/updateUserAttributes.ts index d229a87..2de2816 100644 --- a/src/routes/auth/updateUserAttributes.ts +++ b/src/routes/auth/updateUserAttributes.ts @@ -1,6 +1,7 @@ import { auth } from "@/lib/auth/lucia" +import type { Context } from "hono" -export async function updateUserAttributes(c): Promise { +export async function updateUserAttributes(c: Context): Promise { const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() @@ -14,9 +15,9 @@ export async function updateUserAttributes(c): Promise { const attributes = { username: formData.get("username") as string | null, pronouns: formData.get("pronouns") as string | null, - self_assignable_role_flags: formData.get("self_assignable_roles") as - | number - | null, + self_assignable_role_flags: formData.get( + "self_assignable_roles" + ) as unknown as number | null, bio: formData.get("bio") as string | null, } diff --git a/src/routes/auth/uploadAsset.ts b/src/routes/auth/uploadAsset.ts index 1650ccd..58142f3 100644 --- a/src/routes/auth/uploadAsset.ts +++ b/src/routes/auth/uploadAsset.ts @@ -2,8 +2,9 @@ import { auth } from "@/lib/auth/lucia" import { getConnection } from "@/db/turso" import { eq, and } from "drizzle-orm" import { assets } from "@/db/schema" +import type { Context } from "hono" -export async function uploadAsset(c): Promise { +export async function uploadAsset(c: Context): Promise { const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() @@ -24,9 +25,17 @@ export async function uploadAsset(c): Promise { const drizzle = await getConnection(c.env).drizzle const formData = await c.req.formData() - const asset = formData.get("asset") as File | null + const asset = formData.get("asset") as unknown as File | null - if (!asset || asset.type !== "image/png") { + // this is temporary + const asset128px = formData.get("asset128px") as unknown as File | null + + if ( + !asset || + asset.type !== "image/png" || + !asset128px || + asset128px.type !== "image/png" + ) { return c.json({ success: false, state: "invalid asset" }, 200) } @@ -37,9 +46,9 @@ export async function uploadAsset(c): Promise { tags: formData.get("tags") as string, // e.g no-background, fanmade, official category: formData.get("category") as string, // e.g splash-art game: formData.get("game") as string, // e.g genshin-impact - size: formData.get("size") as number, // e.g 1024 - width: formData.get("width") as number, // e.g 1920 - height: formData.get("height") as number, // e.g 1080 + size: formData.get("size") as unknown as number, // e.g 1024 + width: formData.get("width") as unknown as number, // e.g 1920 + height: formData.get("height") as unknown as number, // e.g 1080 } const newAsset = { @@ -77,12 +86,26 @@ export async function uploadAsset(c): Promise { return c.json({ success: false, state: "duplicate asset" }, 400) try { - await c.env.bucket.put( - `/assets/${metadata.game}/${metadata.category}/${metadata.title}.${metadata.extension}`, - newAssetFile - ) + await drizzle.transaction(async () => { + await c.env.bucket.put( + `/assets/${metadata.game}/${metadata.category}/${metadata.title}.${metadata.extension}`, + newAssetFile + ) - await drizzle.insert(assets).values(newAsset) + const newAssetClone = new File( + [asset128px], + `${metadata.title}-128.png`, + { + type: asset.type, + } + ) + + await c.env.bucket.put( + `/assets/${metadata.game}/${metadata.category}/${metadata.title}-128.png`, + newAssetClone + ) + await drizzle.insert(assets).values(newAsset) + }) } catch (e) { return c.json({ success: false, state: "failed to upload asset" }, 500) } diff --git a/src/routes/auth/uploadAvatar.ts b/src/routes/auth/uploadAvatar.ts index 35e7372..5ccede1 100644 --- a/src/routes/auth/uploadAvatar.ts +++ b/src/routes/auth/uploadAvatar.ts @@ -1,7 +1,9 @@ import { auth } from "@/lib/auth/lucia" +import type { Context } from "hono" // TODO: add support for animated avatars -export async function uploadProfileImage(c): Promise { const authRequest = auth(c.env).handleRequest(c) +export async function uploadProfileImage(c: Context): Promise { + const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() if (!session || session.state === "idle" || session.state === "invalid") { @@ -14,7 +16,7 @@ export async function uploadProfileImage(c): Promise { const authRe const formData = await c.req.formData() - const avatar = formData.get("avatar") as File | null + const avatar = formData.get("avatar") as unknown as File | null if (!avatar || avatar.type !== "image/png") { return c.json({ success: false, state: "invalid avatar" }, 200) diff --git a/src/routes/auth/uploadBanner.ts b/src/routes/auth/uploadBanner.ts index e041ee5..ae4f802 100644 --- a/src/routes/auth/uploadBanner.ts +++ b/src/routes/auth/uploadBanner.ts @@ -1,7 +1,8 @@ import { auth } from "@/lib/auth/lucia" +import type { Context } from "hono" // TODO: add support for animated banners -export async function uploadBannerImage(c): Promise { +export async function uploadBannerImage(c: Context): Promise { const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() @@ -19,7 +20,7 @@ export async function uploadBannerImage(c): Promise { const formData = await c.req.formData() - const banner = formData.get("banner") as File | null + const banner = formData.get("banner") as unknown as File | null if (!banner || banner.type !== "image/png") { return c.json({ success: false, state: "invalid banner" }, 200) diff --git a/src/routes/auth/validate.ts b/src/routes/auth/validate.ts index 94e1d40..829f0ba 100644 --- a/src/routes/auth/validate.ts +++ b/src/routes/auth/validate.ts @@ -1,6 +1,7 @@ import { auth } from "@/lib/auth/lucia" +import type { Context } from "hono" -export async function validate(c): Promise { +export async function validate(c: Context): Promise { console.log(c) const authRequest = auth(c.env).handleRequest(c) @@ -14,8 +15,6 @@ export async function validate(c): Promise { return c.json({ success: false, state: "invalid session" }, 200) } - // console.log(session); - if ( session.userAgent !== userAgent || session.countryCode !== countryCode diff --git a/src/routes/discord/contributors.ts b/src/routes/discord/contributors.ts index 9c8ed82..0d98430 100644 --- a/src/routes/discord/contributors.ts +++ b/src/routes/discord/contributors.ts @@ -1,9 +1,10 @@ import { responseHeaders } from "@/lib/responseHeaders" import { roles, guildId } from "@/lib/discord" import type { Contributor, GuildMember } from "@/lib/types/discord" +import type { Context } from "hono" // TODO: replace discord contributors with roles on the site -export async function contributors(c): Promise { +export async function contributors(c: Context): Promise { const members: Contributor[] = [] let after: string | null = null diff --git a/src/routes/discord/discordRoute.ts b/src/routes/discord/discordRoute.ts index 4a48d93..64acdbc 100644 --- a/src/routes/discord/discordRoute.ts +++ b/src/routes/discord/discordRoute.ts @@ -1,7 +1,8 @@ import { Hono } from "hono" import { contributors } from "./contributors" +import { Bindings } from "@/worker-configuration" -const discordRoute = new Hono() +const discordRoute = new Hono<{ Bindings: Bindings }>() discordRoute.get("/contributors", async (c) => { return contributors(c) diff --git a/src/routes/games/allGames.ts b/src/routes/games/allGames.ts index bd1a99f..9dbe45e 100644 --- a/src/routes/games/allGames.ts +++ b/src/routes/games/allGames.ts @@ -2,8 +2,9 @@ import { responseHeaders } from "@/lib/responseHeaders" import { getConnection } from "@/db/turso" import { listBucket } from "@/lib/listBucket" import { games } from "@/db/schema" +import type { Context } from "hono" -export async function getAllGames(c): Promise { +export async function getAllGames(c: Context): Promise { const cacheKey = new Request(c.req.url.toString(), c.req) const cache = caches.default let response = await cache.match(cacheKey) diff --git a/src/routes/games/gamesRoute.ts b/src/routes/games/gamesRoute.ts index ba2ce74..c2284ed 100644 --- a/src/routes/games/gamesRoute.ts +++ b/src/routes/games/gamesRoute.ts @@ -1,7 +1,8 @@ import { Hono } from "hono" import { getAllGames } from "./allGames" +import { Bindings } from "@/worker-configuration" -const gamesRoute = new Hono() +const gamesRoute = new Hono<{ Bindings: Bindings }>() gamesRoute.get("/all", async (c) => { return getAllGames(c) diff --git a/src/routes/oc-generators/getGenerator.ts b/src/routes/oc-generators/getGenerator.ts index 08a32ea..600621e 100644 --- a/src/routes/oc-generators/getGenerator.ts +++ b/src/routes/oc-generators/getGenerator.ts @@ -1,8 +1,9 @@ import { responseHeaders } from "@/lib/responseHeaders" import { listBucket } from "@/lib/listBucket" import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse" +import type { Context } from "hono" -export async function getGeneratorFromName(c): Promise { +export async function getGeneratorFromName(c: Context): Promise { const { gameName } = c.req.param() const cacheKey = new Request(c.req.url.toString(), c.req) const cache = caches.default diff --git a/src/routes/oc-generators/getGenerators.ts b/src/routes/oc-generators/getGenerators.ts index f8fa464..5614afa 100644 --- a/src/routes/oc-generators/getGenerators.ts +++ b/src/routes/oc-generators/getGenerators.ts @@ -1,7 +1,8 @@ import { responseHeaders } from "@/lib/responseHeaders" import { listBucket } from "@/lib/listBucket" +import type { Context } from "hono" -export async function getGenerators(c): Promise { +export async function getGenerators(c: Context): Promise { const cacheKey = new Request(c.req.url.toString(), c.req) const cache = caches.default let response = await cache.match(cacheKey) diff --git a/src/routes/oc-generators/ocGeneratorRoutes.ts b/src/routes/oc-generators/ocGeneratorRoutes.ts index ecb8505..9479b26 100644 --- a/src/routes/oc-generators/ocGeneratorRoutes.ts +++ b/src/routes/oc-generators/ocGeneratorRoutes.ts @@ -1,8 +1,9 @@ import { Hono } from "hono" import { getGeneratorFromName } from "./getGenerator" import { getGenerators } from "./getGenerators" +import { Bindings } from "@/worker-configuration" -const ocGeneratorRoute = new Hono() +const ocGeneratorRoute = new Hono<{ Bindings: Bindings }>() ocGeneratorRoute.get("/", async (c) => { return getGenerators(c) diff --git a/src/routes/search/asset/assetSearch.ts b/src/routes/search/asset/assetSearch.ts index 89dfe69..89b19de 100644 --- a/src/routes/search/asset/assetSearch.ts +++ b/src/routes/search/asset/assetSearch.ts @@ -1,111 +1,112 @@ -import { responseHeaders } from "@/lib/responseHeaders" -import type { Asset } from "@/lib/types/asset" -import { getSearchResults } from "@/lib/query" -import { getConnection } from "@/db/turso" - -export async function getAssetSearch(c): Promise { - const queryParams = c.req.query() - // console.log(queryParams); - const { query, game, asset, tags } = queryParams - - // Convert game and asset parameters to arrays - const gameArray = game ? game.split(",") : [] - const assetArray = asset ? asset.split(",") : [] - const tagsArray = tags ? tags.split(",") : [] - - const cacheKey = new Request(c.req.url.toString(), c.req) - const cache = caches.default - let response = await cache.match(cacheKey) - - if (response) return response - - // console.log(query, gameArray, assetArray, tags); - - const results = ( - await getSearchResults(query, gameArray, assetArray, tagsArray, c) - ).map((results) => { - return { - id: results.id, - name: results.name, - game: results.game, - asset_category: results.asset_category, - url: results.url, - tags: results.tags, - status: results.status, - uploaded_by: results.uploaded_by, - uploaded_date: results.uploaded_date, - file_size: results.file_size, - width: results.width, - height: results.height, - } - }) - - response = c.json( - { - success: true, - status: "ok", - query, - game, - asset, - tags, - results, - }, - 200, - responseHeaders - ) - - response.headers.set("Cache-Control", "s-maxage=3600") - await cache.put(cacheKey, response.clone()) - - return response -} - -export async function recentAssets(c): Promise { - const cacheKey = new Request(c.req.url.toString(), c.req) - const cache = caches.default - let response = await cache.match(cacheKey) - if (response) return response - - const conn = await getConnection(c.env) - const db = conn.planetscale - - const row = await db - .execute( - "SELECT * FROM assets WHERE 1=1 ORDER BY uploaded_date DESC LIMIT 30" - ) - .then((row) => row.rows as Asset[] | undefined) - - if (!row) throw new Error("No results found") - - const results = row.map((asset) => { - return { - id: asset.id, - name: asset.name, - game: asset.game, - asset_category: asset.asset_category, - url: asset.url, - tags: asset.tags, - status: asset.status, - uploaded_by: asset.uploaded_by, - uploaded_date: asset.uploaded_date, - file_size: asset.file_size, - width: asset.width, - height: asset.height, - } - }) - - response = c.json( - { - success: true, - status: "ok", - results, - }, - 200, - responseHeaders - ) - - response.headers.set("Cache-Control", "s-maxage=3600") - await cache.put(cacheKey, response.clone()) - - return response -} +// import { responseHeaders } from "@/lib/responseHeaders" +// import type { Asset } from "@/lib/types/asset" +// import { getSearchResults } from "@/lib/query" +// import { getConnection } from "@/db/turso" +// import type { Context } from "hono" + +// export async function getAssetSearch(c: Context): Promise { +// const queryParams = c.req.query() +// // console.log(queryParams); +// const { query, game, asset, tags } = queryParams + +// // Convert game and asset parameters to arrays +// const gameArray = game ? game.split(",") : [] +// const assetArray = asset ? asset.split(",") : [] +// const tagsArray = tags ? tags.split(",") : [] + +// const cacheKey = new Request(c.req.url.toString(), c.req) +// const cache = caches.default +// let response = await cache.match(cacheKey) + +// if (response) return response + +// // console.log(query, gameArray, assetArray, tags); + +// const results = ( +// await getSearchResults(query, gameArray, assetArray, tagsArray, c) +// ).map((results) => { +// return { +// id: results.id, +// name: results.name, +// game: results.game, +// asset_category: results.asset_category, +// url: results.url, +// tags: results.tags, +// status: results.status, +// uploaded_by: results.uploaded_by, +// uploaded_date: results.uploaded_date, +// file_size: results.file_size, +// width: results.width, +// height: results.height, +// } +// }) + +// response = c.json( +// { +// success: true, +// status: "ok", +// query, +// game, +// asset, +// tags, +// results, +// }, +// 200, +// responseHeaders +// ) + +// response.headers.set("Cache-Control", "s-maxage=3600") +// await cache.put(cacheKey, response.clone()) + +// return response +// } + +// export async function recentAssets(c): Promise { +// const cacheKey = new Request(c.req.url.toString(), c.req) +// const cache = caches.default +// let response = await cache.match(cacheKey) +// if (response) return response + +// const conn = await getConnection(c.env) +// const db = conn.planetscale + +// const row = await db +// .execute( +// "SELECT * FROM assets WHERE 1=1 ORDER BY uploaded_date DESC LIMIT 30" +// ) +// .then((row) => row.rows as Asset[] | undefined) + +// if (!row) throw new Error("No results found") + +// const results = row.map((asset) => { +// return { +// id: asset.id, +// name: asset.name, +// game: asset.game, +// asset_category: asset.asset_category, +// url: asset.url, +// tags: asset.tags, +// status: asset.status, +// uploaded_by: asset.uploaded_by, +// uploaded_date: asset.uploaded_date, +// file_size: asset.file_size, +// width: asset.width, +// height: asset.height, +// } +// }) + +// response = c.json( +// { +// success: true, +// status: "ok", +// results, +// }, +// 200, +// responseHeaders +// ) + +// response.headers.set("Cache-Control", "s-maxage=3600") +// await cache.put(cacheKey, response.clone()) + +// return response +// } diff --git a/src/routes/search/asset/searchRoute.ts b/src/routes/search/asset/searchRoute.ts index de5a343..14adb04 100644 --- a/src/routes/search/asset/searchRoute.ts +++ b/src/routes/search/asset/searchRoute.ts @@ -1,15 +1,15 @@ -import { Hono } from "hono" -import { getAssetSearch } from "./assetSearch" -import { recentAssets } from "./assetSearch" +// import { Hono } from "hono" +// import { getAssetSearch } from "./assetSearch" +// import { recentAssets } from "./assetSearch" -const assetSearchRoute = new Hono() +// const assetSearchRoute = new Hono() -assetSearchRoute.get("/", async (c) => { - return getAssetSearch(c) -}) +// assetSearchRoute.get("/", async (c) => { +// return getAssetSearch(c) +// }) -assetSearchRoute.get("/recent", async (c) => { - return recentAssets(c) -}) +// assetSearchRoute.get("/recent", async (c) => { +// return recentAssets(c) +// }) -export default assetSearchRoute +// export default assetSearchRoute diff --git a/src/routes/user/getUserByUsername.ts b/src/routes/user/getUserByUsername.ts index 286148a..87a58ab 100644 --- a/src/routes/user/getUserByUsername.ts +++ b/src/routes/user/getUserByUsername.ts @@ -3,8 +3,9 @@ import { getConnection } from "@/db/turso" import { users } from "@/db/schema" import { eq } from "drizzle-orm" import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse" +import type { Context } from "hono" -export async function getUserByUsername(c): Promise { +export async function getUserByUsername(c: Context): Promise { const { username } = c.req.param() const cacheKey = new Request(c.req.url.toString(), c.req) const cache = caches.default diff --git a/src/routes/user/getUsersBySearch.ts b/src/routes/user/getUsersBySearch.ts index b321908..5f9eef7 100644 --- a/src/routes/user/getUsersBySearch.ts +++ b/src/routes/user/getUsersBySearch.ts @@ -3,8 +3,9 @@ import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse import { like } from "drizzle-orm" import { getConnection } from "@/db/turso" import { users } from "@/db/schema" +import type { Context } from "hono" -export async function getUsersBySearch(c): Promise { +export async function getUsersBySearch(c: Context): Promise { const cacheKey = new Request(c.req.url.toString(), c.req) const cache = caches.default let response = await cache.match(cacheKey) diff --git a/src/routes/user/userRoute.ts b/src/routes/user/userRoute.ts index f087fcc..51488b6 100644 --- a/src/routes/user/userRoute.ts +++ b/src/routes/user/userRoute.ts @@ -1,8 +1,9 @@ import { Hono } from "hono" import { getUsersBySearch } from "./getUsersBySearch" import { getUserByUsername } from "./getUserByUsername" +import { Bindings } from "@/worker-configuration" -const userRoute = new Hono() +const userRoute = new Hono<{ Bindings: Bindings }>() userRoute.get("/u/:username", async (c) => { return getUserByUsername(c) diff --git a/src/worker-configuration.d.ts b/src/worker-configuration.d.ts index 7ffd3cb..f5e744c 100644 --- a/src/worker-configuration.d.ts +++ b/src/worker-configuration.d.ts @@ -1,9 +1,8 @@ -export interface Env { +export type Bindings = { DISCORD_TOKEN: string bucket: R2Bucket ENVIRONMENT: string VERY_SECRET_SIGNUP_KEY: string TURSO_DATABASE_URL: string TURSO_DATABASE_AUTH_TOKEN: string - // object: DurableObject; } From 554fcccc632a128d7473e4c33ab325ea7efc3f48 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Thu, 31 Aug 2023 00:36:40 +0100 Subject: [PATCH 056/318] export defined context for correct types in routes --- src/routes/asset/downloadAsset.ts | 2 +- src/routes/asset/getAssetFromId.ts | 2 +- src/routes/auth/login.ts | 2 +- src/routes/auth/logout.ts | 2 +- src/routes/auth/signup.ts | 2 +- src/routes/auth/updateUserAttributes.ts | 2 +- src/routes/auth/uploadAsset.ts | 2 +- src/routes/auth/uploadAvatar.ts | 6 ++---- src/routes/auth/uploadBanner.ts | 6 ++---- src/routes/auth/validate.ts | 2 +- src/routes/discord/contributors.ts | 2 +- src/routes/games/allGames.ts | 2 +- src/routes/oc-generators/getGenerator.ts | 2 +- src/routes/oc-generators/getGenerators.ts | 2 +- src/routes/search/asset/assetSearch.ts | 2 +- src/routes/user/getUserByUsername.ts | 2 +- src/routes/user/getUsersBySearch.ts | 2 +- src/worker-configuration.d.ts | 5 +++++ 18 files changed, 24 insertions(+), 23 deletions(-) diff --git a/src/routes/asset/downloadAsset.ts b/src/routes/asset/downloadAsset.ts index 9e69db2..c44ad94 100644 --- a/src/routes/asset/downloadAsset.ts +++ b/src/routes/asset/downloadAsset.ts @@ -3,7 +3,7 @@ import { getConnection } from "@/db/turso" import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse" import { eq } from "drizzle-orm" import { assets } from "@/db/schema" -import type { Context } from "hono" +import type { APIContext as Context } from "@/worker-configuration" export async function downloadAsset(c: Context): Promise { const { assetId } = c.req.param() diff --git a/src/routes/asset/getAssetFromId.ts b/src/routes/asset/getAssetFromId.ts index 7cb5887..844428e 100644 --- a/src/routes/asset/getAssetFromId.ts +++ b/src/routes/asset/getAssetFromId.ts @@ -3,7 +3,7 @@ import { getConnection } from "@/db/turso" import { assets } from "@/db/schema" import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse" import { eq, desc } from "drizzle-orm" -import type { Context } from "hono" +import type { APIContext as Context } from "@/worker-configuration" export async function getAssetFromId(c: Context): Promise { const { id } = c.req.param() diff --git a/src/routes/auth/login.ts b/src/routes/auth/login.ts index 7a313f5..6b3fd01 100644 --- a/src/routes/auth/login.ts +++ b/src/routes/auth/login.ts @@ -1,5 +1,5 @@ import { auth } from "@/lib/auth/lucia" -import type { Context } from "hono" +import type { APIContext as Context } from "@/worker-configuration" const usernameThrottling = new Map< string, diff --git a/src/routes/auth/logout.ts b/src/routes/auth/logout.ts index eb14706..2755ca2 100644 --- a/src/routes/auth/logout.ts +++ b/src/routes/auth/logout.ts @@ -1,5 +1,5 @@ import { auth } from "@/lib/auth/lucia" -import type { Context } from "hono" +import type { APIContext as Context } from "@/worker-configuration" export async function logout(c: Context): Promise { const authRequest = auth(c.env).handleRequest(c) diff --git a/src/routes/auth/signup.ts b/src/routes/auth/signup.ts index f029cf9..a069559 100644 --- a/src/routes/auth/signup.ts +++ b/src/routes/auth/signup.ts @@ -1,5 +1,5 @@ import { auth } from "@/lib/auth/lucia" -import type { Context } from "hono" +import type { APIContext as Context } from "@/worker-configuration" // import * as validate from "@/lib/regex/accountValidation"; export async function signup(c: Context): Promise { diff --git a/src/routes/auth/updateUserAttributes.ts b/src/routes/auth/updateUserAttributes.ts index 2de2816..948efb5 100644 --- a/src/routes/auth/updateUserAttributes.ts +++ b/src/routes/auth/updateUserAttributes.ts @@ -1,5 +1,5 @@ import { auth } from "@/lib/auth/lucia" -import type { Context } from "hono" +import type { APIContext as Context } from "@/worker-configuration" export async function updateUserAttributes(c: Context): Promise { const authRequest = auth(c.env).handleRequest(c) diff --git a/src/routes/auth/uploadAsset.ts b/src/routes/auth/uploadAsset.ts index 58142f3..ae7bbe1 100644 --- a/src/routes/auth/uploadAsset.ts +++ b/src/routes/auth/uploadAsset.ts @@ -2,7 +2,7 @@ import { auth } from "@/lib/auth/lucia" import { getConnection } from "@/db/turso" import { eq, and } from "drizzle-orm" import { assets } from "@/db/schema" -import type { Context } from "hono" +import type { APIContext as Context } from "@/worker-configuration" export async function uploadAsset(c: Context): Promise { const authRequest = auth(c.env).handleRequest(c) diff --git a/src/routes/auth/uploadAvatar.ts b/src/routes/auth/uploadAvatar.ts index 5ccede1..c9ea2ee 100644 --- a/src/routes/auth/uploadAvatar.ts +++ b/src/routes/auth/uploadAvatar.ts @@ -1,5 +1,5 @@ import { auth } from "@/lib/auth/lucia" -import type { Context } from "hono" +import type { APIContext as Context } from "@/worker-configuration" // TODO: add support for animated avatars export async function uploadProfileImage(c: Context): Promise { @@ -31,9 +31,7 @@ export async function uploadProfileImage(c: Context): Promise { }) } - await c.env.bucket.put(newAvatarURL, newAvatar, { - contentType: "image/png", - }) + await c.env.bucket.put(newAvatarURL, newAvatar) return c.json({ success: true, state: "uploaded new profile image" }, 200) } diff --git a/src/routes/auth/uploadBanner.ts b/src/routes/auth/uploadBanner.ts index ae4f802..195eef0 100644 --- a/src/routes/auth/uploadBanner.ts +++ b/src/routes/auth/uploadBanner.ts @@ -1,5 +1,5 @@ import { auth } from "@/lib/auth/lucia" -import type { Context } from "hono" +import type { APIContext as Context } from "@/worker-configuration" // TODO: add support for animated banners export async function uploadBannerImage(c: Context): Promise { @@ -35,9 +35,7 @@ export async function uploadBannerImage(c: Context): Promise { }) } - await c.env.bucket.put(newBannerURL, newBanner, { - contentType: "image/png", - }) + await c.env.bucket.put(newBannerURL, newBanner) return c.json({ success: true, state: "uploaded new banner" }, 200) } diff --git a/src/routes/auth/validate.ts b/src/routes/auth/validate.ts index 829f0ba..6694af4 100644 --- a/src/routes/auth/validate.ts +++ b/src/routes/auth/validate.ts @@ -1,5 +1,5 @@ import { auth } from "@/lib/auth/lucia" -import type { Context } from "hono" +import type { APIContext as Context } from "@/worker-configuration" export async function validate(c: Context): Promise { console.log(c) diff --git a/src/routes/discord/contributors.ts b/src/routes/discord/contributors.ts index 0d98430..0af61b7 100644 --- a/src/routes/discord/contributors.ts +++ b/src/routes/discord/contributors.ts @@ -1,7 +1,7 @@ import { responseHeaders } from "@/lib/responseHeaders" import { roles, guildId } from "@/lib/discord" import type { Contributor, GuildMember } from "@/lib/types/discord" -import type { Context } from "hono" +import type { APIContext as Context } from "@/worker-configuration" // TODO: replace discord contributors with roles on the site export async function contributors(c: Context): Promise { diff --git a/src/routes/games/allGames.ts b/src/routes/games/allGames.ts index 9dbe45e..e41266e 100644 --- a/src/routes/games/allGames.ts +++ b/src/routes/games/allGames.ts @@ -2,7 +2,7 @@ import { responseHeaders } from "@/lib/responseHeaders" import { getConnection } from "@/db/turso" import { listBucket } from "@/lib/listBucket" import { games } from "@/db/schema" -import type { Context } from "hono" +import type { APIContext as Context } from "@/worker-configuration" export async function getAllGames(c: Context): Promise { const cacheKey = new Request(c.req.url.toString(), c.req) diff --git a/src/routes/oc-generators/getGenerator.ts b/src/routes/oc-generators/getGenerator.ts index 600621e..ac495dd 100644 --- a/src/routes/oc-generators/getGenerator.ts +++ b/src/routes/oc-generators/getGenerator.ts @@ -1,7 +1,7 @@ import { responseHeaders } from "@/lib/responseHeaders" import { listBucket } from "@/lib/listBucket" import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse" -import type { Context } from "hono" +import type { APIContext as Context } from "@/worker-configuration" export async function getGeneratorFromName(c: Context): Promise { const { gameName } = c.req.param() diff --git a/src/routes/oc-generators/getGenerators.ts b/src/routes/oc-generators/getGenerators.ts index 5614afa..e71d5c1 100644 --- a/src/routes/oc-generators/getGenerators.ts +++ b/src/routes/oc-generators/getGenerators.ts @@ -1,6 +1,6 @@ import { responseHeaders } from "@/lib/responseHeaders" import { listBucket } from "@/lib/listBucket" -import type { Context } from "hono" +import type { APIContext as Context } from "@/worker-configuration" export async function getGenerators(c: Context): Promise { const cacheKey = new Request(c.req.url.toString(), c.req) diff --git a/src/routes/search/asset/assetSearch.ts b/src/routes/search/asset/assetSearch.ts index 89b19de..60943b0 100644 --- a/src/routes/search/asset/assetSearch.ts +++ b/src/routes/search/asset/assetSearch.ts @@ -2,7 +2,7 @@ // import type { Asset } from "@/lib/types/asset" // import { getSearchResults } from "@/lib/query" // import { getConnection } from "@/db/turso" -// import type { Context } from "hono" +// import type { APIContext as Context } from "@/worker-configuration" // export async function getAssetSearch(c: Context): Promise { // const queryParams = c.req.query() diff --git a/src/routes/user/getUserByUsername.ts b/src/routes/user/getUserByUsername.ts index 87a58ab..ebf6270 100644 --- a/src/routes/user/getUserByUsername.ts +++ b/src/routes/user/getUserByUsername.ts @@ -3,7 +3,7 @@ import { getConnection } from "@/db/turso" import { users } from "@/db/schema" import { eq } from "drizzle-orm" import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse" -import type { Context } from "hono" +import type { APIContext as Context } from "@/worker-configuration" export async function getUserByUsername(c: Context): Promise { const { username } = c.req.param() diff --git a/src/routes/user/getUsersBySearch.ts b/src/routes/user/getUsersBySearch.ts index 5f9eef7..7ba66e5 100644 --- a/src/routes/user/getUsersBySearch.ts +++ b/src/routes/user/getUsersBySearch.ts @@ -3,7 +3,7 @@ import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse import { like } from "drizzle-orm" import { getConnection } from "@/db/turso" import { users } from "@/db/schema" -import type { Context } from "hono" +import type { APIContext as Context } from "@/worker-configuration" export async function getUsersBySearch(c: Context): Promise { const cacheKey = new Request(c.req.url.toString(), c.req) diff --git a/src/worker-configuration.d.ts b/src/worker-configuration.d.ts index f5e744c..4427870 100644 --- a/src/worker-configuration.d.ts +++ b/src/worker-configuration.d.ts @@ -1,3 +1,5 @@ +import type { Context } from "hono" + export type Bindings = { DISCORD_TOKEN: string bucket: R2Bucket @@ -6,3 +8,6 @@ export type Bindings = { TURSO_DATABASE_URL: string TURSO_DATABASE_AUTH_TOKEN: string } + +// this is the onl way i could figure out how to pass bindings to all the routes +export type APIContext = Context<{ Bindings: Bindings }> From 18110f909ebd4f9314bc2910d08ecfdf039573ec Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Thu, 31 Aug 2023 01:02:40 +0100 Subject: [PATCH 057/318] =?UTF-8?q?feat:=20view=20&=20save=20oc=20generato?= =?UTF-8?q?r=20responses=20=F0=9F=91=80=F0=9F=91=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/db/schema.ts | 2 ++ src/routes/auth/authRoute.ts | 18 +++++++++--- .../oc-generators/saveOCGeneratorResponse.ts | 28 +++++++++++++++++++ .../oc-generators/viewOCGeneratorResponses.ts | 23 +++++++++++++++ .../self-upload}/uploadAsset.ts | 0 .../self-upload}/uploadAvatar.ts | 0 .../self-upload}/uploadBanner.ts | 0 .../updateUserAttributes.ts | 0 8 files changed, 67 insertions(+), 4 deletions(-) create mode 100644 src/routes/auth/oc-generators/saveOCGeneratorResponse.ts create mode 100644 src/routes/auth/oc-generators/viewOCGeneratorResponses.ts rename src/routes/auth/{ => user-attributes/self-upload}/uploadAsset.ts (100%) rename src/routes/auth/{ => user-attributes/self-upload}/uploadAvatar.ts (100%) rename src/routes/auth/{ => user-attributes/self-upload}/uploadBanner.ts (100%) rename src/routes/auth/{ => user-attributes}/updateUserAttributes.ts (100%) diff --git a/src/db/schema.ts b/src/db/schema.ts index df5fa83..42bb523 100644 --- a/src/db/schema.ts +++ b/src/db/schema.ts @@ -308,7 +308,9 @@ export const savedOcGenerators = sqliteTable( onUpdate: "cascade", onDelete: "cascade", }), + name: text("name").notNull(), game: text("game").notNull(), + isPublic: integer("is_public").default(0).notNull(), content: text("content").notNull(), // this is stored as json }, (savedOcGenerators) => { diff --git a/src/routes/auth/authRoute.ts b/src/routes/auth/authRoute.ts index a499cd7..9ef6bae 100644 --- a/src/routes/auth/authRoute.ts +++ b/src/routes/auth/authRoute.ts @@ -4,11 +4,13 @@ import { logout } from "./logout" import { signup } from "./signup" import { cors } from "hono/cors" import { validate } from "./validate" -import { uploadProfileImage } from "./uploadAvatar" -import { uploadBannerImage } from "./uploadBanner" -import { updateUserAttributes } from "./updateUserAttributes" -import { uploadAsset } from "./uploadAsset" +import { uploadProfileImage } from "./user-attributes/self-upload/uploadAvatar" +import { uploadBannerImage } from "./user-attributes/self-upload/uploadBanner" +import { saveOCGeneratorResponse } from "./oc-generators/saveOCGeneratorResponse" +import { updateUserAttributes } from "./user-attributes/updateUserAttributes" +import { uploadAsset } from "./user-attributes/self-upload/uploadAsset" import { Bindings } from "@/worker-configuration" +import { viewOCGeneratorResponses } from "./oc-generators/viewOCGeneratorResponses" const authRoute = new Hono<{ Bindings: Bindings }>() @@ -44,6 +46,14 @@ authRoute.post("/signup", async (c) => { return signup(c) }) +authRoute.post("/oc-generator/save", async (c) => { + return saveOCGeneratorResponse(c) +}) + +authRoute.get("/oc-generator/view/all", async (c) => { + return viewOCGeneratorResponses(c) +}) + authRoute.get("/validate", async (c) => { return validate(c) }) diff --git a/src/routes/auth/oc-generators/saveOCGeneratorResponse.ts b/src/routes/auth/oc-generators/saveOCGeneratorResponse.ts new file mode 100644 index 0000000..fbe99ea --- /dev/null +++ b/src/routes/auth/oc-generators/saveOCGeneratorResponse.ts @@ -0,0 +1,28 @@ +import { auth } from "@/lib/auth/lucia" +import type { APIContext as Context } from "@/worker-configuration" +import { savedOcGenerators } from "@/db/schema" +import { getConnection } from "@/db/turso" + +export async function saveOCGeneratorResponse(c: Context): Promise { + const authRequest = auth(c.env).handleRequest(c) + + const session = await authRequest.validate() + + const drizzle = await getConnection(c.env).drizzle + + const formData = await c.req.formData() + + // TODO: make sure data is actually valid before inserting it into the database + const ocGeneratorResponse = { + id: crypto.randomUUID(), + userId: session.userId as string, + name: formData.get("name") as string, + game: formData.get("game") as string, + isPublic: parseInt(formData.get("isPublic") as string), // 1 = yes, 0 = no, default = 0 + content: formData.get("content") as string, // this is stored as json, which can then be parsed + } + + await drizzle.insert(savedOcGenerators).values(ocGeneratorResponse) + + return c.json({ success: true, state: "saved", ocGeneratorResponse }, 200) +} diff --git a/src/routes/auth/oc-generators/viewOCGeneratorResponses.ts b/src/routes/auth/oc-generators/viewOCGeneratorResponses.ts new file mode 100644 index 0000000..bcb8c60 --- /dev/null +++ b/src/routes/auth/oc-generators/viewOCGeneratorResponses.ts @@ -0,0 +1,23 @@ +import { auth } from "@/lib/auth/lucia" +import type { APIContext as Context } from "@/worker-configuration" +import { savedOcGenerators } from "@/db/schema" +import { getConnection } from "@/db/turso" +import { eq } from "drizzle-orm" + +export async function viewOCGeneratorResponses(c: Context): Promise { + const authRequest = auth(c.env).handleRequest(c) + + const session = await authRequest.validate() + + const drizzle = await getConnection(c.env).drizzle + + const ocGeneratorResponses = await drizzle + .select() + .from(savedOcGenerators) + .where(eq(savedOcGenerators.userId, session.userId)) + + return c.json( + { success: true, state: "valid session", ocGeneratorResponses }, + 200 + ) +} diff --git a/src/routes/auth/uploadAsset.ts b/src/routes/auth/user-attributes/self-upload/uploadAsset.ts similarity index 100% rename from src/routes/auth/uploadAsset.ts rename to src/routes/auth/user-attributes/self-upload/uploadAsset.ts diff --git a/src/routes/auth/uploadAvatar.ts b/src/routes/auth/user-attributes/self-upload/uploadAvatar.ts similarity index 100% rename from src/routes/auth/uploadAvatar.ts rename to src/routes/auth/user-attributes/self-upload/uploadAvatar.ts diff --git a/src/routes/auth/uploadBanner.ts b/src/routes/auth/user-attributes/self-upload/uploadBanner.ts similarity index 100% rename from src/routes/auth/uploadBanner.ts rename to src/routes/auth/user-attributes/self-upload/uploadBanner.ts diff --git a/src/routes/auth/updateUserAttributes.ts b/src/routes/auth/user-attributes/updateUserAttributes.ts similarity index 100% rename from src/routes/auth/updateUserAttributes.ts rename to src/routes/auth/user-attributes/updateUserAttributes.ts From 27384271326138e08b99944a0fa57f4704233ba2 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Thu, 31 Aug 2023 02:05:58 +0100 Subject: [PATCH 058/318] cleanup unused files --- src/lib/auth/lucia.ts | 2 +- src/lib/types/asset.ts | 16 ---------------- src/lib/types/game.ts | 9 --------- src/lib/types/user.ts | 15 --------------- src/lib/validate/regexValidation.ts | 18 ------------------ src/routes/asset/downloadAsset.ts | 7 +++++++ src/routes/auth/authRoute.ts | 2 +- 7 files changed, 9 insertions(+), 60 deletions(-) delete mode 100644 src/lib/types/asset.ts delete mode 100644 src/lib/types/game.ts delete mode 100644 src/lib/types/user.ts delete mode 100644 src/lib/validate/regexValidation.ts diff --git a/src/lib/auth/lucia.ts b/src/lib/auth/lucia.ts index 1673f07..58c5623 100644 --- a/src/lib/auth/lucia.ts +++ b/src/lib/auth/lucia.ts @@ -1,7 +1,7 @@ import { lucia } from "lucia" import { hono } from "lucia/middleware" import { getConnection } from "@/db/turso" -import { Env } from "@/worker-configuration" +import { Bindings as Env } from "@/worker-configuration" import { tableNames } from "@/db/drizzle" import { libsql } from "@lucia-auth/adapter-sqlite" diff --git a/src/lib/types/asset.ts b/src/lib/types/asset.ts deleted file mode 100644 index 2250bd4..0000000 --- a/src/lib/types/asset.ts +++ /dev/null @@ -1,16 +0,0 @@ -export interface Asset { - id: number - name: string - game: string - asset_category: string - tags: string - url: string - status: string - uploaded_by: string - uploaded_date: string - view_count?: number - download_count?: number - file_size: number - width: number - height: number -} diff --git a/src/lib/types/game.ts b/src/lib/types/game.ts deleted file mode 100644 index f282afb..0000000 --- a/src/lib/types/game.ts +++ /dev/null @@ -1,9 +0,0 @@ -export interface Game { - id: number - name: string - asset_count: number - asset_categories: string // comma separated category1,category2,category3 - category_count: number - last_updated: string - has_generator: boolean -} diff --git a/src/lib/types/user.ts b/src/lib/types/user.ts deleted file mode 100644 index b2d97ee..0000000 --- a/src/lib/types/user.ts +++ /dev/null @@ -1,15 +0,0 @@ -export interface User { - id: string - username: string - username_colour: string | null - avatar_url: string | null - banner_url: string | null - email: string - email_verified: number - pronouns: string | null - verified: number - bio: string | null - role_flags: number - self_assignable_role_flags: number - date_joined: Date -} diff --git a/src/lib/validate/regexValidation.ts b/src/lib/validate/regexValidation.ts deleted file mode 100644 index a8d10ea..0000000 --- a/src/lib/validate/regexValidation.ts +++ /dev/null @@ -1,18 +0,0 @@ -// must have @ and . inside to be considered an email -export function email(email: string) { - const emailRegex = /\S+@\S+\.\S+/ - return emailRegex.test(email) -} - -// minimum eight characters, at least one uppercase letter, one lowercase letter, one number and one special character -export function password(password: string) { - const passwordRegex = - /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$/ - return passwordRegex.test(password) -} - -// 5 to 16 characters which contain only characters, numeric digits, underscore and first character must be a letter -export function username(username: string) { - const usernameRegex = /^[a-zA-Z0-9]{5,16}$/ - return usernameRegex.test(username) -} diff --git a/src/routes/asset/downloadAsset.ts b/src/routes/asset/downloadAsset.ts index c44ad94..589f28f 100644 --- a/src/routes/asset/downloadAsset.ts +++ b/src/routes/asset/downloadAsset.ts @@ -19,6 +19,13 @@ export async function downloadAsset(c: Context): Promise { if (!asset) return createNotFoundResponse(c, "Asset not found", responseHeaders) + if (asset) + await drizzle + .update(assets) + .set({ downloadCount: asset[0].downloadCount + 1 }) + .where(eq(assets.id, parseInt(assetId))) + .execute() + const response = await fetch(asset[0].url) const blob = await response.blob() diff --git a/src/routes/auth/authRoute.ts b/src/routes/auth/authRoute.ts index 9ef6bae..8de9d3d 100644 --- a/src/routes/auth/authRoute.ts +++ b/src/routes/auth/authRoute.ts @@ -18,7 +18,7 @@ authRoute.use( "*", cors({ credentials: true, - origin: ["https://next.wanderer.moe", "http://localhost:3000"], + origin: ["https://next.wanderer.moe"], }) ) From 19c9b28e09e16d5375617ba8d9f7f95b1ba69599 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Thu, 31 Aug 2023 19:14:06 +0100 Subject: [PATCH 059/318] delete old banner/avatar and rewrite on upload --- .../auth/user-attributes/self-upload/uploadAvatar.ts | 8 ++++++++ .../auth/user-attributes/self-upload/uploadBanner.ts | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/src/routes/auth/user-attributes/self-upload/uploadAvatar.ts b/src/routes/auth/user-attributes/self-upload/uploadAvatar.ts index c9ea2ee..3f2eeeb 100644 --- a/src/routes/auth/user-attributes/self-upload/uploadAvatar.ts +++ b/src/routes/auth/user-attributes/self-upload/uploadAvatar.ts @@ -31,6 +31,14 @@ export async function uploadProfileImage(c: Context): Promise { }) } + if (session.user.avatar_url) { + const oldAvatarObject = await c.env.bucket.get(session.user.avatar_url) + + if (oldAvatarObject) { + await c.env.bucket.delete(session.user.avatar_url) + } + } + await c.env.bucket.put(newAvatarURL, newAvatar) return c.json({ success: true, state: "uploaded new profile image" }, 200) diff --git a/src/routes/auth/user-attributes/self-upload/uploadBanner.ts b/src/routes/auth/user-attributes/self-upload/uploadBanner.ts index 195eef0..e544fd8 100644 --- a/src/routes/auth/user-attributes/self-upload/uploadBanner.ts +++ b/src/routes/auth/user-attributes/self-upload/uploadBanner.ts @@ -35,6 +35,14 @@ export async function uploadBannerImage(c: Context): Promise { }) } + if (session.user.banner_url) { + const oldBannerObject = await c.env.bucket.get(session.user.banner_url) + + if (oldBannerObject) { + await c.env.bucket.delete(session.user.banner_url) + } + } + await c.env.bucket.put(newBannerURL, newBanner) return c.json({ success: true, state: "uploaded new banner" }, 200) From 2b7dbb570da78ba1cb5565058616ddc3022676b2 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Thu, 31 Aug 2023 19:57:28 +0100 Subject: [PATCH 060/318] move everything into `/v2/` route --- src/index.ts | 24 +++++++++---------- src/lucia.d.ts | 2 +- src/{ => v2}/db/drizzle.ts | 2 +- src/{ => v2}/db/schema.ts | 2 +- src/{ => v2}/db/turso.ts | 2 +- src/{ => v2}/lib/auth/lucia.ts | 4 ++-- src/{ => v2}/lib/auth/roleFlags.ts | 0 src/{ => v2}/lib/discord.ts | 0 src/{ => v2}/lib/helpers/rename.ts | 0 .../lib/helpers/responses/notFoundResponse.ts | 0 src/{ => v2}/lib/listBucket.ts | 0 src/{ => v2}/lib/resend/email.ts | 0 src/{ => v2}/lib/responseHeaders.ts | 1 - src/{ => v2}/lib/types/discord.ts | 0 src/{ => v2}/routes/asset/assetRoute.ts | 0 src/{ => v2}/routes/asset/downloadAsset.ts | 8 +++---- src/{ => v2}/routes/asset/getAssetFromId.ts | 8 +++---- src/{ => v2}/routes/auth/authRoute.ts | 0 src/{ => v2}/routes/auth/login.ts | 2 +- src/{ => v2}/routes/auth/logout.ts | 2 +- .../oc-generators/saveOCGeneratorResponse.ts | 6 ++--- .../oc-generators/viewOCGeneratorResponses.ts | 6 ++--- src/{ => v2}/routes/auth/signup.ts | 4 ++-- .../self-upload/uploadAsset.ts | 6 ++--- .../self-upload/uploadAvatar.ts | 2 +- .../self-upload/uploadBanner.ts | 2 +- .../user-attributes/updateUserAttributes.ts | 2 +- src/{ => v2}/routes/auth/validate.ts | 2 +- src/{ => v2}/routes/discord/contributors.ts | 6 ++--- src/{ => v2}/routes/discord/discordRoute.ts | 0 src/{ => v2}/routes/games/allGames.ts | 8 +++---- src/{ => v2}/routes/games/gamesRoute.ts | 0 .../routes/oc-generators/getGenerator.ts | 6 ++--- .../routes/oc-generators/getGenerators.ts | 6 ++--- .../routes/oc-generators/ocGeneratorRoutes.ts | 0 .../routes/search/asset/assetSearch.ts | 8 +++---- .../routes/search/asset/searchRoute.ts | 0 src/{ => v2}/routes/user/getUserByUsername.ts | 8 +++---- src/{ => v2}/routes/user/getUsersBySearch.ts | 8 +++---- src/{ => v2}/routes/user/userRoute.ts | 0 40 files changed, 68 insertions(+), 69 deletions(-) rename src/{ => v2}/db/drizzle.ts (94%) rename src/{ => v2}/db/schema.ts (99%) rename src/{ => v2}/db/turso.ts (92%) rename src/{ => v2}/lib/auth/lucia.ts (95%) rename src/{ => v2}/lib/auth/roleFlags.ts (100%) rename src/{ => v2}/lib/discord.ts (100%) rename src/{ => v2}/lib/helpers/rename.ts (100%) rename src/{ => v2}/lib/helpers/responses/notFoundResponse.ts (100%) rename src/{ => v2}/lib/listBucket.ts (100%) rename src/{ => v2}/lib/resend/email.ts (100%) rename src/{ => v2}/lib/responseHeaders.ts (84%) rename src/{ => v2}/lib/types/discord.ts (100%) rename src/{ => v2}/routes/asset/assetRoute.ts (100%) rename src/{ => v2}/routes/asset/downloadAsset.ts (80%) rename src/{ => v2}/routes/asset/getAssetFromId.ts (84%) rename src/{ => v2}/routes/auth/authRoute.ts (100%) rename src/{ => v2}/routes/auth/login.ts (98%) rename src/{ => v2}/routes/auth/logout.ts (93%) rename src/{ => v2}/routes/auth/oc-generators/saveOCGeneratorResponse.ts (87%) rename src/{ => v2}/routes/auth/oc-generators/viewOCGeneratorResponses.ts (81%) rename src/{ => v2}/routes/auth/signup.ts (96%) rename src/{ => v2}/routes/auth/user-attributes/self-upload/uploadAsset.ts (96%) rename src/{ => v2}/routes/auth/user-attributes/self-upload/uploadAvatar.ts (97%) rename src/{ => v2}/routes/auth/user-attributes/self-upload/uploadBanner.ts (97%) rename src/{ => v2}/routes/auth/user-attributes/updateUserAttributes.ts (96%) rename src/{ => v2}/routes/auth/validate.ts (96%) rename src/{ => v2}/routes/discord/contributors.ts (91%) rename src/{ => v2}/routes/discord/discordRoute.ts (100%) rename src/{ => v2}/routes/games/allGames.ts (87%) rename src/{ => v2}/routes/games/gamesRoute.ts (100%) rename src/{ => v2}/routes/oc-generators/getGenerator.ts (84%) rename src/{ => v2}/routes/oc-generators/getGenerators.ts (84%) rename src/{ => v2}/routes/oc-generators/ocGeneratorRoutes.ts (100%) rename src/{ => v2}/routes/search/asset/assetSearch.ts (93%) rename src/{ => v2}/routes/search/asset/searchRoute.ts (100%) rename src/{ => v2}/routes/user/getUserByUsername.ts (82%) rename src/{ => v2}/routes/user/getUsersBySearch.ts (81%) rename src/{ => v2}/routes/user/userRoute.ts (100%) diff --git a/src/index.ts b/src/index.ts index 0aeba6a..f1b3bc6 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,11 +1,11 @@ import { Hono } from "hono" -import assetRoute from "./routes/asset/assetRoute" -import discordRoute from "./routes/discord/discordRoute" -import ocGeneratorRoute from "./routes/oc-generators/ocGeneratorRoutes" +import assetRoute from "./v2/routes/asset/assetRoute" +import discordRoute from "./v2/routes/discord/discordRoute" +import ocGeneratorRoute from "./v2/routes/oc-generators/ocGeneratorRoutes" // import assetSearchRoute from "./routes/search/asset/searchRoute"; -import gamesRoute from "./routes/games/gamesRoute" -import userRoute from "./routes/user/userRoute" -import authRoute from "./routes/auth/authRoute" +import gamesRoute from "./v2/routes/games/gamesRoute" +import userRoute from "./v2/routes/user/userRoute" +import authRoute from "./v2/routes/auth/authRoute" import { getRuntimeKey } from "hono/adapter" import { Bindings } from "@/worker-configuration" @@ -22,13 +22,13 @@ app.get("/", (c) => { c.status(200) return c.json({ success: "true", status: "ok", routes: app.routes }) }) -app.route("/asset", assetRoute) -app.route("/discord", discordRoute) -app.route("/oc-generators", ocGeneratorRoute) +app.route("/v2/asset", assetRoute) +app.route("/v2/discord", discordRoute) +app.route("/v2/oc-generators", ocGeneratorRoute) // app.route("/search/assets", assetSearchRoute); -app.route("/games", gamesRoute) -app.route("/user", userRoute) -app.route("/auth", authRoute) +app.route("/v2/games", gamesRoute) +app.route("/v2/user", userRoute) +app.route("/v2/auth", authRoute) app.all("*", (c) => { c.status(404) return c.json({ status: "not found" }) diff --git a/src/lucia.d.ts b/src/lucia.d.ts index d7f5905..409e1c1 100644 --- a/src/lucia.d.ts +++ b/src/lucia.d.ts @@ -1,6 +1,6 @@ /// declare namespace Lucia { - type Auth = import("./lib/auth/lucia").Auth + type Auth = import("./v2/lib/auth/lucia").Auth type DatabaseUserAttributes = { username: string username_colour: string | null diff --git a/src/db/drizzle.ts b/src/v2/db/drizzle.ts similarity index 94% rename from src/db/drizzle.ts rename to src/v2/db/drizzle.ts index c2c26e0..5910fe7 100644 --- a/src/db/drizzle.ts +++ b/src/v2/db/drizzle.ts @@ -19,4 +19,4 @@ export const tableNames = { socialsConnection: "socialsConnection", } -export * as schema from "@/db/schema" +export * as schema from "@/v2/db/schema" diff --git a/src/db/schema.ts b/src/v2/db/schema.ts similarity index 99% rename from src/db/schema.ts rename to src/v2/db/schema.ts index 42bb523..ccc63f4 100644 --- a/src/db/schema.ts +++ b/src/v2/db/schema.ts @@ -1,4 +1,4 @@ -import { tableNames } from "@/db/drizzle" +import { tableNames } from "@/v2/db/drizzle" import { relations } from "drizzle-orm" import { sqliteTable, diff --git a/src/db/turso.ts b/src/v2/db/turso.ts similarity index 92% rename from src/db/turso.ts rename to src/v2/db/turso.ts index ac1972e..83dc03e 100644 --- a/src/db/turso.ts +++ b/src/v2/db/turso.ts @@ -1,5 +1,5 @@ import { Bindings as Env } from "@/worker-configuration" -import * as schema from "@/db/schema" +import * as schema from "@/v2/db/schema" import { drizzle as drizzleORM } from "drizzle-orm/libsql" import { createClient } from "@libsql/client/web" // because we're in a worker diff --git a/src/lib/auth/lucia.ts b/src/v2/lib/auth/lucia.ts similarity index 95% rename from src/lib/auth/lucia.ts rename to src/v2/lib/auth/lucia.ts index 58c5623..4261611 100644 --- a/src/lib/auth/lucia.ts +++ b/src/v2/lib/auth/lucia.ts @@ -1,8 +1,8 @@ import { lucia } from "lucia" import { hono } from "lucia/middleware" -import { getConnection } from "@/db/turso" +import { getConnection } from "@/v2/db/turso" import { Bindings as Env } from "@/worker-configuration" -import { tableNames } from "@/db/drizzle" +import { tableNames } from "@/v2/db/drizzle" import { libsql } from "@lucia-auth/adapter-sqlite" // this is so we can pass in env during requests, diff --git a/src/lib/auth/roleFlags.ts b/src/v2/lib/auth/roleFlags.ts similarity index 100% rename from src/lib/auth/roleFlags.ts rename to src/v2/lib/auth/roleFlags.ts diff --git a/src/lib/discord.ts b/src/v2/lib/discord.ts similarity index 100% rename from src/lib/discord.ts rename to src/v2/lib/discord.ts diff --git a/src/lib/helpers/rename.ts b/src/v2/lib/helpers/rename.ts similarity index 100% rename from src/lib/helpers/rename.ts rename to src/v2/lib/helpers/rename.ts diff --git a/src/lib/helpers/responses/notFoundResponse.ts b/src/v2/lib/helpers/responses/notFoundResponse.ts similarity index 100% rename from src/lib/helpers/responses/notFoundResponse.ts rename to src/v2/lib/helpers/responses/notFoundResponse.ts diff --git a/src/lib/listBucket.ts b/src/v2/lib/listBucket.ts similarity index 100% rename from src/lib/listBucket.ts rename to src/v2/lib/listBucket.ts diff --git a/src/lib/resend/email.ts b/src/v2/lib/resend/email.ts similarity index 100% rename from src/lib/resend/email.ts rename to src/v2/lib/resend/email.ts diff --git a/src/lib/responseHeaders.ts b/src/v2/lib/responseHeaders.ts similarity index 84% rename from src/lib/responseHeaders.ts rename to src/v2/lib/responseHeaders.ts index 9a968a5..381c171 100644 --- a/src/lib/responseHeaders.ts +++ b/src/v2/lib/responseHeaders.ts @@ -2,5 +2,4 @@ export const responseHeaders: Record = { "X-Content-Type-Options": "nosniff", "Referrer-Policy": "strict-origin-when-cross-origin", "content-type": "application/json;charset=UTF-8", - "access-control-allow-origin": "*", } diff --git a/src/lib/types/discord.ts b/src/v2/lib/types/discord.ts similarity index 100% rename from src/lib/types/discord.ts rename to src/v2/lib/types/discord.ts diff --git a/src/routes/asset/assetRoute.ts b/src/v2/routes/asset/assetRoute.ts similarity index 100% rename from src/routes/asset/assetRoute.ts rename to src/v2/routes/asset/assetRoute.ts diff --git a/src/routes/asset/downloadAsset.ts b/src/v2/routes/asset/downloadAsset.ts similarity index 80% rename from src/routes/asset/downloadAsset.ts rename to src/v2/routes/asset/downloadAsset.ts index 589f28f..dcf924c 100644 --- a/src/routes/asset/downloadAsset.ts +++ b/src/v2/routes/asset/downloadAsset.ts @@ -1,8 +1,8 @@ -import { responseHeaders } from "@/lib/responseHeaders" -import { getConnection } from "@/db/turso" -import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse" +import { responseHeaders } from "@/v2/lib/responseHeaders" +import { getConnection } from "@/v2/db/turso" +import { createNotFoundResponse } from "@/v2/lib/helpers/responses/notFoundResponse" import { eq } from "drizzle-orm" -import { assets } from "@/db/schema" +import { assets } from "@/v2/db/schema" import type { APIContext as Context } from "@/worker-configuration" export async function downloadAsset(c: Context): Promise { diff --git a/src/routes/asset/getAssetFromId.ts b/src/v2/routes/asset/getAssetFromId.ts similarity index 84% rename from src/routes/asset/getAssetFromId.ts rename to src/v2/routes/asset/getAssetFromId.ts index 844428e..a111f09 100644 --- a/src/routes/asset/getAssetFromId.ts +++ b/src/v2/routes/asset/getAssetFromId.ts @@ -1,7 +1,7 @@ -import { responseHeaders } from "@/lib/responseHeaders" -import { getConnection } from "@/db/turso" -import { assets } from "@/db/schema" -import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse" +import { responseHeaders } from "@/v2/lib/responseHeaders" +import { getConnection } from "@/v2/db/turso" +import { assets } from "@/v2/db/schema" +import { createNotFoundResponse } from "@/v2/lib/helpers/responses/notFoundResponse" import { eq, desc } from "drizzle-orm" import type { APIContext as Context } from "@/worker-configuration" diff --git a/src/routes/auth/authRoute.ts b/src/v2/routes/auth/authRoute.ts similarity index 100% rename from src/routes/auth/authRoute.ts rename to src/v2/routes/auth/authRoute.ts diff --git a/src/routes/auth/login.ts b/src/v2/routes/auth/login.ts similarity index 98% rename from src/routes/auth/login.ts rename to src/v2/routes/auth/login.ts index 6b3fd01..85b5066 100644 --- a/src/routes/auth/login.ts +++ b/src/v2/routes/auth/login.ts @@ -1,4 +1,4 @@ -import { auth } from "@/lib/auth/lucia" +import { auth } from "@/v2/lib/auth/lucia" import type { APIContext as Context } from "@/worker-configuration" const usernameThrottling = new Map< diff --git a/src/routes/auth/logout.ts b/src/v2/routes/auth/logout.ts similarity index 93% rename from src/routes/auth/logout.ts rename to src/v2/routes/auth/logout.ts index 2755ca2..0a149f7 100644 --- a/src/routes/auth/logout.ts +++ b/src/v2/routes/auth/logout.ts @@ -1,4 +1,4 @@ -import { auth } from "@/lib/auth/lucia" +import { auth } from "@/v2/lib/auth/lucia" import type { APIContext as Context } from "@/worker-configuration" export async function logout(c: Context): Promise { diff --git a/src/routes/auth/oc-generators/saveOCGeneratorResponse.ts b/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts similarity index 87% rename from src/routes/auth/oc-generators/saveOCGeneratorResponse.ts rename to src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts index fbe99ea..2224539 100644 --- a/src/routes/auth/oc-generators/saveOCGeneratorResponse.ts +++ b/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts @@ -1,7 +1,7 @@ -import { auth } from "@/lib/auth/lucia" +import { auth } from "@/v2/lib/auth/lucia" import type { APIContext as Context } from "@/worker-configuration" -import { savedOcGenerators } from "@/db/schema" -import { getConnection } from "@/db/turso" +import { savedOcGenerators } from "@/v2/db/schema" +import { getConnection } from "@/v2/db/turso" export async function saveOCGeneratorResponse(c: Context): Promise { const authRequest = auth(c.env).handleRequest(c) diff --git a/src/routes/auth/oc-generators/viewOCGeneratorResponses.ts b/src/v2/routes/auth/oc-generators/viewOCGeneratorResponses.ts similarity index 81% rename from src/routes/auth/oc-generators/viewOCGeneratorResponses.ts rename to src/v2/routes/auth/oc-generators/viewOCGeneratorResponses.ts index bcb8c60..8b82feb 100644 --- a/src/routes/auth/oc-generators/viewOCGeneratorResponses.ts +++ b/src/v2/routes/auth/oc-generators/viewOCGeneratorResponses.ts @@ -1,7 +1,7 @@ -import { auth } from "@/lib/auth/lucia" +import { auth } from "@/v2/lib/auth/lucia" import type { APIContext as Context } from "@/worker-configuration" -import { savedOcGenerators } from "@/db/schema" -import { getConnection } from "@/db/turso" +import { savedOcGenerators } from "@/v2/db/schema" +import { getConnection } from "@/v2/db/turso" import { eq } from "drizzle-orm" export async function viewOCGeneratorResponses(c: Context): Promise { diff --git a/src/routes/auth/signup.ts b/src/v2/routes/auth/signup.ts similarity index 96% rename from src/routes/auth/signup.ts rename to src/v2/routes/auth/signup.ts index a069559..1cfa9ad 100644 --- a/src/routes/auth/signup.ts +++ b/src/v2/routes/auth/signup.ts @@ -1,6 +1,6 @@ -import { auth } from "@/lib/auth/lucia" +import { auth } from "@/v2/lib/auth/lucia" import type { APIContext as Context } from "@/worker-configuration" -// import * as validate from "@/lib/regex/accountValidation"; +// import * as validate from "@/v2/lib/regex/accountValidation"; export async function signup(c: Context): Promise { const formData = await c.req.formData() diff --git a/src/routes/auth/user-attributes/self-upload/uploadAsset.ts b/src/v2/routes/auth/user-attributes/self-upload/uploadAsset.ts similarity index 96% rename from src/routes/auth/user-attributes/self-upload/uploadAsset.ts rename to src/v2/routes/auth/user-attributes/self-upload/uploadAsset.ts index ae7bbe1..0546dc6 100644 --- a/src/routes/auth/user-attributes/self-upload/uploadAsset.ts +++ b/src/v2/routes/auth/user-attributes/self-upload/uploadAsset.ts @@ -1,7 +1,7 @@ -import { auth } from "@/lib/auth/lucia" -import { getConnection } from "@/db/turso" +import { auth } from "@/v2/lib/auth/lucia" +import { getConnection } from "@/v2/db/turso" import { eq, and } from "drizzle-orm" -import { assets } from "@/db/schema" +import { assets } from "@/v2/db/schema" import type { APIContext as Context } from "@/worker-configuration" export async function uploadAsset(c: Context): Promise { diff --git a/src/routes/auth/user-attributes/self-upload/uploadAvatar.ts b/src/v2/routes/auth/user-attributes/self-upload/uploadAvatar.ts similarity index 97% rename from src/routes/auth/user-attributes/self-upload/uploadAvatar.ts rename to src/v2/routes/auth/user-attributes/self-upload/uploadAvatar.ts index 3f2eeeb..d5201fb 100644 --- a/src/routes/auth/user-attributes/self-upload/uploadAvatar.ts +++ b/src/v2/routes/auth/user-attributes/self-upload/uploadAvatar.ts @@ -1,4 +1,4 @@ -import { auth } from "@/lib/auth/lucia" +import { auth } from "@/v2/lib/auth/lucia" import type { APIContext as Context } from "@/worker-configuration" // TODO: add support for animated avatars diff --git a/src/routes/auth/user-attributes/self-upload/uploadBanner.ts b/src/v2/routes/auth/user-attributes/self-upload/uploadBanner.ts similarity index 97% rename from src/routes/auth/user-attributes/self-upload/uploadBanner.ts rename to src/v2/routes/auth/user-attributes/self-upload/uploadBanner.ts index e544fd8..69db6a1 100644 --- a/src/routes/auth/user-attributes/self-upload/uploadBanner.ts +++ b/src/v2/routes/auth/user-attributes/self-upload/uploadBanner.ts @@ -1,4 +1,4 @@ -import { auth } from "@/lib/auth/lucia" +import { auth } from "@/v2/lib/auth/lucia" import type { APIContext as Context } from "@/worker-configuration" // TODO: add support for animated banners diff --git a/src/routes/auth/user-attributes/updateUserAttributes.ts b/src/v2/routes/auth/user-attributes/updateUserAttributes.ts similarity index 96% rename from src/routes/auth/user-attributes/updateUserAttributes.ts rename to src/v2/routes/auth/user-attributes/updateUserAttributes.ts index 948efb5..c6d752a 100644 --- a/src/routes/auth/user-attributes/updateUserAttributes.ts +++ b/src/v2/routes/auth/user-attributes/updateUserAttributes.ts @@ -1,4 +1,4 @@ -import { auth } from "@/lib/auth/lucia" +import { auth } from "@/v2/lib/auth/lucia" import type { APIContext as Context } from "@/worker-configuration" export async function updateUserAttributes(c: Context): Promise { diff --git a/src/routes/auth/validate.ts b/src/v2/routes/auth/validate.ts similarity index 96% rename from src/routes/auth/validate.ts rename to src/v2/routes/auth/validate.ts index 6694af4..f75bf60 100644 --- a/src/routes/auth/validate.ts +++ b/src/v2/routes/auth/validate.ts @@ -1,4 +1,4 @@ -import { auth } from "@/lib/auth/lucia" +import { auth } from "@/v2/lib/auth/lucia" import type { APIContext as Context } from "@/worker-configuration" export async function validate(c: Context): Promise { diff --git a/src/routes/discord/contributors.ts b/src/v2/routes/discord/contributors.ts similarity index 91% rename from src/routes/discord/contributors.ts rename to src/v2/routes/discord/contributors.ts index 0af61b7..958dace 100644 --- a/src/routes/discord/contributors.ts +++ b/src/v2/routes/discord/contributors.ts @@ -1,6 +1,6 @@ -import { responseHeaders } from "@/lib/responseHeaders" -import { roles, guildId } from "@/lib/discord" -import type { Contributor, GuildMember } from "@/lib/types/discord" +import { responseHeaders } from "@/v2/lib/responseHeaders" +import { roles, guildId } from "@/v2/lib/discord" +import type { Contributor, GuildMember } from "@/v2/lib/types/discord" import type { APIContext as Context } from "@/worker-configuration" // TODO: replace discord contributors with roles on the site diff --git a/src/routes/discord/discordRoute.ts b/src/v2/routes/discord/discordRoute.ts similarity index 100% rename from src/routes/discord/discordRoute.ts rename to src/v2/routes/discord/discordRoute.ts diff --git a/src/routes/games/allGames.ts b/src/v2/routes/games/allGames.ts similarity index 87% rename from src/routes/games/allGames.ts rename to src/v2/routes/games/allGames.ts index e41266e..b4f6adc 100644 --- a/src/routes/games/allGames.ts +++ b/src/v2/routes/games/allGames.ts @@ -1,7 +1,7 @@ -import { responseHeaders } from "@/lib/responseHeaders" -import { getConnection } from "@/db/turso" -import { listBucket } from "@/lib/listBucket" -import { games } from "@/db/schema" +import { responseHeaders } from "@/v2/lib/responseHeaders" +import { getConnection } from "@/v2/db/turso" +import { listBucket } from "@/v2/lib/listBucket" +import { games } from "@/v2/db/schema" import type { APIContext as Context } from "@/worker-configuration" export async function getAllGames(c: Context): Promise { diff --git a/src/routes/games/gamesRoute.ts b/src/v2/routes/games/gamesRoute.ts similarity index 100% rename from src/routes/games/gamesRoute.ts rename to src/v2/routes/games/gamesRoute.ts diff --git a/src/routes/oc-generators/getGenerator.ts b/src/v2/routes/oc-generators/getGenerator.ts similarity index 84% rename from src/routes/oc-generators/getGenerator.ts rename to src/v2/routes/oc-generators/getGenerator.ts index ac495dd..73b4039 100644 --- a/src/routes/oc-generators/getGenerator.ts +++ b/src/v2/routes/oc-generators/getGenerator.ts @@ -1,6 +1,6 @@ -import { responseHeaders } from "@/lib/responseHeaders" -import { listBucket } from "@/lib/listBucket" -import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse" +import { responseHeaders } from "@/v2/lib/responseHeaders" +import { listBucket } from "@/v2/lib/listBucket" +import { createNotFoundResponse } from "@/v2/lib/helpers/responses/notFoundResponse" import type { APIContext as Context } from "@/worker-configuration" export async function getGeneratorFromName(c: Context): Promise { diff --git a/src/routes/oc-generators/getGenerators.ts b/src/v2/routes/oc-generators/getGenerators.ts similarity index 84% rename from src/routes/oc-generators/getGenerators.ts rename to src/v2/routes/oc-generators/getGenerators.ts index e71d5c1..18f5d32 100644 --- a/src/routes/oc-generators/getGenerators.ts +++ b/src/v2/routes/oc-generators/getGenerators.ts @@ -1,5 +1,5 @@ -import { responseHeaders } from "@/lib/responseHeaders" -import { listBucket } from "@/lib/listBucket" +import { responseHeaders } from "@/v2/lib/responseHeaders" +import { listBucket } from "@/v2/lib/listBucket" import type { APIContext as Context } from "@/worker-configuration" export async function getGenerators(c: Context): Promise { @@ -10,7 +10,7 @@ export async function getGenerators(c: Context): Promise { if (response) return response // listing all files inside of oc-generators subfolder, as they can't be manually inputted - // by users but instead stored on the oc-generators repo + // by users but instead stored on the oc-generators repo which is synced with R2 bucket const files = await listBucket(c.env.bucket, { prefix: "oc-generators/", delimiter: "/", diff --git a/src/routes/oc-generators/ocGeneratorRoutes.ts b/src/v2/routes/oc-generators/ocGeneratorRoutes.ts similarity index 100% rename from src/routes/oc-generators/ocGeneratorRoutes.ts rename to src/v2/routes/oc-generators/ocGeneratorRoutes.ts diff --git a/src/routes/search/asset/assetSearch.ts b/src/v2/routes/search/asset/assetSearch.ts similarity index 93% rename from src/routes/search/asset/assetSearch.ts rename to src/v2/routes/search/asset/assetSearch.ts index 60943b0..50313fd 100644 --- a/src/routes/search/asset/assetSearch.ts +++ b/src/v2/routes/search/asset/assetSearch.ts @@ -1,7 +1,7 @@ -// import { responseHeaders } from "@/lib/responseHeaders" -// import type { Asset } from "@/lib/types/asset" -// import { getSearchResults } from "@/lib/query" -// import { getConnection } from "@/db/turso" +// import { responseHeaders } from "@/v2/lib/responseHeaders" +// import type { Asset } from "@/v2/lib/types/asset" +// import { getSearchResults } from "@/v2/lib/query" +// import { getConnection } from "@/v2/db/turso" // import type { APIContext as Context } from "@/worker-configuration" // export async function getAssetSearch(c: Context): Promise { diff --git a/src/routes/search/asset/searchRoute.ts b/src/v2/routes/search/asset/searchRoute.ts similarity index 100% rename from src/routes/search/asset/searchRoute.ts rename to src/v2/routes/search/asset/searchRoute.ts diff --git a/src/routes/user/getUserByUsername.ts b/src/v2/routes/user/getUserByUsername.ts similarity index 82% rename from src/routes/user/getUserByUsername.ts rename to src/v2/routes/user/getUserByUsername.ts index ebf6270..9d38c99 100644 --- a/src/routes/user/getUserByUsername.ts +++ b/src/v2/routes/user/getUserByUsername.ts @@ -1,8 +1,8 @@ -import { responseHeaders } from "@/lib/responseHeaders" -import { getConnection } from "@/db/turso" -import { users } from "@/db/schema" +import { responseHeaders } from "@/v2/lib/responseHeaders" +import { getConnection } from "@/v2/db/turso" +import { users } from "@/v2/db/schema" import { eq } from "drizzle-orm" -import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse" +import { createNotFoundResponse } from "@/v2/lib/helpers/responses/notFoundResponse" import type { APIContext as Context } from "@/worker-configuration" export async function getUserByUsername(c: Context): Promise { diff --git a/src/routes/user/getUsersBySearch.ts b/src/v2/routes/user/getUsersBySearch.ts similarity index 81% rename from src/routes/user/getUsersBySearch.ts rename to src/v2/routes/user/getUsersBySearch.ts index 7ba66e5..482b865 100644 --- a/src/routes/user/getUsersBySearch.ts +++ b/src/v2/routes/user/getUsersBySearch.ts @@ -1,8 +1,8 @@ -import { responseHeaders } from "@/lib/responseHeaders" -import { createNotFoundResponse } from "@/lib/helpers/responses/notFoundResponse" +import { responseHeaders } from "@/v2/lib/responseHeaders" +import { createNotFoundResponse } from "@/v2/lib/helpers/responses/notFoundResponse" import { like } from "drizzle-orm" -import { getConnection } from "@/db/turso" -import { users } from "@/db/schema" +import { getConnection } from "@/v2/db/turso" +import { users } from "@/v2/db/schema" import type { APIContext as Context } from "@/worker-configuration" export async function getUsersBySearch(c: Context): Promise { diff --git a/src/routes/user/userRoute.ts b/src/v2/routes/user/userRoute.ts similarity index 100% rename from src/routes/user/userRoute.ts rename to src/v2/routes/user/userRoute.ts From 045c34630c8f3185bf4acbaee46e2f64e2c4c2ae Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Fri, 1 Sep 2023 02:13:04 +0100 Subject: [PATCH 061/318] del saved oc gen res, better session invalidation --- .husky/pre-commit | 4 ++ package.json | 1 + pnpm-lock.yaml | 14 ++++- src/v2/routes/auth/authRoute.ts | 5 ++ .../deleteOCGeneratorResponse.ts | 60 +++++++++++++++++++ .../oc-generators/saveOCGeneratorResponse.ts | 9 ++- .../oc-generators/viewOCGeneratorResponses.ts | 9 ++- .../user-attributes/updateUserAttributes.ts | 7 ++- 8 files changed, 104 insertions(+), 5 deletions(-) create mode 100644 .husky/pre-commit create mode 100644 src/v2/routes/auth/oc-generators/deleteOCGeneratorResponse.ts diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 0000000..06458ce --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +pnpm run typecheck && pnpm run lint && pnpm run prettier:check diff --git a/package.json b/package.json index f8bd149..63e165c 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "eslint": "^8.48.0", "eslint-config-google": "^0.14.0", "eslint-plugin-json": "^3.1.0", + "husky": "^8.0.3", "tsx": "^3.12.7", "typescript": "^5.2.2", "wrangler": "3.6.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 233e3cd..8f2667c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: "6.1" +lockfileVersion: "6.0" settings: autoInstallPeers: true @@ -55,6 +55,9 @@ devDependencies: eslint-plugin-json: specifier: ^3.1.0 version: 3.1.0 + husky: + specifier: ^8.0.3 + version: 8.0.3 tsx: specifier: ^3.12.7 version: 3.12.7 @@ -2425,6 +2428,15 @@ packages: } dev: true + /husky@8.0.3: + resolution: + { + integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==, + } + engines: { node: ">=14" } + hasBin: true + dev: true + /iconv-lite@0.6.3: resolution: { diff --git a/src/v2/routes/auth/authRoute.ts b/src/v2/routes/auth/authRoute.ts index 8de9d3d..0e07c1b 100644 --- a/src/v2/routes/auth/authRoute.ts +++ b/src/v2/routes/auth/authRoute.ts @@ -11,6 +11,7 @@ import { updateUserAttributes } from "./user-attributes/updateUserAttributes" import { uploadAsset } from "./user-attributes/self-upload/uploadAsset" import { Bindings } from "@/worker-configuration" import { viewOCGeneratorResponses } from "./oc-generators/viewOCGeneratorResponses" +import { deleteOCGeneratorResponse } from "./oc-generators/deleteOCGeneratorResponse" const authRoute = new Hono<{ Bindings: Bindings }>() @@ -54,6 +55,10 @@ authRoute.get("/oc-generator/view/all", async (c) => { return viewOCGeneratorResponses(c) }) +authRoute.post("/oc-generator/delete", async (c) => { + return deleteOCGeneratorResponse(c) +}) + authRoute.get("/validate", async (c) => { return validate(c) }) diff --git a/src/v2/routes/auth/oc-generators/deleteOCGeneratorResponse.ts b/src/v2/routes/auth/oc-generators/deleteOCGeneratorResponse.ts new file mode 100644 index 0000000..ac1e1af --- /dev/null +++ b/src/v2/routes/auth/oc-generators/deleteOCGeneratorResponse.ts @@ -0,0 +1,60 @@ +import { auth } from "@/v2/lib/auth/lucia" +import type { APIContext as Context } from "@/worker-configuration" +import { savedOcGenerators } from "@/v2/db/schema" +import { getConnection } from "@/v2/db/turso" +import { eq, and } from "drizzle-orm" + +export async function deleteOCGeneratorResponse(c: Context): Promise { + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() + + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + return c.json({ success: false, state: "invalid session" }, 200) + } + + const drizzle = await getConnection(c.env).drizzle + + const formData = await c.req.formData() + const deleteID = (formData.get("deleteID") as string) || null + + if (!formData || !deleteID) + return c.json({ success: false, state: "no formdata provided" }) + + const ocGeneratorResponse = await drizzle + .select() + .from(savedOcGenerators) + .where( + and( + eq(savedOcGenerators.id, deleteID), + eq(savedOcGenerators.userId, session.userId) + ) + ) + + if (!ocGeneratorResponse) + return c.json({ + success: false, + state: "no generator found matching id", + }) + + await drizzle + .delete(savedOcGenerators) + .where( + and( + eq(savedOcGenerators.id, deleteID), + eq(savedOcGenerators.userId, session.userId) + ) + ) + + return c.json( + { + success: true, + state: `deleted saved oc generator with id ${deleteID}`, + ocGeneratorResponse, + }, + 200 + ) +} diff --git a/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts b/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts index 2224539..e9aeea4 100644 --- a/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts +++ b/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts @@ -5,9 +5,16 @@ import { getConnection } from "@/v2/db/turso" export async function saveOCGeneratorResponse(c: Context): Promise { const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + return c.json({ success: false, state: "invalid session" }, 200) + } + const drizzle = await getConnection(c.env).drizzle const formData = await c.req.formData() diff --git a/src/v2/routes/auth/oc-generators/viewOCGeneratorResponses.ts b/src/v2/routes/auth/oc-generators/viewOCGeneratorResponses.ts index 8b82feb..2f7a3c2 100644 --- a/src/v2/routes/auth/oc-generators/viewOCGeneratorResponses.ts +++ b/src/v2/routes/auth/oc-generators/viewOCGeneratorResponses.ts @@ -6,9 +6,16 @@ import { eq } from "drizzle-orm" export async function viewOCGeneratorResponses(c: Context): Promise { const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + return c.json({ success: false, state: "invalid session" }, 200) + } + const drizzle = await getConnection(c.env).drizzle const ocGeneratorResponses = await drizzle diff --git a/src/v2/routes/auth/user-attributes/updateUserAttributes.ts b/src/v2/routes/auth/user-attributes/updateUserAttributes.ts index c6d752a..6792ccf 100644 --- a/src/v2/routes/auth/user-attributes/updateUserAttributes.ts +++ b/src/v2/routes/auth/user-attributes/updateUserAttributes.ts @@ -5,8 +5,11 @@ export async function updateUserAttributes(c: Context): Promise { const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() - if (!session) { - authRequest.setSession(null) + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } return c.json({ success: false, state: "invalid session" }, 200) } From e2154f281830dd48c97a340880336ee9a27cf098 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Fri, 1 Sep 2023 22:25:40 +0100 Subject: [PATCH 062/318] i hate writing schemas --- pnpm-lock.yaml | 2 +- src/v2/db/drizzle.ts | 1 + src/v2/db/schema.ts | 66 +++++++++++++++++++++++++------------------- 3 files changed, 40 insertions(+), 29 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8f2667c..2550fb1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: "6.0" +lockfileVersion: "6.1" settings: autoInstallPeers: true diff --git a/src/v2/db/drizzle.ts b/src/v2/db/drizzle.ts index 5910fe7..3878d58 100644 --- a/src/v2/db/drizzle.ts +++ b/src/v2/db/drizzle.ts @@ -8,6 +8,7 @@ export const tableNames = { following: "following", gameAssetCategories: "gameAssetCategories", games: "games", + assetTags: "assetTags", emailVerificationToken: "emailVerificationToken", passwordResetToken: "passwordResetToken", assetCategories: "assetCategories", diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index ccc63f4..308f117 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -92,6 +92,7 @@ export const games = sqliteTable( { id: text("id").primaryKey(), name: text("name").notNull(), + formattedName: text("formatted_name").notNull(), assetCount: integer("asset_count").default(0).notNull(), lastUpdated: integer("last_updated").notNull(), }, @@ -122,32 +123,19 @@ export const assetCategories = sqliteTable( } ) -export const gameAssetCategories = sqliteTable( - tableNames.gameAssetCategories, +export const assetTags = sqliteTable( + tableNames.assetTags, { id: text("id").primaryKey(), - gameId: text("game_id") - .notNull() - .references(() => games.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - assetCategoryId: text("asset_category_id") - .notNull() - .references(() => assetCategories.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), + name: text("name").notNull(), + formattedName: text("formatted_name").notNull(), + assetCount: integer("asset_count").default(0).notNull(), + lastUpdated: integer("last_updated").notNull(), }, - (gameAssetCategory) => { + (assetTag) => { return { - gameAssetCategoryIdx: uniqueIndex("game_asset_category_idx").on( - gameAssetCategory.id - ), - gameIdx: uniqueIndex("game_idx").on(gameAssetCategory.gameId), - assetCategoryIdx: uniqueIndex("asset_category_idx").on( - gameAssetCategory.assetCategoryId - ), + assetTagIdx: uniqueIndex("asset_tag_idx").on(assetTag.id), + nameIdx: uniqueIndex("name_idx").on(assetTag.name), } } ) @@ -169,6 +157,7 @@ export const assets = sqliteTable( onUpdate: "cascade", onDelete: "cascade", }), + // tags can be more than one tag, where we reference the name of the tag tags: text("tags").notNull(), url: text("url").notNull(), status: text("status").notNull(), @@ -176,6 +165,13 @@ export const assets = sqliteTable( onUpdate: "cascade", onDelete: "cascade", }), + uploadedByName: text("uploaded_by_name").references( + () => users.username, + { + onUpdate: "cascade", + onDelete: "cascade", + } + ), uploadedDate: integer("uploaded_date").notNull(), viewCount: integer("view_count").default(0).notNull(), downloadCount: integer("download_count").default(0).notNull(), @@ -261,6 +257,7 @@ export const collections = sqliteTable( onUpdate: "cascade", onDelete: "cascade", }), + isPublic: integer("is_public").default(0).notNull(), }, (collection) => { return { @@ -311,7 +308,7 @@ export const savedOcGenerators = sqliteTable( name: text("name").notNull(), game: text("game").notNull(), isPublic: integer("is_public").default(0).notNull(), - content: text("content").notNull(), // this is stored as json + content: text("content").notNull(), // this is stored as json, which is then parsed on the frontend }, (savedOcGenerators) => { return { @@ -328,20 +325,33 @@ export const savedOcGenerators = sqliteTable( // relations export const gameRelations = relations(games, ({ many }) => ({ - assetCategories: many(gameAssetCategories), + assets: many(assets), })) export const assetCategoryRelations = relations( assetCategories, ({ many }) => ({ - games: many(gameAssetCategories), + assets: many(assets), }) ) -export const assetRelations = relations(assets, ({ one }) => ({ +export const collectionRelations = relations(collections, ({ many }) => ({ + assets: many(assets), +})) + +export const assetRelations = relations(assets, ({ one, many }) => ({ uploadedBy: one(users, { - fields: [assets.uploadedById], - references: [users.id], + fields: [assets.uploadedById, assets.uploadedByName], + references: [users.id, users.username], + }), + assetCategory: one(assetCategories, { + fields: [assets.assetCategory], + references: [assetCategories.name], + }), + tags: many(assetTags), + game: one(games, { + fields: [assets.game], + references: [games.name], }), })) From ee10594e61d09ab75385834e839deb5b910e17c9 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Fri, 1 Sep 2023 23:13:34 +0100 Subject: [PATCH 063/318] questionable `/search/all` endpoint, update routes --- src/index.ts | 6 +- src/v2/lib/resend/email.ts | 2 +- src/v2/lib/types/discord.ts | 1 + src/v2/routes/asset/getAssetFromId.ts | 8 +- src/v2/routes/search/all/searchAll.ts | 111 ++++++++++++++++++ src/v2/routes/search/searchRoute.ts | 31 +++++ .../{ => search}/user/getUserByUsername.ts | 18 ++- .../{ => search}/user/getUsersBySearch.ts | 3 +- src/v2/routes/user/userRoute.ts | 16 --- 9 files changed, 158 insertions(+), 38 deletions(-) create mode 100644 src/v2/routes/search/all/searchAll.ts create mode 100644 src/v2/routes/search/searchRoute.ts rename src/v2/routes/{ => search}/user/getUserByUsername.ts (73%) rename src/v2/routes/{ => search}/user/getUsersBySearch.ts (94%) delete mode 100644 src/v2/routes/user/userRoute.ts diff --git a/src/index.ts b/src/index.ts index f1b3bc6..851178d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,10 +2,9 @@ import { Hono } from "hono" import assetRoute from "./v2/routes/asset/assetRoute" import discordRoute from "./v2/routes/discord/discordRoute" import ocGeneratorRoute from "./v2/routes/oc-generators/ocGeneratorRoutes" -// import assetSearchRoute from "./routes/search/asset/searchRoute"; import gamesRoute from "./v2/routes/games/gamesRoute" -import userRoute from "./v2/routes/user/userRoute" import authRoute from "./v2/routes/auth/authRoute" +import searchRoute from "./v2/routes/search/searchRoute" import { getRuntimeKey } from "hono/adapter" import { Bindings } from "@/worker-configuration" @@ -25,9 +24,8 @@ app.get("/", (c) => { app.route("/v2/asset", assetRoute) app.route("/v2/discord", discordRoute) app.route("/v2/oc-generators", ocGeneratorRoute) -// app.route("/search/assets", assetSearchRoute); +app.route("/v2/search", searchRoute) app.route("/v2/games", gamesRoute) -app.route("/v2/user", userRoute) app.route("/v2/auth", authRoute) app.all("*", (c) => { c.status(404) diff --git a/src/v2/lib/resend/email.ts b/src/v2/lib/resend/email.ts index 4a1d315..9897690 100644 --- a/src/v2/lib/resend/email.ts +++ b/src/v2/lib/resend/email.ts @@ -1,7 +1,7 @@ import { Resend } from "resend" // TODO: use react email w/ tailwind -export const resend = new Resend("") +const resend = new Resend("") export const sendPasswordResetEmail = async ( email: string, diff --git a/src/v2/lib/types/discord.ts b/src/v2/lib/types/discord.ts index 470e292..e8b7f6b 100644 --- a/src/v2/lib/types/discord.ts +++ b/src/v2/lib/types/discord.ts @@ -1,3 +1,4 @@ +// types used for the /contributor endpoint export interface Contributor { id: string username: string diff --git a/src/v2/routes/asset/getAssetFromId.ts b/src/v2/routes/asset/getAssetFromId.ts index a111f09..4a6c428 100644 --- a/src/v2/routes/asset/getAssetFromId.ts +++ b/src/v2/routes/asset/getAssetFromId.ts @@ -15,11 +15,9 @@ export async function getAssetFromId(c: Context): Promise { const drizzle = await getConnection(c.env).drizzle - const asset = await drizzle - .select() - .from(assets) - .where(eq(assets.id, parseInt(id))) - .execute() + const asset = await drizzle.query.assets.findFirst({ + where: (assets, { eq }) => eq(assets.id, parseInt(id)), + }) if (!asset) { response = createNotFoundResponse(c, "Asset not found", responseHeaders) diff --git a/src/v2/routes/search/all/searchAll.ts b/src/v2/routes/search/all/searchAll.ts new file mode 100644 index 0000000..89efb1a --- /dev/null +++ b/src/v2/routes/search/all/searchAll.ts @@ -0,0 +1,111 @@ +import { responseHeaders } from "@/v2/lib/responseHeaders" +import { getConnection } from "@/v2/db/turso" +import type { APIContext as Context } from "@/worker-configuration" +import { like, and, eq, not, or } from "drizzle-orm" +import { auth } from "@/v2/lib/auth/lucia" +import { + users, + assets, + games, + assetCategories, + assetTags, + savedOcGenerators, + collections, +} from "@/v2/db/schema" + +export async function searchAll(c: Context): Promise { + const { query } = c.req.param() + const cacheKey = new Request(c.req.url.toString(), c.req) + const cache = caches.default + let response = await cache.match(cacheKey) + + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() + + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + } + + if (response) return response + const drizzle = await getConnection(c.env).drizzle + + // https://cdn.discordapp.com/attachments/1102306276832202813/1147291827699986572/F.gif + const usersResponse = await drizzle + .select() + .from(users) + .where(like(users.username, `%${query}%`)) + .execute() + const assetsResponse = await drizzle + .select() + .from(assets) + .where(like(assets.name, `%${query}%`)) + .execute() + const assetCategoryResponse = await drizzle + .select() + .from(assetCategories) + .where(like(assetCategories.name, `%${query}%`)) + .execute() + const assetTagsResponse = await drizzle + .select() + .from(assetTags) + .where(like(assetTags.name, `%${query}%`)) + .execute() + const gamesResponse = await drizzle + .select() + .from(games) + .where(like(games.name, `%${query}%`)) + .execute() + const savedOcGeneratorsResponse = await drizzle + .select() + .from(savedOcGenerators) + .where( + and( + or( + eq(savedOcGenerators.userId, session.userId), + not(eq(savedOcGenerators.isPublic, 0)) + ), + like(savedOcGenerators.name, `%${query}%`) + ) + ) + .execute() + const collectionsResponse = await drizzle + .select() + .from(collections) + .where( + and( + or( + eq(collections.userId, session.userId), + not(eq(collections.isPublic, 0)) + ), + like(collections.name, `%${query}%`) + ) + ) + .execute() + + response = c.json( + { + success: true, + status: "ok", + query, + isAuthed: session.userId ? true : false, + results: { + usersResponse, + assetsResponse, + assetCategoryResponse, + assetTagsResponse, + savedOcGeneratorsResponse, + gamesResponse, + collectionsResponse, + }, + }, + 200, + responseHeaders + ) + + response.headers.set("Cache-Control", "s-maxage=60") + await cache.put(cacheKey, response.clone()) + return response +} diff --git a/src/v2/routes/search/searchRoute.ts b/src/v2/routes/search/searchRoute.ts new file mode 100644 index 0000000..2401625 --- /dev/null +++ b/src/v2/routes/search/searchRoute.ts @@ -0,0 +1,31 @@ +import { Hono } from "hono" +import { searchAll } from "./all/searchAll" +import { Bindings } from "@/worker-configuration" +import { getUserByUsername } from "./user/getUserByUsername" +import { getUsersBySearch } from "./user/getUsersBySearch" +import authRoute from "../auth/authRoute" +import { cors } from "hono/cors" + +const searchRoute = new Hono<{ Bindings: Bindings }>() + +searchRoute.get("/all", async (c) => { + return searchAll(c) +}) + +authRoute.use( + "/all", + cors({ + credentials: true, + origin: ["https://next.wanderer.moe"], + }) +) + +searchRoute.get("/users/user/:username", async (c) => { + return getUserByUsername(c) +}) + +searchRoute.get("/users/query/:query", async (c) => { + return getUsersBySearch(c) +}) + +export default searchRoute diff --git a/src/v2/routes/user/getUserByUsername.ts b/src/v2/routes/search/user/getUserByUsername.ts similarity index 73% rename from src/v2/routes/user/getUserByUsername.ts rename to src/v2/routes/search/user/getUserByUsername.ts index 9d38c99..0c17473 100644 --- a/src/v2/routes/user/getUserByUsername.ts +++ b/src/v2/routes/search/user/getUserByUsername.ts @@ -1,7 +1,5 @@ import { responseHeaders } from "@/v2/lib/responseHeaders" import { getConnection } from "@/v2/db/turso" -import { users } from "@/v2/db/schema" -import { eq } from "drizzle-orm" import { createNotFoundResponse } from "@/v2/lib/helpers/responses/notFoundResponse" import type { APIContext as Context } from "@/worker-configuration" @@ -15,19 +13,19 @@ export async function getUserByUsername(c: Context): Promise { const drizzle = await getConnection(c.env).drizzle - const user = await drizzle - .select() - .from(users) - .where(eq(users.username, username)) - .execute() + const user = await drizzle.query.users.findFirst({ + where: (users, { eq }) => eq(user.username, username), + }) if (!user) { - return createNotFoundResponse(c, "User not found", responseHeaders) + response = createNotFoundResponse(c, "User not found", responseHeaders) + await cache.put(cacheKey, response.clone()) + return response } // removing email-related fields - user[0].email = undefined - user[0].emailVerified = undefined + user.email = undefined + user.emailVerified = undefined response = c.json( { diff --git a/src/v2/routes/user/getUsersBySearch.ts b/src/v2/routes/search/user/getUsersBySearch.ts similarity index 94% rename from src/v2/routes/user/getUsersBySearch.ts rename to src/v2/routes/search/user/getUsersBySearch.ts index 482b865..41a901b 100644 --- a/src/v2/routes/user/getUsersBySearch.ts +++ b/src/v2/routes/search/user/getUsersBySearch.ts @@ -12,8 +12,7 @@ export async function getUsersBySearch(c: Context): Promise { if (response) return response const { query } = c.req.param() - const conn = await getConnection(c.env) - const { drizzle } = conn + const drizzle = await getConnection(c.env).drizzle const userList = await drizzle .select() diff --git a/src/v2/routes/user/userRoute.ts b/src/v2/routes/user/userRoute.ts deleted file mode 100644 index 51488b6..0000000 --- a/src/v2/routes/user/userRoute.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Hono } from "hono" -import { getUsersBySearch } from "./getUsersBySearch" -import { getUserByUsername } from "./getUserByUsername" -import { Bindings } from "@/worker-configuration" - -const userRoute = new Hono<{ Bindings: Bindings }>() - -userRoute.get("/u/:username", async (c) => { - return getUserByUsername(c) -}) - -userRoute.get("/s/:query", async (c) => { - return getUsersBySearch(c) -}) - -export default userRoute From d46f7428b7c738a7921f4fe03a2921088d573e81 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Fri, 1 Sep 2023 23:34:10 +0100 Subject: [PATCH 064/318] upd prettier, asset modify & approve --- .eslintrc.json | 34 +- .prettierrc | 15 +- drizzle.config.ts | 12 +- package.json | 74 +-- renovate.json | 4 +- src/index.ts | 18 +- src/lucia.d.ts | 40 +- src/v2/db/drizzle.ts | 38 +- src/v2/db/schema.ts | 626 +++++++++--------- src/v2/db/turso.ts | 24 +- src/v2/lib/auth/lucia.ts | 88 +-- src/v2/lib/auth/roleFlags.ts | 44 +- src/v2/lib/discord.ts | 16 +- src/v2/lib/helpers/rename.ts | 2 +- .../lib/helpers/responses/notFoundResponse.ts | 18 +- src/v2/lib/listBucket.ts | 2 +- src/v2/lib/resend/email.ts | 96 +-- src/v2/lib/responseHeaders.ts | 6 +- src/v2/lib/types/discord.ts | 24 +- src/v2/routes/asset/assetRoute.ts | 4 +- src/v2/routes/asset/downloadAsset.ts | 44 +- src/v2/routes/asset/getAssetFromId.ts | 84 +-- src/v2/routes/auth/assets/approveAsset.ts | 58 ++ src/v2/routes/auth/assets/modifyAsset.ts | 79 +++ src/v2/routes/auth/assets/uploadAsset.ts | 110 +++ src/v2/routes/auth/authRoute.ts | 44 +- src/v2/routes/auth/login.ts | 120 ++-- src/v2/routes/auth/logout.ts | 20 +- .../deleteOCGeneratorResponse.ts | 104 +-- .../oc-generators/saveOCGeneratorResponse.ts | 44 +- .../oc-generators/viewOCGeneratorResponses.ts | 36 +- src/v2/routes/auth/signup.ts | 142 ++-- .../self-upload/uploadAsset.ts | 114 ---- .../self-upload/uploadAvatar.ts | 58 +- .../self-upload/uploadBanner.ts | 64 +- .../user-attributes/updateUserAttributes.ts | 54 +- src/v2/routes/auth/validate.ts | 46 +- src/v2/routes/discord/contributors.ts | 102 +-- src/v2/routes/discord/discordRoute.ts | 2 +- src/v2/routes/games/allGames.ts | 94 +-- src/v2/routes/games/gamesRoute.ts | 2 +- src/v2/routes/oc-generators/getGenerator.ts | 50 +- src/v2/routes/oc-generators/getGenerators.ts | 74 +-- .../routes/oc-generators/ocGeneratorRoutes.ts | 4 +- src/v2/routes/search/all/searchAll.ts | 190 +++--- src/v2/routes/search/searchRoute.ts | 16 +- .../routes/search/user/getUserByUsername.ts | 74 +-- src/v2/routes/search/user/getUsersBySearch.ts | 54 +- src/worker-configuration.d.ts | 12 +- tsconfig.json | 26 +- 50 files changed, 1625 insertions(+), 1481 deletions(-) create mode 100644 src/v2/routes/auth/assets/approveAsset.ts create mode 100644 src/v2/routes/auth/assets/modifyAsset.ts create mode 100644 src/v2/routes/auth/assets/uploadAsset.ts delete mode 100644 src/v2/routes/auth/user-attributes/self-upload/uploadAsset.ts diff --git a/.eslintrc.json b/.eslintrc.json index 6d37209..77ceedb 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,19 +1,19 @@ { - "root": true, - "extends": ["plugin:@typescript-eslint/recommended"], - "parser": "@typescript-eslint/parser", - "plugins": ["json"], - "rules": { - "no-const-assign": "error", - "camelcase": "off", - "no-extra-semi": "error" - }, - "parserOptions": { - "allowImportExportEverywhere": true, - "ecmaVersion": 2020, - "ecmaFeatures": { - "impliedStrict": true - }, - "sourceType": "module" - } + "root": true, + "extends": ["plugin:@typescript-eslint/recommended"], + "parser": "@typescript-eslint/parser", + "plugins": ["json"], + "rules": { + "no-const-assign": "error", + "camelcase": "off", + "no-extra-semi": "error" + }, + "parserOptions": { + "allowImportExportEverywhere": true, + "ecmaVersion": 2020, + "ecmaFeatures": { + "impliedStrict": true + }, + "sourceType": "module" + } } diff --git a/.prettierrc b/.prettierrc index c29022a..0b03816 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,9 +1,10 @@ { - "bracketSameLine": true, - "singleQuote": false, - "trailingComma": "es5", - "endOfLine": "lf", - "tabWidth": 4, - "semi": false, - "plugins": [] + "bracketSameLine": true, + "singleQuote": false, + "trailingComma": "es5", + "endOfLine": "lf", + "tabWidth": 4, + "semi": false, + "useTabs": true, + "plugins": [] } diff --git a/drizzle.config.ts b/drizzle.config.ts index 22ca621..d72f373 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -1,10 +1,10 @@ import type { Config } from "drizzle-kit" export default { - out: "./src/db/migrations", - schema: "./src/db/schema.ts", - driver: "turso", - breakpoints: true, - strict: true, - verbose: true, + out: "./src/db/migrations", + schema: "./src/db/schema.ts", + driver: "turso", + breakpoints: true, + strict: true, + verbose: true, } satisfies Config diff --git a/package.json b/package.json index 63e165c..337bd33 100644 --- a/package.json +++ b/package.json @@ -1,39 +1,39 @@ { - "name": "wanderer-moe-api", - "version": "1.0.1b", - "scripts": { - "prettier:fmt": "prettier --write .", - "dev": "wrangler dev --remote", - "publish": "wrangler publish --minify", - "lint": "eslint . --ext .ts", - "prettier:check": "prettier --check .", - "typecheck": "tsc --noEmit", - "drizzle:generate": "drizzle-kit generate:sqlite", - "drizzle:push": "drizzle-kit push:sqlite" - }, - "devDependencies": { - "@cloudflare/workers-types": "^4.20230821.0", - "@types/node": "^20.5.7", - "dotenv": "^16.3.1", - "drizzle-kit": "^0.19.13", - "eslint": "^8.48.0", - "eslint-config-google": "^0.14.0", - "eslint-plugin-json": "^3.1.0", - "husky": "^8.0.3", - "tsx": "^3.12.7", - "typescript": "^5.2.2", - "wrangler": "3.6.0" - }, - "private": true, - "dependencies": { - "@libsql/client": "^0.3.2", - "@lucia-auth/adapter-sqlite": "^2.0.0", - "@typescript-eslint/eslint-plugin": "^6.5.0", - "drizzle-orm": "^0.28.5", - "hono": "^3.5.6", - "lucia": "^2.4.0", - "mysql2": "^3.6.0", - "prettier": "^3.0.3", - "resend": "^1.0.0" - } + "name": "wanderer-moe-api", + "version": "1.0.1b", + "scripts": { + "prettier:fmt": "prettier --write .", + "dev": "wrangler dev --remote", + "publish": "wrangler publish --minify", + "lint": "eslint . --ext .ts", + "prettier:check": "prettier --check .", + "typecheck": "tsc --noEmit", + "drizzle:generate": "drizzle-kit generate:sqlite", + "drizzle:push": "drizzle-kit push:sqlite" + }, + "devDependencies": { + "@cloudflare/workers-types": "^4.20230821.0", + "@types/node": "^20.5.7", + "dotenv": "^16.3.1", + "drizzle-kit": "^0.19.13", + "eslint": "^8.48.0", + "eslint-config-google": "^0.14.0", + "eslint-plugin-json": "^3.1.0", + "husky": "^8.0.3", + "tsx": "^3.12.7", + "typescript": "^5.2.2", + "wrangler": "3.6.0" + }, + "private": true, + "dependencies": { + "@libsql/client": "^0.3.2", + "@lucia-auth/adapter-sqlite": "^2.0.0", + "@typescript-eslint/eslint-plugin": "^6.5.0", + "drizzle-orm": "^0.28.5", + "hono": "^3.5.6", + "lucia": "^2.4.0", + "mysql2": "^3.6.0", + "prettier": "^3.0.3", + "resend": "^1.0.0" + } } diff --git a/renovate.json b/renovate.json index 5d39e8b..7ec37f6 100644 --- a/renovate.json +++ b/renovate.json @@ -1,4 +1,4 @@ { - "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": ["config:base"] + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": ["config:base"] } diff --git a/src/index.ts b/src/index.ts index 851178d..2068759 100644 --- a/src/index.ts +++ b/src/index.ts @@ -11,15 +11,15 @@ import { Bindings } from "@/worker-configuration" const app = new Hono<{ Bindings: Bindings }>() app.get("/status", (c) => { - c.status(200) - return c.json({ - status: "ok", - runtime: getRuntimeKey(), - }) + c.status(200) + return c.json({ + status: "ok", + runtime: getRuntimeKey(), + }) }) app.get("/", (c) => { - c.status(200) - return c.json({ success: "true", status: "ok", routes: app.routes }) + c.status(200) + return c.json({ success: "true", status: "ok", routes: app.routes }) }) app.route("/v2/asset", assetRoute) app.route("/v2/discord", discordRoute) @@ -28,8 +28,8 @@ app.route("/v2/search", searchRoute) app.route("/v2/games", gamesRoute) app.route("/v2/auth", authRoute) app.all("*", (c) => { - c.status(404) - return c.json({ status: "not found" }) + c.status(404) + return c.json({ status: "not found" }) }) // https://hono.dev/api/hono#showroutes diff --git a/src/lucia.d.ts b/src/lucia.d.ts index 409e1c1..5e3d8e7 100644 --- a/src/lucia.d.ts +++ b/src/lucia.d.ts @@ -1,23 +1,23 @@ /// declare namespace Lucia { - type Auth = import("./v2/lib/auth/lucia").Auth - type DatabaseUserAttributes = { - username: string - username_colour: string | null - avatar_url: string | null - banner_url: string | null - email: string - email_verified: number - pronouns: string | null - is_contributor: number - verified: number - bio: string | null - role_flags: number - self_assignable_role_flags: number | null - date_joined: number - } - type DatabaseSessionAttributes = { - country_code: string - user_agent: string - } + type Auth = import("./v2/lib/auth/lucia").Auth + type DatabaseUserAttributes = { + username: string + username_colour: string | null + avatar_url: string | null + banner_url: string | null + email: string + email_verified: number + pronouns: string | null + is_contributor: number + verified: number + bio: string | null + role_flags: number + self_assignable_role_flags: number | null + date_joined: number + } + type DatabaseSessionAttributes = { + country_code: string + user_agent: string + } } diff --git a/src/v2/db/drizzle.ts b/src/v2/db/drizzle.ts index 3878d58..7c78ecf 100644 --- a/src/v2/db/drizzle.ts +++ b/src/v2/db/drizzle.ts @@ -1,23 +1,23 @@ export const tableNames = { - assets: "assets", - authKey: "authKey", - authSession: "authSession", - authUser: "authUser", - emailVerificationTokens: "emailVerificationToken", - follower: "follower", - following: "following", - gameAssetCategories: "gameAssetCategories", - games: "games", - assetTags: "assetTags", - emailVerificationToken: "emailVerificationToken", - passwordResetToken: "passwordResetToken", - assetCategories: "assetCategories", - passwordResetTokens: "passwordResetToken", - savedOcGenerators: "savedOcGenerators", - savedAssets: "savedAssets", - assetCollection: "assetCollection", - assetCollectionAsset: "assetCollectionAsset", - socialsConnection: "socialsConnection", + assets: "assets", + authKey: "authKey", + authSession: "authSession", + authUser: "authUser", + emailVerificationTokens: "emailVerificationToken", + follower: "follower", + following: "following", + gameAssetCategories: "gameAssetCategories", + games: "games", + assetTags: "assetTags", + emailVerificationToken: "emailVerificationToken", + passwordResetToken: "passwordResetToken", + assetCategories: "assetCategories", + passwordResetTokens: "passwordResetToken", + savedOcGenerators: "savedOcGenerators", + savedAssets: "savedAssets", + assetCollection: "assetCollection", + assetCollectionAsset: "assetCollectionAsset", + socialsConnection: "socialsConnection", } export * as schema from "@/v2/db/schema" diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index 308f117..5e72b23 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -1,380 +1,380 @@ import { tableNames } from "@/v2/db/drizzle" import { relations } from "drizzle-orm" import { - sqliteTable, - text, - integer, - uniqueIndex, + sqliteTable, + text, + integer, + uniqueIndex, } from "drizzle-orm/sqlite-core" // users, games, categories, assets etc, i will clean this up later, sorry for anyone looking at this export const users = sqliteTable( - tableNames.authUser, - { - id: text("id").primaryKey(), - avatarUrl: text("avatar_url"), - bannerUrl: text("banner_url"), - username: text("username").notNull(), - usernameColour: text("username_colour"), - email: text("email").notNull(), - emailVerified: integer("email_verified").default(0).notNull(), - pronouns: text("pronouns"), - verified: integer("verified").default(0).notNull(), - bio: text("bio").default("No bio set").notNull(), - dateJoined: integer("date_joined").notNull(), - roleFlags: integer("role_flags").default(1).notNull(), - isContributor: integer("is_contributor").default(0).notNull(), - selfAssignableRoleFlags: integer("self_assignable_role_flags"), - }, - (user) => { - return { - userIdx: uniqueIndex("user_idx").on(user.id), - usernameIdx: uniqueIndex("username_idx").on(user.username), - emailIdx: uniqueIndex("email_idx").on(user.email), - } - } + tableNames.authUser, + { + id: text("id").primaryKey(), + avatarUrl: text("avatar_url"), + bannerUrl: text("banner_url"), + username: text("username").notNull(), + usernameColour: text("username_colour"), + email: text("email").notNull(), + emailVerified: integer("email_verified").default(0).notNull(), + pronouns: text("pronouns"), + verified: integer("verified").default(0).notNull(), + bio: text("bio").default("No bio set").notNull(), + dateJoined: integer("date_joined").notNull(), + roleFlags: integer("role_flags").default(1).notNull(), + isContributor: integer("is_contributor").default(0).notNull(), + selfAssignableRoleFlags: integer("self_assignable_role_flags"), + }, + (user) => { + return { + userIdx: uniqueIndex("user_idx").on(user.id), + usernameIdx: uniqueIndex("username_idx").on(user.username), + emailIdx: uniqueIndex("email_idx").on(user.email), + } + } ) export const sessions = sqliteTable( - tableNames.authSession, - { - id: text("id").primaryKey(), - userId: text("user_id") - .notNull() - .references(() => users.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - activeExpires: integer("active_expires").notNull(), - idleExpires: integer("idle_expires").notNull(), - userAgent: text("user_agent").notNull(), - countryCode: text("country_code").notNull(), - }, - (session) => { - return { - userIdx: uniqueIndex("session_user_idx").on(session.userId), - } - } + tableNames.authSession, + { + id: text("id").primaryKey(), + userId: text("user_id") + .notNull() + .references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + activeExpires: integer("active_expires").notNull(), + idleExpires: integer("idle_expires").notNull(), + userAgent: text("user_agent").notNull(), + countryCode: text("country_code").notNull(), + }, + (session) => { + return { + userIdx: uniqueIndex("session_user_idx").on(session.userId), + } + } ) export const keys = sqliteTable( - tableNames.authKey, - { - id: text("id").primaryKey(), - userId: text("user_id") - .notNull() - .references(() => users.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - hashedPassword: text("hashed_password"), - }, - (key) => { - return { - userIdx: uniqueIndex("keys_user_idx").on(key.userId), - } - } + tableNames.authKey, + { + id: text("id").primaryKey(), + userId: text("user_id") + .notNull() + .references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + hashedPassword: text("hashed_password"), + }, + (key) => { + return { + userIdx: uniqueIndex("keys_user_idx").on(key.userId), + } + } ) export const socialsConnection = sqliteTable(tableNames.socialsConnection, { - id: text("id").primaryKey(), - userId: text("user_id") - .notNull() - .references(() => users.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - discordId: text("discord_id"), + id: text("id").primaryKey(), + userId: text("user_id") + .notNull() + .references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + discordId: text("discord_id"), }) export const games = sqliteTable( - tableNames.games, - { - id: text("id").primaryKey(), - name: text("name").notNull(), - formattedName: text("formatted_name").notNull(), - assetCount: integer("asset_count").default(0).notNull(), - lastUpdated: integer("last_updated").notNull(), - }, - (game) => { - return { - gameIdx: uniqueIndex("game_idx").on(game.id), - nameIdx: uniqueIndex("name_idx").on(game.name), - } - } + tableNames.games, + { + id: text("id").primaryKey(), + name: text("name").notNull(), + formattedName: text("formatted_name").notNull(), + assetCount: integer("asset_count").default(0).notNull(), + lastUpdated: integer("last_updated").notNull(), + }, + (game) => { + return { + gameIdx: uniqueIndex("game_idx").on(game.id), + nameIdx: uniqueIndex("name_idx").on(game.name), + } + } ) export const assetCategories = sqliteTable( - tableNames.assetCategories, - { - id: text("id").primaryKey(), - name: text("name").notNull(), // e.g genshin-impact, honkai-impact-3rd - formattedName: text("formatted_name").notNull(), // e.g Genshin Impact, Honkai Impact 3rd - assetCount: integer("asset_count").default(0).notNull(), - lastUpdated: integer("last_updated").notNull(), - }, - (assetCategory) => { - return { - assetCategoryIdx: uniqueIndex("asset_category_idx").on( - assetCategory.id - ), - nameIdx: uniqueIndex("name_idx").on(assetCategory.name), - } - } + tableNames.assetCategories, + { + id: text("id").primaryKey(), + name: text("name").notNull(), // e.g genshin-impact, honkai-impact-3rd + formattedName: text("formatted_name").notNull(), // e.g Genshin Impact, Honkai Impact 3rd + assetCount: integer("asset_count").default(0).notNull(), + lastUpdated: integer("last_updated").notNull(), + }, + (assetCategory) => { + return { + assetCategoryIdx: uniqueIndex("asset_category_idx").on( + assetCategory.id + ), + nameIdx: uniqueIndex("name_idx").on(assetCategory.name), + } + } ) export const assetTags = sqliteTable( - tableNames.assetTags, - { - id: text("id").primaryKey(), - name: text("name").notNull(), - formattedName: text("formatted_name").notNull(), - assetCount: integer("asset_count").default(0).notNull(), - lastUpdated: integer("last_updated").notNull(), - }, - (assetTag) => { - return { - assetTagIdx: uniqueIndex("asset_tag_idx").on(assetTag.id), - nameIdx: uniqueIndex("name_idx").on(assetTag.name), - } - } + tableNames.assetTags, + { + id: text("id").primaryKey(), + name: text("name").notNull(), + formattedName: text("formatted_name").notNull(), + assetCount: integer("asset_count").default(0).notNull(), + lastUpdated: integer("last_updated").notNull(), + }, + (assetTag) => { + return { + assetTagIdx: uniqueIndex("asset_tag_idx").on(assetTag.id), + nameIdx: uniqueIndex("name_idx").on(assetTag.name), + } + } ) export const assets = sqliteTable( - tableNames.assets, - { - id: integer("id").primaryKey().notNull(), // primary key auto increments on sqlite - name: text("name").notNull(), - game: text("game") - .notNull() - .references(() => games.name, { - onUpdate: "cascade", - onDelete: "cascade", - }), - assetCategory: text("asset_category") - .notNull() - .references(() => assetCategories.name, { - onUpdate: "cascade", - onDelete: "cascade", - }), - // tags can be more than one tag, where we reference the name of the tag - tags: text("tags").notNull(), - url: text("url").notNull(), - status: text("status").notNull(), - uploadedById: text("uploaded_by").references(() => users.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - uploadedByName: text("uploaded_by_name").references( - () => users.username, - { - onUpdate: "cascade", - onDelete: "cascade", - } - ), - uploadedDate: integer("uploaded_date").notNull(), - viewCount: integer("view_count").default(0).notNull(), - downloadCount: integer("download_count").default(0).notNull(), - fileSize: integer("file_size").default(0).notNull(), - width: integer("width").default(0).notNull(), - height: integer("height").default(0).notNull(), - }, - (table) => { - return { - idIdx: uniqueIndex("assets_id_idx").on(table.id), - nameIdx: uniqueIndex("assets_name_idx").on(table.name), - gameIdx: uniqueIndex("assets_game_idx").on(table.game), - assetCategoryIdx: uniqueIndex("assets_asset_category_idx").on( - table.assetCategory - ), - downloadCountIdx: uniqueIndex("assets_download_count_idx").on( - table.downloadCount - ), - statusIdx: uniqueIndex("assets_status_idx").on(table.status), - tagsIdx: uniqueIndex("assets_tags_idx").on(table.tags), - uploadedByIdx: uniqueIndex("assets_uploaded_by_idx").on( - table.uploadedById - ), - } - } + tableNames.assets, + { + id: integer("id").primaryKey().notNull(), // primary key auto increments on sqlite + name: text("name").notNull(), + game: text("game") + .notNull() + .references(() => games.name, { + onUpdate: "cascade", + onDelete: "cascade", + }), + assetCategory: text("asset_category") + .notNull() + .references(() => assetCategories.name, { + onUpdate: "cascade", + onDelete: "cascade", + }), + // tags can be more than one tag, where we reference the name of the tag + tags: text("tags").notNull(), + url: text("url").notNull(), + status: text("status").notNull(), + uploadedById: text("uploaded_by").references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + uploadedByName: text("uploaded_by_name").references( + () => users.username, + { + onUpdate: "cascade", + onDelete: "cascade", + } + ), + uploadedDate: integer("uploaded_date").notNull(), + viewCount: integer("view_count").default(0).notNull(), + downloadCount: integer("download_count").default(0).notNull(), + fileSize: integer("file_size").default(0).notNull(), + width: integer("width").default(0).notNull(), + height: integer("height").default(0).notNull(), + }, + (table) => { + return { + idIdx: uniqueIndex("assets_id_idx").on(table.id), + nameIdx: uniqueIndex("assets_name_idx").on(table.name), + gameIdx: uniqueIndex("assets_game_idx").on(table.game), + assetCategoryIdx: uniqueIndex("assets_asset_category_idx").on( + table.assetCategory + ), + downloadCountIdx: uniqueIndex("assets_download_count_idx").on( + table.downloadCount + ), + statusIdx: uniqueIndex("assets_status_idx").on(table.status), + tagsIdx: uniqueIndex("assets_tags_idx").on(table.tags), + uploadedByIdx: uniqueIndex("assets_uploaded_by_idx").on( + table.uploadedById + ), + } + } ) export const following = sqliteTable( - tableNames.following, - { - id: text("id").primaryKey(), - followerId: text("follower_id") - .notNull() - .references(() => users.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - followingId: text("following_id") - .notNull() - .references(() => users.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - }, - (following) => { - return { - followerIdx: uniqueIndex("follower_idx").on(following.followerId), - followingIdx: uniqueIndex("following_idx").on( - following.followingId - ), - } - } + tableNames.following, + { + id: text("id").primaryKey(), + followerId: text("follower_id") + .notNull() + .references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + followingId: text("following_id") + .notNull() + .references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + }, + (following) => { + return { + followerIdx: uniqueIndex("follower_idx").on(following.followerId), + followingIdx: uniqueIndex("following_idx").on( + following.followingId + ), + } + } ) export const follower = sqliteTable( - tableNames.follower, - { - id: text("id").primaryKey(), - followerId: text("follower_id") - .notNull() - .references(() => users.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - followingId: text("following_id").notNull(), - }, - (follower) => { - return { - followerIdx: uniqueIndex("follower_idx").on(follower.followerId), - followingIdx: uniqueIndex("following_idx").on(follower.followingId), - } - } + tableNames.follower, + { + id: text("id").primaryKey(), + followerId: text("follower_id") + .notNull() + .references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + followingId: text("following_id").notNull(), + }, + (follower) => { + return { + followerIdx: uniqueIndex("follower_idx").on(follower.followerId), + followingIdx: uniqueIndex("following_idx").on(follower.followingId), + } + } ) export const collections = sqliteTable( - tableNames.assetCollection, - { - id: text("id").primaryKey(), - name: text("name").notNull(), - userId: text("user_id") - .notNull() - .references(() => users.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - isPublic: integer("is_public").default(0).notNull(), - }, - (collection) => { - return { - collectionIdx: uniqueIndex("collection_idx").on(collection.id), - userCollectionIdx: uniqueIndex("user_collection_idx").on( - collection.userId - ), - } - } + tableNames.assetCollection, + { + id: text("id").primaryKey(), + name: text("name").notNull(), + userId: text("user_id") + .notNull() + .references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + isPublic: integer("is_public").default(0).notNull(), + }, + (collection) => { + return { + collectionIdx: uniqueIndex("collection_idx").on(collection.id), + userCollectionIdx: uniqueIndex("user_collection_idx").on( + collection.userId + ), + } + } ) export const collectionAssets = sqliteTable( - tableNames.assetCollectionAsset, - { - collectionId: text("collection_id") - .notNull() - .references(() => collections.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - assetId: integer("asset_id") - .notNull() - .references(() => assets.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - }, - (collectionAsset) => { - return { - collectionAssetIdx: uniqueIndex("collection_asset_idx").on( - collectionAsset.collectionId, - collectionAsset.assetId - ), - } - } + tableNames.assetCollectionAsset, + { + collectionId: text("collection_id") + .notNull() + .references(() => collections.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + assetId: integer("asset_id") + .notNull() + .references(() => assets.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + }, + (collectionAsset) => { + return { + collectionAssetIdx: uniqueIndex("collection_asset_idx").on( + collectionAsset.collectionId, + collectionAsset.assetId + ), + } + } ) export const savedOcGenerators = sqliteTable( - tableNames.savedOcGenerators, - { - id: text("id").primaryKey(), - userId: text("user_id") - .notNull() - .references(() => users.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - name: text("name").notNull(), - game: text("game").notNull(), - isPublic: integer("is_public").default(0).notNull(), - content: text("content").notNull(), // this is stored as json, which is then parsed on the frontend - }, - (savedOcGenerators) => { - return { - savedOcGeneratorsIdx: uniqueIndex("saved_oc_generators_idx").on( - savedOcGenerators.id - ), - savedOcGeneratorsUserIdx: uniqueIndex( - "saved_oc_generators_user_idx" - ).on(savedOcGenerators.userId), - } - } + tableNames.savedOcGenerators, + { + id: text("id").primaryKey(), + userId: text("user_id") + .notNull() + .references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + name: text("name").notNull(), + game: text("game").notNull(), + isPublic: integer("is_public").default(0).notNull(), + content: text("content").notNull(), // this is stored as json, which is then parsed on the frontend + }, + (savedOcGenerators) => { + return { + savedOcGeneratorsIdx: uniqueIndex("saved_oc_generators_idx").on( + savedOcGenerators.id + ), + savedOcGeneratorsUserIdx: uniqueIndex( + "saved_oc_generators_user_idx" + ).on(savedOcGenerators.userId), + } + } ) // relations export const gameRelations = relations(games, ({ many }) => ({ - assets: many(assets), + assets: many(assets), })) export const assetCategoryRelations = relations( - assetCategories, - ({ many }) => ({ - assets: many(assets), - }) + assetCategories, + ({ many }) => ({ + assets: many(assets), + }) ) export const collectionRelations = relations(collections, ({ many }) => ({ - assets: many(assets), + assets: many(assets), })) export const assetRelations = relations(assets, ({ one, many }) => ({ - uploadedBy: one(users, { - fields: [assets.uploadedById, assets.uploadedByName], - references: [users.id, users.username], - }), - assetCategory: one(assetCategories, { - fields: [assets.assetCategory], - references: [assetCategories.name], - }), - tags: many(assetTags), - game: one(games, { - fields: [assets.game], - references: [games.name], - }), + uploadedBy: one(users, { + fields: [assets.uploadedById, assets.uploadedByName], + references: [users.id, users.username], + }), + assetCategory: one(assetCategories, { + fields: [assets.assetCategory], + references: [assetCategories.name], + }), + tags: many(assetTags), + game: one(games, { + fields: [assets.game], + references: [games.name], + }), })) export const sessionsRelations = relations(sessions, ({ one }) => ({ - user: one(users, { - fields: [sessions.userId], - references: [users.id], - }), + user: one(users, { + fields: [sessions.userId], + references: [users.id], + }), })) export const keysRelations = relations(keys, ({ one }) => ({ - user: one(users, { - fields: [keys.userId], - references: [users.id], - }), + user: one(users, { + fields: [keys.userId], + references: [users.id], + }), })) export const usersRelations = relations(users, ({ many }) => ({ - session: many(sessions), - key: many(keys), - assets: many(assets), - follower: many(follower), - following: many(following), - collections: many(collections), - savedOcGenerators: many(savedOcGenerators), + session: many(sessions), + key: many(keys), + assets: many(assets), + follower: many(follower), + following: many(following), + collections: many(collections), + savedOcGenerators: many(savedOcGenerators), })) diff --git a/src/v2/db/turso.ts b/src/v2/db/turso.ts index 83dc03e..f4923e5 100644 --- a/src/v2/db/turso.ts +++ b/src/v2/db/turso.ts @@ -5,18 +5,18 @@ import { createClient } from "@libsql/client/web" // because we're in a worker // wrapper for turso & drizzle export function getConnection(env: Env) { - const turso = createClient({ - url: env.TURSO_DATABASE_URL, - authToken: env.TURSO_DATABASE_AUTH_TOKEN, - }) + const turso = createClient({ + url: env.TURSO_DATABASE_URL, + authToken: env.TURSO_DATABASE_AUTH_TOKEN, + }) - const drizzle = drizzleORM(turso, { - schema, - logger: true, - }) + const drizzle = drizzleORM(turso, { + schema, + logger: true, + }) - return { - drizzle, - turso, - } + return { + drizzle, + turso, + } } diff --git a/src/v2/lib/auth/lucia.ts b/src/v2/lib/auth/lucia.ts index 4261611..3e6c245 100644 --- a/src/v2/lib/auth/lucia.ts +++ b/src/v2/lib/auth/lucia.ts @@ -8,51 +8,51 @@ import { libsql } from "@lucia-auth/adapter-sqlite" // this is so we can pass in env during requests, // so, it would be called: auth(c.env)... instead of auth export const auth = (env: Env) => { - const db = getConnection(env) - const connection = db.turso + const db = getConnection(env) + const connection = db.turso - return lucia({ - adapter: libsql(connection, { - key: tableNames.authKey, - session: tableNames.authSession, - user: tableNames.authUser, - }), - middleware: hono(), - sessionExpiresIn: { - idlePeriod: 0, - activePeriod: 30 * 24 * 60 * 60 * 1000, // 30 days - }, - env: env.ENVIRONMENT === "DEV" ? "DEV" : "PROD", - experimental: { - debugMode: env.ENVIRONMENT === "DEV" ? true : false, - }, - csrfProtection: { - enabled: true, - allowedSubDomains: ["*"], - }, - getUserAttributes: (dbUser) => { - return { - username: dbUser.username, - usernameColour: dbUser.username_colour, - avatarUrl: dbUser.avatar_url, - bannerUrl: dbUser.banner_url, - email: dbUser.email, - emailVerified: dbUser.email_verified, - pronouns: dbUser.pronouns, - verified: dbUser.verified, - bio: dbUser.bio, - roleFlags: dbUser.role_flags, - selfAssignableRoleFlags: dbUser.self_assignable_role_flags, - dateJoined: dbUser.date_joined, - } - }, - getSessionAttributes: (dbSession) => { - return { - userAgent: dbSession.user_agent as string, - countryCode: dbSession.country_code as string, - } - }, - }) + return lucia({ + adapter: libsql(connection, { + key: tableNames.authKey, + session: tableNames.authSession, + user: tableNames.authUser, + }), + middleware: hono(), + sessionExpiresIn: { + idlePeriod: 0, + activePeriod: 30 * 24 * 60 * 60 * 1000, // 30 days + }, + env: env.ENVIRONMENT === "DEV" ? "DEV" : "PROD", + experimental: { + debugMode: env.ENVIRONMENT === "DEV" ? true : false, + }, + csrfProtection: { + enabled: true, + allowedSubDomains: ["*"], + }, + getUserAttributes: (dbUser) => { + return { + username: dbUser.username, + usernameColour: dbUser.username_colour, + avatarUrl: dbUser.avatar_url, + bannerUrl: dbUser.banner_url, + email: dbUser.email, + emailVerified: dbUser.email_verified, + pronouns: dbUser.pronouns, + verified: dbUser.verified, + bio: dbUser.bio, + roleFlags: dbUser.role_flags, + selfAssignableRoleFlags: dbUser.self_assignable_role_flags, + dateJoined: dbUser.date_joined, + } + }, + getSessionAttributes: (dbSession) => { + return { + userAgent: dbSession.user_agent as string, + countryCode: dbSession.country_code as string, + } + }, + }) } export type Auth = typeof auth diff --git a/src/v2/lib/auth/roleFlags.ts b/src/v2/lib/auth/roleFlags.ts index d0160e0..0fd3d9c 100644 --- a/src/v2/lib/auth/roleFlags.ts +++ b/src/v2/lib/auth/roleFlags.ts @@ -2,41 +2,41 @@ // permission based roles export const roleFlags = { - USER: 1 << 0, - CONTRIBUTOR: 1 << 1, - TRANSLATOR: 1 << 2, - STAFF: 1 << 3, - DEVELOPER: 1 << 4, - CREATOR: 1 << 5, + USER: 1 << 0, + CONTRIBUTOR: 1 << 1, + TRANSLATOR: 1 << 2, + STAFF: 1 << 3, + DEVELOPER: 1 << 4, + CREATOR: 1 << 5, } export const roleFlagsToArray = (roleFlagsInt: number): string[] => { - const roles: string[] = [] + const roles: string[] = [] - for (const [role, flag] of Object.entries(roleFlags)) { - if (roleFlagsInt & flag) roles.push(role) - } + for (const [role, flag] of Object.entries(roleFlags)) { + if (roleFlagsInt & flag) roles.push(role) + } - return roles + return roles } // self assignable roles export const SelfAssignableRoleFlags = { - CONTENT_CREATOR: 1 << 0, - ARTIST: 1 << 1, - WRITER: 1 << 2, - DEVELOPER: 1 << 3, - DESIGNER: 1 << 4, + CONTENT_CREATOR: 1 << 0, + ARTIST: 1 << 1, + WRITER: 1 << 2, + DEVELOPER: 1 << 3, + DESIGNER: 1 << 4, } export const SelfAssignableRoleFlagsToArray = ( - roleFlagsInt: number + roleFlagsInt: number ): string[] => { - const roles: string[] = [] + const roles: string[] = [] - for (const [role, flag] of Object.entries(SelfAssignableRoleFlags)) { - if (roleFlagsInt & flag) roles.push(role) - } + for (const [role, flag] of Object.entries(SelfAssignableRoleFlags)) { + if (roleFlagsInt & flag) roles.push(role) + } - return roles + return roles } diff --git a/src/v2/lib/discord.ts b/src/v2/lib/discord.ts index 0a273c9..78a44b7 100644 --- a/src/v2/lib/discord.ts +++ b/src/v2/lib/discord.ts @@ -1,12 +1,12 @@ export const roles: { [key: string]: string } = { - "982387185259012096": "Project Lead", - "1112182244572938310": "Developer", - "1038892176479895584": "Admin", - "1000916582538674249": "Senior Moderator", - "983817984923562034": "Moderator", - "1088105796908355584": "Translator", - "1005805438031364129": "Contributor", - "983883539772751912": "Server Booster", + "982387185259012096": "Project Lead", + "1112182244572938310": "Developer", + "1038892176479895584": "Admin", + "1000916582538674249": "Senior Moderator", + "983817984923562034": "Moderator", + "1088105796908355584": "Translator", + "1005805438031364129": "Contributor", + "983883539772751912": "Server Booster", } export const guildId = "982385887000272956" diff --git a/src/v2/lib/helpers/rename.ts b/src/v2/lib/helpers/rename.ts index 074e438..2442526 100644 --- a/src/v2/lib/helpers/rename.ts +++ b/src/v2/lib/helpers/rename.ts @@ -1,3 +1,3 @@ export const rename = (name: string): string => { - return name.replace(/-/g, "_") + return name.replace(/-/g, "_") } diff --git a/src/v2/lib/helpers/responses/notFoundResponse.ts b/src/v2/lib/helpers/responses/notFoundResponse.ts index 2195a25..5e19bd5 100644 --- a/src/v2/lib/helpers/responses/notFoundResponse.ts +++ b/src/v2/lib/helpers/responses/notFoundResponse.ts @@ -1,12 +1,12 @@ // helper function to create a 404 Not Found response export function createNotFoundResponse(c, errorMessage, responseHeaders) { - return c.json( - { - success: false, - status: "error", - error: errorMessage, - }, - 404, - responseHeaders - ) + return c.json( + { + success: false, + status: "error", + error: errorMessage, + }, + 404, + responseHeaders + ) } diff --git a/src/v2/lib/listBucket.ts b/src/v2/lib/listBucket.ts index 38d79ca..4a9e026 100644 --- a/src/v2/lib/listBucket.ts +++ b/src/v2/lib/listBucket.ts @@ -1,3 +1,3 @@ export const listBucket = async (bucket, options) => { - return await bucket.list(options) + return await bucket.list(options) } diff --git a/src/v2/lib/resend/email.ts b/src/v2/lib/resend/email.ts index 9897690..ce17a59 100644 --- a/src/v2/lib/resend/email.ts +++ b/src/v2/lib/resend/email.ts @@ -4,64 +4,64 @@ import { Resend } from "resend" const resend = new Resend("") export const sendPasswordResetEmail = async ( - email: string, - link: string, - username: string + email: string, + link: string, + username: string ) => { - try { - await resend.emails.send({ - from: "Test ", - to: email, - subject: "Password Reset Request", - html: `Password reset for ${username}
Click here to reset your password`, - }) - } catch (error) { - throw new Error("Error sending password reset email.") - } + try { + await resend.emails.send({ + from: "Test ", + to: email, + subject: "Password Reset Request", + html: `Password reset for ${username}
Click here to reset your password`, + }) + } catch (error) { + throw new Error("Error sending password reset email.") + } } export const sendPasswordChangeEmail = async ( - email: string, - username: string + email: string, + username: string ) => { - try { - await resend.emails.send({ - from: "Test ", - to: email, - subject: "Password Updated Confirmation", - html: `Your password for ${username} has been updated.
Wasn't you? Contact us at support@wanderer.moe`, - }) - } catch (error) { - throw new Error("Error sending password change email.") - } + try { + await resend.emails.send({ + from: "Test ", + to: email, + subject: "Password Updated Confirmation", + html: `Your password for ${username} has been updated.
Wasn't you? Contact us at support@wanderer.moe`, + }) + } catch (error) { + throw new Error("Error sending password change email.") + } } export const sendEmailChangeEmail = async (email: string, username: string) => { - try { - await resend.emails.send({ - from: "Test ", - to: email, - subject: "Email Change Request", - html: `Your email address for ${username} has been changed.
Wasn't you? Contact us at support@wanderer.moe`, - }) - } catch (error) { - throw new Error("Error sending email change email.") - } + try { + await resend.emails.send({ + from: "Test ", + to: email, + subject: "Email Change Request", + html: `Your email address for ${username} has been changed.
Wasn't you? Contact us at support@wanderer.moe`, + }) + } catch (error) { + throw new Error("Error sending email change email.") + } } export const sendEmailConfirmationEmail = async ( - email: string, - link: string, - username: string + email: string, + link: string, + username: string ) => { - try { - await resend.emails.send({ - from: "Test ", - to: email, - subject: "Email Confirmation", - html: `Email confirmation for ${username}
Click here to confirm your email`, - }) - } catch (error) { - throw new Error("Error sending email confirmation email.") - } + try { + await resend.emails.send({ + from: "Test ", + to: email, + subject: "Email Confirmation", + html: `Email confirmation for ${username}
Click here to confirm your email`, + }) + } catch (error) { + throw new Error("Error sending email confirmation email.") + } } diff --git a/src/v2/lib/responseHeaders.ts b/src/v2/lib/responseHeaders.ts index 381c171..7910acd 100644 --- a/src/v2/lib/responseHeaders.ts +++ b/src/v2/lib/responseHeaders.ts @@ -1,5 +1,5 @@ export const responseHeaders: Record = { - "X-Content-Type-Options": "nosniff", - "Referrer-Policy": "strict-origin-when-cross-origin", - "content-type": "application/json;charset=UTF-8", + "X-Content-Type-Options": "nosniff", + "Referrer-Policy": "strict-origin-when-cross-origin", + "content-type": "application/json;charset=UTF-8", } diff --git a/src/v2/lib/types/discord.ts b/src/v2/lib/types/discord.ts index e8b7f6b..9082433 100644 --- a/src/v2/lib/types/discord.ts +++ b/src/v2/lib/types/discord.ts @@ -1,18 +1,18 @@ // types used for the /contributor endpoint export interface Contributor { - id: string - username: string - globalname: string | null - avatar: string - roles: string[] + id: string + username: string + globalname: string | null + avatar: string + roles: string[] } export interface GuildMember { - roles: string[] - user: { - id: string - username: string - global_name: string | null - avatar: string - } + roles: string[] + user: { + id: string + username: string + global_name: string | null + avatar: string + } } diff --git a/src/v2/routes/asset/assetRoute.ts b/src/v2/routes/asset/assetRoute.ts index 91c59f2..781f73f 100644 --- a/src/v2/routes/asset/assetRoute.ts +++ b/src/v2/routes/asset/assetRoute.ts @@ -6,12 +6,12 @@ import { Bindings } from "@/worker-configuration" const assetRoute = new Hono<{ Bindings: Bindings }>() assetRoute.get("/:id", async (c) => { - return getAssetFromId(c) + return getAssetFromId(c) }) // setting both of these to id returns "duplicate param name" error, will fix later assetRoute.get("/download/:assetId", async (c) => { - return downloadAsset(c) + return downloadAsset(c) }) export default assetRoute diff --git a/src/v2/routes/asset/downloadAsset.ts b/src/v2/routes/asset/downloadAsset.ts index dcf924c..1f88267 100644 --- a/src/v2/routes/asset/downloadAsset.ts +++ b/src/v2/routes/asset/downloadAsset.ts @@ -6,34 +6,34 @@ import { assets } from "@/v2/db/schema" import type { APIContext as Context } from "@/worker-configuration" export async function downloadAsset(c: Context): Promise { - const { assetId } = c.req.param() + const { assetId } = c.req.param() - const drizzle = await getConnection(c.env).drizzle + const drizzle = await getConnection(c.env).drizzle - const asset = await drizzle - .select() - .from(assets) - .where(eq(assets.id, parseInt(assetId))) - .execute() + const asset = await drizzle + .select() + .from(assets) + .where(eq(assets.id, parseInt(assetId))) + .execute() - if (!asset) - return createNotFoundResponse(c, "Asset not found", responseHeaders) + if (!asset) + return createNotFoundResponse(c, "Asset not found", responseHeaders) - if (asset) - await drizzle - .update(assets) - .set({ downloadCount: asset[0].downloadCount + 1 }) - .where(eq(assets.id, parseInt(assetId))) - .execute() + if (asset) + await drizzle + .update(assets) + .set({ downloadCount: asset[0].downloadCount + 1 }) + .where(eq(assets.id, parseInt(assetId))) + .execute() - const response = await fetch(asset[0].url) + const response = await fetch(asset[0].url) - const blob = await response.blob() + const blob = await response.blob() - const headers = new Headers() - headers.set("Content-Disposition", `attachment; filename=${asset[0].name}`) + const headers = new Headers() + headers.set("Content-Disposition", `attachment; filename=${asset[0].name}`) - return new Response(blob, { - headers: headers, - }) + return new Response(blob, { + headers: headers, + }) } diff --git a/src/v2/routes/asset/getAssetFromId.ts b/src/v2/routes/asset/getAssetFromId.ts index 4a6c428..96ad769 100644 --- a/src/v2/routes/asset/getAssetFromId.ts +++ b/src/v2/routes/asset/getAssetFromId.ts @@ -6,46 +6,46 @@ import { eq, desc } from "drizzle-orm" import type { APIContext as Context } from "@/worker-configuration" export async function getAssetFromId(c: Context): Promise { - const { id } = c.req.param() - const cacheKey = new Request(c.req.url.toString(), c.req) - const cache = caches.default - let response = await cache.match(cacheKey) - - if (response) return response - - const drizzle = await getConnection(c.env).drizzle - - const asset = await drizzle.query.assets.findFirst({ - where: (assets, { eq }) => eq(assets.id, parseInt(id)), - }) - - if (!asset) { - response = createNotFoundResponse(c, "Asset not found", responseHeaders) - await cache.put(cacheKey, response.clone()) - return response - } - - const similarAssets = await drizzle - .select() - .from(assets) - .where(eq(assets.assetCategory, asset[0].assetCategory)) - .limit(6) - .orderBy(desc(assets.id)) - .execute() - - response = c.json( - { - success: true, - status: "ok", - asset, - similarAssets, - }, - 200, - responseHeaders - ) - - response.headers.set("Cache-Control", "s-maxage=604800") - await cache.put(cacheKey, response.clone()) - - return response + const { id } = c.req.param() + const cacheKey = new Request(c.req.url.toString(), c.req) + const cache = caches.default + let response = await cache.match(cacheKey) + + if (response) return response + + const drizzle = await getConnection(c.env).drizzle + + const asset = await drizzle.query.assets.findFirst({ + where: (assets, { eq }) => eq(assets.id, parseInt(id)), + }) + + if (!asset) { + response = createNotFoundResponse(c, "Asset not found", responseHeaders) + await cache.put(cacheKey, response.clone()) + return response + } + + const similarAssets = await drizzle + .select() + .from(assets) + .where(eq(assets.assetCategory, asset.assetCategory)) + .limit(6) + .orderBy(desc(assets.id)) + .execute() + + response = c.json( + { + success: true, + status: "ok", + asset, + similarAssets, + }, + 200, + responseHeaders + ) + + response.headers.set("Cache-Control", "s-maxage=604800") + await cache.put(cacheKey, response.clone()) + + return response } diff --git a/src/v2/routes/auth/assets/approveAsset.ts b/src/v2/routes/auth/assets/approveAsset.ts new file mode 100644 index 0000000..3adc83b --- /dev/null +++ b/src/v2/routes/auth/assets/approveAsset.ts @@ -0,0 +1,58 @@ +import { responseHeaders } from "@/v2/lib/responseHeaders" +import { getConnection } from "@/v2/db/turso" +import { assets } from "@/v2/db/schema" +import { createNotFoundResponse } from "@/v2/lib/helpers/responses/notFoundResponse" +import { eq } from "drizzle-orm" +import type { APIContext as Context } from "@/worker-configuration" +import { auth } from "@/v2/lib/auth/lucia" +import { roleFlagsToArray } from "@/v2/lib/auth/roleFlags" + +export async function approveAsset(c: Context): Promise { + const { assetIdToApprove } = c.req.param() + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() + + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + return c.json({ success: false, state: "invalid session" }, 200) + } + + const roleFlags = roleFlagsToArray(session.user.role_flags) + + if (!roleFlags.includes("CREATOR")) { + return c.json({ success: false, state: "unauthorized" }, 401) + } + + const drizzle = await getConnection(c.env).drizzle + + const asset = await drizzle.query.assets.findFirst({ + where: (assets, { eq }) => eq(assets.id, parseInt(assetIdToApprove)), + }) + + if (!asset) { + return createNotFoundResponse(c, "Asset not found", responseHeaders) + } + + const updatedAsset = await drizzle + .update(assets) + .set({ + status: "approved", + }) + .where(eq(assets.id, parseInt(assetIdToApprove))) + .execute() + + const response = c.json( + { + success: true, + status: "ok", + updatedAsset, + }, + 200, + responseHeaders + ) + + return response +} diff --git a/src/v2/routes/auth/assets/modifyAsset.ts b/src/v2/routes/auth/assets/modifyAsset.ts new file mode 100644 index 0000000..8535b2d --- /dev/null +++ b/src/v2/routes/auth/assets/modifyAsset.ts @@ -0,0 +1,79 @@ +import { responseHeaders } from "@/v2/lib/responseHeaders" +import { getConnection } from "@/v2/db/turso" +import { assets } from "@/v2/db/schema" +import { createNotFoundResponse } from "@/v2/lib/helpers/responses/notFoundResponse" +import { eq } from "drizzle-orm" +import type { APIContext as Context } from "@/worker-configuration" +import { auth } from "@/v2/lib/auth/lucia" +import { roleFlagsToArray } from "@/v2/lib/auth/roleFlags" + +export async function modifyAssetData(c: Context): Promise { + const { assetIdToModify } = c.req.param() + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() + + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + return c.json({ success: false, state: "invalid session" }, 200) + } + + // return unauthorized if user is not a contributor + if (session.user.is_contributor !== 1) + return c.json({ success: false, state: "unauthorized" }, 401) + + const drizzle = await getConnection(c.env).drizzle + + const asset = await drizzle.query.assets.findFirst({ + where: (assets, { eq }) => eq(assets.id, parseInt(assetIdToModify)), + }) + + if (!asset) { + return createNotFoundResponse(c, "Asset not found", responseHeaders) + } + + const roleFlags = roleFlagsToArray(session.user.role_flags) + + if ( + asset.uploadedById !== session.userId || + !roleFlags.includes("CREATOR") + ) { + return c.json( + { success: false, state: "unauthorized to modify this asset" }, + 401 + ) + } + + const formData = await c.req.formData() + + const metadata = { + game: formData.get("game") as string | null, + assetCategory: formData.get("assetCategory") as string | null, + } + + Object.keys(metadata).forEach( + (key) => metadata[key] === null && delete metadata[key] + ) + + const updatedAsset = await drizzle + .update(assets) + .set({ + ...metadata, + }) + .where(eq(assets.id, parseInt(assetIdToModify))) + .execute() + + const response = c.json( + { + success: true, + status: "ok", + updatedAsset, + }, + 200, + responseHeaders + ) + + return response +} diff --git a/src/v2/routes/auth/assets/uploadAsset.ts b/src/v2/routes/auth/assets/uploadAsset.ts new file mode 100644 index 0000000..d4a182c --- /dev/null +++ b/src/v2/routes/auth/assets/uploadAsset.ts @@ -0,0 +1,110 @@ +import { auth } from "@/v2/lib/auth/lucia" +import { getConnection } from "@/v2/db/turso" +import { assets } from "@/v2/db/schema" +import type { APIContext as Context } from "@/worker-configuration" + +export async function uploadAsset(c: Context): Promise { + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() + + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + return c.json({ success: false, state: "invalid session" }, 200) + } + + // return unauthorized if user is not a contributor + if (session.user.is_contributor !== 1) + return c.json({ success: false, state: "unauthorized" }, 401) + + const bypassApproval = session.user.is_contributor === 1 + + const drizzle = await getConnection(c.env).drizzle + + const formData = await c.req.formData() + const asset = formData.get("asset") as unknown as File | null + + // this is temporary + const asset128px = formData.get("asset128px") as unknown as File | null + + if ( + !asset || + asset.type !== "image/png" || + !asset128px || + asset128px.type !== "image/png" + ) { + return c.json({ success: false, state: "invalid asset" }, 200) + } + + // clear out metadata + const metadata = { + title: formData.get("title") as string, // e.g keqing + extension: formData.get("extension") as string, // e.g png + tags: formData.get("tags") as string, // e.g no-background, fanmade, official + category: formData.get("category") as string, // e.g splash-art + game: formData.get("game") as string, // e.g genshin-impact + size: formData.get("size") as unknown as number, // e.g 1024 + width: formData.get("width") as unknown as number, // e.g 1920 + height: formData.get("height") as unknown as number, // e.g 1080 + } + + const newAsset = { + name: `${metadata.title}.${metadata.extension}`, + game: metadata.game, + assetCategory: metadata.category, + tags: metadata.tags, + url: `/assets/${metadata.game}/${metadata.category}/${metadata.title}.${metadata.extension}`, + uploadedById: session.userId, + status: bypassApproval ? "approved" : "pending", + uploadedDate: new Date().getTime(), + fileSize: asset.size, // stored in bytes + width: metadata.width, + height: metadata.height, + } + + // rename file name to match metadata + const newAssetFile = new File([asset], newAsset.name, { + type: asset.type, + }) + + const duplicateAsset = await drizzle.query.assets.findFirst({ + where: (assets, { and, eq }) => + and( + eq(assets.name, newAsset.name), + eq(assets.game, newAsset.game), + eq(assets.assetCategory, newAsset.assetCategory) + ), + }) + + if (duplicateAsset) + return c.json({ success: false, state: "duplicate asset" }, 400) + + try { + await drizzle.transaction(async () => { + await c.env.bucket.put( + `/assets/${metadata.game}/${metadata.category}/${metadata.title}.${metadata.extension}`, + newAssetFile + ) + + const newAssetClone = new File( + [asset128px], + `${metadata.title}-128.png`, + { + type: asset.type, + } + ) + + await c.env.bucket.put( + `/assets/${metadata.game}/${metadata.category}/${metadata.title}-128.png`, + newAssetClone + ) + await drizzle.insert(assets).values(newAsset) + }) + } catch (e) { + return c.json({ success: false, state: "failed to upload asset" }, 500) + } + + return c.json({ success: true, state: "uploaded asset" }, 200) +} diff --git a/src/v2/routes/auth/authRoute.ts b/src/v2/routes/auth/authRoute.ts index 0e07c1b..c5b240c 100644 --- a/src/v2/routes/auth/authRoute.ts +++ b/src/v2/routes/auth/authRoute.ts @@ -8,63 +8,73 @@ import { uploadProfileImage } from "./user-attributes/self-upload/uploadAvatar" import { uploadBannerImage } from "./user-attributes/self-upload/uploadBanner" import { saveOCGeneratorResponse } from "./oc-generators/saveOCGeneratorResponse" import { updateUserAttributes } from "./user-attributes/updateUserAttributes" -import { uploadAsset } from "./user-attributes/self-upload/uploadAsset" +import { uploadAsset } from "./assets/uploadAsset" import { Bindings } from "@/worker-configuration" +import { modifyAssetData } from "./assets/modifyAsset" +import { approveAsset } from "./assets/approveAsset" import { viewOCGeneratorResponses } from "./oc-generators/viewOCGeneratorResponses" import { deleteOCGeneratorResponse } from "./oc-generators/deleteOCGeneratorResponse" const authRoute = new Hono<{ Bindings: Bindings }>() authRoute.use( - "*", - cors({ - credentials: true, - origin: ["https://next.wanderer.moe"], - }) + "*", + cors({ + credentials: true, + origin: ["https://next.wanderer.moe"], + }) ) authRoute.post("/login", async (c) => { - return login(c) + return login(c) }) authRoute.post("/update/attributes", async (c) => { - return updateUserAttributes(c) + return updateUserAttributes(c) }) authRoute.post("/upload/asset", async (c) => { - return uploadAsset(c) + return uploadAsset(c) }) authRoute.post("/upload/avatar", async (c) => { - return uploadProfileImage(c) + return uploadProfileImage(c) +}) + +authRoute.post("/approve/asset/:assetIdToApprove", async (c) => { + return approveAsset(c) +}) + +authRoute.post("/modify/asset/:assetIdToModify", async (c) => { + return modifyAssetData(c) }) authRoute.post("/upload/banner", async (c) => { - return uploadBannerImage(c) + return uploadBannerImage(c) }) authRoute.post("/signup", async (c) => { - return signup(c) + return signup(c) }) authRoute.post("/oc-generator/save", async (c) => { - return saveOCGeneratorResponse(c) + return saveOCGeneratorResponse(c) }) authRoute.get("/oc-generator/view/all", async (c) => { - return viewOCGeneratorResponses(c) + return viewOCGeneratorResponses(c) }) authRoute.post("/oc-generator/delete", async (c) => { - return deleteOCGeneratorResponse(c) + return deleteOCGeneratorResponse(c) }) authRoute.get("/validate", async (c) => { - return validate(c) + return validate(c) }) authRoute.post("/logout", async (c) => { - return logout(c) + return logout(c) }) export default authRoute diff --git a/src/v2/routes/auth/login.ts b/src/v2/routes/auth/login.ts index 85b5066..7def8cb 100644 --- a/src/v2/routes/auth/login.ts +++ b/src/v2/routes/auth/login.ts @@ -2,78 +2,78 @@ import { auth } from "@/v2/lib/auth/lucia" import type { APIContext as Context } from "@/worker-configuration" const usernameThrottling = new Map< - string, - { - timeoutUntil: number - timeoutSeconds: number - } + string, + { + timeoutUntil: number + timeoutSeconds: number + } >() export async function login(c: Context): Promise { - const formData = await c.req.formData() + const formData = await c.req.formData() - const username = formData.get("username") as string - const password = formData.get("password") as string - const validSession = await auth(c.env).handleRequest(c).validate() + const username = formData.get("username") as string + const password = formData.get("password") as string + const validSession = await auth(c.env).handleRequest(c).validate() - if (validSession) - return c.json({ success: false, state: "already logged in" }, 200) + if (validSession) + return c.json({ success: false, state: "already logged in" }, 200) - const storedThrottling = usernameThrottling.get(username) - const timeoutUntil = storedThrottling?.timeoutUntil ?? 0 + const storedThrottling = usernameThrottling.get(username) + const timeoutUntil = storedThrottling?.timeoutUntil ?? 0 - if (timeoutUntil > Date.now()) { - return c.json( - { - success: false, - status: "error", - error: `Too many login attempts - wait ${ - (timeoutUntil - Date.now()) / 1000 - } seconds`, - }, - 400 - ) - } + if (timeoutUntil > Date.now()) { + return c.json( + { + success: false, + status: "error", + error: `Too many login attempts - wait ${ + (timeoutUntil - Date.now()) / 1000 + } seconds`, + }, + 400 + ) + } - const user = await auth(c.env).useKey( - "username", - username.toLowerCase(), - password - ) + const user = await auth(c.env).useKey( + "username", + username.toLowerCase(), + password + ) - if (!user) { - const timeoutSeconds = storedThrottling - ? storedThrottling.timeoutSeconds * 2 - : 1 - usernameThrottling.set(username, { - timeoutUntil: Date.now() + timeoutSeconds * 1000, - timeoutSeconds, - }) - return c.json( - { - success: false, - status: "error", - error: `Invalid credentials - wait ${timeoutSeconds} seconds`, - }, - 400 - ) - } + if (!user) { + const timeoutSeconds = storedThrottling + ? storedThrottling.timeoutSeconds * 2 + : 1 + usernameThrottling.set(username, { + timeoutUntil: Date.now() + timeoutSeconds * 1000, + timeoutSeconds, + }) + return c.json( + { + success: false, + status: "error", + error: `Invalid credentials - wait ${timeoutSeconds} seconds`, + }, + 400 + ) + } - const userAgent = c.req.headers.get("user-agent") ?? "" - const countryCode = c.req.headers.get("cf-ipcountry") ?? "" + const userAgent = c.req.headers.get("user-agent") ?? "" + const countryCode = c.req.headers.get("cf-ipcountry") ?? "" - const newSession = await auth(c.env).createSession({ - userId: user.userId, - attributes: { - country_code: countryCode, - user_agent: userAgent, - }, - }) + const newSession = await auth(c.env).createSession({ + userId: user.userId, + attributes: { + country_code: countryCode, + user_agent: userAgent, + }, + }) - console.log("valid session created", countryCode, userAgent) + console.log("valid session created", countryCode, userAgent) - const authRequest = await auth(c.env).handleRequest(c) - authRequest.setSession(newSession) + const authRequest = await auth(c.env).handleRequest(c) + authRequest.setSession(newSession) - return c.json({ success: true, state: "logged in" }, 200) + return c.json({ success: true, state: "logged in" }, 200) } diff --git a/src/v2/routes/auth/logout.ts b/src/v2/routes/auth/logout.ts index 0a149f7..4bd181b 100644 --- a/src/v2/routes/auth/logout.ts +++ b/src/v2/routes/auth/logout.ts @@ -2,17 +2,17 @@ import { auth } from "@/v2/lib/auth/lucia" import type { APIContext as Context } from "@/worker-configuration" export async function logout(c: Context): Promise { - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() - if (!session) { - return c.json({ success: false, state: "invalid session" }, 200) - } + if (!session) { + return c.json({ success: false, state: "invalid session" }, 200) + } - // this is useful to clean up dead sessions that are still in the database - await auth(c.env).deleteDeadUserSessions(session.userId) - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) + // this is useful to clean up dead sessions that are still in the database + await auth(c.env).deleteDeadUserSessions(session.userId) + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) - return c.json({ success: true, state: "logged out" }, 200) + return c.json({ success: true, state: "logged out" }, 200) } diff --git a/src/v2/routes/auth/oc-generators/deleteOCGeneratorResponse.ts b/src/v2/routes/auth/oc-generators/deleteOCGeneratorResponse.ts index ac1e1af..bb2ad50 100644 --- a/src/v2/routes/auth/oc-generators/deleteOCGeneratorResponse.ts +++ b/src/v2/routes/auth/oc-generators/deleteOCGeneratorResponse.ts @@ -5,56 +5,56 @@ import { getConnection } from "@/v2/db/turso" import { eq, and } from "drizzle-orm" export async function deleteOCGeneratorResponse(c: Context): Promise { - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle" || session.state === "invalid") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "invalid session" }, 200) - } - - const drizzle = await getConnection(c.env).drizzle - - const formData = await c.req.formData() - const deleteID = (formData.get("deleteID") as string) || null - - if (!formData || !deleteID) - return c.json({ success: false, state: "no formdata provided" }) - - const ocGeneratorResponse = await drizzle - .select() - .from(savedOcGenerators) - .where( - and( - eq(savedOcGenerators.id, deleteID), - eq(savedOcGenerators.userId, session.userId) - ) - ) - - if (!ocGeneratorResponse) - return c.json({ - success: false, - state: "no generator found matching id", - }) - - await drizzle - .delete(savedOcGenerators) - .where( - and( - eq(savedOcGenerators.id, deleteID), - eq(savedOcGenerators.userId, session.userId) - ) - ) - - return c.json( - { - success: true, - state: `deleted saved oc generator with id ${deleteID}`, - ocGeneratorResponse, - }, - 200 - ) + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() + + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + return c.json({ success: false, state: "invalid session" }, 200) + } + + const drizzle = await getConnection(c.env).drizzle + + const formData = await c.req.formData() + const deleteID = (formData.get("deleteID") as string) || null + + if (!formData || !deleteID) + return c.json({ success: false, state: "no formdata provided" }) + + const ocGeneratorResponse = await drizzle + .select() + .from(savedOcGenerators) + .where( + and( + eq(savedOcGenerators.id, deleteID), + eq(savedOcGenerators.userId, session.userId) + ) + ) + + if (!ocGeneratorResponse) + return c.json({ + success: false, + state: "no generator found matching id", + }) + + await drizzle + .delete(savedOcGenerators) + .where( + and( + eq(savedOcGenerators.id, deleteID), + eq(savedOcGenerators.userId, session.userId) + ) + ) + + return c.json( + { + success: true, + state: `deleted saved oc generator with id ${deleteID}`, + ocGeneratorResponse, + }, + 200 + ) } diff --git a/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts b/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts index e9aeea4..3fcd60d 100644 --- a/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts +++ b/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts @@ -4,32 +4,32 @@ import { savedOcGenerators } from "@/v2/db/schema" import { getConnection } from "@/v2/db/turso" export async function saveOCGeneratorResponse(c: Context): Promise { - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "invalid session" }, 200) - } + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + return c.json({ success: false, state: "invalid session" }, 200) + } - const drizzle = await getConnection(c.env).drizzle + const drizzle = await getConnection(c.env).drizzle - const formData = await c.req.formData() + const formData = await c.req.formData() - // TODO: make sure data is actually valid before inserting it into the database - const ocGeneratorResponse = { - id: crypto.randomUUID(), - userId: session.userId as string, - name: formData.get("name") as string, - game: formData.get("game") as string, - isPublic: parseInt(formData.get("isPublic") as string), // 1 = yes, 0 = no, default = 0 - content: formData.get("content") as string, // this is stored as json, which can then be parsed - } + // TODO: make sure data is actually valid before inserting it into the database + const ocGeneratorResponse = { + id: crypto.randomUUID(), + userId: session.userId as string, + name: formData.get("name") as string, + game: formData.get("game") as string, + isPublic: parseInt(formData.get("isPublic") as string), // 1 = yes, 0 = no, default = 0 + content: formData.get("content") as string, // this is stored as json, which can then be parsed + } - await drizzle.insert(savedOcGenerators).values(ocGeneratorResponse) + await drizzle.insert(savedOcGenerators).values(ocGeneratorResponse) - return c.json({ success: true, state: "saved", ocGeneratorResponse }, 200) + return c.json({ success: true, state: "saved", ocGeneratorResponse }, 200) } diff --git a/src/v2/routes/auth/oc-generators/viewOCGeneratorResponses.ts b/src/v2/routes/auth/oc-generators/viewOCGeneratorResponses.ts index 2f7a3c2..2835038 100644 --- a/src/v2/routes/auth/oc-generators/viewOCGeneratorResponses.ts +++ b/src/v2/routes/auth/oc-generators/viewOCGeneratorResponses.ts @@ -5,26 +5,26 @@ import { getConnection } from "@/v2/db/turso" import { eq } from "drizzle-orm" export async function viewOCGeneratorResponses(c: Context): Promise { - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "invalid session" }, 200) - } + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + return c.json({ success: false, state: "invalid session" }, 200) + } - const drizzle = await getConnection(c.env).drizzle + const drizzle = await getConnection(c.env).drizzle - const ocGeneratorResponses = await drizzle - .select() - .from(savedOcGenerators) - .where(eq(savedOcGenerators.userId, session.userId)) + const ocGeneratorResponses = await drizzle + .select() + .from(savedOcGenerators) + .where(eq(savedOcGenerators.userId, session.userId)) - return c.json( - { success: true, state: "valid session", ocGeneratorResponses }, - 200 - ) + return c.json( + { success: true, state: "valid session", ocGeneratorResponses }, + 200 + ) } diff --git a/src/v2/routes/auth/signup.ts b/src/v2/routes/auth/signup.ts index 1cfa9ad..522540e 100644 --- a/src/v2/routes/auth/signup.ts +++ b/src/v2/routes/auth/signup.ts @@ -3,84 +3,84 @@ import type { APIContext as Context } from "@/worker-configuration" // import * as validate from "@/v2/lib/regex/accountValidation"; export async function signup(c: Context): Promise { - const formData = await c.req.formData() + const formData = await c.req.formData() - const secretKeyRequiredForSignup = c.env.VERY_SECRET_SIGNUP_KEY + const secretKeyRequiredForSignup = c.env.VERY_SECRET_SIGNUP_KEY - const username = formData.get("username") as string - const email = formData.get("email") as string - const password = formData.get("password") as string - const passwordConfirm = formData.get("passwordConfirm") as string - const secretKey = formData.get("secretKey") as string + const username = formData.get("username") as string + const email = formData.get("email") as string + const password = formData.get("password") as string + const passwordConfirm = formData.get("passwordConfirm") as string + const secretKey = formData.get("secretKey") as string - const validSession = await auth(c.env).handleRequest(c).validate() - if (validSession) - return c.json({ success: false, state: "already logged in" }, 200) + const validSession = await auth(c.env).handleRequest(c).validate() + if (validSession) + return c.json({ success: false, state: "already logged in" }, 200) - if ( - secretKeyRequiredForSignup !== secretKey || - passwordConfirm !== password - ) { - return c.json( - { - success: false, - status: "error", - error: "Invalid credentials", - }, - 400 - ) - } + if ( + secretKeyRequiredForSignup !== secretKey || + passwordConfirm !== password + ) { + return c.json( + { + success: false, + status: "error", + error: "Invalid credentials", + }, + 400 + ) + } - console.log("creating user") + console.log("creating user") - try { - const user = await auth(c.env).createUser({ - key: { - providerId: "username", - providerUserId: username.toLowerCase(), - password, - }, - attributes: { - username, - email, - email_verified: 0, - date_joined: Date.now(), - verified: 0, - role_flags: 1, - is_contributor: 0, - self_assignable_role_flags: null, - username_colour: null, - avatar_url: null, - banner_url: null, - pronouns: null, // we can splice this into possesive, subject, and object pronouns by "/", e.g "he/him/his" => {subject: "he", object: "him", possesive: "his"} - bio: "No bio set", - }, - }) + try { + const user = await auth(c.env).createUser({ + key: { + providerId: "username", + providerUserId: username.toLowerCase(), + password, + }, + attributes: { + username, + email, + email_verified: 0, + date_joined: Date.now(), + verified: 0, + role_flags: 1, + is_contributor: 0, + self_assignable_role_flags: null, + username_colour: null, + avatar_url: null, + banner_url: null, + pronouns: null, // we can splice this into possesive, subject, and object pronouns by "/", e.g "he/him/his" => {subject: "he", object: "him", possesive: "his"} + bio: "No bio set", + }, + }) - const userAgent = c.req.headers.get("user-agent") ?? "" - const countryCode = c.req.headers.get("cf-ipcountry") ?? "" + const userAgent = c.req.headers.get("user-agent") ?? "" + const countryCode = c.req.headers.get("cf-ipcountry") ?? "" - // TODO: encrypt session attributes with sha256 - const newSession = await auth(c.env).createSession({ - userId: user.userId, - attributes: { - country_code: countryCode, - user_agent: userAgent, - }, - }) + // TODO: encrypt session attributes with sha256 + const newSession = await auth(c.env).createSession({ + userId: user.userId, + attributes: { + country_code: countryCode, + user_agent: userAgent, + }, + }) - const authRequest = auth(c.env).handleRequest(c) - authRequest.setSession(newSession) - return c.json({ success: true, state: "logged in" }, 200) - } catch (e) { - console.log(e) - return c.json( - { - success: false, - status: "error", - error: "Error creating user", - }, - 500 - ) - } + const authRequest = auth(c.env).handleRequest(c) + authRequest.setSession(newSession) + return c.json({ success: true, state: "logged in" }, 200) + } catch (e) { + console.log(e) + return c.json( + { + success: false, + status: "error", + error: "Error creating user", + }, + 500 + ) + } } diff --git a/src/v2/routes/auth/user-attributes/self-upload/uploadAsset.ts b/src/v2/routes/auth/user-attributes/self-upload/uploadAsset.ts deleted file mode 100644 index 0546dc6..0000000 --- a/src/v2/routes/auth/user-attributes/self-upload/uploadAsset.ts +++ /dev/null @@ -1,114 +0,0 @@ -import { auth } from "@/v2/lib/auth/lucia" -import { getConnection } from "@/v2/db/turso" -import { eq, and } from "drizzle-orm" -import { assets } from "@/v2/db/schema" -import type { APIContext as Context } from "@/worker-configuration" - -export async function uploadAsset(c: Context): Promise { - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle" || session.state === "invalid") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "invalid session" }, 200) - } - - // return unauthorized if user is not a contributor - if (session.user.is_contributor !== 1) - return c.json({ success: false, state: "unauthorized" }, 401) - - const bypassApproval = session.user.is_contributor === 1 - - const drizzle = await getConnection(c.env).drizzle - - const formData = await c.req.formData() - const asset = formData.get("asset") as unknown as File | null - - // this is temporary - const asset128px = formData.get("asset128px") as unknown as File | null - - if ( - !asset || - asset.type !== "image/png" || - !asset128px || - asset128px.type !== "image/png" - ) { - return c.json({ success: false, state: "invalid asset" }, 200) - } - - // clear out metadata - const metadata = { - title: formData.get("title") as string, // e.g keqing - extension: formData.get("extension") as string, // e.g png - tags: formData.get("tags") as string, // e.g no-background, fanmade, official - category: formData.get("category") as string, // e.g splash-art - game: formData.get("game") as string, // e.g genshin-impact - size: formData.get("size") as unknown as number, // e.g 1024 - width: formData.get("width") as unknown as number, // e.g 1920 - height: formData.get("height") as unknown as number, // e.g 1080 - } - - const newAsset = { - name: `${metadata.title}.${metadata.extension}`, - game: metadata.game, - assetCategory: metadata.category, - tags: metadata.tags, - url: `/assets/${metadata.game}/${metadata.category}/${metadata.title}.${metadata.extension}`, - uploadedById: session.userId, - status: bypassApproval ? "approved" : "pending", - uploadedDate: new Date().getTime(), - fileSize: asset.size, // stored in bytes - width: metadata.width, - height: metadata.height, - } - - // rename file name to match metadata - const newAssetFile = new File([asset], newAsset.name, { - type: asset.type, - }) - - // check if asset already exists with same name, game, and category - const duplicateAsset = await drizzle - .select() - .from(assets) - .where( - and( - eq(assets.name, newAsset.name), - eq(assets.game, newAsset.game), - eq(assets.assetCategory, newAsset.assetCategory) - ) - ) - - if (duplicateAsset) - return c.json({ success: false, state: "duplicate asset" }, 400) - - try { - await drizzle.transaction(async () => { - await c.env.bucket.put( - `/assets/${metadata.game}/${metadata.category}/${metadata.title}.${metadata.extension}`, - newAssetFile - ) - - const newAssetClone = new File( - [asset128px], - `${metadata.title}-128.png`, - { - type: asset.type, - } - ) - - await c.env.bucket.put( - `/assets/${metadata.game}/${metadata.category}/${metadata.title}-128.png`, - newAssetClone - ) - await drizzle.insert(assets).values(newAsset) - }) - } catch (e) { - return c.json({ success: false, state: "failed to upload asset" }, 500) - } - - return c.json({ success: true, state: "uploaded asset" }, 200) -} diff --git a/src/v2/routes/auth/user-attributes/self-upload/uploadAvatar.ts b/src/v2/routes/auth/user-attributes/self-upload/uploadAvatar.ts index d5201fb..ef4b151 100644 --- a/src/v2/routes/auth/user-attributes/self-upload/uploadAvatar.ts +++ b/src/v2/routes/auth/user-attributes/self-upload/uploadAvatar.ts @@ -3,43 +3,43 @@ import type { APIContext as Context } from "@/worker-configuration" // TODO: add support for animated avatars export async function uploadProfileImage(c: Context): Promise { - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "invalid session" }, 200) - } + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + return c.json({ success: false, state: "invalid session" }, 200) + } - const formData = await c.req.formData() + const formData = await c.req.formData() - const avatar = formData.get("avatar") as unknown as File | null + const avatar = formData.get("avatar") as unknown as File | null - if (!avatar || avatar.type !== "image/png") { - return c.json({ success: false, state: "invalid avatar" }, 200) - } + if (!avatar || avatar.type !== "image/png") { + return c.json({ success: false, state: "invalid avatar" }, 200) + } - const newAvatar = new File([avatar], `${session.userId}.png`) - const newAvatarURL = `/avatars/${session.userId}.png` + const newAvatar = new File([avatar], `${session.userId}.png`) + const newAvatarURL = `/avatars/${session.userId}.png` - if (!session.user.avatar_url) { - await auth(c.env).updateUserAttributes(session.userId, { - avatar_url: newAvatarURL, - }) - } + if (!session.user.avatar_url) { + await auth(c.env).updateUserAttributes(session.userId, { + avatar_url: newAvatarURL, + }) + } - if (session.user.avatar_url) { - const oldAvatarObject = await c.env.bucket.get(session.user.avatar_url) + if (session.user.avatar_url) { + const oldAvatarObject = await c.env.bucket.get(session.user.avatar_url) - if (oldAvatarObject) { - await c.env.bucket.delete(session.user.avatar_url) - } - } + if (oldAvatarObject) { + await c.env.bucket.delete(session.user.avatar_url) + } + } - await c.env.bucket.put(newAvatarURL, newAvatar) + await c.env.bucket.put(newAvatarURL, newAvatar) - return c.json({ success: true, state: "uploaded new profile image" }, 200) + return c.json({ success: true, state: "uploaded new profile image" }, 200) } diff --git a/src/v2/routes/auth/user-attributes/self-upload/uploadBanner.ts b/src/v2/routes/auth/user-attributes/self-upload/uploadBanner.ts index 69db6a1..8238758 100644 --- a/src/v2/routes/auth/user-attributes/self-upload/uploadBanner.ts +++ b/src/v2/routes/auth/user-attributes/self-upload/uploadBanner.ts @@ -3,47 +3,47 @@ import type { APIContext as Context } from "@/worker-configuration" // TODO: add support for animated banners export async function uploadBannerImage(c: Context): Promise { - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "invalid session" }, 200) - } + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + return c.json({ success: false, state: "invalid session" }, 200) + } - if (session.user.is_contributor !== 1) { - return c.json({ success: false, state: "unauthorized" }, 401) - } + if (session.user.is_contributor !== 1) { + return c.json({ success: false, state: "unauthorized" }, 401) + } - const formData = await c.req.formData() + const formData = await c.req.formData() - const banner = formData.get("banner") as unknown as File | null + const banner = formData.get("banner") as unknown as File | null - if (!banner || banner.type !== "image/png") { - return c.json({ success: false, state: "invalid banner" }, 200) - } + if (!banner || banner.type !== "image/png") { + return c.json({ success: false, state: "invalid banner" }, 200) + } - const newBanner = new File([banner], `${session.userId}.png`) - const newBannerURL = `/banners/${session.userId}.png` + const newBanner = new File([banner], `${session.userId}.png`) + const newBannerURL = `/banners/${session.userId}.png` - if (!session.user.banner_url) { - await auth(c.env).updateUserAttributes(session.userId, { - banner_url: newBannerURL, - }) - } + if (!session.user.banner_url) { + await auth(c.env).updateUserAttributes(session.userId, { + banner_url: newBannerURL, + }) + } - if (session.user.banner_url) { - const oldBannerObject = await c.env.bucket.get(session.user.banner_url) + if (session.user.banner_url) { + const oldBannerObject = await c.env.bucket.get(session.user.banner_url) - if (oldBannerObject) { - await c.env.bucket.delete(session.user.banner_url) - } - } + if (oldBannerObject) { + await c.env.bucket.delete(session.user.banner_url) + } + } - await c.env.bucket.put(newBannerURL, newBanner) + await c.env.bucket.put(newBannerURL, newBanner) - return c.json({ success: true, state: "uploaded new banner" }, 200) + return c.json({ success: true, state: "uploaded new banner" }, 200) } diff --git a/src/v2/routes/auth/user-attributes/updateUserAttributes.ts b/src/v2/routes/auth/user-attributes/updateUserAttributes.ts index 6792ccf..726737b 100644 --- a/src/v2/routes/auth/user-attributes/updateUserAttributes.ts +++ b/src/v2/routes/auth/user-attributes/updateUserAttributes.ts @@ -2,37 +2,37 @@ import { auth } from "@/v2/lib/auth/lucia" import type { APIContext as Context } from "@/worker-configuration" export async function updateUserAttributes(c: Context): Promise { - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "invalid session" }, 200) - } + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + return c.json({ success: false, state: "invalid session" }, 200) + } - const formData = await c.req.formData() + const formData = await c.req.formData() - const attributes = { - username: formData.get("username") as string | null, - pronouns: formData.get("pronouns") as string | null, - self_assignable_role_flags: formData.get( - "self_assignable_roles" - ) as unknown as number | null, - bio: formData.get("bio") as string | null, - } + const attributes = { + username: formData.get("username") as string | null, + pronouns: formData.get("pronouns") as string | null, + self_assignable_role_flags: formData.get( + "self_assignable_roles" + ) as unknown as number | null, + bio: formData.get("bio") as string | null, + } - // remove null values from attributes - Object.keys(attributes).forEach((key) => { - if (attributes[key] === null) delete attributes[key] - }) + // remove null values from attributes + Object.keys(attributes).forEach((key) => { + if (attributes[key] === null) delete attributes[key] + }) - await auth(c.env).updateUserAttributes(session.userId, attributes) + await auth(c.env).updateUserAttributes(session.userId, attributes) - return c.json( - { success: true, state: "updated user attributes", session }, - 200 - ) + return c.json( + { success: true, state: "updated user attributes", session }, + 200 + ) } diff --git a/src/v2/routes/auth/validate.ts b/src/v2/routes/auth/validate.ts index f75bf60..a0c4a66 100644 --- a/src/v2/routes/auth/validate.ts +++ b/src/v2/routes/auth/validate.ts @@ -2,33 +2,33 @@ import { auth } from "@/v2/lib/auth/lucia" import type { APIContext as Context } from "@/worker-configuration" export async function validate(c: Context): Promise { - console.log(c) - const authRequest = auth(c.env).handleRequest(c) + console.log(c) + const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() + const session = await authRequest.validate() - const countryCode = c.req.headers.get("cf-ipcountry") ?? "" - const userAgent = c.req.headers.get("user-agent") ?? "" + const countryCode = c.req.headers.get("cf-ipcountry") ?? "" + const userAgent = c.req.headers.get("user-agent") ?? "" - if (!session) { - authRequest.setSession(null) - return c.json({ success: false, state: "invalid session" }, 200) - } + if (!session) { + authRequest.setSession(null) + return c.json({ success: false, state: "invalid session" }, 200) + } - if ( - session.userAgent !== userAgent || - session.countryCode !== countryCode - ) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - return c.json({ success: false, state: "invalid session" }, 200) - } + if ( + session.userAgent !== userAgent || + session.countryCode !== countryCode + ) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + return c.json({ success: false, state: "invalid session" }, 200) + } - if (session.state === "idle") { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - return c.json({ success: false, state: "invalid session" }, 200) - } + if (session.state === "idle") { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + return c.json({ success: false, state: "invalid session" }, 200) + } - return c.json({ success: true, state: "valid session", session }, 200) + return c.json({ success: true, state: "valid session", session }, 200) } diff --git a/src/v2/routes/discord/contributors.ts b/src/v2/routes/discord/contributors.ts index 958dace..3c09951 100644 --- a/src/v2/routes/discord/contributors.ts +++ b/src/v2/routes/discord/contributors.ts @@ -5,65 +5,65 @@ import type { APIContext as Context } from "@/worker-configuration" // TODO: replace discord contributors with roles on the site export async function contributors(c: Context): Promise { - const members: Contributor[] = [] + const members: Contributor[] = [] - let after: string | null = null - let fetchUsers = true + let after: string | null = null + let fetchUsers = true - while (fetchUsers) { - const response = await fetch( - `https://discord.com/api/guilds/${guildId}/members?limit=1000${ - after ? `&after=${after}` : "" - }`, - { - headers: { - Authorization: `Bot ${c.env.DISCORD_TOKEN}`, - }, - } - ) + while (fetchUsers) { + const response = await fetch( + `https://discord.com/api/guilds/${guildId}/members?limit=1000${ + after ? `&after=${after}` : "" + }`, + { + headers: { + Authorization: `Bot ${c.env.DISCORD_TOKEN}`, + }, + } + ) - const guildMembers: GuildMember[] = await response.json() + const guildMembers: GuildMember[] = await response.json() - const filteredMembers: GuildMember[] = guildMembers.filter((member) => { - return member.roles.some((role) => - Object.keys(roles).includes(role) - ) - }) + const filteredMembers: GuildMember[] = guildMembers.filter((member) => { + return member.roles.some((role) => + Object.keys(roles).includes(role) + ) + }) - const contributors: Contributor[] = filteredMembers.map((member) => { - const rolesArray = member.roles - .map((role) => roles[role]) - .filter((role) => role) + const contributors: Contributor[] = filteredMembers.map((member) => { + const rolesArray = member.roles + .map((role) => roles[role]) + .filter((role) => role) - // TODO: support animated avatars - return { - id: member.user.id, - username: member.user.username, - globalname: member.user.global_name || null, - avatar: `https://cdn.discordapp.com/avatars/${member.user.id}/${member.user.avatar}.webp`, - roles: rolesArray, - } - }) + // TODO: support animated avatars + return { + id: member.user.id, + username: member.user.username, + globalname: member.user.global_name || null, + avatar: `https://cdn.discordapp.com/avatars/${member.user.id}/${member.user.avatar}.webp`, + roles: rolesArray, + } + }) - members.push(...contributors) + members.push(...contributors) - if ( - !guildMembers.length || - !guildMembers[guildMembers.length - 1].user - ) { - fetchUsers = false - } + if ( + !guildMembers.length || + !guildMembers[guildMembers.length - 1].user + ) { + fetchUsers = false + } - after = guildMembers[guildMembers.length - 1]?.user?.id - } + after = guildMembers[guildMembers.length - 1]?.user?.id + } - return c.json( - { - success: true, - status: "ok", - contributors: members, - }, - 200, - responseHeaders - ) + return c.json( + { + success: true, + status: "ok", + contributors: members, + }, + 200, + responseHeaders + ) } diff --git a/src/v2/routes/discord/discordRoute.ts b/src/v2/routes/discord/discordRoute.ts index 64acdbc..05b9bd5 100644 --- a/src/v2/routes/discord/discordRoute.ts +++ b/src/v2/routes/discord/discordRoute.ts @@ -5,7 +5,7 @@ import { Bindings } from "@/worker-configuration" const discordRoute = new Hono<{ Bindings: Bindings }>() discordRoute.get("/contributors", async (c) => { - return contributors(c) + return contributors(c) }) export default discordRoute diff --git a/src/v2/routes/games/allGames.ts b/src/v2/routes/games/allGames.ts index b4f6adc..c1132f8 100644 --- a/src/v2/routes/games/allGames.ts +++ b/src/v2/routes/games/allGames.ts @@ -5,51 +5,51 @@ import { games } from "@/v2/db/schema" import type { APIContext as Context } from "@/worker-configuration" export async function getAllGames(c: Context): Promise { - const cacheKey = new Request(c.req.url.toString(), c.req) - const cache = caches.default - let response = await cache.match(cacheKey) - - if (response) return response - - const files = await listBucket(c.env.bucket, { - prefix: "oc-generators/", - delimiter: "/", - }) - - const results = files.delimitedPrefixes.map((file) => { - return { - name: file.replace("oc-generators/", "").replace("/", ""), - } - }) - - const conn = await getConnection(c.env) - const { drizzle } = conn - - const gamesList = await drizzle - .select() - .from(games) - .execute() - .then((row) => - row.map((game) => ({ - ...game, - has_generator: results.some( - (generator) => generator.name === game.name - ), - })) - ) - - response = c.json( - { - success: true, - status: "ok", - results: gamesList, - }, - 200, - responseHeaders - ) - - response.headers.set("Cache-Control", "s-maxage=1200") - await cache.put(cacheKey, response.clone()) - - return response + const cacheKey = new Request(c.req.url.toString(), c.req) + const cache = caches.default + let response = await cache.match(cacheKey) + + if (response) return response + + const files = await listBucket(c.env.bucket, { + prefix: "oc-generators/", + delimiter: "/", + }) + + const results = files.delimitedPrefixes.map((file) => { + return { + name: file.replace("oc-generators/", "").replace("/", ""), + } + }) + + const conn = await getConnection(c.env) + const { drizzle } = conn + + const gamesList = await drizzle + .select() + .from(games) + .execute() + .then((row) => + row.map((game) => ({ + ...game, + has_generator: results.some( + (generator) => generator.name === game.name + ), + })) + ) + + response = c.json( + { + success: true, + status: "ok", + results: gamesList, + }, + 200, + responseHeaders + ) + + response.headers.set("Cache-Control", "s-maxage=1200") + await cache.put(cacheKey, response.clone()) + + return response } diff --git a/src/v2/routes/games/gamesRoute.ts b/src/v2/routes/games/gamesRoute.ts index c2284ed..d11f0f8 100644 --- a/src/v2/routes/games/gamesRoute.ts +++ b/src/v2/routes/games/gamesRoute.ts @@ -5,7 +5,7 @@ import { Bindings } from "@/worker-configuration" const gamesRoute = new Hono<{ Bindings: Bindings }>() gamesRoute.get("/all", async (c) => { - return getAllGames(c) + return getAllGames(c) }) export default gamesRoute diff --git a/src/v2/routes/oc-generators/getGenerator.ts b/src/v2/routes/oc-generators/getGenerator.ts index 73b4039..b19dafc 100644 --- a/src/v2/routes/oc-generators/getGenerator.ts +++ b/src/v2/routes/oc-generators/getGenerator.ts @@ -4,37 +4,37 @@ import { createNotFoundResponse } from "@/v2/lib/helpers/responses/notFoundRespo import type { APIContext as Context } from "@/worker-configuration" export async function getGeneratorFromName(c: Context): Promise { - const { gameName } = c.req.param() - const cacheKey = new Request(c.req.url.toString(), c.req) - const cache = caches.default - let response = await cache.match(cacheKey) + const { gameName } = c.req.param() + const cacheKey = new Request(c.req.url.toString(), c.req) + const cache = caches.default + let response = await cache.match(cacheKey) - if (response) return response + if (response) return response - const files = await listBucket(c.env.bucket, { - prefix: `oc-generators/${gameName}/list.json`, - }) + const files = await listBucket(c.env.bucket, { + prefix: `oc-generators/${gameName}/list.json`, + }) - if (files.objects.length === 0) - return createNotFoundResponse(c, "Generator not found", responseHeaders) + if (files.objects.length === 0) + return createNotFoundResponse(c, "Generator not found", responseHeaders) - const data = await fetch( - `https://files.wanderer.moe/${files.objects[0].key}` - ) + const data = await fetch( + `https://files.wanderer.moe/${files.objects[0].key}` + ) - const generatorData = await data.json() + const generatorData = await data.json() - response = c.json( - { - status: "ok", - data: generatorData, - }, - 200, - responseHeaders - ) + response = c.json( + { + status: "ok", + data: generatorData, + }, + 200, + responseHeaders + ) - response.headers.set("Cache-Control", "s-maxage=604800") // the content of this file is unlikely to change, so caching is fine - await cache.put(cacheKey, response.clone()) + response.headers.set("Cache-Control", "s-maxage=604800") // the content of this file is unlikely to change, so caching is fine + await cache.put(cacheKey, response.clone()) - return response + return response } diff --git a/src/v2/routes/oc-generators/getGenerators.ts b/src/v2/routes/oc-generators/getGenerators.ts index 18f5d32..8c50d6b 100644 --- a/src/v2/routes/oc-generators/getGenerators.ts +++ b/src/v2/routes/oc-generators/getGenerators.ts @@ -3,41 +3,41 @@ import { listBucket } from "@/v2/lib/listBucket" import type { APIContext as Context } from "@/worker-configuration" export async function getGenerators(c: Context): Promise { - const cacheKey = new Request(c.req.url.toString(), c.req) - const cache = caches.default - let response = await cache.match(cacheKey) - - if (response) return response - - // listing all files inside of oc-generators subfolder, as they can't be manually inputted - // by users but instead stored on the oc-generators repo which is synced with R2 bucket - const files = await listBucket(c.env.bucket, { - prefix: "oc-generators/", - delimiter: "/", - }) - - // console.log(files); - - const results = files.delimitedPrefixes.map((file) => { - return { - name: file.replace("oc-generators/", "").replace("/", ""), - path: `/oc-generators/${file - .replace("oc-generators/", "") - .replace("/", "")}`, - } - }) - - response = c.json( - { - status: "ok", - data: results, - }, - 200, - responseHeaders - ) - - response.headers.set("Cache-Control", "s-maxage=28800") - await cache.put(cacheKey, response.clone()) - - return response + const cacheKey = new Request(c.req.url.toString(), c.req) + const cache = caches.default + let response = await cache.match(cacheKey) + + if (response) return response + + // listing all files inside of oc-generators subfolder, as they can't be manually inputted + // by users but instead stored on the oc-generators repo which is synced with R2 bucket + const files = await listBucket(c.env.bucket, { + prefix: "oc-generators/", + delimiter: "/", + }) + + // console.log(files); + + const results = files.delimitedPrefixes.map((file) => { + return { + name: file.replace("oc-generators/", "").replace("/", ""), + path: `/oc-generators/${file + .replace("oc-generators/", "") + .replace("/", "")}`, + } + }) + + response = c.json( + { + status: "ok", + data: results, + }, + 200, + responseHeaders + ) + + response.headers.set("Cache-Control", "s-maxage=28800") + await cache.put(cacheKey, response.clone()) + + return response } diff --git a/src/v2/routes/oc-generators/ocGeneratorRoutes.ts b/src/v2/routes/oc-generators/ocGeneratorRoutes.ts index 9479b26..c61daf1 100644 --- a/src/v2/routes/oc-generators/ocGeneratorRoutes.ts +++ b/src/v2/routes/oc-generators/ocGeneratorRoutes.ts @@ -6,11 +6,11 @@ import { Bindings } from "@/worker-configuration" const ocGeneratorRoute = new Hono<{ Bindings: Bindings }>() ocGeneratorRoute.get("/", async (c) => { - return getGenerators(c) + return getGenerators(c) }) ocGeneratorRoute.get("/:gameName", async (c) => { - return getGeneratorFromName(c) + return getGeneratorFromName(c) }) export default ocGeneratorRoute diff --git a/src/v2/routes/search/all/searchAll.ts b/src/v2/routes/search/all/searchAll.ts index 89efb1a..6421f82 100644 --- a/src/v2/routes/search/all/searchAll.ts +++ b/src/v2/routes/search/all/searchAll.ts @@ -4,108 +4,108 @@ import type { APIContext as Context } from "@/worker-configuration" import { like, and, eq, not, or } from "drizzle-orm" import { auth } from "@/v2/lib/auth/lucia" import { - users, - assets, - games, - assetCategories, - assetTags, - savedOcGenerators, - collections, + users, + assets, + games, + assetCategories, + assetTags, + savedOcGenerators, + collections, } from "@/v2/db/schema" export async function searchAll(c: Context): Promise { - const { query } = c.req.param() - const cacheKey = new Request(c.req.url.toString(), c.req) - const cache = caches.default - let response = await cache.match(cacheKey) + const { query } = c.req.param() + const cacheKey = new Request(c.req.url.toString(), c.req) + const cache = caches.default + let response = await cache.match(cacheKey) - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - } + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + } - if (response) return response - const drizzle = await getConnection(c.env).drizzle + if (response) return response + const drizzle = await getConnection(c.env).drizzle - // https://cdn.discordapp.com/attachments/1102306276832202813/1147291827699986572/F.gif - const usersResponse = await drizzle - .select() - .from(users) - .where(like(users.username, `%${query}%`)) - .execute() - const assetsResponse = await drizzle - .select() - .from(assets) - .where(like(assets.name, `%${query}%`)) - .execute() - const assetCategoryResponse = await drizzle - .select() - .from(assetCategories) - .where(like(assetCategories.name, `%${query}%`)) - .execute() - const assetTagsResponse = await drizzle - .select() - .from(assetTags) - .where(like(assetTags.name, `%${query}%`)) - .execute() - const gamesResponse = await drizzle - .select() - .from(games) - .where(like(games.name, `%${query}%`)) - .execute() - const savedOcGeneratorsResponse = await drizzle - .select() - .from(savedOcGenerators) - .where( - and( - or( - eq(savedOcGenerators.userId, session.userId), - not(eq(savedOcGenerators.isPublic, 0)) - ), - like(savedOcGenerators.name, `%${query}%`) - ) - ) - .execute() - const collectionsResponse = await drizzle - .select() - .from(collections) - .where( - and( - or( - eq(collections.userId, session.userId), - not(eq(collections.isPublic, 0)) - ), - like(collections.name, `%${query}%`) - ) - ) - .execute() + // https://cdn.discordapp.com/attachments/1102306276832202813/1147291827699986572/F.gif + const usersResponse = await drizzle + .select() + .from(users) + .where(like(users.username, `%${query}%`)) + .execute() + const assetsResponse = await drizzle + .select() + .from(assets) + .where(like(assets.name, `%${query}%`)) + .execute() + const assetCategoryResponse = await drizzle + .select() + .from(assetCategories) + .where(like(assetCategories.name, `%${query}%`)) + .execute() + const assetTagsResponse = await drizzle + .select() + .from(assetTags) + .where(like(assetTags.name, `%${query}%`)) + .execute() + const gamesResponse = await drizzle + .select() + .from(games) + .where(like(games.name, `%${query}%`)) + .execute() + const savedOcGeneratorsResponse = await drizzle + .select() + .from(savedOcGenerators) + .where( + and( + or( + eq(savedOcGenerators.userId, session.userId), + not(eq(savedOcGenerators.isPublic, 0)) + ), + like(savedOcGenerators.name, `%${query}%`) + ) + ) + .execute() + const collectionsResponse = await drizzle + .select() + .from(collections) + .where( + and( + or( + eq(collections.userId, session.userId), + not(eq(collections.isPublic, 0)) + ), + like(collections.name, `%${query}%`) + ) + ) + .execute() - response = c.json( - { - success: true, - status: "ok", - query, - isAuthed: session.userId ? true : false, - results: { - usersResponse, - assetsResponse, - assetCategoryResponse, - assetTagsResponse, - savedOcGeneratorsResponse, - gamesResponse, - collectionsResponse, - }, - }, - 200, - responseHeaders - ) + response = c.json( + { + success: true, + status: "ok", + query, + isAuthed: session.userId ? true : false, + results: { + usersResponse, + assetsResponse, + assetCategoryResponse, + assetTagsResponse, + savedOcGeneratorsResponse, + gamesResponse, + collectionsResponse, + }, + }, + 200, + responseHeaders + ) - response.headers.set("Cache-Control", "s-maxage=60") - await cache.put(cacheKey, response.clone()) - return response + response.headers.set("Cache-Control", "s-maxage=60") + await cache.put(cacheKey, response.clone()) + return response } diff --git a/src/v2/routes/search/searchRoute.ts b/src/v2/routes/search/searchRoute.ts index 2401625..22f03d7 100644 --- a/src/v2/routes/search/searchRoute.ts +++ b/src/v2/routes/search/searchRoute.ts @@ -9,23 +9,23 @@ import { cors } from "hono/cors" const searchRoute = new Hono<{ Bindings: Bindings }>() searchRoute.get("/all", async (c) => { - return searchAll(c) + return searchAll(c) }) authRoute.use( - "/all", - cors({ - credentials: true, - origin: ["https://next.wanderer.moe"], - }) + "/all", + cors({ + credentials: true, + origin: ["https://next.wanderer.moe"], + }) ) searchRoute.get("/users/user/:username", async (c) => { - return getUserByUsername(c) + return getUserByUsername(c) }) searchRoute.get("/users/query/:query", async (c) => { - return getUsersBySearch(c) + return getUsersBySearch(c) }) export default searchRoute diff --git a/src/v2/routes/search/user/getUserByUsername.ts b/src/v2/routes/search/user/getUserByUsername.ts index 0c17473..d82cfa3 100644 --- a/src/v2/routes/search/user/getUserByUsername.ts +++ b/src/v2/routes/search/user/getUserByUsername.ts @@ -4,41 +4,41 @@ import { createNotFoundResponse } from "@/v2/lib/helpers/responses/notFoundRespo import type { APIContext as Context } from "@/worker-configuration" export async function getUserByUsername(c: Context): Promise { - const { username } = c.req.param() - const cacheKey = new Request(c.req.url.toString(), c.req) - const cache = caches.default - let response = await cache.match(cacheKey) - - if (response) return response - - const drizzle = await getConnection(c.env).drizzle - - const user = await drizzle.query.users.findFirst({ - where: (users, { eq }) => eq(user.username, username), - }) - - if (!user) { - response = createNotFoundResponse(c, "User not found", responseHeaders) - await cache.put(cacheKey, response.clone()) - return response - } - - // removing email-related fields - user.email = undefined - user.emailVerified = undefined - - response = c.json( - { - success: true, - status: "ok", - user, - }, - 200, - responseHeaders - ) - - response.headers.set("Cache-Control", "s-maxage=300") - await cache.put(cacheKey, response.clone()) - - return response + const { username } = c.req.param() + const cacheKey = new Request(c.req.url.toString(), c.req) + const cache = caches.default + let response = await cache.match(cacheKey) + + if (response) return response + + const drizzle = await getConnection(c.env).drizzle + + const user = await drizzle.query.users.findFirst({ + where: (users, { eq }) => eq(user.username, username), + }) + + if (!user) { + response = createNotFoundResponse(c, "User not found", responseHeaders) + await cache.put(cacheKey, response.clone()) + return response + } + + // removing email-related fields + user.email = undefined + user.emailVerified = undefined + + response = c.json( + { + success: true, + status: "ok", + user, + }, + 200, + responseHeaders + ) + + response.headers.set("Cache-Control", "s-maxage=300") + await cache.put(cacheKey, response.clone()) + + return response } diff --git a/src/v2/routes/search/user/getUsersBySearch.ts b/src/v2/routes/search/user/getUsersBySearch.ts index 41a901b..dd979f8 100644 --- a/src/v2/routes/search/user/getUsersBySearch.ts +++ b/src/v2/routes/search/user/getUsersBySearch.ts @@ -6,37 +6,37 @@ import { users } from "@/v2/db/schema" import type { APIContext as Context } from "@/worker-configuration" export async function getUsersBySearch(c: Context): Promise { - const cacheKey = new Request(c.req.url.toString(), c.req) - const cache = caches.default - let response = await cache.match(cacheKey) - if (response) return response + const cacheKey = new Request(c.req.url.toString(), c.req) + const cache = caches.default + let response = await cache.match(cacheKey) + if (response) return response - const { query } = c.req.param() - const drizzle = await getConnection(c.env).drizzle + const { query } = c.req.param() + const drizzle = await getConnection(c.env).drizzle - const userList = await drizzle - .select() - .from(users) - .where(like(users.username, `%${query}%`)) - .execute() + const userList = await drizzle + .select() + .from(users) + .where(like(users.username, `%${query}%`)) + .execute() - if (!userList) { - return createNotFoundResponse(c, "Users not found", responseHeaders) - } + if (!userList) { + return createNotFoundResponse(c, "Users not found", responseHeaders) + } - response = c.json( - { - success: true, - status: "ok", - query, - results: userList, - }, - 200, - responseHeaders - ) + response = c.json( + { + success: true, + status: "ok", + query, + results: userList, + }, + 200, + responseHeaders + ) - response.headers.set("Cache-Control", "s-maxage=60") - await cache.put(cacheKey, response.clone()) + response.headers.set("Cache-Control", "s-maxage=60") + await cache.put(cacheKey, response.clone()) - return response + return response } diff --git a/src/worker-configuration.d.ts b/src/worker-configuration.d.ts index 4427870..12df54b 100644 --- a/src/worker-configuration.d.ts +++ b/src/worker-configuration.d.ts @@ -1,12 +1,12 @@ import type { Context } from "hono" export type Bindings = { - DISCORD_TOKEN: string - bucket: R2Bucket - ENVIRONMENT: string - VERY_SECRET_SIGNUP_KEY: string - TURSO_DATABASE_URL: string - TURSO_DATABASE_AUTH_TOKEN: string + DISCORD_TOKEN: string + bucket: R2Bucket + ENVIRONMENT: string + VERY_SECRET_SIGNUP_KEY: string + TURSO_DATABASE_URL: string + TURSO_DATABASE_AUTH_TOKEN: string } // this is the onl way i could figure out how to pass bindings to all the routes diff --git a/tsconfig.json b/tsconfig.json index ee2b46a..bfffdef 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,15 +1,15 @@ { - "compilerOptions": { - "skipLibCheck": true, - "target": "es2021", - "module": "es2022", - "moduleResolution": "node", - "lib": ["es2021"], - "baseUrl": "./", - "paths": { - "@/*": ["src/*"] - }, - "types": ["@cloudflare/workers-types"] - }, - "include": ["src/**/*.ts"] + "compilerOptions": { + "skipLibCheck": true, + "target": "es2021", + "module": "es2022", + "moduleResolution": "node", + "lib": ["es2021"], + "baseUrl": "./", + "paths": { + "@/*": ["src/*"] + }, + "types": ["@cloudflare/workers-types"] + }, + "include": ["src/**/*.ts"] } From 0a3d4ec758e22990c9667d754c68455f8a2c449a Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sat, 2 Sep 2023 00:55:49 +0100 Subject: [PATCH 065/318] iter 1 multiple tags search --- src/v2/db/drizzle.ts | 1 + src/v2/db/schema.ts | 115 ++++++++++++---------- src/v2/routes/games/allGames.ts | 3 +- src/v2/routes/search/asset/searchAsset.ts | 90 +++++++++++++++++ src/v2/routes/search/asset/searchRoute.ts | 15 --- 5 files changed, 154 insertions(+), 70 deletions(-) create mode 100644 src/v2/routes/search/asset/searchAsset.ts delete mode 100644 src/v2/routes/search/asset/searchRoute.ts diff --git a/src/v2/db/drizzle.ts b/src/v2/db/drizzle.ts index 7c78ecf..6344353 100644 --- a/src/v2/db/drizzle.ts +++ b/src/v2/db/drizzle.ts @@ -9,6 +9,7 @@ export const tableNames = { gameAssetCategories: "gameAssetCategories", games: "games", assetTags: "assetTags", + assetAssetTags: "assetAssetTags", emailVerificationToken: "emailVerificationToken", passwordResetToken: "passwordResetToken", assetCategories: "assetCategories", diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index 5e72b23..0784df2 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -123,23 +123,6 @@ export const assetCategories = sqliteTable( } ) -export const assetTags = sqliteTable( - tableNames.assetTags, - { - id: text("id").primaryKey(), - name: text("name").notNull(), - formattedName: text("formatted_name").notNull(), - assetCount: integer("asset_count").default(0).notNull(), - lastUpdated: integer("last_updated").notNull(), - }, - (assetTag) => { - return { - assetTagIdx: uniqueIndex("asset_tag_idx").on(assetTag.id), - nameIdx: uniqueIndex("name_idx").on(assetTag.name), - } - } -) - export const assets = sqliteTable( tableNames.assets, { @@ -157,8 +140,6 @@ export const assets = sqliteTable( onUpdate: "cascade", onDelete: "cascade", }), - // tags can be more than one tag, where we reference the name of the tag - tags: text("tags").notNull(), url: text("url").notNull(), status: text("status").notNull(), uploadedById: text("uploaded_by").references(() => users.id, { @@ -187,14 +168,69 @@ export const assets = sqliteTable( assetCategoryIdx: uniqueIndex("assets_asset_category_idx").on( table.assetCategory ), - downloadCountIdx: uniqueIndex("assets_download_count_idx").on( - table.downloadCount - ), - statusIdx: uniqueIndex("assets_status_idx").on(table.status), - tagsIdx: uniqueIndex("assets_tags_idx").on(table.tags), - uploadedByIdx: uniqueIndex("assets_uploaded_by_idx").on( + uploadedByIdIdx: uniqueIndex("assets_uploaded_by_idx").on( table.uploadedById ), + uploadedByNameIdx: uniqueIndex("assets_uploaded_by_name_idx").on( + table.uploadedByName + ), + } + } +) + +export const assetTags = sqliteTable( + tableNames.assetTags, + { + id: text("id").primaryKey(), + name: text("name").notNull(), + formattedName: text("formatted_name").notNull(), + assetCount: integer("asset_count").default(0).notNull(), + lastUpdated: integer("last_updated").notNull(), + }, + (assetTag) => { + return { + assetTagIdx: uniqueIndex("asset_tag_idx").on(assetTag.id), + nameIdx: uniqueIndex("name_idx").on(assetTag.name), + } + } +) + +export const assetAssetTags = sqliteTable( + tableNames.assetAssetTags, + { + assetId: integer("asset_id") + .notNull() + .references(() => assets.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + assetTagId: text("asset_tag_id") + .notNull() + .references(() => assetTags.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + assetTagName: text("asset_tag_name") + .notNull() + .references(() => assetTags.name, { + onUpdate: "cascade", + onDelete: "cascade", + }), + assetTagFormattedName: text("asset_tag_formatted_name") + .notNull() + .references(() => assetTags.formattedName, { + onUpdate: "cascade", + onDelete: "cascade", + }), + }, + (assetAssetTag) => { + return { + assetIdx: uniqueIndex("asset_asset_tag_asset_idx").on( + assetAssetTag.assetId + ), + assetTagIdx: uniqueIndex("asset_asset_tag_asset_tag_idx").on( + assetAssetTag.assetTagId + ), } } ) @@ -269,32 +305,6 @@ export const collections = sqliteTable( } ) -export const collectionAssets = sqliteTable( - tableNames.assetCollectionAsset, - { - collectionId: text("collection_id") - .notNull() - .references(() => collections.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - assetId: integer("asset_id") - .notNull() - .references(() => assets.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - }, - (collectionAsset) => { - return { - collectionAssetIdx: uniqueIndex("collection_asset_idx").on( - collectionAsset.collectionId, - collectionAsset.assetId - ), - } - } -) - export const savedOcGenerators = sqliteTable( tableNames.savedOcGenerators, { @@ -339,7 +349,7 @@ export const collectionRelations = relations(collections, ({ many }) => ({ assets: many(assets), })) -export const assetRelations = relations(assets, ({ one, many }) => ({ +export const assetRelations = relations(assets, ({ one }) => ({ uploadedBy: one(users, { fields: [assets.uploadedById, assets.uploadedByName], references: [users.id, users.username], @@ -348,7 +358,6 @@ export const assetRelations = relations(assets, ({ one, many }) => ({ fields: [assets.assetCategory], references: [assetCategories.name], }), - tags: many(assetTags), game: one(games, { fields: [assets.game], references: [games.name], diff --git a/src/v2/routes/games/allGames.ts b/src/v2/routes/games/allGames.ts index c1132f8..fad0608 100644 --- a/src/v2/routes/games/allGames.ts +++ b/src/v2/routes/games/allGames.ts @@ -22,8 +22,7 @@ export async function getAllGames(c: Context): Promise { } }) - const conn = await getConnection(c.env) - const { drizzle } = conn + const drizzle = await getConnection(c.env).drizzle const gamesList = await drizzle .select() diff --git a/src/v2/routes/search/asset/searchAsset.ts b/src/v2/routes/search/asset/searchAsset.ts new file mode 100644 index 0000000..49360b2 --- /dev/null +++ b/src/v2/routes/search/asset/searchAsset.ts @@ -0,0 +1,90 @@ +import { responseHeaders } from "@/v2/lib/responseHeaders" +import { getConnection } from "@/v2/db/turso" +import { like } from "drizzle-orm" +import type { APIContext as Context } from "@/worker-configuration" + +function SplitQueryByCommas(query: string): string[] { + return query.split(",") ? query.split(",") : [query] +} + +export async function searchForAssets(c: Context): Promise { + const cacheKey = new Request(c.req.url.toString(), c.req) + const cache = caches.default + let response = await cache.match(cacheKey) + if (response) return response + + const { query, game, assetCategory, assetTags } = c.req.param() + + // search parameters can include optional search params: query, game, assetCategory, assetTags + // query?: string => ?query=keqing + // game?: comma separated list of game names => ?game=genshin-impact,honkai-impact-3rd + // assetCategory?: comma separated list of asset category names => ?assetCategory=splash-art,character-sheets + // assetTags?: comma separated list of asset tag names => ?assetTags=no-background,fanmade,official + + const drizzle = await getConnection(c.env).drizzle + + const searchQuery = query ?? null + const gameList = game ? SplitQueryByCommas(game) : null + const assetCategoryList = assetCategory + ? SplitQueryByCommas(assetCategory) + : null + + const assetResponse = await drizzle.query.assets.findMany({ + where: (assets, { and, or, eq }) => { + return and( + searchQuery ? like(assets.name, `%${searchQuery}%`) : null, + gameList + ? or(...gameList.map((game) => eq(assets.game, game))) + : null, + assetCategoryList + ? or( + ...assetCategoryList.map((assetCategory) => + eq(assets.assetCategory, assetCategory) + ) + ) + : null, + eq(assets.status, "approved") + ) + }, + }) + + let assetsWithTags = null + if (assetTags) { + const assetIds = assetResponse.map((asset) => asset.id) + + const assetTagsResponse = await drizzle.query.assetAssetTags.findMany({ + where: (assetAssetTags, { and, or, eq }) => { + return and( + or( + ...assetIds.map((assetId) => + eq(assetAssetTags.assetId, assetId) + ) + ) + ) + }, + }) + + assetsWithTags = assetResponse.map((asset) => { + const assetTags = assetTagsResponse.filter( + (assetTag) => assetTag.assetId === asset.id + ) + return { ...asset, assetTags } + }) + } + + response = c.json( + { + success: true, + status: "ok", + query, + game, + assetCategory, + assetTags, + results: assetTags ? assetsWithTags : assetResponse, + }, + 200, + responseHeaders + ) + + return response +} diff --git a/src/v2/routes/search/asset/searchRoute.ts b/src/v2/routes/search/asset/searchRoute.ts deleted file mode 100644 index 14adb04..0000000 --- a/src/v2/routes/search/asset/searchRoute.ts +++ /dev/null @@ -1,15 +0,0 @@ -// import { Hono } from "hono" -// import { getAssetSearch } from "./assetSearch" -// import { recentAssets } from "./assetSearch" - -// const assetSearchRoute = new Hono() - -// assetSearchRoute.get("/", async (c) => { -// return getAssetSearch(c) -// }) - -// assetSearchRoute.get("/recent", async (c) => { -// return recentAssets(c) -// }) - -// export default assetSearchRoute From 2ce26429d8c99176a6159bed590bca044a1e9caf Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sat, 2 Sep 2023 01:09:42 +0100 Subject: [PATCH 066/318] asset filtering in a single db query ty drizzle --- src/v2/db/schema.ts | 43 ++--------------------- src/v2/routes/search/asset/searchAsset.ts | 42 +++++++++------------- 2 files changed, 19 insertions(+), 66 deletions(-) diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index 0784df2..c9bbbad 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -195,46 +195,6 @@ export const assetTags = sqliteTable( } ) -export const assetAssetTags = sqliteTable( - tableNames.assetAssetTags, - { - assetId: integer("asset_id") - .notNull() - .references(() => assets.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - assetTagId: text("asset_tag_id") - .notNull() - .references(() => assetTags.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - assetTagName: text("asset_tag_name") - .notNull() - .references(() => assetTags.name, { - onUpdate: "cascade", - onDelete: "cascade", - }), - assetTagFormattedName: text("asset_tag_formatted_name") - .notNull() - .references(() => assetTags.formattedName, { - onUpdate: "cascade", - onDelete: "cascade", - }), - }, - (assetAssetTag) => { - return { - assetIdx: uniqueIndex("asset_asset_tag_asset_idx").on( - assetAssetTag.assetId - ), - assetTagIdx: uniqueIndex("asset_asset_tag_asset_tag_idx").on( - assetAssetTag.assetTagId - ), - } - } -) - export const following = sqliteTable( tableNames.following, { @@ -349,11 +309,12 @@ export const collectionRelations = relations(collections, ({ many }) => ({ assets: many(assets), })) -export const assetRelations = relations(assets, ({ one }) => ({ +export const assetRelations = relations(assets, ({ one, many }) => ({ uploadedBy: one(users, { fields: [assets.uploadedById, assets.uploadedByName], references: [users.id, users.username], }), + tags: many(assetTags), assetCategory: one(assetCategories, { fields: [assets.assetCategory], references: [assetCategories.name], diff --git a/src/v2/routes/search/asset/searchAsset.ts b/src/v2/routes/search/asset/searchAsset.ts index 49360b2..ea198d6 100644 --- a/src/v2/routes/search/asset/searchAsset.ts +++ b/src/v2/routes/search/asset/searchAsset.ts @@ -28,6 +28,7 @@ export async function searchForAssets(c: Context): Promise { const assetCategoryList = assetCategory ? SplitQueryByCommas(assetCategory) : null + const assetTagsList = assetTags ? SplitQueryByCommas(assetTags) : null const assetResponse = await drizzle.query.assets.findMany({ where: (assets, { and, or, eq }) => { @@ -46,32 +47,23 @@ export async function searchForAssets(c: Context): Promise { eq(assets.status, "approved") ) }, + ...(assetTagsList.length > 0 + ? { + with: { + assetTags: { + where: (assetTags, { and, eq }) => { + return and( + ...assetTagsList.map((assetTag) => + eq(assetTags.name, assetTag) + ) + ) + }, + }, + }, + } + : {}), }) - let assetsWithTags = null - if (assetTags) { - const assetIds = assetResponse.map((asset) => asset.id) - - const assetTagsResponse = await drizzle.query.assetAssetTags.findMany({ - where: (assetAssetTags, { and, or, eq }) => { - return and( - or( - ...assetIds.map((assetId) => - eq(assetAssetTags.assetId, assetId) - ) - ) - ) - }, - }) - - assetsWithTags = assetResponse.map((asset) => { - const assetTags = assetTagsResponse.filter( - (assetTag) => assetTag.assetId === asset.id - ) - return { ...asset, assetTags } - }) - } - response = c.json( { success: true, @@ -80,7 +72,7 @@ export async function searchForAssets(c: Context): Promise { game, assetCategory, assetTags, - results: assetTags ? assetsWithTags : assetResponse, + results: assetResponse, }, 200, responseHeaders From 0f57f232c35aa9aa0fd78c11a8a3282876811507 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sat, 2 Sep 2023 02:31:18 +0100 Subject: [PATCH 067/318] i dont want to see a schema ever again --- .gitignore | 5 +- drizzle.config.ts | 10 +- package.json | 6 +- pnpm-lock.yaml | 34 +++--- src/v2/db/schema.ts | 132 ++++++++++------------ src/v2/routes/search/asset/searchAsset.ts | 2 + 6 files changed, 95 insertions(+), 94 deletions(-) diff --git a/.gitignore b/.gitignore index 66a78be..88cce80 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,14 @@ # webstorm .idea -# Wrangler +# Wrangler & env +.env .wrangler .dev.vars # temp -src/routes/check.ts +scripts/ # Logs diff --git a/drizzle.config.ts b/drizzle.config.ts index d72f373..f41fcd6 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -1,10 +1,16 @@ +import "dotenv/config" +const { TURSO_DATABASE_AUTH_TOKEN, TURSO_DATABASE_URL } = process.env import type { Config } from "drizzle-kit" export default { - out: "./src/db/migrations", - schema: "./src/db/schema.ts", + out: "./src/v2/db/migrations", + schema: "./src/v2/db/schema.ts", driver: "turso", breakpoints: true, strict: true, verbose: true, + dbCredentials: { + url: TURSO_DATABASE_URL as string, + authToken: TURSO_DATABASE_AUTH_TOKEN as string, + }, } satisfies Config diff --git a/package.json b/package.json index 337bd33..0d56a2c 100644 --- a/package.json +++ b/package.json @@ -13,14 +13,14 @@ }, "devDependencies": { "@cloudflare/workers-types": "^4.20230821.0", - "@types/node": "^20.5.7", + "@types/node": "^20.5.8", "dotenv": "^16.3.1", "drizzle-kit": "^0.19.13", "eslint": "^8.48.0", "eslint-config-google": "^0.14.0", "eslint-plugin-json": "^3.1.0", "husky": "^8.0.3", - "tsx": "^3.12.7", + "tsx": "^3.12.8", "typescript": "^5.2.2", "wrangler": "3.6.0" }, @@ -31,7 +31,7 @@ "@typescript-eslint/eslint-plugin": "^6.5.0", "drizzle-orm": "^0.28.5", "hono": "^3.5.6", - "lucia": "^2.4.0", + "lucia": "^2.4.1", "mysql2": "^3.6.0", "prettier": "^3.0.3", "resend": "^1.0.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2550fb1..1e8264a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ dependencies: version: 0.3.2 "@lucia-auth/adapter-sqlite": specifier: ^2.0.0 - version: 2.0.0(@libsql/client@0.3.2)(lucia@2.4.0) + version: 2.0.0(@libsql/client@0.3.2)(lucia@2.4.1) "@typescript-eslint/eslint-plugin": specifier: ^6.5.0 version: 6.5.0(@typescript-eslint/parser@6.5.0)(eslint@8.48.0)(typescript@5.2.2) @@ -21,8 +21,8 @@ dependencies: specifier: ^3.5.6 version: 3.5.6 lucia: - specifier: ^2.4.0 - version: 2.4.0 + specifier: ^2.4.1 + version: 2.4.1 mysql2: specifier: ^3.6.0 version: 3.6.0 @@ -38,8 +38,8 @@ devDependencies: specifier: ^4.20230821.0 version: 4.20230821.0 "@types/node": - specifier: ^20.5.7 - version: 20.5.7 + specifier: ^20.5.8 + version: 20.5.8 dotenv: specifier: ^16.3.1 version: 16.3.1 @@ -59,8 +59,8 @@ devDependencies: specifier: ^8.0.3 version: 8.0.3 tsx: - specifier: ^3.12.7 - version: 3.12.7 + specifier: ^3.12.8 + version: 3.12.8 typescript: specifier: ^5.2.2 version: 5.2.2 @@ -866,7 +866,7 @@ packages: - utf-8-validate dev: false - /@lucia-auth/adapter-sqlite@2.0.0(@libsql/client@0.3.2)(lucia@2.4.0): + /@lucia-auth/adapter-sqlite@2.0.0(@libsql/client@0.3.2)(lucia@2.4.1): resolution: { integrity: sha512-Hiy8WND/1mi25r0M2ruSml+Ab5GJLr4XZEHApYw1lxybF+VlPUyX7oTtIVCSgvq/SWiP/tvnyPwnXAPmNr8/bg==, @@ -882,7 +882,7 @@ packages: optional: true dependencies: "@libsql/client": 0.3.2 - lucia: 2.4.0 + lucia: 2.4.1 dev: false /@nodelib/fs.scandir@2.1.5: @@ -955,14 +955,14 @@ packages: integrity: sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==, } dependencies: - "@types/node": 20.5.7 + "@types/node": 20.5.8 form-data: 3.0.1 dev: false - /@types/node@20.5.7: + /@types/node@20.5.8: resolution: { - integrity: sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==, + integrity: sha512-eajsR9aeljqNhK028VG0Wuw+OaY5LLxYmxeoXynIoE6jannr9/Ucd1LL0hSSoafk5LTYG+FfqsyGt81Q6Zkybw==, } /@types/semver@7.5.1: @@ -978,7 +978,7 @@ packages: integrity: sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==, } dependencies: - "@types/node": 20.5.7 + "@types/node": 20.5.8 dev: false /@typescript-eslint/eslint-plugin@6.5.0(@typescript-eslint/parser@6.5.0)(eslint@8.48.0)(typescript@5.2.2): @@ -2778,10 +2778,10 @@ packages: es5-ext: 0.10.62 dev: true - /lucia@2.4.0: + /lucia@2.4.1: resolution: { - integrity: sha512-v2pyFQVF734+EU3m9GeeJQorFR7zLt7JoOJ1UD5ttR5Z+w4IkOyExiXyFe+zssKpony66u94wcxyws3lZSpzzg==, + integrity: sha512-MM5b6LLT//a8qR02490ShwYvsTdlAj4WoFP+Ok9NE31zwBm0dM9lK9TivHwAb69eka71OAcnZeaBi1CBfHtwZA==, } dev: false @@ -3703,10 +3703,10 @@ packages: } dev: true - /tsx@3.12.7: + /tsx@3.12.8: resolution: { - integrity: sha512-C2Ip+jPmqKd1GWVQDvz/Eyc6QJbGfE7NrR3fx5BpEHMZsEHoIxHL1j+lKdGobr8ovEyqeNkPLSKp6SCSOt7gmw==, + integrity: sha512-Lt9KYaRGF023tlLInPj8rgHwsZU8qWLBj4iRXNWxTfjIkU7canGL806AqKear1j722plHuiYNcL2ZCo6uS9UJA==, } hasBin: true dependencies: diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index c9bbbad..c41b23d 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -28,9 +28,9 @@ export const users = sqliteTable( }, (user) => { return { - userIdx: uniqueIndex("user_idx").on(user.id), - usernameIdx: uniqueIndex("username_idx").on(user.username), - emailIdx: uniqueIndex("email_idx").on(user.email), + userIdx: uniqueIndex("user_id_idx").on(user.id), + usernameIdx: uniqueIndex("user_username_idx").on(user.username), + emailIdx: uniqueIndex("user_email_idx").on(user.email), } } ) @@ -52,7 +52,7 @@ export const sessions = sqliteTable( }, (session) => { return { - userIdx: uniqueIndex("session_user_idx").on(session.userId), + userIdx: uniqueIndex("session_user_id_idx").on(session.userId), } } ) @@ -71,21 +71,31 @@ export const keys = sqliteTable( }, (key) => { return { - userIdx: uniqueIndex("keys_user_idx").on(key.userId), + userIdx: uniqueIndex("key_user_id_idx").on(key.userId), } } ) -export const socialsConnection = sqliteTable(tableNames.socialsConnection, { - id: text("id").primaryKey(), - userId: text("user_id") - .notNull() - .references(() => users.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - discordId: text("discord_id"), -}) +export const socialsConnections = sqliteTable( + tableNames.socialsConnection, + { + id: text("id").primaryKey(), + userId: text("user_id") + .notNull() + .references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + discordId: text("discord_id"), + }, + (socialsConnection) => { + return { + userIdx: uniqueIndex("socials_connection_user_id_idx").on( + socialsConnection.userId + ), + } + } +) export const games = sqliteTable( tableNames.games, @@ -98,8 +108,8 @@ export const games = sqliteTable( }, (game) => { return { - gameIdx: uniqueIndex("game_idx").on(game.id), - nameIdx: uniqueIndex("name_idx").on(game.name), + gameIdx: uniqueIndex("game_id_idx").on(game.id), + nameIdx: uniqueIndex("game_name_idx").on(game.name), } } ) @@ -115,10 +125,12 @@ export const assetCategories = sqliteTable( }, (assetCategory) => { return { - assetCategoryIdx: uniqueIndex("asset_category_idx").on( + assetCategoryIdx: uniqueIndex("asset_category_id_idx").on( assetCategory.id ), - nameIdx: uniqueIndex("name_idx").on(assetCategory.name), + nameIdx: uniqueIndex("asset_category_name_idx").on( + assetCategory.name + ), } } ) @@ -189,58 +201,38 @@ export const assetTags = sqliteTable( }, (assetTag) => { return { - assetTagIdx: uniqueIndex("asset_tag_idx").on(assetTag.id), - nameIdx: uniqueIndex("name_idx").on(assetTag.name), + assetTagIdx: uniqueIndex("asset_tag_id_idx").on(assetTag.id), + nameIdx: uniqueIndex("asset_tag_name_idx").on(assetTag.name), } } ) -export const following = sqliteTable( - tableNames.following, - { - id: text("id").primaryKey(), - followerId: text("follower_id") - .notNull() - .references(() => users.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - followingId: text("following_id") - .notNull() - .references(() => users.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - }, - (following) => { - return { - followerIdx: uniqueIndex("follower_idx").on(following.followerId), - followingIdx: uniqueIndex("following_idx").on( - following.followingId - ), - } - } -) +export const following = sqliteTable(tableNames.following, { + id: text("id").primaryKey(), + followerId: text("follower_id") + .notNull() + .references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + followingId: text("following_id") + .notNull() + .references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), +}) -export const follower = sqliteTable( - tableNames.follower, - { - id: text("id").primaryKey(), - followerId: text("follower_id") - .notNull() - .references(() => users.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - followingId: text("following_id").notNull(), - }, - (follower) => { - return { - followerIdx: uniqueIndex("follower_idx").on(follower.followerId), - followingIdx: uniqueIndex("following_idx").on(follower.followingId), - } - } -) +export const follower = sqliteTable(tableNames.follower, { + id: text("id").primaryKey(), + followerId: text("follower_id") + .notNull() + .references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + followingId: text("following_id").notNull(), +}) export const collections = sqliteTable( tableNames.assetCollection, @@ -257,8 +249,8 @@ export const collections = sqliteTable( }, (collection) => { return { - collectionIdx: uniqueIndex("collection_idx").on(collection.id), - userCollectionIdx: uniqueIndex("user_collection_idx").on( + collectionIdx: uniqueIndex("collection_id_idx").on(collection.id), + userCollectionIdx: uniqueIndex("user_collection_id_idx").on( collection.userId ), } @@ -282,11 +274,11 @@ export const savedOcGenerators = sqliteTable( }, (savedOcGenerators) => { return { - savedOcGeneratorsIdx: uniqueIndex("saved_oc_generators_idx").on( + savedOcGeneratorsIdx: uniqueIndex("saved_oc_generators_id_idx").on( savedOcGenerators.id ), savedOcGeneratorsUserIdx: uniqueIndex( - "saved_oc_generators_user_idx" + "saved_oc_generators_user_id_idx" ).on(savedOcGenerators.userId), } } diff --git a/src/v2/routes/search/asset/searchAsset.ts b/src/v2/routes/search/asset/searchAsset.ts index ea198d6..2bac7df 100644 --- a/src/v2/routes/search/asset/searchAsset.ts +++ b/src/v2/routes/search/asset/searchAsset.ts @@ -23,6 +23,7 @@ export async function searchForAssets(c: Context): Promise { const drizzle = await getConnection(c.env).drizzle + // check if certian search parameters are present, if not, set them to null const searchQuery = query ?? null const gameList = game ? SplitQueryByCommas(game) : null const assetCategoryList = assetCategory @@ -30,6 +31,7 @@ export async function searchForAssets(c: Context): Promise { : null const assetTagsList = assetTags ? SplitQueryByCommas(assetTags) : null + // query the database for assets that match the search parameters const assetResponse = await drizzle.query.assets.findMany({ where: (assets, { and, or, eq }) => { return and( From c39db5f1a9a3e0064f890129ac658feca7cfbcf1 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sat, 2 Sep 2023 02:41:31 +0100 Subject: [PATCH 068/318] search recent assets endpoint [returns 100] --- src/v2/routes/search/asset/assetSearch.ts | 112 ------------------ src/v2/routes/search/asset/recentAssets.ts | 37 ++++++ .../asset/{searchAsset.ts => searchAssets.ts} | 4 +- src/v2/routes/search/searchRoute.ts | 10 ++ 4 files changed, 50 insertions(+), 113 deletions(-) delete mode 100644 src/v2/routes/search/asset/assetSearch.ts create mode 100644 src/v2/routes/search/asset/recentAssets.ts rename src/v2/routes/search/asset/{searchAsset.ts => searchAssets.ts} (93%) diff --git a/src/v2/routes/search/asset/assetSearch.ts b/src/v2/routes/search/asset/assetSearch.ts deleted file mode 100644 index 50313fd..0000000 --- a/src/v2/routes/search/asset/assetSearch.ts +++ /dev/null @@ -1,112 +0,0 @@ -// import { responseHeaders } from "@/v2/lib/responseHeaders" -// import type { Asset } from "@/v2/lib/types/asset" -// import { getSearchResults } from "@/v2/lib/query" -// import { getConnection } from "@/v2/db/turso" -// import type { APIContext as Context } from "@/worker-configuration" - -// export async function getAssetSearch(c: Context): Promise { -// const queryParams = c.req.query() -// // console.log(queryParams); -// const { query, game, asset, tags } = queryParams - -// // Convert game and asset parameters to arrays -// const gameArray = game ? game.split(",") : [] -// const assetArray = asset ? asset.split(",") : [] -// const tagsArray = tags ? tags.split(",") : [] - -// const cacheKey = new Request(c.req.url.toString(), c.req) -// const cache = caches.default -// let response = await cache.match(cacheKey) - -// if (response) return response - -// // console.log(query, gameArray, assetArray, tags); - -// const results = ( -// await getSearchResults(query, gameArray, assetArray, tagsArray, c) -// ).map((results) => { -// return { -// id: results.id, -// name: results.name, -// game: results.game, -// asset_category: results.asset_category, -// url: results.url, -// tags: results.tags, -// status: results.status, -// uploaded_by: results.uploaded_by, -// uploaded_date: results.uploaded_date, -// file_size: results.file_size, -// width: results.width, -// height: results.height, -// } -// }) - -// response = c.json( -// { -// success: true, -// status: "ok", -// query, -// game, -// asset, -// tags, -// results, -// }, -// 200, -// responseHeaders -// ) - -// response.headers.set("Cache-Control", "s-maxage=3600") -// await cache.put(cacheKey, response.clone()) - -// return response -// } - -// export async function recentAssets(c): Promise { -// const cacheKey = new Request(c.req.url.toString(), c.req) -// const cache = caches.default -// let response = await cache.match(cacheKey) -// if (response) return response - -// const conn = await getConnection(c.env) -// const db = conn.planetscale - -// const row = await db -// .execute( -// "SELECT * FROM assets WHERE 1=1 ORDER BY uploaded_date DESC LIMIT 30" -// ) -// .then((row) => row.rows as Asset[] | undefined) - -// if (!row) throw new Error("No results found") - -// const results = row.map((asset) => { -// return { -// id: asset.id, -// name: asset.name, -// game: asset.game, -// asset_category: asset.asset_category, -// url: asset.url, -// tags: asset.tags, -// status: asset.status, -// uploaded_by: asset.uploaded_by, -// uploaded_date: asset.uploaded_date, -// file_size: asset.file_size, -// width: asset.width, -// height: asset.height, -// } -// }) - -// response = c.json( -// { -// success: true, -// status: "ok", -// results, -// }, -// 200, -// responseHeaders -// ) - -// response.headers.set("Cache-Control", "s-maxage=3600") -// await cache.put(cacheKey, response.clone()) - -// return response -// } diff --git a/src/v2/routes/search/asset/recentAssets.ts b/src/v2/routes/search/asset/recentAssets.ts new file mode 100644 index 0000000..8e1968a --- /dev/null +++ b/src/v2/routes/search/asset/recentAssets.ts @@ -0,0 +1,37 @@ +import { responseHeaders } from "@/v2/lib/responseHeaders" +import { getConnection } from "@/v2/db/turso" +import { desc } from "drizzle-orm" +import type { APIContext as Context } from "@/worker-configuration" +import { assets } from "@/v2/db/schema" + +// get 100 most recent assets, sorted by asset.upload +export async function recentAssets(c: Context): Promise { + const cacheKey = new Request(c.req.url.toString(), c.req) + const cache = caches.default + let response = await cache.match(cacheKey) + + if (response) return response + + const drizzle = await getConnection(c.env).drizzle + + const assetResponse = await drizzle + .select() + .from(assets) + .orderBy(desc(assets.uploadedDate)) + .limit(100) + .execute() + + response = c.json( + { + success: true, + status: "ok", + results: assetResponse, + }, + 200, + responseHeaders + ) + + response.headers.set("Cache-Control", "s-maxage=60") + await cache.put(cacheKey, response.clone()) + return response +} diff --git a/src/v2/routes/search/asset/searchAsset.ts b/src/v2/routes/search/asset/searchAssets.ts similarity index 93% rename from src/v2/routes/search/asset/searchAsset.ts rename to src/v2/routes/search/asset/searchAssets.ts index 2bac7df..d1fdf0f 100644 --- a/src/v2/routes/search/asset/searchAsset.ts +++ b/src/v2/routes/search/asset/searchAssets.ts @@ -13,7 +13,7 @@ export async function searchForAssets(c: Context): Promise { let response = await cache.match(cacheKey) if (response) return response - const { query, game, assetCategory, assetTags } = c.req.param() + const { query, game, assetCategory, assetTags } = c.req.query() // search parameters can include optional search params: query, game, assetCategory, assetTags // query?: string => ?query=keqing @@ -80,5 +80,7 @@ export async function searchForAssets(c: Context): Promise { responseHeaders ) + response.headers.set("Cache-Control", "s-maxage=600") + await cache.put(cacheKey, response.clone()) return response } diff --git a/src/v2/routes/search/searchRoute.ts b/src/v2/routes/search/searchRoute.ts index 22f03d7..1132e12 100644 --- a/src/v2/routes/search/searchRoute.ts +++ b/src/v2/routes/search/searchRoute.ts @@ -4,6 +4,8 @@ import { Bindings } from "@/worker-configuration" import { getUserByUsername } from "./user/getUserByUsername" import { getUsersBySearch } from "./user/getUsersBySearch" import authRoute from "../auth/authRoute" +import { searchForAssets } from "./asset/searchAssets" +import { recentAssets } from "./asset/recentAssets" import { cors } from "hono/cors" const searchRoute = new Hono<{ Bindings: Bindings }>() @@ -20,6 +22,14 @@ authRoute.use( }) ) +searchRoute.get("/assets/query", async (c) => { + return searchForAssets(c) +}) + +searchRoute.get("/assets/recent", async (c) => { + return recentAssets(c) +}) + searchRoute.get("/users/user/:username", async (c) => { return getUserByUsername(c) }) From 5caa0c39344226c8f97ea79d8c73340606e4ae7f Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sat, 2 Sep 2023 03:59:40 +0100 Subject: [PATCH 069/318] user relations --- src/v2/db/drizzle.ts | 4 +- src/v2/db/schema.ts | 55 ++++++++++++-- src/v2/lib/helpers/splitQueryByCommas.ts | 3 + src/v2/routes/auth/assets/uploadAsset.ts | 34 +++------ src/v2/routes/auth/authRoute.ts | 10 +++ .../user-relations/followUser.ts | 71 +++++++++++++++++++ .../user-relations/unfollowUser.ts | 62 ++++++++++++++++ src/v2/routes/search/asset/recentAssets.ts | 2 +- src/v2/routes/search/asset/searchAssets.ts | 7 +- 9 files changed, 209 insertions(+), 39 deletions(-) create mode 100644 src/v2/lib/helpers/splitQueryByCommas.ts create mode 100644 src/v2/routes/auth/user-attributes/user-relations/followUser.ts create mode 100644 src/v2/routes/auth/user-attributes/user-relations/unfollowUser.ts diff --git a/src/v2/db/drizzle.ts b/src/v2/db/drizzle.ts index 6344353..def3c76 100644 --- a/src/v2/db/drizzle.ts +++ b/src/v2/db/drizzle.ts @@ -9,13 +9,11 @@ export const tableNames = { gameAssetCategories: "gameAssetCategories", games: "games", assetTags: "assetTags", - assetAssetTags: "assetAssetTags", emailVerificationToken: "emailVerificationToken", passwordResetToken: "passwordResetToken", assetCategories: "assetCategories", - passwordResetTokens: "passwordResetToken", savedOcGenerators: "savedOcGenerators", - savedAssets: "savedAssets", + favoritedAssets: "favoritedAssets", assetCollection: "assetCollection", assetCollectionAsset: "assetCollectionAsset", socialsConnection: "socialsConnection", diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index c41b23d..45039ad 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -140,6 +140,7 @@ export const assets = sqliteTable( { id: integer("id").primaryKey().notNull(), // primary key auto increments on sqlite name: text("name").notNull(), + extension: text("extension").notNull(), game: text("game") .notNull() .references(() => games.name, { @@ -209,13 +210,13 @@ export const assetTags = sqliteTable( export const following = sqliteTable(tableNames.following, { id: text("id").primaryKey(), - followerId: text("follower_id") + followerUserId: text("follower_id") .notNull() .references(() => users.id, { onUpdate: "cascade", onDelete: "cascade", }), - followingId: text("following_id") + followingUserId: text("following_id") .notNull() .references(() => users.id, { onUpdate: "cascade", @@ -225,15 +226,41 @@ export const following = sqliteTable(tableNames.following, { export const follower = sqliteTable(tableNames.follower, { id: text("id").primaryKey(), - followerId: text("follower_id") + followerUserId: text("follower_id") .notNull() .references(() => users.id, { onUpdate: "cascade", onDelete: "cascade", }), - followingId: text("following_id").notNull(), + followingUserId: text("following_id") + .notNull() + .references(() => users.id), }) +export const favoritedAssets = sqliteTable( + tableNames.favoritedAssets, + { + id: text("id").primaryKey(), + userId: text("user_id") + .notNull() + .references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + isPublic: integer("is_public").default(0).notNull(), + }, + (favoritedAssets) => { + return { + favoritedAssetsIdx: uniqueIndex("favorited_assets_id_idx").on( + favoritedAssets.id + ), + favoritedAssetsUserIdx: uniqueIndex( + "favorited_assets_user_id_idx" + ).on(favoritedAssets.userId), + } + } +) + export const collections = sqliteTable( tableNames.assetCollection, { @@ -285,7 +312,6 @@ export const savedOcGenerators = sqliteTable( ) // relations - export const gameRelations = relations(games, ({ many }) => ({ assets: many(assets), })) @@ -297,6 +323,10 @@ export const assetCategoryRelations = relations( }) ) +export const assetTagRelations = relations(assetTags, ({ many }) => ({ + assets: many(assets), +})) + export const collectionRelations = relations(collections, ({ many }) => ({ assets: many(assets), })) @@ -317,6 +347,17 @@ export const assetRelations = relations(assets, ({ one, many }) => ({ }), })) +export const favoredAssetsRelations = relations( + favoritedAssets, + ({ one, many }) => ({ + user: one(users, { + fields: [favoritedAssets.userId], + references: [users.id], + }), + assets: many(assets), + }) +) + export const sessionsRelations = relations(sessions, ({ one }) => ({ user: one(users, { fields: [sessions.userId], @@ -331,12 +372,14 @@ export const keysRelations = relations(keys, ({ one }) => ({ }), })) -export const usersRelations = relations(users, ({ many }) => ({ +export const usersRelations = relations(users, ({ one, many }) => ({ session: many(sessions), key: many(keys), assets: many(assets), follower: many(follower), + favoritedAssets: one(favoritedAssets), following: many(following), + socialsConnection: one(socialsConnections), collections: many(collections), savedOcGenerators: many(savedOcGenerators), })) diff --git a/src/v2/lib/helpers/splitQueryByCommas.ts b/src/v2/lib/helpers/splitQueryByCommas.ts new file mode 100644 index 0000000..dcd0337 --- /dev/null +++ b/src/v2/lib/helpers/splitQueryByCommas.ts @@ -0,0 +1,3 @@ +export function SplitQueryByCommas(query: string) { + return query.split(",").map((q) => q.trim()) +} diff --git a/src/v2/routes/auth/assets/uploadAsset.ts b/src/v2/routes/auth/assets/uploadAsset.ts index d4a182c..9b675bf 100644 --- a/src/v2/routes/auth/assets/uploadAsset.ts +++ b/src/v2/routes/auth/assets/uploadAsset.ts @@ -38,9 +38,8 @@ export async function uploadAsset(c: Context): Promise { return c.json({ success: false, state: "invalid asset" }, 200) } - // clear out metadata const metadata = { - title: formData.get("title") as string, // e.g keqing + name: formData.get("name`") as string, // e.g keqing extension: formData.get("extension") as string, // e.g png tags: formData.get("tags") as string, // e.g no-background, fanmade, official category: formData.get("category") as string, // e.g splash-art @@ -51,11 +50,12 @@ export async function uploadAsset(c: Context): Promise { } const newAsset = { - name: `${metadata.title}.${metadata.extension}`, + name: metadata.name, + extension: metadata.extension, game: metadata.game, assetCategory: metadata.category, tags: metadata.tags, - url: `/assets/${metadata.game}/${metadata.category}/${metadata.title}.${metadata.extension}`, + url: `/assets/${metadata.game}/${metadata.category}/${metadata.name}.${metadata.extension}`, uploadedById: session.userId, status: bypassApproval ? "approved" : "pending", uploadedDate: new Date().getTime(), @@ -82,26 +82,12 @@ export async function uploadAsset(c: Context): Promise { return c.json({ success: false, state: "duplicate asset" }, 400) try { - await drizzle.transaction(async () => { - await c.env.bucket.put( - `/assets/${metadata.game}/${metadata.category}/${metadata.title}.${metadata.extension}`, - newAssetFile - ) - - const newAssetClone = new File( - [asset128px], - `${metadata.title}-128.png`, - { - type: asset.type, - } - ) - - await c.env.bucket.put( - `/assets/${metadata.game}/${metadata.category}/${metadata.title}-128.png`, - newAssetClone - ) - await drizzle.insert(assets).values(newAsset) - }) + await c.env.bucket.put( + `/assets/${metadata.game}/${metadata.category}/${metadata.name}.${metadata.extension}`, + newAssetFile + ) + + await drizzle.insert(assets).values(newAsset) } catch (e) { return c.json({ success: false, state: "failed to upload asset" }, 500) } diff --git a/src/v2/routes/auth/authRoute.ts b/src/v2/routes/auth/authRoute.ts index c5b240c..52548ad 100644 --- a/src/v2/routes/auth/authRoute.ts +++ b/src/v2/routes/auth/authRoute.ts @@ -13,6 +13,8 @@ import { Bindings } from "@/worker-configuration" import { modifyAssetData } from "./assets/modifyAsset" import { approveAsset } from "./assets/approveAsset" import { viewOCGeneratorResponses } from "./oc-generators/viewOCGeneratorResponses" +import { followUser } from "./user-attributes/user-relations/followUser" +import { unFollowUser } from "./user-attributes/user-relations/unfollowUser" import { deleteOCGeneratorResponse } from "./oc-generators/deleteOCGeneratorResponse" const authRoute = new Hono<{ Bindings: Bindings }>() @@ -53,6 +55,14 @@ authRoute.post("/upload/banner", async (c) => { return uploadBannerImage(c) }) +authRoute.post("/follow", async (c) => { + return followUser(c) +}) + +authRoute.post("/unfollow", async (c) => { + return unFollowUser(c) +}) + authRoute.post("/signup", async (c) => { return signup(c) }) diff --git a/src/v2/routes/auth/user-attributes/user-relations/followUser.ts b/src/v2/routes/auth/user-attributes/user-relations/followUser.ts new file mode 100644 index 0000000..7618f24 --- /dev/null +++ b/src/v2/routes/auth/user-attributes/user-relations/followUser.ts @@ -0,0 +1,71 @@ +import { auth } from "@/v2/lib/auth/lucia" +import { getConnection } from "@/v2/db/turso" +import { APIContext as Context } from "@/worker-configuration" +import { following, follower } from "@/v2/db/schema" + +export async function followUser(c: Context): Promise { + const drizzle = getConnection(c.env).drizzle + + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() + + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + return c.json({ success: false, state: "invalid session" }, 200) + } + + const formData = await c.req.formData() + + const userToFollow = formData.get("userIdToFollow") as string | null + + if (!userToFollow) { + return c.json({ success: false, state: "no userid entered" }, 200) + } + + // check if user exists + const user = await drizzle.query.users.findFirst({ + where: (users, { eq }) => eq(users.id, userToFollow), + }) + + if (!user) { + return c.json({ success: false, state: "user not found" }, 200) + } + + const isFollowing = await drizzle.query.following.findFirst({ + where: (following, { eq }) => + eq(following.id, `${session.userId}-${userToFollow}`), + }) + + if (isFollowing) { + return c.json({ success: false, state: "already following" }, 200) + } + + await drizzle.transaction(async (transaction) => { + const newFollower = await transaction + .insert(follower) + .values({ + id: `${session.userId}-${userToFollow}`, + followerUserId: session.userId, + followingUserId: userToFollow, + }) + .execute() + + const newFollowing = await transaction + .insert(following) + .values({ + id: `${userToFollow}-${session.userId}`, + followerUserId: userToFollow, + followingUserId: session.userId, + }) + .execute() + return c.json( + { success: true, state: "ok", newFollowing, newFollower }, + 200 + ) + }) + + return c.json({ success: false, state: "failed to follow user" }, 500) +} diff --git a/src/v2/routes/auth/user-attributes/user-relations/unfollowUser.ts b/src/v2/routes/auth/user-attributes/user-relations/unfollowUser.ts new file mode 100644 index 0000000..5f3c3e7 --- /dev/null +++ b/src/v2/routes/auth/user-attributes/user-relations/unfollowUser.ts @@ -0,0 +1,62 @@ +import { auth } from "@/v2/lib/auth/lucia" +import { getConnection } from "@/v2/db/turso" +import { APIContext as Context } from "@/worker-configuration" +import { following, follower } from "@/v2/db/schema" +import { eq } from "drizzle-orm" + +export async function unFollowUser(c: Context): Promise { + const drizzle = getConnection(c.env).drizzle + + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() + + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + return c.json({ success: false, state: "invalid session" }, 200) + } + + const formData = await c.req.formData() + + const userToUnFollow = formData.get("userIdToUnFollow") as string | null + + if (!userToUnFollow) { + return c.json({ success: false, state: "no userid entered" }, 200) + } + + // check if user exists + const user = await drizzle.query.users.findFirst({ + where: (users, { eq }) => eq(users.id, userToUnFollow), + }) + + if (!user) { + return c.json({ success: false, state: "user not found" }, 200) + } + + const isFollowing = await drizzle.query.following.findFirst({ + where: (following, { eq }) => + eq(following.id, `${session.userId}-${userToUnFollow}`), + }) + + if (!isFollowing) { + return c.json({ success: false, state: "not following" }, 200) + } + + await drizzle.transaction(async (transaction) => { + await transaction + .delete(follower) + .where(eq(follower.id, `${session.userId}-${userToUnFollow}`)) + .execute() + + await transaction + .delete(following) + .where(eq(following.id, `${session.userId}-${userToUnFollow}`)) + .execute() + + return c.json({ success: true, state: "unfollowed user" }, 200) + }) + + return c.json({ success: false, state: "failed to unfollow user" }, 200) +} diff --git a/src/v2/routes/search/asset/recentAssets.ts b/src/v2/routes/search/asset/recentAssets.ts index 8e1968a..6fa122d 100644 --- a/src/v2/routes/search/asset/recentAssets.ts +++ b/src/v2/routes/search/asset/recentAssets.ts @@ -4,7 +4,7 @@ import { desc } from "drizzle-orm" import type { APIContext as Context } from "@/worker-configuration" import { assets } from "@/v2/db/schema" -// get 100 most recent assets, sorted by asset.upload +// get 100 most recent assets, sorted by asset.uploadedDate export async function recentAssets(c: Context): Promise { const cacheKey = new Request(c.req.url.toString(), c.req) const cache = caches.default diff --git a/src/v2/routes/search/asset/searchAssets.ts b/src/v2/routes/search/asset/searchAssets.ts index d1fdf0f..64ca7ab 100644 --- a/src/v2/routes/search/asset/searchAssets.ts +++ b/src/v2/routes/search/asset/searchAssets.ts @@ -2,10 +2,7 @@ import { responseHeaders } from "@/v2/lib/responseHeaders" import { getConnection } from "@/v2/db/turso" import { like } from "drizzle-orm" import type { APIContext as Context } from "@/worker-configuration" - -function SplitQueryByCommas(query: string): string[] { - return query.split(",") ? query.split(",") : [query] -} +import { SplitQueryByCommas } from "@/v2/lib/helpers/splitQueryByCommas" export async function searchForAssets(c: Context): Promise { const cacheKey = new Request(c.req.url.toString(), c.req) @@ -74,7 +71,7 @@ export async function searchForAssets(c: Context): Promise { game, assetCategory, assetTags, - results: assetResponse, + results: assetResponse ? assetResponse : [], }, 200, responseHeaders From d8c29008a502990cc1a6b765a39256235050eb89 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sat, 2 Sep 2023 04:50:46 +0100 Subject: [PATCH 070/318] help --- .../auth/assets/favorite/favoriteAsset.ts | 84 ++++++++++++++++++ .../auth/assets/favorite/unFavoriteAsset.ts | 88 +++++++++++++++++++ .../user-relations/followUser.ts | 10 +-- src/v2/routes/search/all/searchAll.ts | 1 + 4 files changed, 177 insertions(+), 6 deletions(-) create mode 100644 src/v2/routes/auth/assets/favorite/favoriteAsset.ts create mode 100644 src/v2/routes/auth/assets/favorite/unFavoriteAsset.ts diff --git a/src/v2/routes/auth/assets/favorite/favoriteAsset.ts b/src/v2/routes/auth/assets/favorite/favoriteAsset.ts new file mode 100644 index 0000000..8702ce2 --- /dev/null +++ b/src/v2/routes/auth/assets/favorite/favoriteAsset.ts @@ -0,0 +1,84 @@ +import { auth } from "@/v2/lib/auth/lucia" +import { getConnection } from "@/v2/db/turso" +import { APIContext as Context } from "@/worker-configuration" +import { favoritedAssets } from "@/v2/db/schema" + +export async function favoriteAsset(c: Context): Promise { + const drizzle = getConnection(c.env).drizzle + + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() + + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + return c.json({ success: false, state: "invalid session" }, 200) + } + + const formData = await c.req.formData() + + const assetToFavorite = formData.get("assetIdToFavorite") as string | null + + if (!assetToFavorite) { + return c.json({ success: false, state: "no assetid entered" }, 200) + } + + // check if asset exists + const asset = await drizzle.query.assets.findFirst({ + where: (assets, { eq }) => eq(assets.id, parseInt(assetToFavorite)), + }) + + if (!asset) { + return c.json({ success: false, state: "asset not found" }, 200) + } + + // this should never happen, but just in case it does, UX over reads/writes to the database + let userFavoritedAssets = await drizzle.query.favoritedAssets.findFirst({ + where: (favoritedAssets, { eq }) => + eq(favoritedAssets.userId, session.userId), + }) + + if (!userFavoritedAssets) { + // create entry in favoritedAssets + const insertedFavoritedAsset = await drizzle + .insert(favoritedAssets) + .values({ + id: `${session.userId}-${assetToFavorite}`, + userId: session.userId, + isPublic: 0, // default to private + }) + .execute() + userFavoritedAssets = insertedFavoritedAsset[0] + } + + const isFavorited = drizzle.query.favoritedAssets.findFirst({ + where: (favoritedAssets, { eq }) => + eq(favoritedAssets.id, `${session.userId}-${assetToFavorite}`), + with: { + assets: { + where: (assets, { eq }) => + eq(assets.id, parseInt(assetToFavorite)), + }, + }, + }) + + if (isFavorited) { + return c.json( + { + success: false, + state: "asset is already favorited", + assetToFavorite, + }, + 200 + ) + } + + // add asset to favoritedAssets... + + return c.json( + { success: true, state: "favorited asset", assetToFavorite }, + 200 + ) +} diff --git a/src/v2/routes/auth/assets/favorite/unFavoriteAsset.ts b/src/v2/routes/auth/assets/favorite/unFavoriteAsset.ts new file mode 100644 index 0000000..2c70413 --- /dev/null +++ b/src/v2/routes/auth/assets/favorite/unFavoriteAsset.ts @@ -0,0 +1,88 @@ +import { auth } from "@/v2/lib/auth/lucia" +import { getConnection } from "@/v2/db/turso" +import { APIContext as Context } from "@/worker-configuration" +import { favoritedAssets } from "@/v2/db/schema" + +export async function unFavoriteAsset(c: Context): Promise { + const drizzle = getConnection(c.env).drizzle + + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() + + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + return c.json({ success: false, state: "invalid session" }, 200) + } + + const formData = await c.req.formData() + + const assetToUnFavorite = formData.get("assetToUnFavorite") as string | null + + if (!assetToUnFavorite) { + return c.json({ success: false, state: "no assetid entered" }, 200) + } + + // check if asset exists + const asset = await drizzle.query.assets.findFirst({ + where: (assets, { eq }) => eq(assets.id, parseInt(assetToUnFavorite)), + }) + + if (!asset) { + return c.json({ success: false, state: "asset not found" }, 200) + } + + // this should never happen, but just in case it does, UX over reads/writes to the database + let userFavoritedAssets = await drizzle.query.favoritedAssets.findFirst({ + where: (favoritedAssets, { eq }) => + eq(favoritedAssets.userId, session.userId), + }) + + if (!userFavoritedAssets) { + // create entry in favoritedAssets + const insertedFavoritedAsset = await drizzle + .insert(favoritedAssets) + .values({ + id: `${session.userId}-${assetToUnFavorite}`, + userId: session.userId, + isPublic: 0, // default to private + }) + .execute() + userFavoritedAssets = insertedFavoritedAsset[0] + } + + const isFavorited = drizzle.query.favoritedAssets.findFirst({ + where: (favoritedAssets, { eq }) => + eq(favoritedAssets.id, `${session.userId}-${assetToUnFavorite}`), + with: { + assets: { + where: (assets, { eq }) => + eq(assets.id, parseInt(assetToUnFavorite)), + }, + }, + }) + + if (!isFavorited) { + return c.json( + { + success: false, + state: "asset isn't favorited", + assetToUnFavorite, + }, + 200 + ) + } + + // remove asset from favoritedAssets.. + + return c.json( + { + success: true, + state: "removed asset from favorites", + assetToUnFavorite, + }, + 200 + ) +} diff --git a/src/v2/routes/auth/user-attributes/user-relations/followUser.ts b/src/v2/routes/auth/user-attributes/user-relations/followUser.ts index 7618f24..188d899 100644 --- a/src/v2/routes/auth/user-attributes/user-relations/followUser.ts +++ b/src/v2/routes/auth/user-attributes/user-relations/followUser.ts @@ -44,7 +44,7 @@ export async function followUser(c: Context): Promise { } await drizzle.transaction(async (transaction) => { - const newFollower = await transaction + await transaction .insert(follower) .values({ id: `${session.userId}-${userToFollow}`, @@ -53,7 +53,7 @@ export async function followUser(c: Context): Promise { }) .execute() - const newFollowing = await transaction + await transaction .insert(following) .values({ id: `${userToFollow}-${session.userId}`, @@ -61,10 +61,8 @@ export async function followUser(c: Context): Promise { followingUserId: session.userId, }) .execute() - return c.json( - { success: true, state: "ok", newFollowing, newFollower }, - 200 - ) + + return c.json({ success: true, state: "followed user" }, 200) }) return c.json({ success: false, state: "failed to follow user" }, 500) diff --git a/src/v2/routes/search/all/searchAll.ts b/src/v2/routes/search/all/searchAll.ts index 6421f82..e9c62d0 100644 --- a/src/v2/routes/search/all/searchAll.ts +++ b/src/v2/routes/search/all/searchAll.ts @@ -33,6 +33,7 @@ export async function searchAll(c: Context): Promise { const drizzle = await getConnection(c.env).drizzle // https://cdn.discordapp.com/attachments/1102306276832202813/1147291827699986572/F.gif + // this is really bad but i don't know how to do this better const usersResponse = await drizzle .select() .from(users) From 37e29eb2184065e148bf2684cef3b68f1cef3de8 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sat, 2 Sep 2023 17:53:25 +0100 Subject: [PATCH 071/318] switch assetstatus to int --- src/v2/db/schema.ts | 10 +++++++--- src/v2/lib/helpers/assetStatus.ts | 5 +++++ src/v2/lib/{auth => helpers}/roleFlags.ts | 11 ++++++----- src/v2/routes/auth/assets/approveAsset.ts | 4 ++-- .../{favoriteAsset.ts => addFavoriteAsset.ts} | 0 ...FavoriteAsset.ts => removeFavoriteAsset.ts} | 0 src/v2/routes/auth/assets/modifyAsset.ts | 5 ++++- src/v2/routes/auth/assets/uploadAsset.ts | 18 +++--------------- src/v2/routes/search/asset/searchAssets.ts | 2 +- 9 files changed, 28 insertions(+), 27 deletions(-) create mode 100644 src/v2/lib/helpers/assetStatus.ts rename src/v2/lib/{auth => helpers}/roleFlags.ts (87%) rename src/v2/routes/auth/assets/favorite/{favoriteAsset.ts => addFavoriteAsset.ts} (100%) rename src/v2/routes/auth/assets/favorite/{unFavoriteAsset.ts => removeFavoriteAsset.ts} (100%) diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index 45039ad..6d2f0dc 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -103,7 +103,7 @@ export const games = sqliteTable( id: text("id").primaryKey(), name: text("name").notNull(), formattedName: text("formatted_name").notNull(), - assetCount: integer("asset_count").default(0).notNull(), + assetCount: integer("asset_count").default(0), lastUpdated: integer("last_updated").notNull(), }, (game) => { @@ -154,7 +154,7 @@ export const assets = sqliteTable( onDelete: "cascade", }), url: text("url").notNull(), - status: text("status").notNull(), + status: integer("status").notNull(), uploadedById: text("uploaded_by").references(() => users.id, { onUpdate: "cascade", onDelete: "cascade", @@ -327,7 +327,11 @@ export const assetTagRelations = relations(assetTags, ({ many }) => ({ assets: many(assets), })) -export const collectionRelations = relations(collections, ({ many }) => ({ +export const collectionRelations = relations(collections, ({ one, many }) => ({ + user: one(users, { + fields: [collections.userId], + references: [users.id], + }), assets: many(assets), })) diff --git a/src/v2/lib/helpers/assetStatus.ts b/src/v2/lib/helpers/assetStatus.ts new file mode 100644 index 0000000..8f638d4 --- /dev/null +++ b/src/v2/lib/helpers/assetStatus.ts @@ -0,0 +1,5 @@ +export const AssetStatus = { + 1: "APPROVED", + 2: "PENDING", + 3: "FLAGGED", +} diff --git a/src/v2/lib/auth/roleFlags.ts b/src/v2/lib/helpers/roleFlags.ts similarity index 87% rename from src/v2/lib/auth/roleFlags.ts rename to src/v2/lib/helpers/roleFlags.ts index 0fd3d9c..54b1e48 100644 --- a/src/v2/lib/auth/roleFlags.ts +++ b/src/v2/lib/helpers/roleFlags.ts @@ -3,11 +3,12 @@ // permission based roles export const roleFlags = { USER: 1 << 0, - CONTRIBUTOR: 1 << 1, - TRANSLATOR: 1 << 2, - STAFF: 1 << 3, - DEVELOPER: 1 << 4, - CREATOR: 1 << 5, + UPLOADER: 1 << 1, + CONTRIBUTOR: 1 << 2, + TRANSLATOR: 1 << 3, + STAFF: 1 << 4, + DEVELOPER: 1 << 5, + CREATOR: 1 << 6, } export const roleFlagsToArray = (roleFlagsInt: number): string[] => { diff --git a/src/v2/routes/auth/assets/approveAsset.ts b/src/v2/routes/auth/assets/approveAsset.ts index 3adc83b..a819c7b 100644 --- a/src/v2/routes/auth/assets/approveAsset.ts +++ b/src/v2/routes/auth/assets/approveAsset.ts @@ -5,7 +5,7 @@ import { createNotFoundResponse } from "@/v2/lib/helpers/responses/notFoundRespo import { eq } from "drizzle-orm" import type { APIContext as Context } from "@/worker-configuration" import { auth } from "@/v2/lib/auth/lucia" -import { roleFlagsToArray } from "@/v2/lib/auth/roleFlags" +import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" export async function approveAsset(c: Context): Promise { const { assetIdToApprove } = c.req.param() @@ -39,7 +39,7 @@ export async function approveAsset(c: Context): Promise { const updatedAsset = await drizzle .update(assets) .set({ - status: "approved", + status: 1, }) .where(eq(assets.id, parseInt(assetIdToApprove))) .execute() diff --git a/src/v2/routes/auth/assets/favorite/favoriteAsset.ts b/src/v2/routes/auth/assets/favorite/addFavoriteAsset.ts similarity index 100% rename from src/v2/routes/auth/assets/favorite/favoriteAsset.ts rename to src/v2/routes/auth/assets/favorite/addFavoriteAsset.ts diff --git a/src/v2/routes/auth/assets/favorite/unFavoriteAsset.ts b/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts similarity index 100% rename from src/v2/routes/auth/assets/favorite/unFavoriteAsset.ts rename to src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts diff --git a/src/v2/routes/auth/assets/modifyAsset.ts b/src/v2/routes/auth/assets/modifyAsset.ts index 8535b2d..2699ee3 100644 --- a/src/v2/routes/auth/assets/modifyAsset.ts +++ b/src/v2/routes/auth/assets/modifyAsset.ts @@ -5,7 +5,8 @@ import { createNotFoundResponse } from "@/v2/lib/helpers/responses/notFoundRespo import { eq } from "drizzle-orm" import type { APIContext as Context } from "@/worker-configuration" import { auth } from "@/v2/lib/auth/lucia" -import { roleFlagsToArray } from "@/v2/lib/auth/roleFlags" +import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" +import { SplitQueryByCommas } from "@/v2/lib/helpers/splitQueryByCommas" export async function modifyAssetData(c: Context): Promise { const { assetIdToModify } = c.req.param() @@ -49,8 +50,10 @@ export async function modifyAssetData(c: Context): Promise { const formData = await c.req.formData() const metadata = { + name: formData.get("name") as string | null, game: formData.get("game") as string | null, assetCategory: formData.get("assetCategory") as string | null, + tags: SplitQueryByCommas(formData.get("tags") as string | null), } Object.keys(metadata).forEach( diff --git a/src/v2/routes/auth/assets/uploadAsset.ts b/src/v2/routes/auth/assets/uploadAsset.ts index 9b675bf..39aa3ea 100644 --- a/src/v2/routes/auth/assets/uploadAsset.ts +++ b/src/v2/routes/auth/assets/uploadAsset.ts @@ -2,6 +2,7 @@ import { auth } from "@/v2/lib/auth/lucia" import { getConnection } from "@/v2/db/turso" import { assets } from "@/v2/db/schema" import type { APIContext as Context } from "@/worker-configuration" +import { SplitQueryByCommas } from "@/v2/lib/helpers/splitQueryByCommas" export async function uploadAsset(c: Context): Promise { const authRequest = auth(c.env).handleRequest(c) @@ -26,22 +27,10 @@ export async function uploadAsset(c: Context): Promise { const formData = await c.req.formData() const asset = formData.get("asset") as unknown as File | null - // this is temporary - const asset128px = formData.get("asset128px") as unknown as File | null - - if ( - !asset || - asset.type !== "image/png" || - !asset128px || - asset128px.type !== "image/png" - ) { - return c.json({ success: false, state: "invalid asset" }, 200) - } - const metadata = { name: formData.get("name`") as string, // e.g keqing extension: formData.get("extension") as string, // e.g png - tags: formData.get("tags") as string, // e.g no-background, fanmade, official + tags: SplitQueryByCommas(formData.get("tags") as string), // e.g no-background, fanmade, official => ["no-background", "fanmade", "official"] category: formData.get("category") as string, // e.g splash-art game: formData.get("game") as string, // e.g genshin-impact size: formData.get("size") as unknown as number, // e.g 1024 @@ -54,10 +43,9 @@ export async function uploadAsset(c: Context): Promise { extension: metadata.extension, game: metadata.game, assetCategory: metadata.category, - tags: metadata.tags, url: `/assets/${metadata.game}/${metadata.category}/${metadata.name}.${metadata.extension}`, uploadedById: session.userId, - status: bypassApproval ? "approved" : "pending", + status: bypassApproval ? 1 : 2, uploadedDate: new Date().getTime(), fileSize: asset.size, // stored in bytes width: metadata.width, diff --git a/src/v2/routes/search/asset/searchAssets.ts b/src/v2/routes/search/asset/searchAssets.ts index 64ca7ab..d4209ab 100644 --- a/src/v2/routes/search/asset/searchAssets.ts +++ b/src/v2/routes/search/asset/searchAssets.ts @@ -43,7 +43,7 @@ export async function searchForAssets(c: Context): Promise { ) ) : null, - eq(assets.status, "approved") + eq(assets.status, 1) ) }, ...(assetTagsList.length > 0 From d82a4ea091fb2676179112f52bcff35df037dcd1 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sat, 2 Sep 2023 19:42:26 +0100 Subject: [PATCH 072/318] yay --- src/v2/db/drizzle.ts | 9 +- src/v2/db/schema.ts | 167 ++++++++++++++---- .../auth/assets/favorite/addFavoriteAsset.ts | 28 +-- .../assets/favorite/removeFavoriteAsset.ts | 51 +++--- src/v2/routes/search/all/searchAll.ts | 10 +- 5 files changed, 183 insertions(+), 82 deletions(-) diff --git a/src/v2/db/drizzle.ts b/src/v2/db/drizzle.ts index def3c76..0ff00c8 100644 --- a/src/v2/db/drizzle.ts +++ b/src/v2/db/drizzle.ts @@ -13,10 +13,11 @@ export const tableNames = { passwordResetToken: "passwordResetToken", assetCategories: "assetCategories", savedOcGenerators: "savedOcGenerators", - favoritedAssets: "favoritedAssets", - assetCollection: "assetCollection", - assetCollectionAsset: "assetCollectionAsset", - socialsConnection: "socialsConnection", + userFavorites: "userFavorites", + userFavoritesAssets: "userFavoritesAssets", + userCollections: "assetCollection", + userCollectionAssets: "assetCollectionAsset", + socialsConnections: "socialsConnections", } export * as schema from "@/v2/db/schema" diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index 6d2f0dc..548d0cf 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -77,7 +77,7 @@ export const keys = sqliteTable( ) export const socialsConnections = sqliteTable( - tableNames.socialsConnection, + tableNames.socialsConnections, { id: text("id").primaryKey(), userId: text("user_id") @@ -237,8 +237,8 @@ export const follower = sqliteTable(tableNames.follower, { .references(() => users.id), }) -export const favoritedAssets = sqliteTable( - tableNames.favoritedAssets, +export const userFavorites = sqliteTable( + tableNames.userFavorites, { id: text("id").primaryKey(), userId: text("user_id") @@ -249,20 +249,52 @@ export const favoritedAssets = sqliteTable( }), isPublic: integer("is_public").default(0).notNull(), }, - (favoritedAssets) => { + (userFavorites) => { return { favoritedAssetsIdx: uniqueIndex("favorited_assets_id_idx").on( - favoritedAssets.id + userFavorites.id ), favoritedAssetsUserIdx: uniqueIndex( "favorited_assets_user_id_idx" - ).on(favoritedAssets.userId), + ).on(userFavorites.userId), } } ) -export const collections = sqliteTable( - tableNames.assetCollection, +export const userFavoritesAssets = sqliteTable( + tableNames.userFavoritesAssets, + { + id: text("id").primaryKey(), + userFavoritesId: text("favorited_assets_id") + .notNull() + .references(() => userFavorites.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + assetId: integer("asset_id") + .notNull() + .references(() => assets.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + }, + (userFavoritesAssets) => { + return { + favoritedAssetsAssetsIdx: uniqueIndex( + "favorited_assets_assets_id_idx" + ).on(userFavoritesAssets.id), + favoritedAssetsUserIdx: uniqueIndex( + "favorited_assets_user_id_idx" + ).on(userFavoritesAssets.userFavoritesId), + favoritedAssetsAssetsAssetIdx: uniqueIndex( + "favorited_assets_assets_asset_id_idx" + ).on(userFavoritesAssets.assetId), + } + } +) + +export const userCollections = sqliteTable( + tableNames.userCollections, { id: text("id").primaryKey(), name: text("name").notNull(), @@ -284,6 +316,38 @@ export const collections = sqliteTable( } ) +export const userCollectionAssets = sqliteTable( + tableNames.userCollectionAssets, + { + id: text("id").primaryKey(), + collectionId: text("collection_id") + .notNull() + .references(() => userCollections.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + assetId: integer("asset_id") + .notNull() + .references(() => assets.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + }, + (collectionAssets) => { + return { + collectionAssetsIdx: uniqueIndex("collection_assets_id_idx").on( + collectionAssets.id + ), + collectionAssetsCollectionIdx: uniqueIndex( + "collection_assets_collection_id_idx" + ).on(collectionAssets.collectionId), + collectionAssetsAssetIdx: uniqueIndex( + "collection_assets_asset_id_idx" + ).on(collectionAssets.assetId), + } + } +) + export const savedOcGenerators = sqliteTable( tableNames.savedOcGenerators, { @@ -316,25 +380,6 @@ export const gameRelations = relations(games, ({ many }) => ({ assets: many(assets), })) -export const assetCategoryRelations = relations( - assetCategories, - ({ many }) => ({ - assets: many(assets), - }) -) - -export const assetTagRelations = relations(assetTags, ({ many }) => ({ - assets: many(assets), -})) - -export const collectionRelations = relations(collections, ({ one, many }) => ({ - user: one(users, { - fields: [collections.userId], - references: [users.id], - }), - assets: many(assets), -})) - export const assetRelations = relations(assets, ({ one, many }) => ({ uploadedBy: one(users, { fields: [assets.uploadedById, assets.uploadedByName], @@ -351,14 +396,60 @@ export const assetRelations = relations(assets, ({ one, many }) => ({ }), })) -export const favoredAssetsRelations = relations( - favoritedAssets, +export const assetCategoryRelations = relations( + assetCategories, + ({ many }) => ({ + assets: many(assets), + }) +) + +export const assetTagRelations = relations(assetTags, ({ many }) => ({ + assets: many(assets), +})) + +export const collectionRelations = relations( + userCollections, ({ one, many }) => ({ user: one(users, { - fields: [favoritedAssets.userId], + fields: [userCollections.userId], references: [users.id], }), - assets: many(assets), + assets: many(userCollectionAssets), + }) +) + +export const collectionAssetsRelations = relations( + userCollectionAssets, + ({ one }) => ({ + collection: one(userCollections, { + fields: [userCollectionAssets.collectionId], + references: [userCollections.id], + }), + asset: one(assets, { + fields: [userCollectionAssets.assetId], + references: [assets.id], + }), + }) +) + +export const userFavoritesRelations = relations(userFavorites, ({ one }) => ({ + user: one(users, { + fields: [userFavorites.userId], + references: [users.id], + }), +})) + +export const userFavoritesAssetsRelations = relations( + userFavoritesAssets, + ({ one }) => ({ + favoritedAssets: one(userFavorites, { + fields: [userFavoritesAssets.userFavoritesId], + references: [userFavorites.id], + }), + asset: one(assets, { + fields: [userFavoritesAssets.assetId], + references: [assets.id], + }), }) ) @@ -376,14 +467,24 @@ export const keysRelations = relations(keys, ({ one }) => ({ }), })) +export const socialsConnectionsRelations = relations( + socialsConnections, + ({ one }) => ({ + user: one(users, { + fields: [socialsConnections.userId], + references: [users.id], + }), + }) +) + export const usersRelations = relations(users, ({ one, many }) => ({ session: many(sessions), key: many(keys), assets: many(assets), follower: many(follower), - favoritedAssets: one(favoritedAssets), + userFavorites: one(userFavorites), following: many(following), socialsConnection: one(socialsConnections), - collections: many(collections), + userCollections: many(userCollections), savedOcGenerators: many(savedOcGenerators), })) diff --git a/src/v2/routes/auth/assets/favorite/addFavoriteAsset.ts b/src/v2/routes/auth/assets/favorite/addFavoriteAsset.ts index 8702ce2..f8e5838 100644 --- a/src/v2/routes/auth/assets/favorite/addFavoriteAsset.ts +++ b/src/v2/routes/auth/assets/favorite/addFavoriteAsset.ts @@ -1,7 +1,7 @@ import { auth } from "@/v2/lib/auth/lucia" import { getConnection } from "@/v2/db/turso" import { APIContext as Context } from "@/worker-configuration" -import { favoritedAssets } from "@/v2/db/schema" +import { userFavorites, userFavoritesAssets } from "@/v2/db/schema" export async function favoriteAsset(c: Context): Promise { const drizzle = getConnection(c.env).drizzle @@ -35,27 +35,26 @@ export async function favoriteAsset(c: Context): Promise { } // this should never happen, but just in case it does, UX over reads/writes to the database - let userFavoritedAssets = await drizzle.query.favoritedAssets.findFirst({ - where: (favoritedAssets, { eq }) => - eq(favoritedAssets.userId, session.userId), + const userFavoritedAssets = await drizzle.query.userFavorites.findFirst({ + where: (userFavorites, { eq }) => + eq(userFavorites.userId, session.userId), }) if (!userFavoritedAssets) { - // create entry in favoritedAssets - const insertedFavoritedAsset = await drizzle - .insert(favoritedAssets) + // create entry in userFavorites + await drizzle + .insert(userFavorites) .values({ id: `${session.userId}-${assetToFavorite}`, userId: session.userId, isPublic: 0, // default to private }) .execute() - userFavoritedAssets = insertedFavoritedAsset[0] } - const isFavorited = drizzle.query.favoritedAssets.findFirst({ - where: (favoritedAssets, { eq }) => - eq(favoritedAssets.id, `${session.userId}-${assetToFavorite}`), + const isFavorited = drizzle.query.userFavorites.findFirst({ + where: (userFavorites, { eq }) => + eq(userFavorites.id, `${session.userId}-${assetToFavorite}`), with: { assets: { where: (assets, { eq }) => @@ -75,7 +74,12 @@ export async function favoriteAsset(c: Context): Promise { ) } - // add asset to favoritedAssets... + // add asset to userFavorites... + await drizzle.insert(userFavoritesAssets).values({ + id: `${session.userId}-${assetToFavorite}`, + userFavoritesId: (await isFavorited).id, + assetId: parseInt(assetToFavorite), + }) return c.json( { success: true, state: "favorited asset", assetToFavorite }, diff --git a/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts b/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts index 2c70413..fd64ae0 100644 --- a/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts +++ b/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts @@ -1,9 +1,10 @@ import { auth } from "@/v2/lib/auth/lucia" import { getConnection } from "@/v2/db/turso" +import { eq } from "drizzle-orm" import { APIContext as Context } from "@/worker-configuration" -import { favoritedAssets } from "@/v2/db/schema" +import { userFavorites, userFavoritesAssets } from "@/v2/db/schema" -export async function unFavoriteAsset(c: Context): Promise { +export async function removeFavoriteAsset(c: Context): Promise { const drizzle = getConnection(c.env).drizzle const authRequest = auth(c.env).handleRequest(c) @@ -18,16 +19,15 @@ export async function unFavoriteAsset(c: Context): Promise { } const formData = await c.req.formData() + const assetToRemove = formData.get("assetToRemove") as string | null - const assetToUnFavorite = formData.get("assetToUnFavorite") as string | null - - if (!assetToUnFavorite) { + if (!assetToRemove) { return c.json({ success: false, state: "no assetid entered" }, 200) } // check if asset exists const asset = await drizzle.query.assets.findFirst({ - where: (assets, { eq }) => eq(assets.id, parseInt(assetToUnFavorite)), + where: (assets, { eq }) => eq(assets.id, parseInt(assetToRemove)), }) if (!asset) { @@ -35,31 +35,30 @@ export async function unFavoriteAsset(c: Context): Promise { } // this should never happen, but just in case it does, UX over reads/writes to the database - let userFavoritedAssets = await drizzle.query.favoritedAssets.findFirst({ - where: (favoritedAssets, { eq }) => - eq(favoritedAssets.userId, session.userId), + const userFavoritedAssets = await drizzle.query.userFavorites.findFirst({ + where: (userFavorites, { eq }) => + eq(userFavorites.userId, session.userId), }) if (!userFavoritedAssets) { - // create entry in favoritedAssets - const insertedFavoritedAsset = await drizzle - .insert(favoritedAssets) + // create entry in userFavorites + await drizzle + .insert(userFavorites) .values({ - id: `${session.userId}-${assetToUnFavorite}`, + id: `${session.userId}-${assetToRemove}`, userId: session.userId, isPublic: 0, // default to private }) .execute() - userFavoritedAssets = insertedFavoritedAsset[0] } - const isFavorited = drizzle.query.favoritedAssets.findFirst({ - where: (favoritedAssets, { eq }) => - eq(favoritedAssets.id, `${session.userId}-${assetToUnFavorite}`), + const isFavorited = drizzle.query.userFavorites.findFirst({ + where: (userFavorites, { eq }) => + eq(userFavorites.id, `${session.userId}-${assetToRemove}`), with: { assets: { where: (assets, { eq }) => - eq(assets.id, parseInt(assetToUnFavorite)), + eq(assets.id, parseInt(assetToRemove)), }, }, }) @@ -69,20 +68,16 @@ export async function unFavoriteAsset(c: Context): Promise { { success: false, state: "asset isn't favorited", - assetToUnFavorite, + assetToRemove, }, 200 ) } - // remove asset from favoritedAssets.. + await drizzle + .delete(userFavoritesAssets) + .where(eq(userFavoritesAssets.id, `${session.userId}-${assetToRemove}`)) + .execute() - return c.json( - { - success: true, - state: "removed asset from favorites", - assetToUnFavorite, - }, - 200 - ) + return c.json({ success: true, state: "removed asset", assetToRemove }, 200) } diff --git a/src/v2/routes/search/all/searchAll.ts b/src/v2/routes/search/all/searchAll.ts index e9c62d0..54a0f8f 100644 --- a/src/v2/routes/search/all/searchAll.ts +++ b/src/v2/routes/search/all/searchAll.ts @@ -10,7 +10,7 @@ import { assetCategories, assetTags, savedOcGenerators, - collections, + userCollections, } from "@/v2/db/schema" export async function searchAll(c: Context): Promise { @@ -74,14 +74,14 @@ export async function searchAll(c: Context): Promise { .execute() const collectionsResponse = await drizzle .select() - .from(collections) + .from(userCollections) .where( and( or( - eq(collections.userId, session.userId), - not(eq(collections.isPublic, 0)) + eq(userCollections.userId, session.userId), + not(eq(userCollections.isPublic, 0)) ), - like(collections.name, `%${query}%`) + like(userCollections.name, `%${query}%`) ) ) .execute() From fcf8a7579575bcd7d53a4fb1a52b809625d8206f Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sat, 2 Sep 2023 19:48:25 +0100 Subject: [PATCH 073/318] refactor --- .../auth/assets/favorite/addFavoriteAsset.ts | 20 +++++++------------ .../assets/favorite/removeFavoriteAsset.ts | 19 +++++++----------- 2 files changed, 14 insertions(+), 25 deletions(-) diff --git a/src/v2/routes/auth/assets/favorite/addFavoriteAsset.ts b/src/v2/routes/auth/assets/favorite/addFavoriteAsset.ts index f8e5838..61603da 100644 --- a/src/v2/routes/auth/assets/favorite/addFavoriteAsset.ts +++ b/src/v2/routes/auth/assets/favorite/addFavoriteAsset.ts @@ -35,12 +35,12 @@ export async function favoriteAsset(c: Context): Promise { } // this should never happen, but just in case it does, UX over reads/writes to the database - const userFavoritedAssets = await drizzle.query.userFavorites.findFirst({ + const doesUserFavoritesExist = await drizzle.query.userFavorites.findFirst({ where: (userFavorites, { eq }) => eq(userFavorites.userId, session.userId), }) - if (!userFavoritedAssets) { + if (!doesUserFavoritesExist) { // create entry in userFavorites await drizzle .insert(userFavorites) @@ -52,22 +52,16 @@ export async function favoriteAsset(c: Context): Promise { .execute() } - const isFavorited = drizzle.query.userFavorites.findFirst({ - where: (userFavorites, { eq }) => - eq(userFavorites.id, `${session.userId}-${assetToFavorite}`), - with: { - assets: { - where: (assets, { eq }) => - eq(assets.id, parseInt(assetToFavorite)), - }, - }, + const isFavorited = await drizzle.query.userFavorites.findFirst({ + where: (userFavoritesAssets, { eq }) => + eq(userFavoritesAssets.id, `${session.userId}-${assetToFavorite}`), }) if (isFavorited) { return c.json( { success: false, - state: "asset is already favorited", + state: "asset is already favorited, therefore cannot be favorited", assetToFavorite, }, 200 @@ -77,7 +71,7 @@ export async function favoriteAsset(c: Context): Promise { // add asset to userFavorites... await drizzle.insert(userFavoritesAssets).values({ id: `${session.userId}-${assetToFavorite}`, - userFavoritesId: (await isFavorited).id, + userFavoritesId: isFavorited.id, assetId: parseInt(assetToFavorite), }) diff --git a/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts b/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts index fd64ae0..260d0be 100644 --- a/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts +++ b/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts @@ -35,12 +35,12 @@ export async function removeFavoriteAsset(c: Context): Promise { } // this should never happen, but just in case it does, UX over reads/writes to the database - const userFavoritedAssets = await drizzle.query.userFavorites.findFirst({ + const doesUserFavoritesExist = await drizzle.query.userFavorites.findFirst({ where: (userFavorites, { eq }) => eq(userFavorites.userId, session.userId), }) - if (!userFavoritedAssets) { + if (!doesUserFavoritesExist) { // create entry in userFavorites await drizzle .insert(userFavorites) @@ -52,28 +52,23 @@ export async function removeFavoriteAsset(c: Context): Promise { .execute() } - const isFavorited = drizzle.query.userFavorites.findFirst({ - where: (userFavorites, { eq }) => - eq(userFavorites.id, `${session.userId}-${assetToRemove}`), - with: { - assets: { - where: (assets, { eq }) => - eq(assets.id, parseInt(assetToRemove)), - }, - }, + const isFavorited = await drizzle.query.userFavorites.findFirst({ + where: (userFavoritesAssets, { eq }) => + eq(userFavoritesAssets.id, `${session.userId}-${assetToRemove}`), }) if (!isFavorited) { return c.json( { success: false, - state: "asset isn't favorited", + state: "asset is not favorited, therefore cannot be removed", assetToRemove, }, 200 ) } + // remove asset from userFavorites... await drizzle .delete(userFavoritesAssets) .where(eq(userFavoritesAssets.id, `${session.userId}-${assetToRemove}`)) From 248959ea8a24208d10070d4d33a1fa70f9717610 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sat, 2 Sep 2023 23:47:11 +0100 Subject: [PATCH 074/318] xcvmbnxcvsdfkj --- src/v2/db/schema.ts | 24 +++++-- src/v2/db/turso.ts | 9 ++- src/v2/routes/asset/getAssetFromId.ts | 21 +++--- .../asset-categories/createAssetCategory.ts | 63 +++++++++++++++++ .../asset-categories/deleteAssetCategory.ts | 67 +++++++++++++++++++ src/v2/routes/auth/assets/uploadAsset.ts | 12 ---- src/v2/routes/auth/games/createGame.ts | 56 ++++++++++++++++ src/v2/routes/auth/games/deleteGame.ts | 57 ++++++++++++++++ src/v2/routes/auth/tags/createTag.ts | 56 ++++++++++++++++ src/v2/routes/auth/tags/deleteTag.ts | 60 +++++++++++++++++ src/v2/routes/search/asset/searchAssets.ts | 30 +++++---- .../routes/search/user/getUserByUsername.ts | 4 ++ src/v2/routes/search/user/getUsersBySearch.ts | 13 ++-- 13 files changed, 425 insertions(+), 47 deletions(-) create mode 100644 src/v2/routes/auth/asset-categories/createAssetCategory.ts create mode 100644 src/v2/routes/auth/asset-categories/deleteAssetCategory.ts create mode 100644 src/v2/routes/auth/games/createGame.ts create mode 100644 src/v2/routes/auth/games/deleteGame.ts create mode 100644 src/v2/routes/auth/tags/createTag.ts create mode 100644 src/v2/routes/auth/tags/deleteTag.ts diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index 548d0cf..6d7df5b 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -138,7 +138,7 @@ export const assetCategories = sqliteTable( export const assets = sqliteTable( tableNames.assets, { - id: integer("id").primaryKey().notNull(), // primary key auto increments on sqlite + id: integer("id").primaryKey(), // primary key auto increments on sqlite name: text("name").notNull(), extension: text("extension").notNull(), game: text("game") @@ -280,9 +280,9 @@ export const userFavoritesAssets = sqliteTable( }, (userFavoritesAssets) => { return { - favoritedAssetsAssetsIdx: uniqueIndex( - "favorited_assets_assets_id_idx" - ).on(userFavoritesAssets.id), + favoritedAssetsAssetsIdx: uniqueIndex("favorited_assets_id_idx").on( + userFavoritesAssets.id + ), favoritedAssetsUserIdx: uniqueIndex( "favorited_assets_user_id_idx" ).on(userFavoritesAssets.userFavoritesId), @@ -488,3 +488,19 @@ export const usersRelations = relations(users, ({ one, many }) => ({ userCollections: many(userCollections), savedOcGenerators: many(savedOcGenerators), })) + +// export types +export type user = typeof users.$inferSelect +export type session = typeof sessions.$inferSelect +export type key = typeof keys.$inferSelect +export type socialsConnection = typeof socialsConnections.$inferSelect +export type game = typeof games.$inferSelect +export type assetCategory = typeof assetCategories.$inferSelect +export type asset = typeof assets.$inferSelect +export type assetTag = typeof assetTags.$inferSelect +export type following = typeof following.$inferSelect +export type follower = typeof follower.$inferSelect +export type userFavorites = typeof userFavorites.$inferSelect +export type userFavoritesAssets = typeof userFavoritesAssets.$inferSelect +export type userCollections = typeof userCollections.$inferSelect +export type userCollectionAssets = typeof userCollectionAssets.$inferSelect diff --git a/src/v2/db/turso.ts b/src/v2/db/turso.ts index f4923e5..21ef799 100644 --- a/src/v2/db/turso.ts +++ b/src/v2/db/turso.ts @@ -2,6 +2,13 @@ import { Bindings as Env } from "@/worker-configuration" import * as schema from "@/v2/db/schema" import { drizzle as drizzleORM } from "drizzle-orm/libsql" import { createClient } from "@libsql/client/web" // because we're in a worker +import { Logger } from "drizzle-orm/logger" + +class LoggerWrapper implements Logger { + logQuery(query: string, params: unknown[]): void { + console.log(`DRIZZLE: Query: ${query}, Paremeters: ${params ?? "none"}`) + } +} // wrapper for turso & drizzle export function getConnection(env: Env) { @@ -12,7 +19,7 @@ export function getConnection(env: Env) { const drizzle = drizzleORM(turso, { schema, - logger: true, + logger: new LoggerWrapper(), }) return { diff --git a/src/v2/routes/asset/getAssetFromId.ts b/src/v2/routes/asset/getAssetFromId.ts index 96ad769..59df54d 100644 --- a/src/v2/routes/asset/getAssetFromId.ts +++ b/src/v2/routes/asset/getAssetFromId.ts @@ -2,7 +2,7 @@ import { responseHeaders } from "@/v2/lib/responseHeaders" import { getConnection } from "@/v2/db/turso" import { assets } from "@/v2/db/schema" import { createNotFoundResponse } from "@/v2/lib/helpers/responses/notFoundResponse" -import { eq, desc } from "drizzle-orm" +import { desc } from "drizzle-orm" import type { APIContext as Context } from "@/worker-configuration" export async function getAssetFromId(c: Context): Promise { @@ -16,7 +16,8 @@ export async function getAssetFromId(c: Context): Promise { const drizzle = await getConnection(c.env).drizzle const asset = await drizzle.query.assets.findFirst({ - where: (assets, { eq }) => eq(assets.id, parseInt(id)), + where: (assets, { eq, and }) => + and(eq(assets.status, 1), eq(assets.id, parseInt(id))), }) if (!asset) { @@ -25,13 +26,15 @@ export async function getAssetFromId(c: Context): Promise { return response } - const similarAssets = await drizzle - .select() - .from(assets) - .where(eq(assets.assetCategory, asset.assetCategory)) - .limit(6) - .orderBy(desc(assets.id)) - .execute() + const similarAssets = await drizzle.query.assets.findMany({ + where: (assets, { eq, and }) => + and( + eq(assets.status, 1), + eq(assets.assetCategory, asset.assetCategory) + ), + limit: 6, + orderBy: desc(assets.id), + }) response = c.json( { diff --git a/src/v2/routes/auth/asset-categories/createAssetCategory.ts b/src/v2/routes/auth/asset-categories/createAssetCategory.ts new file mode 100644 index 0000000..cb69491 --- /dev/null +++ b/src/v2/routes/auth/asset-categories/createAssetCategory.ts @@ -0,0 +1,63 @@ +import { auth } from "@/v2/lib/auth/lucia" +import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" +import { getConnection } from "@/v2/db/turso" +import { APIContext as Context } from "@/worker-configuration" +import { assetCategories } from "@/v2/db/schema" + +export async function createAssetCategory(c: Context): Promise { + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() + + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + return c.json({ success: false, state: "invalid session" }, 200) + } + + const roleFlags = roleFlagsToArray(session.user.role_flags) + + if (!roleFlags.includes("CREATOR")) { + return c.json({ success: false, state: "unauthorized" }, 401) + } + + const drizzle = await getConnection(c.env).drizzle + + const formData = await c.req.formData() + + const assetCategory = { + id: crypto.randomUUID(), + name: formData.get("name") as string, + formattedName: formData.get("formattedName") as string, + assetCount: 0, + lastUpdated: new Date().getTime(), // unix timestamp + } + + // check if assetCategory.name exists + const assetCategoryExists = await drizzle.query.assetCategories.findFirst({ + where: (assetCategories, { eq }) => + eq(assetCategories.name, assetCategory.name), + }) + + if (assetCategoryExists) { + return c.json( + { success: false, state: "assetCategory with name already exists" }, + 200 + ) + } + + try { + await drizzle.insert(assetCategories).values(assetCategory).execute() + } catch (e) { + return c.json( + { success: false, state: "failed to create assetCategory" }, + 200 + ) + } + + return c.json( + { success: true, state: "created assetcategory", assetCategory }, + 200 + ) +} diff --git a/src/v2/routes/auth/asset-categories/deleteAssetCategory.ts b/src/v2/routes/auth/asset-categories/deleteAssetCategory.ts new file mode 100644 index 0000000..d404f9b --- /dev/null +++ b/src/v2/routes/auth/asset-categories/deleteAssetCategory.ts @@ -0,0 +1,67 @@ +import { auth } from "@/v2/lib/auth/lucia" +import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" +import { getConnection } from "@/v2/db/turso" +import { APIContext as Context } from "@/worker-configuration" +import { eq } from "drizzle-orm" +import { assetCategories } from "@/v2/db/schema" + +export async function deleteAssetCategory(c: Context): Promise { + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() + + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + return c.json({ success: false, state: "invalid session" }, 200) + } + + const roleFlags = roleFlagsToArray(session.user.role_flags) + + if (!roleFlags.includes("CREATOR")) { + return c.json({ success: false, state: "unauthorized" }, 401) + } + + const drizzle = await getConnection(c.env).drizzle + + const formData = await c.req.formData() + + const assetCategory = { + id: formData.get("id") as string | null, + } + + if (!assetCategory.id) { + return c.json({ success: false, state: "no id entered" }, 200) + } + + // check if assetCategory exists + const assetCategoryExists = await drizzle.query.assetCategories.findFirst({ + where: (assetCategories, { eq }) => + eq(assetCategories.id, assetCategory.id), + }) + + if (!assetCategoryExists) { + return c.json( + { success: false, state: "assetCategory with ID doesn't exist" }, + 200 + ) + } + + try { + await drizzle + .delete(assetCategories) + .where(eq(assetCategories.id, assetCategory.id)) + .execute() + } catch (e) { + return c.json( + { success: false, state: "failed to delete assetCategory" }, + 200 + ) + } + + return c.json( + { success: true, state: "deleted assetCategory", assetCategory }, + 200 + ) +} diff --git a/src/v2/routes/auth/assets/uploadAsset.ts b/src/v2/routes/auth/assets/uploadAsset.ts index 39aa3ea..34559dc 100644 --- a/src/v2/routes/auth/assets/uploadAsset.ts +++ b/src/v2/routes/auth/assets/uploadAsset.ts @@ -57,18 +57,6 @@ export async function uploadAsset(c: Context): Promise { type: asset.type, }) - const duplicateAsset = await drizzle.query.assets.findFirst({ - where: (assets, { and, eq }) => - and( - eq(assets.name, newAsset.name), - eq(assets.game, newAsset.game), - eq(assets.assetCategory, newAsset.assetCategory) - ), - }) - - if (duplicateAsset) - return c.json({ success: false, state: "duplicate asset" }, 400) - try { await c.env.bucket.put( `/assets/${metadata.game}/${metadata.category}/${metadata.name}.${metadata.extension}`, diff --git a/src/v2/routes/auth/games/createGame.ts b/src/v2/routes/auth/games/createGame.ts new file mode 100644 index 0000000..4c805e4 --- /dev/null +++ b/src/v2/routes/auth/games/createGame.ts @@ -0,0 +1,56 @@ +import { auth } from "@/v2/lib/auth/lucia" +import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" +import { getConnection } from "@/v2/db/turso" +import { APIContext as Context } from "@/worker-configuration" +import { games } from "@/v2/db/schema" + +export async function createGame(c: Context): Promise { + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() + + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + return c.json({ success: false, state: "invalid session" }, 200) + } + + const roleFlags = roleFlagsToArray(session.user.role_flags) + + if (!roleFlags.includes("CREATOR")) { + return c.json({ success: false, state: "unauthorized" }, 401) + } + + const drizzle = await getConnection(c.env).drizzle + + const formData = await c.req.formData() + + const game = { + id: crypto.randomUUID(), + name: formData.get("name") as string, + formattedName: formData.get("formattedName") as string, + assetCount: 0, + lastUpdated: new Date().getTime(), // unix timestamp + } + + // check if game.name exists + const gameExists = await drizzle.query.assetCategories.findFirst({ + where: (assetCategories, { eq }) => eq(assetCategories.name, game.name), + }) + + if (gameExists) { + return c.json( + { success: false, state: "game with name already exists" }, + 200 + ) + } + + try { + await drizzle.insert(games).values(game).execute() + } catch (e) { + return c.json({ success: false, state: "failed to create game" }, 200) + } + + return c.json({ success: true, state: "created game", game }, 200) +} diff --git a/src/v2/routes/auth/games/deleteGame.ts b/src/v2/routes/auth/games/deleteGame.ts new file mode 100644 index 0000000..069f8db --- /dev/null +++ b/src/v2/routes/auth/games/deleteGame.ts @@ -0,0 +1,57 @@ +import { auth } from "@/v2/lib/auth/lucia" +import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" +import { getConnection } from "@/v2/db/turso" +import { APIContext as Context } from "@/worker-configuration" +import { games } from "@/v2/db/schema" +import { eq } from "drizzle-orm" + +export async function deleteGame(c: Context): Promise { + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() + + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + return c.json({ success: false, state: "invalid session" }, 200) + } + + const roleFlags = roleFlagsToArray(session.user.role_flags) + + if (!roleFlags.includes("CREATOR")) { + return c.json({ success: false, state: "unauthorized" }, 401) + } + + const drizzle = await getConnection(c.env).drizzle + + const formData = await c.req.formData() + + const game = { + id: formData.get("id") as string | null, + } + + if (!game.id) { + return c.json({ success: false, state: "no id entered" }, 200) + } + + // check if game exists + const gameExists = await drizzle.query.games.findFirst({ + where: (games, { eq }) => eq(games.id, game.id), + }) + + if (!gameExists) { + return c.json( + { success: false, state: "game with ID doesn't exist" }, + 200 + ) + } + + try { + await drizzle.delete(games).where(eq(games.id, game.id)).execute() + } catch (e) { + return c.json({ success: false, state: "failed to delete game" }, 200) + } + + return c.json({ success: true, state: "deleted game", game }, 200) +} diff --git a/src/v2/routes/auth/tags/createTag.ts b/src/v2/routes/auth/tags/createTag.ts new file mode 100644 index 0000000..fb9aab8 --- /dev/null +++ b/src/v2/routes/auth/tags/createTag.ts @@ -0,0 +1,56 @@ +import { auth } from "@/v2/lib/auth/lucia" +import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" +import { getConnection } from "@/v2/db/turso" +import { APIContext as Context } from "@/worker-configuration" +import { assetTags } from "@/v2/db/schema" + +export async function createTag(c: Context): Promise { + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() + + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + return c.json({ success: false, state: "invalid session" }, 200) + } + + const roleFlags = roleFlagsToArray(session.user.role_flags) + + if (!roleFlags.includes("CREATOR")) { + return c.json({ success: false, state: "unauthorized" }, 401) + } + + const drizzle = await getConnection(c.env).drizzle + + const formData = await c.req.formData() + + const tag = { + id: crypto.randomUUID(), + name: formData.get("name") as string, + formattedName: formData.get("formattedName") as string, + assetCount: 0, + lastUpdated: new Date().getTime(), // unix timestamp + } + + // check if tag.name exists + const tagExists = await drizzle.query.assetTags.findFirst({ + where: (assetTags, { eq }) => eq(assetTags.name, tag.name), + }) + + if (tagExists) { + return c.json( + { success: false, state: "tag with name already exists" }, + 200 + ) + } + + try { + await drizzle.insert(assetTags).values(tag).execute() + } catch (e) { + return c.json({ success: false, state: "failed to create tag" }, 200) + } + + return c.json({ success: true, state: "created tag", tag }, 200) +} diff --git a/src/v2/routes/auth/tags/deleteTag.ts b/src/v2/routes/auth/tags/deleteTag.ts new file mode 100644 index 0000000..5a1fdb6 --- /dev/null +++ b/src/v2/routes/auth/tags/deleteTag.ts @@ -0,0 +1,60 @@ +import { auth } from "@/v2/lib/auth/lucia" +import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" +import { getConnection } from "@/v2/db/turso" +import { APIContext as Context } from "@/worker-configuration" +import { assetTags } from "@/v2/db/schema" +import { eq } from "drizzle-orm" + +export async function deleteTag(c: Context): Promise { + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() + + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + return c.json({ success: false, state: "invalid session" }, 200) + } + + const roleFlags = roleFlagsToArray(session.user.role_flags) + + if (!roleFlags.includes("CREATOR")) { + return c.json({ success: false, state: "unauthorized" }, 401) + } + + const drizzle = await getConnection(c.env).drizzle + + const formData = await c.req.formData() + + const tag = { + id: formData.get("id") as string | null, + } + + if (!tag.id) { + return c.json({ success: false, state: "no id entered" }, 200) + } + + // check if tag exists + const tagExists = await drizzle.query.assetTags.findFirst({ + where: (assetTags, { eq }) => eq(assetTags.id, tag.id), + }) + + if (!tagExists) { + return c.json( + { success: false, state: "tag with ID doesn't exist" }, + 200 + ) + } + + try { + await drizzle + .delete(assetTags) + .where(eq(assetTags.id, tag.id)) + .execute() + } catch (e) { + return c.json({ success: false, state: "failed to delete tag" }, 200) + } + + return c.json({ success: true, state: "deleted tag", tag }, 200) +} diff --git a/src/v2/routes/search/asset/searchAssets.ts b/src/v2/routes/search/asset/searchAssets.ts index d4209ab..911ccf0 100644 --- a/src/v2/routes/search/asset/searchAssets.ts +++ b/src/v2/routes/search/asset/searchAssets.ts @@ -2,6 +2,8 @@ import { responseHeaders } from "@/v2/lib/responseHeaders" import { getConnection } from "@/v2/db/turso" import { like } from "drizzle-orm" import type { APIContext as Context } from "@/worker-configuration" +import { assets } from "@/v2/db/schema" +import { desc } from "drizzle-orm" import { SplitQueryByCommas } from "@/v2/lib/helpers/splitQueryByCommas" export async function searchForAssets(c: Context): Promise { @@ -46,21 +48,21 @@ export async function searchForAssets(c: Context): Promise { eq(assets.status, 1) ) }, - ...(assetTagsList.length > 0 - ? { - with: { - assetTags: { - where: (assetTags, { and, eq }) => { - return and( - ...assetTagsList.map((assetTag) => - eq(assetTags.name, assetTag) - ) - ) - }, - }, + ...(assetTagsList.length > 0 && { + with: { + assetTags: { + where: (assetTags, { and, eq }) => { + return and( + ...assetTagsList.map((assetTag) => + eq(assetTags.name, assetTag) + ) + ) }, - } - : {}), + }, + }, + }), + orderBy: desc(assets.id), + limit: 1000, }) response = c.json( diff --git a/src/v2/routes/search/user/getUserByUsername.ts b/src/v2/routes/search/user/getUserByUsername.ts index d82cfa3..778bb5e 100644 --- a/src/v2/routes/search/user/getUserByUsername.ts +++ b/src/v2/routes/search/user/getUserByUsername.ts @@ -2,6 +2,7 @@ import { responseHeaders } from "@/v2/lib/responseHeaders" import { getConnection } from "@/v2/db/turso" import { createNotFoundResponse } from "@/v2/lib/helpers/responses/notFoundResponse" import type { APIContext as Context } from "@/worker-configuration" +import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" export async function getUserByUsername(c: Context): Promise { const { username } = c.req.param() @@ -27,6 +28,9 @@ export async function getUserByUsername(c: Context): Promise { user.email = undefined user.emailVerified = undefined + // converting role flags to array + user.roleFlags = roleFlagsToArray(user.role_flags) + response = c.json( { success: true, diff --git a/src/v2/routes/search/user/getUsersBySearch.ts b/src/v2/routes/search/user/getUsersBySearch.ts index dd979f8..f973801 100644 --- a/src/v2/routes/search/user/getUsersBySearch.ts +++ b/src/v2/routes/search/user/getUsersBySearch.ts @@ -1,8 +1,7 @@ import { responseHeaders } from "@/v2/lib/responseHeaders" import { createNotFoundResponse } from "@/v2/lib/helpers/responses/notFoundResponse" -import { like } from "drizzle-orm" import { getConnection } from "@/v2/db/turso" -import { users } from "@/v2/db/schema" +import { like } from "drizzle-orm" import type { APIContext as Context } from "@/worker-configuration" export async function getUsersBySearch(c: Context): Promise { @@ -14,11 +13,11 @@ export async function getUsersBySearch(c: Context): Promise { const { query } = c.req.param() const drizzle = await getConnection(c.env).drizzle - const userList = await drizzle - .select() - .from(users) - .where(like(users.username, `%${query}%`)) - .execute() + const userList = await drizzle.query.users.findMany({ + where: (users, { or }) => { + return or(like(users.username, `%${query}%`)) + }, + }) if (!userList) { return createNotFoundResponse(c, "Users not found", responseHeaders) From 17f3e3de6a18f1447e5dc94adae2deeef221bb03 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 3 Sep 2023 00:33:10 +0100 Subject: [PATCH 075/318] mfw im about to sleep and my brain starts working --- .../assets/favorite/viewFavoriteAssets.ts | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/v2/routes/auth/assets/favorite/viewFavoriteAssets.ts diff --git a/src/v2/routes/auth/assets/favorite/viewFavoriteAssets.ts b/src/v2/routes/auth/assets/favorite/viewFavoriteAssets.ts new file mode 100644 index 0000000..a7a4d55 --- /dev/null +++ b/src/v2/routes/auth/assets/favorite/viewFavoriteAssets.ts @@ -0,0 +1,41 @@ +import { auth } from "@/v2/lib/auth/lucia" +import { getConnection } from "@/v2/db/turso" +import { APIContext as Context } from "@/worker-configuration" + +export async function viewFavoriteAssets(c: Context): Promise { + const drizzle = getConnection(c.env).drizzle + + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() + + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + return c.json({ success: false, state: "invalid session" }, 200) + } + + // check if userFavorites exists + const userFavoritesExists = await drizzle.query.userFavorites.findFirst({ + where: (userFavorites, { eq }) => + eq(userFavorites.userId, session.userId), + }) + + if (!userFavoritesExists) { + return c.json({ success: false, state: "no favorites found" }, 200) + } + + const favoriteAssets = await drizzle.query.userFavoritesAssets.findMany({ + where: (userFavoritesAssets, { eq }) => + eq(userFavoritesAssets.userFavoritesId, userFavoritesExists.id), + with: { + assets: true, + }, + }) + + return c.json( + { success: true, state: "found favorites", favoriteAssets }, + 200 + ) +} From c2d6b0a9535d0cb68b4704612c1c8bb4fb3f089d Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 3 Sep 2023 00:49:56 +0100 Subject: [PATCH 076/318] =?UTF-8?q?fuck=20yeah=20asset=20collections=20let?= =?UTF-8?q?s=20g=20=F0=9F=92=AF=F0=9F=92=AF=F0=9F=92=AF=F0=9F=92=AF?= =?UTF-8?q?=F0=9F=92=AF=F0=9F=92=AF=F0=9F=92=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/v2/db/schema.ts | 1 + .../collections/addAssetToCollection.ts | 86 +++++++++++++++++ .../collections/createAssetCollection.ts | 67 ++++++++++++++ .../collections/deleteAssetCollection.ts | 54 +++++++++++ .../collections/deleteAssetFromCollection.ts | 92 +++++++++++++++++++ .../assets/collections/viewAssetCollection.ts | 73 +++++++++++++++ .../collections/viewAssetCollections.ts | 43 +++++++++ 7 files changed, 416 insertions(+) create mode 100644 src/v2/routes/auth/assets/collections/addAssetToCollection.ts create mode 100644 src/v2/routes/auth/assets/collections/createAssetCollection.ts create mode 100644 src/v2/routes/auth/assets/collections/deleteAssetCollection.ts create mode 100644 src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts create mode 100644 src/v2/routes/auth/assets/collections/viewAssetCollection.ts create mode 100644 src/v2/routes/auth/assets/collections/viewAssetCollections.ts diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index 6d7df5b..aaa09e0 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -298,6 +298,7 @@ export const userCollections = sqliteTable( { id: text("id").primaryKey(), name: text("name").notNull(), + description: text("description").notNull(), userId: text("user_id") .notNull() .references(() => users.id, { diff --git a/src/v2/routes/auth/assets/collections/addAssetToCollection.ts b/src/v2/routes/auth/assets/collections/addAssetToCollection.ts new file mode 100644 index 0000000..43254e2 --- /dev/null +++ b/src/v2/routes/auth/assets/collections/addAssetToCollection.ts @@ -0,0 +1,86 @@ +import { auth } from "@/v2/lib/auth/lucia" +import { getConnection } from "@/v2/db/turso" +import { APIContext as Context } from "@/worker-configuration" +import { userCollectionAssets } from "@/v2/db/schema" + +export async function addAssetToCollection(c: Context): Promise { + const drizzle = getConnection(c.env).drizzle + + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() + + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + return c.json({ success: false, state: "invalid session" }, 200) + } + + const formData = await c.req.formData() + + const collection = { + id: formData.get("collectionId") as string | null, + assetId: formData.get("assetId") as string | null, + } + + if (!collection.id) { + return c.json( + { success: false, state: "no collection id entered" }, + 200 + ) + } + + if (!collection.assetId) { + return c.json({ success: false, state: "no asset id entered" }, 200) + } + + // check if collection exists + const collectionExists = await drizzle.query.userCollections.findFirst({ + where: (userCollections, { eq }) => + eq(userCollections.id, collection.id), + }) + + if (!collectionExists) { + return c.json( + { success: false, state: "collection with ID doesn't exist" }, + 200 + ) + } + + // check if asset exists + const assetExists = await drizzle.query.assets.findFirst({ + where: (assets, { eq }) => eq(assets.id, parseInt(collection.assetId)), + }) + + if (!assetExists) { + return c.json({ success: false, state: "asset not found" }, 200) + } + + // check if userCollectionAssets exists + const userCollectionAssetsExists = + await drizzle.query.userCollectionAssets.findFirst({ + where: (userCollectionAssets, { eq }) => + eq(userCollectionAssets.collectionId, collection.id) && + eq(userCollectionAssets.assetId, parseInt(collection.assetId)), + }) + + if (userCollectionAssetsExists) { + return c.json( + { success: false, state: "asset already exists in collection" }, + 200 + ) + } + + // create entry in userCollectionAssets + await drizzle + .insert(userCollectionAssets) + .values({ + id: crypto.randomUUID(), + collectionId: collection.id, + assetId: parseInt(collection.assetId), + }) + .execute() + + return c.json({ success: true, state: "added asset to collection" }, 200) +} diff --git a/src/v2/routes/auth/assets/collections/createAssetCollection.ts b/src/v2/routes/auth/assets/collections/createAssetCollection.ts new file mode 100644 index 0000000..1242f65 --- /dev/null +++ b/src/v2/routes/auth/assets/collections/createAssetCollection.ts @@ -0,0 +1,67 @@ +import { auth } from "@/v2/lib/auth/lucia" +import { getConnection } from "@/v2/db/turso" +import { APIContext as Context } from "@/worker-configuration" +import { userCollections } from "@/v2/db/schema" + +export async function createAssetCollection(c: Context): Promise { + const drizzle = getConnection(c.env).drizzle + + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() + + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + return c.json({ success: false, state: "invalid session" }, 200) + } + + const formData = await c.req.formData() + + const collection = { + name: formData.get("collectionName") as string | null, + description: formData.get("collectionDescription") as string | null, + } + + if (!collection.name) { + return c.json( + { success: false, state: "no collection name entered" }, + 200 + ) + } + + if (!collection.description) { + return c.json( + { success: false, state: "no collection description entered" }, + 200 + ) + } + + // check if collection exists + const collectionExists = await drizzle.query.userCollections.findFirst({ + where: (userCollections, { eq }) => + eq(userCollections.name, collection.name), + }) + + if (collectionExists) { + return c.json( + { success: false, state: "collection with name already exists" }, + 200 + ) + } + + // create entry in userCollections + await drizzle + .insert(userCollections) + .values({ + id: crypto.randomUUID(), + name: collection.name, + description: collection.description, + userId: session.userId, + isPublic: 0, // default to private + }) + .execute() + + return c.json({ success: true, state: "created collection" }, 200) +} diff --git a/src/v2/routes/auth/assets/collections/deleteAssetCollection.ts b/src/v2/routes/auth/assets/collections/deleteAssetCollection.ts new file mode 100644 index 0000000..cae8fbd --- /dev/null +++ b/src/v2/routes/auth/assets/collections/deleteAssetCollection.ts @@ -0,0 +1,54 @@ +import { auth } from "@/v2/lib/auth/lucia" +import { getConnection } from "@/v2/db/turso" +import { APIContext as Context } from "@/worker-configuration" +import { eq } from "drizzle-orm" +import { userCollections } from "@/v2/db/schema" + +export async function deleteAssetCollection(c: Context): Promise { + const drizzle = getConnection(c.env).drizzle + + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() + + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + return c.json({ success: false, state: "invalid session" }, 200) + } + + const formData = await c.req.formData() + + const collection = { + id: formData.get("collectionId") as string | null, + } + + if (!collection.id) { + return c.json( + { success: false, state: "no collection id entered" }, + 200 + ) + } + + // check if collection exists + const collectionExists = await drizzle.query.userCollections.findFirst({ + where: (userCollections, { eq }) => + eq(userCollections.id, collection.id), + }) + + if (!collectionExists) { + return c.json( + { success: false, state: "collection with ID doesn't exist" }, + 200 + ) + } + + // delete collection + await drizzle + .delete(userCollections) + .where(eq(userCollections.id, collection.id)) + .execute() + + return c.json({ success: true, state: "collection deleted" }, 200) +} diff --git a/src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts b/src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts new file mode 100644 index 0000000..5ebde0a --- /dev/null +++ b/src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts @@ -0,0 +1,92 @@ +import { auth } from "@/v2/lib/auth/lucia" +import { getConnection } from "@/v2/db/turso" +import { APIContext as Context } from "@/worker-configuration" +import { userCollectionAssets } from "@/v2/db/schema" +import { eq } from "drizzle-orm" + +export async function deleteAssetFromCollection(c: Context): Promise { + const drizzle = getConnection(c.env).drizzle + + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() + + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + return c.json({ success: false, state: "invalid session" }, 200) + } + + const formData = await c.req.formData() + + const collection = { + id: formData.get("collectionId") as string | null, + assetId: formData.get("assetId") as string | null, + } + + if (!collection.id) { + return c.json( + { success: false, state: "no collection id entered" }, + 200 + ) + } + + if (!collection.assetId) { + return c.json({ success: false, state: "no asset id entered" }, 200) + } + + // check if collection exists + const collectionExists = await drizzle.query.userCollections.findFirst({ + where: (userCollections, { eq }) => + eq(userCollections.id, collection.id), + }) + + if (!collectionExists) { + return c.json( + { success: false, state: "collection with ID doesn't exist" }, + 200 + ) + } + + // check if asset exists + const assetExists = await drizzle.query.assets.findFirst({ + where: (assets, { eq }) => eq(assets.id, parseInt(collection.assetId)), + }) + + if (!assetExists) { + return c.json({ success: false, state: "asset not found" }, 200) + } + + // check if userCollectionAssets exists + const userCollectionAssetsExists = + await drizzle.query.userCollectionAssets.findFirst({ + where: (userCollectionAssets, { eq }) => + eq(userCollectionAssets.collectionId, collection.id) && + eq(userCollectionAssets.assetId, parseInt(collection.assetId)), + }) + + if (!userCollectionAssetsExists) { + return c.json( + { success: false, state: "asset not found in collection" }, + 200 + ) + } + + try { + await drizzle + .delete(userCollectionAssets) + .where(eq(userCollectionAssets.id, userCollectionAssetsExists.id)) + .execute() + } catch (e) { + return c.json( + { success: false, state: "failed to delete asset from collection" }, + 200 + ) + } + + return c.json( + { success: true, state: "deleted asset from collection" }, + 200 + ) +} diff --git a/src/v2/routes/auth/assets/collections/viewAssetCollection.ts b/src/v2/routes/auth/assets/collections/viewAssetCollection.ts new file mode 100644 index 0000000..e322f6b --- /dev/null +++ b/src/v2/routes/auth/assets/collections/viewAssetCollection.ts @@ -0,0 +1,73 @@ +import { auth } from "@/v2/lib/auth/lucia" +import { getConnection } from "@/v2/db/turso" +import { APIContext as Context } from "@/worker-configuration" + +export async function viewAssetCollection(c: Context): Promise { + const drizzle = getConnection(c.env).drizzle + + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() + + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + return c.json({ success: false, state: "invalid session" }, 200) + } + + const formData = await c.req.formData() + + const collection = { + id: formData.get("collectionId") as string | null, + } + + if (!collection.id) { + return c.json( + { success: false, state: "no collection id entered" }, + 200 + ) + } + + // check if the user owns the collection, or if the collection is public + try { + await drizzle.query.userCollections.findFirst({ + where: (userCollections, { eq, or, and }) => + and( + or( + eq(userCollections.id, collection.id), + eq(userCollections.isPublic, 1) + ), + eq(userCollections.userId, session.userId) + ), + }) + } catch (e) { + return c.json( + { success: false, state: "collection with ID doesn't exist" }, + 200 + ) + } + + const assetCollection = await drizzle.query.userCollections.findFirst({ + where: (userCollections, { eq, or, and }) => + and( + or( + eq(userCollections.id, collection.id), + eq(userCollections.isPublic, 1) + ), + eq(userCollections.userId, session.userId) + ), + with: { + userCollectionAssets: { + with: { + assets: true, + }, + }, + }, + }) + + return c.json( + { success: true, state: "found collection", assetCollection }, + 200 + ) +} diff --git a/src/v2/routes/auth/assets/collections/viewAssetCollections.ts b/src/v2/routes/auth/assets/collections/viewAssetCollections.ts new file mode 100644 index 0000000..e3d166b --- /dev/null +++ b/src/v2/routes/auth/assets/collections/viewAssetCollections.ts @@ -0,0 +1,43 @@ +import { auth } from "@/v2/lib/auth/lucia" +import { getConnection } from "@/v2/db/turso" +import { APIContext as Context } from "@/worker-configuration" + +export async function viewAssetCollections(c: Context): Promise { + const drizzle = getConnection(c.env).drizzle + + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() + + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + return c.json({ success: false, state: "invalid session" }, 200) + } + + // check if userCollections exists + const userCollectionsExists = await drizzle.query.userCollections.findFirst( + { + where: (userCollections, { eq }) => + eq(userCollections.userId, session.userId), + } + ) + + if (!userCollectionsExists) { + return c.json({ success: false, state: "no collections found" }, 200) + } + + const assetCollection = await drizzle.query.userCollectionAssets.findMany({ + where: (userCollectionAssets, { eq }) => + eq(userCollectionAssets.collectionId, userCollectionsExists.id), + with: { + assets: true, + }, + }) + + return c.json( + { success: true, state: "found collections", assetCollection }, + 200 + ) +} From 68d3d33ceec4a67b4863d7db4f4d160f1d8dd3e1 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 3 Sep 2023 01:13:09 +0100 Subject: [PATCH 077/318] asset validity checks --- src/v2/db/schema.ts | 2 + .../collections/addAssetToCollection.ts | 19 +++++++--- .../collections/createAssetCollection.ts | 1 + .../auth/assets/favorite/addFavoriteAsset.ts | 9 +++-- .../oc-generators/saveOCGeneratorResponse.ts | 1 + src/v2/routes/search/asset/recentAssets.ts | 11 +++--- .../routes/search/user/getUserByUsername.ts | 38 ++++++++++++++++++- 7 files changed, 65 insertions(+), 16 deletions(-) diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index aaa09e0..be2c4be 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -305,6 +305,7 @@ export const userCollections = sqliteTable( onUpdate: "cascade", onDelete: "cascade", }), + dateCreated: integer("date_created").notNull(), isPublic: integer("is_public").default(0).notNull(), }, (collection) => { @@ -361,6 +362,7 @@ export const savedOcGenerators = sqliteTable( }), name: text("name").notNull(), game: text("game").notNull(), + dateCreated: integer("date_created").notNull(), isPublic: integer("is_public").default(0).notNull(), content: text("content").notNull(), // this is stored as json, which is then parsed on the frontend }, diff --git a/src/v2/routes/auth/assets/collections/addAssetToCollection.ts b/src/v2/routes/auth/assets/collections/addAssetToCollection.ts index 43254e2..7141a8e 100644 --- a/src/v2/routes/auth/assets/collections/addAssetToCollection.ts +++ b/src/v2/routes/auth/assets/collections/addAssetToCollection.ts @@ -48,9 +48,13 @@ export async function addAssetToCollection(c: Context): Promise { ) } - // check if asset exists + // check if asset exists, and status is 1 (approved) const assetExists = await drizzle.query.assets.findFirst({ - where: (assets, { eq }) => eq(assets.id, parseInt(collection.assetId)), + where: (assets, { eq, and }) => + and( + eq(assets.id, parseInt(collection.assetId)), + eq(assets.status, 1) + ), }) if (!assetExists) { @@ -60,9 +64,14 @@ export async function addAssetToCollection(c: Context): Promise { // check if userCollectionAssets exists const userCollectionAssetsExists = await drizzle.query.userCollectionAssets.findFirst({ - where: (userCollectionAssets, { eq }) => - eq(userCollectionAssets.collectionId, collection.id) && - eq(userCollectionAssets.assetId, parseInt(collection.assetId)), + where: (userCollectionAssets, { eq, and }) => + and( + eq(userCollectionAssets.collectionId, collection.id), + eq( + userCollectionAssets.assetId, + parseInt(collection.assetId) + ) + ), }) if (userCollectionAssetsExists) { diff --git a/src/v2/routes/auth/assets/collections/createAssetCollection.ts b/src/v2/routes/auth/assets/collections/createAssetCollection.ts index 1242f65..94f8fab 100644 --- a/src/v2/routes/auth/assets/collections/createAssetCollection.ts +++ b/src/v2/routes/auth/assets/collections/createAssetCollection.ts @@ -59,6 +59,7 @@ export async function createAssetCollection(c: Context): Promise { name: collection.name, description: collection.description, userId: session.userId, + dateCreated: new Date().getTime(), isPublic: 0, // default to private }) .execute() diff --git a/src/v2/routes/auth/assets/favorite/addFavoriteAsset.ts b/src/v2/routes/auth/assets/favorite/addFavoriteAsset.ts index 61603da..86e7704 100644 --- a/src/v2/routes/auth/assets/favorite/addFavoriteAsset.ts +++ b/src/v2/routes/auth/assets/favorite/addFavoriteAsset.ts @@ -25,12 +25,13 @@ export async function favoriteAsset(c: Context): Promise { return c.json({ success: false, state: "no assetid entered" }, 200) } - // check if asset exists - const asset = await drizzle.query.assets.findFirst({ - where: (assets, { eq }) => eq(assets.id, parseInt(assetToFavorite)), + // check if asset exists, and status is 1 (approved) + const assetExists = await drizzle.query.assets.findFirst({ + where: (assets, { eq, and }) => + and(eq(assets.id, parseInt(assetToFavorite)), eq(assets.status, 1)), }) - if (!asset) { + if (!assetExists) { return c.json({ success: false, state: "asset not found" }, 200) } diff --git a/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts b/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts index 3fcd60d..1c6848a 100644 --- a/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts +++ b/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts @@ -25,6 +25,7 @@ export async function saveOCGeneratorResponse(c: Context): Promise { userId: session.userId as string, name: formData.get("name") as string, game: formData.get("game") as string, + dateCreated: new Date().getTime(), isPublic: parseInt(formData.get("isPublic") as string), // 1 = yes, 0 = no, default = 0 content: formData.get("content") as string, // this is stored as json, which can then be parsed } diff --git a/src/v2/routes/search/asset/recentAssets.ts b/src/v2/routes/search/asset/recentAssets.ts index 6fa122d..a241806 100644 --- a/src/v2/routes/search/asset/recentAssets.ts +++ b/src/v2/routes/search/asset/recentAssets.ts @@ -14,12 +14,11 @@ export async function recentAssets(c: Context): Promise { const drizzle = await getConnection(c.env).drizzle - const assetResponse = await drizzle - .select() - .from(assets) - .orderBy(desc(assets.uploadedDate)) - .limit(100) - .execute() + const assetResponse = await drizzle.query.assets.findMany({ + orderBy: desc(assets.uploadedDate), + limit: 100, + where: (assets, { eq }) => eq(assets.status, 1), + }) response = c.json( { diff --git a/src/v2/routes/search/user/getUserByUsername.ts b/src/v2/routes/search/user/getUserByUsername.ts index 778bb5e..54b36f3 100644 --- a/src/v2/routes/search/user/getUserByUsername.ts +++ b/src/v2/routes/search/user/getUserByUsername.ts @@ -3,6 +3,8 @@ import { getConnection } from "@/v2/db/turso" import { createNotFoundResponse } from "@/v2/lib/helpers/responses/notFoundResponse" import type { APIContext as Context } from "@/worker-configuration" import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" +import { desc } from "drizzle-orm" +import { assets, userCollections } from "@/v2/db/schema" export async function getUserByUsername(c: Context): Promise { const { username } = c.req.param() @@ -16,6 +18,40 @@ export async function getUserByUsername(c: Context): Promise { const user = await drizzle.query.users.findFirst({ where: (users, { eq }) => eq(user.username, username), + with: { + assets: { + orderBy: desc(assets.uploadedDate), + limit: 100, + where: (assets, { eq }) => eq(assets.status, 1), + }, + userCollections: { + orderBy: desc(userCollections.dateCreated), + where: (userCollections, { eq }) => + eq(userCollections.isPublic, 1), + limit: 5, + with: { + assets: { + orderBy: desc(assets.uploadedDate), + limit: 100, + where: (assets, { eq }) => eq(assets.status, 1), + }, + }, + }, + userFavorites: { + where: (userFavorites, { eq }) => eq(userFavorites.isPublic, 1), + with: { + assets: { + orderBy: desc(assets.uploadedDate), + limit: 100, + where: (assets, { eq }) => eq(assets.status, 1), + }, + }, + }, + savedOcGenerators: { + where: (savedOcGenerators, { eq }) => + eq(savedOcGenerators.isPublic, 1), + }, + }, }) if (!user) { @@ -41,7 +77,7 @@ export async function getUserByUsername(c: Context): Promise { responseHeaders ) - response.headers.set("Cache-Control", "s-maxage=300") + response.headers.set("Cache-Control", "s-maxage=120") await cache.put(cacheKey, response.clone()) return response From 2e85d43469ce9daa7eda15f409e7ee5c6b496bbe Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 3 Sep 2023 01:31:18 +0100 Subject: [PATCH 078/318] show hidden saves if user is querying own account --- src/v2/routes/search/all/searchAll.ts | 129 +++++++++--------- src/v2/routes/search/searchRoute.ts | 8 ++ .../routes/search/user/getUserByUsername.ts | 37 +++-- 3 files changed, 99 insertions(+), 75 deletions(-) diff --git a/src/v2/routes/search/all/searchAll.ts b/src/v2/routes/search/all/searchAll.ts index 54a0f8f..14917ac 100644 --- a/src/v2/routes/search/all/searchAll.ts +++ b/src/v2/routes/search/all/searchAll.ts @@ -1,17 +1,8 @@ import { responseHeaders } from "@/v2/lib/responseHeaders" import { getConnection } from "@/v2/db/turso" import type { APIContext as Context } from "@/worker-configuration" -import { like, and, eq, not, or } from "drizzle-orm" +import { like, eq } from "drizzle-orm" import { auth } from "@/v2/lib/auth/lucia" -import { - users, - assets, - games, - assetCategories, - assetTags, - savedOcGenerators, - userCollections, -} from "@/v2/db/schema" export async function searchAll(c: Context): Promise { const { query } = c.req.param() @@ -33,58 +24,60 @@ export async function searchAll(c: Context): Promise { const drizzle = await getConnection(c.env).drizzle // https://cdn.discordapp.com/attachments/1102306276832202813/1147291827699986572/F.gif - // this is really bad but i don't know how to do this better - const usersResponse = await drizzle - .select() - .from(users) - .where(like(users.username, `%${query}%`)) - .execute() - const assetsResponse = await drizzle - .select() - .from(assets) - .where(like(assets.name, `%${query}%`)) - .execute() - const assetCategoryResponse = await drizzle - .select() - .from(assetCategories) - .where(like(assetCategories.name, `%${query}%`)) - .execute() - const assetTagsResponse = await drizzle - .select() - .from(assetTags) - .where(like(assetTags.name, `%${query}%`)) - .execute() - const gamesResponse = await drizzle - .select() - .from(games) - .where(like(games.name, `%${query}%`)) - .execute() - const savedOcGeneratorsResponse = await drizzle - .select() - .from(savedOcGenerators) - .where( - and( - or( - eq(savedOcGenerators.userId, session.userId), - not(eq(savedOcGenerators.isPublic, 0)) - ), - like(savedOcGenerators.name, `%${query}%`) - ) - ) - .execute() - const collectionsResponse = await drizzle - .select() - .from(userCollections) - .where( - and( + const usersResponse = await drizzle.query.users.findMany({ + where: (users) => { + return like(users.username, `%${query}%`) + }, + }) + + const assetCategoryResponse = await drizzle.query.assetCategories.findMany({ + where: (assetCategories) => { + return like(assetCategories.name, `%${query}%`) + }, + }) + + const assetTagsResponse = await drizzle.query.assetTags.findMany({ + where: (assetTags) => { + return like(assetTags.name, `%${query}%`) + }, + }) + + const assetsResponse = await drizzle.query.assets.findMany({ + where: (assets) => { + return like(assets.name, `%${query}%`) + }, + }) + + const gamesResponse = await drizzle.query.games.findMany({ + where: (games) => { + return like(games.name, `%${query}%`) + }, + }) + + const savedOcGeneratorsResponse = + await drizzle.query.savedOcGenerators.findMany({ + where: (savedOcGenerators, { or, and }) => { + return or( + and( + eq(savedOcGenerators.isPublic, 1), + eq(savedOcGenerators.userId, session.userId) + ), + like(savedOcGenerators.name, `%${query}%`) + ) + }, + }) + + const collectionsResponse = await drizzle.query.userCollections.findMany({ + where: (userCollections, { or, and }) => { + return and( or( eq(userCollections.userId, session.userId), - not(eq(userCollections.isPublic, 0)) + eq(userCollections.isPublic, 1) ), like(userCollections.name, `%${query}%`) ) - ) - .execute() + }, + }) response = c.json( { @@ -93,20 +86,26 @@ export async function searchAll(c: Context): Promise { query, isAuthed: session.userId ? true : false, results: { - usersResponse, - assetsResponse, - assetCategoryResponse, - assetTagsResponse, - savedOcGeneratorsResponse, - gamesResponse, - collectionsResponse, + usersResponse: usersResponse ? usersResponse : [], + assetsResponse: assetsResponse ? assetsResponse : [], + assetCategoryResponse: assetCategoryResponse + ? assetCategoryResponse + : [], + assetTagsResponse: assetTagsResponse ? assetTagsResponse : [], + savedOcGeneratorsResponse: savedOcGeneratorsResponse + ? savedOcGeneratorsResponse + : [], + gamesResponse: gamesResponse ? gamesResponse : [], + collectionsResponse: collectionsResponse + ? collectionsResponse + : [], }, }, 200, responseHeaders ) - response.headers.set("Cache-Control", "s-maxage=60") + response.headers.set("Cache-Control", "s-maxage=300") await cache.put(cacheKey, response.clone()) return response } diff --git a/src/v2/routes/search/searchRoute.ts b/src/v2/routes/search/searchRoute.ts index 1132e12..2446733 100644 --- a/src/v2/routes/search/searchRoute.ts +++ b/src/v2/routes/search/searchRoute.ts @@ -22,6 +22,14 @@ authRoute.use( }) ) +authRoute.use( + "/users/user/:username", + cors({ + credentials: true, + origin: ["https://next.wanderer.moe"], + }) +) + searchRoute.get("/assets/query", async (c) => { return searchForAssets(c) }) diff --git a/src/v2/routes/search/user/getUserByUsername.ts b/src/v2/routes/search/user/getUserByUsername.ts index 54b36f3..88a35c6 100644 --- a/src/v2/routes/search/user/getUserByUsername.ts +++ b/src/v2/routes/search/user/getUserByUsername.ts @@ -2,9 +2,10 @@ import { responseHeaders } from "@/v2/lib/responseHeaders" import { getConnection } from "@/v2/db/turso" import { createNotFoundResponse } from "@/v2/lib/helpers/responses/notFoundResponse" import type { APIContext as Context } from "@/worker-configuration" -import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" import { desc } from "drizzle-orm" import { assets, userCollections } from "@/v2/db/schema" +import { auth } from "@/v2/lib/auth/lucia" +import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" export async function getUserByUsername(c: Context): Promise { const { username } = c.req.param() @@ -12,12 +13,21 @@ export async function getUserByUsername(c: Context): Promise { const cache = caches.default let response = await cache.match(cacheKey) - if (response) return response + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + } + + if (response) return response const drizzle = await getConnection(c.env).drizzle const user = await drizzle.query.users.findFirst({ - where: (users, { eq }) => eq(user.username, username), + where: (users, { and, eq }) => and(eq(users.username, username)), with: { assets: { orderBy: desc(assets.uploadedDate), @@ -26,8 +36,11 @@ export async function getUserByUsername(c: Context): Promise { }, userCollections: { orderBy: desc(userCollections.dateCreated), - where: (userCollections, { eq }) => - eq(userCollections.isPublic, 1), + where: (userCollections, { eq, or }) => + or( + eq(userCollections.isPublic, 1), + session && eq(userCollections.userId, session.userId) + ), limit: 5, with: { assets: { @@ -48,8 +61,11 @@ export async function getUserByUsername(c: Context): Promise { }, }, savedOcGenerators: { - where: (savedOcGenerators, { eq }) => - eq(savedOcGenerators.isPublic, 1), + where: (savedOcGenerators, { eq, or }) => + or( + eq(savedOcGenerators.isPublic, 1), + session && eq(savedOcGenerators.userId, session.userId) + ), }, }, }) @@ -64,13 +80,14 @@ export async function getUserByUsername(c: Context): Promise { user.email = undefined user.emailVerified = undefined - // converting role flags to array - user.roleFlags = roleFlagsToArray(user.role_flags) - response = c.json( { success: true, status: "ok", + accountIsAuthed: session.userId ? true : false, + userIsQueryingOwnAccount: + session && session.userId === user.id ? true : false, + userRoleFlagsArray: roleFlagsToArray(user.roleFlags), user, }, 200, From 04fbe7ad72a91db734c9eef4f3ea39f696c53f20 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 3 Sep 2023 02:04:13 +0100 Subject: [PATCH 079/318] my brain is going to explode --- src/v2/db/drizzle.ts | 1 + src/v2/db/schema.ts | 63 +++++++++++++++++++--- src/v2/routes/asset/getAssetFromId.ts | 7 +++ src/v2/routes/auth/assets/uploadAsset.ts | 47 +++++++++++++++- src/v2/routes/search/asset/searchAssets.ts | 21 +++++--- 5 files changed, 121 insertions(+), 18 deletions(-) diff --git a/src/v2/db/drizzle.ts b/src/v2/db/drizzle.ts index 0ff00c8..2faf860 100644 --- a/src/v2/db/drizzle.ts +++ b/src/v2/db/drizzle.ts @@ -9,6 +9,7 @@ export const tableNames = { gameAssetCategories: "gameAssetCategories", games: "games", assetTags: "assetTags", + assetTagsAssets: "assetTagsAssets", emailVerificationToken: "emailVerificationToken", passwordResetToken: "passwordResetToken", assetCategories: "assetCategories", diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index be2c4be..a59dfdf 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -208,6 +208,38 @@ export const assetTags = sqliteTable( } ) +export const assetTagsAssets = sqliteTable( + tableNames.assetTagsAssets, + { + id: text("id").primaryKey(), + assetTagId: text("asset_tag_id") + .notNull() + .references(() => assetTags.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + assetId: integer("asset_id") + .notNull() + .references(() => assets.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + }, + (assetTagsAssets) => { + return { + assetTagsAssetsIdx: uniqueIndex("asset_tags_assets_id_idx").on( + assetTagsAssets.id + ), + assetTagsAssetsAssetTagIdx: uniqueIndex( + "asset_tags_assets_asset_tag_id_idx" + ).on(assetTagsAssets.assetTagId), + assetTagsAssetsAssetIdx: uniqueIndex( + "asset_tags_assets_asset_id_idx" + ).on(assetTagsAssets.assetId), + } + } +) + export const following = sqliteTable(tableNames.following, { id: text("id").primaryKey(), followerUserId: text("follower_id") @@ -388,7 +420,7 @@ export const assetRelations = relations(assets, ({ one, many }) => ({ fields: [assets.uploadedById, assets.uploadedByName], references: [users.id, users.username], }), - tags: many(assetTags), + assetTagsAssets: many(assetTagsAssets), assetCategory: one(assetCategories, { fields: [assets.assetCategory], references: [assetCategories.name], @@ -406,9 +438,19 @@ export const assetCategoryRelations = relations( }) ) -export const assetTagRelations = relations(assetTags, ({ many }) => ({ - assets: many(assets), -})) +export const assetTagsAssetsRelations = relations( + assetTagsAssets, + ({ one }) => ({ + assetTag: one(assetTags, { + fields: [assetTagsAssets.assetTagId], + references: [assetTags.id], + }), + asset: one(assets, { + fields: [assetTagsAssets.assetId], + references: [assets.id], + }), + }) +) export const collectionRelations = relations( userCollections, @@ -493,14 +535,19 @@ export const usersRelations = relations(users, ({ one, many }) => ({ })) // export types -export type user = typeof users.$inferSelect -export type session = typeof sessions.$inferSelect -export type key = typeof keys.$inferSelect -export type socialsConnection = typeof socialsConnections.$inferSelect + +// game, asset types export type game = typeof games.$inferSelect export type assetCategory = typeof assetCategories.$inferSelect export type asset = typeof assets.$inferSelect export type assetTag = typeof assetTags.$inferSelect +export type assetTagsAsset = typeof assetTagsAssets.$inferSelect + +// user types +export type user = typeof users.$inferSelect +export type session = typeof sessions.$inferSelect +export type key = typeof keys.$inferSelect +export type socialsConnection = typeof socialsConnections.$inferSelect export type following = typeof following.$inferSelect export type follower = typeof follower.$inferSelect export type userFavorites = typeof userFavorites.$inferSelect diff --git a/src/v2/routes/asset/getAssetFromId.ts b/src/v2/routes/asset/getAssetFromId.ts index 59df54d..e0bdc5a 100644 --- a/src/v2/routes/asset/getAssetFromId.ts +++ b/src/v2/routes/asset/getAssetFromId.ts @@ -18,6 +18,13 @@ export async function getAssetFromId(c: Context): Promise { const asset = await drizzle.query.assets.findFirst({ where: (assets, { eq, and }) => and(eq(assets.status, 1), eq(assets.id, parseInt(id))), + with: { + assetTagsAssets: { + with: { + assetTags: true, + }, + }, + }, }) if (!asset) { diff --git a/src/v2/routes/auth/assets/uploadAsset.ts b/src/v2/routes/auth/assets/uploadAsset.ts index 34559dc..fafa3a1 100644 --- a/src/v2/routes/auth/assets/uploadAsset.ts +++ b/src/v2/routes/auth/assets/uploadAsset.ts @@ -1,7 +1,8 @@ import { auth } from "@/v2/lib/auth/lucia" import { getConnection } from "@/v2/db/turso" -import { assets } from "@/v2/db/schema" +import { assets, assetTagsAssets } from "@/v2/db/schema" import type { APIContext as Context } from "@/worker-configuration" +import { eq } from "drizzle-orm" import { SplitQueryByCommas } from "@/v2/lib/helpers/splitQueryByCommas" export async function uploadAsset(c: Context): Promise { @@ -38,6 +39,15 @@ export async function uploadAsset(c: Context): Promise { height: formData.get("height") as unknown as number, // e.g 1080 } + if (metadata.tags.length > 5) + return c.json( + { + success: false, + state: `too many tags (${metadata.tags.length}). maximum is 5 tags per asset`, + }, + 400 + ) + const newAsset = { name: metadata.name, extension: metadata.extension, @@ -63,8 +73,41 @@ export async function uploadAsset(c: Context): Promise { newAssetFile ) - await drizzle.insert(assets).values(newAsset) + await drizzle.transaction(async (trx) => { + const newAssetDB = await trx + .insert(assets) + .values(newAsset) + .returning({ + assetId: assets.id, + }) + if (metadata.tags.length > 0) { + for (const tag of metadata.tags) { + const tagExists = await trx.query.assetTags.findFirst({ + where: (assetTags) => { + return eq(assetTags.name, tag) + }, + }) + if (tagExists) { + await trx + .insert(assetTagsAssets) + .values({ + id: crypto.randomUUID(), + assetId: newAssetDB[0].assetId, + assetTagId: tagExists[0].assetTagId, + }) + .returning({ + assetTagId: assetTagsAssets.assetTagId, + }) + } else { + continue + } + } + } + }) } catch (e) { + await c.env.bucket.delete( + `/assets/${metadata.game}/${metadata.category}/${metadata.name}.${metadata.extension}` + ) return c.json({ success: false, state: "failed to upload asset" }, 500) } diff --git a/src/v2/routes/search/asset/searchAssets.ts b/src/v2/routes/search/asset/searchAssets.ts index 911ccf0..70b3f73 100644 --- a/src/v2/routes/search/asset/searchAssets.ts +++ b/src/v2/routes/search/asset/searchAssets.ts @@ -48,15 +48,20 @@ export async function searchForAssets(c: Context): Promise { eq(assets.status, 1) ) }, - ...(assetTagsList.length > 0 && { + // i think i am overcomplicating this + ...((assetTagsList?.length ?? 0) > 0 && { with: { - assetTags: { - where: (assetTags, { and, eq }) => { - return and( - ...assetTagsList.map((assetTag) => - eq(assetTags.name, assetTag) - ) - ) + assetTagsAssets: { + with: { + assetTags: { + where: (assetTags, { or, eq }) => { + return or( + ...assetTagsList.map((assetTag) => + eq(assetTags.name, assetTag) + ) + ) + }, + }, }, }, }, From 08b520c02d763a09bbe05aa3c587a46fd34b5e89 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 3 Sep 2023 02:05:38 +0100 Subject: [PATCH 080/318] =?UTF-8?q?wrong=20operator=20=F0=9F=98=AD?= =?UTF-8?q?=F0=9F=98=AD=F0=9F=98=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/v2/routes/search/asset/searchAssets.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/v2/routes/search/asset/searchAssets.ts b/src/v2/routes/search/asset/searchAssets.ts index 70b3f73..022f836 100644 --- a/src/v2/routes/search/asset/searchAssets.ts +++ b/src/v2/routes/search/asset/searchAssets.ts @@ -54,8 +54,8 @@ export async function searchForAssets(c: Context): Promise { assetTagsAssets: { with: { assetTags: { - where: (assetTags, { or, eq }) => { - return or( + where: (assetTags, { and, eq }) => { + return and( ...assetTagsList.map((assetTag) => eq(assetTags.name, assetTag) ) From b12f452a573f331c2dd95b671bcd6426a40cee19 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 3 Sep 2023 02:11:40 +0100 Subject: [PATCH 081/318] all tags endpoint --- src/v2/routes/tags/allTags.ts | 37 +++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/v2/routes/tags/allTags.ts diff --git a/src/v2/routes/tags/allTags.ts b/src/v2/routes/tags/allTags.ts new file mode 100644 index 0000000..f854697 --- /dev/null +++ b/src/v2/routes/tags/allTags.ts @@ -0,0 +1,37 @@ +import { getConnection } from "@/v2/db/turso" +import type { APIContext as Context } from "@/worker-configuration" + +export async function listAllAssetTags(c: Context): Promise { + const cacheKey = new Request(c.req.url.toString(), c.req) + const cache = caches.default + let response = await cache.match(cacheKey) + + if (response) return response + + const drizzle = await getConnection(c.env).drizzle + + const allAssetTags = await drizzle.query.assetTags.findMany({ + orderBy: (assetTags) => assetTags.name, + with: { + assetTagsAssets: { + with: { + assets: true, + }, + }, + }, + }) + + response = c.json( + { + success: true, + status: "ok", + allAssetTags, + }, + 200 + ) + + response.headers.set("Cache-Control", "s-maxage=604800") + await cache.put(cacheKey, response.clone()) + + return response +} From 943271f33f4e75713d6a88ae3e1168a8ab0c5ae0 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 3 Sep 2023 02:31:32 +0100 Subject: [PATCH 082/318] fix duplicate indexes --- src/v2/db/schema.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index a59dfdf..0d54e00 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -312,11 +312,11 @@ export const userFavoritesAssets = sqliteTable( }, (userFavoritesAssets) => { return { - favoritedAssetsAssetsIdx: uniqueIndex("favorited_assets_id_idx").on( - userFavoritesAssets.id - ), - favoritedAssetsUserIdx: uniqueIndex( - "favorited_assets_user_id_idx" + favoritedAssetsAssetsIdx: uniqueIndex( + "favorited_assets_assets_id_idx" + ).on(userFavoritesAssets.id), + favoritedAssetsAssetsUserIdx: uniqueIndex( + "favorited_assets_assets_user_id_idx" ).on(userFavoritesAssets.userFavoritesId), favoritedAssetsAssetsAssetIdx: uniqueIndex( "favorited_assets_assets_asset_id_idx" From feec829d4257bad688937c9a916a341f33c6eceb Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Wed, 6 Sep 2023 17:04:38 +0100 Subject: [PATCH 083/318] update deps, cleanup error msgs --- package.json | 14 +- pnpm-lock.yaml | 6692 +++++++---------- src/index.ts | 2 +- src/v2/db/schema.ts | 30 +- .../lib/helpers/responses/notFoundResponse.ts | 2 +- src/v2/routes/asset/downloadAsset.ts | 27 +- src/v2/routes/asset/getAssetFromId.ts | 27 +- .../asset-categories/createAssetCategory.ts | 26 +- .../asset-categories/deleteAssetCategory.ts | 20 +- src/v2/routes/auth/assets/approveAsset.ts | 19 +- .../collections/addAssetToCollection.ts | 57 +- .../collections/createAssetCollection.ts | 57 +- .../collections/deleteAssetCollection.ts | 21 +- .../collections/deleteAssetFromCollection.ts | 45 +- .../assets/collections/viewAssetCollection.ts | 24 +- .../collections/viewAssetCollections.ts | 16 +- .../auth/assets/favorite/addFavoriteAsset.ts | 24 +- .../assets/favorite/removeFavoriteAsset.ts | 32 +- .../assets/favorite/viewFavoriteAssets.ts | 12 +- src/v2/routes/auth/assets/modifyAsset.ts | 24 +- src/v2/routes/auth/assets/uploadAsset.ts | 28 +- src/v2/routes/auth/authRoute.ts | 2 +- src/v2/routes/auth/games/createGame.ts | 14 +- src/v2/routes/auth/games/deleteGame.ts | 20 +- src/v2/routes/auth/login.ts | 9 +- src/v2/routes/auth/logout.ts | 6 +- .../deleteOCGeneratorResponse.ts | 19 +- .../oc-generators/saveOCGeneratorResponse.ts | 8 +- .../oc-generators/viewOCGeneratorResponses.ts | 15 +- src/v2/routes/auth/signup.ts | 18 - src/v2/routes/auth/tags/createTag.ts | 20 +- src/v2/routes/auth/tags/deleteTag.ts | 2 +- src/v2/routes/auth/validate.ts | 16 +- src/v2/routes/games/allGames.ts | 2 +- src/v2/routes/search/all/searchAll.ts | 8 +- src/v2/routes/search/asset/recentAssets.ts | 2 +- src/v2/routes/search/asset/searchAssets.ts | 22 +- src/v2/routes/search/searchRoute.ts | 8 +- .../routes/search/user/getUserByUsername.ts | 46 +- src/v2/routes/search/user/getUsersBySearch.ts | 27 +- src/v2/routes/tags/allTags.ts | 2 +- src/worker-configuration.d.ts | 2 +- 42 files changed, 3144 insertions(+), 4323 deletions(-) diff --git a/package.json b/package.json index 0d56a2c..7df4840 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,8 @@ "drizzle:push": "drizzle-kit push:sqlite" }, "devDependencies": { - "@cloudflare/workers-types": "^4.20230821.0", - "@types/node": "^20.5.8", + "@cloudflare/workers-types": "^4.20230904.0", + "@types/node": "^20.5.9", "dotenv": "^16.3.1", "drizzle-kit": "^0.19.13", "eslint": "^8.48.0", @@ -22,16 +22,16 @@ "husky": "^8.0.3", "tsx": "^3.12.8", "typescript": "^5.2.2", - "wrangler": "3.6.0" + "wrangler": "3.7.0" }, "private": true, "dependencies": { "@libsql/client": "^0.3.2", "@lucia-auth/adapter-sqlite": "^2.0.0", - "@typescript-eslint/eslint-plugin": "^6.5.0", - "drizzle-orm": "^0.28.5", - "hono": "^3.5.6", - "lucia": "^2.4.1", + "@typescript-eslint/eslint-plugin": "^6.6.0", + "drizzle-orm": "^0.28.6", + "hono": "^3.5.8", + "lucia": "^2.4.2", "mysql2": "^3.6.0", "prettier": "^3.0.3", "resend": "^1.0.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1e8264a..d344d44 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,3974 +1,2806 @@ -lockfileVersion: "6.1" +lockfileVersion: '6.1' settings: - autoInstallPeers: true - excludeLinksFromLockfile: false + autoInstallPeers: true + excludeLinksFromLockfile: false dependencies: - "@libsql/client": - specifier: ^0.3.2 - version: 0.3.2 - "@lucia-auth/adapter-sqlite": - specifier: ^2.0.0 - version: 2.0.0(@libsql/client@0.3.2)(lucia@2.4.1) - "@typescript-eslint/eslint-plugin": - specifier: ^6.5.0 - version: 6.5.0(@typescript-eslint/parser@6.5.0)(eslint@8.48.0)(typescript@5.2.2) - drizzle-orm: - specifier: ^0.28.5 - version: 0.28.5(@cloudflare/workers-types@4.20230821.0)(@libsql/client@0.3.2)(mysql2@3.6.0) - hono: - specifier: ^3.5.6 - version: 3.5.6 - lucia: - specifier: ^2.4.1 - version: 2.4.1 - mysql2: - specifier: ^3.6.0 - version: 3.6.0 - prettier: - specifier: ^3.0.3 - version: 3.0.3 - resend: - specifier: ^1.0.0 - version: 1.0.0 + '@libsql/client': + specifier: ^0.3.2 + version: 0.3.2 + '@lucia-auth/adapter-sqlite': + specifier: ^2.0.0 + version: 2.0.0(@libsql/client@0.3.2)(lucia@2.4.2) + '@typescript-eslint/eslint-plugin': + specifier: ^6.6.0 + version: 6.6.0(@typescript-eslint/parser@6.6.0)(eslint@8.48.0)(typescript@5.2.2) + drizzle-orm: + specifier: ^0.28.6 + version: 0.28.6(@cloudflare/workers-types@4.20230904.0)(@libsql/client@0.3.2)(mysql2@3.6.0) + hono: + specifier: ^3.5.8 + version: 3.5.8 + lucia: + specifier: ^2.4.2 + version: 2.4.2 + mysql2: + specifier: ^3.6.0 + version: 3.6.0 + prettier: + specifier: ^3.0.3 + version: 3.0.3 + resend: + specifier: ^1.0.0 + version: 1.0.0 devDependencies: - "@cloudflare/workers-types": - specifier: ^4.20230821.0 - version: 4.20230821.0 - "@types/node": - specifier: ^20.5.8 - version: 20.5.8 - dotenv: - specifier: ^16.3.1 - version: 16.3.1 - drizzle-kit: - specifier: ^0.19.13 - version: 0.19.13 - eslint: - specifier: ^8.48.0 - version: 8.48.0 - eslint-config-google: - specifier: ^0.14.0 - version: 0.14.0(eslint@8.48.0) - eslint-plugin-json: - specifier: ^3.1.0 - version: 3.1.0 - husky: - specifier: ^8.0.3 - version: 8.0.3 - tsx: - specifier: ^3.12.8 - version: 3.12.8 - typescript: - specifier: ^5.2.2 - version: 5.2.2 - wrangler: - specifier: 3.6.0 - version: 3.6.0 + '@cloudflare/workers-types': + specifier: ^4.20230904.0 + version: 4.20230904.0 + '@types/node': + specifier: ^20.5.9 + version: 20.5.9 + dotenv: + specifier: ^16.3.1 + version: 16.3.1 + drizzle-kit: + specifier: ^0.19.13 + version: 0.19.13 + eslint: + specifier: ^8.48.0 + version: 8.48.0 + eslint-config-google: + specifier: ^0.14.0 + version: 0.14.0(eslint@8.48.0) + eslint-plugin-json: + specifier: ^3.1.0 + version: 3.1.0 + husky: + specifier: ^8.0.3 + version: 8.0.3 + tsx: + specifier: ^3.12.8 + version: 3.12.8 + typescript: + specifier: ^5.2.2 + version: 5.2.2 + wrangler: + specifier: 3.7.0 + version: 3.7.0 packages: - /@aashutoshrathi/word-wrap@1.2.6: - resolution: - { - integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==, - } - engines: { node: ">=0.10.0" } - - /@cloudflare/kv-asset-handler@0.2.0: - resolution: - { - integrity: sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==, - } - dependencies: - mime: 3.0.0 - dev: true - - /@cloudflare/workerd-darwin-64@1.20230814.1: - resolution: - { - integrity: sha512-aQUO7q7qXl+SVtOiMMlVKLNOSeL6GX43RKeflwzsD74dGgyHPiSfw5KCvXhkVbyN7u+yYF6HyFdaIvHLfn5jyA==, - } - engines: { node: ">=16" } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workerd-darwin-arm64@1.20230814.1: - resolution: - { - integrity: sha512-U2mcgi+AiuI/4EY5Wk/GmygiNoCNw/V2mcHmxESqe4r6XbJYOzBdEsjnqJ05rqd0JlEM8m64jRtE6/qBnQHygg==, - } - engines: { node: ">=16" } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workerd-linux-64@1.20230814.1: - resolution: - { - integrity: sha512-Q4kITXLTCuG2i2Z01fbb5AjVRRIf3+lS4ZVsFbTbIwtcOOG4Ozcw7ee7tKsFES7hFqR4Eg9gMG4/aS0mmi+L2g==, - } - engines: { node: ">=16" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workerd-linux-arm64@1.20230814.1: - resolution: - { - integrity: sha512-BX5SaksXw+pkREVw3Rw2eSNXplqZw+14CcwW/5x/4oq/C6yn5qCvKxJfM7pukJGMI4wkJPOYops7B3g27FB/HA==, - } - engines: { node: ">=16" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workerd-windows-64@1.20230814.1: - resolution: - { - integrity: sha512-GWHqfyhsG/1wm2W8afkYX3q3fWXUWWD8NGtHfAs6ZVTHdW3mmYyMhKR0lc6ptBwz5i5aXRlP2S+CxxxwwDbKpw==, - } - engines: { node: ">=16" } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workers-types@4.20230821.0: - resolution: - { - integrity: sha512-lVQSyr5E4CEkQw7WIdsrMTj+kHjsm28mJ0B5AhNFByKR+16KTFsU/RW/nGLKHHW2jxT5lvYI+HjNQMzC9QR8Ng==, - } - - /@drizzle-team/studio@0.0.5: - resolution: - { - integrity: sha512-ps5qF0tMxWRVu+V5gvCRrQNqlY92aTnIKdq27gm9LZMSdaKYZt6AVvSK1dlUMzs6Rt0Jm80b+eWct6xShBKhIw==, - } - dev: true - - /@esbuild-kit/cjs-loader@2.4.2: - resolution: - { - integrity: sha512-BDXFbYOJzT/NBEtp71cvsrGPwGAMGRB/349rwKuoxNSiKjPraNNnlK6MIIabViCjqZugu6j+xeMDlEkWdHHJSg==, - } - dependencies: - "@esbuild-kit/core-utils": 3.2.2 - get-tsconfig: 4.7.0 - dev: true - - /@esbuild-kit/core-utils@3.2.2: - resolution: - { - integrity: sha512-Ub6LaRaAgF80dTSzUdXpFLM1pVDdmEVB9qb5iAzSpyDlX/mfJTFGOnZ516O05p5uWWteNviMKi4PAyEuRxI5gA==, - } - dependencies: - esbuild: 0.18.20 - source-map-support: 0.5.21 - dev: true - - /@esbuild-kit/esm-loader@2.5.5: - resolution: - { - integrity: sha512-Qwfvj/qoPbClxCRNuac1Du01r9gvNOT+pMYtJDapfB1eoGN1YlJ1BixLyL9WVENRx5RXgNLdfYdx/CuswlGhMw==, - } - dependencies: - "@esbuild-kit/core-utils": 3.2.2 - get-tsconfig: 4.7.0 - dev: true - - /@esbuild-plugins/node-globals-polyfill@0.1.1(esbuild@0.16.3): - resolution: - { - integrity: sha512-MR0oAA+mlnJWrt1RQVQ+4VYuRJW/P2YmRTv1AsplObyvuBMnPHiizUF95HHYiSsMGLhyGtWufaq2XQg6+iurBg==, - } - peerDependencies: - esbuild: "*" - dependencies: - esbuild: 0.16.3 - dev: true - - /@esbuild-plugins/node-modules-polyfill@0.1.4(esbuild@0.16.3): - resolution: - { - integrity: sha512-uZbcXi0zbmKC/050p3gJnne5Qdzw8vkXIv+c2BW0Lsc1ji1SkrxbKPUy5Efr0blbTu1SL8w4eyfpnSdPg3G0Qg==, - } - peerDependencies: - esbuild: "*" - dependencies: - esbuild: 0.16.3 - escape-string-regexp: 4.0.0 - rollup-plugin-node-polyfills: 0.2.1 - dev: true - - /@esbuild/android-arm64@0.16.3: - resolution: - { - integrity: sha512-RolFVeinkeraDvN/OoRf1F/lP0KUfGNb5jxy/vkIMeRRChkrX/HTYN6TYZosRJs3a1+8wqpxAo5PI5hFmxyPRg==, - } - 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-arm@0.16.3: - resolution: - { - integrity: sha512-mueuEoh+s1eRbSJqq9KNBQwI4QhQV6sRXIfTyLXSHGMpyew61rOK4qY21uKbXl1iBoMb0AdL1deWFCQVlN2qHA==, - } - 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-x64@0.16.3: - resolution: - { - integrity: sha512-SFpTUcIT1bIJuCCBMCQWq1bL2gPTjWoLZdjmIhjdcQHaUfV41OQfho6Ici5uvvkMmZRXIUGpM3GxysP/EU7ifQ==, - } - 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.16.3: - resolution: - { - integrity: sha512-DO8WykMyB+N9mIDfI/Hug70Dk1KipavlGAecxS3jDUwAbTpDXj0Lcwzw9svkhxfpCagDmpaTMgxWK8/C/XcXvw==, - } - 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.16.3: - resolution: - { - integrity: sha512-uEqZQ2omc6BvWqdCiyZ5+XmxuHEi1SPzpVxXCSSV2+Sh7sbXbpeNhHIeFrIpRjAs0lI1FmA1iIOxFozKBhKgRQ==, - } - 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.16.3: - resolution: - { - integrity: sha512-nJansp3sSXakNkOD5i5mIz2Is/HjzIhFs49b1tjrPrpCmwgBmH9SSzhC/Z1UqlkivqMYkhfPwMw1dGFUuwmXhw==, - } - 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 + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + + /@cloudflare/kv-asset-handler@0.2.0: + resolution: {integrity: sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==} + dependencies: + mime: 3.0.0 + dev: true + + /@cloudflare/workerd-darwin-64@1.20230904.0: + resolution: {integrity: sha512-/GDlmxAFbDtrQwP4zOXFbqOfaPvkDxdsCoEa+KEBcAl5uR98+7WW5/b8naBHX+t26uS7p4bLlImM8J5F1ienRQ==} + engines: {node: '>=16'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@cloudflare/workerd-darwin-arm64@1.20230904.0: + resolution: {integrity: sha512-x8WXNc2xnDqr5y1iirnNdyx8GZY3rL5xiF7ebK3mKQeB+jFjkhO71yuPTkDCzUWtOvw1Wfd4jbwy4wxacMX4mQ==} + engines: {node: '>=16'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@cloudflare/workerd-linux-64@1.20230904.0: + resolution: {integrity: sha512-V58xyMS3oDpKO8Dpdh0r0BXm99OzoGgvWe9ufttVraj/1NTMGELwb6i9ySb8k3F1J9m/sO26+TV7pQc/bGC1VQ==} + engines: {node: '>=16'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@cloudflare/workerd-linux-arm64@1.20230904.0: + resolution: {integrity: sha512-VrDaW+pjb5IAKEnNWtEaFiG377kXKmk5Fu0Era4W+jKzPON2BW/qRb/4LNHXQ4yxg/2HLm7RiUTn7JZtt1qO6A==} + engines: {node: '>=16'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@cloudflare/workerd-windows-64@1.20230904.0: + resolution: {integrity: sha512-/R/dE8uy+8J2YeXfDhI8/Bg7YUirdbbjH5/l/Vv00ZRE0lC3nPLcYeyBXSwXIQ6/Xht3gN+lksLQgKd0ZWRd+Q==} + engines: {node: '>=16'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@cloudflare/workers-types@4.20230904.0: + resolution: {integrity: sha512-IX4oJCe14ctblSPZBlW64BVZ9nYLUo6sD2I5gu3hX0ywByYWm1OuoKm9Xb/Zpbj8Ph18Z7Ryii6u2/ocnncXdA==} + + /@drizzle-team/studio@0.0.5: + resolution: {integrity: sha512-ps5qF0tMxWRVu+V5gvCRrQNqlY92aTnIKdq27gm9LZMSdaKYZt6AVvSK1dlUMzs6Rt0Jm80b+eWct6xShBKhIw==} + dev: true + + /@esbuild-kit/cjs-loader@2.4.2: + resolution: {integrity: sha512-BDXFbYOJzT/NBEtp71cvsrGPwGAMGRB/349rwKuoxNSiKjPraNNnlK6MIIabViCjqZugu6j+xeMDlEkWdHHJSg==} + dependencies: + '@esbuild-kit/core-utils': 3.2.2 + get-tsconfig: 4.7.0 + dev: true + + /@esbuild-kit/core-utils@3.2.2: + resolution: {integrity: sha512-Ub6LaRaAgF80dTSzUdXpFLM1pVDdmEVB9qb5iAzSpyDlX/mfJTFGOnZ516O05p5uWWteNviMKi4PAyEuRxI5gA==} + dependencies: + esbuild: 0.18.20 + source-map-support: 0.5.21 + dev: true + + /@esbuild-kit/esm-loader@2.5.5: + resolution: {integrity: sha512-Qwfvj/qoPbClxCRNuac1Du01r9gvNOT+pMYtJDapfB1eoGN1YlJ1BixLyL9WVENRx5RXgNLdfYdx/CuswlGhMw==} + dependencies: + '@esbuild-kit/core-utils': 3.2.2 + get-tsconfig: 4.7.0 + 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-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-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-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-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-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-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-community/eslint-utils@4.4.0(eslint@8.48.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.48.0 + eslint-visitor-keys: 3.4.3 + + /@eslint-community/regexpp@4.8.0: + resolution: {integrity: sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + /@eslint/eslintrc@2.1.2: + resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.21.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + /@eslint/js@8.48.0: + resolution: {integrity: sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + /@humanwhocodes/config-array@0.11.11: + resolution: {integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + /@humanwhocodes/object-schema@1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + + /@libsql/client@0.3.2: + resolution: {integrity: sha512-e0qgf7gFOwhu0ueU/RK68TmD0PnjX3RaeM5lrJowGMEZjvh/shZ4BhwPA26Ec0nSa4oiZ0s0zn/T5YjcgY1bTw==} + dependencies: + '@libsql/hrana-client': 0.5.0 + better-sqlite3: 8.6.0 + js-base64: 3.7.5 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: false + + /@libsql/hrana-client@0.5.0: + resolution: {integrity: sha512-o9yXH+9XBPnMSrBkY17q2xknfNXJaCHQv4rFJikt1g8M0d80hwp4ZZ1jHwacuL61wRa4j6qKMFqh9ti+CoTH1A==} + dependencies: + '@libsql/isomorphic-fetch': 0.1.6 + '@libsql/isomorphic-ws': 0.1.3 + js-base64: 3.7.5 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: false + + /@libsql/isomorphic-fetch@0.1.6: + resolution: {integrity: sha512-8qhxEDmVBDb54E9xdW1xqw3zLNShkMZpf5YQU3PvwjtKNLOPde59Oqez+RnZHsYkt9zQxxOF+7gSHVJeP/UWqg==} + dependencies: + '@types/node-fetch': 2.6.4 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: false + + /@libsql/isomorphic-ws@0.1.3: + resolution: {integrity: sha512-54dZXgYwWDKsnfWv8GCVYvhn6RDlqFDGAc8EQMd941yvGMsGzo06Gn6Iyjw//nJ1iJO97FbXgoQ1apikoFD/WA==} + dependencies: + '@types/ws': 8.5.5 + ws: 8.14.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /@lucia-auth/adapter-sqlite@2.0.0(@libsql/client@0.3.2)(lucia@2.4.2): + resolution: {integrity: sha512-Hiy8WND/1mi25r0M2ruSml+Ab5GJLr4XZEHApYw1lxybF+VlPUyX7oTtIVCSgvq/SWiP/tvnyPwnXAPmNr8/bg==} + peerDependencies: + '@libsql/client': ^0.3.0 + better-sqlite3: ^8.0.0 + lucia: ^2.0.0 + peerDependenciesMeta: + '@libsql/client': optional: true - - /@esbuild/freebsd-x64@0.16.3: - resolution: - { - integrity: sha512-TfoDzLw+QHfc4a8aKtGSQ96Wa+6eimljjkq9HKR0rHlU83vw8aldMOUSJTUDxbcUdcgnJzPaX8/vGWm7vyV7ug==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true + better-sqlite3: optional: true - - /@esbuild/freebsd-x64@0.18.20: - resolution: - { - integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true + dependencies: + '@libsql/client': 0.3.2 + lucia: 2.4.2 + dev: false + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + + /@one-ini/wasm@0.1.1: + resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} + dev: false + + /@react-email/render@0.0.7: + resolution: {integrity: sha512-hMMhxk6TpOcDC5qnKzXPVJoVGEwfm+U5bGOPH+MyTTlx0F02RLQygcATBKsbP7aI/mvkmBAZoFbgPIHop7ovug==} + engines: {node: '>=16.0.0'} + dependencies: + html-to-text: 9.0.3 + pretty: 2.0.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@selderee/plugin-htmlparser2@0.10.0: + resolution: {integrity: sha512-gW69MEamZ4wk1OsOq1nG1jcyhXIQcnrsX5JwixVw/9xaiav8TCyjESAruu1Rz9yyInhgBXxkNwMeygKnN2uxNA==} + dependencies: + domhandler: 5.0.3 + selderee: 0.10.0 + dev: false + + /@types/json-schema@7.0.12: + resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} + dev: false + + /@types/node-fetch@2.6.4: + resolution: {integrity: sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==} + dependencies: + '@types/node': 20.5.9 + form-data: 3.0.1 + dev: false + + /@types/node@20.5.9: + resolution: {integrity: sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==} + + /@types/semver@7.5.1: + resolution: {integrity: sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==} + dev: false + + /@types/ws@8.5.5: + resolution: {integrity: sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==} + dependencies: + '@types/node': 20.5.9 + dev: false + + /@typescript-eslint/eslint-plugin@6.6.0(@typescript-eslint/parser@6.6.0)(eslint@8.48.0)(typescript@5.2.2): + resolution: {integrity: sha512-CW9YDGTQnNYMIo5lMeuiIG08p4E0cXrXTbcZ2saT/ETE7dWUrNxlijsQeU04qAAKkILiLzdQz+cGFxCJjaZUmA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: optional: true - - /@esbuild/linux-arm64@0.16.3: - resolution: - { - integrity: sha512-7I3RlsnxEFCHVZNBLb2w7unamgZ5sVwO0/ikE2GaYvYuUQs9Qte/w7TqWcXHtCwxvZx/2+F97ndiUQAWs47ZfQ==, - } - engines: { node: ">=12" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + dependencies: + '@eslint-community/regexpp': 4.8.0 + '@typescript-eslint/parser': 6.6.0(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/scope-manager': 6.6.0 + '@typescript-eslint/type-utils': 6.6.0(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.6.0(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.6.0 + debug: 4.3.4 + eslint: 8.48.0 + graphemer: 1.4.0 + ignore: 5.2.4 + natural-compare: 1.4.0 + semver: 7.5.4 + ts-api-utils: 1.0.2(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/parser@6.6.0(eslint@8.48.0)(typescript@5.2.2): + resolution: {integrity: sha512-setq5aJgUwtzGrhW177/i+DMLqBaJbdwGj2CPIVFFLE0NCliy5ujIdLHd2D1ysmlmsjdL2GWW+hR85neEfc12w==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: 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 + dependencies: + '@typescript-eslint/scope-manager': 6.6.0 + '@typescript-eslint/types': 6.6.0 + '@typescript-eslint/typescript-estree': 6.6.0(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.6.0 + debug: 4.3.4 + eslint: 8.48.0 + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/scope-manager@6.6.0: + resolution: {integrity: sha512-pT08u5W/GT4KjPUmEtc2kSYvrH8x89cVzkA0Sy2aaOUIw6YxOIjA8ilwLr/1fLjOedX1QAuBpG9XggWqIIfERw==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.6.0 + '@typescript-eslint/visitor-keys': 6.6.0 + dev: false + + /@typescript-eslint/type-utils@6.6.0(eslint@8.48.0)(typescript@5.2.2): + resolution: {integrity: sha512-8m16fwAcEnQc69IpeDyokNO+D5spo0w1jepWWY2Q6y5ZKNuj5EhVQXjtVAeDDqvW6Yg7dhclbsz6rTtOvcwpHg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: optional: true - - /@esbuild/linux-arm@0.16.3: - resolution: - { - integrity: sha512-VwswmSYwVAAq6LysV59Fyqk3UIjbhuc6wb3vEcJ7HEJUtFuLK9uXWuFoH1lulEbE4+5GjtHi3MHX+w1gNHdOWQ==, - } - engines: { node: ">=12" } - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true + dependencies: + '@typescript-eslint/typescript-estree': 6.6.0(typescript@5.2.2) + '@typescript-eslint/utils': 6.6.0(eslint@8.48.0)(typescript@5.2.2) + debug: 4.3.4 + eslint: 8.48.0 + ts-api-utils: 1.0.2(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/types@6.6.0: + resolution: {integrity: sha512-CB6QpJQ6BAHlJXdwUmiaXDBmTqIE2bzGTDLADgvqtHWuhfNP3rAOK7kAgRMAET5rDRr9Utt+qAzRBdu3AhR3sg==} + engines: {node: ^16.0.0 || >=18.0.0} + dev: false + + /@typescript-eslint/typescript-estree@6.6.0(typescript@5.2.2): + resolution: {integrity: sha512-hMcTQ6Al8MP2E6JKBAaSxSVw5bDhdmbCEhGW/V8QXkb9oNsFkA4SBuOMYVPxD3jbtQ4R/vSODBsr76R6fP3tbA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: 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 + dependencies: + '@typescript-eslint/types': 6.6.0 + '@typescript-eslint/visitor-keys': 6.6.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + ts-api-utils: 1.0.2(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/utils@6.6.0(eslint@8.48.0)(typescript@5.2.2): + resolution: {integrity: sha512-mPHFoNa2bPIWWglWYdR0QfY9GN0CfvvXX1Sv6DlSTive3jlMTUy+an67//Gysc+0Me9pjitrq0LJp0nGtLgftw==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) + '@types/json-schema': 7.0.12 + '@types/semver': 7.5.1 + '@typescript-eslint/scope-manager': 6.6.0 + '@typescript-eslint/types': 6.6.0 + '@typescript-eslint/typescript-estree': 6.6.0(typescript@5.2.2) + eslint: 8.48.0 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: false + + /@typescript-eslint/visitor-keys@6.6.0: + resolution: {integrity: sha512-L61uJT26cMOfFQ+lMZKoJNbAEckLe539VhTxiGHrWl5XSKQgA0RTBZJW2HFPy5T0ZvPVSD93QsrTKDkfNwJGyQ==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.6.0 + eslint-visitor-keys: 3.4.3 + dev: false + + /abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: false + + /acorn-jsx@5.3.2(acorn@8.10.0): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.10.0 + + /acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + engines: {node: '>=0.4.0'} + hasBin: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: false + + /as-table@1.0.55: + resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} + dependencies: + printable-characters: 1.0.42 + dev: true + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + /better-sqlite3@8.6.0: + resolution: {integrity: sha512-jwAudeiTMTSyby+/SfbHDebShbmC2MCH8mU2+DXi0WJfv13ypEJm47cd3kljmy/H130CazEvkf2Li//ewcMJ1g==} + requiresBuild: true + dependencies: + bindings: 1.5.0 + prebuild-install: 7.1.1 + + /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 + + /bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + /blake3-wasm@2.1.5: + resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} + dev: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + /busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + dependencies: + streamsearch: 1.1.0 + dev: true + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + /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@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + + /cli-color@2.0.3: + resolution: {integrity: sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==} + engines: {node: '>=0.10'} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-iterator: 2.0.3 + memoizee: 0.4.15 + timers-ext: 0.1.7 + dev: true + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: false + + /commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + dev: false + + /commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + /condense-newlines@0.2.1: + resolution: {integrity: sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 2.0.1 + is-whitespace: 0.3.0 + kind-of: 3.2.2 + dev: false + + /config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + dev: false + + /cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + dev: true + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + /d@1.0.1: + resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} + 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 + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: optional: true - - /@esbuild/linux-ia32@0.16.3: - resolution: - { - integrity: sha512-X8FDDxM9cqda2rJE+iblQhIMYY49LfvW4kaEjoFbTTQ4Go8G96Smj2w3BRTwA8IHGoi9dPOPGAX63dhuv19UqA==, - } - engines: { node: ">=12" } - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true + dependencies: + ms: 2.1.2 + + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + dev: false + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: false + + /denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + dev: false + + /detect-libc@2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + engines: {node: '>=8'} + + /difflib@0.2.4: + resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} + dependencies: + heap: 0.2.7 + dev: true + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: false + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + + /dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + dev: false + + /domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + dev: false + + /domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: false + + /domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dev: false + + /dotenv@16.3.1: + resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + engines: {node: '>=12'} + dev: true + + /dreamopt@0.8.0: + resolution: {integrity: sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==} + engines: {node: '>=0.4.0'} + dependencies: + wordwrap: 1.0.0 + dev: true + + /drizzle-kit@0.19.13: + resolution: {integrity: sha512-Rba5VW1O2JfJlwVBeZ8Zwt2E2us5oZ08PQBDiVSGlug53TOc8hzXjblZFuF+dnll9/RQEHrkzBmJFgqTvn5Rxg==} + hasBin: true + dependencies: + '@drizzle-team/studio': 0.0.5 + '@esbuild-kit/esm-loader': 2.5.5 + camelcase: 7.0.1 + chalk: 5.3.0 + commander: 9.5.0 + esbuild: 0.18.20 + esbuild-register: 3.4.2(esbuild@0.18.20) + glob: 8.1.0 + hanji: 0.0.5 + json-diff: 0.9.0 + minimatch: 7.4.6 + zod: 3.22.2 + transitivePeerDependencies: + - supports-color + dev: true + + /drizzle-orm@0.28.6(@cloudflare/workers-types@4.20230904.0)(@libsql/client@0.3.2)(mysql2@3.6.0): + resolution: {integrity: sha512-yBe+F9htrlYER7uXgDJUQsTHFoIrI5yMm5A0bg0GiZ/kY5jNXTWoEy4KQtg35cE27sw1VbgzoMWHAgCckUUUww==} + 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 - - /@esbuild/linux-ia32@0.18.20: - resolution: - { - integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==, - } - engines: { node: ">=12" } - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true + '@cloudflare/workers-types': optional: true - - /@esbuild/linux-loong64@0.16.3: - resolution: - { - integrity: sha512-hIbeejCOyO0X9ujfIIOKjBjNAs9XD/YdJ9JXAy1lHA+8UXuOqbFe4ErMCqMr8dhlMGBuvcQYGF7+kO7waj2KHw==, - } - engines: { node: ">=12" } - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true + '@libsql/client': 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 + '@neondatabase/serverless': optional: true - - /@esbuild/linux-mips64el@0.16.3: - resolution: - { - integrity: sha512-znFRzICT/V8VZQMt6rjb21MtAVJv/3dmKRMlohlShrbVXdBuOdDrGb+C2cZGQAR8RFyRe7HS6klmHq103WpmVw==, - } - engines: { node: ">=12" } - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true + '@opentelemetry/api': 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 + '@planetscale/database': optional: true - - /@esbuild/linux-ppc64@0.16.3: - resolution: - { - integrity: sha512-EV7LuEybxhXrVTDpbqWF2yehYRNz5e5p+u3oQUS2+ZFpknyi1NXxr8URk4ykR8Efm7iu04//4sBg249yNOwy5Q==, - } - engines: { node: ">=12" } - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true + '@types/better-sqlite3': optional: true - - /@esbuild/linux-ppc64@0.18.20: - resolution: - { - integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==, - } - engines: { node: ">=12" } - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true + '@types/pg': optional: true - - /@esbuild/linux-riscv64@0.16.3: - resolution: - { - integrity: sha512-uDxqFOcLzFIJ+r/pkTTSE9lsCEaV/Y6rMlQjUI9BkzASEChYL/aSQjZjchtEmdnVxDKETnUAmsaZ4pqK1eE5BQ==, - } - engines: { node: ">=12" } - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true + '@types/sql.js': optional: true - - /@esbuild/linux-riscv64@0.18.20: - resolution: - { - integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==, - } - engines: { node: ">=12" } - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true + '@vercel/postgres': optional: true - - /@esbuild/linux-s390x@0.16.3: - resolution: - { - integrity: sha512-NbeREhzSxYwFhnCAQOQZmajsPYtX71Ufej3IQ8W2Gxskfz9DK58ENEju4SbpIj48VenktRASC52N5Fhyf/aliQ==, - } - engines: { node: ">=12" } - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true + better-sqlite3: optional: true - - /@esbuild/linux-s390x@0.18.20: - resolution: - { - integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==, - } - engines: { node: ">=12" } - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true + bun-types: optional: true - - /@esbuild/linux-x64@0.16.3: - resolution: - { - integrity: sha512-SDiG0nCixYO9JgpehoKgScwic7vXXndfasjnD5DLbp1xltANzqZ425l7LSdHynt19UWOcDjG9wJJzSElsPvk0w==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + knex: optional: true - - /@esbuild/linux-x64@0.18.20: - resolution: - { - integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + kysely: optional: true - - /@esbuild/netbsd-x64@0.16.3: - resolution: - { - integrity: sha512-AzbsJqiHEq1I/tUvOfAzCY15h4/7Ivp3ff/o1GpP16n48JMNAtbW0qui2WCgoIZArEHD0SUQ95gvR0oSO7ZbdA==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true + mysql2: optional: true - - /@esbuild/netbsd-x64@0.18.20: - resolution: - { - integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true + pg: optional: true - - /@esbuild/openbsd-x64@0.16.3: - resolution: - { - integrity: sha512-gSABi8qHl8k3Cbi/4toAzHiykuBuWLZs43JomTcXkjMZVkp0gj3gg9mO+9HJW/8GB5H89RX/V0QP4JGL7YEEVg==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true + postgres: 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 + sql.js: optional: true - - /@esbuild/sunos-x64@0.16.3: - resolution: - { - integrity: sha512-SF9Kch5Ete4reovvRO6yNjMxrvlfT0F0Flm+NPoUw5Z4Q3r1d23LFTgaLwm3Cp0iGbrU/MoUI+ZqwCv5XJijCw==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true + sqlite3: 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 + dependencies: + '@cloudflare/workers-types': 4.20230904.0 + '@libsql/client': 0.3.2 + mysql2: 3.6.0 + dev: false + + /editorconfig@1.0.4: + resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} + engines: {node: '>=14'} + hasBin: true + dependencies: + '@one-ini/wasm': 0.1.1 + commander: 10.0.1 + minimatch: 9.0.1 + semver: 7.5.4 + dev: false + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: false + + /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.4.2(esbuild@0.18.20): + resolution: {integrity: sha512-kG/XyTDyz6+YDuyfB9ZoSIOOmgyFCH+xPRtsCa8W85HLRV5Csp+o3jWVbOSHgSLfyLc5DmP+KFDNwty4mEjC+Q==} + 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 + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + /eslint-config-google@0.14.0(eslint@8.48.0): + resolution: {integrity: sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==} + engines: {node: '>=0.10.0'} + peerDependencies: + eslint: '>=5.16.0' + dependencies: + eslint: 8.48.0 + dev: true + + /eslint-plugin-json@3.1.0: + resolution: {integrity: sha512-MrlG2ynFEHe7wDGwbUuFPsaT2b1uhuEFhJ+W1f1u+1C2EkXmTYJp4B1aAdQQ8M+CC3t//N/oRKiIVw14L2HR1g==} + engines: {node: '>=12.0'} + dependencies: + lodash: 4.17.21 + vscode-json-languageservice: 4.2.1 + dev: true + + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + /eslint@8.48.0: + resolution: {integrity: sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) + '@eslint-community/regexpp': 4.8.0 + '@eslint/eslintrc': 2.1.2 + '@eslint/js': 8.48.0 + '@humanwhocodes/config-array': 0.11.11 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.21.0 + graphemer: 1.4.0 + ignore: 5.2.4 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.10.0 + acorn-jsx: 5.3.2(acorn@8.10.0) + eslint-visitor-keys: 3.4.3 + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + /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'} + + /event-emitter@0.3.5: + resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + dev: true + + /exit-hook@2.2.1: + resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} + engines: {node: '>=6'} + dev: true + + /expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + + /ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + dependencies: + type: 2.7.2 + dev: true + + /extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + dependencies: + is-extendable: 0.1.1 + dev: false + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + /fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: false + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.1.0 + + /file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + + /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 + + /flat-cache@3.1.0: + resolution: {integrity: sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==} + engines: {node: '>=12.0.0'} + dependencies: + flatted: 3.2.7 + keyv: 4.5.3 + rimraf: 3.0.2 + + /flatted@3.2.7: + resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + + /form-data@3.0.1: + resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /generate-function@2.3.1: + resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} + dependencies: + is-property: 1.0.2 + dev: false + + /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-tsconfig@4.7.0: + resolution: {integrity: sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw==} + dependencies: + resolve-pkg-maps: 1.0.0 + dev: true + + /github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + + /glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + + /globals@13.21.0: + resolution: {integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.1 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: false + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + /hanji@0.0.5: + resolution: {integrity: sha512-Abxw1Lq+TnYiL4BueXqMau222fPSPMFtya8HdpWsz/xVAhifXou71mPh/kY2+08RgFcVccjG3uZHs6K5HAe3zw==} + dependencies: + lodash.throttle: 4.1.1 + sisteransi: 1.0.5 + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + /heap@0.2.7: + resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} + dev: true + + /hono@3.5.8: + resolution: {integrity: sha512-ZipTmGfHm43q5QOEBGog2wyejyNUcicjPt0BLDQ8yz9xij/y9RYXRpR1YPxMpQqeyNM7isvpsIAe9Ems51Wq0Q==} + engines: {node: '>=16.0.0'} + dev: false + + /html-to-text@9.0.3: + resolution: {integrity: sha512-hxDF1kVCF2uw4VUJ3vr2doc91pXf2D5ngKcNviSitNkhP9OMOaJkDrFIFL6RMvko7NisWTEiqGpQ9LAxcVok1w==} + engines: {node: '>=14'} + dependencies: + '@selderee/plugin-htmlparser2': 0.10.0 + deepmerge: 4.3.1 + dom-serializer: 2.0.0 + htmlparser2: 8.0.2 + selderee: 0.10.0 + dev: false + + /htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + entities: 4.5.0 + dev: false + + /http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + dev: true + + /husky@8.0.3: + resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: false + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + dev: false + + /is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + dev: false + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + /is-promise@2.2.2: + resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + dev: true + + /is-property@1.0.2: + resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} + dev: false + + /is-whitespace@0.3.0: + resolution: {integrity: sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==} + engines: {node: '>=0.10.0'} + dev: false + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + /js-base64@3.7.5: + resolution: {integrity: sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==} + dev: false + + /js-beautify@1.14.9: + resolution: {integrity: sha512-coM7xq1syLcMyuVGyToxcj2AlzhkDjmfklL8r0JgJ7A76wyGMpJ1oA35mr4APdYNO/o/4YY8H54NQIJzhMbhBg==} + engines: {node: '>=12'} + hasBin: true + dependencies: + config-chain: 1.1.13 + editorconfig: 1.0.4 + glob: 8.1.0 + nopt: 6.0.0 + dev: false + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: false + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + /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-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: true + + /keyv@4.5.3: + resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} + dependencies: + json-buffer: 3.0.1 + + /kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + dev: false + + /kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + dev: true + + /leac@0.6.0: + resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==} + dev: false + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + /lodash.throttle@4.1.1: + resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + dev: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + + /long@5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + dev: false + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: false + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + + /lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + dev: false + + /lru-cache@8.0.5: + resolution: {integrity: sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==} + engines: {node: '>=16.14'} + dev: false + + /lru-queue@0.1.0: + resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} + dependencies: + es5-ext: 0.10.62 + dev: true + + /lucia@2.4.2: + resolution: {integrity: sha512-JJMAxrsjNXS5WUNe/u9+ahIXM+RNHTL2+RRtzUo1lZgUQL7oFsOgckikdjUPmGaEKrmQfUznxg20L/Ghba3Fjg==} + dev: false + + /magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /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 + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: false + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: false + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: false + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: false + + /mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + dev: true + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + /miniflare@3.20230904.0: + resolution: {integrity: sha512-+OWQqEk8hV7vZaPCoj5dk1lZr4YUy56OiyNZ45/3ITYf+ZxgQOBPWhQhpw1jCahkRKGPa9Aykz01sc+GhPZYDA==} + engines: {node: '>=16.13'} + dependencies: + acorn: 8.10.0 + acorn-walk: 8.2.0 + better-sqlite3: 8.6.0 + capnp-ts: 0.7.0 + exit-hook: 2.2.1 + glob-to-regexp: 0.4.1 + http-cache-semantics: 4.1.1 + kleur: 4.1.5 + source-map-support: 0.5.21 + stoppable: 1.1.0 + undici: 5.23.0 + workerd: 1.20230904.0 + ws: 8.14.0 + youch: 3.3.1 + zod: 3.22.2 + 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 + + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + + /minimatch@7.4.6: + resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimatch@9.0.1: + resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: false + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /mustache@4.2.0: + resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} + hasBin: true + dev: true + + /mysql2@3.6.0: + resolution: {integrity: sha512-EWUGAhv6SphezurlfI2Fpt0uJEWLmirrtQR7SkbTHFC+4/mJBrPiSzHESHKAWKG7ALVD6xaG/NBjjd1DGJGQQQ==} + engines: {node: '>= 8.0'} + dependencies: + denque: 2.1.0 + generate-function: 2.3.1 + iconv-lite: 0.6.3 + long: 5.2.3 + lru-cache: 8.0.5 + named-placeholders: 1.1.3 + seq-queue: 0.0.5 + sqlstring: 2.3.3 + dev: false + + /named-placeholders@1.1.3: + resolution: {integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==} + engines: {node: '>=12.0.0'} + dependencies: + lru-cache: 7.18.3 + dev: false + + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + 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==} + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + /next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + dev: true + + /node-abi@3.47.0: + resolution: {integrity: sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 + + /node-fetch@2.6.12: + resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: optional: true - - /@esbuild/win32-arm64@0.16.3: - resolution: - { - integrity: sha512-u5aBonZIyGopAZyOnoPAA6fGsDeHByZ9CnEzyML9NqntK6D/xl5jteZUKm/p6nD09+v3pTM6TuUIqSPcChk5gg==, - } - engines: { node: ">=12" } - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true + dependencies: + whatwg-url: 5.0.0 + dev: false + + /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 - - /@esbuild/win32-arm64@0.18.20: - resolution: - { - integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==, - } - engines: { node: ">=12" } - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true + dependencies: + whatwg-url: 5.0.0 + dev: false + + /node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + dev: true + + /nopt@6.0.0: + resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: false + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + + /parseley@0.11.0: + resolution: {integrity: sha512-VfcwXlBWgTF+unPcr7yu3HSSA6QUdDaDnrHcytVfj5Z8azAyKBDrYnSIfeSxlrEayndNcLmrXzg+Vxbo6DWRXQ==} + dependencies: + leac: 0.6.0 + peberminta: 0.8.0 + dev: false + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + /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'} + dev: false + + /peberminta@0.8.0: + resolution: {integrity: sha512-YYEs+eauIjDH5nUEGi18EohWE0nV2QbGTqmxQcqgZ/0g+laPCQmuIqq7EBLVi9uim9zMgfJv0QBZEnQ3uHw/Tw==} + dev: false + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + /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.47.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + /prettier@3.0.3: + resolution: {integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==} + engines: {node: '>=14'} + hasBin: true + dev: false + + /pretty@2.0.0: + resolution: {integrity: sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==} + engines: {node: '>=0.10.0'} + dependencies: + condense-newlines: 0.2.1 + extend-shallow: 2.0.1 + js-beautify: 1.14.9 + dev: false + + /printable-characters@1.0.42: + resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} + dev: true + + /proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + 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 + + /punycode@2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: '>=6'} + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + + /react-dom@18.2.0(react@18.2.0): + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + dev: false + + /react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + dev: false + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /resend@1.0.0: + resolution: {integrity: sha512-8LEE4gncmcm8bsvxvahZFpFk5hxUrKdagqWoX/MRXVU2YZ9coYxqZDeDYXG9pexz1A694bjE1hiQbBAA+bHAow==} + engines: {node: '>=16'} + dependencies: + '@react-email/render': 0.0.7 + node-fetch: 2.6.12 + type-fest: 3.13.0 + transitivePeerDependencies: + - encoding + dev: false + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + /resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + + /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. + 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 + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: false + + /scheduler@0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /selderee@0.10.0: + resolution: {integrity: sha512-DEL/RW/f4qLw/NrVg97xKaEBC8IpzIG2fvxnzCp3Z4yk4jQ3MXom+Imav9wApjxX2dfS3eW7x0DXafJr85i39A==} + dependencies: + parseley: 0.11.0 + dev: false + + /selfsigned@2.1.1: + resolution: {integrity: sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==} + engines: {node: '>=10'} + dependencies: + node-forge: 1.3.1 + dev: true + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /seq-queue@0.0.5: + resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==} + dev: false + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + /simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + + /sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: true + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: false + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + dev: true + + /sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + dev: true + + /sqlstring@2.3.3: + resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} + engines: {node: '>= 0.6'} + dev: false + + /stacktracey@2.1.8: + resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==} + dependencies: + as-table: 1.0.55 + get-source: 2.0.12 + dev: true + + /stoppable@1.1.0: + resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} + engines: {node: '>=4', npm: '>=6'} + dev: true + + /streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + dev: true + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + + /tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + + /tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + 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 + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + /timers-ext@0.1.7: + resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==} + dependencies: + es5-ext: 0.10.62 + next-tick: 1.1.0 + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: false + + /ts-api-utils@1.0.2(typescript@5.2.2): + resolution: {integrity: sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==} + engines: {node: '>=16.13.0'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.2.2 + dev: false + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + dev: true + + /tsx@3.12.8: + resolution: {integrity: sha512-Lt9KYaRGF023tlLInPj8rgHwsZU8qWLBj4iRXNWxTfjIkU7canGL806AqKear1j722plHuiYNcL2ZCo6uS9UJA==} + hasBin: true + dependencies: + '@esbuild-kit/cjs-loader': 2.4.2 + '@esbuild-kit/core-utils': 3.2.2 + '@esbuild-kit/esm-loader': 2.5.5 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + /type-fest@3.13.0: + resolution: {integrity: sha512-Gur3yQGM9qiLNs0KPP7LPgeRbio2QTt4xXouobMCarR0/wyW3F+F/+OWwshg3NG0Adon7uQfSZBpB46NfhoF1A==} + engines: {node: '>=14.16'} + 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 + + /typescript@5.2.2: + resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + engines: {node: '>=14.17'} + hasBin: true + + /undici@5.23.0: + resolution: {integrity: sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==} + engines: {node: '>=14.0'} + dependencies: + busboy: 1.6.0 + dev: true + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.0 + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + /vscode-json-languageservice@4.2.1: + resolution: {integrity: sha512-xGmv9QIWs2H8obGbWg+sIPI/3/pFgj/5OWBhNzs00BkYQ9UaB2F6JJaGB/2/YOZJ3BvLXQTC4Q7muqU25QgAhA==} + dependencies: + jsonc-parser: 3.2.0 + vscode-languageserver-textdocument: 1.0.8 + vscode-languageserver-types: 3.17.3 + vscode-nls: 5.2.0 + vscode-uri: 3.0.7 + dev: true + + /vscode-languageserver-textdocument@1.0.8: + resolution: {integrity: sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==} + dev: true + + /vscode-languageserver-types@3.17.3: + resolution: {integrity: sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA==} + dev: true + + /vscode-nls@5.2.0: + resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==} + dev: true + + /vscode-uri@3.0.7: + resolution: {integrity: sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==} + 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@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + + /wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + dev: true + + /workerd@1.20230904.0: + resolution: {integrity: sha512-t9znszH0rQGK4mJGvF9L3nN0qKEaObAGx0JkywFtAwH8OkSn+YfQbHNZE+YsJ4qa1hOz1DCNEk08UDFRBaYq4g==} + engines: {node: '>=16'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@cloudflare/workerd-darwin-64': 1.20230904.0 + '@cloudflare/workerd-darwin-arm64': 1.20230904.0 + '@cloudflare/workerd-linux-64': 1.20230904.0 + '@cloudflare/workerd-linux-arm64': 1.20230904.0 + '@cloudflare/workerd-windows-64': 1.20230904.0 + dev: true + + /wrangler@3.7.0: + resolution: {integrity: sha512-7823G5U7WwDIkqaZrxSh/BQ/pxA4WIX3R9GwYfh+MYJj+k5s56KGQ+K/NmY/JbgZsxVEHDjhoYzqDqJebQMZeg==} + engines: {node: '>=16.13.0'} + hasBin: true + 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.20230904.0 + nanoid: 3.3.6 + path-to-regexp: 6.2.1 + selfsigned: 2.1.1 + source-map: 0.7.4 + xxhash-wasm: 1.0.2 + optionalDependencies: + fsevents: 2.3.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /ws@8.14.0: + resolution: {integrity: sha512-WR0RJE9Ehsio6U4TuM+LmunEsjQ5ncHlw4sn9ihD6RoJKZrVyH9FWV3dmnwu8B2aNib1OvG2X6adUCyFpQyWcg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: optional: true - - /@esbuild/win32-ia32@0.16.3: - resolution: - { - integrity: sha512-GlgVq1WpvOEhNioh74TKelwla9KDuAaLZrdxuuUgsP2vayxeLgVc+rbpIv0IYF4+tlIzq2vRhofV+KGLD+37EQ==, - } - engines: { node: ">=12" } - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true + utf-8-validate: 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 + /xxhash-wasm@1.0.2: + resolution: {integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==} + dev: true - /@esbuild/win32-x64@0.16.3: - resolution: - { - integrity: sha512-5/JuTd8OWW8UzEtyf19fbrtMJENza+C9JoPIkvItgTBQ1FO2ZLvjbPO6Xs54vk0s5JB5QsfieUEshRQfu7ZHow==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - /@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 + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} - /@eslint-community/eslint-utils@4.4.0(eslint@8.48.0): - resolution: - { - integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.48.0 - eslint-visitor-keys: 3.4.3 - - /@eslint-community/regexpp@4.8.0: - resolution: - { - integrity: sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==, - } - engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } - - /@eslint/eslintrc@2.1.2: - resolution: - { - integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.6.1 - globals: 13.21.0 - ignore: 5.2.4 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - /@eslint/js@8.48.0: - resolution: - { - integrity: sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - - /@humanwhocodes/config-array@0.11.11: - resolution: - { - integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==, - } - engines: { node: ">=10.10.0" } - dependencies: - "@humanwhocodes/object-schema": 1.2.1 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - /@humanwhocodes/module-importer@1.0.1: - resolution: - { - integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, - } - engines: { node: ">=12.22" } - - /@humanwhocodes/object-schema@1.2.1: - resolution: - { - integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==, - } - - /@libsql/client@0.3.2: - resolution: - { - integrity: sha512-e0qgf7gFOwhu0ueU/RK68TmD0PnjX3RaeM5lrJowGMEZjvh/shZ4BhwPA26Ec0nSa4oiZ0s0zn/T5YjcgY1bTw==, - } - dependencies: - "@libsql/hrana-client": 0.5.0 - better-sqlite3: 8.5.2 - js-base64: 3.7.5 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - dev: false - - /@libsql/hrana-client@0.5.0: - resolution: - { - integrity: sha512-o9yXH+9XBPnMSrBkY17q2xknfNXJaCHQv4rFJikt1g8M0d80hwp4ZZ1jHwacuL61wRa4j6qKMFqh9ti+CoTH1A==, - } - dependencies: - "@libsql/isomorphic-fetch": 0.1.6 - "@libsql/isomorphic-ws": 0.1.3 - js-base64: 3.7.5 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - dev: false - - /@libsql/isomorphic-fetch@0.1.6: - resolution: - { - integrity: sha512-8qhxEDmVBDb54E9xdW1xqw3zLNShkMZpf5YQU3PvwjtKNLOPde59Oqez+RnZHsYkt9zQxxOF+7gSHVJeP/UWqg==, - } - dependencies: - "@types/node-fetch": 2.6.4 - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding - dev: false - - /@libsql/isomorphic-ws@0.1.3: - resolution: - { - integrity: sha512-54dZXgYwWDKsnfWv8GCVYvhn6RDlqFDGAc8EQMd941yvGMsGzo06Gn6Iyjw//nJ1iJO97FbXgoQ1apikoFD/WA==, - } - dependencies: - "@types/ws": 8.5.5 - ws: 8.13.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: false - - /@lucia-auth/adapter-sqlite@2.0.0(@libsql/client@0.3.2)(lucia@2.4.1): - resolution: - { - integrity: sha512-Hiy8WND/1mi25r0M2ruSml+Ab5GJLr4XZEHApYw1lxybF+VlPUyX7oTtIVCSgvq/SWiP/tvnyPwnXAPmNr8/bg==, - } - peerDependencies: - "@libsql/client": ^0.3.0 - better-sqlite3: ^8.0.0 - lucia: ^2.0.0 - peerDependenciesMeta: - "@libsql/client": - optional: true - better-sqlite3: - optional: true - dependencies: - "@libsql/client": 0.3.2 - lucia: 2.4.1 - dev: false - - /@nodelib/fs.scandir@2.1.5: - resolution: - { - integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, - } - engines: { node: ">= 8" } - dependencies: - "@nodelib/fs.stat": 2.0.5 - run-parallel: 1.2.0 - - /@nodelib/fs.stat@2.0.5: - resolution: - { - integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, - } - engines: { node: ">= 8" } - - /@nodelib/fs.walk@1.2.8: - resolution: - { - integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, - } - engines: { node: ">= 8" } - dependencies: - "@nodelib/fs.scandir": 2.1.5 - fastq: 1.15.0 - - /@one-ini/wasm@0.1.1: - resolution: - { - integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==, - } - dev: false - - /@react-email/render@0.0.7: - resolution: - { - integrity: sha512-hMMhxk6TpOcDC5qnKzXPVJoVGEwfm+U5bGOPH+MyTTlx0F02RLQygcATBKsbP7aI/mvkmBAZoFbgPIHop7ovug==, - } - engines: { node: ">=16.0.0" } - dependencies: - html-to-text: 9.0.3 - pretty: 2.0.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@selderee/plugin-htmlparser2@0.10.0: - resolution: - { - integrity: sha512-gW69MEamZ4wk1OsOq1nG1jcyhXIQcnrsX5JwixVw/9xaiav8TCyjESAruu1Rz9yyInhgBXxkNwMeygKnN2uxNA==, - } - dependencies: - domhandler: 5.0.3 - selderee: 0.10.0 - dev: false - - /@types/json-schema@7.0.12: - resolution: - { - integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==, - } - dev: false - - /@types/node-fetch@2.6.4: - resolution: - { - integrity: sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==, - } - dependencies: - "@types/node": 20.5.8 - form-data: 3.0.1 - dev: false - - /@types/node@20.5.8: - resolution: - { - integrity: sha512-eajsR9aeljqNhK028VG0Wuw+OaY5LLxYmxeoXynIoE6jannr9/Ucd1LL0hSSoafk5LTYG+FfqsyGt81Q6Zkybw==, - } - - /@types/semver@7.5.1: - resolution: - { - integrity: sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==, - } - dev: false - - /@types/ws@8.5.5: - resolution: - { - integrity: sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==, - } - dependencies: - "@types/node": 20.5.8 - dev: false - - /@typescript-eslint/eslint-plugin@6.5.0(@typescript-eslint/parser@6.5.0)(eslint@8.48.0)(typescript@5.2.2): - resolution: - { - integrity: sha512-2pktILyjvMaScU6iK3925uvGU87E+N9rh372uGZgiMYwafaw9SXq86U04XPq3UH6tzRvNgBsub6x2DacHc33lw==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - peerDependencies: - "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - dependencies: - "@eslint-community/regexpp": 4.8.0 - "@typescript-eslint/parser": 6.5.0(eslint@8.48.0)(typescript@5.2.2) - "@typescript-eslint/scope-manager": 6.5.0 - "@typescript-eslint/type-utils": 6.5.0(eslint@8.48.0)(typescript@5.2.2) - "@typescript-eslint/utils": 6.5.0(eslint@8.48.0)(typescript@5.2.2) - "@typescript-eslint/visitor-keys": 6.5.0 - debug: 4.3.4 - eslint: 8.48.0 - graphemer: 1.4.0 - ignore: 5.2.4 - natural-compare: 1.4.0 - semver: 7.5.4 - ts-api-utils: 1.0.2(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/parser@6.5.0(eslint@8.48.0)(typescript@5.2.2): - resolution: - { - integrity: sha512-LMAVtR5GN8nY0G0BadkG0XIe4AcNMeyEy3DyhKGAh9k4pLSMBO7rF29JvDBpZGCmp5Pgz5RLHP6eCpSYZJQDuQ==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - dependencies: - "@typescript-eslint/scope-manager": 6.5.0 - "@typescript-eslint/types": 6.5.0 - "@typescript-eslint/typescript-estree": 6.5.0(typescript@5.2.2) - "@typescript-eslint/visitor-keys": 6.5.0 - debug: 4.3.4 - eslint: 8.48.0 - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/scope-manager@6.5.0: - resolution: - { - integrity: sha512-A8hZ7OlxURricpycp5kdPTH3XnjG85UpJS6Fn4VzeoH4T388gQJ/PGP4ole5NfKt4WDVhmLaQ/dBLNDC4Xl/Kw==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - dependencies: - "@typescript-eslint/types": 6.5.0 - "@typescript-eslint/visitor-keys": 6.5.0 - dev: false - - /@typescript-eslint/type-utils@6.5.0(eslint@8.48.0)(typescript@5.2.2): - resolution: - { - integrity: sha512-f7OcZOkRivtujIBQ4yrJNIuwyCQO1OjocVqntl9dgSIZAdKqicj3xFDqDOzHDlGCZX990LqhLQXWRnQvsapq8A==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - dependencies: - "@typescript-eslint/typescript-estree": 6.5.0(typescript@5.2.2) - "@typescript-eslint/utils": 6.5.0(eslint@8.48.0)(typescript@5.2.2) - debug: 4.3.4 - eslint: 8.48.0 - ts-api-utils: 1.0.2(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/types@6.5.0: - resolution: - { - integrity: sha512-eqLLOEF5/lU8jW3Bw+8auf4lZSbbljHR2saKnYqON12G/WsJrGeeDHWuQePoEf9ro22+JkbPfWQwKEC5WwLQ3w==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - dev: false - - /@typescript-eslint/typescript-estree@6.5.0(typescript@5.2.2): - resolution: - { - integrity: sha512-q0rGwSe9e5Kk/XzliB9h2LBc9tmXX25G0833r7kffbl5437FPWb2tbpIV9wAATebC/018pGa9fwPDuvGN+LxWQ==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - peerDependencies: - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - dependencies: - "@typescript-eslint/types": 6.5.0 - "@typescript-eslint/visitor-keys": 6.5.0 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.5.4 - ts-api-utils: 1.0.2(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/utils@6.5.0(eslint@8.48.0)(typescript@5.2.2): - resolution: - { - integrity: sha512-9nqtjkNykFzeVtt9Pj6lyR9WEdd8npPhhIPM992FWVkZuS6tmxHfGVnlUcjpUP2hv8r4w35nT33mlxd+Be1ACQ==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.48.0) - "@types/json-schema": 7.0.12 - "@types/semver": 7.5.1 - "@typescript-eslint/scope-manager": 6.5.0 - "@typescript-eslint/types": 6.5.0 - "@typescript-eslint/typescript-estree": 6.5.0(typescript@5.2.2) - eslint: 8.48.0 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - - typescript - dev: false - - /@typescript-eslint/visitor-keys@6.5.0: - resolution: - { - integrity: sha512-yCB/2wkbv3hPsh02ZS8dFQnij9VVQXJMN/gbQsaaY+zxALkZnxa/wagvLEFsAWMPv7d7lxQmNsIzGU1w/T/WyA==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - dependencies: - "@typescript-eslint/types": 6.5.0 - eslint-visitor-keys: 3.4.3 - dev: false - - /abbrev@1.1.1: - resolution: - { - integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==, - } - dev: false - - /acorn-jsx@5.3.2(acorn@8.10.0): - resolution: - { - integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, - } - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.10.0 - - /acorn-walk@8.2.0: - resolution: - { - integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==, - } - engines: { node: ">=0.4.0" } - dev: true - - /acorn@8.10.0: - resolution: - { - integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==, - } - engines: { node: ">=0.4.0" } - hasBin: true - - /ajv@6.12.6: - resolution: - { - integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, - } - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - - /ansi-regex@5.0.1: - resolution: - { - integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, - } - engines: { node: ">=8" } - - /ansi-styles@4.3.0: - resolution: - { - integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, - } - engines: { node: ">=8" } - dependencies: - color-convert: 2.0.1 - - /anymatch@3.1.3: - resolution: - { - integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, - } - engines: { node: ">= 8" } - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - - /argparse@2.0.1: - resolution: - { - integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, - } - - /array-union@2.1.0: - resolution: - { - integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, - } - engines: { node: ">=8" } - dev: false - - /as-table@1.0.55: - resolution: - { - integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==, - } - dependencies: - printable-characters: 1.0.42 - dev: true - - /asynckit@0.4.0: - resolution: - { - integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, - } - dev: false - - /balanced-match@1.0.2: - resolution: - { - integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, - } - - /base64-js@1.5.1: - resolution: - { - integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, - } - - /better-sqlite3@8.5.2: - resolution: - { - integrity: sha512-w/EZ/jwuZF+/47mAVC2+rhR2X/gwkZ+fd1pbX7Y90D5NRaRzDQcxrHY10t6ijGiYIonCVsBSF5v1cay07bP5sg==, - } - requiresBuild: true - dependencies: - bindings: 1.5.0 - prebuild-install: 7.1.1 - - /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 - - /bl@4.1.0: - resolution: - { - integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==, - } - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - - /blake3-wasm@2.1.5: - resolution: - { - integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==, - } - dev: true - - /brace-expansion@1.1.11: - resolution: - { - integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, - } - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - /brace-expansion@2.0.1: - resolution: - { - integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, - } - dependencies: - balanced-match: 1.0.2 - - /braces@3.0.2: - resolution: - { - integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==, - } - engines: { node: ">=8" } - dependencies: - fill-range: 7.0.1 - - /buffer-from@1.1.2: - resolution: - { - integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, - } - dev: true - - /buffer@5.7.1: - resolution: - { - integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, - } - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - /busboy@1.6.0: - resolution: - { - integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==, - } - engines: { node: ">=10.16.0" } - dependencies: - streamsearch: 1.1.0 - dev: true - - /callsites@3.1.0: - resolution: - { - integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, - } - engines: { node: ">=6" } - - /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@4.1.2: - resolution: - { - integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, - } - engines: { node: ">=10" } - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - /chalk@5.3.0: - resolution: - { - integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==, - } - engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } - dev: true - - /chokidar@3.5.3: - resolution: - { - integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, - } - engines: { node: ">= 8.10.0" } - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /chownr@1.1.4: - resolution: - { - integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==, - } - - /cli-color@2.0.3: - resolution: - { - integrity: sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==, - } - engines: { node: ">=0.10" } - dependencies: - d: 1.0.1 - es5-ext: 0.10.62 - es6-iterator: 2.0.3 - memoizee: 0.4.15 - timers-ext: 0.1.7 - dev: true - - /color-convert@2.0.1: - resolution: - { - integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, - } - engines: { node: ">=7.0.0" } - dependencies: - color-name: 1.1.4 - - /color-name@1.1.4: - resolution: - { - integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, - } - - /combined-stream@1.0.8: - resolution: - { - integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, - } - engines: { node: ">= 0.8" } - dependencies: - delayed-stream: 1.0.0 - dev: false - - /commander@10.0.1: - resolution: - { - integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==, - } - engines: { node: ">=14" } - dev: false - - /commander@9.5.0: - resolution: - { - integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==, - } - engines: { node: ^12.20.0 || >=14 } - dev: true - - /concat-map@0.0.1: - resolution: - { - integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, - } - - /condense-newlines@0.2.1: - resolution: - { - integrity: sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==, - } - engines: { node: ">=0.10.0" } - dependencies: - extend-shallow: 2.0.1 - is-whitespace: 0.3.0 - kind-of: 3.2.2 - dev: false - - /config-chain@1.1.13: - resolution: - { - integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==, - } - dependencies: - ini: 1.3.8 - proto-list: 1.2.4 - dev: false - - /cookie@0.5.0: - resolution: - { - integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==, - } - engines: { node: ">= 0.6" } - dev: true - - /cross-spawn@7.0.3: - resolution: - { - integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, - } - engines: { node: ">= 8" } - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - /d@1.0.1: - resolution: - { - integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==, - } - 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 - - /debug@4.3.4: - resolution: - { - integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, - } - engines: { node: ">=6.0" } - peerDependencies: - supports-color: "*" - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - - /decompress-response@6.0.0: - resolution: - { - integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==, - } - engines: { node: ">=10" } - dependencies: - mimic-response: 3.1.0 - - /deep-extend@0.6.0: - resolution: - { - integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==, - } - engines: { node: ">=4.0.0" } - - /deep-is@0.1.4: - resolution: - { - integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, - } - - /deepmerge@4.3.1: - resolution: - { - integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==, - } - engines: { node: ">=0.10.0" } - dev: false - - /delayed-stream@1.0.0: - resolution: - { - integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, - } - engines: { node: ">=0.4.0" } - dev: false - - /denque@2.1.0: - resolution: - { - integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==, - } - engines: { node: ">=0.10" } - dev: false - - /detect-libc@2.0.2: - resolution: - { - integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==, - } - engines: { node: ">=8" } - - /difflib@0.2.4: - resolution: - { - integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==, - } - dependencies: - heap: 0.2.7 - dev: true - - /dir-glob@3.0.1: - resolution: - { - integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, - } - engines: { node: ">=8" } - dependencies: - path-type: 4.0.0 - dev: false - - /doctrine@3.0.0: - resolution: - { - integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==, - } - engines: { node: ">=6.0.0" } - dependencies: - esutils: 2.0.3 - - /dom-serializer@2.0.0: - resolution: - { - integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==, - } - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - entities: 4.5.0 - dev: false - - /domelementtype@2.3.0: - resolution: - { - integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==, - } - dev: false - - /domhandler@5.0.3: - resolution: - { - integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==, - } - engines: { node: ">= 4" } - dependencies: - domelementtype: 2.3.0 - dev: false - - /domutils@3.1.0: - resolution: - { - integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==, - } - dependencies: - dom-serializer: 2.0.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - dev: false - - /dotenv@16.3.1: - resolution: - { - integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==, - } - engines: { node: ">=12" } - dev: true - - /dreamopt@0.8.0: - resolution: - { - integrity: sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==, - } - engines: { node: ">=0.4.0" } - dependencies: - wordwrap: 1.0.0 - dev: true - - /drizzle-kit@0.19.13: - resolution: - { - integrity: sha512-Rba5VW1O2JfJlwVBeZ8Zwt2E2us5oZ08PQBDiVSGlug53TOc8hzXjblZFuF+dnll9/RQEHrkzBmJFgqTvn5Rxg==, - } - hasBin: true - dependencies: - "@drizzle-team/studio": 0.0.5 - "@esbuild-kit/esm-loader": 2.5.5 - camelcase: 7.0.1 - chalk: 5.3.0 - commander: 9.5.0 - esbuild: 0.18.20 - esbuild-register: 3.4.2(esbuild@0.18.20) - glob: 8.1.0 - hanji: 0.0.5 - json-diff: 0.9.0 - minimatch: 7.4.6 - zod: 3.22.2 - transitivePeerDependencies: - - supports-color - dev: true - - /drizzle-orm@0.28.5(@cloudflare/workers-types@4.20230821.0)(@libsql/client@0.3.2)(mysql2@3.6.0): - resolution: - { - integrity: sha512-6r6Iw4c38NAmW6TiKH3TUpGUQ1YdlEoLJOQptn8XPx3Z63+vFNKfAiANqrIiYZiMjKR9+NYAL219nFrmo1duXA==, - } - 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: - "@cloudflare/workers-types": 4.20230821.0 - "@libsql/client": 0.3.2 - mysql2: 3.6.0 - dev: false - - /editorconfig@1.0.4: - resolution: - { - integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==, - } - engines: { node: ">=14" } - hasBin: true - dependencies: - "@one-ini/wasm": 0.1.1 - commander: 10.0.1 - minimatch: 9.0.1 - semver: 7.5.4 - dev: false - - /end-of-stream@1.4.4: - resolution: - { - integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, - } - dependencies: - once: 1.4.0 - - /entities@4.5.0: - resolution: - { - integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==, - } - engines: { node: ">=0.12" } - dev: false - - /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.4.2(esbuild@0.18.20): - resolution: - { - integrity: sha512-kG/XyTDyz6+YDuyfB9ZoSIOOmgyFCH+xPRtsCa8W85HLRV5Csp+o3jWVbOSHgSLfyLc5DmP+KFDNwty4mEjC+Q==, - } - peerDependencies: - esbuild: ">=0.12 <1" - dependencies: - debug: 4.3.4 - esbuild: 0.18.20 - transitivePeerDependencies: - - supports-color - dev: true - - /esbuild@0.16.3: - resolution: - { - integrity: sha512-71f7EjPWTiSguen8X/kxEpkAS7BFHwtQKisCDDV3Y4GLGWBaoSCyD5uXkaUew6JDzA9FEN1W23mdnSwW9kqCeg==, - } - engines: { node: ">=12" } - hasBin: true - requiresBuild: true - optionalDependencies: - "@esbuild/android-arm": 0.16.3 - "@esbuild/android-arm64": 0.16.3 - "@esbuild/android-x64": 0.16.3 - "@esbuild/darwin-arm64": 0.16.3 - "@esbuild/darwin-x64": 0.16.3 - "@esbuild/freebsd-arm64": 0.16.3 - "@esbuild/freebsd-x64": 0.16.3 - "@esbuild/linux-arm": 0.16.3 - "@esbuild/linux-arm64": 0.16.3 - "@esbuild/linux-ia32": 0.16.3 - "@esbuild/linux-loong64": 0.16.3 - "@esbuild/linux-mips64el": 0.16.3 - "@esbuild/linux-ppc64": 0.16.3 - "@esbuild/linux-riscv64": 0.16.3 - "@esbuild/linux-s390x": 0.16.3 - "@esbuild/linux-x64": 0.16.3 - "@esbuild/netbsd-x64": 0.16.3 - "@esbuild/openbsd-x64": 0.16.3 - "@esbuild/sunos-x64": 0.16.3 - "@esbuild/win32-arm64": 0.16.3 - "@esbuild/win32-ia32": 0.16.3 - "@esbuild/win32-x64": 0.16.3 - 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 - - /escape-string-regexp@4.0.0: - resolution: - { - integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, - } - engines: { node: ">=10" } - - /eslint-config-google@0.14.0(eslint@8.48.0): - resolution: - { - integrity: sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==, - } - engines: { node: ">=0.10.0" } - peerDependencies: - eslint: ">=5.16.0" - dependencies: - eslint: 8.48.0 - dev: true - - /eslint-plugin-json@3.1.0: - resolution: - { - integrity: sha512-MrlG2ynFEHe7wDGwbUuFPsaT2b1uhuEFhJ+W1f1u+1C2EkXmTYJp4B1aAdQQ8M+CC3t//N/oRKiIVw14L2HR1g==, - } - engines: { node: ">=12.0" } - dependencies: - lodash: 4.17.21 - vscode-json-languageservice: 4.2.1 - dev: true - - /eslint-scope@7.2.2: - resolution: - { - integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - /eslint-visitor-keys@3.4.3: - resolution: - { - integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - - /eslint@8.48.0: - resolution: - { - integrity: sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - hasBin: true - dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.48.0) - "@eslint-community/regexpp": 4.8.0 - "@eslint/eslintrc": 2.1.2 - "@eslint/js": 8.48.0 - "@humanwhocodes/config-array": 0.11.11 - "@humanwhocodes/module-importer": 1.0.1 - "@nodelib/fs.walk": 1.2.8 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.21.0 - graphemer: 1.4.0 - ignore: 5.2.4 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.3 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - - /espree@9.6.1: - resolution: - { - integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - acorn: 8.10.0 - acorn-jsx: 5.3.2(acorn@8.10.0) - eslint-visitor-keys: 3.4.3 - - /esquery@1.5.0: - resolution: - { - integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==, - } - engines: { node: ">=0.10" } - dependencies: - estraverse: 5.3.0 - - /esrecurse@4.3.0: - resolution: - { - integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, - } - engines: { node: ">=4.0" } - dependencies: - estraverse: 5.3.0 - - /estraverse@5.3.0: - resolution: - { - integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, - } - engines: { node: ">=4.0" } - - /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" } - - /event-emitter@0.3.5: - resolution: - { - integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==, - } - dependencies: - d: 1.0.1 - es5-ext: 0.10.62 - dev: true - - /exit-hook@2.2.1: - resolution: - { - integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==, - } - engines: { node: ">=6" } - dev: true - - /expand-template@2.0.3: - resolution: - { - integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==, - } - engines: { node: ">=6" } - - /ext@1.7.0: - resolution: - { - integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==, - } - dependencies: - type: 2.7.2 - dev: true - - /extend-shallow@2.0.1: - resolution: - { - integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==, - } - engines: { node: ">=0.10.0" } - dependencies: - is-extendable: 0.1.1 - dev: false - - /fast-deep-equal@3.1.3: - resolution: - { - integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, - } - - /fast-glob@3.3.1: - resolution: - { - integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==, - } - engines: { node: ">=8.6.0" } - dependencies: - "@nodelib/fs.stat": 2.0.5 - "@nodelib/fs.walk": 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: false - - /fast-json-stable-stringify@2.1.0: - resolution: - { - integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, - } - - /fast-levenshtein@2.0.6: - resolution: - { - integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, - } - - /fastq@1.15.0: - resolution: - { - integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==, - } - dependencies: - reusify: 1.0.4 - - /file-entry-cache@6.0.1: - resolution: - { - integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==, - } - engines: { node: ^10.12.0 || >=12.0.0 } - dependencies: - flat-cache: 3.1.0 - - /file-uri-to-path@1.0.0: - resolution: - { - integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==, - } - - /fill-range@7.0.1: - resolution: - { - integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==, - } - engines: { node: ">=8" } - dependencies: - to-regex-range: 5.0.1 - - /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 - - /flat-cache@3.1.0: - resolution: - { - integrity: sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==, - } - engines: { node: ">=12.0.0" } - dependencies: - flatted: 3.2.7 - keyv: 4.5.3 - rimraf: 3.0.2 - - /flatted@3.2.7: - resolution: - { - integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==, - } - - /form-data@3.0.1: - resolution: - { - integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==, - } - engines: { node: ">= 6" } - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: false - - /fs-constants@1.0.0: - resolution: - { - integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==, - } - - /fs.realpath@1.0.0: - resolution: - { - integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, - } - - /fsevents@2.3.3: - resolution: - { - integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, - } - engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } - os: [darwin] - requiresBuild: true - dev: true - optional: true + /youch@3.3.1: + resolution: {integrity: sha512-Rg9ioi+AkKyje2Hk4qILSVvayaFW98KTsOJ4aIkjDf97LZX5WJVIHZmFLnM4ThcVofHo/fbbwtYajfBPHFOVtg==} + dependencies: + cookie: 0.5.0 + mustache: 4.2.0 + stacktracey: 2.1.8 + dev: true - /generate-function@2.3.1: - resolution: - { - integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==, - } - dependencies: - is-property: 1.0.2 - dev: false - - /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-tsconfig@4.7.0: - resolution: - { - integrity: sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw==, - } - dependencies: - resolve-pkg-maps: 1.0.0 - dev: true - - /github-from-package@0.0.0: - resolution: - { - integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==, - } - - /glob-parent@5.1.2: - resolution: - { - integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, - } - engines: { node: ">= 6" } - dependencies: - is-glob: 4.0.3 - - /glob-parent@6.0.2: - resolution: - { - integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, - } - engines: { node: ">=10.13.0" } - dependencies: - is-glob: 4.0.3 - - /glob-to-regexp@0.4.1: - resolution: - { - integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==, - } - dev: true - - /glob@7.2.3: - resolution: - { - integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, - } - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - /glob@8.1.0: - resolution: - { - integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==, - } - engines: { node: ">=12" } - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - - /globals@13.21.0: - resolution: - { - integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==, - } - engines: { node: ">=8" } - dependencies: - type-fest: 0.20.2 - - /globby@11.1.0: - resolution: - { - integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, - } - engines: { node: ">=10" } - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.1 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 3.0.0 - dev: false - - /graphemer@1.4.0: - resolution: - { - integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, - } - - /hanji@0.0.5: - resolution: - { - integrity: sha512-Abxw1Lq+TnYiL4BueXqMau222fPSPMFtya8HdpWsz/xVAhifXou71mPh/kY2+08RgFcVccjG3uZHs6K5HAe3zw==, - } - dependencies: - lodash.throttle: 4.1.1 - sisteransi: 1.0.5 - dev: true - - /has-flag@4.0.0: - resolution: - { - integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, - } - engines: { node: ">=8" } - - /heap@0.2.7: - resolution: - { - integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==, - } - dev: true - - /hono@3.5.6: - resolution: - { - integrity: sha512-ycTOpIZJ6yLbjzoE+ojsesC7G7ZXfGSoCIDyvqmzlHc5Mk4Aj48Ed9R5g7gw3v7rOkS81pjcYIvWef/karq1iA==, - } - engines: { node: ">=16.0.0" } - dev: false - - /html-to-text@9.0.3: - resolution: - { - integrity: sha512-hxDF1kVCF2uw4VUJ3vr2doc91pXf2D5ngKcNviSitNkhP9OMOaJkDrFIFL6RMvko7NisWTEiqGpQ9LAxcVok1w==, - } - engines: { node: ">=14" } - dependencies: - "@selderee/plugin-htmlparser2": 0.10.0 - deepmerge: 4.3.1 - dom-serializer: 2.0.0 - htmlparser2: 8.0.2 - selderee: 0.10.0 - dev: false - - /htmlparser2@8.0.2: - resolution: - { - integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==, - } - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.1.0 - entities: 4.5.0 - dev: false - - /http-cache-semantics@4.1.1: - resolution: - { - integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==, - } - dev: true - - /husky@8.0.3: - resolution: - { - integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==, - } - engines: { node: ">=14" } - hasBin: true - dev: true - - /iconv-lite@0.6.3: - resolution: - { - integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, - } - engines: { node: ">=0.10.0" } - dependencies: - safer-buffer: 2.1.2 - dev: false - - /ieee754@1.2.1: - resolution: - { - integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, - } - - /ignore@5.2.4: - resolution: - { - integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==, - } - engines: { node: ">= 4" } - - /import-fresh@3.3.0: - resolution: - { - integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, - } - engines: { node: ">=6" } - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - /imurmurhash@0.1.4: - resolution: - { - integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, - } - engines: { node: ">=0.8.19" } - - /inflight@1.0.6: - resolution: - { - integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, - } - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - /inherits@2.0.4: - resolution: - { - integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, - } - - /ini@1.3.8: - resolution: - { - integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, - } - - /is-binary-path@2.1.0: - resolution: - { - integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, - } - engines: { node: ">=8" } - dependencies: - binary-extensions: 2.2.0 - dev: true - - /is-buffer@1.1.6: - resolution: - { - integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==, - } - dev: false - - /is-extendable@0.1.1: - resolution: - { - integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==, - } - engines: { node: ">=0.10.0" } - dev: false - - /is-extglob@2.1.1: - resolution: - { - integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, - } - engines: { node: ">=0.10.0" } - - /is-glob@4.0.3: - resolution: - { - integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, - } - engines: { node: ">=0.10.0" } - dependencies: - is-extglob: 2.1.1 - - /is-number@7.0.0: - resolution: - { - integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, - } - engines: { node: ">=0.12.0" } - - /is-path-inside@3.0.3: - resolution: - { - integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, - } - engines: { node: ">=8" } - - /is-promise@2.2.2: - resolution: - { - integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==, - } - dev: true - - /is-property@1.0.2: - resolution: - { - integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==, - } - dev: false - - /is-whitespace@0.3.0: - resolution: - { - integrity: sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==, - } - engines: { node: ">=0.10.0" } - dev: false - - /isexe@2.0.0: - resolution: - { - integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, - } - - /js-base64@3.7.5: - resolution: - { - integrity: sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==, - } - dev: false - - /js-beautify@1.14.9: - resolution: - { - integrity: sha512-coM7xq1syLcMyuVGyToxcj2AlzhkDjmfklL8r0JgJ7A76wyGMpJ1oA35mr4APdYNO/o/4YY8H54NQIJzhMbhBg==, - } - engines: { node: ">=12" } - hasBin: true - dependencies: - config-chain: 1.1.13 - editorconfig: 1.0.4 - glob: 8.1.0 - nopt: 6.0.0 - dev: false - - /js-tokens@4.0.0: - resolution: - { - integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, - } - dev: false - - /js-yaml@4.1.0: - resolution: - { - integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, - } - hasBin: true - dependencies: - argparse: 2.0.1 - - /json-buffer@3.0.1: - resolution: - { - integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, - } - - /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-schema-traverse@0.4.1: - resolution: - { - integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, - } - - /json-stable-stringify-without-jsonify@1.0.1: - resolution: - { - integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, - } - - /jsonc-parser@3.2.0: - resolution: - { - integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==, - } - dev: true - - /keyv@4.5.3: - resolution: - { - integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==, - } - dependencies: - json-buffer: 3.0.1 - - /kind-of@3.2.2: - resolution: - { - integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==, - } - engines: { node: ">=0.10.0" } - dependencies: - is-buffer: 1.1.6 - dev: false - - /kleur@4.1.5: - resolution: - { - integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==, - } - engines: { node: ">=6" } - dev: true - - /leac@0.6.0: - resolution: - { - integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==, - } - dev: false - - /levn@0.4.1: - resolution: - { - integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, - } - engines: { node: ">= 0.8.0" } - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - - /locate-path@6.0.0: - resolution: - { - integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, - } - engines: { node: ">=10" } - dependencies: - p-locate: 5.0.0 - - /lodash.merge@4.6.2: - resolution: - { - integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, - } - - /lodash.throttle@4.1.1: - resolution: - { - integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==, - } - dev: true - - /lodash@4.17.21: - resolution: - { - integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, - } - dev: true - - /long@5.2.3: - resolution: - { - integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==, - } - dev: false - - /loose-envify@1.4.0: - resolution: - { - integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==, - } - hasBin: true - dependencies: - js-tokens: 4.0.0 - dev: false - - /lru-cache@6.0.0: - resolution: - { - integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, - } - engines: { node: ">=10" } - dependencies: - yallist: 4.0.0 - - /lru-cache@7.18.3: - resolution: - { - integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==, - } - engines: { node: ">=12" } - dev: false - - /lru-cache@8.0.5: - resolution: - { - integrity: sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==, - } - engines: { node: ">=16.14" } - dev: false - - /lru-queue@0.1.0: - resolution: - { - integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==, - } - dependencies: - es5-ext: 0.10.62 - dev: true - - /lucia@2.4.1: - resolution: - { - integrity: sha512-MM5b6LLT//a8qR02490ShwYvsTdlAj4WoFP+Ok9NE31zwBm0dM9lK9TivHwAb69eka71OAcnZeaBi1CBfHtwZA==, - } - dev: false - - /magic-string@0.25.9: - resolution: - { - integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==, - } - dependencies: - sourcemap-codec: 1.4.8 - dev: true - - /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 - - /merge2@1.4.1: - resolution: - { - integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, - } - engines: { node: ">= 8" } - dev: false - - /micromatch@4.0.5: - resolution: - { - integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, - } - engines: { node: ">=8.6" } - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - dev: false - - /mime-db@1.52.0: - resolution: - { - integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, - } - engines: { node: ">= 0.6" } - dev: false - - /mime-types@2.1.35: - resolution: - { - integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, - } - engines: { node: ">= 0.6" } - dependencies: - mime-db: 1.52.0 - dev: false - - /mime@3.0.0: - resolution: - { - integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==, - } - engines: { node: ">=10.0.0" } - hasBin: true - dev: true - - /mimic-response@3.1.0: - resolution: - { - integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==, - } - engines: { node: ">=10" } - - /miniflare@3.20230814.1: - resolution: - { - integrity: sha512-LMgqd1Ut0+fnlvQepVbbBYQczQnyuuap8bgUwOyPETka0S9NR9NxMQSNaBgVZ0uOaG7xMJ/OVTRlz+TGB86PWA==, - } - engines: { node: ">=16.13" } - dependencies: - acorn: 8.10.0 - acorn-walk: 8.2.0 - better-sqlite3: 8.5.2 - capnp-ts: 0.7.0 - exit-hook: 2.2.1 - glob-to-regexp: 0.4.1 - http-cache-semantics: 4.1.1 - kleur: 4.1.5 - set-cookie-parser: 2.6.0 - source-map-support: 0.5.21 - stoppable: 1.1.0 - undici: 5.23.0 - workerd: 1.20230814.1 - ws: 8.13.0 - youch: 3.2.3 - zod: 3.22.2 - 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 - - /minimatch@5.1.6: - resolution: - { - integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==, - } - engines: { node: ">=10" } - dependencies: - brace-expansion: 2.0.1 - - /minimatch@7.4.6: - resolution: - { - integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==, - } - engines: { node: ">=10" } - dependencies: - brace-expansion: 2.0.1 - dev: true - - /minimatch@9.0.1: - resolution: - { - integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==, - } - engines: { node: ">=16 || 14 >=14.17" } - dependencies: - brace-expansion: 2.0.1 - dev: false - - /minimist@1.2.8: - resolution: - { - integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, - } - - /mkdirp-classic@0.5.3: - resolution: - { - integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==, - } - - /ms@2.1.2: - resolution: - { - integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, - } - - /mustache@4.2.0: - resolution: - { - integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==, - } - hasBin: true - dev: true - - /mysql2@3.6.0: - resolution: - { - integrity: sha512-EWUGAhv6SphezurlfI2Fpt0uJEWLmirrtQR7SkbTHFC+4/mJBrPiSzHESHKAWKG7ALVD6xaG/NBjjd1DGJGQQQ==, - } - engines: { node: ">= 8.0" } - dependencies: - denque: 2.1.0 - generate-function: 2.3.1 - iconv-lite: 0.6.3 - long: 5.2.3 - lru-cache: 8.0.5 - named-placeholders: 1.1.3 - seq-queue: 0.0.5 - sqlstring: 2.3.3 - dev: false - - /named-placeholders@1.1.3: - resolution: - { - integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==, - } - engines: { node: ">=12.0.0" } - dependencies: - lru-cache: 7.18.3 - dev: false - - /nanoid@3.3.6: - resolution: - { - integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==, - } - 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==, - } - - /natural-compare@1.4.0: - resolution: - { - integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, - } - - /next-tick@1.1.0: - resolution: - { - integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==, - } - dev: true - - /node-abi@3.47.0: - resolution: - { - integrity: sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==, - } - engines: { node: ">=10" } - dependencies: - semver: 7.5.4 - - /node-fetch@2.6.12: - resolution: - { - integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==, - } - 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-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-forge@1.3.1: - resolution: - { - integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==, - } - engines: { node: ">= 6.13.0" } - dev: true - - /nopt@6.0.0: - resolution: - { - integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - hasBin: true - dependencies: - abbrev: 1.1.1 - dev: false - - /normalize-path@3.0.0: - resolution: - { - integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, - } - engines: { node: ">=0.10.0" } - dev: true - - /once@1.4.0: - resolution: - { - integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, - } - dependencies: - wrappy: 1.0.2 - - /optionator@0.9.3: - resolution: - { - integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==, - } - engines: { node: ">= 0.8.0" } - dependencies: - "@aashutoshrathi/word-wrap": 1.2.6 - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - - /p-limit@3.1.0: - resolution: - { - integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, - } - engines: { node: ">=10" } - dependencies: - yocto-queue: 0.1.0 - - /p-locate@5.0.0: - resolution: - { - integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, - } - engines: { node: ">=10" } - dependencies: - p-limit: 3.1.0 - - /parent-module@1.0.1: - resolution: - { - integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, - } - engines: { node: ">=6" } - dependencies: - callsites: 3.1.0 - - /parseley@0.11.0: - resolution: - { - integrity: sha512-VfcwXlBWgTF+unPcr7yu3HSSA6QUdDaDnrHcytVfj5Z8azAyKBDrYnSIfeSxlrEayndNcLmrXzg+Vxbo6DWRXQ==, - } - dependencies: - leac: 0.6.0 - peberminta: 0.8.0 - dev: false - - /path-exists@4.0.0: - resolution: - { - integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, - } - engines: { node: ">=8" } - - /path-is-absolute@1.0.1: - resolution: - { - integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, - } - engines: { node: ">=0.10.0" } - - /path-key@3.1.1: - resolution: - { - integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, - } - engines: { node: ">=8" } - - /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" } - dev: false - - /peberminta@0.8.0: - resolution: - { - integrity: sha512-YYEs+eauIjDH5nUEGi18EohWE0nV2QbGTqmxQcqgZ/0g+laPCQmuIqq7EBLVi9uim9zMgfJv0QBZEnQ3uHw/Tw==, - } - dev: false - - /picomatch@2.3.1: - resolution: - { - integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, - } - engines: { node: ">=8.6" } - - /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.47.0 - pump: 3.0.0 - rc: 1.2.8 - simple-get: 4.0.1 - tar-fs: 2.1.1 - tunnel-agent: 0.6.0 - - /prelude-ls@1.2.1: - resolution: - { - integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, - } - engines: { node: ">= 0.8.0" } - - /prettier@3.0.3: - resolution: - { - integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==, - } - engines: { node: ">=14" } - hasBin: true - dev: false - - /pretty@2.0.0: - resolution: - { - integrity: sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==, - } - engines: { node: ">=0.10.0" } - dependencies: - condense-newlines: 0.2.1 - extend-shallow: 2.0.1 - js-beautify: 1.14.9 - dev: false - - /printable-characters@1.0.42: - resolution: - { - integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==, - } - dev: true - - /proto-list@1.2.4: - resolution: - { - integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==, - } - 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 - - /punycode@2.3.0: - resolution: - { - integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==, - } - engines: { node: ">=6" } - - /queue-microtask@1.2.3: - resolution: - { - integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, - } - - /rc@1.2.8: - resolution: - { - integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==, - } - hasBin: true - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - - /react-dom@18.2.0(react@18.2.0): - resolution: - { - integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==, - } - peerDependencies: - react: ^18.2.0 - dependencies: - loose-envify: 1.4.0 - react: 18.2.0 - scheduler: 0.23.0 - dev: false - - /react@18.2.0: - resolution: - { - integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==, - } - engines: { node: ">=0.10.0" } - dependencies: - loose-envify: 1.4.0 - dev: false - - /readable-stream@3.6.2: - resolution: - { - integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, - } - engines: { node: ">= 6" } - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - - /readdirp@3.6.0: - resolution: - { - integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, - } - engines: { node: ">=8.10.0" } - dependencies: - picomatch: 2.3.1 - dev: true - - /resend@1.0.0: - resolution: - { - integrity: sha512-8LEE4gncmcm8bsvxvahZFpFk5hxUrKdagqWoX/MRXVU2YZ9coYxqZDeDYXG9pexz1A694bjE1hiQbBAA+bHAow==, - } - engines: { node: ">=16" } - dependencies: - "@react-email/render": 0.0.7 - node-fetch: 2.6.12 - type-fest: 3.13.0 - transitivePeerDependencies: - - encoding - dev: false - - /resolve-from@4.0.0: - resolution: - { - integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, - } - engines: { node: ">=4" } - - /resolve-pkg-maps@1.0.0: - resolution: - { - integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==, - } - dev: true - - /reusify@1.0.4: - resolution: - { - integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, - } - engines: { iojs: ">=1.0.0", node: ">=0.10.0" } - - /rimraf@3.0.2: - resolution: - { - integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, - } - hasBin: true - dependencies: - glob: 7.2.3 - - /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. - 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 - dev: true - - /run-parallel@1.2.0: - resolution: - { - integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, - } - dependencies: - queue-microtask: 1.2.3 - - /safe-buffer@5.2.1: - resolution: - { - integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, - } - - /safer-buffer@2.1.2: - resolution: - { - integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, - } - dev: false - - /scheduler@0.23.0: - resolution: - { - integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==, - } - dependencies: - loose-envify: 1.4.0 - dev: false - - /selderee@0.10.0: - resolution: - { - integrity: sha512-DEL/RW/f4qLw/NrVg97xKaEBC8IpzIG2fvxnzCp3Z4yk4jQ3MXom+Imav9wApjxX2dfS3eW7x0DXafJr85i39A==, - } - dependencies: - parseley: 0.11.0 - dev: false - - /selfsigned@2.1.1: - resolution: - { - integrity: sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==, - } - engines: { node: ">=10" } - dependencies: - node-forge: 1.3.1 - dev: true - - /semver@7.5.4: - resolution: - { - integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==, - } - engines: { node: ">=10" } - hasBin: true - dependencies: - lru-cache: 6.0.0 - - /seq-queue@0.0.5: - resolution: - { - integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==, - } - dev: false - - /set-cookie-parser@2.6.0: - resolution: - { - integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==, - } - dev: true - - /shebang-command@2.0.0: - resolution: - { - integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, - } - engines: { node: ">=8" } - dependencies: - shebang-regex: 3.0.0 - - /shebang-regex@3.0.0: - resolution: - { - integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, - } - engines: { node: ">=8" } - - /simple-concat@1.0.1: - resolution: - { - integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==, - } - - /simple-get@4.0.1: - resolution: - { - integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==, - } - dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 - - /sisteransi@1.0.5: - resolution: - { - integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==, - } - dev: true - - /slash@3.0.0: - resolution: - { - integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==, - } - engines: { node: ">=8" } - dev: false - - /source-map-support@0.5.21: - resolution: - { - integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, - } - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - dev: true - - /source-map@0.6.1: - resolution: - { - integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, - } - engines: { node: ">=0.10.0" } - dev: true - - /source-map@0.7.4: - resolution: - { - integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==, - } - engines: { node: ">= 8" } - dev: true - - /sourcemap-codec@1.4.8: - resolution: - { - integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==, - } - deprecated: Please use @jridgewell/sourcemap-codec instead - dev: true - - /sqlstring@2.3.3: - resolution: - { - integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==, - } - engines: { node: ">= 0.6" } - dev: false - - /stacktracey@2.1.8: - resolution: - { - integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==, - } - dependencies: - as-table: 1.0.55 - get-source: 2.0.12 - dev: true - - /stoppable@1.1.0: - resolution: - { - integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==, - } - engines: { node: ">=4", npm: ">=6" } - dev: true - - /streamsearch@1.1.0: - resolution: - { - integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==, - } - engines: { node: ">=10.0.0" } - dev: true - - /string_decoder@1.3.0: - resolution: - { - integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, - } - dependencies: - safe-buffer: 5.2.1 - - /strip-ansi@6.0.1: - resolution: - { - integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, - } - engines: { node: ">=8" } - dependencies: - ansi-regex: 5.0.1 - - /strip-json-comments@2.0.1: - resolution: - { - integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==, - } - engines: { node: ">=0.10.0" } - - /strip-json-comments@3.1.1: - resolution: - { - integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, - } - engines: { node: ">=8" } - - /supports-color@7.2.0: - resolution: - { - integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, - } - engines: { node: ">=8" } - dependencies: - has-flag: 4.0.0 - - /tar-fs@2.1.1: - resolution: - { - integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==, - } - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.0 - tar-stream: 2.2.0 - - /tar-stream@2.2.0: - resolution: - { - integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==, - } - engines: { node: ">=6" } - 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 - - /text-table@0.2.0: - resolution: - { - integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, - } - - /timers-ext@0.1.7: - resolution: - { - integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==, - } - dependencies: - es5-ext: 0.10.62 - next-tick: 1.1.0 - dev: true - - /to-regex-range@5.0.1: - resolution: - { - integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, - } - engines: { node: ">=8.0" } - dependencies: - is-number: 7.0.0 - - /tr46@0.0.3: - resolution: - { - integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, - } - dev: false - - /ts-api-utils@1.0.2(typescript@5.2.2): - resolution: - { - integrity: sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==, - } - engines: { node: ">=16.13.0" } - peerDependencies: - typescript: ">=4.2.0" - dependencies: - typescript: 5.2.2 - dev: false - - /tslib@2.6.2: - resolution: - { - integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==, - } - dev: true - - /tsx@3.12.8: - resolution: - { - integrity: sha512-Lt9KYaRGF023tlLInPj8rgHwsZU8qWLBj4iRXNWxTfjIkU7canGL806AqKear1j722plHuiYNcL2ZCo6uS9UJA==, - } - hasBin: true - dependencies: - "@esbuild-kit/cjs-loader": 2.4.2 - "@esbuild-kit/core-utils": 3.2.2 - "@esbuild-kit/esm-loader": 2.5.5 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /tunnel-agent@0.6.0: - resolution: - { - integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==, - } - dependencies: - safe-buffer: 5.2.1 - - /type-check@0.4.0: - resolution: - { - integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, - } - engines: { node: ">= 0.8.0" } - dependencies: - prelude-ls: 1.2.1 - - /type-fest@0.20.2: - resolution: - { - integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==, - } - engines: { node: ">=10" } - - /type-fest@3.13.0: - resolution: - { - integrity: sha512-Gur3yQGM9qiLNs0KPP7LPgeRbio2QTt4xXouobMCarR0/wyW3F+F/+OWwshg3NG0Adon7uQfSZBpB46NfhoF1A==, - } - engines: { node: ">=14.16" } - 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 - - /typescript@5.2.2: - resolution: - { - integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==, - } - engines: { node: ">=14.17" } - hasBin: true - - /undici@5.23.0: - resolution: - { - integrity: sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==, - } - engines: { node: ">=14.0" } - dependencies: - busboy: 1.6.0 - dev: true - - /uri-js@4.4.1: - resolution: - { - integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, - } - dependencies: - punycode: 2.3.0 - - /util-deprecate@1.0.2: - resolution: - { - integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, - } - - /vscode-json-languageservice@4.2.1: - resolution: - { - integrity: sha512-xGmv9QIWs2H8obGbWg+sIPI/3/pFgj/5OWBhNzs00BkYQ9UaB2F6JJaGB/2/YOZJ3BvLXQTC4Q7muqU25QgAhA==, - } - dependencies: - jsonc-parser: 3.2.0 - vscode-languageserver-textdocument: 1.0.8 - vscode-languageserver-types: 3.17.3 - vscode-nls: 5.2.0 - vscode-uri: 3.0.7 - dev: true - - /vscode-languageserver-textdocument@1.0.8: - resolution: - { - integrity: sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==, - } - dev: true - - /vscode-languageserver-types@3.17.3: - resolution: - { - integrity: sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA==, - } - dev: true - - /vscode-nls@5.2.0: - resolution: - { - integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==, - } - dev: true - - /vscode-uri@3.0.7: - resolution: - { - integrity: sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==, - } - 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@2.0.2: - resolution: - { - integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, - } - engines: { node: ">= 8" } - hasBin: true - dependencies: - isexe: 2.0.0 - - /wordwrap@1.0.0: - resolution: - { - integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==, - } - dev: true - - /workerd@1.20230814.1: - resolution: - { - integrity: sha512-zJeSEteXuAD+bpYJT8WvzTAHvIAkKPVxOV+Jy6zCLKz5e08N3OUbAF+wrvGWc8b2aB1sj+IYsdXfkv4puH+qXQ==, - } - engines: { node: ">=16" } - hasBin: true - requiresBuild: true - optionalDependencies: - "@cloudflare/workerd-darwin-64": 1.20230814.1 - "@cloudflare/workerd-darwin-arm64": 1.20230814.1 - "@cloudflare/workerd-linux-64": 1.20230814.1 - "@cloudflare/workerd-linux-arm64": 1.20230814.1 - "@cloudflare/workerd-windows-64": 1.20230814.1 - dev: true - - /wrangler@3.6.0: - resolution: - { - integrity: sha512-GWs4+gIUK+086svW/TgFhhxxrl/hdW2L7WASbdc10dJT7yFmCXse0SnHiqWUxbFu3ScP2t3a3LszJ08wwolWHg==, - } - engines: { node: ">=16.13.0" } - hasBin: true - dependencies: - "@cloudflare/kv-asset-handler": 0.2.0 - "@esbuild-plugins/node-globals-polyfill": 0.1.1(esbuild@0.16.3) - "@esbuild-plugins/node-modules-polyfill": 0.1.4(esbuild@0.16.3) - blake3-wasm: 2.1.5 - chokidar: 3.5.3 - esbuild: 0.16.3 - miniflare: 3.20230814.1 - nanoid: 3.3.6 - path-to-regexp: 6.2.1 - selfsigned: 2.1.1 - source-map: 0.7.4 - xxhash-wasm: 1.0.2 - optionalDependencies: - fsevents: 2.3.3 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - /wrappy@1.0.2: - resolution: - { - integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, - } - - /ws@8.13.0: - resolution: - { - integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==, - } - engines: { node: ">=10.0.0" } - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - /xxhash-wasm@1.0.2: - resolution: - { - integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==, - } - dev: true - - /yallist@4.0.0: - resolution: - { - integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, - } - - /yocto-queue@0.1.0: - resolution: - { - integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, - } - engines: { node: ">=10" } - - /youch@3.2.3: - resolution: - { - integrity: sha512-ZBcWz/uzZaQVdCvfV4uk616Bbpf2ee+F/AvuKDR5EwX/Y4v06xWdtMluqTD7+KlZdM93lLm9gMZYo0sKBS0pgw==, - } - dependencies: - cookie: 0.5.0 - mustache: 4.2.0 - stacktracey: 2.1.8 - dev: true - - /zod@3.22.2: - resolution: - { - integrity: sha512-wvWkphh5WQsJbVk1tbx1l1Ly4yg+XecD+Mq280uBGt9wa5BKSWf4Mhp6GmrkPixhMxmabYY7RbzlwVP32pbGCg==, - } - dev: true + /zod@3.22.2: + resolution: {integrity: sha512-wvWkphh5WQsJbVk1tbx1l1Ly4yg+XecD+Mq280uBGt9wa5BKSWf4Mhp6GmrkPixhMxmabYY7RbzlwVP32pbGCg==} + dev: true diff --git a/src/index.ts b/src/index.ts index 2068759..f6e4681 100644 --- a/src/index.ts +++ b/src/index.ts @@ -29,7 +29,7 @@ app.route("/v2/games", gamesRoute) app.route("/v2/auth", authRoute) app.all("*", (c) => { c.status(404) - return c.json({ status: "not found" }) + return c.json({ success: false, status: "error", error: "Not Found" }) }) // https://hono.dev/api/hono#showroutes diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index 0d54e00..5420b5a 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -537,20 +537,20 @@ export const usersRelations = relations(users, ({ one, many }) => ({ // export types // game, asset types -export type game = typeof games.$inferSelect -export type assetCategory = typeof assetCategories.$inferSelect -export type asset = typeof assets.$inferSelect -export type assetTag = typeof assetTags.$inferSelect -export type assetTagsAsset = typeof assetTagsAssets.$inferSelect +export type Game = typeof games.$inferSelect +export type AssetCategory = typeof assetCategories.$inferSelect +export type Asset = typeof assets.$inferSelect +export type AssetTag = typeof assetTags.$inferSelect +export type AssetTagsAsset = typeof assetTagsAssets.$inferSelect // user types -export type user = typeof users.$inferSelect -export type session = typeof sessions.$inferSelect -export type key = typeof keys.$inferSelect -export type socialsConnection = typeof socialsConnections.$inferSelect -export type following = typeof following.$inferSelect -export type follower = typeof follower.$inferSelect -export type userFavorites = typeof userFavorites.$inferSelect -export type userFavoritesAssets = typeof userFavoritesAssets.$inferSelect -export type userCollections = typeof userCollections.$inferSelect -export type userCollectionAssets = typeof userCollectionAssets.$inferSelect +export type User = typeof users.$inferSelect +export type Session = typeof sessions.$inferSelect +export type Key = typeof keys.$inferSelect +export type SocialsConnection = typeof socialsConnections.$inferSelect +export type Following = typeof following.$inferSelect +export type Follower = typeof follower.$inferSelect +export type UserFavorites = typeof userFavorites.$inferSelect +export type UserFavoritesAssets = typeof userFavoritesAssets.$inferSelect +export type UserCollections = typeof userCollections.$inferSelect +export type UserCollectionAssets = typeof userCollectionAssets.$inferSelect diff --git a/src/v2/lib/helpers/responses/notFoundResponse.ts b/src/v2/lib/helpers/responses/notFoundResponse.ts index 5e19bd5..96bbe03 100644 --- a/src/v2/lib/helpers/responses/notFoundResponse.ts +++ b/src/v2/lib/helpers/responses/notFoundResponse.ts @@ -1,12 +1,12 @@ // helper function to create a 404 Not Found response export function createNotFoundResponse(c, errorMessage, responseHeaders) { + c.status(200) return c.json( { success: false, status: "error", error: errorMessage, }, - 404, responseHeaders ) } diff --git a/src/v2/routes/asset/downloadAsset.ts b/src/v2/routes/asset/downloadAsset.ts index 1f88267..0d67459 100644 --- a/src/v2/routes/asset/downloadAsset.ts +++ b/src/v2/routes/asset/downloadAsset.ts @@ -1,6 +1,4 @@ -import { responseHeaders } from "@/v2/lib/responseHeaders" import { getConnection } from "@/v2/db/turso" -import { createNotFoundResponse } from "@/v2/lib/helpers/responses/notFoundResponse" import { eq } from "drizzle-orm" import { assets } from "@/v2/db/schema" import type { APIContext as Context } from "@/worker-configuration" @@ -8,23 +6,28 @@ import type { APIContext as Context } from "@/worker-configuration" export async function downloadAsset(c: Context): Promise { const { assetId } = c.req.param() - const drizzle = await getConnection(c.env).drizzle + const drizzle = getConnection(c.env).drizzle - const asset = await drizzle - .select() - .from(assets) - .where(eq(assets.id, parseInt(assetId))) - .execute() + const asset = await drizzle.query.assets.findFirst({ + where: (assets, { eq }) => eq(assets.id, parseInt(assetId)), + }) - if (!asset) - return createNotFoundResponse(c, "Asset not found", responseHeaders) + if (!asset) { + c.status(200) + return c.json({ success: false, state: "asset not found" }) + } - if (asset) + try { await drizzle .update(assets) - .set({ downloadCount: asset[0].downloadCount + 1 }) + .set({ downloadCount: asset.downloadCount + 1 }) .where(eq(assets.id, parseInt(assetId))) .execute() + } catch (e) { + console.error(e) + c.status(500) + return c.json({ success: false, state: "failed to download asset" }) + } const response = await fetch(asset[0].url) diff --git a/src/v2/routes/asset/getAssetFromId.ts b/src/v2/routes/asset/getAssetFromId.ts index e0bdc5a..6109489 100644 --- a/src/v2/routes/asset/getAssetFromId.ts +++ b/src/v2/routes/asset/getAssetFromId.ts @@ -1,7 +1,5 @@ -import { responseHeaders } from "@/v2/lib/responseHeaders" import { getConnection } from "@/v2/db/turso" import { assets } from "@/v2/db/schema" -import { createNotFoundResponse } from "@/v2/lib/helpers/responses/notFoundResponse" import { desc } from "drizzle-orm" import type { APIContext as Context } from "@/worker-configuration" @@ -13,7 +11,7 @@ export async function getAssetFromId(c: Context): Promise { if (response) return response - const drizzle = await getConnection(c.env).drizzle + const drizzle = getConnection(c.env).drizzle const asset = await drizzle.query.assets.findFirst({ where: (assets, { eq, and }) => @@ -28,7 +26,11 @@ export async function getAssetFromId(c: Context): Promise { }) if (!asset) { - response = createNotFoundResponse(c, "Asset not found", responseHeaders) + c.status(200) + response = c.json({ + success: false, + status: "not found", + }) await cache.put(cacheKey, response.clone()) return response } @@ -43,16 +45,13 @@ export async function getAssetFromId(c: Context): Promise { orderBy: desc(assets.id), }) - response = c.json( - { - success: true, - status: "ok", - asset, - similarAssets, - }, - 200, - responseHeaders - ) + c.status(200) + response = c.json({ + success: true, + status: "ok", + asset, + similarAssets, + }) response.headers.set("Cache-Control", "s-maxage=604800") await cache.put(cacheKey, response.clone()) diff --git a/src/v2/routes/auth/asset-categories/createAssetCategory.ts b/src/v2/routes/auth/asset-categories/createAssetCategory.ts index cb69491..bd7c9c6 100644 --- a/src/v2/routes/auth/asset-categories/createAssetCategory.ts +++ b/src/v2/routes/auth/asset-categories/createAssetCategory.ts @@ -13,16 +13,18 @@ export async function createAssetCategory(c: Context): Promise { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) } - return c.json({ success: false, state: "invalid session" }, 200) + c.status(401) + return c.json({ success: false, state: "unauthorized" }) } const roleFlags = roleFlagsToArray(session.user.role_flags) if (!roleFlags.includes("CREATOR")) { - return c.json({ success: false, state: "unauthorized" }, 401) + c.status(401) + return c.json({ success: false, state: "unauthorized" }) } - const drizzle = await getConnection(c.env).drizzle + const drizzle = getConnection(c.env).drizzle const formData = await c.req.formData() @@ -41,19 +43,21 @@ export async function createAssetCategory(c: Context): Promise { }) if (assetCategoryExists) { - return c.json( - { success: false, state: "assetCategory with name already exists" }, - 200 - ) + c.status(200) + return c.json({ + success: false, + state: "assetCategory with name already exists", + }) } try { await drizzle.insert(assetCategories).values(assetCategory).execute() } catch (e) { - return c.json( - { success: false, state: "failed to create assetCategory" }, - 200 - ) + c.status(500) + return c.json({ + success: false, + state: "failed to create assetCategory", + }) } return c.json( diff --git a/src/v2/routes/auth/asset-categories/deleteAssetCategory.ts b/src/v2/routes/auth/asset-categories/deleteAssetCategory.ts index d404f9b..554f3bd 100644 --- a/src/v2/routes/auth/asset-categories/deleteAssetCategory.ts +++ b/src/v2/routes/auth/asset-categories/deleteAssetCategory.ts @@ -14,16 +14,18 @@ export async function deleteAssetCategory(c: Context): Promise { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) } - return c.json({ success: false, state: "invalid session" }, 200) + c.status(401) + return c.json({ success: false, state: "unauthorized" }) } const roleFlags = roleFlagsToArray(session.user.role_flags) if (!roleFlags.includes("CREATOR")) { - return c.json({ success: false, state: "unauthorized" }, 401) + c.status(401) + return c.json({ success: false, state: "unauthorized" }) } - const drizzle = await getConnection(c.env).drizzle + const drizzle = getConnection(c.env).drizzle const formData = await c.req.formData() @@ -32,7 +34,8 @@ export async function deleteAssetCategory(c: Context): Promise { } if (!assetCategory.id) { - return c.json({ success: false, state: "no id entered" }, 200) + c.status(200) + return c.json({ success: false, state: "no id entered" }) } // check if assetCategory exists @@ -42,10 +45,11 @@ export async function deleteAssetCategory(c: Context): Promise { }) if (!assetCategoryExists) { - return c.json( - { success: false, state: "assetCategory with ID doesn't exist" }, - 200 - ) + c.status(200) + return c.json({ + success: false, + state: "assetCategory with ID doesn't exist", + }) } try { diff --git a/src/v2/routes/auth/assets/approveAsset.ts b/src/v2/routes/auth/assets/approveAsset.ts index a819c7b..5ea707b 100644 --- a/src/v2/routes/auth/assets/approveAsset.ts +++ b/src/v2/routes/auth/assets/approveAsset.ts @@ -1,7 +1,6 @@ import { responseHeaders } from "@/v2/lib/responseHeaders" import { getConnection } from "@/v2/db/turso" import { assets } from "@/v2/db/schema" -import { createNotFoundResponse } from "@/v2/lib/helpers/responses/notFoundResponse" import { eq } from "drizzle-orm" import type { APIContext as Context } from "@/worker-configuration" import { auth } from "@/v2/lib/auth/lucia" @@ -17,23 +16,26 @@ export async function approveAsset(c: Context): Promise { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) } - return c.json({ success: false, state: "invalid session" }, 200) + c.status(401) + return c.json({ success: false, state: "unauthorized" }, 401) } const roleFlags = roleFlagsToArray(session.user.role_flags) if (!roleFlags.includes("CREATOR")) { - return c.json({ success: false, state: "unauthorized" }, 401) + c.status(401) + return c.json({ success: false, state: "unauthorized" }) } - const drizzle = await getConnection(c.env).drizzle + const drizzle = getConnection(c.env).drizzle const asset = await drizzle.query.assets.findFirst({ where: (assets, { eq }) => eq(assets.id, parseInt(assetIdToApprove)), }) - if (!asset) { - return createNotFoundResponse(c, "Asset not found", responseHeaders) + if (!asset || asset.status === 1) { + c.status(404) + c.json({ success: false, state: "asset not found or already approved" }) } const updatedAsset = await drizzle @@ -44,7 +46,8 @@ export async function approveAsset(c: Context): Promise { .where(eq(assets.id, parseInt(assetIdToApprove))) .execute() - const response = c.json( + c.status(200) + return c.json( { success: true, status: "ok", @@ -53,6 +56,4 @@ export async function approveAsset(c: Context): Promise { 200, responseHeaders ) - - return response } diff --git a/src/v2/routes/auth/assets/collections/addAssetToCollection.ts b/src/v2/routes/auth/assets/collections/addAssetToCollection.ts index 7141a8e..5bf8516 100644 --- a/src/v2/routes/auth/assets/collections/addAssetToCollection.ts +++ b/src/v2/routes/auth/assets/collections/addAssetToCollection.ts @@ -14,7 +14,8 @@ export async function addAssetToCollection(c: Context): Promise { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) } - return c.json({ success: false, state: "invalid session" }, 200) + c.status(401) + return c.json({ success: false, state: "invalid session" }) } const formData = await c.req.formData() @@ -25,14 +26,13 @@ export async function addAssetToCollection(c: Context): Promise { } if (!collection.id) { - return c.json( - { success: false, state: "no collection id entered" }, - 200 - ) + c.status(200) + return c.json({ success: false, state: "no collection id entered" }) } if (!collection.assetId) { - return c.json({ success: false, state: "no asset id entered" }, 200) + c.status(401) + return c.json({ success: false, state: "no asset id entered" }) } // check if collection exists @@ -42,10 +42,11 @@ export async function addAssetToCollection(c: Context): Promise { }) if (!collectionExists) { - return c.json( - { success: false, state: "collection with ID doesn't exist" }, - 200 - ) + c.status(200) + return c.json({ + success: false, + state: "collection with ID doesn't exist", + }) } // check if asset exists, and status is 1 (approved) @@ -58,7 +59,8 @@ export async function addAssetToCollection(c: Context): Promise { }) if (!assetExists) { - return c.json({ success: false, state: "asset not found" }, 200) + c.status(200) + return c.json({ success: false, state: "asset not found" }) } // check if userCollectionAssets exists @@ -75,21 +77,30 @@ export async function addAssetToCollection(c: Context): Promise { }) if (userCollectionAssetsExists) { - return c.json( - { success: false, state: "asset already exists in collection" }, - 200 - ) + c.status(200) + return c.json({ + success: false, + state: "asset already exists in collection", + }) } // create entry in userCollectionAssets - await drizzle - .insert(userCollectionAssets) - .values({ - id: crypto.randomUUID(), - collectionId: collection.id, - assetId: parseInt(collection.assetId), - }) - .execute() + try { + await drizzle + .insert(userCollectionAssets) + .values({ + id: crypto.randomUUID(), + collectionId: collection.id, + assetId: parseInt(collection.assetId), + }) + .execute() + } catch (e) { + c.status(500) + return c.json( + { success: false, state: "failed to add asset to collection" }, + 500 + ) + } return c.json({ success: true, state: "added asset to collection" }, 200) } diff --git a/src/v2/routes/auth/assets/collections/createAssetCollection.ts b/src/v2/routes/auth/assets/collections/createAssetCollection.ts index 94f8fab..65fba2a 100644 --- a/src/v2/routes/auth/assets/collections/createAssetCollection.ts +++ b/src/v2/routes/auth/assets/collections/createAssetCollection.ts @@ -14,7 +14,8 @@ export async function createAssetCollection(c: Context): Promise { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) } - return c.json({ success: false, state: "invalid session" }, 200) + c.status(401) + return c.json({ success: false, state: "invalid session" }) } const formData = await c.req.formData() @@ -25,17 +26,16 @@ export async function createAssetCollection(c: Context): Promise { } if (!collection.name) { - return c.json( - { success: false, state: "no collection name entered" }, - 200 - ) + c.status(200) + return c.json({ success: false, state: "no collection name entered" }) } if (!collection.description) { - return c.json( - { success: false, state: "no collection description entered" }, - 200 - ) + c.status(200) + return c.json({ + success: false, + state: "no collection description entered", + }) } // check if collection exists @@ -45,24 +45,31 @@ export async function createAssetCollection(c: Context): Promise { }) if (collectionExists) { - return c.json( - { success: false, state: "collection with name already exists" }, - 200 - ) + c.status(200) + return c.json({ + success: false, + state: "collection with name already exists", + }) } // create entry in userCollections - await drizzle - .insert(userCollections) - .values({ - id: crypto.randomUUID(), - name: collection.name, - description: collection.description, - userId: session.userId, - dateCreated: new Date().getTime(), - isPublic: 0, // default to private - }) - .execute() + try { + await drizzle + .insert(userCollections) + .values({ + id: crypto.randomUUID(), + name: collection.name, + description: collection.description, + userId: session.userId, + dateCreated: new Date().getTime(), + isPublic: 0, // default to private + }) + .execute() + } catch (e) { + c.status(200) + return c.json({ success: false, state: "failed to create collection" }) + } - return c.json({ success: true, state: "created collection" }, 200) + c.status(200) + return c.json({ success: true, state: "created collection" }) } diff --git a/src/v2/routes/auth/assets/collections/deleteAssetCollection.ts b/src/v2/routes/auth/assets/collections/deleteAssetCollection.ts index cae8fbd..68c8566 100644 --- a/src/v2/routes/auth/assets/collections/deleteAssetCollection.ts +++ b/src/v2/routes/auth/assets/collections/deleteAssetCollection.ts @@ -15,7 +15,8 @@ export async function deleteAssetCollection(c: Context): Promise { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) } - return c.json({ success: false, state: "invalid session" }, 200) + c.status(401) + return c.json({ success: false, state: "invalid session" }) } const formData = await c.req.formData() @@ -25,10 +26,8 @@ export async function deleteAssetCollection(c: Context): Promise { } if (!collection.id) { - return c.json( - { success: false, state: "no collection id entered" }, - 200 - ) + c.status(200) + return c.json({ success: false, state: "no collection id entered" }) } // check if collection exists @@ -38,10 +37,11 @@ export async function deleteAssetCollection(c: Context): Promise { }) if (!collectionExists) { - return c.json( - { success: false, state: "collection with ID doesn't exist" }, - 200 - ) + c.status(200) + return c.json({ + success: false, + state: "collection with ID doesn't exist", + }) } // delete collection @@ -50,5 +50,6 @@ export async function deleteAssetCollection(c: Context): Promise { .where(eq(userCollections.id, collection.id)) .execute() - return c.json({ success: true, state: "collection deleted" }, 200) + c.status(200) + return c.json({ success: true, state: "collection deleted" }) } diff --git a/src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts b/src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts index 5ebde0a..c54e5fa 100644 --- a/src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts +++ b/src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts @@ -15,7 +15,8 @@ export async function deleteAssetFromCollection(c: Context): Promise { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) } - return c.json({ success: false, state: "invalid session" }, 200) + c.status(401) + return c.json({ success: false, state: "invalid session" }) } const formData = await c.req.formData() @@ -26,14 +27,13 @@ export async function deleteAssetFromCollection(c: Context): Promise { } if (!collection.id) { - return c.json( - { success: false, state: "no collection id entered" }, - 200 - ) + c.status(200) + return c.json({ success: false, state: "no collection id entered" }) } if (!collection.assetId) { - return c.json({ success: false, state: "no asset id entered" }, 200) + c.status(401) + return c.json({ success: false, state: "no asset id entered" }) } // check if collection exists @@ -43,10 +43,11 @@ export async function deleteAssetFromCollection(c: Context): Promise { }) if (!collectionExists) { - return c.json( - { success: false, state: "collection with ID doesn't exist" }, - 200 - ) + c.status(200) + return c.json({ + success: false, + state: "collection with ID doesn't exist", + }) } // check if asset exists @@ -67,10 +68,11 @@ export async function deleteAssetFromCollection(c: Context): Promise { }) if (!userCollectionAssetsExists) { - return c.json( - { success: false, state: "asset not found in collection" }, - 200 - ) + c.status(200) + return c.json({ + success: false, + state: "asset not found in collection", + }) } try { @@ -79,14 +81,13 @@ export async function deleteAssetFromCollection(c: Context): Promise { .where(eq(userCollectionAssets.id, userCollectionAssetsExists.id)) .execute() } catch (e) { - return c.json( - { success: false, state: "failed to delete asset from collection" }, - 200 - ) + c.status(500) + return c.json({ + success: false, + state: "failed to delete asset from collection", + }) } - return c.json( - { success: true, state: "deleted asset from collection" }, - 200 - ) + c.status(200) + return c.json({ success: true, state: "deleted asset from collection" }) } diff --git a/src/v2/routes/auth/assets/collections/viewAssetCollection.ts b/src/v2/routes/auth/assets/collections/viewAssetCollection.ts index e322f6b..9afbec6 100644 --- a/src/v2/routes/auth/assets/collections/viewAssetCollection.ts +++ b/src/v2/routes/auth/assets/collections/viewAssetCollection.ts @@ -13,7 +13,8 @@ export async function viewAssetCollection(c: Context): Promise { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) } - return c.json({ success: false, state: "invalid session" }, 200) + c.status(401) + return c.json({ success: false, state: "invalid session" }) } const formData = await c.req.formData() @@ -23,10 +24,8 @@ export async function viewAssetCollection(c: Context): Promise { } if (!collection.id) { - return c.json( - { success: false, state: "no collection id entered" }, - 200 - ) + c.status(200) + return c.json({ success: false, state: "no collection id entered" }) } // check if the user owns the collection, or if the collection is public @@ -42,10 +41,11 @@ export async function viewAssetCollection(c: Context): Promise { ), }) } catch (e) { - return c.json( - { success: false, state: "collection with ID doesn't exist" }, - 200 - ) + c.status(200) + return c.json({ + success: false, + state: "collection with ID doesn't exist", + }) } const assetCollection = await drizzle.query.userCollections.findFirst({ @@ -66,8 +66,6 @@ export async function viewAssetCollection(c: Context): Promise { }, }) - return c.json( - { success: true, state: "found collection", assetCollection }, - 200 - ) + c.status(200) + return c.json({ success: true, state: "found collection", assetCollection }) } diff --git a/src/v2/routes/auth/assets/collections/viewAssetCollections.ts b/src/v2/routes/auth/assets/collections/viewAssetCollections.ts index e3d166b..7341000 100644 --- a/src/v2/routes/auth/assets/collections/viewAssetCollections.ts +++ b/src/v2/routes/auth/assets/collections/viewAssetCollections.ts @@ -13,7 +13,8 @@ export async function viewAssetCollections(c: Context): Promise { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) } - return c.json({ success: false, state: "invalid session" }, 200) + c.status(401) + return c.json({ success: false, state: "invalid session" }) } // check if userCollections exists @@ -25,7 +26,8 @@ export async function viewAssetCollections(c: Context): Promise { ) if (!userCollectionsExists) { - return c.json({ success: false, state: "no collections found" }, 200) + c.status(200) + return c.json({ success: false, state: "no collections found" }) } const assetCollection = await drizzle.query.userCollectionAssets.findMany({ @@ -36,8 +38,10 @@ export async function viewAssetCollections(c: Context): Promise { }, }) - return c.json( - { success: true, state: "found collections", assetCollection }, - 200 - ) + c.status(200) + return c.json({ + success: true, + state: "found collections", + assetCollection, + }) } diff --git a/src/v2/routes/auth/assets/favorite/addFavoriteAsset.ts b/src/v2/routes/auth/assets/favorite/addFavoriteAsset.ts index 86e7704..5f2ea5f 100644 --- a/src/v2/routes/auth/assets/favorite/addFavoriteAsset.ts +++ b/src/v2/routes/auth/assets/favorite/addFavoriteAsset.ts @@ -70,14 +70,20 @@ export async function favoriteAsset(c: Context): Promise { } // add asset to userFavorites... - await drizzle.insert(userFavoritesAssets).values({ - id: `${session.userId}-${assetToFavorite}`, - userFavoritesId: isFavorited.id, - assetId: parseInt(assetToFavorite), - }) + try { + await drizzle.insert(userFavoritesAssets).values({ + id: `${session.userId}-${assetToFavorite}`, + userFavoritesId: isFavorited.id, + assetId: parseInt(assetToFavorite), + }) + } catch (e) { + c.status(500) + return c.json( + { success: false, state: "failed to favorite asset" }, + 500 + ) + } - return c.json( - { success: true, state: "favorited asset", assetToFavorite }, - 200 - ) + c.status(200) + return c.json({ success: true, state: "favorited asset", assetToFavorite }) } diff --git a/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts b/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts index 260d0be..4e73a7f 100644 --- a/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts +++ b/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts @@ -58,21 +58,27 @@ export async function removeFavoriteAsset(c: Context): Promise { }) if (!isFavorited) { - return c.json( - { - success: false, - state: "asset is not favorited, therefore cannot be removed", - assetToRemove, - }, - 200 - ) + c.status(200) + return c.json({ + success: false, + state: "asset is not favorited, therefore cannot be removed", + assetToRemove, + }) } // remove asset from userFavorites... - await drizzle - .delete(userFavoritesAssets) - .where(eq(userFavoritesAssets.id, `${session.userId}-${assetToRemove}`)) - .execute() + try { + await drizzle + .delete(userFavoritesAssets) + .where( + eq(userFavoritesAssets.id, `${session.userId}-${assetToRemove}`) + ) + .execute() + } catch (e) { + c.status(500) + return c.json({ success: false, state: "failed to remove asset" }) + } - return c.json({ success: true, state: "removed asset", assetToRemove }, 200) + c.status(200) + return c.json({ success: true, state: "removed asset", assetToRemove }) } diff --git a/src/v2/routes/auth/assets/favorite/viewFavoriteAssets.ts b/src/v2/routes/auth/assets/favorite/viewFavoriteAssets.ts index a7a4d55..5f46def 100644 --- a/src/v2/routes/auth/assets/favorite/viewFavoriteAssets.ts +++ b/src/v2/routes/auth/assets/favorite/viewFavoriteAssets.ts @@ -13,7 +13,8 @@ export async function viewFavoriteAssets(c: Context): Promise { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) } - return c.json({ success: false, state: "invalid session" }, 200) + c.status(401) + return c.json({ success: false, state: "invalid session" }) } // check if userFavorites exists @@ -23,7 +24,8 @@ export async function viewFavoriteAssets(c: Context): Promise { }) if (!userFavoritesExists) { - return c.json({ success: false, state: "no favorites found" }, 200) + c.status(200) + return c.json({ success: false, state: "no favorites found" }) } const favoriteAssets = await drizzle.query.userFavoritesAssets.findMany({ @@ -34,8 +36,6 @@ export async function viewFavoriteAssets(c: Context): Promise { }, }) - return c.json( - { success: true, state: "found favorites", favoriteAssets }, - 200 - ) + c.status(200) + return c.json({ success: true, state: "found favorites", favoriteAssets }) } diff --git a/src/v2/routes/auth/assets/modifyAsset.ts b/src/v2/routes/auth/assets/modifyAsset.ts index 2699ee3..e29a86b 100644 --- a/src/v2/routes/auth/assets/modifyAsset.ts +++ b/src/v2/routes/auth/assets/modifyAsset.ts @@ -1,7 +1,6 @@ import { responseHeaders } from "@/v2/lib/responseHeaders" import { getConnection } from "@/v2/db/turso" import { assets } from "@/v2/db/schema" -import { createNotFoundResponse } from "@/v2/lib/helpers/responses/notFoundResponse" import { eq } from "drizzle-orm" import type { APIContext as Context } from "@/worker-configuration" import { auth } from "@/v2/lib/auth/lucia" @@ -18,21 +17,25 @@ export async function modifyAssetData(c: Context): Promise { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) } - return c.json({ success: false, state: "invalid session" }, 200) + c.status(401) + return c.json({ success: false, state: "invalid session" }) } // return unauthorized if user is not a contributor - if (session.user.is_contributor !== 1) - return c.json({ success: false, state: "unauthorized" }, 401) + if (session.user.is_contributor !== 1) { + c.status(401) + return c.json({ success: false, state: "unauthorized" }) + } - const drizzle = await getConnection(c.env).drizzle + const drizzle = getConnection(c.env).drizzle const asset = await drizzle.query.assets.findFirst({ where: (assets, { eq }) => eq(assets.id, parseInt(assetIdToModify)), }) if (!asset) { - return createNotFoundResponse(c, "Asset not found", responseHeaders) + c.status(200) + return c.json({ success: false, state: "asset not found" }) } const roleFlags = roleFlagsToArray(session.user.role_flags) @@ -41,10 +44,11 @@ export async function modifyAssetData(c: Context): Promise { asset.uploadedById !== session.userId || !roleFlags.includes("CREATOR") ) { - return c.json( - { success: false, state: "unauthorized to modify this asset" }, - 401 - ) + c.status(401) + return c.json({ + success: false, + state: "unauthorized to modify this asset", + }) } const formData = await c.req.formData() diff --git a/src/v2/routes/auth/assets/uploadAsset.ts b/src/v2/routes/auth/assets/uploadAsset.ts index fafa3a1..a76399a 100644 --- a/src/v2/routes/auth/assets/uploadAsset.ts +++ b/src/v2/routes/auth/assets/uploadAsset.ts @@ -14,16 +14,19 @@ export async function uploadAsset(c: Context): Promise { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) } - return c.json({ success: false, state: "invalid session" }, 200) + c.status(401) + return c.json({ success: false, state: "unauthorized" }) } // return unauthorized if user is not a contributor - if (session.user.is_contributor !== 1) - return c.json({ success: false, state: "unauthorized" }, 401) + if (session.user.is_contributor !== 1) { + c.status(401) + return c.json({ success: false, state: "unauthorized" }) + } const bypassApproval = session.user.is_contributor === 1 - const drizzle = await getConnection(c.env).drizzle + const drizzle = getConnection(c.env).drizzle const formData = await c.req.formData() const asset = formData.get("asset") as unknown as File | null @@ -40,13 +43,10 @@ export async function uploadAsset(c: Context): Promise { } if (metadata.tags.length > 5) - return c.json( - { - success: false, - state: `too many tags (${metadata.tags.length}). maximum is 5 tags per asset`, - }, - 400 - ) + return c.json({ + success: false, + state: `too many tags (${metadata.tags.length}). maximum is 5 tags per asset`, + }) const newAsset = { name: metadata.name, @@ -108,8 +108,10 @@ export async function uploadAsset(c: Context): Promise { await c.env.bucket.delete( `/assets/${metadata.game}/${metadata.category}/${metadata.name}.${metadata.extension}` ) - return c.json({ success: false, state: "failed to upload asset" }, 500) + c.status(500) + return c.json({ success: false, state: "failed to upload asset" }) } - return c.json({ success: true, state: "uploaded asset" }, 200) + c.status(200) + return c.json({ success: true, state: "uploaded asset" }) } diff --git a/src/v2/routes/auth/authRoute.ts b/src/v2/routes/auth/authRoute.ts index 52548ad..2321f33 100644 --- a/src/v2/routes/auth/authRoute.ts +++ b/src/v2/routes/auth/authRoute.ts @@ -23,7 +23,7 @@ authRoute.use( "*", cors({ credentials: true, - origin: ["https://next.wanderer.moe"], + origin: ["*"], // TODO: update this - temporary }) ) diff --git a/src/v2/routes/auth/games/createGame.ts b/src/v2/routes/auth/games/createGame.ts index 4c805e4..ee70ab4 100644 --- a/src/v2/routes/auth/games/createGame.ts +++ b/src/v2/routes/auth/games/createGame.ts @@ -13,16 +13,18 @@ export async function createGame(c: Context): Promise { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) } - return c.json({ success: false, state: "invalid session" }, 200) + c.status(401) + return c.json({ success: false, state: "invalid session" }) } const roleFlags = roleFlagsToArray(session.user.role_flags) if (!roleFlags.includes("CREATOR")) { - return c.json({ success: false, state: "unauthorized" }, 401) + c.status(401) + return c.json({ success: false, state: "unauthorized" }) } - const drizzle = await getConnection(c.env).drizzle + const drizzle = getConnection(c.env).drizzle const formData = await c.req.formData() @@ -49,8 +51,10 @@ export async function createGame(c: Context): Promise { try { await drizzle.insert(games).values(game).execute() } catch (e) { - return c.json({ success: false, state: "failed to create game" }, 200) + c.status(500) + return c.json({ success: false, state: "failed to create game" }) } - return c.json({ success: true, state: "created game", game }, 200) + c.status(200) + return c.json({ success: true, state: "created game", game }) } diff --git a/src/v2/routes/auth/games/deleteGame.ts b/src/v2/routes/auth/games/deleteGame.ts index 069f8db..1a51426 100644 --- a/src/v2/routes/auth/games/deleteGame.ts +++ b/src/v2/routes/auth/games/deleteGame.ts @@ -14,16 +14,18 @@ export async function deleteGame(c: Context): Promise { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) } - return c.json({ success: false, state: "invalid session" }, 200) + c.status(401) + return c.json({ success: false, state: "invalid session" }) } const roleFlags = roleFlagsToArray(session.user.role_flags) if (!roleFlags.includes("CREATOR")) { - return c.json({ success: false, state: "unauthorized" }, 401) + c.status(401) + return c.json({ success: false, state: "unauthorized" }) } - const drizzle = await getConnection(c.env).drizzle + const drizzle = getConnection(c.env).drizzle const formData = await c.req.formData() @@ -41,17 +43,17 @@ export async function deleteGame(c: Context): Promise { }) if (!gameExists) { - return c.json( - { success: false, state: "game with ID doesn't exist" }, - 200 - ) + c.status(404) + return c.json({ success: false, state: "game with ID doesn't exist" }) } try { await drizzle.delete(games).where(eq(games.id, game.id)).execute() } catch (e) { - return c.json({ success: false, state: "failed to delete game" }, 200) + c.status(500) + return c.json({ success: false, state: "failed to delete game" }) } - return c.json({ success: true, state: "deleted game", game }, 200) + c.status(200) + return c.json({ success: true, state: "deleted game", game }) } diff --git a/src/v2/routes/auth/login.ts b/src/v2/routes/auth/login.ts index 7def8cb..b2ac332 100644 --- a/src/v2/routes/auth/login.ts +++ b/src/v2/routes/auth/login.ts @@ -16,8 +16,10 @@ export async function login(c: Context): Promise { const password = formData.get("password") as string const validSession = await auth(c.env).handleRequest(c).validate() - if (validSession) - return c.json({ success: false, state: "already logged in" }, 200) + if (validSession) { + c.status(200) + return c.json({ success: false, state: "already logged in" }) + } const storedThrottling = usernameThrottling.get(username) const timeoutUntil = storedThrottling?.timeoutUntil ?? 0 @@ -75,5 +77,6 @@ export async function login(c: Context): Promise { const authRequest = await auth(c.env).handleRequest(c) authRequest.setSession(newSession) - return c.json({ success: true, state: "logged in" }, 200) + c.status(200) + return c.json({ success: true, state: "logged in" }) } diff --git a/src/v2/routes/auth/logout.ts b/src/v2/routes/auth/logout.ts index 4bd181b..b9c1045 100644 --- a/src/v2/routes/auth/logout.ts +++ b/src/v2/routes/auth/logout.ts @@ -6,7 +6,8 @@ export async function logout(c: Context): Promise { const session = await authRequest.validate() if (!session) { - return c.json({ success: false, state: "invalid session" }, 200) + c.status(401) + return c.json({ success: false, state: "invalid session" }) } // this is useful to clean up dead sessions that are still in the database @@ -14,5 +15,6 @@ export async function logout(c: Context): Promise { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) - return c.json({ success: true, state: "logged out" }, 200) + c.status(200) + return c.json({ success: true, state: "logged out" }) } diff --git a/src/v2/routes/auth/oc-generators/deleteOCGeneratorResponse.ts b/src/v2/routes/auth/oc-generators/deleteOCGeneratorResponse.ts index bb2ad50..4af99af 100644 --- a/src/v2/routes/auth/oc-generators/deleteOCGeneratorResponse.ts +++ b/src/v2/routes/auth/oc-generators/deleteOCGeneratorResponse.ts @@ -13,10 +13,11 @@ export async function deleteOCGeneratorResponse(c: Context): Promise { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) } - return c.json({ success: false, state: "invalid session" }, 200) + c.status(401) + return c.json({ success: false, state: "unauthorized" }) } - const drizzle = await getConnection(c.env).drizzle + const drizzle = getConnection(c.env).drizzle const formData = await c.req.formData() const deleteID = (formData.get("deleteID") as string) || null @@ -49,12 +50,10 @@ export async function deleteOCGeneratorResponse(c: Context): Promise { ) ) - return c.json( - { - success: true, - state: `deleted saved oc generator with id ${deleteID}`, - ocGeneratorResponse, - }, - 200 - ) + c.status(200) + return c.json({ + success: true, + state: `deleted saved oc generator with id ${deleteID}`, + ocGeneratorResponse, + }) } diff --git a/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts b/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts index 1c6848a..488b59c 100644 --- a/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts +++ b/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts @@ -12,10 +12,11 @@ export async function saveOCGeneratorResponse(c: Context): Promise { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) } - return c.json({ success: false, state: "invalid session" }, 200) + c.status(401) + return c.json({ success: false, state: "invalid session" }) } - const drizzle = await getConnection(c.env).drizzle + const drizzle = getConnection(c.env).drizzle const formData = await c.req.formData() @@ -32,5 +33,6 @@ export async function saveOCGeneratorResponse(c: Context): Promise { await drizzle.insert(savedOcGenerators).values(ocGeneratorResponse) - return c.json({ success: true, state: "saved", ocGeneratorResponse }, 200) + c.status(200) + return c.json({ success: true, state: "saved", ocGeneratorResponse }) } diff --git a/src/v2/routes/auth/oc-generators/viewOCGeneratorResponses.ts b/src/v2/routes/auth/oc-generators/viewOCGeneratorResponses.ts index 2835038..5dff05f 100644 --- a/src/v2/routes/auth/oc-generators/viewOCGeneratorResponses.ts +++ b/src/v2/routes/auth/oc-generators/viewOCGeneratorResponses.ts @@ -13,18 +13,21 @@ export async function viewOCGeneratorResponses(c: Context): Promise { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) } - return c.json({ success: false, state: "invalid session" }, 200) + c.status(401) + return c.json({ success: false, state: "unauthorized" }) } - const drizzle = await getConnection(c.env).drizzle + const drizzle = getConnection(c.env).drizzle const ocGeneratorResponses = await drizzle .select() .from(savedOcGenerators) .where(eq(savedOcGenerators.userId, session.userId)) - return c.json( - { success: true, state: "valid session", ocGeneratorResponses }, - 200 - ) + c.status(200) + return c.json({ + success: true, + state: "valid session", + ocGeneratorResponses, + }) } diff --git a/src/v2/routes/auth/signup.ts b/src/v2/routes/auth/signup.ts index 522540e..fe081bc 100644 --- a/src/v2/routes/auth/signup.ts +++ b/src/v2/routes/auth/signup.ts @@ -5,32 +5,14 @@ import type { APIContext as Context } from "@/worker-configuration" export async function signup(c: Context): Promise { const formData = await c.req.formData() - const secretKeyRequiredForSignup = c.env.VERY_SECRET_SIGNUP_KEY - const username = formData.get("username") as string const email = formData.get("email") as string const password = formData.get("password") as string - const passwordConfirm = formData.get("passwordConfirm") as string - const secretKey = formData.get("secretKey") as string const validSession = await auth(c.env).handleRequest(c).validate() if (validSession) return c.json({ success: false, state: "already logged in" }, 200) - if ( - secretKeyRequiredForSignup !== secretKey || - passwordConfirm !== password - ) { - return c.json( - { - success: false, - status: "error", - error: "Invalid credentials", - }, - 400 - ) - } - console.log("creating user") try { diff --git a/src/v2/routes/auth/tags/createTag.ts b/src/v2/routes/auth/tags/createTag.ts index fb9aab8..597d05e 100644 --- a/src/v2/routes/auth/tags/createTag.ts +++ b/src/v2/routes/auth/tags/createTag.ts @@ -13,16 +13,18 @@ export async function createTag(c: Context): Promise { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) } - return c.json({ success: false, state: "invalid session" }, 200) + c.status(401) + return c.json({ success: false, state: "invalid session" }) } const roleFlags = roleFlagsToArray(session.user.role_flags) if (!roleFlags.includes("CREATOR")) { - return c.json({ success: false, state: "unauthorized" }, 401) + c.status(401) + return c.json({ success: false, state: "unauthorized" }) } - const drizzle = await getConnection(c.env).drizzle + const drizzle = getConnection(c.env).drizzle const formData = await c.req.formData() @@ -40,17 +42,17 @@ export async function createTag(c: Context): Promise { }) if (tagExists) { - return c.json( - { success: false, state: "tag with name already exists" }, - 200 - ) + c.status(200) + return c.json({ success: false, state: "tag with name already exists" }) } try { await drizzle.insert(assetTags).values(tag).execute() } catch (e) { - return c.json({ success: false, state: "failed to create tag" }, 200) + c.status(200) + return c.json({ success: false, state: "failed to create tag" }) } - return c.json({ success: true, state: "created tag", tag }, 200) + c.status(200) + return c.json({ success: true, state: "created tag", tag }) } diff --git a/src/v2/routes/auth/tags/deleteTag.ts b/src/v2/routes/auth/tags/deleteTag.ts index 5a1fdb6..5824895 100644 --- a/src/v2/routes/auth/tags/deleteTag.ts +++ b/src/v2/routes/auth/tags/deleteTag.ts @@ -23,7 +23,7 @@ export async function deleteTag(c: Context): Promise { return c.json({ success: false, state: "unauthorized" }, 401) } - const drizzle = await getConnection(c.env).drizzle + const drizzle = getConnection(c.env).drizzle const formData = await c.req.formData() diff --git a/src/v2/routes/auth/validate.ts b/src/v2/routes/auth/validate.ts index a0c4a66..d6b7507 100644 --- a/src/v2/routes/auth/validate.ts +++ b/src/v2/routes/auth/validate.ts @@ -12,22 +12,20 @@ export async function validate(c: Context): Promise { if (!session) { authRequest.setSession(null) - return c.json({ success: false, state: "invalid session" }, 200) + c.status(401) + return c.json({ success: false, state: "invalid session" }) } if ( session.userAgent !== userAgent || - session.countryCode !== countryCode + session.countryCode !== countryCode || + session.state === "invalid" || + session.state === "idle" ) { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) - return c.json({ success: false, state: "invalid session" }, 200) - } - - if (session.state === "idle") { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - return c.json({ success: false, state: "invalid session" }, 200) + c.status(401) + return c.json({ success: false, state: "invalid session" }) } return c.json({ success: true, state: "valid session", session }, 200) diff --git a/src/v2/routes/games/allGames.ts b/src/v2/routes/games/allGames.ts index fad0608..2ff5511 100644 --- a/src/v2/routes/games/allGames.ts +++ b/src/v2/routes/games/allGames.ts @@ -22,7 +22,7 @@ export async function getAllGames(c: Context): Promise { } }) - const drizzle = await getConnection(c.env).drizzle + const drizzle = getConnection(c.env).drizzle const gamesList = await drizzle .select() diff --git a/src/v2/routes/search/all/searchAll.ts b/src/v2/routes/search/all/searchAll.ts index 14917ac..fa5c2cb 100644 --- a/src/v2/routes/search/all/searchAll.ts +++ b/src/v2/routes/search/all/searchAll.ts @@ -21,7 +21,7 @@ export async function searchAll(c: Context): Promise { } if (response) return response - const drizzle = await getConnection(c.env).drizzle + const drizzle = getConnection(c.env).drizzle // https://cdn.discordapp.com/attachments/1102306276832202813/1147291827699986572/F.gif const usersResponse = await drizzle.query.users.findMany({ @@ -60,7 +60,7 @@ export async function searchAll(c: Context): Promise { return or( and( eq(savedOcGenerators.isPublic, 1), - eq(savedOcGenerators.userId, session.userId) + session && eq(savedOcGenerators.userId, session.userId) ), like(savedOcGenerators.name, `%${query}%`) ) @@ -71,7 +71,7 @@ export async function searchAll(c: Context): Promise { where: (userCollections, { or, and }) => { return and( or( - eq(userCollections.userId, session.userId), + session && eq(userCollections.userId, session.userId), eq(userCollections.isPublic, 1) ), like(userCollections.name, `%${query}%`) @@ -84,7 +84,7 @@ export async function searchAll(c: Context): Promise { success: true, status: "ok", query, - isAuthed: session.userId ? true : false, + isAuthed: session && session.userId ? true : false, results: { usersResponse: usersResponse ? usersResponse : [], assetsResponse: assetsResponse ? assetsResponse : [], diff --git a/src/v2/routes/search/asset/recentAssets.ts b/src/v2/routes/search/asset/recentAssets.ts index a241806..e3ac63e 100644 --- a/src/v2/routes/search/asset/recentAssets.ts +++ b/src/v2/routes/search/asset/recentAssets.ts @@ -12,7 +12,7 @@ export async function recentAssets(c: Context): Promise { if (response) return response - const drizzle = await getConnection(c.env).drizzle + const drizzle = getConnection(c.env).drizzle const assetResponse = await drizzle.query.assets.findMany({ orderBy: desc(assets.uploadedDate), diff --git a/src/v2/routes/search/asset/searchAssets.ts b/src/v2/routes/search/asset/searchAssets.ts index 022f836..f0f3fd4 100644 --- a/src/v2/routes/search/asset/searchAssets.ts +++ b/src/v2/routes/search/asset/searchAssets.ts @@ -20,7 +20,7 @@ export async function searchForAssets(c: Context): Promise { // assetCategory?: comma separated list of asset category names => ?assetCategory=splash-art,character-sheets // assetTags?: comma separated list of asset tag names => ?assetTags=no-background,fanmade,official - const drizzle = await getConnection(c.env).drizzle + const drizzle = getConnection(c.env).drizzle // check if certian search parameters are present, if not, set them to null const searchQuery = query ?? null @@ -30,6 +30,8 @@ export async function searchForAssets(c: Context): Promise { : null const assetTagsList = assetTags ? SplitQueryByCommas(assetTags) : null + console.log(searchQuery, gameList, assetCategoryList, assetTagsList) + // query the database for assets that match the search parameters const assetResponse = await drizzle.query.assets.findMany({ where: (assets, { and, or, eq }) => { @@ -48,24 +50,6 @@ export async function searchForAssets(c: Context): Promise { eq(assets.status, 1) ) }, - // i think i am overcomplicating this - ...((assetTagsList?.length ?? 0) > 0 && { - with: { - assetTagsAssets: { - with: { - assetTags: { - where: (assetTags, { and, eq }) => { - return and( - ...assetTagsList.map((assetTag) => - eq(assetTags.name, assetTag) - ) - ) - }, - }, - }, - }, - }, - }), orderBy: desc(assets.id), limit: 1000, }) diff --git a/src/v2/routes/search/searchRoute.ts b/src/v2/routes/search/searchRoute.ts index 2446733..f63f488 100644 --- a/src/v2/routes/search/searchRoute.ts +++ b/src/v2/routes/search/searchRoute.ts @@ -10,15 +10,15 @@ import { cors } from "hono/cors" const searchRoute = new Hono<{ Bindings: Bindings }>() -searchRoute.get("/all", async (c) => { +searchRoute.get("/all/:query", async (c) => { return searchAll(c) }) authRoute.use( - "/all", + "/all/:query", cors({ credentials: true, - origin: ["https://next.wanderer.moe"], + origin: ["*"], // TODO: update this - temporary }) ) @@ -26,7 +26,7 @@ authRoute.use( "/users/user/:username", cors({ credentials: true, - origin: ["https://next.wanderer.moe"], + origin: ["*"], // TODO: update this - temporary }) ) diff --git a/src/v2/routes/search/user/getUserByUsername.ts b/src/v2/routes/search/user/getUserByUsername.ts index 88a35c6..f47f3d9 100644 --- a/src/v2/routes/search/user/getUserByUsername.ts +++ b/src/v2/routes/search/user/getUserByUsername.ts @@ -2,8 +2,6 @@ import { responseHeaders } from "@/v2/lib/responseHeaders" import { getConnection } from "@/v2/db/turso" import { createNotFoundResponse } from "@/v2/lib/helpers/responses/notFoundResponse" import type { APIContext as Context } from "@/worker-configuration" -import { desc } from "drizzle-orm" -import { assets, userCollections } from "@/v2/db/schema" import { auth } from "@/v2/lib/auth/lucia" import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" @@ -24,50 +22,10 @@ export async function getUserByUsername(c: Context): Promise { } if (response) return response - const drizzle = await getConnection(c.env).drizzle + const drizzle = getConnection(c.env).drizzle const user = await drizzle.query.users.findFirst({ where: (users, { and, eq }) => and(eq(users.username, username)), - with: { - assets: { - orderBy: desc(assets.uploadedDate), - limit: 100, - where: (assets, { eq }) => eq(assets.status, 1), - }, - userCollections: { - orderBy: desc(userCollections.dateCreated), - where: (userCollections, { eq, or }) => - or( - eq(userCollections.isPublic, 1), - session && eq(userCollections.userId, session.userId) - ), - limit: 5, - with: { - assets: { - orderBy: desc(assets.uploadedDate), - limit: 100, - where: (assets, { eq }) => eq(assets.status, 1), - }, - }, - }, - userFavorites: { - where: (userFavorites, { eq }) => eq(userFavorites.isPublic, 1), - with: { - assets: { - orderBy: desc(assets.uploadedDate), - limit: 100, - where: (assets, { eq }) => eq(assets.status, 1), - }, - }, - }, - savedOcGenerators: { - where: (savedOcGenerators, { eq, or }) => - or( - eq(savedOcGenerators.isPublic, 1), - session && eq(savedOcGenerators.userId, session.userId) - ), - }, - }, }) if (!user) { @@ -84,7 +42,7 @@ export async function getUserByUsername(c: Context): Promise { { success: true, status: "ok", - accountIsAuthed: session.userId ? true : false, + accountIsAuthed: session && session.userId ? true : false, userIsQueryingOwnAccount: session && session.userId === user.id ? true : false, userRoleFlagsArray: roleFlagsToArray(user.roleFlags), diff --git a/src/v2/routes/search/user/getUsersBySearch.ts b/src/v2/routes/search/user/getUsersBySearch.ts index f973801..3a05f15 100644 --- a/src/v2/routes/search/user/getUsersBySearch.ts +++ b/src/v2/routes/search/user/getUsersBySearch.ts @@ -1,5 +1,3 @@ -import { responseHeaders } from "@/v2/lib/responseHeaders" -import { createNotFoundResponse } from "@/v2/lib/helpers/responses/notFoundResponse" import { getConnection } from "@/v2/db/turso" import { like } from "drizzle-orm" import type { APIContext as Context } from "@/worker-configuration" @@ -11,7 +9,7 @@ export async function getUsersBySearch(c: Context): Promise { if (response) return response const { query } = c.req.param() - const drizzle = await getConnection(c.env).drizzle + const drizzle = getConnection(c.env).drizzle const userList = await drizzle.query.users.findMany({ where: (users, { or }) => { @@ -20,20 +18,21 @@ export async function getUsersBySearch(c: Context): Promise { }) if (!userList) { - return createNotFoundResponse(c, "Users not found", responseHeaders) + c.status(200) + return c.json({ + success: false, + status: "user not found", + }) } - response = c.json( - { - success: true, - status: "ok", - query, - results: userList, - }, - 200, - responseHeaders - ) + response = c.json({ + success: true, + status: "ok", + query, + results: userList, + }) + c.status(200) response.headers.set("Cache-Control", "s-maxage=60") await cache.put(cacheKey, response.clone()) diff --git a/src/v2/routes/tags/allTags.ts b/src/v2/routes/tags/allTags.ts index f854697..3c0a724 100644 --- a/src/v2/routes/tags/allTags.ts +++ b/src/v2/routes/tags/allTags.ts @@ -8,7 +8,7 @@ export async function listAllAssetTags(c: Context): Promise { if (response) return response - const drizzle = await getConnection(c.env).drizzle + const drizzle = getConnection(c.env).drizzle const allAssetTags = await drizzle.query.assetTags.findMany({ orderBy: (assetTags) => assetTags.name, diff --git a/src/worker-configuration.d.ts b/src/worker-configuration.d.ts index 12df54b..f270de6 100644 --- a/src/worker-configuration.d.ts +++ b/src/worker-configuration.d.ts @@ -9,5 +9,5 @@ export type Bindings = { TURSO_DATABASE_AUTH_TOKEN: string } -// this is the onl way i could figure out how to pass bindings to all the routes + export type APIContext = Context<{ Bindings: Bindings }> From 56220741f28c213ed51d0b18bcf5ba25762930ce Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 10 Sep 2023 18:39:59 +0100 Subject: [PATCH 084/318] quickly create an account and log in with your character's credentials or i'll be forced to report you (update dependencies) --- package.json | 10 +- pnpm-lock.yaml | 6760 +++++++++++++++++++-------------- src/v2/db/schema.ts | 3 +- src/worker-configuration.d.ts | 1 - 4 files changed, 4005 insertions(+), 2769 deletions(-) diff --git a/package.json b/package.json index 7df4840..5b1bf5d 100644 --- a/package.json +++ b/package.json @@ -13,10 +13,10 @@ }, "devDependencies": { "@cloudflare/workers-types": "^4.20230904.0", - "@types/node": "^20.5.9", + "@types/node": "^20.6.0", "dotenv": "^16.3.1", "drizzle-kit": "^0.19.13", - "eslint": "^8.48.0", + "eslint": "^8.49.0", "eslint-config-google": "^0.14.0", "eslint-plugin-json": "^3.1.0", "husky": "^8.0.3", @@ -26,13 +26,13 @@ }, "private": true, "dependencies": { - "@libsql/client": "^0.3.2", + "@libsql/client": "0.3.3-pre.2", "@lucia-auth/adapter-sqlite": "^2.0.0", "@typescript-eslint/eslint-plugin": "^6.6.0", "drizzle-orm": "^0.28.6", "hono": "^3.5.8", - "lucia": "^2.4.2", - "mysql2": "^3.6.0", + "lucia": "^2.5.0", + "mysql2": "^3.6.1", "prettier": "^3.0.3", "resend": "^1.0.0" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d344d44..bc51c62 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,2806 +1,4042 @@ -lockfileVersion: '6.1' +lockfileVersion: "6.1" settings: - autoInstallPeers: true - excludeLinksFromLockfile: false + autoInstallPeers: true + excludeLinksFromLockfile: false dependencies: - '@libsql/client': - specifier: ^0.3.2 - version: 0.3.2 - '@lucia-auth/adapter-sqlite': - specifier: ^2.0.0 - version: 2.0.0(@libsql/client@0.3.2)(lucia@2.4.2) - '@typescript-eslint/eslint-plugin': - specifier: ^6.6.0 - version: 6.6.0(@typescript-eslint/parser@6.6.0)(eslint@8.48.0)(typescript@5.2.2) - drizzle-orm: - specifier: ^0.28.6 - version: 0.28.6(@cloudflare/workers-types@4.20230904.0)(@libsql/client@0.3.2)(mysql2@3.6.0) - hono: - specifier: ^3.5.8 - version: 3.5.8 - lucia: - specifier: ^2.4.2 - version: 2.4.2 - mysql2: - specifier: ^3.6.0 - version: 3.6.0 - prettier: - specifier: ^3.0.3 - version: 3.0.3 - resend: - specifier: ^1.0.0 - version: 1.0.0 + "@libsql/client": + specifier: 0.3.3-pre.2 + version: 0.3.3-pre.2 + "@lucia-auth/adapter-sqlite": + specifier: ^2.0.0 + version: 2.0.0(@libsql/client@0.3.3-pre.2)(lucia@2.5.0) + "@typescript-eslint/eslint-plugin": + specifier: ^6.6.0 + version: 6.6.0(@typescript-eslint/parser@6.6.0)(eslint@8.49.0)(typescript@5.2.2) + drizzle-orm: + specifier: ^0.28.6 + version: 0.28.6(@cloudflare/workers-types@4.20230904.0)(@libsql/client@0.3.3-pre.2)(mysql2@3.6.1) + hono: + specifier: ^3.5.8 + version: 3.5.8 + lucia: + specifier: ^2.5.0 + version: 2.5.0 + mysql2: + specifier: ^3.6.1 + version: 3.6.1 + prettier: + specifier: ^3.0.3 + version: 3.0.3 + resend: + specifier: ^1.0.0 + version: 1.0.0 devDependencies: - '@cloudflare/workers-types': - specifier: ^4.20230904.0 - version: 4.20230904.0 - '@types/node': - specifier: ^20.5.9 - version: 20.5.9 - dotenv: - specifier: ^16.3.1 - version: 16.3.1 - drizzle-kit: - specifier: ^0.19.13 - version: 0.19.13 - eslint: - specifier: ^8.48.0 - version: 8.48.0 - eslint-config-google: - specifier: ^0.14.0 - version: 0.14.0(eslint@8.48.0) - eslint-plugin-json: - specifier: ^3.1.0 - version: 3.1.0 - husky: - specifier: ^8.0.3 - version: 8.0.3 - tsx: - specifier: ^3.12.8 - version: 3.12.8 - typescript: - specifier: ^5.2.2 - version: 5.2.2 - wrangler: - specifier: 3.7.0 - version: 3.7.0 + "@cloudflare/workers-types": + specifier: ^4.20230904.0 + version: 4.20230904.0 + "@types/node": + specifier: ^20.6.0 + version: 20.6.0 + dotenv: + specifier: ^16.3.1 + version: 16.3.1 + drizzle-kit: + specifier: ^0.19.13 + version: 0.19.13 + eslint: + specifier: ^8.49.0 + version: 8.49.0 + eslint-config-google: + specifier: ^0.14.0 + version: 0.14.0(eslint@8.49.0) + eslint-plugin-json: + specifier: ^3.1.0 + version: 3.1.0 + husky: + specifier: ^8.0.3 + version: 8.0.3 + tsx: + specifier: ^3.12.8 + version: 3.12.8 + typescript: + specifier: ^5.2.2 + version: 5.2.2 + wrangler: + specifier: 3.7.0 + version: 3.7.0 packages: + /@aashutoshrathi/word-wrap@1.2.6: + resolution: + { + integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==, + } + engines: { node: ">=0.10.0" } + + /@cloudflare/kv-asset-handler@0.2.0: + resolution: + { + integrity: sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==, + } + dependencies: + mime: 3.0.0 + dev: true + + /@cloudflare/workerd-darwin-64@1.20230904.0: + resolution: + { + integrity: sha512-/GDlmxAFbDtrQwP4zOXFbqOfaPvkDxdsCoEa+KEBcAl5uR98+7WW5/b8naBHX+t26uS7p4bLlImM8J5F1ienRQ==, + } + engines: { node: ">=16" } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@cloudflare/workerd-darwin-arm64@1.20230904.0: + resolution: + { + integrity: sha512-x8WXNc2xnDqr5y1iirnNdyx8GZY3rL5xiF7ebK3mKQeB+jFjkhO71yuPTkDCzUWtOvw1Wfd4jbwy4wxacMX4mQ==, + } + engines: { node: ">=16" } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@cloudflare/workerd-linux-64@1.20230904.0: + resolution: + { + integrity: sha512-V58xyMS3oDpKO8Dpdh0r0BXm99OzoGgvWe9ufttVraj/1NTMGELwb6i9ySb8k3F1J9m/sO26+TV7pQc/bGC1VQ==, + } + engines: { node: ">=16" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@cloudflare/workerd-linux-arm64@1.20230904.0: + resolution: + { + integrity: sha512-VrDaW+pjb5IAKEnNWtEaFiG377kXKmk5Fu0Era4W+jKzPON2BW/qRb/4LNHXQ4yxg/2HLm7RiUTn7JZtt1qO6A==, + } + engines: { node: ">=16" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@cloudflare/workerd-windows-64@1.20230904.0: + resolution: + { + integrity: sha512-/R/dE8uy+8J2YeXfDhI8/Bg7YUirdbbjH5/l/Vv00ZRE0lC3nPLcYeyBXSwXIQ6/Xht3gN+lksLQgKd0ZWRd+Q==, + } + engines: { node: ">=16" } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@cloudflare/workers-types@4.20230904.0: + resolution: + { + integrity: sha512-IX4oJCe14ctblSPZBlW64BVZ9nYLUo6sD2I5gu3hX0ywByYWm1OuoKm9Xb/Zpbj8Ph18Z7Ryii6u2/ocnncXdA==, + } + + /@drizzle-team/studio@0.0.5: + resolution: + { + integrity: sha512-ps5qF0tMxWRVu+V5gvCRrQNqlY92aTnIKdq27gm9LZMSdaKYZt6AVvSK1dlUMzs6Rt0Jm80b+eWct6xShBKhIw==, + } + dev: true + + /@esbuild-kit/cjs-loader@2.4.2: + resolution: + { + integrity: sha512-BDXFbYOJzT/NBEtp71cvsrGPwGAMGRB/349rwKuoxNSiKjPraNNnlK6MIIabViCjqZugu6j+xeMDlEkWdHHJSg==, + } + dependencies: + "@esbuild-kit/core-utils": 3.2.2 + get-tsconfig: 4.7.0 + dev: true + + /@esbuild-kit/core-utils@3.2.2: + resolution: + { + integrity: sha512-Ub6LaRaAgF80dTSzUdXpFLM1pVDdmEVB9qb5iAzSpyDlX/mfJTFGOnZ516O05p5uWWteNviMKi4PAyEuRxI5gA==, + } + dependencies: + esbuild: 0.18.20 + source-map-support: 0.5.21 + dev: true + + /@esbuild-kit/esm-loader@2.5.5: + resolution: + { + integrity: sha512-Qwfvj/qoPbClxCRNuac1Du01r9gvNOT+pMYtJDapfB1eoGN1YlJ1BixLyL9WVENRx5RXgNLdfYdx/CuswlGhMw==, + } + dependencies: + "@esbuild-kit/core-utils": 3.2.2 + get-tsconfig: 4.7.0 + 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-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-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-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 - /@aashutoshrathi/word-wrap@1.2.6: - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - - /@cloudflare/kv-asset-handler@0.2.0: - resolution: {integrity: sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==} - dependencies: - mime: 3.0.0 - dev: true - - /@cloudflare/workerd-darwin-64@1.20230904.0: - resolution: {integrity: sha512-/GDlmxAFbDtrQwP4zOXFbqOfaPvkDxdsCoEa+KEBcAl5uR98+7WW5/b8naBHX+t26uS7p4bLlImM8J5F1ienRQ==} - engines: {node: '>=16'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workerd-darwin-arm64@1.20230904.0: - resolution: {integrity: sha512-x8WXNc2xnDqr5y1iirnNdyx8GZY3rL5xiF7ebK3mKQeB+jFjkhO71yuPTkDCzUWtOvw1Wfd4jbwy4wxacMX4mQ==} - engines: {node: '>=16'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workerd-linux-64@1.20230904.0: - resolution: {integrity: sha512-V58xyMS3oDpKO8Dpdh0r0BXm99OzoGgvWe9ufttVraj/1NTMGELwb6i9ySb8k3F1J9m/sO26+TV7pQc/bGC1VQ==} - engines: {node: '>=16'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workerd-linux-arm64@1.20230904.0: - resolution: {integrity: sha512-VrDaW+pjb5IAKEnNWtEaFiG377kXKmk5Fu0Era4W+jKzPON2BW/qRb/4LNHXQ4yxg/2HLm7RiUTn7JZtt1qO6A==} - engines: {node: '>=16'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workerd-windows-64@1.20230904.0: - resolution: {integrity: sha512-/R/dE8uy+8J2YeXfDhI8/Bg7YUirdbbjH5/l/Vv00ZRE0lC3nPLcYeyBXSwXIQ6/Xht3gN+lksLQgKd0ZWRd+Q==} - engines: {node: '>=16'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workers-types@4.20230904.0: - resolution: {integrity: sha512-IX4oJCe14ctblSPZBlW64BVZ9nYLUo6sD2I5gu3hX0ywByYWm1OuoKm9Xb/Zpbj8Ph18Z7Ryii6u2/ocnncXdA==} - - /@drizzle-team/studio@0.0.5: - resolution: {integrity: sha512-ps5qF0tMxWRVu+V5gvCRrQNqlY92aTnIKdq27gm9LZMSdaKYZt6AVvSK1dlUMzs6Rt0Jm80b+eWct6xShBKhIw==} - dev: true - - /@esbuild-kit/cjs-loader@2.4.2: - resolution: {integrity: sha512-BDXFbYOJzT/NBEtp71cvsrGPwGAMGRB/349rwKuoxNSiKjPraNNnlK6MIIabViCjqZugu6j+xeMDlEkWdHHJSg==} - dependencies: - '@esbuild-kit/core-utils': 3.2.2 - get-tsconfig: 4.7.0 - dev: true - - /@esbuild-kit/core-utils@3.2.2: - resolution: {integrity: sha512-Ub6LaRaAgF80dTSzUdXpFLM1pVDdmEVB9qb5iAzSpyDlX/mfJTFGOnZ516O05p5uWWteNviMKi4PAyEuRxI5gA==} - dependencies: - esbuild: 0.18.20 - source-map-support: 0.5.21 - dev: true - - /@esbuild-kit/esm-loader@2.5.5: - resolution: {integrity: sha512-Qwfvj/qoPbClxCRNuac1Du01r9gvNOT+pMYtJDapfB1eoGN1YlJ1BixLyL9WVENRx5RXgNLdfYdx/CuswlGhMw==} - dependencies: - '@esbuild-kit/core-utils': 3.2.2 - get-tsconfig: 4.7.0 - 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-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-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-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-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-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-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-community/eslint-utils@4.4.0(eslint@8.48.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.48.0 - eslint-visitor-keys: 3.4.3 - - /@eslint-community/regexpp@4.8.0: - resolution: {integrity: sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - /@eslint/eslintrc@2.1.2: - resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.6.1 - globals: 13.21.0 - ignore: 5.2.4 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - /@eslint/js@8.48.0: - resolution: {integrity: sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - /@humanwhocodes/config-array@0.11.11: - resolution: {integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==} - engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - /@humanwhocodes/object-schema@1.2.1: - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} - - /@libsql/client@0.3.2: - resolution: {integrity: sha512-e0qgf7gFOwhu0ueU/RK68TmD0PnjX3RaeM5lrJowGMEZjvh/shZ4BhwPA26Ec0nSa4oiZ0s0zn/T5YjcgY1bTw==} - dependencies: - '@libsql/hrana-client': 0.5.0 - better-sqlite3: 8.6.0 - js-base64: 3.7.5 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - dev: false - - /@libsql/hrana-client@0.5.0: - resolution: {integrity: sha512-o9yXH+9XBPnMSrBkY17q2xknfNXJaCHQv4rFJikt1g8M0d80hwp4ZZ1jHwacuL61wRa4j6qKMFqh9ti+CoTH1A==} - dependencies: - '@libsql/isomorphic-fetch': 0.1.6 - '@libsql/isomorphic-ws': 0.1.3 - js-base64: 3.7.5 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - dev: false - - /@libsql/isomorphic-fetch@0.1.6: - resolution: {integrity: sha512-8qhxEDmVBDb54E9xdW1xqw3zLNShkMZpf5YQU3PvwjtKNLOPde59Oqez+RnZHsYkt9zQxxOF+7gSHVJeP/UWqg==} - dependencies: - '@types/node-fetch': 2.6.4 - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding - dev: false - - /@libsql/isomorphic-ws@0.1.3: - resolution: {integrity: sha512-54dZXgYwWDKsnfWv8GCVYvhn6RDlqFDGAc8EQMd941yvGMsGzo06Gn6Iyjw//nJ1iJO97FbXgoQ1apikoFD/WA==} - dependencies: - '@types/ws': 8.5.5 - ws: 8.14.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: false - - /@lucia-auth/adapter-sqlite@2.0.0(@libsql/client@0.3.2)(lucia@2.4.2): - resolution: {integrity: sha512-Hiy8WND/1mi25r0M2ruSml+Ab5GJLr4XZEHApYw1lxybF+VlPUyX7oTtIVCSgvq/SWiP/tvnyPwnXAPmNr8/bg==} - peerDependencies: - '@libsql/client': ^0.3.0 - better-sqlite3: ^8.0.0 - lucia: ^2.0.0 - peerDependenciesMeta: - '@libsql/client': + /@esbuild/freebsd-x64@0.18.20: + resolution: + { + integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true optional: true - better-sqlite3: + + /@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 - dependencies: - '@libsql/client': 0.3.2 - lucia: 2.4.2 - dev: false - - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 - - /@one-ini/wasm@0.1.1: - resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} - dev: false - - /@react-email/render@0.0.7: - resolution: {integrity: sha512-hMMhxk6TpOcDC5qnKzXPVJoVGEwfm+U5bGOPH+MyTTlx0F02RLQygcATBKsbP7aI/mvkmBAZoFbgPIHop7ovug==} - engines: {node: '>=16.0.0'} - dependencies: - html-to-text: 9.0.3 - pretty: 2.0.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@selderee/plugin-htmlparser2@0.10.0: - resolution: {integrity: sha512-gW69MEamZ4wk1OsOq1nG1jcyhXIQcnrsX5JwixVw/9xaiav8TCyjESAruu1Rz9yyInhgBXxkNwMeygKnN2uxNA==} - dependencies: - domhandler: 5.0.3 - selderee: 0.10.0 - dev: false - - /@types/json-schema@7.0.12: - resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} - dev: false - - /@types/node-fetch@2.6.4: - resolution: {integrity: sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==} - dependencies: - '@types/node': 20.5.9 - form-data: 3.0.1 - dev: false - - /@types/node@20.5.9: - resolution: {integrity: sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==} - - /@types/semver@7.5.1: - resolution: {integrity: sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==} - dev: false - - /@types/ws@8.5.5: - resolution: {integrity: sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==} - dependencies: - '@types/node': 20.5.9 - dev: false - - /@typescript-eslint/eslint-plugin@6.6.0(@typescript-eslint/parser@6.6.0)(eslint@8.48.0)(typescript@5.2.2): - resolution: {integrity: sha512-CW9YDGTQnNYMIo5lMeuiIG08p4E0cXrXTbcZ2saT/ETE7dWUrNxlijsQeU04qAAKkILiLzdQz+cGFxCJjaZUmA==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: + + /@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 - dependencies: - '@eslint-community/regexpp': 4.8.0 - '@typescript-eslint/parser': 6.6.0(eslint@8.48.0)(typescript@5.2.2) - '@typescript-eslint/scope-manager': 6.6.0 - '@typescript-eslint/type-utils': 6.6.0(eslint@8.48.0)(typescript@5.2.2) - '@typescript-eslint/utils': 6.6.0(eslint@8.48.0)(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 6.6.0 - debug: 4.3.4 - eslint: 8.48.0 - graphemer: 1.4.0 - ignore: 5.2.4 - natural-compare: 1.4.0 - semver: 7.5.4 - ts-api-utils: 1.0.2(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/parser@6.6.0(eslint@8.48.0)(typescript@5.2.2): - resolution: {integrity: sha512-setq5aJgUwtzGrhW177/i+DMLqBaJbdwGj2CPIVFFLE0NCliy5ujIdLHd2D1ysmlmsjdL2GWW+hR85neEfc12w==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: + + /@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 - dependencies: - '@typescript-eslint/scope-manager': 6.6.0 - '@typescript-eslint/types': 6.6.0 - '@typescript-eslint/typescript-estree': 6.6.0(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 6.6.0 - debug: 4.3.4 - eslint: 8.48.0 - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/scope-manager@6.6.0: - resolution: {integrity: sha512-pT08u5W/GT4KjPUmEtc2kSYvrH8x89cVzkA0Sy2aaOUIw6YxOIjA8ilwLr/1fLjOedX1QAuBpG9XggWqIIfERw==} - engines: {node: ^16.0.0 || >=18.0.0} - dependencies: - '@typescript-eslint/types': 6.6.0 - '@typescript-eslint/visitor-keys': 6.6.0 - dev: false - - /@typescript-eslint/type-utils@6.6.0(eslint@8.48.0)(typescript@5.2.2): - resolution: {integrity: sha512-8m16fwAcEnQc69IpeDyokNO+D5spo0w1jepWWY2Q6y5ZKNuj5EhVQXjtVAeDDqvW6Yg7dhclbsz6rTtOvcwpHg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: + + /@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 - dependencies: - '@typescript-eslint/typescript-estree': 6.6.0(typescript@5.2.2) - '@typescript-eslint/utils': 6.6.0(eslint@8.48.0)(typescript@5.2.2) - debug: 4.3.4 - eslint: 8.48.0 - ts-api-utils: 1.0.2(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/types@6.6.0: - resolution: {integrity: sha512-CB6QpJQ6BAHlJXdwUmiaXDBmTqIE2bzGTDLADgvqtHWuhfNP3rAOK7kAgRMAET5rDRr9Utt+qAzRBdu3AhR3sg==} - engines: {node: ^16.0.0 || >=18.0.0} - dev: false - - /@typescript-eslint/typescript-estree@6.6.0(typescript@5.2.2): - resolution: {integrity: sha512-hMcTQ6Al8MP2E6JKBAaSxSVw5bDhdmbCEhGW/V8QXkb9oNsFkA4SBuOMYVPxD3jbtQ4R/vSODBsr76R6fP3tbA==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: + + /@esbuild/linux-ia32@0.17.19: + resolution: + { + integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==, + } + engines: { node: ">=12" } + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true optional: true - dependencies: - '@typescript-eslint/types': 6.6.0 - '@typescript-eslint/visitor-keys': 6.6.0 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.5.4 - ts-api-utils: 1.0.2(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/utils@6.6.0(eslint@8.48.0)(typescript@5.2.2): - resolution: {integrity: sha512-mPHFoNa2bPIWWglWYdR0QfY9GN0CfvvXX1Sv6DlSTive3jlMTUy+an67//Gysc+0Me9pjitrq0LJp0nGtLgftw==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) - '@types/json-schema': 7.0.12 - '@types/semver': 7.5.1 - '@typescript-eslint/scope-manager': 6.6.0 - '@typescript-eslint/types': 6.6.0 - '@typescript-eslint/typescript-estree': 6.6.0(typescript@5.2.2) - eslint: 8.48.0 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - - typescript - dev: false - - /@typescript-eslint/visitor-keys@6.6.0: - resolution: {integrity: sha512-L61uJT26cMOfFQ+lMZKoJNbAEckLe539VhTxiGHrWl5XSKQgA0RTBZJW2HFPy5T0ZvPVSD93QsrTKDkfNwJGyQ==} - engines: {node: ^16.0.0 || >=18.0.0} - dependencies: - '@typescript-eslint/types': 6.6.0 - eslint-visitor-keys: 3.4.3 - dev: false - - /abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - dev: false - - /acorn-jsx@5.3.2(acorn@8.10.0): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.10.0 - - /acorn-walk@8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} - engines: {node: '>=0.4.0'} - dev: true - - /acorn@8.10.0: - resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} - engines: {node: '>=0.4.0'} - hasBin: true - - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: false - - /as-table@1.0.55: - resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} - dependencies: - printable-characters: 1.0.42 - dev: true - - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: false - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - /better-sqlite3@8.6.0: - resolution: {integrity: sha512-jwAudeiTMTSyby+/SfbHDebShbmC2MCH8mU2+DXi0WJfv13ypEJm47cd3kljmy/H130CazEvkf2Li//ewcMJ1g==} - requiresBuild: true - dependencies: - bindings: 1.5.0 - prebuild-install: 7.1.1 - - /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 - - /bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - - /blake3-wasm@2.1.5: - resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} - dev: true - - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - dependencies: - balanced-match: 1.0.2 - - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: true - - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - /busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} - dependencies: - streamsearch: 1.1.0 - dev: true - - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - - /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@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true - - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - - /cli-color@2.0.3: - resolution: {integrity: sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==} - engines: {node: '>=0.10'} - dependencies: - d: 1.0.1 - es5-ext: 0.10.62 - es6-iterator: 2.0.3 - memoizee: 0.4.15 - timers-ext: 0.1.7 - dev: true - - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - dependencies: - delayed-stream: 1.0.0 - dev: false - - /commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} - dev: false - - /commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} - dev: true - - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - /condense-newlines@0.2.1: - resolution: {integrity: sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==} - engines: {node: '>=0.10.0'} - dependencies: - extend-shallow: 2.0.1 - is-whitespace: 0.3.0 - kind-of: 3.2.2 - dev: false - - /config-chain@1.1.13: - resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} - dependencies: - ini: 1.3.8 - proto-list: 1.2.4 - dev: false - - /cookie@0.5.0: - resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} - engines: {node: '>= 0.6'} - dev: true - - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - /d@1.0.1: - resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} - 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 - - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: + + /@esbuild/linux-ia32@0.18.20: + resolution: + { + integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==, + } + engines: { node: ">=12" } + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true optional: true - dependencies: - ms: 2.1.2 - - /decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - dependencies: - mimic-response: 3.1.0 - - /deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - - /deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - dev: false - - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dev: false - - /denque@2.1.0: - resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} - engines: {node: '>=0.10'} - dev: false - - /detect-libc@2.0.2: - resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} - engines: {node: '>=8'} - - /difflib@0.2.4: - resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} - dependencies: - heap: 0.2.7 - dev: true - - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - dev: false - - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dependencies: - esutils: 2.0.3 - - /dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - entities: 4.5.0 - dev: false - - /domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - dev: false - - /domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} - dependencies: - domelementtype: 2.3.0 - dev: false - - /domutils@3.1.0: - resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} - dependencies: - dom-serializer: 2.0.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - dev: false - - /dotenv@16.3.1: - resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} - engines: {node: '>=12'} - dev: true - - /dreamopt@0.8.0: - resolution: {integrity: sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==} - engines: {node: '>=0.4.0'} - dependencies: - wordwrap: 1.0.0 - dev: true - - /drizzle-kit@0.19.13: - resolution: {integrity: sha512-Rba5VW1O2JfJlwVBeZ8Zwt2E2us5oZ08PQBDiVSGlug53TOc8hzXjblZFuF+dnll9/RQEHrkzBmJFgqTvn5Rxg==} - hasBin: true - dependencies: - '@drizzle-team/studio': 0.0.5 - '@esbuild-kit/esm-loader': 2.5.5 - camelcase: 7.0.1 - chalk: 5.3.0 - commander: 9.5.0 - esbuild: 0.18.20 - esbuild-register: 3.4.2(esbuild@0.18.20) - glob: 8.1.0 - hanji: 0.0.5 - json-diff: 0.9.0 - minimatch: 7.4.6 - zod: 3.22.2 - transitivePeerDependencies: - - supports-color - dev: true - - /drizzle-orm@0.28.6(@cloudflare/workers-types@4.20230904.0)(@libsql/client@0.3.2)(mysql2@3.6.0): - resolution: {integrity: sha512-yBe+F9htrlYER7uXgDJUQsTHFoIrI5yMm5A0bg0GiZ/kY5jNXTWoEy4KQtg35cE27sw1VbgzoMWHAgCckUUUww==} - 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': + + /@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 - '@cloudflare/workers-types': + + /@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 - '@libsql/client': + + /@esbuild/linux-mips64el@0.17.19: + resolution: + { + integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==, + } + engines: { node: ">=12" } + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true optional: true - '@neondatabase/serverless': + + /@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 - '@opentelemetry/api': + + /@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 - '@planetscale/database': + + /@esbuild/linux-ppc64@0.18.20: + resolution: + { + integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==, + } + engines: { node: ">=12" } + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true optional: true - '@types/better-sqlite3': + + /@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 - '@types/pg': + + /@esbuild/linux-riscv64@0.18.20: + resolution: + { + integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==, + } + engines: { node: ">=12" } + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true optional: true - '@types/sql.js': + + /@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 - '@vercel/postgres': + + /@esbuild/linux-s390x@0.18.20: + resolution: + { + integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==, + } + engines: { node: ">=12" } + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true optional: true - better-sqlite3: + + /@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 - bun-types: + + /@esbuild/linux-x64@0.18.20: + resolution: + { + integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true optional: true - knex: + + /@esbuild/netbsd-x64@0.17.19: + resolution: + { + integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true optional: true - kysely: + + /@esbuild/netbsd-x64@0.18.20: + resolution: + { + integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true optional: true - mysql2: + + /@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 - pg: + + /@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 - postgres: + + /@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 - sql.js: + + /@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 - sqlite3: + + /@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 - dependencies: - '@cloudflare/workers-types': 4.20230904.0 - '@libsql/client': 0.3.2 - mysql2: 3.6.0 - dev: false - - /editorconfig@1.0.4: - resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} - engines: {node: '>=14'} - hasBin: true - dependencies: - '@one-ini/wasm': 0.1.1 - commander: 10.0.1 - minimatch: 9.0.1 - semver: 7.5.4 - dev: false - - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - dependencies: - once: 1.4.0 - - /entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - dev: false - - /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.4.2(esbuild@0.18.20): - resolution: {integrity: sha512-kG/XyTDyz6+YDuyfB9ZoSIOOmgyFCH+xPRtsCa8W85HLRV5Csp+o3jWVbOSHgSLfyLc5DmP+KFDNwty4mEjC+Q==} - 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 - - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - /eslint-config-google@0.14.0(eslint@8.48.0): - resolution: {integrity: sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==} - engines: {node: '>=0.10.0'} - peerDependencies: - eslint: '>=5.16.0' - dependencies: - eslint: 8.48.0 - dev: true - - /eslint-plugin-json@3.1.0: - resolution: {integrity: sha512-MrlG2ynFEHe7wDGwbUuFPsaT2b1uhuEFhJ+W1f1u+1C2EkXmTYJp4B1aAdQQ8M+CC3t//N/oRKiIVw14L2HR1g==} - engines: {node: '>=12.0'} - dependencies: - lodash: 4.17.21 - vscode-json-languageservice: 4.2.1 - dev: true - - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - /eslint@8.48.0: - resolution: {integrity: sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) - '@eslint-community/regexpp': 4.8.0 - '@eslint/eslintrc': 2.1.2 - '@eslint/js': 8.48.0 - '@humanwhocodes/config-array': 0.11.11 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.21.0 - graphemer: 1.4.0 - ignore: 5.2.4 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.3 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - acorn: 8.10.0 - acorn-jsx: 5.3.2(acorn@8.10.0) - eslint-visitor-keys: 3.4.3 - - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} - dependencies: - estraverse: 5.3.0 - - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - dependencies: - estraverse: 5.3.0 - - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - /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'} - - /event-emitter@0.3.5: - resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} - dependencies: - d: 1.0.1 - es5-ext: 0.10.62 - dev: true - - /exit-hook@2.2.1: - resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} - engines: {node: '>=6'} - dev: true - - /expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} - - /ext@1.7.0: - resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} - dependencies: - type: 2.7.2 - dev: true - - /extend-shallow@2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} - dependencies: - is-extendable: 0.1.1 - dev: false - - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - /fast-glob@3.3.1: - resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: false - - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} - dependencies: - reusify: 1.0.4 - - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flat-cache: 3.1.0 - - /file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - - /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 - - /flat-cache@3.1.0: - resolution: {integrity: sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==} - engines: {node: '>=12.0.0'} - dependencies: - flatted: 3.2.7 - keyv: 4.5.3 - rimraf: 3.0.2 - - /flatted@3.2.7: - resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} - - /form-data@3.0.1: - resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} - engines: {node: '>= 6'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: false - - /fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /generate-function@2.3.1: - resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} - dependencies: - is-property: 1.0.2 - dev: false - - /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-tsconfig@4.7.0: - resolution: {integrity: sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw==} - dependencies: - resolve-pkg-maps: 1.0.0 - dev: true - - /github-from-package@0.0.0: - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - dependencies: - is-glob: 4.0.3 - - /glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - dev: true - - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - /glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - - /globals@13.21.0: - resolution: {integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.20.2 - - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.1 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 3.0.0 - dev: false - - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - - /hanji@0.0.5: - resolution: {integrity: sha512-Abxw1Lq+TnYiL4BueXqMau222fPSPMFtya8HdpWsz/xVAhifXou71mPh/kY2+08RgFcVccjG3uZHs6K5HAe3zw==} - dependencies: - lodash.throttle: 4.1.1 - sisteransi: 1.0.5 - dev: true - - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - /heap@0.2.7: - resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} - dev: true - - /hono@3.5.8: - resolution: {integrity: sha512-ZipTmGfHm43q5QOEBGog2wyejyNUcicjPt0BLDQ8yz9xij/y9RYXRpR1YPxMpQqeyNM7isvpsIAe9Ems51Wq0Q==} - engines: {node: '>=16.0.0'} - dev: false - - /html-to-text@9.0.3: - resolution: {integrity: sha512-hxDF1kVCF2uw4VUJ3vr2doc91pXf2D5ngKcNviSitNkhP9OMOaJkDrFIFL6RMvko7NisWTEiqGpQ9LAxcVok1w==} - engines: {node: '>=14'} - dependencies: - '@selderee/plugin-htmlparser2': 0.10.0 - deepmerge: 4.3.1 - dom-serializer: 2.0.0 - htmlparser2: 8.0.2 - selderee: 0.10.0 - dev: false - - /htmlparser2@8.0.2: - resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.1.0 - entities: 4.5.0 - dev: false - - /http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - dev: true - - /husky@8.0.3: - resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} - engines: {node: '>=14'} - hasBin: true - dev: true - - /iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - dependencies: - safer-buffer: 2.1.2 - dev: false - - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - /ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} - engines: {node: '>= 4'} - - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - dependencies: - binary-extensions: 2.2.0 - dev: true - - /is-buffer@1.1.6: - resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} - dev: false - - /is-extendable@0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} - dev: false - - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - - /is-promise@2.2.2: - resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} - dev: true - - /is-property@1.0.2: - resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} - dev: false - - /is-whitespace@0.3.0: - resolution: {integrity: sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==} - engines: {node: '>=0.10.0'} - dev: false - - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - /js-base64@3.7.5: - resolution: {integrity: sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==} - dev: false - - /js-beautify@1.14.9: - resolution: {integrity: sha512-coM7xq1syLcMyuVGyToxcj2AlzhkDjmfklL8r0JgJ7A76wyGMpJ1oA35mr4APdYNO/o/4YY8H54NQIJzhMbhBg==} - engines: {node: '>=12'} - hasBin: true - dependencies: - config-chain: 1.1.13 - editorconfig: 1.0.4 - glob: 8.1.0 - nopt: 6.0.0 - dev: false - - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - dev: false - - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - dependencies: - argparse: 2.0.1 - - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - - /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-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - dev: true - - /keyv@4.5.3: - resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} - dependencies: - json-buffer: 3.0.1 - - /kind-of@3.2.2: - resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} - engines: {node: '>=0.10.0'} - dependencies: - is-buffer: 1.1.6 - dev: false - - /kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - dev: true - - /leac@0.6.0: - resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==} - dev: false - - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - dependencies: - p-locate: 5.0.0 - - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - - /lodash.throttle@4.1.1: - resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} - dev: true - - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: true - - /long@5.2.3: - resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} - dev: false - - /loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - dependencies: - js-tokens: 4.0.0 - dev: false - - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - - /lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} - dev: false - - /lru-cache@8.0.5: - resolution: {integrity: sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==} - engines: {node: '>=16.14'} - dev: false - - /lru-queue@0.1.0: - resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} - dependencies: - es5-ext: 0.10.62 - dev: true - - /lucia@2.4.2: - resolution: {integrity: sha512-JJMAxrsjNXS5WUNe/u9+ahIXM+RNHTL2+RRtzUo1lZgUQL7oFsOgckikdjUPmGaEKrmQfUznxg20L/Ghba3Fjg==} - dev: false - - /magic-string@0.25.9: - resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} - dependencies: - sourcemap-codec: 1.4.8 - dev: true - - /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 - - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: false - - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - dev: false - - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - dev: false - - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - dev: false - - /mime@3.0.0: - resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} - engines: {node: '>=10.0.0'} - hasBin: true - dev: true - - /mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - - /miniflare@3.20230904.0: - resolution: {integrity: sha512-+OWQqEk8hV7vZaPCoj5dk1lZr4YUy56OiyNZ45/3ITYf+ZxgQOBPWhQhpw1jCahkRKGPa9Aykz01sc+GhPZYDA==} - engines: {node: '>=16.13'} - dependencies: - acorn: 8.10.0 - acorn-walk: 8.2.0 - better-sqlite3: 8.6.0 - capnp-ts: 0.7.0 - exit-hook: 2.2.1 - glob-to-regexp: 0.4.1 - http-cache-semantics: 4.1.1 - kleur: 4.1.5 - source-map-support: 0.5.21 - stoppable: 1.1.0 - undici: 5.23.0 - workerd: 1.20230904.0 - ws: 8.14.0 - youch: 3.3.1 - zod: 3.22.2 - 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 - - /minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - - /minimatch@7.4.6: - resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - dev: true - - /minimatch@9.0.1: - resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - brace-expansion: 2.0.1 - dev: false - - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - /mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - /mustache@4.2.0: - resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} - hasBin: true - dev: true - - /mysql2@3.6.0: - resolution: {integrity: sha512-EWUGAhv6SphezurlfI2Fpt0uJEWLmirrtQR7SkbTHFC+4/mJBrPiSzHESHKAWKG7ALVD6xaG/NBjjd1DGJGQQQ==} - engines: {node: '>= 8.0'} - dependencies: - denque: 2.1.0 - generate-function: 2.3.1 - iconv-lite: 0.6.3 - long: 5.2.3 - lru-cache: 8.0.5 - named-placeholders: 1.1.3 - seq-queue: 0.0.5 - sqlstring: 2.3.3 - dev: false - - /named-placeholders@1.1.3: - resolution: {integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==} - engines: {node: '>=12.0.0'} - dependencies: - lru-cache: 7.18.3 - dev: false - - /nanoid@3.3.6: - resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} - 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==} - - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - - /next-tick@1.1.0: - resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - dev: true - - /node-abi@3.47.0: - resolution: {integrity: sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==} - engines: {node: '>=10'} - dependencies: - semver: 7.5.4 - - /node-fetch@2.6.12: - resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: + + /@esbuild/win32-arm64@0.18.20: + resolution: + { + integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true optional: true - dependencies: - whatwg-url: 5.0.0 - dev: false - - /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: + + /@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 - dependencies: - whatwg-url: 5.0.0 - dev: false - - /node-forge@1.3.1: - resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} - engines: {node: '>= 6.13.0'} - dev: true - - /nopt@6.0.0: - resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - hasBin: true - dependencies: - abbrev: 1.1.1 - dev: false - - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: true - - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} - dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - dependencies: - yocto-queue: 0.1.0 - - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - dependencies: - p-limit: 3.1.0 - - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - dependencies: - callsites: 3.1.0 - - /parseley@0.11.0: - resolution: {integrity: sha512-VfcwXlBWgTF+unPcr7yu3HSSA6QUdDaDnrHcytVfj5Z8azAyKBDrYnSIfeSxlrEayndNcLmrXzg+Vxbo6DWRXQ==} - dependencies: - leac: 0.6.0 - peberminta: 0.8.0 - dev: false - - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - /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'} - dev: false - - /peberminta@0.8.0: - resolution: {integrity: sha512-YYEs+eauIjDH5nUEGi18EohWE0nV2QbGTqmxQcqgZ/0g+laPCQmuIqq7EBLVi9uim9zMgfJv0QBZEnQ3uHw/Tw==} - dev: false - - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - /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.47.0 - pump: 3.0.0 - rc: 1.2.8 - simple-get: 4.0.1 - tar-fs: 2.1.1 - tunnel-agent: 0.6.0 - - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - - /prettier@3.0.3: - resolution: {integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==} - engines: {node: '>=14'} - hasBin: true - dev: false - - /pretty@2.0.0: - resolution: {integrity: sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==} - engines: {node: '>=0.10.0'} - dependencies: - condense-newlines: 0.2.1 - extend-shallow: 2.0.1 - js-beautify: 1.14.9 - dev: false - - /printable-characters@1.0.42: - resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} - dev: true - - /proto-list@1.2.4: - resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} - 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 - - /punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} - engines: {node: '>=6'} - - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - /rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - - /react-dom@18.2.0(react@18.2.0): - resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} - peerDependencies: - react: ^18.2.0 - dependencies: - loose-envify: 1.4.0 - react: 18.2.0 - scheduler: 0.23.0 - dev: false - - /react@18.2.0: - resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} - engines: {node: '>=0.10.0'} - dependencies: - loose-envify: 1.4.0 - dev: false - - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - dev: true - - /resend@1.0.0: - resolution: {integrity: sha512-8LEE4gncmcm8bsvxvahZFpFk5hxUrKdagqWoX/MRXVU2YZ9coYxqZDeDYXG9pexz1A694bjE1hiQbBAA+bHAow==} - engines: {node: '>=16'} - dependencies: - '@react-email/render': 0.0.7 - node-fetch: 2.6.12 - type-fest: 3.13.0 - transitivePeerDependencies: - - encoding - dev: false - - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - - /resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - dev: true - - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true - dependencies: - glob: 7.2.3 - - /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. - 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 - dev: true - - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - dependencies: - queue-microtask: 1.2.3 - - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: false - - /scheduler@0.23.0: - resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} - dependencies: - loose-envify: 1.4.0 - dev: false - - /selderee@0.10.0: - resolution: {integrity: sha512-DEL/RW/f4qLw/NrVg97xKaEBC8IpzIG2fvxnzCp3Z4yk4jQ3MXom+Imav9wApjxX2dfS3eW7x0DXafJr85i39A==} - dependencies: - parseley: 0.11.0 - dev: false - - /selfsigned@2.1.1: - resolution: {integrity: sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==} - engines: {node: '>=10'} - dependencies: - node-forge: 1.3.1 - dev: true - - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - - /seq-queue@0.0.5: - resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==} - dev: false - - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - /simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - - /simple-get@4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 - - /sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - dev: true - - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: false - - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - dev: true - - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - dev: true - - /source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} - dev: true - - /sourcemap-codec@1.4.8: - resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} - deprecated: Please use @jridgewell/sourcemap-codec instead - dev: true - - /sqlstring@2.3.3: - resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} - engines: {node: '>= 0.6'} - dev: false - - /stacktracey@2.1.8: - resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==} - dependencies: - as-table: 1.0.55 - get-source: 2.0.12 - dev: true - - /stoppable@1.1.0: - resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} - engines: {node: '>=4', npm: '>=6'} - dev: true - - /streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} - dev: true - - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - dependencies: - safe-buffer: 5.2.1 - - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - - /strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - - /tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.0 - tar-stream: 2.2.0 - - /tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - 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 - - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - - /timers-ext@0.1.7: - resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==} - dependencies: - es5-ext: 0.10.62 - next-tick: 1.1.0 - dev: true - - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - dev: false - - /ts-api-utils@1.0.2(typescript@5.2.2): - resolution: {integrity: sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==} - engines: {node: '>=16.13.0'} - peerDependencies: - typescript: '>=4.2.0' - dependencies: - typescript: 5.2.2 - dev: false - - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - dev: true - - /tsx@3.12.8: - resolution: {integrity: sha512-Lt9KYaRGF023tlLInPj8rgHwsZU8qWLBj4iRXNWxTfjIkU7canGL806AqKear1j722plHuiYNcL2ZCo6uS9UJA==} - hasBin: true - dependencies: - '@esbuild-kit/cjs-loader': 2.4.2 - '@esbuild-kit/core-utils': 3.2.2 - '@esbuild-kit/esm-loader': 2.5.5 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - dependencies: - safe-buffer: 5.2.1 - - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - - /type-fest@3.13.0: - resolution: {integrity: sha512-Gur3yQGM9qiLNs0KPP7LPgeRbio2QTt4xXouobMCarR0/wyW3F+F/+OWwshg3NG0Adon7uQfSZBpB46NfhoF1A==} - engines: {node: '>=14.16'} - 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 - - /typescript@5.2.2: - resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} - engines: {node: '>=14.17'} - hasBin: true - - /undici@5.23.0: - resolution: {integrity: sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==} - engines: {node: '>=14.0'} - dependencies: - busboy: 1.6.0 - dev: true - - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - dependencies: - punycode: 2.3.0 - - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - - /vscode-json-languageservice@4.2.1: - resolution: {integrity: sha512-xGmv9QIWs2H8obGbWg+sIPI/3/pFgj/5OWBhNzs00BkYQ9UaB2F6JJaGB/2/YOZJ3BvLXQTC4Q7muqU25QgAhA==} - dependencies: - jsonc-parser: 3.2.0 - vscode-languageserver-textdocument: 1.0.8 - vscode-languageserver-types: 3.17.3 - vscode-nls: 5.2.0 - vscode-uri: 3.0.7 - dev: true - - /vscode-languageserver-textdocument@1.0.8: - resolution: {integrity: sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==} - dev: true - - /vscode-languageserver-types@3.17.3: - resolution: {integrity: sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA==} - dev: true - - /vscode-nls@5.2.0: - resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==} - dev: true - - /vscode-uri@3.0.7: - resolution: {integrity: sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==} - 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@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - - /wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - dev: true - - /workerd@1.20230904.0: - resolution: {integrity: sha512-t9znszH0rQGK4mJGvF9L3nN0qKEaObAGx0JkywFtAwH8OkSn+YfQbHNZE+YsJ4qa1hOz1DCNEk08UDFRBaYq4g==} - engines: {node: '>=16'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20230904.0 - '@cloudflare/workerd-darwin-arm64': 1.20230904.0 - '@cloudflare/workerd-linux-64': 1.20230904.0 - '@cloudflare/workerd-linux-arm64': 1.20230904.0 - '@cloudflare/workerd-windows-64': 1.20230904.0 - dev: true - - /wrangler@3.7.0: - resolution: {integrity: sha512-7823G5U7WwDIkqaZrxSh/BQ/pxA4WIX3R9GwYfh+MYJj+k5s56KGQ+K/NmY/JbgZsxVEHDjhoYzqDqJebQMZeg==} - engines: {node: '>=16.13.0'} - hasBin: true - 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.20230904.0 - nanoid: 3.3.6 - path-to-regexp: 6.2.1 - selfsigned: 2.1.1 - source-map: 0.7.4 - xxhash-wasm: 1.0.2 - optionalDependencies: - fsevents: 2.3.3 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - /ws@8.14.0: - resolution: {integrity: sha512-WR0RJE9Ehsio6U4TuM+LmunEsjQ5ncHlw4sn9ihD6RoJKZrVyH9FWV3dmnwu8B2aNib1OvG2X6adUCyFpQyWcg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: + + /@esbuild/win32-ia32@0.18.20: + resolution: + { + integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==, + } + engines: { node: ">=12" } + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true optional: true - utf-8-validate: + + /@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 - /xxhash-wasm@1.0.2: - resolution: {integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==} - dev: 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 - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + /@eslint-community/eslint-utils@4.4.0(eslint@8.49.0): + resolution: + { + integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.49.0 + eslint-visitor-keys: 3.4.3 + + /@eslint-community/regexpp@4.8.0: + resolution: + { + integrity: sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==, + } + engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } + + /@eslint/eslintrc@2.1.2: + resolution: + { + integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.21.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + /@eslint/js@8.49.0: + resolution: + { + integrity: sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + + /@humanwhocodes/config-array@0.11.11: + resolution: + { + integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==, + } + engines: { node: ">=10.10.0" } + dependencies: + "@humanwhocodes/object-schema": 1.2.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + /@humanwhocodes/module-importer@1.0.1: + resolution: + { + integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, + } + engines: { node: ">=12.22" } + + /@humanwhocodes/object-schema@1.2.1: + resolution: + { + integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==, + } + + /@libsql/client@0.3.3-pre.2: + resolution: + { + integrity: sha512-cAQNEBYZ+rXAUtrIYn8gA6iUBXwrd2qRI60T9WgYNv4ePieB/nB9IF6kIJefdeFOnS5YCS9+YeiBfbTVlq0PAg==, + } + dependencies: + "@libsql/hrana-client": 0.5.0 + js-base64: 3.7.5 + libsql: 0.1.4 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: false + + /@libsql/darwin-arm64@0.1.4: + resolution: + { + integrity: sha512-8ttRMJJ5Ep8mmn/mSc8mapoLwGvb2XHaQlaA7Fn8OpVQ38ZnArYx6t26B8G5UAFW9uvytitVnW4EJD6IjtvYRg==, + } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} + /@libsql/hrana-client@0.5.0: + resolution: + { + integrity: sha512-o9yXH+9XBPnMSrBkY17q2xknfNXJaCHQv4rFJikt1g8M0d80hwp4ZZ1jHwacuL61wRa4j6qKMFqh9ti+CoTH1A==, + } + dependencies: + "@libsql/isomorphic-fetch": 0.1.6 + "@libsql/isomorphic-ws": 0.1.3 + js-base64: 3.7.5 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: false + + /@libsql/isomorphic-fetch@0.1.6: + resolution: + { + integrity: sha512-8qhxEDmVBDb54E9xdW1xqw3zLNShkMZpf5YQU3PvwjtKNLOPde59Oqez+RnZHsYkt9zQxxOF+7gSHVJeP/UWqg==, + } + dependencies: + "@types/node-fetch": 2.6.4 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: false + + /@libsql/isomorphic-ws@0.1.3: + resolution: + { + integrity: sha512-54dZXgYwWDKsnfWv8GCVYvhn6RDlqFDGAc8EQMd941yvGMsGzo06Gn6Iyjw//nJ1iJO97FbXgoQ1apikoFD/WA==, + } + dependencies: + "@types/ws": 8.5.5 + ws: 8.14.1 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /@libsql/linux-x64-gnu@0.1.4: + resolution: + { + integrity: sha512-hv75P5I3cV+rAJkizJsKC32oi0U0uzZOrLMbo+vzfNV95euUUZ+Y6Mc/51+NzXRte98xNbrFW2knSJzW2/MxmA==, + } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true - /youch@3.3.1: - resolution: {integrity: sha512-Rg9ioi+AkKyje2Hk4qILSVvayaFW98KTsOJ4aIkjDf97LZX5WJVIHZmFLnM4ThcVofHo/fbbwtYajfBPHFOVtg==} - dependencies: - cookie: 0.5.0 - mustache: 4.2.0 - stacktracey: 2.1.8 - dev: true + /@lucia-auth/adapter-sqlite@2.0.0(@libsql/client@0.3.3-pre.2)(lucia@2.5.0): + resolution: + { + integrity: sha512-Hiy8WND/1mi25r0M2ruSml+Ab5GJLr4XZEHApYw1lxybF+VlPUyX7oTtIVCSgvq/SWiP/tvnyPwnXAPmNr8/bg==, + } + peerDependencies: + "@libsql/client": ^0.3.0 + better-sqlite3: ^8.0.0 + lucia: ^2.0.0 + peerDependenciesMeta: + "@libsql/client": + optional: true + better-sqlite3: + optional: true + dependencies: + "@libsql/client": 0.3.3-pre.2 + lucia: 2.5.0 + dev: false + + /@neon-rs/load@0.0.4: + resolution: + { + integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==, + } + dev: false + + /@nodelib/fs.scandir@2.1.5: + resolution: + { + integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, + } + engines: { node: ">= 8" } + dependencies: + "@nodelib/fs.stat": 2.0.5 + run-parallel: 1.2.0 + + /@nodelib/fs.stat@2.0.5: + resolution: + { + integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, + } + engines: { node: ">= 8" } + + /@nodelib/fs.walk@1.2.8: + resolution: + { + integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, + } + engines: { node: ">= 8" } + dependencies: + "@nodelib/fs.scandir": 2.1.5 + fastq: 1.15.0 + + /@one-ini/wasm@0.1.1: + resolution: + { + integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==, + } + dev: false + + /@react-email/render@0.0.7: + resolution: + { + integrity: sha512-hMMhxk6TpOcDC5qnKzXPVJoVGEwfm+U5bGOPH+MyTTlx0F02RLQygcATBKsbP7aI/mvkmBAZoFbgPIHop7ovug==, + } + engines: { node: ">=16.0.0" } + dependencies: + html-to-text: 9.0.3 + pretty: 2.0.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@selderee/plugin-htmlparser2@0.10.0: + resolution: + { + integrity: sha512-gW69MEamZ4wk1OsOq1nG1jcyhXIQcnrsX5JwixVw/9xaiav8TCyjESAruu1Rz9yyInhgBXxkNwMeygKnN2uxNA==, + } + dependencies: + domhandler: 5.0.3 + selderee: 0.10.0 + dev: false + + /@types/json-schema@7.0.12: + resolution: + { + integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==, + } + dev: false + + /@types/node-fetch@2.6.4: + resolution: + { + integrity: sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==, + } + dependencies: + "@types/node": 20.6.0 + form-data: 3.0.1 + dev: false + + /@types/node@20.6.0: + resolution: + { + integrity: sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==, + } + + /@types/semver@7.5.1: + resolution: + { + integrity: sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==, + } + dev: false + + /@types/ws@8.5.5: + resolution: + { + integrity: sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==, + } + dependencies: + "@types/node": 20.6.0 + dev: false + + /@typescript-eslint/eslint-plugin@6.6.0(@typescript-eslint/parser@6.6.0)(eslint@8.49.0)(typescript@5.2.2): + resolution: + { + integrity: sha512-CW9YDGTQnNYMIo5lMeuiIG08p4E0cXrXTbcZ2saT/ETE7dWUrNxlijsQeU04qAAKkILiLzdQz+cGFxCJjaZUmA==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@eslint-community/regexpp": 4.8.0 + "@typescript-eslint/parser": 6.6.0(eslint@8.49.0)(typescript@5.2.2) + "@typescript-eslint/scope-manager": 6.6.0 + "@typescript-eslint/type-utils": 6.6.0(eslint@8.49.0)(typescript@5.2.2) + "@typescript-eslint/utils": 6.6.0(eslint@8.49.0)(typescript@5.2.2) + "@typescript-eslint/visitor-keys": 6.6.0 + debug: 4.3.4 + eslint: 8.49.0 + graphemer: 1.4.0 + ignore: 5.2.4 + natural-compare: 1.4.0 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/parser@6.6.0(eslint@8.49.0)(typescript@5.2.2): + resolution: + { + integrity: sha512-setq5aJgUwtzGrhW177/i+DMLqBaJbdwGj2CPIVFFLE0NCliy5ujIdLHd2D1ysmlmsjdL2GWW+hR85neEfc12w==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@typescript-eslint/scope-manager": 6.6.0 + "@typescript-eslint/types": 6.6.0 + "@typescript-eslint/typescript-estree": 6.6.0(typescript@5.2.2) + "@typescript-eslint/visitor-keys": 6.6.0 + debug: 4.3.4 + eslint: 8.49.0 + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/scope-manager@6.6.0: + resolution: + { + integrity: sha512-pT08u5W/GT4KjPUmEtc2kSYvrH8x89cVzkA0Sy2aaOUIw6YxOIjA8ilwLr/1fLjOedX1QAuBpG9XggWqIIfERw==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + dependencies: + "@typescript-eslint/types": 6.6.0 + "@typescript-eslint/visitor-keys": 6.6.0 + dev: false + + /@typescript-eslint/type-utils@6.6.0(eslint@8.49.0)(typescript@5.2.2): + resolution: + { + integrity: sha512-8m16fwAcEnQc69IpeDyokNO+D5spo0w1jepWWY2Q6y5ZKNuj5EhVQXjtVAeDDqvW6Yg7dhclbsz6rTtOvcwpHg==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@typescript-eslint/typescript-estree": 6.6.0(typescript@5.2.2) + "@typescript-eslint/utils": 6.6.0(eslint@8.49.0)(typescript@5.2.2) + debug: 4.3.4 + eslint: 8.49.0 + ts-api-utils: 1.0.3(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/types@6.6.0: + resolution: + { + integrity: sha512-CB6QpJQ6BAHlJXdwUmiaXDBmTqIE2bzGTDLADgvqtHWuhfNP3rAOK7kAgRMAET5rDRr9Utt+qAzRBdu3AhR3sg==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + dev: false + + /@typescript-eslint/typescript-estree@6.6.0(typescript@5.2.2): + resolution: + { + integrity: sha512-hMcTQ6Al8MP2E6JKBAaSxSVw5bDhdmbCEhGW/V8QXkb9oNsFkA4SBuOMYVPxD3jbtQ4R/vSODBsr76R6fP3tbA==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@typescript-eslint/types": 6.6.0 + "@typescript-eslint/visitor-keys": 6.6.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/utils@6.6.0(eslint@8.49.0)(typescript@5.2.2): + resolution: + { + integrity: sha512-mPHFoNa2bPIWWglWYdR0QfY9GN0CfvvXX1Sv6DlSTive3jlMTUy+an67//Gysc+0Me9pjitrq0LJp0nGtLgftw==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + "@eslint-community/eslint-utils": 4.4.0(eslint@8.49.0) + "@types/json-schema": 7.0.12 + "@types/semver": 7.5.1 + "@typescript-eslint/scope-manager": 6.6.0 + "@typescript-eslint/types": 6.6.0 + "@typescript-eslint/typescript-estree": 6.6.0(typescript@5.2.2) + eslint: 8.49.0 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: false + + /@typescript-eslint/visitor-keys@6.6.0: + resolution: + { + integrity: sha512-L61uJT26cMOfFQ+lMZKoJNbAEckLe539VhTxiGHrWl5XSKQgA0RTBZJW2HFPy5T0ZvPVSD93QsrTKDkfNwJGyQ==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + dependencies: + "@typescript-eslint/types": 6.6.0 + eslint-visitor-keys: 3.4.3 + dev: false + + /abbrev@1.1.1: + resolution: + { + integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==, + } + dev: false + + /acorn-jsx@5.3.2(acorn@8.10.0): + resolution: + { + integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, + } + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.10.0 + + /acorn-walk@8.2.0: + resolution: + { + integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==, + } + engines: { node: ">=0.4.0" } + dev: true + + /acorn@8.10.0: + resolution: + { + integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==, + } + engines: { node: ">=0.4.0" } + hasBin: true + + /ajv@6.12.6: + resolution: + { + integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, + } + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + /ansi-regex@5.0.1: + resolution: + { + integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, + } + engines: { node: ">=8" } + + /ansi-styles@4.3.0: + resolution: + { + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, + } + engines: { node: ">=8" } + dependencies: + color-convert: 2.0.1 + + /anymatch@3.1.3: + resolution: + { + integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, + } + engines: { node: ">= 8" } + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /argparse@2.0.1: + resolution: + { + integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, + } + + /array-union@2.1.0: + resolution: + { + integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, + } + engines: { node: ">=8" } + dev: false + + /as-table@1.0.55: + resolution: + { + integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==, + } + dependencies: + printable-characters: 1.0.42 + dev: true + + /asynckit@0.4.0: + resolution: + { + integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, + } + dev: false + + /balanced-match@1.0.2: + resolution: + { + integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, + } + + /base64-js@1.5.1: + resolution: + { + integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, + } + dev: true + + /better-sqlite3@8.6.0: + resolution: + { + integrity: sha512-jwAudeiTMTSyby+/SfbHDebShbmC2MCH8mU2+DXi0WJfv13ypEJm47cd3kljmy/H130CazEvkf2Li//ewcMJ1g==, + } + requiresBuild: true + dependencies: + bindings: 1.5.0 + prebuild-install: 7.1.1 + dev: true + + /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: true + + /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: true + + /blake3-wasm@2.1.5: + resolution: + { + integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==, + } + dev: true + + /brace-expansion@1.1.11: + resolution: + { + integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, + } + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /brace-expansion@2.0.1: + resolution: + { + integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, + } + dependencies: + balanced-match: 1.0.2 + + /braces@3.0.2: + resolution: + { + integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==, + } + engines: { node: ">=8" } + dependencies: + fill-range: 7.0.1 + + /buffer-from@1.1.2: + resolution: + { + integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, + } + dev: true + + /buffer@5.7.1: + resolution: + { + integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, + } + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + + /busboy@1.6.0: + resolution: + { + integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==, + } + engines: { node: ">=10.16.0" } + dependencies: + streamsearch: 1.1.0 + dev: true + + /callsites@3.1.0: + resolution: + { + integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, + } + engines: { node: ">=6" } + + /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@4.1.2: + resolution: + { + integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, + } + engines: { node: ">=10" } + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /chalk@5.3.0: + resolution: + { + integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==, + } + engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } + dev: true + + /chokidar@3.5.3: + resolution: + { + integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, + } + engines: { node: ">= 8.10.0" } + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /chownr@1.1.4: + resolution: + { + integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==, + } + dev: true + + /cli-color@2.0.3: + resolution: + { + integrity: sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==, + } + engines: { node: ">=0.10" } + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-iterator: 2.0.3 + memoizee: 0.4.15 + timers-ext: 0.1.7 + dev: true + + /color-convert@2.0.1: + resolution: + { + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, + } + engines: { node: ">=7.0.0" } + dependencies: + color-name: 1.1.4 + + /color-name@1.1.4: + resolution: + { + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, + } + + /combined-stream@1.0.8: + resolution: + { + integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, + } + engines: { node: ">= 0.8" } + dependencies: + delayed-stream: 1.0.0 + dev: false + + /commander@10.0.1: + resolution: + { + integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==, + } + engines: { node: ">=14" } + dev: false + + /commander@9.5.0: + resolution: + { + integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==, + } + engines: { node: ^12.20.0 || >=14 } + dev: true + + /concat-map@0.0.1: + resolution: + { + integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, + } + + /condense-newlines@0.2.1: + resolution: + { + integrity: sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==, + } + engines: { node: ">=0.10.0" } + dependencies: + extend-shallow: 2.0.1 + is-whitespace: 0.3.0 + kind-of: 3.2.2 + dev: false + + /config-chain@1.1.13: + resolution: + { + integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==, + } + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + dev: false + + /cookie@0.5.0: + resolution: + { + integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==, + } + engines: { node: ">= 0.6" } + dev: true + + /cross-spawn@7.0.3: + resolution: + { + integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, + } + engines: { node: ">= 8" } + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + /d@1.0.1: + resolution: + { + integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==, + } + 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 + + /debug@4.3.4: + resolution: + { + integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, + } + engines: { node: ">=6.0" } + peerDependencies: + supports-color: "*" + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /decompress-response@6.0.0: + resolution: + { + integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==, + } + engines: { node: ">=10" } + dependencies: + mimic-response: 3.1.0 + dev: true + + /deep-extend@0.6.0: + resolution: + { + integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==, + } + engines: { node: ">=4.0.0" } + dev: true + + /deep-is@0.1.4: + resolution: + { + integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, + } + + /deepmerge@4.3.1: + resolution: + { + integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==, + } + engines: { node: ">=0.10.0" } + dev: false + + /delayed-stream@1.0.0: + resolution: + { + integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, + } + engines: { node: ">=0.4.0" } + dev: false + + /denque@2.1.0: + resolution: + { + integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==, + } + engines: { node: ">=0.10" } + dev: false + + /detect-libc@2.0.2: + resolution: + { + integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==, + } + engines: { node: ">=8" } + dev: true + + /difflib@0.2.4: + resolution: + { + integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==, + } + dependencies: + heap: 0.2.7 + dev: true + + /dir-glob@3.0.1: + resolution: + { + integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, + } + engines: { node: ">=8" } + dependencies: + path-type: 4.0.0 + dev: false + + /doctrine@3.0.0: + resolution: + { + integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==, + } + engines: { node: ">=6.0.0" } + dependencies: + esutils: 2.0.3 + + /dom-serializer@2.0.0: + resolution: + { + integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==, + } + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + dev: false + + /domelementtype@2.3.0: + resolution: + { + integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==, + } + dev: false + + /domhandler@5.0.3: + resolution: + { + integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==, + } + engines: { node: ">= 4" } + dependencies: + domelementtype: 2.3.0 + dev: false + + /domutils@3.1.0: + resolution: + { + integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==, + } + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dev: false + + /dotenv@16.3.1: + resolution: + { + integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==, + } + engines: { node: ">=12" } + dev: true + + /dreamopt@0.8.0: + resolution: + { + integrity: sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==, + } + engines: { node: ">=0.4.0" } + dependencies: + wordwrap: 1.0.0 + dev: true + + /drizzle-kit@0.19.13: + resolution: + { + integrity: sha512-Rba5VW1O2JfJlwVBeZ8Zwt2E2us5oZ08PQBDiVSGlug53TOc8hzXjblZFuF+dnll9/RQEHrkzBmJFgqTvn5Rxg==, + } + hasBin: true + dependencies: + "@drizzle-team/studio": 0.0.5 + "@esbuild-kit/esm-loader": 2.5.5 + camelcase: 7.0.1 + chalk: 5.3.0 + commander: 9.5.0 + esbuild: 0.18.20 + esbuild-register: 3.4.2(esbuild@0.18.20) + glob: 8.1.0 + hanji: 0.0.5 + json-diff: 0.9.0 + minimatch: 7.4.6 + zod: 3.22.2 + transitivePeerDependencies: + - supports-color + dev: true + + /drizzle-orm@0.28.6(@cloudflare/workers-types@4.20230904.0)(@libsql/client@0.3.3-pre.2)(mysql2@3.6.1): + resolution: + { + integrity: sha512-yBe+F9htrlYER7uXgDJUQsTHFoIrI5yMm5A0bg0GiZ/kY5jNXTWoEy4KQtg35cE27sw1VbgzoMWHAgCckUUUww==, + } + 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: + "@cloudflare/workers-types": 4.20230904.0 + "@libsql/client": 0.3.3-pre.2 + mysql2: 3.6.1 + dev: false + + /editorconfig@1.0.4: + resolution: + { + integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==, + } + engines: { node: ">=14" } + hasBin: true + dependencies: + "@one-ini/wasm": 0.1.1 + commander: 10.0.1 + minimatch: 9.0.1 + semver: 7.5.4 + dev: false + + /end-of-stream@1.4.4: + resolution: + { + integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, + } + dependencies: + once: 1.4.0 + dev: true + + /entities@4.5.0: + resolution: + { + integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==, + } + engines: { node: ">=0.12" } + dev: false + + /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.4.2(esbuild@0.18.20): + resolution: + { + integrity: sha512-kG/XyTDyz6+YDuyfB9ZoSIOOmgyFCH+xPRtsCa8W85HLRV5Csp+o3jWVbOSHgSLfyLc5DmP+KFDNwty4mEjC+Q==, + } + 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 + + /escape-string-regexp@4.0.0: + resolution: + { + integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, + } + engines: { node: ">=10" } + + /eslint-config-google@0.14.0(eslint@8.49.0): + resolution: + { + integrity: sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==, + } + engines: { node: ">=0.10.0" } + peerDependencies: + eslint: ">=5.16.0" + dependencies: + eslint: 8.49.0 + dev: true + + /eslint-plugin-json@3.1.0: + resolution: + { + integrity: sha512-MrlG2ynFEHe7wDGwbUuFPsaT2b1uhuEFhJ+W1f1u+1C2EkXmTYJp4B1aAdQQ8M+CC3t//N/oRKiIVw14L2HR1g==, + } + engines: { node: ">=12.0" } + dependencies: + lodash: 4.17.21 + vscode-json-languageservice: 4.2.1 + dev: true + + /eslint-scope@7.2.2: + resolution: + { + integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + /eslint-visitor-keys@3.4.3: + resolution: + { + integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + + /eslint@8.49.0: + resolution: + { + integrity: sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + hasBin: true + dependencies: + "@eslint-community/eslint-utils": 4.4.0(eslint@8.49.0) + "@eslint-community/regexpp": 4.8.0 + "@eslint/eslintrc": 2.1.2 + "@eslint/js": 8.49.0 + "@humanwhocodes/config-array": 0.11.11 + "@humanwhocodes/module-importer": 1.0.1 + "@nodelib/fs.walk": 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.21.0 + graphemer: 1.4.0 + ignore: 5.2.4 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + /espree@9.6.1: + resolution: + { + integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + acorn: 8.10.0 + acorn-jsx: 5.3.2(acorn@8.10.0) + eslint-visitor-keys: 3.4.3 + + /esquery@1.5.0: + resolution: + { + integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==, + } + engines: { node: ">=0.10" } + dependencies: + estraverse: 5.3.0 + + /esrecurse@4.3.0: + resolution: + { + integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, + } + engines: { node: ">=4.0" } + dependencies: + estraverse: 5.3.0 + + /estraverse@5.3.0: + resolution: + { + integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, + } + engines: { node: ">=4.0" } + + /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" } + + /event-emitter@0.3.5: + resolution: + { + integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==, + } + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + dev: true + + /exit-hook@2.2.1: + resolution: + { + integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==, + } + engines: { node: ">=6" } + dev: true + + /expand-template@2.0.3: + resolution: + { + integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==, + } + engines: { node: ">=6" } + dev: true + + /ext@1.7.0: + resolution: + { + integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==, + } + dependencies: + type: 2.7.2 + dev: true + + /extend-shallow@2.0.1: + resolution: + { + integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==, + } + engines: { node: ">=0.10.0" } + dependencies: + is-extendable: 0.1.1 + dev: false + + /fast-deep-equal@3.1.3: + resolution: + { + integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, + } + + /fast-glob@3.3.1: + resolution: + { + integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==, + } + engines: { node: ">=8.6.0" } + dependencies: + "@nodelib/fs.stat": 2.0.5 + "@nodelib/fs.walk": 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: false + + /fast-json-stable-stringify@2.1.0: + resolution: + { + integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, + } + + /fast-levenshtein@2.0.6: + resolution: + { + integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, + } + + /fastq@1.15.0: + resolution: + { + integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==, + } + dependencies: + reusify: 1.0.4 + + /file-entry-cache@6.0.1: + resolution: + { + integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==, + } + engines: { node: ^10.12.0 || >=12.0.0 } + dependencies: + flat-cache: 3.1.0 + + /file-uri-to-path@1.0.0: + resolution: + { + integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==, + } + dev: true + + /fill-range@7.0.1: + resolution: + { + integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==, + } + engines: { node: ">=8" } + dependencies: + to-regex-range: 5.0.1 + + /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 + + /flat-cache@3.1.0: + resolution: + { + integrity: sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==, + } + engines: { node: ">=12.0.0" } + dependencies: + flatted: 3.2.7 + keyv: 4.5.3 + rimraf: 3.0.2 + + /flatted@3.2.7: + resolution: + { + integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==, + } + + /form-data@3.0.1: + resolution: + { + integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==, + } + engines: { node: ">= 6" } + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + + /fs-constants@1.0.0: + resolution: + { + integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==, + } + dev: true + + /fs.realpath@1.0.0: + resolution: + { + integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, + } + + /fsevents@2.3.3: + resolution: + { + integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, + } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + os: [darwin] + requiresBuild: true + dev: true + optional: true - /zod@3.22.2: - resolution: {integrity: sha512-wvWkphh5WQsJbVk1tbx1l1Ly4yg+XecD+Mq280uBGt9wa5BKSWf4Mhp6GmrkPixhMxmabYY7RbzlwVP32pbGCg==} - dev: true + /generate-function@2.3.1: + resolution: + { + integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==, + } + dependencies: + is-property: 1.0.2 + dev: false + + /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-tsconfig@4.7.0: + resolution: + { + integrity: sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw==, + } + dependencies: + resolve-pkg-maps: 1.0.0 + dev: true + + /github-from-package@0.0.0: + resolution: + { + integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==, + } + dev: true + + /glob-parent@5.1.2: + resolution: + { + integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, + } + engines: { node: ">= 6" } + dependencies: + is-glob: 4.0.3 + + /glob-parent@6.0.2: + resolution: + { + integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, + } + engines: { node: ">=10.13.0" } + dependencies: + is-glob: 4.0.3 + + /glob-to-regexp@0.4.1: + resolution: + { + integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==, + } + dev: true + + /glob@7.2.3: + resolution: + { + integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, + } + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /glob@8.1.0: + resolution: + { + integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==, + } + engines: { node: ">=12" } + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + + /globals@13.21.0: + resolution: + { + integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==, + } + engines: { node: ">=8" } + dependencies: + type-fest: 0.20.2 + + /globby@11.1.0: + resolution: + { + integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, + } + engines: { node: ">=10" } + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.1 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: false + + /graphemer@1.4.0: + resolution: + { + integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, + } + + /hanji@0.0.5: + resolution: + { + integrity: sha512-Abxw1Lq+TnYiL4BueXqMau222fPSPMFtya8HdpWsz/xVAhifXou71mPh/kY2+08RgFcVccjG3uZHs6K5HAe3zw==, + } + dependencies: + lodash.throttle: 4.1.1 + sisteransi: 1.0.5 + dev: true + + /has-flag@4.0.0: + resolution: + { + integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, + } + engines: { node: ">=8" } + + /heap@0.2.7: + resolution: + { + integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==, + } + dev: true + + /hono@3.5.8: + resolution: + { + integrity: sha512-ZipTmGfHm43q5QOEBGog2wyejyNUcicjPt0BLDQ8yz9xij/y9RYXRpR1YPxMpQqeyNM7isvpsIAe9Ems51Wq0Q==, + } + engines: { node: ">=16.0.0" } + dev: false + + /html-to-text@9.0.3: + resolution: + { + integrity: sha512-hxDF1kVCF2uw4VUJ3vr2doc91pXf2D5ngKcNviSitNkhP9OMOaJkDrFIFL6RMvko7NisWTEiqGpQ9LAxcVok1w==, + } + engines: { node: ">=14" } + dependencies: + "@selderee/plugin-htmlparser2": 0.10.0 + deepmerge: 4.3.1 + dom-serializer: 2.0.0 + htmlparser2: 8.0.2 + selderee: 0.10.0 + dev: false + + /htmlparser2@8.0.2: + resolution: + { + integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==, + } + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + entities: 4.5.0 + dev: false + + /http-cache-semantics@4.1.1: + resolution: + { + integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==, + } + dev: true + + /husky@8.0.3: + resolution: + { + integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==, + } + engines: { node: ">=14" } + hasBin: true + dev: true + + /iconv-lite@0.6.3: + resolution: + { + integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, + } + 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: true + + /ignore@5.2.4: + resolution: + { + integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==, + } + engines: { node: ">= 4" } + + /import-fresh@3.3.0: + resolution: + { + integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, + } + engines: { node: ">=6" } + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + /imurmurhash@0.1.4: + resolution: + { + integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, + } + engines: { node: ">=0.8.19" } + + /inflight@1.0.6: + resolution: + { + integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, + } + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits@2.0.4: + resolution: + { + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, + } + + /ini@1.3.8: + resolution: + { + integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, + } + + /is-binary-path@2.1.0: + resolution: + { + integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, + } + engines: { node: ">=8" } + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-buffer@1.1.6: + resolution: + { + integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==, + } + dev: false + + /is-extendable@0.1.1: + resolution: + { + integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==, + } + engines: { node: ">=0.10.0" } + dev: false + + /is-extglob@2.1.1: + resolution: + { + integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, + } + engines: { node: ">=0.10.0" } + + /is-glob@4.0.3: + resolution: + { + integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, + } + engines: { node: ">=0.10.0" } + dependencies: + is-extglob: 2.1.1 + + /is-number@7.0.0: + resolution: + { + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, + } + engines: { node: ">=0.12.0" } + + /is-path-inside@3.0.3: + resolution: + { + integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, + } + engines: { node: ">=8" } + + /is-promise@2.2.2: + resolution: + { + integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==, + } + dev: true + + /is-property@1.0.2: + resolution: + { + integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==, + } + dev: false + + /is-whitespace@0.3.0: + resolution: + { + integrity: sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==, + } + engines: { node: ">=0.10.0" } + dev: false + + /isexe@2.0.0: + resolution: + { + integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, + } + + /js-base64@3.7.5: + resolution: + { + integrity: sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==, + } + dev: false + + /js-beautify@1.14.9: + resolution: + { + integrity: sha512-coM7xq1syLcMyuVGyToxcj2AlzhkDjmfklL8r0JgJ7A76wyGMpJ1oA35mr4APdYNO/o/4YY8H54NQIJzhMbhBg==, + } + engines: { node: ">=12" } + hasBin: true + dependencies: + config-chain: 1.1.13 + editorconfig: 1.0.4 + glob: 8.1.0 + nopt: 6.0.0 + dev: false + + /js-tokens@4.0.0: + resolution: + { + integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, + } + dev: false + + /js-yaml@4.1.0: + resolution: + { + integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, + } + hasBin: true + dependencies: + argparse: 2.0.1 + + /json-buffer@3.0.1: + resolution: + { + integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, + } + + /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-schema-traverse@0.4.1: + resolution: + { + integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, + } + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: + { + integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, + } + + /jsonc-parser@3.2.0: + resolution: + { + integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==, + } + dev: true + + /keyv@4.5.3: + resolution: + { + integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==, + } + dependencies: + json-buffer: 3.0.1 + + /kind-of@3.2.2: + resolution: + { + integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==, + } + engines: { node: ">=0.10.0" } + dependencies: + is-buffer: 1.1.6 + dev: false + + /kleur@4.1.5: + resolution: + { + integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==, + } + engines: { node: ">=6" } + dev: true + + /leac@0.6.0: + resolution: + { + integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==, + } + dev: false + + /levn@0.4.1: + resolution: + { + integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, + } + engines: { node: ">= 0.8.0" } + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + /libsql@0.1.4: + resolution: + { + integrity: sha512-OTTdQWz4q7k7D2IAReMUuD2f8RvmSPaZ9r2g3lOOl9fNpovqqC0PJ5vwfNqwI2FMATjyc0eIvLEJORonf9uoLw==, + } + cpu: [x64, arm64] + os: [darwin, linux] + dependencies: + "@neon-rs/load": 0.0.4 + optionalDependencies: + "@libsql/darwin-arm64": 0.1.4 + "@libsql/linux-x64-gnu": 0.1.4 + dev: false + + /locate-path@6.0.0: + resolution: + { + integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, + } + engines: { node: ">=10" } + dependencies: + p-locate: 5.0.0 + + /lodash.merge@4.6.2: + resolution: + { + integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, + } + + /lodash.throttle@4.1.1: + resolution: + { + integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==, + } + dev: true + + /lodash@4.17.21: + resolution: + { + integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, + } + dev: true + + /long@5.2.3: + resolution: + { + integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==, + } + dev: false + + /loose-envify@1.4.0: + resolution: + { + integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==, + } + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: false + + /lru-cache@6.0.0: + resolution: + { + integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, + } + engines: { node: ">=10" } + dependencies: + yallist: 4.0.0 + + /lru-cache@7.18.3: + resolution: + { + integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==, + } + engines: { node: ">=12" } + dev: false + + /lru-cache@8.0.5: + resolution: + { + integrity: sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==, + } + engines: { node: ">=16.14" } + dev: false + + /lru-queue@0.1.0: + resolution: + { + integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==, + } + dependencies: + es5-ext: 0.10.62 + dev: true + + /lucia@2.5.0: + resolution: + { + integrity: sha512-eUUtf4gBsT1vLF1UEkZly3Sh620N4P0TcGzeDMviFqF0qULB7XOgC9GMmobK3y9L/cEfoD8YHNxfIN/AzSXQsg==, + } + dev: false + + /magic-string@0.25.9: + resolution: + { + integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==, + } + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /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 + + /merge2@1.4.1: + resolution: + { + integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, + } + engines: { node: ">= 8" } + dev: false + + /micromatch@4.0.5: + resolution: + { + integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, + } + engines: { node: ">=8.6" } + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: false + + /mime-db@1.52.0: + resolution: + { + integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, + } + engines: { node: ">= 0.6" } + dev: false + + /mime-types@2.1.35: + resolution: + { + integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, + } + engines: { node: ">= 0.6" } + dependencies: + mime-db: 1.52.0 + dev: false + + /mime@3.0.0: + resolution: + { + integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==, + } + engines: { node: ">=10.0.0" } + hasBin: true + dev: true + + /mimic-response@3.1.0: + resolution: + { + integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==, + } + engines: { node: ">=10" } + dev: true + + /miniflare@3.20230904.0: + resolution: + { + integrity: sha512-+OWQqEk8hV7vZaPCoj5dk1lZr4YUy56OiyNZ45/3ITYf+ZxgQOBPWhQhpw1jCahkRKGPa9Aykz01sc+GhPZYDA==, + } + engines: { node: ">=16.13" } + dependencies: + acorn: 8.10.0 + acorn-walk: 8.2.0 + better-sqlite3: 8.6.0 + capnp-ts: 0.7.0 + exit-hook: 2.2.1 + glob-to-regexp: 0.4.1 + http-cache-semantics: 4.1.1 + kleur: 4.1.5 + source-map-support: 0.5.21 + stoppable: 1.1.0 + undici: 5.24.0 + workerd: 1.20230904.0 + ws: 8.14.1 + youch: 3.3.1 + zod: 3.22.2 + 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 + + /minimatch@5.1.6: + resolution: + { + integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==, + } + engines: { node: ">=10" } + dependencies: + brace-expansion: 2.0.1 + + /minimatch@7.4.6: + resolution: + { + integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==, + } + engines: { node: ">=10" } + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimatch@9.0.1: + resolution: + { + integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==, + } + engines: { node: ">=16 || 14 >=14.17" } + dependencies: + brace-expansion: 2.0.1 + dev: false + + /minimist@1.2.8: + resolution: + { + integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, + } + dev: true + + /mkdirp-classic@0.5.3: + resolution: + { + integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==, + } + dev: true + + /ms@2.1.2: + resolution: + { + integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, + } + + /mustache@4.2.0: + resolution: + { + integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==, + } + hasBin: true + dev: true + + /mysql2@3.6.1: + resolution: + { + integrity: sha512-O7FXjLtNkjcMBpLURwkXIhyVbX9i4lq4nNRCykPNOXfceq94kJ0miagmTEGCZieuO8JtwtXaZ41U6KT4eF9y3g==, + } + engines: { node: ">= 8.0" } + dependencies: + denque: 2.1.0 + generate-function: 2.3.1 + iconv-lite: 0.6.3 + long: 5.2.3 + lru-cache: 8.0.5 + named-placeholders: 1.1.3 + seq-queue: 0.0.5 + sqlstring: 2.3.3 + dev: false + + /named-placeholders@1.1.3: + resolution: + { + integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==, + } + engines: { node: ">=12.0.0" } + dependencies: + lru-cache: 7.18.3 + dev: false + + /nanoid@3.3.6: + resolution: + { + integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==, + } + 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==, + } + dev: true + + /natural-compare@1.4.0: + resolution: + { + integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, + } + + /next-tick@1.1.0: + resolution: + { + integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==, + } + dev: true + + /node-abi@3.47.0: + resolution: + { + integrity: sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==, + } + engines: { node: ">=10" } + dependencies: + semver: 7.5.4 + dev: true + + /node-fetch@2.6.12: + resolution: + { + integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==, + } + 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-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-forge@1.3.1: + resolution: + { + integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==, + } + engines: { node: ">= 6.13.0" } + dev: true + + /nopt@6.0.0: + resolution: + { + integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: false + + /normalize-path@3.0.0: + resolution: + { + integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, + } + engines: { node: ">=0.10.0" } + dev: true + + /once@1.4.0: + resolution: + { + integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, + } + dependencies: + wrappy: 1.0.2 + + /optionator@0.9.3: + resolution: + { + integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==, + } + engines: { node: ">= 0.8.0" } + dependencies: + "@aashutoshrathi/word-wrap": 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + + /p-limit@3.1.0: + resolution: + { + integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, + } + engines: { node: ">=10" } + dependencies: + yocto-queue: 0.1.0 + + /p-locate@5.0.0: + resolution: + { + integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, + } + engines: { node: ">=10" } + dependencies: + p-limit: 3.1.0 + + /parent-module@1.0.1: + resolution: + { + integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, + } + engines: { node: ">=6" } + dependencies: + callsites: 3.1.0 + + /parseley@0.11.0: + resolution: + { + integrity: sha512-VfcwXlBWgTF+unPcr7yu3HSSA6QUdDaDnrHcytVfj5Z8azAyKBDrYnSIfeSxlrEayndNcLmrXzg+Vxbo6DWRXQ==, + } + dependencies: + leac: 0.6.0 + peberminta: 0.8.0 + dev: false + + /path-exists@4.0.0: + resolution: + { + integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, + } + engines: { node: ">=8" } + + /path-is-absolute@1.0.1: + resolution: + { + integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, + } + engines: { node: ">=0.10.0" } + + /path-key@3.1.1: + resolution: + { + integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, + } + engines: { node: ">=8" } + + /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" } + dev: false + + /peberminta@0.8.0: + resolution: + { + integrity: sha512-YYEs+eauIjDH5nUEGi18EohWE0nV2QbGTqmxQcqgZ/0g+laPCQmuIqq7EBLVi9uim9zMgfJv0QBZEnQ3uHw/Tw==, + } + dev: false + + /picomatch@2.3.1: + resolution: + { + integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, + } + engines: { node: ">=8.6" } + + /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.47.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: true + + /prelude-ls@1.2.1: + resolution: + { + integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, + } + engines: { node: ">= 0.8.0" } + + /prettier@3.0.3: + resolution: + { + integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==, + } + engines: { node: ">=14" } + hasBin: true + dev: false + + /pretty@2.0.0: + resolution: + { + integrity: sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==, + } + engines: { node: ">=0.10.0" } + dependencies: + condense-newlines: 0.2.1 + extend-shallow: 2.0.1 + js-beautify: 1.14.9 + dev: false + + /printable-characters@1.0.42: + resolution: + { + integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==, + } + dev: true + + /proto-list@1.2.4: + resolution: + { + integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==, + } + 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: true + + /punycode@2.3.0: + resolution: + { + integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==, + } + engines: { node: ">=6" } + + /queue-microtask@1.2.3: + resolution: + { + integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, + } + + /rc@1.2.8: + resolution: + { + integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==, + } + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: true + + /react-dom@18.2.0(react@18.2.0): + resolution: + { + integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==, + } + peerDependencies: + react: ^18.2.0 + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + dev: false + + /react@18.2.0: + resolution: + { + integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==, + } + engines: { node: ">=0.10.0" } + dependencies: + loose-envify: 1.4.0 + dev: false + + /readable-stream@3.6.2: + resolution: + { + integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, + } + engines: { node: ">= 6" } + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: true + + /readdirp@3.6.0: + resolution: + { + integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, + } + engines: { node: ">=8.10.0" } + dependencies: + picomatch: 2.3.1 + dev: true + + /resend@1.0.0: + resolution: + { + integrity: sha512-8LEE4gncmcm8bsvxvahZFpFk5hxUrKdagqWoX/MRXVU2YZ9coYxqZDeDYXG9pexz1A694bjE1hiQbBAA+bHAow==, + } + engines: { node: ">=16" } + dependencies: + "@react-email/render": 0.0.7 + node-fetch: 2.6.12 + type-fest: 3.13.0 + transitivePeerDependencies: + - encoding + dev: false + + /resolve-from@4.0.0: + resolution: + { + integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, + } + engines: { node: ">=4" } + + /resolve-pkg-maps@1.0.0: + resolution: + { + integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==, + } + dev: true + + /reusify@1.0.4: + resolution: + { + integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, + } + engines: { iojs: ">=1.0.0", node: ">=0.10.0" } + + /rimraf@3.0.2: + resolution: + { + integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, + } + hasBin: true + dependencies: + glob: 7.2.3 + + /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. + 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 + dev: true + + /run-parallel@1.2.0: + resolution: + { + integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, + } + dependencies: + queue-microtask: 1.2.3 + + /safe-buffer@5.2.1: + resolution: + { + integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, + } + dev: true + + /safer-buffer@2.1.2: + resolution: + { + integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, + } + dev: false + + /scheduler@0.23.0: + resolution: + { + integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==, + } + dependencies: + loose-envify: 1.4.0 + dev: false + + /selderee@0.10.0: + resolution: + { + integrity: sha512-DEL/RW/f4qLw/NrVg97xKaEBC8IpzIG2fvxnzCp3Z4yk4jQ3MXom+Imav9wApjxX2dfS3eW7x0DXafJr85i39A==, + } + dependencies: + parseley: 0.11.0 + dev: false + + /selfsigned@2.1.1: + resolution: + { + integrity: sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==, + } + engines: { node: ">=10" } + dependencies: + node-forge: 1.3.1 + dev: true + + /semver@7.5.4: + resolution: + { + integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==, + } + engines: { node: ">=10" } + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /seq-queue@0.0.5: + resolution: + { + integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==, + } + dev: false + + /shebang-command@2.0.0: + resolution: + { + integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, + } + engines: { node: ">=8" } + dependencies: + shebang-regex: 3.0.0 + + /shebang-regex@3.0.0: + resolution: + { + integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, + } + engines: { node: ">=8" } + + /simple-concat@1.0.1: + resolution: + { + integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==, + } + dev: true + + /simple-get@4.0.1: + resolution: + { + integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==, + } + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: true + + /sisteransi@1.0.5: + resolution: + { + integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==, + } + dev: true + + /slash@3.0.0: + resolution: + { + integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==, + } + engines: { node: ">=8" } + dev: false + + /source-map-support@0.5.21: + resolution: + { + integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, + } + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map@0.6.1: + resolution: + { + integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, + } + engines: { node: ">=0.10.0" } + dev: true + + /source-map@0.7.4: + resolution: + { + integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==, + } + engines: { node: ">= 8" } + dev: true + + /sourcemap-codec@1.4.8: + resolution: + { + integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==, + } + deprecated: Please use @jridgewell/sourcemap-codec instead + dev: true + + /sqlstring@2.3.3: + resolution: + { + integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==, + } + engines: { node: ">= 0.6" } + dev: false + + /stacktracey@2.1.8: + resolution: + { + integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==, + } + dependencies: + as-table: 1.0.55 + get-source: 2.0.12 + dev: true + + /stoppable@1.1.0: + resolution: + { + integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==, + } + engines: { node: ">=4", npm: ">=6" } + dev: true + + /streamsearch@1.1.0: + resolution: + { + integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==, + } + engines: { node: ">=10.0.0" } + dev: true + + /string_decoder@1.3.0: + resolution: + { + integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, + } + dependencies: + safe-buffer: 5.2.1 + dev: true + + /strip-ansi@6.0.1: + resolution: + { + integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, + } + engines: { node: ">=8" } + dependencies: + ansi-regex: 5.0.1 + + /strip-json-comments@2.0.1: + resolution: + { + integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==, + } + engines: { node: ">=0.10.0" } + dev: true + + /strip-json-comments@3.1.1: + resolution: + { + integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, + } + engines: { node: ">=8" } + + /supports-color@7.2.0: + resolution: + { + integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, + } + engines: { node: ">=8" } + dependencies: + has-flag: 4.0.0 + + /tar-fs@2.1.1: + resolution: + { + integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==, + } + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: true + + /tar-stream@2.2.0: + resolution: + { + integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==, + } + engines: { node: ">=6" } + 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: true + + /text-table@0.2.0: + resolution: + { + integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, + } + + /timers-ext@0.1.7: + resolution: + { + integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==, + } + dependencies: + es5-ext: 0.10.62 + next-tick: 1.1.0 + dev: true + + /to-regex-range@5.0.1: + resolution: + { + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, + } + engines: { node: ">=8.0" } + dependencies: + is-number: 7.0.0 + + /tr46@0.0.3: + resolution: + { + integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, + } + dev: false + + /ts-api-utils@1.0.3(typescript@5.2.2): + resolution: + { + integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==, + } + engines: { node: ">=16.13.0" } + peerDependencies: + typescript: ">=4.2.0" + dependencies: + typescript: 5.2.2 + dev: false + + /tslib@2.6.2: + resolution: + { + integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==, + } + dev: true + + /tsx@3.12.8: + resolution: + { + integrity: sha512-Lt9KYaRGF023tlLInPj8rgHwsZU8qWLBj4iRXNWxTfjIkU7canGL806AqKear1j722plHuiYNcL2ZCo6uS9UJA==, + } + hasBin: true + dependencies: + "@esbuild-kit/cjs-loader": 2.4.2 + "@esbuild-kit/core-utils": 3.2.2 + "@esbuild-kit/esm-loader": 2.5.5 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /tunnel-agent@0.6.0: + resolution: + { + integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==, + } + dependencies: + safe-buffer: 5.2.1 + dev: true + + /type-check@0.4.0: + resolution: + { + integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, + } + engines: { node: ">= 0.8.0" } + dependencies: + prelude-ls: 1.2.1 + + /type-fest@0.20.2: + resolution: + { + integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==, + } + engines: { node: ">=10" } + + /type-fest@3.13.0: + resolution: + { + integrity: sha512-Gur3yQGM9qiLNs0KPP7LPgeRbio2QTt4xXouobMCarR0/wyW3F+F/+OWwshg3NG0Adon7uQfSZBpB46NfhoF1A==, + } + engines: { node: ">=14.16" } + 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 + + /typescript@5.2.2: + resolution: + { + integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==, + } + engines: { node: ">=14.17" } + hasBin: true + + /undici@5.24.0: + resolution: + { + integrity: sha512-OKlckxBjFl0oXxcj9FU6oB8fDAaiRUq+D8jrFWGmOfI/gIyjk/IeS75LMzgYKUaeHzLUcYvf9bbJGSrUwTfwwQ==, + } + engines: { node: ">=14.0" } + dependencies: + busboy: 1.6.0 + dev: true + + /uri-js@4.4.1: + resolution: + { + integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, + } + dependencies: + punycode: 2.3.0 + + /util-deprecate@1.0.2: + resolution: + { + integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, + } + dev: true + + /vscode-json-languageservice@4.2.1: + resolution: + { + integrity: sha512-xGmv9QIWs2H8obGbWg+sIPI/3/pFgj/5OWBhNzs00BkYQ9UaB2F6JJaGB/2/YOZJ3BvLXQTC4Q7muqU25QgAhA==, + } + dependencies: + jsonc-parser: 3.2.0 + vscode-languageserver-textdocument: 1.0.8 + vscode-languageserver-types: 3.17.3 + vscode-nls: 5.2.0 + vscode-uri: 3.0.7 + dev: true + + /vscode-languageserver-textdocument@1.0.8: + resolution: + { + integrity: sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==, + } + dev: true + + /vscode-languageserver-types@3.17.3: + resolution: + { + integrity: sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA==, + } + dev: true + + /vscode-nls@5.2.0: + resolution: + { + integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==, + } + dev: true + + /vscode-uri@3.0.7: + resolution: + { + integrity: sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==, + } + 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@2.0.2: + resolution: + { + integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, + } + engines: { node: ">= 8" } + hasBin: true + dependencies: + isexe: 2.0.0 + + /wordwrap@1.0.0: + resolution: + { + integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==, + } + dev: true + + /workerd@1.20230904.0: + resolution: + { + integrity: sha512-t9znszH0rQGK4mJGvF9L3nN0qKEaObAGx0JkywFtAwH8OkSn+YfQbHNZE+YsJ4qa1hOz1DCNEk08UDFRBaYq4g==, + } + engines: { node: ">=16" } + hasBin: true + requiresBuild: true + optionalDependencies: + "@cloudflare/workerd-darwin-64": 1.20230904.0 + "@cloudflare/workerd-darwin-arm64": 1.20230904.0 + "@cloudflare/workerd-linux-64": 1.20230904.0 + "@cloudflare/workerd-linux-arm64": 1.20230904.0 + "@cloudflare/workerd-windows-64": 1.20230904.0 + dev: true + + /wrangler@3.7.0: + resolution: + { + integrity: sha512-7823G5U7WwDIkqaZrxSh/BQ/pxA4WIX3R9GwYfh+MYJj+k5s56KGQ+K/NmY/JbgZsxVEHDjhoYzqDqJebQMZeg==, + } + engines: { node: ">=16.13.0" } + hasBin: true + 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.20230904.0 + nanoid: 3.3.6 + path-to-regexp: 6.2.1 + selfsigned: 2.1.1 + source-map: 0.7.4 + xxhash-wasm: 1.0.2 + optionalDependencies: + fsevents: 2.3.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /wrappy@1.0.2: + resolution: + { + integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, + } + + /ws@8.14.1: + resolution: + { + integrity: sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==, + } + engines: { node: ">=10.0.0" } + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + /xxhash-wasm@1.0.2: + resolution: + { + integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==, + } + dev: true + + /yallist@4.0.0: + resolution: + { + integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, + } + + /yocto-queue@0.1.0: + resolution: + { + integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, + } + engines: { node: ">=10" } + + /youch@3.3.1: + resolution: + { + integrity: sha512-Rg9ioi+AkKyje2Hk4qILSVvayaFW98KTsOJ4aIkjDf97LZX5WJVIHZmFLnM4ThcVofHo/fbbwtYajfBPHFOVtg==, + } + dependencies: + cookie: 0.5.0 + mustache: 4.2.0 + stacktracey: 2.1.8 + dev: true + + /zod@3.22.2: + resolution: + { + integrity: sha512-wvWkphh5WQsJbVk1tbx1l1Ly4yg+XecD+Mq280uBGt9wa5BKSWf4Mhp6GmrkPixhMxmabYY7RbzlwVP32pbGCg==, + } + dev: true diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index 5420b5a..2911052 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -7,7 +7,7 @@ import { uniqueIndex, } from "drizzle-orm/sqlite-core" -// users, games, categories, assets etc, i will clean this up later, sorry for anyone looking at this +// TODO: move tables into seperate appropiate files export const users = sqliteTable( tableNames.authUser, { @@ -167,6 +167,7 @@ export const assets = sqliteTable( } ), uploadedDate: integer("uploaded_date").notNull(), + assetIsOptimized: integer("asset_is_optimized").default(0).notNull(), viewCount: integer("view_count").default(0).notNull(), downloadCount: integer("download_count").default(0).notNull(), fileSize: integer("file_size").default(0).notNull(), diff --git a/src/worker-configuration.d.ts b/src/worker-configuration.d.ts index f270de6..6479d6d 100644 --- a/src/worker-configuration.d.ts +++ b/src/worker-configuration.d.ts @@ -9,5 +9,4 @@ export type Bindings = { TURSO_DATABASE_AUTH_TOKEN: string } - export type APIContext = Context<{ Bindings: Bindings }> From 96d35ab768e171601cf99c9f5311098a8cfa2b2a Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Fri, 15 Sep 2023 00:02:45 +0100 Subject: [PATCH 085/318] chore: update dependencies --- package.json | 12 +-- pnpm-lock.yaml | 282 ++++++++++++++++++------------------------------- 2 files changed, 109 insertions(+), 185 deletions(-) diff --git a/package.json b/package.json index 5b1bf5d..4fe60d4 100644 --- a/package.json +++ b/package.json @@ -20,18 +20,18 @@ "eslint-config-google": "^0.14.0", "eslint-plugin-json": "^3.1.0", "husky": "^8.0.3", - "tsx": "^3.12.8", + "tsx": "^3.12.10", "typescript": "^5.2.2", - "wrangler": "3.7.0" + "wrangler": "3.8.0" }, "private": true, "dependencies": { - "@libsql/client": "0.3.3-pre.2", + "@libsql/client": "0.3.4", "@lucia-auth/adapter-sqlite": "^2.0.0", - "@typescript-eslint/eslint-plugin": "^6.6.0", + "@typescript-eslint/eslint-plugin": "^6.7.0", "drizzle-orm": "^0.28.6", - "hono": "^3.5.8", - "lucia": "^2.5.0", + "hono": "^3.6.0", + "lucia": "^2.6.0", "mysql2": "^3.6.1", "prettier": "^3.0.3", "resend": "^1.0.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bc51c62..bc57a84 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: "6.1" +lockfileVersion: "6.0" settings: autoInstallPeers: true @@ -6,23 +6,23 @@ settings: dependencies: "@libsql/client": - specifier: 0.3.3-pre.2 - version: 0.3.3-pre.2 + specifier: 0.3.4 + version: 0.3.4 "@lucia-auth/adapter-sqlite": specifier: ^2.0.0 - version: 2.0.0(@libsql/client@0.3.3-pre.2)(lucia@2.5.0) + version: 2.0.0(@libsql/client@0.3.4)(lucia@2.6.0) "@typescript-eslint/eslint-plugin": - specifier: ^6.6.0 - version: 6.6.0(@typescript-eslint/parser@6.6.0)(eslint@8.49.0)(typescript@5.2.2) + specifier: ^6.7.0 + version: 6.7.0(@typescript-eslint/parser@6.7.0)(eslint@8.49.0)(typescript@5.2.2) drizzle-orm: specifier: ^0.28.6 - version: 0.28.6(@cloudflare/workers-types@4.20230904.0)(@libsql/client@0.3.3-pre.2)(mysql2@3.6.1) + version: 0.28.6(@cloudflare/workers-types@4.20230904.0)(@libsql/client@0.3.4)(mysql2@3.6.1) hono: - specifier: ^3.5.8 - version: 3.5.8 + specifier: ^3.6.0 + version: 3.6.0 lucia: - specifier: ^2.5.0 - version: 2.5.0 + specifier: ^2.6.0 + version: 2.6.0 mysql2: specifier: ^3.6.1 version: 3.6.1 @@ -59,14 +59,14 @@ devDependencies: specifier: ^8.0.3 version: 8.0.3 tsx: - specifier: ^3.12.8 - version: 3.12.8 + specifier: ^3.12.10 + version: 3.12.10 typescript: specifier: ^5.2.2 version: 5.2.2 wrangler: - specifier: 3.7.0 - version: 3.7.0 + specifier: 3.8.0 + version: 3.8.0 packages: /@aashutoshrathi/word-wrap@1.2.6: @@ -158,33 +158,33 @@ packages: } dev: true - /@esbuild-kit/cjs-loader@2.4.2: + /@esbuild-kit/cjs-loader@2.4.4: resolution: { - integrity: sha512-BDXFbYOJzT/NBEtp71cvsrGPwGAMGRB/349rwKuoxNSiKjPraNNnlK6MIIabViCjqZugu6j+xeMDlEkWdHHJSg==, + integrity: sha512-NfsJX4PdzhwSkfJukczyUiZGc7zNNWZcEAyqeISpDnn0PTfzMJR1aR8xAIPskBejIxBJbIgCCMzbaYa9SXepIg==, } dependencies: - "@esbuild-kit/core-utils": 3.2.2 + "@esbuild-kit/core-utils": 3.3.1 get-tsconfig: 4.7.0 dev: true - /@esbuild-kit/core-utils@3.2.2: + /@esbuild-kit/core-utils@3.3.1: resolution: { - integrity: sha512-Ub6LaRaAgF80dTSzUdXpFLM1pVDdmEVB9qb5iAzSpyDlX/mfJTFGOnZ516O05p5uWWteNviMKi4PAyEuRxI5gA==, + integrity: sha512-zg2aeGLgbZ/U8AnHRD6y085BkRqlw7jOsqpI/AFaQg6FhcCRycAe+aFLibs9okVVYTMqWANDC76UVSzd3qBoOw==, } dependencies: esbuild: 0.18.20 source-map-support: 0.5.21 dev: true - /@esbuild-kit/esm-loader@2.5.5: + /@esbuild-kit/esm-loader@2.6.4: resolution: { - integrity: sha512-Qwfvj/qoPbClxCRNuac1Du01r9gvNOT+pMYtJDapfB1eoGN1YlJ1BixLyL9WVENRx5RXgNLdfYdx/CuswlGhMw==, + integrity: sha512-xcbyhN97xFFFEdDw6IC4EuzX9Ali3aV3cj2FIYragOQpbPM4X6QA2R5qaP3h7Tr0tuyI6dmJJdMw7oBHxBSXQA==, } dependencies: - "@esbuild-kit/core-utils": 3.2.2 + "@esbuild-kit/core-utils": 3.3.1 get-tsconfig: 4.7.0 dev: true @@ -752,10 +752,10 @@ packages: eslint: 8.49.0 eslint-visitor-keys: 3.4.3 - /@eslint-community/regexpp@4.8.0: + /@eslint-community/regexpp@4.8.1: resolution: { - integrity: sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==, + integrity: sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==, } engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } @@ -811,40 +811,29 @@ packages: integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==, } - /@libsql/client@0.3.3-pre.2: + /@libsql/client@0.3.4: resolution: { - integrity: sha512-cAQNEBYZ+rXAUtrIYn8gA6iUBXwrd2qRI60T9WgYNv4ePieB/nB9IF6kIJefdeFOnS5YCS9+YeiBfbTVlq0PAg==, + integrity: sha512-b1rpCzm02oQuh1zM1UKdKxhClyMMlgyFagcmsuGTve/AQxubO/FaRgoKXTcGaOqoRjymE1qf0sQM2UoyPvu3lA==, } dependencies: - "@libsql/hrana-client": 0.5.0 + "@libsql/hrana-client": 0.5.2 + better-sqlite3: 8.6.0 js-base64: 3.7.5 - libsql: 0.1.4 transitivePeerDependencies: - bufferutil - encoding - utf-8-validate dev: false - /@libsql/darwin-arm64@0.1.4: - resolution: - { - integrity: sha512-8ttRMJJ5Ep8mmn/mSc8mapoLwGvb2XHaQlaA7Fn8OpVQ38ZnArYx6t26B8G5UAFW9uvytitVnW4EJD6IjtvYRg==, - } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@libsql/hrana-client@0.5.0: + /@libsql/hrana-client@0.5.2: resolution: { - integrity: sha512-o9yXH+9XBPnMSrBkY17q2xknfNXJaCHQv4rFJikt1g8M0d80hwp4ZZ1jHwacuL61wRa4j6qKMFqh9ti+CoTH1A==, + integrity: sha512-0hVKUClh29Pb0bIIwqssfDH1nrsKO5SaBTfclIZ1d0W/rBBDsV6mBKx3FhQuULYu/5u0/gJcHdmdiA1SFIOXdQ==, } dependencies: - "@libsql/isomorphic-fetch": 0.1.6 - "@libsql/isomorphic-ws": 0.1.3 + "@libsql/isomorphic-fetch": 0.1.7 + "@libsql/isomorphic-ws": 0.1.5 js-base64: 3.7.5 transitivePeerDependencies: - bufferutil @@ -852,22 +841,22 @@ packages: - utf-8-validate dev: false - /@libsql/isomorphic-fetch@0.1.6: + /@libsql/isomorphic-fetch@0.1.7: resolution: { - integrity: sha512-8qhxEDmVBDb54E9xdW1xqw3zLNShkMZpf5YQU3PvwjtKNLOPde59Oqez+RnZHsYkt9zQxxOF+7gSHVJeP/UWqg==, + integrity: sha512-/lSsPe0WTHn2SDTPbgbjUY2iF0C3Adtcwu7cajTe+3YtcxsV36u7L37/hmJIQQG8vuM/TCUu4TWb+ym/299aOg==, } dependencies: - "@types/node-fetch": 2.6.4 + "@types/node-fetch": 2.6.5 node-fetch: 2.7.0 transitivePeerDependencies: - encoding dev: false - /@libsql/isomorphic-ws@0.1.3: + /@libsql/isomorphic-ws@0.1.5: resolution: { - integrity: sha512-54dZXgYwWDKsnfWv8GCVYvhn6RDlqFDGAc8EQMd941yvGMsGzo06Gn6Iyjw//nJ1iJO97FbXgoQ1apikoFD/WA==, + integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==, } dependencies: "@types/ws": 8.5.5 @@ -877,18 +866,7 @@ packages: - utf-8-validate dev: false - /@libsql/linux-x64-gnu@0.1.4: - resolution: - { - integrity: sha512-hv75P5I3cV+rAJkizJsKC32oi0U0uzZOrLMbo+vzfNV95euUUZ+Y6Mc/51+NzXRte98xNbrFW2knSJzW2/MxmA==, - } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@lucia-auth/adapter-sqlite@2.0.0(@libsql/client@0.3.3-pre.2)(lucia@2.5.0): + /@lucia-auth/adapter-sqlite@2.0.0(@libsql/client@0.3.4)(lucia@2.6.0): resolution: { integrity: sha512-Hiy8WND/1mi25r0M2ruSml+Ab5GJLr4XZEHApYw1lxybF+VlPUyX7oTtIVCSgvq/SWiP/tvnyPwnXAPmNr8/bg==, @@ -903,15 +881,8 @@ packages: better-sqlite3: optional: true dependencies: - "@libsql/client": 0.3.3-pre.2 - lucia: 2.5.0 - dev: false - - /@neon-rs/load@0.0.4: - resolution: - { - integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==, - } + "@libsql/client": 0.3.4 + lucia: 2.6.0 dev: false /@nodelib/fs.scandir@2.1.5: @@ -978,14 +949,14 @@ packages: } dev: false - /@types/node-fetch@2.6.4: + /@types/node-fetch@2.6.5: resolution: { - integrity: sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==, + integrity: sha512-OZsUlr2nxvkqUFLSaY2ZbA+P1q22q+KrlxWOn/38RX+u5kTkYL2mTujEpzUhGkS+K/QCYp9oagfXG39XOzyySg==, } dependencies: "@types/node": 20.6.0 - form-data: 3.0.1 + form-data: 4.0.0 dev: false /@types/node@20.6.0: @@ -994,10 +965,10 @@ packages: integrity: sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==, } - /@types/semver@7.5.1: + /@types/semver@7.5.2: resolution: { - integrity: sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==, + integrity: sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==, } dev: false @@ -1010,10 +981,10 @@ packages: "@types/node": 20.6.0 dev: false - /@typescript-eslint/eslint-plugin@6.6.0(@typescript-eslint/parser@6.6.0)(eslint@8.49.0)(typescript@5.2.2): + /@typescript-eslint/eslint-plugin@6.7.0(@typescript-eslint/parser@6.7.0)(eslint@8.49.0)(typescript@5.2.2): resolution: { - integrity: sha512-CW9YDGTQnNYMIo5lMeuiIG08p4E0cXrXTbcZ2saT/ETE7dWUrNxlijsQeU04qAAKkILiLzdQz+cGFxCJjaZUmA==, + integrity: sha512-gUqtknHm0TDs1LhY12K2NA3Rmlmp88jK9Tx8vGZMfHeNMLE3GH2e9TRub+y+SOjuYgtOmok+wt1AyDPZqxbNag==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -1024,12 +995,12 @@ packages: typescript: optional: true dependencies: - "@eslint-community/regexpp": 4.8.0 - "@typescript-eslint/parser": 6.6.0(eslint@8.49.0)(typescript@5.2.2) - "@typescript-eslint/scope-manager": 6.6.0 - "@typescript-eslint/type-utils": 6.6.0(eslint@8.49.0)(typescript@5.2.2) - "@typescript-eslint/utils": 6.6.0(eslint@8.49.0)(typescript@5.2.2) - "@typescript-eslint/visitor-keys": 6.6.0 + "@eslint-community/regexpp": 4.8.1 + "@typescript-eslint/parser": 6.7.0(eslint@8.49.0)(typescript@5.2.2) + "@typescript-eslint/scope-manager": 6.7.0 + "@typescript-eslint/type-utils": 6.7.0(eslint@8.49.0)(typescript@5.2.2) + "@typescript-eslint/utils": 6.7.0(eslint@8.49.0)(typescript@5.2.2) + "@typescript-eslint/visitor-keys": 6.7.0 debug: 4.3.4 eslint: 8.49.0 graphemer: 1.4.0 @@ -1042,10 +1013,10 @@ packages: - supports-color dev: false - /@typescript-eslint/parser@6.6.0(eslint@8.49.0)(typescript@5.2.2): + /@typescript-eslint/parser@6.7.0(eslint@8.49.0)(typescript@5.2.2): resolution: { - integrity: sha512-setq5aJgUwtzGrhW177/i+DMLqBaJbdwGj2CPIVFFLE0NCliy5ujIdLHd2D1ysmlmsjdL2GWW+hR85neEfc12w==, + integrity: sha512-jZKYwqNpNm5kzPVP5z1JXAuxjtl2uG+5NpaMocFPTNC2EdYIgbXIPImObOkhbONxtFTTdoZstLZefbaK+wXZng==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -1055,10 +1026,10 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/scope-manager": 6.6.0 - "@typescript-eslint/types": 6.6.0 - "@typescript-eslint/typescript-estree": 6.6.0(typescript@5.2.2) - "@typescript-eslint/visitor-keys": 6.6.0 + "@typescript-eslint/scope-manager": 6.7.0 + "@typescript-eslint/types": 6.7.0 + "@typescript-eslint/typescript-estree": 6.7.0(typescript@5.2.2) + "@typescript-eslint/visitor-keys": 6.7.0 debug: 4.3.4 eslint: 8.49.0 typescript: 5.2.2 @@ -1066,21 +1037,21 @@ packages: - supports-color dev: false - /@typescript-eslint/scope-manager@6.6.0: + /@typescript-eslint/scope-manager@6.7.0: resolution: { - integrity: sha512-pT08u5W/GT4KjPUmEtc2kSYvrH8x89cVzkA0Sy2aaOUIw6YxOIjA8ilwLr/1fLjOedX1QAuBpG9XggWqIIfERw==, + integrity: sha512-lAT1Uau20lQyjoLUQ5FUMSX/dS07qux9rYd5FGzKz/Kf8W8ccuvMyldb8hadHdK/qOI7aikvQWqulnEq2nCEYA==, } engines: { node: ^16.0.0 || >=18.0.0 } dependencies: - "@typescript-eslint/types": 6.6.0 - "@typescript-eslint/visitor-keys": 6.6.0 + "@typescript-eslint/types": 6.7.0 + "@typescript-eslint/visitor-keys": 6.7.0 dev: false - /@typescript-eslint/type-utils@6.6.0(eslint@8.49.0)(typescript@5.2.2): + /@typescript-eslint/type-utils@6.7.0(eslint@8.49.0)(typescript@5.2.2): resolution: { - integrity: sha512-8m16fwAcEnQc69IpeDyokNO+D5spo0w1jepWWY2Q6y5ZKNuj5EhVQXjtVAeDDqvW6Yg7dhclbsz6rTtOvcwpHg==, + integrity: sha512-f/QabJgDAlpSz3qduCyQT0Fw7hHpmhOzY/Rv6zO3yO+HVIdPfIWhrQoAyG+uZVtWAIS85zAyzgAFfyEr+MgBpg==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -1090,8 +1061,8 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/typescript-estree": 6.6.0(typescript@5.2.2) - "@typescript-eslint/utils": 6.6.0(eslint@8.49.0)(typescript@5.2.2) + "@typescript-eslint/typescript-estree": 6.7.0(typescript@5.2.2) + "@typescript-eslint/utils": 6.7.0(eslint@8.49.0)(typescript@5.2.2) debug: 4.3.4 eslint: 8.49.0 ts-api-utils: 1.0.3(typescript@5.2.2) @@ -1100,18 +1071,18 @@ packages: - supports-color dev: false - /@typescript-eslint/types@6.6.0: + /@typescript-eslint/types@6.7.0: resolution: { - integrity: sha512-CB6QpJQ6BAHlJXdwUmiaXDBmTqIE2bzGTDLADgvqtHWuhfNP3rAOK7kAgRMAET5rDRr9Utt+qAzRBdu3AhR3sg==, + integrity: sha512-ihPfvOp7pOcN/ysoj0RpBPOx3HQTJTrIN8UZK+WFd3/iDeFHHqeyYxa4hQk4rMhsz9H9mXpR61IzwlBVGXtl9Q==, } engines: { node: ^16.0.0 || >=18.0.0 } dev: false - /@typescript-eslint/typescript-estree@6.6.0(typescript@5.2.2): + /@typescript-eslint/typescript-estree@6.7.0(typescript@5.2.2): resolution: { - integrity: sha512-hMcTQ6Al8MP2E6JKBAaSxSVw5bDhdmbCEhGW/V8QXkb9oNsFkA4SBuOMYVPxD3jbtQ4R/vSODBsr76R6fP3tbA==, + integrity: sha512-dPvkXj3n6e9yd/0LfojNU8VMUGHWiLuBZvbM6V6QYD+2qxqInE7J+J/ieY2iGwR9ivf/R/haWGkIj04WVUeiSQ==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -1120,8 +1091,8 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/types": 6.6.0 - "@typescript-eslint/visitor-keys": 6.6.0 + "@typescript-eslint/types": 6.7.0 + "@typescript-eslint/visitor-keys": 6.7.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -1132,10 +1103,10 @@ packages: - supports-color dev: false - /@typescript-eslint/utils@6.6.0(eslint@8.49.0)(typescript@5.2.2): + /@typescript-eslint/utils@6.7.0(eslint@8.49.0)(typescript@5.2.2): resolution: { - integrity: sha512-mPHFoNa2bPIWWglWYdR0QfY9GN0CfvvXX1Sv6DlSTive3jlMTUy+an67//Gysc+0Me9pjitrq0LJp0nGtLgftw==, + integrity: sha512-MfCq3cM0vh2slSikQYqK2Gq52gvOhe57vD2RM3V4gQRZYX4rDPnKLu5p6cm89+LJiGlwEXU8hkYxhqqEC/V3qA==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -1143,10 +1114,10 @@ packages: dependencies: "@eslint-community/eslint-utils": 4.4.0(eslint@8.49.0) "@types/json-schema": 7.0.12 - "@types/semver": 7.5.1 - "@typescript-eslint/scope-manager": 6.6.0 - "@typescript-eslint/types": 6.6.0 - "@typescript-eslint/typescript-estree": 6.6.0(typescript@5.2.2) + "@types/semver": 7.5.2 + "@typescript-eslint/scope-manager": 6.7.0 + "@typescript-eslint/types": 6.7.0 + "@typescript-eslint/typescript-estree": 6.7.0(typescript@5.2.2) eslint: 8.49.0 semver: 7.5.4 transitivePeerDependencies: @@ -1154,14 +1125,14 @@ packages: - typescript dev: false - /@typescript-eslint/visitor-keys@6.6.0: + /@typescript-eslint/visitor-keys@6.7.0: resolution: { - integrity: sha512-L61uJT26cMOfFQ+lMZKoJNbAEckLe539VhTxiGHrWl5XSKQgA0RTBZJW2HFPy5T0ZvPVSD93QsrTKDkfNwJGyQ==, + integrity: sha512-/C1RVgKFDmGMcVGeD8HjKv2bd72oI1KxQDeY8uc66gw9R0OK0eMq48cA+jv9/2Ag6cdrsUGySm1yzYmfz0hxwQ==, } engines: { node: ^16.0.0 || >=18.0.0 } dependencies: - "@typescript-eslint/types": 6.6.0 + "@typescript-eslint/types": 6.7.0 eslint-visitor-keys: 3.4.3 dev: false @@ -1277,7 +1248,6 @@ packages: { integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, } - dev: true /better-sqlite3@8.6.0: resolution: @@ -1288,7 +1258,6 @@ packages: dependencies: bindings: 1.5.0 prebuild-install: 7.1.1 - dev: true /binary-extensions@2.2.0: resolution: @@ -1305,7 +1274,6 @@ packages: } dependencies: file-uri-to-path: 1.0.0 - dev: true /bl@4.1.0: resolution: @@ -1316,7 +1284,6 @@ packages: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 - dev: true /blake3-wasm@2.1.5: resolution: @@ -1366,7 +1333,6 @@ packages: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - dev: true /busboy@1.6.0: resolution: @@ -1446,7 +1412,6 @@ packages: { integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==, } - dev: true /cli-color@2.0.3: resolution: @@ -1589,7 +1554,6 @@ packages: engines: { node: ">=10" } dependencies: mimic-response: 3.1.0 - dev: true /deep-extend@0.6.0: resolution: @@ -1597,7 +1561,6 @@ packages: integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==, } engines: { node: ">=4.0.0" } - dev: true /deep-is@0.1.4: resolution: @@ -1635,7 +1598,6 @@ packages: integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==, } engines: { node: ">=8" } - dev: true /difflib@0.2.4: resolution: @@ -1730,12 +1692,12 @@ packages: hasBin: true dependencies: "@drizzle-team/studio": 0.0.5 - "@esbuild-kit/esm-loader": 2.5.5 + "@esbuild-kit/esm-loader": 2.6.4 camelcase: 7.0.1 chalk: 5.3.0 commander: 9.5.0 esbuild: 0.18.20 - esbuild-register: 3.4.2(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 @@ -1745,7 +1707,7 @@ packages: - supports-color dev: true - /drizzle-orm@0.28.6(@cloudflare/workers-types@4.20230904.0)(@libsql/client@0.3.3-pre.2)(mysql2@3.6.1): + /drizzle-orm@0.28.6(@cloudflare/workers-types@4.20230904.0)(@libsql/client@0.3.4)(mysql2@3.6.1): resolution: { integrity: sha512-yBe+F9htrlYER7uXgDJUQsTHFoIrI5yMm5A0bg0GiZ/kY5jNXTWoEy4KQtg35cE27sw1VbgzoMWHAgCckUUUww==, @@ -1811,7 +1773,7 @@ packages: optional: true dependencies: "@cloudflare/workers-types": 4.20230904.0 - "@libsql/client": 0.3.3-pre.2 + "@libsql/client": 0.3.4 mysql2: 3.6.1 dev: false @@ -1836,7 +1798,6 @@ packages: } dependencies: once: 1.4.0 - dev: true /entities@4.5.0: resolution: @@ -1892,10 +1853,10 @@ packages: es6-symbol: 3.1.3 dev: true - /esbuild-register@3.4.2(esbuild@0.18.20): + /esbuild-register@3.5.0(esbuild@0.18.20): resolution: { - integrity: sha512-kG/XyTDyz6+YDuyfB9ZoSIOOmgyFCH+xPRtsCa8W85HLRV5Csp+o3jWVbOSHgSLfyLc5DmP+KFDNwty4mEjC+Q==, + integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==, } peerDependencies: esbuild: ">=0.12 <1" @@ -2028,7 +1989,7 @@ packages: hasBin: true dependencies: "@eslint-community/eslint-utils": 4.4.0(eslint@8.49.0) - "@eslint-community/regexpp": 4.8.0 + "@eslint-community/regexpp": 4.8.1 "@eslint/eslintrc": 2.1.2 "@eslint/js": 8.49.0 "@humanwhocodes/config-array": 0.11.11 @@ -2141,7 +2102,6 @@ packages: integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==, } engines: { node: ">=6" } - dev: true /ext@1.7.0: resolution: @@ -2216,7 +2176,6 @@ packages: { integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==, } - dev: true /fill-range@7.0.1: resolution: @@ -2254,10 +2213,10 @@ packages: integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==, } - /form-data@3.0.1: + /form-data@4.0.0: resolution: { - integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==, + integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==, } engines: { node: ">= 6" } dependencies: @@ -2271,7 +2230,6 @@ packages: { integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==, } - dev: true /fs.realpath@1.0.0: resolution: @@ -2323,7 +2281,6 @@ packages: { integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==, } - dev: true /glob-parent@5.1.2: resolution: @@ -2430,10 +2387,10 @@ packages: } dev: true - /hono@3.5.8: + /hono@3.6.0: resolution: { - integrity: sha512-ZipTmGfHm43q5QOEBGog2wyejyNUcicjPt0BLDQ8yz9xij/y9RYXRpR1YPxMpQqeyNM7isvpsIAe9Ems51Wq0Q==, + integrity: sha512-snkW8naO1WCrQvpAGE/du30Ek0h71gSM3g4RzzdPIB2LQnl12BEwZYH3s2Kssd6kXGORqHmpoyMBMLWtc9nzKQ==, } engines: { node: ">=16.0.0" } dev: false @@ -2495,7 +2452,6 @@ packages: { integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, } - dev: true /ignore@5.2.4: resolution: @@ -2742,20 +2698,6 @@ packages: prelude-ls: 1.2.1 type-check: 0.4.0 - /libsql@0.1.4: - resolution: - { - integrity: sha512-OTTdQWz4q7k7D2IAReMUuD2f8RvmSPaZ9r2g3lOOl9fNpovqqC0PJ5vwfNqwI2FMATjyc0eIvLEJORonf9uoLw==, - } - cpu: [x64, arm64] - os: [darwin, linux] - dependencies: - "@neon-rs/load": 0.0.4 - optionalDependencies: - "@libsql/darwin-arm64": 0.1.4 - "@libsql/linux-x64-gnu": 0.1.4 - dev: false - /locate-path@6.0.0: resolution: { @@ -2836,10 +2778,10 @@ packages: es5-ext: 0.10.62 dev: true - /lucia@2.5.0: + /lucia@2.6.0: resolution: { - integrity: sha512-eUUtf4gBsT1vLF1UEkZly3Sh620N4P0TcGzeDMviFqF0qULB7XOgC9GMmobK3y9L/cEfoD8YHNxfIN/AzSXQsg==, + integrity: sha512-9GfRmEkhJ68EMAEOI6EKwnkHmQpEXeqRuP9ew+UhuZEmTCHrsTqwJ9f6pffEg7Im3BRBPlBlWzH5pxtjI+9OXQ==, } dev: false @@ -2920,7 +2862,6 @@ packages: integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==, } engines: { node: ">=10" } - dev: true /miniflare@3.20230904.0: resolution: @@ -2992,14 +2933,12 @@ packages: { integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, } - dev: true /mkdirp-classic@0.5.3: resolution: { integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==, } - dev: true /ms@2.1.2: resolution: @@ -3056,7 +2995,6 @@ packages: { integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==, } - dev: true /natural-compare@1.4.0: resolution: @@ -3079,7 +3017,6 @@ packages: engines: { node: ">=10" } dependencies: semver: 7.5.4 - dev: true /node-fetch@2.6.12: resolution: @@ -3267,7 +3204,6 @@ packages: simple-get: 4.0.1 tar-fs: 2.1.1 tunnel-agent: 0.6.0 - dev: true /prelude-ls@1.2.1: resolution: @@ -3319,7 +3255,6 @@ packages: dependencies: end-of-stream: 1.4.4 once: 1.4.0 - dev: true /punycode@2.3.0: resolution: @@ -3345,7 +3280,6 @@ packages: ini: 1.3.8 minimist: 1.2.8 strip-json-comments: 2.0.1 - dev: true /react-dom@18.2.0(react@18.2.0): resolution: @@ -3380,7 +3314,6 @@ packages: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - dev: true /readdirp@3.6.0: resolution: @@ -3479,7 +3412,6 @@ packages: { integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, } - dev: true /safer-buffer@2.1.2: resolution: @@ -3554,7 +3486,6 @@ packages: { integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==, } - dev: true /simple-get@4.0.1: resolution: @@ -3565,7 +3496,6 @@ packages: decompress-response: 6.0.0 once: 1.4.0 simple-concat: 1.0.1 - dev: true /sisteransi@1.0.5: resolution: @@ -3657,7 +3587,6 @@ packages: } dependencies: safe-buffer: 5.2.1 - dev: true /strip-ansi@6.0.1: resolution: @@ -3674,7 +3603,6 @@ packages: integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==, } engines: { node: ">=0.10.0" } - dev: true /strip-json-comments@3.1.1: resolution: @@ -3702,7 +3630,6 @@ packages: mkdirp-classic: 0.5.3 pump: 3.0.0 tar-stream: 2.2.0 - dev: true /tar-stream@2.2.0: resolution: @@ -3716,7 +3643,6 @@ packages: fs-constants: 1.0.0 inherits: 2.0.4 readable-stream: 3.6.2 - dev: true /text-table@0.2.0: resolution: @@ -3769,16 +3695,16 @@ packages: } dev: true - /tsx@3.12.8: + /tsx@3.12.10: resolution: { - integrity: sha512-Lt9KYaRGF023tlLInPj8rgHwsZU8qWLBj4iRXNWxTfjIkU7canGL806AqKear1j722plHuiYNcL2ZCo6uS9UJA==, + integrity: sha512-2+46h4xvUt1aLDNvk5YBT8Uzw+b7BolGbn7iSMucYqCXZiDc+1IMghLVdw8kKjING32JFOeO+Am9posvjkeclA==, } hasBin: true dependencies: - "@esbuild-kit/cjs-loader": 2.4.2 - "@esbuild-kit/core-utils": 3.2.2 - "@esbuild-kit/esm-loader": 2.5.5 + "@esbuild-kit/cjs-loader": 2.4.4 + "@esbuild-kit/core-utils": 3.3.1 + "@esbuild-kit/esm-loader": 2.6.4 optionalDependencies: fsevents: 2.3.3 dev: true @@ -3790,7 +3716,6 @@ packages: } dependencies: safe-buffer: 5.2.1 - dev: true /type-check@0.4.0: resolution: @@ -3861,7 +3786,6 @@ packages: { integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, } - dev: true /vscode-json-languageservice@4.2.1: resolution: @@ -3954,10 +3878,10 @@ packages: "@cloudflare/workerd-windows-64": 1.20230904.0 dev: true - /wrangler@3.7.0: + /wrangler@3.8.0: resolution: { - integrity: sha512-7823G5U7WwDIkqaZrxSh/BQ/pxA4WIX3R9GwYfh+MYJj+k5s56KGQ+K/NmY/JbgZsxVEHDjhoYzqDqJebQMZeg==, + integrity: sha512-sTdD+6fMEpM9ROxv+gcyxgTKpnf7tB5ftRV5+wupsdljWkow5C00UCWU/IWSOUfuitAGAj1PWATjKfrRp9Bk9w==, } engines: { node: ">=16.13.0" } hasBin: true From dd7adc14ab713be76e223687860034fc7e4fa11f Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Fri, 15 Sep 2023 02:32:54 +0100 Subject: [PATCH 086/318] [skip ci] fix incorrect db on readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 23f07b3..51308a8 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Configuration is in `wrangler.toml`. You will require either a workers paid plan **or to set your worker to unbound** for authentication and password hashing to work. -You will need to setup environment variables for the Discord Bot Token for `/contributors` route: `DISCORD_TOKEN` and for Planetscale, using `wrangler secret put`. +You will need to setup environment variables for the Discord Bot Token for `/contributors` route: `DISCORD_TOKEN` and for your Turso DB, using `wrangler secret put`. - Run `wrangler dev` to preview locally. - Run `wrangler deploy` to publish to Cloudflare Workers. From b96d2af2bdd75dd7f25f8fd1d1d52602935c3f90 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sat, 16 Sep 2023 18:35:29 +0100 Subject: [PATCH 087/318] i fucking love drizzle --- src/v2/routes/asset/getAssetFromId.ts | 6 ++++++ src/v2/routes/search/all/searchAll.ts | 6 +++++- src/v2/routes/search/asset/searchAssets.ts | 13 +++++++++++++ src/v2/routes/search/user/getUserByUsername.ts | 8 ++++---- src/v2/routes/search/user/getUsersBySearch.ts | 4 ++++ 5 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/v2/routes/asset/getAssetFromId.ts b/src/v2/routes/asset/getAssetFromId.ts index 6109489..c2d5a59 100644 --- a/src/v2/routes/asset/getAssetFromId.ts +++ b/src/v2/routes/asset/getAssetFromId.ts @@ -22,6 +22,12 @@ export async function getAssetFromId(c: Context): Promise { assetTags: true, }, }, + users: { + columns: { + email: false, + emailVerified: false, + }, + }, }, }) diff --git a/src/v2/routes/search/all/searchAll.ts b/src/v2/routes/search/all/searchAll.ts index fa5c2cb..c51a18c 100644 --- a/src/v2/routes/search/all/searchAll.ts +++ b/src/v2/routes/search/all/searchAll.ts @@ -28,6 +28,10 @@ export async function searchAll(c: Context): Promise { where: (users) => { return like(users.username, `%${query}%`) }, + columns: { + email: false, + emailVerified: false, + }, }) const assetCategoryResponse = await drizzle.query.assetCategories.findMany({ @@ -105,7 +109,7 @@ export async function searchAll(c: Context): Promise { responseHeaders ) - response.headers.set("Cache-Control", "s-maxage=300") + response.headers.set("Cache-Control", "s-maxage=1200") await cache.put(cacheKey, response.clone()) return response } diff --git a/src/v2/routes/search/asset/searchAssets.ts b/src/v2/routes/search/asset/searchAssets.ts index f0f3fd4..dfceb01 100644 --- a/src/v2/routes/search/asset/searchAssets.ts +++ b/src/v2/routes/search/asset/searchAssets.ts @@ -50,6 +50,19 @@ export async function searchForAssets(c: Context): Promise { eq(assets.status, 1) ) }, + with: { + assetTagsAssets: { + with: { + assetTags: true, + }, + }, + users: { + columns: { + email: false, + emailVerified: false, + }, + }, + }, orderBy: desc(assets.id), limit: 1000, }) diff --git a/src/v2/routes/search/user/getUserByUsername.ts b/src/v2/routes/search/user/getUserByUsername.ts index f47f3d9..bf08c43 100644 --- a/src/v2/routes/search/user/getUserByUsername.ts +++ b/src/v2/routes/search/user/getUserByUsername.ts @@ -26,6 +26,10 @@ export async function getUserByUsername(c: Context): Promise { const user = await drizzle.query.users.findFirst({ where: (users, { and, eq }) => and(eq(users.username, username)), + columns: { + email: false, + emailVerified: false, + }, }) if (!user) { @@ -34,10 +38,6 @@ export async function getUserByUsername(c: Context): Promise { return response } - // removing email-related fields - user.email = undefined - user.emailVerified = undefined - response = c.json( { success: true, diff --git a/src/v2/routes/search/user/getUsersBySearch.ts b/src/v2/routes/search/user/getUsersBySearch.ts index 3a05f15..fef0c9c 100644 --- a/src/v2/routes/search/user/getUsersBySearch.ts +++ b/src/v2/routes/search/user/getUsersBySearch.ts @@ -15,6 +15,10 @@ export async function getUsersBySearch(c: Context): Promise { where: (users, { or }) => { return or(like(users.username, `%${query}%`)) }, + columns: { + email: false, + emailVerified: false, + } }) if (!userList) { From b01cdecd367c4fc5bcd4a7b86d3a8ea2bc93eeb3 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sat, 16 Sep 2023 18:36:42 +0100 Subject: [PATCH 088/318] prettier & limit --- src/v2/routes/search/asset/searchAssets.ts | 2 +- src/v2/routes/search/user/getUsersBySearch.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/v2/routes/search/asset/searchAssets.ts b/src/v2/routes/search/asset/searchAssets.ts index dfceb01..50c38e3 100644 --- a/src/v2/routes/search/asset/searchAssets.ts +++ b/src/v2/routes/search/asset/searchAssets.ts @@ -64,7 +64,7 @@ export async function searchForAssets(c: Context): Promise { }, }, orderBy: desc(assets.id), - limit: 1000, + limit: 500, }) response = c.json( diff --git a/src/v2/routes/search/user/getUsersBySearch.ts b/src/v2/routes/search/user/getUsersBySearch.ts index fef0c9c..6c3055d 100644 --- a/src/v2/routes/search/user/getUsersBySearch.ts +++ b/src/v2/routes/search/user/getUsersBySearch.ts @@ -18,7 +18,7 @@ export async function getUsersBySearch(c: Context): Promise { columns: { email: false, emailVerified: false, - } + }, }) if (!userList) { From 50896232cb675a4fdd15d4526aae4ce89f7825c4 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Wed, 20 Sep 2023 00:07:22 +0100 Subject: [PATCH 089/318] globalize bindings and context types --- .eslintrc.json | 34 +- .prettierrc | 16 +- drizzle.config.ts | 20 +- package.json | 74 +- renovate.json | 4 +- src/index.ts | 19 +- src/lucia.d.ts | 42 +- src/v2/db/drizzle.ts | 40 +- src/v2/db/schema.ts | 893 +++++++++--------- src/v2/db/turso.ts | 56 +- src/v2/lib/auth/lucia.ts | 104 +- src/v2/lib/discord.ts | 16 +- src/v2/lib/helpers/assetStatus.ts | 14 +- src/v2/lib/helpers/rename.ts | 7 +- .../lib/helpers/responses/notFoundResponse.ts | 18 +- src/v2/lib/helpers/roleFlags.ts | 66 +- src/v2/lib/helpers/splitQueryByCommas.ts | 9 +- src/v2/lib/listBucket.ts | 4 +- src/v2/lib/resend/email.ts | 96 +- src/v2/lib/responseHeaders.ts | 6 +- src/v2/lib/types/discord.ts | 24 +- src/v2/routes/asset/assetRoute.ts | 5 +- src/v2/routes/asset/downloadAsset.ts | 57 +- src/v2/routes/asset/getAssetFromId.ts | 105 +- .../asset-categories/createAssetCategory.ts | 102 +- .../asset-categories/deleteAssetCategory.ts | 106 +-- src/v2/routes/auth/assets/approveAsset.ts | 102 +- .../collections/addAssetToCollection.ts | 202 ++-- .../collections/createAssetCollection.ts | 120 +-- .../collections/deleteAssetCollection.ts | 98 +- .../collections/deleteAssetFromCollection.ts | 176 ++-- .../assets/collections/viewAssetCollection.ts | 117 ++- .../collections/viewAssetCollections.ts | 73 +- .../auth/assets/favorite/addFavoriteAsset.ts | 142 +-- .../assets/favorite/removeFavoriteAsset.ts | 132 +-- .../assets/favorite/viewFavoriteAssets.ts | 61 +- src/v2/routes/auth/assets/modifyAsset.ts | 128 +-- src/v2/routes/auth/assets/uploadAsset.ts | 196 ++-- src/v2/routes/auth/authRoute.ts | 42 +- src/v2/routes/auth/games/createGame.ts | 108 +-- src/v2/routes/auth/games/deleteGame.ts | 104 +- src/v2/routes/auth/login.ts | 131 +-- src/v2/routes/auth/logout.ts | 27 +- .../deleteOCGeneratorResponse.ts | 108 +-- .../oc-generators/saveOCGeneratorResponse.ts | 68 +- .../oc-generators/viewOCGeneratorResponses.ts | 48 +- src/v2/routes/auth/signup.ts | 116 +-- src/v2/routes/auth/tags/createTag.ts | 104 +- src/v2/routes/auth/tags/deleteTag.ts | 106 +-- .../self-upload/uploadAvatar.ts | 61 +- .../self-upload/uploadBanner.ts | 67 +- .../user-attributes/updateUserAttributes.ts | 57 +- .../user-relations/followUser.ts | 102 +- .../user-relations/unfollowUser.ts | 86 +- src/v2/routes/auth/validate.ts | 49 +- src/v2/routes/discord/contributors.ts | 105 +- src/v2/routes/discord/discordRoute.ts | 3 +- src/v2/routes/games/allGames.ts | 97 +- src/v2/routes/games/gamesRoute.ts | 3 +- src/v2/routes/oc-generators/getGenerator.ts | 53 +- src/v2/routes/oc-generators/getGenerators.ts | 79 +- .../routes/oc-generators/ocGeneratorRoutes.ts | 5 +- src/v2/routes/search/all/searchAll.ts | 194 ++-- src/v2/routes/search/asset/recentAssets.ts | 48 +- src/v2/routes/search/asset/searchAssets.ts | 142 +-- src/v2/routes/search/searchRoute.ts | 31 +- .../routes/search/user/getUserByUsername.ts | 104 +- src/v2/routes/search/user/getUsersBySearch.ts | 67 +- src/v2/routes/tags/allTags.ts | 55 +- src/worker-configuration.d.ts | 32 +- tsconfig.json | 26 +- 71 files changed, 2989 insertions(+), 2923 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 77ceedb..6d37209 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,19 +1,19 @@ { - "root": true, - "extends": ["plugin:@typescript-eslint/recommended"], - "parser": "@typescript-eslint/parser", - "plugins": ["json"], - "rules": { - "no-const-assign": "error", - "camelcase": "off", - "no-extra-semi": "error" - }, - "parserOptions": { - "allowImportExportEverywhere": true, - "ecmaVersion": 2020, - "ecmaFeatures": { - "impliedStrict": true - }, - "sourceType": "module" - } + "root": true, + "extends": ["plugin:@typescript-eslint/recommended"], + "parser": "@typescript-eslint/parser", + "plugins": ["json"], + "rules": { + "no-const-assign": "error", + "camelcase": "off", + "no-extra-semi": "error" + }, + "parserOptions": { + "allowImportExportEverywhere": true, + "ecmaVersion": 2020, + "ecmaFeatures": { + "impliedStrict": true + }, + "sourceType": "module" + } } diff --git a/.prettierrc b/.prettierrc index 0b03816..40b6dab 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,10 +1,10 @@ { - "bracketSameLine": true, - "singleQuote": false, - "trailingComma": "es5", - "endOfLine": "lf", - "tabWidth": 4, - "semi": false, - "useTabs": true, - "plugins": [] + "bracketSameLine": true, + "singleQuote": false, + "trailingComma": "es5", + "endOfLine": "lf", + "tabWidth": 4, + "semi": false, + "useTabs": false, + "plugins": [] } diff --git a/drizzle.config.ts b/drizzle.config.ts index f41fcd6..4a288f6 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -3,14 +3,14 @@ const { TURSO_DATABASE_AUTH_TOKEN, TURSO_DATABASE_URL } = process.env import type { Config } from "drizzle-kit" export default { - out: "./src/v2/db/migrations", - schema: "./src/v2/db/schema.ts", - driver: "turso", - breakpoints: true, - strict: true, - verbose: true, - dbCredentials: { - url: TURSO_DATABASE_URL as string, - authToken: TURSO_DATABASE_AUTH_TOKEN as string, - }, + out: "./src/v2/db/migrations", + schema: "./src/v2/db/schema.ts", + driver: "turso", + breakpoints: true, + strict: true, + verbose: true, + dbCredentials: { + url: TURSO_DATABASE_URL as string, + authToken: TURSO_DATABASE_AUTH_TOKEN as string, + }, } satisfies Config diff --git a/package.json b/package.json index 4fe60d4..3c446db 100644 --- a/package.json +++ b/package.json @@ -1,39 +1,39 @@ { - "name": "wanderer-moe-api", - "version": "1.0.1b", - "scripts": { - "prettier:fmt": "prettier --write .", - "dev": "wrangler dev --remote", - "publish": "wrangler publish --minify", - "lint": "eslint . --ext .ts", - "prettier:check": "prettier --check .", - "typecheck": "tsc --noEmit", - "drizzle:generate": "drizzle-kit generate:sqlite", - "drizzle:push": "drizzle-kit push:sqlite" - }, - "devDependencies": { - "@cloudflare/workers-types": "^4.20230904.0", - "@types/node": "^20.6.0", - "dotenv": "^16.3.1", - "drizzle-kit": "^0.19.13", - "eslint": "^8.49.0", - "eslint-config-google": "^0.14.0", - "eslint-plugin-json": "^3.1.0", - "husky": "^8.0.3", - "tsx": "^3.12.10", - "typescript": "^5.2.2", - "wrangler": "3.8.0" - }, - "private": true, - "dependencies": { - "@libsql/client": "0.3.4", - "@lucia-auth/adapter-sqlite": "^2.0.0", - "@typescript-eslint/eslint-plugin": "^6.7.0", - "drizzle-orm": "^0.28.6", - "hono": "^3.6.0", - "lucia": "^2.6.0", - "mysql2": "^3.6.1", - "prettier": "^3.0.3", - "resend": "^1.0.0" - } + "name": "wanderer-moe-api", + "version": "1.0.1b", + "scripts": { + "prettier:fmt": "prettier --write .", + "dev": "wrangler dev --remote", + "publish": "wrangler publish --minify", + "lint": "eslint . --ext .ts", + "prettier:check": "prettier --check .", + "typecheck": "tsc --noEmit", + "drizzle:generate": "drizzle-kit generate:sqlite", + "drizzle:push": "drizzle-kit push:sqlite" + }, + "devDependencies": { + "@cloudflare/workers-types": "^4.20230904.0", + "@types/node": "^20.6.0", + "dotenv": "^16.3.1", + "drizzle-kit": "^0.19.13", + "eslint": "^8.49.0", + "eslint-config-google": "^0.14.0", + "eslint-plugin-json": "^3.1.0", + "husky": "^8.0.3", + "tsx": "^3.12.10", + "typescript": "^5.2.2", + "wrangler": "3.8.0" + }, + "private": true, + "dependencies": { + "@libsql/client": "0.3.4", + "@lucia-auth/adapter-sqlite": "^2.0.0", + "@typescript-eslint/eslint-plugin": "^6.7.0", + "drizzle-orm": "^0.28.6", + "hono": "^3.6.0", + "lucia": "^2.6.0", + "mysql2": "^3.6.1", + "prettier": "^3.0.3", + "resend": "^1.0.0" + } } diff --git a/renovate.json b/renovate.json index 7ec37f6..5d39e8b 100644 --- a/renovate.json +++ b/renovate.json @@ -1,4 +1,4 @@ { - "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": ["config:base"] + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": ["config:base"] } diff --git a/src/index.ts b/src/index.ts index f6e4681..27f9f46 100644 --- a/src/index.ts +++ b/src/index.ts @@ -6,20 +6,19 @@ import gamesRoute from "./v2/routes/games/gamesRoute" import authRoute from "./v2/routes/auth/authRoute" import searchRoute from "./v2/routes/search/searchRoute" import { getRuntimeKey } from "hono/adapter" -import { Bindings } from "@/worker-configuration" const app = new Hono<{ Bindings: Bindings }>() app.get("/status", (c) => { - c.status(200) - return c.json({ - status: "ok", - runtime: getRuntimeKey(), - }) + c.status(200) + return c.json({ + status: "ok", + runtime: getRuntimeKey(), + }) }) app.get("/", (c) => { - c.status(200) - return c.json({ success: "true", status: "ok", routes: app.routes }) + c.status(200) + return c.json({ success: "true", status: "ok", routes: app.routes }) }) app.route("/v2/asset", assetRoute) app.route("/v2/discord", discordRoute) @@ -28,8 +27,8 @@ app.route("/v2/search", searchRoute) app.route("/v2/games", gamesRoute) app.route("/v2/auth", authRoute) app.all("*", (c) => { - c.status(404) - return c.json({ success: false, status: "error", error: "Not Found" }) + c.status(404) + return c.json({ success: false, status: "error", error: "Not Found" }) }) // https://hono.dev/api/hono#showroutes diff --git a/src/lucia.d.ts b/src/lucia.d.ts index 5e3d8e7..43e1d81 100644 --- a/src/lucia.d.ts +++ b/src/lucia.d.ts @@ -1,23 +1,25 @@ /// declare namespace Lucia { - type Auth = import("./v2/lib/auth/lucia").Auth - type DatabaseUserAttributes = { - username: string - username_colour: string | null - avatar_url: string | null - banner_url: string | null - email: string - email_verified: number - pronouns: string | null - is_contributor: number - verified: number - bio: string | null - role_flags: number - self_assignable_role_flags: number | null - date_joined: number - } - type DatabaseSessionAttributes = { - country_code: string - user_agent: string - } + type Auth = import("./v2/lib/auth/lucia").Auth + type DatabaseUserAttributes = { + username: string + username_colour: string | null + avatar_url: string | null + banner_url: string | null + email: string + email_verified: number + pronouns: string | null + is_contributor: number + verified: number + bio: string | null + role_flags: number + self_assignable_role_flags: number | null + date_joined: number + } + // stored to prevent session hijacking by checking if the session attributes match the ones stored in the database + type DatabaseSessionAttributes = { + country_code: string + user_agent: string + ip_address: string + } } diff --git a/src/v2/db/drizzle.ts b/src/v2/db/drizzle.ts index 2faf860..68f5440 100644 --- a/src/v2/db/drizzle.ts +++ b/src/v2/db/drizzle.ts @@ -1,24 +1,24 @@ export const tableNames = { - assets: "assets", - authKey: "authKey", - authSession: "authSession", - authUser: "authUser", - emailVerificationTokens: "emailVerificationToken", - follower: "follower", - following: "following", - gameAssetCategories: "gameAssetCategories", - games: "games", - assetTags: "assetTags", - assetTagsAssets: "assetTagsAssets", - emailVerificationToken: "emailVerificationToken", - passwordResetToken: "passwordResetToken", - assetCategories: "assetCategories", - savedOcGenerators: "savedOcGenerators", - userFavorites: "userFavorites", - userFavoritesAssets: "userFavoritesAssets", - userCollections: "assetCollection", - userCollectionAssets: "assetCollectionAsset", - socialsConnections: "socialsConnections", + assets: "assets", + authKey: "authKey", + authSession: "authSession", + authUser: "authUser", + emailVerificationTokens: "emailVerificationToken", + follower: "follower", + following: "following", + gameAssetCategories: "gameAssetCategories", + games: "games", + assetTags: "assetTags", + assetTagsAssets: "assetTagsAssets", + emailVerificationToken: "emailVerificationToken", + passwordResetToken: "passwordResetToken", + assetCategories: "assetCategories", + savedOcGenerators: "savedOcGenerators", + userFavorites: "userFavorites", + userFavoritesAssets: "userFavoritesAssets", + userCollections: "assetCollection", + userCollectionAssets: "assetCollectionAsset", + socialsConnections: "socialsConnections", } export * as schema from "@/v2/db/schema" diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index 2911052..528339c 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -1,538 +1,539 @@ import { tableNames } from "@/v2/db/drizzle" import { relations } from "drizzle-orm" import { - sqliteTable, - text, - integer, - uniqueIndex, + sqliteTable, + text, + integer, + uniqueIndex, } from "drizzle-orm/sqlite-core" // TODO: move tables into seperate appropiate files export const users = sqliteTable( - tableNames.authUser, - { - id: text("id").primaryKey(), - avatarUrl: text("avatar_url"), - bannerUrl: text("banner_url"), - username: text("username").notNull(), - usernameColour: text("username_colour"), - email: text("email").notNull(), - emailVerified: integer("email_verified").default(0).notNull(), - pronouns: text("pronouns"), - verified: integer("verified").default(0).notNull(), - bio: text("bio").default("No bio set").notNull(), - dateJoined: integer("date_joined").notNull(), - roleFlags: integer("role_flags").default(1).notNull(), - isContributor: integer("is_contributor").default(0).notNull(), - selfAssignableRoleFlags: integer("self_assignable_role_flags"), - }, - (user) => { - return { - userIdx: uniqueIndex("user_id_idx").on(user.id), - usernameIdx: uniqueIndex("user_username_idx").on(user.username), - emailIdx: uniqueIndex("user_email_idx").on(user.email), - } - } + tableNames.authUser, + { + id: text("id").primaryKey(), + avatarUrl: text("avatar_url"), + bannerUrl: text("banner_url"), + username: text("username").notNull(), + usernameColour: text("username_colour"), + email: text("email").notNull(), + emailVerified: integer("email_verified").default(0).notNull(), + pronouns: text("pronouns"), + verified: integer("verified").default(0).notNull(), + bio: text("bio").default("No bio set").notNull(), + dateJoined: integer("date_joined").notNull(), + roleFlags: integer("role_flags").default(1).notNull(), + isContributor: integer("is_contributor").default(0).notNull(), + selfAssignableRoleFlags: integer("self_assignable_role_flags"), + }, + (user) => { + return { + userIdx: uniqueIndex("user_id_idx").on(user.id), + usernameIdx: uniqueIndex("user_username_idx").on(user.username), + emailIdx: uniqueIndex("user_email_idx").on(user.email), + } + } ) export const sessions = sqliteTable( - tableNames.authSession, - { - id: text("id").primaryKey(), - userId: text("user_id") - .notNull() - .references(() => users.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - activeExpires: integer("active_expires").notNull(), - idleExpires: integer("idle_expires").notNull(), - userAgent: text("user_agent").notNull(), - countryCode: text("country_code").notNull(), - }, - (session) => { - return { - userIdx: uniqueIndex("session_user_id_idx").on(session.userId), - } - } + tableNames.authSession, + { + id: text("id").primaryKey(), + userId: text("user_id") + .notNull() + .references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + activeExpires: integer("active_expires").notNull(), + idleExpires: integer("idle_expires").notNull(), + userAgent: text("user_agent").notNull(), + countryCode: text("country_code").notNull(), + }, + (session) => { + return { + userIdx: uniqueIndex("session_user_id_idx").on(session.userId), + } + } ) export const keys = sqliteTable( - tableNames.authKey, - { - id: text("id").primaryKey(), - userId: text("user_id") - .notNull() - .references(() => users.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - hashedPassword: text("hashed_password"), - }, - (key) => { - return { - userIdx: uniqueIndex("key_user_id_idx").on(key.userId), - } - } + tableNames.authKey, + { + id: text("id").primaryKey(), + userId: text("user_id") + .notNull() + .references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + hashedPassword: text("hashed_password"), + }, + (key) => { + return { + userIdx: uniqueIndex("key_user_id_idx").on(key.userId), + } + } ) export const socialsConnections = sqliteTable( - tableNames.socialsConnections, - { - id: text("id").primaryKey(), - userId: text("user_id") - .notNull() - .references(() => users.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - discordId: text("discord_id"), - }, - (socialsConnection) => { - return { - userIdx: uniqueIndex("socials_connection_user_id_idx").on( - socialsConnection.userId - ), - } - } + tableNames.socialsConnections, + { + id: text("id").primaryKey(), + userId: text("user_id") + .notNull() + .references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + discordId: text("discord_id"), + }, + (socialsConnection) => { + return { + userIdx: uniqueIndex("socials_connection_user_id_idx").on( + socialsConnection.userId + ), + } + } ) export const games = sqliteTable( - tableNames.games, - { - id: text("id").primaryKey(), - name: text("name").notNull(), - formattedName: text("formatted_name").notNull(), - assetCount: integer("asset_count").default(0), - lastUpdated: integer("last_updated").notNull(), - }, - (game) => { - return { - gameIdx: uniqueIndex("game_id_idx").on(game.id), - nameIdx: uniqueIndex("game_name_idx").on(game.name), - } - } + tableNames.games, + { + id: text("id").primaryKey(), + name: text("name").notNull(), + formattedName: text("formatted_name").notNull(), + assetCount: integer("asset_count").default(0), + lastUpdated: integer("last_updated").notNull(), + }, + (game) => { + return { + gameIdx: uniqueIndex("game_id_idx").on(game.id), + nameIdx: uniqueIndex("game_name_idx").on(game.name), + } + } ) export const assetCategories = sqliteTable( - tableNames.assetCategories, - { - id: text("id").primaryKey(), - name: text("name").notNull(), // e.g genshin-impact, honkai-impact-3rd - formattedName: text("formatted_name").notNull(), // e.g Genshin Impact, Honkai Impact 3rd - assetCount: integer("asset_count").default(0).notNull(), - lastUpdated: integer("last_updated").notNull(), - }, - (assetCategory) => { - return { - assetCategoryIdx: uniqueIndex("asset_category_id_idx").on( - assetCategory.id - ), - nameIdx: uniqueIndex("asset_category_name_idx").on( - assetCategory.name - ), - } - } + tableNames.assetCategories, + { + id: text("id").primaryKey(), + name: text("name").notNull(), // e.g genshin-impact, honkai-impact-3rd + formattedName: text("formatted_name").notNull(), // e.g Genshin Impact, Honkai Impact 3rd + assetCount: integer("asset_count").default(0).notNull(), + lastUpdated: integer("last_updated").notNull(), + }, + (assetCategory) => { + return { + assetCategoryIdx: uniqueIndex("asset_category_id_idx").on( + assetCategory.id + ), + nameIdx: uniqueIndex("asset_category_name_idx").on( + assetCategory.name + ), + } + } ) export const assets = sqliteTable( - tableNames.assets, - { - id: integer("id").primaryKey(), // primary key auto increments on sqlite - name: text("name").notNull(), - extension: text("extension").notNull(), - game: text("game") - .notNull() - .references(() => games.name, { - onUpdate: "cascade", - onDelete: "cascade", - }), - assetCategory: text("asset_category") - .notNull() - .references(() => assetCategories.name, { - onUpdate: "cascade", - onDelete: "cascade", - }), - url: text("url").notNull(), - status: integer("status").notNull(), - uploadedById: text("uploaded_by").references(() => users.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - uploadedByName: text("uploaded_by_name").references( - () => users.username, - { - onUpdate: "cascade", - onDelete: "cascade", - } - ), - uploadedDate: integer("uploaded_date").notNull(), - assetIsOptimized: integer("asset_is_optimized").default(0).notNull(), - viewCount: integer("view_count").default(0).notNull(), - downloadCount: integer("download_count").default(0).notNull(), - fileSize: integer("file_size").default(0).notNull(), - width: integer("width").default(0).notNull(), - height: integer("height").default(0).notNull(), - }, - (table) => { - return { - idIdx: uniqueIndex("assets_id_idx").on(table.id), - nameIdx: uniqueIndex("assets_name_idx").on(table.name), - gameIdx: uniqueIndex("assets_game_idx").on(table.game), - assetCategoryIdx: uniqueIndex("assets_asset_category_idx").on( - table.assetCategory - ), - uploadedByIdIdx: uniqueIndex("assets_uploaded_by_idx").on( - table.uploadedById - ), - uploadedByNameIdx: uniqueIndex("assets_uploaded_by_name_idx").on( - table.uploadedByName - ), - } - } + tableNames.assets, + { + id: integer("id").primaryKey(), // primary key auto increments on sqlite + name: text("name").notNull(), + extension: text("extension").notNull(), + game: text("game") + .notNull() + .references(() => games.name, { + onUpdate: "cascade", + onDelete: "cascade", + }), + assetCategory: text("asset_category") + .notNull() + .references(() => assetCategories.name, { + onUpdate: "cascade", + onDelete: "cascade", + }), + url: text("url").notNull(), + status: integer("status").notNull(), + uploadedById: text("uploaded_by").references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + uploadedByName: text("uploaded_by_name").references( + () => users.username, + { + onUpdate: "cascade", + onDelete: "cascade", + } + ), + uploadedDate: integer("uploaded_date").notNull(), + assetIsOptimized: integer("asset_is_optimized").default(0).notNull(), + viewCount: integer("view_count").default(0).notNull(), + downloadCount: integer("download_count").default(0).notNull(), + fileSize: integer("file_size").default(0).notNull(), + width: integer("width").default(0).notNull(), + height: integer("height").default(0).notNull(), + }, + (table) => { + return { + idIdx: uniqueIndex("assets_id_idx").on(table.id), + nameIdx: uniqueIndex("assets_name_idx").on(table.name), + gameIdx: uniqueIndex("assets_game_idx").on(table.game), + assetCategoryIdx: uniqueIndex("assets_asset_category_idx").on( + table.assetCategory + ), + uploadedByIdIdx: uniqueIndex("assets_uploaded_by_idx").on( + table.uploadedById + ), + uploadedByNameIdx: uniqueIndex("assets_uploaded_by_name_idx").on( + table.uploadedByName + ), + } + } ) export const assetTags = sqliteTable( - tableNames.assetTags, - { - id: text("id").primaryKey(), - name: text("name").notNull(), - formattedName: text("formatted_name").notNull(), - assetCount: integer("asset_count").default(0).notNull(), - lastUpdated: integer("last_updated").notNull(), - }, - (assetTag) => { - return { - assetTagIdx: uniqueIndex("asset_tag_id_idx").on(assetTag.id), - nameIdx: uniqueIndex("asset_tag_name_idx").on(assetTag.name), - } - } + tableNames.assetTags, + { + id: text("id").primaryKey(), + name: text("name").notNull(), + formattedName: text("formatted_name").notNull(), + assetCount: integer("asset_count").default(0).notNull(), + lastUpdated: integer("last_updated").notNull(), + }, + (assetTag) => { + return { + assetTagIdx: uniqueIndex("asset_tag_id_idx").on(assetTag.id), + nameIdx: uniqueIndex("asset_tag_name_idx").on(assetTag.name), + } + } ) export const assetTagsAssets = sqliteTable( - tableNames.assetTagsAssets, - { - id: text("id").primaryKey(), - assetTagId: text("asset_tag_id") - .notNull() - .references(() => assetTags.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - assetId: integer("asset_id") - .notNull() - .references(() => assets.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - }, - (assetTagsAssets) => { - return { - assetTagsAssetsIdx: uniqueIndex("asset_tags_assets_id_idx").on( - assetTagsAssets.id - ), - assetTagsAssetsAssetTagIdx: uniqueIndex( - "asset_tags_assets_asset_tag_id_idx" - ).on(assetTagsAssets.assetTagId), - assetTagsAssetsAssetIdx: uniqueIndex( - "asset_tags_assets_asset_id_idx" - ).on(assetTagsAssets.assetId), - } - } + tableNames.assetTagsAssets, + { + id: text("id").primaryKey(), + assetTagId: text("asset_tag_id") + .notNull() + .references(() => assetTags.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + assetId: integer("asset_id") + .notNull() + .references(() => assets.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + }, + (assetTagsAssets) => { + return { + assetTagsAssetsIdx: uniqueIndex("asset_tags_assets_id_idx").on( + assetTagsAssets.id + ), + assetTagsAssetsAssetTagIdx: uniqueIndex( + "asset_tags_assets_asset_tag_id_idx" + ).on(assetTagsAssets.assetTagId), + assetTagsAssetsAssetIdx: uniqueIndex( + "asset_tags_assets_asset_id_idx" + ).on(assetTagsAssets.assetId), + } + } ) export const following = sqliteTable(tableNames.following, { - id: text("id").primaryKey(), - followerUserId: text("follower_id") - .notNull() - .references(() => users.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - followingUserId: text("following_id") - .notNull() - .references(() => users.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), + id: text("id").primaryKey(), + followerUserId: text("follower_id") + .notNull() + .references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + followingUserId: text("following_id") + .notNull() + .references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), }) export const follower = sqliteTable(tableNames.follower, { - id: text("id").primaryKey(), - followerUserId: text("follower_id") - .notNull() - .references(() => users.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - followingUserId: text("following_id") - .notNull() - .references(() => users.id), + id: text("id").primaryKey(), + followerUserId: text("follower_id") + .notNull() + .references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + followingUserId: text("following_id") + .notNull() + .references(() => users.id), }) export const userFavorites = sqliteTable( - tableNames.userFavorites, - { - id: text("id").primaryKey(), - userId: text("user_id") - .notNull() - .references(() => users.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - isPublic: integer("is_public").default(0).notNull(), - }, - (userFavorites) => { - return { - favoritedAssetsIdx: uniqueIndex("favorited_assets_id_idx").on( - userFavorites.id - ), - favoritedAssetsUserIdx: uniqueIndex( - "favorited_assets_user_id_idx" - ).on(userFavorites.userId), - } - } + tableNames.userFavorites, + { + id: text("id").primaryKey(), + userId: text("user_id") + .notNull() + .references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + isPublic: integer("is_public").default(0).notNull(), + }, + (userFavorites) => { + return { + favoritedAssetsIdx: uniqueIndex("favorited_assets_id_idx").on( + userFavorites.id + ), + favoritedAssetsUserIdx: uniqueIndex( + "favorited_assets_user_id_idx" + ).on(userFavorites.userId), + } + } ) export const userFavoritesAssets = sqliteTable( - tableNames.userFavoritesAssets, - { - id: text("id").primaryKey(), - userFavoritesId: text("favorited_assets_id") - .notNull() - .references(() => userFavorites.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - assetId: integer("asset_id") - .notNull() - .references(() => assets.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - }, - (userFavoritesAssets) => { - return { - favoritedAssetsAssetsIdx: uniqueIndex( - "favorited_assets_assets_id_idx" - ).on(userFavoritesAssets.id), - favoritedAssetsAssetsUserIdx: uniqueIndex( - "favorited_assets_assets_user_id_idx" - ).on(userFavoritesAssets.userFavoritesId), - favoritedAssetsAssetsAssetIdx: uniqueIndex( - "favorited_assets_assets_asset_id_idx" - ).on(userFavoritesAssets.assetId), - } - } + tableNames.userFavoritesAssets, + { + id: text("id").primaryKey(), + userFavoritesId: text("favorited_assets_id") + .notNull() + .references(() => userFavorites.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + assetId: integer("asset_id") + .notNull() + .references(() => assets.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + }, + (userFavoritesAssets) => { + return { + favoritedAssetsAssetsIdx: uniqueIndex( + "favorited_assets_assets_id_idx" + ).on(userFavoritesAssets.id), + favoritedAssetsAssetsUserIdx: uniqueIndex( + "favorited_assets_assets_user_id_idx" + ).on(userFavoritesAssets.userFavoritesId), + favoritedAssetsAssetsAssetIdx: uniqueIndex( + "favorited_assets_assets_asset_id_idx" + ).on(userFavoritesAssets.assetId), + } + } ) export const userCollections = sqliteTable( - tableNames.userCollections, - { - id: text("id").primaryKey(), - name: text("name").notNull(), - description: text("description").notNull(), - userId: text("user_id") - .notNull() - .references(() => users.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - dateCreated: integer("date_created").notNull(), - isPublic: integer("is_public").default(0).notNull(), - }, - (collection) => { - return { - collectionIdx: uniqueIndex("collection_id_idx").on(collection.id), - userCollectionIdx: uniqueIndex("user_collection_id_idx").on( - collection.userId - ), - } - } + tableNames.userCollections, + { + id: text("id").primaryKey(), + name: text("name").notNull(), + description: text("description").notNull(), + userId: text("user_id") + .notNull() + .references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + dateCreated: integer("date_created").notNull(), + isPublic: integer("is_public").default(0).notNull(), + }, + (collection) => { + return { + collectionIdx: uniqueIndex("collection_id_idx").on(collection.id), + userCollectionIdx: uniqueIndex("user_collection_id_idx").on( + collection.userId + ), + } + } ) export const userCollectionAssets = sqliteTable( - tableNames.userCollectionAssets, - { - id: text("id").primaryKey(), - collectionId: text("collection_id") - .notNull() - .references(() => userCollections.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - assetId: integer("asset_id") - .notNull() - .references(() => assets.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - }, - (collectionAssets) => { - return { - collectionAssetsIdx: uniqueIndex("collection_assets_id_idx").on( - collectionAssets.id - ), - collectionAssetsCollectionIdx: uniqueIndex( - "collection_assets_collection_id_idx" - ).on(collectionAssets.collectionId), - collectionAssetsAssetIdx: uniqueIndex( - "collection_assets_asset_id_idx" - ).on(collectionAssets.assetId), - } - } + tableNames.userCollectionAssets, + { + id: text("id").primaryKey(), + collectionId: text("collection_id") + .notNull() + .references(() => userCollections.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + assetId: integer("asset_id") + .notNull() + .references(() => assets.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + }, + (collectionAssets) => { + return { + collectionAssetsIdx: uniqueIndex("collection_assets_id_idx").on( + collectionAssets.id + ), + collectionAssetsCollectionIdx: uniqueIndex( + "collection_assets_collection_id_idx" + ).on(collectionAssets.collectionId), + collectionAssetsAssetIdx: uniqueIndex( + "collection_assets_asset_id_idx" + ).on(collectionAssets.assetId), + } + } ) export const savedOcGenerators = sqliteTable( - tableNames.savedOcGenerators, - { - id: text("id").primaryKey(), - userId: text("user_id") - .notNull() - .references(() => users.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - name: text("name").notNull(), - game: text("game").notNull(), - dateCreated: integer("date_created").notNull(), - isPublic: integer("is_public").default(0).notNull(), - content: text("content").notNull(), // this is stored as json, which is then parsed on the frontend - }, - (savedOcGenerators) => { - return { - savedOcGeneratorsIdx: uniqueIndex("saved_oc_generators_id_idx").on( - savedOcGenerators.id - ), - savedOcGeneratorsUserIdx: uniqueIndex( - "saved_oc_generators_user_id_idx" - ).on(savedOcGenerators.userId), - } - } + tableNames.savedOcGenerators, + { + id: text("id").primaryKey(), + userId: text("user_id") + .notNull() + .references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + name: text("name").notNull(), + game: text("game").notNull(), + dateCreated: integer("date_created").notNull(), + isPublic: integer("is_public").default(0).notNull(), + content: text("content").notNull(), // this is stored as json, which is then parsed on the frontend + savedColorPalette: text("saved_color_palette"), // array of 5 hex values, completely optional + }, + (savedOcGenerators) => { + return { + savedOcGeneratorsIdx: uniqueIndex("saved_oc_generators_id_idx").on( + savedOcGenerators.id + ), + savedOcGeneratorsUserIdx: uniqueIndex( + "saved_oc_generators_user_id_idx" + ).on(savedOcGenerators.userId), + } + } ) // relations export const gameRelations = relations(games, ({ many }) => ({ - assets: many(assets), + assets: many(assets), })) export const assetRelations = relations(assets, ({ one, many }) => ({ - uploadedBy: one(users, { - fields: [assets.uploadedById, assets.uploadedByName], - references: [users.id, users.username], - }), - assetTagsAssets: many(assetTagsAssets), - assetCategory: one(assetCategories, { - fields: [assets.assetCategory], - references: [assetCategories.name], - }), - game: one(games, { - fields: [assets.game], - references: [games.name], - }), + uploadedBy: one(users, { + fields: [assets.uploadedById, assets.uploadedByName], + references: [users.id, users.username], + }), + assetTagsAssets: many(assetTagsAssets), + assetCategory: one(assetCategories, { + fields: [assets.assetCategory], + references: [assetCategories.name], + }), + game: one(games, { + fields: [assets.game], + references: [games.name], + }), })) export const assetCategoryRelations = relations( - assetCategories, - ({ many }) => ({ - assets: many(assets), - }) + assetCategories, + ({ many }) => ({ + assets: many(assets), + }) ) export const assetTagsAssetsRelations = relations( - assetTagsAssets, - ({ one }) => ({ - assetTag: one(assetTags, { - fields: [assetTagsAssets.assetTagId], - references: [assetTags.id], - }), - asset: one(assets, { - fields: [assetTagsAssets.assetId], - references: [assets.id], - }), - }) + assetTagsAssets, + ({ one }) => ({ + assetTag: one(assetTags, { + fields: [assetTagsAssets.assetTagId], + references: [assetTags.id], + }), + asset: one(assets, { + fields: [assetTagsAssets.assetId], + references: [assets.id], + }), + }) ) export const collectionRelations = relations( - userCollections, - ({ one, many }) => ({ - user: one(users, { - fields: [userCollections.userId], - references: [users.id], - }), - assets: many(userCollectionAssets), - }) + userCollections, + ({ one, many }) => ({ + user: one(users, { + fields: [userCollections.userId], + references: [users.id], + }), + assets: many(userCollectionAssets), + }) ) export const collectionAssetsRelations = relations( - userCollectionAssets, - ({ one }) => ({ - collection: one(userCollections, { - fields: [userCollectionAssets.collectionId], - references: [userCollections.id], - }), - asset: one(assets, { - fields: [userCollectionAssets.assetId], - references: [assets.id], - }), - }) + userCollectionAssets, + ({ one }) => ({ + collection: one(userCollections, { + fields: [userCollectionAssets.collectionId], + references: [userCollections.id], + }), + asset: one(assets, { + fields: [userCollectionAssets.assetId], + references: [assets.id], + }), + }) ) export const userFavoritesRelations = relations(userFavorites, ({ one }) => ({ - user: one(users, { - fields: [userFavorites.userId], - references: [users.id], - }), + user: one(users, { + fields: [userFavorites.userId], + references: [users.id], + }), })) export const userFavoritesAssetsRelations = relations( - userFavoritesAssets, - ({ one }) => ({ - favoritedAssets: one(userFavorites, { - fields: [userFavoritesAssets.userFavoritesId], - references: [userFavorites.id], - }), - asset: one(assets, { - fields: [userFavoritesAssets.assetId], - references: [assets.id], - }), - }) + userFavoritesAssets, + ({ one }) => ({ + favoritedAssets: one(userFavorites, { + fields: [userFavoritesAssets.userFavoritesId], + references: [userFavorites.id], + }), + asset: one(assets, { + fields: [userFavoritesAssets.assetId], + references: [assets.id], + }), + }) ) export const sessionsRelations = relations(sessions, ({ one }) => ({ - user: one(users, { - fields: [sessions.userId], - references: [users.id], - }), + user: one(users, { + fields: [sessions.userId], + references: [users.id], + }), })) export const keysRelations = relations(keys, ({ one }) => ({ - user: one(users, { - fields: [keys.userId], - references: [users.id], - }), + user: one(users, { + fields: [keys.userId], + references: [users.id], + }), })) export const socialsConnectionsRelations = relations( - socialsConnections, - ({ one }) => ({ - user: one(users, { - fields: [socialsConnections.userId], - references: [users.id], - }), - }) + socialsConnections, + ({ one }) => ({ + user: one(users, { + fields: [socialsConnections.userId], + references: [users.id], + }), + }) ) export const usersRelations = relations(users, ({ one, many }) => ({ - session: many(sessions), - key: many(keys), - assets: many(assets), - follower: many(follower), - userFavorites: one(userFavorites), - following: many(following), - socialsConnection: one(socialsConnections), - userCollections: many(userCollections), - savedOcGenerators: many(savedOcGenerators), + session: many(sessions), + key: many(keys), + assets: many(assets), + follower: many(follower), + userFavorites: one(userFavorites), + following: many(following), + socialsConnection: one(socialsConnections), + userCollections: many(userCollections), + savedOcGenerators: many(savedOcGenerators), })) // export types diff --git a/src/v2/db/turso.ts b/src/v2/db/turso.ts index 21ef799..3c128e7 100644 --- a/src/v2/db/turso.ts +++ b/src/v2/db/turso.ts @@ -1,29 +1,49 @@ -import { Bindings as Env } from "@/worker-configuration" import * as schema from "@/v2/db/schema" import { drizzle as drizzleORM } from "drizzle-orm/libsql" import { createClient } from "@libsql/client/web" // because we're in a worker import { Logger } from "drizzle-orm/logger" +/** + * The `LoggerWrapper` class is used to wrap the `Logger` interface from `drizzle-orm` and provide a custom implementation of the `logQuery` method. + * It logs the query and its parameters to the console. + */ class LoggerWrapper implements Logger { - logQuery(query: string, params: unknown[]): void { - console.log(`DRIZZLE: Query: ${query}, Paremeters: ${params ?? "none"}`) - } + /** + * Logs the query and its parameters to the console. + * @param query - The SQL query string. + * @param params - The parameters passed to the query. + */ + logQuery(query: string, params: unknown[]): void { + console.log(`DRIZZLE: Query: ${query}, Paremeters: ${params ?? "none"}`) + } } -// wrapper for turso & drizzle -export function getConnection(env: Env) { - const turso = createClient({ - url: env.TURSO_DATABASE_URL, - authToken: env.TURSO_DATABASE_AUTH_TOKEN, - }) +/** + * The `getConnection` function is used to create a connection to the Turso database and initialize a `drizzle-orm` instance. + * @param env - The environment variables used to configure the connection. + * @returns An object containing the `drizzle-orm` instance and the Turso client. + */ +export function getConnection(env: Bindings) { + /** + * The `turso` client is created using the `createClient` function from `@libsql/client/web`. + */ + const turso = createClient({ + url: env.TURSO_DATABASE_URL, + authToken: env.TURSO_DATABASE_AUTH_TOKEN, + }) - const drizzle = drizzleORM(turso, { - schema, - logger: new LoggerWrapper(), - }) + /** + * The `drizzle` instance is created using the `drizzleORM` function from `drizzle-orm/libsql`. + * It is initialized with the `turso` client and the `schema` object. + * A `LoggerWrapper` instance is also passed to the `logger` option to customize the logging behavior. + */ + const drizzle = drizzleORM(turso, { + schema, + logger: new LoggerWrapper(), + }) - return { - drizzle, - turso, - } + return { + drizzle, + turso, + } } diff --git a/src/v2/lib/auth/lucia.ts b/src/v2/lib/auth/lucia.ts index 3e6c245..15bd82a 100644 --- a/src/v2/lib/auth/lucia.ts +++ b/src/v2/lib/auth/lucia.ts @@ -1,58 +1,66 @@ import { lucia } from "lucia" import { hono } from "lucia/middleware" import { getConnection } from "@/v2/db/turso" -import { Bindings as Env } from "@/worker-configuration" import { tableNames } from "@/v2/db/drizzle" import { libsql } from "@lucia-auth/adapter-sqlite" -// this is so we can pass in env during requests, -// so, it would be called: auth(c.env)... instead of auth -export const auth = (env: Env) => { - const db = getConnection(env) - const connection = db.turso +/** + * The `auth` function is used to create a `lucia` instance with authentication middleware and a `libsql` adapter. + * @param env - The environment variables used to configure the authentication middleware and adapter. + * @returns A `lucia` instance with authentication middleware and a `libsql` adapter. + */ +export const auth = (env: Bindings) => { + const db = getConnection(env) - return lucia({ - adapter: libsql(connection, { - key: tableNames.authKey, - session: tableNames.authSession, - user: tableNames.authUser, - }), - middleware: hono(), - sessionExpiresIn: { - idlePeriod: 0, - activePeriod: 30 * 24 * 60 * 60 * 1000, // 30 days - }, - env: env.ENVIRONMENT === "DEV" ? "DEV" : "PROD", - experimental: { - debugMode: env.ENVIRONMENT === "DEV" ? true : false, - }, - csrfProtection: { - enabled: true, - allowedSubDomains: ["*"], - }, - getUserAttributes: (dbUser) => { - return { - username: dbUser.username, - usernameColour: dbUser.username_colour, - avatarUrl: dbUser.avatar_url, - bannerUrl: dbUser.banner_url, - email: dbUser.email, - emailVerified: dbUser.email_verified, - pronouns: dbUser.pronouns, - verified: dbUser.verified, - bio: dbUser.bio, - roleFlags: dbUser.role_flags, - selfAssignableRoleFlags: dbUser.self_assignable_role_flags, - dateJoined: dbUser.date_joined, - } - }, - getSessionAttributes: (dbSession) => { - return { - userAgent: dbSession.user_agent as string, - countryCode: dbSession.country_code as string, - } - }, - }) + // as lucia doesn't have a adapter for drizzle, we instead create a direct connection to the database using libsql + const connection = db.turso + + return lucia({ + adapter: libsql(connection, { + key: tableNames.authKey, + session: tableNames.authSession, + user: tableNames.authUser, + }), + middleware: hono(), + sessionExpiresIn: { + idlePeriod: 0, + activePeriod: 30 * 24 * 60 * 60 * 1000, // 30 days + }, + env: env.ENVIRONMENT === "DEV" ? "DEV" : "PROD", + experimental: { + debugMode: env.ENVIRONMENT === "DEV" ? true : false, + }, + csrfProtection: { + enabled: true, + allowedSubDomains: ["*"], + }, + getUserAttributes: (dbUser) => { + return { + username: dbUser.username, + usernameColour: dbUser.username_colour, + avatarUrl: dbUser.avatar_url, + bannerUrl: dbUser.banner_url, + email: dbUser.email, + emailVerified: dbUser.email_verified, + pronouns: dbUser.pronouns, + verified: dbUser.verified, + bio: dbUser.bio, + roleFlags: dbUser.role_flags, + selfAssignableRoleFlags: dbUser.self_assignable_role_flags, + dateJoined: dbUser.date_joined, + } + }, + getSessionAttributes: (dbSession) => { + return { + userAgent: dbSession.user_agent as string, + countryCode: dbSession.country_code as string, + ipAddress: dbSession.ip_address as string, + } + }, + }) } +/** + * The `Auth` type is a type alias for the `auth` function. + */ export type Auth = typeof auth diff --git a/src/v2/lib/discord.ts b/src/v2/lib/discord.ts index 78a44b7..0a273c9 100644 --- a/src/v2/lib/discord.ts +++ b/src/v2/lib/discord.ts @@ -1,12 +1,12 @@ export const roles: { [key: string]: string } = { - "982387185259012096": "Project Lead", - "1112182244572938310": "Developer", - "1038892176479895584": "Admin", - "1000916582538674249": "Senior Moderator", - "983817984923562034": "Moderator", - "1088105796908355584": "Translator", - "1005805438031364129": "Contributor", - "983883539772751912": "Server Booster", + "982387185259012096": "Project Lead", + "1112182244572938310": "Developer", + "1038892176479895584": "Admin", + "1000916582538674249": "Senior Moderator", + "983817984923562034": "Moderator", + "1088105796908355584": "Translator", + "1005805438031364129": "Contributor", + "983883539772751912": "Server Booster", } export const guildId = "982385887000272956" diff --git a/src/v2/lib/helpers/assetStatus.ts b/src/v2/lib/helpers/assetStatus.ts index 8f638d4..74bdd9d 100644 --- a/src/v2/lib/helpers/assetStatus.ts +++ b/src/v2/lib/helpers/assetStatus.ts @@ -1,5 +1,13 @@ +/** + * An object containing the possible status values for assets, as it's stored as an integer inside the database. + */ export const AssetStatus = { - 1: "APPROVED", - 2: "PENDING", - 3: "FLAGGED", + 1: "APPROVED", + 2: "PENDING", + 3: "FLAGGED", } + +/** + * An object containing the possible status values for assets, as it's stored as an integer inside the database. + */ +export type AssetStatusValue = keyof typeof AssetStatus diff --git a/src/v2/lib/helpers/rename.ts b/src/v2/lib/helpers/rename.ts index 2442526..7747d05 100644 --- a/src/v2/lib/helpers/rename.ts +++ b/src/v2/lib/helpers/rename.ts @@ -1,3 +1,8 @@ +/** + * Replaces all hyphens in a string with underscores. + * @param name - The string to rename. + * @returns The renamed string with all hyphens replaced by underscores. + */ export const rename = (name: string): string => { - return name.replace(/-/g, "_") + return name.replace(/-/g, "_") } diff --git a/src/v2/lib/helpers/responses/notFoundResponse.ts b/src/v2/lib/helpers/responses/notFoundResponse.ts index 96bbe03..97f1fa7 100644 --- a/src/v2/lib/helpers/responses/notFoundResponse.ts +++ b/src/v2/lib/helpers/responses/notFoundResponse.ts @@ -1,12 +1,12 @@ // helper function to create a 404 Not Found response export function createNotFoundResponse(c, errorMessage, responseHeaders) { - c.status(200) - return c.json( - { - success: false, - status: "error", - error: errorMessage, - }, - responseHeaders - ) + c.status(200) + return c.json( + { + success: false, + status: "error", + error: errorMessage, + }, + responseHeaders + ) } diff --git a/src/v2/lib/helpers/roleFlags.ts b/src/v2/lib/helpers/roleFlags.ts index 54b1e48..5da9fa2 100644 --- a/src/v2/lib/helpers/roleFlags.ts +++ b/src/v2/lib/helpers/roleFlags.ts @@ -1,43 +1,55 @@ -// bitwise for role flags allows for multiple roles to be assigned to a user, and for easy checking of roles - -// permission based roles +/** + * An object containing the bitwise values for permission-based roles. + */ export const roleFlags = { - USER: 1 << 0, - UPLOADER: 1 << 1, - CONTRIBUTOR: 1 << 2, - TRANSLATOR: 1 << 3, - STAFF: 1 << 4, - DEVELOPER: 1 << 5, - CREATOR: 1 << 6, + USER: 1 << 0, + UPLOADER: 1 << 1, + CONTRIBUTOR: 1 << 2, + TRANSLATOR: 1 << 3, + STAFF: 1 << 4, + DEVELOPER: 1 << 5, + CREATOR: 1 << 6, } +/** + * Converts a role flags integer to an array of role names. + * @param roleFlagsInt - The role flags integer to convert. + * @returns An array of role names. + */ export const roleFlagsToArray = (roleFlagsInt: number): string[] => { - const roles: string[] = [] + const roles: string[] = [] - for (const [role, flag] of Object.entries(roleFlags)) { - if (roleFlagsInt & flag) roles.push(role) - } + for (const [role, flag] of Object.entries(roleFlags)) { + if (roleFlagsInt & flag) roles.push(role) + } - return roles + return roles } -// self assignable roles +/** + * An object containing the bitwise values for self-assignable roles. + */ export const SelfAssignableRoleFlags = { - CONTENT_CREATOR: 1 << 0, - ARTIST: 1 << 1, - WRITER: 1 << 2, - DEVELOPER: 1 << 3, - DESIGNER: 1 << 4, + CONTENT_CREATOR: 1 << 0, + ARTIST: 1 << 1, + WRITER: 1 << 2, + DEVELOPER: 1 << 3, + DESIGNER: 1 << 4, } +/** + * Converts a self-assignable role flags integer to an array of role names. + * @param roleFlagsInt - The self-assignable role flags integer to convert. + * @returns An array of role names. + */ export const SelfAssignableRoleFlagsToArray = ( - roleFlagsInt: number + roleFlagsInt: number ): string[] => { - const roles: string[] = [] + const roles: string[] = [] - for (const [role, flag] of Object.entries(SelfAssignableRoleFlags)) { - if (roleFlagsInt & flag) roles.push(role) - } + for (const [role, flag] of Object.entries(SelfAssignableRoleFlags)) { + if (roleFlagsInt & flag) roles.push(role) + } - return roles + return roles } diff --git a/src/v2/lib/helpers/splitQueryByCommas.ts b/src/v2/lib/helpers/splitQueryByCommas.ts index dcd0337..896b6a0 100644 --- a/src/v2/lib/helpers/splitQueryByCommas.ts +++ b/src/v2/lib/helpers/splitQueryByCommas.ts @@ -1,3 +1,8 @@ -export function SplitQueryByCommas(query: string) { - return query.split(",").map((q) => q.trim()) +/** + * Splits a query string by commas and trims each resulting string. + * @param query - The query string to split. + * @returns An array of strings resulting from splitting the query string by commas and trimming each resulting string. + */ +export function SplitQueryByCommas(query: string): string[] { + return query.split(",").map((q) => q.trim()) } diff --git a/src/v2/lib/listBucket.ts b/src/v2/lib/listBucket.ts index 4a9e026..ef4f61d 100644 --- a/src/v2/lib/listBucket.ts +++ b/src/v2/lib/listBucket.ts @@ -1,3 +1,3 @@ -export const listBucket = async (bucket, options) => { - return await bucket.list(options) +export const listBucket = async (bucket: Bindings["bucket"], options) => { + return await bucket.list(options) } diff --git a/src/v2/lib/resend/email.ts b/src/v2/lib/resend/email.ts index ce17a59..9897690 100644 --- a/src/v2/lib/resend/email.ts +++ b/src/v2/lib/resend/email.ts @@ -4,64 +4,64 @@ import { Resend } from "resend" const resend = new Resend("") export const sendPasswordResetEmail = async ( - email: string, - link: string, - username: string + email: string, + link: string, + username: string ) => { - try { - await resend.emails.send({ - from: "Test ", - to: email, - subject: "Password Reset Request", - html: `Password reset for ${username}
Click here to reset your password`, - }) - } catch (error) { - throw new Error("Error sending password reset email.") - } + try { + await resend.emails.send({ + from: "Test ", + to: email, + subject: "Password Reset Request", + html: `Password reset for ${username}
Click here to reset your password`, + }) + } catch (error) { + throw new Error("Error sending password reset email.") + } } export const sendPasswordChangeEmail = async ( - email: string, - username: string + email: string, + username: string ) => { - try { - await resend.emails.send({ - from: "Test ", - to: email, - subject: "Password Updated Confirmation", - html: `Your password for ${username} has been updated.
Wasn't you? Contact us at support@wanderer.moe`, - }) - } catch (error) { - throw new Error("Error sending password change email.") - } + try { + await resend.emails.send({ + from: "Test ", + to: email, + subject: "Password Updated Confirmation", + html: `Your password for ${username} has been updated.
Wasn't you? Contact us at support@wanderer.moe`, + }) + } catch (error) { + throw new Error("Error sending password change email.") + } } export const sendEmailChangeEmail = async (email: string, username: string) => { - try { - await resend.emails.send({ - from: "Test ", - to: email, - subject: "Email Change Request", - html: `Your email address for ${username} has been changed.
Wasn't you? Contact us at support@wanderer.moe`, - }) - } catch (error) { - throw new Error("Error sending email change email.") - } + try { + await resend.emails.send({ + from: "Test ", + to: email, + subject: "Email Change Request", + html: `Your email address for ${username} has been changed.
Wasn't you? Contact us at support@wanderer.moe`, + }) + } catch (error) { + throw new Error("Error sending email change email.") + } } export const sendEmailConfirmationEmail = async ( - email: string, - link: string, - username: string + email: string, + link: string, + username: string ) => { - try { - await resend.emails.send({ - from: "Test ", - to: email, - subject: "Email Confirmation", - html: `Email confirmation for ${username}
Click here to confirm your email`, - }) - } catch (error) { - throw new Error("Error sending email confirmation email.") - } + try { + await resend.emails.send({ + from: "Test ", + to: email, + subject: "Email Confirmation", + html: `Email confirmation for ${username}
Click here to confirm your email`, + }) + } catch (error) { + throw new Error("Error sending email confirmation email.") + } } diff --git a/src/v2/lib/responseHeaders.ts b/src/v2/lib/responseHeaders.ts index 7910acd..381c171 100644 --- a/src/v2/lib/responseHeaders.ts +++ b/src/v2/lib/responseHeaders.ts @@ -1,5 +1,5 @@ export const responseHeaders: Record = { - "X-Content-Type-Options": "nosniff", - "Referrer-Policy": "strict-origin-when-cross-origin", - "content-type": "application/json;charset=UTF-8", + "X-Content-Type-Options": "nosniff", + "Referrer-Policy": "strict-origin-when-cross-origin", + "content-type": "application/json;charset=UTF-8", } diff --git a/src/v2/lib/types/discord.ts b/src/v2/lib/types/discord.ts index 9082433..e8b7f6b 100644 --- a/src/v2/lib/types/discord.ts +++ b/src/v2/lib/types/discord.ts @@ -1,18 +1,18 @@ // types used for the /contributor endpoint export interface Contributor { - id: string - username: string - globalname: string | null - avatar: string - roles: string[] + id: string + username: string + globalname: string | null + avatar: string + roles: string[] } export interface GuildMember { - roles: string[] - user: { - id: string - username: string - global_name: string | null - avatar: string - } + roles: string[] + user: { + id: string + username: string + global_name: string | null + avatar: string + } } diff --git a/src/v2/routes/asset/assetRoute.ts b/src/v2/routes/asset/assetRoute.ts index 781f73f..a10c97c 100644 --- a/src/v2/routes/asset/assetRoute.ts +++ b/src/v2/routes/asset/assetRoute.ts @@ -1,17 +1,16 @@ import { Hono } from "hono" import { getAssetFromId } from "./getAssetFromId" import { downloadAsset } from "./downloadAsset" -import { Bindings } from "@/worker-configuration" const assetRoute = new Hono<{ Bindings: Bindings }>() assetRoute.get("/:id", async (c) => { - return getAssetFromId(c) + return getAssetFromId(c) }) // setting both of these to id returns "duplicate param name" error, will fix later assetRoute.get("/download/:assetId", async (c) => { - return downloadAsset(c) + return downloadAsset(c) }) export default assetRoute diff --git a/src/v2/routes/asset/downloadAsset.ts b/src/v2/routes/asset/downloadAsset.ts index 0d67459..c1b9347 100644 --- a/src/v2/routes/asset/downloadAsset.ts +++ b/src/v2/routes/asset/downloadAsset.ts @@ -1,42 +1,41 @@ import { getConnection } from "@/v2/db/turso" import { eq } from "drizzle-orm" import { assets } from "@/v2/db/schema" -import type { APIContext as Context } from "@/worker-configuration" -export async function downloadAsset(c: Context): Promise { - const { assetId } = c.req.param() +export async function downloadAsset(c: APIContext): Promise { + const { assetId } = c.req.param() - const drizzle = getConnection(c.env).drizzle + const drizzle = getConnection(c.env).drizzle - const asset = await drizzle.query.assets.findFirst({ - where: (assets, { eq }) => eq(assets.id, parseInt(assetId)), - }) + const asset = await drizzle.query.assets.findFirst({ + where: (assets, { eq }) => eq(assets.id, parseInt(assetId)), + }) - if (!asset) { - c.status(200) - return c.json({ success: false, state: "asset not found" }) - } + if (!asset) { + c.status(200) + return c.json({ success: false, state: "asset not found" }) + } - try { - await drizzle - .update(assets) - .set({ downloadCount: asset.downloadCount + 1 }) - .where(eq(assets.id, parseInt(assetId))) - .execute() - } catch (e) { - console.error(e) - c.status(500) - return c.json({ success: false, state: "failed to download asset" }) - } + try { + await drizzle + .update(assets) + .set({ downloadCount: asset.downloadCount + 1 }) + .where(eq(assets.id, parseInt(assetId))) + .execute() + } catch (e) { + console.error(e) + c.status(500) + return c.json({ success: false, state: "failed to download asset" }) + } - const response = await fetch(asset[0].url) + const response = await fetch(asset[0].url) - const blob = await response.blob() + const blob = await response.blob() - const headers = new Headers() - headers.set("Content-Disposition", `attachment; filename=${asset[0].name}`) + const headers = new Headers() + headers.set("Content-Disposition", `attachment; filename=${asset[0].name}`) - return new Response(blob, { - headers: headers, - }) + return new Response(blob, { + headers: headers, + }) } diff --git a/src/v2/routes/asset/getAssetFromId.ts b/src/v2/routes/asset/getAssetFromId.ts index c2d5a59..628cc25 100644 --- a/src/v2/routes/asset/getAssetFromId.ts +++ b/src/v2/routes/asset/getAssetFromId.ts @@ -1,66 +1,65 @@ import { getConnection } from "@/v2/db/turso" import { assets } from "@/v2/db/schema" import { desc } from "drizzle-orm" -import type { APIContext as Context } from "@/worker-configuration" -export async function getAssetFromId(c: Context): Promise { - const { id } = c.req.param() - const cacheKey = new Request(c.req.url.toString(), c.req) - const cache = caches.default - let response = await cache.match(cacheKey) +export async function getAssetFromId(c: APIContext): Promise { + const { id } = c.req.param() + const cacheKey = new Request(c.req.url.toString(), c.req) + const cache = caches.default + let response = await cache.match(cacheKey) - if (response) return response + if (response) return response - const drizzle = getConnection(c.env).drizzle + const drizzle = getConnection(c.env).drizzle - const asset = await drizzle.query.assets.findFirst({ - where: (assets, { eq, and }) => - and(eq(assets.status, 1), eq(assets.id, parseInt(id))), - with: { - assetTagsAssets: { - with: { - assetTags: true, - }, - }, - users: { - columns: { - email: false, - emailVerified: false, - }, - }, - }, - }) + const asset = await drizzle.query.assets.findFirst({ + where: (assets, { eq, and }) => + and(eq(assets.status, 1), eq(assets.id, parseInt(id))), + with: { + assetTagsAssets: { + with: { + assetTags: true, + }, + }, + users: { + columns: { + email: false, + emailVerified: false, + }, + }, + }, + }) - if (!asset) { - c.status(200) - response = c.json({ - success: false, - status: "not found", - }) - await cache.put(cacheKey, response.clone()) - return response - } + if (!asset) { + c.status(200) + response = c.json({ + success: false, + status: "not found", + }) + await cache.put(cacheKey, response.clone()) + return response + } - const similarAssets = await drizzle.query.assets.findMany({ - where: (assets, { eq, and }) => - and( - eq(assets.status, 1), - eq(assets.assetCategory, asset.assetCategory) - ), - limit: 6, - orderBy: desc(assets.id), - }) + const similarAssets = await drizzle.query.assets.findMany({ + where: (assets, { eq, and }) => + and( + eq(assets.status, 1), + eq(assets.assetCategory, asset.assetCategory) + ), + limit: 6, + orderBy: desc(assets.id), + }) - c.status(200) - response = c.json({ - success: true, - status: "ok", - asset, - similarAssets, - }) + c.status(200) + response = c.json({ + success: true, + status: "ok", + asset, + similarAssets, + }) - response.headers.set("Cache-Control", "s-maxage=604800") - await cache.put(cacheKey, response.clone()) + response.headers.set("Cache-Control", "s-maxage=604800") + await cache.put(cacheKey, response.clone()) - return response + return response } diff --git a/src/v2/routes/auth/asset-categories/createAssetCategory.ts b/src/v2/routes/auth/asset-categories/createAssetCategory.ts index bd7c9c6..203c84f 100644 --- a/src/v2/routes/auth/asset-categories/createAssetCategory.ts +++ b/src/v2/routes/auth/asset-categories/createAssetCategory.ts @@ -1,67 +1,67 @@ import { auth } from "@/v2/lib/auth/lucia" import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" import { getConnection } from "@/v2/db/turso" -import { APIContext as Context } from "@/worker-configuration" + import { assetCategories } from "@/v2/db/schema" -export async function createAssetCategory(c: Context): Promise { - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() +export async function createAssetCategory(c: APIContext): Promise { + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - c.status(401) - return c.json({ success: false, state: "unauthorized" }) - } + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + c.status(401) + return c.json({ success: false, state: "unauthorized" }) + } - const roleFlags = roleFlagsToArray(session.user.role_flags) + const roleFlags = roleFlagsToArray(session.user.role_flags) - if (!roleFlags.includes("CREATOR")) { - c.status(401) - return c.json({ success: false, state: "unauthorized" }) - } + if (!roleFlags.includes("CREATOR")) { + c.status(401) + return c.json({ success: false, state: "unauthorized" }) + } - const drizzle = getConnection(c.env).drizzle + const drizzle = getConnection(c.env).drizzle - const formData = await c.req.formData() + const formData = await c.req.formData() - const assetCategory = { - id: crypto.randomUUID(), - name: formData.get("name") as string, - formattedName: formData.get("formattedName") as string, - assetCount: 0, - lastUpdated: new Date().getTime(), // unix timestamp - } + const assetCategory = { + id: crypto.randomUUID(), + name: formData.get("name") as string, + formattedName: formData.get("formattedName") as string, + assetCount: 0, + lastUpdated: new Date().getTime(), // unix timestamp + } - // check if assetCategory.name exists - const assetCategoryExists = await drizzle.query.assetCategories.findFirst({ - where: (assetCategories, { eq }) => - eq(assetCategories.name, assetCategory.name), - }) + // check if assetCategory.name exists + const assetCategoryExists = await drizzle.query.assetCategories.findFirst({ + where: (assetCategories, { eq }) => + eq(assetCategories.name, assetCategory.name), + }) - if (assetCategoryExists) { - c.status(200) - return c.json({ - success: false, - state: "assetCategory with name already exists", - }) - } + if (assetCategoryExists) { + c.status(200) + return c.json({ + success: false, + state: "assetCategory with name already exists", + }) + } - try { - await drizzle.insert(assetCategories).values(assetCategory).execute() - } catch (e) { - c.status(500) - return c.json({ - success: false, - state: "failed to create assetCategory", - }) - } + try { + await drizzle.insert(assetCategories).values(assetCategory).execute() + } catch (e) { + c.status(500) + return c.json({ + success: false, + state: "failed to create assetCategory", + }) + } - return c.json( - { success: true, state: "created assetcategory", assetCategory }, - 200 - ) + return c.json( + { success: true, state: "created assetcategory", assetCategory }, + 200 + ) } diff --git a/src/v2/routes/auth/asset-categories/deleteAssetCategory.ts b/src/v2/routes/auth/asset-categories/deleteAssetCategory.ts index 554f3bd..eda1681 100644 --- a/src/v2/routes/auth/asset-categories/deleteAssetCategory.ts +++ b/src/v2/routes/auth/asset-categories/deleteAssetCategory.ts @@ -1,71 +1,71 @@ import { auth } from "@/v2/lib/auth/lucia" import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" import { getConnection } from "@/v2/db/turso" -import { APIContext as Context } from "@/worker-configuration" + import { eq } from "drizzle-orm" import { assetCategories } from "@/v2/db/schema" -export async function deleteAssetCategory(c: Context): Promise { - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() +export async function deleteAssetCategory(c: APIContext): Promise { + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - c.status(401) - return c.json({ success: false, state: "unauthorized" }) - } + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + c.status(401) + return c.json({ success: false, state: "unauthorized" }) + } - const roleFlags = roleFlagsToArray(session.user.role_flags) + const roleFlags = roleFlagsToArray(session.user.role_flags) - if (!roleFlags.includes("CREATOR")) { - c.status(401) - return c.json({ success: false, state: "unauthorized" }) - } + if (!roleFlags.includes("CREATOR")) { + c.status(401) + return c.json({ success: false, state: "unauthorized" }) + } - const drizzle = getConnection(c.env).drizzle + const drizzle = getConnection(c.env).drizzle - const formData = await c.req.formData() + const formData = await c.req.formData() - const assetCategory = { - id: formData.get("id") as string | null, - } + const assetCategory = { + id: formData.get("id") as string | null, + } - if (!assetCategory.id) { - c.status(200) - return c.json({ success: false, state: "no id entered" }) - } + if (!assetCategory.id) { + c.status(200) + return c.json({ success: false, state: "no id entered" }) + } - // check if assetCategory exists - const assetCategoryExists = await drizzle.query.assetCategories.findFirst({ - where: (assetCategories, { eq }) => - eq(assetCategories.id, assetCategory.id), - }) + // check if assetCategory exists + const assetCategoryExists = await drizzle.query.assetCategories.findFirst({ + where: (assetCategories, { eq }) => + eq(assetCategories.id, assetCategory.id), + }) - if (!assetCategoryExists) { - c.status(200) - return c.json({ - success: false, - state: "assetCategory with ID doesn't exist", - }) - } + if (!assetCategoryExists) { + c.status(200) + return c.json({ + success: false, + state: "assetCategory with ID doesn't exist", + }) + } - try { - await drizzle - .delete(assetCategories) - .where(eq(assetCategories.id, assetCategory.id)) - .execute() - } catch (e) { - return c.json( - { success: false, state: "failed to delete assetCategory" }, - 200 - ) - } + try { + await drizzle + .delete(assetCategories) + .where(eq(assetCategories.id, assetCategory.id)) + .execute() + } catch (e) { + return c.json( + { success: false, state: "failed to delete assetCategory" }, + 200 + ) + } - return c.json( - { success: true, state: "deleted assetCategory", assetCategory }, - 200 - ) + return c.json( + { success: true, state: "deleted assetCategory", assetCategory }, + 200 + ) } diff --git a/src/v2/routes/auth/assets/approveAsset.ts b/src/v2/routes/auth/assets/approveAsset.ts index 5ea707b..48095aa 100644 --- a/src/v2/routes/auth/assets/approveAsset.ts +++ b/src/v2/routes/auth/assets/approveAsset.ts @@ -2,58 +2,58 @@ import { responseHeaders } from "@/v2/lib/responseHeaders" import { getConnection } from "@/v2/db/turso" import { assets } from "@/v2/db/schema" import { eq } from "drizzle-orm" -import type { APIContext as Context } from "@/worker-configuration" + import { auth } from "@/v2/lib/auth/lucia" import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" -export async function approveAsset(c: Context): Promise { - const { assetIdToApprove } = c.req.param() - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle" || session.state === "invalid") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - c.status(401) - return c.json({ success: false, state: "unauthorized" }, 401) - } - - const roleFlags = roleFlagsToArray(session.user.role_flags) - - if (!roleFlags.includes("CREATOR")) { - c.status(401) - return c.json({ success: false, state: "unauthorized" }) - } - - const drizzle = getConnection(c.env).drizzle - - const asset = await drizzle.query.assets.findFirst({ - where: (assets, { eq }) => eq(assets.id, parseInt(assetIdToApprove)), - }) - - if (!asset || asset.status === 1) { - c.status(404) - c.json({ success: false, state: "asset not found or already approved" }) - } - - const updatedAsset = await drizzle - .update(assets) - .set({ - status: 1, - }) - .where(eq(assets.id, parseInt(assetIdToApprove))) - .execute() - - c.status(200) - return c.json( - { - success: true, - status: "ok", - updatedAsset, - }, - 200, - responseHeaders - ) +export async function approveAsset(c: APIContext): Promise { + const { assetIdToApprove } = c.req.param() + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() + + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + c.status(401) + return c.json({ success: false, state: "unauthorized" }, 401) + } + + const roleFlags = roleFlagsToArray(session.user.role_flags) + + if (!roleFlags.includes("CREATOR")) { + c.status(401) + return c.json({ success: false, state: "unauthorized" }) + } + + const drizzle = getConnection(c.env).drizzle + + const asset = await drizzle.query.assets.findFirst({ + where: (assets, { eq }) => eq(assets.id, parseInt(assetIdToApprove)), + }) + + if (!asset || asset.status === 1) { + c.status(404) + c.json({ success: false, state: "asset not found or already approved" }) + } + + const updatedAsset = await drizzle + .update(assets) + .set({ + status: 1, + }) + .where(eq(assets.id, parseInt(assetIdToApprove))) + .execute() + + c.status(200) + return c.json( + { + success: true, + status: "ok", + updatedAsset, + }, + 200, + responseHeaders + ) } diff --git a/src/v2/routes/auth/assets/collections/addAssetToCollection.ts b/src/v2/routes/auth/assets/collections/addAssetToCollection.ts index 5bf8516..548504d 100644 --- a/src/v2/routes/auth/assets/collections/addAssetToCollection.ts +++ b/src/v2/routes/auth/assets/collections/addAssetToCollection.ts @@ -1,106 +1,106 @@ import { auth } from "@/v2/lib/auth/lucia" import { getConnection } from "@/v2/db/turso" -import { APIContext as Context } from "@/worker-configuration" + import { userCollectionAssets } from "@/v2/db/schema" -export async function addAssetToCollection(c: Context): Promise { - const drizzle = getConnection(c.env).drizzle - - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle" || session.state === "invalid") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - c.status(401) - return c.json({ success: false, state: "invalid session" }) - } - - const formData = await c.req.formData() - - const collection = { - id: formData.get("collectionId") as string | null, - assetId: formData.get("assetId") as string | null, - } - - if (!collection.id) { - c.status(200) - return c.json({ success: false, state: "no collection id entered" }) - } - - if (!collection.assetId) { - c.status(401) - return c.json({ success: false, state: "no asset id entered" }) - } - - // check if collection exists - const collectionExists = await drizzle.query.userCollections.findFirst({ - where: (userCollections, { eq }) => - eq(userCollections.id, collection.id), - }) - - if (!collectionExists) { - c.status(200) - return c.json({ - success: false, - state: "collection with ID doesn't exist", - }) - } - - // check if asset exists, and status is 1 (approved) - const assetExists = await drizzle.query.assets.findFirst({ - where: (assets, { eq, and }) => - and( - eq(assets.id, parseInt(collection.assetId)), - eq(assets.status, 1) - ), - }) - - if (!assetExists) { - c.status(200) - return c.json({ success: false, state: "asset not found" }) - } - - // check if userCollectionAssets exists - const userCollectionAssetsExists = - await drizzle.query.userCollectionAssets.findFirst({ - where: (userCollectionAssets, { eq, and }) => - and( - eq(userCollectionAssets.collectionId, collection.id), - eq( - userCollectionAssets.assetId, - parseInt(collection.assetId) - ) - ), - }) - - if (userCollectionAssetsExists) { - c.status(200) - return c.json({ - success: false, - state: "asset already exists in collection", - }) - } - - // create entry in userCollectionAssets - try { - await drizzle - .insert(userCollectionAssets) - .values({ - id: crypto.randomUUID(), - collectionId: collection.id, - assetId: parseInt(collection.assetId), - }) - .execute() - } catch (e) { - c.status(500) - return c.json( - { success: false, state: "failed to add asset to collection" }, - 500 - ) - } - - return c.json({ success: true, state: "added asset to collection" }, 200) +export async function addAssetToCollection(c: APIContext): Promise { + const drizzle = getConnection(c.env).drizzle + + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() + + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + c.status(401) + return c.json({ success: false, state: "invalid session" }) + } + + const formData = await c.req.formData() + + const collection = { + id: formData.get("collectionId") as string | null, + assetId: formData.get("assetId") as string | null, + } + + if (!collection.id) { + c.status(200) + return c.json({ success: false, state: "no collection id entered" }) + } + + if (!collection.assetId) { + c.status(401) + return c.json({ success: false, state: "no asset id entered" }) + } + + // check if collection exists + const collectionExists = await drizzle.query.userCollections.findFirst({ + where: (userCollections, { eq }) => + eq(userCollections.id, collection.id), + }) + + if (!collectionExists) { + c.status(200) + return c.json({ + success: false, + state: "collection with ID doesn't exist", + }) + } + + // check if asset exists, and status is 1 (approved) + const assetExists = await drizzle.query.assets.findFirst({ + where: (assets, { eq, and }) => + and( + eq(assets.id, parseInt(collection.assetId)), + eq(assets.status, 1) + ), + }) + + if (!assetExists) { + c.status(200) + return c.json({ success: false, state: "asset not found" }) + } + + // check if userCollectionAssets exists + const userCollectionAssetsExists = + await drizzle.query.userCollectionAssets.findFirst({ + where: (userCollectionAssets, { eq, and }) => + and( + eq(userCollectionAssets.collectionId, collection.id), + eq( + userCollectionAssets.assetId, + parseInt(collection.assetId) + ) + ), + }) + + if (userCollectionAssetsExists) { + c.status(200) + return c.json({ + success: false, + state: "asset already exists in collection", + }) + } + + // create entry in userCollectionAssets + try { + await drizzle + .insert(userCollectionAssets) + .values({ + id: crypto.randomUUID(), + collectionId: collection.id, + assetId: parseInt(collection.assetId), + }) + .execute() + } catch (e) { + c.status(500) + return c.json( + { success: false, state: "failed to add asset to collection" }, + 500 + ) + } + + return c.json({ success: true, state: "added asset to collection" }, 200) } diff --git a/src/v2/routes/auth/assets/collections/createAssetCollection.ts b/src/v2/routes/auth/assets/collections/createAssetCollection.ts index 65fba2a..d76a308 100644 --- a/src/v2/routes/auth/assets/collections/createAssetCollection.ts +++ b/src/v2/routes/auth/assets/collections/createAssetCollection.ts @@ -1,75 +1,75 @@ import { auth } from "@/v2/lib/auth/lucia" import { getConnection } from "@/v2/db/turso" -import { APIContext as Context } from "@/worker-configuration" + import { userCollections } from "@/v2/db/schema" -export async function createAssetCollection(c: Context): Promise { - const drizzle = getConnection(c.env).drizzle +export async function createAssetCollection(c: APIContext): Promise { + const drizzle = getConnection(c.env).drizzle - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - c.status(401) - return c.json({ success: false, state: "invalid session" }) - } + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + c.status(401) + return c.json({ success: false, state: "invalid session" }) + } - const formData = await c.req.formData() + const formData = await c.req.formData() - const collection = { - name: formData.get("collectionName") as string | null, - description: formData.get("collectionDescription") as string | null, - } + const collection = { + name: formData.get("collectionName") as string | null, + description: formData.get("collectionDescription") as string | null, + } - if (!collection.name) { - c.status(200) - return c.json({ success: false, state: "no collection name entered" }) - } + if (!collection.name) { + c.status(200) + return c.json({ success: false, state: "no collection name entered" }) + } - if (!collection.description) { - c.status(200) - return c.json({ - success: false, - state: "no collection description entered", - }) - } + if (!collection.description) { + c.status(200) + return c.json({ + success: false, + state: "no collection description entered", + }) + } - // check if collection exists - const collectionExists = await drizzle.query.userCollections.findFirst({ - where: (userCollections, { eq }) => - eq(userCollections.name, collection.name), - }) + // check if collection exists + const collectionExists = await drizzle.query.userCollections.findFirst({ + where: (userCollections, { eq }) => + eq(userCollections.name, collection.name), + }) - if (collectionExists) { - c.status(200) - return c.json({ - success: false, - state: "collection with name already exists", - }) - } + if (collectionExists) { + c.status(200) + return c.json({ + success: false, + state: "collection with name already exists", + }) + } - // create entry in userCollections - try { - await drizzle - .insert(userCollections) - .values({ - id: crypto.randomUUID(), - name: collection.name, - description: collection.description, - userId: session.userId, - dateCreated: new Date().getTime(), - isPublic: 0, // default to private - }) - .execute() - } catch (e) { - c.status(200) - return c.json({ success: false, state: "failed to create collection" }) - } + // create entry in userCollections + try { + await drizzle + .insert(userCollections) + .values({ + id: crypto.randomUUID(), + name: collection.name, + description: collection.description, + userId: session.userId, + dateCreated: new Date().getTime(), + isPublic: 0, // default to private + }) + .execute() + } catch (e) { + c.status(200) + return c.json({ success: false, state: "failed to create collection" }) + } - c.status(200) - return c.json({ success: true, state: "created collection" }) + c.status(200) + return c.json({ success: true, state: "created collection" }) } diff --git a/src/v2/routes/auth/assets/collections/deleteAssetCollection.ts b/src/v2/routes/auth/assets/collections/deleteAssetCollection.ts index 68c8566..a0ec355 100644 --- a/src/v2/routes/auth/assets/collections/deleteAssetCollection.ts +++ b/src/v2/routes/auth/assets/collections/deleteAssetCollection.ts @@ -1,55 +1,55 @@ import { auth } from "@/v2/lib/auth/lucia" import { getConnection } from "@/v2/db/turso" -import { APIContext as Context } from "@/worker-configuration" + import { eq } from "drizzle-orm" import { userCollections } from "@/v2/db/schema" -export async function deleteAssetCollection(c: Context): Promise { - const drizzle = getConnection(c.env).drizzle - - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle" || session.state === "invalid") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - c.status(401) - return c.json({ success: false, state: "invalid session" }) - } - - const formData = await c.req.formData() - - const collection = { - id: formData.get("collectionId") as string | null, - } - - if (!collection.id) { - c.status(200) - return c.json({ success: false, state: "no collection id entered" }) - } - - // check if collection exists - const collectionExists = await drizzle.query.userCollections.findFirst({ - where: (userCollections, { eq }) => - eq(userCollections.id, collection.id), - }) - - if (!collectionExists) { - c.status(200) - return c.json({ - success: false, - state: "collection with ID doesn't exist", - }) - } - - // delete collection - await drizzle - .delete(userCollections) - .where(eq(userCollections.id, collection.id)) - .execute() - - c.status(200) - return c.json({ success: true, state: "collection deleted" }) +export async function deleteAssetCollection(c: APIContext): Promise { + const drizzle = getConnection(c.env).drizzle + + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() + + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + c.status(401) + return c.json({ success: false, state: "invalid session" }) + } + + const formData = await c.req.formData() + + const collection = { + id: formData.get("collectionId") as string | null, + } + + if (!collection.id) { + c.status(200) + return c.json({ success: false, state: "no collection id entered" }) + } + + // check if collection exists + const collectionExists = await drizzle.query.userCollections.findFirst({ + where: (userCollections, { eq }) => + eq(userCollections.id, collection.id), + }) + + if (!collectionExists) { + c.status(200) + return c.json({ + success: false, + state: "collection with ID doesn't exist", + }) + } + + // delete collection + await drizzle + .delete(userCollections) + .where(eq(userCollections.id, collection.id)) + .execute() + + c.status(200) + return c.json({ success: true, state: "collection deleted" }) } diff --git a/src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts b/src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts index c54e5fa..9f5750d 100644 --- a/src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts +++ b/src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts @@ -1,93 +1,95 @@ import { auth } from "@/v2/lib/auth/lucia" import { getConnection } from "@/v2/db/turso" -import { APIContext as Context } from "@/worker-configuration" + import { userCollectionAssets } from "@/v2/db/schema" import { eq } from "drizzle-orm" -export async function deleteAssetFromCollection(c: Context): Promise { - const drizzle = getConnection(c.env).drizzle - - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle" || session.state === "invalid") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - c.status(401) - return c.json({ success: false, state: "invalid session" }) - } - - const formData = await c.req.formData() - - const collection = { - id: formData.get("collectionId") as string | null, - assetId: formData.get("assetId") as string | null, - } - - if (!collection.id) { - c.status(200) - return c.json({ success: false, state: "no collection id entered" }) - } - - if (!collection.assetId) { - c.status(401) - return c.json({ success: false, state: "no asset id entered" }) - } - - // check if collection exists - const collectionExists = await drizzle.query.userCollections.findFirst({ - where: (userCollections, { eq }) => - eq(userCollections.id, collection.id), - }) - - if (!collectionExists) { - c.status(200) - return c.json({ - success: false, - state: "collection with ID doesn't exist", - }) - } - - // check if asset exists - const assetExists = await drizzle.query.assets.findFirst({ - where: (assets, { eq }) => eq(assets.id, parseInt(collection.assetId)), - }) - - if (!assetExists) { - return c.json({ success: false, state: "asset not found" }, 200) - } - - // check if userCollectionAssets exists - const userCollectionAssetsExists = - await drizzle.query.userCollectionAssets.findFirst({ - where: (userCollectionAssets, { eq }) => - eq(userCollectionAssets.collectionId, collection.id) && - eq(userCollectionAssets.assetId, parseInt(collection.assetId)), - }) - - if (!userCollectionAssetsExists) { - c.status(200) - return c.json({ - success: false, - state: "asset not found in collection", - }) - } - - try { - await drizzle - .delete(userCollectionAssets) - .where(eq(userCollectionAssets.id, userCollectionAssetsExists.id)) - .execute() - } catch (e) { - c.status(500) - return c.json({ - success: false, - state: "failed to delete asset from collection", - }) - } - - c.status(200) - return c.json({ success: true, state: "deleted asset from collection" }) +export async function deleteAssetFromCollection( + c: APIContext +): Promise { + const drizzle = getConnection(c.env).drizzle + + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() + + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + c.status(401) + return c.json({ success: false, state: "invalid session" }) + } + + const formData = await c.req.formData() + + const collection = { + id: formData.get("collectionId") as string | null, + assetId: formData.get("assetId") as string | null, + } + + if (!collection.id) { + c.status(200) + return c.json({ success: false, state: "no collection id entered" }) + } + + if (!collection.assetId) { + c.status(401) + return c.json({ success: false, state: "no asset id entered" }) + } + + // check if collection exists + const collectionExists = await drizzle.query.userCollections.findFirst({ + where: (userCollections, { eq }) => + eq(userCollections.id, collection.id), + }) + + if (!collectionExists) { + c.status(200) + return c.json({ + success: false, + state: "collection with ID doesn't exist", + }) + } + + // check if asset exists + const assetExists = await drizzle.query.assets.findFirst({ + where: (assets, { eq }) => eq(assets.id, parseInt(collection.assetId)), + }) + + if (!assetExists) { + return c.json({ success: false, state: "asset not found" }, 200) + } + + // check if userCollectionAssets exists + const userCollectionAssetsExists = + await drizzle.query.userCollectionAssets.findFirst({ + where: (userCollectionAssets, { eq }) => + eq(userCollectionAssets.collectionId, collection.id) && + eq(userCollectionAssets.assetId, parseInt(collection.assetId)), + }) + + if (!userCollectionAssetsExists) { + c.status(200) + return c.json({ + success: false, + state: "asset not found in collection", + }) + } + + try { + await drizzle + .delete(userCollectionAssets) + .where(eq(userCollectionAssets.id, userCollectionAssetsExists.id)) + .execute() + } catch (e) { + c.status(500) + return c.json({ + success: false, + state: "failed to delete asset from collection", + }) + } + + c.status(200) + return c.json({ success: true, state: "deleted asset from collection" }) } diff --git a/src/v2/routes/auth/assets/collections/viewAssetCollection.ts b/src/v2/routes/auth/assets/collections/viewAssetCollection.ts index 9afbec6..5c23ff2 100644 --- a/src/v2/routes/auth/assets/collections/viewAssetCollection.ts +++ b/src/v2/routes/auth/assets/collections/viewAssetCollection.ts @@ -1,71 +1,70 @@ import { auth } from "@/v2/lib/auth/lucia" import { getConnection } from "@/v2/db/turso" -import { APIContext as Context } from "@/worker-configuration" -export async function viewAssetCollection(c: Context): Promise { - const drizzle = getConnection(c.env).drizzle +export async function viewAssetCollection(c: APIContext): Promise { + const drizzle = getConnection(c.env).drizzle - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - c.status(401) - return c.json({ success: false, state: "invalid session" }) - } + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + c.status(401) + return c.json({ success: false, state: "invalid session" }) + } - const formData = await c.req.formData() + const formData = await c.req.formData() - const collection = { - id: formData.get("collectionId") as string | null, - } + const collection = { + id: formData.get("collectionId") as string | null, + } - if (!collection.id) { - c.status(200) - return c.json({ success: false, state: "no collection id entered" }) - } + if (!collection.id) { + c.status(200) + return c.json({ success: false, state: "no collection id entered" }) + } - // check if the user owns the collection, or if the collection is public - try { - await drizzle.query.userCollections.findFirst({ - where: (userCollections, { eq, or, and }) => - and( - or( - eq(userCollections.id, collection.id), - eq(userCollections.isPublic, 1) - ), - eq(userCollections.userId, session.userId) - ), - }) - } catch (e) { - c.status(200) - return c.json({ - success: false, - state: "collection with ID doesn't exist", - }) - } + // check if the user owns the collection, or if the collection is public + try { + await drizzle.query.userCollections.findFirst({ + where: (userCollections, { eq, or, and }) => + and( + or( + eq(userCollections.id, collection.id), + eq(userCollections.isPublic, 1) + ), + eq(userCollections.userId, session.userId) + ), + }) + } catch (e) { + c.status(200) + return c.json({ + success: false, + state: "collection with ID doesn't exist", + }) + } - const assetCollection = await drizzle.query.userCollections.findFirst({ - where: (userCollections, { eq, or, and }) => - and( - or( - eq(userCollections.id, collection.id), - eq(userCollections.isPublic, 1) - ), - eq(userCollections.userId, session.userId) - ), - with: { - userCollectionAssets: { - with: { - assets: true, - }, - }, - }, - }) + const assetCollection = await drizzle.query.userCollections.findFirst({ + where: (userCollections, { eq, or, and }) => + and( + or( + eq(userCollections.id, collection.id), + eq(userCollections.isPublic, 1) + ), + eq(userCollections.userId, session.userId) + ), + with: { + userCollectionAssets: { + with: { + assets: true, + }, + }, + }, + }) - c.status(200) - return c.json({ success: true, state: "found collection", assetCollection }) + c.status(200) + return c.json({ success: true, state: "found collection", assetCollection }) } diff --git a/src/v2/routes/auth/assets/collections/viewAssetCollections.ts b/src/v2/routes/auth/assets/collections/viewAssetCollections.ts index 7341000..7246bba 100644 --- a/src/v2/routes/auth/assets/collections/viewAssetCollections.ts +++ b/src/v2/routes/auth/assets/collections/viewAssetCollections.ts @@ -1,47 +1,46 @@ import { auth } from "@/v2/lib/auth/lucia" import { getConnection } from "@/v2/db/turso" -import { APIContext as Context } from "@/worker-configuration" -export async function viewAssetCollections(c: Context): Promise { - const drizzle = getConnection(c.env).drizzle +export async function viewAssetCollections(c: APIContext): Promise { + const drizzle = getConnection(c.env).drizzle - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - c.status(401) - return c.json({ success: false, state: "invalid session" }) - } + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + c.status(401) + return c.json({ success: false, state: "invalid session" }) + } - // check if userCollections exists - const userCollectionsExists = await drizzle.query.userCollections.findFirst( - { - where: (userCollections, { eq }) => - eq(userCollections.userId, session.userId), - } - ) + // check if userCollections exists + const userCollectionsExists = await drizzle.query.userCollections.findFirst( + { + where: (userCollections, { eq }) => + eq(userCollections.userId, session.userId), + } + ) - if (!userCollectionsExists) { - c.status(200) - return c.json({ success: false, state: "no collections found" }) - } + if (!userCollectionsExists) { + c.status(200) + return c.json({ success: false, state: "no collections found" }) + } - const assetCollection = await drizzle.query.userCollectionAssets.findMany({ - where: (userCollectionAssets, { eq }) => - eq(userCollectionAssets.collectionId, userCollectionsExists.id), - with: { - assets: true, - }, - }) + const assetCollection = await drizzle.query.userCollectionAssets.findMany({ + where: (userCollectionAssets, { eq }) => + eq(userCollectionAssets.collectionId, userCollectionsExists.id), + with: { + assets: true, + }, + }) - c.status(200) - return c.json({ - success: true, - state: "found collections", - assetCollection, - }) + c.status(200) + return c.json({ + success: true, + state: "found collections", + assetCollection, + }) } diff --git a/src/v2/routes/auth/assets/favorite/addFavoriteAsset.ts b/src/v2/routes/auth/assets/favorite/addFavoriteAsset.ts index 5f2ea5f..73e5616 100644 --- a/src/v2/routes/auth/assets/favorite/addFavoriteAsset.ts +++ b/src/v2/routes/auth/assets/favorite/addFavoriteAsset.ts @@ -1,89 +1,89 @@ import { auth } from "@/v2/lib/auth/lucia" import { getConnection } from "@/v2/db/turso" -import { APIContext as Context } from "@/worker-configuration" + import { userFavorites, userFavoritesAssets } from "@/v2/db/schema" -export async function favoriteAsset(c: Context): Promise { - const drizzle = getConnection(c.env).drizzle +export async function favoriteAsset(c: APIContext): Promise { + const drizzle = getConnection(c.env).drizzle - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "invalid session" }, 200) - } + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + return c.json({ success: false, state: "invalid session" }, 200) + } - const formData = await c.req.formData() + const formData = await c.req.formData() - const assetToFavorite = formData.get("assetIdToFavorite") as string | null + const assetToFavorite = formData.get("assetIdToFavorite") as string | null - if (!assetToFavorite) { - return c.json({ success: false, state: "no assetid entered" }, 200) - } + if (!assetToFavorite) { + return c.json({ success: false, state: "no assetid entered" }, 200) + } - // check if asset exists, and status is 1 (approved) - const assetExists = await drizzle.query.assets.findFirst({ - where: (assets, { eq, and }) => - and(eq(assets.id, parseInt(assetToFavorite)), eq(assets.status, 1)), - }) + // check if asset exists, and status is 1 (approved) + const assetExists = await drizzle.query.assets.findFirst({ + where: (assets, { eq, and }) => + and(eq(assets.id, parseInt(assetToFavorite)), eq(assets.status, 1)), + }) - if (!assetExists) { - return c.json({ success: false, state: "asset not found" }, 200) - } + if (!assetExists) { + return c.json({ success: false, state: "asset not found" }, 200) + } - // this should never happen, but just in case it does, UX over reads/writes to the database - const doesUserFavoritesExist = await drizzle.query.userFavorites.findFirst({ - where: (userFavorites, { eq }) => - eq(userFavorites.userId, session.userId), - }) + // this should never happen, but just in case it does, UX over reads/writes to the database + const doesUserFavoritesExist = await drizzle.query.userFavorites.findFirst({ + where: (userFavorites, { eq }) => + eq(userFavorites.userId, session.userId), + }) - if (!doesUserFavoritesExist) { - // create entry in userFavorites - await drizzle - .insert(userFavorites) - .values({ - id: `${session.userId}-${assetToFavorite}`, - userId: session.userId, - isPublic: 0, // default to private - }) - .execute() - } + if (!doesUserFavoritesExist) { + // create entry in userFavorites + await drizzle + .insert(userFavorites) + .values({ + id: `${session.userId}-${assetToFavorite}`, + userId: session.userId, + isPublic: 0, // default to private + }) + .execute() + } - const isFavorited = await drizzle.query.userFavorites.findFirst({ - where: (userFavoritesAssets, { eq }) => - eq(userFavoritesAssets.id, `${session.userId}-${assetToFavorite}`), - }) + const isFavorited = await drizzle.query.userFavorites.findFirst({ + where: (userFavoritesAssets, { eq }) => + eq(userFavoritesAssets.id, `${session.userId}-${assetToFavorite}`), + }) - if (isFavorited) { - return c.json( - { - success: false, - state: "asset is already favorited, therefore cannot be favorited", - assetToFavorite, - }, - 200 - ) - } + if (isFavorited) { + return c.json( + { + success: false, + state: "asset is already favorited, therefore cannot be favorited", + assetToFavorite, + }, + 200 + ) + } - // add asset to userFavorites... - try { - await drizzle.insert(userFavoritesAssets).values({ - id: `${session.userId}-${assetToFavorite}`, - userFavoritesId: isFavorited.id, - assetId: parseInt(assetToFavorite), - }) - } catch (e) { - c.status(500) - return c.json( - { success: false, state: "failed to favorite asset" }, - 500 - ) - } + // add asset to userFavorites... + try { + await drizzle.insert(userFavoritesAssets).values({ + id: `${session.userId}-${assetToFavorite}`, + userFavoritesId: isFavorited.id, + assetId: parseInt(assetToFavorite), + }) + } catch (e) { + c.status(500) + return c.json( + { success: false, state: "failed to favorite asset" }, + 500 + ) + } - c.status(200) - return c.json({ success: true, state: "favorited asset", assetToFavorite }) + c.status(200) + return c.json({ success: true, state: "favorited asset", assetToFavorite }) } diff --git a/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts b/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts index 4e73a7f..719366e 100644 --- a/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts +++ b/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts @@ -1,84 +1,84 @@ import { auth } from "@/v2/lib/auth/lucia" import { getConnection } from "@/v2/db/turso" import { eq } from "drizzle-orm" -import { APIContext as Context } from "@/worker-configuration" + import { userFavorites, userFavoritesAssets } from "@/v2/db/schema" -export async function removeFavoriteAsset(c: Context): Promise { - const drizzle = getConnection(c.env).drizzle +export async function removeFavoriteAsset(c: APIContext): Promise { + const drizzle = getConnection(c.env).drizzle - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "invalid session" }, 200) - } + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + return c.json({ success: false, state: "invalid session" }, 200) + } - const formData = await c.req.formData() - const assetToRemove = formData.get("assetToRemove") as string | null + const formData = await c.req.formData() + const assetToRemove = formData.get("assetToRemove") as string | null - if (!assetToRemove) { - return c.json({ success: false, state: "no assetid entered" }, 200) - } + if (!assetToRemove) { + return c.json({ success: false, state: "no assetid entered" }, 200) + } - // check if asset exists - const asset = await drizzle.query.assets.findFirst({ - where: (assets, { eq }) => eq(assets.id, parseInt(assetToRemove)), - }) + // check if asset exists + const asset = await drizzle.query.assets.findFirst({ + where: (assets, { eq }) => eq(assets.id, parseInt(assetToRemove)), + }) - if (!asset) { - return c.json({ success: false, state: "asset not found" }, 200) - } + if (!asset) { + return c.json({ success: false, state: "asset not found" }, 200) + } - // this should never happen, but just in case it does, UX over reads/writes to the database - const doesUserFavoritesExist = await drizzle.query.userFavorites.findFirst({ - where: (userFavorites, { eq }) => - eq(userFavorites.userId, session.userId), - }) + // this should never happen, but just in case it does, UX over reads/writes to the database + const doesUserFavoritesExist = await drizzle.query.userFavorites.findFirst({ + where: (userFavorites, { eq }) => + eq(userFavorites.userId, session.userId), + }) - if (!doesUserFavoritesExist) { - // create entry in userFavorites - await drizzle - .insert(userFavorites) - .values({ - id: `${session.userId}-${assetToRemove}`, - userId: session.userId, - isPublic: 0, // default to private - }) - .execute() - } + if (!doesUserFavoritesExist) { + // create entry in userFavorites + await drizzle + .insert(userFavorites) + .values({ + id: `${session.userId}-${assetToRemove}`, + userId: session.userId, + isPublic: 0, // default to private + }) + .execute() + } - const isFavorited = await drizzle.query.userFavorites.findFirst({ - where: (userFavoritesAssets, { eq }) => - eq(userFavoritesAssets.id, `${session.userId}-${assetToRemove}`), - }) + const isFavorited = await drizzle.query.userFavorites.findFirst({ + where: (userFavoritesAssets, { eq }) => + eq(userFavoritesAssets.id, `${session.userId}-${assetToRemove}`), + }) - if (!isFavorited) { - c.status(200) - return c.json({ - success: false, - state: "asset is not favorited, therefore cannot be removed", - assetToRemove, - }) - } + if (!isFavorited) { + c.status(200) + return c.json({ + success: false, + state: "asset is not favorited, therefore cannot be removed", + assetToRemove, + }) + } - // remove asset from userFavorites... - try { - await drizzle - .delete(userFavoritesAssets) - .where( - eq(userFavoritesAssets.id, `${session.userId}-${assetToRemove}`) - ) - .execute() - } catch (e) { - c.status(500) - return c.json({ success: false, state: "failed to remove asset" }) - } + // remove asset from userFavorites... + try { + await drizzle + .delete(userFavoritesAssets) + .where( + eq(userFavoritesAssets.id, `${session.userId}-${assetToRemove}`) + ) + .execute() + } catch (e) { + c.status(500) + return c.json({ success: false, state: "failed to remove asset" }) + } - c.status(200) - return c.json({ success: true, state: "removed asset", assetToRemove }) + c.status(200) + return c.json({ success: true, state: "removed asset", assetToRemove }) } diff --git a/src/v2/routes/auth/assets/favorite/viewFavoriteAssets.ts b/src/v2/routes/auth/assets/favorite/viewFavoriteAssets.ts index 5f46def..d3054ce 100644 --- a/src/v2/routes/auth/assets/favorite/viewFavoriteAssets.ts +++ b/src/v2/routes/auth/assets/favorite/viewFavoriteAssets.ts @@ -1,41 +1,40 @@ import { auth } from "@/v2/lib/auth/lucia" import { getConnection } from "@/v2/db/turso" -import { APIContext as Context } from "@/worker-configuration" -export async function viewFavoriteAssets(c: Context): Promise { - const drizzle = getConnection(c.env).drizzle +export async function viewFavoriteAssets(c: APIContext): Promise { + const drizzle = getConnection(c.env).drizzle - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - c.status(401) - return c.json({ success: false, state: "invalid session" }) - } + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + c.status(401) + return c.json({ success: false, state: "invalid session" }) + } - // check if userFavorites exists - const userFavoritesExists = await drizzle.query.userFavorites.findFirst({ - where: (userFavorites, { eq }) => - eq(userFavorites.userId, session.userId), - }) + // check if userFavorites exists + const userFavoritesExists = await drizzle.query.userFavorites.findFirst({ + where: (userFavorites, { eq }) => + eq(userFavorites.userId, session.userId), + }) - if (!userFavoritesExists) { - c.status(200) - return c.json({ success: false, state: "no favorites found" }) - } + if (!userFavoritesExists) { + c.status(200) + return c.json({ success: false, state: "no favorites found" }) + } - const favoriteAssets = await drizzle.query.userFavoritesAssets.findMany({ - where: (userFavoritesAssets, { eq }) => - eq(userFavoritesAssets.userFavoritesId, userFavoritesExists.id), - with: { - assets: true, - }, - }) + const favoriteAssets = await drizzle.query.userFavoritesAssets.findMany({ + where: (userFavoritesAssets, { eq }) => + eq(userFavoritesAssets.userFavoritesId, userFavoritesExists.id), + with: { + assets: true, + }, + }) - c.status(200) - return c.json({ success: true, state: "found favorites", favoriteAssets }) + c.status(200) + return c.json({ success: true, state: "found favorites", favoriteAssets }) } diff --git a/src/v2/routes/auth/assets/modifyAsset.ts b/src/v2/routes/auth/assets/modifyAsset.ts index e29a86b..6e26c34 100644 --- a/src/v2/routes/auth/assets/modifyAsset.ts +++ b/src/v2/routes/auth/assets/modifyAsset.ts @@ -2,85 +2,85 @@ import { responseHeaders } from "@/v2/lib/responseHeaders" import { getConnection } from "@/v2/db/turso" import { assets } from "@/v2/db/schema" import { eq } from "drizzle-orm" -import type { APIContext as Context } from "@/worker-configuration" + import { auth } from "@/v2/lib/auth/lucia" import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" import { SplitQueryByCommas } from "@/v2/lib/helpers/splitQueryByCommas" -export async function modifyAssetData(c: Context): Promise { - const { assetIdToModify } = c.req.param() - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() +export async function modifyAssetData(c: APIContext): Promise { + const { assetIdToModify } = c.req.param() + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - c.status(401) - return c.json({ success: false, state: "invalid session" }) - } + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + c.status(401) + return c.json({ success: false, state: "invalid session" }) + } - // return unauthorized if user is not a contributor - if (session.user.is_contributor !== 1) { - c.status(401) - return c.json({ success: false, state: "unauthorized" }) - } + // return unauthorized if user is not a contributor + if (session.user.is_contributor !== 1) { + c.status(401) + return c.json({ success: false, state: "unauthorized" }) + } - const drizzle = getConnection(c.env).drizzle + const drizzle = getConnection(c.env).drizzle - const asset = await drizzle.query.assets.findFirst({ - where: (assets, { eq }) => eq(assets.id, parseInt(assetIdToModify)), - }) + const asset = await drizzle.query.assets.findFirst({ + where: (assets, { eq }) => eq(assets.id, parseInt(assetIdToModify)), + }) - if (!asset) { - c.status(200) - return c.json({ success: false, state: "asset not found" }) - } + if (!asset) { + c.status(200) + return c.json({ success: false, state: "asset not found" }) + } - const roleFlags = roleFlagsToArray(session.user.role_flags) + const roleFlags = roleFlagsToArray(session.user.role_flags) - if ( - asset.uploadedById !== session.userId || - !roleFlags.includes("CREATOR") - ) { - c.status(401) - return c.json({ - success: false, - state: "unauthorized to modify this asset", - }) - } + if ( + asset.uploadedById !== session.userId || + !roleFlags.includes("CREATOR") + ) { + c.status(401) + return c.json({ + success: false, + state: "unauthorized to modify this asset", + }) + } - const formData = await c.req.formData() + const formData = await c.req.formData() - const metadata = { - name: formData.get("name") as string | null, - game: formData.get("game") as string | null, - assetCategory: formData.get("assetCategory") as string | null, - tags: SplitQueryByCommas(formData.get("tags") as string | null), - } + const metadata = { + name: formData.get("name") as string | null, + game: formData.get("game") as string | null, + assetCategory: formData.get("assetCategory") as string | null, + tags: SplitQueryByCommas(formData.get("tags") as string | null), + } - Object.keys(metadata).forEach( - (key) => metadata[key] === null && delete metadata[key] - ) + Object.keys(metadata).forEach( + (key) => metadata[key] === null && delete metadata[key] + ) - const updatedAsset = await drizzle - .update(assets) - .set({ - ...metadata, - }) - .where(eq(assets.id, parseInt(assetIdToModify))) - .execute() + const updatedAsset = await drizzle + .update(assets) + .set({ + ...metadata, + }) + .where(eq(assets.id, parseInt(assetIdToModify))) + .execute() - const response = c.json( - { - success: true, - status: "ok", - updatedAsset, - }, - 200, - responseHeaders - ) + const response = c.json( + { + success: true, + status: "ok", + updatedAsset, + }, + 200, + responseHeaders + ) - return response + return response } diff --git a/src/v2/routes/auth/assets/uploadAsset.ts b/src/v2/routes/auth/assets/uploadAsset.ts index a76399a..0763f1c 100644 --- a/src/v2/routes/auth/assets/uploadAsset.ts +++ b/src/v2/routes/auth/assets/uploadAsset.ts @@ -1,117 +1,117 @@ import { auth } from "@/v2/lib/auth/lucia" import { getConnection } from "@/v2/db/turso" import { assets, assetTagsAssets } from "@/v2/db/schema" -import type { APIContext as Context } from "@/worker-configuration" + import { eq } from "drizzle-orm" import { SplitQueryByCommas } from "@/v2/lib/helpers/splitQueryByCommas" -export async function uploadAsset(c: Context): Promise { - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() +export async function uploadAsset(c: APIContext): Promise { + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - c.status(401) - return c.json({ success: false, state: "unauthorized" }) - } + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + c.status(401) + return c.json({ success: false, state: "unauthorized" }) + } - // return unauthorized if user is not a contributor - if (session.user.is_contributor !== 1) { - c.status(401) - return c.json({ success: false, state: "unauthorized" }) - } + // return unauthorized if user is not a contributor + if (session.user.is_contributor !== 1) { + c.status(401) + return c.json({ success: false, state: "unauthorized" }) + } - const bypassApproval = session.user.is_contributor === 1 + const bypassApproval = session.user.is_contributor === 1 - const drizzle = getConnection(c.env).drizzle + const drizzle = getConnection(c.env).drizzle - const formData = await c.req.formData() - const asset = formData.get("asset") as unknown as File | null + const formData = await c.req.formData() + const asset = formData.get("asset") as unknown as File | null - const metadata = { - name: formData.get("name`") as string, // e.g keqing - extension: formData.get("extension") as string, // e.g png - tags: SplitQueryByCommas(formData.get("tags") as string), // e.g no-background, fanmade, official => ["no-background", "fanmade", "official"] - category: formData.get("category") as string, // e.g splash-art - game: formData.get("game") as string, // e.g genshin-impact - size: formData.get("size") as unknown as number, // e.g 1024 - width: formData.get("width") as unknown as number, // e.g 1920 - height: formData.get("height") as unknown as number, // e.g 1080 - } + const metadata = { + name: formData.get("name`") as string, // e.g keqing + extension: formData.get("extension") as string, // e.g png + tags: SplitQueryByCommas(formData.get("tags") as string), // e.g no-background, fanmade, official => ["no-background", "fanmade", "official"] + category: formData.get("category") as string, // e.g splash-art + game: formData.get("game") as string, // e.g genshin-impact + size: formData.get("size") as unknown as number, // e.g 1024 + width: formData.get("width") as unknown as number, // e.g 1920 + height: formData.get("height") as unknown as number, // e.g 1080 + } - if (metadata.tags.length > 5) - return c.json({ - success: false, - state: `too many tags (${metadata.tags.length}). maximum is 5 tags per asset`, - }) + if (metadata.tags.length > 5) + return c.json({ + success: false, + state: `too many tags (${metadata.tags.length}). maximum is 5 tags per asset`, + }) - const newAsset = { - name: metadata.name, - extension: metadata.extension, - game: metadata.game, - assetCategory: metadata.category, - url: `/assets/${metadata.game}/${metadata.category}/${metadata.name}.${metadata.extension}`, - uploadedById: session.userId, - status: bypassApproval ? 1 : 2, - uploadedDate: new Date().getTime(), - fileSize: asset.size, // stored in bytes - width: metadata.width, - height: metadata.height, - } + const newAsset = { + name: metadata.name, + extension: metadata.extension, + game: metadata.game, + assetCategory: metadata.category, + url: `/assets/${metadata.game}/${metadata.category}/${metadata.name}.${metadata.extension}`, + uploadedById: session.userId, + status: bypassApproval ? 1 : 2, + uploadedDate: new Date().getTime(), + fileSize: asset.size, // stored in bytes + width: metadata.width, + height: metadata.height, + } - // rename file name to match metadata - const newAssetFile = new File([asset], newAsset.name, { - type: asset.type, - }) + // rename file name to match metadata + const newAssetFile = new File([asset], newAsset.name, { + type: asset.type, + }) - try { - await c.env.bucket.put( - `/assets/${metadata.game}/${metadata.category}/${metadata.name}.${metadata.extension}`, - newAssetFile - ) + try { + await c.env.bucket.put( + `/assets/${metadata.game}/${metadata.category}/${metadata.name}.${metadata.extension}`, + newAssetFile + ) - await drizzle.transaction(async (trx) => { - const newAssetDB = await trx - .insert(assets) - .values(newAsset) - .returning({ - assetId: assets.id, - }) - if (metadata.tags.length > 0) { - for (const tag of metadata.tags) { - const tagExists = await trx.query.assetTags.findFirst({ - where: (assetTags) => { - return eq(assetTags.name, tag) - }, - }) - if (tagExists) { - await trx - .insert(assetTagsAssets) - .values({ - id: crypto.randomUUID(), - assetId: newAssetDB[0].assetId, - assetTagId: tagExists[0].assetTagId, - }) - .returning({ - assetTagId: assetTagsAssets.assetTagId, - }) - } else { - continue - } - } - } - }) - } catch (e) { - await c.env.bucket.delete( - `/assets/${metadata.game}/${metadata.category}/${metadata.name}.${metadata.extension}` - ) - c.status(500) - return c.json({ success: false, state: "failed to upload asset" }) - } + await drizzle.transaction(async (trx) => { + const newAssetDB = await trx + .insert(assets) + .values(newAsset) + .returning({ + assetId: assets.id, + }) + if (metadata.tags.length > 0) { + for (const tag of metadata.tags) { + const tagExists = await trx.query.assetTags.findFirst({ + where: (assetTags) => { + return eq(assetTags.name, tag) + }, + }) + if (tagExists) { + await trx + .insert(assetTagsAssets) + .values({ + id: crypto.randomUUID(), + assetId: newAssetDB[0].assetId, + assetTagId: tagExists[0].assetTagId, + }) + .returning({ + assetTagId: assetTagsAssets.assetTagId, + }) + } else { + continue + } + } + } + }) + } catch (e) { + await c.env.bucket.delete( + `/assets/${metadata.game}/${metadata.category}/${metadata.name}.${metadata.extension}` + ) + c.status(500) + return c.json({ success: false, state: "failed to upload asset" }) + } - c.status(200) - return c.json({ success: true, state: "uploaded asset" }) + c.status(200) + return c.json({ success: true, state: "uploaded asset" }) } diff --git a/src/v2/routes/auth/authRoute.ts b/src/v2/routes/auth/authRoute.ts index 2321f33..a498d34 100644 --- a/src/v2/routes/auth/authRoute.ts +++ b/src/v2/routes/auth/authRoute.ts @@ -9,7 +9,7 @@ import { uploadBannerImage } from "./user-attributes/self-upload/uploadBanner" import { saveOCGeneratorResponse } from "./oc-generators/saveOCGeneratorResponse" import { updateUserAttributes } from "./user-attributes/updateUserAttributes" import { uploadAsset } from "./assets/uploadAsset" -import { Bindings } from "@/worker-configuration" + import { modifyAssetData } from "./assets/modifyAsset" import { approveAsset } from "./assets/approveAsset" import { viewOCGeneratorResponses } from "./oc-generators/viewOCGeneratorResponses" @@ -20,71 +20,71 @@ import { deleteOCGeneratorResponse } from "./oc-generators/deleteOCGeneratorResp const authRoute = new Hono<{ Bindings: Bindings }>() authRoute.use( - "*", - cors({ - credentials: true, - origin: ["*"], // TODO: update this - temporary - }) + "*", + cors({ + credentials: true, + origin: ["*"], // TODO: update this - temporary + }) ) authRoute.post("/login", async (c) => { - return login(c) + return login(c) }) authRoute.post("/update/attributes", async (c) => { - return updateUserAttributes(c) + return updateUserAttributes(c) }) authRoute.post("/upload/asset", async (c) => { - return uploadAsset(c) + return uploadAsset(c) }) authRoute.post("/upload/avatar", async (c) => { - return uploadProfileImage(c) + return uploadProfileImage(c) }) authRoute.post("/approve/asset/:assetIdToApprove", async (c) => { - return approveAsset(c) + return approveAsset(c) }) authRoute.post("/modify/asset/:assetIdToModify", async (c) => { - return modifyAssetData(c) + return modifyAssetData(c) }) authRoute.post("/upload/banner", async (c) => { - return uploadBannerImage(c) + return uploadBannerImage(c) }) authRoute.post("/follow", async (c) => { - return followUser(c) + return followUser(c) }) authRoute.post("/unfollow", async (c) => { - return unFollowUser(c) + return unFollowUser(c) }) authRoute.post("/signup", async (c) => { - return signup(c) + return signup(c) }) authRoute.post("/oc-generator/save", async (c) => { - return saveOCGeneratorResponse(c) + return saveOCGeneratorResponse(c) }) authRoute.get("/oc-generator/view/all", async (c) => { - return viewOCGeneratorResponses(c) + return viewOCGeneratorResponses(c) }) authRoute.post("/oc-generator/delete", async (c) => { - return deleteOCGeneratorResponse(c) + return deleteOCGeneratorResponse(c) }) authRoute.get("/validate", async (c) => { - return validate(c) + return validate(c) }) authRoute.post("/logout", async (c) => { - return logout(c) + return logout(c) }) export default authRoute diff --git a/src/v2/routes/auth/games/createGame.ts b/src/v2/routes/auth/games/createGame.ts index ee70ab4..3b9c6a6 100644 --- a/src/v2/routes/auth/games/createGame.ts +++ b/src/v2/routes/auth/games/createGame.ts @@ -1,60 +1,60 @@ import { auth } from "@/v2/lib/auth/lucia" import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" import { getConnection } from "@/v2/db/turso" -import { APIContext as Context } from "@/worker-configuration" + import { games } from "@/v2/db/schema" -export async function createGame(c: Context): Promise { - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle" || session.state === "invalid") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - c.status(401) - return c.json({ success: false, state: "invalid session" }) - } - - const roleFlags = roleFlagsToArray(session.user.role_flags) - - if (!roleFlags.includes("CREATOR")) { - c.status(401) - return c.json({ success: false, state: "unauthorized" }) - } - - const drizzle = getConnection(c.env).drizzle - - const formData = await c.req.formData() - - const game = { - id: crypto.randomUUID(), - name: formData.get("name") as string, - formattedName: formData.get("formattedName") as string, - assetCount: 0, - lastUpdated: new Date().getTime(), // unix timestamp - } - - // check if game.name exists - const gameExists = await drizzle.query.assetCategories.findFirst({ - where: (assetCategories, { eq }) => eq(assetCategories.name, game.name), - }) - - if (gameExists) { - return c.json( - { success: false, state: "game with name already exists" }, - 200 - ) - } - - try { - await drizzle.insert(games).values(game).execute() - } catch (e) { - c.status(500) - return c.json({ success: false, state: "failed to create game" }) - } - - c.status(200) - return c.json({ success: true, state: "created game", game }) +export async function createGame(c: APIContext): Promise { + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() + + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + c.status(401) + return c.json({ success: false, state: "invalid session" }) + } + + const roleFlags = roleFlagsToArray(session.user.role_flags) + + if (!roleFlags.includes("CREATOR")) { + c.status(401) + return c.json({ success: false, state: "unauthorized" }) + } + + const drizzle = getConnection(c.env).drizzle + + const formData = await c.req.formData() + + const game = { + id: crypto.randomUUID(), + name: formData.get("name") as string, + formattedName: formData.get("formattedName") as string, + assetCount: 0, + lastUpdated: new Date().getTime(), // unix timestamp + } + + // check if game.name exists + const gameExists = await drizzle.query.assetCategories.findFirst({ + where: (assetCategories, { eq }) => eq(assetCategories.name, game.name), + }) + + if (gameExists) { + return c.json( + { success: false, state: "game with name already exists" }, + 200 + ) + } + + try { + await drizzle.insert(games).values(game).execute() + } catch (e) { + c.status(500) + return c.json({ success: false, state: "failed to create game" }) + } + + c.status(200) + return c.json({ success: true, state: "created game", game }) } diff --git a/src/v2/routes/auth/games/deleteGame.ts b/src/v2/routes/auth/games/deleteGame.ts index 1a51426..6f084dc 100644 --- a/src/v2/routes/auth/games/deleteGame.ts +++ b/src/v2/routes/auth/games/deleteGame.ts @@ -1,59 +1,59 @@ import { auth } from "@/v2/lib/auth/lucia" import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" import { getConnection } from "@/v2/db/turso" -import { APIContext as Context } from "@/worker-configuration" + import { games } from "@/v2/db/schema" import { eq } from "drizzle-orm" -export async function deleteGame(c: Context): Promise { - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle" || session.state === "invalid") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - c.status(401) - return c.json({ success: false, state: "invalid session" }) - } - - const roleFlags = roleFlagsToArray(session.user.role_flags) - - if (!roleFlags.includes("CREATOR")) { - c.status(401) - return c.json({ success: false, state: "unauthorized" }) - } - - const drizzle = getConnection(c.env).drizzle - - const formData = await c.req.formData() - - const game = { - id: formData.get("id") as string | null, - } - - if (!game.id) { - return c.json({ success: false, state: "no id entered" }, 200) - } - - // check if game exists - const gameExists = await drizzle.query.games.findFirst({ - where: (games, { eq }) => eq(games.id, game.id), - }) - - if (!gameExists) { - c.status(404) - return c.json({ success: false, state: "game with ID doesn't exist" }) - } - - try { - await drizzle.delete(games).where(eq(games.id, game.id)).execute() - } catch (e) { - c.status(500) - return c.json({ success: false, state: "failed to delete game" }) - } - - c.status(200) - return c.json({ success: true, state: "deleted game", game }) +export async function deleteGame(c: APIContext): Promise { + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() + + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + c.status(401) + return c.json({ success: false, state: "invalid session" }) + } + + const roleFlags = roleFlagsToArray(session.user.role_flags) + + if (!roleFlags.includes("CREATOR")) { + c.status(401) + return c.json({ success: false, state: "unauthorized" }) + } + + const drizzle = getConnection(c.env).drizzle + + const formData = await c.req.formData() + + const game = { + id: formData.get("id") as string | null, + } + + if (!game.id) { + return c.json({ success: false, state: "no id entered" }, 200) + } + + // check if game exists + const gameExists = await drizzle.query.games.findFirst({ + where: (games, { eq }) => eq(games.id, game.id), + }) + + if (!gameExists) { + c.status(404) + return c.json({ success: false, state: "game with ID doesn't exist" }) + } + + try { + await drizzle.delete(games).where(eq(games.id, game.id)).execute() + } catch (e) { + c.status(500) + return c.json({ success: false, state: "failed to delete game" }) + } + + c.status(200) + return c.json({ success: true, state: "deleted game", game }) } diff --git a/src/v2/routes/auth/login.ts b/src/v2/routes/auth/login.ts index b2ac332..a70c9a2 100644 --- a/src/v2/routes/auth/login.ts +++ b/src/v2/routes/auth/login.ts @@ -1,82 +1,83 @@ import { auth } from "@/v2/lib/auth/lucia" -import type { APIContext as Context } from "@/worker-configuration" const usernameThrottling = new Map< - string, - { - timeoutUntil: number - timeoutSeconds: number - } + string, + { + timeoutUntil: number + timeoutSeconds: number + } >() -export async function login(c: Context): Promise { - const formData = await c.req.formData() +export async function login(c: APIContext): Promise { + const formData = await c.req.formData() - const username = formData.get("username") as string - const password = formData.get("password") as string - const validSession = await auth(c.env).handleRequest(c).validate() + const username = formData.get("username") as string + const password = formData.get("password") as string + const validSession = await auth(c.env).handleRequest(c).validate() - if (validSession) { - c.status(200) - return c.json({ success: false, state: "already logged in" }) - } + if (validSession) { + c.status(200) + return c.json({ success: false, state: "already logged in" }) + } - const storedThrottling = usernameThrottling.get(username) - const timeoutUntil = storedThrottling?.timeoutUntil ?? 0 + const storedThrottling = usernameThrottling.get(username) + const timeoutUntil = storedThrottling?.timeoutUntil ?? 0 - if (timeoutUntil > Date.now()) { - return c.json( - { - success: false, - status: "error", - error: `Too many login attempts - wait ${ - (timeoutUntil - Date.now()) / 1000 - } seconds`, - }, - 400 - ) - } + if (timeoutUntil > Date.now()) { + return c.json( + { + success: false, + status: "error", + error: `Too many login attempts - wait ${ + (timeoutUntil - Date.now()) / 1000 + } seconds`, + }, + 400 + ) + } - const user = await auth(c.env).useKey( - "username", - username.toLowerCase(), - password - ) + const user = await auth(c.env).useKey( + "username", + username.toLowerCase(), + password + ) - if (!user) { - const timeoutSeconds = storedThrottling - ? storedThrottling.timeoutSeconds * 2 - : 1 - usernameThrottling.set(username, { - timeoutUntil: Date.now() + timeoutSeconds * 1000, - timeoutSeconds, - }) - return c.json( - { - success: false, - status: "error", - error: `Invalid credentials - wait ${timeoutSeconds} seconds`, - }, - 400 - ) - } + if (!user) { + const timeoutSeconds = storedThrottling + ? storedThrottling.timeoutSeconds * 2 + : 1 + usernameThrottling.set(username, { + timeoutUntil: Date.now() + timeoutSeconds * 1000, + timeoutSeconds, + }) + return c.json( + { + success: false, + status: "error", + error: `Invalid credentials - wait ${timeoutSeconds} seconds`, + }, + 400 + ) + } - const userAgent = c.req.headers.get("user-agent") ?? "" - const countryCode = c.req.headers.get("cf-ipcountry") ?? "" + const userAgent = c.req.header("user-agent") ?? "" + const countryCode = c.req.header("cf-ipcountry") ?? "" + const ipAddress = c.req.header("cf-connecting-ip") ?? "" - const newSession = await auth(c.env).createSession({ - userId: user.userId, - attributes: { - country_code: countryCode, - user_agent: userAgent, - }, - }) + const newSession = await auth(c.env).createSession({ + userId: user.userId, + attributes: { + country_code: countryCode, + user_agent: userAgent, + ip_address: ipAddress, + }, + }) - console.log("valid session created", countryCode, userAgent) + console.log("valid session created", countryCode, userAgent) - const authRequest = await auth(c.env).handleRequest(c) - authRequest.setSession(newSession) + const authRequest = await auth(c.env).handleRequest(c) + authRequest.setSession(newSession) - c.status(200) - return c.json({ success: true, state: "logged in" }) + c.status(200) + return c.json({ success: true, state: "logged in" }) } diff --git a/src/v2/routes/auth/logout.ts b/src/v2/routes/auth/logout.ts index b9c1045..beebc1d 100644 --- a/src/v2/routes/auth/logout.ts +++ b/src/v2/routes/auth/logout.ts @@ -1,20 +1,19 @@ import { auth } from "@/v2/lib/auth/lucia" -import type { APIContext as Context } from "@/worker-configuration" -export async function logout(c: Context): Promise { - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() +export async function logout(c: APIContext): Promise { + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() - if (!session) { - c.status(401) - return c.json({ success: false, state: "invalid session" }) - } + if (!session) { + c.status(401) + return c.json({ success: false, state: "invalid session" }) + } - // this is useful to clean up dead sessions that are still in the database - await auth(c.env).deleteDeadUserSessions(session.userId) - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) + // this is useful to clean up dead sessions that are still in the database + await auth(c.env).deleteDeadUserSessions(session.userId) + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) - c.status(200) - return c.json({ success: true, state: "logged out" }) + c.status(200) + return c.json({ success: true, state: "logged out" }) } diff --git a/src/v2/routes/auth/oc-generators/deleteOCGeneratorResponse.ts b/src/v2/routes/auth/oc-generators/deleteOCGeneratorResponse.ts index 4af99af..f0d8f2d 100644 --- a/src/v2/routes/auth/oc-generators/deleteOCGeneratorResponse.ts +++ b/src/v2/routes/auth/oc-generators/deleteOCGeneratorResponse.ts @@ -1,59 +1,61 @@ import { auth } from "@/v2/lib/auth/lucia" -import type { APIContext as Context } from "@/worker-configuration" + import { savedOcGenerators } from "@/v2/db/schema" import { getConnection } from "@/v2/db/turso" import { eq, and } from "drizzle-orm" -export async function deleteOCGeneratorResponse(c: Context): Promise { - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle" || session.state === "invalid") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - c.status(401) - return c.json({ success: false, state: "unauthorized" }) - } - - const drizzle = getConnection(c.env).drizzle - - const formData = await c.req.formData() - const deleteID = (formData.get("deleteID") as string) || null - - if (!formData || !deleteID) - return c.json({ success: false, state: "no formdata provided" }) - - const ocGeneratorResponse = await drizzle - .select() - .from(savedOcGenerators) - .where( - and( - eq(savedOcGenerators.id, deleteID), - eq(savedOcGenerators.userId, session.userId) - ) - ) - - if (!ocGeneratorResponse) - return c.json({ - success: false, - state: "no generator found matching id", - }) - - await drizzle - .delete(savedOcGenerators) - .where( - and( - eq(savedOcGenerators.id, deleteID), - eq(savedOcGenerators.userId, session.userId) - ) - ) - - c.status(200) - return c.json({ - success: true, - state: `deleted saved oc generator with id ${deleteID}`, - ocGeneratorResponse, - }) +export async function deleteOCGeneratorResponse( + c: APIContext +): Promise { + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() + + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + c.status(401) + return c.json({ success: false, state: "unauthorized" }) + } + + const drizzle = getConnection(c.env).drizzle + + const formData = await c.req.formData() + const deleteID = (formData.get("deleteID") as string) || null + + if (!formData || !deleteID) + return c.json({ success: false, state: "no formdata provided" }) + + const ocGeneratorResponse = await drizzle + .select() + .from(savedOcGenerators) + .where( + and( + eq(savedOcGenerators.id, deleteID), + eq(savedOcGenerators.userId, session.userId) + ) + ) + + if (!ocGeneratorResponse) + return c.json({ + success: false, + state: "no generator found matching id", + }) + + await drizzle + .delete(savedOcGenerators) + .where( + and( + eq(savedOcGenerators.id, deleteID), + eq(savedOcGenerators.userId, session.userId) + ) + ) + + c.status(200) + return c.json({ + success: true, + state: `deleted saved oc generator with id ${deleteID}`, + ocGeneratorResponse, + }) } diff --git a/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts b/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts index 488b59c..b0f3d2d 100644 --- a/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts +++ b/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts @@ -1,38 +1,40 @@ import { auth } from "@/v2/lib/auth/lucia" -import type { APIContext as Context } from "@/worker-configuration" + import { savedOcGenerators } from "@/v2/db/schema" import { getConnection } from "@/v2/db/turso" -export async function saveOCGeneratorResponse(c: Context): Promise { - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle" || session.state === "invalid") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - c.status(401) - return c.json({ success: false, state: "invalid session" }) - } - - const drizzle = getConnection(c.env).drizzle - - const formData = await c.req.formData() - - // TODO: make sure data is actually valid before inserting it into the database - const ocGeneratorResponse = { - id: crypto.randomUUID(), - userId: session.userId as string, - name: formData.get("name") as string, - game: formData.get("game") as string, - dateCreated: new Date().getTime(), - isPublic: parseInt(formData.get("isPublic") as string), // 1 = yes, 0 = no, default = 0 - content: formData.get("content") as string, // this is stored as json, which can then be parsed - } - - await drizzle.insert(savedOcGenerators).values(ocGeneratorResponse) - - c.status(200) - return c.json({ success: true, state: "saved", ocGeneratorResponse }) +export async function saveOCGeneratorResponse( + c: APIContext +): Promise { + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() + + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + c.status(401) + return c.json({ success: false, state: "invalid session" }) + } + + const drizzle = getConnection(c.env).drizzle + + const formData = await c.req.formData() + + // TODO: make sure data is actually valid before inserting it into the database + const ocGeneratorResponse = { + id: crypto.randomUUID(), + userId: session.userId as string, + name: formData.get("name") as string, + game: formData.get("game") as string, + dateCreated: new Date().getTime(), + isPublic: parseInt(formData.get("isPublic") as string), // 1 = yes, 0 = no, default = 0 + content: formData.get("content") as string, // this is stored as json, which can then be parsed + } + + await drizzle.insert(savedOcGenerators).values(ocGeneratorResponse) + + c.status(200) + return c.json({ success: true, state: "saved", ocGeneratorResponse }) } diff --git a/src/v2/routes/auth/oc-generators/viewOCGeneratorResponses.ts b/src/v2/routes/auth/oc-generators/viewOCGeneratorResponses.ts index 5dff05f..203c3b8 100644 --- a/src/v2/routes/auth/oc-generators/viewOCGeneratorResponses.ts +++ b/src/v2/routes/auth/oc-generators/viewOCGeneratorResponses.ts @@ -1,33 +1,35 @@ import { auth } from "@/v2/lib/auth/lucia" -import type { APIContext as Context } from "@/worker-configuration" + import { savedOcGenerators } from "@/v2/db/schema" import { getConnection } from "@/v2/db/turso" import { eq } from "drizzle-orm" -export async function viewOCGeneratorResponses(c: Context): Promise { - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() +export async function viewOCGeneratorResponses( + c: APIContext +): Promise { + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - c.status(401) - return c.json({ success: false, state: "unauthorized" }) - } + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + c.status(401) + return c.json({ success: false, state: "unauthorized" }) + } - const drizzle = getConnection(c.env).drizzle + const drizzle = getConnection(c.env).drizzle - const ocGeneratorResponses = await drizzle - .select() - .from(savedOcGenerators) - .where(eq(savedOcGenerators.userId, session.userId)) + const ocGeneratorResponses = await drizzle + .select() + .from(savedOcGenerators) + .where(eq(savedOcGenerators.userId, session.userId)) - c.status(200) - return c.json({ - success: true, - state: "valid session", - ocGeneratorResponses, - }) + c.status(200) + return c.json({ + success: true, + state: "valid session", + ocGeneratorResponses, + }) } diff --git a/src/v2/routes/auth/signup.ts b/src/v2/routes/auth/signup.ts index fe081bc..5304622 100644 --- a/src/v2/routes/auth/signup.ts +++ b/src/v2/routes/auth/signup.ts @@ -1,68 +1,70 @@ import { auth } from "@/v2/lib/auth/lucia" -import type { APIContext as Context } from "@/worker-configuration" + // import * as validate from "@/v2/lib/regex/accountValidation"; -export async function signup(c: Context): Promise { - const formData = await c.req.formData() +export async function signup(c: APIContext): Promise { + const formData = await c.req.formData() - const username = formData.get("username") as string - const email = formData.get("email") as string - const password = formData.get("password") as string + const username = formData.get("username") as string + const email = formData.get("email") as string + const password = formData.get("password") as string - const validSession = await auth(c.env).handleRequest(c).validate() - if (validSession) - return c.json({ success: false, state: "already logged in" }, 200) + const validSession = await auth(c.env).handleRequest(c).validate() + if (validSession) + return c.json({ success: false, state: "already logged in" }, 200) - console.log("creating user") + console.log("creating user") - try { - const user = await auth(c.env).createUser({ - key: { - providerId: "username", - providerUserId: username.toLowerCase(), - password, - }, - attributes: { - username, - email, - email_verified: 0, - date_joined: Date.now(), - verified: 0, - role_flags: 1, - is_contributor: 0, - self_assignable_role_flags: null, - username_colour: null, - avatar_url: null, - banner_url: null, - pronouns: null, // we can splice this into possesive, subject, and object pronouns by "/", e.g "he/him/his" => {subject: "he", object: "him", possesive: "his"} - bio: "No bio set", - }, - }) + try { + const user = await auth(c.env).createUser({ + key: { + providerId: "username", + providerUserId: username.toLowerCase(), + password, + }, + attributes: { + username, + email, + email_verified: 0, + date_joined: Date.now(), + verified: 0, + role_flags: 1, + is_contributor: 0, + self_assignable_role_flags: null, + username_colour: null, + avatar_url: null, + banner_url: null, + pronouns: null, // we can splice this into possesive, subject, and object pronouns by "/", e.g "he/him/his" => {subject: "he", object: "him", possesive: "his"} + bio: "No bio set", + }, + }) - const userAgent = c.req.headers.get("user-agent") ?? "" - const countryCode = c.req.headers.get("cf-ipcountry") ?? "" + const userAgent = c.req.header("user-agent") ?? "" + const countryCode = c.req.header("cf-ipcountry") ?? "" + const ipAddress = c.req.header("cf-connecting-ip") ?? "" - // TODO: encrypt session attributes with sha256 - const newSession = await auth(c.env).createSession({ - userId: user.userId, - attributes: { - country_code: countryCode, - user_agent: userAgent, - }, - }) + // TODO: encrypt session attributes with sha256 + const newSession = await auth(c.env).createSession({ + userId: user.userId, + attributes: { + country_code: countryCode, + user_agent: userAgent, + ip_address: ipAddress, + }, + }) - const authRequest = auth(c.env).handleRequest(c) - authRequest.setSession(newSession) - return c.json({ success: true, state: "logged in" }, 200) - } catch (e) { - console.log(e) - return c.json( - { - success: false, - status: "error", - error: "Error creating user", - }, - 500 - ) - } + const authRequest = auth(c.env).handleRequest(c) + authRequest.setSession(newSession) + return c.json({ success: true, state: "logged in" }, 200) + } catch (e) { + console.log(e) + return c.json( + { + success: false, + status: "error", + error: "Error creating user", + }, + 500 + ) + } } diff --git a/src/v2/routes/auth/tags/createTag.ts b/src/v2/routes/auth/tags/createTag.ts index 597d05e..f9aa5b7 100644 --- a/src/v2/routes/auth/tags/createTag.ts +++ b/src/v2/routes/auth/tags/createTag.ts @@ -1,58 +1,58 @@ import { auth } from "@/v2/lib/auth/lucia" import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" import { getConnection } from "@/v2/db/turso" -import { APIContext as Context } from "@/worker-configuration" + import { assetTags } from "@/v2/db/schema" -export async function createTag(c: Context): Promise { - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle" || session.state === "invalid") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - c.status(401) - return c.json({ success: false, state: "invalid session" }) - } - - const roleFlags = roleFlagsToArray(session.user.role_flags) - - if (!roleFlags.includes("CREATOR")) { - c.status(401) - return c.json({ success: false, state: "unauthorized" }) - } - - const drizzle = getConnection(c.env).drizzle - - const formData = await c.req.formData() - - const tag = { - id: crypto.randomUUID(), - name: formData.get("name") as string, - formattedName: formData.get("formattedName") as string, - assetCount: 0, - lastUpdated: new Date().getTime(), // unix timestamp - } - - // check if tag.name exists - const tagExists = await drizzle.query.assetTags.findFirst({ - where: (assetTags, { eq }) => eq(assetTags.name, tag.name), - }) - - if (tagExists) { - c.status(200) - return c.json({ success: false, state: "tag with name already exists" }) - } - - try { - await drizzle.insert(assetTags).values(tag).execute() - } catch (e) { - c.status(200) - return c.json({ success: false, state: "failed to create tag" }) - } - - c.status(200) - return c.json({ success: true, state: "created tag", tag }) +export async function createTag(c: APIContext): Promise { + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() + + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + c.status(401) + return c.json({ success: false, state: "invalid session" }) + } + + const roleFlags = roleFlagsToArray(session.user.role_flags) + + if (!roleFlags.includes("CREATOR")) { + c.status(401) + return c.json({ success: false, state: "unauthorized" }) + } + + const drizzle = getConnection(c.env).drizzle + + const formData = await c.req.formData() + + const tag = { + id: crypto.randomUUID(), + name: formData.get("name") as string, + formattedName: formData.get("formattedName") as string, + assetCount: 0, + lastUpdated: new Date().getTime(), // unix timestamp + } + + // check if tag.name exists + const tagExists = await drizzle.query.assetTags.findFirst({ + where: (assetTags, { eq }) => eq(assetTags.name, tag.name), + }) + + if (tagExists) { + c.status(200) + return c.json({ success: false, state: "tag with name already exists" }) + } + + try { + await drizzle.insert(assetTags).values(tag).execute() + } catch (e) { + c.status(200) + return c.json({ success: false, state: "failed to create tag" }) + } + + c.status(200) + return c.json({ success: true, state: "created tag", tag }) } diff --git a/src/v2/routes/auth/tags/deleteTag.ts b/src/v2/routes/auth/tags/deleteTag.ts index 5824895..42946f2 100644 --- a/src/v2/routes/auth/tags/deleteTag.ts +++ b/src/v2/routes/auth/tags/deleteTag.ts @@ -1,60 +1,60 @@ import { auth } from "@/v2/lib/auth/lucia" import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" import { getConnection } from "@/v2/db/turso" -import { APIContext as Context } from "@/worker-configuration" + import { assetTags } from "@/v2/db/schema" import { eq } from "drizzle-orm" -export async function deleteTag(c: Context): Promise { - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle" || session.state === "invalid") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "invalid session" }, 200) - } - - const roleFlags = roleFlagsToArray(session.user.role_flags) - - if (!roleFlags.includes("CREATOR")) { - return c.json({ success: false, state: "unauthorized" }, 401) - } - - const drizzle = getConnection(c.env).drizzle - - const formData = await c.req.formData() - - const tag = { - id: formData.get("id") as string | null, - } - - if (!tag.id) { - return c.json({ success: false, state: "no id entered" }, 200) - } - - // check if tag exists - const tagExists = await drizzle.query.assetTags.findFirst({ - where: (assetTags, { eq }) => eq(assetTags.id, tag.id), - }) - - if (!tagExists) { - return c.json( - { success: false, state: "tag with ID doesn't exist" }, - 200 - ) - } - - try { - await drizzle - .delete(assetTags) - .where(eq(assetTags.id, tag.id)) - .execute() - } catch (e) { - return c.json({ success: false, state: "failed to delete tag" }, 200) - } - - return c.json({ success: true, state: "deleted tag", tag }, 200) +export async function deleteTag(c: APIContext): Promise { + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() + + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + return c.json({ success: false, state: "invalid session" }, 200) + } + + const roleFlags = roleFlagsToArray(session.user.role_flags) + + if (!roleFlags.includes("CREATOR")) { + return c.json({ success: false, state: "unauthorized" }, 401) + } + + const drizzle = getConnection(c.env).drizzle + + const formData = await c.req.formData() + + const tag = { + id: formData.get("id") as string | null, + } + + if (!tag.id) { + return c.json({ success: false, state: "no id entered" }, 200) + } + + // check if tag exists + const tagExists = await drizzle.query.assetTags.findFirst({ + where: (assetTags, { eq }) => eq(assetTags.id, tag.id), + }) + + if (!tagExists) { + return c.json( + { success: false, state: "tag with ID doesn't exist" }, + 200 + ) + } + + try { + await drizzle + .delete(assetTags) + .where(eq(assetTags.id, tag.id)) + .execute() + } catch (e) { + return c.json({ success: false, state: "failed to delete tag" }, 200) + } + + return c.json({ success: true, state: "deleted tag", tag }, 200) } diff --git a/src/v2/routes/auth/user-attributes/self-upload/uploadAvatar.ts b/src/v2/routes/auth/user-attributes/self-upload/uploadAvatar.ts index ef4b151..9ab0de1 100644 --- a/src/v2/routes/auth/user-attributes/self-upload/uploadAvatar.ts +++ b/src/v2/routes/auth/user-attributes/self-upload/uploadAvatar.ts @@ -1,45 +1,44 @@ import { auth } from "@/v2/lib/auth/lucia" -import type { APIContext as Context } from "@/worker-configuration" // TODO: add support for animated avatars -export async function uploadProfileImage(c: Context): Promise { - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() +export async function uploadProfileImage(c: APIContext): Promise { + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "invalid session" }, 200) - } + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + return c.json({ success: false, state: "invalid session" }, 200) + } - const formData = await c.req.formData() + const formData = await c.req.formData() - const avatar = formData.get("avatar") as unknown as File | null + const avatar = formData.get("avatar") as unknown as File | null - if (!avatar || avatar.type !== "image/png") { - return c.json({ success: false, state: "invalid avatar" }, 200) - } + if (!avatar || avatar.type !== "image/png") { + return c.json({ success: false, state: "invalid avatar" }, 200) + } - const newAvatar = new File([avatar], `${session.userId}.png`) - const newAvatarURL = `/avatars/${session.userId}.png` + const newAvatar = new File([avatar], `${session.userId}.png`) + const newAvatarURL = `/avatars/${session.userId}.png` - if (!session.user.avatar_url) { - await auth(c.env).updateUserAttributes(session.userId, { - avatar_url: newAvatarURL, - }) - } + if (!session.user.avatar_url) { + await auth(c.env).updateUserAttributes(session.userId, { + avatar_url: newAvatarURL, + }) + } - if (session.user.avatar_url) { - const oldAvatarObject = await c.env.bucket.get(session.user.avatar_url) + if (session.user.avatar_url) { + const oldAvatarObject = await c.env.bucket.get(session.user.avatar_url) - if (oldAvatarObject) { - await c.env.bucket.delete(session.user.avatar_url) - } - } + if (oldAvatarObject) { + await c.env.bucket.delete(session.user.avatar_url) + } + } - await c.env.bucket.put(newAvatarURL, newAvatar) + await c.env.bucket.put(newAvatarURL, newAvatar) - return c.json({ success: true, state: "uploaded new profile image" }, 200) + return c.json({ success: true, state: "uploaded new profile image" }, 200) } diff --git a/src/v2/routes/auth/user-attributes/self-upload/uploadBanner.ts b/src/v2/routes/auth/user-attributes/self-upload/uploadBanner.ts index 8238758..751c9e0 100644 --- a/src/v2/routes/auth/user-attributes/self-upload/uploadBanner.ts +++ b/src/v2/routes/auth/user-attributes/self-upload/uploadBanner.ts @@ -1,49 +1,48 @@ import { auth } from "@/v2/lib/auth/lucia" -import type { APIContext as Context } from "@/worker-configuration" // TODO: add support for animated banners -export async function uploadBannerImage(c: Context): Promise { - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() +export async function uploadBannerImage(c: APIContext): Promise { + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "invalid session" }, 200) - } + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + return c.json({ success: false, state: "invalid session" }, 200) + } - if (session.user.is_contributor !== 1) { - return c.json({ success: false, state: "unauthorized" }, 401) - } + if (session.user.is_contributor !== 1) { + return c.json({ success: false, state: "unauthorized" }, 401) + } - const formData = await c.req.formData() + const formData = await c.req.formData() - const banner = formData.get("banner") as unknown as File | null + const banner = formData.get("banner") as unknown as File | null - if (!banner || banner.type !== "image/png") { - return c.json({ success: false, state: "invalid banner" }, 200) - } + if (!banner || banner.type !== "image/png") { + return c.json({ success: false, state: "invalid banner" }, 200) + } - const newBanner = new File([banner], `${session.userId}.png`) - const newBannerURL = `/banners/${session.userId}.png` + const newBanner = new File([banner], `${session.userId}.png`) + const newBannerURL = `/banners/${session.userId}.png` - if (!session.user.banner_url) { - await auth(c.env).updateUserAttributes(session.userId, { - banner_url: newBannerURL, - }) - } + if (!session.user.banner_url) { + await auth(c.env).updateUserAttributes(session.userId, { + banner_url: newBannerURL, + }) + } - if (session.user.banner_url) { - const oldBannerObject = await c.env.bucket.get(session.user.banner_url) + if (session.user.banner_url) { + const oldBannerObject = await c.env.bucket.get(session.user.banner_url) - if (oldBannerObject) { - await c.env.bucket.delete(session.user.banner_url) - } - } + if (oldBannerObject) { + await c.env.bucket.delete(session.user.banner_url) + } + } - await c.env.bucket.put(newBannerURL, newBanner) + await c.env.bucket.put(newBannerURL, newBanner) - return c.json({ success: true, state: "uploaded new banner" }, 200) + return c.json({ success: true, state: "uploaded new banner" }, 200) } diff --git a/src/v2/routes/auth/user-attributes/updateUserAttributes.ts b/src/v2/routes/auth/user-attributes/updateUserAttributes.ts index 726737b..f6defb5 100644 --- a/src/v2/routes/auth/user-attributes/updateUserAttributes.ts +++ b/src/v2/routes/auth/user-attributes/updateUserAttributes.ts @@ -1,38 +1,37 @@ import { auth } from "@/v2/lib/auth/lucia" -import type { APIContext as Context } from "@/worker-configuration" -export async function updateUserAttributes(c: Context): Promise { - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() +export async function updateUserAttributes(c: APIContext): Promise { + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "invalid session" }, 200) - } + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + return c.json({ success: false, state: "invalid session" }, 200) + } - const formData = await c.req.formData() + const formData = await c.req.formData() - const attributes = { - username: formData.get("username") as string | null, - pronouns: formData.get("pronouns") as string | null, - self_assignable_role_flags: formData.get( - "self_assignable_roles" - ) as unknown as number | null, - bio: formData.get("bio") as string | null, - } + const attributes = { + username: formData.get("username") as string | null, + pronouns: formData.get("pronouns") as string | null, + self_assignable_role_flags: formData.get( + "self_assignable_roles" + ) as unknown as number | null, + bio: formData.get("bio") as string | null, + } - // remove null values from attributes - Object.keys(attributes).forEach((key) => { - if (attributes[key] === null) delete attributes[key] - }) + // remove null values from attributes + Object.keys(attributes).forEach((key) => { + if (attributes[key] === null) delete attributes[key] + }) - await auth(c.env).updateUserAttributes(session.userId, attributes) + await auth(c.env).updateUserAttributes(session.userId, attributes) - return c.json( - { success: true, state: "updated user attributes", session }, - 200 - ) + return c.json( + { success: true, state: "updated user attributes", session }, + 200 + ) } diff --git a/src/v2/routes/auth/user-attributes/user-relations/followUser.ts b/src/v2/routes/auth/user-attributes/user-relations/followUser.ts index 188d899..ea9aaa7 100644 --- a/src/v2/routes/auth/user-attributes/user-relations/followUser.ts +++ b/src/v2/routes/auth/user-attributes/user-relations/followUser.ts @@ -1,69 +1,69 @@ import { auth } from "@/v2/lib/auth/lucia" import { getConnection } from "@/v2/db/turso" -import { APIContext as Context } from "@/worker-configuration" + import { following, follower } from "@/v2/db/schema" -export async function followUser(c: Context): Promise { - const drizzle = getConnection(c.env).drizzle +export async function followUser(c: APIContext): Promise { + const drizzle = getConnection(c.env).drizzle - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "invalid session" }, 200) - } + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + return c.json({ success: false, state: "invalid session" }, 200) + } - const formData = await c.req.formData() + const formData = await c.req.formData() - const userToFollow = formData.get("userIdToFollow") as string | null + const userToFollow = formData.get("userIdToFollow") as string | null - if (!userToFollow) { - return c.json({ success: false, state: "no userid entered" }, 200) - } + if (!userToFollow) { + return c.json({ success: false, state: "no userid entered" }, 200) + } - // check if user exists - const user = await drizzle.query.users.findFirst({ - where: (users, { eq }) => eq(users.id, userToFollow), - }) + // check if user exists + const user = await drizzle.query.users.findFirst({ + where: (users, { eq }) => eq(users.id, userToFollow), + }) - if (!user) { - return c.json({ success: false, state: "user not found" }, 200) - } + if (!user) { + return c.json({ success: false, state: "user not found" }, 200) + } - const isFollowing = await drizzle.query.following.findFirst({ - where: (following, { eq }) => - eq(following.id, `${session.userId}-${userToFollow}`), - }) + const isFollowing = await drizzle.query.following.findFirst({ + where: (following, { eq }) => + eq(following.id, `${session.userId}-${userToFollow}`), + }) - if (isFollowing) { - return c.json({ success: false, state: "already following" }, 200) - } + if (isFollowing) { + return c.json({ success: false, state: "already following" }, 200) + } - await drizzle.transaction(async (transaction) => { - await transaction - .insert(follower) - .values({ - id: `${session.userId}-${userToFollow}`, - followerUserId: session.userId, - followingUserId: userToFollow, - }) - .execute() + await drizzle.transaction(async (transaction) => { + await transaction + .insert(follower) + .values({ + id: `${session.userId}-${userToFollow}`, + followerUserId: session.userId, + followingUserId: userToFollow, + }) + .execute() - await transaction - .insert(following) - .values({ - id: `${userToFollow}-${session.userId}`, - followerUserId: userToFollow, - followingUserId: session.userId, - }) - .execute() + await transaction + .insert(following) + .values({ + id: `${userToFollow}-${session.userId}`, + followerUserId: userToFollow, + followingUserId: session.userId, + }) + .execute() - return c.json({ success: true, state: "followed user" }, 200) - }) + return c.json({ success: true, state: "followed user" }, 200) + }) - return c.json({ success: false, state: "failed to follow user" }, 500) + return c.json({ success: false, state: "failed to follow user" }, 500) } diff --git a/src/v2/routes/auth/user-attributes/user-relations/unfollowUser.ts b/src/v2/routes/auth/user-attributes/user-relations/unfollowUser.ts index 5f3c3e7..01e6b93 100644 --- a/src/v2/routes/auth/user-attributes/user-relations/unfollowUser.ts +++ b/src/v2/routes/auth/user-attributes/user-relations/unfollowUser.ts @@ -1,62 +1,62 @@ import { auth } from "@/v2/lib/auth/lucia" import { getConnection } from "@/v2/db/turso" -import { APIContext as Context } from "@/worker-configuration" + import { following, follower } from "@/v2/db/schema" import { eq } from "drizzle-orm" -export async function unFollowUser(c: Context): Promise { - const drizzle = getConnection(c.env).drizzle +export async function unFollowUser(c: APIContext): Promise { + const drizzle = getConnection(c.env).drizzle - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "invalid session" }, 200) - } + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + return c.json({ success: false, state: "invalid session" }, 200) + } - const formData = await c.req.formData() + const formData = await c.req.formData() - const userToUnFollow = formData.get("userIdToUnFollow") as string | null + const userToUnFollow = formData.get("userIdToUnFollow") as string | null - if (!userToUnFollow) { - return c.json({ success: false, state: "no userid entered" }, 200) - } + if (!userToUnFollow) { + return c.json({ success: false, state: "no userid entered" }, 200) + } - // check if user exists - const user = await drizzle.query.users.findFirst({ - where: (users, { eq }) => eq(users.id, userToUnFollow), - }) + // check if user exists + const user = await drizzle.query.users.findFirst({ + where: (users, { eq }) => eq(users.id, userToUnFollow), + }) - if (!user) { - return c.json({ success: false, state: "user not found" }, 200) - } + if (!user) { + return c.json({ success: false, state: "user not found" }, 200) + } - const isFollowing = await drizzle.query.following.findFirst({ - where: (following, { eq }) => - eq(following.id, `${session.userId}-${userToUnFollow}`), - }) + const isFollowing = await drizzle.query.following.findFirst({ + where: (following, { eq }) => + eq(following.id, `${session.userId}-${userToUnFollow}`), + }) - if (!isFollowing) { - return c.json({ success: false, state: "not following" }, 200) - } + if (!isFollowing) { + return c.json({ success: false, state: "not following" }, 200) + } - await drizzle.transaction(async (transaction) => { - await transaction - .delete(follower) - .where(eq(follower.id, `${session.userId}-${userToUnFollow}`)) - .execute() + await drizzle.transaction(async (transaction) => { + await transaction + .delete(follower) + .where(eq(follower.id, `${session.userId}-${userToUnFollow}`)) + .execute() - await transaction - .delete(following) - .where(eq(following.id, `${session.userId}-${userToUnFollow}`)) - .execute() + await transaction + .delete(following) + .where(eq(following.id, `${session.userId}-${userToUnFollow}`)) + .execute() - return c.json({ success: true, state: "unfollowed user" }, 200) - }) + return c.json({ success: true, state: "unfollowed user" }, 200) + }) - return c.json({ success: false, state: "failed to unfollow user" }, 200) + return c.json({ success: false, state: "failed to unfollow user" }, 200) } diff --git a/src/v2/routes/auth/validate.ts b/src/v2/routes/auth/validate.ts index d6b7507..b6088e7 100644 --- a/src/v2/routes/auth/validate.ts +++ b/src/v2/routes/auth/validate.ts @@ -1,32 +1,33 @@ import { auth } from "@/v2/lib/auth/lucia" -import type { APIContext as Context } from "@/worker-configuration" -export async function validate(c: Context): Promise { - console.log(c) - const authRequest = auth(c.env).handleRequest(c) +export async function validate(c: APIContext): Promise { + console.log(c) + const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() + const session = await authRequest.validate() - const countryCode = c.req.headers.get("cf-ipcountry") ?? "" - const userAgent = c.req.headers.get("user-agent") ?? "" + const countryCode = c.req.header("cf-ipcountry") ?? "" + const userAgent = c.req.header("user-agent") ?? "" + const ipAddress = c.req.header("cf-connecting-ip") ?? "" - if (!session) { - authRequest.setSession(null) - c.status(401) - return c.json({ success: false, state: "invalid session" }) - } + if (!session) { + authRequest.setSession(null) + c.status(401) + return c.json({ success: false, state: "invalid session" }) + } - if ( - session.userAgent !== userAgent || - session.countryCode !== countryCode || - session.state === "invalid" || - session.state === "idle" - ) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - c.status(401) - return c.json({ success: false, state: "invalid session" }) - } + if ( + session.userAgent !== userAgent || + session.countryCode !== countryCode || + session.ipAddress !== ipAddress || + session.state === "invalid" || + session.state === "idle" + ) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + c.status(401) + return c.json({ success: false, state: "invalid session" }) + } - return c.json({ success: true, state: "valid session", session }, 200) + return c.json({ success: true, state: "valid session", session }, 200) } diff --git a/src/v2/routes/discord/contributors.ts b/src/v2/routes/discord/contributors.ts index 3c09951..e4fb180 100644 --- a/src/v2/routes/discord/contributors.ts +++ b/src/v2/routes/discord/contributors.ts @@ -1,69 +1,68 @@ import { responseHeaders } from "@/v2/lib/responseHeaders" import { roles, guildId } from "@/v2/lib/discord" import type { Contributor, GuildMember } from "@/v2/lib/types/discord" -import type { APIContext as Context } from "@/worker-configuration" // TODO: replace discord contributors with roles on the site -export async function contributors(c: Context): Promise { - const members: Contributor[] = [] +export async function contributors(c: APIContext): Promise { + const members: Contributor[] = [] - let after: string | null = null - let fetchUsers = true + let after: string | null = null + let fetchUsers = true - while (fetchUsers) { - const response = await fetch( - `https://discord.com/api/guilds/${guildId}/members?limit=1000${ - after ? `&after=${after}` : "" - }`, - { - headers: { - Authorization: `Bot ${c.env.DISCORD_TOKEN}`, - }, - } - ) + while (fetchUsers) { + const response = await fetch( + `https://discord.com/api/guilds/${guildId}/members?limit=1000${ + after ? `&after=${after}` : "" + }`, + { + headers: { + Authorization: `Bot ${c.env.DISCORD_TOKEN}`, + }, + } + ) - const guildMembers: GuildMember[] = await response.json() + const guildMembers: GuildMember[] = await response.json() - const filteredMembers: GuildMember[] = guildMembers.filter((member) => { - return member.roles.some((role) => - Object.keys(roles).includes(role) - ) - }) + const filteredMembers: GuildMember[] = guildMembers.filter((member) => { + return member.roles.some((role) => + Object.keys(roles).includes(role) + ) + }) - const contributors: Contributor[] = filteredMembers.map((member) => { - const rolesArray = member.roles - .map((role) => roles[role]) - .filter((role) => role) + const contributors: Contributor[] = filteredMembers.map((member) => { + const rolesArray = member.roles + .map((role) => roles[role]) + .filter((role) => role) - // TODO: support animated avatars - return { - id: member.user.id, - username: member.user.username, - globalname: member.user.global_name || null, - avatar: `https://cdn.discordapp.com/avatars/${member.user.id}/${member.user.avatar}.webp`, - roles: rolesArray, - } - }) + // TODO: support animated avatars + return { + id: member.user.id, + username: member.user.username, + globalname: member.user.global_name || null, + avatar: `https://cdn.discordapp.com/avatars/${member.user.id}/${member.user.avatar}.webp`, + roles: rolesArray, + } + }) - members.push(...contributors) + members.push(...contributors) - if ( - !guildMembers.length || - !guildMembers[guildMembers.length - 1].user - ) { - fetchUsers = false - } + if ( + !guildMembers.length || + !guildMembers[guildMembers.length - 1].user + ) { + fetchUsers = false + } - after = guildMembers[guildMembers.length - 1]?.user?.id - } + after = guildMembers[guildMembers.length - 1]?.user?.id + } - return c.json( - { - success: true, - status: "ok", - contributors: members, - }, - 200, - responseHeaders - ) + return c.json( + { + success: true, + status: "ok", + contributors: members, + }, + 200, + responseHeaders + ) } diff --git a/src/v2/routes/discord/discordRoute.ts b/src/v2/routes/discord/discordRoute.ts index 05b9bd5..6bd903d 100644 --- a/src/v2/routes/discord/discordRoute.ts +++ b/src/v2/routes/discord/discordRoute.ts @@ -1,11 +1,10 @@ import { Hono } from "hono" import { contributors } from "./contributors" -import { Bindings } from "@/worker-configuration" const discordRoute = new Hono<{ Bindings: Bindings }>() discordRoute.get("/contributors", async (c) => { - return contributors(c) + return contributors(c) }) export default discordRoute diff --git a/src/v2/routes/games/allGames.ts b/src/v2/routes/games/allGames.ts index 2ff5511..aafc7fb 100644 --- a/src/v2/routes/games/allGames.ts +++ b/src/v2/routes/games/allGames.ts @@ -2,53 +2,52 @@ import { responseHeaders } from "@/v2/lib/responseHeaders" import { getConnection } from "@/v2/db/turso" import { listBucket } from "@/v2/lib/listBucket" import { games } from "@/v2/db/schema" -import type { APIContext as Context } from "@/worker-configuration" - -export async function getAllGames(c: Context): Promise { - const cacheKey = new Request(c.req.url.toString(), c.req) - const cache = caches.default - let response = await cache.match(cacheKey) - - if (response) return response - - const files = await listBucket(c.env.bucket, { - prefix: "oc-generators/", - delimiter: "/", - }) - - const results = files.delimitedPrefixes.map((file) => { - return { - name: file.replace("oc-generators/", "").replace("/", ""), - } - }) - - const drizzle = getConnection(c.env).drizzle - - const gamesList = await drizzle - .select() - .from(games) - .execute() - .then((row) => - row.map((game) => ({ - ...game, - has_generator: results.some( - (generator) => generator.name === game.name - ), - })) - ) - - response = c.json( - { - success: true, - status: "ok", - results: gamesList, - }, - 200, - responseHeaders - ) - - response.headers.set("Cache-Control", "s-maxage=1200") - await cache.put(cacheKey, response.clone()) - - return response + +export async function getAllGames(c: APIContext): Promise { + const cacheKey = new Request(c.req.url.toString(), c.req) + const cache = caches.default + let response = await cache.match(cacheKey) + + if (response) return response + + const files = await listBucket(c.env.bucket, { + prefix: "oc-generators/", + delimiter: "/", + }) + + const results = files.delimitedPrefixes.map((file) => { + return { + name: file.replace("oc-generators/", "").replace("/", ""), + } + }) + + const drizzle = getConnection(c.env).drizzle + + const gamesList = await drizzle + .select() + .from(games) + .execute() + .then((row) => + row.map((game) => ({ + ...game, + has_generator: results.some( + (generator) => generator.name === game.name + ), + })) + ) + + response = c.json( + { + success: true, + status: "ok", + results: gamesList, + }, + 200, + responseHeaders + ) + + response.headers.set("Cache-Control", "s-maxage=1200") + await cache.put(cacheKey, response.clone()) + + return response } diff --git a/src/v2/routes/games/gamesRoute.ts b/src/v2/routes/games/gamesRoute.ts index d11f0f8..b095277 100644 --- a/src/v2/routes/games/gamesRoute.ts +++ b/src/v2/routes/games/gamesRoute.ts @@ -1,11 +1,10 @@ import { Hono } from "hono" import { getAllGames } from "./allGames" -import { Bindings } from "@/worker-configuration" const gamesRoute = new Hono<{ Bindings: Bindings }>() gamesRoute.get("/all", async (c) => { - return getAllGames(c) + return getAllGames(c) }) export default gamesRoute diff --git a/src/v2/routes/oc-generators/getGenerator.ts b/src/v2/routes/oc-generators/getGenerator.ts index b19dafc..63c9356 100644 --- a/src/v2/routes/oc-generators/getGenerator.ts +++ b/src/v2/routes/oc-generators/getGenerator.ts @@ -1,40 +1,39 @@ import { responseHeaders } from "@/v2/lib/responseHeaders" import { listBucket } from "@/v2/lib/listBucket" import { createNotFoundResponse } from "@/v2/lib/helpers/responses/notFoundResponse" -import type { APIContext as Context } from "@/worker-configuration" -export async function getGeneratorFromName(c: Context): Promise { - const { gameName } = c.req.param() - const cacheKey = new Request(c.req.url.toString(), c.req) - const cache = caches.default - let response = await cache.match(cacheKey) +export async function getGeneratorFromName(c: APIContext): Promise { + const { gameName } = c.req.param() + const cacheKey = new Request(c.req.url.toString(), c.req) + const cache = caches.default + let response = await cache.match(cacheKey) - if (response) return response + if (response) return response - const files = await listBucket(c.env.bucket, { - prefix: `oc-generators/${gameName}/list.json`, - }) + const files = await listBucket(c.env.bucket, { + prefix: `oc-generators/${gameName}/list.json`, + }) - if (files.objects.length === 0) - return createNotFoundResponse(c, "Generator not found", responseHeaders) + if (files.objects.length === 0) + return createNotFoundResponse(c, "Generator not found", responseHeaders) - const data = await fetch( - `https://files.wanderer.moe/${files.objects[0].key}` - ) + const data = await fetch( + `https://files.wanderer.moe/${files.objects[0].key}` + ) - const generatorData = await data.json() + const generatorData = await data.json() - response = c.json( - { - status: "ok", - data: generatorData, - }, - 200, - responseHeaders - ) + response = c.json( + { + status: "ok", + data: generatorData, + }, + 200, + responseHeaders + ) - response.headers.set("Cache-Control", "s-maxage=604800") // the content of this file is unlikely to change, so caching is fine - await cache.put(cacheKey, response.clone()) + response.headers.set("Cache-Control", "s-maxage=604800") // the content of this file is unlikely to change, so caching is fine + await cache.put(cacheKey, response.clone()) - return response + return response } diff --git a/src/v2/routes/oc-generators/getGenerators.ts b/src/v2/routes/oc-generators/getGenerators.ts index 8c50d6b..03ff071 100644 --- a/src/v2/routes/oc-generators/getGenerators.ts +++ b/src/v2/routes/oc-generators/getGenerators.ts @@ -1,43 +1,42 @@ import { responseHeaders } from "@/v2/lib/responseHeaders" import { listBucket } from "@/v2/lib/listBucket" -import type { APIContext as Context } from "@/worker-configuration" - -export async function getGenerators(c: Context): Promise { - const cacheKey = new Request(c.req.url.toString(), c.req) - const cache = caches.default - let response = await cache.match(cacheKey) - - if (response) return response - - // listing all files inside of oc-generators subfolder, as they can't be manually inputted - // by users but instead stored on the oc-generators repo which is synced with R2 bucket - const files = await listBucket(c.env.bucket, { - prefix: "oc-generators/", - delimiter: "/", - }) - - // console.log(files); - - const results = files.delimitedPrefixes.map((file) => { - return { - name: file.replace("oc-generators/", "").replace("/", ""), - path: `/oc-generators/${file - .replace("oc-generators/", "") - .replace("/", "")}`, - } - }) - - response = c.json( - { - status: "ok", - data: results, - }, - 200, - responseHeaders - ) - - response.headers.set("Cache-Control", "s-maxage=28800") - await cache.put(cacheKey, response.clone()) - - return response + +export async function getGenerators(c: APIContext): Promise { + const cacheKey = new Request(c.req.url.toString(), c.req) + const cache = caches.default + let response = await cache.match(cacheKey) + + if (response) return response + + // listing all files inside of oc-generators subfolder, as they can't be manually inputted + // by users but instead stored on the oc-generators repo which is synced with R2 bucket + const files = await listBucket(c.env.bucket, { + prefix: "oc-generators/", + delimiter: "/", + }) + + // console.log(files); + + const results = files.delimitedPrefixes.map((file) => { + return { + name: file.replace("oc-generators/", "").replace("/", ""), + path: `/oc-generators/${file + .replace("oc-generators/", "") + .replace("/", "")}`, + } + }) + + response = c.json( + { + status: "ok", + data: results, + }, + 200, + responseHeaders + ) + + response.headers.set("Cache-Control", "s-maxage=28800") + await cache.put(cacheKey, response.clone()) + + return response } diff --git a/src/v2/routes/oc-generators/ocGeneratorRoutes.ts b/src/v2/routes/oc-generators/ocGeneratorRoutes.ts index c61daf1..de4dab0 100644 --- a/src/v2/routes/oc-generators/ocGeneratorRoutes.ts +++ b/src/v2/routes/oc-generators/ocGeneratorRoutes.ts @@ -1,16 +1,15 @@ import { Hono } from "hono" import { getGeneratorFromName } from "./getGenerator" import { getGenerators } from "./getGenerators" -import { Bindings } from "@/worker-configuration" const ocGeneratorRoute = new Hono<{ Bindings: Bindings }>() ocGeneratorRoute.get("/", async (c) => { - return getGenerators(c) + return getGenerators(c) }) ocGeneratorRoute.get("/:gameName", async (c) => { - return getGeneratorFromName(c) + return getGeneratorFromName(c) }) export default ocGeneratorRoute diff --git a/src/v2/routes/search/all/searchAll.ts b/src/v2/routes/search/all/searchAll.ts index c51a18c..de2f132 100644 --- a/src/v2/routes/search/all/searchAll.ts +++ b/src/v2/routes/search/all/searchAll.ts @@ -1,115 +1,115 @@ import { responseHeaders } from "@/v2/lib/responseHeaders" import { getConnection } from "@/v2/db/turso" -import type { APIContext as Context } from "@/worker-configuration" + import { like, eq } from "drizzle-orm" import { auth } from "@/v2/lib/auth/lucia" -export async function searchAll(c: Context): Promise { - const { query } = c.req.param() - const cacheKey = new Request(c.req.url.toString(), c.req) - const cache = caches.default - let response = await cache.match(cacheKey) +export async function searchAll(c: APIContext): Promise { + const { query } = c.req.param() + const cacheKey = new Request(c.req.url.toString(), c.req) + const cache = caches.default + let response = await cache.match(cacheKey) - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - } + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + } - if (response) return response - const drizzle = getConnection(c.env).drizzle + if (response) return response + const drizzle = getConnection(c.env).drizzle - // https://cdn.discordapp.com/attachments/1102306276832202813/1147291827699986572/F.gif - const usersResponse = await drizzle.query.users.findMany({ - where: (users) => { - return like(users.username, `%${query}%`) - }, - columns: { - email: false, - emailVerified: false, - }, - }) + // https://cdn.discordapp.com/attachments/1102306276832202813/1147291827699986572/F.gif + const usersResponse = await drizzle.query.users.findMany({ + where: (users) => { + return like(users.username, `%${query}%`) + }, + columns: { + email: false, + emailVerified: false, + }, + }) - const assetCategoryResponse = await drizzle.query.assetCategories.findMany({ - where: (assetCategories) => { - return like(assetCategories.name, `%${query}%`) - }, - }) + const assetCategoryResponse = await drizzle.query.assetCategories.findMany({ + where: (assetCategories) => { + return like(assetCategories.name, `%${query}%`) + }, + }) - const assetTagsResponse = await drizzle.query.assetTags.findMany({ - where: (assetTags) => { - return like(assetTags.name, `%${query}%`) - }, - }) + const assetTagsResponse = await drizzle.query.assetTags.findMany({ + where: (assetTags) => { + return like(assetTags.name, `%${query}%`) + }, + }) - const assetsResponse = await drizzle.query.assets.findMany({ - where: (assets) => { - return like(assets.name, `%${query}%`) - }, - }) + const assetsResponse = await drizzle.query.assets.findMany({ + where: (assets) => { + return like(assets.name, `%${query}%`) + }, + }) - const gamesResponse = await drizzle.query.games.findMany({ - where: (games) => { - return like(games.name, `%${query}%`) - }, - }) + const gamesResponse = await drizzle.query.games.findMany({ + where: (games) => { + return like(games.name, `%${query}%`) + }, + }) - const savedOcGeneratorsResponse = - await drizzle.query.savedOcGenerators.findMany({ - where: (savedOcGenerators, { or, and }) => { - return or( - and( - eq(savedOcGenerators.isPublic, 1), - session && eq(savedOcGenerators.userId, session.userId) - ), - like(savedOcGenerators.name, `%${query}%`) - ) - }, - }) + const savedOcGeneratorsResponse = + await drizzle.query.savedOcGenerators.findMany({ + where: (savedOcGenerators, { or, and }) => { + return or( + and( + eq(savedOcGenerators.isPublic, 1), + session && eq(savedOcGenerators.userId, session.userId) + ), + like(savedOcGenerators.name, `%${query}%`) + ) + }, + }) - const collectionsResponse = await drizzle.query.userCollections.findMany({ - where: (userCollections, { or, and }) => { - return and( - or( - session && eq(userCollections.userId, session.userId), - eq(userCollections.isPublic, 1) - ), - like(userCollections.name, `%${query}%`) - ) - }, - }) + const collectionsResponse = await drizzle.query.userCollections.findMany({ + where: (userCollections, { or, and }) => { + return and( + or( + session && eq(userCollections.userId, session.userId), + eq(userCollections.isPublic, 1) + ), + like(userCollections.name, `%${query}%`) + ) + }, + }) - response = c.json( - { - success: true, - status: "ok", - query, - isAuthed: session && session.userId ? true : false, - results: { - usersResponse: usersResponse ? usersResponse : [], - assetsResponse: assetsResponse ? assetsResponse : [], - assetCategoryResponse: assetCategoryResponse - ? assetCategoryResponse - : [], - assetTagsResponse: assetTagsResponse ? assetTagsResponse : [], - savedOcGeneratorsResponse: savedOcGeneratorsResponse - ? savedOcGeneratorsResponse - : [], - gamesResponse: gamesResponse ? gamesResponse : [], - collectionsResponse: collectionsResponse - ? collectionsResponse - : [], - }, - }, - 200, - responseHeaders - ) + response = c.json( + { + success: true, + status: "ok", + query, + isAuthed: session && session.userId ? true : false, + results: { + usersResponse: usersResponse ? usersResponse : [], + assetsResponse: assetsResponse ? assetsResponse : [], + assetCategoryResponse: assetCategoryResponse + ? assetCategoryResponse + : [], + assetTagsResponse: assetTagsResponse ? assetTagsResponse : [], + savedOcGeneratorsResponse: savedOcGeneratorsResponse + ? savedOcGeneratorsResponse + : [], + gamesResponse: gamesResponse ? gamesResponse : [], + collectionsResponse: collectionsResponse + ? collectionsResponse + : [], + }, + }, + 200, + responseHeaders + ) - response.headers.set("Cache-Control", "s-maxage=1200") - await cache.put(cacheKey, response.clone()) - return response + response.headers.set("Cache-Control", "s-maxage=1200") + await cache.put(cacheKey, response.clone()) + return response } diff --git a/src/v2/routes/search/asset/recentAssets.ts b/src/v2/routes/search/asset/recentAssets.ts index e3ac63e..091431f 100644 --- a/src/v2/routes/search/asset/recentAssets.ts +++ b/src/v2/routes/search/asset/recentAssets.ts @@ -1,36 +1,36 @@ import { responseHeaders } from "@/v2/lib/responseHeaders" import { getConnection } from "@/v2/db/turso" import { desc } from "drizzle-orm" -import type { APIContext as Context } from "@/worker-configuration" + import { assets } from "@/v2/db/schema" // get 100 most recent assets, sorted by asset.uploadedDate -export async function recentAssets(c: Context): Promise { - const cacheKey = new Request(c.req.url.toString(), c.req) - const cache = caches.default - let response = await cache.match(cacheKey) +export async function recentAssets(c: APIContext): Promise { + const cacheKey = new Request(c.req.url.toString(), c.req) + const cache = caches.default + let response = await cache.match(cacheKey) - if (response) return response + if (response) return response - const drizzle = getConnection(c.env).drizzle + const drizzle = getConnection(c.env).drizzle - const assetResponse = await drizzle.query.assets.findMany({ - orderBy: desc(assets.uploadedDate), - limit: 100, - where: (assets, { eq }) => eq(assets.status, 1), - }) + const assetResponse = await drizzle.query.assets.findMany({ + orderBy: desc(assets.uploadedDate), + limit: 100, + where: (assets, { eq }) => eq(assets.status, 1), + }) - response = c.json( - { - success: true, - status: "ok", - results: assetResponse, - }, - 200, - responseHeaders - ) + response = c.json( + { + success: true, + status: "ok", + results: assetResponse, + }, + 200, + responseHeaders + ) - response.headers.set("Cache-Control", "s-maxage=60") - await cache.put(cacheKey, response.clone()) - return response + response.headers.set("Cache-Control", "s-maxage=60") + await cache.put(cacheKey, response.clone()) + return response } diff --git a/src/v2/routes/search/asset/searchAssets.ts b/src/v2/routes/search/asset/searchAssets.ts index 50c38e3..04fe992 100644 --- a/src/v2/routes/search/asset/searchAssets.ts +++ b/src/v2/routes/search/asset/searchAssets.ts @@ -1,87 +1,87 @@ import { responseHeaders } from "@/v2/lib/responseHeaders" import { getConnection } from "@/v2/db/turso" import { like } from "drizzle-orm" -import type { APIContext as Context } from "@/worker-configuration" + import { assets } from "@/v2/db/schema" import { desc } from "drizzle-orm" import { SplitQueryByCommas } from "@/v2/lib/helpers/splitQueryByCommas" -export async function searchForAssets(c: Context): Promise { - const cacheKey = new Request(c.req.url.toString(), c.req) - const cache = caches.default - let response = await cache.match(cacheKey) - if (response) return response +export async function searchForAssets(c: APIContext): Promise { + const cacheKey = new Request(c.req.url.toString(), c.req) + const cache = caches.default + let response = await cache.match(cacheKey) + if (response) return response - const { query, game, assetCategory, assetTags } = c.req.query() + const { query, game, assetCategory, assetTags } = c.req.query() - // search parameters can include optional search params: query, game, assetCategory, assetTags - // query?: string => ?query=keqing - // game?: comma separated list of game names => ?game=genshin-impact,honkai-impact-3rd - // assetCategory?: comma separated list of asset category names => ?assetCategory=splash-art,character-sheets - // assetTags?: comma separated list of asset tag names => ?assetTags=no-background,fanmade,official + // search parameters can include optional search params: query, game, assetCategory, assetTags + // query?: string => ?query=keqing + // game?: comma separated list of game names => ?game=genshin-impact,honkai-impact-3rd + // assetCategory?: comma separated list of asset category names => ?assetCategory=splash-art,character-sheets + // assetTags?: comma separated list of asset tag names => ?assetTags=no-background,fanmade,official - const drizzle = getConnection(c.env).drizzle + const drizzle = getConnection(c.env).drizzle - // check if certian search parameters are present, if not, set them to null - const searchQuery = query ?? null - const gameList = game ? SplitQueryByCommas(game) : null - const assetCategoryList = assetCategory - ? SplitQueryByCommas(assetCategory) - : null - const assetTagsList = assetTags ? SplitQueryByCommas(assetTags) : null + // check if certian search parameters are present, if not, set them to null + const searchQuery = query ?? null + const gameList = game ? SplitQueryByCommas(game) : null + const assetCategoryList = assetCategory + ? SplitQueryByCommas(assetCategory) + : null + const assetTagsList = assetTags ? SplitQueryByCommas(assetTags) : null - console.log(searchQuery, gameList, assetCategoryList, assetTagsList) + console.log(searchQuery, gameList, assetCategoryList, assetTagsList) - // query the database for assets that match the search parameters - const assetResponse = await drizzle.query.assets.findMany({ - where: (assets, { and, or, eq }) => { - return and( - searchQuery ? like(assets.name, `%${searchQuery}%`) : null, - gameList - ? or(...gameList.map((game) => eq(assets.game, game))) - : null, - assetCategoryList - ? or( - ...assetCategoryList.map((assetCategory) => - eq(assets.assetCategory, assetCategory) - ) - ) - : null, - eq(assets.status, 1) - ) - }, - with: { - assetTagsAssets: { - with: { - assetTags: true, - }, - }, - users: { - columns: { - email: false, - emailVerified: false, - }, - }, - }, - orderBy: desc(assets.id), - limit: 500, - }) + // query the database for assets that match the search parameters + const assetResponse = await drizzle.query.assets.findMany({ + where: (assets, { and, or, eq }) => { + return and( + searchQuery ? like(assets.name, `%${searchQuery}%`) : null, + gameList + ? or(...gameList.map((game) => eq(assets.game, game))) + : null, + assetCategoryList + ? or( + ...assetCategoryList.map((assetCategory) => + eq(assets.assetCategory, assetCategory) + ) + ) + : null, + eq(assets.status, 1) + ) + }, + with: { + assetTagsAssets: { + with: { + assetTags: true, + }, + }, + users: { + columns: { + email: false, + emailVerified: false, + }, + }, + }, + orderBy: desc(assets.id), + limit: 500, + }) - response = c.json( - { - success: true, - status: "ok", - query, - game, - assetCategory, - assetTags, - results: assetResponse ? assetResponse : [], - }, - 200, - responseHeaders - ) + response = c.json( + { + success: true, + status: "ok", + query, + game, + assetCategory, + assetTags, + results: assetResponse ? assetResponse : [], + }, + 200, + responseHeaders + ) - response.headers.set("Cache-Control", "s-maxage=600") - await cache.put(cacheKey, response.clone()) - return response + response.headers.set("Cache-Control", "s-maxage=600") + await cache.put(cacheKey, response.clone()) + return response } diff --git a/src/v2/routes/search/searchRoute.ts b/src/v2/routes/search/searchRoute.ts index f63f488..26d128d 100644 --- a/src/v2/routes/search/searchRoute.ts +++ b/src/v2/routes/search/searchRoute.ts @@ -1,6 +1,5 @@ import { Hono } from "hono" import { searchAll } from "./all/searchAll" -import { Bindings } from "@/worker-configuration" import { getUserByUsername } from "./user/getUserByUsername" import { getUsersBySearch } from "./user/getUsersBySearch" import authRoute from "../auth/authRoute" @@ -11,39 +10,39 @@ import { cors } from "hono/cors" const searchRoute = new Hono<{ Bindings: Bindings }>() searchRoute.get("/all/:query", async (c) => { - return searchAll(c) + return searchAll(c) }) authRoute.use( - "/all/:query", - cors({ - credentials: true, - origin: ["*"], // TODO: update this - temporary - }) + "/all/:query", + cors({ + credentials: true, + origin: ["*"], // TODO: update this - temporary + }) ) authRoute.use( - "/users/user/:username", - cors({ - credentials: true, - origin: ["*"], // TODO: update this - temporary - }) + "/users/user/:username", + cors({ + credentials: true, + origin: ["*"], // TODO: update this - temporary + }) ) searchRoute.get("/assets/query", async (c) => { - return searchForAssets(c) + return searchForAssets(c) }) searchRoute.get("/assets/recent", async (c) => { - return recentAssets(c) + return recentAssets(c) }) searchRoute.get("/users/user/:username", async (c) => { - return getUserByUsername(c) + return getUserByUsername(c) }) searchRoute.get("/users/query/:query", async (c) => { - return getUsersBySearch(c) + return getUsersBySearch(c) }) export default searchRoute diff --git a/src/v2/routes/search/user/getUserByUsername.ts b/src/v2/routes/search/user/getUserByUsername.ts index bf08c43..bed478e 100644 --- a/src/v2/routes/search/user/getUserByUsername.ts +++ b/src/v2/routes/search/user/getUserByUsername.ts @@ -1,59 +1,59 @@ import { responseHeaders } from "@/v2/lib/responseHeaders" import { getConnection } from "@/v2/db/turso" import { createNotFoundResponse } from "@/v2/lib/helpers/responses/notFoundResponse" -import type { APIContext as Context } from "@/worker-configuration" + import { auth } from "@/v2/lib/auth/lucia" import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" -export async function getUserByUsername(c: Context): Promise { - const { username } = c.req.param() - const cacheKey = new Request(c.req.url.toString(), c.req) - const cache = caches.default - let response = await cache.match(cacheKey) - - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle" || session.state === "invalid") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - } - - if (response) return response - const drizzle = getConnection(c.env).drizzle - - const user = await drizzle.query.users.findFirst({ - where: (users, { and, eq }) => and(eq(users.username, username)), - columns: { - email: false, - emailVerified: false, - }, - }) - - if (!user) { - response = createNotFoundResponse(c, "User not found", responseHeaders) - await cache.put(cacheKey, response.clone()) - return response - } - - response = c.json( - { - success: true, - status: "ok", - accountIsAuthed: session && session.userId ? true : false, - userIsQueryingOwnAccount: - session && session.userId === user.id ? true : false, - userRoleFlagsArray: roleFlagsToArray(user.roleFlags), - user, - }, - 200, - responseHeaders - ) - - response.headers.set("Cache-Control", "s-maxage=120") - await cache.put(cacheKey, response.clone()) - - return response +export async function getUserByUsername(c: APIContext): Promise { + const { username } = c.req.param() + const cacheKey = new Request(c.req.url.toString(), c.req) + const cache = caches.default + let response = await cache.match(cacheKey) + + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() + + if (!session || session.state === "idle" || session.state === "invalid") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + } + + if (response) return response + const drizzle = getConnection(c.env).drizzle + + const user = await drizzle.query.users.findFirst({ + where: (users, { and, eq }) => and(eq(users.username, username)), + columns: { + email: false, + emailVerified: false, + }, + }) + + if (!user) { + response = createNotFoundResponse(c, "User not found", responseHeaders) + await cache.put(cacheKey, response.clone()) + return response + } + + response = c.json( + { + success: true, + status: "ok", + accountIsAuthed: session && session.userId ? true : false, + userIsQueryingOwnAccount: + session && session.userId === user.id ? true : false, + userRoleFlagsArray: roleFlagsToArray(user.roleFlags), + user, + }, + 200, + responseHeaders + ) + + response.headers.set("Cache-Control", "s-maxage=120") + await cache.put(cacheKey, response.clone()) + + return response } diff --git a/src/v2/routes/search/user/getUsersBySearch.ts b/src/v2/routes/search/user/getUsersBySearch.ts index 6c3055d..5e58c90 100644 --- a/src/v2/routes/search/user/getUsersBySearch.ts +++ b/src/v2/routes/search/user/getUsersBySearch.ts @@ -1,44 +1,43 @@ import { getConnection } from "@/v2/db/turso" import { like } from "drizzle-orm" -import type { APIContext as Context } from "@/worker-configuration" -export async function getUsersBySearch(c: Context): Promise { - const cacheKey = new Request(c.req.url.toString(), c.req) - const cache = caches.default - let response = await cache.match(cacheKey) - if (response) return response +export async function getUsersBySearch(c: APIContext): Promise { + const cacheKey = new Request(c.req.url.toString(), c.req) + const cache = caches.default + let response = await cache.match(cacheKey) + if (response) return response - const { query } = c.req.param() - const drizzle = getConnection(c.env).drizzle + const { query } = c.req.param() + const drizzle = getConnection(c.env).drizzle - const userList = await drizzle.query.users.findMany({ - where: (users, { or }) => { - return or(like(users.username, `%${query}%`)) - }, - columns: { - email: false, - emailVerified: false, - }, - }) + const userList = await drizzle.query.users.findMany({ + where: (users, { or }) => { + return or(like(users.username, `%${query}%`)) + }, + columns: { + email: false, + emailVerified: false, + }, + }) - if (!userList) { - c.status(200) - return c.json({ - success: false, - status: "user not found", - }) - } + if (!userList) { + c.status(200) + return c.json({ + success: false, + status: "user not found", + }) + } - response = c.json({ - success: true, - status: "ok", - query, - results: userList, - }) + response = c.json({ + success: true, + status: "ok", + query, + results: userList, + }) - c.status(200) - response.headers.set("Cache-Control", "s-maxage=60") - await cache.put(cacheKey, response.clone()) + c.status(200) + response.headers.set("Cache-Control", "s-maxage=60") + await cache.put(cacheKey, response.clone()) - return response + return response } diff --git a/src/v2/routes/tags/allTags.ts b/src/v2/routes/tags/allTags.ts index 3c0a724..d2617e6 100644 --- a/src/v2/routes/tags/allTags.ts +++ b/src/v2/routes/tags/allTags.ts @@ -1,37 +1,36 @@ import { getConnection } from "@/v2/db/turso" -import type { APIContext as Context } from "@/worker-configuration" -export async function listAllAssetTags(c: Context): Promise { - const cacheKey = new Request(c.req.url.toString(), c.req) - const cache = caches.default - let response = await cache.match(cacheKey) +export async function listAllAssetTags(c: APIContext): Promise { + const cacheKey = new Request(c.req.url.toString(), c.req) + const cache = caches.default + let response = await cache.match(cacheKey) - if (response) return response + if (response) return response - const drizzle = getConnection(c.env).drizzle + const drizzle = getConnection(c.env).drizzle - const allAssetTags = await drizzle.query.assetTags.findMany({ - orderBy: (assetTags) => assetTags.name, - with: { - assetTagsAssets: { - with: { - assets: true, - }, - }, - }, - }) + const allAssetTags = await drizzle.query.assetTags.findMany({ + orderBy: (assetTags) => assetTags.name, + with: { + assetTagsAssets: { + with: { + assets: true, + }, + }, + }, + }) - response = c.json( - { - success: true, - status: "ok", - allAssetTags, - }, - 200 - ) + response = c.json( + { + success: true, + status: "ok", + allAssetTags, + }, + 200 + ) - response.headers.set("Cache-Control", "s-maxage=604800") - await cache.put(cacheKey, response.clone()) + response.headers.set("Cache-Control", "s-maxage=604800") + await cache.put(cacheKey, response.clone()) - return response + return response } diff --git a/src/worker-configuration.d.ts b/src/worker-configuration.d.ts index 6479d6d..53f0a03 100644 --- a/src/worker-configuration.d.ts +++ b/src/worker-configuration.d.ts @@ -1,12 +1,26 @@ -import type { Context } from "hono" +declare global { + /** + * The `Bindings` type is used to define the shape of the environment variables that are used by the application. + * It includes properties for the Discord token, R2 bucket, current environment, and necessary Database credentials for Turso. + */ + export type Bindings = { + DISCORD_TOKEN: string + bucket: R2Bucket + ENVIRONMENT: string + VERY_SECRET_SIGNUP_KEY: string + TURSO_DATABASE_URL: string + TURSO_DATABASE_AUTH_TOKEN: string + } -export type Bindings = { - DISCORD_TOKEN: string - bucket: R2Bucket - ENVIRONMENT: string - VERY_SECRET_SIGNUP_KEY: string - TURSO_DATABASE_URL: string - TURSO_DATABASE_AUTH_TOKEN: string + /** + * The `APIContext` type is used to provide access to the request context within routes that are separated into individual functions. + * It is defined as a global type in the `globals.d.ts` file and includes properties for the request object, environment variables, and response methods. + * @template Bindings - The shape of the environment variables that are used by the application. + */ + export type APIContext = import("hono").Context<{ + Bindings: Bindings + }> } -export type APIContext = Context<{ Bindings: Bindings }> +// This allows the types to be defined in the global scope throughout the API. +export {} diff --git a/tsconfig.json b/tsconfig.json index bfffdef..ee2b46a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,15 +1,15 @@ { - "compilerOptions": { - "skipLibCheck": true, - "target": "es2021", - "module": "es2022", - "moduleResolution": "node", - "lib": ["es2021"], - "baseUrl": "./", - "paths": { - "@/*": ["src/*"] - }, - "types": ["@cloudflare/workers-types"] - }, - "include": ["src/**/*.ts"] + "compilerOptions": { + "skipLibCheck": true, + "target": "es2021", + "module": "es2022", + "moduleResolution": "node", + "lib": ["es2021"], + "baseUrl": "./", + "paths": { + "@/*": ["src/*"] + }, + "types": ["@cloudflare/workers-types"] + }, + "include": ["src/**/*.ts"] } From 68cd2199552f6bee93dd0240d0b4ff9ce13b68a0 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 24 Sep 2023 20:59:59 +0100 Subject: [PATCH 090/318] chore: deps --- package.json | 20 +- pnpm-lock.yaml | 487 +++++++++++++++++++++------------- src/v2/lib/auth/lucia.ts | 34 +-- src/worker-configuration.d.ts | 6 +- 4 files changed, 327 insertions(+), 220 deletions(-) diff --git a/package.json b/package.json index 3c446db..e797251 100644 --- a/package.json +++ b/package.json @@ -12,28 +12,30 @@ "drizzle:push": "drizzle-kit push:sqlite" }, "devDependencies": { - "@cloudflare/workers-types": "^4.20230904.0", - "@types/node": "^20.6.0", + "@cloudflare/workers-types": "^4.20230914.0", + "@types/node": "^20.6.5", "dotenv": "^16.3.1", "drizzle-kit": "^0.19.13", - "eslint": "^8.49.0", + "eslint": "^8.50.0", "eslint-config-google": "^0.14.0", "eslint-plugin-json": "^3.1.0", "husky": "^8.0.3", - "tsx": "^3.12.10", + "tsx": "^3.13.0", "typescript": "^5.2.2", - "wrangler": "3.8.0" + "wrangler": "3.9.0" }, "private": true, "dependencies": { + "@hono/zod-openapi": "^0.6.0", "@libsql/client": "0.3.4", "@lucia-auth/adapter-sqlite": "^2.0.0", - "@typescript-eslint/eslint-plugin": "^6.7.0", + "@typescript-eslint/eslint-plugin": "^6.7.2", "drizzle-orm": "^0.28.6", - "hono": "^3.6.0", - "lucia": "^2.6.0", + "hono": "^3.7.2", + "lucia": "^2.7.0", "mysql2": "^3.6.1", "prettier": "^3.0.3", - "resend": "^1.0.0" + "resend": "^1.1.0", + "zod": "^3.22.2" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bc57a84..4940935 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,28 +1,31 @@ -lockfileVersion: "6.0" +lockfileVersion: "6.1" settings: autoInstallPeers: true excludeLinksFromLockfile: false dependencies: + "@hono/zod-openapi": + specifier: ^0.6.0 + version: 0.6.0(hono@3.7.2)(zod@3.22.2) "@libsql/client": specifier: 0.3.4 version: 0.3.4 "@lucia-auth/adapter-sqlite": specifier: ^2.0.0 - version: 2.0.0(@libsql/client@0.3.4)(lucia@2.6.0) + version: 2.0.0(@libsql/client@0.3.4)(lucia@2.7.0) "@typescript-eslint/eslint-plugin": - specifier: ^6.7.0 - version: 6.7.0(@typescript-eslint/parser@6.7.0)(eslint@8.49.0)(typescript@5.2.2) + specifier: ^6.7.2 + version: 6.7.2(@typescript-eslint/parser@6.7.2)(eslint@8.50.0)(typescript@5.2.2) drizzle-orm: specifier: ^0.28.6 - version: 0.28.6(@cloudflare/workers-types@4.20230904.0)(@libsql/client@0.3.4)(mysql2@3.6.1) + version: 0.28.6(@cloudflare/workers-types@4.20230914.0)(@libsql/client@0.3.4)(mysql2@3.6.1) hono: - specifier: ^3.6.0 - version: 3.6.0 + specifier: ^3.7.2 + version: 3.7.2 lucia: - specifier: ^2.6.0 - version: 2.6.0 + specifier: ^2.7.0 + version: 2.7.0 mysql2: specifier: ^3.6.1 version: 3.6.1 @@ -30,16 +33,19 @@ dependencies: specifier: ^3.0.3 version: 3.0.3 resend: - specifier: ^1.0.0 - version: 1.0.0 + specifier: ^1.1.0 + version: 1.1.0 + zod: + specifier: ^3.22.2 + version: 3.22.2 devDependencies: "@cloudflare/workers-types": - specifier: ^4.20230904.0 - version: 4.20230904.0 + specifier: ^4.20230914.0 + version: 4.20230914.0 "@types/node": - specifier: ^20.6.0 - version: 20.6.0 + specifier: ^20.6.5 + version: 20.6.5 dotenv: specifier: ^16.3.1 version: 16.3.1 @@ -47,11 +53,11 @@ devDependencies: specifier: ^0.19.13 version: 0.19.13 eslint: - specifier: ^8.49.0 - version: 8.49.0 + specifier: ^8.50.0 + version: 8.50.0 eslint-config-google: specifier: ^0.14.0 - version: 0.14.0(eslint@8.49.0) + version: 0.14.0(eslint@8.50.0) eslint-plugin-json: specifier: ^3.1.0 version: 3.1.0 @@ -59,14 +65,14 @@ devDependencies: specifier: ^8.0.3 version: 8.0.3 tsx: - specifier: ^3.12.10 - version: 3.12.10 + specifier: ^3.13.0 + version: 3.13.0 typescript: specifier: ^5.2.2 version: 5.2.2 wrangler: - specifier: 3.8.0 - version: 3.8.0 + specifier: 3.9.0 + version: 3.9.0 packages: /@aashutoshrathi/word-wrap@1.2.6: @@ -76,6 +82,18 @@ packages: } engines: { node: ">=0.10.0" } + /@asteasolutions/zod-to-openapi@5.5.0(zod@3.22.2): + resolution: + { + integrity: sha512-d5HwrvM6dOKr3XdeF+DmashGvfEc+1oiEfbscugsiwSTrFtuMa7ETpW9sTNnVgn+hJaz+PRxPQUYD7q9/5dUig==, + } + peerDependencies: + zod: ^3.20.2 + dependencies: + openapi3-ts: 4.1.2 + zod: 3.22.2 + dev: false + /@cloudflare/kv-asset-handler@0.2.0: resolution: { @@ -145,10 +163,10 @@ packages: dev: true optional: true - /@cloudflare/workers-types@4.20230904.0: + /@cloudflare/workers-types@4.20230914.0: resolution: { - integrity: sha512-IX4oJCe14ctblSPZBlW64BVZ9nYLUo6sD2I5gu3hX0ywByYWm1OuoKm9Xb/Zpbj8Ph18Z7Ryii6u2/ocnncXdA==, + integrity: sha512-OVeN4lFVu1O0PJGZ2d0FwpK8lelFcr33qYOgCh77ErEYmEBO4adwnIxcIsdQbFbhF0ffN6joiVcljD4zakdaeQ==, } /@drizzle-team/studio@0.0.5: @@ -158,34 +176,24 @@ packages: } dev: true - /@esbuild-kit/cjs-loader@2.4.4: - resolution: - { - integrity: sha512-NfsJX4PdzhwSkfJukczyUiZGc7zNNWZcEAyqeISpDnn0PTfzMJR1aR8xAIPskBejIxBJbIgCCMzbaYa9SXepIg==, - } - dependencies: - "@esbuild-kit/core-utils": 3.3.1 - get-tsconfig: 4.7.0 - dev: true - - /@esbuild-kit/core-utils@3.3.1: + /@esbuild-kit/core-utils@3.3.2: resolution: { - integrity: sha512-zg2aeGLgbZ/U8AnHRD6y085BkRqlw7jOsqpI/AFaQg6FhcCRycAe+aFLibs9okVVYTMqWANDC76UVSzd3qBoOw==, + integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==, } dependencies: esbuild: 0.18.20 source-map-support: 0.5.21 dev: true - /@esbuild-kit/esm-loader@2.6.4: + /@esbuild-kit/esm-loader@2.6.5: resolution: { - integrity: sha512-xcbyhN97xFFFEdDw6IC4EuzX9Ali3aV3cj2FIYragOQpbPM4X6QA2R5qaP3h7Tr0tuyI6dmJJdMw7oBHxBSXQA==, + integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==, } dependencies: - "@esbuild-kit/core-utils": 3.3.1 - get-tsconfig: 4.7.0 + "@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): @@ -740,7 +748,7 @@ packages: dev: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.49.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.50.0): resolution: { integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, @@ -749,7 +757,7 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.49.0 + eslint: 8.50.0 eslint-visitor-keys: 3.4.3 /@eslint-community/regexpp@4.8.1: @@ -769,7 +777,7 @@ packages: ajv: 6.12.6 debug: 4.3.4 espree: 9.6.1 - globals: 13.21.0 + globals: 13.22.0 ignore: 5.2.4 import-fresh: 3.3.0 js-yaml: 4.1.0 @@ -778,13 +786,42 @@ packages: transitivePeerDependencies: - supports-color - /@eslint/js@8.49.0: + /@eslint/js@8.50.0: resolution: { - integrity: sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==, + integrity: sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + /@hono/zod-openapi@0.6.0(hono@3.7.2)(zod@3.22.2): + resolution: + { + integrity: sha512-BZOLEIpHl0xbUaWs1v3gwJwrlT7gRvwSQeqGeRxVkI5HU958+B7bpBd3qYhwy5Qeb0EUTBVY/dQOsw6wapuF+g==, + } + engines: { node: ">=16.0.0" } + peerDependencies: + hono: "*" + zod: 3.* + dependencies: + "@asteasolutions/zod-to-openapi": 5.5.0(zod@3.22.2) + "@hono/zod-validator": 0.1.8(hono@3.7.2)(zod@3.22.2) + hono: 3.7.2 + zod: 3.22.2 + dev: false + + /@hono/zod-validator@0.1.8(hono@3.7.2)(zod@3.22.2): + resolution: + { + integrity: sha512-/Kd/p/dUVKM7/1TY3jafTV+ngwEh3fOLmXCJQKb9esWsCom5WOJaNmZYv8jeRhyipu1xBvmN5jceRA3Ev3rmQw==, + } + peerDependencies: + hono: 3.* + zod: ^3.19.1 + dependencies: + hono: 3.7.2 + zod: 3.22.2 + dev: false + /@humanwhocodes/config-array@0.11.11: resolution: { @@ -817,7 +854,7 @@ packages: integrity: sha512-b1rpCzm02oQuh1zM1UKdKxhClyMMlgyFagcmsuGTve/AQxubO/FaRgoKXTcGaOqoRjymE1qf0sQM2UoyPvu3lA==, } dependencies: - "@libsql/hrana-client": 0.5.2 + "@libsql/hrana-client": 0.5.5 better-sqlite3: 8.6.0 js-base64: 3.7.5 transitivePeerDependencies: @@ -826,28 +863,29 @@ packages: - utf-8-validate dev: false - /@libsql/hrana-client@0.5.2: + /@libsql/hrana-client@0.5.5: resolution: { - integrity: sha512-0hVKUClh29Pb0bIIwqssfDH1nrsKO5SaBTfclIZ1d0W/rBBDsV6mBKx3FhQuULYu/5u0/gJcHdmdiA1SFIOXdQ==, + integrity: sha512-i+hDBpiV719poqEiHupUUZYKJ9YSbCRFe5Q2PQ0v3mHIftePH6gayLjp2u6TXbqbO/Dv6y8yyvYlBXf/kFfRZA==, } dependencies: - "@libsql/isomorphic-fetch": 0.1.7 + "@libsql/isomorphic-fetch": 0.1.10 "@libsql/isomorphic-ws": 0.1.5 js-base64: 3.7.5 + node-fetch: 3.3.2 transitivePeerDependencies: - bufferutil - encoding - utf-8-validate dev: false - /@libsql/isomorphic-fetch@0.1.7: + /@libsql/isomorphic-fetch@0.1.10: resolution: { - integrity: sha512-/lSsPe0WTHn2SDTPbgbjUY2iF0C3Adtcwu7cajTe+3YtcxsV36u7L37/hmJIQQG8vuM/TCUu4TWb+ym/299aOg==, + integrity: sha512-dH0lMk50gKSvEKD78xWMu60SY1sjp1sY//iFLO0XMmBwfVfG136P9KOk06R4maBdlb8KMXOzJ1D28FR5ZKnHTA==, } dependencies: - "@types/node-fetch": 2.6.5 + "@types/node-fetch": 2.6.6 node-fetch: 2.7.0 transitivePeerDependencies: - encoding @@ -860,13 +898,13 @@ packages: } dependencies: "@types/ws": 8.5.5 - ws: 8.14.1 + ws: 8.14.2 transitivePeerDependencies: - bufferutil - utf-8-validate dev: false - /@lucia-auth/adapter-sqlite@2.0.0(@libsql/client@0.3.4)(lucia@2.6.0): + /@lucia-auth/adapter-sqlite@2.0.0(@libsql/client@0.3.4)(lucia@2.7.0): resolution: { integrity: sha512-Hiy8WND/1mi25r0M2ruSml+Ab5GJLr4XZEHApYw1lxybF+VlPUyX7oTtIVCSgvq/SWiP/tvnyPwnXAPmNr8/bg==, @@ -882,7 +920,7 @@ packages: optional: true dependencies: "@libsql/client": 0.3.4 - lucia: 2.6.0 + lucia: 2.7.0 dev: false /@nodelib/fs.scandir@2.1.5: @@ -942,27 +980,27 @@ packages: selderee: 0.10.0 dev: false - /@types/json-schema@7.0.12: + /@types/json-schema@7.0.13: resolution: { - integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==, + integrity: sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==, } dev: false - /@types/node-fetch@2.6.5: + /@types/node-fetch@2.6.6: resolution: { - integrity: sha512-OZsUlr2nxvkqUFLSaY2ZbA+P1q22q+KrlxWOn/38RX+u5kTkYL2mTujEpzUhGkS+K/QCYp9oagfXG39XOzyySg==, + integrity: sha512-95X8guJYhfqiuVVhRFxVQcf4hW/2bCuoPwDasMf/531STFoNoWTT7YDnWdXHEZKqAGUigmpG31r2FE70LwnzJw==, } dependencies: - "@types/node": 20.6.0 + "@types/node": 20.6.5 form-data: 4.0.0 dev: false - /@types/node@20.6.0: + /@types/node@20.6.5: resolution: { - integrity: sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==, + integrity: sha512-2qGq5LAOTh9izcc0+F+dToFigBWiK1phKPt7rNhOqJSr35y8rlIBjDwGtFSgAI6MGIhjwOVNSQZVdJsZJ2uR1w==, } /@types/semver@7.5.2: @@ -978,13 +1016,13 @@ packages: integrity: sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==, } dependencies: - "@types/node": 20.6.0 + "@types/node": 20.6.5 dev: false - /@typescript-eslint/eslint-plugin@6.7.0(@typescript-eslint/parser@6.7.0)(eslint@8.49.0)(typescript@5.2.2): + /@typescript-eslint/eslint-plugin@6.7.2(@typescript-eslint/parser@6.7.2)(eslint@8.50.0)(typescript@5.2.2): resolution: { - integrity: sha512-gUqtknHm0TDs1LhY12K2NA3Rmlmp88jK9Tx8vGZMfHeNMLE3GH2e9TRub+y+SOjuYgtOmok+wt1AyDPZqxbNag==, + integrity: sha512-ooaHxlmSgZTM6CHYAFRlifqh1OAr3PAQEwi7lhYhaegbnXrnh7CDcHmc3+ihhbQC7H0i4JF0psI5ehzkF6Yl6Q==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -996,13 +1034,13 @@ packages: optional: true dependencies: "@eslint-community/regexpp": 4.8.1 - "@typescript-eslint/parser": 6.7.0(eslint@8.49.0)(typescript@5.2.2) - "@typescript-eslint/scope-manager": 6.7.0 - "@typescript-eslint/type-utils": 6.7.0(eslint@8.49.0)(typescript@5.2.2) - "@typescript-eslint/utils": 6.7.0(eslint@8.49.0)(typescript@5.2.2) - "@typescript-eslint/visitor-keys": 6.7.0 + "@typescript-eslint/parser": 6.7.2(eslint@8.50.0)(typescript@5.2.2) + "@typescript-eslint/scope-manager": 6.7.2 + "@typescript-eslint/type-utils": 6.7.2(eslint@8.50.0)(typescript@5.2.2) + "@typescript-eslint/utils": 6.7.2(eslint@8.50.0)(typescript@5.2.2) + "@typescript-eslint/visitor-keys": 6.7.2 debug: 4.3.4 - eslint: 8.49.0 + eslint: 8.50.0 graphemer: 1.4.0 ignore: 5.2.4 natural-compare: 1.4.0 @@ -1013,10 +1051,10 @@ packages: - supports-color dev: false - /@typescript-eslint/parser@6.7.0(eslint@8.49.0)(typescript@5.2.2): + /@typescript-eslint/parser@6.7.2(eslint@8.50.0)(typescript@5.2.2): resolution: { - integrity: sha512-jZKYwqNpNm5kzPVP5z1JXAuxjtl2uG+5NpaMocFPTNC2EdYIgbXIPImObOkhbONxtFTTdoZstLZefbaK+wXZng==, + integrity: sha512-KA3E4ox0ws+SPyxQf9iSI25R6b4Ne78ORhNHeVKrPQnoYsb9UhieoiRoJgrzgEeKGOXhcY1i8YtOeCHHTDa6Fw==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -1026,32 +1064,32 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/scope-manager": 6.7.0 - "@typescript-eslint/types": 6.7.0 - "@typescript-eslint/typescript-estree": 6.7.0(typescript@5.2.2) - "@typescript-eslint/visitor-keys": 6.7.0 + "@typescript-eslint/scope-manager": 6.7.2 + "@typescript-eslint/types": 6.7.2 + "@typescript-eslint/typescript-estree": 6.7.2(typescript@5.2.2) + "@typescript-eslint/visitor-keys": 6.7.2 debug: 4.3.4 - eslint: 8.49.0 + eslint: 8.50.0 typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/scope-manager@6.7.0: + /@typescript-eslint/scope-manager@6.7.2: resolution: { - integrity: sha512-lAT1Uau20lQyjoLUQ5FUMSX/dS07qux9rYd5FGzKz/Kf8W8ccuvMyldb8hadHdK/qOI7aikvQWqulnEq2nCEYA==, + integrity: sha512-bgi6plgyZjEqapr7u2mhxGR6E8WCzKNUFWNh6fkpVe9+yzRZeYtDTbsIBzKbcxI+r1qVWt6VIoMSNZ4r2A+6Yw==, } engines: { node: ^16.0.0 || >=18.0.0 } dependencies: - "@typescript-eslint/types": 6.7.0 - "@typescript-eslint/visitor-keys": 6.7.0 + "@typescript-eslint/types": 6.7.2 + "@typescript-eslint/visitor-keys": 6.7.2 dev: false - /@typescript-eslint/type-utils@6.7.0(eslint@8.49.0)(typescript@5.2.2): + /@typescript-eslint/type-utils@6.7.2(eslint@8.50.0)(typescript@5.2.2): resolution: { - integrity: sha512-f/QabJgDAlpSz3qduCyQT0Fw7hHpmhOzY/Rv6zO3yO+HVIdPfIWhrQoAyG+uZVtWAIS85zAyzgAFfyEr+MgBpg==, + integrity: sha512-36F4fOYIROYRl0qj95dYKx6kybddLtsbmPIYNK0OBeXv2j9L5nZ17j9jmfy+bIDHKQgn2EZX+cofsqi8NPATBQ==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -1061,28 +1099,28 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/typescript-estree": 6.7.0(typescript@5.2.2) - "@typescript-eslint/utils": 6.7.0(eslint@8.49.0)(typescript@5.2.2) + "@typescript-eslint/typescript-estree": 6.7.2(typescript@5.2.2) + "@typescript-eslint/utils": 6.7.2(eslint@8.50.0)(typescript@5.2.2) debug: 4.3.4 - eslint: 8.49.0 + eslint: 8.50.0 ts-api-utils: 1.0.3(typescript@5.2.2) typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/types@6.7.0: + /@typescript-eslint/types@6.7.2: resolution: { - integrity: sha512-ihPfvOp7pOcN/ysoj0RpBPOx3HQTJTrIN8UZK+WFd3/iDeFHHqeyYxa4hQk4rMhsz9H9mXpR61IzwlBVGXtl9Q==, + integrity: sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg==, } engines: { node: ^16.0.0 || >=18.0.0 } dev: false - /@typescript-eslint/typescript-estree@6.7.0(typescript@5.2.2): + /@typescript-eslint/typescript-estree@6.7.2(typescript@5.2.2): resolution: { - integrity: sha512-dPvkXj3n6e9yd/0LfojNU8VMUGHWiLuBZvbM6V6QYD+2qxqInE7J+J/ieY2iGwR9ivf/R/haWGkIj04WVUeiSQ==, + integrity: sha512-kiJKVMLkoSciGyFU0TOY0fRxnp9qq1AzVOHNeN1+B9erKFCJ4Z8WdjAkKQPP+b1pWStGFqezMLltxO+308dJTQ==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -1091,8 +1129,8 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/types": 6.7.0 - "@typescript-eslint/visitor-keys": 6.7.0 + "@typescript-eslint/types": 6.7.2 + "@typescript-eslint/visitor-keys": 6.7.2 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -1103,36 +1141,36 @@ packages: - supports-color dev: false - /@typescript-eslint/utils@6.7.0(eslint@8.49.0)(typescript@5.2.2): + /@typescript-eslint/utils@6.7.2(eslint@8.50.0)(typescript@5.2.2): resolution: { - integrity: sha512-MfCq3cM0vh2slSikQYqK2Gq52gvOhe57vD2RM3V4gQRZYX4rDPnKLu5p6cm89+LJiGlwEXU8hkYxhqqEC/V3qA==, + integrity: sha512-ZCcBJug/TS6fXRTsoTkgnsvyWSiXwMNiPzBUani7hDidBdj1779qwM1FIAmpH4lvlOZNF3EScsxxuGifjpLSWQ==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.49.0) - "@types/json-schema": 7.0.12 + "@eslint-community/eslint-utils": 4.4.0(eslint@8.50.0) + "@types/json-schema": 7.0.13 "@types/semver": 7.5.2 - "@typescript-eslint/scope-manager": 6.7.0 - "@typescript-eslint/types": 6.7.0 - "@typescript-eslint/typescript-estree": 6.7.0(typescript@5.2.2) - eslint: 8.49.0 + "@typescript-eslint/scope-manager": 6.7.2 + "@typescript-eslint/types": 6.7.2 + "@typescript-eslint/typescript-estree": 6.7.2(typescript@5.2.2) + eslint: 8.50.0 semver: 7.5.4 transitivePeerDependencies: - supports-color - typescript dev: false - /@typescript-eslint/visitor-keys@6.7.0: + /@typescript-eslint/visitor-keys@6.7.2: resolution: { - integrity: sha512-/C1RVgKFDmGMcVGeD8HjKv2bd72oI1KxQDeY8uc66gw9R0OK0eMq48cA+jv9/2Ag6cdrsUGySm1yzYmfz0hxwQ==, + integrity: sha512-uVw9VIMFBUTz8rIeaUT3fFe8xIUx8r4ywAdlQv1ifH+6acn/XF8Y6rwJ7XNmkNMDrTW+7+vxFFPIF40nJCVsMQ==, } engines: { node: ^16.0.0 || >=18.0.0 } dependencies: - "@typescript-eslint/types": 6.7.0 + "@typescript-eslint/types": 6.7.2 eslint-visitor-keys: 3.4.3 dev: false @@ -1248,6 +1286,7 @@ packages: { integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, } + dev: false /better-sqlite3@8.6.0: resolution: @@ -1258,6 +1297,7 @@ packages: dependencies: bindings: 1.5.0 prebuild-install: 7.1.1 + dev: false /binary-extensions@2.2.0: resolution: @@ -1274,6 +1314,7 @@ packages: } dependencies: file-uri-to-path: 1.0.0 + dev: false /bl@4.1.0: resolution: @@ -1284,6 +1325,7 @@ packages: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 + dev: false /blake3-wasm@2.1.5: resolution: @@ -1333,6 +1375,7 @@ packages: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 + dev: false /busboy@1.6.0: resolution: @@ -1412,6 +1455,7 @@ packages: { integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==, } + dev: false /cli-color@2.0.3: resolution: @@ -1532,6 +1576,14 @@ packages: } dev: true + /data-uri-to-buffer@4.0.1: + resolution: + { + integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==, + } + engines: { node: ">= 12" } + dev: false + /debug@4.3.4: resolution: { @@ -1554,6 +1606,7 @@ packages: engines: { node: ">=10" } dependencies: mimic-response: 3.1.0 + dev: false /deep-extend@0.6.0: resolution: @@ -1561,6 +1614,7 @@ packages: integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==, } engines: { node: ">=4.0.0" } + dev: false /deep-is@0.1.4: resolution: @@ -1598,6 +1652,7 @@ packages: integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==, } engines: { node: ">=8" } + dev: false /difflib@0.2.4: resolution: @@ -1692,7 +1747,7 @@ packages: hasBin: true dependencies: "@drizzle-team/studio": 0.0.5 - "@esbuild-kit/esm-loader": 2.6.4 + "@esbuild-kit/esm-loader": 2.6.5 camelcase: 7.0.1 chalk: 5.3.0 commander: 9.5.0 @@ -1707,7 +1762,7 @@ packages: - supports-color dev: true - /drizzle-orm@0.28.6(@cloudflare/workers-types@4.20230904.0)(@libsql/client@0.3.4)(mysql2@3.6.1): + /drizzle-orm@0.28.6(@cloudflare/workers-types@4.20230914.0)(@libsql/client@0.3.4)(mysql2@3.6.1): resolution: { integrity: sha512-yBe+F9htrlYER7uXgDJUQsTHFoIrI5yMm5A0bg0GiZ/kY5jNXTWoEy4KQtg35cE27sw1VbgzoMWHAgCckUUUww==, @@ -1772,7 +1827,7 @@ packages: sqlite3: optional: true dependencies: - "@cloudflare/workers-types": 4.20230904.0 + "@cloudflare/workers-types": 4.20230914.0 "@libsql/client": 0.3.4 mysql2: 3.6.1 dev: false @@ -1798,6 +1853,7 @@ packages: } dependencies: once: 1.4.0 + dev: false /entities@4.5.0: resolution: @@ -1940,7 +1996,7 @@ packages: } engines: { node: ">=10" } - /eslint-config-google@0.14.0(eslint@8.49.0): + /eslint-config-google@0.14.0(eslint@8.50.0): resolution: { integrity: sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==, @@ -1949,7 +2005,7 @@ packages: peerDependencies: eslint: ">=5.16.0" dependencies: - eslint: 8.49.0 + eslint: 8.50.0 dev: true /eslint-plugin-json@3.1.0: @@ -1980,18 +2036,18 @@ packages: } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - /eslint@8.49.0: + /eslint@8.50.0: resolution: { - integrity: sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==, + integrity: sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } hasBin: true dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.49.0) + "@eslint-community/eslint-utils": 4.4.0(eslint@8.50.0) "@eslint-community/regexpp": 4.8.1 "@eslint/eslintrc": 2.1.2 - "@eslint/js": 8.49.0 + "@eslint/js": 8.50.0 "@humanwhocodes/config-array": 0.11.11 "@humanwhocodes/module-importer": 1.0.1 "@nodelib/fs.walk": 1.2.8 @@ -2010,7 +2066,7 @@ packages: file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.21.0 + globals: 13.22.0 graphemer: 1.4.0 ignore: 5.2.4 imurmurhash: 0.1.4 @@ -2102,6 +2158,7 @@ packages: integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==, } engines: { node: ">=6" } + dev: false /ext@1.7.0: resolution: @@ -2162,6 +2219,17 @@ packages: dependencies: reusify: 1.0.4 + /fetch-blob@3.2.0: + resolution: + { + integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==, + } + engines: { node: ^12.20 || >= 14.13 } + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.2.1 + dev: false + /file-entry-cache@6.0.1: resolution: { @@ -2176,6 +2244,7 @@ packages: { integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==, } + dev: false /fill-range@7.0.1: resolution: @@ -2203,14 +2272,14 @@ packages: } engines: { node: ">=12.0.0" } dependencies: - flatted: 3.2.7 + flatted: 3.2.9 keyv: 4.5.3 rimraf: 3.0.2 - /flatted@3.2.7: + /flatted@3.2.9: resolution: { - integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==, + integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==, } /form-data@4.0.0: @@ -2225,11 +2294,22 @@ packages: mime-types: 2.1.35 dev: false + /formdata-polyfill@4.0.10: + resolution: + { + integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==, + } + engines: { node: ">=12.20.0" } + dependencies: + fetch-blob: 3.2.0 + dev: false + /fs-constants@1.0.0: resolution: { integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==, } + dev: false /fs.realpath@1.0.0: resolution: @@ -2267,10 +2347,10 @@ packages: source-map: 0.6.1 dev: true - /get-tsconfig@4.7.0: + /get-tsconfig@4.7.2: resolution: { - integrity: sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw==, + integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==, } dependencies: resolve-pkg-maps: 1.0.0 @@ -2281,6 +2361,7 @@ packages: { integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==, } + dev: false /glob-parent@5.1.2: resolution: @@ -2333,10 +2414,10 @@ packages: minimatch: 5.1.6 once: 1.4.0 - /globals@13.21.0: + /globals@13.22.0: resolution: { - integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==, + integrity: sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==, } engines: { node: ">=8" } dependencies: @@ -2387,10 +2468,10 @@ packages: } dev: true - /hono@3.6.0: + /hono@3.7.2: resolution: { - integrity: sha512-snkW8naO1WCrQvpAGE/du30Ek0h71gSM3g4RzzdPIB2LQnl12BEwZYH3s2Kssd6kXGORqHmpoyMBMLWtc9nzKQ==, + integrity: sha512-5SWYrAQJlfjHggcDTnmKZd5zlUEXmoUiBjnmL6C1W8MX39/bUw6ZIvfEJZgpo7d7Z/vCJ5FRfkjIQPRH5yV/dQ==, } engines: { node: ">=16.0.0" } dev: false @@ -2421,13 +2502,6 @@ packages: entities: 4.5.0 dev: false - /http-cache-semantics@4.1.1: - resolution: - { - integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==, - } - dev: true - /husky@8.0.3: resolution: { @@ -2452,6 +2526,7 @@ packages: { integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, } + dev: false /ignore@5.2.4: resolution: @@ -2497,6 +2572,7 @@ packages: { integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, } + dev: false /is-binary-path@2.1.0: resolution: @@ -2673,14 +2749,6 @@ packages: is-buffer: 1.1.6 dev: false - /kleur@4.1.5: - resolution: - { - integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==, - } - engines: { node: ">=6" } - dev: true - /leac@0.6.0: resolution: { @@ -2752,6 +2820,7 @@ packages: engines: { node: ">=10" } dependencies: yallist: 4.0.0 + dev: false /lru-cache@7.18.3: resolution: @@ -2778,10 +2847,10 @@ packages: es5-ext: 0.10.62 dev: true - /lucia@2.6.0: + /lucia@2.7.0: resolution: { - integrity: sha512-9GfRmEkhJ68EMAEOI6EKwnkHmQpEXeqRuP9ew+UhuZEmTCHrsTqwJ9f6pffEg7Im3BRBPlBlWzH5pxtjI+9OXQ==, + integrity: sha512-VwWyG3U3mKUXx7qa5SXAQctBukkLpIW5L/vEVqP2R3mDBQTZIBIAZP/neZl5U6mot7Y9bRQ/2pVKO8djEH1O8A==, } dev: false @@ -2862,28 +2931,26 @@ packages: integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==, } engines: { node: ">=10" } + dev: false - /miniflare@3.20230904.0: + /miniflare@3.20230918.0: resolution: { - integrity: sha512-+OWQqEk8hV7vZaPCoj5dk1lZr4YUy56OiyNZ45/3ITYf+ZxgQOBPWhQhpw1jCahkRKGPa9Aykz01sc+GhPZYDA==, + integrity: sha512-Dd29HB7ZlT1CXB2tPH8nW6fBOOXi/m7qFZHjKm2jGS+1OaGfrv0PkT5UspWW5jQi8rWI87xtordAUiIJkwWqRw==, } engines: { node: ">=16.13" } dependencies: acorn: 8.10.0 acorn-walk: 8.2.0 - better-sqlite3: 8.6.0 capnp-ts: 0.7.0 exit-hook: 2.2.1 glob-to-regexp: 0.4.1 - http-cache-semantics: 4.1.1 - kleur: 4.1.5 source-map-support: 0.5.21 stoppable: 1.1.0 - undici: 5.24.0 + undici: 5.25.2 workerd: 1.20230904.0 - ws: 8.14.1 - youch: 3.3.1 + ws: 8.14.2 + youch: 3.3.2 zod: 3.22.2 transitivePeerDependencies: - bufferutil @@ -2933,12 +3000,14 @@ packages: { integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, } + dev: false /mkdirp-classic@0.5.3: resolution: { integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==, } + dev: false /ms@2.1.2: resolution: @@ -2995,6 +3064,7 @@ packages: { integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==, } + dev: false /natural-compare@1.4.0: resolution: @@ -3017,20 +3087,14 @@ packages: engines: { node: ">=10" } dependencies: semver: 7.5.4 + dev: false - /node-fetch@2.6.12: + /node-domexception@1.0.0: resolution: { - integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==, + integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==, } - engines: { node: 4.x || >=6.0.0 } - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - dependencies: - whatwg-url: 5.0.0 + engines: { node: ">=10.5.0" } dev: false /node-fetch@2.7.0: @@ -3048,6 +3112,18 @@ packages: whatwg-url: 5.0.0 dev: false + /node-fetch@3.3.2: + resolution: + { + integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + dev: false + /node-forge@1.3.1: resolution: { @@ -3083,6 +3159,15 @@ packages: dependencies: wrappy: 1.0.2 + /openapi3-ts@4.1.2: + resolution: + { + integrity: sha512-B7gOkwsYMZO7BZXwJzXCuVagym2xhqsrilVvV0dnq2Di4+iLUXKVX9gOK23ZqaAHZOwABXN0QTdW8QnkUTX6DA==, + } + dependencies: + yaml: 2.3.2 + dev: false + /optionator@0.9.3: resolution: { @@ -3204,6 +3289,7 @@ packages: simple-get: 4.0.1 tar-fs: 2.1.1 tunnel-agent: 0.6.0 + dev: false /prelude-ls@1.2.1: resolution: @@ -3255,6 +3341,7 @@ packages: dependencies: end-of-stream: 1.4.4 once: 1.4.0 + dev: false /punycode@2.3.0: resolution: @@ -3280,6 +3367,7 @@ packages: ini: 1.3.8 minimist: 1.2.8 strip-json-comments: 2.0.1 + dev: false /react-dom@18.2.0(react@18.2.0): resolution: @@ -3314,6 +3402,7 @@ packages: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 + dev: false /readdirp@3.6.0: resolution: @@ -3325,18 +3414,15 @@ packages: picomatch: 2.3.1 dev: true - /resend@1.0.0: + /resend@1.1.0: resolution: { - integrity: sha512-8LEE4gncmcm8bsvxvahZFpFk5hxUrKdagqWoX/MRXVU2YZ9coYxqZDeDYXG9pexz1A694bjE1hiQbBAA+bHAow==, + integrity: sha512-it8TIDVT+/gAiJsUlv2tdHuvzwCCv4Zwu+udDqIm/dIuByQwe68TtFDcPccxqpSVVrNCBxxXLzsdT1tsV+P3GA==, } - engines: { node: ">=16" } + engines: { node: ">=18" } dependencies: "@react-email/render": 0.0.7 - node-fetch: 2.6.12 type-fest: 3.13.0 - transitivePeerDependencies: - - encoding dev: false /resolve-from@4.0.0: @@ -3412,6 +3498,7 @@ packages: { integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, } + dev: false /safer-buffer@2.1.2: resolution: @@ -3457,6 +3544,7 @@ packages: hasBin: true dependencies: lru-cache: 6.0.0 + dev: false /seq-queue@0.0.5: resolution: @@ -3486,6 +3574,7 @@ packages: { integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==, } + dev: false /simple-get@4.0.1: resolution: @@ -3496,6 +3585,7 @@ packages: decompress-response: 6.0.0 once: 1.4.0 simple-concat: 1.0.1 + dev: false /sisteransi@1.0.5: resolution: @@ -3530,14 +3620,6 @@ packages: engines: { node: ">=0.10.0" } dev: true - /source-map@0.7.4: - resolution: - { - integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==, - } - engines: { node: ">= 8" } - dev: true - /sourcemap-codec@1.4.8: resolution: { @@ -3587,6 +3669,7 @@ packages: } dependencies: safe-buffer: 5.2.1 + dev: false /strip-ansi@6.0.1: resolution: @@ -3603,6 +3686,7 @@ packages: integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==, } engines: { node: ">=0.10.0" } + dev: false /strip-json-comments@3.1.1: resolution: @@ -3630,6 +3714,7 @@ packages: mkdirp-classic: 0.5.3 pump: 3.0.0 tar-stream: 2.2.0 + dev: false /tar-stream@2.2.0: resolution: @@ -3643,6 +3728,7 @@ packages: fs-constants: 1.0.0 inherits: 2.0.4 readable-stream: 3.6.2 + dev: false /text-table@0.2.0: resolution: @@ -3695,16 +3781,16 @@ packages: } dev: true - /tsx@3.12.10: + /tsx@3.13.0: resolution: { - integrity: sha512-2+46h4xvUt1aLDNvk5YBT8Uzw+b7BolGbn7iSMucYqCXZiDc+1IMghLVdw8kKjING32JFOeO+Am9posvjkeclA==, + integrity: sha512-rjmRpTu3as/5fjNq/kOkOtihgLxuIz6pbKdj9xwP4J5jOLkBxw/rjN5ANw+KyrrOXV5uB7HC8+SrrSJxT65y+A==, } hasBin: true dependencies: - "@esbuild-kit/cjs-loader": 2.4.4 - "@esbuild-kit/core-utils": 3.3.1 - "@esbuild-kit/esm-loader": 2.6.4 + esbuild: 0.18.20 + get-tsconfig: 4.7.2 + source-map-support: 0.5.21 optionalDependencies: fsevents: 2.3.3 dev: true @@ -3716,6 +3802,7 @@ packages: } dependencies: safe-buffer: 5.2.1 + dev: false /type-check@0.4.0: resolution: @@ -3763,10 +3850,10 @@ packages: engines: { node: ">=14.17" } hasBin: true - /undici@5.24.0: + /undici@5.25.2: resolution: { - integrity: sha512-OKlckxBjFl0oXxcj9FU6oB8fDAaiRUq+D8jrFWGmOfI/gIyjk/IeS75LMzgYKUaeHzLUcYvf9bbJGSrUwTfwwQ==, + integrity: sha512-tch8RbCfn1UUH1PeVCXva4V8gDpGAud/w0WubD6sHC46vYQ3KDxL+xv1A2UxK0N6jrVedutuPHxe1XIoqerwMw==, } engines: { node: ">=14.0" } dependencies: @@ -3786,6 +3873,7 @@ packages: { integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, } + dev: false /vscode-json-languageservice@4.2.1: resolution: @@ -3795,7 +3883,7 @@ packages: dependencies: jsonc-parser: 3.2.0 vscode-languageserver-textdocument: 1.0.8 - vscode-languageserver-types: 3.17.3 + vscode-languageserver-types: 3.17.4 vscode-nls: 5.2.0 vscode-uri: 3.0.7 dev: true @@ -3807,10 +3895,10 @@ packages: } dev: true - /vscode-languageserver-types@3.17.3: + /vscode-languageserver-types@3.17.4: resolution: { - integrity: sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA==, + integrity: sha512-9YXi5pA3XF2V+NUQg6g+lulNS0ncRCKASYdK3Cs7kiH9sVFXWq27prjkC/B8M/xJLRPPRSPCHVMuBTgRNFh2sQ==, } dev: true @@ -3828,6 +3916,14 @@ packages: } dev: true + /web-streams-polyfill@3.2.1: + resolution: + { + integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==, + } + engines: { node: ">= 8" } + dev: false + /webidl-conversions@3.0.1: resolution: { @@ -3878,10 +3974,10 @@ packages: "@cloudflare/workerd-windows-64": 1.20230904.0 dev: true - /wrangler@3.8.0: + /wrangler@3.9.0: resolution: { - integrity: sha512-sTdD+6fMEpM9ROxv+gcyxgTKpnf7tB5ftRV5+wupsdljWkow5C00UCWU/IWSOUfuitAGAj1PWATjKfrRp9Bk9w==, + integrity: sha512-Ho1A76KxbqfcRgCsuN6xGar3BVPyn4oVWM9zx0HvEVhT9wQ7n/LvB6GlPdXKABqEBYhVe/oTH72S5TgWl0DgaA==, } engines: { node: ">=16.13.0" } hasBin: true @@ -3892,11 +3988,12 @@ packages: blake3-wasm: 2.1.5 chokidar: 3.5.3 esbuild: 0.17.19 - miniflare: 3.20230904.0 + miniflare: 3.20230918.0 nanoid: 3.3.6 path-to-regexp: 6.2.1 selfsigned: 2.1.1 - source-map: 0.7.4 + source-map: 0.6.1 + source-map-support: 0.5.21 xxhash-wasm: 1.0.2 optionalDependencies: fsevents: 2.3.3 @@ -3912,10 +4009,10 @@ packages: integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, } - /ws@8.14.1: + /ws@8.14.2: resolution: { - integrity: sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==, + integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==, } engines: { node: ">=10.0.0" } peerDependencies: @@ -3939,6 +4036,15 @@ packages: { integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, } + dev: false + + /yaml@2.3.2: + resolution: + { + integrity: sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==, + } + engines: { node: ">= 14" } + dev: false /yocto-queue@0.1.0: resolution: @@ -3947,10 +4053,10 @@ packages: } engines: { node: ">=10" } - /youch@3.3.1: + /youch@3.3.2: resolution: { - integrity: sha512-Rg9ioi+AkKyje2Hk4qILSVvayaFW98KTsOJ4aIkjDf97LZX5WJVIHZmFLnM4ThcVofHo/fbbwtYajfBPHFOVtg==, + integrity: sha512-9cwz/z7abtcHOIuH45nzmUFCZbyJA1nLqlirKvyNRx4wDMhqsBaifAJzBej7L4fsVPjFxYq3NK3GAcfvZsydFw==, } dependencies: cookie: 0.5.0 @@ -3963,4 +4069,3 @@ packages: { integrity: sha512-wvWkphh5WQsJbVk1tbx1l1Ly4yg+XecD+Mq280uBGt9wa5BKSWf4Mhp6GmrkPixhMxmabYY7RbzlwVP32pbGCg==, } - dev: true diff --git a/src/v2/lib/auth/lucia.ts b/src/v2/lib/auth/lucia.ts index 15bd82a..a0c5410 100644 --- a/src/v2/lib/auth/lucia.ts +++ b/src/v2/lib/auth/lucia.ts @@ -34,27 +34,27 @@ export const auth = (env: Bindings) => { enabled: true, allowedSubDomains: ["*"], }, - getUserAttributes: (dbUser) => { + getUserAttributes: (user) => { return { - username: dbUser.username, - usernameColour: dbUser.username_colour, - avatarUrl: dbUser.avatar_url, - bannerUrl: dbUser.banner_url, - email: dbUser.email, - emailVerified: dbUser.email_verified, - pronouns: dbUser.pronouns, - verified: dbUser.verified, - bio: dbUser.bio, - roleFlags: dbUser.role_flags, - selfAssignableRoleFlags: dbUser.self_assignable_role_flags, - dateJoined: dbUser.date_joined, + username: user.username, + usernameColour: user.username_colour, + avatarUrl: user.avatar_url, + bannerUrl: user.banner_url, + email: user.email, + emailVerified: user.email_verified, + pronouns: user.pronouns, + verified: user.verified, + bio: user.bio, + roleFlags: user.role_flags, + selfAssignableRoleFlags: user.self_assignable_role_flags, + dateJoined: user.date_joined, } }, - getSessionAttributes: (dbSession) => { + getSessionAttributes: (session) => { return { - userAgent: dbSession.user_agent as string, - countryCode: dbSession.country_code as string, - ipAddress: dbSession.ip_address as string, + userAgent: session.user_agent, + countryCode: session.country_code, + ipAddress: session.ip_address, } }, }) diff --git a/src/worker-configuration.d.ts b/src/worker-configuration.d.ts index 53f0a03..19d8884 100644 --- a/src/worker-configuration.d.ts +++ b/src/worker-configuration.d.ts @@ -3,7 +3,7 @@ declare global { * The `Bindings` type is used to define the shape of the environment variables that are used by the application. * It includes properties for the Discord token, R2 bucket, current environment, and necessary Database credentials for Turso. */ - export type Bindings = { + type Bindings = { DISCORD_TOKEN: string bucket: R2Bucket ENVIRONMENT: string @@ -17,10 +17,10 @@ declare global { * It is defined as a global type in the `globals.d.ts` file and includes properties for the request object, environment variables, and response methods. * @template Bindings - The shape of the environment variables that are used by the application. */ - export type APIContext = import("hono").Context<{ + type APIContext = import("hono").Context<{ Bindings: Bindings }> } -// This allows the types to be defined in the global scope throughout the API. +// This allows the types to be defined in the global scope throughout the API. Do not remove. export {} From 80faab8bf8f9ae78e52be9c00c2f482bb8a66e2e Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Mon, 25 Sep 2023 01:35:43 +0100 Subject: [PATCH 091/318] ohhh my fucking godddddddddddddddd --- package.json | 2 + pnpm-lock.yaml | 720 +++++++++++++++++- src/lucia.d.ts | 8 +- src/v2/lib/auth/lucia.ts | 22 +- .../asset-categories/createAssetCategory.ts | 4 +- .../asset-categories/deleteAssetCategory.ts | 4 +- src/v2/routes/auth/assets/approveAsset.ts | 4 +- .../collections/addAssetToCollection.ts | 2 +- .../collections/createAssetCollection.ts | 4 +- .../collections/deleteAssetCollection.ts | 2 +- .../collections/deleteAssetFromCollection.ts | 2 +- .../assets/collections/viewAssetCollection.ts | 6 +- .../collections/viewAssetCollections.ts | 4 +- .../auth/assets/favorite/addFavoriteAsset.ts | 15 +- .../assets/favorite/removeFavoriteAsset.ts | 18 +- .../assets/favorite/viewFavoriteAssets.ts | 4 +- src/v2/routes/auth/assets/modifyAsset.ts | 8 +- src/v2/routes/auth/assets/uploadAsset.ts | 8 +- src/v2/routes/auth/games/createGame.ts | 4 +- src/v2/routes/auth/games/deleteGame.ts | 4 +- src/v2/routes/auth/login-methods/discord.ts | 25 + src/v2/routes/auth/logout.ts | 2 +- .../deleteOCGeneratorResponse.ts | 6 +- .../oc-generators/saveOCGeneratorResponse.ts | 4 +- .../oc-generators/viewOCGeneratorResponses.ts | 4 +- src/v2/routes/auth/tags/createTag.ts | 4 +- src/v2/routes/auth/tags/deleteTag.ts | 4 +- .../self-upload/uploadAvatar.ts | 16 +- .../self-upload/uploadBanner.ts | 18 +- .../user-attributes/updateUserAttributes.ts | 4 +- .../user-relations/followUser.ts | 12 +- .../user-relations/unfollowUser.ts | 8 +- src/v2/routes/auth/validate.ts | 1 - src/v2/routes/search/all/searchAll.ts | 9 +- .../routes/search/user/getUserByUsername.ts | 6 +- src/worker-configuration.d.ts | 4 + 36 files changed, 860 insertions(+), 112 deletions(-) create mode 100644 src/v2/routes/auth/login-methods/discord.ts diff --git a/package.json b/package.json index e797251..b363c48 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "@hono/zod-openapi": "^0.6.0", "@libsql/client": "0.3.4", "@lucia-auth/adapter-sqlite": "^2.0.0", + "@lucia-auth/oauth": "^3.3.0", "@typescript-eslint/eslint-plugin": "^6.7.2", "drizzle-orm": "^0.28.6", "hono": "^3.7.2", @@ -36,6 +37,7 @@ "mysql2": "^3.6.1", "prettier": "^3.0.3", "resend": "^1.1.0", + "unstorage": "^1.9.0", "zod": "^3.22.2" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4940935..b7968a4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,6 +14,9 @@ dependencies: "@lucia-auth/adapter-sqlite": specifier: ^2.0.0 version: 2.0.0(@libsql/client@0.3.4)(lucia@2.7.0) + "@lucia-auth/oauth": + specifier: ^3.3.0 + version: 3.3.0(lucia@2.7.0) "@typescript-eslint/eslint-plugin": specifier: ^6.7.2 version: 6.7.2(@typescript-eslint/parser@6.7.2)(eslint@8.50.0)(typescript@5.2.2) @@ -35,6 +38,9 @@ dependencies: resend: specifier: ^1.1.0 version: 1.1.0 + unstorage: + specifier: ^1.9.0 + version: 1.9.0 zod: specifier: ^3.22.2 version: 3.22.2 @@ -848,6 +854,13 @@ packages: integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==, } + /@ioredis/commands@1.2.0: + resolution: + { + integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==, + } + dev: false + /@libsql/client@0.3.4: resolution: { @@ -923,6 +936,17 @@ packages: lucia: 2.7.0 dev: false + /@lucia-auth/oauth@3.3.0(lucia@2.7.0): + resolution: + { + integrity: sha512-vb9BBcZXOeeijGndnvq/AoJJZU6MAKG7UCqV1n9tQ81edSPaWZWsxSDrDjmNFrY0tSyATZMWo/LXbzt/WQdKdA==, + } + peerDependencies: + lucia: ^2.0.0 + dependencies: + lucia: 2.7.0 + dev: false + /@nodelib/fs.scandir@2.1.5: resolution: { @@ -957,6 +981,189 @@ packages: } dev: false + /@parcel/watcher-android-arm64@2.3.0: + resolution: + { + integrity: sha512-f4o9eA3dgk0XRT3XhB0UWpWpLnKgrh1IwNJKJ7UJek7eTYccQ8LR7XUWFKqw6aEq5KUNlCcGvSzKqSX/vtWVVA==, + } + engines: { node: ">= 10.0.0" } + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-darwin-arm64@2.3.0: + resolution: + { + integrity: sha512-mKY+oijI4ahBMc/GygVGvEdOq0L4DxhYgwQqYAz/7yPzuGi79oXrZG52WdpGA1wLBPrYb0T8uBaGFo7I6rvSKw==, + } + engines: { node: ">= 10.0.0" } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-darwin-x64@2.3.0: + resolution: + { + integrity: sha512-20oBj8LcEOnLE3mgpy6zuOq8AplPu9NcSSSfyVKgfOhNAc4eF4ob3ldj0xWjGGbOF7Dcy1Tvm6ytvgdjlfUeow==, + } + engines: { node: ">= 10.0.0" } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-freebsd-x64@2.3.0: + resolution: + { + integrity: sha512-7LftKlaHunueAEiojhCn+Ef2CTXWsLgTl4hq0pkhkTBFI3ssj2bJXmH2L67mKpiAD5dz66JYk4zS66qzdnIOgw==, + } + engines: { node: ">= 10.0.0" } + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-arm-glibc@2.3.0: + resolution: + { + integrity: sha512-1apPw5cD2xBv1XIHPUlq0cO6iAaEUQ3BcY0ysSyD9Kuyw4MoWm1DV+W9mneWI+1g6OeP6dhikiFE6BlU+AToTQ==, + } + engines: { node: ">= 10.0.0" } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-arm64-glibc@2.3.0: + resolution: + { + integrity: sha512-mQ0gBSQEiq1k/MMkgcSB0Ic47UORZBmWoAWlMrTW6nbAGoLZP+h7AtUM7H3oDu34TBFFvjy4JCGP43JlylkTQA==, + } + engines: { node: ">= 10.0.0" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-arm64-musl@2.3.0: + resolution: + { + integrity: sha512-LXZAExpepJew0Gp8ZkJ+xDZaTQjLHv48h0p0Vw2VMFQ8A+RKrAvpFuPVCVwKJCr5SE+zvaG+Etg56qXvTDIedw==, + } + engines: { node: ">= 10.0.0" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-x64-glibc@2.3.0: + resolution: + { + integrity: sha512-P7Wo91lKSeSgMTtG7CnBS6WrA5otr1K7shhSjKHNePVmfBHDoAOHYRXgUmhiNfbcGk0uMCHVcdbfxtuiZCHVow==, + } + engines: { node: ">= 10.0.0" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-x64-musl@2.3.0: + resolution: + { + integrity: sha512-+kiRE1JIq8QdxzwoYY+wzBs9YbJ34guBweTK8nlzLKimn5EQ2b2FSC+tAOpq302BuIMjyuUGvBiUhEcLIGMQ5g==, + } + engines: { node: ">= 10.0.0" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-wasm@2.3.0: + resolution: + { + integrity: sha512-ejBAX8H0ZGsD8lSICDNyMbSEtPMWgDL0WFCt/0z7hyf5v8Imz4rAM8xY379mBsECkq/Wdqa5WEDLqtjZ+6NxfA==, + } + engines: { node: ">= 10.0.0" } + dependencies: + is-glob: 4.0.3 + micromatch: 4.0.5 + dev: false + bundledDependencies: + - napi-wasm + + /@parcel/watcher-win32-arm64@2.3.0: + resolution: + { + integrity: sha512-35gXCnaz1AqIXpG42evcoP2+sNL62gZTMZne3IackM+6QlfMcJLy3DrjuL6Iks7Czpd3j4xRBzez3ADCj1l7Aw==, + } + engines: { node: ">= 10.0.0" } + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-win32-ia32@2.3.0: + resolution: + { + integrity: sha512-FJS/IBQHhRpZ6PiCjFt1UAcPr0YmCLHRbTc00IBTrelEjlmmgIVLeOx4MSXzx2HFEy5Jo5YdhGpxCuqCyDJ5ow==, + } + engines: { node: ">= 10.0.0" } + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-win32-x64@2.3.0: + resolution: + { + integrity: sha512-dLx+0XRdMnVI62kU3wbXvbIRhLck4aE28bIGKbRGS7BJNt54IIj9+c/Dkqb+7DJEbHUZAX1bwaoM8PqVlHJmCA==, + } + engines: { node: ">= 10.0.0" } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher@2.3.0: + resolution: + { + integrity: sha512-pW7QaFiL11O0BphO+bq3MgqeX/INAk9jgBldVDYjlQPO4VddoZnF22TcF9onMhnLVHuNqBJeRf+Fj7eezi/+rQ==, + } + engines: { node: ">= 10.0.0" } + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.5 + node-addon-api: 7.0.0 + optionalDependencies: + "@parcel/watcher-android-arm64": 2.3.0 + "@parcel/watcher-darwin-arm64": 2.3.0 + "@parcel/watcher-darwin-x64": 2.3.0 + "@parcel/watcher-freebsd-x64": 2.3.0 + "@parcel/watcher-linux-arm-glibc": 2.3.0 + "@parcel/watcher-linux-arm64-glibc": 2.3.0 + "@parcel/watcher-linux-arm64-musl": 2.3.0 + "@parcel/watcher-linux-x64-glibc": 2.3.0 + "@parcel/watcher-linux-x64-musl": 2.3.0 + "@parcel/watcher-win32-arm64": 2.3.0 + "@parcel/watcher-win32-ia32": 2.3.0 + "@parcel/watcher-win32-x64": 2.3.0 + dev: false + /@react-email/render@0.0.7: resolution: { @@ -1243,7 +1450,13 @@ packages: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - dev: true + + /arch@2.2.0: + resolution: + { + integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==, + } + dev: false /argparse@2.0.1: resolution: @@ -1305,7 +1518,6 @@ packages: integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==, } engines: { node: ">=8" } - dev: true /bindings@1.5.0: resolution: @@ -1448,7 +1660,6 @@ packages: readdirp: 3.6.0 optionalDependencies: fsevents: 2.3.3 - dev: true /chownr@1.1.4: resolution: @@ -1457,6 +1668,15 @@ packages: } dev: false + /citty@0.1.4: + resolution: + { + integrity: sha512-Q3bK1huLxzQrvj7hImJ7Z1vKYJRPQCDnd0EjXfHMidcjecGOMuLrmuQmtWmFkuKLcMThlGh1yCKG8IEc6VeNXQ==, + } + dependencies: + consola: 3.2.3 + dev: false + /cli-color@2.0.3: resolution: { @@ -1471,6 +1691,26 @@ packages: timers-ext: 0.1.7 dev: true + /clipboardy@3.0.0: + resolution: + { + integrity: sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dependencies: + arch: 2.2.0 + execa: 5.1.1 + is-wsl: 2.2.0 + dev: false + + /cluster-key-slot@1.1.2: + resolution: + { + integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==, + } + engines: { node: ">=0.10.0" } + dev: false + /color-convert@2.0.1: resolution: { @@ -1540,6 +1780,21 @@ packages: proto-list: 1.2.4 dev: false + /consola@3.2.3: + resolution: + { + integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==, + } + engines: { node: ^14.18.0 || >=16.10.0 } + dev: false + + /cookie-es@1.0.0: + resolution: + { + integrity: sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ==, + } + dev: false + /cookie@0.5.0: resolution: { @@ -1630,6 +1885,13 @@ packages: engines: { node: ">=0.10.0" } dev: false + /defu@6.1.2: + resolution: + { + integrity: sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ==, + } + dev: false + /delayed-stream@1.0.0: resolution: { @@ -1646,6 +1908,22 @@ packages: engines: { node: ">=0.10" } dev: false + /destr@2.0.1: + resolution: + { + integrity: sha512-M1Ob1zPSIvlARiJUkKqvAZ3VAqQY6Jcuth/pBKQ2b1dX/Qx0OnJ8Vux6J2H5PTMQeRzWrrbTu70VxBfv/OPDJA==, + } + dev: false + + /detect-libc@1.0.3: + resolution: + { + integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==, + } + engines: { node: ">=0.10" } + hasBin: true + dev: false + /detect-libc@2.0.2: resolution: { @@ -2144,6 +2422,24 @@ packages: es5-ext: 0.10.62 dev: true + /execa@5.1.1: + resolution: + { + integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==, + } + engines: { node: ">=10" } + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: false + /exit-hook@2.2.1: resolution: { @@ -2325,7 +2621,6 @@ packages: engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } os: [darwin] requiresBuild: true - dev: true optional: true /generate-function@2.3.1: @@ -2337,6 +2632,13 @@ packages: is-property: 1.0.2 dev: false + /get-port-please@3.1.1: + resolution: + { + integrity: sha512-3UBAyM3u4ZBVYDsxOQfJDxEa6XTbpBDrOjp4mf7ExFRt5BKs/QywQQiJsh2B+hxcZLSapWqCRvElUe8DnKcFHA==, + } + dev: false + /get-source@2.0.12: resolution: { @@ -2347,6 +2649,14 @@ packages: source-map: 0.6.1 dev: true + /get-stream@6.0.1: + resolution: + { + integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==, + } + engines: { node: ">=10" } + dev: false + /get-tsconfig@4.7.2: resolution: { @@ -2444,6 +2754,22 @@ packages: integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, } + /h3@1.8.1: + resolution: + { + integrity: sha512-m5rFuu+5bpwBBHqqS0zexjK+Q8dhtFRvO9JXQG0RvSPL6QrIT6vv42vuBM22SLOgGMoZYsHk0y7VPidt9s+nkw==, + } + dependencies: + cookie-es: 1.0.0 + defu: 6.1.2 + destr: 2.0.1 + iron-webcrypto: 0.8.2 + radix3: 1.1.0 + ufo: 1.3.0 + uncrypto: 0.1.3 + unenv: 1.7.4 + dev: false + /hanji@0.0.5: resolution: { @@ -2502,6 +2828,22 @@ packages: entities: 4.5.0 dev: false + /http-shutdown@1.2.2: + resolution: + { + integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==, + } + engines: { iojs: ">= 1.0.0", node: ">= 0.12.0" } + dev: false + + /human-signals@2.1.0: + resolution: + { + integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==, + } + engines: { node: ">=10.17.0" } + dev: false + /husky@8.0.3: resolution: { @@ -2574,6 +2916,33 @@ packages: } dev: false + /ioredis@5.3.2: + resolution: + { + integrity: sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==, + } + engines: { node: ">=12.22.0" } + dependencies: + "@ioredis/commands": 1.2.0 + cluster-key-slot: 1.1.2 + debug: 4.3.4 + denque: 2.1.0 + lodash.defaults: 4.2.0 + lodash.isarguments: 3.1.0 + redis-errors: 1.2.0 + redis-parser: 3.0.0 + standard-as-callback: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /iron-webcrypto@0.8.2: + resolution: + { + integrity: sha512-jGiwmpgTuF19Vt4hn3+AzaVFGpVZt7A1ysd5ivFel2r4aNVFwqaYa6aU6qsF1PM7b+WFivZHz3nipwUOXaOnHg==, + } + dev: false + /is-binary-path@2.1.0: resolution: { @@ -2582,7 +2951,6 @@ packages: engines: { node: ">=8" } dependencies: binary-extensions: 2.2.0 - dev: true /is-buffer@1.1.6: resolution: @@ -2591,6 +2959,15 @@ packages: } dev: false + /is-docker@2.2.1: + resolution: + { + integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==, + } + engines: { node: ">=8" } + hasBin: true + dev: false + /is-extendable@0.1.1: resolution: { @@ -2643,6 +3020,14 @@ packages: } dev: false + /is-stream@2.0.1: + resolution: + { + integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, + } + engines: { node: ">=8" } + dev: false + /is-whitespace@0.3.0: resolution: { @@ -2651,12 +3036,30 @@ packages: engines: { node: ">=0.10.0" } dev: false + /is-wsl@2.2.0: + resolution: + { + integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==, + } + engines: { node: ">=8" } + dependencies: + is-docker: 2.2.1 + dev: false + /isexe@2.0.0: resolution: { integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, } + /jiti@1.20.0: + resolution: + { + integrity: sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==, + } + hasBin: true + dev: false + /js-base64@3.7.5: resolution: { @@ -2729,7 +3132,6 @@ packages: { integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==, } - dev: true /keyv@4.5.3: resolution: @@ -2766,6 +3168,32 @@ packages: prelude-ls: 1.2.1 type-check: 0.4.0 + /listhen@1.5.5: + resolution: + { + integrity: sha512-LXe8Xlyh3gnxdv4tSjTjscD1vpr/2PRpzq8YIaMJgyKzRG8wdISlWVWnGThJfHnlJ6hmLt2wq1yeeix0TEbuoA==, + } + hasBin: true + dependencies: + "@parcel/watcher": 2.3.0 + "@parcel/watcher-wasm": 2.3.0 + citty: 0.1.4 + clipboardy: 3.0.0 + consola: 3.2.3 + defu: 6.1.2 + get-port-please: 3.1.1 + h3: 1.8.1 + http-shutdown: 1.2.2 + jiti: 1.20.0 + mlly: 1.4.2 + node-forge: 1.3.1 + pathe: 1.1.1 + std-env: 3.4.3 + ufo: 1.3.0 + untun: 0.1.2 + uqr: 0.1.2 + dev: false + /locate-path@6.0.0: resolution: { @@ -2775,6 +3203,20 @@ packages: dependencies: p-locate: 5.0.0 + /lodash.defaults@4.2.0: + resolution: + { + integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==, + } + dev: false + + /lodash.isarguments@3.1.0: + resolution: + { + integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==, + } + dev: false + /lodash.merge@4.6.2: resolution: { @@ -2812,6 +3254,14 @@ packages: js-tokens: 4.0.0 dev: false + /lru-cache@10.0.1: + resolution: + { + integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==, + } + engines: { node: 14 || >=16.14 } + dev: false + /lru-cache@6.0.0: resolution: { @@ -2879,6 +3329,13 @@ packages: timers-ext: 0.1.7 dev: true + /merge-stream@2.0.0: + resolution: + { + integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, + } + dev: false + /merge2@1.4.1: resolution: { @@ -2923,7 +3380,14 @@ packages: } engines: { node: ">=10.0.0" } hasBin: true - dev: true + + /mimic-fn@2.1.0: + resolution: + { + integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==, + } + engines: { node: ">=6" } + dev: false /mimic-response@3.1.0: resolution: @@ -3009,6 +3473,26 @@ packages: } dev: false + /mlly@1.4.2: + resolution: + { + integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==, + } + dependencies: + acorn: 8.10.0 + pathe: 1.1.1 + pkg-types: 1.0.3 + ufo: 1.3.0 + dev: false + + /mri@1.2.0: + resolution: + { + integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==, + } + engines: { node: ">=4" } + dev: false + /ms@2.1.2: resolution: { @@ -3089,6 +3573,13 @@ packages: semver: 7.5.4 dev: false + /node-addon-api@7.0.0: + resolution: + { + integrity: sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==, + } + dev: false + /node-domexception@1.0.0: resolution: { @@ -3097,6 +3588,13 @@ packages: engines: { node: ">=10.5.0" } dev: false + /node-fetch-native@1.4.0: + resolution: + { + integrity: sha512-F5kfEj95kX8tkDhUCYdV8dg3/8Olx/94zB8+ZNthFs6Bz31UpUi8Xh40TN3thLwXgrwXry1pEg9lJ++tLWTcqA==, + } + dev: false + /node-fetch@2.7.0: resolution: { @@ -3130,7 +3628,6 @@ packages: integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==, } engines: { node: ">= 6.13.0" } - dev: true /nopt@6.0.0: resolution: @@ -3149,7 +3646,27 @@ packages: integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, } engines: { node: ">=0.10.0" } - dev: true + + /npm-run-path@4.0.1: + resolution: + { + integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==, + } + engines: { node: ">=8" } + dependencies: + path-key: 3.1.1 + dev: false + + /ofetch@1.3.3: + resolution: + { + integrity: sha512-s1ZCMmQWXy4b5K/TW9i/DtiN8Ku+xCiHcjQ6/J/nDdssirrQNOoB165Zu8EqLMA2lln1JUth9a0aW9Ap2ctrUg==, + } + dependencies: + destr: 2.0.1 + node-fetch-native: 1.4.0 + ufo: 1.3.0 + dev: false /once@1.4.0: resolution: @@ -3159,6 +3676,16 @@ packages: dependencies: wrappy: 1.0.2 + /onetime@5.1.2: + resolution: + { + integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, + } + engines: { node: ">=6" } + dependencies: + mimic-fn: 2.1.0 + dev: false + /openapi3-ts@4.1.2: resolution: { @@ -3255,6 +3782,13 @@ packages: engines: { node: ">=8" } dev: false + /pathe@1.1.1: + resolution: + { + integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==, + } + dev: false + /peberminta@0.8.0: resolution: { @@ -3269,6 +3803,17 @@ packages: } engines: { node: ">=8.6" } + /pkg-types@1.0.3: + resolution: + { + integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==, + } + dependencies: + jsonc-parser: 3.2.0 + mlly: 1.4.2 + pathe: 1.1.1 + dev: false + /prebuild-install@7.1.1: resolution: { @@ -3356,6 +3901,13 @@ packages: integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, } + /radix3@1.1.0: + resolution: + { + integrity: sha512-pNsHDxbGORSvuSScqNJ+3Km6QAVqk8CfsCBIEoDgpqLrkD2f3QM4I7d1ozJJ172OmIcoUcerZaNWqtLkRXTV3A==, + } + dev: false + /rc@1.2.8: resolution: { @@ -3412,7 +3964,24 @@ packages: engines: { node: ">=8.10.0" } dependencies: picomatch: 2.3.1 - dev: true + + /redis-errors@1.2.0: + resolution: + { + integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==, + } + engines: { node: ">=4" } + dev: false + + /redis-parser@3.0.0: + resolution: + { + integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==, + } + engines: { node: ">=4" } + dependencies: + redis-errors: 1.2.0 + dev: false /resend@1.1.0: resolution: @@ -3569,6 +4138,13 @@ packages: } engines: { node: ">=8" } + /signal-exit@3.0.7: + resolution: + { + integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, + } + dev: false + /simple-concat@1.0.1: resolution: { @@ -3646,6 +4222,20 @@ packages: get-source: 2.0.12 dev: true + /standard-as-callback@2.1.0: + resolution: + { + integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==, + } + dev: false + + /std-env@3.4.3: + resolution: + { + integrity: sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==, + } + dev: false + /stoppable@1.1.0: resolution: { @@ -3680,6 +4270,14 @@ packages: dependencies: ansi-regex: 5.0.1 + /strip-final-newline@2.0.0: + resolution: + { + integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==, + } + engines: { node: ">=6" } + dev: false + /strip-json-comments@2.0.1: resolution: { @@ -3850,6 +4448,20 @@ packages: engines: { node: ">=14.17" } hasBin: true + /ufo@1.3.0: + resolution: + { + integrity: sha512-bRn3CsoojyNStCZe0BG0Mt4Nr/4KF+rhFlnNXybgqt5pXHNFRlqinSoQaTrGyzE4X8aHplSb+TorH+COin9Yxw==, + } + dev: false + + /uncrypto@0.1.3: + resolution: + { + integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==, + } + dev: false + /undici@5.25.2: resolution: { @@ -3860,6 +4472,94 @@ packages: busboy: 1.6.0 dev: true + /unenv@1.7.4: + resolution: + { + integrity: sha512-fjYsXYi30It0YCQYqLOcT6fHfMXsBr2hw9XC7ycf8rTG7Xxpe3ZssiqUnD0khrjiZEmkBXWLwm42yCSCH46fMw==, + } + dependencies: + consola: 3.2.3 + defu: 6.1.2 + mime: 3.0.0 + node-fetch-native: 1.4.0 + pathe: 1.1.1 + dev: false + + /unstorage@1.9.0: + resolution: + { + integrity: sha512-VpD8ZEYc/le8DZCrny3bnqKE4ZjioQxBRnWE+j5sGNvziPjeDlaS1NaFFHzl/kkXaO3r7UaF8MGQrs14+1B4pQ==, + } + peerDependencies: + "@azure/app-configuration": ^1.4.1 + "@azure/cosmos": ^3.17.3 + "@azure/data-tables": ^13.2.2 + "@azure/identity": ^3.2.3 + "@azure/keyvault-secrets": ^4.7.0 + "@azure/storage-blob": ^12.14.0 + "@capacitor/preferences": ^5.0.0 + "@planetscale/database": ^1.8.0 + "@upstash/redis": ^1.22.0 + "@vercel/kv": ^0.2.2 + idb-keyval: ^6.2.1 + peerDependenciesMeta: + "@azure/app-configuration": + optional: true + "@azure/cosmos": + optional: true + "@azure/data-tables": + optional: true + "@azure/identity": + optional: true + "@azure/keyvault-secrets": + optional: true + "@azure/storage-blob": + optional: true + "@capacitor/preferences": + optional: true + "@planetscale/database": + optional: true + "@upstash/redis": + optional: true + "@vercel/kv": + optional: true + idb-keyval: + optional: true + dependencies: + anymatch: 3.1.3 + chokidar: 3.5.3 + destr: 2.0.1 + h3: 1.8.1 + ioredis: 5.3.2 + listhen: 1.5.5 + lru-cache: 10.0.1 + mri: 1.2.0 + node-fetch-native: 1.4.0 + ofetch: 1.3.3 + ufo: 1.3.0 + transitivePeerDependencies: + - supports-color + dev: false + + /untun@0.1.2: + resolution: + { + integrity: sha512-wLAMWvxfqyTiBODA1lg3IXHQtjggYLeTK7RnSfqtOXixWJ3bAa2kK/HHmOOg19upteqO3muLvN6O/icbyQY33Q==, + } + hasBin: true + dependencies: + citty: 0.1.4 + consola: 3.2.3 + pathe: 1.1.1 + dev: false + + /uqr@0.1.2: + resolution: + { + integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==, + } + dev: false + /uri-js@4.4.1: resolution: { diff --git a/src/lucia.d.ts b/src/lucia.d.ts index 43e1d81..e4d61b5 100644 --- a/src/lucia.d.ts +++ b/src/lucia.d.ts @@ -2,19 +2,19 @@ declare namespace Lucia { type Auth = import("./v2/lib/auth/lucia").Auth type DatabaseUserAttributes = { - username: string - username_colour: string | null avatar_url: string | null banner_url: string | null + username: string + username_colour: string | null email: string email_verified: number pronouns: string | null - is_contributor: number verified: number bio: string | null + date_joined: number role_flags: number + is_contributor: number self_assignable_role_flags: number | null - date_joined: number } // stored to prevent session hijacking by checking if the session attributes match the ones stored in the database type DatabaseSessionAttributes = { diff --git a/src/v2/lib/auth/lucia.ts b/src/v2/lib/auth/lucia.ts index a0c5410..db7bd3a 100644 --- a/src/v2/lib/auth/lucia.ts +++ b/src/v2/lib/auth/lucia.ts @@ -3,6 +3,7 @@ import { hono } from "lucia/middleware" import { getConnection } from "@/v2/db/turso" import { tableNames } from "@/v2/db/drizzle" import { libsql } from "@lucia-auth/adapter-sqlite" +import { discord } from "@lucia-auth/oauth/providers" /** * The `auth` function is used to create a `lucia` instance with authentication middleware and a `libsql` adapter. @@ -36,18 +37,19 @@ export const auth = (env: Bindings) => { }, getUserAttributes: (user) => { return { - username: user.username, - usernameColour: user.username_colour, avatarUrl: user.avatar_url, bannerUrl: user.banner_url, + username: user.username, + usernameColour: user.username_colour, email: user.email, emailVerified: user.email_verified, pronouns: user.pronouns, verified: user.verified, bio: user.bio, + dateJoined: user.date_joined, roleFlags: user.role_flags, + isContributor: user.is_contributor, selfAssignableRoleFlags: user.self_assignable_role_flags, - dateJoined: user.date_joined, } }, getSessionAttributes: (session) => { @@ -60,7 +62,13 @@ export const auth = (env: Bindings) => { }) } -/** - * The `Auth` type is a type alias for the `auth` function. - */ -export type Auth = typeof auth +export type Auth = ReturnType + +export function discordAuth(auth: Auth, env: Bindings) { + return discord(auth, { + clientId: env.DISCORD_CLIENT_ID, + clientSecret: env.DISCORD_CLIENT_SECRET, + redirectUri: env.DISCORD_REDIRECT_URI, + scope: ["identify", "email"], + }) +} diff --git a/src/v2/routes/auth/asset-categories/createAssetCategory.ts b/src/v2/routes/auth/asset-categories/createAssetCategory.ts index 203c84f..974a91b 100644 --- a/src/v2/routes/auth/asset-categories/createAssetCategory.ts +++ b/src/v2/routes/auth/asset-categories/createAssetCategory.ts @@ -8,7 +8,7 @@ export async function createAssetCategory(c: APIContext): Promise { const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { + if (!session || session.state === "idle") { if (session) { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) @@ -17,7 +17,7 @@ export async function createAssetCategory(c: APIContext): Promise { return c.json({ success: false, state: "unauthorized" }) } - const roleFlags = roleFlagsToArray(session.user.role_flags) + const roleFlags = roleFlagsToArray(session.user.roleFlags) if (!roleFlags.includes("CREATOR")) { c.status(401) diff --git a/src/v2/routes/auth/asset-categories/deleteAssetCategory.ts b/src/v2/routes/auth/asset-categories/deleteAssetCategory.ts index eda1681..80e3f87 100644 --- a/src/v2/routes/auth/asset-categories/deleteAssetCategory.ts +++ b/src/v2/routes/auth/asset-categories/deleteAssetCategory.ts @@ -9,7 +9,7 @@ export async function deleteAssetCategory(c: APIContext): Promise { const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { + if (!session || session.state === "idle") { if (session) { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) @@ -18,7 +18,7 @@ export async function deleteAssetCategory(c: APIContext): Promise { return c.json({ success: false, state: "unauthorized" }) } - const roleFlags = roleFlagsToArray(session.user.role_flags) + const roleFlags = roleFlagsToArray(session.user.roleFlags) if (!roleFlags.includes("CREATOR")) { c.status(401) diff --git a/src/v2/routes/auth/assets/approveAsset.ts b/src/v2/routes/auth/assets/approveAsset.ts index 48095aa..c6c1e2c 100644 --- a/src/v2/routes/auth/assets/approveAsset.ts +++ b/src/v2/routes/auth/assets/approveAsset.ts @@ -11,7 +11,7 @@ export async function approveAsset(c: APIContext): Promise { const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { + if (!session || session.state === "idle") { if (session) { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) @@ -20,7 +20,7 @@ export async function approveAsset(c: APIContext): Promise { return c.json({ success: false, state: "unauthorized" }, 401) } - const roleFlags = roleFlagsToArray(session.user.role_flags) + const roleFlags = roleFlagsToArray(session.user.roleFlags) if (!roleFlags.includes("CREATOR")) { c.status(401) diff --git a/src/v2/routes/auth/assets/collections/addAssetToCollection.ts b/src/v2/routes/auth/assets/collections/addAssetToCollection.ts index 548504d..00812da 100644 --- a/src/v2/routes/auth/assets/collections/addAssetToCollection.ts +++ b/src/v2/routes/auth/assets/collections/addAssetToCollection.ts @@ -9,7 +9,7 @@ export async function addAssetToCollection(c: APIContext): Promise { const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { + if (!session || session.state === "idle") { if (session) { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) diff --git a/src/v2/routes/auth/assets/collections/createAssetCollection.ts b/src/v2/routes/auth/assets/collections/createAssetCollection.ts index d76a308..ad5bb6e 100644 --- a/src/v2/routes/auth/assets/collections/createAssetCollection.ts +++ b/src/v2/routes/auth/assets/collections/createAssetCollection.ts @@ -9,7 +9,7 @@ export async function createAssetCollection(c: APIContext): Promise { const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { + if (!session || session.state === "idle") { if (session) { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) @@ -60,7 +60,7 @@ export async function createAssetCollection(c: APIContext): Promise { id: crypto.randomUUID(), name: collection.name, description: collection.description, - userId: session.userId, + userId: session.user.userId, dateCreated: new Date().getTime(), isPublic: 0, // default to private }) diff --git a/src/v2/routes/auth/assets/collections/deleteAssetCollection.ts b/src/v2/routes/auth/assets/collections/deleteAssetCollection.ts index a0ec355..d314111 100644 --- a/src/v2/routes/auth/assets/collections/deleteAssetCollection.ts +++ b/src/v2/routes/auth/assets/collections/deleteAssetCollection.ts @@ -10,7 +10,7 @@ export async function deleteAssetCollection(c: APIContext): Promise { const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { + if (!session || session.state === "idle") { if (session) { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) diff --git a/src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts b/src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts index 9f5750d..013f314 100644 --- a/src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts +++ b/src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts @@ -12,7 +12,7 @@ export async function deleteAssetFromCollection( const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { + if (!session || session.state === "idle") { if (session) { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) diff --git a/src/v2/routes/auth/assets/collections/viewAssetCollection.ts b/src/v2/routes/auth/assets/collections/viewAssetCollection.ts index 5c23ff2..1dd27f1 100644 --- a/src/v2/routes/auth/assets/collections/viewAssetCollection.ts +++ b/src/v2/routes/auth/assets/collections/viewAssetCollection.ts @@ -7,7 +7,7 @@ export async function viewAssetCollection(c: APIContext): Promise { const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { + if (!session || session.state === "idle") { if (session) { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) @@ -36,7 +36,7 @@ export async function viewAssetCollection(c: APIContext): Promise { eq(userCollections.id, collection.id), eq(userCollections.isPublic, 1) ), - eq(userCollections.userId, session.userId) + eq(userCollections.userId, session.user.userId) ), }) } catch (e) { @@ -54,7 +54,7 @@ export async function viewAssetCollection(c: APIContext): Promise { eq(userCollections.id, collection.id), eq(userCollections.isPublic, 1) ), - eq(userCollections.userId, session.userId) + eq(userCollections.userId, session.user.userId) ), with: { userCollectionAssets: { diff --git a/src/v2/routes/auth/assets/collections/viewAssetCollections.ts b/src/v2/routes/auth/assets/collections/viewAssetCollections.ts index 7246bba..e42b6fb 100644 --- a/src/v2/routes/auth/assets/collections/viewAssetCollections.ts +++ b/src/v2/routes/auth/assets/collections/viewAssetCollections.ts @@ -7,7 +7,7 @@ export async function viewAssetCollections(c: APIContext): Promise { const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { + if (!session || session.state === "idle") { if (session) { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) @@ -20,7 +20,7 @@ export async function viewAssetCollections(c: APIContext): Promise { const userCollectionsExists = await drizzle.query.userCollections.findFirst( { where: (userCollections, { eq }) => - eq(userCollections.userId, session.userId), + eq(userCollections.userId, session.user.userId), } ) diff --git a/src/v2/routes/auth/assets/favorite/addFavoriteAsset.ts b/src/v2/routes/auth/assets/favorite/addFavoriteAsset.ts index 73e5616..003fd4a 100644 --- a/src/v2/routes/auth/assets/favorite/addFavoriteAsset.ts +++ b/src/v2/routes/auth/assets/favorite/addFavoriteAsset.ts @@ -9,7 +9,7 @@ export async function favoriteAsset(c: APIContext): Promise { const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { + if (!session || session.state === "idle") { if (session) { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) @@ -38,7 +38,7 @@ export async function favoriteAsset(c: APIContext): Promise { // this should never happen, but just in case it does, UX over reads/writes to the database const doesUserFavoritesExist = await drizzle.query.userFavorites.findFirst({ where: (userFavorites, { eq }) => - eq(userFavorites.userId, session.userId), + eq(userFavorites.userId, session.user.userId), }) if (!doesUserFavoritesExist) { @@ -46,8 +46,8 @@ export async function favoriteAsset(c: APIContext): Promise { await drizzle .insert(userFavorites) .values({ - id: `${session.userId}-${assetToFavorite}`, - userId: session.userId, + id: `${session.user.userId}-${assetToFavorite}`, + userId: session.user.userId, isPublic: 0, // default to private }) .execute() @@ -55,7 +55,10 @@ export async function favoriteAsset(c: APIContext): Promise { const isFavorited = await drizzle.query.userFavorites.findFirst({ where: (userFavoritesAssets, { eq }) => - eq(userFavoritesAssets.id, `${session.userId}-${assetToFavorite}`), + eq( + userFavoritesAssets.id, + `${session.user.userId}-${assetToFavorite}` + ), }) if (isFavorited) { @@ -72,7 +75,7 @@ export async function favoriteAsset(c: APIContext): Promise { // add asset to userFavorites... try { await drizzle.insert(userFavoritesAssets).values({ - id: `${session.userId}-${assetToFavorite}`, + id: `${session.user.userId}-${assetToFavorite}`, userFavoritesId: isFavorited.id, assetId: parseInt(assetToFavorite), }) diff --git a/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts b/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts index 719366e..47df6c6 100644 --- a/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts +++ b/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts @@ -10,7 +10,7 @@ export async function removeFavoriteAsset(c: APIContext): Promise { const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { + if (!session || session.state === "idle") { if (session) { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) @@ -37,7 +37,7 @@ export async function removeFavoriteAsset(c: APIContext): Promise { // this should never happen, but just in case it does, UX over reads/writes to the database const doesUserFavoritesExist = await drizzle.query.userFavorites.findFirst({ where: (userFavorites, { eq }) => - eq(userFavorites.userId, session.userId), + eq(userFavorites.userId, session.user.userId), }) if (!doesUserFavoritesExist) { @@ -45,8 +45,8 @@ export async function removeFavoriteAsset(c: APIContext): Promise { await drizzle .insert(userFavorites) .values({ - id: `${session.userId}-${assetToRemove}`, - userId: session.userId, + id: `${session.user.userId}-${assetToRemove}`, + userId: session.user.userId, isPublic: 0, // default to private }) .execute() @@ -54,7 +54,10 @@ export async function removeFavoriteAsset(c: APIContext): Promise { const isFavorited = await drizzle.query.userFavorites.findFirst({ where: (userFavoritesAssets, { eq }) => - eq(userFavoritesAssets.id, `${session.userId}-${assetToRemove}`), + eq( + userFavoritesAssets.id, + `${session.user.userId}-${assetToRemove}` + ), }) if (!isFavorited) { @@ -71,7 +74,10 @@ export async function removeFavoriteAsset(c: APIContext): Promise { await drizzle .delete(userFavoritesAssets) .where( - eq(userFavoritesAssets.id, `${session.userId}-${assetToRemove}`) + eq( + userFavoritesAssets.id, + `${session.user.userId}-${assetToRemove}` + ) ) .execute() } catch (e) { diff --git a/src/v2/routes/auth/assets/favorite/viewFavoriteAssets.ts b/src/v2/routes/auth/assets/favorite/viewFavoriteAssets.ts index d3054ce..e19385e 100644 --- a/src/v2/routes/auth/assets/favorite/viewFavoriteAssets.ts +++ b/src/v2/routes/auth/assets/favorite/viewFavoriteAssets.ts @@ -7,7 +7,7 @@ export async function viewFavoriteAssets(c: APIContext): Promise { const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { + if (!session || session.state === "idle") { if (session) { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) @@ -19,7 +19,7 @@ export async function viewFavoriteAssets(c: APIContext): Promise { // check if userFavorites exists const userFavoritesExists = await drizzle.query.userFavorites.findFirst({ where: (userFavorites, { eq }) => - eq(userFavorites.userId, session.userId), + eq(userFavorites.userId, session.user.userId), }) if (!userFavoritesExists) { diff --git a/src/v2/routes/auth/assets/modifyAsset.ts b/src/v2/routes/auth/assets/modifyAsset.ts index 6e26c34..3034c46 100644 --- a/src/v2/routes/auth/assets/modifyAsset.ts +++ b/src/v2/routes/auth/assets/modifyAsset.ts @@ -12,7 +12,7 @@ export async function modifyAssetData(c: APIContext): Promise { const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { + if (!session || session.state === "idle") { if (session) { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) @@ -22,7 +22,7 @@ export async function modifyAssetData(c: APIContext): Promise { } // return unauthorized if user is not a contributor - if (session.user.is_contributor !== 1) { + if (session.user.isContributor === 0) { c.status(401) return c.json({ success: false, state: "unauthorized" }) } @@ -38,10 +38,10 @@ export async function modifyAssetData(c: APIContext): Promise { return c.json({ success: false, state: "asset not found" }) } - const roleFlags = roleFlagsToArray(session.user.role_flags) + const roleFlags = roleFlagsToArray(session.user.roleFlags) if ( - asset.uploadedById !== session.userId || + asset.uploadedById !== session.user.userId || !roleFlags.includes("CREATOR") ) { c.status(401) diff --git a/src/v2/routes/auth/assets/uploadAsset.ts b/src/v2/routes/auth/assets/uploadAsset.ts index 0763f1c..791bc16 100644 --- a/src/v2/routes/auth/assets/uploadAsset.ts +++ b/src/v2/routes/auth/assets/uploadAsset.ts @@ -9,7 +9,7 @@ export async function uploadAsset(c: APIContext): Promise { const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { + if (!session || session.state === "idle") { if (session) { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) @@ -19,12 +19,12 @@ export async function uploadAsset(c: APIContext): Promise { } // return unauthorized if user is not a contributor - if (session.user.is_contributor !== 1) { + if (session.user.isContributor !== 1) { c.status(401) return c.json({ success: false, state: "unauthorized" }) } - const bypassApproval = session.user.is_contributor === 1 + const bypassApproval = session.user.isContributor === 1 const drizzle = getConnection(c.env).drizzle @@ -54,7 +54,7 @@ export async function uploadAsset(c: APIContext): Promise { game: metadata.game, assetCategory: metadata.category, url: `/assets/${metadata.game}/${metadata.category}/${metadata.name}.${metadata.extension}`, - uploadedById: session.userId, + uploadedById: session.user.userId, status: bypassApproval ? 1 : 2, uploadedDate: new Date().getTime(), fileSize: asset.size, // stored in bytes diff --git a/src/v2/routes/auth/games/createGame.ts b/src/v2/routes/auth/games/createGame.ts index 3b9c6a6..5582b29 100644 --- a/src/v2/routes/auth/games/createGame.ts +++ b/src/v2/routes/auth/games/createGame.ts @@ -8,7 +8,7 @@ export async function createGame(c: APIContext): Promise { const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { + if (!session || session.state === "idle") { if (session) { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) @@ -17,7 +17,7 @@ export async function createGame(c: APIContext): Promise { return c.json({ success: false, state: "invalid session" }) } - const roleFlags = roleFlagsToArray(session.user.role_flags) + const roleFlags = roleFlagsToArray(session.user.roleFlags) if (!roleFlags.includes("CREATOR")) { c.status(401) diff --git a/src/v2/routes/auth/games/deleteGame.ts b/src/v2/routes/auth/games/deleteGame.ts index 6f084dc..f8e0c78 100644 --- a/src/v2/routes/auth/games/deleteGame.ts +++ b/src/v2/routes/auth/games/deleteGame.ts @@ -9,7 +9,7 @@ export async function deleteGame(c: APIContext): Promise { const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { + if (!session || session.state === "idle") { if (session) { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) @@ -18,7 +18,7 @@ export async function deleteGame(c: APIContext): Promise { return c.json({ success: false, state: "invalid session" }) } - const roleFlags = roleFlagsToArray(session.user.role_flags) + const roleFlags = roleFlagsToArray(session.user.roleFlags) if (!roleFlags.includes("CREATOR")) { c.status(401) diff --git a/src/v2/routes/auth/login-methods/discord.ts b/src/v2/routes/auth/login-methods/discord.ts new file mode 100644 index 0000000..455e635 --- /dev/null +++ b/src/v2/routes/auth/login-methods/discord.ts @@ -0,0 +1,25 @@ +import { auth, discordAuth } from "@/v2/lib/auth/lucia" +import { setCookie } from "hono/cookie" + +export async function loginWithDiscord(c: APIContext): Promise { + const curr_auth = await auth(c.env) + const session = auth(c.env).handleRequest(c).validate() + + if (session) { + c.status(200) + return c.json({ success: false, state: "already logged in" }) + } + + const discord_auth = await discordAuth(curr_auth, c.env) + const [url, state] = await discord_auth.getAuthorizationUrl() + + setCookie(c, "discord_oauth_state", state, { + httpOnly: true, + secure: true, + path: "/", + maxAge: 60 * 60 * 24 * 7, + sameSite: "Lax", + }) + + return c.json({ success: true, url, state }, 200) +} diff --git a/src/v2/routes/auth/logout.ts b/src/v2/routes/auth/logout.ts index beebc1d..fee7c66 100644 --- a/src/v2/routes/auth/logout.ts +++ b/src/v2/routes/auth/logout.ts @@ -10,7 +10,7 @@ export async function logout(c: APIContext): Promise { } // this is useful to clean up dead sessions that are still in the database - await auth(c.env).deleteDeadUserSessions(session.userId) + await auth(c.env).deleteDeadUserSessions(session.user.userId) await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) diff --git a/src/v2/routes/auth/oc-generators/deleteOCGeneratorResponse.ts b/src/v2/routes/auth/oc-generators/deleteOCGeneratorResponse.ts index f0d8f2d..37ada7c 100644 --- a/src/v2/routes/auth/oc-generators/deleteOCGeneratorResponse.ts +++ b/src/v2/routes/auth/oc-generators/deleteOCGeneratorResponse.ts @@ -10,7 +10,7 @@ export async function deleteOCGeneratorResponse( const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { + if (!session || session.state === "idle") { if (session) { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) @@ -33,7 +33,7 @@ export async function deleteOCGeneratorResponse( .where( and( eq(savedOcGenerators.id, deleteID), - eq(savedOcGenerators.userId, session.userId) + eq(savedOcGenerators.userId, session.user.userId) ) ) @@ -48,7 +48,7 @@ export async function deleteOCGeneratorResponse( .where( and( eq(savedOcGenerators.id, deleteID), - eq(savedOcGenerators.userId, session.userId) + eq(savedOcGenerators.userId, session.user.userId) ) ) diff --git a/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts b/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts index b0f3d2d..6feb18c 100644 --- a/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts +++ b/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts @@ -9,7 +9,7 @@ export async function saveOCGeneratorResponse( const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { + if (!session || session.state === "idle") { if (session) { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) @@ -25,7 +25,7 @@ export async function saveOCGeneratorResponse( // TODO: make sure data is actually valid before inserting it into the database const ocGeneratorResponse = { id: crypto.randomUUID(), - userId: session.userId as string, + userId: session.user.userId, name: formData.get("name") as string, game: formData.get("game") as string, dateCreated: new Date().getTime(), diff --git a/src/v2/routes/auth/oc-generators/viewOCGeneratorResponses.ts b/src/v2/routes/auth/oc-generators/viewOCGeneratorResponses.ts index 203c3b8..a8b3fd0 100644 --- a/src/v2/routes/auth/oc-generators/viewOCGeneratorResponses.ts +++ b/src/v2/routes/auth/oc-generators/viewOCGeneratorResponses.ts @@ -10,7 +10,7 @@ export async function viewOCGeneratorResponses( const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { + if (!session || session.state === "idle") { if (session) { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) @@ -24,7 +24,7 @@ export async function viewOCGeneratorResponses( const ocGeneratorResponses = await drizzle .select() .from(savedOcGenerators) - .where(eq(savedOcGenerators.userId, session.userId)) + .where(eq(savedOcGenerators.userId, session.user.userId)) c.status(200) return c.json({ diff --git a/src/v2/routes/auth/tags/createTag.ts b/src/v2/routes/auth/tags/createTag.ts index f9aa5b7..74c7e83 100644 --- a/src/v2/routes/auth/tags/createTag.ts +++ b/src/v2/routes/auth/tags/createTag.ts @@ -8,7 +8,7 @@ export async function createTag(c: APIContext): Promise { const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { + if (!session || session.state === "idle") { if (session) { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) @@ -17,7 +17,7 @@ export async function createTag(c: APIContext): Promise { return c.json({ success: false, state: "invalid session" }) } - const roleFlags = roleFlagsToArray(session.user.role_flags) + const roleFlags = roleFlagsToArray(session.user.roleFlags) if (!roleFlags.includes("CREATOR")) { c.status(401) diff --git a/src/v2/routes/auth/tags/deleteTag.ts b/src/v2/routes/auth/tags/deleteTag.ts index 42946f2..236f514 100644 --- a/src/v2/routes/auth/tags/deleteTag.ts +++ b/src/v2/routes/auth/tags/deleteTag.ts @@ -9,7 +9,7 @@ export async function deleteTag(c: APIContext): Promise { const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { + if (!session || session.state === "idle") { if (session) { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) @@ -17,7 +17,7 @@ export async function deleteTag(c: APIContext): Promise { return c.json({ success: false, state: "invalid session" }, 200) } - const roleFlags = roleFlagsToArray(session.user.role_flags) + const roleFlags = roleFlagsToArray(session.user.roleFlags) if (!roleFlags.includes("CREATOR")) { return c.json({ success: false, state: "unauthorized" }, 401) diff --git a/src/v2/routes/auth/user-attributes/self-upload/uploadAvatar.ts b/src/v2/routes/auth/user-attributes/self-upload/uploadAvatar.ts index 9ab0de1..ad5742a 100644 --- a/src/v2/routes/auth/user-attributes/self-upload/uploadAvatar.ts +++ b/src/v2/routes/auth/user-attributes/self-upload/uploadAvatar.ts @@ -5,7 +5,7 @@ export async function uploadProfileImage(c: APIContext): Promise { const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { + if (!session || session.state === "idle") { if (session) { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) @@ -21,20 +21,20 @@ export async function uploadProfileImage(c: APIContext): Promise { return c.json({ success: false, state: "invalid avatar" }, 200) } - const newAvatar = new File([avatar], `${session.userId}.png`) - const newAvatarURL = `/avatars/${session.userId}.png` + const newAvatar = new File([avatar], `${session.user.userId}.png`) + const newAvatarURL = `/avatars/${session.user.userId}.png` - if (!session.user.avatar_url) { - await auth(c.env).updateUserAttributes(session.userId, { + if (!session.user.avatarUrl) { + await auth(c.env).updateUserAttributes(session.user.userId, { avatar_url: newAvatarURL, }) } - if (session.user.avatar_url) { - const oldAvatarObject = await c.env.bucket.get(session.user.avatar_url) + if (session.user.avatarUrl) { + const oldAvatarObject = await c.env.bucket.get(session.user.avatarUrl) if (oldAvatarObject) { - await c.env.bucket.delete(session.user.avatar_url) + await c.env.bucket.delete(session.user.avatarUrl) } } diff --git a/src/v2/routes/auth/user-attributes/self-upload/uploadBanner.ts b/src/v2/routes/auth/user-attributes/self-upload/uploadBanner.ts index 751c9e0..915f043 100644 --- a/src/v2/routes/auth/user-attributes/self-upload/uploadBanner.ts +++ b/src/v2/routes/auth/user-attributes/self-upload/uploadBanner.ts @@ -5,7 +5,7 @@ export async function uploadBannerImage(c: APIContext): Promise { const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { + if (!session || session.state === "idle") { if (session) { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) @@ -13,7 +13,7 @@ export async function uploadBannerImage(c: APIContext): Promise { return c.json({ success: false, state: "invalid session" }, 200) } - if (session.user.is_contributor !== 1) { + if (session.user.isContributor !== 1) { return c.json({ success: false, state: "unauthorized" }, 401) } @@ -25,20 +25,20 @@ export async function uploadBannerImage(c: APIContext): Promise { return c.json({ success: false, state: "invalid banner" }, 200) } - const newBanner = new File([banner], `${session.userId}.png`) - const newBannerURL = `/banners/${session.userId}.png` + const newBanner = new File([banner], `${session.user.userId}.png`) + const newBannerURL = `/banners/${session.user.userId}.png` - if (!session.user.banner_url) { - await auth(c.env).updateUserAttributes(session.userId, { + if (!session.user.avatarUrl) { + await auth(c.env).updateUserAttributes(session.user.userId, { banner_url: newBannerURL, }) } - if (session.user.banner_url) { - const oldBannerObject = await c.env.bucket.get(session.user.banner_url) + if (session.user.avatarUrl) { + const oldBannerObject = await c.env.bucket.get(session.user.bannerUrl) if (oldBannerObject) { - await c.env.bucket.delete(session.user.banner_url) + await c.env.bucket.delete(session.user.avatarUrl) } } diff --git a/src/v2/routes/auth/user-attributes/updateUserAttributes.ts b/src/v2/routes/auth/user-attributes/updateUserAttributes.ts index f6defb5..11b33ae 100644 --- a/src/v2/routes/auth/user-attributes/updateUserAttributes.ts +++ b/src/v2/routes/auth/user-attributes/updateUserAttributes.ts @@ -4,7 +4,7 @@ export async function updateUserAttributes(c: APIContext): Promise { const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { + if (!session || session.state === "idle") { if (session) { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) @@ -28,7 +28,7 @@ export async function updateUserAttributes(c: APIContext): Promise { if (attributes[key] === null) delete attributes[key] }) - await auth(c.env).updateUserAttributes(session.userId, attributes) + await auth(c.env).updateUserAttributes(session.user.userId, attributes) return c.json( { success: true, state: "updated user attributes", session }, diff --git a/src/v2/routes/auth/user-attributes/user-relations/followUser.ts b/src/v2/routes/auth/user-attributes/user-relations/followUser.ts index ea9aaa7..2bc8175 100644 --- a/src/v2/routes/auth/user-attributes/user-relations/followUser.ts +++ b/src/v2/routes/auth/user-attributes/user-relations/followUser.ts @@ -9,7 +9,7 @@ export async function followUser(c: APIContext): Promise { const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { + if (!session || session.state === "idle") { if (session) { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) @@ -36,7 +36,7 @@ export async function followUser(c: APIContext): Promise { const isFollowing = await drizzle.query.following.findFirst({ where: (following, { eq }) => - eq(following.id, `${session.userId}-${userToFollow}`), + eq(following.id, `${session.user.userId}-${userToFollow}`), }) if (isFollowing) { @@ -47,8 +47,8 @@ export async function followUser(c: APIContext): Promise { await transaction .insert(follower) .values({ - id: `${session.userId}-${userToFollow}`, - followerUserId: session.userId, + id: `${session.user.userId}-${userToFollow}`, + followerUserId: session.user.userId, followingUserId: userToFollow, }) .execute() @@ -56,9 +56,9 @@ export async function followUser(c: APIContext): Promise { await transaction .insert(following) .values({ - id: `${userToFollow}-${session.userId}`, + id: `${userToFollow}-${session.user.userId}`, followerUserId: userToFollow, - followingUserId: session.userId, + followingUserId: session.user.userId, }) .execute() diff --git a/src/v2/routes/auth/user-attributes/user-relations/unfollowUser.ts b/src/v2/routes/auth/user-attributes/user-relations/unfollowUser.ts index 01e6b93..acf59ed 100644 --- a/src/v2/routes/auth/user-attributes/user-relations/unfollowUser.ts +++ b/src/v2/routes/auth/user-attributes/user-relations/unfollowUser.ts @@ -10,7 +10,7 @@ export async function unFollowUser(c: APIContext): Promise { const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { + if (!session || session.state === "idle") { if (session) { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) @@ -37,7 +37,7 @@ export async function unFollowUser(c: APIContext): Promise { const isFollowing = await drizzle.query.following.findFirst({ where: (following, { eq }) => - eq(following.id, `${session.userId}-${userToUnFollow}`), + eq(following.id, `${session.user.userId}-${userToUnFollow}`), }) if (!isFollowing) { @@ -47,12 +47,12 @@ export async function unFollowUser(c: APIContext): Promise { await drizzle.transaction(async (transaction) => { await transaction .delete(follower) - .where(eq(follower.id, `${session.userId}-${userToUnFollow}`)) + .where(eq(follower.id, `${session.user.userId}-${userToUnFollow}`)) .execute() await transaction .delete(following) - .where(eq(following.id, `${session.userId}-${userToUnFollow}`)) + .where(eq(following.id, `${session.user.userId}-${userToUnFollow}`)) .execute() return c.json({ success: true, state: "unfollowed user" }, 200) diff --git a/src/v2/routes/auth/validate.ts b/src/v2/routes/auth/validate.ts index b6088e7..aef9082 100644 --- a/src/v2/routes/auth/validate.ts +++ b/src/v2/routes/auth/validate.ts @@ -20,7 +20,6 @@ export async function validate(c: APIContext): Promise { session.userAgent !== userAgent || session.countryCode !== countryCode || session.ipAddress !== ipAddress || - session.state === "invalid" || session.state === "idle" ) { await auth(c.env).invalidateSession(session.sessionId) diff --git a/src/v2/routes/search/all/searchAll.ts b/src/v2/routes/search/all/searchAll.ts index de2f132..b23cf4b 100644 --- a/src/v2/routes/search/all/searchAll.ts +++ b/src/v2/routes/search/all/searchAll.ts @@ -13,7 +13,7 @@ export async function searchAll(c: APIContext): Promise { const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { + if (!session || session.state === "idle") { if (session) { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) @@ -64,7 +64,8 @@ export async function searchAll(c: APIContext): Promise { return or( and( eq(savedOcGenerators.isPublic, 1), - session && eq(savedOcGenerators.userId, session.userId) + session && + eq(savedOcGenerators.userId, session.user.userId) ), like(savedOcGenerators.name, `%${query}%`) ) @@ -75,7 +76,7 @@ export async function searchAll(c: APIContext): Promise { where: (userCollections, { or, and }) => { return and( or( - session && eq(userCollections.userId, session.userId), + session && eq(userCollections.userId, session.user.userId), eq(userCollections.isPublic, 1) ), like(userCollections.name, `%${query}%`) @@ -88,7 +89,7 @@ export async function searchAll(c: APIContext): Promise { success: true, status: "ok", query, - isAuthed: session && session.userId ? true : false, + isAuthed: session && session.user.userId ? true : false, results: { usersResponse: usersResponse ? usersResponse : [], assetsResponse: assetsResponse ? assetsResponse : [], diff --git a/src/v2/routes/search/user/getUserByUsername.ts b/src/v2/routes/search/user/getUserByUsername.ts index bed478e..31c8df3 100644 --- a/src/v2/routes/search/user/getUserByUsername.ts +++ b/src/v2/routes/search/user/getUserByUsername.ts @@ -14,7 +14,7 @@ export async function getUserByUsername(c: APIContext): Promise { const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() - if (!session || session.state === "idle" || session.state === "invalid") { + if (!session || session.state === "idle") { if (session) { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) @@ -42,9 +42,9 @@ export async function getUserByUsername(c: APIContext): Promise { { success: true, status: "ok", - accountIsAuthed: session && session.userId ? true : false, + accountIsAuthed: session && session.user.userId ? true : false, userIsQueryingOwnAccount: - session && session.userId === user.id ? true : false, + session && session.user.userId === user.id ? true : false, userRoleFlagsArray: roleFlagsToArray(user.roleFlags), user, }, diff --git a/src/worker-configuration.d.ts b/src/worker-configuration.d.ts index 19d8884..2594c6d 100644 --- a/src/worker-configuration.d.ts +++ b/src/worker-configuration.d.ts @@ -6,10 +6,14 @@ declare global { type Bindings = { DISCORD_TOKEN: string bucket: R2Bucket + kv: KVNamespace ENVIRONMENT: string VERY_SECRET_SIGNUP_KEY: string TURSO_DATABASE_URL: string TURSO_DATABASE_AUTH_TOKEN: string + DISCORD_CLIENT_ID: string + DISCORD_CLIENT_SECRET: string + DISCORD_REDIRECT_URI: string } /** From 854f3987e2fec6eb3cda0571a18fbe06bdf99765 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Mon, 25 Sep 2023 01:51:53 +0100 Subject: [PATCH 092/318] cloudflare KV session storage --- package.json | 1 + pnpm-lock.yaml | 24 +++++++++++++++++++++++ src/v2/lib/auth/lucia.ts | 42 ++++++++++++++++++++++++++++++++-------- 3 files changed, 59 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index b363c48..aeaee8c 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "dependencies": { "@hono/zod-openapi": "^0.6.0", "@libsql/client": "0.3.4", + "@lucia-auth/adapter-session-unstorage": "^2.1.0", "@lucia-auth/adapter-sqlite": "^2.0.0", "@lucia-auth/oauth": "^3.3.0", "@typescript-eslint/eslint-plugin": "^6.7.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b7968a4..dc17bc3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,9 @@ dependencies: "@libsql/client": specifier: 0.3.4 version: 0.3.4 + "@lucia-auth/adapter-session-unstorage": + specifier: ^2.1.0 + version: 2.1.0(lucia@2.7.0)(unstorage@1.9.0) "@lucia-auth/adapter-sqlite": specifier: ^2.0.0 version: 2.0.0(@libsql/client@0.3.4)(lucia@2.7.0) @@ -917,6 +920,19 @@ packages: - utf-8-validate dev: false + /@lucia-auth/adapter-session-unstorage@2.1.0(lucia@2.7.0)(unstorage@1.9.0): + resolution: + { + integrity: sha512-ItK7urZhLZv7UO99BcODjRhSAv58UPc+KQAmnkSvri2WBc22vFEjnjd/oWp3CZPdbbrJkuTvsuhFXH1ySBfOLg==, + } + peerDependencies: + lucia: ^2.0.0 + unstorage: ^1.9.0 + dependencies: + lucia: 2.7.0 + unstorage: 1.9.0 + dev: false + /@lucia-auth/adapter-sqlite@2.0.0(@libsql/client@0.3.4)(lucia@2.7.0): resolution: { @@ -1098,6 +1114,7 @@ packages: dependencies: is-glob: 4.0.3 micromatch: 4.0.5 + napi-wasm: 1.1.0 dev: false bundledDependencies: - napi-wasm @@ -3550,6 +3567,13 @@ packages: } dev: false + /napi-wasm@1.1.0: + resolution: + { + integrity: sha512-lHwIAJbmLSjF9VDRm9GoVOy9AGp3aIvkjv+Kvz9h16QR3uSVYH78PNQUnT2U4X53mhlnV2M7wrhibQ3GHicDmg==, + } + dev: false + /natural-compare@1.4.0: resolution: { diff --git a/src/v2/lib/auth/lucia.ts b/src/v2/lib/auth/lucia.ts index db7bd3a..d83b1b0 100644 --- a/src/v2/lib/auth/lucia.ts +++ b/src/v2/lib/auth/lucia.ts @@ -2,26 +2,46 @@ import { lucia } from "lucia" import { hono } from "lucia/middleware" import { getConnection } from "@/v2/db/turso" import { tableNames } from "@/v2/db/drizzle" +import { unstorage } from "@lucia-auth/adapter-session-unstorage" import { libsql } from "@lucia-auth/adapter-sqlite" +import { createStorage } from "unstorage" +import cloudflareKVBindingDriver from "unstorage/drivers/cloudflare-kv-binding" import { discord } from "@lucia-auth/oauth/providers" /** - * The `auth` function is used to create a `lucia` instance with authentication middleware and a `libsql` adapter. - * @param env - The environment variables used to configure the authentication middleware and adapter. + * Creates a KV session storage using the Cloudflare KV binding driver. + * @param {Bindings} env - Hono environment bindings. + * @returns The KV session storage. + * @see https://unstorage.unjs.io/drivers/cloudflare-kv-binding + */ +export function KVSessionStorage(env: Bindings) { + return createStorage({ + driver: cloudflareKVBindingDriver({ + binding: env.kv, + }), + }) +} + +/** The `auth` function is used to create a `lucia` instance with authentication middleware and a `libsql` adapter. + * @param {Bindings} env - The environment variables used to configure the authentication middleware and adapter. * @returns A `lucia` instance with authentication middleware and a `libsql` adapter. */ -export const auth = (env: Bindings) => { +export function auth(env: Bindings) { const db = getConnection(env) + const storage = KVSessionStorage(env) // as lucia doesn't have a adapter for drizzle, we instead create a direct connection to the database using libsql const connection = db.turso return lucia({ - adapter: libsql(connection, { - key: tableNames.authKey, - session: tableNames.authSession, - user: tableNames.authUser, - }), + adapter: { + user: libsql(connection, { + user: tableNames.authUser, + key: tableNames.authKey, + session: null, // we are handling sessions w/ CF KV + }), + session: unstorage(storage), + }, middleware: hono(), sessionExpiresIn: { idlePeriod: 0, @@ -64,6 +84,12 @@ export const auth = (env: Bindings) => { export type Auth = ReturnType +/** + * The `discordAuth` function is used to create a `discord` object for use with the `auth` function. + * @param {Auth} auth - Auth instance used by Lucia. + * @param {Bindings} env - Hono environment bindings. + * @returns - Discord Object. + */ export function discordAuth(auth: Auth, env: Bindings) { return discord(auth, { clientId: env.DISCORD_CLIENT_ID, From cb7dc29922b1f68bcf7ada0c3b6515fa65ed4131 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Mon, 25 Sep 2023 01:57:51 +0100 Subject: [PATCH 093/318] update bindings names --- src/v2/lib/auth/lucia.ts | 2 +- src/v2/lib/listBucket.ts | 2 +- src/v2/routes/auth/assets/uploadAsset.ts | 6 +++--- .../auth/user-attributes/self-upload/uploadAvatar.ts | 8 +++++--- .../auth/user-attributes/self-upload/uploadBanner.ts | 8 +++++--- src/v2/routes/games/allGames.ts | 2 +- src/v2/routes/oc-generators/getGenerator.ts | 2 +- src/v2/routes/oc-generators/getGenerators.ts | 2 +- src/worker-configuration.d.ts | 4 ++-- wrangler.toml | 7 ++++++- 10 files changed, 26 insertions(+), 17 deletions(-) diff --git a/src/v2/lib/auth/lucia.ts b/src/v2/lib/auth/lucia.ts index d83b1b0..ae8d0aa 100644 --- a/src/v2/lib/auth/lucia.ts +++ b/src/v2/lib/auth/lucia.ts @@ -17,7 +17,7 @@ import { discord } from "@lucia-auth/oauth/providers" export function KVSessionStorage(env: Bindings) { return createStorage({ driver: cloudflareKVBindingDriver({ - binding: env.kv, + binding: env.KV_SESSION_STORAGE, }), }) } diff --git a/src/v2/lib/listBucket.ts b/src/v2/lib/listBucket.ts index ef4f61d..b24e110 100644 --- a/src/v2/lib/listBucket.ts +++ b/src/v2/lib/listBucket.ts @@ -1,3 +1,3 @@ -export const listBucket = async (bucket: Bindings["bucket"], options) => { +export const listBucket = async (bucket: Bindings["FILES_BUCKET"], options) => { return await bucket.list(options) } diff --git a/src/v2/routes/auth/assets/uploadAsset.ts b/src/v2/routes/auth/assets/uploadAsset.ts index 791bc16..a490769 100644 --- a/src/v2/routes/auth/assets/uploadAsset.ts +++ b/src/v2/routes/auth/assets/uploadAsset.ts @@ -32,7 +32,7 @@ export async function uploadAsset(c: APIContext): Promise { const asset = formData.get("asset") as unknown as File | null const metadata = { - name: formData.get("name`") as string, // e.g keqing + name: formData.get("name") as string, // e.g keqing extension: formData.get("extension") as string, // e.g png tags: SplitQueryByCommas(formData.get("tags") as string), // e.g no-background, fanmade, official => ["no-background", "fanmade", "official"] category: formData.get("category") as string, // e.g splash-art @@ -68,7 +68,7 @@ export async function uploadAsset(c: APIContext): Promise { }) try { - await c.env.bucket.put( + await c.env.FILES_BUCKET.put( `/assets/${metadata.game}/${metadata.category}/${metadata.name}.${metadata.extension}`, newAssetFile ) @@ -105,7 +105,7 @@ export async function uploadAsset(c: APIContext): Promise { } }) } catch (e) { - await c.env.bucket.delete( + await c.env.FILES_BUCKET.delete( `/assets/${metadata.game}/${metadata.category}/${metadata.name}.${metadata.extension}` ) c.status(500) diff --git a/src/v2/routes/auth/user-attributes/self-upload/uploadAvatar.ts b/src/v2/routes/auth/user-attributes/self-upload/uploadAvatar.ts index ad5742a..049646d 100644 --- a/src/v2/routes/auth/user-attributes/self-upload/uploadAvatar.ts +++ b/src/v2/routes/auth/user-attributes/self-upload/uploadAvatar.ts @@ -31,14 +31,16 @@ export async function uploadProfileImage(c: APIContext): Promise { } if (session.user.avatarUrl) { - const oldAvatarObject = await c.env.bucket.get(session.user.avatarUrl) + const oldAvatarObject = await c.env.FILES_BUCKET.get( + session.user.avatarUrl + ) if (oldAvatarObject) { - await c.env.bucket.delete(session.user.avatarUrl) + await c.env.FILES_BUCKET.delete(session.user.avatarUrl) } } - await c.env.bucket.put(newAvatarURL, newAvatar) + await c.env.FILES_BUCKET.put(newAvatarURL, newAvatar) return c.json({ success: true, state: "uploaded new profile image" }, 200) } diff --git a/src/v2/routes/auth/user-attributes/self-upload/uploadBanner.ts b/src/v2/routes/auth/user-attributes/self-upload/uploadBanner.ts index 915f043..305268b 100644 --- a/src/v2/routes/auth/user-attributes/self-upload/uploadBanner.ts +++ b/src/v2/routes/auth/user-attributes/self-upload/uploadBanner.ts @@ -35,14 +35,16 @@ export async function uploadBannerImage(c: APIContext): Promise { } if (session.user.avatarUrl) { - const oldBannerObject = await c.env.bucket.get(session.user.bannerUrl) + const oldBannerObject = await c.env.FILES_BUCKET.get( + session.user.bannerUrl + ) if (oldBannerObject) { - await c.env.bucket.delete(session.user.avatarUrl) + await c.env.FILES_BUCKET.delete(session.user.avatarUrl) } } - await c.env.bucket.put(newBannerURL, newBanner) + await c.env.FILES_BUCKET.put(newBannerURL, newBanner) return c.json({ success: true, state: "uploaded new banner" }, 200) } diff --git a/src/v2/routes/games/allGames.ts b/src/v2/routes/games/allGames.ts index aafc7fb..a88e8a1 100644 --- a/src/v2/routes/games/allGames.ts +++ b/src/v2/routes/games/allGames.ts @@ -10,7 +10,7 @@ export async function getAllGames(c: APIContext): Promise { if (response) return response - const files = await listBucket(c.env.bucket, { + const files = await listBucket(c.env.FILES_BUCKET, { prefix: "oc-generators/", delimiter: "/", }) diff --git a/src/v2/routes/oc-generators/getGenerator.ts b/src/v2/routes/oc-generators/getGenerator.ts index 63c9356..ff783fd 100644 --- a/src/v2/routes/oc-generators/getGenerator.ts +++ b/src/v2/routes/oc-generators/getGenerator.ts @@ -10,7 +10,7 @@ export async function getGeneratorFromName(c: APIContext): Promise { if (response) return response - const files = await listBucket(c.env.bucket, { + const files = await listBucket(c.env.FILES_BUCKET, { prefix: `oc-generators/${gameName}/list.json`, }) diff --git a/src/v2/routes/oc-generators/getGenerators.ts b/src/v2/routes/oc-generators/getGenerators.ts index 03ff071..3c903bb 100644 --- a/src/v2/routes/oc-generators/getGenerators.ts +++ b/src/v2/routes/oc-generators/getGenerators.ts @@ -10,7 +10,7 @@ export async function getGenerators(c: APIContext): Promise { // listing all files inside of oc-generators subfolder, as they can't be manually inputted // by users but instead stored on the oc-generators repo which is synced with R2 bucket - const files = await listBucket(c.env.bucket, { + const files = await listBucket(c.env.FILES_BUCKET, { prefix: "oc-generators/", delimiter: "/", }) diff --git a/src/worker-configuration.d.ts b/src/worker-configuration.d.ts index 2594c6d..6327962 100644 --- a/src/worker-configuration.d.ts +++ b/src/worker-configuration.d.ts @@ -5,8 +5,8 @@ declare global { */ type Bindings = { DISCORD_TOKEN: string - bucket: R2Bucket - kv: KVNamespace + FILES_BUCKET: R2Bucket + KV_SESSION_STORAGE: KVNamespace ENVIRONMENT: string VERY_SECRET_SIGNUP_KEY: string TURSO_DATABASE_URL: string diff --git a/wrangler.toml b/wrangler.toml index cd2e080..19c3031 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -6,8 +6,13 @@ account_id = "ba4e8f7f9ffbc23dba6acd0d9bd3ef46" workers_dev = true [[r2_buckets]] -binding = 'bucket' +binding = 'FILES_BUCKET' bucket_name = 'files' preview_bucket_name = 'files' +kv_namespaces = [ + { binding = "KV_SESSION_STORAGE", id = "a5ee030621cf4dfda60e0ad81bfd2f3b" }, +] + + [vars] From 833adf94483ada795d537928e03ad98b6a315137 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Mon, 25 Sep 2023 02:20:59 +0100 Subject: [PATCH 094/318] feat: discord oauth --- src/v2/routes/auth/login-methods/discord.ts | 91 ++++++++++++++++++++- 1 file changed, 90 insertions(+), 1 deletion(-) diff --git a/src/v2/routes/auth/login-methods/discord.ts b/src/v2/routes/auth/login-methods/discord.ts index 455e635..8fbd3a5 100644 --- a/src/v2/routes/auth/login-methods/discord.ts +++ b/src/v2/routes/auth/login-methods/discord.ts @@ -1,5 +1,6 @@ import { auth, discordAuth } from "@/v2/lib/auth/lucia" -import { setCookie } from "hono/cookie" +import { setCookie, getCookie } from "hono/cookie" +import { getConnection } from "@/v2/db/turso" export async function loginWithDiscord(c: APIContext): Promise { const curr_auth = await auth(c.env) @@ -13,6 +14,7 @@ export async function loginWithDiscord(c: APIContext): Promise { const discord_auth = await discordAuth(curr_auth, c.env) const [url, state] = await discord_auth.getAuthorizationUrl() + // set state cookie for validation setCookie(c, "discord_oauth_state", state, { httpOnly: true, secure: true, @@ -23,3 +25,90 @@ export async function loginWithDiscord(c: APIContext): Promise { return c.json({ success: true, url, state }, 200) } + +export async function discordCallback(c: APIContext): Promise { + const storedState = getCookie(c, "discord_oauth_state") + const { state, code } = c.req.query() + + // check if state is valid + if (!storedState || !state || storedState !== state || !code) { + c.status(400) + return c.json({ success: false, state: "missing parameters" }) + } + + const curr_auth = await auth(c.env) + const discord_auth = await discordAuth(curr_auth, c.env) + + const { getExistingUser, discordUser, createUser, createKey } = + await discord_auth.validateCallback(code) + + const getDiscordUser = async () => { + const existingUser = await getExistingUser() + if (existingUser) { + c.status(200) + return existingUser + } + + // check if discord user exists && they have a verified email + if ( + !discordUser || + discordUser.bot || + !discordUser.email || + !discordUser.verified + ) { + throw new Error( + "discord user doesn't exist or doesn't have a valid email" + ) + } + + const drizzle = getConnection(c.env).drizzle + + // TODO: users can set discord ID manually, as they may have a different email, etc. + const userWithEmail = await drizzle.query.users.findFirst({ + where: (users, { eq }) => eq(users.email, discordUser.email), + }) + + // if user exists, create a key for them and update their email_verified attribute + if (userWithEmail) { + // @ts-expect-error, this is valid and i don't feel like doing wizardry to make it work + const user = curr_auth.transformDatabaseUser(userWithEmail) + await createKey(user.userId) + await curr_auth.updateUserAttributes(user.userId, { + email_verified: 1, + }) + return user + } + + // if user doesn't exist, create it based off their discord info + return createUser({ + attributes: { + username: discordUser.username, + email: discordUser.email, + email_verified: 1, + date_joined: Date.now(), + verified: 0, + role_flags: 1, + is_contributor: 0, + self_assignable_role_flags: null, + username_colour: null, + avatar_url: null, + banner_url: null, + pronouns: null, + bio: "No bio set", + }, + }) + } + + const user = await getDiscordUser() + + const session = await curr_auth.createSession({ + userId: user.userId, + attributes: { + country_code: c.req.header("cf-ipcountry") ?? "", + user_agent: c.req.header("user-agent") ?? "", + ip_address: c.req.header("cf-connecting-ip") ?? "", + }, + }) + + return c.json({ success: true, state: "logged in", session }, 200) +} From 6a37c5bed9e23efc05fe777616553a660f920eae Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Mon, 25 Sep 2023 02:32:18 +0100 Subject: [PATCH 095/318] check discord user connection id link --- src/v2/db/schema.ts | 3 + src/v2/routes/auth/login-methods/discord.ts | 62 ++++++++++++++++----- 2 files changed, 50 insertions(+), 15 deletions(-) diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index 528339c..a005045 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -93,6 +93,9 @@ export const socialsConnections = sqliteTable( userIdx: uniqueIndex("socials_connection_user_id_idx").on( socialsConnection.userId ), + discordIdIdx: uniqueIndex("socials_connection_discord_id_idx").on( + socialsConnection.discordId + ), } } ) diff --git a/src/v2/routes/auth/login-methods/discord.ts b/src/v2/routes/auth/login-methods/discord.ts index 8fbd3a5..53bcf9d 100644 --- a/src/v2/routes/auth/login-methods/discord.ts +++ b/src/v2/routes/auth/login-methods/discord.ts @@ -1,18 +1,22 @@ -import { auth, discordAuth } from "@/v2/lib/auth/lucia" +import { + auth as authAdapter, + discordAuth as discordAuthAdapter, +} from "@/v2/lib/auth/lucia" import { setCookie, getCookie } from "hono/cookie" import { getConnection } from "@/v2/db/turso" +import { socialsConnections } from "@/v2/db/schema" export async function loginWithDiscord(c: APIContext): Promise { - const curr_auth = await auth(c.env) - const session = auth(c.env).handleRequest(c).validate() + const auth = await authAdapter(c.env) + const session = authAdapter(c.env).handleRequest(c).validate() if (session) { c.status(200) return c.json({ success: false, state: "already logged in" }) } - const discord_auth = await discordAuth(curr_auth, c.env) - const [url, state] = await discord_auth.getAuthorizationUrl() + const discordAuth = await discordAuthAdapter(auth, c.env) + const [url, state] = await discordAuth.getAuthorizationUrl() // set state cookie for validation setCookie(c, "discord_oauth_state", state, { @@ -36,11 +40,11 @@ export async function discordCallback(c: APIContext): Promise { return c.json({ success: false, state: "missing parameters" }) } - const curr_auth = await auth(c.env) - const discord_auth = await discordAuth(curr_auth, c.env) + const auth = await authAdapter(c.env) + const discordAuth = await discordAuthAdapter(auth, c.env) const { getExistingUser, discordUser, createUser, createKey } = - await discord_auth.validateCallback(code) + await discordAuth.validateCallback(code) const getDiscordUser = async () => { const existingUser = await getExistingUser() @@ -63,24 +67,40 @@ export async function discordCallback(c: APIContext): Promise { const drizzle = getConnection(c.env).drizzle - // TODO: users can set discord ID manually, as they may have a different email, etc. const userWithEmail = await drizzle.query.users.findFirst({ where: (users, { eq }) => eq(users.email, discordUser.email), }) - // if user exists, create a key for them and update their email_verified attribute + // if user exists, we create a key for them and update their email_verified attribute if (userWithEmail) { - // @ts-expect-error, this is valid and i don't feel like doing wizardry to make it work - const user = curr_auth.transformDatabaseUser(userWithEmail) + // check if user with same email has a discord id set as a social connection + const getUsersConnections = + await drizzle.query.socialsConnections.findFirst({ + where: (socialsConnections, { eq }) => + eq(socialsConnections.userId, userWithEmail.id), + }) + + if ( + getUsersConnections && + getUsersConnections.discordId !== discordUser.id + ) { + throw new Error( + "user with same email has a different discord id set as a social connection" + ) + } + + // @ts-expect-error, this is valid, i don't feel like doing wizardry to make it work + const user = auth.transformDatabaseUser(userWithEmail) await createKey(user.userId) - await curr_auth.updateUserAttributes(user.userId, { + await auth.updateUserAttributes(user.userId, { email_verified: 1, }) return user } // if user doesn't exist, create it based off their discord info - return createUser({ + + const createdUser = await createUser({ attributes: { username: discordUser.username, email: discordUser.email, @@ -97,11 +117,23 @@ export async function discordCallback(c: APIContext): Promise { bio: "No bio set", }, }) + + // add discord id as a social connection + await drizzle + .insert(socialsConnections) + .values({ + id: `${createdUser.userId}`, + userId: createdUser.userId, + discordId: discordUser.id, + }) + .execute() + + return createdUser } const user = await getDiscordUser() - const session = await curr_auth.createSession({ + const session = await auth.createSession({ userId: user.userId, attributes: { country_code: c.req.header("cf-ipcountry") ?? "", From a51e2deb84541833f47d42b725aa6d11bb407fa0 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Fri, 29 Sep 2023 06:33:13 +0100 Subject: [PATCH 096/318] fix discord user transformn --- src/v2/routes/auth/login-methods/discord.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/v2/routes/auth/login-methods/discord.ts b/src/v2/routes/auth/login-methods/discord.ts index 53bcf9d..2e9daac 100644 --- a/src/v2/routes/auth/login-methods/discord.ts +++ b/src/v2/routes/auth/login-methods/discord.ts @@ -89,8 +89,7 @@ export async function discordCallback(c: APIContext): Promise { ) } - // @ts-expect-error, this is valid, i don't feel like doing wizardry to make it work - const user = auth.transformDatabaseUser(userWithEmail) + const user = await auth.getUser(userWithEmail.id) await createKey(user.userId) await auth.updateUserAttributes(user.userId, { email_verified: 1, From d069bb0184146558583917897afe8c77927e5037 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Thu, 5 Oct 2023 03:28:24 +0100 Subject: [PATCH 097/318] improve discord callback error handling & flow --- src/v2/routes/auth/login-methods/discord.ts | 26 ++++++++++----------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/v2/routes/auth/login-methods/discord.ts b/src/v2/routes/auth/login-methods/discord.ts index 2e9daac..7b9af01 100644 --- a/src/v2/routes/auth/login-methods/discord.ts +++ b/src/v2/routes/auth/login-methods/discord.ts @@ -54,15 +54,12 @@ export async function discordCallback(c: APIContext): Promise { } // check if discord user exists && they have a verified email - if ( - !discordUser || - discordUser.bot || - !discordUser.email || - !discordUser.verified - ) { - throw new Error( - "discord user doesn't exist or doesn't have a valid email" - ) + if (!discordUser || discordUser.bot) { + throw new Error("discord user is invalid email") + } + + if (!discordUser.email || !discordUser.verified) { + throw new Error("discord user doesnt have a verified email") } const drizzle = getConnection(c.env).drizzle @@ -90,15 +87,18 @@ export async function discordCallback(c: APIContext): Promise { } const user = await auth.getUser(userWithEmail.id) + await createKey(user.userId) - await auth.updateUserAttributes(user.userId, { - email_verified: 1, - }) + if (user.emailVerified !== 1) { + await auth.updateUserAttributes(user.userId, { + email_verified: 1, + }) + } + return user } // if user doesn't exist, create it based off their discord info - const createdUser = await createUser({ attributes: { username: discordUser.username, From 827a65e7de70e9710aa0b48faccd9c1b2fe0598b Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 8 Oct 2023 06:05:33 +0100 Subject: [PATCH 098/318] remove session from db schema --- src/v2/db/schema.ts | 59 +++++++++++++++++++++++---------------------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index a005045..ec3e9a7 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -35,27 +35,28 @@ export const users = sqliteTable( } ) -export const sessions = sqliteTable( - tableNames.authSession, - { - id: text("id").primaryKey(), - userId: text("user_id") - .notNull() - .references(() => users.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - activeExpires: integer("active_expires").notNull(), - idleExpires: integer("idle_expires").notNull(), - userAgent: text("user_agent").notNull(), - countryCode: text("country_code").notNull(), - }, - (session) => { - return { - userIdx: uniqueIndex("session_user_id_idx").on(session.userId), - } - } -) +// NOTE: sessions are now managed by CF KV instead of SQLite DB +// export const sessions = sqliteTable( +// tableNames.authSession, +// { +// id: text("id").primaryKey(), +// userId: text("user_id") +// .notNull() +// .references(() => users.id, { +// onUpdate: "cascade", +// onDelete: "cascade", +// }), +// activeExpires: integer("active_expires").notNull(), +// idleExpires: integer("idle_expires").notNull(), +// userAgent: text("user_agent").notNull(), +// countryCode: text("country_code").notNull(), +// }, +// (session) => { +// return { +// userIdx: uniqueIndex("session_user_id_idx").on(session.userId), +// } +// } +// ) export const keys = sqliteTable( tableNames.authKey, @@ -503,12 +504,12 @@ export const userFavoritesAssetsRelations = relations( }) ) -export const sessionsRelations = relations(sessions, ({ one }) => ({ - user: one(users, { - fields: [sessions.userId], - references: [users.id], - }), -})) +// export const sessionsRelations = relations(sessions, ({ one }) => ({ +// user: one(users, { +// fields: [sessions.userId], +// references: [users.id], +// }), +// })) export const keysRelations = relations(keys, ({ one }) => ({ user: one(users, { @@ -528,7 +529,7 @@ export const socialsConnectionsRelations = relations( ) export const usersRelations = relations(users, ({ one, many }) => ({ - session: many(sessions), + // session: many(sessions), key: many(keys), assets: many(assets), follower: many(follower), @@ -550,7 +551,7 @@ export type AssetTagsAsset = typeof assetTagsAssets.$inferSelect // user types export type User = typeof users.$inferSelect -export type Session = typeof sessions.$inferSelect +// export type Session = typeof sessions.$inferSelect export type Key = typeof keys.$inferSelect export type SocialsConnection = typeof socialsConnections.$inferSelect export type Following = typeof following.$inferSelect From 4902686033a197d2a826fbec7e267b0296e5a4ed Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Tue, 10 Oct 2023 03:53:40 +0100 Subject: [PATCH 099/318] what am i reading --- src/v2/db/schema.ts | 8 ++++---- src/v2/lib/helpers/assetStatus.ts | 6 ------ src/v2/lib/listBucket.ts | 1 + src/v2/routes/asset/getAssetFromId.ts | 2 ++ src/v2/routes/auth/assets/modifyAsset.ts | 3 +-- src/v2/routes/auth/login-methods/discord.ts | 2 +- src/v2/routes/auth/signup.ts | 2 -- src/v2/routes/search/all/searchAll.ts | 8 ++++++++ src/v2/routes/search/user/getUsersBySearch.ts | 1 + src/worker-configuration.d.ts | 4 +--- 10 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index ec3e9a7..930cb0c 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -105,8 +105,8 @@ export const games = sqliteTable( tableNames.games, { id: text("id").primaryKey(), - name: text("name").notNull(), - formattedName: text("formatted_name").notNull(), + name: text("name").notNull(), // e.g genshin-impact, honkai-impact-3rd + formattedName: text("formatted_name").notNull(), // e.g Genshin Impact, Honkai Impact 3rd assetCount: integer("asset_count").default(0), lastUpdated: integer("last_updated").notNull(), }, @@ -122,8 +122,8 @@ export const assetCategories = sqliteTable( tableNames.assetCategories, { id: text("id").primaryKey(), - name: text("name").notNull(), // e.g genshin-impact, honkai-impact-3rd - formattedName: text("formatted_name").notNull(), // e.g Genshin Impact, Honkai Impact 3rd + name: text("name").notNull(), // e.g tcg-sheets, splash-art + formattedName: text("formatted_name").notNull(), // e.g TCG Sheets, Splash Art assetCount: integer("asset_count").default(0).notNull(), lastUpdated: integer("last_updated").notNull(), }, diff --git a/src/v2/lib/helpers/assetStatus.ts b/src/v2/lib/helpers/assetStatus.ts index 74bdd9d..3a7c33d 100644 --- a/src/v2/lib/helpers/assetStatus.ts +++ b/src/v2/lib/helpers/assetStatus.ts @@ -1,13 +1,7 @@ -/** - * An object containing the possible status values for assets, as it's stored as an integer inside the database. - */ export const AssetStatus = { 1: "APPROVED", 2: "PENDING", 3: "FLAGGED", } -/** - * An object containing the possible status values for assets, as it's stored as an integer inside the database. - */ export type AssetStatusValue = keyof typeof AssetStatus diff --git a/src/v2/lib/listBucket.ts b/src/v2/lib/listBucket.ts index b24e110..19b572b 100644 --- a/src/v2/lib/listBucket.ts +++ b/src/v2/lib/listBucket.ts @@ -1,3 +1,4 @@ +// i dont even know why this is a thing export const listBucket = async (bucket: Bindings["FILES_BUCKET"], options) => { return await bucket.list(options) } diff --git a/src/v2/routes/asset/getAssetFromId.ts b/src/v2/routes/asset/getAssetFromId.ts index 628cc25..eeb9f0f 100644 --- a/src/v2/routes/asset/getAssetFromId.ts +++ b/src/v2/routes/asset/getAssetFromId.ts @@ -40,6 +40,8 @@ export async function getAssetFromId(c: APIContext): Promise { return response } + await drizzle.update(assets).set({ viewCount: asset.viewCount + 1 }) + const similarAssets = await drizzle.query.assets.findMany({ where: (assets, { eq, and }) => and( diff --git a/src/v2/routes/auth/assets/modifyAsset.ts b/src/v2/routes/auth/assets/modifyAsset.ts index 3034c46..7953581 100644 --- a/src/v2/routes/auth/assets/modifyAsset.ts +++ b/src/v2/routes/auth/assets/modifyAsset.ts @@ -5,7 +5,6 @@ import { eq } from "drizzle-orm" import { auth } from "@/v2/lib/auth/lucia" import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" -import { SplitQueryByCommas } from "@/v2/lib/helpers/splitQueryByCommas" export async function modifyAssetData(c: APIContext): Promise { const { assetIdToModify } = c.req.param() @@ -57,7 +56,7 @@ export async function modifyAssetData(c: APIContext): Promise { name: formData.get("name") as string | null, game: formData.get("game") as string | null, assetCategory: formData.get("assetCategory") as string | null, - tags: SplitQueryByCommas(formData.get("tags") as string | null), + // tags: SplitQueryByCommas(formData.get("tags") as string | null), } Object.keys(metadata).forEach( diff --git a/src/v2/routes/auth/login-methods/discord.ts b/src/v2/routes/auth/login-methods/discord.ts index 7b9af01..4269ac6 100644 --- a/src/v2/routes/auth/login-methods/discord.ts +++ b/src/v2/routes/auth/login-methods/discord.ts @@ -68,7 +68,7 @@ export async function discordCallback(c: APIContext): Promise { where: (users, { eq }) => eq(users.email, discordUser.email), }) - // if user exists, we create a key for them and update their email_verified attribute + // if user exists, we create a discord key for them and update their email_verified attribute if (userWithEmail) { // check if user with same email has a discord id set as a social connection const getUsersConnections = diff --git a/src/v2/routes/auth/signup.ts b/src/v2/routes/auth/signup.ts index 5304622..7c9bb63 100644 --- a/src/v2/routes/auth/signup.ts +++ b/src/v2/routes/auth/signup.ts @@ -1,7 +1,5 @@ import { auth } from "@/v2/lib/auth/lucia" -// import * as validate from "@/v2/lib/regex/accountValidation"; - export async function signup(c: APIContext): Promise { const formData = await c.req.formData() diff --git a/src/v2/routes/search/all/searchAll.ts b/src/v2/routes/search/all/searchAll.ts index b23cf4b..1b0cc00 100644 --- a/src/v2/routes/search/all/searchAll.ts +++ b/src/v2/routes/search/all/searchAll.ts @@ -23,6 +23,7 @@ export async function searchAll(c: APIContext): Promise { if (response) return response const drizzle = getConnection(c.env).drizzle + // this is a disaster // https://cdn.discordapp.com/attachments/1102306276832202813/1147291827699986572/F.gif const usersResponse = await drizzle.query.users.findMany({ where: (users) => { @@ -32,30 +33,35 @@ export async function searchAll(c: APIContext): Promise { email: false, emailVerified: false, }, + limit: 25, }) const assetCategoryResponse = await drizzle.query.assetCategories.findMany({ where: (assetCategories) => { return like(assetCategories.name, `%${query}%`) }, + limit: 25, }) const assetTagsResponse = await drizzle.query.assetTags.findMany({ where: (assetTags) => { return like(assetTags.name, `%${query}%`) }, + limit: 25, }) const assetsResponse = await drizzle.query.assets.findMany({ where: (assets) => { return like(assets.name, `%${query}%`) }, + limit: 25, }) const gamesResponse = await drizzle.query.games.findMany({ where: (games) => { return like(games.name, `%${query}%`) }, + limit: 25, }) const savedOcGeneratorsResponse = @@ -70,6 +76,7 @@ export async function searchAll(c: APIContext): Promise { like(savedOcGenerators.name, `%${query}%`) ) }, + limit: 25, }) const collectionsResponse = await drizzle.query.userCollections.findMany({ @@ -82,6 +89,7 @@ export async function searchAll(c: APIContext): Promise { like(userCollections.name, `%${query}%`) ) }, + limit: 25, }) response = c.json( diff --git a/src/v2/routes/search/user/getUsersBySearch.ts b/src/v2/routes/search/user/getUsersBySearch.ts index 5e58c90..69453bf 100644 --- a/src/v2/routes/search/user/getUsersBySearch.ts +++ b/src/v2/routes/search/user/getUsersBySearch.ts @@ -18,6 +18,7 @@ export async function getUsersBySearch(c: APIContext): Promise { email: false, emailVerified: false, }, + limit: 25, }) if (!userList) { diff --git a/src/worker-configuration.d.ts b/src/worker-configuration.d.ts index 6327962..3c9d6b3 100644 --- a/src/worker-configuration.d.ts +++ b/src/worker-configuration.d.ts @@ -7,7 +7,7 @@ declare global { DISCORD_TOKEN: string FILES_BUCKET: R2Bucket KV_SESSION_STORAGE: KVNamespace - ENVIRONMENT: string + ENVIRONMENT: string // should be "DEV", "PROD" VERY_SECRET_SIGNUP_KEY: string TURSO_DATABASE_URL: string TURSO_DATABASE_AUTH_TOKEN: string @@ -18,8 +18,6 @@ declare global { /** * The `APIContext` type is used to provide access to the request context within routes that are separated into individual functions. - * It is defined as a global type in the `globals.d.ts` file and includes properties for the request object, environment variables, and response methods. - * @template Bindings - The shape of the environment variables that are used by the application. */ type APIContext = import("hono").Context<{ Bindings: Bindings From d6ca907bbc2cb45e5a95015c1d7d86a1820fe030 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Tue, 10 Oct 2023 04:20:35 +0100 Subject: [PATCH 100/318] cleanup response codes,; validate oc gen data --- src/index.ts | 21 ++++--- .../lib/helpers/responses/notFoundResponse.ts | 1 - src/v2/lib/types/oc-generator.ts | 6 ++ src/v2/routes/asset/downloadAsset.ts | 10 ++-- src/v2/routes/asset/getAssetFromId.ts | 28 +++++---- .../asset-categories/createAssetCategory.ts | 30 +++++----- .../asset-categories/deleteAssetCategory.ts | 21 ++++--- src/v2/routes/auth/assets/approveAsset.ts | 11 ++-- .../collections/addAssetToCollection.ts | 40 +++++++------ .../collections/createAssetCollection.ts | 42 +++++++------ .../collections/deleteAssetCollection.ts | 24 ++++---- .../collections/deleteAssetFromCollection.ts | 43 +++++++------ .../assets/collections/viewAssetCollection.ts | 27 +++++---- .../collections/viewAssetCollections.ts | 20 +++---- .../auth/assets/favorite/addFavoriteAsset.ts | 7 ++- .../assets/favorite/removeFavoriteAsset.ts | 20 +++---- .../assets/favorite/viewFavoriteAssets.ts | 12 ++-- src/v2/routes/auth/assets/modifyAsset.ts | 21 ++++--- src/v2/routes/auth/assets/uploadAsset.ts | 12 ++-- src/v2/routes/auth/games/createGame.ts | 12 ++-- src/v2/routes/auth/games/deleteGame.ts | 18 +++--- src/v2/routes/auth/login-methods/discord.ts | 7 +-- src/v2/routes/auth/login.ts | 6 +- src/v2/routes/auth/logout.ts | 6 +- .../deleteOCGeneratorResponse.ts | 19 +++--- .../oc-generators/saveOCGeneratorResponse.ts | 60 +++++++++++++++++-- .../oc-generators/viewOCGeneratorResponses.ts | 17 +++--- src/v2/routes/auth/tags/createTag.ts | 18 +++--- src/v2/routes/auth/validate.ts | 6 +- src/v2/routes/search/user/getUsersBySearch.ts | 28 +++++---- 30 files changed, 330 insertions(+), 263 deletions(-) create mode 100644 src/v2/lib/types/oc-generator.ts diff --git a/src/index.ts b/src/index.ts index 27f9f46..8fb30e7 100644 --- a/src/index.ts +++ b/src/index.ts @@ -10,15 +10,16 @@ import { getRuntimeKey } from "hono/adapter" const app = new Hono<{ Bindings: Bindings }>() app.get("/status", (c) => { - c.status(200) - return c.json({ - status: "ok", - runtime: getRuntimeKey(), - }) + return c.json( + { + status: "ok", + runtime: getRuntimeKey(), + }, + 200 + ) }) app.get("/", (c) => { - c.status(200) - return c.json({ success: "true", status: "ok", routes: app.routes }) + return c.json({ success: "true", status: "ok", routes: app.routes }, 200) }) app.route("/v2/asset", assetRoute) app.route("/v2/discord", discordRoute) @@ -27,8 +28,10 @@ app.route("/v2/search", searchRoute) app.route("/v2/games", gamesRoute) app.route("/v2/auth", authRoute) app.all("*", (c) => { - c.status(404) - return c.json({ success: false, status: "error", error: "Not Found" }) + return c.json( + { success: false, status: "error", error: "route doesn't exist" }, + 404 + ) }) // https://hono.dev/api/hono#showroutes diff --git a/src/v2/lib/helpers/responses/notFoundResponse.ts b/src/v2/lib/helpers/responses/notFoundResponse.ts index 97f1fa7..509ad5a 100644 --- a/src/v2/lib/helpers/responses/notFoundResponse.ts +++ b/src/v2/lib/helpers/responses/notFoundResponse.ts @@ -1,6 +1,5 @@ // helper function to create a 404 Not Found response export function createNotFoundResponse(c, errorMessage, responseHeaders) { - c.status(200) return c.json( { success: false, diff --git a/src/v2/lib/types/oc-generator.ts b/src/v2/lib/types/oc-generator.ts new file mode 100644 index 0000000..00fc1c1 --- /dev/null +++ b/src/v2/lib/types/oc-generator.ts @@ -0,0 +1,6 @@ +export type OCGeneratorResponse = { + options: { + name: string + entries: string[] + }[] +} diff --git a/src/v2/routes/asset/downloadAsset.ts b/src/v2/routes/asset/downloadAsset.ts index c1b9347..9a44efe 100644 --- a/src/v2/routes/asset/downloadAsset.ts +++ b/src/v2/routes/asset/downloadAsset.ts @@ -12,8 +12,7 @@ export async function downloadAsset(c: APIContext): Promise { }) if (!asset) { - c.status(200) - return c.json({ success: false, state: "asset not found" }) + return c.json({ success: false, state: "asset not found" }, 200) } try { @@ -23,9 +22,10 @@ export async function downloadAsset(c: APIContext): Promise { .where(eq(assets.id, parseInt(assetId))) .execute() } catch (e) { - console.error(e) - c.status(500) - return c.json({ success: false, state: "failed to download asset" }) + return c.json( + { success: false, state: "failed to download asset" }, + 500 + ) } const response = await fetch(asset[0].url) diff --git a/src/v2/routes/asset/getAssetFromId.ts b/src/v2/routes/asset/getAssetFromId.ts index eeb9f0f..847cb66 100644 --- a/src/v2/routes/asset/getAssetFromId.ts +++ b/src/v2/routes/asset/getAssetFromId.ts @@ -31,11 +31,13 @@ export async function getAssetFromId(c: APIContext): Promise { }) if (!asset) { - c.status(200) - response = c.json({ - success: false, - status: "not found", - }) + response = c.json( + { + success: false, + status: "not found", + }, + 200 + ) await cache.put(cacheKey, response.clone()) return response } @@ -52,13 +54,15 @@ export async function getAssetFromId(c: APIContext): Promise { orderBy: desc(assets.id), }) - c.status(200) - response = c.json({ - success: true, - status: "ok", - asset, - similarAssets, - }) + response = c.json( + { + success: true, + status: "ok", + asset, + similarAssets, + }, + 200 + ) response.headers.set("Cache-Control", "s-maxage=604800") await cache.put(cacheKey, response.clone()) diff --git a/src/v2/routes/auth/asset-categories/createAssetCategory.ts b/src/v2/routes/auth/asset-categories/createAssetCategory.ts index 974a91b..35788c0 100644 --- a/src/v2/routes/auth/asset-categories/createAssetCategory.ts +++ b/src/v2/routes/auth/asset-categories/createAssetCategory.ts @@ -13,15 +13,13 @@ export async function createAssetCategory(c: APIContext): Promise { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) } - c.status(401) - return c.json({ success: false, state: "unauthorized" }) + return c.json({ success: false, state: "unauthorized" }, 401) } const roleFlags = roleFlagsToArray(session.user.roleFlags) if (!roleFlags.includes("CREATOR")) { - c.status(401) - return c.json({ success: false, state: "unauthorized" }) + return c.json({ success: false, state: "unauthorized" }, 401) } const drizzle = getConnection(c.env).drizzle @@ -43,21 +41,25 @@ export async function createAssetCategory(c: APIContext): Promise { }) if (assetCategoryExists) { - c.status(200) - return c.json({ - success: false, - state: "assetCategory with name already exists", - }) + return c.json( + { + success: false, + state: "assetCategory with name already exists", + }, + 200 + ) } try { await drizzle.insert(assetCategories).values(assetCategory).execute() } catch (e) { - c.status(500) - return c.json({ - success: false, - state: "failed to create assetCategory", - }) + return c.json( + { + success: false, + state: "failed to create assetCategory", + }, + 500 + ) } return c.json( diff --git a/src/v2/routes/auth/asset-categories/deleteAssetCategory.ts b/src/v2/routes/auth/asset-categories/deleteAssetCategory.ts index 80e3f87..7a4eeec 100644 --- a/src/v2/routes/auth/asset-categories/deleteAssetCategory.ts +++ b/src/v2/routes/auth/asset-categories/deleteAssetCategory.ts @@ -14,15 +14,13 @@ export async function deleteAssetCategory(c: APIContext): Promise { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) } - c.status(401) - return c.json({ success: false, state: "unauthorized" }) + return c.json({ success: false, state: "unauthorized" }, 401) } const roleFlags = roleFlagsToArray(session.user.roleFlags) if (!roleFlags.includes("CREATOR")) { - c.status(401) - return c.json({ success: false, state: "unauthorized" }) + return c.json({ success: false, state: "unauthorized" }, 401) } const drizzle = getConnection(c.env).drizzle @@ -34,8 +32,7 @@ export async function deleteAssetCategory(c: APIContext): Promise { } if (!assetCategory.id) { - c.status(200) - return c.json({ success: false, state: "no id entered" }) + return c.json({ success: false, state: "no id entered" }, 200) } // check if assetCategory exists @@ -45,11 +42,13 @@ export async function deleteAssetCategory(c: APIContext): Promise { }) if (!assetCategoryExists) { - c.status(200) - return c.json({ - success: false, - state: "assetCategory with ID doesn't exist", - }) + return c.json( + { + success: false, + state: "assetCategory with ID doesn't exist", + }, + 200 + ) } try { diff --git a/src/v2/routes/auth/assets/approveAsset.ts b/src/v2/routes/auth/assets/approveAsset.ts index c6c1e2c..7dfa0e6 100644 --- a/src/v2/routes/auth/assets/approveAsset.ts +++ b/src/v2/routes/auth/assets/approveAsset.ts @@ -16,15 +16,13 @@ export async function approveAsset(c: APIContext): Promise { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) } - c.status(401) return c.json({ success: false, state: "unauthorized" }, 401) } const roleFlags = roleFlagsToArray(session.user.roleFlags) if (!roleFlags.includes("CREATOR")) { - c.status(401) - return c.json({ success: false, state: "unauthorized" }) + return c.json({ success: false, state: "unauthorized" }, 401) } const drizzle = getConnection(c.env).drizzle @@ -34,8 +32,10 @@ export async function approveAsset(c: APIContext): Promise { }) if (!asset || asset.status === 1) { - c.status(404) - c.json({ success: false, state: "asset not found or already approved" }) + c.json( + { success: false, state: "asset not found or already approved" }, + 200 + ) } const updatedAsset = await drizzle @@ -46,7 +46,6 @@ export async function approveAsset(c: APIContext): Promise { .where(eq(assets.id, parseInt(assetIdToApprove))) .execute() - c.status(200) return c.json( { success: true, diff --git a/src/v2/routes/auth/assets/collections/addAssetToCollection.ts b/src/v2/routes/auth/assets/collections/addAssetToCollection.ts index 00812da..61a6df3 100644 --- a/src/v2/routes/auth/assets/collections/addAssetToCollection.ts +++ b/src/v2/routes/auth/assets/collections/addAssetToCollection.ts @@ -14,8 +14,7 @@ export async function addAssetToCollection(c: APIContext): Promise { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) } - c.status(401) - return c.json({ success: false, state: "invalid session" }) + return c.json({ success: false, state: "invalid session" }, 401) } const formData = await c.req.formData() @@ -26,13 +25,14 @@ export async function addAssetToCollection(c: APIContext): Promise { } if (!collection.id) { - c.status(200) - return c.json({ success: false, state: "no collection id entered" }) + return c.json( + { success: false, state: "no collection id entered" }, + 200 + ) } if (!collection.assetId) { - c.status(401) - return c.json({ success: false, state: "no asset id entered" }) + return c.json({ success: false, state: "no asset id entered" }, 200) } // check if collection exists @@ -42,11 +42,13 @@ export async function addAssetToCollection(c: APIContext): Promise { }) if (!collectionExists) { - c.status(200) - return c.json({ - success: false, - state: "collection with ID doesn't exist", - }) + return c.json( + { + success: false, + state: "collection with ID doesn't exist", + }, + 200 + ) } // check if asset exists, and status is 1 (approved) @@ -59,8 +61,7 @@ export async function addAssetToCollection(c: APIContext): Promise { }) if (!assetExists) { - c.status(200) - return c.json({ success: false, state: "asset not found" }) + return c.json({ success: false, state: "asset not found" }, 200) } // check if userCollectionAssets exists @@ -77,11 +78,13 @@ export async function addAssetToCollection(c: APIContext): Promise { }) if (userCollectionAssetsExists) { - c.status(200) - return c.json({ - success: false, - state: "asset already exists in collection", - }) + return c.json( + { + success: false, + state: "asset already exists in collection", + }, + 200 + ) } // create entry in userCollectionAssets @@ -95,7 +98,6 @@ export async function addAssetToCollection(c: APIContext): Promise { }) .execute() } catch (e) { - c.status(500) return c.json( { success: false, state: "failed to add asset to collection" }, 500 diff --git a/src/v2/routes/auth/assets/collections/createAssetCollection.ts b/src/v2/routes/auth/assets/collections/createAssetCollection.ts index ad5bb6e..34746ba 100644 --- a/src/v2/routes/auth/assets/collections/createAssetCollection.ts +++ b/src/v2/routes/auth/assets/collections/createAssetCollection.ts @@ -14,8 +14,7 @@ export async function createAssetCollection(c: APIContext): Promise { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) } - c.status(401) - return c.json({ success: false, state: "invalid session" }) + return c.json({ success: false, state: "invalid session" }, 401) } const formData = await c.req.formData() @@ -26,16 +25,20 @@ export async function createAssetCollection(c: APIContext): Promise { } if (!collection.name) { - c.status(200) - return c.json({ success: false, state: "no collection name entered" }) + return c.json( + { success: false, state: "no collection name entered" }, + 200 + ) } if (!collection.description) { - c.status(200) - return c.json({ - success: false, - state: "no collection description entered", - }) + return c.json( + { + success: false, + state: "no collection description entered", + }, + 200 + ) } // check if collection exists @@ -45,11 +48,13 @@ export async function createAssetCollection(c: APIContext): Promise { }) if (collectionExists) { - c.status(200) - return c.json({ - success: false, - state: "collection with name already exists", - }) + return c.json( + { + success: false, + state: "collection with name already exists", + }, + 200 + ) } // create entry in userCollections @@ -66,10 +71,11 @@ export async function createAssetCollection(c: APIContext): Promise { }) .execute() } catch (e) { - c.status(200) - return c.json({ success: false, state: "failed to create collection" }) + return c.json( + { success: false, state: "failed to create collection" }, + 200 + ) } - c.status(200) - return c.json({ success: true, state: "created collection" }) + return c.json({ success: true, state: "created collection" }, 200) } diff --git a/src/v2/routes/auth/assets/collections/deleteAssetCollection.ts b/src/v2/routes/auth/assets/collections/deleteAssetCollection.ts index d314111..492d6c3 100644 --- a/src/v2/routes/auth/assets/collections/deleteAssetCollection.ts +++ b/src/v2/routes/auth/assets/collections/deleteAssetCollection.ts @@ -15,8 +15,7 @@ export async function deleteAssetCollection(c: APIContext): Promise { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) } - c.status(401) - return c.json({ success: false, state: "invalid session" }) + return c.json({ success: false, state: "invalid session" }, 401) } const formData = await c.req.formData() @@ -26,8 +25,10 @@ export async function deleteAssetCollection(c: APIContext): Promise { } if (!collection.id) { - c.status(200) - return c.json({ success: false, state: "no collection id entered" }) + return c.json( + { success: false, state: "no collection id entered" }, + 200 + ) } // check if collection exists @@ -37,11 +38,13 @@ export async function deleteAssetCollection(c: APIContext): Promise { }) if (!collectionExists) { - c.status(200) - return c.json({ - success: false, - state: "collection with ID doesn't exist", - }) + return c.json( + { + success: false, + state: "collection with ID doesn't exist", + }, + 200 + ) } // delete collection @@ -50,6 +53,5 @@ export async function deleteAssetCollection(c: APIContext): Promise { .where(eq(userCollections.id, collection.id)) .execute() - c.status(200) - return c.json({ success: true, state: "collection deleted" }) + return c.json({ success: true, state: "collection deleted" }, 200) } diff --git a/src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts b/src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts index 013f314..6ebe014 100644 --- a/src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts +++ b/src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts @@ -17,8 +17,7 @@ export async function deleteAssetFromCollection( await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) } - c.status(401) - return c.json({ success: false, state: "invalid session" }) + return c.json({ success: false, state: "invalid session" }, 401) } const formData = await c.req.formData() @@ -29,13 +28,14 @@ export async function deleteAssetFromCollection( } if (!collection.id) { - c.status(200) - return c.json({ success: false, state: "no collection id entered" }) + return c.json( + { success: false, state: "no collection id entered" }, + 200 + ) } if (!collection.assetId) { - c.status(401) - return c.json({ success: false, state: "no asset id entered" }) + return c.json({ success: false, state: "no asset id entered" }, 401) } // check if collection exists @@ -45,11 +45,13 @@ export async function deleteAssetFromCollection( }) if (!collectionExists) { - c.status(200) - return c.json({ - success: false, - state: "collection with ID doesn't exist", - }) + return c.json( + { + success: false, + state: "collection with ID doesn't exist", + }, + 200 + ) } // check if asset exists @@ -70,7 +72,6 @@ export async function deleteAssetFromCollection( }) if (!userCollectionAssetsExists) { - c.status(200) return c.json({ success: false, state: "asset not found in collection", @@ -83,13 +84,17 @@ export async function deleteAssetFromCollection( .where(eq(userCollectionAssets.id, userCollectionAssetsExists.id)) .execute() } catch (e) { - c.status(500) - return c.json({ - success: false, - state: "failed to delete asset from collection", - }) + return c.json( + { + success: false, + state: "failed to delete asset from collection", + }, + 500 + ) } - c.status(200) - return c.json({ success: true, state: "deleted asset from collection" }) + return c.json( + { success: true, state: "deleted asset from collection" }, + 200 + ) } diff --git a/src/v2/routes/auth/assets/collections/viewAssetCollection.ts b/src/v2/routes/auth/assets/collections/viewAssetCollection.ts index 1dd27f1..f5c67a6 100644 --- a/src/v2/routes/auth/assets/collections/viewAssetCollection.ts +++ b/src/v2/routes/auth/assets/collections/viewAssetCollection.ts @@ -12,8 +12,7 @@ export async function viewAssetCollection(c: APIContext): Promise { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) } - c.status(401) - return c.json({ success: false, state: "invalid session" }) + return c.json({ success: false, state: "invalid session" }, 401) } const formData = await c.req.formData() @@ -23,8 +22,10 @@ export async function viewAssetCollection(c: APIContext): Promise { } if (!collection.id) { - c.status(200) - return c.json({ success: false, state: "no collection id entered" }) + return c.json( + { success: false, state: "no collection id entered" }, + 200 + ) } // check if the user owns the collection, or if the collection is public @@ -40,11 +41,13 @@ export async function viewAssetCollection(c: APIContext): Promise { ), }) } catch (e) { - c.status(200) - return c.json({ - success: false, - state: "collection with ID doesn't exist", - }) + return c.json( + { + success: false, + state: "collection with ID doesn't exist", + }, + 200 + ) } const assetCollection = await drizzle.query.userCollections.findFirst({ @@ -65,6 +68,8 @@ export async function viewAssetCollection(c: APIContext): Promise { }, }) - c.status(200) - return c.json({ success: true, state: "found collection", assetCollection }) + return c.json( + { success: true, state: "found collection", assetCollection }, + 200 + ) } diff --git a/src/v2/routes/auth/assets/collections/viewAssetCollections.ts b/src/v2/routes/auth/assets/collections/viewAssetCollections.ts index e42b6fb..e4b2cbc 100644 --- a/src/v2/routes/auth/assets/collections/viewAssetCollections.ts +++ b/src/v2/routes/auth/assets/collections/viewAssetCollections.ts @@ -12,8 +12,7 @@ export async function viewAssetCollections(c: APIContext): Promise { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) } - c.status(401) - return c.json({ success: false, state: "invalid session" }) + return c.json({ success: false, state: "invalid session" }, 401) } // check if userCollections exists @@ -25,8 +24,7 @@ export async function viewAssetCollections(c: APIContext): Promise { ) if (!userCollectionsExists) { - c.status(200) - return c.json({ success: false, state: "no collections found" }) + return c.json({ success: false, state: "no collections found" }, 200) } const assetCollection = await drizzle.query.userCollectionAssets.findMany({ @@ -37,10 +35,12 @@ export async function viewAssetCollections(c: APIContext): Promise { }, }) - c.status(200) - return c.json({ - success: true, - state: "found collections", - assetCollection, - }) + return c.json( + { + success: true, + state: "found collections", + assetCollection, + }, + 200 + ) } diff --git a/src/v2/routes/auth/assets/favorite/addFavoriteAsset.ts b/src/v2/routes/auth/assets/favorite/addFavoriteAsset.ts index 003fd4a..be3b749 100644 --- a/src/v2/routes/auth/assets/favorite/addFavoriteAsset.ts +++ b/src/v2/routes/auth/assets/favorite/addFavoriteAsset.ts @@ -80,13 +80,14 @@ export async function favoriteAsset(c: APIContext): Promise { assetId: parseInt(assetToFavorite), }) } catch (e) { - c.status(500) return c.json( { success: false, state: "failed to favorite asset" }, 500 ) } - c.status(200) - return c.json({ success: true, state: "favorited asset", assetToFavorite }) + return c.json( + { success: true, state: "favorited asset", assetToFavorite }, + 200 + ) } diff --git a/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts b/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts index 47df6c6..4f453d4 100644 --- a/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts +++ b/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts @@ -61,12 +61,14 @@ export async function removeFavoriteAsset(c: APIContext): Promise { }) if (!isFavorited) { - c.status(200) - return c.json({ - success: false, - state: "asset is not favorited, therefore cannot be removed", - assetToRemove, - }) + return c.json( + { + success: false, + state: "asset is not favorited, therefore cannot be removed", + assetToRemove, + }, + 200 + ) } // remove asset from userFavorites... @@ -81,10 +83,8 @@ export async function removeFavoriteAsset(c: APIContext): Promise { ) .execute() } catch (e) { - c.status(500) - return c.json({ success: false, state: "failed to remove asset" }) + return c.json({ success: false, state: "failed to remove asset" }, 500) } - c.status(200) - return c.json({ success: true, state: "removed asset", assetToRemove }) + return c.json({ success: true, state: "removed asset", assetToRemove }, 200) } diff --git a/src/v2/routes/auth/assets/favorite/viewFavoriteAssets.ts b/src/v2/routes/auth/assets/favorite/viewFavoriteAssets.ts index e19385e..9c85afb 100644 --- a/src/v2/routes/auth/assets/favorite/viewFavoriteAssets.ts +++ b/src/v2/routes/auth/assets/favorite/viewFavoriteAssets.ts @@ -12,8 +12,7 @@ export async function viewFavoriteAssets(c: APIContext): Promise { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) } - c.status(401) - return c.json({ success: false, state: "invalid session" }) + return c.json({ success: false, state: "invalid session" }, 401) } // check if userFavorites exists @@ -23,8 +22,7 @@ export async function viewFavoriteAssets(c: APIContext): Promise { }) if (!userFavoritesExists) { - c.status(200) - return c.json({ success: false, state: "no favorites found" }) + return c.json({ success: false, state: "no favorites found" }, 200) } const favoriteAssets = await drizzle.query.userFavoritesAssets.findMany({ @@ -35,6 +33,8 @@ export async function viewFavoriteAssets(c: APIContext): Promise { }, }) - c.status(200) - return c.json({ success: true, state: "found favorites", favoriteAssets }) + return c.json( + { success: true, state: "found favorites", favoriteAssets }, + 200 + ) } diff --git a/src/v2/routes/auth/assets/modifyAsset.ts b/src/v2/routes/auth/assets/modifyAsset.ts index 7953581..c5abd55 100644 --- a/src/v2/routes/auth/assets/modifyAsset.ts +++ b/src/v2/routes/auth/assets/modifyAsset.ts @@ -16,14 +16,12 @@ export async function modifyAssetData(c: APIContext): Promise { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) } - c.status(401) - return c.json({ success: false, state: "invalid session" }) + return c.json({ success: false, state: "invalid session" }, 401) } // return unauthorized if user is not a contributor if (session.user.isContributor === 0) { - c.status(401) - return c.json({ success: false, state: "unauthorized" }) + return c.json({ success: false, state: "unauthorized" }, 401) } const drizzle = getConnection(c.env).drizzle @@ -33,8 +31,7 @@ export async function modifyAssetData(c: APIContext): Promise { }) if (!asset) { - c.status(200) - return c.json({ success: false, state: "asset not found" }) + return c.json({ success: false, state: "asset not found" }, 200) } const roleFlags = roleFlagsToArray(session.user.roleFlags) @@ -43,11 +40,13 @@ export async function modifyAssetData(c: APIContext): Promise { asset.uploadedById !== session.user.userId || !roleFlags.includes("CREATOR") ) { - c.status(401) - return c.json({ - success: false, - state: "unauthorized to modify this asset", - }) + return c.json( + { + success: false, + state: "unauthorized to modify this asset", + }, + 401 + ) } const formData = await c.req.formData() diff --git a/src/v2/routes/auth/assets/uploadAsset.ts b/src/v2/routes/auth/assets/uploadAsset.ts index a490769..f5dc6e0 100644 --- a/src/v2/routes/auth/assets/uploadAsset.ts +++ b/src/v2/routes/auth/assets/uploadAsset.ts @@ -14,14 +14,12 @@ export async function uploadAsset(c: APIContext): Promise { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) } - c.status(401) - return c.json({ success: false, state: "unauthorized" }) + return c.json({ success: false, state: "unauthorized" }, 401) } // return unauthorized if user is not a contributor if (session.user.isContributor !== 1) { - c.status(401) - return c.json({ success: false, state: "unauthorized" }) + return c.json({ success: false, state: "unauthorized" }, 401) } const bypassApproval = session.user.isContributor === 1 @@ -108,10 +106,8 @@ export async function uploadAsset(c: APIContext): Promise { await c.env.FILES_BUCKET.delete( `/assets/${metadata.game}/${metadata.category}/${metadata.name}.${metadata.extension}` ) - c.status(500) - return c.json({ success: false, state: "failed to upload asset" }) + return c.json({ success: false, state: "failed to upload asset" }, 500) } - c.status(200) - return c.json({ success: true, state: "uploaded asset" }) + return c.json({ success: true, state: "uploaded asset" }, 200) } diff --git a/src/v2/routes/auth/games/createGame.ts b/src/v2/routes/auth/games/createGame.ts index 5582b29..93cb9f3 100644 --- a/src/v2/routes/auth/games/createGame.ts +++ b/src/v2/routes/auth/games/createGame.ts @@ -13,15 +13,13 @@ export async function createGame(c: APIContext): Promise { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) } - c.status(401) - return c.json({ success: false, state: "invalid session" }) + return c.json({ success: false, state: "invalid session" }, 401) } const roleFlags = roleFlagsToArray(session.user.roleFlags) if (!roleFlags.includes("CREATOR")) { - c.status(401) - return c.json({ success: false, state: "unauthorized" }) + return c.json({ success: false, state: "unauthorized" }, 401) } const drizzle = getConnection(c.env).drizzle @@ -51,10 +49,8 @@ export async function createGame(c: APIContext): Promise { try { await drizzle.insert(games).values(game).execute() } catch (e) { - c.status(500) - return c.json({ success: false, state: "failed to create game" }) + return c.json({ success: false, state: "failed to create game" }, 500) } - c.status(200) - return c.json({ success: true, state: "created game", game }) + return c.json({ success: true, state: "created game", game }, 200) } diff --git a/src/v2/routes/auth/games/deleteGame.ts b/src/v2/routes/auth/games/deleteGame.ts index f8e0c78..a6c418b 100644 --- a/src/v2/routes/auth/games/deleteGame.ts +++ b/src/v2/routes/auth/games/deleteGame.ts @@ -14,15 +14,13 @@ export async function deleteGame(c: APIContext): Promise { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) } - c.status(401) - return c.json({ success: false, state: "invalid session" }) + return c.json({ success: false, state: "invalid session" }, 401) } const roleFlags = roleFlagsToArray(session.user.roleFlags) if (!roleFlags.includes("CREATOR")) { - c.status(401) - return c.json({ success: false, state: "unauthorized" }) + return c.json({ success: false, state: "unauthorized" }, 401) } const drizzle = getConnection(c.env).drizzle @@ -43,17 +41,17 @@ export async function deleteGame(c: APIContext): Promise { }) if (!gameExists) { - c.status(404) - return c.json({ success: false, state: "game with ID doesn't exist" }) + return c.json( + { success: false, state: "game with ID doesn't exist" }, + 200 + ) } try { await drizzle.delete(games).where(eq(games.id, game.id)).execute() } catch (e) { - c.status(500) - return c.json({ success: false, state: "failed to delete game" }) + return c.json({ success: false, state: "failed to delete game" }, 500) } - c.status(200) - return c.json({ success: true, state: "deleted game", game }) + return c.json({ success: true, state: "deleted game", game }, 200) } diff --git a/src/v2/routes/auth/login-methods/discord.ts b/src/v2/routes/auth/login-methods/discord.ts index 4269ac6..a004d67 100644 --- a/src/v2/routes/auth/login-methods/discord.ts +++ b/src/v2/routes/auth/login-methods/discord.ts @@ -11,8 +11,7 @@ export async function loginWithDiscord(c: APIContext): Promise { const session = authAdapter(c.env).handleRequest(c).validate() if (session) { - c.status(200) - return c.json({ success: false, state: "already logged in" }) + return c.json({ success: false, state: "already logged in" }, 200) } const discordAuth = await discordAuthAdapter(auth, c.env) @@ -36,8 +35,7 @@ export async function discordCallback(c: APIContext): Promise { // check if state is valid if (!storedState || !state || storedState !== state || !code) { - c.status(400) - return c.json({ success: false, state: "missing parameters" }) + return c.json({ success: false, state: "missing parameters" }, 200) } const auth = await authAdapter(c.env) @@ -49,7 +47,6 @@ export async function discordCallback(c: APIContext): Promise { const getDiscordUser = async () => { const existingUser = await getExistingUser() if (existingUser) { - c.status(200) return existingUser } diff --git a/src/v2/routes/auth/login.ts b/src/v2/routes/auth/login.ts index a70c9a2..55e5e5b 100644 --- a/src/v2/routes/auth/login.ts +++ b/src/v2/routes/auth/login.ts @@ -16,8 +16,7 @@ export async function login(c: APIContext): Promise { const validSession = await auth(c.env).handleRequest(c).validate() if (validSession) { - c.status(200) - return c.json({ success: false, state: "already logged in" }) + return c.json({ success: false, state: "already logged in" }, 200) } const storedThrottling = usernameThrottling.get(username) @@ -78,6 +77,5 @@ export async function login(c: APIContext): Promise { const authRequest = await auth(c.env).handleRequest(c) authRequest.setSession(newSession) - c.status(200) - return c.json({ success: true, state: "logged in" }) + return c.json({ success: true, state: "logged in" }, 200) } diff --git a/src/v2/routes/auth/logout.ts b/src/v2/routes/auth/logout.ts index fee7c66..623d478 100644 --- a/src/v2/routes/auth/logout.ts +++ b/src/v2/routes/auth/logout.ts @@ -5,8 +5,7 @@ export async function logout(c: APIContext): Promise { const session = await authRequest.validate() if (!session) { - c.status(401) - return c.json({ success: false, state: "invalid session" }) + return c.json({ success: false, state: "invalid session" }, 401) } // this is useful to clean up dead sessions that are still in the database @@ -14,6 +13,5 @@ export async function logout(c: APIContext): Promise { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) - c.status(200) - return c.json({ success: true, state: "logged out" }) + return c.json({ success: true, state: "logged out" }, 200) } diff --git a/src/v2/routes/auth/oc-generators/deleteOCGeneratorResponse.ts b/src/v2/routes/auth/oc-generators/deleteOCGeneratorResponse.ts index 37ada7c..b7b6b32 100644 --- a/src/v2/routes/auth/oc-generators/deleteOCGeneratorResponse.ts +++ b/src/v2/routes/auth/oc-generators/deleteOCGeneratorResponse.ts @@ -15,8 +15,7 @@ export async function deleteOCGeneratorResponse( await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) } - c.status(401) - return c.json({ success: false, state: "unauthorized" }) + return c.json({ success: false, state: "unauthorized" }, 401) } const drizzle = getConnection(c.env).drizzle @@ -25,7 +24,7 @@ export async function deleteOCGeneratorResponse( const deleteID = (formData.get("deleteID") as string) || null if (!formData || !deleteID) - return c.json({ success: false, state: "no formdata provided" }) + return c.json({ success: false, state: "no formdata provided" }, 200) const ocGeneratorResponse = await drizzle .select() @@ -52,10 +51,12 @@ export async function deleteOCGeneratorResponse( ) ) - c.status(200) - return c.json({ - success: true, - state: `deleted saved oc generator with id ${deleteID}`, - ocGeneratorResponse, - }) + return c.json( + { + success: true, + state: `deleted saved oc generator with id ${deleteID}`, + ocGeneratorResponse, + }, + 200 + ) } diff --git a/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts b/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts index 6feb18c..98b402f 100644 --- a/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts +++ b/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts @@ -1,7 +1,39 @@ import { auth } from "@/v2/lib/auth/lucia" - +import { listBucket } from "@/v2/lib/listBucket" import { savedOcGenerators } from "@/v2/db/schema" import { getConnection } from "@/v2/db/turso" +import type { OCGeneratorResponse as OCGeneratorRequestResponse } from "@/v2/lib/types/oc-generator" + +// matches data from oc generator and random entries from oc generator to prevent mismatched data from being saved +function isValidOCGeneratorResponse( + content: string, + response: OCGeneratorRequestResponse +) { + try { + const parsedContent = JSON.parse(content) + + if (typeof parsedContent !== "object") return false + + for (const key of Object.keys(parsedContent)) { + const foundOption = response.options.find( + (option) => option.name === key + ) + + if (!foundOption || !Array.isArray(parsedContent[key])) return false + + if ( + !parsedContent[key].every((entry) => + foundOption.entries.includes(entry) + ) + ) + return false + } + + return true + } catch (error) { + return false + } +} export async function saveOCGeneratorResponse( c: APIContext @@ -14,8 +46,7 @@ export async function saveOCGeneratorResponse( await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) } - c.status(401) - return c.json({ success: false, state: "invalid session" }) + return c.json({ success: false, state: "invalid session" }, 401) } const drizzle = getConnection(c.env).drizzle @@ -33,8 +64,27 @@ export async function saveOCGeneratorResponse( content: formData.get("content") as string, // this is stored as json, which can then be parsed } + const files = await listBucket(c.env.FILES_BUCKET, { + prefix: `oc-generators/${ocGeneratorResponse.game}/list.json`, + }) + + if (files.objects.length === 0) + return c.json( + { success: false, state: "no oc generators with name found" }, + 200 + ) + + const ResponseData = await fetch( + `https://files.wanderer.moe/${files.objects[0].key}` + ).then((res) => res.json() as Promise) + + if (!isValidOCGeneratorResponse(ocGeneratorResponse.content, ResponseData)) + return c.json( + { success: false, state: "invalid data attempted to be saved" }, + 200 + ) + await drizzle.insert(savedOcGenerators).values(ocGeneratorResponse) - c.status(200) - return c.json({ success: true, state: "saved", ocGeneratorResponse }) + return c.json({ success: true, state: "saved", ocGeneratorResponse }, 200) } diff --git a/src/v2/routes/auth/oc-generators/viewOCGeneratorResponses.ts b/src/v2/routes/auth/oc-generators/viewOCGeneratorResponses.ts index a8b3fd0..f304cc9 100644 --- a/src/v2/routes/auth/oc-generators/viewOCGeneratorResponses.ts +++ b/src/v2/routes/auth/oc-generators/viewOCGeneratorResponses.ts @@ -15,8 +15,7 @@ export async function viewOCGeneratorResponses( await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) } - c.status(401) - return c.json({ success: false, state: "unauthorized" }) + return c.json({ success: false, state: "unauthorized" }, 401) } const drizzle = getConnection(c.env).drizzle @@ -26,10 +25,12 @@ export async function viewOCGeneratorResponses( .from(savedOcGenerators) .where(eq(savedOcGenerators.userId, session.user.userId)) - c.status(200) - return c.json({ - success: true, - state: "valid session", - ocGeneratorResponses, - }) + return c.json( + { + success: true, + state: "valid session", + ocGeneratorResponses, + }, + 401 + ) } diff --git a/src/v2/routes/auth/tags/createTag.ts b/src/v2/routes/auth/tags/createTag.ts index 74c7e83..7222618 100644 --- a/src/v2/routes/auth/tags/createTag.ts +++ b/src/v2/routes/auth/tags/createTag.ts @@ -13,15 +13,13 @@ export async function createTag(c: APIContext): Promise { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) } - c.status(401) - return c.json({ success: false, state: "invalid session" }) + return c.json({ success: false, state: "invalid session" }, 401) } const roleFlags = roleFlagsToArray(session.user.roleFlags) if (!roleFlags.includes("CREATOR")) { - c.status(401) - return c.json({ success: false, state: "unauthorized" }) + return c.json({ success: false, state: "unauthorized" }, 401) } const drizzle = getConnection(c.env).drizzle @@ -42,17 +40,17 @@ export async function createTag(c: APIContext): Promise { }) if (tagExists) { - c.status(200) - return c.json({ success: false, state: "tag with name already exists" }) + return c.json( + { success: false, state: "tag with name already exists" }, + 200 + ) } try { await drizzle.insert(assetTags).values(tag).execute() } catch (e) { - c.status(200) - return c.json({ success: false, state: "failed to create tag" }) + return c.json({ success: false, state: "failed to create tag" }, 200) } - c.status(200) - return c.json({ success: true, state: "created tag", tag }) + return c.json({ success: true, state: "created tag", tag }, 200) } diff --git a/src/v2/routes/auth/validate.ts b/src/v2/routes/auth/validate.ts index aef9082..d1672ce 100644 --- a/src/v2/routes/auth/validate.ts +++ b/src/v2/routes/auth/validate.ts @@ -12,8 +12,7 @@ export async function validate(c: APIContext): Promise { if (!session) { authRequest.setSession(null) - c.status(401) - return c.json({ success: false, state: "invalid session" }) + return c.json({ success: false, state: "invalid session" }, 401) } if ( @@ -24,8 +23,7 @@ export async function validate(c: APIContext): Promise { ) { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) - c.status(401) - return c.json({ success: false, state: "invalid session" }) + return c.json({ success: false, state: "invalid session" }, 401) } return c.json({ success: true, state: "valid session", session }, 200) diff --git a/src/v2/routes/search/user/getUsersBySearch.ts b/src/v2/routes/search/user/getUsersBySearch.ts index 69453bf..ab2bafc 100644 --- a/src/v2/routes/search/user/getUsersBySearch.ts +++ b/src/v2/routes/search/user/getUsersBySearch.ts @@ -22,21 +22,25 @@ export async function getUsersBySearch(c: APIContext): Promise { }) if (!userList) { - c.status(200) - return c.json({ - success: false, - status: "user not found", - }) + return c.json( + { + success: false, + status: "user not found", + }, + 200 + ) } - response = c.json({ - success: true, - status: "ok", - query, - results: userList, - }) + response = c.json( + { + success: true, + status: "ok", + query, + results: userList, + }, + 200 + ) - c.status(200) response.headers.set("Cache-Control", "s-maxage=60") await cache.put(cacheKey, response.clone()) From 70ac3f44a4ad9f365ee05c82d30943bacadd3d4a Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Thu, 12 Oct 2023 07:17:28 +0100 Subject: [PATCH 101/318] return asset valid and invalid tags on upload --- src/v2/routes/auth/assets/uploadAsset.ts | 19 ++++++- .../user-attributes/updateUserAttributes.ts | 53 ++++++++++++------- 2 files changed, 51 insertions(+), 21 deletions(-) diff --git a/src/v2/routes/auth/assets/uploadAsset.ts b/src/v2/routes/auth/assets/uploadAsset.ts index f5dc6e0..a132056 100644 --- a/src/v2/routes/auth/assets/uploadAsset.ts +++ b/src/v2/routes/auth/assets/uploadAsset.ts @@ -65,6 +65,9 @@ export async function uploadAsset(c: APIContext): Promise { type: asset.type, }) + const validTags = [] + const invalidTags = [] + try { await c.env.FILES_BUCKET.put( `/assets/${metadata.game}/${metadata.category}/${metadata.name}.${metadata.extension}`, @@ -72,12 +75,15 @@ export async function uploadAsset(c: APIContext): Promise { ) await drizzle.transaction(async (trx) => { + // inserting new asset const newAssetDB = await trx .insert(assets) .values(newAsset) .returning({ assetId: assets.id, }) + + // checking if tags exist and setting relations if (metadata.tags.length > 0) { for (const tag of metadata.tags) { const tagExists = await trx.query.assetTags.findFirst({ @@ -96,8 +102,9 @@ export async function uploadAsset(c: APIContext): Promise { .returning({ assetTagId: assetTagsAssets.assetTagId, }) + validTags.push(tag) } else { - continue + invalidTags.push(tag) } } } @@ -109,5 +116,13 @@ export async function uploadAsset(c: APIContext): Promise { return c.json({ success: false, state: "failed to upload asset" }, 500) } - return c.json({ success: true, state: "uploaded asset" }, 200) + return c.json( + { + success: true, + state: "uploaded asset", + validTags, + invalidTags, + }, + 200 + ) } diff --git a/src/v2/routes/auth/user-attributes/updateUserAttributes.ts b/src/v2/routes/auth/user-attributes/updateUserAttributes.ts index 11b33ae..0b94326 100644 --- a/src/v2/routes/auth/user-attributes/updateUserAttributes.ts +++ b/src/v2/routes/auth/user-attributes/updateUserAttributes.ts @@ -1,5 +1,12 @@ import { auth } from "@/v2/lib/auth/lucia" +type UserAttributes = { + username?: string + pronouns?: string + self_assignable_role_flags?: number + bio?: string +} + export async function updateUserAttributes(c: APIContext): Promise { const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() @@ -9,29 +16,37 @@ export async function updateUserAttributes(c: APIContext): Promise { await auth(c.env).invalidateSession(session.sessionId) authRequest.setSession(null) } - return c.json({ success: false, state: "invalid session" }, 200) + return c.json({ success: false, state: "unauthorized" }, 401) } - const formData = await c.req.formData() + const formData = (await c.req.formData()) as FormData - const attributes = { - username: formData.get("username") as string | null, - pronouns: formData.get("pronouns") as string | null, - self_assignable_role_flags: formData.get( - "self_assignable_roles" - ) as unknown as number | null, - bio: formData.get("bio") as string | null, + const attributes: UserAttributes = { + username: formData.get("username"), + pronouns: formData.get("pronouns"), + self_assignable_role_flags: Number( + formData.get("self_assignable_roles") + ), + bio: formData.get("bio"), } - // remove null values from attributes - Object.keys(attributes).forEach((key) => { - if (attributes[key] === null) delete attributes[key] - }) - - await auth(c.env).updateUserAttributes(session.user.userId, attributes) - - return c.json( - { success: true, state: "updated user attributes", session }, - 200 + const attributesWithoutNull = Object.fromEntries( + Object.entries(attributes).filter(([, value]) => value !== null) ) + + try { + await auth(c.env).updateUserAttributes( + session.user.userId, + attributesWithoutNull + ) + return c.json( + { success: true, state: "updated user attributes", session }, + 200 + ) + } catch (error) { + return c.json( + { success: false, state: "error updating user attributes" }, + 500 + ) + } } From 6f423396bc14db7f5869a8e725228d83d9f03054 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Thu, 12 Oct 2023 07:20:05 +0100 Subject: [PATCH 102/318] prevent users from (un)folowing themselves --- .../auth/user-attributes/user-relations/followUser.ts | 4 ++++ .../auth/user-attributes/user-relations/unfollowUser.ts | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/src/v2/routes/auth/user-attributes/user-relations/followUser.ts b/src/v2/routes/auth/user-attributes/user-relations/followUser.ts index 2bc8175..91c70a6 100644 --- a/src/v2/routes/auth/user-attributes/user-relations/followUser.ts +++ b/src/v2/routes/auth/user-attributes/user-relations/followUser.ts @@ -34,6 +34,10 @@ export async function followUser(c: APIContext): Promise { return c.json({ success: false, state: "user not found" }, 200) } + if (user.id === session.user.userId) { + return c.json({ success: false, state: "cannot follow yourself" }, 200) + } + const isFollowing = await drizzle.query.following.findFirst({ where: (following, { eq }) => eq(following.id, `${session.user.userId}-${userToFollow}`), diff --git a/src/v2/routes/auth/user-attributes/user-relations/unfollowUser.ts b/src/v2/routes/auth/user-attributes/user-relations/unfollowUser.ts index acf59ed..774bd33 100644 --- a/src/v2/routes/auth/user-attributes/user-relations/unfollowUser.ts +++ b/src/v2/routes/auth/user-attributes/user-relations/unfollowUser.ts @@ -35,6 +35,13 @@ export async function unFollowUser(c: APIContext): Promise { return c.json({ success: false, state: "user not found" }, 200) } + if (user.id === session.user.userId) { + return c.json( + { success: false, state: "cannot unfollow yourself" }, + 200 + ) + } + const isFollowing = await drizzle.query.following.findFirst({ where: (following, { eq }) => eq(following.id, `${session.user.userId}-${userToUnFollow}`), From d9cd67cc78ebc812fbf5019878a3d32c600bd71b Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Thu, 12 Oct 2023 07:25:33 +0100 Subject: [PATCH 103/318] list all unapproved assets --- .../routes/auth/assets/getUnapprovedAssets.ts | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 src/v2/routes/auth/assets/getUnapprovedAssets.ts diff --git a/src/v2/routes/auth/assets/getUnapprovedAssets.ts b/src/v2/routes/auth/assets/getUnapprovedAssets.ts new file mode 100644 index 0000000..ab1fd98 --- /dev/null +++ b/src/v2/routes/auth/assets/getUnapprovedAssets.ts @@ -0,0 +1,40 @@ +import { responseHeaders } from "@/v2/lib/responseHeaders" +import { getConnection } from "@/v2/db/turso" +import { auth } from "@/v2/lib/auth/lucia" +import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" + +export async function getUnapprovedAssets(c: APIContext): Promise { + const authRequest = auth(c.env).handleRequest(c) + const session = await authRequest.validate() + + if (!session || session.state === "idle") { + if (session) { + await auth(c.env).invalidateSession(session.sessionId) + authRequest.setSession(null) + } + return c.json({ success: false, state: "unauthorized" }, 401) + } + + const roleFlags = roleFlagsToArray(session.user.roleFlags) + + if (!roleFlags.includes("STAFF")) { + return c.json({ success: false, state: "unauthorized" }, 401) + } + + const drizzle = getConnection(c.env).drizzle + + const unApprovedAssets = + (await drizzle.query.assets.findMany({ + where: (assets, { eq }) => eq(assets.status, 0), + })) ?? [] + + return c.json( + { + success: true, + status: "ok", + unApprovedAssets, + }, + 200, + responseHeaders + ) +} From a4d21b25bf9d64a3e6fe1b4b961ce07e90581612 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Thu, 12 Oct 2023 07:34:04 +0100 Subject: [PATCH 104/318] modifyasset support modiying tags after init ul --- src/v2/routes/auth/assets/modifyAsset.ts | 73 +++++++++++++++++++----- 1 file changed, 60 insertions(+), 13 deletions(-) diff --git a/src/v2/routes/auth/assets/modifyAsset.ts b/src/v2/routes/auth/assets/modifyAsset.ts index c5abd55..93f6333 100644 --- a/src/v2/routes/auth/assets/modifyAsset.ts +++ b/src/v2/routes/auth/assets/modifyAsset.ts @@ -1,8 +1,8 @@ import { responseHeaders } from "@/v2/lib/responseHeaders" import { getConnection } from "@/v2/db/turso" -import { assets } from "@/v2/db/schema" +import { assetTagsAssets, assets } from "@/v2/db/schema" import { eq } from "drizzle-orm" - +import { SplitQueryByCommas } from "@/v2/lib/helpers/splitQueryByCommas" import { auth } from "@/v2/lib/auth/lucia" import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" @@ -28,6 +28,13 @@ export async function modifyAssetData(c: APIContext): Promise { const asset = await drizzle.query.assets.findFirst({ where: (assets, { eq }) => eq(assets.id, parseInt(assetIdToModify)), + with: { + assetTagsAssets: { + with: { + assetTags: true, + }, + }, + }, }) if (!asset) { @@ -55,13 +62,14 @@ export async function modifyAssetData(c: APIContext): Promise { name: formData.get("name") as string | null, game: formData.get("game") as string | null, assetCategory: formData.get("assetCategory") as string | null, - // tags: SplitQueryByCommas(formData.get("tags") as string | null), } Object.keys(metadata).forEach( (key) => metadata[key] === null && delete metadata[key] ) + const tags = SplitQueryByCommas(formData.get("tags") as string | null) + const updatedAsset = await drizzle .update(assets) .set({ @@ -70,15 +78,54 @@ export async function modifyAssetData(c: APIContext): Promise { .where(eq(assets.id, parseInt(assetIdToModify))) .execute() - const response = c.json( - { - success: true, - status: "ok", - updatedAsset, - }, - 200, - responseHeaders - ) + const validTags = [] + const invalidTags = [] + + if (tags && tags.length > 0) { + // remove all existing tags + await drizzle + .delete(assetTagsAssets) + .where(eq(assetTagsAssets.assetId, parseInt(assetIdToModify))) + .execute() - return response + // add new tags + await drizzle.transaction(async (trx) => { + for (const tag of tags) { + const tagExists = await trx.query.assetTags.findFirst({ + where: (assetTags) => { + return eq(assetTags.name, tag) + }, + }) + if (tagExists) { + await trx + .insert(assetTagsAssets) + .values({ + id: crypto.randomUUID(), + assetId: parseInt(assetIdToModify), + assetTagId: tagExists[0].assetTagId, + }) + .returning({ + assetTagId: assetTagsAssets.assetTagId, + }) + validTags.push(tag) + } else { + invalidTags.push(tag) + } + } + }) + + const response = c.json( + { + success: true, + status: "ok", + updatedAsset, + validTags: validTags ? validTags : undefined, + invalidTags: invalidTags ? invalidTags : undefined, + }, + 200, + responseHeaders + ) + + return response + } } From 3f37973dfb22d9796156074d4b8ca396a177a70d Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 15 Oct 2023 16:19:55 +0100 Subject: [PATCH 105/318] add displayname + email verif & pw reset table --- src/lucia.d.ts | 1 + src/v2/db/schema.ts | 85 ++++++++++++------- .../collections/deleteAssetFromCollection.ts | 12 ++- src/v2/routes/auth/login-methods/discord.ts | 1 + .../oc-generators/viewOCGeneratorResponses.ts | 16 ++-- src/v2/routes/auth/signup.ts | 1 + .../routes/search/user/getUserByUsername.ts | 7 +- 7 files changed, 80 insertions(+), 43 deletions(-) diff --git a/src/lucia.d.ts b/src/lucia.d.ts index e4d61b5..8e4fb41 100644 --- a/src/lucia.d.ts +++ b/src/lucia.d.ts @@ -4,6 +4,7 @@ declare namespace Lucia { type DatabaseUserAttributes = { avatar_url: string | null banner_url: string | null + display_name: string | null username: string username_colour: string | null email: string diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index 930cb0c..66d30b1 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -14,6 +14,7 @@ export const users = sqliteTable( id: text("id").primaryKey(), avatarUrl: text("avatar_url"), bannerUrl: text("banner_url"), + displayName: text("display_name"), username: text("username").notNull(), usernameColour: text("username_colour"), email: text("email").notNull(), @@ -35,28 +36,55 @@ export const users = sqliteTable( } ) -// NOTE: sessions are now managed by CF KV instead of SQLite DB -// export const sessions = sqliteTable( -// tableNames.authSession, -// { -// id: text("id").primaryKey(), -// userId: text("user_id") -// .notNull() -// .references(() => users.id, { -// onUpdate: "cascade", -// onDelete: "cascade", -// }), -// activeExpires: integer("active_expires").notNull(), -// idleExpires: integer("idle_expires").notNull(), -// userAgent: text("user_agent").notNull(), -// countryCode: text("country_code").notNull(), -// }, -// (session) => { -// return { -// userIdx: uniqueIndex("session_user_id_idx").on(session.userId), -// } -// } -// ) +export const emailVerificationToken = sqliteTable( + tableNames.emailVerificationToken, + { + id: text("id").primaryKey(), + userId: text("user_id") + .notNull() + .references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + token: text("token").notNull(), + expiresAt: integer("expires_at").notNull(), + }, + (emailVerificationToken) => { + return { + userIdx: uniqueIndex("email_verification_token_user_id_idx").on( + emailVerificationToken.userId + ), + tokenIdx: uniqueIndex("email_verification_token_token_idx").on( + emailVerificationToken.token + ), + } + } +) + +export const passwordResetToken = sqliteTable( + tableNames.passwordResetToken, + { + id: text("id").primaryKey(), + userId: text("user_id") + .notNull() + .references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + token: text("token").notNull(), + expiresAt: integer("expires_at").notNull(), + }, + (passwordResetToken) => { + return { + userIdx: uniqueIndex("password_reset_token_user_id_idx").on( + passwordResetToken.userId + ), + tokenIdx: uniqueIndex("password_reset_token_token_idx").on( + passwordResetToken.token + ), + } + } +) export const keys = sqliteTable( tableNames.authKey, @@ -504,13 +532,6 @@ export const userFavoritesAssetsRelations = relations( }) ) -// export const sessionsRelations = relations(sessions, ({ one }) => ({ -// user: one(users, { -// fields: [sessions.userId], -// references: [users.id], -// }), -// })) - export const keysRelations = relations(keys, ({ one }) => ({ user: one(users, { fields: [keys.userId], @@ -529,7 +550,6 @@ export const socialsConnectionsRelations = relations( ) export const usersRelations = relations(users, ({ one, many }) => ({ - // session: many(sessions), key: many(keys), assets: many(assets), follower: many(follower), @@ -537,6 +557,8 @@ export const usersRelations = relations(users, ({ one, many }) => ({ following: many(following), socialsConnection: one(socialsConnections), userCollections: many(userCollections), + passwordResetToken: one(passwordResetToken), + emailVerificationToken: one(emailVerificationToken), savedOcGenerators: many(savedOcGenerators), })) @@ -551,7 +573,8 @@ export type AssetTagsAsset = typeof assetTagsAssets.$inferSelect // user types export type User = typeof users.$inferSelect -// export type Session = typeof sessions.$inferSelect +export type EmailVerificationToken = typeof emailVerificationToken.$inferSelect +export type PasswordResetToken = typeof passwordResetToken.$inferSelect export type Key = typeof keys.$inferSelect export type SocialsConnection = typeof socialsConnections.$inferSelect export type Following = typeof following.$inferSelect diff --git a/src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts b/src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts index 6ebe014..6856123 100644 --- a/src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts +++ b/src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts @@ -38,7 +38,6 @@ export async function deleteAssetFromCollection( return c.json({ success: false, state: "no asset id entered" }, 401) } - // check if collection exists const collectionExists = await drizzle.query.userCollections.findFirst({ where: (userCollections, { eq }) => eq(userCollections.id, collection.id), @@ -66,9 +65,14 @@ export async function deleteAssetFromCollection( // check if userCollectionAssets exists const userCollectionAssetsExists = await drizzle.query.userCollectionAssets.findFirst({ - where: (userCollectionAssets, { eq }) => - eq(userCollectionAssets.collectionId, collection.id) && - eq(userCollectionAssets.assetId, parseInt(collection.assetId)), + where: (userCollectionAssets, { eq, and }) => + and( + eq(userCollectionAssets.collectionId, collection.id), + eq( + userCollectionAssets.assetId, + parseInt(collection.assetId) + ) + ), }) if (!userCollectionAssetsExists) { diff --git a/src/v2/routes/auth/login-methods/discord.ts b/src/v2/routes/auth/login-methods/discord.ts index a004d67..9fe5540 100644 --- a/src/v2/routes/auth/login-methods/discord.ts +++ b/src/v2/routes/auth/login-methods/discord.ts @@ -99,6 +99,7 @@ export async function discordCallback(c: APIContext): Promise { const createdUser = await createUser({ attributes: { username: discordUser.username, + display_name: discordUser.username, email: discordUser.email, email_verified: 1, date_joined: Date.now(), diff --git a/src/v2/routes/auth/oc-generators/viewOCGeneratorResponses.ts b/src/v2/routes/auth/oc-generators/viewOCGeneratorResponses.ts index f304cc9..eeaa4ee 100644 --- a/src/v2/routes/auth/oc-generators/viewOCGeneratorResponses.ts +++ b/src/v2/routes/auth/oc-generators/viewOCGeneratorResponses.ts @@ -1,8 +1,7 @@ import { auth } from "@/v2/lib/auth/lucia" - -import { savedOcGenerators } from "@/v2/db/schema" import { getConnection } from "@/v2/db/turso" -import { eq } from "drizzle-orm" +import { savedOcGenerators } from "@/v2/db/schema" +import { desc } from "drizzle-orm" export async function viewOCGeneratorResponses( c: APIContext @@ -20,10 +19,13 @@ export async function viewOCGeneratorResponses( const drizzle = getConnection(c.env).drizzle - const ocGeneratorResponses = await drizzle - .select() - .from(savedOcGenerators) - .where(eq(savedOcGenerators.userId, session.user.userId)) + const ocGeneratorResponses = await drizzle.query.savedOcGenerators.findMany( + { + where: (savedOcGenerators, { eq }) => + eq(savedOcGenerators.userId, session.user.userId), + orderBy: desc(savedOcGenerators.dateCreated), + } + ) return c.json( { diff --git a/src/v2/routes/auth/signup.ts b/src/v2/routes/auth/signup.ts index 7c9bb63..e5e4532 100644 --- a/src/v2/routes/auth/signup.ts +++ b/src/v2/routes/auth/signup.ts @@ -22,6 +22,7 @@ export async function signup(c: APIContext): Promise { }, attributes: { username, + display_name: username, email, email_verified: 0, date_joined: Date.now(), diff --git a/src/v2/routes/search/user/getUserByUsername.ts b/src/v2/routes/search/user/getUserByUsername.ts index 31c8df3..47e7589 100644 --- a/src/v2/routes/search/user/getUserByUsername.ts +++ b/src/v2/routes/search/user/getUserByUsername.ts @@ -3,7 +3,10 @@ import { getConnection } from "@/v2/db/turso" import { createNotFoundResponse } from "@/v2/lib/helpers/responses/notFoundResponse" import { auth } from "@/v2/lib/auth/lucia" -import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" +import { + roleFlagsToArray, + SelfAssignableRoleFlagsToArray, +} from "@/v2/lib/helpers/roleFlags" export async function getUserByUsername(c: APIContext): Promise { const { username } = c.req.param() @@ -46,6 +49,8 @@ export async function getUserByUsername(c: APIContext): Promise { userIsQueryingOwnAccount: session && session.user.userId === user.id ? true : false, userRoleFlagsArray: roleFlagsToArray(user.roleFlags), + userSelfAssignableRoleFlagsArray: + SelfAssignableRoleFlagsToArray(user.roleFlags) ?? [], user, }, 200, From cacbbd48c4b984dc89286fddf6f455909845db2b Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 15 Oct 2023 19:08:30 +0100 Subject: [PATCH 106/318] fallback to crud for asset querying --- src/v2/db/schema.ts | 5 +- src/v2/routes/auth/authRoute.ts | 16 ++-- src/v2/routes/auth/games/createGame.ts | 4 +- src/v2/routes/search/asset/searchAssets.ts | 94 +++++++++++----------- 4 files changed, 61 insertions(+), 58 deletions(-) diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index 66d30b1..3a7822a 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -429,8 +429,9 @@ export const savedOcGenerators = sqliteTable( game: text("game").notNull(), dateCreated: integer("date_created").notNull(), isPublic: integer("is_public").default(0).notNull(), - content: text("content").notNull(), // this is stored as json, which is then parsed on the frontend - savedColorPalette: text("saved_color_palette"), // array of 5 hex values, completely optional + content: text("content").notNull(), + savedColorPalette: text("saved_color_palette"), // array of 5 hex values, completely optional for the user to save + sakuraUrl: text("sakura_url"), }, (savedOcGenerators) => { return { diff --git a/src/v2/routes/auth/authRoute.ts b/src/v2/routes/auth/authRoute.ts index a498d34..d91cf1b 100644 --- a/src/v2/routes/auth/authRoute.ts +++ b/src/v2/routes/auth/authRoute.ts @@ -31,6 +31,14 @@ authRoute.post("/login", async (c) => { return login(c) }) +authRoute.get("/validate", async (c) => { + return validate(c) +}) + +authRoute.post("/logout", async (c) => { + return logout(c) +}) + authRoute.post("/update/attributes", async (c) => { return updateUserAttributes(c) }) @@ -79,12 +87,4 @@ authRoute.post("/oc-generator/delete", async (c) => { return deleteOCGeneratorResponse(c) }) -authRoute.get("/validate", async (c) => { - return validate(c) -}) - -authRoute.post("/logout", async (c) => { - return logout(c) -}) - export default authRoute diff --git a/src/v2/routes/auth/games/createGame.ts b/src/v2/routes/auth/games/createGame.ts index 93cb9f3..be4d075 100644 --- a/src/v2/routes/auth/games/createGame.ts +++ b/src/v2/routes/auth/games/createGame.ts @@ -35,8 +35,8 @@ export async function createGame(c: APIContext): Promise { } // check if game.name exists - const gameExists = await drizzle.query.assetCategories.findFirst({ - where: (assetCategories, { eq }) => eq(assetCategories.name, game.name), + const gameExists = await drizzle.query.games.findFirst({ + where: (games, { eq }) => eq(games.name, game.name), }) if (gameExists) { diff --git a/src/v2/routes/search/asset/searchAssets.ts b/src/v2/routes/search/asset/searchAssets.ts index 04fe992..cf35599 100644 --- a/src/v2/routes/search/asset/searchAssets.ts +++ b/src/v2/routes/search/asset/searchAssets.ts @@ -1,9 +1,8 @@ import { responseHeaders } from "@/v2/lib/responseHeaders" import { getConnection } from "@/v2/db/turso" -import { like } from "drizzle-orm" -import { assets } from "@/v2/db/schema" -import { desc } from "drizzle-orm" +import { assetTagsAssets, assets, assetTags, users } from "@/v2/db/schema" +import { desc, like, sql, eq, and, or } from "drizzle-orm" import { SplitQueryByCommas } from "@/v2/lib/helpers/splitQueryByCommas" export async function searchForAssets(c: APIContext): Promise { @@ -12,7 +11,8 @@ export async function searchForAssets(c: APIContext): Promise { let response = await cache.match(cacheKey) if (response) return response - const { query, game, assetCategory, assetTags } = c.req.query() + const { query, gameQuery, assetCategoryQuery, assetTagsQuery } = + c.req.query() // search parameters can include optional search params: query, game, assetCategory, assetTags // query?: string => ?query=keqing @@ -22,60 +22,62 @@ export async function searchForAssets(c: APIContext): Promise { const drizzle = getConnection(c.env).drizzle - // check if certian search parameters are present, if not, set them to null const searchQuery = query ?? null - const gameList = game ? SplitQueryByCommas(game) : null - const assetCategoryList = assetCategory - ? SplitQueryByCommas(assetCategory) + const gameList = gameQuery + ? SplitQueryByCommas(gameQuery.toLowerCase()) : null - const assetTagsList = assetTags ? SplitQueryByCommas(assetTags) : null + const assetCategoryList = assetCategoryQuery + ? SplitQueryByCommas(assetCategoryQuery.toLowerCase()) + : null + const assetTagsList = assetTagsQuery + ? SplitQueryByCommas(assetTagsQuery.toLowerCase()) + : // TODO(dromzeh): allow for no tags to be specified, this is just temporary as it creates unnecessary complexity + ["official", "fanmade"] - console.log(searchQuery, gameList, assetCategoryList, assetTagsList) + const assetTagResponse = drizzle.$with("sq").as( + drizzle + .select({ + assetId: assetTagsAssets.assetId, + tags: sql`array_agg(${assetTags})`.as("tags"), + }) + .from(assetTagsAssets) + .leftJoin(assetTags, eq(assetTags.id, assetTagsAssets.assetTagId)) + .where(or(...assetTagsList.map((tag) => eq(assetTags.name, tag)))) + .groupBy(assetTagsAssets.assetId) + ) - // query the database for assets that match the search parameters - const assetResponse = await drizzle.query.assets.findMany({ - where: (assets, { and, or, eq }) => { - return and( - searchQuery ? like(assets.name, `%${searchQuery}%`) : null, - gameList - ? or(...gameList.map((game) => eq(assets.game, game))) - : null, - assetCategoryList - ? or( - ...assetCategoryList.map((assetCategory) => - eq(assets.assetCategory, assetCategory) - ) - ) - : null, + const result = await drizzle + .with(assetTagResponse) + .select() + .from(assets) + .innerJoin(assetTagResponse, eq(assetTagResponse.assetId, assets.id)) + .where( + and( + searchQuery && like(assets.name, `%${searchQuery}%`), + gameList && + or(...gameList.map((game) => eq(assets.game, game))), + assetCategoryList && + or( + ...assetCategoryList.map((category) => + eq(assets.assetCategory, category) + ) + ), eq(assets.status, 1) ) - }, - with: { - assetTagsAssets: { - with: { - assetTags: true, - }, - }, - users: { - columns: { - email: false, - emailVerified: false, - }, - }, - }, - orderBy: desc(assets.id), - limit: 500, - }) + ) + .leftJoin(users, eq(users.id, assets.uploadedById)) + .orderBy(desc(assets.uploadedDate)) + .limit(500) response = c.json( { success: true, status: "ok", query, - game, - assetCategory, - assetTags, - results: assetResponse ? assetResponse : [], + gameQuery, + assetCategoryQuery, + assetTagsQuery, + results: result ?? [], }, 200, responseHeaders From 15d3ef1125291cb504a276c4b6a10af39462c6e7 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 15 Oct 2023 23:19:21 +0100 Subject: [PATCH 107/318] link all routes [scuffed] --- src/index.ts | 12 +-- .../asset/{assetRoute.ts => assetRoutes.ts} | 0 .../asset-categories/assetCategoryRoutes.ts | 24 +++++ src/v2/routes/auth/assets/assetRoutes.ts | 39 ++++++++ .../assets/collections/collectionsRoutes.ts | 44 +++++++++ .../assets/collections/viewAssetCollection.ts | 12 +-- .../assets/favorite/favoriteAssetRoutes.ts | 29 ++++++ src/v2/routes/auth/authRoute.ts | 90 ------------------- src/v2/routes/auth/authRoutes.ts | 47 ++++++++++ src/v2/routes/auth/games/gameRoutes.ts | 24 +++++ .../auth/oc-generators/ocGeneratorRoutes.ts | 29 ++++++ src/v2/routes/auth/tags/tagRoutes.ts | 24 +++++ .../user-relations/unfollowUser.ts | 2 +- .../user-attributes/userAttributesRoutes.ts | 39 ++++++++ .../{discordRoute.ts => discordRoutes.ts} | 0 .../games/{gamesRoute.ts => gamesRoutes.ts} | 0 src/v2/routes/search/asset/searchAssets.ts | 4 +- .../{searchRoute.ts => searchRoutes.ts} | 2 +- src/v2/routes/tags/allTags.ts | 5 +- src/v2/routes/tags/getTagById.ts | 29 ++++++ src/v2/routes/tags/getTagByName.ts | 29 ++++++ src/v2/routes/tags/tagsRoutes.ts | 20 +++++ wrangler.toml | 8 +- 23 files changed, 399 insertions(+), 113 deletions(-) rename src/v2/routes/asset/{assetRoute.ts => assetRoutes.ts} (100%) create mode 100644 src/v2/routes/auth/asset-categories/assetCategoryRoutes.ts create mode 100644 src/v2/routes/auth/assets/assetRoutes.ts create mode 100644 src/v2/routes/auth/assets/collections/collectionsRoutes.ts create mode 100644 src/v2/routes/auth/assets/favorite/favoriteAssetRoutes.ts delete mode 100644 src/v2/routes/auth/authRoute.ts create mode 100644 src/v2/routes/auth/authRoutes.ts create mode 100644 src/v2/routes/auth/games/gameRoutes.ts create mode 100644 src/v2/routes/auth/oc-generators/ocGeneratorRoutes.ts create mode 100644 src/v2/routes/auth/tags/tagRoutes.ts create mode 100644 src/v2/routes/auth/user-attributes/userAttributesRoutes.ts rename src/v2/routes/discord/{discordRoute.ts => discordRoutes.ts} (100%) rename src/v2/routes/games/{gamesRoute.ts => gamesRoutes.ts} (100%) rename src/v2/routes/search/{searchRoute.ts => searchRoutes.ts} (96%) create mode 100644 src/v2/routes/tags/getTagById.ts create mode 100644 src/v2/routes/tags/getTagByName.ts create mode 100644 src/v2/routes/tags/tagsRoutes.ts diff --git a/src/index.ts b/src/index.ts index 8fb30e7..3b99c7c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,10 +1,11 @@ import { Hono } from "hono" -import assetRoute from "./v2/routes/asset/assetRoute" -import discordRoute from "./v2/routes/discord/discordRoute" +import assetRoute from "./v2/routes/asset/assetRoutes" +import discordRoute from "./v2/routes/discord/discordRoutes" import ocGeneratorRoute from "./v2/routes/oc-generators/ocGeneratorRoutes" -import gamesRoute from "./v2/routes/games/gamesRoute" -import authRoute from "./v2/routes/auth/authRoute" -import searchRoute from "./v2/routes/search/searchRoute" +import gamesRoute from "./v2/routes/games/gamesRoutes" +import authRoute from "./v2/routes/auth/authRoutes" +import searchRoute from "./v2/routes/search/searchRoutes" +import tagsRoute from "./v2/routes/tags/tagsRoutes" import { getRuntimeKey } from "hono/adapter" const app = new Hono<{ Bindings: Bindings }>() @@ -27,6 +28,7 @@ app.route("/v2/oc-generators", ocGeneratorRoute) app.route("/v2/search", searchRoute) app.route("/v2/games", gamesRoute) app.route("/v2/auth", authRoute) +app.route("/v2/tags", tagsRoute) app.all("*", (c) => { return c.json( { success: false, status: "error", error: "route doesn't exist" }, diff --git a/src/v2/routes/asset/assetRoute.ts b/src/v2/routes/asset/assetRoutes.ts similarity index 100% rename from src/v2/routes/asset/assetRoute.ts rename to src/v2/routes/asset/assetRoutes.ts diff --git a/src/v2/routes/auth/asset-categories/assetCategoryRoutes.ts b/src/v2/routes/auth/asset-categories/assetCategoryRoutes.ts new file mode 100644 index 0000000..0343e3a --- /dev/null +++ b/src/v2/routes/auth/asset-categories/assetCategoryRoutes.ts @@ -0,0 +1,24 @@ +import { createAssetCategory } from "./createAssetCategory" +import { deleteAssetCategory } from "./deleteAssetCategory" +import { Hono } from "hono" +import { cors } from "hono/cors" + +const assetCategoryRoute = new Hono<{ Bindings: Bindings }>() + +assetCategoryRoute.use( + "*", + cors({ + credentials: true, + origin: ["http://localhost:3000"], // TODO: update this - temporary + }) +) + +assetCategoryRoute.post("/create", async (c) => { + return createAssetCategory(c) +}) + +assetCategoryRoute.post("/delete", async (c) => { + return deleteAssetCategory(c) +}) + +export default assetCategoryRoute diff --git a/src/v2/routes/auth/assets/assetRoutes.ts b/src/v2/routes/auth/assets/assetRoutes.ts new file mode 100644 index 0000000..c9aba30 --- /dev/null +++ b/src/v2/routes/auth/assets/assetRoutes.ts @@ -0,0 +1,39 @@ +import { approveAsset } from "./approveAsset" +import { getUnapprovedAssets } from "./getUnapprovedAssets" +import { modifyAssetData } from "./modifyAsset" +import { uploadAsset } from "./uploadAsset" +import { Hono } from "hono" +import { cors } from "hono/cors" +import collectionsRoute from "./collections/collectionsRoutes" +import favoriteAssetRoute from "./favorite/favoriteAssetRoutes" + +const assetRoute = new Hono<{ Bindings: Bindings }>() + +assetRoute.use( + "*", + cors({ + credentials: true, + origin: ["http://localhost:3000"], // TODO: update this - temporary + }) +) + +assetRoute.get("/unapproved", async (c) => { + return getUnapprovedAssets(c) +}) + +assetRoute.post("/approve/:assetIdToApprove", async (c) => { + return approveAsset(c) +}) + +assetRoute.post("/modify/:assetIdToModify", async (c) => { + return modifyAssetData(c) +}) + +assetRoute.post("/upload", async (c) => { + return uploadAsset(c) +}) + +assetRoute.route("/collections", collectionsRoute) +assetRoute.route("/favorite", favoriteAssetRoute) + +export default assetRoute diff --git a/src/v2/routes/auth/assets/collections/collectionsRoutes.ts b/src/v2/routes/auth/assets/collections/collectionsRoutes.ts new file mode 100644 index 0000000..8de75fb --- /dev/null +++ b/src/v2/routes/auth/assets/collections/collectionsRoutes.ts @@ -0,0 +1,44 @@ +import { addAssetToCollection } from "./addAssetToCollection" +import { createAssetCollection } from "./createAssetCollection" +import { deleteAssetCollection } from "./deleteAssetCollection" +import { deleteAssetFromCollection } from "./deleteAssetFromCollection" +import { viewAssetCollection } from "./viewAssetCollection" +import { viewAssetCollections } from "./viewAssetCollections" +import { Hono } from "hono" +import { cors } from "hono/cors" + +const collectionsRoute = new Hono<{ Bindings: Bindings }>() + +collectionsRoute.use( + "*", + cors({ + credentials: true, + origin: ["http://localhost:3000"], // TODO: update this - temporary + }) +) + +collectionsRoute.post("/create", async (c) => { + return createAssetCollection(c) +}) + +collectionsRoute.post("/delete", async (c) => { + return deleteAssetCollection(c) +}) + +collectionsRoute.post("/add", async (c) => { + return addAssetToCollection(c) +}) + +collectionsRoute.post("/remove", async (c) => { + return deleteAssetFromCollection(c) +}) + +collectionsRoute.get("/all", async (c) => { + return viewAssetCollections(c) +}) + +collectionsRoute.get("/:collectionId", async (c) => { + return viewAssetCollection(c) +}) + +export default collectionsRoute diff --git a/src/v2/routes/auth/assets/collections/viewAssetCollection.ts b/src/v2/routes/auth/assets/collections/viewAssetCollection.ts index f5c67a6..1f3e3b9 100644 --- a/src/v2/routes/auth/assets/collections/viewAssetCollection.ts +++ b/src/v2/routes/auth/assets/collections/viewAssetCollection.ts @@ -15,13 +15,9 @@ export async function viewAssetCollection(c: APIContext): Promise { return c.json({ success: false, state: "invalid session" }, 401) } - const formData = await c.req.formData() + const collectionId = c.req.param("collectionId") - const collection = { - id: formData.get("collectionId") as string | null, - } - - if (!collection.id) { + if (!collectionId) { return c.json( { success: false, state: "no collection id entered" }, 200 @@ -34,7 +30,7 @@ export async function viewAssetCollection(c: APIContext): Promise { where: (userCollections, { eq, or, and }) => and( or( - eq(userCollections.id, collection.id), + eq(userCollections.id, collectionId), eq(userCollections.isPublic, 1) ), eq(userCollections.userId, session.user.userId) @@ -54,7 +50,7 @@ export async function viewAssetCollection(c: APIContext): Promise { where: (userCollections, { eq, or, and }) => and( or( - eq(userCollections.id, collection.id), + eq(userCollections.id, collectionId), eq(userCollections.isPublic, 1) ), eq(userCollections.userId, session.user.userId) diff --git a/src/v2/routes/auth/assets/favorite/favoriteAssetRoutes.ts b/src/v2/routes/auth/assets/favorite/favoriteAssetRoutes.ts new file mode 100644 index 0000000..bd9659a --- /dev/null +++ b/src/v2/routes/auth/assets/favorite/favoriteAssetRoutes.ts @@ -0,0 +1,29 @@ +import { Hono } from "hono" +import { cors } from "hono/cors" +import { favoriteAsset } from "./addFavoriteAsset" +import { removeFavoriteAsset } from "./removeFavoriteAsset" +import { viewFavoriteAssets } from "./viewFavoriteAssets" + +const favoriteAssetRoute = new Hono<{ Bindings: Bindings }>() + +favoriteAssetRoute.use( + "*", + cors({ + credentials: true, + origin: ["http://localhost:3000"], // TODO: update this - temporary + }) +) + +favoriteAssetRoute.post("/add", async (c) => { + return favoriteAsset(c) +}) + +favoriteAssetRoute.post("/remove", async (c) => { + return removeFavoriteAsset(c) +}) + +favoriteAssetRoute.get("/all", async (c) => { + return viewFavoriteAssets(c) +}) + +export default favoriteAssetRoute diff --git a/src/v2/routes/auth/authRoute.ts b/src/v2/routes/auth/authRoute.ts deleted file mode 100644 index d91cf1b..0000000 --- a/src/v2/routes/auth/authRoute.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { Hono } from "hono" -import { login } from "./login" -import { logout } from "./logout" -import { signup } from "./signup" -import { cors } from "hono/cors" -import { validate } from "./validate" -import { uploadProfileImage } from "./user-attributes/self-upload/uploadAvatar" -import { uploadBannerImage } from "./user-attributes/self-upload/uploadBanner" -import { saveOCGeneratorResponse } from "./oc-generators/saveOCGeneratorResponse" -import { updateUserAttributes } from "./user-attributes/updateUserAttributes" -import { uploadAsset } from "./assets/uploadAsset" - -import { modifyAssetData } from "./assets/modifyAsset" -import { approveAsset } from "./assets/approveAsset" -import { viewOCGeneratorResponses } from "./oc-generators/viewOCGeneratorResponses" -import { followUser } from "./user-attributes/user-relations/followUser" -import { unFollowUser } from "./user-attributes/user-relations/unfollowUser" -import { deleteOCGeneratorResponse } from "./oc-generators/deleteOCGeneratorResponse" - -const authRoute = new Hono<{ Bindings: Bindings }>() - -authRoute.use( - "*", - cors({ - credentials: true, - origin: ["*"], // TODO: update this - temporary - }) -) - -authRoute.post("/login", async (c) => { - return login(c) -}) - -authRoute.get("/validate", async (c) => { - return validate(c) -}) - -authRoute.post("/logout", async (c) => { - return logout(c) -}) - -authRoute.post("/update/attributes", async (c) => { - return updateUserAttributes(c) -}) - -authRoute.post("/upload/asset", async (c) => { - return uploadAsset(c) -}) - -authRoute.post("/upload/avatar", async (c) => { - return uploadProfileImage(c) -}) - -authRoute.post("/approve/asset/:assetIdToApprove", async (c) => { - return approveAsset(c) -}) - -authRoute.post("/modify/asset/:assetIdToModify", async (c) => { - return modifyAssetData(c) -}) - -authRoute.post("/upload/banner", async (c) => { - return uploadBannerImage(c) -}) - -authRoute.post("/follow", async (c) => { - return followUser(c) -}) - -authRoute.post("/unfollow", async (c) => { - return unFollowUser(c) -}) - -authRoute.post("/signup", async (c) => { - return signup(c) -}) - -authRoute.post("/oc-generator/save", async (c) => { - return saveOCGeneratorResponse(c) -}) - -authRoute.get("/oc-generator/view/all", async (c) => { - return viewOCGeneratorResponses(c) -}) - -authRoute.post("/oc-generator/delete", async (c) => { - return deleteOCGeneratorResponse(c) -}) - -export default authRoute diff --git a/src/v2/routes/auth/authRoutes.ts b/src/v2/routes/auth/authRoutes.ts new file mode 100644 index 0000000..9ed1c84 --- /dev/null +++ b/src/v2/routes/auth/authRoutes.ts @@ -0,0 +1,47 @@ +import { Hono } from "hono" +import { login } from "./login" +import { logout } from "./logout" +import { signup } from "./signup" +import { cors } from "hono/cors" +import { validate } from "./validate" +import assetCategoryRoute from "./asset-categories/assetCategoryRoutes" +import assetRoute from "./assets/assetRoutes" +import ocGeneratorRoute from "./oc-generators/ocGeneratorRoutes" +import gameRoute from "./games/gameRoutes" +import tagRoute from "./tags/tagRoutes" +import userAttributesRoute from "./user-attributes/userAttributesRoutes" + +const authRoute = new Hono<{ Bindings: Bindings }>() + +authRoute.use( + "*", + cors({ + credentials: true, + origin: ["http://localhost:3000"], // TODO: update this - temporary + }) +) + +authRoute.post("/login", async (c) => { + return login(c) +}) + +authRoute.get("/validate", async (c) => { + return validate(c) +}) + +authRoute.post("/logout", async (c) => { + return logout(c) +}) + +authRoute.post("/signup", async (c) => { + return signup(c) +}) + +authRoute.route("/assets", assetRoute) +authRoute.route("/asset-categories", assetCategoryRoute) +authRoute.route("/oc-generators", ocGeneratorRoute) +authRoute.route("/games", gameRoute) +authRoute.route("/tags", tagRoute) +authRoute.route("/user-attributes", userAttributesRoute) + +export default authRoute diff --git a/src/v2/routes/auth/games/gameRoutes.ts b/src/v2/routes/auth/games/gameRoutes.ts new file mode 100644 index 0000000..0b829df --- /dev/null +++ b/src/v2/routes/auth/games/gameRoutes.ts @@ -0,0 +1,24 @@ +import { createGame } from "./createGame" +import { deleteGame } from "./deleteGame" +import { Hono } from "hono" +import { cors } from "hono/cors" + +const gameRoute = new Hono<{ Bindings: Bindings }>() + +gameRoute.use( + "*", + cors({ + credentials: true, + origin: ["http://localhost:3000"], // TODO: update this - temporary + }) +) + +gameRoute.post("/create", async (c) => { + return createGame(c) +}) + +gameRoute.post("/delete", async (c) => { + return deleteGame(c) +}) + +export default gameRoute diff --git a/src/v2/routes/auth/oc-generators/ocGeneratorRoutes.ts b/src/v2/routes/auth/oc-generators/ocGeneratorRoutes.ts new file mode 100644 index 0000000..3ad067d --- /dev/null +++ b/src/v2/routes/auth/oc-generators/ocGeneratorRoutes.ts @@ -0,0 +1,29 @@ +import { saveOCGeneratorResponse } from "./saveOCGeneratorResponse" +import { deleteOCGeneratorResponse } from "./deleteOCGeneratorResponse" +import { viewOCGeneratorResponses } from "./viewOCGeneratorResponses" +import { Hono } from "hono" +import { cors } from "hono/cors" + +const ocGeneratorRoute = new Hono<{ Bindings: Bindings }>() + +ocGeneratorRoute.use( + "*", + cors({ + credentials: true, + origin: ["http://localhost:3000"], // TODO: update this - temporary + }) +) + +ocGeneratorRoute.post("/save", async (c) => { + return saveOCGeneratorResponse(c) +}) + +ocGeneratorRoute.post("/delete", async (c) => { + return deleteOCGeneratorResponse(c) +}) + +ocGeneratorRoute.get("/all", async (c) => { + return viewOCGeneratorResponses(c) +}) + +export default ocGeneratorRoute diff --git a/src/v2/routes/auth/tags/tagRoutes.ts b/src/v2/routes/auth/tags/tagRoutes.ts new file mode 100644 index 0000000..09148ad --- /dev/null +++ b/src/v2/routes/auth/tags/tagRoutes.ts @@ -0,0 +1,24 @@ +import { createTag } from "./createTag" +import { deleteTag } from "./deleteTag" +import { Hono } from "hono" +import { cors } from "hono/cors" + +const tagRoute = new Hono<{ Bindings: Bindings }>() + +tagRoute.use( + "*", + cors({ + credentials: true, + origin: ["http://localhost:3000"], // TODO: update this - temporary + }) +) + +tagRoute.post("/create", async (c) => { + return createTag(c) +}) + +tagRoute.post("/delete", async (c) => { + return deleteTag(c) +}) + +export default tagRoute diff --git a/src/v2/routes/auth/user-attributes/user-relations/unfollowUser.ts b/src/v2/routes/auth/user-attributes/user-relations/unfollowUser.ts index 774bd33..573c8b7 100644 --- a/src/v2/routes/auth/user-attributes/user-relations/unfollowUser.ts +++ b/src/v2/routes/auth/user-attributes/user-relations/unfollowUser.ts @@ -4,7 +4,7 @@ import { getConnection } from "@/v2/db/turso" import { following, follower } from "@/v2/db/schema" import { eq } from "drizzle-orm" -export async function unFollowUser(c: APIContext): Promise { +export async function unfollowUser(c: APIContext): Promise { const drizzle = getConnection(c.env).drizzle const authRequest = auth(c.env).handleRequest(c) diff --git a/src/v2/routes/auth/user-attributes/userAttributesRoutes.ts b/src/v2/routes/auth/user-attributes/userAttributesRoutes.ts new file mode 100644 index 0000000..8754d7a --- /dev/null +++ b/src/v2/routes/auth/user-attributes/userAttributesRoutes.ts @@ -0,0 +1,39 @@ +import { updateUserAttributes } from "./updateUserAttributes" +import { uploadProfileImage } from "./self-upload/uploadAvatar" +import { uploadBannerImage } from "./self-upload/uploadBanner" +import { followUser } from "./user-relations/followUser" +import { unfollowUser } from "./user-relations/unfollowUser" +import { Hono } from "hono" +import { cors } from "hono/cors" + +const userAttributesRoute = new Hono<{ Bindings: Bindings }>() + +userAttributesRoute.use( + "*", + cors({ + credentials: true, + origin: ["http://localhost:3000"], // TODO: update this - temporary + }) +) + +userAttributesRoute.post("/update", async (c) => { + return updateUserAttributes(c) +}) + +userAttributesRoute.post("/upload/avatar", async (c) => { + return uploadProfileImage(c) +}) + +userAttributesRoute.post("/upload/banner", async (c) => { + return uploadBannerImage(c) +}) + +userAttributesRoute.post("/follow", async (c) => { + return followUser(c) +}) + +userAttributesRoute.post("/unfollow", async (c) => { + return unfollowUser(c) +}) + +export default userAttributesRoute diff --git a/src/v2/routes/discord/discordRoute.ts b/src/v2/routes/discord/discordRoutes.ts similarity index 100% rename from src/v2/routes/discord/discordRoute.ts rename to src/v2/routes/discord/discordRoutes.ts diff --git a/src/v2/routes/games/gamesRoute.ts b/src/v2/routes/games/gamesRoutes.ts similarity index 100% rename from src/v2/routes/games/gamesRoute.ts rename to src/v2/routes/games/gamesRoutes.ts diff --git a/src/v2/routes/search/asset/searchAssets.ts b/src/v2/routes/search/asset/searchAssets.ts index cf35599..efe8fe1 100644 --- a/src/v2/routes/search/asset/searchAssets.ts +++ b/src/v2/routes/search/asset/searchAssets.ts @@ -31,8 +31,8 @@ export async function searchForAssets(c: APIContext): Promise { : null const assetTagsList = assetTagsQuery ? SplitQueryByCommas(assetTagsQuery.toLowerCase()) - : // TODO(dromzeh): allow for no tags to be specified, this is just temporary as it creates unnecessary complexity - ["official", "fanmade"] + : // TODO(dromzeh): allow for no tags to be specified + ["official"] const assetTagResponse = drizzle.$with("sq").as( drizzle diff --git a/src/v2/routes/search/searchRoute.ts b/src/v2/routes/search/searchRoutes.ts similarity index 96% rename from src/v2/routes/search/searchRoute.ts rename to src/v2/routes/search/searchRoutes.ts index 26d128d..3546c72 100644 --- a/src/v2/routes/search/searchRoute.ts +++ b/src/v2/routes/search/searchRoutes.ts @@ -2,7 +2,7 @@ import { Hono } from "hono" import { searchAll } from "./all/searchAll" import { getUserByUsername } from "./user/getUserByUsername" import { getUsersBySearch } from "./user/getUsersBySearch" -import authRoute from "../auth/authRoute" +import authRoute from "../auth/authRoutes" import { searchForAssets } from "./asset/searchAssets" import { recentAssets } from "./asset/recentAssets" import { cors } from "hono/cors" diff --git a/src/v2/routes/tags/allTags.ts b/src/v2/routes/tags/allTags.ts index d2617e6..06148e3 100644 --- a/src/v2/routes/tags/allTags.ts +++ b/src/v2/routes/tags/allTags.ts @@ -9,8 +9,9 @@ export async function listAllAssetTags(c: APIContext): Promise { const drizzle = getConnection(c.env).drizzle - const allAssetTags = await drizzle.query.assetTags.findMany({ + const someAssetTags = await drizzle.query.assetTags.findMany({ orderBy: (assetTags) => assetTags.name, + limit: 500, with: { assetTagsAssets: { with: { @@ -24,7 +25,7 @@ export async function listAllAssetTags(c: APIContext): Promise { { success: true, status: "ok", - allAssetTags, + someAssetTags, }, 200 ) diff --git a/src/v2/routes/tags/getTagById.ts b/src/v2/routes/tags/getTagById.ts new file mode 100644 index 0000000..511055e --- /dev/null +++ b/src/v2/routes/tags/getTagById.ts @@ -0,0 +1,29 @@ +import { getConnection } from "@/v2/db/turso" + +export async function getTagById(c: APIContext): Promise { + const cacheKey = new Request(c.req.url.toString(), c.req) + const cache = caches.default + let response = await cache.match(cacheKey) + + if (response) return response + + const drizzle = getConnection(c.env).drizzle + + const assetTag = await drizzle.query.assetTags.findFirst({ + where: (assetTags, { eq }) => eq(assetTags.id, c.req.param("id")), + }) + + response = c.json( + { + success: true, + status: "ok", + assetTag, + }, + 200 + ) + + response.headers.set("Cache-Control", "s-maxage=604800") + await cache.put(cacheKey, response.clone()) + + return response +} diff --git a/src/v2/routes/tags/getTagByName.ts b/src/v2/routes/tags/getTagByName.ts new file mode 100644 index 0000000..df01acf --- /dev/null +++ b/src/v2/routes/tags/getTagByName.ts @@ -0,0 +1,29 @@ +import { getConnection } from "@/v2/db/turso" + +export async function getTagByName(c: APIContext): Promise { + const cacheKey = new Request(c.req.url.toString(), c.req) + const cache = caches.default + let response = await cache.match(cacheKey) + + if (response) return response + + const drizzle = getConnection(c.env).drizzle + + const assetTag = await drizzle.query.assetTags.findFirst({ + where: (assetTags, { eq }) => eq(assetTags.name, c.req.param("name")), + }) + + response = c.json( + { + success: true, + status: "ok", + assetTag, + }, + 200 + ) + + response.headers.set("Cache-Control", "s-maxage=604800") + await cache.put(cacheKey, response.clone()) + + return response +} diff --git a/src/v2/routes/tags/tagsRoutes.ts b/src/v2/routes/tags/tagsRoutes.ts new file mode 100644 index 0000000..77d7c0f --- /dev/null +++ b/src/v2/routes/tags/tagsRoutes.ts @@ -0,0 +1,20 @@ +import { Hono } from "hono" +import { listAllAssetTags } from "./allTags" +import { getTagById } from "./getTagById" +import { getTagByName } from "./getTagByName" + +const tagsRoute = new Hono<{ Bindings: Bindings }>() + +tagsRoute.get("/all", async (c) => { + return listAllAssetTags(c) +}) + +tagsRoute.get("/id/:id", async (c) => { + return getTagById(c) +}) + +tagsRoute.get("/name/:name", async (c) => { + return getTagByName(c) +}) + +export default tagsRoute diff --git a/wrangler.toml b/wrangler.toml index 19c3031..0ccc33a 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -10,9 +10,9 @@ binding = 'FILES_BUCKET' bucket_name = 'files' preview_bucket_name = 'files' -kv_namespaces = [ - { binding = "KV_SESSION_STORAGE", id = "a5ee030621cf4dfda60e0ad81bfd2f3b" }, -] - +[[kv_namespaces]] +binding = "KV_SESSION_STORAGE" +preview_id = "a5ee030621cf4dfda60e0ad81bfd2f3b" +id = "a5ee030621cf4dfda60e0ad81bfd2f3b" [vars] From 6e2e02aee20b98700ab0b15016584d9249fa2f40 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Mon, 16 Oct 2023 00:24:53 +0100 Subject: [PATCH 108/318] zod formdata validation for required routes --- src/lucia.d.ts | 2 +- src/v2/db/schema.ts | 5 +- .../asset-categories/deleteAssetCategory.ts | 35 +++-- .../collections/addAssetToCollection.ts | 52 ++++--- .../collections/deleteAssetCollection.ts | 31 ++-- .../collections/deleteAssetFromCollection.ts | 45 +++--- .../assets/favorite/removeFavoriteAsset.ts | 24 ++- src/v2/routes/auth/assets/uploadAsset.ts | 142 +++++++++++++----- src/v2/routes/auth/games/createGame.ts | 2 +- src/v2/routes/auth/games/deleteGame.ts | 43 +++--- src/v2/routes/auth/login-methods/discord.ts | 2 +- src/v2/routes/auth/login.ts | 35 ++++- .../deleteOCGeneratorResponse.ts | 61 ++++---- .../oc-generators/saveOCGeneratorResponse.ts | 38 ++++- src/v2/routes/auth/signup.ts | 81 +++++++++- src/v2/routes/auth/tags/createTag.ts | 27 +++- src/v2/routes/auth/tags/deleteTag.ts | 46 +++--- .../self-upload/uploadAvatar.ts | 34 ++++- .../self-upload/uploadBanner.ts | 37 ++++- .../user-attributes/updateUserAttributes.ts | 57 +++++-- .../user-relations/followUser.ts | 25 +-- .../user-relations/unfollowUser.ts | 42 +++--- src/v2/routes/search/asset/searchAssets.ts | 1 - src/v2/routes/tags/allTags.ts | 12 +- 24 files changed, 595 insertions(+), 284 deletions(-) diff --git a/src/lucia.d.ts b/src/lucia.d.ts index 8e4fb41..50078c9 100644 --- a/src/lucia.d.ts +++ b/src/lucia.d.ts @@ -12,7 +12,7 @@ declare namespace Lucia { pronouns: string | null verified: number bio: string | null - date_joined: number + date_joined: string role_flags: number is_contributor: number self_assignable_role_flags: number | null diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index 3a7822a..c13e7a4 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -22,7 +22,7 @@ export const users = sqliteTable( pronouns: text("pronouns"), verified: integer("verified").default(0).notNull(), bio: text("bio").default("No bio set").notNull(), - dateJoined: integer("date_joined").notNull(), + dateJoined: text("date_joined").notNull(), roleFlags: integer("role_flags").default(1).notNull(), isContributor: integer("is_contributor").default(0).notNull(), selfAssignableRoleFlags: integer("self_assignable_role_flags"), @@ -136,6 +136,9 @@ export const games = sqliteTable( name: text("name").notNull(), // e.g genshin-impact, honkai-impact-3rd formattedName: text("formatted_name").notNull(), // e.g Genshin Impact, Honkai Impact 3rd assetCount: integer("asset_count").default(0), + possibleSuggestiveContent: integer("possible_suggestive_content") + .default(0) + .notNull(), lastUpdated: integer("last_updated").notNull(), }, (game) => { diff --git a/src/v2/routes/auth/asset-categories/deleteAssetCategory.ts b/src/v2/routes/auth/asset-categories/deleteAssetCategory.ts index 7a4eeec..43750af 100644 --- a/src/v2/routes/auth/asset-categories/deleteAssetCategory.ts +++ b/src/v2/routes/auth/asset-categories/deleteAssetCategory.ts @@ -1,11 +1,26 @@ import { auth } from "@/v2/lib/auth/lucia" import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" import { getConnection } from "@/v2/db/turso" - +import { z } from "zod" import { eq } from "drizzle-orm" import { assetCategories } from "@/v2/db/schema" +const DeleteAssetCategorySchema = z.object({ + id: z.string({ + required_error: "ID is required", + invalid_type_error: "ID must be a string", + }), +}) + export async function deleteAssetCategory(c: APIContext): Promise { + const formData = DeleteAssetCategorySchema.safeParse(await c.req.formData()) + + if (!formData.success) { + return c.json({ success: false, state: "invalid data" }, 400) + } + + const { id } = formData.data + const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() @@ -25,20 +40,13 @@ export async function deleteAssetCategory(c: APIContext): Promise { const drizzle = getConnection(c.env).drizzle - const formData = await c.req.formData() - - const assetCategory = { - id: formData.get("id") as string | null, - } - - if (!assetCategory.id) { + if (!id) { return c.json({ success: false, state: "no id entered" }, 200) } // check if assetCategory exists const assetCategoryExists = await drizzle.query.assetCategories.findFirst({ - where: (assetCategories, { eq }) => - eq(assetCategories.id, assetCategory.id), + where: (assetCategories, { eq }) => eq(assetCategories.id, id), }) if (!assetCategoryExists) { @@ -54,7 +62,7 @@ export async function deleteAssetCategory(c: APIContext): Promise { try { await drizzle .delete(assetCategories) - .where(eq(assetCategories.id, assetCategory.id)) + .where(eq(assetCategories.id, id)) .execute() } catch (e) { return c.json( @@ -63,8 +71,5 @@ export async function deleteAssetCategory(c: APIContext): Promise { ) } - return c.json( - { success: true, state: "deleted assetCategory", assetCategory }, - 200 - ) + return c.json({ success: true, state: "deleted assetCategory", id }, 200) } diff --git a/src/v2/routes/auth/assets/collections/addAssetToCollection.ts b/src/v2/routes/auth/assets/collections/addAssetToCollection.ts index 61a6df3..b251d1a 100644 --- a/src/v2/routes/auth/assets/collections/addAssetToCollection.ts +++ b/src/v2/routes/auth/assets/collections/addAssetToCollection.ts @@ -1,9 +1,30 @@ import { auth } from "@/v2/lib/auth/lucia" import { getConnection } from "@/v2/db/turso" - +import { z } from "zod" import { userCollectionAssets } from "@/v2/db/schema" +const AddAssetToCollectionSchema = z.object({ + collectionId: z.string({ + required_error: "Collection ID is required", + invalid_type_error: "Collection ID must be a string", + }), + assetId: z.string({ + required_error: "Asset ID is required", + invalid_type_error: "Asset ID must be a string", + }), +}) + export async function addAssetToCollection(c: APIContext): Promise { + const formData = AddAssetToCollectionSchema.safeParse( + await c.req.formData() + ) + + if (!formData.success) { + return c.json({ success: false, state: "invalid data" }, 400) + } + + const { collectionId, assetId } = formData.data + const drizzle = getConnection(c.env).drizzle const authRequest = auth(c.env).handleRequest(c) @@ -17,28 +38,21 @@ export async function addAssetToCollection(c: APIContext): Promise { return c.json({ success: false, state: "invalid session" }, 401) } - const formData = await c.req.formData() - - const collection = { - id: formData.get("collectionId") as string | null, - assetId: formData.get("assetId") as string | null, - } - - if (!collection.id) { + if (!collectionId) { return c.json( { success: false, state: "no collection id entered" }, 200 ) } - if (!collection.assetId) { + if (!assetId) { return c.json({ success: false, state: "no asset id entered" }, 200) } // check if collection exists const collectionExists = await drizzle.query.userCollections.findFirst({ where: (userCollections, { eq }) => - eq(userCollections.id, collection.id), + eq(userCollections.id, collectionId), }) if (!collectionExists) { @@ -54,10 +68,7 @@ export async function addAssetToCollection(c: APIContext): Promise { // check if asset exists, and status is 1 (approved) const assetExists = await drizzle.query.assets.findFirst({ where: (assets, { eq, and }) => - and( - eq(assets.id, parseInt(collection.assetId)), - eq(assets.status, 1) - ), + and(eq(assets.id, parseInt(assetId)), eq(assets.status, 1)), }) if (!assetExists) { @@ -69,11 +80,8 @@ export async function addAssetToCollection(c: APIContext): Promise { await drizzle.query.userCollectionAssets.findFirst({ where: (userCollectionAssets, { eq, and }) => and( - eq(userCollectionAssets.collectionId, collection.id), - eq( - userCollectionAssets.assetId, - parseInt(collection.assetId) - ) + eq(userCollectionAssets.collectionId, collectionId), + eq(userCollectionAssets.assetId, parseInt(assetId)) ), }) @@ -93,8 +101,8 @@ export async function addAssetToCollection(c: APIContext): Promise { .insert(userCollectionAssets) .values({ id: crypto.randomUUID(), - collectionId: collection.id, - assetId: parseInt(collection.assetId), + collectionId: collectionId, + assetId: parseInt(assetId), }) .execute() } catch (e) { diff --git a/src/v2/routes/auth/assets/collections/deleteAssetCollection.ts b/src/v2/routes/auth/assets/collections/deleteAssetCollection.ts index 492d6c3..0497531 100644 --- a/src/v2/routes/auth/assets/collections/deleteAssetCollection.ts +++ b/src/v2/routes/auth/assets/collections/deleteAssetCollection.ts @@ -1,10 +1,27 @@ import { auth } from "@/v2/lib/auth/lucia" import { getConnection } from "@/v2/db/turso" - +import { z } from "zod" import { eq } from "drizzle-orm" import { userCollections } from "@/v2/db/schema" +const DeleteAssetCollectionSchema = z.object({ + collectionId: z.string({ + required_error: "Collection ID is required", + invalid_type_error: "Collection ID must be a string", + }), +}) + export async function deleteAssetCollection(c: APIContext): Promise { + const formData = DeleteAssetCollectionSchema.safeParse( + await c.req.formData() + ) + + if (!formData.success) { + return c.json({ success: false, state: "invalid data" }, 400) + } + + const { collectionId } = formData.data + const drizzle = getConnection(c.env).drizzle const authRequest = auth(c.env).handleRequest(c) @@ -18,13 +35,7 @@ export async function deleteAssetCollection(c: APIContext): Promise { return c.json({ success: false, state: "invalid session" }, 401) } - const formData = await c.req.formData() - - const collection = { - id: formData.get("collectionId") as string | null, - } - - if (!collection.id) { + if (!collectionId) { return c.json( { success: false, state: "no collection id entered" }, 200 @@ -34,7 +45,7 @@ export async function deleteAssetCollection(c: APIContext): Promise { // check if collection exists const collectionExists = await drizzle.query.userCollections.findFirst({ where: (userCollections, { eq }) => - eq(userCollections.id, collection.id), + eq(userCollections.id, collectionId), }) if (!collectionExists) { @@ -50,7 +61,7 @@ export async function deleteAssetCollection(c: APIContext): Promise { // delete collection await drizzle .delete(userCollections) - .where(eq(userCollections.id, collection.id)) + .where(eq(userCollections.id, collectionId)) .execute() return c.json({ success: true, state: "collection deleted" }, 200) diff --git a/src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts b/src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts index 6856123..3cd109b 100644 --- a/src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts +++ b/src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts @@ -1,12 +1,33 @@ import { auth } from "@/v2/lib/auth/lucia" import { getConnection } from "@/v2/db/turso" - +import { z } from "zod" import { userCollectionAssets } from "@/v2/db/schema" import { eq } from "drizzle-orm" +const DeleteAssetFromCollectionSchema = z.object({ + collectionId: z.string({ + required_error: "Collection ID is required", + invalid_type_error: "Collection ID must be a string", + }), + assetId: z.string({ + required_error: "Asset ID is required", + invalid_type_error: "Asset ID must be a string", + }), +}) + export async function deleteAssetFromCollection( c: APIContext ): Promise { + const formData = DeleteAssetFromCollectionSchema.safeParse( + await c.req.formData() + ) + + if (!formData.success) { + return c.json({ success: false, state: "invalid data" }, 400) + } + + const { collectionId, assetId } = formData.data + const drizzle = getConnection(c.env).drizzle const authRequest = auth(c.env).handleRequest(c) @@ -20,27 +41,20 @@ export async function deleteAssetFromCollection( return c.json({ success: false, state: "invalid session" }, 401) } - const formData = await c.req.formData() - - const collection = { - id: formData.get("collectionId") as string | null, - assetId: formData.get("assetId") as string | null, - } - - if (!collection.id) { + if (!collectionId) { return c.json( { success: false, state: "no collection id entered" }, 200 ) } - if (!collection.assetId) { + if (!assetId) { return c.json({ success: false, state: "no asset id entered" }, 401) } const collectionExists = await drizzle.query.userCollections.findFirst({ where: (userCollections, { eq }) => - eq(userCollections.id, collection.id), + eq(userCollections.id, collectionId), }) if (!collectionExists) { @@ -55,7 +69,7 @@ export async function deleteAssetFromCollection( // check if asset exists const assetExists = await drizzle.query.assets.findFirst({ - where: (assets, { eq }) => eq(assets.id, parseInt(collection.assetId)), + where: (assets, { eq }) => eq(assets.id, parseInt(collectionId)), }) if (!assetExists) { @@ -67,11 +81,8 @@ export async function deleteAssetFromCollection( await drizzle.query.userCollectionAssets.findFirst({ where: (userCollectionAssets, { eq, and }) => and( - eq(userCollectionAssets.collectionId, collection.id), - eq( - userCollectionAssets.assetId, - parseInt(collection.assetId) - ) + eq(userCollectionAssets.collectionId, collectionId), + eq(userCollectionAssets.assetId, parseInt(assetId)) ), }) diff --git a/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts b/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts index 4f453d4..bccf9f5 100644 --- a/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts +++ b/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts @@ -1,10 +1,25 @@ import { auth } from "@/v2/lib/auth/lucia" import { getConnection } from "@/v2/db/turso" import { eq } from "drizzle-orm" - +import { z } from "zod" import { userFavorites, userFavoritesAssets } from "@/v2/db/schema" +const RemoveFavoriteAssetSchema = z.object({ + assetToRemove: z.string({ + required_error: "Asset ID is required", + invalid_type_error: "Asset ID must be a string", + }), +}) + export async function removeFavoriteAsset(c: APIContext): Promise { + const formData = RemoveFavoriteAssetSchema.safeParse(await c.req.formData()) + + if (!formData.success) { + return c.json({ success: false, state: "invalid data" }, 400) + } + + const { assetToRemove } = formData.data + const drizzle = getConnection(c.env).drizzle const authRequest = auth(c.env).handleRequest(c) @@ -18,13 +33,6 @@ export async function removeFavoriteAsset(c: APIContext): Promise { return c.json({ success: false, state: "invalid session" }, 200) } - const formData = await c.req.formData() - const assetToRemove = formData.get("assetToRemove") as string | null - - if (!assetToRemove) { - return c.json({ success: false, state: "no assetid entered" }, 200) - } - // check if asset exists const asset = await drizzle.query.assets.findFirst({ where: (assets, { eq }) => eq(assets.id, parseInt(assetToRemove)), diff --git a/src/v2/routes/auth/assets/uploadAsset.ts b/src/v2/routes/auth/assets/uploadAsset.ts index a132056..ca73688 100644 --- a/src/v2/routes/auth/assets/uploadAsset.ts +++ b/src/v2/routes/auth/assets/uploadAsset.ts @@ -1,11 +1,63 @@ import { auth } from "@/v2/lib/auth/lucia" import { getConnection } from "@/v2/db/turso" -import { assets, assetTagsAssets } from "@/v2/db/schema" - +import { assets, assetTagsAssets, games, assetCategories } from "@/v2/db/schema" +import { z } from "zod" import { eq } from "drizzle-orm" import { SplitQueryByCommas } from "@/v2/lib/helpers/splitQueryByCommas" +const MAX_FILE_SIZE = 5000 +const ACCEPTED_IMAGE_TYPES = ["image/png"] + +const UploadAssetSchema = z.object({ + asset: z + .any() + .refine((files) => files?.length == 1, "Image is required.") + .refine( + (files) => files?.[0]?.size <= MAX_FILE_SIZE, + `Max file size is 5MB.` + ) + .refine( + (files) => ACCEPTED_IMAGE_TYPES.includes(files?.[0]?.type), + ".jpg, .jpeg, .png and .webp files are accepted." + ), + name: z.string({ + required_error: "Name is required", + invalid_type_error: "Name must be a string", + }), + extension: z.string({ + required_error: "Extension is required", + invalid_type_error: "Extension must be a string", + }), + tags: z.string().optional(), + category: z.string({ + required_error: "Category is required", + invalid_type_error: "Category must be a string", + }), + game: z.string({ + required_error: "Game is required", + invalid_type_error: "Game must be a string", + }), + size: z.number({ + required_error: "Size is required", + invalid_type_error: "Size must be a number", + }), + width: z.number({ + required_error: "Width is required", + invalid_type_error: "Width must be a number", + }), + height: z.number({ + required_error: "Height is required", + invalid_type_error: "Height must be a number", + }), +}) + export async function uploadAsset(c: APIContext): Promise { + const formData = UploadAssetSchema.safeParse(await c.req.formData()) + + if (!formData.success) { + return c.json({ success: false, state: "invalid data" }, 400) + } + const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() @@ -26,51 +78,52 @@ export async function uploadAsset(c: APIContext): Promise { const drizzle = getConnection(c.env).drizzle - const formData = await c.req.formData() - const asset = formData.get("asset") as unknown as File | null - - const metadata = { - name: formData.get("name") as string, // e.g keqing - extension: formData.get("extension") as string, // e.g png - tags: SplitQueryByCommas(formData.get("tags") as string), // e.g no-background, fanmade, official => ["no-background", "fanmade", "official"] - category: formData.get("category") as string, // e.g splash-art - game: formData.get("game") as string, // e.g genshin-impact - size: formData.get("size") as unknown as number, // e.g 1024 - width: formData.get("width") as unknown as number, // e.g 1920 - height: formData.get("height") as unknown as number, // e.g 1080 - } - - if (metadata.tags.length > 5) - return c.json({ - success: false, - state: `too many tags (${metadata.tags.length}). maximum is 5 tags per asset`, - }) - const newAsset = { - name: metadata.name, - extension: metadata.extension, - game: metadata.game, - assetCategory: metadata.category, - url: `/assets/${metadata.game}/${metadata.category}/${metadata.name}.${metadata.extension}`, + name: formData.data.name, + extension: formData.data.extension, + game: formData.data.game, + assetCategory: formData.data.category, + url: `/assets/${formData.data.game}/${formData.data.category}/${formData.data.name}.${formData.data.extension}`, uploadedById: session.user.userId, status: bypassApproval ? 1 : 2, uploadedDate: new Date().getTime(), - fileSize: asset.size, // stored in bytes - width: metadata.width, - height: metadata.height, + fileSize: formData.data.size, // stored in bytes + width: formData.data.width, + height: formData.data.height, } // rename file name to match metadata - const newAssetFile = new File([asset], newAsset.name, { - type: asset.type, + const newAssetFile = new File([formData.data.asset], newAsset.name, { + type: "image/png", }) const validTags = [] const invalidTags = [] + const game = await drizzle.query.games.findFirst({ + where: (games) => { + return eq(games.name, formData.data.game) + }, + }) + + const assetCategory = await drizzle.query.assetCategories.findFirst({ + where: (assetCategories) => { + return eq(assetCategories.name, formData.data.category) + }, + }) + + if (!game) + return c.json({ success: false, state: "game does not exist" }, 404) + + if (!assetCategory) + return c.json( + { success: false, state: "asset category does not exist" }, + 404 + ) + try { await c.env.FILES_BUCKET.put( - `/assets/${metadata.game}/${metadata.category}/${metadata.name}.${metadata.extension}`, + `/assets/${formData.data.game}/${formData.data.category}/${formData.data.name}.${formData.data.extension}`, newAssetFile ) @@ -84,8 +137,8 @@ export async function uploadAsset(c: APIContext): Promise { }) // checking if tags exist and setting relations - if (metadata.tags.length > 0) { - for (const tag of metadata.tags) { + if (formData.data.tags.length > 0) { + for (const tag of SplitQueryByCommas(formData.data.tags)) { const tagExists = await trx.query.assetTags.findFirst({ where: (assetTags) => { return eq(assetTags.name, tag) @@ -108,10 +161,27 @@ export async function uploadAsset(c: APIContext): Promise { } } } + + // updating game and category asset count + await trx + .update(games) + .set({ + assetCount: game.assetCount + 1, + }) + .where(eq(games.name, formData.data.game)) + .execute() + + await trx + .update(assetCategories) + .set({ + assetCount: assetCategory.assetCount + 1, + }) + .where(eq(assetCategories.name, formData.data.category)) + .execute() }) } catch (e) { await c.env.FILES_BUCKET.delete( - `/assets/${metadata.game}/${metadata.category}/${metadata.name}.${metadata.extension}` + `/assets/${formData.data.game}/${formData.data.category}/${formData.data.name}.${formData.data.extension}` ) return c.json({ success: false, state: "failed to upload asset" }, 500) } diff --git a/src/v2/routes/auth/games/createGame.ts b/src/v2/routes/auth/games/createGame.ts index be4d075..cb2519e 100644 --- a/src/v2/routes/auth/games/createGame.ts +++ b/src/v2/routes/auth/games/createGame.ts @@ -31,7 +31,7 @@ export async function createGame(c: APIContext): Promise { name: formData.get("name") as string, formattedName: formData.get("formattedName") as string, assetCount: 0, - lastUpdated: new Date().getTime(), // unix timestamp + lastUpdated: new Date().getTime(), } // check if game.name exists diff --git a/src/v2/routes/auth/games/deleteGame.ts b/src/v2/routes/auth/games/deleteGame.ts index a6c418b..ca5f271 100644 --- a/src/v2/routes/auth/games/deleteGame.ts +++ b/src/v2/routes/auth/games/deleteGame.ts @@ -1,11 +1,26 @@ import { auth } from "@/v2/lib/auth/lucia" import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" import { getConnection } from "@/v2/db/turso" - +import { z } from "zod" import { games } from "@/v2/db/schema" import { eq } from "drizzle-orm" +const DeleteGameSchema = z.object({ + id: z.string({ + required_error: "ID is required", + invalid_type_error: "ID must be a string", + }), +}) + export async function deleteGame(c: APIContext): Promise { + const formData = DeleteGameSchema.safeParse(await c.req.formData()) + + if (!formData.success) { + return c.json({ success: false, state: "invalid data" }, 400) + } + + const { id } = formData.data + const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() @@ -25,33 +40,11 @@ export async function deleteGame(c: APIContext): Promise { const drizzle = getConnection(c.env).drizzle - const formData = await c.req.formData() - - const game = { - id: formData.get("id") as string | null, - } - - if (!game.id) { - return c.json({ success: false, state: "no id entered" }, 200) - } - - // check if game exists - const gameExists = await drizzle.query.games.findFirst({ - where: (games, { eq }) => eq(games.id, game.id), - }) - - if (!gameExists) { - return c.json( - { success: false, state: "game with ID doesn't exist" }, - 200 - ) - } - try { - await drizzle.delete(games).where(eq(games.id, game.id)).execute() + await drizzle.delete(games).where(eq(games.id, id)).execute() } catch (e) { return c.json({ success: false, state: "failed to delete game" }, 500) } - return c.json({ success: true, state: "deleted game", game }, 200) + return c.json({ success: true, state: "deleted game", id }, 200) } diff --git a/src/v2/routes/auth/login-methods/discord.ts b/src/v2/routes/auth/login-methods/discord.ts index 9fe5540..bdf759d 100644 --- a/src/v2/routes/auth/login-methods/discord.ts +++ b/src/v2/routes/auth/login-methods/discord.ts @@ -102,7 +102,7 @@ export async function discordCallback(c: APIContext): Promise { display_name: discordUser.username, email: discordUser.email, email_verified: 1, - date_joined: Date.now(), + date_joined: new Date().toISOString(), verified: 0, role_flags: 1, is_contributor: 0, diff --git a/src/v2/routes/auth/login.ts b/src/v2/routes/auth/login.ts index 55e5e5b..8db0fb3 100644 --- a/src/v2/routes/auth/login.ts +++ b/src/v2/routes/auth/login.ts @@ -1,4 +1,5 @@ import { auth } from "@/v2/lib/auth/lucia" +import { z } from "zod" const usernameThrottling = new Map< string, @@ -8,11 +9,39 @@ const usernameThrottling = new Map< } >() +const LoginSchema = z.object({ + username: z + .string({ + required_error: "Username is required", + invalid_type_error: "Username must be a string", + }) + .min(3, "Username must be at least 3 characters long") + .max(32, "Username must be at most 32 characters long"), + password: z + .string({ + required_error: "Password is required", + invalid_type_error: "Password must be a string", + }) + .regex(new RegExp(".*[A-Z].*"), "One uppercase character is required") + .regex(new RegExp(".*[a-z].*"), "One lowercase character is required") + .regex(new RegExp(".*\\d.*"), "One number is required") + .regex( + new RegExp(".*[`~<>?,./!@#$%^&*()\\-_+=\"'|{}\\[\\];:\\\\].*"), + "One special character is required" + ) + .min(8, "Password must be at least 8 characters long") + .max(128, "Password must be at most 128 characters long"), +}) + export async function login(c: APIContext): Promise { - const formData = await c.req.formData() + const formData = LoginSchema.safeParse(await c.req.formData()) + + if (!formData.success) { + return c.json({ success: false, state: "invalid data" }, 400) + } + + const { username, password } = formData.data - const username = formData.get("username") as string - const password = formData.get("password") as string const validSession = await auth(c.env).handleRequest(c).validate() if (validSession) { diff --git a/src/v2/routes/auth/oc-generators/deleteOCGeneratorResponse.ts b/src/v2/routes/auth/oc-generators/deleteOCGeneratorResponse.ts index b7b6b32..7d6be0d 100644 --- a/src/v2/routes/auth/oc-generators/deleteOCGeneratorResponse.ts +++ b/src/v2/routes/auth/oc-generators/deleteOCGeneratorResponse.ts @@ -1,12 +1,29 @@ import { auth } from "@/v2/lib/auth/lucia" - +import { z } from "zod" import { savedOcGenerators } from "@/v2/db/schema" import { getConnection } from "@/v2/db/turso" import { eq, and } from "drizzle-orm" +const DeleteOCGeneratorResponseSchema = z.object({ + deleteID: z.string({ + required_error: "ID is required", + invalid_type_error: "ID must be a string", + }), +}) + export async function deleteOCGeneratorResponse( c: APIContext ): Promise { + const formData = DeleteOCGeneratorResponseSchema.safeParse( + await c.req.formData() + ) + + if (!formData.success) { + return c.json({ success: false, state: "invalid data" }, 400) + } + + const { deleteID } = formData.data + const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() @@ -20,42 +37,26 @@ export async function deleteOCGeneratorResponse( const drizzle = getConnection(c.env).drizzle - const formData = await c.req.formData() - const deleteID = (formData.get("deleteID") as string) || null - - if (!formData || !deleteID) - return c.json({ success: false, state: "no formdata provided" }, 200) - - const ocGeneratorResponse = await drizzle - .select() - .from(savedOcGenerators) - .where( - and( - eq(savedOcGenerators.id, deleteID), - eq(savedOcGenerators.userId, session.user.userId) - ) - ) - - if (!ocGeneratorResponse) - return c.json({ - success: false, - state: "no generator found matching id", - }) - - await drizzle - .delete(savedOcGenerators) - .where( - and( - eq(savedOcGenerators.id, deleteID), - eq(savedOcGenerators.userId, session.user.userId) + try { + await drizzle + .delete(savedOcGenerators) + .where( + and( + eq(savedOcGenerators.id, deleteID), + eq(savedOcGenerators.userId, session.user.userId) + ) ) + } catch (e) { + return c.json( + { success: false, state: "failed to delete saved oc generator" }, + 500 ) + } return c.json( { success: true, state: `deleted saved oc generator with id ${deleteID}`, - ocGeneratorResponse, }, 200 ) diff --git a/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts b/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts index 98b402f..9d21983 100644 --- a/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts +++ b/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts @@ -2,6 +2,7 @@ import { auth } from "@/v2/lib/auth/lucia" import { listBucket } from "@/v2/lib/listBucket" import { savedOcGenerators } from "@/v2/db/schema" import { getConnection } from "@/v2/db/turso" +import { z } from "zod" import type { OCGeneratorResponse as OCGeneratorRequestResponse } from "@/v2/lib/types/oc-generator" // matches data from oc generator and random entries from oc generator to prevent mismatched data from being saved @@ -35,9 +36,36 @@ function isValidOCGeneratorResponse( } } +const SaveOCGeneratorResponseSchema = z.object({ + name: z.string({ + required_error: "Name is required", + invalid_type_error: "Name must be a string", + }), + game: z.string({ + required_error: "Game is required", + invalid_type_error: "Game must be a string", + }), + isPublic: z.string({ + required_error: "isPublic is required", + invalid_type_error: "isPublic must be a string", + }), + content: z.string({ + required_error: "Content is required", + invalid_type_error: "Content must be a string", + }), +}) + export async function saveOCGeneratorResponse( c: APIContext ): Promise { + const formData = SaveOCGeneratorResponseSchema.safeParse( + await c.req.formData() + ) + + if (!formData.success) { + return c.json({ success: false, state: "invalid data" }, 400) + } + const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() @@ -51,17 +79,15 @@ export async function saveOCGeneratorResponse( const drizzle = getConnection(c.env).drizzle - const formData = await c.req.formData() - // TODO: make sure data is actually valid before inserting it into the database const ocGeneratorResponse = { id: crypto.randomUUID(), userId: session.user.userId, - name: formData.get("name") as string, - game: formData.get("game") as string, + name: formData.data.name, + game: formData.data.game, dateCreated: new Date().getTime(), - isPublic: parseInt(formData.get("isPublic") as string), // 1 = yes, 0 = no, default = 0 - content: formData.get("content") as string, // this is stored as json, which can then be parsed + isPublic: parseInt(formData.data.isPublic), // 1 = yes, 0 = no, default = 0 + content: formData.data.content, // this is stored as json, which can then be parsed } const files = await listBucket(c.env.FILES_BUCKET, { diff --git a/src/v2/routes/auth/signup.ts b/src/v2/routes/auth/signup.ts index e5e4532..7a90f09 100644 --- a/src/v2/routes/auth/signup.ts +++ b/src/v2/routes/auth/signup.ts @@ -1,11 +1,82 @@ import { auth } from "@/v2/lib/auth/lucia" +import { z } from "zod" + +const CreateAccountSchema = z + .object({ + username: z + .string({ + required_error: "Username is required", + invalid_type_error: "Username must be a string", + }) + .min(3, "Username must be at least 3 characters long") + .max(32, "Username must be at most 32 characters long"), + email: z + .string({ + required_error: "Email is required", + invalid_type_error: "Email must be a string", + }) + .email("Email must be a valid email address"), + password: z + .string({ + required_error: "Password is required", + invalid_type_error: "Password must be a string", + }) + .regex( + new RegExp(".*[A-Z].*"), + "One uppercase character is required" + ) + .regex( + new RegExp(".*[a-z].*"), + "One lowercase character is required" + ) + .regex(new RegExp(".*\\d.*"), "One number is required") + .regex( + new RegExp(".*[`~<>?,./!@#$%^&*()\\-_+=\"'|{}\\[\\];:\\\\].*"), + "One special character is required" + ) + .min(8, "Password must be at least 8 characters long") + .max(128, "Password must be at most 128 characters long"), + passwordConfirm: z + .string({ + required_error: "Password confirmation is required", + invalid_type_error: "Password confirmation must be a string", + }) + .regex( + new RegExp(".*[A-Z].*"), + "One uppercase character is required" + ) + .regex( + new RegExp(".*[a-z].*"), + "One lowercase character is required" + ) + .regex(new RegExp(".*\\d.*"), "One number") + .regex( + new RegExp(".*[`~<>?,./!@#$%^&*()\\-_+=\"'|{}\\[\\];:\\\\].*"), + "One special character is required" + ) + .min(8, "Password must be at least 8 characters long") + .max(128, "Password must be at most 128 characters long"), + secretKey: z + .string({ + required_error: "Secret key is required", + invalid_type_error: "Secret key must be a string", + }) + .min(1, "Secret key must be at least 1 characters long") + .max(128, "Secret key must be at most 128 characters long"), + }) + .refine((data) => data.password === data.passwordConfirm, { + message: "Passwords do not match", + path: ["passwordConfirm"], + }) export async function signup(c: APIContext): Promise { - const formData = await c.req.formData() + const formData = CreateAccountSchema.safeParse(await c.req.formData()) + + if (!formData.success) { + return c.json({ success: false, state: "invalid data" }, 400) + } - const username = formData.get("username") as string - const email = formData.get("email") as string - const password = formData.get("password") as string + const { username, email, password } = formData.data const validSession = await auth(c.env).handleRequest(c).validate() if (validSession) @@ -25,7 +96,7 @@ export async function signup(c: APIContext): Promise { display_name: username, email, email_verified: 0, - date_joined: Date.now(), + date_joined: new Date().toISOString(), verified: 0, role_flags: 1, is_contributor: 0, diff --git a/src/v2/routes/auth/tags/createTag.ts b/src/v2/routes/auth/tags/createTag.ts index 7222618..7edce34 100644 --- a/src/v2/routes/auth/tags/createTag.ts +++ b/src/v2/routes/auth/tags/createTag.ts @@ -1,10 +1,29 @@ import { auth } from "@/v2/lib/auth/lucia" import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" import { getConnection } from "@/v2/db/turso" - +import { z } from "zod" import { assetTags } from "@/v2/db/schema" +const CreateTagSchema = z.object({ + name: z.string({ + required_error: "Name is required", + invalid_type_error: "Name must be a string", + }), + formattedName: z.string({ + required_error: "Formatted name is required", + invalid_type_error: "Formatted name must be a string", + }), +}) + export async function createTag(c: APIContext): Promise { + const formData = CreateTagSchema.safeParse(await c.req.formData()) + + if (!formData.success) { + return c.json({ success: false, state: "invalid data" }, 400) + } + + const { name, formattedName } = formData.data + const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() @@ -24,12 +43,10 @@ export async function createTag(c: APIContext): Promise { const drizzle = getConnection(c.env).drizzle - const formData = await c.req.formData() - const tag = { id: crypto.randomUUID(), - name: formData.get("name") as string, - formattedName: formData.get("formattedName") as string, + name, + formattedName, assetCount: 0, lastUpdated: new Date().getTime(), // unix timestamp } diff --git a/src/v2/routes/auth/tags/deleteTag.ts b/src/v2/routes/auth/tags/deleteTag.ts index 236f514..706b655 100644 --- a/src/v2/routes/auth/tags/deleteTag.ts +++ b/src/v2/routes/auth/tags/deleteTag.ts @@ -1,11 +1,26 @@ import { auth } from "@/v2/lib/auth/lucia" import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" import { getConnection } from "@/v2/db/turso" - +import { z } from "zod" import { assetTags } from "@/v2/db/schema" import { eq } from "drizzle-orm" +const DeleteTagSchema = z.object({ + id: z.string({ + required_error: "ID is required", + invalid_type_error: "ID must be a string", + }), +}) + export async function deleteTag(c: APIContext): Promise { + const formData = DeleteTagSchema.safeParse(await c.req.formData()) + + if (!formData.success) { + return c.json({ success: false, state: "invalid data" }, 400) + } + + const { id } = formData.data + const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() @@ -25,36 +40,11 @@ export async function deleteTag(c: APIContext): Promise { const drizzle = getConnection(c.env).drizzle - const formData = await c.req.formData() - - const tag = { - id: formData.get("id") as string | null, - } - - if (!tag.id) { - return c.json({ success: false, state: "no id entered" }, 200) - } - - // check if tag exists - const tagExists = await drizzle.query.assetTags.findFirst({ - where: (assetTags, { eq }) => eq(assetTags.id, tag.id), - }) - - if (!tagExists) { - return c.json( - { success: false, state: "tag with ID doesn't exist" }, - 200 - ) - } - try { - await drizzle - .delete(assetTags) - .where(eq(assetTags.id, tag.id)) - .execute() + await drizzle.delete(assetTags).where(eq(assetTags.id, id)).execute() } catch (e) { return c.json({ success: false, state: "failed to delete tag" }, 200) } - return c.json({ success: true, state: "deleted tag", tag }, 200) + return c.json({ success: true, state: "deleted tag", id }, 200) } diff --git a/src/v2/routes/auth/user-attributes/self-upload/uploadAvatar.ts b/src/v2/routes/auth/user-attributes/self-upload/uploadAvatar.ts index 049646d..ff12b97 100644 --- a/src/v2/routes/auth/user-attributes/self-upload/uploadAvatar.ts +++ b/src/v2/routes/auth/user-attributes/self-upload/uploadAvatar.ts @@ -1,7 +1,33 @@ import { auth } from "@/v2/lib/auth/lucia" +import { z } from "zod" + +const ALLOWED_BANNER_TYPES = ["image/png"] +const MAX_AVATAR_SIZE = 5000 + +const UploadProfileImageSchema = z.object({ + avatar: z + .any() + .refine((files) => files?.length == 1, "Avatar is required.") + .refine( + (files) => files?.[0]?.size <= MAX_AVATAR_SIZE, + `Max file size is 5MB.` + ) + .refine( + (files) => ALLOWED_BANNER_TYPES.includes(files?.[0]?.type), + ".png files are accepted." + ), +}) // TODO: add support for animated avatars export async function uploadProfileImage(c: APIContext): Promise { + const formData = UploadProfileImageSchema.safeParse(await c.req.formData()) + + if (!formData.success) { + return c.json({ success: false, state: "invalid data" }, 400) + } + + const { avatar } = formData.data + const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() @@ -13,14 +39,6 @@ export async function uploadProfileImage(c: APIContext): Promise { return c.json({ success: false, state: "invalid session" }, 200) } - const formData = await c.req.formData() - - const avatar = formData.get("avatar") as unknown as File | null - - if (!avatar || avatar.type !== "image/png") { - return c.json({ success: false, state: "invalid avatar" }, 200) - } - const newAvatar = new File([avatar], `${session.user.userId}.png`) const newAvatarURL = `/avatars/${session.user.userId}.png` diff --git a/src/v2/routes/auth/user-attributes/self-upload/uploadBanner.ts b/src/v2/routes/auth/user-attributes/self-upload/uploadBanner.ts index 305268b..458465e 100644 --- a/src/v2/routes/auth/user-attributes/self-upload/uploadBanner.ts +++ b/src/v2/routes/auth/user-attributes/self-upload/uploadBanner.ts @@ -1,7 +1,36 @@ import { auth } from "@/v2/lib/auth/lucia" +import { z } from "zod" + +const ALLOWED_BANNER_TYPES = ["image/png"] +const MAX_BANNER_SIZE = 5000 +// TODO(dromzeh): implement size checks +// const MAX_BANNER_WIDTH = 1920 +// const MAX_BANNER_HEIGHT = 1080 + +const UploadBannerSchema = z.object({ + banner: z + .any() + .refine((files) => files?.length == 1, "Banner is required.") + .refine( + (files) => files?.[0]?.size <= MAX_BANNER_SIZE, + `Max file size is 5MB.` + ) + .refine( + (files) => ALLOWED_BANNER_TYPES.includes(files?.[0]?.type), + ".png files are accepted." + ), +}) // TODO: add support for animated banners export async function uploadBannerImage(c: APIContext): Promise { + const formData = UploadBannerSchema.safeParse(await c.req.formData()) + + if (!formData.success) { + return c.json({ success: false, state: "invalid data" }, 400) + } + + const { banner } = formData.data + const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() @@ -17,14 +46,6 @@ export async function uploadBannerImage(c: APIContext): Promise { return c.json({ success: false, state: "unauthorized" }, 401) } - const formData = await c.req.formData() - - const banner = formData.get("banner") as unknown as File | null - - if (!banner || banner.type !== "image/png") { - return c.json({ success: false, state: "invalid banner" }, 200) - } - const newBanner = new File([banner], `${session.user.userId}.png`) const newBannerURL = `/banners/${session.user.userId}.png` diff --git a/src/v2/routes/auth/user-attributes/updateUserAttributes.ts b/src/v2/routes/auth/user-attributes/updateUserAttributes.ts index 0b94326..56964a3 100644 --- a/src/v2/routes/auth/user-attributes/updateUserAttributes.ts +++ b/src/v2/routes/auth/user-attributes/updateUserAttributes.ts @@ -1,4 +1,5 @@ import { auth } from "@/v2/lib/auth/lucia" +import { z } from "zod" type UserAttributes = { username?: string @@ -7,7 +8,42 @@ type UserAttributes = { bio?: string } +const UpdateUserAttributesSchema = z + .object({ + username: z + .string({ + invalid_type_error: "Username must be a string", + }) + .min(3, "Username must be at least 3 characters long") + .max(32, "Username must be at most 32 characters long") + .optional(), + pronouns: z + .string({ + invalid_type_error: "Pronouns must be a string", + }) + .optional(), + self_assignable_roles: z + .number({ + invalid_type_error: "Self-assignable roles must be a number", + }) + .optional(), + bio: z + .string({ + invalid_type_error: "Bio must be a string", + }) + .optional(), + }) + .partial() + export async function updateUserAttributes(c: APIContext): Promise { + const formData = UpdateUserAttributesSchema.safeParse( + await c.req.formData() + ) + + if (!formData.success) { + return c.json({ success: false, state: "invalid data" }, 400) + } + const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() @@ -19,26 +55,15 @@ export async function updateUserAttributes(c: APIContext): Promise { return c.json({ success: false, state: "unauthorized" }, 401) } - const formData = (await c.req.formData()) as FormData - const attributes: UserAttributes = { - username: formData.get("username"), - pronouns: formData.get("pronouns"), - self_assignable_role_flags: Number( - formData.get("self_assignable_roles") - ), - bio: formData.get("bio"), + username: formData.data.username, + pronouns: formData.data.pronouns, + self_assignable_role_flags: formData.data.self_assignable_roles, + bio: formData.data.bio, } - const attributesWithoutNull = Object.fromEntries( - Object.entries(attributes).filter(([, value]) => value !== null) - ) - try { - await auth(c.env).updateUserAttributes( - session.user.userId, - attributesWithoutNull - ) + await auth(c.env).updateUserAttributes(session.user.userId, attributes) return c.json( { success: true, state: "updated user attributes", session }, 200 diff --git a/src/v2/routes/auth/user-attributes/user-relations/followUser.ts b/src/v2/routes/auth/user-attributes/user-relations/followUser.ts index 91c70a6..8b785fe 100644 --- a/src/v2/routes/auth/user-attributes/user-relations/followUser.ts +++ b/src/v2/routes/auth/user-attributes/user-relations/followUser.ts @@ -1,9 +1,24 @@ import { auth } from "@/v2/lib/auth/lucia" import { getConnection } from "@/v2/db/turso" - +import { z } from "zod" import { following, follower } from "@/v2/db/schema" +const FollowUserSchema = z.object({ + userIdToFollow: z.string({ + required_error: "User ID is required", + invalid_type_error: "User ID must be a string", + }), +}) + export async function followUser(c: APIContext): Promise { + const formData = FollowUserSchema.safeParse(await c.req.formData()) + + if (!formData.success) { + return c.json({ success: false, state: "invalid data" }, 400) + } + + const { userIdToFollow: userToFollow } = formData.data + const drizzle = getConnection(c.env).drizzle const authRequest = auth(c.env).handleRequest(c) @@ -17,14 +32,6 @@ export async function followUser(c: APIContext): Promise { return c.json({ success: false, state: "invalid session" }, 200) } - const formData = await c.req.formData() - - const userToFollow = formData.get("userIdToFollow") as string | null - - if (!userToFollow) { - return c.json({ success: false, state: "no userid entered" }, 200) - } - // check if user exists const user = await drizzle.query.users.findFirst({ where: (users, { eq }) => eq(users.id, userToFollow), diff --git a/src/v2/routes/auth/user-attributes/user-relations/unfollowUser.ts b/src/v2/routes/auth/user-attributes/user-relations/unfollowUser.ts index 573c8b7..d157ddc 100644 --- a/src/v2/routes/auth/user-attributes/user-relations/unfollowUser.ts +++ b/src/v2/routes/auth/user-attributes/user-relations/unfollowUser.ts @@ -1,10 +1,25 @@ import { auth } from "@/v2/lib/auth/lucia" import { getConnection } from "@/v2/db/turso" - +import { z } from "zod" import { following, follower } from "@/v2/db/schema" import { eq } from "drizzle-orm" +const UnfollowUserSchema = z.object({ + userIdToUnFollow: z.string({ + required_error: "User ID is required", + invalid_type_error: "User ID must be a string", + }), +}) + export async function unfollowUser(c: APIContext): Promise { + const formData = UnfollowUserSchema.safeParse(await c.req.formData()) + + if (!formData.success) { + return c.json({ success: false, state: "invalid data" }, 400) + } + + const { userIdToUnFollow: userToUnFollow } = formData.data + const drizzle = getConnection(c.env).drizzle const authRequest = auth(c.env).handleRequest(c) @@ -18,12 +33,11 @@ export async function unfollowUser(c: APIContext): Promise { return c.json({ success: false, state: "invalid session" }, 200) } - const formData = await c.req.formData() - - const userToUnFollow = formData.get("userIdToUnFollow") as string | null - - if (!userToUnFollow) { - return c.json({ success: false, state: "no userid entered" }, 200) + if (userToUnFollow === session.user.userId) { + return c.json( + { success: false, state: "cannot unfollow yourself" }, + 200 + ) } // check if user exists @@ -35,13 +49,6 @@ export async function unfollowUser(c: APIContext): Promise { return c.json({ success: false, state: "user not found" }, 200) } - if (user.id === session.user.userId) { - return c.json( - { success: false, state: "cannot unfollow yourself" }, - 200 - ) - } - const isFollowing = await drizzle.query.following.findFirst({ where: (following, { eq }) => eq(following.id, `${session.user.userId}-${userToUnFollow}`), @@ -51,17 +58,16 @@ export async function unfollowUser(c: APIContext): Promise { return c.json({ success: false, state: "not following" }, 200) } - await drizzle.transaction(async (transaction) => { - await transaction + await drizzle.transaction(async (trx) => { + await trx .delete(follower) .where(eq(follower.id, `${session.user.userId}-${userToUnFollow}`)) .execute() - await transaction + await trx .delete(following) .where(eq(following.id, `${session.user.userId}-${userToUnFollow}`)) .execute() - return c.json({ success: true, state: "unfollowed user" }, 200) }) diff --git a/src/v2/routes/search/asset/searchAssets.ts b/src/v2/routes/search/asset/searchAssets.ts index efe8fe1..149fa22 100644 --- a/src/v2/routes/search/asset/searchAssets.ts +++ b/src/v2/routes/search/asset/searchAssets.ts @@ -1,6 +1,5 @@ import { responseHeaders } from "@/v2/lib/responseHeaders" import { getConnection } from "@/v2/db/turso" - import { assetTagsAssets, assets, assetTags, users } from "@/v2/db/schema" import { desc, like, sql, eq, and, or } from "drizzle-orm" import { SplitQueryByCommas } from "@/v2/lib/helpers/splitQueryByCommas" diff --git a/src/v2/routes/tags/allTags.ts b/src/v2/routes/tags/allTags.ts index 06148e3..feba22a 100644 --- a/src/v2/routes/tags/allTags.ts +++ b/src/v2/routes/tags/allTags.ts @@ -9,23 +9,15 @@ export async function listAllAssetTags(c: APIContext): Promise { const drizzle = getConnection(c.env).drizzle - const someAssetTags = await drizzle.query.assetTags.findMany({ + const allAssetTags = await drizzle.query.assetTags.findMany({ orderBy: (assetTags) => assetTags.name, - limit: 500, - with: { - assetTagsAssets: { - with: { - assets: true, - }, - }, - }, }) response = c.json( { success: true, status: "ok", - someAssetTags, + allAssetTags, }, 200 ) From 62de25e8a61eccd82bcf2a83ebeff1cb647781d0 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Mon, 16 Oct 2023 10:32:46 +0100 Subject: [PATCH 109/318] ?? --- src/v2/routes/auth/login.ts | 41 ++++++++----------- src/v2/routes/auth/signup.ts | 7 +++- .../user-attributes/updateUserAttributes.ts | 7 ++++ src/v2/routes/search/searchRoutes.ts | 4 +- 4 files changed, 31 insertions(+), 28 deletions(-) diff --git a/src/v2/routes/auth/login.ts b/src/v2/routes/auth/login.ts index 8db0fb3..a3f20be 100644 --- a/src/v2/routes/auth/login.ts +++ b/src/v2/routes/auth/login.ts @@ -10,43 +10,34 @@ const usernameThrottling = new Map< >() const LoginSchema = z.object({ - username: z - .string({ - required_error: "Username is required", - invalid_type_error: "Username must be a string", - }) - .min(3, "Username must be at least 3 characters long") - .max(32, "Username must be at most 32 characters long"), - password: z - .string({ - required_error: "Password is required", - invalid_type_error: "Password must be a string", - }) - .regex(new RegExp(".*[A-Z].*"), "One uppercase character is required") - .regex(new RegExp(".*[a-z].*"), "One lowercase character is required") - .regex(new RegExp(".*\\d.*"), "One number is required") - .regex( - new RegExp(".*[`~<>?,./!@#$%^&*()\\-_+=\"'|{}\\[\\];:\\\\].*"), - "One special character is required" - ) - .min(8, "Password must be at least 8 characters long") - .max(128, "Password must be at most 128 characters long"), + username: z.string({ + required_error: "Username is required", + invalid_type_error: "Username must be a string", + }), + password: z.string({ + required_error: "Password is required", + invalid_type_error: "Password must be a string", + }), }) export async function login(c: APIContext): Promise { - const formData = LoginSchema.safeParse(await c.req.formData()) + const formData = LoginSchema.safeParse( + await c.req.formData().then((formData) => { + const data = Object.fromEntries(formData.entries()) + return data + }) + ) if (!formData.success) { + console.log(formData) return c.json({ success: false, state: "invalid data" }, 400) } const { username, password } = formData.data const validSession = await auth(c.env).handleRequest(c).validate() - - if (validSession) { + if (validSession) return c.json({ success: false, state: "already logged in" }, 200) - } const storedThrottling = usernameThrottling.get(username) const timeoutUntil = storedThrottling?.timeoutUntil ?? 0 diff --git a/src/v2/routes/auth/signup.ts b/src/v2/routes/auth/signup.ts index 7a90f09..4a3b923 100644 --- a/src/v2/routes/auth/signup.ts +++ b/src/v2/routes/auth/signup.ts @@ -70,7 +70,12 @@ const CreateAccountSchema = z }) export async function signup(c: APIContext): Promise { - const formData = CreateAccountSchema.safeParse(await c.req.formData()) + const formData = CreateAccountSchema.safeParse( + await c.req.formData().then((formData) => { + const data = Object.fromEntries(formData.entries()) + return data + }) + ) if (!formData.success) { return c.json({ success: false, state: "invalid data" }, 400) diff --git a/src/v2/routes/auth/user-attributes/updateUserAttributes.ts b/src/v2/routes/auth/user-attributes/updateUserAttributes.ts index 56964a3..2a8d0c7 100644 --- a/src/v2/routes/auth/user-attributes/updateUserAttributes.ts +++ b/src/v2/routes/auth/user-attributes/updateUserAttributes.ts @@ -2,6 +2,7 @@ import { auth } from "@/v2/lib/auth/lucia" import { z } from "zod" type UserAttributes = { + display_name?: string username?: string pronouns?: string self_assignable_role_flags?: number @@ -10,6 +11,11 @@ type UserAttributes = { const UpdateUserAttributesSchema = z .object({ + display_name: z + .string({ + invalid_type_error: "Display name must be a string", + }) + .optional(), username: z .string({ invalid_type_error: "Username must be a string", @@ -56,6 +62,7 @@ export async function updateUserAttributes(c: APIContext): Promise { } const attributes: UserAttributes = { + display_name: formData.data.display_name, username: formData.data.username, pronouns: formData.data.pronouns, self_assignable_role_flags: formData.data.self_assignable_roles, diff --git a/src/v2/routes/search/searchRoutes.ts b/src/v2/routes/search/searchRoutes.ts index 3546c72..443da02 100644 --- a/src/v2/routes/search/searchRoutes.ts +++ b/src/v2/routes/search/searchRoutes.ts @@ -17,7 +17,7 @@ authRoute.use( "/all/:query", cors({ credentials: true, - origin: ["*"], // TODO: update this - temporary + origin: ["http://localhost:3000"], // TODO: update this - temporary }) ) @@ -25,7 +25,7 @@ authRoute.use( "/users/user/:username", cors({ credentials: true, - origin: ["*"], // TODO: update this - temporary + origin: ["http://localhost:3000"], // TODO: update this - temporary }) ) From 88aea96a1a3902f5c621a211f20785a3c75026d4 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Mon, 16 Oct 2023 10:37:45 +0100 Subject: [PATCH 110/318] fix formdata parsing --- .../routes/auth/asset-categories/deleteAssetCategory.ts | 7 ++++++- .../auth/assets/collections/addAssetToCollection.ts | 5 ++++- .../auth/assets/collections/deleteAssetFromCollection.ts | 5 ++++- src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts | 7 ++++++- src/v2/routes/auth/login.ts | 1 - .../auth/oc-generators/deleteOCGeneratorResponse.ts | 5 ++++- .../routes/auth/oc-generators/saveOCGeneratorResponse.ts | 5 ++++- src/v2/routes/auth/tags/createTag.ts | 7 ++++++- src/v2/routes/auth/tags/deleteTag.ts | 7 ++++++- .../auth/user-attributes/self-upload/uploadAvatar.ts | 7 ++++++- .../auth/user-attributes/self-upload/uploadBanner.ts | 7 ++++++- .../routes/auth/user-attributes/updateUserAttributes.ts | 5 ++++- .../auth/user-attributes/user-relations/followUser.ts | 7 ++++++- .../auth/user-attributes/user-relations/unfollowUser.ts | 8 ++++++-- 14 files changed, 68 insertions(+), 15 deletions(-) diff --git a/src/v2/routes/auth/asset-categories/deleteAssetCategory.ts b/src/v2/routes/auth/asset-categories/deleteAssetCategory.ts index 43750af..ccdc10d 100644 --- a/src/v2/routes/auth/asset-categories/deleteAssetCategory.ts +++ b/src/v2/routes/auth/asset-categories/deleteAssetCategory.ts @@ -13,7 +13,12 @@ const DeleteAssetCategorySchema = z.object({ }) export async function deleteAssetCategory(c: APIContext): Promise { - const formData = DeleteAssetCategorySchema.safeParse(await c.req.formData()) + const formData = DeleteAssetCategorySchema.safeParse( + await c.req.formData().then((formData) => { + const data = Object.fromEntries(formData.entries()) + return data + }) + ) if (!formData.success) { return c.json({ success: false, state: "invalid data" }, 400) diff --git a/src/v2/routes/auth/assets/collections/addAssetToCollection.ts b/src/v2/routes/auth/assets/collections/addAssetToCollection.ts index b251d1a..16d4361 100644 --- a/src/v2/routes/auth/assets/collections/addAssetToCollection.ts +++ b/src/v2/routes/auth/assets/collections/addAssetToCollection.ts @@ -16,7 +16,10 @@ const AddAssetToCollectionSchema = z.object({ export async function addAssetToCollection(c: APIContext): Promise { const formData = AddAssetToCollectionSchema.safeParse( - await c.req.formData() + await c.req.formData().then((formData) => { + const data = Object.fromEntries(formData.entries()) + return data + }) ) if (!formData.success) { diff --git a/src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts b/src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts index 3cd109b..1cf5ff5 100644 --- a/src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts +++ b/src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts @@ -19,7 +19,10 @@ export async function deleteAssetFromCollection( c: APIContext ): Promise { const formData = DeleteAssetFromCollectionSchema.safeParse( - await c.req.formData() + await c.req.formData().then((formData) => { + const data = Object.fromEntries(formData.entries()) + return data + }) ) if (!formData.success) { diff --git a/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts b/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts index bccf9f5..5d31f34 100644 --- a/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts +++ b/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts @@ -12,7 +12,12 @@ const RemoveFavoriteAssetSchema = z.object({ }) export async function removeFavoriteAsset(c: APIContext): Promise { - const formData = RemoveFavoriteAssetSchema.safeParse(await c.req.formData()) + const formData = RemoveFavoriteAssetSchema.safeParse( + await c.req.formData().then((formData) => { + const data = Object.fromEntries(formData.entries()) + return data + }) + ) if (!formData.success) { return c.json({ success: false, state: "invalid data" }, 400) diff --git a/src/v2/routes/auth/login.ts b/src/v2/routes/auth/login.ts index a3f20be..0f84cd5 100644 --- a/src/v2/routes/auth/login.ts +++ b/src/v2/routes/auth/login.ts @@ -29,7 +29,6 @@ export async function login(c: APIContext): Promise { ) if (!formData.success) { - console.log(formData) return c.json({ success: false, state: "invalid data" }, 400) } diff --git a/src/v2/routes/auth/oc-generators/deleteOCGeneratorResponse.ts b/src/v2/routes/auth/oc-generators/deleteOCGeneratorResponse.ts index 7d6be0d..11f9345 100644 --- a/src/v2/routes/auth/oc-generators/deleteOCGeneratorResponse.ts +++ b/src/v2/routes/auth/oc-generators/deleteOCGeneratorResponse.ts @@ -15,7 +15,10 @@ export async function deleteOCGeneratorResponse( c: APIContext ): Promise { const formData = DeleteOCGeneratorResponseSchema.safeParse( - await c.req.formData() + await c.req.formData().then((formData) => { + const data = Object.fromEntries(formData.entries()) + return data + }) ) if (!formData.success) { diff --git a/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts b/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts index 9d21983..65524e0 100644 --- a/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts +++ b/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts @@ -59,7 +59,10 @@ export async function saveOCGeneratorResponse( c: APIContext ): Promise { const formData = SaveOCGeneratorResponseSchema.safeParse( - await c.req.formData() + await c.req.formData().then((formData) => { + const data = Object.fromEntries(formData.entries()) + return data + }) ) if (!formData.success) { diff --git a/src/v2/routes/auth/tags/createTag.ts b/src/v2/routes/auth/tags/createTag.ts index 7edce34..80550a3 100644 --- a/src/v2/routes/auth/tags/createTag.ts +++ b/src/v2/routes/auth/tags/createTag.ts @@ -16,7 +16,12 @@ const CreateTagSchema = z.object({ }) export async function createTag(c: APIContext): Promise { - const formData = CreateTagSchema.safeParse(await c.req.formData()) + const formData = CreateTagSchema.safeParse( + await c.req.formData().then((formData) => { + const data = Object.fromEntries(formData.entries()) + return data + }) + ) if (!formData.success) { return c.json({ success: false, state: "invalid data" }, 400) diff --git a/src/v2/routes/auth/tags/deleteTag.ts b/src/v2/routes/auth/tags/deleteTag.ts index 706b655..778c11c 100644 --- a/src/v2/routes/auth/tags/deleteTag.ts +++ b/src/v2/routes/auth/tags/deleteTag.ts @@ -13,7 +13,12 @@ const DeleteTagSchema = z.object({ }) export async function deleteTag(c: APIContext): Promise { - const formData = DeleteTagSchema.safeParse(await c.req.formData()) + const formData = DeleteTagSchema.safeParse( + await c.req.formData().then((formData) => { + const data = Object.fromEntries(formData.entries()) + return data + }) + ) if (!formData.success) { return c.json({ success: false, state: "invalid data" }, 400) diff --git a/src/v2/routes/auth/user-attributes/self-upload/uploadAvatar.ts b/src/v2/routes/auth/user-attributes/self-upload/uploadAvatar.ts index ff12b97..deacedc 100644 --- a/src/v2/routes/auth/user-attributes/self-upload/uploadAvatar.ts +++ b/src/v2/routes/auth/user-attributes/self-upload/uploadAvatar.ts @@ -20,7 +20,12 @@ const UploadProfileImageSchema = z.object({ // TODO: add support for animated avatars export async function uploadProfileImage(c: APIContext): Promise { - const formData = UploadProfileImageSchema.safeParse(await c.req.formData()) + const formData = UploadProfileImageSchema.safeParse( + await c.req.formData().then((formData) => { + const data = Object.fromEntries(formData.entries()) + return data + }) + ) if (!formData.success) { return c.json({ success: false, state: "invalid data" }, 400) diff --git a/src/v2/routes/auth/user-attributes/self-upload/uploadBanner.ts b/src/v2/routes/auth/user-attributes/self-upload/uploadBanner.ts index 458465e..fac880a 100644 --- a/src/v2/routes/auth/user-attributes/self-upload/uploadBanner.ts +++ b/src/v2/routes/auth/user-attributes/self-upload/uploadBanner.ts @@ -23,7 +23,12 @@ const UploadBannerSchema = z.object({ // TODO: add support for animated banners export async function uploadBannerImage(c: APIContext): Promise { - const formData = UploadBannerSchema.safeParse(await c.req.formData()) + const formData = UploadBannerSchema.safeParse( + await c.req.formData().then((formData) => { + const data = Object.fromEntries(formData.entries()) + return data + }) + ) if (!formData.success) { return c.json({ success: false, state: "invalid data" }, 400) diff --git a/src/v2/routes/auth/user-attributes/updateUserAttributes.ts b/src/v2/routes/auth/user-attributes/updateUserAttributes.ts index 2a8d0c7..4ac15bd 100644 --- a/src/v2/routes/auth/user-attributes/updateUserAttributes.ts +++ b/src/v2/routes/auth/user-attributes/updateUserAttributes.ts @@ -43,7 +43,10 @@ const UpdateUserAttributesSchema = z export async function updateUserAttributes(c: APIContext): Promise { const formData = UpdateUserAttributesSchema.safeParse( - await c.req.formData() + await c.req.formData().then((formData) => { + const data = Object.fromEntries(formData.entries()) + return data + }) ) if (!formData.success) { diff --git a/src/v2/routes/auth/user-attributes/user-relations/followUser.ts b/src/v2/routes/auth/user-attributes/user-relations/followUser.ts index 8b785fe..afc0fd5 100644 --- a/src/v2/routes/auth/user-attributes/user-relations/followUser.ts +++ b/src/v2/routes/auth/user-attributes/user-relations/followUser.ts @@ -11,7 +11,12 @@ const FollowUserSchema = z.object({ }) export async function followUser(c: APIContext): Promise { - const formData = FollowUserSchema.safeParse(await c.req.formData()) + const formData = FollowUserSchema.safeParse( + await c.req.formData().then((formData) => { + const data = Object.fromEntries(formData.entries()) + return data + }) + ) if (!formData.success) { return c.json({ success: false, state: "invalid data" }, 400) diff --git a/src/v2/routes/auth/user-attributes/user-relations/unfollowUser.ts b/src/v2/routes/auth/user-attributes/user-relations/unfollowUser.ts index d157ddc..e221de4 100644 --- a/src/v2/routes/auth/user-attributes/user-relations/unfollowUser.ts +++ b/src/v2/routes/auth/user-attributes/user-relations/unfollowUser.ts @@ -12,8 +12,12 @@ const UnfollowUserSchema = z.object({ }) export async function unfollowUser(c: APIContext): Promise { - const formData = UnfollowUserSchema.safeParse(await c.req.formData()) - + const formData = UnfollowUserSchema.safeParse( + await c.req.formData().then((formData) => { + const data = Object.fromEntries(formData.entries()) + return data + }) + ) if (!formData.success) { return c.json({ success: false, state: "invalid data" }, 400) } From a5ea1ce78f9e9652dd02738cf2b7067cd8855973 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Mon, 16 Oct 2023 11:30:13 +0100 Subject: [PATCH 111/318] lfg --- src/v2/lib/resend/email.ts | 38 ++++--- src/v2/routes/auth/authRoutes.ts | 14 +++ src/v2/routes/auth/resetPassword.ts | 148 ++++++++++++++++++++++++++++ src/v2/routes/auth/signup.ts | 23 +++++ src/v2/routes/auth/verifyEmail.ts | 49 +++++++++ src/worker-configuration.d.ts | 1 + 6 files changed, 259 insertions(+), 14 deletions(-) create mode 100644 src/v2/routes/auth/resetPassword.ts create mode 100644 src/v2/routes/auth/verifyEmail.ts diff --git a/src/v2/lib/resend/email.ts b/src/v2/lib/resend/email.ts index 9897690..67313a7 100644 --- a/src/v2/lib/resend/email.ts +++ b/src/v2/lib/resend/email.ts @@ -1,16 +1,20 @@ import { Resend } from "resend" -// TODO: use react email w/ tailwind -const resend = new Resend("") +const emailFrom = "Test " + +const resend = (c: APIContext) => { + return new Resend(c.env.RESEND_API_KEY) +} export const sendPasswordResetEmail = async ( email: string, link: string, - username: string + username: string, + c: APIContext ) => { try { - await resend.emails.send({ - from: "Test ", + await resend(c).emails.send({ + from: emailFrom, to: email, subject: "Password Reset Request", html: `Password reset for ${username}
Click here to reset your password`, @@ -22,11 +26,12 @@ export const sendPasswordResetEmail = async ( export const sendPasswordChangeEmail = async ( email: string, - username: string + username: string, + c: APIContext ) => { try { - await resend.emails.send({ - from: "Test ", + await resend(c).emails.send({ + from: emailFrom, to: email, subject: "Password Updated Confirmation", html: `Your password for ${username} has been updated.
Wasn't you? Contact us at support@wanderer.moe`, @@ -36,10 +41,14 @@ export const sendPasswordChangeEmail = async ( } } -export const sendEmailChangeEmail = async (email: string, username: string) => { +export const sendEmailChangeEmail = async ( + email: string, + username: string, + c: APIContext +) => { try { - await resend.emails.send({ - from: "Test ", + await resend(c).emails.send({ + from: emailFrom, to: email, subject: "Email Change Request", html: `Your email address for ${username} has been changed.
Wasn't you? Contact us at support@wanderer.moe`, @@ -52,11 +61,12 @@ export const sendEmailChangeEmail = async (email: string, username: string) => { export const sendEmailConfirmationEmail = async ( email: string, link: string, - username: string + username: string, + c: APIContext ) => { try { - await resend.emails.send({ - from: "Test ", + await resend(c).emails.send({ + from: emailFrom, to: email, subject: "Email Confirmation", html: `Email confirmation for ${username}
Click here to confirm your email`, diff --git a/src/v2/routes/auth/authRoutes.ts b/src/v2/routes/auth/authRoutes.ts index 9ed1c84..e667cbd 100644 --- a/src/v2/routes/auth/authRoutes.ts +++ b/src/v2/routes/auth/authRoutes.ts @@ -4,6 +4,8 @@ import { logout } from "./logout" import { signup } from "./signup" import { cors } from "hono/cors" import { validate } from "./validate" +import { verifyEmail } from "./verifyEmail" +import { resetPassword, generatePasswordResetToken } from "./resetPassword" import assetCategoryRoute from "./asset-categories/assetCategoryRoutes" import assetRoute from "./assets/assetRoutes" import ocGeneratorRoute from "./oc-generators/ocGeneratorRoutes" @@ -25,6 +27,10 @@ authRoute.post("/login", async (c) => { return login(c) }) +authRoute.get("/verify-email/:token", async (c) => { + return verifyEmail(c) +}) + authRoute.get("/validate", async (c) => { return validate(c) }) @@ -37,6 +43,14 @@ authRoute.post("/signup", async (c) => { return signup(c) }) +authRoute.post("/reset-password", async (c) => { + return resetPassword(c) +}) + +authRoute.post("/generate-password-reset-token", async (c) => { + return generatePasswordResetToken(c) +}) + authRoute.route("/assets", assetRoute) authRoute.route("/asset-categories", assetCategoryRoute) authRoute.route("/oc-generators", ocGeneratorRoute) diff --git a/src/v2/routes/auth/resetPassword.ts b/src/v2/routes/auth/resetPassword.ts new file mode 100644 index 0000000..f5ef869 --- /dev/null +++ b/src/v2/routes/auth/resetPassword.ts @@ -0,0 +1,148 @@ +import { auth } from "@/v2/lib/auth/lucia" +import { getConnection } from "@/v2/db/turso" +import { passwordResetToken, users } from "@/v2/db/schema" +import { eq } from "drizzle-orm" +import { generateRandomString } from "lucia/utils" +import { z } from "zod" +import { + sendPasswordResetEmail, + sendPasswordChangeEmail, +} from "@/v2/lib/resend/email" + +const generatePasswordResetTokenSchema = z.object({ + email: z + .string({ + required_error: "Email is required", + invalid_type_error: "Email must be a string", + }) + .email("Email must be a valid email address"), +}) + +export async function generatePasswordResetToken( + c: APIContext +): Promise { + const authRequest = auth(c.env).handleRequest(c) + + const formData = generatePasswordResetTokenSchema.safeParse( + await c.req.formData().then((formData) => { + const data = Object.fromEntries(formData.entries()) + return data + }) + ) + + if (!formData.success) { + return c.json({ success: false, state: "invalid data" }, 400) + } + + const { email } = formData.data + + const drizzle = getConnection(c.env).drizzle + const session = await authRequest.validate() + + if (session) { + return c.json({ success: false, state: "already logged in" }, 200) + } + + const user = await drizzle + .select() + .from(users) + .where(eq(users.email, email)) + + if (!user) { + return c.json({ success: false, state: "valid data" }, 200) + } + + const token = generateRandomString(32) + + await drizzle.transaction(async (trx) => { + await trx.insert(passwordResetToken).values({ + id: token, + userId: user[0].id, + token, + expiresAt: Date.now() + 1000 * 60 * 30, + }) + }) + + await sendPasswordResetEmail(user[0].email, token, user[0].username, c) + + return c.json({ success: true, state: "valid data" }, 200) +} + +const resetPasswordSchema = z.object({ + token: z.string({ + required_error: "Token is required", + invalid_type_error: "Token must be a string", + }), + newPassword: z.string({ + required_error: "Password is required", + invalid_type_error: "Password must be a string", + }), + newPasswordConfirm: z.string({ + required_error: "Password confirmation is required", + invalid_type_error: "Password confirmation must be a string", + }), +}) + +export async function resetPassword(c: APIContext): Promise { + const authRequest = auth(c.env).handleRequest(c) + + const formData = resetPasswordSchema.safeParse( + await c.req.formData().then((formData) => { + const data = Object.fromEntries(formData.entries()) + return data + }) + ) + + if (!formData.success) { + return c.json({ success: false, state: "invalid data" }, 400) + } + + const { token, newPassword } = formData.data + + const drizzle = getConnection(c.env).drizzle + + const session = await authRequest.validate() + + if (session) { + return c.json({ success: false, state: "already logged in" }, 200) + } + + const relatedUser = await drizzle + .select() + .from(passwordResetToken) + .where(eq(passwordResetToken.token, token)) + + if (!relatedUser) { + return c.json({ success: false, state: "invalid token entered" }, 200) + } + + if (relatedUser[0].expiresAt < Date.now()) { + drizzle + .delete(passwordResetToken) + .where(eq(passwordResetToken.token, token)) + return c.json({ success: false, state: "invalid token entered" }, 200) + } + + let user = await auth(c.env).getUser(relatedUser[0].userId) + + if (!user) { + return c.json({ success: false, state: "invalid token entered" }, 200) + } + + await auth(c.env).invalidateAllUserSessions(user.userId) + await auth(c.env).updateKeyPassword("username", user.userId, newPassword) + + await drizzle + .delete(passwordResetToken) + .where(eq(passwordResetToken.token, token)) + + if (user.emailVerified === 0) { + user = await auth(c.env).updateUserAttributes(user.userId, { + email_verified: 1, + }) + } + + await sendPasswordChangeEmail(user.email, user.username, c) + + return c.json({ success: true, state: "updated credentials" }, 200) +} diff --git a/src/v2/routes/auth/signup.ts b/src/v2/routes/auth/signup.ts index 4a3b923..2d328cf 100644 --- a/src/v2/routes/auth/signup.ts +++ b/src/v2/routes/auth/signup.ts @@ -1,5 +1,9 @@ import { auth } from "@/v2/lib/auth/lucia" import { z } from "zod" +import { getConnection } from "@/v2/db/turso" +import { generateRandomString } from "lucia/utils" +import { emailVerificationToken } from "@/v2/db/schema" +import { sendEmailConfirmationEmail } from "@/v2/lib/resend/email" const CreateAccountSchema = z .object({ @@ -128,6 +132,25 @@ export async function signup(c: APIContext): Promise { }, }) + const drizzle = await getConnection(c.env).drizzle + const emailVerificationKey = generateRandomString(16) + + await drizzle.transaction(async (trx) => { + await trx.insert(emailVerificationToken).values({ + id: emailVerificationKey, + userId: user.userId, + token: emailVerificationKey, + expiresAt: Date.now() + 86400000, + }) + }) + + await sendEmailConfirmationEmail( + email, + emailVerificationKey, + username, + c + ) + const authRequest = auth(c.env).handleRequest(c) authRequest.setSession(newSession) return c.json({ success: true, state: "logged in" }, 200) diff --git a/src/v2/routes/auth/verifyEmail.ts b/src/v2/routes/auth/verifyEmail.ts new file mode 100644 index 0000000..02229c1 --- /dev/null +++ b/src/v2/routes/auth/verifyEmail.ts @@ -0,0 +1,49 @@ +import { auth } from "@/v2/lib/auth/lucia" +import { getConnection } from "@/v2/db/turso" +import { emailVerificationToken, users } from "@/v2/db/schema" +import { eq } from "drizzle-orm" + +export async function verifyEmail(c: APIContext): Promise { + const authRequest = auth(c.env).handleRequest(c) + + const { token } = c.req.param() + + if (!token) { + return c.json({ success: false, state: "invalid token entered" }, 200) + } + + const drizzle = getConnection(c.env).drizzle + const session = await authRequest.validate() + + const relatedUser = await drizzle + .select() + .from(emailVerificationToken) + .where(eq(emailVerificationToken.token, token)) + + if (!relatedUser) { + return c.json({ success: false, state: "invalid token entered" }, 200) + } + + if (session) { + if (relatedUser[0].userId !== session.user.userId) { + return c.json( + { success: false, state: "invalid token entered" }, + 200 + ) + } + } + + await drizzle.transaction(async (trx) => { + await trx + .delete(emailVerificationToken) + .where(eq(emailVerificationToken.token, token)) + await trx + .update(users) + .set({ + emailVerified: 1, + }) + .where(eq(users.id, relatedUser[0].userId)) + }) + + return c.json({ success: true, state: "email validated" }, 200) +} diff --git a/src/worker-configuration.d.ts b/src/worker-configuration.d.ts index 3c9d6b3..4a8ea65 100644 --- a/src/worker-configuration.d.ts +++ b/src/worker-configuration.d.ts @@ -14,6 +14,7 @@ declare global { DISCORD_CLIENT_ID: string DISCORD_CLIENT_SECRET: string DISCORD_REDIRECT_URI: string + RESEND_API_KEY: string } /** From f4f0319684320620da2c04cd6403a8e8da3be929 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Mon, 16 Oct 2023 11:48:31 +0100 Subject: [PATCH 112/318] cleanup calling orm --- src/v2/routes/asset/downloadAsset.ts | 2 +- src/v2/routes/asset/getAssetFromId.ts | 2 +- .../asset-categories/createAssetCategory.ts | 2 +- .../asset-categories/deleteAssetCategory.ts | 2 +- src/v2/routes/auth/assets/approveAsset.ts | 2 +- .../collections/addAssetToCollection.ts | 2 +- .../collections/createAssetCollection.ts | 2 +- .../collections/deleteAssetCollection.ts | 2 +- .../collections/deleteAssetFromCollection.ts | 2 +- .../assets/collections/viewAssetCollection.ts | 2 +- .../collections/viewAssetCollections.ts | 2 +- .../auth/assets/favorite/addFavoriteAsset.ts | 2 +- .../assets/favorite/removeFavoriteAsset.ts | 2 +- .../assets/favorite/viewFavoriteAssets.ts | 2 +- .../routes/auth/assets/getUnapprovedAssets.ts | 2 +- src/v2/routes/auth/assets/modifyAsset.ts | 2 +- src/v2/routes/auth/assets/uploadAsset.ts | 2 +- src/v2/routes/auth/games/createGame.ts | 2 +- src/v2/routes/auth/games/deleteGame.ts | 2 +- src/v2/routes/auth/login-methods/discord.ts | 2 +- .../deleteOCGeneratorResponse.ts | 2 +- .../oc-generators/saveOCGeneratorResponse.ts | 2 +- .../oc-generators/viewOCGeneratorResponses.ts | 2 +- src/v2/routes/auth/resetPassword.ts | 37 +++++++++++-------- src/v2/routes/auth/tags/createTag.ts | 2 +- src/v2/routes/auth/tags/deleteTag.ts | 2 +- .../user-relations/followUser.ts | 2 +- .../user-relations/unfollowUser.ts | 2 +- src/v2/routes/auth/verifyEmail.ts | 2 +- src/v2/routes/games/allGames.ts | 2 +- src/v2/routes/search/all/searchAll.ts | 2 +- src/v2/routes/search/asset/recentAssets.ts | 2 +- src/v2/routes/search/asset/searchAssets.ts | 2 +- .../routes/search/user/getUserByUsername.ts | 2 +- src/v2/routes/search/user/getUsersBySearch.ts | 2 +- src/v2/routes/tags/allTags.ts | 2 +- src/v2/routes/tags/getTagById.ts | 2 +- src/v2/routes/tags/getTagByName.ts | 2 +- 38 files changed, 58 insertions(+), 53 deletions(-) diff --git a/src/v2/routes/asset/downloadAsset.ts b/src/v2/routes/asset/downloadAsset.ts index 9a44efe..8d09bba 100644 --- a/src/v2/routes/asset/downloadAsset.ts +++ b/src/v2/routes/asset/downloadAsset.ts @@ -5,7 +5,7 @@ import { assets } from "@/v2/db/schema" export async function downloadAsset(c: APIContext): Promise { const { assetId } = c.req.param() - const drizzle = getConnection(c.env).drizzle + const { drizzle } = getConnection(c.env) const asset = await drizzle.query.assets.findFirst({ where: (assets, { eq }) => eq(assets.id, parseInt(assetId)), diff --git a/src/v2/routes/asset/getAssetFromId.ts b/src/v2/routes/asset/getAssetFromId.ts index 847cb66..a265a92 100644 --- a/src/v2/routes/asset/getAssetFromId.ts +++ b/src/v2/routes/asset/getAssetFromId.ts @@ -10,7 +10,7 @@ export async function getAssetFromId(c: APIContext): Promise { if (response) return response - const drizzle = getConnection(c.env).drizzle + const { drizzle } = getConnection(c.env) const asset = await drizzle.query.assets.findFirst({ where: (assets, { eq, and }) => diff --git a/src/v2/routes/auth/asset-categories/createAssetCategory.ts b/src/v2/routes/auth/asset-categories/createAssetCategory.ts index 35788c0..9c6e2de 100644 --- a/src/v2/routes/auth/asset-categories/createAssetCategory.ts +++ b/src/v2/routes/auth/asset-categories/createAssetCategory.ts @@ -22,7 +22,7 @@ export async function createAssetCategory(c: APIContext): Promise { return c.json({ success: false, state: "unauthorized" }, 401) } - const drizzle = getConnection(c.env).drizzle + const { drizzle } = getConnection(c.env) const formData = await c.req.formData() diff --git a/src/v2/routes/auth/asset-categories/deleteAssetCategory.ts b/src/v2/routes/auth/asset-categories/deleteAssetCategory.ts index ccdc10d..8ac9652 100644 --- a/src/v2/routes/auth/asset-categories/deleteAssetCategory.ts +++ b/src/v2/routes/auth/asset-categories/deleteAssetCategory.ts @@ -43,7 +43,7 @@ export async function deleteAssetCategory(c: APIContext): Promise { return c.json({ success: false, state: "unauthorized" }, 401) } - const drizzle = getConnection(c.env).drizzle + const { drizzle } = getConnection(c.env) if (!id) { return c.json({ success: false, state: "no id entered" }, 200) diff --git a/src/v2/routes/auth/assets/approveAsset.ts b/src/v2/routes/auth/assets/approveAsset.ts index 7dfa0e6..098c2b8 100644 --- a/src/v2/routes/auth/assets/approveAsset.ts +++ b/src/v2/routes/auth/assets/approveAsset.ts @@ -25,7 +25,7 @@ export async function approveAsset(c: APIContext): Promise { return c.json({ success: false, state: "unauthorized" }, 401) } - const drizzle = getConnection(c.env).drizzle + const { drizzle } = getConnection(c.env) const asset = await drizzle.query.assets.findFirst({ where: (assets, { eq }) => eq(assets.id, parseInt(assetIdToApprove)), diff --git a/src/v2/routes/auth/assets/collections/addAssetToCollection.ts b/src/v2/routes/auth/assets/collections/addAssetToCollection.ts index 16d4361..de396b4 100644 --- a/src/v2/routes/auth/assets/collections/addAssetToCollection.ts +++ b/src/v2/routes/auth/assets/collections/addAssetToCollection.ts @@ -28,7 +28,7 @@ export async function addAssetToCollection(c: APIContext): Promise { const { collectionId, assetId } = formData.data - const drizzle = getConnection(c.env).drizzle + const { drizzle } = getConnection(c.env) const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() diff --git a/src/v2/routes/auth/assets/collections/createAssetCollection.ts b/src/v2/routes/auth/assets/collections/createAssetCollection.ts index 34746ba..dca13f7 100644 --- a/src/v2/routes/auth/assets/collections/createAssetCollection.ts +++ b/src/v2/routes/auth/assets/collections/createAssetCollection.ts @@ -4,7 +4,7 @@ import { getConnection } from "@/v2/db/turso" import { userCollections } from "@/v2/db/schema" export async function createAssetCollection(c: APIContext): Promise { - const drizzle = getConnection(c.env).drizzle + const { drizzle } = getConnection(c.env) const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() diff --git a/src/v2/routes/auth/assets/collections/deleteAssetCollection.ts b/src/v2/routes/auth/assets/collections/deleteAssetCollection.ts index 0497531..2eb6612 100644 --- a/src/v2/routes/auth/assets/collections/deleteAssetCollection.ts +++ b/src/v2/routes/auth/assets/collections/deleteAssetCollection.ts @@ -22,7 +22,7 @@ export async function deleteAssetCollection(c: APIContext): Promise { const { collectionId } = formData.data - const drizzle = getConnection(c.env).drizzle + const { drizzle } = getConnection(c.env) const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() diff --git a/src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts b/src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts index 1cf5ff5..b6f02cd 100644 --- a/src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts +++ b/src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts @@ -31,7 +31,7 @@ export async function deleteAssetFromCollection( const { collectionId, assetId } = formData.data - const drizzle = getConnection(c.env).drizzle + const { drizzle } = getConnection(c.env) const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() diff --git a/src/v2/routes/auth/assets/collections/viewAssetCollection.ts b/src/v2/routes/auth/assets/collections/viewAssetCollection.ts index 1f3e3b9..2e41ab0 100644 --- a/src/v2/routes/auth/assets/collections/viewAssetCollection.ts +++ b/src/v2/routes/auth/assets/collections/viewAssetCollection.ts @@ -2,7 +2,7 @@ import { auth } from "@/v2/lib/auth/lucia" import { getConnection } from "@/v2/db/turso" export async function viewAssetCollection(c: APIContext): Promise { - const drizzle = getConnection(c.env).drizzle + const { drizzle } = getConnection(c.env) const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() diff --git a/src/v2/routes/auth/assets/collections/viewAssetCollections.ts b/src/v2/routes/auth/assets/collections/viewAssetCollections.ts index e4b2cbc..e61d5b6 100644 --- a/src/v2/routes/auth/assets/collections/viewAssetCollections.ts +++ b/src/v2/routes/auth/assets/collections/viewAssetCollections.ts @@ -2,7 +2,7 @@ import { auth } from "@/v2/lib/auth/lucia" import { getConnection } from "@/v2/db/turso" export async function viewAssetCollections(c: APIContext): Promise { - const drizzle = getConnection(c.env).drizzle + const { drizzle } = getConnection(c.env) const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() diff --git a/src/v2/routes/auth/assets/favorite/addFavoriteAsset.ts b/src/v2/routes/auth/assets/favorite/addFavoriteAsset.ts index be3b749..0734352 100644 --- a/src/v2/routes/auth/assets/favorite/addFavoriteAsset.ts +++ b/src/v2/routes/auth/assets/favorite/addFavoriteAsset.ts @@ -4,7 +4,7 @@ import { getConnection } from "@/v2/db/turso" import { userFavorites, userFavoritesAssets } from "@/v2/db/schema" export async function favoriteAsset(c: APIContext): Promise { - const drizzle = getConnection(c.env).drizzle + const { drizzle } = getConnection(c.env) const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() diff --git a/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts b/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts index 5d31f34..bfee31e 100644 --- a/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts +++ b/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts @@ -25,7 +25,7 @@ export async function removeFavoriteAsset(c: APIContext): Promise { const { assetToRemove } = formData.data - const drizzle = getConnection(c.env).drizzle + const { drizzle } = getConnection(c.env) const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() diff --git a/src/v2/routes/auth/assets/favorite/viewFavoriteAssets.ts b/src/v2/routes/auth/assets/favorite/viewFavoriteAssets.ts index 9c85afb..7285f34 100644 --- a/src/v2/routes/auth/assets/favorite/viewFavoriteAssets.ts +++ b/src/v2/routes/auth/assets/favorite/viewFavoriteAssets.ts @@ -2,7 +2,7 @@ import { auth } from "@/v2/lib/auth/lucia" import { getConnection } from "@/v2/db/turso" export async function viewFavoriteAssets(c: APIContext): Promise { - const drizzle = getConnection(c.env).drizzle + const { drizzle } = getConnection(c.env) const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() diff --git a/src/v2/routes/auth/assets/getUnapprovedAssets.ts b/src/v2/routes/auth/assets/getUnapprovedAssets.ts index ab1fd98..33febb6 100644 --- a/src/v2/routes/auth/assets/getUnapprovedAssets.ts +++ b/src/v2/routes/auth/assets/getUnapprovedAssets.ts @@ -21,7 +21,7 @@ export async function getUnapprovedAssets(c: APIContext): Promise { return c.json({ success: false, state: "unauthorized" }, 401) } - const drizzle = getConnection(c.env).drizzle + const { drizzle } = getConnection(c.env) const unApprovedAssets = (await drizzle.query.assets.findMany({ diff --git a/src/v2/routes/auth/assets/modifyAsset.ts b/src/v2/routes/auth/assets/modifyAsset.ts index 93f6333..eff5ecd 100644 --- a/src/v2/routes/auth/assets/modifyAsset.ts +++ b/src/v2/routes/auth/assets/modifyAsset.ts @@ -24,7 +24,7 @@ export async function modifyAssetData(c: APIContext): Promise { return c.json({ success: false, state: "unauthorized" }, 401) } - const drizzle = getConnection(c.env).drizzle + const { drizzle } = getConnection(c.env) const asset = await drizzle.query.assets.findFirst({ where: (assets, { eq }) => eq(assets.id, parseInt(assetIdToModify)), diff --git a/src/v2/routes/auth/assets/uploadAsset.ts b/src/v2/routes/auth/assets/uploadAsset.ts index ca73688..cb9732b 100644 --- a/src/v2/routes/auth/assets/uploadAsset.ts +++ b/src/v2/routes/auth/assets/uploadAsset.ts @@ -76,7 +76,7 @@ export async function uploadAsset(c: APIContext): Promise { const bypassApproval = session.user.isContributor === 1 - const drizzle = getConnection(c.env).drizzle + const { drizzle } = getConnection(c.env) const newAsset = { name: formData.data.name, diff --git a/src/v2/routes/auth/games/createGame.ts b/src/v2/routes/auth/games/createGame.ts index cb2519e..6ab70af 100644 --- a/src/v2/routes/auth/games/createGame.ts +++ b/src/v2/routes/auth/games/createGame.ts @@ -22,7 +22,7 @@ export async function createGame(c: APIContext): Promise { return c.json({ success: false, state: "unauthorized" }, 401) } - const drizzle = getConnection(c.env).drizzle + const { drizzle } = getConnection(c.env) const formData = await c.req.formData() diff --git a/src/v2/routes/auth/games/deleteGame.ts b/src/v2/routes/auth/games/deleteGame.ts index ca5f271..137d4ea 100644 --- a/src/v2/routes/auth/games/deleteGame.ts +++ b/src/v2/routes/auth/games/deleteGame.ts @@ -38,7 +38,7 @@ export async function deleteGame(c: APIContext): Promise { return c.json({ success: false, state: "unauthorized" }, 401) } - const drizzle = getConnection(c.env).drizzle + const { drizzle } = getConnection(c.env) try { await drizzle.delete(games).where(eq(games.id, id)).execute() diff --git a/src/v2/routes/auth/login-methods/discord.ts b/src/v2/routes/auth/login-methods/discord.ts index bdf759d..fce8b61 100644 --- a/src/v2/routes/auth/login-methods/discord.ts +++ b/src/v2/routes/auth/login-methods/discord.ts @@ -59,7 +59,7 @@ export async function discordCallback(c: APIContext): Promise { throw new Error("discord user doesnt have a verified email") } - const drizzle = getConnection(c.env).drizzle + const { drizzle } = getConnection(c.env) const userWithEmail = await drizzle.query.users.findFirst({ where: (users, { eq }) => eq(users.email, discordUser.email), diff --git a/src/v2/routes/auth/oc-generators/deleteOCGeneratorResponse.ts b/src/v2/routes/auth/oc-generators/deleteOCGeneratorResponse.ts index 11f9345..fb952e9 100644 --- a/src/v2/routes/auth/oc-generators/deleteOCGeneratorResponse.ts +++ b/src/v2/routes/auth/oc-generators/deleteOCGeneratorResponse.ts @@ -38,7 +38,7 @@ export async function deleteOCGeneratorResponse( return c.json({ success: false, state: "unauthorized" }, 401) } - const drizzle = getConnection(c.env).drizzle + const { drizzle } = getConnection(c.env) try { await drizzle diff --git a/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts b/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts index 65524e0..a19d551 100644 --- a/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts +++ b/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts @@ -80,7 +80,7 @@ export async function saveOCGeneratorResponse( return c.json({ success: false, state: "invalid session" }, 401) } - const drizzle = getConnection(c.env).drizzle + const { drizzle } = getConnection(c.env) // TODO: make sure data is actually valid before inserting it into the database const ocGeneratorResponse = { diff --git a/src/v2/routes/auth/oc-generators/viewOCGeneratorResponses.ts b/src/v2/routes/auth/oc-generators/viewOCGeneratorResponses.ts index eeaa4ee..dec2725 100644 --- a/src/v2/routes/auth/oc-generators/viewOCGeneratorResponses.ts +++ b/src/v2/routes/auth/oc-generators/viewOCGeneratorResponses.ts @@ -17,7 +17,7 @@ export async function viewOCGeneratorResponses( return c.json({ success: false, state: "unauthorized" }, 401) } - const drizzle = getConnection(c.env).drizzle + const { drizzle } = getConnection(c.env) const ocGeneratorResponses = await drizzle.query.savedOcGenerators.findMany( { diff --git a/src/v2/routes/auth/resetPassword.ts b/src/v2/routes/auth/resetPassword.ts index f5ef869..864200e 100644 --- a/src/v2/routes/auth/resetPassword.ts +++ b/src/v2/routes/auth/resetPassword.ts @@ -36,7 +36,7 @@ export async function generatePasswordResetToken( const { email } = formData.data - const drizzle = getConnection(c.env).drizzle + const { drizzle } = getConnection(c.env) const session = await authRequest.validate() if (session) { @@ -68,20 +68,25 @@ export async function generatePasswordResetToken( return c.json({ success: true, state: "valid data" }, 200) } -const resetPasswordSchema = z.object({ - token: z.string({ - required_error: "Token is required", - invalid_type_error: "Token must be a string", - }), - newPassword: z.string({ - required_error: "Password is required", - invalid_type_error: "Password must be a string", - }), - newPasswordConfirm: z.string({ - required_error: "Password confirmation is required", - invalid_type_error: "Password confirmation must be a string", - }), -}) +const resetPasswordSchema = z + .object({ + token: z.string({ + required_error: "Token is required", + invalid_type_error: "Token must be a string", + }), + newPassword: z.string({ + required_error: "Password is required", + invalid_type_error: "Password must be a string", + }), + newPasswordConfirm: z.string({ + required_error: "Password confirmation is required", + invalid_type_error: "Password confirmation must be a string", + }), + }) + .refine((data) => data.newPassword === data.newPasswordConfirm, { + message: "Passwords do not match", + path: ["passwordConfirm"], + }) export async function resetPassword(c: APIContext): Promise { const authRequest = auth(c.env).handleRequest(c) @@ -99,7 +104,7 @@ export async function resetPassword(c: APIContext): Promise { const { token, newPassword } = formData.data - const drizzle = getConnection(c.env).drizzle + const { drizzle } = getConnection(c.env) const session = await authRequest.validate() diff --git a/src/v2/routes/auth/tags/createTag.ts b/src/v2/routes/auth/tags/createTag.ts index 80550a3..0615383 100644 --- a/src/v2/routes/auth/tags/createTag.ts +++ b/src/v2/routes/auth/tags/createTag.ts @@ -46,7 +46,7 @@ export async function createTag(c: APIContext): Promise { return c.json({ success: false, state: "unauthorized" }, 401) } - const drizzle = getConnection(c.env).drizzle + const { drizzle } = getConnection(c.env) const tag = { id: crypto.randomUUID(), diff --git a/src/v2/routes/auth/tags/deleteTag.ts b/src/v2/routes/auth/tags/deleteTag.ts index 778c11c..1041b5c 100644 --- a/src/v2/routes/auth/tags/deleteTag.ts +++ b/src/v2/routes/auth/tags/deleteTag.ts @@ -43,7 +43,7 @@ export async function deleteTag(c: APIContext): Promise { return c.json({ success: false, state: "unauthorized" }, 401) } - const drizzle = getConnection(c.env).drizzle + const { drizzle } = getConnection(c.env) try { await drizzle.delete(assetTags).where(eq(assetTags.id, id)).execute() diff --git a/src/v2/routes/auth/user-attributes/user-relations/followUser.ts b/src/v2/routes/auth/user-attributes/user-relations/followUser.ts index afc0fd5..61666b9 100644 --- a/src/v2/routes/auth/user-attributes/user-relations/followUser.ts +++ b/src/v2/routes/auth/user-attributes/user-relations/followUser.ts @@ -24,7 +24,7 @@ export async function followUser(c: APIContext): Promise { const { userIdToFollow: userToFollow } = formData.data - const drizzle = getConnection(c.env).drizzle + const { drizzle } = getConnection(c.env) const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() diff --git a/src/v2/routes/auth/user-attributes/user-relations/unfollowUser.ts b/src/v2/routes/auth/user-attributes/user-relations/unfollowUser.ts index e221de4..ef7642c 100644 --- a/src/v2/routes/auth/user-attributes/user-relations/unfollowUser.ts +++ b/src/v2/routes/auth/user-attributes/user-relations/unfollowUser.ts @@ -24,7 +24,7 @@ export async function unfollowUser(c: APIContext): Promise { const { userIdToUnFollow: userToUnFollow } = formData.data - const drizzle = getConnection(c.env).drizzle + const { drizzle } = getConnection(c.env) const authRequest = auth(c.env).handleRequest(c) const session = await authRequest.validate() diff --git a/src/v2/routes/auth/verifyEmail.ts b/src/v2/routes/auth/verifyEmail.ts index 02229c1..9163904 100644 --- a/src/v2/routes/auth/verifyEmail.ts +++ b/src/v2/routes/auth/verifyEmail.ts @@ -12,7 +12,7 @@ export async function verifyEmail(c: APIContext): Promise { return c.json({ success: false, state: "invalid token entered" }, 200) } - const drizzle = getConnection(c.env).drizzle + const { drizzle } = getConnection(c.env) const session = await authRequest.validate() const relatedUser = await drizzle diff --git a/src/v2/routes/games/allGames.ts b/src/v2/routes/games/allGames.ts index a88e8a1..8dac9a7 100644 --- a/src/v2/routes/games/allGames.ts +++ b/src/v2/routes/games/allGames.ts @@ -21,7 +21,7 @@ export async function getAllGames(c: APIContext): Promise { } }) - const drizzle = getConnection(c.env).drizzle + const { drizzle } = getConnection(c.env) const gamesList = await drizzle .select() diff --git a/src/v2/routes/search/all/searchAll.ts b/src/v2/routes/search/all/searchAll.ts index 1b0cc00..eacbe87 100644 --- a/src/v2/routes/search/all/searchAll.ts +++ b/src/v2/routes/search/all/searchAll.ts @@ -21,7 +21,7 @@ export async function searchAll(c: APIContext): Promise { } if (response) return response - const drizzle = getConnection(c.env).drizzle + const { drizzle } = getConnection(c.env) // this is a disaster // https://cdn.discordapp.com/attachments/1102306276832202813/1147291827699986572/F.gif diff --git a/src/v2/routes/search/asset/recentAssets.ts b/src/v2/routes/search/asset/recentAssets.ts index 091431f..6747748 100644 --- a/src/v2/routes/search/asset/recentAssets.ts +++ b/src/v2/routes/search/asset/recentAssets.ts @@ -12,7 +12,7 @@ export async function recentAssets(c: APIContext): Promise { if (response) return response - const drizzle = getConnection(c.env).drizzle + const { drizzle } = getConnection(c.env) const assetResponse = await drizzle.query.assets.findMany({ orderBy: desc(assets.uploadedDate), diff --git a/src/v2/routes/search/asset/searchAssets.ts b/src/v2/routes/search/asset/searchAssets.ts index 149fa22..a20b5c9 100644 --- a/src/v2/routes/search/asset/searchAssets.ts +++ b/src/v2/routes/search/asset/searchAssets.ts @@ -19,7 +19,7 @@ export async function searchForAssets(c: APIContext): Promise { // assetCategory?: comma separated list of asset category names => ?assetCategory=splash-art,character-sheets // assetTags?: comma separated list of asset tag names => ?assetTags=no-background,fanmade,official - const drizzle = getConnection(c.env).drizzle + const { drizzle } = getConnection(c.env) const searchQuery = query ?? null const gameList = gameQuery diff --git a/src/v2/routes/search/user/getUserByUsername.ts b/src/v2/routes/search/user/getUserByUsername.ts index 47e7589..bcf5a09 100644 --- a/src/v2/routes/search/user/getUserByUsername.ts +++ b/src/v2/routes/search/user/getUserByUsername.ts @@ -25,7 +25,7 @@ export async function getUserByUsername(c: APIContext): Promise { } if (response) return response - const drizzle = getConnection(c.env).drizzle + const { drizzle } = getConnection(c.env) const user = await drizzle.query.users.findFirst({ where: (users, { and, eq }) => and(eq(users.username, username)), diff --git a/src/v2/routes/search/user/getUsersBySearch.ts b/src/v2/routes/search/user/getUsersBySearch.ts index ab2bafc..09301b3 100644 --- a/src/v2/routes/search/user/getUsersBySearch.ts +++ b/src/v2/routes/search/user/getUsersBySearch.ts @@ -8,7 +8,7 @@ export async function getUsersBySearch(c: APIContext): Promise { if (response) return response const { query } = c.req.param() - const drizzle = getConnection(c.env).drizzle + const { drizzle } = getConnection(c.env) const userList = await drizzle.query.users.findMany({ where: (users, { or }) => { diff --git a/src/v2/routes/tags/allTags.ts b/src/v2/routes/tags/allTags.ts index feba22a..39ee50b 100644 --- a/src/v2/routes/tags/allTags.ts +++ b/src/v2/routes/tags/allTags.ts @@ -7,7 +7,7 @@ export async function listAllAssetTags(c: APIContext): Promise { if (response) return response - const drizzle = getConnection(c.env).drizzle + const { drizzle } = getConnection(c.env) const allAssetTags = await drizzle.query.assetTags.findMany({ orderBy: (assetTags) => assetTags.name, diff --git a/src/v2/routes/tags/getTagById.ts b/src/v2/routes/tags/getTagById.ts index 511055e..3c487fe 100644 --- a/src/v2/routes/tags/getTagById.ts +++ b/src/v2/routes/tags/getTagById.ts @@ -7,7 +7,7 @@ export async function getTagById(c: APIContext): Promise { if (response) return response - const drizzle = getConnection(c.env).drizzle + const { drizzle } = getConnection(c.env) const assetTag = await drizzle.query.assetTags.findFirst({ where: (assetTags, { eq }) => eq(assetTags.id, c.req.param("id")), diff --git a/src/v2/routes/tags/getTagByName.ts b/src/v2/routes/tags/getTagByName.ts index df01acf..bfe21f3 100644 --- a/src/v2/routes/tags/getTagByName.ts +++ b/src/v2/routes/tags/getTagByName.ts @@ -7,7 +7,7 @@ export async function getTagByName(c: APIContext): Promise { if (response) return response - const drizzle = getConnection(c.env).drizzle + const { drizzle } = getConnection(c.env) const assetTag = await drizzle.query.assetTags.findFirst({ where: (assetTags, { eq }) => eq(assetTags.name, c.req.param("name")), From 25fc0687bdaafe01c136bb0ad0a54c80d5575bdd Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Mon, 16 Oct 2023 14:14:38 +0100 Subject: [PATCH 113/318] create resend wrapper for workers support --- package.json | 1 - pnpm-lock.yaml | 366 +---------------------------------- src/v2/lib/resend/email.ts | 100 ++++------ src/v2/lib/resend/wrapper.ts | 31 +++ 4 files changed, 73 insertions(+), 425 deletions(-) create mode 100644 src/v2/lib/resend/wrapper.ts diff --git a/package.json b/package.json index aeaee8c..796c7e4 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,6 @@ "lucia": "^2.7.0", "mysql2": "^3.6.1", "prettier": "^3.0.3", - "resend": "^1.1.0", "unstorage": "^1.9.0", "zod": "^3.22.2" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dc17bc3..7d35433 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -38,9 +38,6 @@ dependencies: prettier: specifier: ^3.0.3 version: 3.0.3 - resend: - specifier: ^1.1.0 - version: 1.1.0 unstorage: specifier: ^1.9.0 version: 1.9.0 @@ -990,13 +987,6 @@ packages: "@nodelib/fs.scandir": 2.1.5 fastq: 1.15.0 - /@one-ini/wasm@0.1.1: - resolution: - { - integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==, - } - dev: false - /@parcel/watcher-android-arm64@2.3.0: resolution: { @@ -1181,29 +1171,6 @@ packages: "@parcel/watcher-win32-x64": 2.3.0 dev: false - /@react-email/render@0.0.7: - resolution: - { - integrity: sha512-hMMhxk6TpOcDC5qnKzXPVJoVGEwfm+U5bGOPH+MyTTlx0F02RLQygcATBKsbP7aI/mvkmBAZoFbgPIHop7ovug==, - } - engines: { node: ">=16.0.0" } - dependencies: - html-to-text: 9.0.3 - pretty: 2.0.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@selderee/plugin-htmlparser2@0.10.0: - resolution: - { - integrity: sha512-gW69MEamZ4wk1OsOq1nG1jcyhXIQcnrsX5JwixVw/9xaiav8TCyjESAruu1Rz9yyInhgBXxkNwMeygKnN2uxNA==, - } - dependencies: - domhandler: 5.0.3 - selderee: 0.10.0 - dev: false - /@types/json-schema@7.0.13: resolution: { @@ -1398,13 +1365,6 @@ packages: eslint-visitor-keys: 3.4.3 dev: false - /abbrev@1.1.1: - resolution: - { - integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==, - } - dev: false - /acorn-jsx@5.3.2(acorn@8.10.0): resolution: { @@ -1579,6 +1539,7 @@ packages: } dependencies: balanced-match: 1.0.2 + dev: true /braces@3.0.2: resolution: @@ -1753,14 +1714,6 @@ packages: delayed-stream: 1.0.0 dev: false - /commander@10.0.1: - resolution: - { - integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==, - } - engines: { node: ">=14" } - dev: false - /commander@9.5.0: resolution: { @@ -1775,28 +1728,6 @@ packages: integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, } - /condense-newlines@0.2.1: - resolution: - { - integrity: sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==, - } - engines: { node: ">=0.10.0" } - dependencies: - extend-shallow: 2.0.1 - is-whitespace: 0.3.0 - kind-of: 3.2.2 - dev: false - - /config-chain@1.1.13: - resolution: - { - integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==, - } - dependencies: - ini: 1.3.8 - proto-list: 1.2.4 - dev: false - /consola@3.2.3: resolution: { @@ -1894,14 +1825,6 @@ packages: integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, } - /deepmerge@4.3.1: - resolution: - { - integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==, - } - engines: { node: ">=0.10.0" } - dev: false - /defu@6.1.2: resolution: { @@ -1977,45 +1900,6 @@ packages: dependencies: esutils: 2.0.3 - /dom-serializer@2.0.0: - resolution: - { - integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==, - } - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - entities: 4.5.0 - dev: false - - /domelementtype@2.3.0: - resolution: - { - integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==, - } - dev: false - - /domhandler@5.0.3: - resolution: - { - integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==, - } - engines: { node: ">= 4" } - dependencies: - domelementtype: 2.3.0 - dev: false - - /domutils@3.1.0: - resolution: - { - integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==, - } - dependencies: - dom-serializer: 2.0.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - dev: false - /dotenv@16.3.1: resolution: { @@ -2127,20 +2011,6 @@ packages: mysql2: 3.6.1 dev: false - /editorconfig@1.0.4: - resolution: - { - integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==, - } - engines: { node: ">=14" } - hasBin: true - dependencies: - "@one-ini/wasm": 0.1.1 - commander: 10.0.1 - minimatch: 9.0.1 - semver: 7.5.4 - dev: false - /end-of-stream@1.4.4: resolution: { @@ -2150,14 +2020,6 @@ packages: once: 1.4.0 dev: false - /entities@4.5.0: - resolution: - { - integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==, - } - engines: { node: ">=0.12" } - dev: false - /es5-ext@0.10.62: resolution: { @@ -2482,16 +2344,6 @@ packages: type: 2.7.2 dev: true - /extend-shallow@2.0.1: - resolution: - { - integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==, - } - engines: { node: ">=0.10.0" } - dependencies: - is-extendable: 0.1.1 - dev: false - /fast-deep-equal@3.1.3: resolution: { @@ -2740,6 +2592,7 @@ packages: inherits: 2.0.4 minimatch: 5.1.6 once: 1.4.0 + dev: true /globals@13.22.0: resolution: @@ -2819,32 +2672,6 @@ packages: engines: { node: ">=16.0.0" } dev: false - /html-to-text@9.0.3: - resolution: - { - integrity: sha512-hxDF1kVCF2uw4VUJ3vr2doc91pXf2D5ngKcNviSitNkhP9OMOaJkDrFIFL6RMvko7NisWTEiqGpQ9LAxcVok1w==, - } - engines: { node: ">=14" } - dependencies: - "@selderee/plugin-htmlparser2": 0.10.0 - deepmerge: 4.3.1 - dom-serializer: 2.0.0 - htmlparser2: 8.0.2 - selderee: 0.10.0 - dev: false - - /htmlparser2@8.0.2: - resolution: - { - integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==, - } - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.1.0 - entities: 4.5.0 - dev: false - /http-shutdown@1.2.2: resolution: { @@ -2969,13 +2796,6 @@ packages: dependencies: binary-extensions: 2.2.0 - /is-buffer@1.1.6: - resolution: - { - integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==, - } - dev: false - /is-docker@2.2.1: resolution: { @@ -2985,14 +2805,6 @@ packages: hasBin: true dev: false - /is-extendable@0.1.1: - resolution: - { - integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==, - } - engines: { node: ">=0.10.0" } - dev: false - /is-extglob@2.1.1: resolution: { @@ -3045,14 +2857,6 @@ packages: engines: { node: ">=8" } dev: false - /is-whitespace@0.3.0: - resolution: - { - integrity: sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==, - } - engines: { node: ">=0.10.0" } - dev: false - /is-wsl@2.2.0: resolution: { @@ -3084,27 +2888,6 @@ packages: } dev: false - /js-beautify@1.14.9: - resolution: - { - integrity: sha512-coM7xq1syLcMyuVGyToxcj2AlzhkDjmfklL8r0JgJ7A76wyGMpJ1oA35mr4APdYNO/o/4YY8H54NQIJzhMbhBg==, - } - engines: { node: ">=12" } - hasBin: true - dependencies: - config-chain: 1.1.13 - editorconfig: 1.0.4 - glob: 8.1.0 - nopt: 6.0.0 - dev: false - - /js-tokens@4.0.0: - resolution: - { - integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, - } - dev: false - /js-yaml@4.1.0: resolution: { @@ -3158,23 +2941,6 @@ packages: dependencies: json-buffer: 3.0.1 - /kind-of@3.2.2: - resolution: - { - integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==, - } - engines: { node: ">=0.10.0" } - dependencies: - is-buffer: 1.1.6 - dev: false - - /leac@0.6.0: - resolution: - { - integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==, - } - dev: false - /levn@0.4.1: resolution: { @@ -3261,16 +3027,6 @@ packages: } dev: false - /loose-envify@1.4.0: - resolution: - { - integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==, - } - hasBin: true - dependencies: - js-tokens: 4.0.0 - dev: false - /lru-cache@10.0.1: resolution: { @@ -3455,6 +3211,7 @@ packages: engines: { node: ">=10" } dependencies: brace-expansion: 2.0.1 + dev: true /minimatch@7.4.6: resolution: @@ -3466,16 +3223,6 @@ packages: brace-expansion: 2.0.1 dev: true - /minimatch@9.0.1: - resolution: - { - integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==, - } - engines: { node: ">=16 || 14 >=14.17" } - dependencies: - brace-expansion: 2.0.1 - dev: false - /minimist@1.2.8: resolution: { @@ -3653,17 +3400,6 @@ packages: } engines: { node: ">= 6.13.0" } - /nopt@6.0.0: - resolution: - { - integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } - hasBin: true - dependencies: - abbrev: 1.1.1 - dev: false - /normalize-path@3.0.0: resolution: { @@ -3760,16 +3496,6 @@ packages: dependencies: callsites: 3.1.0 - /parseley@0.11.0: - resolution: - { - integrity: sha512-VfcwXlBWgTF+unPcr7yu3HSSA6QUdDaDnrHcytVfj5Z8azAyKBDrYnSIfeSxlrEayndNcLmrXzg+Vxbo6DWRXQ==, - } - dependencies: - leac: 0.6.0 - peberminta: 0.8.0 - dev: false - /path-exists@4.0.0: resolution: { @@ -3813,13 +3539,6 @@ packages: } dev: false - /peberminta@0.8.0: - resolution: - { - integrity: sha512-YYEs+eauIjDH5nUEGi18EohWE0nV2QbGTqmxQcqgZ/0g+laPCQmuIqq7EBLVi9uim9zMgfJv0QBZEnQ3uHw/Tw==, - } - dev: false - /picomatch@2.3.1: resolution: { @@ -3876,18 +3595,6 @@ packages: hasBin: true dev: false - /pretty@2.0.0: - resolution: - { - integrity: sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==, - } - engines: { node: ">=0.10.0" } - dependencies: - condense-newlines: 0.2.1 - extend-shallow: 2.0.1 - js-beautify: 1.14.9 - dev: false - /printable-characters@1.0.42: resolution: { @@ -3895,13 +3602,6 @@ packages: } dev: true - /proto-list@1.2.4: - resolution: - { - integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==, - } - dev: false - /pump@3.0.0: resolution: { @@ -3945,29 +3645,6 @@ packages: strip-json-comments: 2.0.1 dev: false - /react-dom@18.2.0(react@18.2.0): - resolution: - { - integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==, - } - peerDependencies: - react: ^18.2.0 - dependencies: - loose-envify: 1.4.0 - react: 18.2.0 - scheduler: 0.23.0 - dev: false - - /react@18.2.0: - resolution: - { - integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==, - } - engines: { node: ">=0.10.0" } - dependencies: - loose-envify: 1.4.0 - dev: false - /readable-stream@3.6.2: resolution: { @@ -4007,17 +3684,6 @@ packages: redis-errors: 1.2.0 dev: false - /resend@1.1.0: - resolution: - { - integrity: sha512-it8TIDVT+/gAiJsUlv2tdHuvzwCCv4Zwu+udDqIm/dIuByQwe68TtFDcPccxqpSVVrNCBxxXLzsdT1tsV+P3GA==, - } - engines: { node: ">=18" } - dependencies: - "@react-email/render": 0.0.7 - type-fest: 3.13.0 - dev: false - /resolve-from@4.0.0: resolution: { @@ -4100,24 +3766,6 @@ packages: } dev: false - /scheduler@0.23.0: - resolution: - { - integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==, - } - dependencies: - loose-envify: 1.4.0 - dev: false - - /selderee@0.10.0: - resolution: - { - integrity: sha512-DEL/RW/f4qLw/NrVg97xKaEBC8IpzIG2fvxnzCp3Z4yk4jQ3MXom+Imav9wApjxX2dfS3eW7x0DXafJr85i39A==, - } - dependencies: - parseley: 0.11.0 - dev: false - /selfsigned@2.1.1: resolution: { @@ -4442,14 +4090,6 @@ packages: } engines: { node: ">=10" } - /type-fest@3.13.0: - resolution: - { - integrity: sha512-Gur3yQGM9qiLNs0KPP7LPgeRbio2QTt4xXouobMCarR0/wyW3F+F/+OWwshg3NG0Adon7uQfSZBpB46NfhoF1A==, - } - engines: { node: ">=14.16" } - dev: false - /type@1.2.0: resolution: { diff --git a/src/v2/lib/resend/email.ts b/src/v2/lib/resend/email.ts index 67313a7..14128a4 100644 --- a/src/v2/lib/resend/email.ts +++ b/src/v2/lib/resend/email.ts @@ -1,77 +1,55 @@ -import { Resend } from "resend" +import { ResendWrapper } from "@/v2/lib/resend/wrapper" const emailFrom = "Test " -const resend = (c: APIContext) => { - return new Resend(c.env.RESEND_API_KEY) -} - -export const sendPasswordResetEmail = async ( - email: string, - link: string, - username: string, - c: APIContext -) => { +const sendEmail = async (emailData, c) => { try { - await resend(c).emails.send({ - from: emailFrom, - to: email, - subject: "Password Reset Request", - html: `Password reset for ${username}
Click here to reset your password`, - }) + return await ResendWrapper(c, emailData) } catch (error) { - throw new Error("Error sending password reset email.") + throw new Error("Error sending email.") } } -export const sendPasswordChangeEmail = async ( - email: string, - username: string, - c: APIContext -) => { - try { - await resend(c).emails.send({ - from: emailFrom, - to: email, - subject: "Password Updated Confirmation", - html: `Your password for ${username} has been updated.
Wasn't you? Contact us at support@wanderer.moe`, - }) - } catch (error) { - throw new Error("Error sending password change email.") +export const sendPasswordResetEmail = async (email, link, username, c) => { + const emailData = { + from: emailFrom, + to: email, + subject: "Password Reset Request", + html: `Password reset for ${username}
Click here to reset your password`, } + + return sendEmail(emailData, c) } -export const sendEmailChangeEmail = async ( - email: string, - username: string, - c: APIContext -) => { - try { - await resend(c).emails.send({ - from: emailFrom, - to: email, - subject: "Email Change Request", - html: `Your email address for ${username} has been changed.
Wasn't you? Contact us at support@wanderer.moe`, - }) - } catch (error) { - throw new Error("Error sending email change email.") +export const sendPasswordChangeEmail = async (email, username, c) => { + const emailData = { + from: emailFrom, + to: email, + subject: "Password Updated Confirmation", + html: `Your password for ${username} has been updated.
Wasn't you? Contact us at support@wanderer.moe`, } + + return sendEmail(emailData, c) } -export const sendEmailConfirmationEmail = async ( - email: string, - link: string, - username: string, - c: APIContext -) => { - try { - await resend(c).emails.send({ - from: emailFrom, - to: email, - subject: "Email Confirmation", - html: `Email confirmation for ${username}
Click here to confirm your email`, - }) - } catch (error) { - throw new Error("Error sending email confirmation email.") +export const sendEmailChangeEmail = async (email, username, c) => { + const emailData = { + from: emailFrom, + to: email, + subject: "Email Change Request", + html: `Your email address for ${username} has been changed.
Wasn't you? Contact us at support@wanderer.moe`, } + + return sendEmail(emailData, c) +} + +export const sendEmailConfirmationEmail = async (email, link, username, c) => { + const emailData = { + from: emailFrom, + to: email, + subject: "Email Confirmation", + html: `Email confirmation for ${username}
Click here to confirm your email`, + } + + return sendEmail(emailData, c) } diff --git a/src/v2/lib/resend/wrapper.ts b/src/v2/lib/resend/wrapper.ts new file mode 100644 index 0000000..aef062b --- /dev/null +++ b/src/v2/lib/resend/wrapper.ts @@ -0,0 +1,31 @@ +export async function ResendWrapper( + c: APIContext, + emailData: Record +): Promise { + const response = await fetch(`https://api.resend.com/emails`, { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${c.env.RESEND_API_KEY}`, + }, + body: JSON.stringify({ ...emailData }), + }) + + const contentType = response.headers.get("content-type") || "" + + if (contentType.includes("application/json")) { + const responseBody = JSON.stringify(await response.json()) + return new Response(responseBody, { + headers: { + "content-type": "application/json", + }, + }) + } else { + const responseBody = await response.text() + return new Response(responseBody, { + headers: { + "content-type": contentType, + }, + }) + } +} From b3fe85afc32fe0adc3f225f88afe46a43e8f9621 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Mon, 16 Oct 2023 19:30:02 +0100 Subject: [PATCH 114/318] correctly type resend emaildata --- src/v2/lib/resend/wrapper.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/v2/lib/resend/wrapper.ts b/src/v2/lib/resend/wrapper.ts index aef062b..9017097 100644 --- a/src/v2/lib/resend/wrapper.ts +++ b/src/v2/lib/resend/wrapper.ts @@ -1,6 +1,13 @@ +type EmailData = { + to: string + from: string + subject: string + html: string +} + export async function ResendWrapper( c: APIContext, - emailData: Record + emailData: EmailData ): Promise { const response = await fetch(`https://api.resend.com/emails`, { method: "POST", From c60e6177ecab0cc1236e881ba4d73644d4716e87 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Tue, 17 Oct 2023 16:58:55 +0100 Subject: [PATCH 115/318] add db migratation script --- .gitignore | 3 --- package.json | 1 + src/scripts/migrate/migrate.ts | 23 +++++++++++++++++++++++ src/v2/lib/auth/lucia.ts | 8 ++++---- 4 files changed, 28 insertions(+), 7 deletions(-) create mode 100644 src/scripts/migrate/migrate.ts diff --git a/.gitignore b/.gitignore index 88cce80..c729f04 100644 --- a/.gitignore +++ b/.gitignore @@ -7,9 +7,6 @@ .wrangler .dev.vars -# temp -scripts/ - # Logs logs diff --git a/package.json b/package.json index 796c7e4..74c7feb 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "prettier:check": "prettier --check .", "typecheck": "tsc --noEmit", "drizzle:generate": "drizzle-kit generate:sqlite", + "drizzle:migrate": "ts-node ./src/scripts/migrate/migrate", "drizzle:push": "drizzle-kit push:sqlite" }, "devDependencies": { diff --git a/src/scripts/migrate/migrate.ts b/src/scripts/migrate/migrate.ts new file mode 100644 index 0000000..4e421da --- /dev/null +++ b/src/scripts/migrate/migrate.ts @@ -0,0 +1,23 @@ +import { drizzle as drizzleORM } from "drizzle-orm/libsql" +import { migrate } from "drizzle-orm/libsql/migrator" +import { createClient } from "@libsql/client/web" +import "dotenv/config" + +const { TURSO_DATABASE_AUTH_TOKEN, TURSO_DATABASE_URL } = process.env + +const client = createClient({ + url: TURSO_DATABASE_URL as string, + authToken: TURSO_DATABASE_AUTH_TOKEN as string, +}) + +const db = drizzleORM(client) + +migrate(db, { migrationsFolder: "./src/v2/db/migrations" }) + .then(() => { + console.log("migrations complete") + process.exit(0) + }) + .catch((err) => { + console.error(`migrations failed: ${err}`) + process.exit(1) + }) diff --git a/src/v2/lib/auth/lucia.ts b/src/v2/lib/auth/lucia.ts index ae8d0aa..8e50cb8 100644 --- a/src/v2/lib/auth/lucia.ts +++ b/src/v2/lib/auth/lucia.ts @@ -43,10 +43,10 @@ export function auth(env: Bindings) { session: unstorage(storage), }, middleware: hono(), - sessionExpiresIn: { - idlePeriod: 0, - activePeriod: 30 * 24 * 60 * 60 * 1000, // 30 days - }, + // sessionExpiresIn: { + // idlePeriod: 0, + // activePeriod: 30 * 24 * 60 * 60 * 1000, // 30 days + // }, env: env.ENVIRONMENT === "DEV" ? "DEV" : "PROD", experimental: { debugMode: env.ENVIRONMENT === "DEV" ? true : false, From 21438b4c6a1e475b7be6bbb926270efab2e97d5b Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Tue, 17 Oct 2023 17:34:14 +0100 Subject: [PATCH 116/318] fix: messy "networking" relation inferring --- src/scripts/migrate/migrate.ts | 2 +- src/v2/db/drizzle.ts | 3 +- src/v2/db/schema.ts | 73 ++++++++++--------- .../user-relations/followUser.ts | 50 ++++++------- .../user-relations/unfollowUser.ts | 46 +++++++----- 5 files changed, 90 insertions(+), 84 deletions(-) diff --git a/src/scripts/migrate/migrate.ts b/src/scripts/migrate/migrate.ts index 4e421da..f4a6940 100644 --- a/src/scripts/migrate/migrate.ts +++ b/src/scripts/migrate/migrate.ts @@ -1,6 +1,6 @@ import { drizzle as drizzleORM } from "drizzle-orm/libsql" import { migrate } from "drizzle-orm/libsql/migrator" -import { createClient } from "@libsql/client/web" +import { createClient } from "@libsql/client" import "dotenv/config" const { TURSO_DATABASE_AUTH_TOKEN, TURSO_DATABASE_URL } = process.env diff --git a/src/v2/db/drizzle.ts b/src/v2/db/drizzle.ts index 68f5440..2540933 100644 --- a/src/v2/db/drizzle.ts +++ b/src/v2/db/drizzle.ts @@ -4,8 +4,7 @@ export const tableNames = { authSession: "authSession", authUser: "authUser", emailVerificationTokens: "emailVerificationToken", - follower: "follower", - following: "following", + userNetworking: "userNetworking", gameAssetCategories: "gameAssetCategories", games: "games", assetTags: "assetTags", diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index c13e7a4..26d38e0 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -105,6 +105,30 @@ export const keys = sqliteTable( } ) +export const userNetworking = sqliteTable( + tableNames.userNetworking, + { + followerId: text("followerId") + .notNull() + .references(() => users.id), + followingId: text("followingId") + .notNull() + .references(() => users.id), + createdAt: text("createdAt").notNull(), + updatedAt: text("updatedAt").notNull(), + }, + (userNetworking) => { + return { + followerIdx: uniqueIndex("userNetworking_follower_idx").on( + userNetworking.followerId + ), + followingIdx: uniqueIndex("userNetworking_following_idx").on( + userNetworking.followingId + ), + } + } +) + export const socialsConnections = sqliteTable( tableNames.socialsConnections, { @@ -276,35 +300,6 @@ export const assetTagsAssets = sqliteTable( } ) -export const following = sqliteTable(tableNames.following, { - id: text("id").primaryKey(), - followerUserId: text("follower_id") - .notNull() - .references(() => users.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - followingUserId: text("following_id") - .notNull() - .references(() => users.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), -}) - -export const follower = sqliteTable(tableNames.follower, { - id: text("id").primaryKey(), - followerUserId: text("follower_id") - .notNull() - .references(() => users.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - followingUserId: text("following_id") - .notNull() - .references(() => users.id), -}) - export const userFavorites = sqliteTable( tableNames.userFavorites, { @@ -490,6 +485,19 @@ export const assetTagsAssetsRelations = relations( }) ) +export const userNetworkingRelations = relations(userNetworking, ({ one }) => ({ + follower: one(users, { + fields: [userNetworking.followerId], + references: [users.id], + relationName: "followers", + }), + following: one(users, { + fields: [userNetworking.followingId], + references: [users.id], + relationName: "following", + }), +})) + export const collectionRelations = relations( userCollections, ({ one, many }) => ({ @@ -556,9 +564,9 @@ export const socialsConnectionsRelations = relations( export const usersRelations = relations(users, ({ one, many }) => ({ key: many(keys), assets: many(assets), - follower: many(follower), + followers: many(userNetworking, { relationName: "follower" }), + following: many(userNetworking, { relationName: "following" }), userFavorites: one(userFavorites), - following: many(following), socialsConnection: one(socialsConnections), userCollections: many(userCollections), passwordResetToken: one(passwordResetToken), @@ -580,9 +588,8 @@ export type User = typeof users.$inferSelect export type EmailVerificationToken = typeof emailVerificationToken.$inferSelect export type PasswordResetToken = typeof passwordResetToken.$inferSelect export type Key = typeof keys.$inferSelect +export type UserNetworking = typeof userNetworking.$inferSelect export type SocialsConnection = typeof socialsConnections.$inferSelect -export type Following = typeof following.$inferSelect -export type Follower = typeof follower.$inferSelect export type UserFavorites = typeof userFavorites.$inferSelect export type UserFavoritesAssets = typeof userFavoritesAssets.$inferSelect export type UserCollections = typeof userCollections.$inferSelect diff --git a/src/v2/routes/auth/user-attributes/user-relations/followUser.ts b/src/v2/routes/auth/user-attributes/user-relations/followUser.ts index 61666b9..33fd3d6 100644 --- a/src/v2/routes/auth/user-attributes/user-relations/followUser.ts +++ b/src/v2/routes/auth/user-attributes/user-relations/followUser.ts @@ -1,7 +1,7 @@ import { auth } from "@/v2/lib/auth/lucia" import { getConnection } from "@/v2/db/turso" import { z } from "zod" -import { following, follower } from "@/v2/db/schema" +import { userNetworking } from "@/v2/db/schema" const FollowUserSchema = z.object({ userIdToFollow: z.string({ @@ -50,36 +50,30 @@ export async function followUser(c: APIContext): Promise { return c.json({ success: false, state: "cannot follow yourself" }, 200) } - const isFollowing = await drizzle.query.following.findFirst({ - where: (following, { eq }) => - eq(following.id, `${session.user.userId}-${userToFollow}`), + // check if user is already following + + const existingFollow = await drizzle.query.userNetworking.findFirst({ + where: (userNetworking, { and, eq }) => + and( + eq(userNetworking.followerId, session.user.userId), + eq(userNetworking.followingId, user.id) + ), }) - if (isFollowing) { - return c.json({ success: false, state: "already following" }, 200) + if (existingFollow) { + return c.json({ success: false, state: "already following user" }, 200) } - await drizzle.transaction(async (transaction) => { - await transaction - .insert(follower) - .values({ - id: `${session.user.userId}-${userToFollow}`, - followerUserId: session.user.userId, - followingUserId: userToFollow, - }) - .execute() - - await transaction - .insert(following) - .values({ - id: `${userToFollow}-${session.user.userId}`, - followerUserId: userToFollow, - followingUserId: session.user.userId, - }) - .execute() - - return c.json({ success: true, state: "followed user" }, 200) - }) + try { + await drizzle.insert(userNetworking).values({ + followerId: session.user.userId, + followingId: user.id, + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), + }) + } catch (e) { + return c.json({ success: false, state: "failed to follow user" }, 200) + } - return c.json({ success: false, state: "failed to follow user" }, 500) + return c.json({ success: true, state: "followed" }, 200) } diff --git a/src/v2/routes/auth/user-attributes/user-relations/unfollowUser.ts b/src/v2/routes/auth/user-attributes/user-relations/unfollowUser.ts index ef7642c..b6aeb6d 100644 --- a/src/v2/routes/auth/user-attributes/user-relations/unfollowUser.ts +++ b/src/v2/routes/auth/user-attributes/user-relations/unfollowUser.ts @@ -1,8 +1,8 @@ import { auth } from "@/v2/lib/auth/lucia" import { getConnection } from "@/v2/db/turso" import { z } from "zod" -import { following, follower } from "@/v2/db/schema" -import { eq } from "drizzle-orm" +import { userNetworking } from "@/v2/db/schema" +import { eq, and } from "drizzle-orm" const UnfollowUserSchema = z.object({ userIdToUnFollow: z.string({ @@ -53,27 +53,33 @@ export async function unfollowUser(c: APIContext): Promise { return c.json({ success: false, state: "user not found" }, 200) } - const isFollowing = await drizzle.query.following.findFirst({ - where: (following, { eq }) => - eq(following.id, `${session.user.userId}-${userToUnFollow}`), + // check if user is already following + + const existingFollow = await drizzle.query.userNetworking.findFirst({ + where: (networking, { and, eq }) => + and( + eq(networking.followerId, session.user.userId), + eq(networking.followingId, user.id) + ), }) - if (!isFollowing) { - return c.json({ success: false, state: "not following" }, 200) + if (!existingFollow) { + return c.json({ success: false, state: "not following user" }, 200) } - await drizzle.transaction(async (trx) => { - await trx - .delete(follower) - .where(eq(follower.id, `${session.user.userId}-${userToUnFollow}`)) - .execute() - - await trx - .delete(following) - .where(eq(following.id, `${session.user.userId}-${userToUnFollow}`)) - .execute() - return c.json({ success: true, state: "unfollowed user" }, 200) - }) + try { + await drizzle + .delete(userNetworking) + .where( + and( + eq(userNetworking.followerId, session.user.userId), + eq(userNetworking.followingId, user.id) + ) + ) + .returning() + } catch (e) { + return c.json({ success: false, state: "error unfollowing user" }, 200) + } - return c.json({ success: false, state: "failed to unfollow user" }, 200) + return c.json({ success: true, state: "unfollowed user" }, 200) } From 5a0ed44182f83c1d0ad3396aaa362e834e7b67b1 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Tue, 17 Oct 2023 17:52:48 +0100 Subject: [PATCH 117/318] maintain consistent plural table names --- src/v2/db/drizzle.ts | 21 +- src/v2/db/schema.ts | 223 +++++++++++------- src/v2/routes/asset/getAssetFromId.ts | 4 +- .../asset-categories/createAssetCategory.ts | 13 +- .../asset-categories/deleteAssetCategory.ts | 10 +- .../collections/addAssetToCollection.ts | 25 +- .../collections/createAssetCollection.ts | 12 +- .../collections/deleteAssetCollection.ts | 11 +- .../collections/deleteAssetFromCollection.ts | 25 +- .../assets/collections/viewAssetCollection.ts | 22 +- .../collections/viewAssetCollections.ts | 20 +- .../auth/assets/favorite/addFavoriteAsset.ts | 26 +- .../assets/favorite/removeFavoriteAsset.ts | 29 +-- .../assets/favorite/viewFavoriteAssets.ts | 16 +- src/v2/routes/auth/assets/modifyAsset.ts | 20 +- src/v2/routes/auth/assets/uploadAsset.ts | 37 +-- src/v2/routes/auth/authRoutes.ts | 2 +- src/v2/routes/auth/games/createGame.ts | 11 +- src/v2/routes/auth/games/deleteGame.ts | 4 +- src/v2/routes/auth/login-methods/discord.ts | 10 +- src/v2/routes/auth/tags/createTag.ts | 8 +- src/v2/routes/auth/tags/deleteTag.ts | 4 +- src/v2/routes/games/allGames.ts | 8 +- src/v2/routes/games/gamesRoutes.ts | 6 +- src/v2/routes/search/all/searchAll.ts | 32 +-- src/v2/routes/search/asset/searchAssets.ts | 26 +- src/v2/routes/tags/allTags.ts | 8 +- src/v2/routes/tags/getTagById.ts | 4 +- src/v2/routes/tags/getTagByName.ts | 4 +- src/v2/routes/tags/tagsRoutes.ts | 4 +- 30 files changed, 341 insertions(+), 304 deletions(-) diff --git a/src/v2/db/drizzle.ts b/src/v2/db/drizzle.ts index 2540933..4b17fa8 100644 --- a/src/v2/db/drizzle.ts +++ b/src/v2/db/drizzle.ts @@ -3,21 +3,20 @@ export const tableNames = { authKey: "authKey", authSession: "authSession", authUser: "authUser", - emailVerificationTokens: "emailVerificationToken", userNetworking: "userNetworking", - gameAssetCategories: "gameAssetCategories", - games: "games", - assetTags: "assetTags", - assetTagsAssets: "assetTagsAssets", + gameAssetCategory: "gameAssetCategory", + game: "game", + assetTag: "assetTag", + assetTagAsset: "assetTagAsset", emailVerificationToken: "emailVerificationToken", passwordResetToken: "passwordResetToken", - assetCategories: "assetCategories", + assetCategory: "assetCategory", savedOcGenerators: "savedOcGenerators", - userFavorites: "userFavorites", - userFavoritesAssets: "userFavoritesAssets", - userCollections: "assetCollection", - userCollectionAssets: "assetCollectionAsset", - socialsConnections: "socialsConnections", + userFavorite: "userFavorite", + userFavoriteAsset: "userFavoriteAsset", + userCollection: "userCollection", + userCollectionAsset: "assetCollectionAsset", + socialsConnection: "socialsConnection", } export * as schema from "@/v2/db/schema" diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index 26d38e0..4ee2ccb 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -129,8 +129,8 @@ export const userNetworking = sqliteTable( } ) -export const socialsConnections = sqliteTable( - tableNames.socialsConnections, +export const socialsConnection = sqliteTable( + tableNames.socialsConnection, { id: text("id").primaryKey(), userId: text("user_id") @@ -153,8 +153,8 @@ export const socialsConnections = sqliteTable( } ) -export const games = sqliteTable( - tableNames.games, +export const game = sqliteTable( + tableNames.game, { id: text("id").primaryKey(), name: text("name").notNull(), // e.g genshin-impact, honkai-impact-3rd @@ -173,8 +173,8 @@ export const games = sqliteTable( } ) -export const assetCategories = sqliteTable( - tableNames.assetCategories, +export const assetCategory = sqliteTable( + tableNames.assetCategory, { id: text("id").primaryKey(), name: text("name").notNull(), // e.g tcg-sheets, splash-art @@ -194,6 +194,38 @@ export const assetCategories = sqliteTable( } ) +export const gameAssetCategory = sqliteTable( + tableNames.gameAssetCategory, + { + id: text("id").primaryKey(), + gameId: text("game_id") + .notNull() + .references(() => game.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + assetCategoryId: text("asset_category_id") + .notNull() + .references(() => assetCategory.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + }, + (gameAssetCategory) => { + return { + gameAssetCategoryIdx: uniqueIndex("game_asset_category_id_idx").on( + gameAssetCategory.id + ), + gameAssetCategoryGameIdx: uniqueIndex( + "game_asset_category_game_id_idx" + ).on(gameAssetCategory.gameId), + gameAssetCategoryAssetCategoryIdx: uniqueIndex( + "game_asset_category_asset_category_id_idx" + ).on(gameAssetCategory.assetCategoryId), + } + } +) + export const assets = sqliteTable( tableNames.assets, { @@ -202,13 +234,13 @@ export const assets = sqliteTable( extension: text("extension").notNull(), game: text("game") .notNull() - .references(() => games.name, { + .references(() => game.name, { onUpdate: "cascade", onDelete: "cascade", }), assetCategory: text("asset_category") .notNull() - .references(() => assetCategories.name, { + .references(() => assetCategory.name, { onUpdate: "cascade", onDelete: "cascade", }), @@ -251,8 +283,8 @@ export const assets = sqliteTable( } ) -export const assetTags = sqliteTable( - tableNames.assetTags, +export const assetTag = sqliteTable( + tableNames.assetTag, { id: text("id").primaryKey(), name: text("name").notNull(), @@ -268,13 +300,13 @@ export const assetTags = sqliteTable( } ) -export const assetTagsAssets = sqliteTable( - tableNames.assetTagsAssets, +export const assetTagAsset = sqliteTable( + tableNames.assetTagAsset, { id: text("id").primaryKey(), assetTagId: text("asset_tag_id") .notNull() - .references(() => assetTags.id, { + .references(() => assetTag.id, { onUpdate: "cascade", onDelete: "cascade", }), @@ -285,23 +317,23 @@ export const assetTagsAssets = sqliteTable( onDelete: "cascade", }), }, - (assetTagsAssets) => { + (assetTagAsset) => { return { - assetTagsAssetsIdx: uniqueIndex("asset_tags_assets_id_idx").on( - assetTagsAssets.id + assetTagAssetIdx: uniqueIndex("asset_tags_assets_id_idx").on( + assetTagAsset.id ), - assetTagsAssetsAssetTagIdx: uniqueIndex( + assetTagAssetAssetTagIdx: uniqueIndex( "asset_tags_assets_asset_tag_id_idx" - ).on(assetTagsAssets.assetTagId), - assetTagsAssetsAssetIdx: uniqueIndex( + ).on(assetTagAsset.assetTagId), + assetTagAssetAssetIdx: uniqueIndex( "asset_tags_assets_asset_id_idx" - ).on(assetTagsAssets.assetId), + ).on(assetTagAsset.assetId), } } ) -export const userFavorites = sqliteTable( - tableNames.userFavorites, +export const userFavorite = sqliteTable( + tableNames.userFavorite, { id: text("id").primaryKey(), userId: text("user_id") @@ -312,25 +344,25 @@ export const userFavorites = sqliteTable( }), isPublic: integer("is_public").default(0).notNull(), }, - (userFavorites) => { + (userFavorite) => { return { favoritedAssetsIdx: uniqueIndex("favorited_assets_id_idx").on( - userFavorites.id + userFavorite.id ), favoritedAssetsUserIdx: uniqueIndex( "favorited_assets_user_id_idx" - ).on(userFavorites.userId), + ).on(userFavorite.userId), } } ) -export const userFavoritesAssets = sqliteTable( - tableNames.userFavoritesAssets, +export const userFavoriteAsset = sqliteTable( + tableNames.userFavoriteAsset, { id: text("id").primaryKey(), - userFavoritesId: text("favorited_assets_id") + userFavoriteId: text("favorited_assets_id") .notNull() - .references(() => userFavorites.id, { + .references(() => userFavorite.id, { onUpdate: "cascade", onDelete: "cascade", }), @@ -341,23 +373,23 @@ export const userFavoritesAssets = sqliteTable( onDelete: "cascade", }), }, - (userFavoritesAssets) => { + (userFavoriteAsset) => { return { favoritedAssetsAssetsIdx: uniqueIndex( "favorited_assets_assets_id_idx" - ).on(userFavoritesAssets.id), + ).on(userFavoriteAsset.id), favoritedAssetsAssetsUserIdx: uniqueIndex( "favorited_assets_assets_user_id_idx" - ).on(userFavoritesAssets.userFavoritesId), + ).on(userFavoriteAsset.userFavoriteId), favoritedAssetsAssetsAssetIdx: uniqueIndex( "favorited_assets_assets_asset_id_idx" - ).on(userFavoritesAssets.assetId), + ).on(userFavoriteAsset.assetId), } } ) -export const userCollections = sqliteTable( - tableNames.userCollections, +export const userCollection = sqliteTable( + tableNames.userCollection, { id: text("id").primaryKey(), name: text("name").notNull(), @@ -381,13 +413,13 @@ export const userCollections = sqliteTable( } ) -export const userCollectionAssets = sqliteTable( - tableNames.userCollectionAssets, +export const userCollectionAsset = sqliteTable( + tableNames.userCollectionAsset, { id: text("id").primaryKey(), collectionId: text("collection_id") .notNull() - .references(() => userCollections.id, { + .references(() => userCollection.id, { onUpdate: "cascade", onDelete: "cascade", }), @@ -444,8 +476,9 @@ export const savedOcGenerators = sqliteTable( ) // relations -export const gameRelations = relations(games, ({ many }) => ({ +export const gameRelations = relations(game, ({ many }) => ({ assets: many(assets), + gameAssetCategory: many(gameAssetCategory), })) export const assetRelations = relations(assets, ({ one, many }) => ({ @@ -453,38 +486,47 @@ export const assetRelations = relations(assets, ({ one, many }) => ({ fields: [assets.uploadedById, assets.uploadedByName], references: [users.id, users.username], }), - assetTagsAssets: many(assetTagsAssets), - assetCategory: one(assetCategories, { + assetTagAsset: many(assetTagAsset), + assetCategory: one(assetCategory, { fields: [assets.assetCategory], - references: [assetCategories.name], + references: [assetCategory.name], }), - game: one(games, { + game: one(game, { fields: [assets.game], - references: [games.name], + references: [game.name], }), })) -export const assetCategoryRelations = relations( - assetCategories, - ({ many }) => ({ - assets: many(assets), - }) -) +export const assetCategoryRelations = relations(assetCategory, ({ many }) => ({ + assets: many(assets), + gameAssetCategory: many(gameAssetCategory), +})) -export const assetTagsAssetsRelations = relations( - assetTagsAssets, +export const gameAssetCategoryRelations = relations( + gameAssetCategory, ({ one }) => ({ - assetTag: one(assetTags, { - fields: [assetTagsAssets.assetTagId], - references: [assetTags.id], + game: one(game, { + fields: [gameAssetCategory.gameId], + references: [game.id], }), - asset: one(assets, { - fields: [assetTagsAssets.assetId], - references: [assets.id], + assetCategory: one(assetCategory, { + fields: [gameAssetCategory.assetCategoryId], + references: [assetCategory.id], }), }) ) +export const assetTagAssetRelations = relations(assetTagAsset, ({ one }) => ({ + assetTag: one(assetTag, { + fields: [assetTagAsset.assetTagId], + references: [assetTag.id], + }), + asset: one(assets, { + fields: [assetTagAsset.assetId], + references: [assets.id], + }), +})) + export const userNetworkingRelations = relations(userNetworking, ({ one }) => ({ follower: one(users, { fields: [userNetworking.followerId], @@ -499,46 +541,46 @@ export const userNetworkingRelations = relations(userNetworking, ({ one }) => ({ })) export const collectionRelations = relations( - userCollections, + userCollection, ({ one, many }) => ({ user: one(users, { - fields: [userCollections.userId], + fields: [userCollection.userId], references: [users.id], }), - assets: many(userCollectionAssets), + assets: many(userCollectionAsset), }) ) export const collectionAssetsRelations = relations( - userCollectionAssets, + userCollectionAsset, ({ one }) => ({ - collection: one(userCollections, { - fields: [userCollectionAssets.collectionId], - references: [userCollections.id], + collection: one(userCollection, { + fields: [userCollectionAsset.collectionId], + references: [userCollection.id], }), asset: one(assets, { - fields: [userCollectionAssets.assetId], + fields: [userCollectionAsset.assetId], references: [assets.id], }), }) ) -export const userFavoritesRelations = relations(userFavorites, ({ one }) => ({ +export const userFavoriteRelations = relations(userFavorite, ({ one }) => ({ user: one(users, { - fields: [userFavorites.userId], + fields: [userFavorite.userId], references: [users.id], }), })) -export const userFavoritesAssetsRelations = relations( - userFavoritesAssets, +export const userFavoriteAssetRelations = relations( + userFavoriteAsset, ({ one }) => ({ - favoritedAssets: one(userFavorites, { - fields: [userFavoritesAssets.userFavoritesId], - references: [userFavorites.id], + favoritedAssets: one(userFavorite, { + fields: [userFavoriteAsset.userFavoriteId], + references: [userFavorite.id], }), asset: one(assets, { - fields: [userFavoritesAssets.assetId], + fields: [userFavoriteAsset.assetId], references: [assets.id], }), }) @@ -551,11 +593,11 @@ export const keysRelations = relations(keys, ({ one }) => ({ }), })) -export const socialsConnectionsRelations = relations( - socialsConnections, +export const socialsConnectionRelations = relations( + socialsConnection, ({ one }) => ({ user: one(users, { - fields: [socialsConnections.userId], + fields: [socialsConnection.userId], references: [users.id], }), }) @@ -564,11 +606,11 @@ export const socialsConnectionsRelations = relations( export const usersRelations = relations(users, ({ one, many }) => ({ key: many(keys), assets: many(assets), - followers: many(userNetworking, { relationName: "follower" }), + follower: many(userNetworking, { relationName: "follower" }), following: many(userNetworking, { relationName: "following" }), - userFavorites: one(userFavorites), - socialsConnection: one(socialsConnections), - userCollections: many(userCollections), + userFavorite: one(userFavorite), + socialsConnection: one(socialsConnection), + userCollection: many(userCollection), passwordResetToken: one(passwordResetToken), emailVerificationToken: one(emailVerificationToken), savedOcGenerators: many(savedOcGenerators), @@ -577,11 +619,12 @@ export const usersRelations = relations(users, ({ one, many }) => ({ // export types // game, asset types -export type Game = typeof games.$inferSelect -export type AssetCategory = typeof assetCategories.$inferSelect +export type Game = typeof game.$inferSelect +export type AssetCategory = typeof assetCategory.$inferSelect +export type GameAssetCategory = typeof gameAssetCategory.$inferSelect export type Asset = typeof assets.$inferSelect -export type AssetTag = typeof assetTags.$inferSelect -export type AssetTagsAsset = typeof assetTagsAssets.$inferSelect +export type AssetTag = typeof assetTag.$inferSelect +export type AssetTagAsset = typeof assetTagAsset.$inferSelect // user types export type User = typeof users.$inferSelect @@ -589,8 +632,8 @@ export type EmailVerificationToken = typeof emailVerificationToken.$inferSelect export type PasswordResetToken = typeof passwordResetToken.$inferSelect export type Key = typeof keys.$inferSelect export type UserNetworking = typeof userNetworking.$inferSelect -export type SocialsConnection = typeof socialsConnections.$inferSelect -export type UserFavorites = typeof userFavorites.$inferSelect -export type UserFavoritesAssets = typeof userFavoritesAssets.$inferSelect -export type UserCollections = typeof userCollections.$inferSelect -export type UserCollectionAssets = typeof userCollectionAssets.$inferSelect +export type SocialsConnection = typeof socialsConnection.$inferSelect +export type UserFavorite = typeof userFavorite.$inferSelect +export type UserFavoriteAsset = typeof userFavoriteAsset.$inferSelect +export type UserCollection = typeof userCollection.$inferSelect +export type UserCollectionAsset = typeof userCollectionAsset.$inferSelect diff --git a/src/v2/routes/asset/getAssetFromId.ts b/src/v2/routes/asset/getAssetFromId.ts index a265a92..d40e615 100644 --- a/src/v2/routes/asset/getAssetFromId.ts +++ b/src/v2/routes/asset/getAssetFromId.ts @@ -16,9 +16,9 @@ export async function getAssetFromId(c: APIContext): Promise { where: (assets, { eq, and }) => and(eq(assets.status, 1), eq(assets.id, parseInt(id))), with: { - assetTagsAssets: { + assetTagAsset: { with: { - assetTags: true, + assetTag: true, }, }, users: { diff --git a/src/v2/routes/auth/asset-categories/createAssetCategory.ts b/src/v2/routes/auth/asset-categories/createAssetCategory.ts index 9c6e2de..d963b1e 100644 --- a/src/v2/routes/auth/asset-categories/createAssetCategory.ts +++ b/src/v2/routes/auth/asset-categories/createAssetCategory.ts @@ -1,8 +1,7 @@ import { auth } from "@/v2/lib/auth/lucia" import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" import { getConnection } from "@/v2/db/turso" - -import { assetCategories } from "@/v2/db/schema" +import { assetCategory } from "@/v2/db/schema" export async function createAssetCategory(c: APIContext): Promise { const authRequest = auth(c.env).handleRequest(c) @@ -26,7 +25,7 @@ export async function createAssetCategory(c: APIContext): Promise { const formData = await c.req.formData() - const assetCategory = { + const newAssetCategory = { id: crypto.randomUUID(), name: formData.get("name") as string, formattedName: formData.get("formattedName") as string, @@ -35,9 +34,9 @@ export async function createAssetCategory(c: APIContext): Promise { } // check if assetCategory.name exists - const assetCategoryExists = await drizzle.query.assetCategories.findFirst({ - where: (assetCategories, { eq }) => - eq(assetCategories.name, assetCategory.name), + const assetCategoryExists = await drizzle.query.assetCategory.findFirst({ + where: (assetCategory, { eq }) => + eq(assetCategory.name, assetCategory.name), }) if (assetCategoryExists) { @@ -51,7 +50,7 @@ export async function createAssetCategory(c: APIContext): Promise { } try { - await drizzle.insert(assetCategories).values(assetCategory).execute() + await drizzle.insert(assetCategory).values(newAssetCategory).execute() } catch (e) { return c.json( { diff --git a/src/v2/routes/auth/asset-categories/deleteAssetCategory.ts b/src/v2/routes/auth/asset-categories/deleteAssetCategory.ts index 8ac9652..b98d83f 100644 --- a/src/v2/routes/auth/asset-categories/deleteAssetCategory.ts +++ b/src/v2/routes/auth/asset-categories/deleteAssetCategory.ts @@ -3,7 +3,7 @@ import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" import { getConnection } from "@/v2/db/turso" import { z } from "zod" import { eq } from "drizzle-orm" -import { assetCategories } from "@/v2/db/schema" +import { assetCategory } from "@/v2/db/schema" const DeleteAssetCategorySchema = z.object({ id: z.string({ @@ -50,8 +50,8 @@ export async function deleteAssetCategory(c: APIContext): Promise { } // check if assetCategory exists - const assetCategoryExists = await drizzle.query.assetCategories.findFirst({ - where: (assetCategories, { eq }) => eq(assetCategories.id, id), + const assetCategoryExists = await drizzle.query.assetCategory.findFirst({ + where: (assetCategory, { eq }) => eq(assetCategory.id, id), }) if (!assetCategoryExists) { @@ -66,8 +66,8 @@ export async function deleteAssetCategory(c: APIContext): Promise { try { await drizzle - .delete(assetCategories) - .where(eq(assetCategories.id, id)) + .delete(assetCategory) + .where(eq(assetCategory.id, id)) .execute() } catch (e) { return c.json( diff --git a/src/v2/routes/auth/assets/collections/addAssetToCollection.ts b/src/v2/routes/auth/assets/collections/addAssetToCollection.ts index de396b4..2a07337 100644 --- a/src/v2/routes/auth/assets/collections/addAssetToCollection.ts +++ b/src/v2/routes/auth/assets/collections/addAssetToCollection.ts @@ -1,7 +1,7 @@ import { auth } from "@/v2/lib/auth/lucia" import { getConnection } from "@/v2/db/turso" import { z } from "zod" -import { userCollectionAssets } from "@/v2/db/schema" +import { userCollectionAsset } from "@/v2/db/schema" const AddAssetToCollectionSchema = z.object({ collectionId: z.string({ @@ -53,9 +53,8 @@ export async function addAssetToCollection(c: APIContext): Promise { } // check if collection exists - const collectionExists = await drizzle.query.userCollections.findFirst({ - where: (userCollections, { eq }) => - eq(userCollections.id, collectionId), + const collectionExists = await drizzle.query.userCollection.findFirst({ + where: (userCollection, { eq }) => eq(userCollection.id, collectionId), }) if (!collectionExists) { @@ -78,17 +77,17 @@ export async function addAssetToCollection(c: APIContext): Promise { return c.json({ success: false, state: "asset not found" }, 200) } - // check if userCollectionAssets exists - const userCollectionAssetsExists = - await drizzle.query.userCollectionAssets.findFirst({ - where: (userCollectionAssets, { eq, and }) => + // check if userCollectionAsset exists + const userCollectionAssetExists = + await drizzle.query.userCollectionAsset.findFirst({ + where: (userCollectionAsset, { eq, and }) => and( - eq(userCollectionAssets.collectionId, collectionId), - eq(userCollectionAssets.assetId, parseInt(assetId)) + eq(userCollectionAsset.collectionId, collectionId), + eq(userCollectionAsset.assetId, parseInt(assetId)) ), }) - if (userCollectionAssetsExists) { + if (userCollectionAssetExists) { return c.json( { success: false, @@ -98,10 +97,10 @@ export async function addAssetToCollection(c: APIContext): Promise { ) } - // create entry in userCollectionAssets + // create entry in userCollectionAsset try { await drizzle - .insert(userCollectionAssets) + .insert(userCollectionAsset) .values({ id: crypto.randomUUID(), collectionId: collectionId, diff --git a/src/v2/routes/auth/assets/collections/createAssetCollection.ts b/src/v2/routes/auth/assets/collections/createAssetCollection.ts index dca13f7..f84109a 100644 --- a/src/v2/routes/auth/assets/collections/createAssetCollection.ts +++ b/src/v2/routes/auth/assets/collections/createAssetCollection.ts @@ -1,7 +1,7 @@ import { auth } from "@/v2/lib/auth/lucia" import { getConnection } from "@/v2/db/turso" -import { userCollections } from "@/v2/db/schema" +import { userCollection } from "@/v2/db/schema" export async function createAssetCollection(c: APIContext): Promise { const { drizzle } = getConnection(c.env) @@ -42,9 +42,9 @@ export async function createAssetCollection(c: APIContext): Promise { } // check if collection exists - const collectionExists = await drizzle.query.userCollections.findFirst({ - where: (userCollections, { eq }) => - eq(userCollections.name, collection.name), + const collectionExists = await drizzle.query.userCollection.findFirst({ + where: (userCollection, { eq }) => + eq(userCollection.name, collection.name), }) if (collectionExists) { @@ -57,10 +57,10 @@ export async function createAssetCollection(c: APIContext): Promise { ) } - // create entry in userCollections + // create entry in userCollection try { await drizzle - .insert(userCollections) + .insert(userCollection) .values({ id: crypto.randomUUID(), name: collection.name, diff --git a/src/v2/routes/auth/assets/collections/deleteAssetCollection.ts b/src/v2/routes/auth/assets/collections/deleteAssetCollection.ts index 2eb6612..eb124c7 100644 --- a/src/v2/routes/auth/assets/collections/deleteAssetCollection.ts +++ b/src/v2/routes/auth/assets/collections/deleteAssetCollection.ts @@ -2,7 +2,7 @@ import { auth } from "@/v2/lib/auth/lucia" import { getConnection } from "@/v2/db/turso" import { z } from "zod" import { eq } from "drizzle-orm" -import { userCollections } from "@/v2/db/schema" +import { userCollection } from "@/v2/db/schema" const DeleteAssetCollectionSchema = z.object({ collectionId: z.string({ @@ -43,9 +43,8 @@ export async function deleteAssetCollection(c: APIContext): Promise { } // check if collection exists - const collectionExists = await drizzle.query.userCollections.findFirst({ - where: (userCollections, { eq }) => - eq(userCollections.id, collectionId), + const collectionExists = await drizzle.query.userCollection.findFirst({ + where: (userCollection, { eq }) => eq(userCollection.id, collectionId), }) if (!collectionExists) { @@ -60,8 +59,8 @@ export async function deleteAssetCollection(c: APIContext): Promise { // delete collection await drizzle - .delete(userCollections) - .where(eq(userCollections.id, collectionId)) + .delete(userCollection) + .where(eq(userCollection.id, collectionId)) .execute() return c.json({ success: true, state: "collection deleted" }, 200) diff --git a/src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts b/src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts index b6f02cd..befc742 100644 --- a/src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts +++ b/src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts @@ -1,7 +1,7 @@ import { auth } from "@/v2/lib/auth/lucia" import { getConnection } from "@/v2/db/turso" import { z } from "zod" -import { userCollectionAssets } from "@/v2/db/schema" +import { userCollectionAsset } from "@/v2/db/schema" import { eq } from "drizzle-orm" const DeleteAssetFromCollectionSchema = z.object({ @@ -55,9 +55,8 @@ export async function deleteAssetFromCollection( return c.json({ success: false, state: "no asset id entered" }, 401) } - const collectionExists = await drizzle.query.userCollections.findFirst({ - where: (userCollections, { eq }) => - eq(userCollections.id, collectionId), + const collectionExists = await drizzle.query.userCollection.findFirst({ + where: (userCollection, { eq }) => eq(userCollection.id, collectionId), }) if (!collectionExists) { @@ -79,17 +78,17 @@ export async function deleteAssetFromCollection( return c.json({ success: false, state: "asset not found" }, 200) } - // check if userCollectionAssets exists - const userCollectionAssetsExists = - await drizzle.query.userCollectionAssets.findFirst({ - where: (userCollectionAssets, { eq, and }) => + // check if userCollectionAsset exists + const userCollectionAssetExists = + await drizzle.query.userCollectionAsset.findFirst({ + where: (userCollectionAsset, { eq, and }) => and( - eq(userCollectionAssets.collectionId, collectionId), - eq(userCollectionAssets.assetId, parseInt(assetId)) + eq(userCollectionAsset.collectionId, collectionId), + eq(userCollectionAsset.assetId, parseInt(assetId)) ), }) - if (!userCollectionAssetsExists) { + if (!userCollectionAssetExists) { return c.json({ success: false, state: "asset not found in collection", @@ -98,8 +97,8 @@ export async function deleteAssetFromCollection( try { await drizzle - .delete(userCollectionAssets) - .where(eq(userCollectionAssets.id, userCollectionAssetsExists.id)) + .delete(userCollectionAsset) + .where(eq(userCollectionAsset.id, userCollectionAssetExists.id)) .execute() } catch (e) { return c.json( diff --git a/src/v2/routes/auth/assets/collections/viewAssetCollection.ts b/src/v2/routes/auth/assets/collections/viewAssetCollection.ts index 2e41ab0..06c0378 100644 --- a/src/v2/routes/auth/assets/collections/viewAssetCollection.ts +++ b/src/v2/routes/auth/assets/collections/viewAssetCollection.ts @@ -26,14 +26,14 @@ export async function viewAssetCollection(c: APIContext): Promise { // check if the user owns the collection, or if the collection is public try { - await drizzle.query.userCollections.findFirst({ - where: (userCollections, { eq, or, and }) => + await drizzle.query.userCollection.findFirst({ + where: (userCollection, { eq, or, and }) => and( or( - eq(userCollections.id, collectionId), - eq(userCollections.isPublic, 1) + eq(userCollection.id, collectionId), + eq(userCollection.isPublic, 1) ), - eq(userCollections.userId, session.user.userId) + eq(userCollection.userId, session.user.userId) ), }) } catch (e) { @@ -46,17 +46,17 @@ export async function viewAssetCollection(c: APIContext): Promise { ) } - const assetCollection = await drizzle.query.userCollections.findFirst({ - where: (userCollections, { eq, or, and }) => + const assetCollection = await drizzle.query.userCollection.findFirst({ + where: (userCollection, { eq, or, and }) => and( or( - eq(userCollections.id, collectionId), - eq(userCollections.isPublic, 1) + eq(userCollection.id, collectionId), + eq(userCollection.isPublic, 1) ), - eq(userCollections.userId, session.user.userId) + eq(userCollection.userId, session.user.userId) ), with: { - userCollectionAssets: { + userCollectionAsset: { with: { assets: true, }, diff --git a/src/v2/routes/auth/assets/collections/viewAssetCollections.ts b/src/v2/routes/auth/assets/collections/viewAssetCollections.ts index e61d5b6..8dd1dee 100644 --- a/src/v2/routes/auth/assets/collections/viewAssetCollections.ts +++ b/src/v2/routes/auth/assets/collections/viewAssetCollections.ts @@ -15,21 +15,19 @@ export async function viewAssetCollections(c: APIContext): Promise { return c.json({ success: false, state: "invalid session" }, 401) } - // check if userCollections exists - const userCollectionsExists = await drizzle.query.userCollections.findFirst( - { - where: (userCollections, { eq }) => - eq(userCollections.userId, session.user.userId), - } - ) + // check if userCollection exists + const userCollectionExists = await drizzle.query.userCollection.findFirst({ + where: (userCollection, { eq }) => + eq(userCollection.userId, session.user.userId), + }) - if (!userCollectionsExists) { + if (!userCollectionExists) { return c.json({ success: false, state: "no collections found" }, 200) } - const assetCollection = await drizzle.query.userCollectionAssets.findMany({ - where: (userCollectionAssets, { eq }) => - eq(userCollectionAssets.collectionId, userCollectionsExists.id), + const assetCollection = await drizzle.query.userCollectionAsset.findMany({ + where: (userCollectionAsset, { eq }) => + eq(userCollectionAsset.collectionId, userCollectionExists.id), with: { assets: true, }, diff --git a/src/v2/routes/auth/assets/favorite/addFavoriteAsset.ts b/src/v2/routes/auth/assets/favorite/addFavoriteAsset.ts index 0734352..adc22d6 100644 --- a/src/v2/routes/auth/assets/favorite/addFavoriteAsset.ts +++ b/src/v2/routes/auth/assets/favorite/addFavoriteAsset.ts @@ -1,7 +1,7 @@ import { auth } from "@/v2/lib/auth/lucia" import { getConnection } from "@/v2/db/turso" -import { userFavorites, userFavoritesAssets } from "@/v2/db/schema" +import { userFavorite, userFavoriteAsset } from "@/v2/db/schema" export async function favoriteAsset(c: APIContext): Promise { const { drizzle } = getConnection(c.env) @@ -36,15 +36,15 @@ export async function favoriteAsset(c: APIContext): Promise { } // this should never happen, but just in case it does, UX over reads/writes to the database - const doesUserFavoritesExist = await drizzle.query.userFavorites.findFirst({ - where: (userFavorites, { eq }) => - eq(userFavorites.userId, session.user.userId), + const doesuserFavoriteExist = await drizzle.query.userFavorite.findFirst({ + where: (userFavorite, { eq }) => + eq(userFavorite.userId, session.user.userId), }) - if (!doesUserFavoritesExist) { - // create entry in userFavorites + if (!doesuserFavoriteExist) { + // create entry in userFavorite await drizzle - .insert(userFavorites) + .insert(userFavorite) .values({ id: `${session.user.userId}-${assetToFavorite}`, userId: session.user.userId, @@ -53,10 +53,10 @@ export async function favoriteAsset(c: APIContext): Promise { .execute() } - const isFavorited = await drizzle.query.userFavorites.findFirst({ - where: (userFavoritesAssets, { eq }) => + const isFavorited = await drizzle.query.userFavorite.findFirst({ + where: (userFavoriteAsset, { eq }) => eq( - userFavoritesAssets.id, + userFavoriteAsset.id, `${session.user.userId}-${assetToFavorite}` ), }) @@ -72,11 +72,11 @@ export async function favoriteAsset(c: APIContext): Promise { ) } - // add asset to userFavorites... + // add asset to userFavorite... try { - await drizzle.insert(userFavoritesAssets).values({ + await drizzle.insert(userFavoriteAsset).values({ id: `${session.user.userId}-${assetToFavorite}`, - userFavoritesId: isFavorited.id, + userFavoriteId: isFavorited.id, assetId: parseInt(assetToFavorite), }) } catch (e) { diff --git a/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts b/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts index bfee31e..ac90c4e 100644 --- a/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts +++ b/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts @@ -2,7 +2,7 @@ import { auth } from "@/v2/lib/auth/lucia" import { getConnection } from "@/v2/db/turso" import { eq } from "drizzle-orm" import { z } from "zod" -import { userFavorites, userFavoritesAssets } from "@/v2/db/schema" +import { userFavorite, userFavoriteAsset } from "@/v2/db/schema" const RemoveFavoriteAssetSchema = z.object({ assetToRemove: z.string({ @@ -48,15 +48,15 @@ export async function removeFavoriteAsset(c: APIContext): Promise { } // this should never happen, but just in case it does, UX over reads/writes to the database - const doesUserFavoritesExist = await drizzle.query.userFavorites.findFirst({ - where: (userFavorites, { eq }) => - eq(userFavorites.userId, session.user.userId), + const doesuserFavoriteExist = await drizzle.query.userFavorite.findFirst({ + where: (userFavorite, { eq }) => + eq(userFavorite.userId, session.user.userId), }) - if (!doesUserFavoritesExist) { - // create entry in userFavorites + if (!doesuserFavoriteExist) { + // create entry in userFavorite await drizzle - .insert(userFavorites) + .insert(userFavorite) .values({ id: `${session.user.userId}-${assetToRemove}`, userId: session.user.userId, @@ -65,12 +65,9 @@ export async function removeFavoriteAsset(c: APIContext): Promise { .execute() } - const isFavorited = await drizzle.query.userFavorites.findFirst({ - where: (userFavoritesAssets, { eq }) => - eq( - userFavoritesAssets.id, - `${session.user.userId}-${assetToRemove}` - ), + const isFavorited = await drizzle.query.userFavorite.findFirst({ + where: (userFavoriteAsset, { eq }) => + eq(userFavoriteAsset.id, `${session.user.userId}-${assetToRemove}`), }) if (!isFavorited) { @@ -84,13 +81,13 @@ export async function removeFavoriteAsset(c: APIContext): Promise { ) } - // remove asset from userFavorites... + // remove asset from userFavorite... try { await drizzle - .delete(userFavoritesAssets) + .delete(userFavoriteAsset) .where( eq( - userFavoritesAssets.id, + userFavoriteAsset.id, `${session.user.userId}-${assetToRemove}` ) ) diff --git a/src/v2/routes/auth/assets/favorite/viewFavoriteAssets.ts b/src/v2/routes/auth/assets/favorite/viewFavoriteAssets.ts index 7285f34..71e989d 100644 --- a/src/v2/routes/auth/assets/favorite/viewFavoriteAssets.ts +++ b/src/v2/routes/auth/assets/favorite/viewFavoriteAssets.ts @@ -15,19 +15,19 @@ export async function viewFavoriteAssets(c: APIContext): Promise { return c.json({ success: false, state: "invalid session" }, 401) } - // check if userFavorites exists - const userFavoritesExists = await drizzle.query.userFavorites.findFirst({ - where: (userFavorites, { eq }) => - eq(userFavorites.userId, session.user.userId), + // check if userFavorite exists + const userFavoriteExists = await drizzle.query.userFavorite.findFirst({ + where: (userFavorite, { eq }) => + eq(userFavorite.userId, session.user.userId), }) - if (!userFavoritesExists) { + if (!userFavoriteExists) { return c.json({ success: false, state: "no favorites found" }, 200) } - const favoriteAssets = await drizzle.query.userFavoritesAssets.findMany({ - where: (userFavoritesAssets, { eq }) => - eq(userFavoritesAssets.userFavoritesId, userFavoritesExists.id), + const favoriteAssets = await drizzle.query.userFavoriteAsset.findMany({ + where: (userFavoriteAsset, { eq }) => + eq(userFavoriteAsset.userFavoriteId, userFavoriteExists.id), with: { assets: true, }, diff --git a/src/v2/routes/auth/assets/modifyAsset.ts b/src/v2/routes/auth/assets/modifyAsset.ts index eff5ecd..d83c619 100644 --- a/src/v2/routes/auth/assets/modifyAsset.ts +++ b/src/v2/routes/auth/assets/modifyAsset.ts @@ -1,6 +1,6 @@ import { responseHeaders } from "@/v2/lib/responseHeaders" import { getConnection } from "@/v2/db/turso" -import { assetTagsAssets, assets } from "@/v2/db/schema" +import { assetTagAsset, assets } from "@/v2/db/schema" import { eq } from "drizzle-orm" import { SplitQueryByCommas } from "@/v2/lib/helpers/splitQueryByCommas" import { auth } from "@/v2/lib/auth/lucia" @@ -29,9 +29,9 @@ export async function modifyAssetData(c: APIContext): Promise { const asset = await drizzle.query.assets.findFirst({ where: (assets, { eq }) => eq(assets.id, parseInt(assetIdToModify)), with: { - assetTagsAssets: { + assetTagAsset: { with: { - assetTags: true, + assetTag: true, }, }, }, @@ -84,28 +84,28 @@ export async function modifyAssetData(c: APIContext): Promise { if (tags && tags.length > 0) { // remove all existing tags await drizzle - .delete(assetTagsAssets) - .where(eq(assetTagsAssets.assetId, parseInt(assetIdToModify))) + .delete(assetTagAsset) + .where(eq(assetTagAsset.assetId, parseInt(assetIdToModify))) .execute() // add new tags await drizzle.transaction(async (trx) => { for (const tag of tags) { - const tagExists = await trx.query.assetTags.findFirst({ - where: (assetTags) => { - return eq(assetTags.name, tag) + const tagExists = await trx.query.assetTag.findFirst({ + where: (assetTag) => { + return eq(assetTag.name, tag) }, }) if (tagExists) { await trx - .insert(assetTagsAssets) + .insert(assetTagAsset) .values({ id: crypto.randomUUID(), assetId: parseInt(assetIdToModify), assetTagId: tagExists[0].assetTagId, }) .returning({ - assetTagId: assetTagsAssets.assetTagId, + assetTagId: assetTagAsset.assetTagId, }) validTags.push(tag) } else { diff --git a/src/v2/routes/auth/assets/uploadAsset.ts b/src/v2/routes/auth/assets/uploadAsset.ts index cb9732b..d4953d6 100644 --- a/src/v2/routes/auth/assets/uploadAsset.ts +++ b/src/v2/routes/auth/assets/uploadAsset.ts @@ -1,6 +1,11 @@ import { auth } from "@/v2/lib/auth/lucia" import { getConnection } from "@/v2/db/turso" -import { assets, assetTagsAssets, games, assetCategories } from "@/v2/db/schema" +import { + assets, + assetTagAsset, + game as gameTable, + assetCategory as assetCategoryTable, +} from "@/v2/db/schema" import { z } from "zod" import { eq } from "drizzle-orm" import { SplitQueryByCommas } from "@/v2/lib/helpers/splitQueryByCommas" @@ -100,15 +105,15 @@ export async function uploadAsset(c: APIContext): Promise { const validTags = [] const invalidTags = [] - const game = await drizzle.query.games.findFirst({ - where: (games) => { - return eq(games.name, formData.data.game) + const game = await drizzle.query.game.findFirst({ + where: (game) => { + return eq(game.name, formData.data.game) }, }) - const assetCategory = await drizzle.query.assetCategories.findFirst({ - where: (assetCategories) => { - return eq(assetCategories.name, formData.data.category) + const assetCategory = await drizzle.query.assetCategory.findFirst({ + where: (assetCategory) => { + return eq(assetCategory.name, formData.data.category) }, }) @@ -139,21 +144,21 @@ export async function uploadAsset(c: APIContext): Promise { // checking if tags exist and setting relations if (formData.data.tags.length > 0) { for (const tag of SplitQueryByCommas(formData.data.tags)) { - const tagExists = await trx.query.assetTags.findFirst({ - where: (assetTags) => { - return eq(assetTags.name, tag) + const tagExists = await trx.query.assetTag.findFirst({ + where: (assetTag) => { + return eq(assetTag.name, tag) }, }) if (tagExists) { await trx - .insert(assetTagsAssets) + .insert(assetTagAsset) .values({ id: crypto.randomUUID(), assetId: newAssetDB[0].assetId, assetTagId: tagExists[0].assetTagId, }) .returning({ - assetTagId: assetTagsAssets.assetTagId, + assetTagId: assetTagAsset.assetTagId, }) validTags.push(tag) } else { @@ -164,19 +169,19 @@ export async function uploadAsset(c: APIContext): Promise { // updating game and category asset count await trx - .update(games) + .update(gameTable) .set({ assetCount: game.assetCount + 1, }) - .where(eq(games.name, formData.data.game)) + .where(eq(gameTable.name, formData.data.game)) .execute() await trx - .update(assetCategories) + .update(assetCategoryTable) .set({ assetCount: assetCategory.assetCount + 1, }) - .where(eq(assetCategories.name, formData.data.category)) + .where(eq(assetCategoryTable.name, formData.data.category)) .execute() }) } catch (e) { diff --git a/src/v2/routes/auth/authRoutes.ts b/src/v2/routes/auth/authRoutes.ts index e667cbd..dee08c2 100644 --- a/src/v2/routes/auth/authRoutes.ts +++ b/src/v2/routes/auth/authRoutes.ts @@ -54,7 +54,7 @@ authRoute.post("/generate-password-reset-token", async (c) => { authRoute.route("/assets", assetRoute) authRoute.route("/asset-categories", assetCategoryRoute) authRoute.route("/oc-generators", ocGeneratorRoute) -authRoute.route("/games", gameRoute) +authRoute.route("/game", gameRoute) authRoute.route("/tags", tagRoute) authRoute.route("/user-attributes", userAttributesRoute) diff --git a/src/v2/routes/auth/games/createGame.ts b/src/v2/routes/auth/games/createGame.ts index 6ab70af..475efcd 100644 --- a/src/v2/routes/auth/games/createGame.ts +++ b/src/v2/routes/auth/games/createGame.ts @@ -1,8 +1,7 @@ import { auth } from "@/v2/lib/auth/lucia" import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" import { getConnection } from "@/v2/db/turso" - -import { games } from "@/v2/db/schema" +import { game } from "@/v2/db/schema" export async function createGame(c: APIContext): Promise { const authRequest = auth(c.env).handleRequest(c) @@ -26,7 +25,7 @@ export async function createGame(c: APIContext): Promise { const formData = await c.req.formData() - const game = { + const newGame = { id: crypto.randomUUID(), name: formData.get("name") as string, formattedName: formData.get("formattedName") as string, @@ -35,8 +34,8 @@ export async function createGame(c: APIContext): Promise { } // check if game.name exists - const gameExists = await drizzle.query.games.findFirst({ - where: (games, { eq }) => eq(games.name, game.name), + const gameExists = await drizzle.query.game.findFirst({ + where: (game, { eq }) => eq(game.name, game.name), }) if (gameExists) { @@ -47,7 +46,7 @@ export async function createGame(c: APIContext): Promise { } try { - await drizzle.insert(games).values(game).execute() + await drizzle.insert(game).values(newGame).execute() } catch (e) { return c.json({ success: false, state: "failed to create game" }, 500) } diff --git a/src/v2/routes/auth/games/deleteGame.ts b/src/v2/routes/auth/games/deleteGame.ts index 137d4ea..2ef5f64 100644 --- a/src/v2/routes/auth/games/deleteGame.ts +++ b/src/v2/routes/auth/games/deleteGame.ts @@ -2,7 +2,7 @@ import { auth } from "@/v2/lib/auth/lucia" import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" import { getConnection } from "@/v2/db/turso" import { z } from "zod" -import { games } from "@/v2/db/schema" +import { game } from "@/v2/db/schema" import { eq } from "drizzle-orm" const DeleteGameSchema = z.object({ @@ -41,7 +41,7 @@ export async function deleteGame(c: APIContext): Promise { const { drizzle } = getConnection(c.env) try { - await drizzle.delete(games).where(eq(games.id, id)).execute() + await drizzle.delete(game).where(eq(game.id, id)).execute() } catch (e) { return c.json({ success: false, state: "failed to delete game" }, 500) } diff --git a/src/v2/routes/auth/login-methods/discord.ts b/src/v2/routes/auth/login-methods/discord.ts index fce8b61..a95f7c9 100644 --- a/src/v2/routes/auth/login-methods/discord.ts +++ b/src/v2/routes/auth/login-methods/discord.ts @@ -4,7 +4,7 @@ import { } from "@/v2/lib/auth/lucia" import { setCookie, getCookie } from "hono/cookie" import { getConnection } from "@/v2/db/turso" -import { socialsConnections } from "@/v2/db/schema" +import { socialsConnection } from "@/v2/db/schema" export async function loginWithDiscord(c: APIContext): Promise { const auth = await authAdapter(c.env) @@ -69,9 +69,9 @@ export async function discordCallback(c: APIContext): Promise { if (userWithEmail) { // check if user with same email has a discord id set as a social connection const getUsersConnections = - await drizzle.query.socialsConnections.findFirst({ - where: (socialsConnections, { eq }) => - eq(socialsConnections.userId, userWithEmail.id), + await drizzle.query.socialsConnection.findFirst({ + where: (socialsConnection, { eq }) => + eq(socialsConnection.userId, userWithEmail.id), }) if ( @@ -117,7 +117,7 @@ export async function discordCallback(c: APIContext): Promise { // add discord id as a social connection await drizzle - .insert(socialsConnections) + .insert(socialsConnection) .values({ id: `${createdUser.userId}`, userId: createdUser.userId, diff --git a/src/v2/routes/auth/tags/createTag.ts b/src/v2/routes/auth/tags/createTag.ts index 0615383..a8b50ac 100644 --- a/src/v2/routes/auth/tags/createTag.ts +++ b/src/v2/routes/auth/tags/createTag.ts @@ -2,7 +2,7 @@ import { auth } from "@/v2/lib/auth/lucia" import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" import { getConnection } from "@/v2/db/turso" import { z } from "zod" -import { assetTags } from "@/v2/db/schema" +import { assetTag } from "@/v2/db/schema" const CreateTagSchema = z.object({ name: z.string({ @@ -57,8 +57,8 @@ export async function createTag(c: APIContext): Promise { } // check if tag.name exists - const tagExists = await drizzle.query.assetTags.findFirst({ - where: (assetTags, { eq }) => eq(assetTags.name, tag.name), + const tagExists = await drizzle.query.assetTag.findFirst({ + where: (assetTag, { eq }) => eq(assetTag.name, tag.name), }) if (tagExists) { @@ -69,7 +69,7 @@ export async function createTag(c: APIContext): Promise { } try { - await drizzle.insert(assetTags).values(tag).execute() + await drizzle.insert(assetTag).values(tag).execute() } catch (e) { return c.json({ success: false, state: "failed to create tag" }, 200) } diff --git a/src/v2/routes/auth/tags/deleteTag.ts b/src/v2/routes/auth/tags/deleteTag.ts index 1041b5c..e0be00f 100644 --- a/src/v2/routes/auth/tags/deleteTag.ts +++ b/src/v2/routes/auth/tags/deleteTag.ts @@ -2,7 +2,7 @@ import { auth } from "@/v2/lib/auth/lucia" import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" import { getConnection } from "@/v2/db/turso" import { z } from "zod" -import { assetTags } from "@/v2/db/schema" +import { assetTag } from "@/v2/db/schema" import { eq } from "drizzle-orm" const DeleteTagSchema = z.object({ @@ -46,7 +46,7 @@ export async function deleteTag(c: APIContext): Promise { const { drizzle } = getConnection(c.env) try { - await drizzle.delete(assetTags).where(eq(assetTags.id, id)).execute() + await drizzle.delete(assetTag).where(eq(assetTag.id, id)).execute() } catch (e) { return c.json({ success: false, state: "failed to delete tag" }, 200) } diff --git a/src/v2/routes/games/allGames.ts b/src/v2/routes/games/allGames.ts index 8dac9a7..b117e3c 100644 --- a/src/v2/routes/games/allGames.ts +++ b/src/v2/routes/games/allGames.ts @@ -1,7 +1,7 @@ import { responseHeaders } from "@/v2/lib/responseHeaders" import { getConnection } from "@/v2/db/turso" import { listBucket } from "@/v2/lib/listBucket" -import { games } from "@/v2/db/schema" +import { game } from "@/v2/db/schema" export async function getAllGames(c: APIContext): Promise { const cacheKey = new Request(c.req.url.toString(), c.req) @@ -23,9 +23,9 @@ export async function getAllGames(c: APIContext): Promise { const { drizzle } = getConnection(c.env) - const gamesList = await drizzle + const gameList = await drizzle .select() - .from(games) + .from(game) .execute() .then((row) => row.map((game) => ({ @@ -40,7 +40,7 @@ export async function getAllGames(c: APIContext): Promise { { success: true, status: "ok", - results: gamesList, + results: gameList, }, 200, responseHeaders diff --git a/src/v2/routes/games/gamesRoutes.ts b/src/v2/routes/games/gamesRoutes.ts index b095277..bb64792 100644 --- a/src/v2/routes/games/gamesRoutes.ts +++ b/src/v2/routes/games/gamesRoutes.ts @@ -1,10 +1,10 @@ import { Hono } from "hono" import { getAllGames } from "./allGames" -const gamesRoute = new Hono<{ Bindings: Bindings }>() +const gameRoute = new Hono<{ Bindings: Bindings }>() -gamesRoute.get("/all", async (c) => { +gameRoute.get("/all", async (c) => { return getAllGames(c) }) -export default gamesRoute +export default gameRoute diff --git a/src/v2/routes/search/all/searchAll.ts b/src/v2/routes/search/all/searchAll.ts index eacbe87..cb085d9 100644 --- a/src/v2/routes/search/all/searchAll.ts +++ b/src/v2/routes/search/all/searchAll.ts @@ -36,16 +36,16 @@ export async function searchAll(c: APIContext): Promise { limit: 25, }) - const assetCategoryResponse = await drizzle.query.assetCategories.findMany({ - where: (assetCategories) => { - return like(assetCategories.name, `%${query}%`) + const assetCategoryResponse = await drizzle.query.assetCategory.findMany({ + where: (assetCategory) => { + return like(assetCategory.name, `%${query}%`) }, limit: 25, }) - const assetTagsResponse = await drizzle.query.assetTags.findMany({ - where: (assetTags) => { - return like(assetTags.name, `%${query}%`) + const assetTagResponse = await drizzle.query.assetTag.findMany({ + where: (assetTag) => { + return like(assetTag.name, `%${query}%`) }, limit: 25, }) @@ -57,9 +57,9 @@ export async function searchAll(c: APIContext): Promise { limit: 25, }) - const gamesResponse = await drizzle.query.games.findMany({ - where: (games) => { - return like(games.name, `%${query}%`) + const gameResponse = await drizzle.query.game.findMany({ + where: (game) => { + return like(game.name, `%${query}%`) }, limit: 25, }) @@ -79,14 +79,14 @@ export async function searchAll(c: APIContext): Promise { limit: 25, }) - const collectionsResponse = await drizzle.query.userCollections.findMany({ - where: (userCollections, { or, and }) => { + const collectionsResponse = await drizzle.query.userCollection.findMany({ + where: (userCollection, { or, and }) => { return and( or( - session && eq(userCollections.userId, session.user.userId), - eq(userCollections.isPublic, 1) + session && eq(userCollection.userId, session.user.userId), + eq(userCollection.isPublic, 1) ), - like(userCollections.name, `%${query}%`) + like(userCollection.name, `%${query}%`) ) }, limit: 25, @@ -104,11 +104,11 @@ export async function searchAll(c: APIContext): Promise { assetCategoryResponse: assetCategoryResponse ? assetCategoryResponse : [], - assetTagsResponse: assetTagsResponse ? assetTagsResponse : [], + assetTagResponse: assetTagResponse ? assetTagResponse : [], savedOcGeneratorsResponse: savedOcGeneratorsResponse ? savedOcGeneratorsResponse : [], - gamesResponse: gamesResponse ? gamesResponse : [], + gameResponse: gameResponse ? gameResponse : [], collectionsResponse: collectionsResponse ? collectionsResponse : [], diff --git a/src/v2/routes/search/asset/searchAssets.ts b/src/v2/routes/search/asset/searchAssets.ts index a20b5c9..7ed2c9d 100644 --- a/src/v2/routes/search/asset/searchAssets.ts +++ b/src/v2/routes/search/asset/searchAssets.ts @@ -1,6 +1,6 @@ import { responseHeaders } from "@/v2/lib/responseHeaders" import { getConnection } from "@/v2/db/turso" -import { assetTagsAssets, assets, assetTags, users } from "@/v2/db/schema" +import { assetTagAsset, assets, assetTag, users } from "@/v2/db/schema" import { desc, like, sql, eq, and, or } from "drizzle-orm" import { SplitQueryByCommas } from "@/v2/lib/helpers/splitQueryByCommas" @@ -10,14 +10,14 @@ export async function searchForAssets(c: APIContext): Promise { let response = await cache.match(cacheKey) if (response) return response - const { query, gameQuery, assetCategoryQuery, assetTagsQuery } = + const { query, gameQuery, assetCategoryQuery, assetTagQuery } = c.req.query() - // search parameters can include optional search params: query, game, assetCategory, assetTags + // search parameters can include optional search params: query, game, assetCategory, assetTag // query?: string => ?query=keqing // game?: comma separated list of game names => ?game=genshin-impact,honkai-impact-3rd // assetCategory?: comma separated list of asset category names => ?assetCategory=splash-art,character-sheets - // assetTags?: comma separated list of asset tag names => ?assetTags=no-background,fanmade,official + // assetTag?: comma separated list of asset tag names => ?assetTag=no-background,fanmade,official const { drizzle } = getConnection(c.env) @@ -28,21 +28,21 @@ export async function searchForAssets(c: APIContext): Promise { const assetCategoryList = assetCategoryQuery ? SplitQueryByCommas(assetCategoryQuery.toLowerCase()) : null - const assetTagsList = assetTagsQuery - ? SplitQueryByCommas(assetTagsQuery.toLowerCase()) + const assetTagList = assetTagQuery + ? SplitQueryByCommas(assetTagQuery.toLowerCase()) : // TODO(dromzeh): allow for no tags to be specified ["official"] const assetTagResponse = drizzle.$with("sq").as( drizzle .select({ - assetId: assetTagsAssets.assetId, - tags: sql`array_agg(${assetTags})`.as("tags"), + assetId: assetTagAsset.assetId, + tags: sql`array_agg(${assetTag})`.as("tags"), }) - .from(assetTagsAssets) - .leftJoin(assetTags, eq(assetTags.id, assetTagsAssets.assetTagId)) - .where(or(...assetTagsList.map((tag) => eq(assetTags.name, tag)))) - .groupBy(assetTagsAssets.assetId) + .from(assetTagAsset) + .leftJoin(assetTag, eq(assetTag.id, assetTagAsset.assetTagId)) + .where(or(...assetTagList.map((tag) => eq(assetTag.name, tag)))) + .groupBy(assetTagAsset.assetId) ) const result = await drizzle @@ -75,7 +75,7 @@ export async function searchForAssets(c: APIContext): Promise { query, gameQuery, assetCategoryQuery, - assetTagsQuery, + assetTagQuery, results: result ?? [], }, 200, diff --git a/src/v2/routes/tags/allTags.ts b/src/v2/routes/tags/allTags.ts index 39ee50b..d2b3c75 100644 --- a/src/v2/routes/tags/allTags.ts +++ b/src/v2/routes/tags/allTags.ts @@ -1,6 +1,6 @@ import { getConnection } from "@/v2/db/turso" -export async function listAllAssetTags(c: APIContext): Promise { +export async function listAllassetTag(c: APIContext): Promise { const cacheKey = new Request(c.req.url.toString(), c.req) const cache = caches.default let response = await cache.match(cacheKey) @@ -9,15 +9,15 @@ export async function listAllAssetTags(c: APIContext): Promise { const { drizzle } = getConnection(c.env) - const allAssetTags = await drizzle.query.assetTags.findMany({ - orderBy: (assetTags) => assetTags.name, + const allassetTag = await drizzle.query.assetTag.findMany({ + orderBy: (assetTag) => assetTag.name, }) response = c.json( { success: true, status: "ok", - allAssetTags, + allassetTag, }, 200 ) diff --git a/src/v2/routes/tags/getTagById.ts b/src/v2/routes/tags/getTagById.ts index 3c487fe..0d481a6 100644 --- a/src/v2/routes/tags/getTagById.ts +++ b/src/v2/routes/tags/getTagById.ts @@ -9,8 +9,8 @@ export async function getTagById(c: APIContext): Promise { const { drizzle } = getConnection(c.env) - const assetTag = await drizzle.query.assetTags.findFirst({ - where: (assetTags, { eq }) => eq(assetTags.id, c.req.param("id")), + const assetTag = await drizzle.query.assetTag.findFirst({ + where: (assetTag, { eq }) => eq(assetTag.id, c.req.param("id")), }) response = c.json( diff --git a/src/v2/routes/tags/getTagByName.ts b/src/v2/routes/tags/getTagByName.ts index bfe21f3..edabbc8 100644 --- a/src/v2/routes/tags/getTagByName.ts +++ b/src/v2/routes/tags/getTagByName.ts @@ -9,8 +9,8 @@ export async function getTagByName(c: APIContext): Promise { const { drizzle } = getConnection(c.env) - const assetTag = await drizzle.query.assetTags.findFirst({ - where: (assetTags, { eq }) => eq(assetTags.name, c.req.param("name")), + const assetTag = await drizzle.query.assetTag.findFirst({ + where: (assetTag, { eq }) => eq(assetTag.name, c.req.param("name")), }) response = c.json( diff --git a/src/v2/routes/tags/tagsRoutes.ts b/src/v2/routes/tags/tagsRoutes.ts index 77d7c0f..37efd11 100644 --- a/src/v2/routes/tags/tagsRoutes.ts +++ b/src/v2/routes/tags/tagsRoutes.ts @@ -1,12 +1,12 @@ import { Hono } from "hono" -import { listAllAssetTags } from "./allTags" +import { listAllassetTag } from "./allTags" import { getTagById } from "./getTagById" import { getTagByName } from "./getTagByName" const tagsRoute = new Hono<{ Bindings: Bindings }>() tagsRoute.get("/all", async (c) => { - return listAllAssetTags(c) + return listAllassetTag(c) }) tagsRoute.get("/id/:id", async (c) => { From 63e0a9376c6a147fe9c2bd1348bb5ff7be99def8 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Tue, 17 Oct 2023 18:06:35 +0100 Subject: [PATCH 118/318] update deps & fix db indexing --- package.json | 25 +- pnpm-lock.yaml | 529 +++++++++++++++----------- src/v2/db/schema.ts | 101 ++--- src/v2/routes/discord/contributors.ts | 1 + 4 files changed, 377 insertions(+), 279 deletions(-) diff --git a/package.json b/package.json index 74c7feb..d8c2ee3 100644 --- a/package.json +++ b/package.json @@ -13,32 +13,33 @@ "drizzle:push": "drizzle-kit push:sqlite" }, "devDependencies": { - "@cloudflare/workers-types": "^4.20230914.0", - "@types/node": "^20.6.5", + "@cloudflare/workers-types": "^4.20231016.0", + "@types/node": "^20.8.6", "dotenv": "^16.3.1", "drizzle-kit": "^0.19.13", - "eslint": "^8.50.0", + "eslint": "^8.51.0", "eslint-config-google": "^0.14.0", "eslint-plugin-json": "^3.1.0", "husky": "^8.0.3", "tsx": "^3.13.0", "typescript": "^5.2.2", - "wrangler": "3.9.0" + "wrangler": "3.13.1" }, "private": true, "dependencies": { - "@hono/zod-openapi": "^0.6.0", - "@libsql/client": "0.3.4", + "@hono/zod-openapi": "^0.7.2", + "@libsql/client": "0.3.5", "@lucia-auth/adapter-session-unstorage": "^2.1.0", "@lucia-auth/adapter-sqlite": "^2.0.0", - "@lucia-auth/oauth": "^3.3.0", - "@typescript-eslint/eslint-plugin": "^6.7.2", + "@lucia-auth/oauth": "^3.3.1", + "@typescript-eslint/eslint-plugin": "^6.8.0", + "better-sqlite3": "^9.0.0", "drizzle-orm": "^0.28.6", - "hono": "^3.7.2", - "lucia": "^2.7.0", - "mysql2": "^3.6.1", + "hono": "^3.8.0", + "lucia": "^2.7.1", + "mysql2": "^3.6.2", "prettier": "^3.0.3", "unstorage": "^1.9.0", - "zod": "^3.22.2" + "zod": "^3.22.4" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7d35433..bebcc60 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,35 +6,38 @@ settings: dependencies: "@hono/zod-openapi": - specifier: ^0.6.0 - version: 0.6.0(hono@3.7.2)(zod@3.22.2) + specifier: ^0.7.2 + version: 0.7.2(hono@3.8.0)(zod@3.22.4) "@libsql/client": - specifier: 0.3.4 - version: 0.3.4 + specifier: 0.3.5 + version: 0.3.5 "@lucia-auth/adapter-session-unstorage": specifier: ^2.1.0 - version: 2.1.0(lucia@2.7.0)(unstorage@1.9.0) + version: 2.1.0(lucia@2.7.1)(unstorage@1.9.0) "@lucia-auth/adapter-sqlite": specifier: ^2.0.0 - version: 2.0.0(@libsql/client@0.3.4)(lucia@2.7.0) + version: 2.0.0(@libsql/client@0.3.5)(better-sqlite3@9.0.0)(lucia@2.7.1) "@lucia-auth/oauth": - specifier: ^3.3.0 - version: 3.3.0(lucia@2.7.0) + specifier: ^3.3.1 + version: 3.3.1(lucia@2.7.1) "@typescript-eslint/eslint-plugin": - specifier: ^6.7.2 - version: 6.7.2(@typescript-eslint/parser@6.7.2)(eslint@8.50.0)(typescript@5.2.2) + specifier: ^6.8.0 + version: 6.8.0(@typescript-eslint/parser@6.8.0)(eslint@8.51.0)(typescript@5.2.2) + better-sqlite3: + specifier: ^9.0.0 + version: 9.0.0 drizzle-orm: specifier: ^0.28.6 - version: 0.28.6(@cloudflare/workers-types@4.20230914.0)(@libsql/client@0.3.4)(mysql2@3.6.1) + version: 0.28.6(@cloudflare/workers-types@4.20231016.0)(@libsql/client@0.3.5)(better-sqlite3@9.0.0)(mysql2@3.6.2) hono: - specifier: ^3.7.2 - version: 3.7.2 + specifier: ^3.8.0 + version: 3.8.0 lucia: - specifier: ^2.7.0 - version: 2.7.0 + specifier: ^2.7.1 + version: 2.7.1 mysql2: - specifier: ^3.6.1 - version: 3.6.1 + specifier: ^3.6.2 + version: 3.6.2 prettier: specifier: ^3.0.3 version: 3.0.3 @@ -42,16 +45,16 @@ dependencies: specifier: ^1.9.0 version: 1.9.0 zod: - specifier: ^3.22.2 - version: 3.22.2 + specifier: ^3.22.4 + version: 3.22.4 devDependencies: "@cloudflare/workers-types": - specifier: ^4.20230914.0 - version: 4.20230914.0 + specifier: ^4.20231016.0 + version: 4.20231016.0 "@types/node": - specifier: ^20.6.5 - version: 20.6.5 + specifier: ^20.8.6 + version: 20.8.6 dotenv: specifier: ^16.3.1 version: 16.3.1 @@ -59,11 +62,11 @@ devDependencies: specifier: ^0.19.13 version: 0.19.13 eslint: - specifier: ^8.50.0 - version: 8.50.0 + specifier: ^8.51.0 + version: 8.51.0 eslint-config-google: specifier: ^0.14.0 - version: 0.14.0(eslint@8.50.0) + version: 0.14.0(eslint@8.51.0) eslint-plugin-json: specifier: ^3.1.0 version: 3.1.0 @@ -77,8 +80,8 @@ devDependencies: specifier: ^5.2.2 version: 5.2.2 wrangler: - specifier: 3.9.0 - version: 3.9.0 + specifier: 3.13.1 + version: 3.13.1 packages: /@aashutoshrathi/word-wrap@1.2.6: @@ -88,7 +91,7 @@ packages: } engines: { node: ">=0.10.0" } - /@asteasolutions/zod-to-openapi@5.5.0(zod@3.22.2): + /@asteasolutions/zod-to-openapi@5.5.0(zod@3.22.4): resolution: { integrity: sha512-d5HwrvM6dOKr3XdeF+DmashGvfEc+1oiEfbscugsiwSTrFtuMa7ETpW9sTNnVgn+hJaz+PRxPQUYD7q9/5dUig==, @@ -97,7 +100,7 @@ packages: zod: ^3.20.2 dependencies: openapi3-ts: 4.1.2 - zod: 3.22.2 + zod: 3.22.4 dev: false /@cloudflare/kv-asset-handler@0.2.0: @@ -109,10 +112,10 @@ packages: mime: 3.0.0 dev: true - /@cloudflare/workerd-darwin-64@1.20230904.0: + /@cloudflare/workerd-darwin-64@1.20231010.0: resolution: { - integrity: sha512-/GDlmxAFbDtrQwP4zOXFbqOfaPvkDxdsCoEa+KEBcAl5uR98+7WW5/b8naBHX+t26uS7p4bLlImM8J5F1ienRQ==, + integrity: sha512-LM9ePAh88EGoQkYisAfdLMEDzcaMinRer0mY11GOiN4A9ZU+6APRVvhh5JBRzI0F6Dkb8nHtrzhisioWCRaY1w==, } engines: { node: ">=16" } cpu: [x64] @@ -121,10 +124,10 @@ packages: dev: true optional: true - /@cloudflare/workerd-darwin-arm64@1.20230904.0: + /@cloudflare/workerd-darwin-arm64@1.20231010.0: resolution: { - integrity: sha512-x8WXNc2xnDqr5y1iirnNdyx8GZY3rL5xiF7ebK3mKQeB+jFjkhO71yuPTkDCzUWtOvw1Wfd4jbwy4wxacMX4mQ==, + integrity: sha512-Vr7Z1O+vJRCnVeWaF0YSv0EMHiMRY7yYCxr7O509FzvJAXsZuXZ7DYC5TAD7a8HSeeqsxFTAbF9jg0y9A2wKVw==, } engines: { node: ">=16" } cpu: [arm64] @@ -133,10 +136,10 @@ packages: dev: true optional: true - /@cloudflare/workerd-linux-64@1.20230904.0: + /@cloudflare/workerd-linux-64@1.20231010.0: resolution: { - integrity: sha512-V58xyMS3oDpKO8Dpdh0r0BXm99OzoGgvWe9ufttVraj/1NTMGELwb6i9ySb8k3F1J9m/sO26+TV7pQc/bGC1VQ==, + integrity: sha512-l9oDVPVhPEOHr1JpcGnLSsIf1h8sZnvcIC2Tl1zt+3p/KGFyGqGyAZJMLUoMJ54Q07oRE1x3KAu+JcWWEvdxpg==, } engines: { node: ">=16" } cpu: [x64] @@ -145,10 +148,10 @@ packages: dev: true optional: true - /@cloudflare/workerd-linux-arm64@1.20230904.0: + /@cloudflare/workerd-linux-arm64@1.20231010.0: resolution: { - integrity: sha512-VrDaW+pjb5IAKEnNWtEaFiG377kXKmk5Fu0Era4W+jKzPON2BW/qRb/4LNHXQ4yxg/2HLm7RiUTn7JZtt1qO6A==, + integrity: sha512-NBmYsJu+ns2W8WHcDnglfqLV5O3FP7lXpoTSTvpM64mhexmemdMlOJX5gpRuarTula3fA+GzEehinUojwM9/1g==, } engines: { node: ">=16" } cpu: [arm64] @@ -157,10 +160,10 @@ packages: dev: true optional: true - /@cloudflare/workerd-windows-64@1.20230904.0: + /@cloudflare/workerd-windows-64@1.20231010.0: resolution: { - integrity: sha512-/R/dE8uy+8J2YeXfDhI8/Bg7YUirdbbjH5/l/Vv00ZRE0lC3nPLcYeyBXSwXIQ6/Xht3gN+lksLQgKd0ZWRd+Q==, + integrity: sha512-jWiG71Rvuh4FYdEpOP1+BAygdguTlMYYy+v5d4ZOjxDkl+V8aR86EEtDQrv/QLUJFbpcoEX25SxXnN5UMKtjhQ==, } engines: { node: ">=16" } cpu: [x64] @@ -169,10 +172,10 @@ packages: dev: true optional: true - /@cloudflare/workers-types@4.20230914.0: + /@cloudflare/workers-types@4.20231016.0: resolution: { - integrity: sha512-OVeN4lFVu1O0PJGZ2d0FwpK8lelFcr33qYOgCh77ErEYmEBO4adwnIxcIsdQbFbhF0ffN6joiVcljD4zakdaeQ==, + integrity: sha512-eGB0cRVyoJpeyGJx2re5sbd9R316a61sY73xwnqm4cwGpb+OxCK2gc651RxGiN7H4w6LY1RpysUgeGLmj5B3+g==, } /@drizzle-team/studio@0.0.5: @@ -754,7 +757,7 @@ packages: dev: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.50.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.51.0): resolution: { integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, @@ -763,13 +766,13 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.50.0 + eslint: 8.51.0 eslint-visitor-keys: 3.4.3 - /@eslint-community/regexpp@4.8.1: + /@eslint-community/regexpp@4.9.1: resolution: { - integrity: sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==, + integrity: sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==, } engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } @@ -783,7 +786,7 @@ packages: ajv: 6.12.6 debug: 4.3.4 espree: 9.6.1 - globals: 13.22.0 + globals: 13.23.0 ignore: 5.2.4 import-fresh: 3.3.0 js-yaml: 4.1.0 @@ -792,40 +795,48 @@ packages: transitivePeerDependencies: - supports-color - /@eslint/js@8.50.0: + /@eslint/js@8.51.0: resolution: { - integrity: sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==, + integrity: sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - /@hono/zod-openapi@0.6.0(hono@3.7.2)(zod@3.22.2): + /@fastify/busboy@2.0.0: resolution: { - integrity: sha512-BZOLEIpHl0xbUaWs1v3gwJwrlT7gRvwSQeqGeRxVkI5HU958+B7bpBd3qYhwy5Qeb0EUTBVY/dQOsw6wapuF+g==, + integrity: sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==, + } + engines: { node: ">=14" } + dev: true + + /@hono/zod-openapi@0.7.2(hono@3.8.0)(zod@3.22.4): + resolution: + { + integrity: sha512-rmoRk2wGkniDf7VZSqCUUR+l25uVjsw8CCPeATU0eZAZPo8H2NgDVRx3rS535cdkZKdZgd/votWksuJhZRsKRA==, } engines: { node: ">=16.0.0" } peerDependencies: hono: "*" zod: 3.* dependencies: - "@asteasolutions/zod-to-openapi": 5.5.0(zod@3.22.2) - "@hono/zod-validator": 0.1.8(hono@3.7.2)(zod@3.22.2) - hono: 3.7.2 - zod: 3.22.2 + "@asteasolutions/zod-to-openapi": 5.5.0(zod@3.22.4) + "@hono/zod-validator": 0.1.9(hono@3.8.0)(zod@3.22.4) + hono: 3.8.0 + zod: 3.22.4 dev: false - /@hono/zod-validator@0.1.8(hono@3.7.2)(zod@3.22.2): + /@hono/zod-validator@0.1.9(hono@3.8.0)(zod@3.22.4): resolution: { - integrity: sha512-/Kd/p/dUVKM7/1TY3jafTV+ngwEh3fOLmXCJQKb9esWsCom5WOJaNmZYv8jeRhyipu1xBvmN5jceRA3Ev3rmQw==, + integrity: sha512-qEG5xagKzyif283ldCKzp+aF9Aebclg0sfrgyRQQNAizmXpicZ3UGduST/Jp+a9bjt3mI+VyEXMftb4rogLxQA==, } peerDependencies: hono: 3.* zod: ^3.19.1 dependencies: - hono: 3.7.2 - zod: 3.22.2 + hono: 3.8.0 + zod: 3.22.4 dev: false /@humanwhocodes/config-array@0.11.11: @@ -861,21 +872,43 @@ packages: } dev: false - /@libsql/client@0.3.4: + /@libsql/client@0.3.5: resolution: { - integrity: sha512-b1rpCzm02oQuh1zM1UKdKxhClyMMlgyFagcmsuGTve/AQxubO/FaRgoKXTcGaOqoRjymE1qf0sQM2UoyPvu3lA==, + integrity: sha512-4fZxGh0qKW5dtp1yuQLRvRAtbt02V4jzjM9sHSmz5k25xZTLg7/GlNudKdqKZrjJXEV5PvDNsczupBtedZZovw==, } dependencies: "@libsql/hrana-client": 0.5.5 - better-sqlite3: 8.6.0 js-base64: 3.7.5 + libsql: 0.1.29 transitivePeerDependencies: - bufferutil - encoding - utf-8-validate dev: false + /@libsql/darwin-arm64@0.1.29: + resolution: + { + integrity: sha512-lYSQaJV6Jsjuh/zms7i6QCL2GLQT17zeFVUZBNQxje0GyUtpvvfkz10S32n5+cY1TRbsbBCKzYhYxnTaTdD7Eg==, + } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@libsql/darwin-x64@0.1.29: + resolution: + { + integrity: sha512-LFf6oSiBCQ0jJmh4WrQQKpa99qZVdY6KPNHU621hPV6LarEA/59YErMfAZOQY5A0iAhAzJ9ml0npt0Z63MU9dA==, + } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + /@libsql/hrana-client@0.5.5: resolution: { @@ -910,14 +943,58 @@ packages: integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==, } dependencies: - "@types/ws": 8.5.5 + "@types/ws": 8.5.7 ws: 8.14.2 transitivePeerDependencies: - bufferutil - utf-8-validate dev: false - /@lucia-auth/adapter-session-unstorage@2.1.0(lucia@2.7.0)(unstorage@1.9.0): + /@libsql/linux-arm64-gnu@0.1.29: + resolution: + { + integrity: sha512-9Mtz3xRUpj1gRMFqi0+R/e2hAq711u0ogTvvlNWKjA9OZZfPgk0vLlT1Pqm0Pf1gyVc393RafZcCGP3FZMkjmg==, + } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@libsql/linux-x64-gnu@0.1.29: + resolution: + { + integrity: sha512-EE3YpxqSRXnvxwPq38A9j1/poqzEJrDXnGEKcVcWqC2FB/qPJHxnAITBUNYicovdrrZYWRE5EM0LdSO6CMWi6A==, + } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@libsql/linux-x64-musl@0.1.29: + resolution: + { + integrity: sha512-CJc+hKbUzF0JpAqQHT7P3SPb/NLCWsPzBD6j8fvHH34JLRYaIu9H8WrXsxAcVF65B7Jvat/CXnSe+iOctonBow==, + } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@libsql/win32-x64-msvc@0.1.29: + resolution: + { + integrity: sha512-pIdMzY+NOKHDHiTUGLwMd3TICUiHbcxPedPRYJAI6ofTSu77JEmkmfkXcCOL8L8B9gio4ZuNeok+1i/ZPf6oeQ==, + } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@lucia-auth/adapter-session-unstorage@2.1.0(lucia@2.7.1)(unstorage@1.9.0): resolution: { integrity: sha512-ItK7urZhLZv7UO99BcODjRhSAv58UPc+KQAmnkSvri2WBc22vFEjnjd/oWp3CZPdbbrJkuTvsuhFXH1ySBfOLg==, @@ -926,11 +1003,11 @@ packages: lucia: ^2.0.0 unstorage: ^1.9.0 dependencies: - lucia: 2.7.0 + lucia: 2.7.1 unstorage: 1.9.0 dev: false - /@lucia-auth/adapter-sqlite@2.0.0(@libsql/client@0.3.4)(lucia@2.7.0): + /@lucia-auth/adapter-sqlite@2.0.0(@libsql/client@0.3.5)(better-sqlite3@9.0.0)(lucia@2.7.1): resolution: { integrity: sha512-Hiy8WND/1mi25r0M2ruSml+Ab5GJLr4XZEHApYw1lxybF+VlPUyX7oTtIVCSgvq/SWiP/tvnyPwnXAPmNr8/bg==, @@ -945,19 +1022,27 @@ packages: better-sqlite3: optional: true dependencies: - "@libsql/client": 0.3.4 - lucia: 2.7.0 + "@libsql/client": 0.3.5 + better-sqlite3: 9.0.0 + lucia: 2.7.1 dev: false - /@lucia-auth/oauth@3.3.0(lucia@2.7.0): + /@lucia-auth/oauth@3.3.1(lucia@2.7.1): resolution: { - integrity: sha512-vb9BBcZXOeeijGndnvq/AoJJZU6MAKG7UCqV1n9tQ81edSPaWZWsxSDrDjmNFrY0tSyATZMWo/LXbzt/WQdKdA==, + integrity: sha512-2fGXPRXXQ58YGpN3zzbLSTWBXU4I3URcSXF7enR4cLugUcwdtYaGRL9b92tfZPHudr5BJRrrVqcs/VTjHTrdiw==, } peerDependencies: lucia: ^2.0.0 dependencies: - lucia: 2.7.0 + lucia: 2.7.1 + dev: false + + /@neon-rs/load@0.0.4: + resolution: + { + integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==, + } dev: false /@nodelib/fs.scandir@2.1.5: @@ -1184,36 +1269,38 @@ packages: integrity: sha512-95X8guJYhfqiuVVhRFxVQcf4hW/2bCuoPwDasMf/531STFoNoWTT7YDnWdXHEZKqAGUigmpG31r2FE70LwnzJw==, } dependencies: - "@types/node": 20.6.5 + "@types/node": 20.8.6 form-data: 4.0.0 dev: false - /@types/node@20.6.5: + /@types/node@20.8.6: resolution: { - integrity: sha512-2qGq5LAOTh9izcc0+F+dToFigBWiK1phKPt7rNhOqJSr35y8rlIBjDwGtFSgAI6MGIhjwOVNSQZVdJsZJ2uR1w==, + integrity: sha512-eWO4K2Ji70QzKUqRy6oyJWUeB7+g2cRagT3T/nxYibYcT4y2BDL8lqolRXjTHmkZCdJfIPaY73KbJAZmcryxTQ==, } + dependencies: + undici-types: 5.25.3 - /@types/semver@7.5.2: + /@types/semver@7.5.3: resolution: { - integrity: sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==, + integrity: sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==, } dev: false - /@types/ws@8.5.5: + /@types/ws@8.5.7: resolution: { - integrity: sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==, + integrity: sha512-6UrLjiDUvn40CMrAubXuIVtj2PEfKDffJS7ychvnPU44j+KVeXmdHHTgqcM/dxLUTHxlXHiFM8Skmb8ozGdTnQ==, } dependencies: - "@types/node": 20.6.5 + "@types/node": 20.8.6 dev: false - /@typescript-eslint/eslint-plugin@6.7.2(@typescript-eslint/parser@6.7.2)(eslint@8.50.0)(typescript@5.2.2): + /@typescript-eslint/eslint-plugin@6.8.0(@typescript-eslint/parser@6.8.0)(eslint@8.51.0)(typescript@5.2.2): resolution: { - integrity: sha512-ooaHxlmSgZTM6CHYAFRlifqh1OAr3PAQEwi7lhYhaegbnXrnh7CDcHmc3+ihhbQC7H0i4JF0psI5ehzkF6Yl6Q==, + integrity: sha512-GosF4238Tkes2SHPQ1i8f6rMtG6zlKwMEB0abqSJ3Npvos+doIlc/ATG+vX1G9coDF3Ex78zM3heXHLyWEwLUw==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -1224,14 +1311,14 @@ packages: typescript: optional: true dependencies: - "@eslint-community/regexpp": 4.8.1 - "@typescript-eslint/parser": 6.7.2(eslint@8.50.0)(typescript@5.2.2) - "@typescript-eslint/scope-manager": 6.7.2 - "@typescript-eslint/type-utils": 6.7.2(eslint@8.50.0)(typescript@5.2.2) - "@typescript-eslint/utils": 6.7.2(eslint@8.50.0)(typescript@5.2.2) - "@typescript-eslint/visitor-keys": 6.7.2 + "@eslint-community/regexpp": 4.9.1 + "@typescript-eslint/parser": 6.8.0(eslint@8.51.0)(typescript@5.2.2) + "@typescript-eslint/scope-manager": 6.8.0 + "@typescript-eslint/type-utils": 6.8.0(eslint@8.51.0)(typescript@5.2.2) + "@typescript-eslint/utils": 6.8.0(eslint@8.51.0)(typescript@5.2.2) + "@typescript-eslint/visitor-keys": 6.8.0 debug: 4.3.4 - eslint: 8.50.0 + eslint: 8.51.0 graphemer: 1.4.0 ignore: 5.2.4 natural-compare: 1.4.0 @@ -1242,10 +1329,10 @@ packages: - supports-color dev: false - /@typescript-eslint/parser@6.7.2(eslint@8.50.0)(typescript@5.2.2): + /@typescript-eslint/parser@6.8.0(eslint@8.51.0)(typescript@5.2.2): resolution: { - integrity: sha512-KA3E4ox0ws+SPyxQf9iSI25R6b4Ne78ORhNHeVKrPQnoYsb9UhieoiRoJgrzgEeKGOXhcY1i8YtOeCHHTDa6Fw==, + integrity: sha512-5tNs6Bw0j6BdWuP8Fx+VH4G9fEPDxnVI7yH1IAPkQH5RUtvKwRoqdecAPdQXv4rSOADAaz1LFBZvZG7VbXivSg==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -1255,32 +1342,32 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/scope-manager": 6.7.2 - "@typescript-eslint/types": 6.7.2 - "@typescript-eslint/typescript-estree": 6.7.2(typescript@5.2.2) - "@typescript-eslint/visitor-keys": 6.7.2 + "@typescript-eslint/scope-manager": 6.8.0 + "@typescript-eslint/types": 6.8.0 + "@typescript-eslint/typescript-estree": 6.8.0(typescript@5.2.2) + "@typescript-eslint/visitor-keys": 6.8.0 debug: 4.3.4 - eslint: 8.50.0 + eslint: 8.51.0 typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/scope-manager@6.7.2: + /@typescript-eslint/scope-manager@6.8.0: resolution: { - integrity: sha512-bgi6plgyZjEqapr7u2mhxGR6E8WCzKNUFWNh6fkpVe9+yzRZeYtDTbsIBzKbcxI+r1qVWt6VIoMSNZ4r2A+6Yw==, + integrity: sha512-xe0HNBVwCph7rak+ZHcFD6A+q50SMsFwcmfdjs9Kz4qDh5hWhaPhFjRs/SODEhroBI5Ruyvyz9LfwUJ624O40g==, } engines: { node: ^16.0.0 || >=18.0.0 } dependencies: - "@typescript-eslint/types": 6.7.2 - "@typescript-eslint/visitor-keys": 6.7.2 + "@typescript-eslint/types": 6.8.0 + "@typescript-eslint/visitor-keys": 6.8.0 dev: false - /@typescript-eslint/type-utils@6.7.2(eslint@8.50.0)(typescript@5.2.2): + /@typescript-eslint/type-utils@6.8.0(eslint@8.51.0)(typescript@5.2.2): resolution: { - integrity: sha512-36F4fOYIROYRl0qj95dYKx6kybddLtsbmPIYNK0OBeXv2j9L5nZ17j9jmfy+bIDHKQgn2EZX+cofsqi8NPATBQ==, + integrity: sha512-RYOJdlkTJIXW7GSldUIHqc/Hkto8E+fZN96dMIFhuTJcQwdRoGN2rEWA8U6oXbLo0qufH7NPElUb+MceHtz54g==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -1290,28 +1377,28 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/typescript-estree": 6.7.2(typescript@5.2.2) - "@typescript-eslint/utils": 6.7.2(eslint@8.50.0)(typescript@5.2.2) + "@typescript-eslint/typescript-estree": 6.8.0(typescript@5.2.2) + "@typescript-eslint/utils": 6.8.0(eslint@8.51.0)(typescript@5.2.2) debug: 4.3.4 - eslint: 8.50.0 + eslint: 8.51.0 ts-api-utils: 1.0.3(typescript@5.2.2) typescript: 5.2.2 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/types@6.7.2: + /@typescript-eslint/types@6.8.0: resolution: { - integrity: sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg==, + integrity: sha512-p5qOxSum7W3k+llc7owEStXlGmSl8FcGvhYt8Vjy7FqEnmkCVlM3P57XQEGj58oqaBWDQXbJDZxwUWMS/EAPNQ==, } engines: { node: ^16.0.0 || >=18.0.0 } dev: false - /@typescript-eslint/typescript-estree@6.7.2(typescript@5.2.2): + /@typescript-eslint/typescript-estree@6.8.0(typescript@5.2.2): resolution: { - integrity: sha512-kiJKVMLkoSciGyFU0TOY0fRxnp9qq1AzVOHNeN1+B9erKFCJ4Z8WdjAkKQPP+b1pWStGFqezMLltxO+308dJTQ==, + integrity: sha512-ISgV0lQ8XgW+mvv5My/+iTUdRmGspducmQcDw5JxznasXNnZn3SKNrTRuMsEXv+V/O+Lw9AGcQCfVaOPCAk/Zg==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -1320,8 +1407,8 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/types": 6.7.2 - "@typescript-eslint/visitor-keys": 6.7.2 + "@typescript-eslint/types": 6.8.0 + "@typescript-eslint/visitor-keys": 6.8.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -1332,36 +1419,36 @@ packages: - supports-color dev: false - /@typescript-eslint/utils@6.7.2(eslint@8.50.0)(typescript@5.2.2): + /@typescript-eslint/utils@6.8.0(eslint@8.51.0)(typescript@5.2.2): resolution: { - integrity: sha512-ZCcBJug/TS6fXRTsoTkgnsvyWSiXwMNiPzBUani7hDidBdj1779qwM1FIAmpH4lvlOZNF3EScsxxuGifjpLSWQ==, + integrity: sha512-dKs1itdE2qFG4jr0dlYLQVppqTE+Itt7GmIf/vX6CSvsW+3ov8PbWauVKyyfNngokhIO9sKZeRGCUo1+N7U98Q==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.50.0) + "@eslint-community/eslint-utils": 4.4.0(eslint@8.51.0) "@types/json-schema": 7.0.13 - "@types/semver": 7.5.2 - "@typescript-eslint/scope-manager": 6.7.2 - "@typescript-eslint/types": 6.7.2 - "@typescript-eslint/typescript-estree": 6.7.2(typescript@5.2.2) - eslint: 8.50.0 + "@types/semver": 7.5.3 + "@typescript-eslint/scope-manager": 6.8.0 + "@typescript-eslint/types": 6.8.0 + "@typescript-eslint/typescript-estree": 6.8.0(typescript@5.2.2) + eslint: 8.51.0 semver: 7.5.4 transitivePeerDependencies: - supports-color - typescript dev: false - /@typescript-eslint/visitor-keys@6.7.2: + /@typescript-eslint/visitor-keys@6.8.0: resolution: { - integrity: sha512-uVw9VIMFBUTz8rIeaUT3fFe8xIUx8r4ywAdlQv1ifH+6acn/XF8Y6rwJ7XNmkNMDrTW+7+vxFFPIF40nJCVsMQ==, + integrity: sha512-oqAnbA7c+pgOhW2OhGvxm0t1BULX5peQI/rLsNDpGM78EebV3C9IGbX5HNZabuZ6UQrYveCLjKo8Iy/lLlBkkg==, } engines: { node: ^16.0.0 || >=18.0.0 } dependencies: - "@typescript-eslint/types": 6.7.2 + "@typescript-eslint/types": 6.8.0 eslint-visitor-keys: 3.4.3 dev: false @@ -1478,10 +1565,10 @@ packages: } dev: false - /better-sqlite3@8.6.0: + /better-sqlite3@9.0.0: resolution: { - integrity: sha512-jwAudeiTMTSyby+/SfbHDebShbmC2MCH8mU2+DXi0WJfv13ypEJm47cd3kljmy/H130CazEvkf2Li//ewcMJ1g==, + integrity: sha512-lDxQ9qg/XuUHZG6xzrQaMHkNWl37t35/LPB/VJGV8DdScSuGFNfFSqgscXEd8UIuyk/d9wU8iaMxQa4If5Wqog==, } requiresBuild: true dependencies: @@ -1567,16 +1654,6 @@ packages: ieee754: 1.2.1 dev: false - /busboy@1.6.0: - resolution: - { - integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==, - } - engines: { node: ">=10.16.0" } - dependencies: - streamsearch: 1.1.0 - dev: true - /callsites@3.1.0: resolution: { @@ -1936,12 +2013,12 @@ packages: hanji: 0.0.5 json-diff: 0.9.0 minimatch: 7.4.6 - zod: 3.22.2 + zod: 3.22.4 transitivePeerDependencies: - supports-color dev: true - /drizzle-orm@0.28.6(@cloudflare/workers-types@4.20230914.0)(@libsql/client@0.3.4)(mysql2@3.6.1): + /drizzle-orm@0.28.6(@cloudflare/workers-types@4.20231016.0)(@libsql/client@0.3.5)(better-sqlite3@9.0.0)(mysql2@3.6.2): resolution: { integrity: sha512-yBe+F9htrlYER7uXgDJUQsTHFoIrI5yMm5A0bg0GiZ/kY5jNXTWoEy4KQtg35cE27sw1VbgzoMWHAgCckUUUww==, @@ -2006,9 +2083,10 @@ packages: sqlite3: optional: true dependencies: - "@cloudflare/workers-types": 4.20230914.0 - "@libsql/client": 0.3.4 - mysql2: 3.6.1 + "@cloudflare/workers-types": 4.20231016.0 + "@libsql/client": 0.3.5 + better-sqlite3: 9.0.0 + mysql2: 3.6.2 dev: false /end-of-stream@1.4.4: @@ -2153,7 +2231,7 @@ packages: } engines: { node: ">=10" } - /eslint-config-google@0.14.0(eslint@8.50.0): + /eslint-config-google@0.14.0(eslint@8.51.0): resolution: { integrity: sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==, @@ -2162,7 +2240,7 @@ packages: peerDependencies: eslint: ">=5.16.0" dependencies: - eslint: 8.50.0 + eslint: 8.51.0 dev: true /eslint-plugin-json@3.1.0: @@ -2193,18 +2271,18 @@ packages: } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - /eslint@8.50.0: + /eslint@8.51.0: resolution: { - integrity: sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==, + integrity: sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } hasBin: true dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.50.0) - "@eslint-community/regexpp": 4.8.1 + "@eslint-community/eslint-utils": 4.4.0(eslint@8.51.0) + "@eslint-community/regexpp": 4.9.1 "@eslint/eslintrc": 2.1.2 - "@eslint/js": 8.50.0 + "@eslint/js": 8.51.0 "@humanwhocodes/config-array": 0.11.11 "@humanwhocodes/module-importer": 1.0.1 "@nodelib/fs.walk": 1.2.8 @@ -2223,7 +2301,7 @@ packages: file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.22.0 + globals: 13.23.0 graphemer: 1.4.0 ignore: 5.2.4 imurmurhash: 0.1.4 @@ -2402,7 +2480,7 @@ packages: } engines: { node: ^10.12.0 || >=12.0.0 } dependencies: - flat-cache: 3.1.0 + flat-cache: 3.1.1 /file-uri-to-path@1.0.0: resolution: @@ -2430,15 +2508,15 @@ packages: locate-path: 6.0.0 path-exists: 4.0.0 - /flat-cache@3.1.0: + /flat-cache@3.1.1: resolution: { - integrity: sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==, + integrity: sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==, } engines: { node: ">=12.0.0" } dependencies: flatted: 3.2.9 - keyv: 4.5.3 + keyv: 4.5.4 rimraf: 3.0.2 /flatted@3.2.9: @@ -2594,10 +2672,10 @@ packages: once: 1.4.0 dev: true - /globals@13.22.0: + /globals@13.23.0: resolution: { - integrity: sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==, + integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==, } engines: { node: ">=8" } dependencies: @@ -2624,18 +2702,18 @@ packages: integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, } - /h3@1.8.1: + /h3@1.8.2: resolution: { - integrity: sha512-m5rFuu+5bpwBBHqqS0zexjK+Q8dhtFRvO9JXQG0RvSPL6QrIT6vv42vuBM22SLOgGMoZYsHk0y7VPidt9s+nkw==, + integrity: sha512-1Ca0orJJlCaiFY68BvzQtP2lKLk46kcLAxVM8JgYbtm2cUg6IY7pjpYgWMwUvDO9QI30N5JAukOKoT8KD3Q0PQ==, } dependencies: cookie-es: 1.0.0 defu: 6.1.2 destr: 2.0.1 - iron-webcrypto: 0.8.2 + iron-webcrypto: 0.10.1 radix3: 1.1.0 - ufo: 1.3.0 + ufo: 1.3.1 uncrypto: 0.1.3 unenv: 1.7.4 dev: false @@ -2664,10 +2742,10 @@ packages: } dev: true - /hono@3.7.2: + /hono@3.8.0: resolution: { - integrity: sha512-5SWYrAQJlfjHggcDTnmKZd5zlUEXmoUiBjnmL6C1W8MX39/bUw6ZIvfEJZgpo7d7Z/vCJ5FRfkjIQPRH5yV/dQ==, + integrity: sha512-lTkcFzm9abmsYiaX82r707kG7Qo9y/nSuO75VWaI6xRK46yxylMUG10Njy6SS5CcLRAg+0mw8NvPaMPbgV17Gg==, } engines: { node: ">=16.0.0" } dev: false @@ -2780,10 +2858,10 @@ packages: - supports-color dev: false - /iron-webcrypto@0.8.2: + /iron-webcrypto@0.10.1: resolution: { - integrity: sha512-jGiwmpgTuF19Vt4hn3+AzaVFGpVZt7A1ysd5ivFel2r4aNVFwqaYa6aU6qsF1PM7b+WFivZHz3nipwUOXaOnHg==, + integrity: sha512-QGOS8MRMnj/UiOa+aMIgfyHcvkhqNUsUxb1XzskENvbo+rEfp6TOwqd1KPuDzXC4OnGHcMSVxDGRoilqB8ViqA==, } dev: false @@ -2933,10 +3011,10 @@ packages: integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==, } - /keyv@4.5.3: + /keyv@4.5.4: resolution: { - integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==, + integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, } dependencies: json-buffer: 3.0.1 @@ -2951,6 +3029,25 @@ packages: prelude-ls: 1.2.1 type-check: 0.4.0 + /libsql@0.1.29: + resolution: + { + integrity: sha512-m81nXwDjz7WIwAblmhGJ68f6wJPtClG2N9kNxYG92vB7sALUGU3THza2J2+Mfg0YC+cy+hehorb7zHETj8doKw==, + } + cpu: [x64, arm64] + os: [darwin, linux, win32] + dependencies: + "@neon-rs/load": 0.0.4 + detect-libc: 2.0.2 + optionalDependencies: + "@libsql/darwin-arm64": 0.1.29 + "@libsql/darwin-x64": 0.1.29 + "@libsql/linux-arm64-gnu": 0.1.29 + "@libsql/linux-x64-gnu": 0.1.29 + "@libsql/linux-x64-musl": 0.1.29 + "@libsql/win32-x64-msvc": 0.1.29 + dev: false + /listhen@1.5.5: resolution: { @@ -2965,14 +3062,14 @@ packages: consola: 3.2.3 defu: 6.1.2 get-port-please: 3.1.1 - h3: 1.8.1 + h3: 1.8.2 http-shutdown: 1.2.2 jiti: 1.20.0 mlly: 1.4.2 node-forge: 1.3.1 pathe: 1.1.1 std-env: 3.4.3 - ufo: 1.3.0 + ufo: 1.3.1 untun: 0.1.2 uqr: 0.1.2 dev: false @@ -3070,10 +3167,10 @@ packages: es5-ext: 0.10.62 dev: true - /lucia@2.7.0: + /lucia@2.7.1: resolution: { - integrity: sha512-VwWyG3U3mKUXx7qa5SXAQctBukkLpIW5L/vEVqP2R3mDBQTZIBIAZP/neZl5U6mot7Y9bRQ/2pVKO8djEH1O8A==, + integrity: sha512-EHDTajS1YWA7Q37jd29Far1l4nfZgsWLp4hDQeaQhVpJd2WKQqA3626kJYmOj1CTweVMkE54xFi5JIph+agZkQ==, } dev: false @@ -3170,10 +3267,10 @@ packages: engines: { node: ">=10" } dev: false - /miniflare@3.20230918.0: + /miniflare@3.20231010.0: resolution: { - integrity: sha512-Dd29HB7ZlT1CXB2tPH8nW6fBOOXi/m7qFZHjKm2jGS+1OaGfrv0PkT5UspWW5jQi8rWI87xtordAUiIJkwWqRw==, + integrity: sha512-VETY+/OhJ1RN+yrFpPUqBZysb2R8wXvyx3vzaRZS2qO1aGNKeGASa/vxCvNcBF+gt8UdbWMOalSXX8zY0IgWZA==, } engines: { node: ">=16.13" } dependencies: @@ -3184,11 +3281,11 @@ packages: glob-to-regexp: 0.4.1 source-map-support: 0.5.21 stoppable: 1.1.0 - undici: 5.25.2 - workerd: 1.20230904.0 + undici: 5.26.3 + workerd: 1.20231010.0 ws: 8.14.2 youch: 3.3.2 - zod: 3.22.2 + zod: 3.22.4 transitivePeerDependencies: - bufferutil - supports-color @@ -3246,7 +3343,7 @@ packages: acorn: 8.10.0 pathe: 1.1.1 pkg-types: 1.0.3 - ufo: 1.3.0 + ufo: 1.3.1 dev: false /mri@1.2.0: @@ -3271,10 +3368,10 @@ packages: hasBin: true dev: true - /mysql2@3.6.1: + /mysql2@3.6.2: resolution: { - integrity: sha512-O7FXjLtNkjcMBpLURwkXIhyVbX9i4lq4nNRCykPNOXfceq94kJ0miagmTEGCZieuO8JtwtXaZ41U6KT4eF9y3g==, + integrity: sha512-m5erE6bMoWfPXW1D5UrVwlT8PowAoSX69KcZzPuARQ3wY1RJ52NW9PdvdPo076XiSIkQ5IBTis7hxdlrQTlyug==, } engines: { node: ">= 8.0" } dependencies: @@ -3334,10 +3431,10 @@ packages: } dev: true - /node-abi@3.47.0: + /node-abi@3.51.0: resolution: { - integrity: sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==, + integrity: sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA==, } engines: { node: ">=10" } dependencies: @@ -3425,7 +3522,7 @@ packages: dependencies: destr: 2.0.1 node-fetch-native: 1.4.0 - ufo: 1.3.0 + ufo: 1.3.1 dev: false /once@1.4.0: @@ -3452,7 +3549,7 @@ packages: integrity: sha512-B7gOkwsYMZO7BZXwJzXCuVagym2xhqsrilVvV0dnq2Di4+iLUXKVX9gOK23ZqaAHZOwABXN0QTdW8QnkUTX6DA==, } dependencies: - yaml: 2.3.2 + yaml: 2.3.3 dev: false /optionator@0.9.3: @@ -3571,7 +3668,7 @@ packages: minimist: 1.2.8 mkdirp-classic: 0.5.3 napi-build-utils: 1.0.2 - node-abi: 3.47.0 + node-abi: 3.51.0 pump: 3.0.0 rc: 1.2.8 simple-get: 4.0.1 @@ -3916,14 +4013,6 @@ packages: engines: { node: ">=4", npm: ">=6" } dev: true - /streamsearch@1.1.0: - resolution: - { - integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==, - } - engines: { node: ">=10.0.0" } - dev: true - /string_decoder@1.3.0: resolution: { @@ -4112,10 +4201,10 @@ packages: engines: { node: ">=14.17" } hasBin: true - /ufo@1.3.0: + /ufo@1.3.1: resolution: { - integrity: sha512-bRn3CsoojyNStCZe0BG0Mt4Nr/4KF+rhFlnNXybgqt5pXHNFRlqinSoQaTrGyzE4X8aHplSb+TorH+COin9Yxw==, + integrity: sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==, } dev: false @@ -4126,14 +4215,20 @@ packages: } dev: false - /undici@5.25.2: + /undici-types@5.25.3: + resolution: + { + integrity: sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==, + } + + /undici@5.26.3: resolution: { - integrity: sha512-tch8RbCfn1UUH1PeVCXva4V8gDpGAud/w0WubD6sHC46vYQ3KDxL+xv1A2UxK0N6jrVedutuPHxe1XIoqerwMw==, + integrity: sha512-H7n2zmKEWgOllKkIUkLvFmsJQj062lSm3uA4EYApG8gLuiOM0/go9bIoC3HVaSnfg4xunowDE2i9p8drkXuvDw==, } engines: { node: ">=14.0" } dependencies: - busboy: 1.6.0 + "@fastify/busboy": 2.0.0 dev: true /unenv@1.7.4: @@ -4193,14 +4288,14 @@ packages: anymatch: 3.1.3 chokidar: 3.5.3 destr: 2.0.1 - h3: 1.8.1 + h3: 1.8.2 ioredis: 5.3.2 listhen: 1.5.5 lru-cache: 10.0.1 mri: 1.2.0 node-fetch-native: 1.4.0 ofetch: 1.3.3 - ufo: 1.3.0 + ufo: 1.3.1 transitivePeerDependencies: - supports-color dev: false @@ -4246,23 +4341,23 @@ packages: } dependencies: jsonc-parser: 3.2.0 - vscode-languageserver-textdocument: 1.0.8 - vscode-languageserver-types: 3.17.4 + vscode-languageserver-textdocument: 1.0.11 + vscode-languageserver-types: 3.17.5 vscode-nls: 5.2.0 - vscode-uri: 3.0.7 + vscode-uri: 3.0.8 dev: true - /vscode-languageserver-textdocument@1.0.8: + /vscode-languageserver-textdocument@1.0.11: resolution: { - integrity: sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==, + integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==, } dev: true - /vscode-languageserver-types@3.17.4: + /vscode-languageserver-types@3.17.5: resolution: { - integrity: sha512-9YXi5pA3XF2V+NUQg6g+lulNS0ncRCKASYdK3Cs7kiH9sVFXWq27prjkC/B8M/xJLRPPRSPCHVMuBTgRNFh2sQ==, + integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==, } dev: true @@ -4273,10 +4368,10 @@ packages: } dev: true - /vscode-uri@3.0.7: + /vscode-uri@3.0.8: resolution: { - integrity: sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==, + integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==, } dev: true @@ -4322,26 +4417,26 @@ packages: } dev: true - /workerd@1.20230904.0: + /workerd@1.20231010.0: resolution: { - integrity: sha512-t9znszH0rQGK4mJGvF9L3nN0qKEaObAGx0JkywFtAwH8OkSn+YfQbHNZE+YsJ4qa1hOz1DCNEk08UDFRBaYq4g==, + integrity: sha512-ghxfBU8fBSBDa8fCBPfzWivYsWpewYftgy70N308C+acQ5AaKNM1QTdkQNm9YWeC5Jpl1YvBX04ojt7lCc3juw==, } engines: { node: ">=16" } hasBin: true requiresBuild: true optionalDependencies: - "@cloudflare/workerd-darwin-64": 1.20230904.0 - "@cloudflare/workerd-darwin-arm64": 1.20230904.0 - "@cloudflare/workerd-linux-64": 1.20230904.0 - "@cloudflare/workerd-linux-arm64": 1.20230904.0 - "@cloudflare/workerd-windows-64": 1.20230904.0 + "@cloudflare/workerd-darwin-64": 1.20231010.0 + "@cloudflare/workerd-darwin-arm64": 1.20231010.0 + "@cloudflare/workerd-linux-64": 1.20231010.0 + "@cloudflare/workerd-linux-arm64": 1.20231010.0 + "@cloudflare/workerd-windows-64": 1.20231010.0 dev: true - /wrangler@3.9.0: + /wrangler@3.13.1: resolution: { - integrity: sha512-Ho1A76KxbqfcRgCsuN6xGar3BVPyn4oVWM9zx0HvEVhT9wQ7n/LvB6GlPdXKABqEBYhVe/oTH72S5TgWl0DgaA==, + integrity: sha512-CY73h4lfPx/3CmkC/tPj66DRRZ9Y42sMcHys6B6tjCILUo950IeOvnsj759el3/ewFLY4kG4jCrrrikan6TE+Q==, } engines: { node: ">=16.13.0" } hasBin: true @@ -4352,7 +4447,7 @@ packages: blake3-wasm: 2.1.5 chokidar: 3.5.3 esbuild: 0.17.19 - miniflare: 3.20230918.0 + miniflare: 3.20231010.0 nanoid: 3.3.6 path-to-regexp: 6.2.1 selfsigned: 2.1.1 @@ -4402,10 +4497,10 @@ packages: } dev: false - /yaml@2.3.2: + /yaml@2.3.3: resolution: { - integrity: sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==, + integrity: sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==, } engines: { node: ">= 14" } dev: false @@ -4428,8 +4523,8 @@ packages: stacktracey: 2.1.8 dev: true - /zod@3.22.2: + /zod@3.22.4: resolution: { - integrity: sha512-wvWkphh5WQsJbVk1tbx1l1Ly4yg+XecD+Mq280uBGt9wa5BKSWf4Mhp6GmrkPixhMxmabYY7RbzlwVP32pbGCg==, + integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==, } diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index 4ee2ccb..dcba319 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -4,7 +4,8 @@ import { sqliteTable, text, integer, - uniqueIndex, + // uniqueIndex, + index, } from "drizzle-orm/sqlite-core" // TODO: move tables into seperate appropiate files @@ -25,13 +26,15 @@ export const users = sqliteTable( dateJoined: text("date_joined").notNull(), roleFlags: integer("role_flags").default(1).notNull(), isContributor: integer("is_contributor").default(0).notNull(), - selfAssignableRoleFlags: integer("self_assignable_role_flags"), + selfAssignableRoleFlags: integer("self_assignable_role_flags") + .default(0) + .notNull(), }, (user) => { return { - userIdx: uniqueIndex("user_id_idx").on(user.id), - usernameIdx: uniqueIndex("user_username_idx").on(user.username), - emailIdx: uniqueIndex("user_email_idx").on(user.email), + userIdx: index("user_id_idx").on(user.id), + usernameIdx: index("user_username_idx").on(user.username), + emailIdx: index("user_email_idx").on(user.email), } } ) @@ -51,10 +54,10 @@ export const emailVerificationToken = sqliteTable( }, (emailVerificationToken) => { return { - userIdx: uniqueIndex("email_verification_token_user_id_idx").on( + userIdx: index("email_verification_token_user_id_idx").on( emailVerificationToken.userId ), - tokenIdx: uniqueIndex("email_verification_token_token_idx").on( + tokenIdx: index("email_verification_token_token_idx").on( emailVerificationToken.token ), } @@ -76,10 +79,10 @@ export const passwordResetToken = sqliteTable( }, (passwordResetToken) => { return { - userIdx: uniqueIndex("password_reset_token_user_id_idx").on( + userIdx: index("password_reset_token_user_id_idx").on( passwordResetToken.userId ), - tokenIdx: uniqueIndex("password_reset_token_token_idx").on( + tokenIdx: index("password_reset_token_token_idx").on( passwordResetToken.token ), } @@ -100,7 +103,7 @@ export const keys = sqliteTable( }, (key) => { return { - userIdx: uniqueIndex("key_user_id_idx").on(key.userId), + userIdx: index("key_user_id_idx").on(key.userId), } } ) @@ -119,10 +122,10 @@ export const userNetworking = sqliteTable( }, (userNetworking) => { return { - followerIdx: uniqueIndex("userNetworking_follower_idx").on( + followerIdx: index("userNetworking_follower_idx").on( userNetworking.followerId ), - followingIdx: uniqueIndex("userNetworking_following_idx").on( + followingIdx: index("userNetworking_following_idx").on( userNetworking.followingId ), } @@ -143,10 +146,10 @@ export const socialsConnection = sqliteTable( }, (socialsConnection) => { return { - userIdx: uniqueIndex("socials_connection_user_id_idx").on( + userIdx: index("socials_connection_user_id_idx").on( socialsConnection.userId ), - discordIdIdx: uniqueIndex("socials_connection_discord_id_idx").on( + discordIdIdx: index("socials_connection_discord_id_idx").on( socialsConnection.discordId ), } @@ -167,8 +170,8 @@ export const game = sqliteTable( }, (game) => { return { - gameIdx: uniqueIndex("game_id_idx").on(game.id), - nameIdx: uniqueIndex("game_name_idx").on(game.name), + gameIdx: index("game_id_idx").on(game.id), + nameIdx: index("game_name_idx").on(game.name), } } ) @@ -184,12 +187,10 @@ export const assetCategory = sqliteTable( }, (assetCategory) => { return { - assetCategoryIdx: uniqueIndex("asset_category_id_idx").on( + assetCategoryIdx: index("asset_category_id_idx").on( assetCategory.id ), - nameIdx: uniqueIndex("asset_category_name_idx").on( - assetCategory.name - ), + nameIdx: index("asset_category_name_idx").on(assetCategory.name), } } ) @@ -213,13 +214,13 @@ export const gameAssetCategory = sqliteTable( }, (gameAssetCategory) => { return { - gameAssetCategoryIdx: uniqueIndex("game_asset_category_id_idx").on( + gameAssetCategoryIdx: index("game_asset_category_id_idx").on( gameAssetCategory.id ), - gameAssetCategoryGameIdx: uniqueIndex( + gameAssetCategoryGameIdx: index( "game_asset_category_game_id_idx" ).on(gameAssetCategory.gameId), - gameAssetCategoryAssetCategoryIdx: uniqueIndex( + gameAssetCategoryAssetCategoryIdx: index( "game_asset_category_asset_category_id_idx" ).on(gameAssetCategory.assetCategoryId), } @@ -267,16 +268,16 @@ export const assets = sqliteTable( }, (table) => { return { - idIdx: uniqueIndex("assets_id_idx").on(table.id), - nameIdx: uniqueIndex("assets_name_idx").on(table.name), - gameIdx: uniqueIndex("assets_game_idx").on(table.game), - assetCategoryIdx: uniqueIndex("assets_asset_category_idx").on( + idIdx: index("assets_id_idx").on(table.id), + nameIdx: index("assets_name_idx").on(table.name), + gameIdx: index("assets_game_idx").on(table.game), + assetCategoryIdx: index("assets_asset_category_idx").on( table.assetCategory ), - uploadedByIdIdx: uniqueIndex("assets_uploaded_by_idx").on( + uploadedByIdIdx: index("assets_uploaded_by_idx").on( table.uploadedById ), - uploadedByNameIdx: uniqueIndex("assets_uploaded_by_name_idx").on( + uploadedByNameIdx: index("assets_uploaded_by_name_idx").on( table.uploadedByName ), } @@ -294,8 +295,8 @@ export const assetTag = sqliteTable( }, (assetTag) => { return { - assetTagIdx: uniqueIndex("asset_tag_id_idx").on(assetTag.id), - nameIdx: uniqueIndex("asset_tag_name_idx").on(assetTag.name), + assetTagIdx: index("asset_tag_id_idx").on(assetTag.id), + nameIdx: index("asset_tag_name_idx").on(assetTag.name), } } ) @@ -319,15 +320,15 @@ export const assetTagAsset = sqliteTable( }, (assetTagAsset) => { return { - assetTagAssetIdx: uniqueIndex("asset_tags_assets_id_idx").on( + assetTagAssetIdx: index("asset_tags_assets_id_idx").on( assetTagAsset.id ), - assetTagAssetAssetTagIdx: uniqueIndex( + assetTagAssetAssetTagIdx: index( "asset_tags_assets_asset_tag_id_idx" ).on(assetTagAsset.assetTagId), - assetTagAssetAssetIdx: uniqueIndex( - "asset_tags_assets_asset_id_idx" - ).on(assetTagAsset.assetId), + assetTagAssetAssetIdx: index("asset_tags_assets_asset_id_idx").on( + assetTagAsset.assetId + ), } } ) @@ -346,12 +347,12 @@ export const userFavorite = sqliteTable( }, (userFavorite) => { return { - favoritedAssetsIdx: uniqueIndex("favorited_assets_id_idx").on( + favoritedAssetsIdx: index("favorited_assets_id_idx").on( userFavorite.id ), - favoritedAssetsUserIdx: uniqueIndex( - "favorited_assets_user_id_idx" - ).on(userFavorite.userId), + favoritedAssetsUserIdx: index("favorited_assets_user_id_idx").on( + userFavorite.userId + ), } } ) @@ -375,13 +376,13 @@ export const userFavoriteAsset = sqliteTable( }, (userFavoriteAsset) => { return { - favoritedAssetsAssetsIdx: uniqueIndex( + favoritedAssetsAssetsIdx: index( "favorited_assets_assets_id_idx" ).on(userFavoriteAsset.id), - favoritedAssetsAssetsUserIdx: uniqueIndex( + favoritedAssetsAssetsUserIdx: index( "favorited_assets_assets_user_id_idx" ).on(userFavoriteAsset.userFavoriteId), - favoritedAssetsAssetsAssetIdx: uniqueIndex( + favoritedAssetsAssetsAssetIdx: index( "favorited_assets_assets_asset_id_idx" ).on(userFavoriteAsset.assetId), } @@ -405,8 +406,8 @@ export const userCollection = sqliteTable( }, (collection) => { return { - collectionIdx: uniqueIndex("collection_id_idx").on(collection.id), - userCollectionIdx: uniqueIndex("user_collection_id_idx").on( + collectionIdx: index("collection_id_idx").on(collection.id), + userCollectionIdx: index("user_collection_id_idx").on( collection.userId ), } @@ -432,13 +433,13 @@ export const userCollectionAsset = sqliteTable( }, (collectionAssets) => { return { - collectionAssetsIdx: uniqueIndex("collection_assets_id_idx").on( + collectionAssetsIdx: index("collection_assets_id_idx").on( collectionAssets.id ), - collectionAssetsCollectionIdx: uniqueIndex( + collectionAssetsCollectionIdx: index( "collection_assets_collection_id_idx" ).on(collectionAssets.collectionId), - collectionAssetsAssetIdx: uniqueIndex( + collectionAssetsAssetIdx: index( "collection_assets_asset_id_idx" ).on(collectionAssets.assetId), } @@ -465,10 +466,10 @@ export const savedOcGenerators = sqliteTable( }, (savedOcGenerators) => { return { - savedOcGeneratorsIdx: uniqueIndex("saved_oc_generators_id_idx").on( + savedOcGeneratorsIdx: index("saved_oc_generators_id_idx").on( savedOcGenerators.id ), - savedOcGeneratorsUserIdx: uniqueIndex( + savedOcGeneratorsUserIdx: index( "saved_oc_generators_user_id_idx" ).on(savedOcGenerators.userId), } diff --git a/src/v2/routes/discord/contributors.ts b/src/v2/routes/discord/contributors.ts index e4fb180..2c0d0db 100644 --- a/src/v2/routes/discord/contributors.ts +++ b/src/v2/routes/discord/contributors.ts @@ -21,6 +21,7 @@ export async function contributors(c: APIContext): Promise { } ) + // @ts-expect-error: ok const guildMembers: GuildMember[] = await response.json() const filteredMembers: GuildMember[] = guildMembers.filter((member) => { From c5f5cd1250d68cd06b4a72e56dfc33941393bd93 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Thu, 19 Oct 2023 11:38:13 +0100 Subject: [PATCH 119/318] consistent timestamp data types --- package.json | 3 ++- src/v2/db/schema.ts | 4 ++-- .../routes/auth/assets/collections/createAssetCollection.ts | 2 +- src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index d8c2ee3..48f14a1 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,8 @@ "typecheck": "tsc --noEmit", "drizzle:generate": "drizzle-kit generate:sqlite", "drizzle:migrate": "ts-node ./src/scripts/migrate/migrate", - "drizzle:push": "drizzle-kit push:sqlite" + "drizzle:push": "drizzle-kit push:sqlite", + "drizzle:studio": "drizzle-kit studio" }, "devDependencies": { "@cloudflare/workers-types": "^4.20231016.0", diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index dcba319..804964a 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -401,7 +401,7 @@ export const userCollection = sqliteTable( onUpdate: "cascade", onDelete: "cascade", }), - dateCreated: integer("date_created").notNull(), + dateCreated: text("date_created").notNull(), isPublic: integer("is_public").default(0).notNull(), }, (collection) => { @@ -458,7 +458,7 @@ export const savedOcGenerators = sqliteTable( }), name: text("name").notNull(), game: text("game").notNull(), - dateCreated: integer("date_created").notNull(), + dateCreated: text("date_created").notNull(), isPublic: integer("is_public").default(0).notNull(), content: text("content").notNull(), savedColorPalette: text("saved_color_palette"), // array of 5 hex values, completely optional for the user to save diff --git a/src/v2/routes/auth/assets/collections/createAssetCollection.ts b/src/v2/routes/auth/assets/collections/createAssetCollection.ts index f84109a..18d3bd1 100644 --- a/src/v2/routes/auth/assets/collections/createAssetCollection.ts +++ b/src/v2/routes/auth/assets/collections/createAssetCollection.ts @@ -66,7 +66,7 @@ export async function createAssetCollection(c: APIContext): Promise { name: collection.name, description: collection.description, userId: session.user.userId, - dateCreated: new Date().getTime(), + dateCreated: new Date().toISOString(), isPublic: 0, // default to private }) .execute() diff --git a/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts b/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts index a19d551..b8b2f4d 100644 --- a/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts +++ b/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts @@ -88,7 +88,7 @@ export async function saveOCGeneratorResponse( userId: session.user.userId, name: formData.data.name, game: formData.data.game, - dateCreated: new Date().getTime(), + dateCreated: new Date().toISOString(), isPublic: parseInt(formData.data.isPublic), // 1 = yes, 0 = no, default = 0 content: formData.data.content, // this is stored as json, which can then be parsed } From a29b4269e0f471e8fd342d84d82e00bb79bea1fa Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Thu, 19 Oct 2023 11:55:17 +0100 Subject: [PATCH 120/318] fix all relation inferring --- src/v2/db/schema.ts | 40 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index 804964a..1ab612d 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -528,11 +528,31 @@ export const assetTagAssetRelations = relations(assetTagAsset, ({ one }) => ({ }), })) +export const passwordResetTokenRelations = relations( + passwordResetToken, + ({ one }) => ({ + user: one(users, { + fields: [passwordResetToken.userId], + references: [users.id], + }), + }) +) + +export const emailVerificationTokenRelations = relations( + emailVerificationToken, + ({ one }) => ({ + user: one(users, { + fields: [emailVerificationToken.userId], + references: [users.id], + }), + }) +) + export const userNetworkingRelations = relations(userNetworking, ({ one }) => ({ follower: one(users, { fields: [userNetworking.followerId], references: [users.id], - relationName: "followers", + relationName: "follower", }), following: one(users, { fields: [userNetworking.followingId], @@ -541,6 +561,16 @@ export const userNetworkingRelations = relations(userNetworking, ({ one }) => ({ }), })) +export const savedOcGeneratorsRelations = relations( + savedOcGenerators, + ({ one }) => ({ + user: one(users, { + fields: [savedOcGenerators.userId], + references: [users.id], + }), + }) +) + export const collectionRelations = relations( userCollection, ({ one, many }) => ({ @@ -605,10 +635,14 @@ export const socialsConnectionRelations = relations( ) export const usersRelations = relations(users, ({ one, many }) => ({ + follower: many(userNetworking, { + relationName: "follower", + }), + following: many(userNetworking, { + relationName: "following", + }), key: many(keys), assets: many(assets), - follower: many(userNetworking, { relationName: "follower" }), - following: many(userNetworking, { relationName: "following" }), userFavorite: one(userFavorite), socialsConnection: one(socialsConnection), userCollection: many(userCollection), From b14aef9ea5ea4b1d6c095c7d2958b80eddd037c7 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Thu, 19 Oct 2023 12:18:00 +0100 Subject: [PATCH 121/318] update readme, improve drizzle studio config --- README.md | 12 ++++++++---- package.json | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 51308a8..1e90af7 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ ![Quality] -Source code for the API powering [**wanderer.moe**](https://wanderer.moe) — using **Cloudflare Workers** and **Hono** with **R2 Storage** for the CDN, **Turso** and **Drizzle** for the Database. +Source code for the API powering [**wanderer.moe**](https://wanderer.moe) — using **Cloudflare Workers** and **Hono** with **R2 Storage** for the CDN, **Turso** and **Drizzle** for the Database and **KV** for session storage. @@ -18,7 +18,7 @@ Configuration is in `wrangler.toml`. You will require either a workers paid plan **or to set your worker to unbound** for authentication and password hashing to work. -You will need to setup environment variables for the Discord Bot Token for `/contributors` route: `DISCORD_TOKEN` and for your Turso DB, using `wrangler secret put`. +Required environment variables are viewable in `./src/worker-configuration.d.ts`. - Run `wrangler dev` to preview locally. - Run `wrangler deploy` to publish to Cloudflare Workers. @@ -29,6 +29,12 @@ You will need to setup environment variables for the Discord Bot Token for `/con - If you're using Github Actions, you will have to setup a secret with a Cloudflare API token. You can generate the API token [here][Cloudflare API Token] — use the `Edit Cloudflare Workers` template. +### Database + +- When migrating, you wil need to install `ts-node` globally on your machine. + +- It's not reccomended to use `drizzle:push` in production. However, there is `drizzle:generate` & `drizzle:migrate` available as scripts. + ## Authors - [@dromzeh][Dromzeh] @@ -38,8 +44,6 @@ You will need to setup environment variables for the Discord Bot Token for `/con [api.wanderer.moe][api.wanderer.moe] is licensed under the [GNU Affero General Public License v3.0][License] - **You must state all significant changes made to the original software, make the source code available to the public with credit to the original author, original source, and use the same license.** [Banner]: https://files.catbox.moe/qa3eus.svg -[API Status]: https://status.wanderer.moe/history/api -[CDN Status]: https://status.wanderer.moe/history/cdn [Quality]: https://img.shields.io/codefactor/grade/github/wanderer-moe/api?label=quality&style=for-the-badge [Cloudflare API Token]: https://dash.cloudflare.com/profile/api-tokens [Dromzeh]: https://github.com/dromzeh diff --git a/package.json b/package.json index 48f14a1..5b2e45c 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "drizzle:generate": "drizzle-kit generate:sqlite", "drizzle:migrate": "ts-node ./src/scripts/migrate/migrate", "drizzle:push": "drizzle-kit push:sqlite", - "drizzle:studio": "drizzle-kit studio" + "drizzle:studio": "drizzle-kit studio --port 7331 --host 127.0.0.1 --verbose" }, "devDependencies": { "@cloudflare/workers-types": "^4.20231016.0", From ba67a496394c6b3b26aaa6b228425edf13de8251 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Thu, 19 Oct 2023 13:03:14 +0100 Subject: [PATCH 122/318] refactor schema; include [new] `$inferInsert` type --- src/v2/db/schema.ts | 682 +----------------- src/v2/db/schema/asset/asset.ts | 99 +++ src/v2/db/schema/asset/assetCategories.ts | 93 +++ src/v2/db/schema/asset/assetTags.ts | 82 +++ src/v2/db/schema/game/game.ts | 44 ++ .../db/schema/oc-generators/ocGenerators.ts | 59 ++ src/v2/db/schema/user/user.ts | 102 +++ src/v2/db/schema/user/userAttributes.ts | 90 +++ src/v2/db/schema/user/userCollections.ts | 105 +++ src/v2/db/schema/user/userConnections.ts | 46 ++ src/v2/db/schema/user/userFavorites.ts | 100 +++ src/v2/db/schema/user/userNetworking.ts | 54 ++ 12 files changed, 885 insertions(+), 671 deletions(-) create mode 100644 src/v2/db/schema/asset/asset.ts create mode 100644 src/v2/db/schema/asset/assetCategories.ts create mode 100644 src/v2/db/schema/asset/assetTags.ts create mode 100644 src/v2/db/schema/game/game.ts create mode 100644 src/v2/db/schema/oc-generators/ocGenerators.ts create mode 100644 src/v2/db/schema/user/user.ts create mode 100644 src/v2/db/schema/user/userAttributes.ts create mode 100644 src/v2/db/schema/user/userCollections.ts create mode 100644 src/v2/db/schema/user/userConnections.ts create mode 100644 src/v2/db/schema/user/userFavorites.ts create mode 100644 src/v2/db/schema/user/userNetworking.ts diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index 1ab612d..4904220 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -1,674 +1,14 @@ -import { tableNames } from "@/v2/db/drizzle" -import { relations } from "drizzle-orm" -import { - sqliteTable, - text, - integer, - // uniqueIndex, - index, -} from "drizzle-orm/sqlite-core" +export * from "./schema/asset/asset" +export * from "./schema/asset/assetCategories" +export * from "./schema/asset/assetTags" -// TODO: move tables into seperate appropiate files -export const users = sqliteTable( - tableNames.authUser, - { - id: text("id").primaryKey(), - avatarUrl: text("avatar_url"), - bannerUrl: text("banner_url"), - displayName: text("display_name"), - username: text("username").notNull(), - usernameColour: text("username_colour"), - email: text("email").notNull(), - emailVerified: integer("email_verified").default(0).notNull(), - pronouns: text("pronouns"), - verified: integer("verified").default(0).notNull(), - bio: text("bio").default("No bio set").notNull(), - dateJoined: text("date_joined").notNull(), - roleFlags: integer("role_flags").default(1).notNull(), - isContributor: integer("is_contributor").default(0).notNull(), - selfAssignableRoleFlags: integer("self_assignable_role_flags") - .default(0) - .notNull(), - }, - (user) => { - return { - userIdx: index("user_id_idx").on(user.id), - usernameIdx: index("user_username_idx").on(user.username), - emailIdx: index("user_email_idx").on(user.email), - } - } -) +export * from "./schema/game/game" -export const emailVerificationToken = sqliteTable( - tableNames.emailVerificationToken, - { - id: text("id").primaryKey(), - userId: text("user_id") - .notNull() - .references(() => users.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - token: text("token").notNull(), - expiresAt: integer("expires_at").notNull(), - }, - (emailVerificationToken) => { - return { - userIdx: index("email_verification_token_user_id_idx").on( - emailVerificationToken.userId - ), - tokenIdx: index("email_verification_token_token_idx").on( - emailVerificationToken.token - ), - } - } -) +export * from "./schema/oc-generators/ocGenerators" -export const passwordResetToken = sqliteTable( - tableNames.passwordResetToken, - { - id: text("id").primaryKey(), - userId: text("user_id") - .notNull() - .references(() => users.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - token: text("token").notNull(), - expiresAt: integer("expires_at").notNull(), - }, - (passwordResetToken) => { - return { - userIdx: index("password_reset_token_user_id_idx").on( - passwordResetToken.userId - ), - tokenIdx: index("password_reset_token_token_idx").on( - passwordResetToken.token - ), - } - } -) - -export const keys = sqliteTable( - tableNames.authKey, - { - id: text("id").primaryKey(), - userId: text("user_id") - .notNull() - .references(() => users.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - hashedPassword: text("hashed_password"), - }, - (key) => { - return { - userIdx: index("key_user_id_idx").on(key.userId), - } - } -) - -export const userNetworking = sqliteTable( - tableNames.userNetworking, - { - followerId: text("followerId") - .notNull() - .references(() => users.id), - followingId: text("followingId") - .notNull() - .references(() => users.id), - createdAt: text("createdAt").notNull(), - updatedAt: text("updatedAt").notNull(), - }, - (userNetworking) => { - return { - followerIdx: index("userNetworking_follower_idx").on( - userNetworking.followerId - ), - followingIdx: index("userNetworking_following_idx").on( - userNetworking.followingId - ), - } - } -) - -export const socialsConnection = sqliteTable( - tableNames.socialsConnection, - { - id: text("id").primaryKey(), - userId: text("user_id") - .notNull() - .references(() => users.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - discordId: text("discord_id"), - }, - (socialsConnection) => { - return { - userIdx: index("socials_connection_user_id_idx").on( - socialsConnection.userId - ), - discordIdIdx: index("socials_connection_discord_id_idx").on( - socialsConnection.discordId - ), - } - } -) - -export const game = sqliteTable( - tableNames.game, - { - id: text("id").primaryKey(), - name: text("name").notNull(), // e.g genshin-impact, honkai-impact-3rd - formattedName: text("formatted_name").notNull(), // e.g Genshin Impact, Honkai Impact 3rd - assetCount: integer("asset_count").default(0), - possibleSuggestiveContent: integer("possible_suggestive_content") - .default(0) - .notNull(), - lastUpdated: integer("last_updated").notNull(), - }, - (game) => { - return { - gameIdx: index("game_id_idx").on(game.id), - nameIdx: index("game_name_idx").on(game.name), - } - } -) - -export const assetCategory = sqliteTable( - tableNames.assetCategory, - { - id: text("id").primaryKey(), - name: text("name").notNull(), // e.g tcg-sheets, splash-art - formattedName: text("formatted_name").notNull(), // e.g TCG Sheets, Splash Art - assetCount: integer("asset_count").default(0).notNull(), - lastUpdated: integer("last_updated").notNull(), - }, - (assetCategory) => { - return { - assetCategoryIdx: index("asset_category_id_idx").on( - assetCategory.id - ), - nameIdx: index("asset_category_name_idx").on(assetCategory.name), - } - } -) - -export const gameAssetCategory = sqliteTable( - tableNames.gameAssetCategory, - { - id: text("id").primaryKey(), - gameId: text("game_id") - .notNull() - .references(() => game.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - assetCategoryId: text("asset_category_id") - .notNull() - .references(() => assetCategory.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - }, - (gameAssetCategory) => { - return { - gameAssetCategoryIdx: index("game_asset_category_id_idx").on( - gameAssetCategory.id - ), - gameAssetCategoryGameIdx: index( - "game_asset_category_game_id_idx" - ).on(gameAssetCategory.gameId), - gameAssetCategoryAssetCategoryIdx: index( - "game_asset_category_asset_category_id_idx" - ).on(gameAssetCategory.assetCategoryId), - } - } -) - -export const assets = sqliteTable( - tableNames.assets, - { - id: integer("id").primaryKey(), // primary key auto increments on sqlite - name: text("name").notNull(), - extension: text("extension").notNull(), - game: text("game") - .notNull() - .references(() => game.name, { - onUpdate: "cascade", - onDelete: "cascade", - }), - assetCategory: text("asset_category") - .notNull() - .references(() => assetCategory.name, { - onUpdate: "cascade", - onDelete: "cascade", - }), - url: text("url").notNull(), - status: integer("status").notNull(), - uploadedById: text("uploaded_by").references(() => users.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - uploadedByName: text("uploaded_by_name").references( - () => users.username, - { - onUpdate: "cascade", - onDelete: "cascade", - } - ), - uploadedDate: integer("uploaded_date").notNull(), - assetIsOptimized: integer("asset_is_optimized").default(0).notNull(), - viewCount: integer("view_count").default(0).notNull(), - downloadCount: integer("download_count").default(0).notNull(), - fileSize: integer("file_size").default(0).notNull(), - width: integer("width").default(0).notNull(), - height: integer("height").default(0).notNull(), - }, - (table) => { - return { - idIdx: index("assets_id_idx").on(table.id), - nameIdx: index("assets_name_idx").on(table.name), - gameIdx: index("assets_game_idx").on(table.game), - assetCategoryIdx: index("assets_asset_category_idx").on( - table.assetCategory - ), - uploadedByIdIdx: index("assets_uploaded_by_idx").on( - table.uploadedById - ), - uploadedByNameIdx: index("assets_uploaded_by_name_idx").on( - table.uploadedByName - ), - } - } -) - -export const assetTag = sqliteTable( - tableNames.assetTag, - { - id: text("id").primaryKey(), - name: text("name").notNull(), - formattedName: text("formatted_name").notNull(), - assetCount: integer("asset_count").default(0).notNull(), - lastUpdated: integer("last_updated").notNull(), - }, - (assetTag) => { - return { - assetTagIdx: index("asset_tag_id_idx").on(assetTag.id), - nameIdx: index("asset_tag_name_idx").on(assetTag.name), - } - } -) - -export const assetTagAsset = sqliteTable( - tableNames.assetTagAsset, - { - id: text("id").primaryKey(), - assetTagId: text("asset_tag_id") - .notNull() - .references(() => assetTag.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - assetId: integer("asset_id") - .notNull() - .references(() => assets.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - }, - (assetTagAsset) => { - return { - assetTagAssetIdx: index("asset_tags_assets_id_idx").on( - assetTagAsset.id - ), - assetTagAssetAssetTagIdx: index( - "asset_tags_assets_asset_tag_id_idx" - ).on(assetTagAsset.assetTagId), - assetTagAssetAssetIdx: index("asset_tags_assets_asset_id_idx").on( - assetTagAsset.assetId - ), - } - } -) - -export const userFavorite = sqliteTable( - tableNames.userFavorite, - { - id: text("id").primaryKey(), - userId: text("user_id") - .notNull() - .references(() => users.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - isPublic: integer("is_public").default(0).notNull(), - }, - (userFavorite) => { - return { - favoritedAssetsIdx: index("favorited_assets_id_idx").on( - userFavorite.id - ), - favoritedAssetsUserIdx: index("favorited_assets_user_id_idx").on( - userFavorite.userId - ), - } - } -) - -export const userFavoriteAsset = sqliteTable( - tableNames.userFavoriteAsset, - { - id: text("id").primaryKey(), - userFavoriteId: text("favorited_assets_id") - .notNull() - .references(() => userFavorite.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - assetId: integer("asset_id") - .notNull() - .references(() => assets.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - }, - (userFavoriteAsset) => { - return { - favoritedAssetsAssetsIdx: index( - "favorited_assets_assets_id_idx" - ).on(userFavoriteAsset.id), - favoritedAssetsAssetsUserIdx: index( - "favorited_assets_assets_user_id_idx" - ).on(userFavoriteAsset.userFavoriteId), - favoritedAssetsAssetsAssetIdx: index( - "favorited_assets_assets_asset_id_idx" - ).on(userFavoriteAsset.assetId), - } - } -) - -export const userCollection = sqliteTable( - tableNames.userCollection, - { - id: text("id").primaryKey(), - name: text("name").notNull(), - description: text("description").notNull(), - userId: text("user_id") - .notNull() - .references(() => users.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - dateCreated: text("date_created").notNull(), - isPublic: integer("is_public").default(0).notNull(), - }, - (collection) => { - return { - collectionIdx: index("collection_id_idx").on(collection.id), - userCollectionIdx: index("user_collection_id_idx").on( - collection.userId - ), - } - } -) - -export const userCollectionAsset = sqliteTable( - tableNames.userCollectionAsset, - { - id: text("id").primaryKey(), - collectionId: text("collection_id") - .notNull() - .references(() => userCollection.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - assetId: integer("asset_id") - .notNull() - .references(() => assets.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - }, - (collectionAssets) => { - return { - collectionAssetsIdx: index("collection_assets_id_idx").on( - collectionAssets.id - ), - collectionAssetsCollectionIdx: index( - "collection_assets_collection_id_idx" - ).on(collectionAssets.collectionId), - collectionAssetsAssetIdx: index( - "collection_assets_asset_id_idx" - ).on(collectionAssets.assetId), - } - } -) - -export const savedOcGenerators = sqliteTable( - tableNames.savedOcGenerators, - { - id: text("id").primaryKey(), - userId: text("user_id") - .notNull() - .references(() => users.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - name: text("name").notNull(), - game: text("game").notNull(), - dateCreated: text("date_created").notNull(), - isPublic: integer("is_public").default(0).notNull(), - content: text("content").notNull(), - savedColorPalette: text("saved_color_palette"), // array of 5 hex values, completely optional for the user to save - sakuraUrl: text("sakura_url"), - }, - (savedOcGenerators) => { - return { - savedOcGeneratorsIdx: index("saved_oc_generators_id_idx").on( - savedOcGenerators.id - ), - savedOcGeneratorsUserIdx: index( - "saved_oc_generators_user_id_idx" - ).on(savedOcGenerators.userId), - } - } -) - -// relations -export const gameRelations = relations(game, ({ many }) => ({ - assets: many(assets), - gameAssetCategory: many(gameAssetCategory), -})) - -export const assetRelations = relations(assets, ({ one, many }) => ({ - uploadedBy: one(users, { - fields: [assets.uploadedById, assets.uploadedByName], - references: [users.id, users.username], - }), - assetTagAsset: many(assetTagAsset), - assetCategory: one(assetCategory, { - fields: [assets.assetCategory], - references: [assetCategory.name], - }), - game: one(game, { - fields: [assets.game], - references: [game.name], - }), -})) - -export const assetCategoryRelations = relations(assetCategory, ({ many }) => ({ - assets: many(assets), - gameAssetCategory: many(gameAssetCategory), -})) - -export const gameAssetCategoryRelations = relations( - gameAssetCategory, - ({ one }) => ({ - game: one(game, { - fields: [gameAssetCategory.gameId], - references: [game.id], - }), - assetCategory: one(assetCategory, { - fields: [gameAssetCategory.assetCategoryId], - references: [assetCategory.id], - }), - }) -) - -export const assetTagAssetRelations = relations(assetTagAsset, ({ one }) => ({ - assetTag: one(assetTag, { - fields: [assetTagAsset.assetTagId], - references: [assetTag.id], - }), - asset: one(assets, { - fields: [assetTagAsset.assetId], - references: [assets.id], - }), -})) - -export const passwordResetTokenRelations = relations( - passwordResetToken, - ({ one }) => ({ - user: one(users, { - fields: [passwordResetToken.userId], - references: [users.id], - }), - }) -) - -export const emailVerificationTokenRelations = relations( - emailVerificationToken, - ({ one }) => ({ - user: one(users, { - fields: [emailVerificationToken.userId], - references: [users.id], - }), - }) -) - -export const userNetworkingRelations = relations(userNetworking, ({ one }) => ({ - follower: one(users, { - fields: [userNetworking.followerId], - references: [users.id], - relationName: "follower", - }), - following: one(users, { - fields: [userNetworking.followingId], - references: [users.id], - relationName: "following", - }), -})) - -export const savedOcGeneratorsRelations = relations( - savedOcGenerators, - ({ one }) => ({ - user: one(users, { - fields: [savedOcGenerators.userId], - references: [users.id], - }), - }) -) - -export const collectionRelations = relations( - userCollection, - ({ one, many }) => ({ - user: one(users, { - fields: [userCollection.userId], - references: [users.id], - }), - assets: many(userCollectionAsset), - }) -) - -export const collectionAssetsRelations = relations( - userCollectionAsset, - ({ one }) => ({ - collection: one(userCollection, { - fields: [userCollectionAsset.collectionId], - references: [userCollection.id], - }), - asset: one(assets, { - fields: [userCollectionAsset.assetId], - references: [assets.id], - }), - }) -) - -export const userFavoriteRelations = relations(userFavorite, ({ one }) => ({ - user: one(users, { - fields: [userFavorite.userId], - references: [users.id], - }), -})) - -export const userFavoriteAssetRelations = relations( - userFavoriteAsset, - ({ one }) => ({ - favoritedAssets: one(userFavorite, { - fields: [userFavoriteAsset.userFavoriteId], - references: [userFavorite.id], - }), - asset: one(assets, { - fields: [userFavoriteAsset.assetId], - references: [assets.id], - }), - }) -) - -export const keysRelations = relations(keys, ({ one }) => ({ - user: one(users, { - fields: [keys.userId], - references: [users.id], - }), -})) - -export const socialsConnectionRelations = relations( - socialsConnection, - ({ one }) => ({ - user: one(users, { - fields: [socialsConnection.userId], - references: [users.id], - }), - }) -) - -export const usersRelations = relations(users, ({ one, many }) => ({ - follower: many(userNetworking, { - relationName: "follower", - }), - following: many(userNetworking, { - relationName: "following", - }), - key: many(keys), - assets: many(assets), - userFavorite: one(userFavorite), - socialsConnection: one(socialsConnection), - userCollection: many(userCollection), - passwordResetToken: one(passwordResetToken), - emailVerificationToken: one(emailVerificationToken), - savedOcGenerators: many(savedOcGenerators), -})) - -// export types - -// game, asset types -export type Game = typeof game.$inferSelect -export type AssetCategory = typeof assetCategory.$inferSelect -export type GameAssetCategory = typeof gameAssetCategory.$inferSelect -export type Asset = typeof assets.$inferSelect -export type AssetTag = typeof assetTag.$inferSelect -export type AssetTagAsset = typeof assetTagAsset.$inferSelect - -// user types -export type User = typeof users.$inferSelect -export type EmailVerificationToken = typeof emailVerificationToken.$inferSelect -export type PasswordResetToken = typeof passwordResetToken.$inferSelect -export type Key = typeof keys.$inferSelect -export type UserNetworking = typeof userNetworking.$inferSelect -export type SocialsConnection = typeof socialsConnection.$inferSelect -export type UserFavorite = typeof userFavorite.$inferSelect -export type UserFavoriteAsset = typeof userFavoriteAsset.$inferSelect -export type UserCollection = typeof userCollection.$inferSelect -export type UserCollectionAsset = typeof userCollectionAsset.$inferSelect +export * from "./schema/user/user" +export * from "./schema/user/userAttributes" +export * from "./schema/user/userCollections" +export * from "./schema/user/userConnections" +export * from "./schema/user/userFavorites" +export * from "./schema/user/userNetworking" diff --git a/src/v2/db/schema/asset/asset.ts b/src/v2/db/schema/asset/asset.ts new file mode 100644 index 0000000..3ab28eb --- /dev/null +++ b/src/v2/db/schema/asset/asset.ts @@ -0,0 +1,99 @@ +import { tableNames } from "@/v2/db/drizzle" +import { relations } from "drizzle-orm" +import { + sqliteTable, + text, + integer, + // uniqueIndex, + index, +} from "drizzle-orm/sqlite-core" +import { users } from "../user/user" +import { assetCategory } from "./assetCategories" +import { game } from "../game/game" +import { assetTagAsset } from "./assetTags" + +/* +NOTE: Assets have a lot of relations, and can be quite complex in some cases. +- UploadedBy: Linked to the user who uploaded the asset. +- AssetTagAsset: Linked to the tags the asset has, as an asset can have multiple tags, e.g "official", "1.0" +- AssetCategory: Linked to the category the asset is in, e.g "charcter sheets" +- Game: Linked to the game the asset is for, e.g "genshin-impact" + +Then, they are also used as relations when adding to collections or favorites. +*/ + +export const assets = sqliteTable( + tableNames.assets, + { + id: integer("id").primaryKey(), // primary key auto increments on sqlite + name: text("name").notNull(), + extension: text("extension").notNull(), + game: text("game") + .notNull() + .references(() => game.name, { + onUpdate: "cascade", + onDelete: "cascade", + }), + assetCategory: text("asset_category") + .notNull() + .references(() => assetCategory.name, { + onUpdate: "cascade", + onDelete: "cascade", + }), + url: text("url").notNull(), + status: integer("status").notNull(), + uploadedById: text("uploaded_by").references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + uploadedByName: text("uploaded_by_name").references( + () => users.username, + { + onUpdate: "cascade", + onDelete: "cascade", + } + ), + uploadedDate: integer("uploaded_date").notNull(), + assetIsOptimized: integer("asset_is_optimized").default(0).notNull(), + viewCount: integer("view_count").default(0).notNull(), + downloadCount: integer("download_count").default(0).notNull(), + fileSize: integer("file_size").default(0).notNull(), + width: integer("width").default(0).notNull(), + height: integer("height").default(0).notNull(), + }, + (table) => { + return { + idIdx: index("assets_id_idx").on(table.id), + nameIdx: index("assets_name_idx").on(table.name), + gameIdx: index("assets_game_idx").on(table.game), + assetCategoryIdx: index("assets_asset_category_idx").on( + table.assetCategory + ), + uploadedByIdIdx: index("assets_uploaded_by_idx").on( + table.uploadedById + ), + uploadedByNameIdx: index("assets_uploaded_by_name_idx").on( + table.uploadedByName + ), + } + } +) + +export type Asset = typeof assets.$inferSelect +export type NewAsset = typeof assets.$inferInsert + +export const assetRelations = relations(assets, ({ one, many }) => ({ + uploadedBy: one(users, { + fields: [assets.uploadedById, assets.uploadedByName], + references: [users.id, users.username], + }), + assetTagAsset: many(assetTagAsset), + assetCategory: one(assetCategory, { + fields: [assets.assetCategory], + references: [assetCategory.name], + }), + game: one(game, { + fields: [assets.game], + references: [game.name], + }), +})) diff --git a/src/v2/db/schema/asset/assetCategories.ts b/src/v2/db/schema/asset/assetCategories.ts new file mode 100644 index 0000000..e7dd7c9 --- /dev/null +++ b/src/v2/db/schema/asset/assetCategories.ts @@ -0,0 +1,93 @@ +import { tableNames } from "@/v2/db/drizzle" +import { relations } from "drizzle-orm" +import { + sqliteTable, + text, + integer, + // uniqueIndex, + index, +} from "drizzle-orm/sqlite-core" +import { game } from "../game/game" +import { assets } from "./asset" + +/* +NOTE: This setup can look kinda janky. +- All asset categories have a game associated with them. This is for better UX so users know what asset categories exist for a game. +- It's not a necessary join, but just nice to have. +*/ + +export const assetCategory = sqliteTable( + tableNames.assetCategory, + { + id: text("id").primaryKey(), + name: text("name").notNull(), // e.g tcg-sheets, splash-art + formattedName: text("formatted_name").notNull(), // e.g TCG Sheets, Splash Art + assetCount: integer("asset_count").default(0).notNull(), + lastUpdated: integer("last_updated").notNull(), + }, + (assetCategory) => { + return { + assetCategoryIdx: index("asset_category_id_idx").on( + assetCategory.id + ), + nameIdx: index("asset_category_name_idx").on(assetCategory.name), + } + } +) + +export type AssetCategory = typeof assetCategory.$inferSelect +export type NewAssetCategory = typeof assetCategory.$inferInsert + +export const gameAssetCategory = sqliteTable( + tableNames.gameAssetCategory, + { + id: text("id").primaryKey(), + gameId: text("game_id") + .notNull() + .references(() => game.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + assetCategoryId: text("asset_category_id") + .notNull() + .references(() => assetCategory.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + }, + (gameAssetCategory) => { + return { + gameAssetCategoryIdx: index("game_asset_category_id_idx").on( + gameAssetCategory.id + ), + gameAssetCategoryGameIdx: index( + "game_asset_category_game_id_idx" + ).on(gameAssetCategory.gameId), + gameAssetCategoryAssetCategoryIdx: index( + "game_asset_category_asset_category_id_idx" + ).on(gameAssetCategory.assetCategoryId), + } + } +) + +export type GameAssetCategory = typeof gameAssetCategory.$inferSelect +export type NewGameAssetCategory = typeof gameAssetCategory.$inferInsert + +export const assetCategoryRelations = relations(assetCategory, ({ many }) => ({ + assets: many(assets), + gameAssetCategory: many(gameAssetCategory), +})) + +export const gameAssetCategoryRelations = relations( + gameAssetCategory, + ({ one }) => ({ + game: one(game, { + fields: [gameAssetCategory.gameId], + references: [game.id], + }), + assetCategory: one(assetCategory, { + fields: [gameAssetCategory.assetCategoryId], + references: [assetCategory.id], + }), + }) +) diff --git a/src/v2/db/schema/asset/assetTags.ts b/src/v2/db/schema/asset/assetTags.ts new file mode 100644 index 0000000..fa06f45 --- /dev/null +++ b/src/v2/db/schema/asset/assetTags.ts @@ -0,0 +1,82 @@ +import { tableNames } from "@/v2/db/drizzle" +import { relations } from "drizzle-orm" +import { + sqliteTable, + text, + integer, + // uniqueIndex, + index, +} from "drizzle-orm/sqlite-core" +import { assets } from "./asset" + +/* +NOTE: Asset tags are not stored as ENUMs to allow for better UX, flexibility, and extensibility. +- AssetTag: A tag that can be applied to an asset. +- AssetTagAsset: A join table that associates an asset with an asset tag. +*/ + +export const assetTag = sqliteTable( + tableNames.assetTag, + { + id: text("id").primaryKey(), + name: text("name").notNull(), + formattedName: text("formatted_name").notNull(), + assetCount: integer("asset_count").default(0).notNull(), + lastUpdated: integer("last_updated").notNull(), + }, + (assetTag) => { + return { + assetTagIdx: index("asset_tag_id_idx").on(assetTag.id), + nameIdx: index("asset_tag_name_idx").on(assetTag.name), + } + } +) + +export type AssetTag = typeof assetTag.$inferSelect +export type NewAssetTag = typeof assetTag.$inferInsert + +export const assetTagAsset = sqliteTable( + tableNames.assetTagAsset, + { + id: text("id").primaryKey(), + assetTagId: text("asset_tag_id") + .notNull() + .references(() => assetTag.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + assetId: integer("asset_id") + .notNull() + .references(() => assets.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + }, + (assetTagAsset) => { + return { + assetTagAssetIdx: index("asset_tags_assets_id_idx").on( + assetTagAsset.id + ), + assetTagAssetAssetTagIdx: index( + "asset_tags_assets_asset_tag_id_idx" + ).on(assetTagAsset.assetTagId), + assetTagAssetAssetIdx: index("asset_tags_assets_asset_id_idx").on( + assetTagAsset.assetId + ), + } + } +) + +export type AssetTagAsset = typeof assetTagAsset.$inferSelect +export type NewAssetTagAsset = typeof assetTagAsset.$inferInsert + +export const assetTagAssetRelations = relations(assetTagAsset, ({ one }) => ({ + assetTag: one(assetTag, { + fields: [assetTagAsset.assetTagId], + references: [assetTag.id], + }), + asset: one(assets, { + fields: [assetTagAsset.assetId], + references: [assets.id], + }), +})) diff --git a/src/v2/db/schema/game/game.ts b/src/v2/db/schema/game/game.ts new file mode 100644 index 0000000..83ac533 --- /dev/null +++ b/src/v2/db/schema/game/game.ts @@ -0,0 +1,44 @@ +import { tableNames } from "@/v2/db/drizzle" +import { relations } from "drizzle-orm" +import { + sqliteTable, + text, + integer, + // uniqueIndex, + index, +} from "drizzle-orm/sqlite-core" +import { assets } from "../asset/asset" +import { gameAssetCategory } from "../asset/assetCategories" + +/* +NOTE: Game relation is easy to understand and self-explanatory. +- A game can have many assets and many game asset categories. +*/ + +export const game = sqliteTable( + tableNames.game, + { + id: text("id").primaryKey(), + name: text("name").notNull(), // e.g genshin-impact, honkai-impact-3rd + formattedName: text("formatted_name").notNull(), // e.g Genshin Impact, Honkai Impact 3rd + assetCount: integer("asset_count").default(0), + possibleSuggestiveContent: integer("possible_suggestive_content") + .default(0) + .notNull(), + lastUpdated: integer("last_updated").notNull(), + }, + (game) => { + return { + gameIdx: index("game_id_idx").on(game.id), + nameIdx: index("game_name_idx").on(game.name), + } + } +) + +export type Game = typeof game.$inferSelect +export type NewGame = typeof game.$inferInsert + +export const gameRelations = relations(game, ({ many }) => ({ + assets: many(assets), + gameAssetCategory: many(gameAssetCategory), +})) diff --git a/src/v2/db/schema/oc-generators/ocGenerators.ts b/src/v2/db/schema/oc-generators/ocGenerators.ts new file mode 100644 index 0000000..baccb17 --- /dev/null +++ b/src/v2/db/schema/oc-generators/ocGenerators.ts @@ -0,0 +1,59 @@ +import { tableNames } from "@/v2/db/drizzle" +import { relations } from "drizzle-orm" +import { + sqliteTable, + text, + integer, + // uniqueIndex, + index, +} from "drizzle-orm/sqlite-core" +import { users } from "../user/user" + +/* +NOTE: OC generators are not stored in the database. +- Storing OC generators inside the database may be viable in the future, but for now, it's not necessary. +- OC Generators JSON data is viewable on the /oc-generators/ repository, where it's synced to Cloudflare R2. +*/ + +export const savedOcGenerators = sqliteTable( + tableNames.savedOcGenerators, + { + id: text("id").primaryKey(), + userId: text("user_id") + .notNull() + .references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + name: text("name").notNull(), + game: text("game").notNull(), + dateCreated: text("date_created").notNull(), + isPublic: integer("is_public").default(0).notNull(), + content: text("content").notNull(), + savedColorPalette: text("saved_color_palette"), // array of 5 hex values, completely optional for the user to save + sakuraUrl: text("sakura_url"), + }, + (savedOcGenerators) => { + return { + savedOcGeneratorsIdx: index("saved_oc_generators_id_idx").on( + savedOcGenerators.id + ), + savedOcGeneratorsUserIdx: index( + "saved_oc_generators_user_id_idx" + ).on(savedOcGenerators.userId), + } + } +) + +export type SavedOcGenerators = typeof savedOcGenerators.$inferSelect +export type NewSavedOcGenerators = typeof savedOcGenerators.$inferInsert + +export const savedOcGeneratorsRelations = relations( + savedOcGenerators, + ({ one }) => ({ + user: one(users, { + fields: [savedOcGenerators.userId], + references: [users.id], + }), + }) +) diff --git a/src/v2/db/schema/user/user.ts b/src/v2/db/schema/user/user.ts new file mode 100644 index 0000000..58fcc83 --- /dev/null +++ b/src/v2/db/schema/user/user.ts @@ -0,0 +1,102 @@ +import { tableNames } from "@/v2/db/drizzle" +import { relations } from "drizzle-orm" +import { + sqliteTable, + text, + integer, + // uniqueIndex, + index, +} from "drizzle-orm/sqlite-core" +import { userNetworking } from "./userNetworking" +import { assets } from "../asset/asset" +import { userFavorite } from "./userFavorites" +import { savedOcGenerators } from "../oc-generators/ocGenerators" +import { socialsConnection } from "./userConnections" +import { userCollection } from "./userCollections" +import { passwordResetToken } from "./userAttributes" +import { emailVerificationToken } from "./userAttributes" + +/* +NOTE: Very basic user information +- Users table is user information +- Keys table is login methods (i.e Credentials, OAuth, etc.) +*/ + +export const users = sqliteTable( + tableNames.authUser, + { + id: text("id").primaryKey(), + avatarUrl: text("avatar_url"), + bannerUrl: text("banner_url"), + displayName: text("display_name"), + username: text("username").notNull(), + usernameColour: text("username_colour"), + email: text("email").notNull(), + emailVerified: integer("email_verified").default(0).notNull(), + pronouns: text("pronouns"), + verified: integer("verified").default(0).notNull(), + bio: text("bio").default("No bio set").notNull(), + dateJoined: text("date_joined").notNull(), + roleFlags: integer("role_flags").default(1).notNull(), + isContributor: integer("is_contributor").default(0).notNull(), + selfAssignableRoleFlags: integer("self_assignable_role_flags") + .default(0) + .notNull(), + }, + (user) => { + return { + userIdx: index("user_id_idx").on(user.id), + usernameIdx: index("user_username_idx").on(user.username), + emailIdx: index("user_email_idx").on(user.email), + } + } +) + +export type Users = typeof users.$inferSelect +export type NewUsers = typeof users.$inferInsert + +export const keys = sqliteTable( + tableNames.authKey, + { + id: text("id").primaryKey(), + userId: text("user_id") + .notNull() + .references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + hashedPassword: text("hashed_password"), + }, + (key) => { + return { + userIdx: index("key_user_id_idx").on(key.userId), + } + } +) + +export type Keys = typeof keys.$inferSelect +export type NewKeys = typeof keys.$inferInsert + +export const usersRelations = relations(users, ({ one, many }) => ({ + follower: many(userNetworking, { + relationName: "follower", + }), + following: many(userNetworking, { + relationName: "following", + }), + key: many(keys), + assets: many(assets), + userFavorite: one(userFavorite), + socialsConnection: one(socialsConnection), + userCollection: many(userCollection), + passwordResetToken: one(passwordResetToken), + emailVerificationToken: one(emailVerificationToken), + savedOcGenerators: many(savedOcGenerators), +})) + +export const keysRelations = relations(keys, ({ one }) => ({ + user: one(users, { + fields: [keys.userId], + references: [users.id], + }), +})) diff --git a/src/v2/db/schema/user/userAttributes.ts b/src/v2/db/schema/user/userAttributes.ts new file mode 100644 index 0000000..e641757 --- /dev/null +++ b/src/v2/db/schema/user/userAttributes.ts @@ -0,0 +1,90 @@ +import { tableNames } from "@/v2/db/drizzle" +import { relations } from "drizzle-orm" +import { + sqliteTable, + text, + integer, + // uniqueIndex, + index, +} from "drizzle-orm/sqlite-core" +import { users } from "./user" + +/* +NOTE: This is mostly security related. +- Such as when a user forgets their password, they can request a password reset token. +- Or, they can verify their e-mail if they didn't use an OAuth method which returns something like `email_verified`. +*/ + +export const emailVerificationToken = sqliteTable( + tableNames.emailVerificationToken, + { + id: text("id").primaryKey(), + userId: text("user_id") + .notNull() + .references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + token: text("token").notNull(), + expiresAt: integer("expires_at").notNull(), + }, + (emailVerificationToken) => { + return { + userIdx: index("email_verification_token_user_id_idx").on( + emailVerificationToken.userId + ), + tokenIdx: index("email_verification_token_token_idx").on( + emailVerificationToken.token + ), + } + } +) + +export type EmailVerificationToken = typeof emailVerificationToken.$inferSelect +export type NewEmailVerificationToken = + typeof emailVerificationToken.$inferInsert + +export const passwordResetToken = sqliteTable( + tableNames.passwordResetToken, + { + id: text("id").primaryKey(), + userId: text("user_id") + .notNull() + .references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + token: text("token").notNull(), + expiresAt: integer("expires_at").notNull(), + }, + (passwordResetToken) => { + return { + userIdx: index("password_reset_token_user_id_idx").on( + passwordResetToken.userId + ), + tokenIdx: index("password_reset_token_token_idx").on( + passwordResetToken.token + ), + } + } +) + +export const emailVerificationTokenRelations = relations( + emailVerificationToken, + ({ one }) => ({ + user: one(users, { + fields: [emailVerificationToken.userId], + references: [users.id], + }), + }) +) + +export const passwordResetTokenRelations = relations( + passwordResetToken, + ({ one }) => ({ + user: one(users, { + fields: [passwordResetToken.userId], + references: [users.id], + }), + }) +) diff --git a/src/v2/db/schema/user/userCollections.ts b/src/v2/db/schema/user/userCollections.ts new file mode 100644 index 0000000..64617ef --- /dev/null +++ b/src/v2/db/schema/user/userCollections.ts @@ -0,0 +1,105 @@ +import { tableNames } from "@/v2/db/drizzle" +import { relations } from "drizzle-orm" +import { + sqliteTable, + text, + integer, + // uniqueIndex, + index, +} from "drizzle-orm/sqlite-core" +import { users } from "./user" +import { assets } from "../asset/asset" + +/* +NOTE: this file is where users store their collections of assets. +- UserCollection is the collection itself, which has a name, description, and whether it's public or not. +- UserCollectionAsset is the join table between UserCollection and Asset, which stores the assets in the collection. +*/ + +export const userCollection = sqliteTable( + tableNames.userCollection, + { + id: text("id").primaryKey(), + name: text("name").notNull(), + description: text("description").notNull(), + userId: text("user_id") + .notNull() + .references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + dateCreated: text("date_created").notNull(), + isPublic: integer("is_public").default(0).notNull(), + }, + (collection) => { + return { + collectionIdx: index("collection_id_idx").on(collection.id), + userCollectionIdx: index("user_collection_id_idx").on( + collection.userId + ), + } + } +) + +export type UserCollection = typeof userCollection.$inferSelect +export type NewUserCollection = typeof userCollection.$inferInsert + +export const userCollectionAsset = sqliteTable( + tableNames.userCollectionAsset, + { + id: text("id").primaryKey(), + collectionId: text("collection_id") + .notNull() + .references(() => userCollection.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + assetId: integer("asset_id") + .notNull() + .references(() => assets.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + }, + (collectionAssets) => { + return { + collectionAssetsIdx: index("collection_assets_id_idx").on( + collectionAssets.id + ), + collectionAssetsCollectionIdx: index( + "collection_assets_collection_id_idx" + ).on(collectionAssets.collectionId), + collectionAssetsAssetIdx: index( + "collection_assets_asset_id_idx" + ).on(collectionAssets.assetId), + } + } +) + +export type UserCollectionAsset = typeof userCollectionAsset.$inferSelect +export type NewUserCollectionAsset = typeof userCollectionAsset.$inferInsert + +export const collectionRelations = relations( + userCollection, + ({ one, many }) => ({ + user: one(users, { + fields: [userCollection.userId], + references: [users.id], + }), + assets: many(userCollectionAsset), + }) +) + +export const collectionAssetsRelations = relations( + userCollectionAsset, + ({ one }) => ({ + collection: one(userCollection, { + fields: [userCollectionAsset.collectionId], + references: [userCollection.id], + }), + asset: one(assets, { + fields: [userCollectionAsset.assetId], + references: [assets.id], + }), + }) +) diff --git a/src/v2/db/schema/user/userConnections.ts b/src/v2/db/schema/user/userConnections.ts new file mode 100644 index 0000000..d5960af --- /dev/null +++ b/src/v2/db/schema/user/userConnections.ts @@ -0,0 +1,46 @@ +import { tableNames } from "@/v2/db/drizzle" +import { relations } from "drizzle-orm" +import { sqliteTable, text, index } from "drizzle-orm/sqlite-core" +import { users } from "./user" + +/* +NOTE: This file will be expanded on in the future, but for now it's just for Discord. +- This is used to link an account to ID but also can be set by initial Discord OAuth. +*/ + +export const socialsConnection = sqliteTable( + tableNames.socialsConnection, + { + id: text("id").primaryKey(), + userId: text("user_id") + .notNull() + .references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + discordId: text("discord_id"), + }, + (socialsConnection) => { + return { + userIdx: index("socials_connection_user_id_idx").on( + socialsConnection.userId + ), + discordIdIdx: index("socials_connection_discord_id_idx").on( + socialsConnection.discordId + ), + } + } +) + +export type SocialsConnection = typeof socialsConnection.$inferSelect +export type NewSocialsConnection = typeof socialsConnection.$inferInsert + +export const socialsConnectionRelations = relations( + socialsConnection, + ({ one }) => ({ + user: one(users, { + fields: [socialsConnection.userId], + references: [users.id], + }), + }) +) diff --git a/src/v2/db/schema/user/userFavorites.ts b/src/v2/db/schema/user/userFavorites.ts new file mode 100644 index 0000000..954d89a --- /dev/null +++ b/src/v2/db/schema/user/userFavorites.ts @@ -0,0 +1,100 @@ +import { tableNames } from "@/v2/db/drizzle" +import { relations } from "drizzle-orm" +import { + sqliteTable, + text, + integer, + // uniqueIndex, + index, +} from "drizzle-orm/sqlite-core" +import { users } from "./user" +import { assets } from "../asset/asset" + +/* +NOTE: this file is users favorite assets. +- Think of it as being similar to likes, where you can favorite multiple assets but only have one set of favorites. +- Everything else is managed within collections when uers want to organize their assets. +*/ + +export const userFavorite = sqliteTable( + tableNames.userFavorite, + { + id: text("id").primaryKey(), + userId: text("user_id") + .notNull() + .references(() => users.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + isPublic: integer("is_public").default(0).notNull(), + }, + (userFavorite) => { + return { + favoritedAssetsIdx: index("favorited_assets_id_idx").on( + userFavorite.id + ), + favoritedAssetsUserIdx: index("favorited_assets_user_id_idx").on( + userFavorite.userId + ), + } + } +) + +export type UserFavorite = typeof userFavorite.$inferSelect +export type NewUserFavorite = typeof userFavorite.$inferInsert + +export const userFavoriteAsset = sqliteTable( + tableNames.userFavoriteAsset, + { + id: text("id").primaryKey(), + userFavoriteId: text("favorited_assets_id") + .notNull() + .references(() => userFavorite.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + assetId: integer("asset_id") + .notNull() + .references(() => assets.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + }, + (userFavoriteAsset) => { + return { + favoritedAssetsAssetsIdx: index( + "favorited_assets_assets_id_idx" + ).on(userFavoriteAsset.id), + favoritedAssetsAssetsUserIdx: index( + "favorited_assets_assets_user_id_idx" + ).on(userFavoriteAsset.userFavoriteId), + favoritedAssetsAssetsAssetIdx: index( + "favorited_assets_assets_asset_id_idx" + ).on(userFavoriteAsset.assetId), + } + } +) + +export type UserFavoriteAsset = typeof userFavoriteAsset.$inferSelect +export type NewUserFavoriteAsset = typeof userFavoriteAsset.$inferInsert + +export const userFavoriteRelations = relations(userFavorite, ({ one }) => ({ + user: one(users, { + fields: [userFavorite.userId], + references: [users.id], + }), +})) + +export const userFavoriteAssetRelations = relations( + userFavoriteAsset, + ({ one }) => ({ + favoritedAssets: one(userFavorite, { + fields: [userFavoriteAsset.userFavoriteId], + references: [userFavorite.id], + }), + asset: one(assets, { + fields: [userFavoriteAsset.assetId], + references: [assets.id], + }), + }) +) diff --git a/src/v2/db/schema/user/userNetworking.ts b/src/v2/db/schema/user/userNetworking.ts new file mode 100644 index 0000000..16e57a6 --- /dev/null +++ b/src/v2/db/schema/user/userNetworking.ts @@ -0,0 +1,54 @@ +import { tableNames } from "@/v2/db/drizzle" +import { relations } from "drizzle-orm" +import { + sqliteTable, + text, + // uniqueIndex, + index, +} from "drizzle-orm/sqlite-core" +import { users } from "./user" + +/* +NOTE: this file manages the "social" aspect of users. +- This is where users can follow other users, and be followed by other users. +*/ + +export const userNetworking = sqliteTable( + tableNames.userNetworking, + { + followerId: text("followerId") + .notNull() + .references(() => users.id), + followingId: text("followingId") + .notNull() + .references(() => users.id), + createdAt: text("createdAt").notNull(), + updatedAt: text("updatedAt").notNull(), + }, + (userNetworking) => { + return { + followerIdx: index("userNetworking_follower_idx").on( + userNetworking.followerId + ), + followingIdx: index("userNetworking_following_idx").on( + userNetworking.followingId + ), + } + } +) + +export type UserNetworking = typeof userNetworking.$inferSelect +export type NewUserNetworking = typeof userNetworking.$inferInsert + +export const userNetworkingRelations = relations(userNetworking, ({ one }) => ({ + follower: one(users, { + fields: [userNetworking.followerId], + references: [users.id], + relationName: "follower", + }), + following: one(users, { + fields: [userNetworking.followingId], + references: [users.id], + relationName: "following", + }), +})) From 1451b18c6c46c210fb48909c45cdd67d897cb935 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Thu, 19 Oct 2023 13:26:57 +0100 Subject: [PATCH 123/318] convert filenames --- src/index.ts | 14 +++++++------- src/v2/db/schema.ts | 16 ++++++++-------- .../{assetCategories.ts => asset-categories.ts} | 0 .../schema/asset/{assetTags.ts => asset-tags.ts} | 0 src/v2/db/schema/asset/asset.ts | 4 ++-- src/v2/db/schema/game/game.ts | 2 +- .../{ocGenerators.ts => oc-generators.ts} | 0 .../{userAttributes.ts => user-attributes.ts} | 0 .../{userCollections.ts => user-collections.ts} | 0 .../{userConnections.ts => user-connections.ts} | 0 .../user/{userFavorites.ts => user-favorites.ts} | 0 .../{userNetworking.ts => user-networking.ts} | 0 src/v2/db/schema/user/user.ts | 14 +++++++------- .../helpers/{assetStatus.ts => asset-status.ts} | 0 .../{notFoundResponse.ts => not-found.ts} | 0 .../lib/helpers/{roleFlags.ts => role-flags.ts} | 0 ...QueryByCommas.ts => split-query-by-commas.ts} | 0 src/v2/lib/{listBucket.ts => list-bucket.ts} | 0 .../{responseHeaders.ts => response-headers.ts} | 0 .../asset/{assetRoutes.ts => asset-routes.ts} | 4 ++-- .../{downloadAsset.ts => download-asset.ts} | 0 .../{getAssetFromId.ts => get-asset-from-id.ts} | 0 ...ategoryRoutes.ts => asset-category-routes.ts} | 4 ++-- ...AssetCategory.ts => create-asset-category.ts} | 2 +- ...AssetCategory.ts => delete-asset-category.ts} | 2 +- .../assets/{approveAsset.ts => approve-asset.ts} | 4 ++-- .../assets/{assetRoutes.ts => asset-routes.ts} | 12 ++++++------ ...oCollection.ts => add-asset-to-collection.ts} | 0 ...ollectionsRoutes.ts => collections-routes.ts} | 12 ++++++------ ...tCollection.ts => create-asset-collection.ts} | 0 ...tCollection.ts => delete-asset-collection.ts} | 0 ...ection.ts => delete-asset-from-collection.ts} | 0 ...setCollection.ts => view-asset-collection.ts} | 0 ...tCollections.ts => view-asset-collections.ts} | 0 ...addFavoriteAsset.ts => add-favorite-asset.ts} | 0 ...teAssetRoutes.ts => favorite-asset-routes.ts} | 6 +++--- ...FavoriteAsset.ts => remove-favorite-asset.ts} | 0 ...FavoriteAssets.ts => view-favorite-assets.ts} | 0 ...pprovedAssets.ts => get-unapproved-assets.ts} | 4 ++-- .../assets/{modifyAsset.ts => modify-asset.ts} | 6 +++--- .../assets/{uploadAsset.ts => upload-asset.ts} | 2 +- .../auth/{authRoutes.ts => auth-routes.ts} | 16 ++++++++-------- .../auth/games/{createGame.ts => create-game.ts} | 2 +- .../auth/games/{deleteGame.ts => delete-game.ts} | 2 +- .../auth/games/{gameRoutes.ts => game-routes.ts} | 4 ++-- ...sponse.ts => delete-oc-generator-response.ts} | 0 ...GeneratorRoutes.ts => oc-generator-routes.ts} | 6 +++--- ...Response.ts => save-oc-generator-response.ts} | 2 +- ...esponses.ts => view-oc-generator-response.ts} | 0 .../auth/{resetPassword.ts => reset-password.ts} | 0 .../auth/tags/{createTag.ts => create-tag.ts} | 2 +- .../auth/tags/{deleteTag.ts => delete-tag.ts} | 2 +- .../auth/tags/{tagRoutes.ts => tag-routes.ts} | 4 ++-- .../{uploadAvatar.ts => upload-avatar.ts} | 0 .../{uploadBanner.ts => upload-banner.ts} | 0 ...erAttributes.ts => update-user-attributes.ts} | 0 ...ibutesRoutes.ts => user-attributes-routes.ts} | 10 +++++----- .../{followUser.ts => follow-user.ts} | 0 .../{unfollowUser.ts => unfollow-user.ts} | 0 .../auth/{verifyEmail.ts => verify-email.ts} | 0 src/v2/routes/discord/contributors.ts | 2 +- .../{discordRoutes.ts => discord-routes.ts} | 0 .../routes/games/{allGames.ts => all-games.ts} | 4 ++-- .../games/{gamesRoutes.ts => games-routes.ts} | 2 +- .../{getGenerator.ts => get-generator.ts} | 6 +++--- .../{getGenerators.ts => get-generators.ts} | 4 ++-- ...GeneratorRoutes.ts => oc-generator-routes.ts} | 4 ++-- .../search/all/{searchAll.ts => search-all.ts} | 2 +- .../asset/{recentAssets.ts => recent-assets.ts} | 2 +- .../asset/{searchAssets.ts => search-assets.ts} | 4 ++-- .../search/{searchRoutes.ts => search-routes.ts} | 12 ++++++------ ...UserByUsername.ts => get-user-by-username.ts} | 6 +++--- ...etUsersBySearch.ts => get-users-by-search.ts} | 0 src/v2/routes/tags/{allTags.ts => all-tags.ts} | 0 .../tags/{getTagById.ts => get-tag-by-id.ts} | 0 .../tags/{getTagByName.ts => get-tag-by-name.ts} | 0 .../tags/{tagsRoutes.ts => tags-routes.ts} | 6 +++--- 77 files changed, 106 insertions(+), 106 deletions(-) rename src/v2/db/schema/asset/{assetCategories.ts => asset-categories.ts} (100%) rename src/v2/db/schema/asset/{assetTags.ts => asset-tags.ts} (100%) rename src/v2/db/schema/oc-generators/{ocGenerators.ts => oc-generators.ts} (100%) rename src/v2/db/schema/user/{userAttributes.ts => user-attributes.ts} (100%) rename src/v2/db/schema/user/{userCollections.ts => user-collections.ts} (100%) rename src/v2/db/schema/user/{userConnections.ts => user-connections.ts} (100%) rename src/v2/db/schema/user/{userFavorites.ts => user-favorites.ts} (100%) rename src/v2/db/schema/user/{userNetworking.ts => user-networking.ts} (100%) rename src/v2/lib/helpers/{assetStatus.ts => asset-status.ts} (100%) rename src/v2/lib/helpers/responses/{notFoundResponse.ts => not-found.ts} (100%) rename src/v2/lib/helpers/{roleFlags.ts => role-flags.ts} (100%) rename src/v2/lib/helpers/{splitQueryByCommas.ts => split-query-by-commas.ts} (100%) rename src/v2/lib/{listBucket.ts => list-bucket.ts} (100%) rename src/v2/lib/{responseHeaders.ts => response-headers.ts} (100%) rename src/v2/routes/asset/{assetRoutes.ts => asset-routes.ts} (77%) rename src/v2/routes/asset/{downloadAsset.ts => download-asset.ts} (100%) rename src/v2/routes/asset/{getAssetFromId.ts => get-asset-from-id.ts} (100%) rename src/v2/routes/auth/asset-categories/{assetCategoryRoutes.ts => asset-category-routes.ts} (79%) rename src/v2/routes/auth/asset-categories/{createAssetCategory.ts => create-asset-category.ts} (96%) rename src/v2/routes/auth/asset-categories/{deleteAssetCategory.ts => delete-asset-category.ts} (97%) rename src/v2/routes/auth/assets/{approveAsset.ts => approve-asset.ts} (92%) rename src/v2/routes/auth/assets/{assetRoutes.ts => asset-routes.ts} (68%) rename src/v2/routes/auth/assets/collections/{addAssetToCollection.ts => add-asset-to-collection.ts} (100%) rename src/v2/routes/auth/assets/collections/{collectionsRoutes.ts => collections-routes.ts} (67%) rename src/v2/routes/auth/assets/collections/{createAssetCollection.ts => create-asset-collection.ts} (100%) rename src/v2/routes/auth/assets/collections/{deleteAssetCollection.ts => delete-asset-collection.ts} (100%) rename src/v2/routes/auth/assets/collections/{deleteAssetFromCollection.ts => delete-asset-from-collection.ts} (100%) rename src/v2/routes/auth/assets/collections/{viewAssetCollection.ts => view-asset-collection.ts} (100%) rename src/v2/routes/auth/assets/collections/{viewAssetCollections.ts => view-asset-collections.ts} (100%) rename src/v2/routes/auth/assets/favorite/{addFavoriteAsset.ts => add-favorite-asset.ts} (100%) rename src/v2/routes/auth/assets/favorite/{favoriteAssetRoutes.ts => favorite-asset-routes.ts} (76%) rename src/v2/routes/auth/assets/favorite/{removeFavoriteAsset.ts => remove-favorite-asset.ts} (100%) rename src/v2/routes/auth/assets/favorite/{viewFavoriteAssets.ts => view-favorite-assets.ts} (100%) rename src/v2/routes/auth/assets/{getUnapprovedAssets.ts => get-unapproved-assets.ts} (89%) rename src/v2/routes/auth/assets/{modifyAsset.ts => modify-asset.ts} (95%) rename src/v2/routes/auth/assets/{uploadAsset.ts => upload-asset.ts} (98%) rename src/v2/routes/auth/{authRoutes.ts => auth-routes.ts} (76%) rename src/v2/routes/auth/games/{createGame.ts => create-game.ts} (96%) rename src/v2/routes/auth/games/{deleteGame.ts => delete-game.ts} (95%) rename src/v2/routes/auth/games/{gameRoutes.ts => game-routes.ts} (83%) rename src/v2/routes/auth/oc-generators/{deleteOCGeneratorResponse.ts => delete-oc-generator-response.ts} (100%) rename src/v2/routes/auth/oc-generators/{ocGeneratorRoutes.ts => oc-generator-routes.ts} (73%) rename src/v2/routes/auth/oc-generators/{saveOCGeneratorResponse.ts => save-oc-generator-response.ts} (98%) rename src/v2/routes/auth/oc-generators/{viewOCGeneratorResponses.ts => view-oc-generator-response.ts} (100%) rename src/v2/routes/auth/{resetPassword.ts => reset-password.ts} (100%) rename src/v2/routes/auth/tags/{createTag.ts => create-tag.ts} (97%) rename src/v2/routes/auth/tags/{deleteTag.ts => delete-tag.ts} (96%) rename src/v2/routes/auth/tags/{tagRoutes.ts => tag-routes.ts} (83%) rename src/v2/routes/auth/user-attributes/self-upload/{uploadAvatar.ts => upload-avatar.ts} (100%) rename src/v2/routes/auth/user-attributes/self-upload/{uploadBanner.ts => upload-banner.ts} (100%) rename src/v2/routes/auth/user-attributes/{updateUserAttributes.ts => update-user-attributes.ts} (100%) rename src/v2/routes/auth/user-attributes/{userAttributesRoutes.ts => user-attributes-routes.ts} (70%) rename src/v2/routes/auth/user-attributes/user-relations/{followUser.ts => follow-user.ts} (100%) rename src/v2/routes/auth/user-attributes/user-relations/{unfollowUser.ts => unfollow-user.ts} (100%) rename src/v2/routes/auth/{verifyEmail.ts => verify-email.ts} (100%) rename src/v2/routes/discord/{discordRoutes.ts => discord-routes.ts} (100%) rename src/v2/routes/games/{allGames.ts => all-games.ts} (92%) rename src/v2/routes/games/{gamesRoutes.ts => games-routes.ts} (80%) rename src/v2/routes/oc-generators/{getGenerator.ts => get-generator.ts} (89%) rename src/v2/routes/oc-generators/{getGenerators.ts => get-generators.ts} (91%) rename src/v2/routes/oc-generators/{ocGeneratorRoutes.ts => oc-generator-routes.ts} (73%) rename src/v2/routes/search/all/{searchAll.ts => search-all.ts} (98%) rename src/v2/routes/search/asset/{recentAssets.ts => recent-assets.ts} (94%) rename src/v2/routes/search/asset/{searchAssets.ts => search-assets.ts} (95%) rename src/v2/routes/search/{searchRoutes.ts => search-routes.ts} (73%) rename src/v2/routes/search/user/{getUserByUsername.ts => get-user-by-username.ts} (94%) rename src/v2/routes/search/user/{getUsersBySearch.ts => get-users-by-search.ts} (100%) rename src/v2/routes/tags/{allTags.ts => all-tags.ts} (100%) rename src/v2/routes/tags/{getTagById.ts => get-tag-by-id.ts} (100%) rename src/v2/routes/tags/{getTagByName.ts => get-tag-by-name.ts} (100%) rename src/v2/routes/tags/{tagsRoutes.ts => tags-routes.ts} (69%) diff --git a/src/index.ts b/src/index.ts index 3b99c7c..9f9a738 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,11 +1,11 @@ import { Hono } from "hono" -import assetRoute from "./v2/routes/asset/assetRoutes" -import discordRoute from "./v2/routes/discord/discordRoutes" -import ocGeneratorRoute from "./v2/routes/oc-generators/ocGeneratorRoutes" -import gamesRoute from "./v2/routes/games/gamesRoutes" -import authRoute from "./v2/routes/auth/authRoutes" -import searchRoute from "./v2/routes/search/searchRoutes" -import tagsRoute from "./v2/routes/tags/tagsRoutes" +import assetRoute from "./v2/routes/asset/asset-routes" +import discordRoute from "./v2/routes/discord/discord-routes" +import ocGeneratorRoute from "./v2/routes/oc-generators/oc-generator-routes" +import gamesRoute from "./v2/routes/games/games-routes" +import authRoute from "./v2/routes/auth/auth-routes" +import searchRoute from "./v2/routes/search/search-routes" +import tagsRoute from "./v2/routes/tags/tags-routes" import { getRuntimeKey } from "hono/adapter" const app = new Hono<{ Bindings: Bindings }>() diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index 4904220..d28bf60 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -1,14 +1,14 @@ export * from "./schema/asset/asset" -export * from "./schema/asset/assetCategories" -export * from "./schema/asset/assetTags" +export * from "./schema/asset/asset-categories" +export * from "./schema/asset/asset-tags" export * from "./schema/game/game" -export * from "./schema/oc-generators/ocGenerators" +export * from "./schema/oc-generators/oc-generators" export * from "./schema/user/user" -export * from "./schema/user/userAttributes" -export * from "./schema/user/userCollections" -export * from "./schema/user/userConnections" -export * from "./schema/user/userFavorites" -export * from "./schema/user/userNetworking" +export * from "./schema/user/user-attributes" +export * from "./schema/user/user-collections" +export * from "./schema/user/user-connections" +export * from "./schema/user/user-favorites" +export * from "./schema/user/user-networking" diff --git a/src/v2/db/schema/asset/assetCategories.ts b/src/v2/db/schema/asset/asset-categories.ts similarity index 100% rename from src/v2/db/schema/asset/assetCategories.ts rename to src/v2/db/schema/asset/asset-categories.ts diff --git a/src/v2/db/schema/asset/assetTags.ts b/src/v2/db/schema/asset/asset-tags.ts similarity index 100% rename from src/v2/db/schema/asset/assetTags.ts rename to src/v2/db/schema/asset/asset-tags.ts diff --git a/src/v2/db/schema/asset/asset.ts b/src/v2/db/schema/asset/asset.ts index 3ab28eb..ce76559 100644 --- a/src/v2/db/schema/asset/asset.ts +++ b/src/v2/db/schema/asset/asset.ts @@ -8,9 +8,9 @@ import { index, } from "drizzle-orm/sqlite-core" import { users } from "../user/user" -import { assetCategory } from "./assetCategories" +import { assetCategory } from "./asset-categories" import { game } from "../game/game" -import { assetTagAsset } from "./assetTags" +import { assetTagAsset } from "./asset-tags" /* NOTE: Assets have a lot of relations, and can be quite complex in some cases. diff --git a/src/v2/db/schema/game/game.ts b/src/v2/db/schema/game/game.ts index 83ac533..36ef4b6 100644 --- a/src/v2/db/schema/game/game.ts +++ b/src/v2/db/schema/game/game.ts @@ -8,7 +8,7 @@ import { index, } from "drizzle-orm/sqlite-core" import { assets } from "../asset/asset" -import { gameAssetCategory } from "../asset/assetCategories" +import { gameAssetCategory } from "../asset/asset-categories" /* NOTE: Game relation is easy to understand and self-explanatory. diff --git a/src/v2/db/schema/oc-generators/ocGenerators.ts b/src/v2/db/schema/oc-generators/oc-generators.ts similarity index 100% rename from src/v2/db/schema/oc-generators/ocGenerators.ts rename to src/v2/db/schema/oc-generators/oc-generators.ts diff --git a/src/v2/db/schema/user/userAttributes.ts b/src/v2/db/schema/user/user-attributes.ts similarity index 100% rename from src/v2/db/schema/user/userAttributes.ts rename to src/v2/db/schema/user/user-attributes.ts diff --git a/src/v2/db/schema/user/userCollections.ts b/src/v2/db/schema/user/user-collections.ts similarity index 100% rename from src/v2/db/schema/user/userCollections.ts rename to src/v2/db/schema/user/user-collections.ts diff --git a/src/v2/db/schema/user/userConnections.ts b/src/v2/db/schema/user/user-connections.ts similarity index 100% rename from src/v2/db/schema/user/userConnections.ts rename to src/v2/db/schema/user/user-connections.ts diff --git a/src/v2/db/schema/user/userFavorites.ts b/src/v2/db/schema/user/user-favorites.ts similarity index 100% rename from src/v2/db/schema/user/userFavorites.ts rename to src/v2/db/schema/user/user-favorites.ts diff --git a/src/v2/db/schema/user/userNetworking.ts b/src/v2/db/schema/user/user-networking.ts similarity index 100% rename from src/v2/db/schema/user/userNetworking.ts rename to src/v2/db/schema/user/user-networking.ts diff --git a/src/v2/db/schema/user/user.ts b/src/v2/db/schema/user/user.ts index 58fcc83..ab07f5c 100644 --- a/src/v2/db/schema/user/user.ts +++ b/src/v2/db/schema/user/user.ts @@ -7,14 +7,14 @@ import { // uniqueIndex, index, } from "drizzle-orm/sqlite-core" -import { userNetworking } from "./userNetworking" +import { userNetworking } from "./user-networking" import { assets } from "../asset/asset" -import { userFavorite } from "./userFavorites" -import { savedOcGenerators } from "../oc-generators/ocGenerators" -import { socialsConnection } from "./userConnections" -import { userCollection } from "./userCollections" -import { passwordResetToken } from "./userAttributes" -import { emailVerificationToken } from "./userAttributes" +import { userFavorite } from "./user-favorites" +import { savedOcGenerators } from "../oc-generators/oc-generators" +import { socialsConnection } from "./user-connections" +import { userCollection } from "./user-collections" +import { passwordResetToken } from "./user-attributes" +import { emailVerificationToken } from "./user-attributes" /* NOTE: Very basic user information diff --git a/src/v2/lib/helpers/assetStatus.ts b/src/v2/lib/helpers/asset-status.ts similarity index 100% rename from src/v2/lib/helpers/assetStatus.ts rename to src/v2/lib/helpers/asset-status.ts diff --git a/src/v2/lib/helpers/responses/notFoundResponse.ts b/src/v2/lib/helpers/responses/not-found.ts similarity index 100% rename from src/v2/lib/helpers/responses/notFoundResponse.ts rename to src/v2/lib/helpers/responses/not-found.ts diff --git a/src/v2/lib/helpers/roleFlags.ts b/src/v2/lib/helpers/role-flags.ts similarity index 100% rename from src/v2/lib/helpers/roleFlags.ts rename to src/v2/lib/helpers/role-flags.ts diff --git a/src/v2/lib/helpers/splitQueryByCommas.ts b/src/v2/lib/helpers/split-query-by-commas.ts similarity index 100% rename from src/v2/lib/helpers/splitQueryByCommas.ts rename to src/v2/lib/helpers/split-query-by-commas.ts diff --git a/src/v2/lib/listBucket.ts b/src/v2/lib/list-bucket.ts similarity index 100% rename from src/v2/lib/listBucket.ts rename to src/v2/lib/list-bucket.ts diff --git a/src/v2/lib/responseHeaders.ts b/src/v2/lib/response-headers.ts similarity index 100% rename from src/v2/lib/responseHeaders.ts rename to src/v2/lib/response-headers.ts diff --git a/src/v2/routes/asset/assetRoutes.ts b/src/v2/routes/asset/asset-routes.ts similarity index 77% rename from src/v2/routes/asset/assetRoutes.ts rename to src/v2/routes/asset/asset-routes.ts index a10c97c..17aaecf 100644 --- a/src/v2/routes/asset/assetRoutes.ts +++ b/src/v2/routes/asset/asset-routes.ts @@ -1,6 +1,6 @@ import { Hono } from "hono" -import { getAssetFromId } from "./getAssetFromId" -import { downloadAsset } from "./downloadAsset" +import { getAssetFromId } from "./get-asset-from-id" +import { downloadAsset } from "./download-asset" const assetRoute = new Hono<{ Bindings: Bindings }>() diff --git a/src/v2/routes/asset/downloadAsset.ts b/src/v2/routes/asset/download-asset.ts similarity index 100% rename from src/v2/routes/asset/downloadAsset.ts rename to src/v2/routes/asset/download-asset.ts diff --git a/src/v2/routes/asset/getAssetFromId.ts b/src/v2/routes/asset/get-asset-from-id.ts similarity index 100% rename from src/v2/routes/asset/getAssetFromId.ts rename to src/v2/routes/asset/get-asset-from-id.ts diff --git a/src/v2/routes/auth/asset-categories/assetCategoryRoutes.ts b/src/v2/routes/auth/asset-categories/asset-category-routes.ts similarity index 79% rename from src/v2/routes/auth/asset-categories/assetCategoryRoutes.ts rename to src/v2/routes/auth/asset-categories/asset-category-routes.ts index 0343e3a..550b0d8 100644 --- a/src/v2/routes/auth/asset-categories/assetCategoryRoutes.ts +++ b/src/v2/routes/auth/asset-categories/asset-category-routes.ts @@ -1,5 +1,5 @@ -import { createAssetCategory } from "./createAssetCategory" -import { deleteAssetCategory } from "./deleteAssetCategory" +import { createAssetCategory } from "./create-asset-category" +import { deleteAssetCategory } from "./delete-asset-category" import { Hono } from "hono" import { cors } from "hono/cors" diff --git a/src/v2/routes/auth/asset-categories/createAssetCategory.ts b/src/v2/routes/auth/asset-categories/create-asset-category.ts similarity index 96% rename from src/v2/routes/auth/asset-categories/createAssetCategory.ts rename to src/v2/routes/auth/asset-categories/create-asset-category.ts index d963b1e..e235fc3 100644 --- a/src/v2/routes/auth/asset-categories/createAssetCategory.ts +++ b/src/v2/routes/auth/asset-categories/create-asset-category.ts @@ -1,5 +1,5 @@ import { auth } from "@/v2/lib/auth/lucia" -import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" +import { roleFlagsToArray } from "@/v2/lib/helpers/role-flags" import { getConnection } from "@/v2/db/turso" import { assetCategory } from "@/v2/db/schema" diff --git a/src/v2/routes/auth/asset-categories/deleteAssetCategory.ts b/src/v2/routes/auth/asset-categories/delete-asset-category.ts similarity index 97% rename from src/v2/routes/auth/asset-categories/deleteAssetCategory.ts rename to src/v2/routes/auth/asset-categories/delete-asset-category.ts index b98d83f..d833fa8 100644 --- a/src/v2/routes/auth/asset-categories/deleteAssetCategory.ts +++ b/src/v2/routes/auth/asset-categories/delete-asset-category.ts @@ -1,5 +1,5 @@ import { auth } from "@/v2/lib/auth/lucia" -import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" +import { roleFlagsToArray } from "@/v2/lib/helpers/role-flags" import { getConnection } from "@/v2/db/turso" import { z } from "zod" import { eq } from "drizzle-orm" diff --git a/src/v2/routes/auth/assets/approveAsset.ts b/src/v2/routes/auth/assets/approve-asset.ts similarity index 92% rename from src/v2/routes/auth/assets/approveAsset.ts rename to src/v2/routes/auth/assets/approve-asset.ts index 098c2b8..c49bfe4 100644 --- a/src/v2/routes/auth/assets/approveAsset.ts +++ b/src/v2/routes/auth/assets/approve-asset.ts @@ -1,10 +1,10 @@ -import { responseHeaders } from "@/v2/lib/responseHeaders" +import { responseHeaders } from "@/v2/lib/response-headers" import { getConnection } from "@/v2/db/turso" import { assets } from "@/v2/db/schema" import { eq } from "drizzle-orm" import { auth } from "@/v2/lib/auth/lucia" -import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" +import { roleFlagsToArray } from "@/v2/lib/helpers/role-flags" export async function approveAsset(c: APIContext): Promise { const { assetIdToApprove } = c.req.param() diff --git a/src/v2/routes/auth/assets/assetRoutes.ts b/src/v2/routes/auth/assets/asset-routes.ts similarity index 68% rename from src/v2/routes/auth/assets/assetRoutes.ts rename to src/v2/routes/auth/assets/asset-routes.ts index c9aba30..1d046ab 100644 --- a/src/v2/routes/auth/assets/assetRoutes.ts +++ b/src/v2/routes/auth/assets/asset-routes.ts @@ -1,11 +1,11 @@ -import { approveAsset } from "./approveAsset" -import { getUnapprovedAssets } from "./getUnapprovedAssets" -import { modifyAssetData } from "./modifyAsset" -import { uploadAsset } from "./uploadAsset" +import { approveAsset } from "./approve-asset" +import { getUnapprovedAssets } from "./get-unapproved-assets" +import { modifyAssetData } from "./modify-asset" +import { uploadAsset } from "./upload-asset" import { Hono } from "hono" import { cors } from "hono/cors" -import collectionsRoute from "./collections/collectionsRoutes" -import favoriteAssetRoute from "./favorite/favoriteAssetRoutes" +import collectionsRoute from "./collections/collections-routes" +import favoriteAssetRoute from "./favorite/favorite-asset-routes" const assetRoute = new Hono<{ Bindings: Bindings }>() diff --git a/src/v2/routes/auth/assets/collections/addAssetToCollection.ts b/src/v2/routes/auth/assets/collections/add-asset-to-collection.ts similarity index 100% rename from src/v2/routes/auth/assets/collections/addAssetToCollection.ts rename to src/v2/routes/auth/assets/collections/add-asset-to-collection.ts diff --git a/src/v2/routes/auth/assets/collections/collectionsRoutes.ts b/src/v2/routes/auth/assets/collections/collections-routes.ts similarity index 67% rename from src/v2/routes/auth/assets/collections/collectionsRoutes.ts rename to src/v2/routes/auth/assets/collections/collections-routes.ts index 8de75fb..e02d5a1 100644 --- a/src/v2/routes/auth/assets/collections/collectionsRoutes.ts +++ b/src/v2/routes/auth/assets/collections/collections-routes.ts @@ -1,9 +1,9 @@ -import { addAssetToCollection } from "./addAssetToCollection" -import { createAssetCollection } from "./createAssetCollection" -import { deleteAssetCollection } from "./deleteAssetCollection" -import { deleteAssetFromCollection } from "./deleteAssetFromCollection" -import { viewAssetCollection } from "./viewAssetCollection" -import { viewAssetCollections } from "./viewAssetCollections" +import { addAssetToCollection } from "./add-asset-to-collection" +import { createAssetCollection } from "./create-asset-collection" +import { deleteAssetCollection } from "./delete-asset-collection" +import { deleteAssetFromCollection } from "./delete-asset-from-collection" +import { viewAssetCollection } from "./view-asset-collection" +import { viewAssetCollections } from "./view-asset-collections" import { Hono } from "hono" import { cors } from "hono/cors" diff --git a/src/v2/routes/auth/assets/collections/createAssetCollection.ts b/src/v2/routes/auth/assets/collections/create-asset-collection.ts similarity index 100% rename from src/v2/routes/auth/assets/collections/createAssetCollection.ts rename to src/v2/routes/auth/assets/collections/create-asset-collection.ts diff --git a/src/v2/routes/auth/assets/collections/deleteAssetCollection.ts b/src/v2/routes/auth/assets/collections/delete-asset-collection.ts similarity index 100% rename from src/v2/routes/auth/assets/collections/deleteAssetCollection.ts rename to src/v2/routes/auth/assets/collections/delete-asset-collection.ts diff --git a/src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts b/src/v2/routes/auth/assets/collections/delete-asset-from-collection.ts similarity index 100% rename from src/v2/routes/auth/assets/collections/deleteAssetFromCollection.ts rename to src/v2/routes/auth/assets/collections/delete-asset-from-collection.ts diff --git a/src/v2/routes/auth/assets/collections/viewAssetCollection.ts b/src/v2/routes/auth/assets/collections/view-asset-collection.ts similarity index 100% rename from src/v2/routes/auth/assets/collections/viewAssetCollection.ts rename to src/v2/routes/auth/assets/collections/view-asset-collection.ts diff --git a/src/v2/routes/auth/assets/collections/viewAssetCollections.ts b/src/v2/routes/auth/assets/collections/view-asset-collections.ts similarity index 100% rename from src/v2/routes/auth/assets/collections/viewAssetCollections.ts rename to src/v2/routes/auth/assets/collections/view-asset-collections.ts diff --git a/src/v2/routes/auth/assets/favorite/addFavoriteAsset.ts b/src/v2/routes/auth/assets/favorite/add-favorite-asset.ts similarity index 100% rename from src/v2/routes/auth/assets/favorite/addFavoriteAsset.ts rename to src/v2/routes/auth/assets/favorite/add-favorite-asset.ts diff --git a/src/v2/routes/auth/assets/favorite/favoriteAssetRoutes.ts b/src/v2/routes/auth/assets/favorite/favorite-asset-routes.ts similarity index 76% rename from src/v2/routes/auth/assets/favorite/favoriteAssetRoutes.ts rename to src/v2/routes/auth/assets/favorite/favorite-asset-routes.ts index bd9659a..fde076f 100644 --- a/src/v2/routes/auth/assets/favorite/favoriteAssetRoutes.ts +++ b/src/v2/routes/auth/assets/favorite/favorite-asset-routes.ts @@ -1,8 +1,8 @@ import { Hono } from "hono" import { cors } from "hono/cors" -import { favoriteAsset } from "./addFavoriteAsset" -import { removeFavoriteAsset } from "./removeFavoriteAsset" -import { viewFavoriteAssets } from "./viewFavoriteAssets" +import { favoriteAsset } from "./add-favorite-asset" +import { removeFavoriteAsset } from "./remove-favorite-asset" +import { viewFavoriteAssets } from "./view-favorite-assets" const favoriteAssetRoute = new Hono<{ Bindings: Bindings }>() diff --git a/src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts b/src/v2/routes/auth/assets/favorite/remove-favorite-asset.ts similarity index 100% rename from src/v2/routes/auth/assets/favorite/removeFavoriteAsset.ts rename to src/v2/routes/auth/assets/favorite/remove-favorite-asset.ts diff --git a/src/v2/routes/auth/assets/favorite/viewFavoriteAssets.ts b/src/v2/routes/auth/assets/favorite/view-favorite-assets.ts similarity index 100% rename from src/v2/routes/auth/assets/favorite/viewFavoriteAssets.ts rename to src/v2/routes/auth/assets/favorite/view-favorite-assets.ts diff --git a/src/v2/routes/auth/assets/getUnapprovedAssets.ts b/src/v2/routes/auth/assets/get-unapproved-assets.ts similarity index 89% rename from src/v2/routes/auth/assets/getUnapprovedAssets.ts rename to src/v2/routes/auth/assets/get-unapproved-assets.ts index 33febb6..2ab36f3 100644 --- a/src/v2/routes/auth/assets/getUnapprovedAssets.ts +++ b/src/v2/routes/auth/assets/get-unapproved-assets.ts @@ -1,7 +1,7 @@ -import { responseHeaders } from "@/v2/lib/responseHeaders" +import { responseHeaders } from "@/v2/lib/response-headers" import { getConnection } from "@/v2/db/turso" import { auth } from "@/v2/lib/auth/lucia" -import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" +import { roleFlagsToArray } from "@/v2/lib/helpers/role-flags" export async function getUnapprovedAssets(c: APIContext): Promise { const authRequest = auth(c.env).handleRequest(c) diff --git a/src/v2/routes/auth/assets/modifyAsset.ts b/src/v2/routes/auth/assets/modify-asset.ts similarity index 95% rename from src/v2/routes/auth/assets/modifyAsset.ts rename to src/v2/routes/auth/assets/modify-asset.ts index d83c619..8825048 100644 --- a/src/v2/routes/auth/assets/modifyAsset.ts +++ b/src/v2/routes/auth/assets/modify-asset.ts @@ -1,10 +1,10 @@ -import { responseHeaders } from "@/v2/lib/responseHeaders" +import { responseHeaders } from "@/v2/lib/response-headers" import { getConnection } from "@/v2/db/turso" import { assetTagAsset, assets } from "@/v2/db/schema" import { eq } from "drizzle-orm" -import { SplitQueryByCommas } from "@/v2/lib/helpers/splitQueryByCommas" +import { SplitQueryByCommas } from "@/v2/lib/helpers/split-query-by-commas" import { auth } from "@/v2/lib/auth/lucia" -import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" +import { roleFlagsToArray } from "@/v2/lib/helpers/role-flags" export async function modifyAssetData(c: APIContext): Promise { const { assetIdToModify } = c.req.param() diff --git a/src/v2/routes/auth/assets/uploadAsset.ts b/src/v2/routes/auth/assets/upload-asset.ts similarity index 98% rename from src/v2/routes/auth/assets/uploadAsset.ts rename to src/v2/routes/auth/assets/upload-asset.ts index d4953d6..88f7b1d 100644 --- a/src/v2/routes/auth/assets/uploadAsset.ts +++ b/src/v2/routes/auth/assets/upload-asset.ts @@ -8,7 +8,7 @@ import { } from "@/v2/db/schema" import { z } from "zod" import { eq } from "drizzle-orm" -import { SplitQueryByCommas } from "@/v2/lib/helpers/splitQueryByCommas" +import { SplitQueryByCommas } from "@/v2/lib/helpers/split-query-by-commas" const MAX_FILE_SIZE = 5000 const ACCEPTED_IMAGE_TYPES = ["image/png"] diff --git a/src/v2/routes/auth/authRoutes.ts b/src/v2/routes/auth/auth-routes.ts similarity index 76% rename from src/v2/routes/auth/authRoutes.ts rename to src/v2/routes/auth/auth-routes.ts index dee08c2..112ff3e 100644 --- a/src/v2/routes/auth/authRoutes.ts +++ b/src/v2/routes/auth/auth-routes.ts @@ -4,14 +4,14 @@ import { logout } from "./logout" import { signup } from "./signup" import { cors } from "hono/cors" import { validate } from "./validate" -import { verifyEmail } from "./verifyEmail" -import { resetPassword, generatePasswordResetToken } from "./resetPassword" -import assetCategoryRoute from "./asset-categories/assetCategoryRoutes" -import assetRoute from "./assets/assetRoutes" -import ocGeneratorRoute from "./oc-generators/ocGeneratorRoutes" -import gameRoute from "./games/gameRoutes" -import tagRoute from "./tags/tagRoutes" -import userAttributesRoute from "./user-attributes/userAttributesRoutes" +import { verifyEmail } from "./verify-email" +import { resetPassword, generatePasswordResetToken } from "./reset-password" +import assetCategoryRoute from "./asset-categories/asset-category-routes" +import assetRoute from "./assets/asset-routes" +import ocGeneratorRoute from "./oc-generators/oc-generator-routes" +import gameRoute from "./games/game-routes" +import tagRoute from "./tags/tag-routes" +import userAttributesRoute from "./user-attributes/user-attributes-routes" const authRoute = new Hono<{ Bindings: Bindings }>() diff --git a/src/v2/routes/auth/games/createGame.ts b/src/v2/routes/auth/games/create-game.ts similarity index 96% rename from src/v2/routes/auth/games/createGame.ts rename to src/v2/routes/auth/games/create-game.ts index 475efcd..91ace1b 100644 --- a/src/v2/routes/auth/games/createGame.ts +++ b/src/v2/routes/auth/games/create-game.ts @@ -1,5 +1,5 @@ import { auth } from "@/v2/lib/auth/lucia" -import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" +import { roleFlagsToArray } from "@/v2/lib/helpers/role-flags" import { getConnection } from "@/v2/db/turso" import { game } from "@/v2/db/schema" diff --git a/src/v2/routes/auth/games/deleteGame.ts b/src/v2/routes/auth/games/delete-game.ts similarity index 95% rename from src/v2/routes/auth/games/deleteGame.ts rename to src/v2/routes/auth/games/delete-game.ts index 2ef5f64..62826b6 100644 --- a/src/v2/routes/auth/games/deleteGame.ts +++ b/src/v2/routes/auth/games/delete-game.ts @@ -1,5 +1,5 @@ import { auth } from "@/v2/lib/auth/lucia" -import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" +import { roleFlagsToArray } from "@/v2/lib/helpers/role-flags" import { getConnection } from "@/v2/db/turso" import { z } from "zod" import { game } from "@/v2/db/schema" diff --git a/src/v2/routes/auth/games/gameRoutes.ts b/src/v2/routes/auth/games/game-routes.ts similarity index 83% rename from src/v2/routes/auth/games/gameRoutes.ts rename to src/v2/routes/auth/games/game-routes.ts index 0b829df..97d61b4 100644 --- a/src/v2/routes/auth/games/gameRoutes.ts +++ b/src/v2/routes/auth/games/game-routes.ts @@ -1,5 +1,5 @@ -import { createGame } from "./createGame" -import { deleteGame } from "./deleteGame" +import { createGame } from "./create-game" +import { deleteGame } from "./delete-game" import { Hono } from "hono" import { cors } from "hono/cors" diff --git a/src/v2/routes/auth/oc-generators/deleteOCGeneratorResponse.ts b/src/v2/routes/auth/oc-generators/delete-oc-generator-response.ts similarity index 100% rename from src/v2/routes/auth/oc-generators/deleteOCGeneratorResponse.ts rename to src/v2/routes/auth/oc-generators/delete-oc-generator-response.ts diff --git a/src/v2/routes/auth/oc-generators/ocGeneratorRoutes.ts b/src/v2/routes/auth/oc-generators/oc-generator-routes.ts similarity index 73% rename from src/v2/routes/auth/oc-generators/ocGeneratorRoutes.ts rename to src/v2/routes/auth/oc-generators/oc-generator-routes.ts index 3ad067d..18bf210 100644 --- a/src/v2/routes/auth/oc-generators/ocGeneratorRoutes.ts +++ b/src/v2/routes/auth/oc-generators/oc-generator-routes.ts @@ -1,6 +1,6 @@ -import { saveOCGeneratorResponse } from "./saveOCGeneratorResponse" -import { deleteOCGeneratorResponse } from "./deleteOCGeneratorResponse" -import { viewOCGeneratorResponses } from "./viewOCGeneratorResponses" +import { saveOCGeneratorResponse } from "./save-oc-generator-response" +import { deleteOCGeneratorResponse } from "./delete-oc-generator-response" +import { viewOCGeneratorResponses } from "./view-oc-generator-response" import { Hono } from "hono" import { cors } from "hono/cors" diff --git a/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts b/src/v2/routes/auth/oc-generators/save-oc-generator-response.ts similarity index 98% rename from src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts rename to src/v2/routes/auth/oc-generators/save-oc-generator-response.ts index b8b2f4d..34bf259 100644 --- a/src/v2/routes/auth/oc-generators/saveOCGeneratorResponse.ts +++ b/src/v2/routes/auth/oc-generators/save-oc-generator-response.ts @@ -1,5 +1,5 @@ import { auth } from "@/v2/lib/auth/lucia" -import { listBucket } from "@/v2/lib/listBucket" +import { listBucket } from "@/v2/lib/list-bucket" import { savedOcGenerators } from "@/v2/db/schema" import { getConnection } from "@/v2/db/turso" import { z } from "zod" diff --git a/src/v2/routes/auth/oc-generators/viewOCGeneratorResponses.ts b/src/v2/routes/auth/oc-generators/view-oc-generator-response.ts similarity index 100% rename from src/v2/routes/auth/oc-generators/viewOCGeneratorResponses.ts rename to src/v2/routes/auth/oc-generators/view-oc-generator-response.ts diff --git a/src/v2/routes/auth/resetPassword.ts b/src/v2/routes/auth/reset-password.ts similarity index 100% rename from src/v2/routes/auth/resetPassword.ts rename to src/v2/routes/auth/reset-password.ts diff --git a/src/v2/routes/auth/tags/createTag.ts b/src/v2/routes/auth/tags/create-tag.ts similarity index 97% rename from src/v2/routes/auth/tags/createTag.ts rename to src/v2/routes/auth/tags/create-tag.ts index a8b50ac..56827b5 100644 --- a/src/v2/routes/auth/tags/createTag.ts +++ b/src/v2/routes/auth/tags/create-tag.ts @@ -1,5 +1,5 @@ import { auth } from "@/v2/lib/auth/lucia" -import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" +import { roleFlagsToArray } from "@/v2/lib/helpers/role-flags" import { getConnection } from "@/v2/db/turso" import { z } from "zod" import { assetTag } from "@/v2/db/schema" diff --git a/src/v2/routes/auth/tags/deleteTag.ts b/src/v2/routes/auth/tags/delete-tag.ts similarity index 96% rename from src/v2/routes/auth/tags/deleteTag.ts rename to src/v2/routes/auth/tags/delete-tag.ts index e0be00f..5d2050d 100644 --- a/src/v2/routes/auth/tags/deleteTag.ts +++ b/src/v2/routes/auth/tags/delete-tag.ts @@ -1,5 +1,5 @@ import { auth } from "@/v2/lib/auth/lucia" -import { roleFlagsToArray } from "@/v2/lib/helpers/roleFlags" +import { roleFlagsToArray } from "@/v2/lib/helpers/role-flags" import { getConnection } from "@/v2/db/turso" import { z } from "zod" import { assetTag } from "@/v2/db/schema" diff --git a/src/v2/routes/auth/tags/tagRoutes.ts b/src/v2/routes/auth/tags/tag-routes.ts similarity index 83% rename from src/v2/routes/auth/tags/tagRoutes.ts rename to src/v2/routes/auth/tags/tag-routes.ts index 09148ad..a18c9be 100644 --- a/src/v2/routes/auth/tags/tagRoutes.ts +++ b/src/v2/routes/auth/tags/tag-routes.ts @@ -1,5 +1,5 @@ -import { createTag } from "./createTag" -import { deleteTag } from "./deleteTag" +import { createTag } from "./create-tag" +import { deleteTag } from "./delete-tag" import { Hono } from "hono" import { cors } from "hono/cors" diff --git a/src/v2/routes/auth/user-attributes/self-upload/uploadAvatar.ts b/src/v2/routes/auth/user-attributes/self-upload/upload-avatar.ts similarity index 100% rename from src/v2/routes/auth/user-attributes/self-upload/uploadAvatar.ts rename to src/v2/routes/auth/user-attributes/self-upload/upload-avatar.ts diff --git a/src/v2/routes/auth/user-attributes/self-upload/uploadBanner.ts b/src/v2/routes/auth/user-attributes/self-upload/upload-banner.ts similarity index 100% rename from src/v2/routes/auth/user-attributes/self-upload/uploadBanner.ts rename to src/v2/routes/auth/user-attributes/self-upload/upload-banner.ts diff --git a/src/v2/routes/auth/user-attributes/updateUserAttributes.ts b/src/v2/routes/auth/user-attributes/update-user-attributes.ts similarity index 100% rename from src/v2/routes/auth/user-attributes/updateUserAttributes.ts rename to src/v2/routes/auth/user-attributes/update-user-attributes.ts diff --git a/src/v2/routes/auth/user-attributes/userAttributesRoutes.ts b/src/v2/routes/auth/user-attributes/user-attributes-routes.ts similarity index 70% rename from src/v2/routes/auth/user-attributes/userAttributesRoutes.ts rename to src/v2/routes/auth/user-attributes/user-attributes-routes.ts index 8754d7a..34a6d66 100644 --- a/src/v2/routes/auth/user-attributes/userAttributesRoutes.ts +++ b/src/v2/routes/auth/user-attributes/user-attributes-routes.ts @@ -1,8 +1,8 @@ -import { updateUserAttributes } from "./updateUserAttributes" -import { uploadProfileImage } from "./self-upload/uploadAvatar" -import { uploadBannerImage } from "./self-upload/uploadBanner" -import { followUser } from "./user-relations/followUser" -import { unfollowUser } from "./user-relations/unfollowUser" +import { updateUserAttributes } from "./update-user-attributes" +import { uploadProfileImage } from "./self-upload/upload-avatar" +import { uploadBannerImage } from "./self-upload/upload-banner" +import { followUser } from "./user-relations/follow-user" +import { unfollowUser } from "./user-relations/unfollow-user" import { Hono } from "hono" import { cors } from "hono/cors" diff --git a/src/v2/routes/auth/user-attributes/user-relations/followUser.ts b/src/v2/routes/auth/user-attributes/user-relations/follow-user.ts similarity index 100% rename from src/v2/routes/auth/user-attributes/user-relations/followUser.ts rename to src/v2/routes/auth/user-attributes/user-relations/follow-user.ts diff --git a/src/v2/routes/auth/user-attributes/user-relations/unfollowUser.ts b/src/v2/routes/auth/user-attributes/user-relations/unfollow-user.ts similarity index 100% rename from src/v2/routes/auth/user-attributes/user-relations/unfollowUser.ts rename to src/v2/routes/auth/user-attributes/user-relations/unfollow-user.ts diff --git a/src/v2/routes/auth/verifyEmail.ts b/src/v2/routes/auth/verify-email.ts similarity index 100% rename from src/v2/routes/auth/verifyEmail.ts rename to src/v2/routes/auth/verify-email.ts diff --git a/src/v2/routes/discord/contributors.ts b/src/v2/routes/discord/contributors.ts index 2c0d0db..d30a043 100644 --- a/src/v2/routes/discord/contributors.ts +++ b/src/v2/routes/discord/contributors.ts @@ -1,4 +1,4 @@ -import { responseHeaders } from "@/v2/lib/responseHeaders" +import { responseHeaders } from "@/v2/lib/response-headers" import { roles, guildId } from "@/v2/lib/discord" import type { Contributor, GuildMember } from "@/v2/lib/types/discord" diff --git a/src/v2/routes/discord/discordRoutes.ts b/src/v2/routes/discord/discord-routes.ts similarity index 100% rename from src/v2/routes/discord/discordRoutes.ts rename to src/v2/routes/discord/discord-routes.ts diff --git a/src/v2/routes/games/allGames.ts b/src/v2/routes/games/all-games.ts similarity index 92% rename from src/v2/routes/games/allGames.ts rename to src/v2/routes/games/all-games.ts index b117e3c..fcc257a 100644 --- a/src/v2/routes/games/allGames.ts +++ b/src/v2/routes/games/all-games.ts @@ -1,6 +1,6 @@ -import { responseHeaders } from "@/v2/lib/responseHeaders" +import { responseHeaders } from "@/v2/lib/response-headers" import { getConnection } from "@/v2/db/turso" -import { listBucket } from "@/v2/lib/listBucket" +import { listBucket } from "@/v2/lib/list-bucket" import { game } from "@/v2/db/schema" export async function getAllGames(c: APIContext): Promise { diff --git a/src/v2/routes/games/gamesRoutes.ts b/src/v2/routes/games/games-routes.ts similarity index 80% rename from src/v2/routes/games/gamesRoutes.ts rename to src/v2/routes/games/games-routes.ts index bb64792..2f13546 100644 --- a/src/v2/routes/games/gamesRoutes.ts +++ b/src/v2/routes/games/games-routes.ts @@ -1,5 +1,5 @@ import { Hono } from "hono" -import { getAllGames } from "./allGames" +import { getAllGames } from "./all-games" const gameRoute = new Hono<{ Bindings: Bindings }>() diff --git a/src/v2/routes/oc-generators/getGenerator.ts b/src/v2/routes/oc-generators/get-generator.ts similarity index 89% rename from src/v2/routes/oc-generators/getGenerator.ts rename to src/v2/routes/oc-generators/get-generator.ts index ff783fd..6f10db5 100644 --- a/src/v2/routes/oc-generators/getGenerator.ts +++ b/src/v2/routes/oc-generators/get-generator.ts @@ -1,6 +1,6 @@ -import { responseHeaders } from "@/v2/lib/responseHeaders" -import { listBucket } from "@/v2/lib/listBucket" -import { createNotFoundResponse } from "@/v2/lib/helpers/responses/notFoundResponse" +import { responseHeaders } from "@/v2/lib/response-headers" +import { listBucket } from "@/v2/lib/list-bucket" +import { createNotFoundResponse } from "@/v2/lib/helpers/responses/not-found" export async function getGeneratorFromName(c: APIContext): Promise { const { gameName } = c.req.param() diff --git a/src/v2/routes/oc-generators/getGenerators.ts b/src/v2/routes/oc-generators/get-generators.ts similarity index 91% rename from src/v2/routes/oc-generators/getGenerators.ts rename to src/v2/routes/oc-generators/get-generators.ts index 3c903bb..8918c7a 100644 --- a/src/v2/routes/oc-generators/getGenerators.ts +++ b/src/v2/routes/oc-generators/get-generators.ts @@ -1,5 +1,5 @@ -import { responseHeaders } from "@/v2/lib/responseHeaders" -import { listBucket } from "@/v2/lib/listBucket" +import { responseHeaders } from "@/v2/lib/response-headers" +import { listBucket } from "@/v2/lib/list-bucket" export async function getGenerators(c: APIContext): Promise { const cacheKey = new Request(c.req.url.toString(), c.req) diff --git a/src/v2/routes/oc-generators/ocGeneratorRoutes.ts b/src/v2/routes/oc-generators/oc-generator-routes.ts similarity index 73% rename from src/v2/routes/oc-generators/ocGeneratorRoutes.ts rename to src/v2/routes/oc-generators/oc-generator-routes.ts index de4dab0..4e7d866 100644 --- a/src/v2/routes/oc-generators/ocGeneratorRoutes.ts +++ b/src/v2/routes/oc-generators/oc-generator-routes.ts @@ -1,6 +1,6 @@ import { Hono } from "hono" -import { getGeneratorFromName } from "./getGenerator" -import { getGenerators } from "./getGenerators" +import { getGeneratorFromName } from "./get-generator" +import { getGenerators } from "./get-generators" const ocGeneratorRoute = new Hono<{ Bindings: Bindings }>() diff --git a/src/v2/routes/search/all/searchAll.ts b/src/v2/routes/search/all/search-all.ts similarity index 98% rename from src/v2/routes/search/all/searchAll.ts rename to src/v2/routes/search/all/search-all.ts index cb085d9..9e72af8 100644 --- a/src/v2/routes/search/all/searchAll.ts +++ b/src/v2/routes/search/all/search-all.ts @@ -1,4 +1,4 @@ -import { responseHeaders } from "@/v2/lib/responseHeaders" +import { responseHeaders } from "@/v2/lib/response-headers" import { getConnection } from "@/v2/db/turso" import { like, eq } from "drizzle-orm" diff --git a/src/v2/routes/search/asset/recentAssets.ts b/src/v2/routes/search/asset/recent-assets.ts similarity index 94% rename from src/v2/routes/search/asset/recentAssets.ts rename to src/v2/routes/search/asset/recent-assets.ts index 6747748..f7fbcc9 100644 --- a/src/v2/routes/search/asset/recentAssets.ts +++ b/src/v2/routes/search/asset/recent-assets.ts @@ -1,4 +1,4 @@ -import { responseHeaders } from "@/v2/lib/responseHeaders" +import { responseHeaders } from "@/v2/lib/response-headers" import { getConnection } from "@/v2/db/turso" import { desc } from "drizzle-orm" diff --git a/src/v2/routes/search/asset/searchAssets.ts b/src/v2/routes/search/asset/search-assets.ts similarity index 95% rename from src/v2/routes/search/asset/searchAssets.ts rename to src/v2/routes/search/asset/search-assets.ts index 7ed2c9d..bc0e6eb 100644 --- a/src/v2/routes/search/asset/searchAssets.ts +++ b/src/v2/routes/search/asset/search-assets.ts @@ -1,8 +1,8 @@ -import { responseHeaders } from "@/v2/lib/responseHeaders" +import { responseHeaders } from "@/v2/lib/response-headers" import { getConnection } from "@/v2/db/turso" import { assetTagAsset, assets, assetTag, users } from "@/v2/db/schema" import { desc, like, sql, eq, and, or } from "drizzle-orm" -import { SplitQueryByCommas } from "@/v2/lib/helpers/splitQueryByCommas" +import { SplitQueryByCommas } from "@/v2/lib/helpers/split-query-by-commas" export async function searchForAssets(c: APIContext): Promise { const cacheKey = new Request(c.req.url.toString(), c.req) diff --git a/src/v2/routes/search/searchRoutes.ts b/src/v2/routes/search/search-routes.ts similarity index 73% rename from src/v2/routes/search/searchRoutes.ts rename to src/v2/routes/search/search-routes.ts index 443da02..2d2ddba 100644 --- a/src/v2/routes/search/searchRoutes.ts +++ b/src/v2/routes/search/search-routes.ts @@ -1,10 +1,10 @@ import { Hono } from "hono" -import { searchAll } from "./all/searchAll" -import { getUserByUsername } from "./user/getUserByUsername" -import { getUsersBySearch } from "./user/getUsersBySearch" -import authRoute from "../auth/authRoutes" -import { searchForAssets } from "./asset/searchAssets" -import { recentAssets } from "./asset/recentAssets" +import { searchAll } from "./all/search-all" +import { getUserByUsername } from "./user/get-user-by-username" +import { getUsersBySearch } from "./user/get-users-by-search" +import authRoute from "../auth/auth-routes" +import { searchForAssets } from "./asset/search-assets" +import { recentAssets } from "./asset/recent-assets" import { cors } from "hono/cors" const searchRoute = new Hono<{ Bindings: Bindings }>() diff --git a/src/v2/routes/search/user/getUserByUsername.ts b/src/v2/routes/search/user/get-user-by-username.ts similarity index 94% rename from src/v2/routes/search/user/getUserByUsername.ts rename to src/v2/routes/search/user/get-user-by-username.ts index bcf5a09..33adc74 100644 --- a/src/v2/routes/search/user/getUserByUsername.ts +++ b/src/v2/routes/search/user/get-user-by-username.ts @@ -1,12 +1,12 @@ -import { responseHeaders } from "@/v2/lib/responseHeaders" +import { responseHeaders } from "@/v2/lib/response-headers" import { getConnection } from "@/v2/db/turso" -import { createNotFoundResponse } from "@/v2/lib/helpers/responses/notFoundResponse" +import { createNotFoundResponse } from "@/v2/lib/helpers/responses/not-found" import { auth } from "@/v2/lib/auth/lucia" import { roleFlagsToArray, SelfAssignableRoleFlagsToArray, -} from "@/v2/lib/helpers/roleFlags" +} from "@/v2/lib/helpers/role-flags" export async function getUserByUsername(c: APIContext): Promise { const { username } = c.req.param() diff --git a/src/v2/routes/search/user/getUsersBySearch.ts b/src/v2/routes/search/user/get-users-by-search.ts similarity index 100% rename from src/v2/routes/search/user/getUsersBySearch.ts rename to src/v2/routes/search/user/get-users-by-search.ts diff --git a/src/v2/routes/tags/allTags.ts b/src/v2/routes/tags/all-tags.ts similarity index 100% rename from src/v2/routes/tags/allTags.ts rename to src/v2/routes/tags/all-tags.ts diff --git a/src/v2/routes/tags/getTagById.ts b/src/v2/routes/tags/get-tag-by-id.ts similarity index 100% rename from src/v2/routes/tags/getTagById.ts rename to src/v2/routes/tags/get-tag-by-id.ts diff --git a/src/v2/routes/tags/getTagByName.ts b/src/v2/routes/tags/get-tag-by-name.ts similarity index 100% rename from src/v2/routes/tags/getTagByName.ts rename to src/v2/routes/tags/get-tag-by-name.ts diff --git a/src/v2/routes/tags/tagsRoutes.ts b/src/v2/routes/tags/tags-routes.ts similarity index 69% rename from src/v2/routes/tags/tagsRoutes.ts rename to src/v2/routes/tags/tags-routes.ts index 37efd11..457dc85 100644 --- a/src/v2/routes/tags/tagsRoutes.ts +++ b/src/v2/routes/tags/tags-routes.ts @@ -1,7 +1,7 @@ import { Hono } from "hono" -import { listAllassetTag } from "./allTags" -import { getTagById } from "./getTagById" -import { getTagByName } from "./getTagByName" +import { listAllassetTag } from "./all-tags" +import { getTagById } from "./get-tag-by-id" +import { getTagByName } from "./get-tag-by-name" const tagsRoute = new Hono<{ Bindings: Bindings }>() From 9b12ea46872dbaf69fee3cbe16991849859efb45 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 29 Oct 2023 12:00:59 +0000 Subject: [PATCH 124/318] fallback tag to crud --- src/scripts/migrate/migrate.ts | 4 ++-- src/v2/db/turso.ts | 12 ++++-------- src/v2/routes/tags/all-tags.ts | 11 +++++++---- src/v2/routes/tags/get-tag-by-id.ts | 13 ++++++++----- src/v2/routes/tags/get-tag-by-name.ts | 13 ++++++++----- src/worker-configuration.d.ts | 8 +++----- 6 files changed, 32 insertions(+), 29 deletions(-) diff --git a/src/scripts/migrate/migrate.ts b/src/scripts/migrate/migrate.ts index f4a6940..aa41f6f 100644 --- a/src/scripts/migrate/migrate.ts +++ b/src/scripts/migrate/migrate.ts @@ -6,8 +6,8 @@ import "dotenv/config" const { TURSO_DATABASE_AUTH_TOKEN, TURSO_DATABASE_URL } = process.env const client = createClient({ - url: TURSO_DATABASE_URL as string, - authToken: TURSO_DATABASE_AUTH_TOKEN as string, + url: TURSO_DATABASE_URL, + authToken: TURSO_DATABASE_AUTH_TOKEN, }) const db = drizzleORM(client) diff --git a/src/v2/db/turso.ts b/src/v2/db/turso.ts index 3c128e7..f3545d7 100644 --- a/src/v2/db/turso.ts +++ b/src/v2/db/turso.ts @@ -8,11 +8,7 @@ import { Logger } from "drizzle-orm/logger" * It logs the query and its parameters to the console. */ class LoggerWrapper implements Logger { - /** - * Logs the query and its parameters to the console. - * @param query - The SQL query string. - * @param params - The parameters passed to the query. - */ + // TODO(dromzeh): this is useful to log; should probably be logged elsewhere logQuery(query: string, params: unknown[]): void { console.log(`DRIZZLE: Query: ${query}, Paremeters: ${params ?? "none"}`) } @@ -26,6 +22,7 @@ class LoggerWrapper implements Logger { export function getConnection(env: Bindings) { /** * The `turso` client is created using the `createClient` function from `@libsql/client/web`. + * When running in dev, you don't need to pass `authToken`. */ const turso = createClient({ url: env.TURSO_DATABASE_URL, @@ -33,9 +30,8 @@ export function getConnection(env: Bindings) { }) /** - * The `drizzle` instance is created using the `drizzleORM` function from `drizzle-orm/libsql`. - * It is initialized with the `turso` client and the `schema` object. - * A `LoggerWrapper` instance is also passed to the `logger` option to customize the logging behavior. + * Drizzle instance is initialized with the `turso` client and database `schema`. + * The `LoggerWrapper` is passed to the `logger` option to log queries to the console. */ const drizzle = drizzleORM(turso, { schema, diff --git a/src/v2/routes/tags/all-tags.ts b/src/v2/routes/tags/all-tags.ts index d2b3c75..ef05572 100644 --- a/src/v2/routes/tags/all-tags.ts +++ b/src/v2/routes/tags/all-tags.ts @@ -1,4 +1,6 @@ import { getConnection } from "@/v2/db/turso" +import { assetTag } from "@/v2/db/schema" +import { asc } from "drizzle-orm" export async function listAllassetTag(c: APIContext): Promise { const cacheKey = new Request(c.req.url.toString(), c.req) @@ -9,15 +11,16 @@ export async function listAllassetTag(c: APIContext): Promise { const { drizzle } = getConnection(c.env) - const allassetTag = await drizzle.query.assetTag.findMany({ - orderBy: (assetTag) => assetTag.name, - }) + const result = await drizzle + .select() + .from(assetTag) + .orderBy(asc(assetTag.name)) response = c.json( { success: true, status: "ok", - allassetTag, + result, }, 200 ) diff --git a/src/v2/routes/tags/get-tag-by-id.ts b/src/v2/routes/tags/get-tag-by-id.ts index 0d481a6..e27d490 100644 --- a/src/v2/routes/tags/get-tag-by-id.ts +++ b/src/v2/routes/tags/get-tag-by-id.ts @@ -1,4 +1,6 @@ +import { assetTag } from "@/v2/db/schema" import { getConnection } from "@/v2/db/turso" +import { eq } from "drizzle-orm" export async function getTagById(c: APIContext): Promise { const cacheKey = new Request(c.req.url.toString(), c.req) @@ -9,20 +11,21 @@ export async function getTagById(c: APIContext): Promise { const { drizzle } = getConnection(c.env) - const assetTag = await drizzle.query.assetTag.findFirst({ - where: (assetTag, { eq }) => eq(assetTag.id, c.req.param("id")), - }) + const result = await drizzle + .select() + .from(assetTag) + .where(eq(assetTag.name, c.req.param("id"))) response = c.json( { success: true, status: "ok", - assetTag, + result, }, 200 ) - response.headers.set("Cache-Control", "s-maxage=604800") + response.headers.set("Cache-Control", "s-maxage=120") await cache.put(cacheKey, response.clone()) return response diff --git a/src/v2/routes/tags/get-tag-by-name.ts b/src/v2/routes/tags/get-tag-by-name.ts index edabbc8..21aa003 100644 --- a/src/v2/routes/tags/get-tag-by-name.ts +++ b/src/v2/routes/tags/get-tag-by-name.ts @@ -1,4 +1,6 @@ import { getConnection } from "@/v2/db/turso" +import { eq } from "drizzle-orm" +import { assetTag } from "@/v2/db/schema" export async function getTagByName(c: APIContext): Promise { const cacheKey = new Request(c.req.url.toString(), c.req) @@ -9,20 +11,21 @@ export async function getTagByName(c: APIContext): Promise { const { drizzle } = getConnection(c.env) - const assetTag = await drizzle.query.assetTag.findFirst({ - where: (assetTag, { eq }) => eq(assetTag.name, c.req.param("name")), - }) + const result = await drizzle + .select() + .from(assetTag) + .where(eq(assetTag.name, c.req.param("name"))) response = c.json( { success: true, status: "ok", - assetTag, + result, }, 200 ) - response.headers.set("Cache-Control", "s-maxage=604800") + response.headers.set("Cache-Control", "s-maxage=120") await cache.put(cacheKey, response.clone()) return response diff --git a/src/worker-configuration.d.ts b/src/worker-configuration.d.ts index 4a8ea65..04ea22c 100644 --- a/src/worker-configuration.d.ts +++ b/src/worker-configuration.d.ts @@ -1,7 +1,6 @@ declare global { /** - * The `Bindings` type is used to define the shape of the environment variables that are used by the application. - * It includes properties for the Discord token, R2 bucket, current environment, and necessary Database credentials for Turso. + * Environment variables that are required by the API. */ type Bindings = { DISCORD_TOKEN: string @@ -18,12 +17,11 @@ declare global { } /** - * The `APIContext` type is used to provide access to the request context within routes that are separated into individual functions. + * Provides access to the request context within routes that are separated into individual functions. */ type APIContext = import("hono").Context<{ Bindings: Bindings }> } -// This allows the types to be defined in the global scope throughout the API. Do not remove. -export {} +export default global From 3d9e12279cea87653ae75d39b993cabab83c5f97 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Mon, 30 Oct 2023 01:46:11 +0000 Subject: [PATCH 125/318] convert assetstatus typing --- src/v2/db/schema/asset/asset.ts | 7 ++++++- src/v2/routes/asset/get-asset-from-id.ts | 4 ++-- src/v2/routes/auth/assets/approve-asset.ts | 6 +++--- .../auth/assets/collections/add-asset-to-collection.ts | 5 ++++- src/v2/routes/auth/assets/favorite/add-favorite-asset.ts | 5 ++++- src/v2/routes/auth/assets/get-unapproved-assets.ts | 2 +- src/v2/routes/auth/assets/upload-asset.ts | 3 ++- src/v2/routes/search/asset/recent-assets.ts | 2 +- src/v2/routes/search/asset/search-assets.ts | 2 +- 9 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/v2/db/schema/asset/asset.ts b/src/v2/db/schema/asset/asset.ts index ce76559..67c0c2c 100644 --- a/src/v2/db/schema/asset/asset.ts +++ b/src/v2/db/schema/asset/asset.ts @@ -22,6 +22,8 @@ NOTE: Assets have a lot of relations, and can be quite complex in some cases. Then, they are also used as relations when adding to collections or favorites. */ +export type AssetStatus = "pending" | "approved" | "rejected" + export const assets = sqliteTable( tableNames.assets, { @@ -41,7 +43,10 @@ export const assets = sqliteTable( onDelete: "cascade", }), url: text("url").notNull(), - status: integer("status").notNull(), + status: text("status") + .$type() + .default("pending") + .notNull(), uploadedById: text("uploaded_by").references(() => users.id, { onUpdate: "cascade", onDelete: "cascade", diff --git a/src/v2/routes/asset/get-asset-from-id.ts b/src/v2/routes/asset/get-asset-from-id.ts index d40e615..c38216b 100644 --- a/src/v2/routes/asset/get-asset-from-id.ts +++ b/src/v2/routes/asset/get-asset-from-id.ts @@ -14,7 +14,7 @@ export async function getAssetFromId(c: APIContext): Promise { const asset = await drizzle.query.assets.findFirst({ where: (assets, { eq, and }) => - and(eq(assets.status, 1), eq(assets.id, parseInt(id))), + and(eq(assets.status, "approved"), eq(assets.id, parseInt(id))), with: { assetTagAsset: { with: { @@ -47,7 +47,7 @@ export async function getAssetFromId(c: APIContext): Promise { const similarAssets = await drizzle.query.assets.findMany({ where: (assets, { eq, and }) => and( - eq(assets.status, 1), + eq(assets.status, "approved"), eq(assets.assetCategory, asset.assetCategory) ), limit: 6, diff --git a/src/v2/routes/auth/assets/approve-asset.ts b/src/v2/routes/auth/assets/approve-asset.ts index c49bfe4..d938fe4 100644 --- a/src/v2/routes/auth/assets/approve-asset.ts +++ b/src/v2/routes/auth/assets/approve-asset.ts @@ -1,6 +1,6 @@ import { responseHeaders } from "@/v2/lib/response-headers" import { getConnection } from "@/v2/db/turso" -import { assets } from "@/v2/db/schema" +import { assets, AssetStatus } from "@/v2/db/schema" import { eq } from "drizzle-orm" import { auth } from "@/v2/lib/auth/lucia" @@ -31,7 +31,7 @@ export async function approveAsset(c: APIContext): Promise { where: (assets, { eq }) => eq(assets.id, parseInt(assetIdToApprove)), }) - if (!asset || asset.status === 1) { + if (!asset || asset.status === "approved") { c.json( { success: false, state: "asset not found or already approved" }, 200 @@ -41,7 +41,7 @@ export async function approveAsset(c: APIContext): Promise { const updatedAsset = await drizzle .update(assets) .set({ - status: 1, + status: "approved" as AssetStatus, }) .where(eq(assets.id, parseInt(assetIdToApprove))) .execute() diff --git a/src/v2/routes/auth/assets/collections/add-asset-to-collection.ts b/src/v2/routes/auth/assets/collections/add-asset-to-collection.ts index 2a07337..6002bb7 100644 --- a/src/v2/routes/auth/assets/collections/add-asset-to-collection.ts +++ b/src/v2/routes/auth/assets/collections/add-asset-to-collection.ts @@ -70,7 +70,10 @@ export async function addAssetToCollection(c: APIContext): Promise { // check if asset exists, and status is 1 (approved) const assetExists = await drizzle.query.assets.findFirst({ where: (assets, { eq, and }) => - and(eq(assets.id, parseInt(assetId)), eq(assets.status, 1)), + and( + eq(assets.id, parseInt(assetId)), + eq(assets.status, "approved") + ), }) if (!assetExists) { diff --git a/src/v2/routes/auth/assets/favorite/add-favorite-asset.ts b/src/v2/routes/auth/assets/favorite/add-favorite-asset.ts index adc22d6..8709781 100644 --- a/src/v2/routes/auth/assets/favorite/add-favorite-asset.ts +++ b/src/v2/routes/auth/assets/favorite/add-favorite-asset.ts @@ -28,7 +28,10 @@ export async function favoriteAsset(c: APIContext): Promise { // check if asset exists, and status is 1 (approved) const assetExists = await drizzle.query.assets.findFirst({ where: (assets, { eq, and }) => - and(eq(assets.id, parseInt(assetToFavorite)), eq(assets.status, 1)), + and( + eq(assets.id, parseInt(assetToFavorite)), + eq(assets.status, "approved") + ), }) if (!assetExists) { diff --git a/src/v2/routes/auth/assets/get-unapproved-assets.ts b/src/v2/routes/auth/assets/get-unapproved-assets.ts index 2ab36f3..83e9b78 100644 --- a/src/v2/routes/auth/assets/get-unapproved-assets.ts +++ b/src/v2/routes/auth/assets/get-unapproved-assets.ts @@ -25,7 +25,7 @@ export async function getUnapprovedAssets(c: APIContext): Promise { const unApprovedAssets = (await drizzle.query.assets.findMany({ - where: (assets, { eq }) => eq(assets.status, 0), + where: (assets, { eq, not }) => not(eq(assets.status, "approved")), })) ?? [] return c.json( diff --git a/src/v2/routes/auth/assets/upload-asset.ts b/src/v2/routes/auth/assets/upload-asset.ts index 88f7b1d..eb50c6f 100644 --- a/src/v2/routes/auth/assets/upload-asset.ts +++ b/src/v2/routes/auth/assets/upload-asset.ts @@ -5,6 +5,7 @@ import { assetTagAsset, game as gameTable, assetCategory as assetCategoryTable, + AssetStatus, } from "@/v2/db/schema" import { z } from "zod" import { eq } from "drizzle-orm" @@ -90,7 +91,7 @@ export async function uploadAsset(c: APIContext): Promise { assetCategory: formData.data.category, url: `/assets/${formData.data.game}/${formData.data.category}/${formData.data.name}.${formData.data.extension}`, uploadedById: session.user.userId, - status: bypassApproval ? 1 : 2, + status: bypassApproval ? "approved" : ("pending" as AssetStatus), uploadedDate: new Date().getTime(), fileSize: formData.data.size, // stored in bytes width: formData.data.width, diff --git a/src/v2/routes/search/asset/recent-assets.ts b/src/v2/routes/search/asset/recent-assets.ts index f7fbcc9..be6c9e1 100644 --- a/src/v2/routes/search/asset/recent-assets.ts +++ b/src/v2/routes/search/asset/recent-assets.ts @@ -17,7 +17,7 @@ export async function recentAssets(c: APIContext): Promise { const assetResponse = await drizzle.query.assets.findMany({ orderBy: desc(assets.uploadedDate), limit: 100, - where: (assets, { eq }) => eq(assets.status, 1), + where: (assets, { eq }) => eq(assets.status, "approved"), }) response = c.json( diff --git a/src/v2/routes/search/asset/search-assets.ts b/src/v2/routes/search/asset/search-assets.ts index bc0e6eb..0d9b974 100644 --- a/src/v2/routes/search/asset/search-assets.ts +++ b/src/v2/routes/search/asset/search-assets.ts @@ -61,7 +61,7 @@ export async function searchForAssets(c: APIContext): Promise { eq(assets.assetCategory, category) ) ), - eq(assets.status, 1) + eq(assets.status, "approved") ) ) .leftJoin(users, eq(users.id, assets.uploadedById)) From f8778b79705d5231f2ac12f9715abc8bdcc40d51 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Mon, 30 Oct 2023 01:59:30 +0000 Subject: [PATCH 126/318] remove plural asset table name --- src/v2/db/drizzle.ts | 2 +- src/v2/db/schema/asset/asset-categories.ts | 4 +-- src/v2/db/schema/asset/asset-tags.ts | 8 +++--- src/v2/db/schema/asset/asset.ts | 16 ++++++------ src/v2/db/schema/game/game.ts | 4 +-- src/v2/db/schema/user/user-collections.ts | 8 +++--- src/v2/db/schema/user/user-favorites.ts | 8 +++--- src/v2/db/schema/user/user.ts | 4 +-- src/v2/routes/asset/download-asset.ts | 14 +++++----- src/v2/routes/asset/get-asset-from-id.ts | 26 +++++++++---------- src/v2/routes/auth/assets/approve-asset.ts | 12 ++++----- .../collections/add-asset-to-collection.ts | 9 +++---- .../delete-asset-from-collection.ts | 6 ++--- .../assets/favorite/add-favorite-asset.ts | 8 +++--- .../assets/favorite/remove-favorite-asset.ts | 6 ++--- .../auth/assets/get-unapproved-assets.ts | 4 +-- src/v2/routes/auth/assets/modify-asset.ts | 14 +++++----- src/v2/routes/auth/assets/upload-asset.ts | 6 ++--- src/v2/routes/search/all/search-all.ts | 6 ++--- src/v2/routes/search/asset/recent-assets.ts | 8 +++--- src/v2/routes/search/asset/search-assets.ts | 19 +++++++------- 21 files changed, 94 insertions(+), 98 deletions(-) diff --git a/src/v2/db/drizzle.ts b/src/v2/db/drizzle.ts index 4b17fa8..cce8099 100644 --- a/src/v2/db/drizzle.ts +++ b/src/v2/db/drizzle.ts @@ -1,5 +1,5 @@ export const tableNames = { - assets: "assets", + asset: "asset", authKey: "authKey", authSession: "authSession", authUser: "authUser", diff --git a/src/v2/db/schema/asset/asset-categories.ts b/src/v2/db/schema/asset/asset-categories.ts index e7dd7c9..4f123a2 100644 --- a/src/v2/db/schema/asset/asset-categories.ts +++ b/src/v2/db/schema/asset/asset-categories.ts @@ -8,7 +8,7 @@ import { index, } from "drizzle-orm/sqlite-core" import { game } from "../game/game" -import { assets } from "./asset" +import { asset } from "./asset" /* NOTE: This setup can look kinda janky. @@ -74,7 +74,7 @@ export type GameAssetCategory = typeof gameAssetCategory.$inferSelect export type NewGameAssetCategory = typeof gameAssetCategory.$inferInsert export const assetCategoryRelations = relations(assetCategory, ({ many }) => ({ - assets: many(assets), + assets: many(asset), gameAssetCategory: many(gameAssetCategory), })) diff --git a/src/v2/db/schema/asset/asset-tags.ts b/src/v2/db/schema/asset/asset-tags.ts index fa06f45..b7d1430 100644 --- a/src/v2/db/schema/asset/asset-tags.ts +++ b/src/v2/db/schema/asset/asset-tags.ts @@ -7,7 +7,7 @@ import { // uniqueIndex, index, } from "drizzle-orm/sqlite-core" -import { assets } from "./asset" +import { asset } from "./asset" /* NOTE: Asset tags are not stored as ENUMs to allow for better UX, flexibility, and extensibility. @@ -47,7 +47,7 @@ export const assetTagAsset = sqliteTable( }), assetId: integer("asset_id") .notNull() - .references(() => assets.id, { + .references(() => asset.id, { onUpdate: "cascade", onDelete: "cascade", }), @@ -75,8 +75,8 @@ export const assetTagAssetRelations = relations(assetTagAsset, ({ one }) => ({ fields: [assetTagAsset.assetTagId], references: [assetTag.id], }), - asset: one(assets, { + asset: one(asset, { fields: [assetTagAsset.assetId], - references: [assets.id], + references: [asset.id], }), })) diff --git a/src/v2/db/schema/asset/asset.ts b/src/v2/db/schema/asset/asset.ts index 67c0c2c..4a5ca89 100644 --- a/src/v2/db/schema/asset/asset.ts +++ b/src/v2/db/schema/asset/asset.ts @@ -24,8 +24,8 @@ Then, they are also used as relations when adding to collections or favorites. export type AssetStatus = "pending" | "approved" | "rejected" -export const assets = sqliteTable( - tableNames.assets, +export const asset = sqliteTable( + tableNames.asset, { id: integer("id").primaryKey(), // primary key auto increments on sqlite name: text("name").notNull(), @@ -84,21 +84,21 @@ export const assets = sqliteTable( } ) -export type Asset = typeof assets.$inferSelect -export type NewAsset = typeof assets.$inferInsert +export type Asset = typeof asset.$inferSelect +export type NewAsset = typeof asset.$inferInsert -export const assetRelations = relations(assets, ({ one, many }) => ({ +export const assetRelations = relations(asset, ({ one, many }) => ({ uploadedBy: one(users, { - fields: [assets.uploadedById, assets.uploadedByName], + fields: [asset.uploadedById, asset.uploadedByName], references: [users.id, users.username], }), assetTagAsset: many(assetTagAsset), assetCategory: one(assetCategory, { - fields: [assets.assetCategory], + fields: [asset.assetCategory], references: [assetCategory.name], }), game: one(game, { - fields: [assets.game], + fields: [asset.game], references: [game.name], }), })) diff --git a/src/v2/db/schema/game/game.ts b/src/v2/db/schema/game/game.ts index 36ef4b6..ba6c7c1 100644 --- a/src/v2/db/schema/game/game.ts +++ b/src/v2/db/schema/game/game.ts @@ -7,7 +7,7 @@ import { // uniqueIndex, index, } from "drizzle-orm/sqlite-core" -import { assets } from "../asset/asset" +import { asset } from "../asset/asset" import { gameAssetCategory } from "../asset/asset-categories" /* @@ -39,6 +39,6 @@ export type Game = typeof game.$inferSelect export type NewGame = typeof game.$inferInsert export const gameRelations = relations(game, ({ many }) => ({ - assets: many(assets), + assets: many(asset), gameAssetCategory: many(gameAssetCategory), })) diff --git a/src/v2/db/schema/user/user-collections.ts b/src/v2/db/schema/user/user-collections.ts index 64617ef..fdd4bf5 100644 --- a/src/v2/db/schema/user/user-collections.ts +++ b/src/v2/db/schema/user/user-collections.ts @@ -8,7 +8,7 @@ import { index, } from "drizzle-orm/sqlite-core" import { users } from "./user" -import { assets } from "../asset/asset" +import { asset } from "../asset/asset" /* NOTE: this file is where users store their collections of assets. @@ -56,7 +56,7 @@ export const userCollectionAsset = sqliteTable( }), assetId: integer("asset_id") .notNull() - .references(() => assets.id, { + .references(() => asset.id, { onUpdate: "cascade", onDelete: "cascade", }), @@ -97,9 +97,9 @@ export const collectionAssetsRelations = relations( fields: [userCollectionAsset.collectionId], references: [userCollection.id], }), - asset: one(assets, { + asset: one(asset, { fields: [userCollectionAsset.assetId], - references: [assets.id], + references: [asset.id], }), }) ) diff --git a/src/v2/db/schema/user/user-favorites.ts b/src/v2/db/schema/user/user-favorites.ts index 954d89a..1a0cabc 100644 --- a/src/v2/db/schema/user/user-favorites.ts +++ b/src/v2/db/schema/user/user-favorites.ts @@ -8,7 +8,7 @@ import { index, } from "drizzle-orm/sqlite-core" import { users } from "./user" -import { assets } from "../asset/asset" +import { asset } from "../asset/asset" /* NOTE: this file is users favorite assets. @@ -55,7 +55,7 @@ export const userFavoriteAsset = sqliteTable( }), assetId: integer("asset_id") .notNull() - .references(() => assets.id, { + .references(() => asset.id, { onUpdate: "cascade", onDelete: "cascade", }), @@ -92,9 +92,9 @@ export const userFavoriteAssetRelations = relations( fields: [userFavoriteAsset.userFavoriteId], references: [userFavorite.id], }), - asset: one(assets, { + asset: one(asset, { fields: [userFavoriteAsset.assetId], - references: [assets.id], + references: [asset.id], }), }) ) diff --git a/src/v2/db/schema/user/user.ts b/src/v2/db/schema/user/user.ts index ab07f5c..7f2f6a5 100644 --- a/src/v2/db/schema/user/user.ts +++ b/src/v2/db/schema/user/user.ts @@ -8,7 +8,7 @@ import { index, } from "drizzle-orm/sqlite-core" import { userNetworking } from "./user-networking" -import { assets } from "../asset/asset" +import { asset } from "../asset/asset" import { userFavorite } from "./user-favorites" import { savedOcGenerators } from "../oc-generators/oc-generators" import { socialsConnection } from "./user-connections" @@ -85,7 +85,7 @@ export const usersRelations = relations(users, ({ one, many }) => ({ relationName: "following", }), key: many(keys), - assets: many(assets), + assets: many(asset), userFavorite: one(userFavorite), socialsConnection: one(socialsConnection), userCollection: many(userCollection), diff --git a/src/v2/routes/asset/download-asset.ts b/src/v2/routes/asset/download-asset.ts index 8d09bba..fe2631d 100644 --- a/src/v2/routes/asset/download-asset.ts +++ b/src/v2/routes/asset/download-asset.ts @@ -1,25 +1,25 @@ import { getConnection } from "@/v2/db/turso" import { eq } from "drizzle-orm" -import { assets } from "@/v2/db/schema" +import { asset } from "@/v2/db/schema" export async function downloadAsset(c: APIContext): Promise { const { assetId } = c.req.param() const { drizzle } = getConnection(c.env) - const asset = await drizzle.query.assets.findFirst({ - where: (assets, { eq }) => eq(assets.id, parseInt(assetId)), + const foundAsset = await drizzle.query.asset.findFirst({ + where: (asset, { eq }) => eq(asset.id, parseInt(assetId)), }) - if (!asset) { + if (!foundAsset) { return c.json({ success: false, state: "asset not found" }, 200) } try { await drizzle - .update(assets) - .set({ downloadCount: asset.downloadCount + 1 }) - .where(eq(assets.id, parseInt(assetId))) + .update(asset) + .set({ downloadCount: foundAsset.downloadCount + 1 }) + .where(eq(asset.id, parseInt(assetId))) .execute() } catch (e) { return c.json( diff --git a/src/v2/routes/asset/get-asset-from-id.ts b/src/v2/routes/asset/get-asset-from-id.ts index c38216b..d91859f 100644 --- a/src/v2/routes/asset/get-asset-from-id.ts +++ b/src/v2/routes/asset/get-asset-from-id.ts @@ -1,5 +1,5 @@ import { getConnection } from "@/v2/db/turso" -import { assets } from "@/v2/db/schema" +import { asset } from "@/v2/db/schema" import { desc } from "drizzle-orm" export async function getAssetFromId(c: APIContext): Promise { @@ -12,9 +12,9 @@ export async function getAssetFromId(c: APIContext): Promise { const { drizzle } = getConnection(c.env) - const asset = await drizzle.query.assets.findFirst({ - where: (assets, { eq, and }) => - and(eq(assets.status, "approved"), eq(assets.id, parseInt(id))), + const foundAsset = await drizzle.query.asset.findFirst({ + where: (asset, { eq, and }) => + and(eq(asset.status, "approved"), eq(asset.id, parseInt(id))), with: { assetTagAsset: { with: { @@ -30,7 +30,7 @@ export async function getAssetFromId(c: APIContext): Promise { }, }) - if (!asset) { + if (!foundAsset) { response = c.json( { success: false, @@ -42,24 +42,24 @@ export async function getAssetFromId(c: APIContext): Promise { return response } - await drizzle.update(assets).set({ viewCount: asset.viewCount + 1 }) + await drizzle.update(asset).set({ viewCount: foundAsset.viewCount + 1 }) - const similarAssets = await drizzle.query.assets.findMany({ - where: (assets, { eq, and }) => + const similarAssets = await drizzle.query.asset.findMany({ + where: (asset, { eq, and }) => and( - eq(assets.status, "approved"), - eq(assets.assetCategory, asset.assetCategory) + eq(asset.status, "approved"), + eq(asset.assetCategory, foundAsset.assetCategory) ), limit: 6, - orderBy: desc(assets.id), + orderBy: desc(asset.id), }) response = c.json( { success: true, status: "ok", - asset, - similarAssets, + asset: foundAsset, + similarAssets: similarAssets ?? [], }, 200 ) diff --git a/src/v2/routes/auth/assets/approve-asset.ts b/src/v2/routes/auth/assets/approve-asset.ts index d938fe4..103edcb 100644 --- a/src/v2/routes/auth/assets/approve-asset.ts +++ b/src/v2/routes/auth/assets/approve-asset.ts @@ -1,6 +1,6 @@ import { responseHeaders } from "@/v2/lib/response-headers" import { getConnection } from "@/v2/db/turso" -import { assets, AssetStatus } from "@/v2/db/schema" +import { asset, AssetStatus } from "@/v2/db/schema" import { eq } from "drizzle-orm" import { auth } from "@/v2/lib/auth/lucia" @@ -27,11 +27,11 @@ export async function approveAsset(c: APIContext): Promise { const { drizzle } = getConnection(c.env) - const asset = await drizzle.query.assets.findFirst({ - where: (assets, { eq }) => eq(assets.id, parseInt(assetIdToApprove)), + const foundAsset = await drizzle.query.asset.findFirst({ + where: (asset, { eq }) => eq(asset.id, parseInt(assetIdToApprove)), }) - if (!asset || asset.status === "approved") { + if (!foundAsset || foundAsset.status === "approved") { c.json( { success: false, state: "asset not found or already approved" }, 200 @@ -39,11 +39,11 @@ export async function approveAsset(c: APIContext): Promise { } const updatedAsset = await drizzle - .update(assets) + .update(asset) .set({ status: "approved" as AssetStatus, }) - .where(eq(assets.id, parseInt(assetIdToApprove))) + .where(eq(asset.id, parseInt(assetIdToApprove))) .execute() return c.json( diff --git a/src/v2/routes/auth/assets/collections/add-asset-to-collection.ts b/src/v2/routes/auth/assets/collections/add-asset-to-collection.ts index 6002bb7..5b1c8e7 100644 --- a/src/v2/routes/auth/assets/collections/add-asset-to-collection.ts +++ b/src/v2/routes/auth/assets/collections/add-asset-to-collection.ts @@ -68,12 +68,9 @@ export async function addAssetToCollection(c: APIContext): Promise { } // check if asset exists, and status is 1 (approved) - const assetExists = await drizzle.query.assets.findFirst({ - where: (assets, { eq, and }) => - and( - eq(assets.id, parseInt(assetId)), - eq(assets.status, "approved") - ), + const assetExists = await drizzle.query.asset.findFirst({ + where: (asset, { eq, and }) => + and(eq(asset.id, parseInt(assetId)), eq(asset.status, "approved")), }) if (!assetExists) { diff --git a/src/v2/routes/auth/assets/collections/delete-asset-from-collection.ts b/src/v2/routes/auth/assets/collections/delete-asset-from-collection.ts index befc742..843880e 100644 --- a/src/v2/routes/auth/assets/collections/delete-asset-from-collection.ts +++ b/src/v2/routes/auth/assets/collections/delete-asset-from-collection.ts @@ -70,11 +70,11 @@ export async function deleteAssetFromCollection( } // check if asset exists - const assetExists = await drizzle.query.assets.findFirst({ - where: (assets, { eq }) => eq(assets.id, parseInt(collectionId)), + const foundAsset = await drizzle.query.asset.findFirst({ + where: (asset, { eq }) => eq(asset.id, parseInt(collectionId)), }) - if (!assetExists) { + if (!foundAsset) { return c.json({ success: false, state: "asset not found" }, 200) } diff --git a/src/v2/routes/auth/assets/favorite/add-favorite-asset.ts b/src/v2/routes/auth/assets/favorite/add-favorite-asset.ts index 8709781..5bf91a0 100644 --- a/src/v2/routes/auth/assets/favorite/add-favorite-asset.ts +++ b/src/v2/routes/auth/assets/favorite/add-favorite-asset.ts @@ -26,11 +26,11 @@ export async function favoriteAsset(c: APIContext): Promise { } // check if asset exists, and status is 1 (approved) - const assetExists = await drizzle.query.assets.findFirst({ - where: (assets, { eq, and }) => + const assetExists = await drizzle.query.asset.findFirst({ + where: (asset, { eq, and }) => and( - eq(assets.id, parseInt(assetToFavorite)), - eq(assets.status, "approved") + eq(asset.id, parseInt(assetToFavorite)), + eq(asset.status, "approved") ), }) diff --git a/src/v2/routes/auth/assets/favorite/remove-favorite-asset.ts b/src/v2/routes/auth/assets/favorite/remove-favorite-asset.ts index ac90c4e..8c680f1 100644 --- a/src/v2/routes/auth/assets/favorite/remove-favorite-asset.ts +++ b/src/v2/routes/auth/assets/favorite/remove-favorite-asset.ts @@ -39,11 +39,11 @@ export async function removeFavoriteAsset(c: APIContext): Promise { } // check if asset exists - const asset = await drizzle.query.assets.findFirst({ - where: (assets, { eq }) => eq(assets.id, parseInt(assetToRemove)), + const foundAsset = await drizzle.query.asset.findFirst({ + where: (asset, { eq }) => eq(asset.id, parseInt(assetToRemove)), }) - if (!asset) { + if (!foundAsset) { return c.json({ success: false, state: "asset not found" }, 200) } diff --git a/src/v2/routes/auth/assets/get-unapproved-assets.ts b/src/v2/routes/auth/assets/get-unapproved-assets.ts index 83e9b78..15dc686 100644 --- a/src/v2/routes/auth/assets/get-unapproved-assets.ts +++ b/src/v2/routes/auth/assets/get-unapproved-assets.ts @@ -24,8 +24,8 @@ export async function getUnapprovedAssets(c: APIContext): Promise { const { drizzle } = getConnection(c.env) const unApprovedAssets = - (await drizzle.query.assets.findMany({ - where: (assets, { eq, not }) => not(eq(assets.status, "approved")), + (await drizzle.query.asset.findMany({ + where: (asset, { eq, not }) => not(eq(asset.status, "approved")), })) ?? [] return c.json( diff --git a/src/v2/routes/auth/assets/modify-asset.ts b/src/v2/routes/auth/assets/modify-asset.ts index 8825048..8d354cd 100644 --- a/src/v2/routes/auth/assets/modify-asset.ts +++ b/src/v2/routes/auth/assets/modify-asset.ts @@ -1,6 +1,6 @@ import { responseHeaders } from "@/v2/lib/response-headers" import { getConnection } from "@/v2/db/turso" -import { assetTagAsset, assets } from "@/v2/db/schema" +import { assetTagAsset, asset } from "@/v2/db/schema" import { eq } from "drizzle-orm" import { SplitQueryByCommas } from "@/v2/lib/helpers/split-query-by-commas" import { auth } from "@/v2/lib/auth/lucia" @@ -26,8 +26,8 @@ export async function modifyAssetData(c: APIContext): Promise { const { drizzle } = getConnection(c.env) - const asset = await drizzle.query.assets.findFirst({ - where: (assets, { eq }) => eq(assets.id, parseInt(assetIdToModify)), + const foundAsset = await drizzle.query.asset.findFirst({ + where: (asset, { eq }) => eq(asset.id, parseInt(assetIdToModify)), with: { assetTagAsset: { with: { @@ -37,14 +37,14 @@ export async function modifyAssetData(c: APIContext): Promise { }, }) - if (!asset) { + if (!foundAsset) { return c.json({ success: false, state: "asset not found" }, 200) } const roleFlags = roleFlagsToArray(session.user.roleFlags) if ( - asset.uploadedById !== session.user.userId || + foundAsset.uploadedById !== session.user.userId || !roleFlags.includes("CREATOR") ) { return c.json( @@ -71,11 +71,11 @@ export async function modifyAssetData(c: APIContext): Promise { const tags = SplitQueryByCommas(formData.get("tags") as string | null) const updatedAsset = await drizzle - .update(assets) + .update(asset) .set({ ...metadata, }) - .where(eq(assets.id, parseInt(assetIdToModify))) + .where(eq(asset.id, parseInt(assetIdToModify))) .execute() const validTags = [] diff --git a/src/v2/routes/auth/assets/upload-asset.ts b/src/v2/routes/auth/assets/upload-asset.ts index eb50c6f..893f462 100644 --- a/src/v2/routes/auth/assets/upload-asset.ts +++ b/src/v2/routes/auth/assets/upload-asset.ts @@ -1,7 +1,7 @@ import { auth } from "@/v2/lib/auth/lucia" import { getConnection } from "@/v2/db/turso" import { - assets, + asset, assetTagAsset, game as gameTable, assetCategory as assetCategoryTable, @@ -136,10 +136,10 @@ export async function uploadAsset(c: APIContext): Promise { await drizzle.transaction(async (trx) => { // inserting new asset const newAssetDB = await trx - .insert(assets) + .insert(asset) .values(newAsset) .returning({ - assetId: assets.id, + assetId: asset.id, }) // checking if tags exist and setting relations diff --git a/src/v2/routes/search/all/search-all.ts b/src/v2/routes/search/all/search-all.ts index 9e72af8..2764896 100644 --- a/src/v2/routes/search/all/search-all.ts +++ b/src/v2/routes/search/all/search-all.ts @@ -50,9 +50,9 @@ export async function searchAll(c: APIContext): Promise { limit: 25, }) - const assetsResponse = await drizzle.query.assets.findMany({ - where: (assets) => { - return like(assets.name, `%${query}%`) + const assetsResponse = await drizzle.query.asset.findMany({ + where: (asset) => { + return like(asset.name, `%${query}%`) }, limit: 25, }) diff --git a/src/v2/routes/search/asset/recent-assets.ts b/src/v2/routes/search/asset/recent-assets.ts index be6c9e1..551067e 100644 --- a/src/v2/routes/search/asset/recent-assets.ts +++ b/src/v2/routes/search/asset/recent-assets.ts @@ -2,7 +2,7 @@ import { responseHeaders } from "@/v2/lib/response-headers" import { getConnection } from "@/v2/db/turso" import { desc } from "drizzle-orm" -import { assets } from "@/v2/db/schema" +import { asset } from "@/v2/db/schema" // get 100 most recent assets, sorted by asset.uploadedDate export async function recentAssets(c: APIContext): Promise { @@ -14,10 +14,10 @@ export async function recentAssets(c: APIContext): Promise { const { drizzle } = getConnection(c.env) - const assetResponse = await drizzle.query.assets.findMany({ - orderBy: desc(assets.uploadedDate), + const assetResponse = await drizzle.query.asset.findMany({ + orderBy: desc(asset.uploadedDate), limit: 100, - where: (assets, { eq }) => eq(assets.status, "approved"), + where: (asset, { eq }) => eq(asset.status, "approved"), }) response = c.json( diff --git a/src/v2/routes/search/asset/search-assets.ts b/src/v2/routes/search/asset/search-assets.ts index 0d9b974..6b5856e 100644 --- a/src/v2/routes/search/asset/search-assets.ts +++ b/src/v2/routes/search/asset/search-assets.ts @@ -1,6 +1,6 @@ import { responseHeaders } from "@/v2/lib/response-headers" import { getConnection } from "@/v2/db/turso" -import { assetTagAsset, assets, assetTag, users } from "@/v2/db/schema" +import { assetTagAsset, asset, assetTag, users } from "@/v2/db/schema" import { desc, like, sql, eq, and, or } from "drizzle-orm" import { SplitQueryByCommas } from "@/v2/lib/helpers/split-query-by-commas" @@ -48,24 +48,23 @@ export async function searchForAssets(c: APIContext): Promise { const result = await drizzle .with(assetTagResponse) .select() - .from(assets) - .innerJoin(assetTagResponse, eq(assetTagResponse.assetId, assets.id)) + .from(asset) + .innerJoin(assetTagResponse, eq(assetTagResponse.assetId, asset.id)) .where( and( - searchQuery && like(assets.name, `%${searchQuery}%`), - gameList && - or(...gameList.map((game) => eq(assets.game, game))), + searchQuery && like(asset.name, `%${searchQuery}%`), + gameList && or(...gameList.map((game) => eq(asset.game, game))), assetCategoryList && or( ...assetCategoryList.map((category) => - eq(assets.assetCategory, category) + eq(asset.assetCategory, category) ) ), - eq(assets.status, "approved") + eq(asset.status, "approved") ) ) - .leftJoin(users, eq(users.id, assets.uploadedById)) - .orderBy(desc(assets.uploadedDate)) + .leftJoin(users, eq(users.id, asset.uploadedById)) + .orderBy(desc(asset.uploadedDate)) .limit(500) response = c.json( From 2019d24be514c9f8485e1fb14aee75305000caf0 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Mon, 30 Oct 2023 02:18:45 +0000 Subject: [PATCH 127/318] `users` => `authUser` & atlas table init --- src/v2/db/drizzle.ts | 2 + src/v2/db/schema/asset/asset-atlas.ts | 91 +++++++++++++++++++ src/v2/db/schema/asset/asset.ts | 10 +- .../db/schema/oc-generators/oc-generators.ts | 8 +- src/v2/db/schema/user/user-attributes.ts | 14 +-- src/v2/db/schema/user/user-collections.ts | 8 +- src/v2/db/schema/user/user-connections.ts | 8 +- src/v2/db/schema/user/user-favorites.ts | 8 +- src/v2/db/schema/user/user-networking.ts | 14 +-- src/v2/db/schema/user/user.ts | 14 +-- src/v2/routes/auth/login-methods/discord.ts | 4 +- src/v2/routes/auth/reset-password.ts | 6 +- .../user-relations/follow-user.ts | 4 +- .../user-relations/unfollow-user.ts | 4 +- src/v2/routes/auth/verify-email.ts | 6 +- src/v2/routes/search/all/search-all.ts | 6 +- src/v2/routes/search/asset/search-assets.ts | 4 +- .../search/user/get-user-by-username.ts | 4 +- .../routes/search/user/get-users-by-search.ts | 6 +- 19 files changed, 157 insertions(+), 64 deletions(-) create mode 100644 src/v2/db/schema/asset/asset-atlas.ts diff --git a/src/v2/db/drizzle.ts b/src/v2/db/drizzle.ts index cce8099..d6c526b 100644 --- a/src/v2/db/drizzle.ts +++ b/src/v2/db/drizzle.ts @@ -6,6 +6,8 @@ export const tableNames = { userNetworking: "userNetworking", gameAssetCategory: "gameAssetCategory", game: "game", + atlas: "atlas", + atlasToAsset: "atlasToAsset", assetTag: "assetTag", assetTagAsset: "assetTagAsset", emailVerificationToken: "emailVerificationToken", diff --git a/src/v2/db/schema/asset/asset-atlas.ts b/src/v2/db/schema/asset/asset-atlas.ts new file mode 100644 index 0000000..b2912ee --- /dev/null +++ b/src/v2/db/schema/asset/asset-atlas.ts @@ -0,0 +1,91 @@ +import { tableNames } from "@/v2/db/drizzle" +import { relations } from "drizzle-orm" +import { + sqliteTable, + text, + integer, + // uniqueIndex, + index, +} from "drizzle-orm/sqlite-core" +import { asset } from "./asset" +import { authUser } from "../user/user" + +export const atlas = sqliteTable( + tableNames.atlas, + { + id: text("id").primaryKey(), + url: text("url").notNull(), + uploadedById: text("uploaded_by").notNull(), + uploadedByName: text("uploaded_by_name").notNull(), + uploadedDate: integer("uploaded_date").notNull(), + fileSize: integer("file_size").default(0).notNull(), + }, + (table) => { + return { + idIdx: index("atlas_id_idx").on(table.id), + uploadedByIdIdx: index("atlas_uploaded_by_idx").on( + table.uploadedById + ), + uploadedByNameIdx: index("atlas_uploaded_by_name_idx").on( + table.uploadedByName + ), + } + } +) + +export type Atlas = typeof atlas.$inferSelect +export type NewAtlas = typeof atlas.$inferInsert + +export const atlasToAsset = sqliteTable( + tableNames.atlasToAsset, + { + id: text("id").primaryKey(), + atlasId: text("atlas_id") + .notNull() + .references(() => atlas.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + assetId: integer("asset_id") + .notNull() + .references(() => asset.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + }, + (atlasToAsset) => { + return { + atlasToAssetIdx: index("atlas_to_assets_id_idx").on( + atlasToAsset.id + ), + atlasToAssetAtlasIdx: index("atlas_to_assets_atlas_id_idx").on( + atlasToAsset.atlasId + ), + atlasToAssetAssetIdx: index("atlas_to_assets_asset_id_idx").on( + atlasToAsset.assetId + ), + } + } +) + +export type AtlasToAsset = typeof atlasToAsset.$inferSelect +export type NewAtlasToAsset = typeof atlasToAsset.$inferInsert + +export const atlasRelations = relations(atlas, ({ one }) => ({ + atlasToAsset: one(atlasToAsset), + uploadedBy: one(authUser, { + fields: [atlas.uploadedById, atlas.uploadedByName], + references: [authUser.id, authUser.username], + }), +})) + +export const atlasToAssetRelations = relations(atlasToAsset, ({ one }) => ({ + atlas: one(atlas, { + fields: [atlasToAsset.atlasId], + references: [atlas.id], + }), + asset: one(asset, { + fields: [atlasToAsset.assetId], + references: [asset.id], + }), +})) diff --git a/src/v2/db/schema/asset/asset.ts b/src/v2/db/schema/asset/asset.ts index 4a5ca89..eb73abc 100644 --- a/src/v2/db/schema/asset/asset.ts +++ b/src/v2/db/schema/asset/asset.ts @@ -7,7 +7,7 @@ import { // uniqueIndex, index, } from "drizzle-orm/sqlite-core" -import { users } from "../user/user" +import { authUser } from "../user/user" import { assetCategory } from "./asset-categories" import { game } from "../game/game" import { assetTagAsset } from "./asset-tags" @@ -47,12 +47,12 @@ export const asset = sqliteTable( .$type() .default("pending") .notNull(), - uploadedById: text("uploaded_by").references(() => users.id, { + uploadedById: text("uploaded_by").references(() => authUser.id, { onUpdate: "cascade", onDelete: "cascade", }), uploadedByName: text("uploaded_by_name").references( - () => users.username, + () => authUser.username, { onUpdate: "cascade", onDelete: "cascade", @@ -88,9 +88,9 @@ export type Asset = typeof asset.$inferSelect export type NewAsset = typeof asset.$inferInsert export const assetRelations = relations(asset, ({ one, many }) => ({ - uploadedBy: one(users, { + uploadedBy: one(authUser, { fields: [asset.uploadedById, asset.uploadedByName], - references: [users.id, users.username], + references: [authUser.id, authUser.username], }), assetTagAsset: many(assetTagAsset), assetCategory: one(assetCategory, { diff --git a/src/v2/db/schema/oc-generators/oc-generators.ts b/src/v2/db/schema/oc-generators/oc-generators.ts index baccb17..0f7e90b 100644 --- a/src/v2/db/schema/oc-generators/oc-generators.ts +++ b/src/v2/db/schema/oc-generators/oc-generators.ts @@ -7,7 +7,7 @@ import { // uniqueIndex, index, } from "drizzle-orm/sqlite-core" -import { users } from "../user/user" +import { authUser } from "../user/user" /* NOTE: OC generators are not stored in the database. @@ -21,7 +21,7 @@ export const savedOcGenerators = sqliteTable( id: text("id").primaryKey(), userId: text("user_id") .notNull() - .references(() => users.id, { + .references(() => authUser.id, { onUpdate: "cascade", onDelete: "cascade", }), @@ -51,9 +51,9 @@ export type NewSavedOcGenerators = typeof savedOcGenerators.$inferInsert export const savedOcGeneratorsRelations = relations( savedOcGenerators, ({ one }) => ({ - user: one(users, { + user: one(authUser, { fields: [savedOcGenerators.userId], - references: [users.id], + references: [authUser.id], }), }) ) diff --git a/src/v2/db/schema/user/user-attributes.ts b/src/v2/db/schema/user/user-attributes.ts index e641757..d1e6f94 100644 --- a/src/v2/db/schema/user/user-attributes.ts +++ b/src/v2/db/schema/user/user-attributes.ts @@ -7,7 +7,7 @@ import { // uniqueIndex, index, } from "drizzle-orm/sqlite-core" -import { users } from "./user" +import { authUser } from "./user" /* NOTE: This is mostly security related. @@ -21,7 +21,7 @@ export const emailVerificationToken = sqliteTable( id: text("id").primaryKey(), userId: text("user_id") .notNull() - .references(() => users.id, { + .references(() => authUser.id, { onUpdate: "cascade", onDelete: "cascade", }), @@ -50,7 +50,7 @@ export const passwordResetToken = sqliteTable( id: text("id").primaryKey(), userId: text("user_id") .notNull() - .references(() => users.id, { + .references(() => authUser.id, { onUpdate: "cascade", onDelete: "cascade", }), @@ -72,9 +72,9 @@ export const passwordResetToken = sqliteTable( export const emailVerificationTokenRelations = relations( emailVerificationToken, ({ one }) => ({ - user: one(users, { + user: one(authUser, { fields: [emailVerificationToken.userId], - references: [users.id], + references: [authUser.id], }), }) ) @@ -82,9 +82,9 @@ export const emailVerificationTokenRelations = relations( export const passwordResetTokenRelations = relations( passwordResetToken, ({ one }) => ({ - user: one(users, { + user: one(authUser, { fields: [passwordResetToken.userId], - references: [users.id], + references: [authUser.id], }), }) ) diff --git a/src/v2/db/schema/user/user-collections.ts b/src/v2/db/schema/user/user-collections.ts index fdd4bf5..5ee3686 100644 --- a/src/v2/db/schema/user/user-collections.ts +++ b/src/v2/db/schema/user/user-collections.ts @@ -7,7 +7,7 @@ import { // uniqueIndex, index, } from "drizzle-orm/sqlite-core" -import { users } from "./user" +import { authUser } from "./user" import { asset } from "../asset/asset" /* @@ -24,7 +24,7 @@ export const userCollection = sqliteTable( description: text("description").notNull(), userId: text("user_id") .notNull() - .references(() => users.id, { + .references(() => authUser.id, { onUpdate: "cascade", onDelete: "cascade", }), @@ -82,9 +82,9 @@ export type NewUserCollectionAsset = typeof userCollectionAsset.$inferInsert export const collectionRelations = relations( userCollection, ({ one, many }) => ({ - user: one(users, { + user: one(authUser, { fields: [userCollection.userId], - references: [users.id], + references: [authUser.id], }), assets: many(userCollectionAsset), }) diff --git a/src/v2/db/schema/user/user-connections.ts b/src/v2/db/schema/user/user-connections.ts index d5960af..c180626 100644 --- a/src/v2/db/schema/user/user-connections.ts +++ b/src/v2/db/schema/user/user-connections.ts @@ -1,7 +1,7 @@ import { tableNames } from "@/v2/db/drizzle" import { relations } from "drizzle-orm" import { sqliteTable, text, index } from "drizzle-orm/sqlite-core" -import { users } from "./user" +import { authUser } from "./user" /* NOTE: This file will be expanded on in the future, but for now it's just for Discord. @@ -14,7 +14,7 @@ export const socialsConnection = sqliteTable( id: text("id").primaryKey(), userId: text("user_id") .notNull() - .references(() => users.id, { + .references(() => authUser.id, { onUpdate: "cascade", onDelete: "cascade", }), @@ -38,9 +38,9 @@ export type NewSocialsConnection = typeof socialsConnection.$inferInsert export const socialsConnectionRelations = relations( socialsConnection, ({ one }) => ({ - user: one(users, { + user: one(authUser, { fields: [socialsConnection.userId], - references: [users.id], + references: [authUser.id], }), }) ) diff --git a/src/v2/db/schema/user/user-favorites.ts b/src/v2/db/schema/user/user-favorites.ts index 1a0cabc..67402c7 100644 --- a/src/v2/db/schema/user/user-favorites.ts +++ b/src/v2/db/schema/user/user-favorites.ts @@ -7,7 +7,7 @@ import { // uniqueIndex, index, } from "drizzle-orm/sqlite-core" -import { users } from "./user" +import { authUser } from "./user" import { asset } from "../asset/asset" /* @@ -22,7 +22,7 @@ export const userFavorite = sqliteTable( id: text("id").primaryKey(), userId: text("user_id") .notNull() - .references(() => users.id, { + .references(() => authUser.id, { onUpdate: "cascade", onDelete: "cascade", }), @@ -79,9 +79,9 @@ export type UserFavoriteAsset = typeof userFavoriteAsset.$inferSelect export type NewUserFavoriteAsset = typeof userFavoriteAsset.$inferInsert export const userFavoriteRelations = relations(userFavorite, ({ one }) => ({ - user: one(users, { + user: one(authUser, { fields: [userFavorite.userId], - references: [users.id], + references: [authUser.id], }), })) diff --git a/src/v2/db/schema/user/user-networking.ts b/src/v2/db/schema/user/user-networking.ts index 16e57a6..f77d72a 100644 --- a/src/v2/db/schema/user/user-networking.ts +++ b/src/v2/db/schema/user/user-networking.ts @@ -6,7 +6,7 @@ import { // uniqueIndex, index, } from "drizzle-orm/sqlite-core" -import { users } from "./user" +import { authUser } from "./user" /* NOTE: this file manages the "social" aspect of users. @@ -18,10 +18,10 @@ export const userNetworking = sqliteTable( { followerId: text("followerId") .notNull() - .references(() => users.id), + .references(() => authUser.id), followingId: text("followingId") .notNull() - .references(() => users.id), + .references(() => authUser.id), createdAt: text("createdAt").notNull(), updatedAt: text("updatedAt").notNull(), }, @@ -41,14 +41,14 @@ export type UserNetworking = typeof userNetworking.$inferSelect export type NewUserNetworking = typeof userNetworking.$inferInsert export const userNetworkingRelations = relations(userNetworking, ({ one }) => ({ - follower: one(users, { + follower: one(authUser, { fields: [userNetworking.followerId], - references: [users.id], + references: [authUser.id], relationName: "follower", }), - following: one(users, { + following: one(authUser, { fields: [userNetworking.followingId], - references: [users.id], + references: [authUser.id], relationName: "following", }), })) diff --git a/src/v2/db/schema/user/user.ts b/src/v2/db/schema/user/user.ts index 7f2f6a5..37336f5 100644 --- a/src/v2/db/schema/user/user.ts +++ b/src/v2/db/schema/user/user.ts @@ -22,7 +22,7 @@ NOTE: Very basic user information - Keys table is login methods (i.e Credentials, OAuth, etc.) */ -export const users = sqliteTable( +export const authUser = sqliteTable( tableNames.authUser, { id: text("id").primaryKey(), @@ -52,8 +52,8 @@ export const users = sqliteTable( } ) -export type Users = typeof users.$inferSelect -export type NewUsers = typeof users.$inferInsert +export type Users = typeof authUser.$inferSelect +export type NewUsers = typeof authUser.$inferInsert export const keys = sqliteTable( tableNames.authKey, @@ -61,7 +61,7 @@ export const keys = sqliteTable( id: text("id").primaryKey(), userId: text("user_id") .notNull() - .references(() => users.id, { + .references(() => authUser.id, { onUpdate: "cascade", onDelete: "cascade", }), @@ -77,7 +77,7 @@ export const keys = sqliteTable( export type Keys = typeof keys.$inferSelect export type NewKeys = typeof keys.$inferInsert -export const usersRelations = relations(users, ({ one, many }) => ({ +export const usersRelations = relations(authUser, ({ one, many }) => ({ follower: many(userNetworking, { relationName: "follower", }), @@ -95,8 +95,8 @@ export const usersRelations = relations(users, ({ one, many }) => ({ })) export const keysRelations = relations(keys, ({ one }) => ({ - user: one(users, { + user: one(authUser, { fields: [keys.userId], - references: [users.id], + references: [authUser.id], }), })) diff --git a/src/v2/routes/auth/login-methods/discord.ts b/src/v2/routes/auth/login-methods/discord.ts index a95f7c9..cd63096 100644 --- a/src/v2/routes/auth/login-methods/discord.ts +++ b/src/v2/routes/auth/login-methods/discord.ts @@ -61,8 +61,8 @@ export async function discordCallback(c: APIContext): Promise { const { drizzle } = getConnection(c.env) - const userWithEmail = await drizzle.query.users.findFirst({ - where: (users, { eq }) => eq(users.email, discordUser.email), + const userWithEmail = await drizzle.query.authUser.findFirst({ + where: (authUser, { eq }) => eq(authUser.email, discordUser.email), }) // if user exists, we create a discord key for them and update their email_verified attribute diff --git a/src/v2/routes/auth/reset-password.ts b/src/v2/routes/auth/reset-password.ts index 864200e..8e93e52 100644 --- a/src/v2/routes/auth/reset-password.ts +++ b/src/v2/routes/auth/reset-password.ts @@ -1,6 +1,6 @@ import { auth } from "@/v2/lib/auth/lucia" import { getConnection } from "@/v2/db/turso" -import { passwordResetToken, users } from "@/v2/db/schema" +import { passwordResetToken, authUser } from "@/v2/db/schema" import { eq } from "drizzle-orm" import { generateRandomString } from "lucia/utils" import { z } from "zod" @@ -45,8 +45,8 @@ export async function generatePasswordResetToken( const user = await drizzle .select() - .from(users) - .where(eq(users.email, email)) + .from(authUser) + .where(eq(authUser.email, email)) if (!user) { return c.json({ success: false, state: "valid data" }, 200) diff --git a/src/v2/routes/auth/user-attributes/user-relations/follow-user.ts b/src/v2/routes/auth/user-attributes/user-relations/follow-user.ts index 33fd3d6..27186ae 100644 --- a/src/v2/routes/auth/user-attributes/user-relations/follow-user.ts +++ b/src/v2/routes/auth/user-attributes/user-relations/follow-user.ts @@ -38,8 +38,8 @@ export async function followUser(c: APIContext): Promise { } // check if user exists - const user = await drizzle.query.users.findFirst({ - where: (users, { eq }) => eq(users.id, userToFollow), + const user = await drizzle.query.authUser.findFirst({ + where: (authUser, { eq }) => eq(authUser.id, userToFollow), }) if (!user) { diff --git a/src/v2/routes/auth/user-attributes/user-relations/unfollow-user.ts b/src/v2/routes/auth/user-attributes/user-relations/unfollow-user.ts index b6aeb6d..7e54981 100644 --- a/src/v2/routes/auth/user-attributes/user-relations/unfollow-user.ts +++ b/src/v2/routes/auth/user-attributes/user-relations/unfollow-user.ts @@ -45,8 +45,8 @@ export async function unfollowUser(c: APIContext): Promise { } // check if user exists - const user = await drizzle.query.users.findFirst({ - where: (users, { eq }) => eq(users.id, userToUnFollow), + const user = await drizzle.query.authUser.findFirst({ + where: (authUser, { eq }) => eq(authUser.id, userToUnFollow), }) if (!user) { diff --git a/src/v2/routes/auth/verify-email.ts b/src/v2/routes/auth/verify-email.ts index 9163904..c0145fd 100644 --- a/src/v2/routes/auth/verify-email.ts +++ b/src/v2/routes/auth/verify-email.ts @@ -1,6 +1,6 @@ import { auth } from "@/v2/lib/auth/lucia" import { getConnection } from "@/v2/db/turso" -import { emailVerificationToken, users } from "@/v2/db/schema" +import { emailVerificationToken, authUser } from "@/v2/db/schema" import { eq } from "drizzle-orm" export async function verifyEmail(c: APIContext): Promise { @@ -38,11 +38,11 @@ export async function verifyEmail(c: APIContext): Promise { .delete(emailVerificationToken) .where(eq(emailVerificationToken.token, token)) await trx - .update(users) + .update(authUser) .set({ emailVerified: 1, }) - .where(eq(users.id, relatedUser[0].userId)) + .where(eq(authUser.id, relatedUser[0].userId)) }) return c.json({ success: true, state: "email validated" }, 200) diff --git a/src/v2/routes/search/all/search-all.ts b/src/v2/routes/search/all/search-all.ts index 2764896..b20414a 100644 --- a/src/v2/routes/search/all/search-all.ts +++ b/src/v2/routes/search/all/search-all.ts @@ -25,9 +25,9 @@ export async function searchAll(c: APIContext): Promise { // this is a disaster // https://cdn.discordapp.com/attachments/1102306276832202813/1147291827699986572/F.gif - const usersResponse = await drizzle.query.users.findMany({ - where: (users) => { - return like(users.username, `%${query}%`) + const usersResponse = await drizzle.query.authUser.findMany({ + where: (authUser) => { + return like(authUser.username, `%${query}%`) }, columns: { email: false, diff --git a/src/v2/routes/search/asset/search-assets.ts b/src/v2/routes/search/asset/search-assets.ts index 6b5856e..f650bc3 100644 --- a/src/v2/routes/search/asset/search-assets.ts +++ b/src/v2/routes/search/asset/search-assets.ts @@ -1,6 +1,6 @@ import { responseHeaders } from "@/v2/lib/response-headers" import { getConnection } from "@/v2/db/turso" -import { assetTagAsset, asset, assetTag, users } from "@/v2/db/schema" +import { assetTagAsset, asset, assetTag, authUser } from "@/v2/db/schema" import { desc, like, sql, eq, and, or } from "drizzle-orm" import { SplitQueryByCommas } from "@/v2/lib/helpers/split-query-by-commas" @@ -63,7 +63,7 @@ export async function searchForAssets(c: APIContext): Promise { eq(asset.status, "approved") ) ) - .leftJoin(users, eq(users.id, asset.uploadedById)) + .leftJoin(authUser, eq(authUser.id, asset.uploadedById)) .orderBy(desc(asset.uploadedDate)) .limit(500) diff --git a/src/v2/routes/search/user/get-user-by-username.ts b/src/v2/routes/search/user/get-user-by-username.ts index 33adc74..1060d29 100644 --- a/src/v2/routes/search/user/get-user-by-username.ts +++ b/src/v2/routes/search/user/get-user-by-username.ts @@ -27,8 +27,8 @@ export async function getUserByUsername(c: APIContext): Promise { if (response) return response const { drizzle } = getConnection(c.env) - const user = await drizzle.query.users.findFirst({ - where: (users, { and, eq }) => and(eq(users.username, username)), + const user = await drizzle.query.authUser.findFirst({ + where: (authUser, { and, eq }) => and(eq(authUser.username, username)), columns: { email: false, emailVerified: false, diff --git a/src/v2/routes/search/user/get-users-by-search.ts b/src/v2/routes/search/user/get-users-by-search.ts index 09301b3..de038ba 100644 --- a/src/v2/routes/search/user/get-users-by-search.ts +++ b/src/v2/routes/search/user/get-users-by-search.ts @@ -10,9 +10,9 @@ export async function getUsersBySearch(c: APIContext): Promise { const { query } = c.req.param() const { drizzle } = getConnection(c.env) - const userList = await drizzle.query.users.findMany({ - where: (users, { or }) => { - return or(like(users.username, `%${query}%`)) + const userList = await drizzle.query.authUser.findMany({ + where: (authUser, { or }) => { + return or(like(authUser.username, `%${query}%`)) }, columns: { email: false, From 72f6a662287f29e9351961ca91f467ac8b434f49 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Mon, 30 Oct 2023 02:21:50 +0000 Subject: [PATCH 128/318] fix relation inferring --- src/v2/db/schema/asset/asset-atlas.ts | 4 ++++ src/v2/db/schema/asset/asset.ts | 2 ++ src/v2/db/schema/user/user.ts | 2 ++ src/v2/lib/helpers/asset-status.ts | 7 ------- 4 files changed, 8 insertions(+), 7 deletions(-) delete mode 100644 src/v2/lib/helpers/asset-status.ts diff --git a/src/v2/db/schema/asset/asset-atlas.ts b/src/v2/db/schema/asset/asset-atlas.ts index b2912ee..db0aea2 100644 --- a/src/v2/db/schema/asset/asset-atlas.ts +++ b/src/v2/db/schema/asset/asset-atlas.ts @@ -10,6 +10,10 @@ import { import { asset } from "./asset" import { authUser } from "../user/user" +/* +NOTE: this allows for users down the line to link their uploaded assets to appropiate atlases for animation. +*/ + export const atlas = sqliteTable( tableNames.atlas, { diff --git a/src/v2/db/schema/asset/asset.ts b/src/v2/db/schema/asset/asset.ts index eb73abc..6a7363f 100644 --- a/src/v2/db/schema/asset/asset.ts +++ b/src/v2/db/schema/asset/asset.ts @@ -11,6 +11,7 @@ import { authUser } from "../user/user" import { assetCategory } from "./asset-categories" import { game } from "../game/game" import { assetTagAsset } from "./asset-tags" +import { atlas } from "./asset-atlas" /* NOTE: Assets have a lot of relations, and can be quite complex in some cases. @@ -93,6 +94,7 @@ export const assetRelations = relations(asset, ({ one, many }) => ({ references: [authUser.id, authUser.username], }), assetTagAsset: many(assetTagAsset), + atlas: many(atlas), assetCategory: one(assetCategory, { fields: [asset.assetCategory], references: [assetCategory.name], diff --git a/src/v2/db/schema/user/user.ts b/src/v2/db/schema/user/user.ts index 37336f5..9777544 100644 --- a/src/v2/db/schema/user/user.ts +++ b/src/v2/db/schema/user/user.ts @@ -15,6 +15,7 @@ import { socialsConnection } from "./user-connections" import { userCollection } from "./user-collections" import { passwordResetToken } from "./user-attributes" import { emailVerificationToken } from "./user-attributes" +import { atlas } from "../asset/asset-atlas" /* NOTE: Very basic user information @@ -86,6 +87,7 @@ export const usersRelations = relations(authUser, ({ one, many }) => ({ }), key: many(keys), assets: many(asset), + atlas: many(atlas), userFavorite: one(userFavorite), socialsConnection: one(socialsConnection), userCollection: many(userCollection), diff --git a/src/v2/lib/helpers/asset-status.ts b/src/v2/lib/helpers/asset-status.ts deleted file mode 100644 index 3a7c33d..0000000 --- a/src/v2/lib/helpers/asset-status.ts +++ /dev/null @@ -1,7 +0,0 @@ -export const AssetStatus = { - 1: "APPROVED", - 2: "PENDING", - 3: "FLAGGED", -} - -export type AssetStatusValue = keyof typeof AssetStatus From 637b01f44347c2331b13a796fbca3889cb0b5cfe Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Thu, 2 Nov 2023 19:18:23 +0000 Subject: [PATCH 129/318] rewrite resend wrapper to use classes --- package.json | 6 +-- src/v2/lib/resend/email.ts | 90 +++++++++++++++++++++++------------- src/v2/lib/resend/wrapper.ts | 55 ++++++++++++---------- 3 files changed, 90 insertions(+), 61 deletions(-) diff --git a/package.json b/package.json index 5b2e45c..365a28d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "wanderer-moe-api", - "version": "1.0.1b", + "name": "api", + "version": "1.1.0b", "scripts": { "prettier:fmt": "prettier --write .", "dev": "wrangler dev --remote", @@ -9,7 +9,7 @@ "prettier:check": "prettier --check .", "typecheck": "tsc --noEmit", "drizzle:generate": "drizzle-kit generate:sqlite", - "drizzle:migrate": "ts-node ./src/scripts/migrate/migrate", + "drizzle:migrate": "tsx ./src/scripts/migrate/migrate", "drizzle:push": "drizzle-kit push:sqlite", "drizzle:studio": "drizzle-kit studio --port 7331 --host 127.0.0.1 --verbose" }, diff --git a/src/v2/lib/resend/email.ts b/src/v2/lib/resend/email.ts index 14128a4..6b6a8b4 100644 --- a/src/v2/lib/resend/email.ts +++ b/src/v2/lib/resend/email.ts @@ -1,55 +1,79 @@ -import { ResendWrapper } from "@/v2/lib/resend/wrapper" +import { Resend, type EmailData } from "@/v2/lib/resend/wrapper" const emailFrom = "Test " -const sendEmail = async (emailData, c) => { +const sendEmail = async (emailData: EmailData, c: APIContext) => { try { - return await ResendWrapper(c, emailData) + const resend = new Resend(c) + await resend.sendEmail(emailData) } catch (error) { - throw new Error("Error sending email.") + throw new Error(`[RESEND]: ${error.message}`) } } -export const sendPasswordResetEmail = async (email, link, username, c) => { - const emailData = { +const createEmailData = ( + to: string, + subject: string, + html: string +): EmailData => { + return { from: emailFrom, - to: email, - subject: "Password Reset Request", - html: `Password reset for ${username}
Click here to reset your password`, + to, + subject, + html, } +} +export const sendPasswordResetEmail = async ( + email: string, + link: string, + username: string, + c: APIContext +) => { + const emailData = createEmailData( + email, + "Password Reset Request", + `Password reset for ${username}
Click here to reset your password` + ) return sendEmail(emailData, c) } -export const sendPasswordChangeEmail = async (email, username, c) => { - const emailData = { - from: emailFrom, - to: email, - subject: "Password Updated Confirmation", - html: `Your password for ${username} has been updated.
Wasn't you? Contact us at support@wanderer.moe`, - } - +export const sendPasswordChangeEmail = async ( + email: string, + username: string, + c: APIContext +) => { + const emailData = createEmailData( + email, + "Password Change Request", + `Your password for ${username} has been changed.
Wasn't you? Contact us at support@wanderer.moe` + ) return sendEmail(emailData, c) } -export const sendEmailChangeEmail = async (email, username, c) => { - const emailData = { - from: emailFrom, - to: email, - subject: "Email Change Request", - html: `Your email address for ${username} has been changed.
Wasn't you? Contact us at support@wanderer.moe`, - } - +export const sendEmailChangeEmail = async ( + email: string, + username: string, + c: APIContext +) => { + const emailData = createEmailData( + email, + "Email Change Request", + `Your email address for ${username} has been changed.
Wasn't you? Contact us at support@wanderer.moe` + ) return sendEmail(emailData, c) } -export const sendEmailConfirmationEmail = async (email, link, username, c) => { - const emailData = { - from: emailFrom, - to: email, - subject: "Email Confirmation", - html: `Email confirmation for ${username}
Click here to confirm your email`, - } - +export const sendEmailConfirmationEmail = async ( + email: string, + link: string, + username: string, + c: APIContext +) => { + const emailData = createEmailData( + email, + "Email Confirmation", + `Email confirmation for ${username}
Click here to confirm your email` + ) return sendEmail(emailData, c) } diff --git a/src/v2/lib/resend/wrapper.ts b/src/v2/lib/resend/wrapper.ts index 9017097..39a0207 100644 --- a/src/v2/lib/resend/wrapper.ts +++ b/src/v2/lib/resend/wrapper.ts @@ -1,38 +1,43 @@ -type EmailData = { +export type EmailData = { to: string from: string subject: string html: string } -export async function ResendWrapper( - c: APIContext, - emailData: EmailData -): Promise { - const response = await fetch(`https://api.resend.com/emails`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${c.env.RESEND_API_KEY}`, - }, - body: JSON.stringify({ ...emailData }), - }) +export class Resend { + private context: APIContext - const contentType = response.headers.get("content-type") || "" + constructor(context: APIContext) { + this.context = context + } - if (contentType.includes("application/json")) { - const responseBody = JSON.stringify(await response.json()) - return new Response(responseBody, { - headers: { - "content-type": "application/json", - }, - }) - } else { - const responseBody = await response.text() - return new Response(responseBody, { + async sendEmail(emailData: EmailData): Promise { + const response = await fetch(`https://api.resend.com/emails`, { + method: "POST", headers: { - "content-type": contentType, + "Content-Type": "application/json", + Authorization: `Bearer ${this.context.env.RESEND_API_KEY}`, }, + body: JSON.stringify({ ...emailData }), }) + + const contentType = response.headers.get("content-type") || "" + + if (contentType.includes("application/json")) { + const responseBody = JSON.stringify(await response.json()) + return new Response(responseBody, { + headers: { + "content-type": "application/json", + }, + }) + } else { + const responseBody = await response.text() + return new Response(responseBody, { + headers: { + "content-type": contentType, + }, + }) + } } } From 02f7076147baa6260c898109e6b3baa60905fc8a Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Thu, 2 Nov 2023 22:16:10 +0000 Subject: [PATCH 130/318] fix asset uploading --- package.json | 1 + pnpm-lock.yaml | 123 ++++++++++++++++++---- src/v2/routes/auth/assets/upload-asset.ts | 9 +- 3 files changed, 112 insertions(+), 21 deletions(-) diff --git a/package.json b/package.json index 365a28d..5409885 100644 --- a/package.json +++ b/package.json @@ -38,6 +38,7 @@ "drizzle-orm": "^0.28.6", "hono": "^3.8.0", "lucia": "^2.7.1", + "miniflare": "^3.20231025.1", "mysql2": "^3.6.2", "prettier": "^3.0.3", "unstorage": "^1.9.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bebcc60..7178b3e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -35,6 +35,9 @@ dependencies: lucia: specifier: ^2.7.1 version: 2.7.1 + miniflare: + specifier: ^3.20231025.1 + version: 3.20231025.1 mysql2: specifier: ^3.6.2 version: 3.6.2 @@ -124,6 +127,18 @@ packages: dev: true optional: true + /@cloudflare/workerd-darwin-64@1.20231025.0: + resolution: + { + integrity: sha512-MYRYTbSl+tjGg6su7savlLIb8cOcKJfdGpA+WdtgqT2OF7O+89Lag0l1SA/iyVlUkT31Jc6OLHqvzsXgmg+niQ==, + } + engines: { node: ">=16" } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + /@cloudflare/workerd-darwin-arm64@1.20231010.0: resolution: { @@ -136,6 +151,18 @@ packages: dev: true optional: true + /@cloudflare/workerd-darwin-arm64@1.20231025.0: + resolution: + { + integrity: sha512-BszjtBDR84TVa6oWe74dePJSAukWlTmLw9zR4KeWuwZLJGV7RMm6AmwGStetjnwZrecZaaOFELfBCAHtsebV0Q==, + } + engines: { node: ">=16" } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + /@cloudflare/workerd-linux-64@1.20231010.0: resolution: { @@ -148,6 +175,18 @@ packages: dev: true optional: true + /@cloudflare/workerd-linux-64@1.20231025.0: + resolution: + { + integrity: sha512-AT9dxgKXOa9xZxZ3k2a432axPJJ58KpoNWnPiPYGpuAuLoWnfcYwwh6mr9sZVcTdAdTAK9Xu9c81tp0YABanUw==, + } + engines: { node: ">=16" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@cloudflare/workerd-linux-arm64@1.20231010.0: resolution: { @@ -160,6 +199,18 @@ packages: dev: true optional: true + /@cloudflare/workerd-linux-arm64@1.20231025.0: + resolution: + { + integrity: sha512-EIjex5o2k80YZWPix1btGybL/vNZ3o6vqKX9ptS0JcFkHV5aFX5/kcMwSBRjiIC+w04zVjmGQx3N1Vh3njuncg==, + } + engines: { node: ">=16" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@cloudflare/workerd-windows-64@1.20231010.0: resolution: { @@ -172,6 +223,18 @@ packages: dev: true optional: true + /@cloudflare/workerd-windows-64@1.20231025.0: + resolution: + { + integrity: sha512-7vtq0mO22A2v0OOsKXa760r9a84Gg8CK0gDu5uNWlj6hojmt011iz7jJt76I7oo/XrVwVlVfu69GnA3ljx6U8w==, + } + engines: { node: ">=16" } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@cloudflare/workers-types@4.20231016.0: resolution: { @@ -808,7 +871,6 @@ packages: integrity: sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==, } engines: { node: ">=14" } - dev: true /@hono/zod-openapi@0.7.2(hono@3.8.0)(zod@3.22.4): resolution: @@ -1468,7 +1530,6 @@ packages: integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==, } engines: { node: ">=0.4.0" } - dev: true /acorn@8.10.0: resolution: @@ -1543,7 +1604,6 @@ packages: } dependencies: printable-characters: 1.0.42 - dev: true /asynckit@0.4.0: resolution: @@ -1642,7 +1702,6 @@ packages: { integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, } - dev: true /buffer@5.7.1: resolution: @@ -1679,7 +1738,6 @@ packages: tslib: 2.6.2 transitivePeerDependencies: - supports-color - dev: true /chalk@4.1.2: resolution: @@ -1826,7 +1884,6 @@ packages: integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==, } engines: { node: ">= 0.6" } - dev: true /cross-spawn@7.0.3: resolution: @@ -1854,7 +1911,6 @@ packages: { integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==, } - dev: true /data-uri-to-buffer@4.0.1: resolution: @@ -2403,7 +2459,6 @@ packages: integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==, } engines: { node: ">=6" } - dev: true /expand-template@2.0.3: resolution: @@ -2594,7 +2649,6 @@ packages: dependencies: data-uri-to-buffer: 2.0.2 source-map: 0.6.1 - dev: true /get-stream@6.0.1: resolution: @@ -2643,7 +2697,6 @@ packages: { integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==, } - dev: true /glob@7.2.3: resolution: @@ -3292,6 +3345,31 @@ packages: - utf-8-validate dev: true + /miniflare@3.20231025.1: + resolution: + { + integrity: sha512-zwvu/f6eivBBF2shuom5DibnZjGSxt6FiC8sZlj+CcqTRss1D2ZHYD09odhAZLY9DYXE0orBFkJKnIDx/QmYdQ==, + } + engines: { node: ">=16.13" } + dependencies: + acorn: 8.10.0 + acorn-walk: 8.2.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.26.3 + workerd: 1.20231025.0 + ws: 8.14.2 + youch: 3.3.2 + zod: 3.22.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + /minimatch@3.1.2: resolution: { @@ -3366,7 +3444,6 @@ packages: integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==, } hasBin: true - dev: true /mysql2@3.6.2: resolution: @@ -3697,7 +3774,6 @@ packages: { integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==, } - dev: true /pump@3.0.0: resolution: @@ -3955,7 +4031,6 @@ packages: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - dev: true /source-map@0.6.1: resolution: @@ -3963,7 +4038,6 @@ packages: integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, } engines: { node: ">=0.10.0" } - dev: true /sourcemap-codec@1.4.8: resolution: @@ -3989,7 +4063,6 @@ packages: dependencies: as-table: 1.0.55 get-source: 2.0.12 - dev: true /standard-as-callback@2.1.0: resolution: @@ -4011,7 +4084,6 @@ packages: integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==, } engines: { node: ">=4", npm: ">=6" } - dev: true /string_decoder@1.3.0: resolution: @@ -4138,7 +4210,6 @@ packages: { integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==, } - dev: true /tsx@3.13.0: resolution: @@ -4229,7 +4300,6 @@ packages: engines: { node: ">=14.0" } dependencies: "@fastify/busboy": 2.0.0 - dev: true /unenv@1.7.4: resolution: @@ -4433,6 +4503,22 @@ packages: "@cloudflare/workerd-windows-64": 1.20231010.0 dev: true + /workerd@1.20231025.0: + resolution: + { + integrity: sha512-W1PFtpMFfvmm+ozBf+u70TE3Pviv7WA4qzDeejHDC4z+PFDq4+3KJCkgffaGBO86h+akWO0hSsc0uXL2zAqofQ==, + } + engines: { node: ">=16" } + hasBin: true + requiresBuild: true + optionalDependencies: + "@cloudflare/workerd-darwin-64": 1.20231025.0 + "@cloudflare/workerd-darwin-arm64": 1.20231025.0 + "@cloudflare/workerd-linux-64": 1.20231025.0 + "@cloudflare/workerd-linux-arm64": 1.20231025.0 + "@cloudflare/workerd-windows-64": 1.20231025.0 + dev: false + /wrangler@3.13.1: resolution: { @@ -4521,7 +4607,6 @@ packages: cookie: 0.5.0 mustache: 4.2.0 stacktracey: 2.1.8 - dev: true /zod@3.22.4: resolution: diff --git a/src/v2/routes/auth/assets/upload-asset.ts b/src/v2/routes/auth/assets/upload-asset.ts index 893f462..cc51414 100644 --- a/src/v2/routes/auth/assets/upload-asset.ts +++ b/src/v2/routes/auth/assets/upload-asset.ts @@ -58,7 +58,12 @@ const UploadAssetSchema = z.object({ }) export async function uploadAsset(c: APIContext): Promise { - const formData = UploadAssetSchema.safeParse(await c.req.formData()) + const formData = UploadAssetSchema.safeParse( + await c.req.formData().then((formData) => { + const data = Object.fromEntries(formData.entries()) + return data + }) + ) if (!formData.success) { return c.json({ success: false, state: "invalid data" }, 400) @@ -156,7 +161,7 @@ export async function uploadAsset(c: APIContext): Promise { .values({ id: crypto.randomUUID(), assetId: newAssetDB[0].assetId, - assetTagId: tagExists[0].assetTagId, + assetTagId: tagExists.id, }) .returning({ assetTagId: assetTagAsset.assetTagId, From 4616066e157edb2ca6193c48998ee812ce645644 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Sat, 4 Nov 2023 23:30:47 +0000 Subject: [PATCH 131/318] ternary hell (local db fallback) --- drizzle.config.ts | 12 +++++++++--- src/default/routes/main-routes.ts | 21 +++++++++++++++++++++ src/index.ts | 15 ++------------- src/scripts/migrate/migrate.ts | 11 ++++++++--- src/v2/db/turso.ts | 16 +++++++++++----- src/worker-configuration.d.ts | 3 ++- 6 files changed, 53 insertions(+), 25 deletions(-) create mode 100644 src/default/routes/main-routes.ts diff --git a/drizzle.config.ts b/drizzle.config.ts index 4a288f6..23d3c55 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -1,6 +1,10 @@ import "dotenv/config" -const { TURSO_DATABASE_AUTH_TOKEN, TURSO_DATABASE_URL } = process.env import type { Config } from "drizzle-kit" +const { TURSO_DATABASE_AUTH_TOKEN, TURSO_DATABASE_URL, ENVIRONMENT } = + process.env +const TURSO_DEV_DATABASE_URL = process.env.TURSO_DEV_DATABASE_URL ?? undefined + +const isDev = ENVIRONMENT === "DEV" export default { out: "./src/v2/db/migrations", @@ -10,7 +14,9 @@ export default { strict: true, verbose: true, dbCredentials: { - url: TURSO_DATABASE_URL as string, - authToken: TURSO_DATABASE_AUTH_TOKEN as string, + url: (isDev + ? TURSO_DEV_DATABASE_URL ?? TURSO_DATABASE_URL + : TURSO_DATABASE_URL) as string, + ...(isDev ? {} : { authToken: TURSO_DATABASE_AUTH_TOKEN }), }, } satisfies Config diff --git a/src/default/routes/main-routes.ts b/src/default/routes/main-routes.ts new file mode 100644 index 0000000..77553a5 --- /dev/null +++ b/src/default/routes/main-routes.ts @@ -0,0 +1,21 @@ +import { Hono } from "hono" +import { getRuntimeKey } from "hono/adapter" + +const mainRoute = new Hono<{ Bindings: Bindings }>() + +mainRoute.get("/status", (c) => { + return c.json( + { + success: "true", + status: "ok", + runtime: getRuntimeKey(), + }, + 200 + ) +}) + +mainRoute.get("/", (c) => { + return c.json({ success: "true", status: "ok" }, 200) +}) + +export default mainRoute diff --git a/src/index.ts b/src/index.ts index 9f9a738..4b93a8b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -6,22 +6,11 @@ import gamesRoute from "./v2/routes/games/games-routes" import authRoute from "./v2/routes/auth/auth-routes" import searchRoute from "./v2/routes/search/search-routes" import tagsRoute from "./v2/routes/tags/tags-routes" -import { getRuntimeKey } from "hono/adapter" +import mainRoute from "./default/routes/main-routes" const app = new Hono<{ Bindings: Bindings }>() -app.get("/status", (c) => { - return c.json( - { - status: "ok", - runtime: getRuntimeKey(), - }, - 200 - ) -}) -app.get("/", (c) => { - return c.json({ success: "true", status: "ok", routes: app.routes }, 200) -}) +app.route("/", mainRoute) app.route("/v2/asset", assetRoute) app.route("/v2/discord", discordRoute) app.route("/v2/oc-generators", ocGeneratorRoute) diff --git a/src/scripts/migrate/migrate.ts b/src/scripts/migrate/migrate.ts index aa41f6f..5cfddc5 100644 --- a/src/scripts/migrate/migrate.ts +++ b/src/scripts/migrate/migrate.ts @@ -3,11 +3,16 @@ import { migrate } from "drizzle-orm/libsql/migrator" import { createClient } from "@libsql/client" import "dotenv/config" -const { TURSO_DATABASE_AUTH_TOKEN, TURSO_DATABASE_URL } = process.env +const { TURSO_DATABASE_AUTH_TOKEN, TURSO_DATABASE_URL, ENVIRONMENT } = + process.env +const TURSO_DEV_DATABASE_URL = process.env.TURSO_DEV_DATABASE_URL ?? undefined +const isDev = ENVIRONMENT === "DEV" const client = createClient({ - url: TURSO_DATABASE_URL, - authToken: TURSO_DATABASE_AUTH_TOKEN, + url: (isDev + ? TURSO_DEV_DATABASE_URL ?? TURSO_DATABASE_URL + : TURSO_DATABASE_URL) as string, + ...(isDev ? {} : { authToken: TURSO_DATABASE_AUTH_TOKEN }), }) const db = drizzleORM(client) diff --git a/src/v2/db/turso.ts b/src/v2/db/turso.ts index f3545d7..c34a4c4 100644 --- a/src/v2/db/turso.ts +++ b/src/v2/db/turso.ts @@ -21,12 +21,18 @@ class LoggerWrapper implements Logger { */ export function getConnection(env: Bindings) { /** - * The `turso` client is created using the `createClient` function from `@libsql/client/web`. - * When running in dev, you don't need to pass `authToken`. - */ + * The `createClient` function is used to create a Turso client. + * The `url` option is set to the `TURSO_DATABASE_URL` environment variable. + * The `authToken` option is set to the `TURSO_DATABASE_AUTH_TOKEN` environment variable. + * If the `ENVIRONMENT` environment variable is set to `DEV`, the `TURSO_DEV_DATABASE_URL` environment variable is used instead. + **/ + const isDev = env.ENVIRONMENT === "DEV" + const turso = createClient({ - url: env.TURSO_DATABASE_URL, - authToken: env.TURSO_DATABASE_AUTH_TOKEN, + url: isDev + ? env.TURSO_DEV_DATABASE_URL ?? env.TURSO_DATABASE_URL + : env.TURSO_DATABASE_URL, + ...(isDev ? {} : { authToken: env.TURSO_DATABASE_AUTH_TOKEN }), }) /** diff --git a/src/worker-configuration.d.ts b/src/worker-configuration.d.ts index 04ea22c..3948365 100644 --- a/src/worker-configuration.d.ts +++ b/src/worker-configuration.d.ts @@ -6,7 +6,7 @@ declare global { DISCORD_TOKEN: string FILES_BUCKET: R2Bucket KV_SESSION_STORAGE: KVNamespace - ENVIRONMENT: string // should be "DEV", "PROD" + ENVIRONMENT: "PROD" | "DEV" VERY_SECRET_SIGNUP_KEY: string TURSO_DATABASE_URL: string TURSO_DATABASE_AUTH_TOKEN: string @@ -14,6 +14,7 @@ declare global { DISCORD_CLIENT_SECRET: string DISCORD_REDIRECT_URI: string RESEND_API_KEY: string + TURSO_DEV_DATABASE_URL: string | undefined } /** From bab001110a75473677888e0607abdc8896e5fcb4 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Sun, 5 Nov 2023 00:50:09 +0000 Subject: [PATCH 132/318] update readme & scripts --- README.md | 14 +++++++++++--- package.json | 9 +++++---- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 1e90af7..dd8e30c 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,15 @@ Source code for the API powering [**wanderer.moe**](https://wanderer.moe) — us ## Usage -#### Wrangler +### Turso + +We use Turso as our database. You will need to install the [Turso CLI](https://docs.turso.tech/reference/turso-cli#installation) then run `turso dev` to start a local database. You can persist data by passing `--db-file `. + +The Turso CLI can be ran on Windows using WSL. + +The API will connect to the local database if the environment is set to `DEV`, else it will connect to your production database. + +### Wrangler Configuration is in `wrangler.toml`. @@ -23,7 +31,7 @@ Required environment variables are viewable in `./src/worker-configuration.d.ts` - Run `wrangler dev` to preview locally. - Run `wrangler deploy` to publish to Cloudflare Workers. -#### Actions +### Actions - There is a GitHub Action that automatically deploys to Cloudflare Workers on every push to `main` — you can find it in `.github/workflows/deploy.yml`. @@ -31,7 +39,7 @@ Required environment variables are viewable in `./src/worker-configuration.d.ts` ### Database -- When migrating, you wil need to install `ts-node` globally on your machine. +- When migrating, you will need `tsx`. - It's not reccomended to use `drizzle:push` in production. However, there is `drizzle:generate` & `drizzle:migrate` available as scripts. diff --git a/package.json b/package.json index 5409885..23c6a67 100644 --- a/package.json +++ b/package.json @@ -2,12 +2,13 @@ "name": "api", "version": "1.1.0b", "scripts": { - "prettier:fmt": "prettier --write .", - "dev": "wrangler dev --remote", - "publish": "wrangler publish --minify", + "wrangler:dev:local": "wrangler dev", + "wrangler:dev:remote": "wrangler dev --remote", + "wrangler:publish": "wrangler publish --minify", "lint": "eslint . --ext .ts", - "prettier:check": "prettier --check .", "typecheck": "tsc --noEmit", + "prettier:format": "prettier --write .", + "prettier:check": "prettier --check .", "drizzle:generate": "drizzle-kit generate:sqlite", "drizzle:migrate": "tsx ./src/scripts/migrate/migrate", "drizzle:push": "drizzle-kit push:sqlite", From f104e4f226984ae1df81827312d09b0c966c56f7 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Sun, 5 Nov 2023 01:58:28 +0000 Subject: [PATCH 133/318] test workflow, persistent client & local dev --- .env.example | 4 + .github/workflows/check.yml | 2 +- .github/workflows/deploy.yml | 13 - .github/workflows/test.yml | 41 + drizzle.config.ts | 4 +- package.json | 2 +- src/scripts/migrate/migrate.mts | 42 + src/scripts/migrate/migrate.ts | 28 - .../migrations/0000_nifty_killer_shrike.sql | 232 +++ src/v2/db/migrations/meta/0000_snapshot.json | 1414 +++++++++++++++++ src/v2/db/migrations/meta/_journal.json | 13 + src/v2/db/schema.ts | 1 + src/v2/db/schema/asset/asset.ts | 4 +- src/v2/db/turso.ts | 5 +- src/v2/lib/helpers/status-codes.ts | 31 + 15 files changed, 1788 insertions(+), 48 deletions(-) create mode 100644 .env.example create mode 100644 .github/workflows/test.yml create mode 100644 src/scripts/migrate/migrate.mts delete mode 100644 src/scripts/migrate/migrate.ts create mode 100644 src/v2/db/migrations/0000_nifty_killer_shrike.sql create mode 100644 src/v2/db/migrations/meta/0000_snapshot.json create mode 100644 src/v2/db/migrations/meta/_journal.json create mode 100644 src/v2/lib/helpers/status-codes.ts diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..08210a3 --- /dev/null +++ b/.env.example @@ -0,0 +1,4 @@ +TURSO_DEV_DATABASE_URL = http://127.0.0.1:8080 +ENVIRONMENT = DEV +TURSO_DATABASE_URL = dsikfjhskdlfnjklsdfnjgnfkslndfg +TURSO_DATABASE_AUTH_TOKEN = hi \ No newline at end of file diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 1c6708c..856f886 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -14,7 +14,7 @@ jobs: name: Prettier formatting runs-on: ubuntu-latest steps: - - name: Checkout repo + - name: Checkout repository uses: actions/checkout@v3 - name: Setup Node.js diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 766ba86..63b33e8 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -24,19 +24,6 @@ jobs: version: latest run_install: false - # - name: Get pnpm store directory - # id: pnpm-cache - # run: | - # echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT - - # - uses: actions/cache@v3 - # name: Setup pnpm cache - # with: - # path: ${{ steps.pnpm-cache.outputs.STORE_PATH }} - # key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} - # restore-keys: | - # ${{ runner.os }}-pnpm-store- - - name: Install dependencies run: pnpm install diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..d248cbb --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,41 @@ +name: Run Tests +on: + push: + branches: + - "*" + +jobs: + tests: + name: Tests + runs-on: ubuntu-latest + timeout-minutes: 5 + # local sqld instance for "turso dev" + services: + sqld: + image: ghcr.io/libsql/sqld:latest + ports: + - 8080:8080 + + env: + ENVIRONMENT: "DEV" + TURSO_DEV_DATABASE_URL: http://127.0.0.1:8080 + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: 18 + + - name: Install pnpm + uses: pnpm/action-setup@v2 + with: + version: latest + run_install: false + + - name: Install dependencies + run: pnpm install + + - name: Migrate Database + run: pnpm drizzle:migrate diff --git a/drizzle.config.ts b/drizzle.config.ts index 23d3c55..fa85e95 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -2,7 +2,9 @@ import "dotenv/config" import type { Config } from "drizzle-kit" const { TURSO_DATABASE_AUTH_TOKEN, TURSO_DATABASE_URL, ENVIRONMENT } = process.env -const TURSO_DEV_DATABASE_URL = process.env.TURSO_DEV_DATABASE_URL ?? undefined + +const TURSO_DEV_DATABASE_URL = + process.env.TURSO_DEV_DATABASE_URL ?? "http://127.0.0.1:8080" const isDev = ENVIRONMENT === "DEV" diff --git a/package.json b/package.json index 23c6a67..0390bce 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "prettier:format": "prettier --write .", "prettier:check": "prettier --check .", "drizzle:generate": "drizzle-kit generate:sqlite", - "drizzle:migrate": "tsx ./src/scripts/migrate/migrate", + "drizzle:migrate": "tsx ./src/scripts/migrate/migrate.mts", "drizzle:push": "drizzle-kit push:sqlite", "drizzle:studio": "drizzle-kit studio --port 7331 --host 127.0.0.1 --verbose" }, diff --git a/src/scripts/migrate/migrate.mts b/src/scripts/migrate/migrate.mts new file mode 100644 index 0000000..8c201b4 --- /dev/null +++ b/src/scripts/migrate/migrate.mts @@ -0,0 +1,42 @@ +import { drizzle as drizzleORM } from "drizzle-orm/libsql" +import { migrate } from "drizzle-orm/libsql/migrator" +import { createClient } from "@libsql/client" +import "dotenv/config" + +const { TURSO_DATABASE_AUTH_TOKEN, TURSO_DATABASE_URL, ENVIRONMENT } = + process.env +const TURSO_DEV_DATABASE_URL = + process.env.TURSO_DEV_DATABASE_URL ?? "http://127.0.0.1:8080" +const isDev = ENVIRONMENT === "DEV" + +async function main() { + + console.log("IS_DEV: ", isDev) + + isDev && console.log("TURSO_DEV_DATABASE_URL: ", TURSO_DEV_DATABASE_URL) + !isDev && console.log("TURSO_DATABASE_URL: ", TURSO_DATABASE_URL) + + console.log("Awaiting 5 seconds before migrating...") + await new Promise((resolve) => setTimeout(resolve, 5000)) + + console.log("Connecting to database client...") + const client = createClient({ + url: (isDev + ? TURSO_DEV_DATABASE_URL ?? TURSO_DATABASE_URL + : TURSO_DATABASE_URL) as string, + ...(isDev ? {} : { authToken: TURSO_DATABASE_AUTH_TOKEN }), + }) + const db = drizzleORM(client) + console.log("Connected to database client & initialized drizzle-orm instance") + + console.log("Migrating database...") + await migrate(db, { migrationsFolder: "./src/v2/db/migrations" }) + console.log("Migrations complete!") + + process.exit(0) +} + +main().catch((err) => { + console.error(`Error: ${err}`) + process.exit(1) +}) diff --git a/src/scripts/migrate/migrate.ts b/src/scripts/migrate/migrate.ts deleted file mode 100644 index 5cfddc5..0000000 --- a/src/scripts/migrate/migrate.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { drizzle as drizzleORM } from "drizzle-orm/libsql" -import { migrate } from "drizzle-orm/libsql/migrator" -import { createClient } from "@libsql/client" -import "dotenv/config" - -const { TURSO_DATABASE_AUTH_TOKEN, TURSO_DATABASE_URL, ENVIRONMENT } = - process.env -const TURSO_DEV_DATABASE_URL = process.env.TURSO_DEV_DATABASE_URL ?? undefined -const isDev = ENVIRONMENT === "DEV" - -const client = createClient({ - url: (isDev - ? TURSO_DEV_DATABASE_URL ?? TURSO_DATABASE_URL - : TURSO_DATABASE_URL) as string, - ...(isDev ? {} : { authToken: TURSO_DATABASE_AUTH_TOKEN }), -}) - -const db = drizzleORM(client) - -migrate(db, { migrationsFolder: "./src/v2/db/migrations" }) - .then(() => { - console.log("migrations complete") - process.exit(0) - }) - .catch((err) => { - console.error(`migrations failed: ${err}`) - process.exit(1) - }) diff --git a/src/v2/db/migrations/0000_nifty_killer_shrike.sql b/src/v2/db/migrations/0000_nifty_killer_shrike.sql new file mode 100644 index 0000000..002a34e --- /dev/null +++ b/src/v2/db/migrations/0000_nifty_killer_shrike.sql @@ -0,0 +1,232 @@ +CREATE TABLE `asset` ( + `id` integer PRIMARY KEY NOT NULL, + `name` text NOT NULL, + `extension` text NOT NULL, + `game` text NOT NULL, + `asset_category` text NOT NULL, + `url` text NOT NULL, + `status` text DEFAULT 'pending' NOT NULL, + `uploaded_by` text, + `uploaded_by_name` text, + `uploaded_date` integer NOT NULL, + `asset_is_optimized` integer DEFAULT 0 NOT NULL, + `view_count` integer DEFAULT 0 NOT NULL, + `download_count` integer DEFAULT 0 NOT NULL, + `file_size` integer DEFAULT 0 NOT NULL, + `width` integer DEFAULT 0 NOT NULL, + `height` integer DEFAULT 0 NOT NULL, + FOREIGN KEY (`game`) REFERENCES `game`(`name`) ON UPDATE cascade ON DELETE cascade, + FOREIGN KEY (`asset_category`) REFERENCES `assetCategory`(`name`) ON UPDATE cascade ON DELETE cascade, + FOREIGN KEY (`uploaded_by`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade, + FOREIGN KEY (`uploaded_by_name`) REFERENCES `authUser`(`username`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `assetCategory` ( + `id` text PRIMARY KEY NOT NULL, + `name` text NOT NULL, + `formatted_name` text NOT NULL, + `asset_count` integer DEFAULT 0 NOT NULL, + `last_updated` integer NOT NULL +); +--> statement-breakpoint +CREATE TABLE `gameAssetCategory` ( + `id` text PRIMARY KEY NOT NULL, + `game_id` text NOT NULL, + `asset_category_id` text NOT NULL, + FOREIGN KEY (`game_id`) REFERENCES `game`(`id`) ON UPDATE cascade ON DELETE cascade, + FOREIGN KEY (`asset_category_id`) REFERENCES `assetCategory`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `assetTag` ( + `id` text PRIMARY KEY NOT NULL, + `name` text NOT NULL, + `formatted_name` text NOT NULL, + `asset_count` integer DEFAULT 0 NOT NULL, + `last_updated` integer NOT NULL +); +--> statement-breakpoint +CREATE TABLE `assetTagAsset` ( + `id` text PRIMARY KEY NOT NULL, + `asset_tag_id` text NOT NULL, + `asset_id` integer NOT NULL, + FOREIGN KEY (`asset_tag_id`) REFERENCES `assetTag`(`id`) ON UPDATE cascade ON DELETE cascade, + FOREIGN KEY (`asset_id`) REFERENCES `asset`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `atlas` ( + `id` text PRIMARY KEY NOT NULL, + `url` text NOT NULL, + `uploaded_by` text NOT NULL, + `uploaded_by_name` text NOT NULL, + `uploaded_date` integer NOT NULL, + `file_size` integer DEFAULT 0 NOT NULL +); +--> statement-breakpoint +CREATE TABLE `atlasToAsset` ( + `id` text PRIMARY KEY NOT NULL, + `atlas_id` text NOT NULL, + `asset_id` integer NOT NULL, + FOREIGN KEY (`atlas_id`) REFERENCES `atlas`(`id`) ON UPDATE cascade ON DELETE cascade, + FOREIGN KEY (`asset_id`) REFERENCES `asset`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `game` ( + `id` text PRIMARY KEY NOT NULL, + `name` text NOT NULL, + `formatted_name` text NOT NULL, + `asset_count` integer DEFAULT 0, + `possible_suggestive_content` integer DEFAULT 0 NOT NULL, + `last_updated` integer NOT NULL +); +--> statement-breakpoint +CREATE TABLE `savedOcGenerators` ( + `id` text PRIMARY KEY NOT NULL, + `user_id` text NOT NULL, + `name` text NOT NULL, + `game` text NOT NULL, + `date_created` text NOT NULL, + `is_public` integer DEFAULT 0 NOT NULL, + `content` text NOT NULL, + `saved_color_palette` text, + `sakura_url` text, + FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `authUser` ( + `id` text PRIMARY KEY NOT NULL, + `avatar_url` text, + `banner_url` text, + `display_name` text, + `username` text NOT NULL, + `username_colour` text, + `email` text NOT NULL, + `email_verified` integer DEFAULT 0 NOT NULL, + `pronouns` text, + `verified` integer DEFAULT 0 NOT NULL, + `bio` text DEFAULT 'No bio set' NOT NULL, + `date_joined` text NOT NULL, + `role_flags` integer DEFAULT 1 NOT NULL, + `is_contributor` integer DEFAULT 0 NOT NULL, + `self_assignable_role_flags` integer DEFAULT 0 NOT NULL +); +--> statement-breakpoint +CREATE TABLE `authKey` ( + `id` text PRIMARY KEY NOT NULL, + `user_id` text NOT NULL, + `hashed_password` text, + FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `emailVerificationToken` ( + `id` text PRIMARY KEY NOT NULL, + `user_id` text NOT NULL, + `token` text NOT NULL, + `expires_at` integer NOT NULL, + FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `passwordResetToken` ( + `id` text PRIMARY KEY NOT NULL, + `user_id` text NOT NULL, + `token` text NOT NULL, + `expires_at` integer NOT NULL, + FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `userCollection` ( + `id` text PRIMARY KEY NOT NULL, + `name` text NOT NULL, + `description` text NOT NULL, + `user_id` text NOT NULL, + `date_created` text NOT NULL, + `is_public` integer DEFAULT 0 NOT NULL, + FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `assetCollectionAsset` ( + `id` text PRIMARY KEY NOT NULL, + `collection_id` text NOT NULL, + `asset_id` integer NOT NULL, + FOREIGN KEY (`collection_id`) REFERENCES `userCollection`(`id`) ON UPDATE cascade ON DELETE cascade, + FOREIGN KEY (`asset_id`) REFERENCES `asset`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `socialsConnection` ( + `id` text PRIMARY KEY NOT NULL, + `user_id` text NOT NULL, + `discord_id` text, + FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `userFavorite` ( + `id` text PRIMARY KEY NOT NULL, + `user_id` text NOT NULL, + `is_public` integer DEFAULT 0 NOT NULL, + FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `userFavoriteAsset` ( + `id` text PRIMARY KEY NOT NULL, + `favorited_assets_id` text NOT NULL, + `asset_id` integer NOT NULL, + FOREIGN KEY (`favorited_assets_id`) REFERENCES `userFavorite`(`id`) ON UPDATE cascade ON DELETE cascade, + FOREIGN KEY (`asset_id`) REFERENCES `asset`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `userNetworking` ( + `followerId` text NOT NULL, + `followingId` text NOT NULL, + `createdAt` text NOT NULL, + `updatedAt` text NOT NULL, + FOREIGN KEY (`followerId`) REFERENCES `authUser`(`id`) ON UPDATE no action ON DELETE no action, + FOREIGN KEY (`followingId`) REFERENCES `authUser`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE INDEX `assets_id_idx` ON `asset` (`id`);--> statement-breakpoint +CREATE INDEX `assets_name_idx` ON `asset` (`name`);--> statement-breakpoint +CREATE INDEX `assets_game_idx` ON `asset` (`game`);--> statement-breakpoint +CREATE INDEX `assets_asset_category_idx` ON `asset` (`asset_category`);--> statement-breakpoint +CREATE INDEX `assets_uploaded_by_idx` ON `asset` (`uploaded_by`);--> statement-breakpoint +CREATE INDEX `assets_uploaded_by_name_idx` ON `asset` (`uploaded_by_name`);--> statement-breakpoint +CREATE INDEX `asset_category_id_idx` ON `assetCategory` (`id`);--> statement-breakpoint +CREATE INDEX `asset_category_name_idx` ON `assetCategory` (`name`);--> statement-breakpoint +CREATE INDEX `game_asset_category_id_idx` ON `gameAssetCategory` (`id`);--> statement-breakpoint +CREATE INDEX `game_asset_category_game_id_idx` ON `gameAssetCategory` (`game_id`);--> statement-breakpoint +CREATE INDEX `game_asset_category_asset_category_id_idx` ON `gameAssetCategory` (`asset_category_id`);--> statement-breakpoint +CREATE INDEX `asset_tag_id_idx` ON `assetTag` (`id`);--> statement-breakpoint +CREATE INDEX `asset_tag_name_idx` ON `assetTag` (`name`);--> statement-breakpoint +CREATE INDEX `asset_tags_assets_id_idx` ON `assetTagAsset` (`id`);--> statement-breakpoint +CREATE INDEX `asset_tags_assets_asset_tag_id_idx` ON `assetTagAsset` (`asset_tag_id`);--> statement-breakpoint +CREATE INDEX `asset_tags_assets_asset_id_idx` ON `assetTagAsset` (`asset_id`);--> statement-breakpoint +CREATE INDEX `atlas_id_idx` ON `atlas` (`id`);--> statement-breakpoint +CREATE INDEX `atlas_uploaded_by_idx` ON `atlas` (`uploaded_by`);--> statement-breakpoint +CREATE INDEX `atlas_uploaded_by_name_idx` ON `atlas` (`uploaded_by_name`);--> statement-breakpoint +CREATE INDEX `atlas_to_assets_id_idx` ON `atlasToAsset` (`id`);--> statement-breakpoint +CREATE INDEX `atlas_to_assets_atlas_id_idx` ON `atlasToAsset` (`atlas_id`);--> statement-breakpoint +CREATE INDEX `atlas_to_assets_asset_id_idx` ON `atlasToAsset` (`asset_id`);--> statement-breakpoint +CREATE INDEX `game_id_idx` ON `game` (`id`);--> statement-breakpoint +CREATE INDEX `game_name_idx` ON `game` (`name`);--> statement-breakpoint +CREATE INDEX `saved_oc_generators_id_idx` ON `savedOcGenerators` (`id`);--> statement-breakpoint +CREATE INDEX `saved_oc_generators_user_id_idx` ON `savedOcGenerators` (`user_id`);--> statement-breakpoint +CREATE INDEX `user_id_idx` ON `authUser` (`id`);--> statement-breakpoint +CREATE INDEX `user_username_idx` ON `authUser` (`username`);--> statement-breakpoint +CREATE INDEX `user_email_idx` ON `authUser` (`email`);--> statement-breakpoint +CREATE INDEX `key_user_id_idx` ON `authKey` (`user_id`);--> statement-breakpoint +CREATE INDEX `email_verification_token_user_id_idx` ON `emailVerificationToken` (`user_id`);--> statement-breakpoint +CREATE INDEX `email_verification_token_token_idx` ON `emailVerificationToken` (`token`);--> statement-breakpoint +CREATE INDEX `password_reset_token_user_id_idx` ON `passwordResetToken` (`user_id`);--> statement-breakpoint +CREATE INDEX `password_reset_token_token_idx` ON `passwordResetToken` (`token`);--> statement-breakpoint +CREATE INDEX `collection_id_idx` ON `userCollection` (`id`);--> statement-breakpoint +CREATE INDEX `user_collection_id_idx` ON `userCollection` (`user_id`);--> statement-breakpoint +CREATE INDEX `collection_assets_id_idx` ON `assetCollectionAsset` (`id`);--> statement-breakpoint +CREATE INDEX `collection_assets_collection_id_idx` ON `assetCollectionAsset` (`collection_id`);--> statement-breakpoint +CREATE INDEX `collection_assets_asset_id_idx` ON `assetCollectionAsset` (`asset_id`);--> statement-breakpoint +CREATE INDEX `socials_connection_user_id_idx` ON `socialsConnection` (`user_id`);--> statement-breakpoint +CREATE INDEX `socials_connection_discord_id_idx` ON `socialsConnection` (`discord_id`);--> statement-breakpoint +CREATE INDEX `favorited_assets_id_idx` ON `userFavorite` (`id`);--> statement-breakpoint +CREATE INDEX `favorited_assets_user_id_idx` ON `userFavorite` (`user_id`);--> statement-breakpoint +CREATE INDEX `favorited_assets_assets_id_idx` ON `userFavoriteAsset` (`id`);--> statement-breakpoint +CREATE INDEX `favorited_assets_assets_user_id_idx` ON `userFavoriteAsset` (`favorited_assets_id`);--> statement-breakpoint +CREATE INDEX `favorited_assets_assets_asset_id_idx` ON `userFavoriteAsset` (`asset_id`);--> statement-breakpoint +CREATE INDEX `userNetworking_follower_idx` ON `userNetworking` (`followerId`);--> statement-breakpoint +CREATE INDEX `userNetworking_following_idx` ON `userNetworking` (`followingId`); \ No newline at end of file diff --git a/src/v2/db/migrations/meta/0000_snapshot.json b/src/v2/db/migrations/meta/0000_snapshot.json new file mode 100644 index 0000000..c7f68b5 --- /dev/null +++ b/src/v2/db/migrations/meta/0000_snapshot.json @@ -0,0 +1,1414 @@ +{ + "version": "5", + "dialect": "sqlite", + "id": "d2fefb1c-29ea-4846-b345-ce891eb7d076", + "prevId": "00000000-0000-0000-0000-000000000000", + "tables": { + "asset": { + "name": "asset", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "extension": { + "name": "extension", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "game": { + "name": "game", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_category": { + "name": "asset_category", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'pending'" + }, + "uploaded_by": { + "name": "uploaded_by", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "uploaded_by_name": { + "name": "uploaded_by_name", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "uploaded_date": { + "name": "uploaded_date", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_is_optimized": { + "name": "asset_is_optimized", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "view_count": { + "name": "view_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "download_count": { + "name": "download_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "file_size": { + "name": "file_size", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "width": { + "name": "width", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "height": { + "name": "height", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "assets_id_idx": { + "name": "assets_id_idx", + "columns": ["id"], + "isUnique": false + }, + "assets_name_idx": { + "name": "assets_name_idx", + "columns": ["name"], + "isUnique": false + }, + "assets_game_idx": { + "name": "assets_game_idx", + "columns": ["game"], + "isUnique": false + }, + "assets_asset_category_idx": { + "name": "assets_asset_category_idx", + "columns": ["asset_category"], + "isUnique": false + }, + "assets_uploaded_by_idx": { + "name": "assets_uploaded_by_idx", + "columns": ["uploaded_by"], + "isUnique": false + }, + "assets_uploaded_by_name_idx": { + "name": "assets_uploaded_by_name_idx", + "columns": ["uploaded_by_name"], + "isUnique": false + } + }, + "foreignKeys": { + "asset_game_game_name_fk": { + "name": "asset_game_game_name_fk", + "tableFrom": "asset", + "tableTo": "game", + "columnsFrom": ["game"], + "columnsTo": ["name"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "asset_asset_category_assetCategory_name_fk": { + "name": "asset_asset_category_assetCategory_name_fk", + "tableFrom": "asset", + "tableTo": "assetCategory", + "columnsFrom": ["asset_category"], + "columnsTo": ["name"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "asset_uploaded_by_authUser_id_fk": { + "name": "asset_uploaded_by_authUser_id_fk", + "tableFrom": "asset", + "tableTo": "authUser", + "columnsFrom": ["uploaded_by"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "asset_uploaded_by_name_authUser_username_fk": { + "name": "asset_uploaded_by_name_authUser_username_fk", + "tableFrom": "asset", + "tableTo": "authUser", + "columnsFrom": ["uploaded_by_name"], + "columnsTo": ["username"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetCategory": { + "name": "assetCategory", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "asset_category_id_idx": { + "name": "asset_category_id_idx", + "columns": ["id"], + "isUnique": false + }, + "asset_category_name_idx": { + "name": "asset_category_name_idx", + "columns": ["name"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "gameAssetCategory": { + "name": "gameAssetCategory", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "game_id": { + "name": "game_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_category_id": { + "name": "asset_category_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "game_asset_category_id_idx": { + "name": "game_asset_category_id_idx", + "columns": ["id"], + "isUnique": false + }, + "game_asset_category_game_id_idx": { + "name": "game_asset_category_game_id_idx", + "columns": ["game_id"], + "isUnique": false + }, + "game_asset_category_asset_category_id_idx": { + "name": "game_asset_category_asset_category_id_idx", + "columns": ["asset_category_id"], + "isUnique": false + } + }, + "foreignKeys": { + "gameAssetCategory_game_id_game_id_fk": { + "name": "gameAssetCategory_game_id_game_id_fk", + "tableFrom": "gameAssetCategory", + "tableTo": "game", + "columnsFrom": ["game_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "gameAssetCategory_asset_category_id_assetCategory_id_fk": { + "name": "gameAssetCategory_asset_category_id_assetCategory_id_fk", + "tableFrom": "gameAssetCategory", + "tableTo": "assetCategory", + "columnsFrom": ["asset_category_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetTag": { + "name": "assetTag", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "asset_tag_id_idx": { + "name": "asset_tag_id_idx", + "columns": ["id"], + "isUnique": false + }, + "asset_tag_name_idx": { + "name": "asset_tag_name_idx", + "columns": ["name"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetTagAsset": { + "name": "assetTagAsset", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "asset_tag_id": { + "name": "asset_tag_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "asset_tags_assets_id_idx": { + "name": "asset_tags_assets_id_idx", + "columns": ["id"], + "isUnique": false + }, + "asset_tags_assets_asset_tag_id_idx": { + "name": "asset_tags_assets_asset_tag_id_idx", + "columns": ["asset_tag_id"], + "isUnique": false + }, + "asset_tags_assets_asset_id_idx": { + "name": "asset_tags_assets_asset_id_idx", + "columns": ["asset_id"], + "isUnique": false + } + }, + "foreignKeys": { + "assetTagAsset_asset_tag_id_assetTag_id_fk": { + "name": "assetTagAsset_asset_tag_id_assetTag_id_fk", + "tableFrom": "assetTagAsset", + "tableTo": "assetTag", + "columnsFrom": ["asset_tag_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "assetTagAsset_asset_id_asset_id_fk": { + "name": "assetTagAsset_asset_id_asset_id_fk", + "tableFrom": "assetTagAsset", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "atlas": { + "name": "atlas", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by": { + "name": "uploaded_by", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by_name": { + "name": "uploaded_by_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_date": { + "name": "uploaded_date", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "file_size": { + "name": "file_size", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "atlas_id_idx": { + "name": "atlas_id_idx", + "columns": ["id"], + "isUnique": false + }, + "atlas_uploaded_by_idx": { + "name": "atlas_uploaded_by_idx", + "columns": ["uploaded_by"], + "isUnique": false + }, + "atlas_uploaded_by_name_idx": { + "name": "atlas_uploaded_by_name_idx", + "columns": ["uploaded_by_name"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "atlasToAsset": { + "name": "atlasToAsset", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "atlas_id": { + "name": "atlas_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "atlas_to_assets_id_idx": { + "name": "atlas_to_assets_id_idx", + "columns": ["id"], + "isUnique": false + }, + "atlas_to_assets_atlas_id_idx": { + "name": "atlas_to_assets_atlas_id_idx", + "columns": ["atlas_id"], + "isUnique": false + }, + "atlas_to_assets_asset_id_idx": { + "name": "atlas_to_assets_asset_id_idx", + "columns": ["asset_id"], + "isUnique": false + } + }, + "foreignKeys": { + "atlasToAsset_atlas_id_atlas_id_fk": { + "name": "atlasToAsset_atlas_id_atlas_id_fk", + "tableFrom": "atlasToAsset", + "tableTo": "atlas", + "columnsFrom": ["atlas_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "atlasToAsset_asset_id_asset_id_fk": { + "name": "atlasToAsset_asset_id_asset_id_fk", + "tableFrom": "atlasToAsset", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "game": { + "name": "game", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": 0 + }, + "possible_suggestive_content": { + "name": "possible_suggestive_content", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "game_id_idx": { + "name": "game_id_idx", + "columns": ["id"], + "isUnique": false + }, + "game_name_idx": { + "name": "game_name_idx", + "columns": ["name"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "savedOcGenerators": { + "name": "savedOcGenerators", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "game": { + "name": "game", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "date_created": { + "name": "date_created", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "saved_color_palette": { + "name": "saved_color_palette", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sakura_url": { + "name": "sakura_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "saved_oc_generators_id_idx": { + "name": "saved_oc_generators_id_idx", + "columns": ["id"], + "isUnique": false + }, + "saved_oc_generators_user_id_idx": { + "name": "saved_oc_generators_user_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "savedOcGenerators_user_id_authUser_id_fk": { + "name": "savedOcGenerators_user_id_authUser_id_fk", + "tableFrom": "savedOcGenerators", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "authUser": { + "name": "authUser", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "avatar_url": { + "name": "avatar_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "banner_url": { + "name": "banner_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "display_name": { + "name": "display_name", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "username_colour": { + "name": "username_colour", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "email_verified": { + "name": "email_verified", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "pronouns": { + "name": "pronouns", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "verified": { + "name": "verified", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "bio": { + "name": "bio", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'No bio set'" + }, + "date_joined": { + "name": "date_joined", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "role_flags": { + "name": "role_flags", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "is_contributor": { + "name": "is_contributor", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "self_assignable_role_flags": { + "name": "self_assignable_role_flags", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "user_id_idx": { + "name": "user_id_idx", + "columns": ["id"], + "isUnique": false + }, + "user_username_idx": { + "name": "user_username_idx", + "columns": ["username"], + "isUnique": false + }, + "user_email_idx": { + "name": "user_email_idx", + "columns": ["email"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "authKey": { + "name": "authKey", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "hashed_password": { + "name": "hashed_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "key_user_id_idx": { + "name": "key_user_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "authKey_user_id_authUser_id_fk": { + "name": "authKey_user_id_authUser_id_fk", + "tableFrom": "authKey", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "emailVerificationToken": { + "name": "emailVerificationToken", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "email_verification_token_user_id_idx": { + "name": "email_verification_token_user_id_idx", + "columns": ["user_id"], + "isUnique": false + }, + "email_verification_token_token_idx": { + "name": "email_verification_token_token_idx", + "columns": ["token"], + "isUnique": false + } + }, + "foreignKeys": { + "emailVerificationToken_user_id_authUser_id_fk": { + "name": "emailVerificationToken_user_id_authUser_id_fk", + "tableFrom": "emailVerificationToken", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "passwordResetToken": { + "name": "passwordResetToken", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "password_reset_token_user_id_idx": { + "name": "password_reset_token_user_id_idx", + "columns": ["user_id"], + "isUnique": false + }, + "password_reset_token_token_idx": { + "name": "password_reset_token_token_idx", + "columns": ["token"], + "isUnique": false + } + }, + "foreignKeys": { + "passwordResetToken_user_id_authUser_id_fk": { + "name": "passwordResetToken_user_id_authUser_id_fk", + "tableFrom": "passwordResetToken", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userCollection": { + "name": "userCollection", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "date_created": { + "name": "date_created", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "collection_id_idx": { + "name": "collection_id_idx", + "columns": ["id"], + "isUnique": false + }, + "user_collection_id_idx": { + "name": "user_collection_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "userCollection_user_id_authUser_id_fk": { + "name": "userCollection_user_id_authUser_id_fk", + "tableFrom": "userCollection", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetCollectionAsset": { + "name": "assetCollectionAsset", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "collection_id": { + "name": "collection_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "collection_assets_id_idx": { + "name": "collection_assets_id_idx", + "columns": ["id"], + "isUnique": false + }, + "collection_assets_collection_id_idx": { + "name": "collection_assets_collection_id_idx", + "columns": ["collection_id"], + "isUnique": false + }, + "collection_assets_asset_id_idx": { + "name": "collection_assets_asset_id_idx", + "columns": ["asset_id"], + "isUnique": false + } + }, + "foreignKeys": { + "assetCollectionAsset_collection_id_userCollection_id_fk": { + "name": "assetCollectionAsset_collection_id_userCollection_id_fk", + "tableFrom": "assetCollectionAsset", + "tableTo": "userCollection", + "columnsFrom": ["collection_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "assetCollectionAsset_asset_id_asset_id_fk": { + "name": "assetCollectionAsset_asset_id_asset_id_fk", + "tableFrom": "assetCollectionAsset", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "socialsConnection": { + "name": "socialsConnection", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "discord_id": { + "name": "discord_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "socials_connection_user_id_idx": { + "name": "socials_connection_user_id_idx", + "columns": ["user_id"], + "isUnique": false + }, + "socials_connection_discord_id_idx": { + "name": "socials_connection_discord_id_idx", + "columns": ["discord_id"], + "isUnique": false + } + }, + "foreignKeys": { + "socialsConnection_user_id_authUser_id_fk": { + "name": "socialsConnection_user_id_authUser_id_fk", + "tableFrom": "socialsConnection", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userFavorite": { + "name": "userFavorite", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "favorited_assets_id_idx": { + "name": "favorited_assets_id_idx", + "columns": ["id"], + "isUnique": false + }, + "favorited_assets_user_id_idx": { + "name": "favorited_assets_user_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "userFavorite_user_id_authUser_id_fk": { + "name": "userFavorite_user_id_authUser_id_fk", + "tableFrom": "userFavorite", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userFavoriteAsset": { + "name": "userFavoriteAsset", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "favorited_assets_id": { + "name": "favorited_assets_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "favorited_assets_assets_id_idx": { + "name": "favorited_assets_assets_id_idx", + "columns": ["id"], + "isUnique": false + }, + "favorited_assets_assets_user_id_idx": { + "name": "favorited_assets_assets_user_id_idx", + "columns": ["favorited_assets_id"], + "isUnique": false + }, + "favorited_assets_assets_asset_id_idx": { + "name": "favorited_assets_assets_asset_id_idx", + "columns": ["asset_id"], + "isUnique": false + } + }, + "foreignKeys": { + "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk": { + "name": "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk", + "tableFrom": "userFavoriteAsset", + "tableTo": "userFavorite", + "columnsFrom": ["favorited_assets_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "userFavoriteAsset_asset_id_asset_id_fk": { + "name": "userFavoriteAsset_asset_id_asset_id_fk", + "tableFrom": "userFavoriteAsset", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userNetworking": { + "name": "userNetworking", + "columns": { + "followerId": { + "name": "followerId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "followingId": { + "name": "followingId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updatedAt": { + "name": "updatedAt", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "userNetworking_follower_idx": { + "name": "userNetworking_follower_idx", + "columns": ["followerId"], + "isUnique": false + }, + "userNetworking_following_idx": { + "name": "userNetworking_following_idx", + "columns": ["followingId"], + "isUnique": false + } + }, + "foreignKeys": { + "userNetworking_followerId_authUser_id_fk": { + "name": "userNetworking_followerId_authUser_id_fk", + "tableFrom": "userNetworking", + "tableTo": "authUser", + "columnsFrom": ["followerId"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "userNetworking_followingId_authUser_id_fk": { + "name": "userNetworking_followingId_authUser_id_fk", + "tableFrom": "userNetworking", + "tableTo": "authUser", + "columnsFrom": ["followingId"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + } + }, + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + } +} diff --git a/src/v2/db/migrations/meta/_journal.json b/src/v2/db/migrations/meta/_journal.json new file mode 100644 index 0000000..617c165 --- /dev/null +++ b/src/v2/db/migrations/meta/_journal.json @@ -0,0 +1,13 @@ +{ + "version": "5", + "dialect": "sqlite", + "entries": [ + { + "idx": 0, + "version": "5", + "when": 1699148199191, + "tag": "0000_nifty_killer_shrike", + "breakpoints": true + } + ] +} diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index d28bf60..8bd1b9b 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -1,6 +1,7 @@ export * from "./schema/asset/asset" export * from "./schema/asset/asset-categories" export * from "./schema/asset/asset-tags" +export * from "./schema/asset/asset-atlas" export * from "./schema/game/game" diff --git a/src/v2/db/schema/asset/asset.ts b/src/v2/db/schema/asset/asset.ts index 6a7363f..7d036ad 100644 --- a/src/v2/db/schema/asset/asset.ts +++ b/src/v2/db/schema/asset/asset.ts @@ -11,7 +11,7 @@ import { authUser } from "../user/user" import { assetCategory } from "./asset-categories" import { game } from "../game/game" import { assetTagAsset } from "./asset-tags" -import { atlas } from "./asset-atlas" +import { atlasToAsset } from "./asset-atlas" /* NOTE: Assets have a lot of relations, and can be quite complex in some cases. @@ -94,7 +94,7 @@ export const assetRelations = relations(asset, ({ one, many }) => ({ references: [authUser.id, authUser.username], }), assetTagAsset: many(assetTagAsset), - atlas: many(atlas), + atlas: many(atlasToAsset), assetCategory: one(assetCategory, { fields: [asset.assetCategory], references: [assetCategory.name], diff --git a/src/v2/db/turso.ts b/src/v2/db/turso.ts index c34a4c4..792571d 100644 --- a/src/v2/db/turso.ts +++ b/src/v2/db/turso.ts @@ -24,13 +24,14 @@ export function getConnection(env: Bindings) { * The `createClient` function is used to create a Turso client. * The `url` option is set to the `TURSO_DATABASE_URL` environment variable. * The `authToken` option is set to the `TURSO_DATABASE_AUTH_TOKEN` environment variable. - * If the `ENVIRONMENT` environment variable is set to `DEV`, the `TURSO_DEV_DATABASE_URL` environment variable is used instead. **/ const isDev = env.ENVIRONMENT === "DEV" + const TURSO_DEV_DATABASE_URL = + env.TURSO_DEV_DATABASE_URL ?? "http://127.0.0.1:8080" const turso = createClient({ url: isDev - ? env.TURSO_DEV_DATABASE_URL ?? env.TURSO_DATABASE_URL + ? TURSO_DEV_DATABASE_URL ?? env.TURSO_DATABASE_URL : env.TURSO_DATABASE_URL, ...(isDev ? {} : { authToken: env.TURSO_DATABASE_AUTH_TOKEN }), }) diff --git a/src/v2/lib/helpers/status-codes.ts b/src/v2/lib/helpers/status-codes.ts new file mode 100644 index 0000000..223e69c --- /dev/null +++ b/src/v2/lib/helpers/status-codes.ts @@ -0,0 +1,31 @@ +export class StatusCodes { + static StatusCodes2XX = { + OK: { code: 200, description: "OK" }, + CREATED: { code: 201, description: "Created" }, + NO_CONTENT: { code: 204, description: "No Content" }, + } + + static StatusCodes4XX = { + BAD_REQUEST: { code: 400, description: "Bad Request" }, + UNAUTHORIZED: { code: 401, description: "Unauthorized" }, + FORBIDDEN: { code: 403, description: "Forbidden" }, + NOT_FOUND: { code: 404, description: "Not Found" }, + METHOD_NOT_ALLOWED: { code: 405, description: "Method Not Allowed" }, + TOO_MANY_REQUESTS: { code: 429, description: "Too Many Requests" }, + } + + static StatusCodes5XX = { + INTERNAL_SERVER_ERROR: { + code: 500, + description: "Internal Server Error", + }, + SERVICE_UNAVAILABLE: { code: 503, description: "Service Unavailable" }, + GATEWAY_TIMEOUT: { code: 504, description: "Gateway Timeout" }, + } + + static All = { + ...StatusCodes.StatusCodes2XX, + ...StatusCodes.StatusCodes4XX, + ...StatusCodes.StatusCodes5XX, + } +} From 1a545a245f9b46129cb65e64b33e1d3b48f2e2cc Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Sun, 5 Nov 2023 02:04:46 +0000 Subject: [PATCH 134/318] award for most cursed migration script --- src/scripts/migrate/migrate.mts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/scripts/migrate/migrate.mts b/src/scripts/migrate/migrate.mts index 8c201b4..66c45fb 100644 --- a/src/scripts/migrate/migrate.mts +++ b/src/scripts/migrate/migrate.mts @@ -10,14 +10,15 @@ const TURSO_DEV_DATABASE_URL = const isDev = ENVIRONMENT === "DEV" async function main() { - console.log("IS_DEV: ", isDev) isDev && console.log("TURSO_DEV_DATABASE_URL: ", TURSO_DEV_DATABASE_URL) !isDev && console.log("TURSO_DATABASE_URL: ", TURSO_DATABASE_URL) - console.log("Awaiting 5 seconds before migrating...") - await new Promise((resolve) => setTimeout(resolve, 5000)) + const waitTime = isDev ? 3000 : 1000 + + console.log(`Waiting ${waitTime}ms until migration...`) + await new Promise((resolve) => setTimeout(resolve, waitTime)) console.log("Connecting to database client...") const client = createClient({ @@ -27,7 +28,9 @@ async function main() { ...(isDev ? {} : { authToken: TURSO_DATABASE_AUTH_TOKEN }), }) const db = drizzleORM(client) - console.log("Connected to database client & initialized drizzle-orm instance") + console.log( + "Connected to database client & initialized drizzle-orm instance" + ) console.log("Migrating database...") await migrate(db, { migrationsFolder: "./src/v2/db/migrations" }) From ab1ec29e63451823901cc293a549f6f3782adf91 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Sun, 5 Nov 2023 18:14:54 +0000 Subject: [PATCH 135/318] fix key/type mismatch, init local db seed --- package.json | 5 +- pnpm-lock.yaml | 30 +- src/scripts/seed/seed.ts | 262 ++ ... => 0000_sparkling_carmella_unuscione.sql} | 77 +- src/v2/db/migrations/meta/0000_snapshot.json | 3075 +++++++++-------- src/v2/db/migrations/meta/_journal.json | 24 +- src/v2/db/schema/asset/asset-atlas.ts | 4 +- src/v2/db/schema/asset/asset-categories.ts | 12 +- src/v2/db/schema/asset/asset-tags.ts | 14 +- src/v2/db/schema/asset/asset.ts | 60 +- src/v2/db/schema/game/game.ts | 8 +- .../db/schema/oc-generators/oc-generators.ts | 2 +- src/v2/db/schema/user/user-attributes.ts | 4 +- src/v2/db/schema/user/user-collections.ts | 4 +- src/v2/db/schema/user/user-connections.ts | 2 +- src/v2/db/schema/user/user-favorites.ts | 4 +- src/v2/db/schema/user/user.ts | 8 +- src/v2/db/turso.ts | 3 + src/v2/routes/asset/get-asset-from-id.ts | 2 +- .../asset-categories/create-asset-category.ts | 2 +- src/v2/routes/auth/assets/modify-asset.ts | 1 - src/v2/routes/auth/assets/upload-asset.ts | 7 +- src/v2/routes/auth/games/create-game.ts | 2 +- src/v2/routes/auth/tags/create-tag.ts | 2 +- src/v2/routes/search/asset/search-assets.ts | 4 +- 25 files changed, 2083 insertions(+), 1535 deletions(-) create mode 100644 src/scripts/seed/seed.ts rename src/v2/db/migrations/{0000_nifty_killer_shrike.sql => 0000_sparkling_carmella_unuscione.sql} (78%) diff --git a/package.json b/package.json index 0390bce..aec7f86 100644 --- a/package.json +++ b/package.json @@ -10,8 +10,10 @@ "prettier:format": "prettier --write .", "prettier:check": "prettier --check .", "drizzle:generate": "drizzle-kit generate:sqlite", - "drizzle:migrate": "tsx ./src/scripts/migrate/migrate.mts", + "drizzle:seed": "tsx src/scripts/seed/seed.ts", + "drizzle:migrate": "tsx src/scripts/migrate/migrate.mts", "drizzle:push": "drizzle-kit push:sqlite", + "drizzle:dev:init": "drizzle-kit generate:sqlite && tsx src/scripts/migrate/migrate.mts && tsx src/scripts/seed/seed.ts", "drizzle:studio": "drizzle-kit studio --port 7331 --host 127.0.0.1 --verbose" }, "devDependencies": { @@ -43,6 +45,7 @@ "mysql2": "^3.6.2", "prettier": "^3.0.3", "unstorage": "^1.9.0", + "uuidv4": "^6.2.13", "zod": "^3.22.4" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7178b3e..e18f23c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: "6.1" +lockfileVersion: "6.0" settings: autoInstallPeers: true @@ -47,6 +47,9 @@ dependencies: unstorage: specifier: ^1.9.0 version: 1.9.0 + uuidv4: + specifier: ^6.2.13 + version: 6.2.13 zod: specifier: ^3.22.4 version: 3.22.4 @@ -1350,6 +1353,13 @@ packages: } dev: false + /@types/uuid@8.3.4: + resolution: + { + integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==, + } + dev: false + /@types/ws@8.5.7: resolution: { @@ -4404,6 +4414,24 @@ packages: } dev: false + /uuid@8.3.2: + resolution: + { + integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==, + } + hasBin: true + dev: false + + /uuidv4@6.2.13: + resolution: + { + integrity: sha512-AXyzMjazYB3ovL3q051VLH06Ixj//Knx7QnUSi1T//Ie3io6CpsPu9nVMOx5MoLWh6xV0B9J0hIaxungxXUbPQ==, + } + dependencies: + "@types/uuid": 8.3.4 + uuid: 8.3.2 + dev: false + /vscode-json-languageservice@4.2.1: resolution: { diff --git a/src/scripts/seed/seed.ts b/src/scripts/seed/seed.ts new file mode 100644 index 0000000..57293aa --- /dev/null +++ b/src/scripts/seed/seed.ts @@ -0,0 +1,262 @@ +import { drizzle as drizzleORM } from "drizzle-orm/libsql" +import { createClient } from "@libsql/client" +import "dotenv/config" +import { + asset, + game, + gameAssetCategory, + assetCategory, + assetTag, + assetTagAsset, + authUser, + userNetworking, +} from "@/v2/db/schema" + +const { ENVIRONMENT } = process.env + +const TURSO_DEV_DATABASE_URL = + process.env.TURSO_DEV_DATABASE_URL ?? "http://127.0.0.1:8080" +const isDev = ENVIRONMENT === "DEV" + +async function main() { + if (!isDev) { + console.log("This script can only be run in development mode.") + process.exit(1) + } + + console.log("Connecting to database client...") + const client = createClient({ + url: TURSO_DEV_DATABASE_URL, + }) + const db = drizzleORM(client) + console.log( + "Connected to database client & initialized drizzle-orm instance" + ) + + console.log("Seeding database...\n") + + console.log("[authUser] Seeding users...") + const newUsers = await db.insert(authUser).values([ + { + id: "userid1", + username: "testuser", + email: "hi@dromzeh.dev", + emailVerified: 1, + usernameColour: "#84E6F8", + bio: "test bio", + dateJoined: new Date().toISOString(), + roleFlags: 1, + isContributor: 0, + selfAssignableRoleFlags: 0, + }, + { + id: "userid2", + username: "testuser2", + email: "hi2@dromzeh.dev", + emailVerified: 1, + bio: "test bio 2", + pronouns: "he/him/his", + dateJoined: new Date().toISOString(), + roleFlags: 1, + isContributor: 0, + selfAssignableRoleFlags: 0, + }, + { + id: "userid3", + username: "testuser3", + email: "hi3@dromzeh.dev", + emailVerified: 1, + bio: "test bio 3", + dateJoined: new Date().toISOString(), + roleFlags: 1, + isContributor: 0, + selfAssignableRoleFlags: 0, + }, + ]).returning() + console.log(`[authUser] inserted ${newUsers.length} rows\n`) + + console.log("[userNetworking] Seeding user following...") + const newUserNetworking = await db.insert(userNetworking).values([ + { + followerId: newUsers[0].id, + followingId: newUsers[1].id, + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), + }, + { + followerId: newUsers[1].id, + followingId: newUsers[0].id, + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), + }, + { + followerId: newUsers[0].id, + followingId: newUsers[2].id, + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), + }, + ]).returning() + console.log(`[userNetworking] inserted ${newUserNetworking.length} rows\n`) + + + console.log("[assetTag] Seeding asset tags...") + const newAssetTags = await db.insert(assetTag).values([ + { + id: "official", + name: "official", + formattedName: "Official", + assetCount: 1, + lastUpdated: new Date().toISOString(), + }, + { + id: "1.0", + name: "1.0", + formattedName: "1.0", + assetCount: 1, + lastUpdated: new Date().toISOString(), + }, + ]).returning() + console.log(`[assetTag] inserted ${newAssetTags.length} rows\n`) + + console.log("[game] Seeding games...") + const newGames = await db.insert(game).values([ + { + id: "genshin-impact", + name: "genshin-impact", + formattedName: "Genshin Impact", + assetCount: 1, + possibleSuggestiveContent: 0, + lastUpdated: new Date().toISOString(), + }, + { + id: "honkai-impact-3rd", + name: "honkai-impact-3rd", + formattedName: "Honkai Impact: 3rd", + assetCount: 0, + possibleSuggestiveContent: 0, + lastUpdated: new Date().toISOString(), + }, + ]).returning() + console.log(`[game] inserted ${newGames.length} rows\n`) + + console.log("[assetCategory] Seeding asset categories...") + const newAssetCategories = await db.insert(assetCategory).values([ + { + id: "character-sheets", + name: "character-sheets", + formattedName: "Character Sheets", + assetCount: 1, + lastUpdated: new Date().toISOString(), + }, + { + id: "splash-art", + name: "splash-art", + formattedName: "Splash Art", + assetCount: 0, + lastUpdated: new Date().toISOString(), + }, + ]).returning() + console.log(`[assetCategory] inserted ${newAssetCategories.length} rows\n`) + + console.log("[gameAssetCategory] Linking games to asset categories...") + const newGameAssetCategory = await db.insert(gameAssetCategory).values([ + { + gameId: "genshin-impact", + assetCategoryId: "character-sheets", + }, + { + gameId: "genshin-impact", + assetCategoryId: "splash-art", + }, + { + gameId: "honkai-impact-3rd", + assetCategoryId: "character-sheets", + }, + ]).returning() + console.log(`[gameAssetCategory] inserted ${newGameAssetCategory.length} rows\n`) + + console.log("[asset] Seeding assets...") + const newAssets = await db.insert(asset).values([ + { + id: 1, + name: "test-asset", + extension: "image/png", + gameId: "genshin-impact", + assetCategoryId: "character-sheets", + url: "/test/image.png", + status: "approved", + uploadedById: "userid1", + uploadedDate: new Date().toISOString(), + assetIsOptimized: 0, + viewCount: 1337, + downloadCount: 1337, + fileSize: 40213, + width: 1920, + height: 1080, + }, + { + id: 2, + name: "test-asset-2", + extension: "image/png", + gameId: "honkai-impact-3rd", + assetCategoryId: "character-sheets", + url: "/test/image.png", + status: "approved", + uploadedById: "userid2", + uploadedDate: new Date().toISOString(), + assetIsOptimized: 0, + viewCount: 1337, + downloadCount: 1337, + fileSize: 40213, + width: 1920, + height: 1080, + }, + { + id: 3, + name: "test-asset-3", + extension: "image/png", + gameId: "genshin-impact", + assetCategoryId: "splash-art", + url: "/test/image.png", + status: "approved", + uploadedById: "userid2", + uploadedDate: new Date().toISOString(), + assetIsOptimized: 0, + viewCount: 1337, + downloadCount: 1337, + fileSize: 40213, + width: 1920, + height: 1080, + }, + ]).returning() + console.log(`[asset] inserted ${newAssets.length} rows\n`) + + console.log("[assetTagAsset] Linking assets to asset tags...") + const newAssetTagAsset = await db.insert(assetTagAsset).values([ + { + assetId: 1, + assetTagId: "official", + }, + { + assetId: 1, + assetTagId: "1.0", + }, + { + assetId: 2, + assetTagId: "official", + }, + { + assetId: 3, + assetTagId: "official", + }, + ]).returning() + console.log(`[assetTagAsset] inserted ${newAssetTagAsset.length} rows\n`) + + console.log("Seeded database successfully") + process.exit(0) +} + +main().catch((err) => { + console.error(`Error: ${err}`) + process.exit(1) +}) diff --git a/src/v2/db/migrations/0000_nifty_killer_shrike.sql b/src/v2/db/migrations/0000_sparkling_carmella_unuscione.sql similarity index 78% rename from src/v2/db/migrations/0000_nifty_killer_shrike.sql rename to src/v2/db/migrations/0000_sparkling_carmella_unuscione.sql index 002a34e..2f64400 100644 --- a/src/v2/db/migrations/0000_nifty_killer_shrike.sql +++ b/src/v2/db/migrations/0000_sparkling_carmella_unuscione.sql @@ -4,33 +4,30 @@ CREATE TABLE `asset` ( `extension` text NOT NULL, `game` text NOT NULL, `asset_category` text NOT NULL, + `uploaded_by` text NOT NULL, `url` text NOT NULL, `status` text DEFAULT 'pending' NOT NULL, - `uploaded_by` text, - `uploaded_by_name` text, - `uploaded_date` integer NOT NULL, + `uploaded_date` text NOT NULL, `asset_is_optimized` integer DEFAULT 0 NOT NULL, `view_count` integer DEFAULT 0 NOT NULL, `download_count` integer DEFAULT 0 NOT NULL, `file_size` integer DEFAULT 0 NOT NULL, `width` integer DEFAULT 0 NOT NULL, `height` integer DEFAULT 0 NOT NULL, - FOREIGN KEY (`game`) REFERENCES `game`(`name`) ON UPDATE cascade ON DELETE cascade, - FOREIGN KEY (`asset_category`) REFERENCES `assetCategory`(`name`) ON UPDATE cascade ON DELETE cascade, - FOREIGN KEY (`uploaded_by`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade, - FOREIGN KEY (`uploaded_by_name`) REFERENCES `authUser`(`username`) ON UPDATE cascade ON DELETE cascade + FOREIGN KEY (`game`) REFERENCES `game`(`id`) ON UPDATE cascade ON DELETE cascade, + FOREIGN KEY (`asset_category`) REFERENCES `assetCategory`(`id`) ON UPDATE cascade ON DELETE cascade, + FOREIGN KEY (`uploaded_by`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade ); --> statement-breakpoint CREATE TABLE `assetCategory` ( - `id` text PRIMARY KEY NOT NULL, + `id` text NOT NULL, `name` text NOT NULL, `formatted_name` text NOT NULL, `asset_count` integer DEFAULT 0 NOT NULL, - `last_updated` integer NOT NULL + `last_updated` text NOT NULL ); --> statement-breakpoint CREATE TABLE `gameAssetCategory` ( - `id` text PRIMARY KEY NOT NULL, `game_id` text NOT NULL, `asset_category_id` text NOT NULL, FOREIGN KEY (`game_id`) REFERENCES `game`(`id`) ON UPDATE cascade ON DELETE cascade, @@ -38,15 +35,14 @@ CREATE TABLE `gameAssetCategory` ( ); --> statement-breakpoint CREATE TABLE `assetTag` ( - `id` text PRIMARY KEY NOT NULL, + `id` text NOT NULL, `name` text NOT NULL, `formatted_name` text NOT NULL, `asset_count` integer DEFAULT 0 NOT NULL, - `last_updated` integer NOT NULL + `last_updated` text NOT NULL ); --> statement-breakpoint CREATE TABLE `assetTagAsset` ( - `id` text PRIMARY KEY NOT NULL, `asset_tag_id` text NOT NULL, `asset_id` integer NOT NULL, FOREIGN KEY (`asset_tag_id`) REFERENCES `assetTag`(`id`) ON UPDATE cascade ON DELETE cascade, @@ -54,7 +50,7 @@ CREATE TABLE `assetTagAsset` ( ); --> statement-breakpoint CREATE TABLE `atlas` ( - `id` text PRIMARY KEY NOT NULL, + `id` text NOT NULL, `url` text NOT NULL, `uploaded_by` text NOT NULL, `uploaded_by_name` text NOT NULL, @@ -63,7 +59,7 @@ CREATE TABLE `atlas` ( ); --> statement-breakpoint CREATE TABLE `atlasToAsset` ( - `id` text PRIMARY KEY NOT NULL, + `id` text, `atlas_id` text NOT NULL, `asset_id` integer NOT NULL, FOREIGN KEY (`atlas_id`) REFERENCES `atlas`(`id`) ON UPDATE cascade ON DELETE cascade, @@ -71,16 +67,16 @@ CREATE TABLE `atlasToAsset` ( ); --> statement-breakpoint CREATE TABLE `game` ( - `id` text PRIMARY KEY NOT NULL, + `id` text NOT NULL, `name` text NOT NULL, `formatted_name` text NOT NULL, `asset_count` integer DEFAULT 0, `possible_suggestive_content` integer DEFAULT 0 NOT NULL, - `last_updated` integer NOT NULL + `last_updated` text NOT NULL ); --> statement-breakpoint CREATE TABLE `savedOcGenerators` ( - `id` text PRIMARY KEY NOT NULL, + `id` text NOT NULL, `user_id` text NOT NULL, `name` text NOT NULL, `game` text NOT NULL, @@ -93,7 +89,7 @@ CREATE TABLE `savedOcGenerators` ( ); --> statement-breakpoint CREATE TABLE `authUser` ( - `id` text PRIMARY KEY NOT NULL, + `id` text NOT NULL, `avatar_url` text, `banner_url` text, `display_name` text, @@ -111,14 +107,14 @@ CREATE TABLE `authUser` ( ); --> statement-breakpoint CREATE TABLE `authKey` ( - `id` text PRIMARY KEY NOT NULL, + `id` text NOT NULL, `user_id` text NOT NULL, `hashed_password` text, FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade ); --> statement-breakpoint CREATE TABLE `emailVerificationToken` ( - `id` text PRIMARY KEY NOT NULL, + `id` text NOT NULL, `user_id` text NOT NULL, `token` text NOT NULL, `expires_at` integer NOT NULL, @@ -126,7 +122,7 @@ CREATE TABLE `emailVerificationToken` ( ); --> statement-breakpoint CREATE TABLE `passwordResetToken` ( - `id` text PRIMARY KEY NOT NULL, + `id` text NOT NULL, `user_id` text NOT NULL, `token` text NOT NULL, `expires_at` integer NOT NULL, @@ -134,7 +130,7 @@ CREATE TABLE `passwordResetToken` ( ); --> statement-breakpoint CREATE TABLE `userCollection` ( - `id` text PRIMARY KEY NOT NULL, + `id` text NOT NULL, `name` text NOT NULL, `description` text NOT NULL, `user_id` text NOT NULL, @@ -144,7 +140,7 @@ CREATE TABLE `userCollection` ( ); --> statement-breakpoint CREATE TABLE `assetCollectionAsset` ( - `id` text PRIMARY KEY NOT NULL, + `id` text NOT NULL, `collection_id` text NOT NULL, `asset_id` integer NOT NULL, FOREIGN KEY (`collection_id`) REFERENCES `userCollection`(`id`) ON UPDATE cascade ON DELETE cascade, @@ -152,21 +148,21 @@ CREATE TABLE `assetCollectionAsset` ( ); --> statement-breakpoint CREATE TABLE `socialsConnection` ( - `id` text PRIMARY KEY NOT NULL, + `id` text NOT NULL, `user_id` text NOT NULL, `discord_id` text, FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade ); --> statement-breakpoint CREATE TABLE `userFavorite` ( - `id` text PRIMARY KEY NOT NULL, + `id` text NOT NULL, `user_id` text NOT NULL, `is_public` integer DEFAULT 0 NOT NULL, FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade ); --> statement-breakpoint CREATE TABLE `userFavoriteAsset` ( - `id` text PRIMARY KEY NOT NULL, + `id` text NOT NULL, `favorited_assets_id` text NOT NULL, `asset_id` integer NOT NULL, FOREIGN KEY (`favorited_assets_id`) REFERENCES `userFavorite`(`id`) ON UPDATE cascade ON DELETE cascade, @@ -184,47 +180,62 @@ CREATE TABLE `userNetworking` ( --> statement-breakpoint CREATE INDEX `assets_id_idx` ON `asset` (`id`);--> statement-breakpoint CREATE INDEX `assets_name_idx` ON `asset` (`name`);--> statement-breakpoint -CREATE INDEX `assets_game_idx` ON `asset` (`game`);--> statement-breakpoint -CREATE INDEX `assets_asset_category_idx` ON `asset` (`asset_category`);--> statement-breakpoint -CREATE INDEX `assets_uploaded_by_idx` ON `asset` (`uploaded_by`);--> statement-breakpoint -CREATE INDEX `assets_uploaded_by_name_idx` ON `asset` (`uploaded_by_name`);--> statement-breakpoint +CREATE INDEX `assets_game_name_idx` ON `asset` (`game`);--> statement-breakpoint +CREATE INDEX `assets_asset_category_name_idx` ON `asset` (`asset_category`);--> statement-breakpoint +CREATE INDEX `assets_uploaded_by_id_idx` ON `asset` (`uploaded_by`);--> statement-breakpoint +CREATE UNIQUE INDEX `assetCategory_id_unique` ON `assetCategory` (`id`);--> statement-breakpoint +CREATE UNIQUE INDEX `assetCategory_name_unique` ON `assetCategory` (`name`);--> statement-breakpoint CREATE INDEX `asset_category_id_idx` ON `assetCategory` (`id`);--> statement-breakpoint CREATE INDEX `asset_category_name_idx` ON `assetCategory` (`name`);--> statement-breakpoint -CREATE INDEX `game_asset_category_id_idx` ON `gameAssetCategory` (`id`);--> statement-breakpoint CREATE INDEX `game_asset_category_game_id_idx` ON `gameAssetCategory` (`game_id`);--> statement-breakpoint CREATE INDEX `game_asset_category_asset_category_id_idx` ON `gameAssetCategory` (`asset_category_id`);--> statement-breakpoint +CREATE UNIQUE INDEX `assetTag_id_unique` ON `assetTag` (`id`);--> statement-breakpoint +CREATE UNIQUE INDEX `assetTag_name_unique` ON `assetTag` (`name`);--> statement-breakpoint CREATE INDEX `asset_tag_id_idx` ON `assetTag` (`id`);--> statement-breakpoint CREATE INDEX `asset_tag_name_idx` ON `assetTag` (`name`);--> statement-breakpoint -CREATE INDEX `asset_tags_assets_id_idx` ON `assetTagAsset` (`id`);--> statement-breakpoint CREATE INDEX `asset_tags_assets_asset_tag_id_idx` ON `assetTagAsset` (`asset_tag_id`);--> statement-breakpoint CREATE INDEX `asset_tags_assets_asset_id_idx` ON `assetTagAsset` (`asset_id`);--> statement-breakpoint +CREATE UNIQUE INDEX `atlas_id_unique` ON `atlas` (`id`);--> statement-breakpoint CREATE INDEX `atlas_id_idx` ON `atlas` (`id`);--> statement-breakpoint CREATE INDEX `atlas_uploaded_by_idx` ON `atlas` (`uploaded_by`);--> statement-breakpoint CREATE INDEX `atlas_uploaded_by_name_idx` ON `atlas` (`uploaded_by_name`);--> statement-breakpoint CREATE INDEX `atlas_to_assets_id_idx` ON `atlasToAsset` (`id`);--> statement-breakpoint CREATE INDEX `atlas_to_assets_atlas_id_idx` ON `atlasToAsset` (`atlas_id`);--> statement-breakpoint CREATE INDEX `atlas_to_assets_asset_id_idx` ON `atlasToAsset` (`asset_id`);--> statement-breakpoint +CREATE UNIQUE INDEX `game_id_unique` ON `game` (`id`);--> statement-breakpoint +CREATE UNIQUE INDEX `game_name_unique` ON `game` (`name`);--> statement-breakpoint CREATE INDEX `game_id_idx` ON `game` (`id`);--> statement-breakpoint CREATE INDEX `game_name_idx` ON `game` (`name`);--> statement-breakpoint +CREATE UNIQUE INDEX `savedOcGenerators_id_unique` ON `savedOcGenerators` (`id`);--> statement-breakpoint CREATE INDEX `saved_oc_generators_id_idx` ON `savedOcGenerators` (`id`);--> statement-breakpoint CREATE INDEX `saved_oc_generators_user_id_idx` ON `savedOcGenerators` (`user_id`);--> statement-breakpoint +CREATE UNIQUE INDEX `authUser_id_unique` ON `authUser` (`id`);--> statement-breakpoint +CREATE UNIQUE INDEX `authUser_username_unique` ON `authUser` (`username`);--> statement-breakpoint CREATE INDEX `user_id_idx` ON `authUser` (`id`);--> statement-breakpoint CREATE INDEX `user_username_idx` ON `authUser` (`username`);--> statement-breakpoint CREATE INDEX `user_email_idx` ON `authUser` (`email`);--> statement-breakpoint +CREATE UNIQUE INDEX `authKey_id_unique` ON `authKey` (`id`);--> statement-breakpoint CREATE INDEX `key_user_id_idx` ON `authKey` (`user_id`);--> statement-breakpoint +CREATE UNIQUE INDEX `emailVerificationToken_id_unique` ON `emailVerificationToken` (`id`);--> statement-breakpoint CREATE INDEX `email_verification_token_user_id_idx` ON `emailVerificationToken` (`user_id`);--> statement-breakpoint CREATE INDEX `email_verification_token_token_idx` ON `emailVerificationToken` (`token`);--> statement-breakpoint +CREATE UNIQUE INDEX `passwordResetToken_id_unique` ON `passwordResetToken` (`id`);--> statement-breakpoint CREATE INDEX `password_reset_token_user_id_idx` ON `passwordResetToken` (`user_id`);--> statement-breakpoint CREATE INDEX `password_reset_token_token_idx` ON `passwordResetToken` (`token`);--> statement-breakpoint +CREATE UNIQUE INDEX `userCollection_id_unique` ON `userCollection` (`id`);--> statement-breakpoint CREATE INDEX `collection_id_idx` ON `userCollection` (`id`);--> statement-breakpoint CREATE INDEX `user_collection_id_idx` ON `userCollection` (`user_id`);--> statement-breakpoint +CREATE UNIQUE INDEX `assetCollectionAsset_id_unique` ON `assetCollectionAsset` (`id`);--> statement-breakpoint CREATE INDEX `collection_assets_id_idx` ON `assetCollectionAsset` (`id`);--> statement-breakpoint CREATE INDEX `collection_assets_collection_id_idx` ON `assetCollectionAsset` (`collection_id`);--> statement-breakpoint CREATE INDEX `collection_assets_asset_id_idx` ON `assetCollectionAsset` (`asset_id`);--> statement-breakpoint +CREATE UNIQUE INDEX `socialsConnection_id_unique` ON `socialsConnection` (`id`);--> statement-breakpoint CREATE INDEX `socials_connection_user_id_idx` ON `socialsConnection` (`user_id`);--> statement-breakpoint CREATE INDEX `socials_connection_discord_id_idx` ON `socialsConnection` (`discord_id`);--> statement-breakpoint +CREATE UNIQUE INDEX `userFavorite_id_unique` ON `userFavorite` (`id`);--> statement-breakpoint CREATE INDEX `favorited_assets_id_idx` ON `userFavorite` (`id`);--> statement-breakpoint CREATE INDEX `favorited_assets_user_id_idx` ON `userFavorite` (`user_id`);--> statement-breakpoint +CREATE UNIQUE INDEX `userFavoriteAsset_id_unique` ON `userFavoriteAsset` (`id`);--> statement-breakpoint CREATE INDEX `favorited_assets_assets_id_idx` ON `userFavoriteAsset` (`id`);--> statement-breakpoint CREATE INDEX `favorited_assets_assets_user_id_idx` ON `userFavoriteAsset` (`favorited_assets_id`);--> statement-breakpoint CREATE INDEX `favorited_assets_assets_asset_id_idx` ON `userFavoriteAsset` (`asset_id`);--> statement-breakpoint diff --git a/src/v2/db/migrations/meta/0000_snapshot.json b/src/v2/db/migrations/meta/0000_snapshot.json index c7f68b5..f05f954 100644 --- a/src/v2/db/migrations/meta/0000_snapshot.json +++ b/src/v2/db/migrations/meta/0000_snapshot.json @@ -1,1414 +1,1673 @@ { - "version": "5", - "dialect": "sqlite", - "id": "d2fefb1c-29ea-4846-b345-ce891eb7d076", - "prevId": "00000000-0000-0000-0000-000000000000", - "tables": { - "asset": { - "name": "asset", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "extension": { - "name": "extension", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "game": { - "name": "game", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_category": { - "name": "asset_category", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "url": { - "name": "url", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "status": { - "name": "status", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "'pending'" - }, - "uploaded_by": { - "name": "uploaded_by", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "uploaded_by_name": { - "name": "uploaded_by_name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "uploaded_date": { - "name": "uploaded_date", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_is_optimized": { - "name": "asset_is_optimized", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "view_count": { - "name": "view_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "download_count": { - "name": "download_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "file_size": { - "name": "file_size", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "width": { - "name": "width", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "height": { - "name": "height", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "assets_id_idx": { - "name": "assets_id_idx", - "columns": ["id"], - "isUnique": false - }, - "assets_name_idx": { - "name": "assets_name_idx", - "columns": ["name"], - "isUnique": false - }, - "assets_game_idx": { - "name": "assets_game_idx", - "columns": ["game"], - "isUnique": false - }, - "assets_asset_category_idx": { - "name": "assets_asset_category_idx", - "columns": ["asset_category"], - "isUnique": false - }, - "assets_uploaded_by_idx": { - "name": "assets_uploaded_by_idx", - "columns": ["uploaded_by"], - "isUnique": false - }, - "assets_uploaded_by_name_idx": { - "name": "assets_uploaded_by_name_idx", - "columns": ["uploaded_by_name"], - "isUnique": false - } - }, - "foreignKeys": { - "asset_game_game_name_fk": { - "name": "asset_game_game_name_fk", - "tableFrom": "asset", - "tableTo": "game", - "columnsFrom": ["game"], - "columnsTo": ["name"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "asset_asset_category_assetCategory_name_fk": { - "name": "asset_asset_category_assetCategory_name_fk", - "tableFrom": "asset", - "tableTo": "assetCategory", - "columnsFrom": ["asset_category"], - "columnsTo": ["name"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "asset_uploaded_by_authUser_id_fk": { - "name": "asset_uploaded_by_authUser_id_fk", - "tableFrom": "asset", - "tableTo": "authUser", - "columnsFrom": ["uploaded_by"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "asset_uploaded_by_name_authUser_username_fk": { - "name": "asset_uploaded_by_name_authUser_username_fk", - "tableFrom": "asset", - "tableTo": "authUser", - "columnsFrom": ["uploaded_by_name"], - "columnsTo": ["username"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetCategory": { - "name": "assetCategory", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "asset_category_id_idx": { - "name": "asset_category_id_idx", - "columns": ["id"], - "isUnique": false - }, - "asset_category_name_idx": { - "name": "asset_category_name_idx", - "columns": ["name"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "gameAssetCategory": { - "name": "gameAssetCategory", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "game_id": { - "name": "game_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_category_id": { - "name": "asset_category_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "game_asset_category_id_idx": { - "name": "game_asset_category_id_idx", - "columns": ["id"], - "isUnique": false - }, - "game_asset_category_game_id_idx": { - "name": "game_asset_category_game_id_idx", - "columns": ["game_id"], - "isUnique": false - }, - "game_asset_category_asset_category_id_idx": { - "name": "game_asset_category_asset_category_id_idx", - "columns": ["asset_category_id"], - "isUnique": false - } - }, - "foreignKeys": { - "gameAssetCategory_game_id_game_id_fk": { - "name": "gameAssetCategory_game_id_game_id_fk", - "tableFrom": "gameAssetCategory", - "tableTo": "game", - "columnsFrom": ["game_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "gameAssetCategory_asset_category_id_assetCategory_id_fk": { - "name": "gameAssetCategory_asset_category_id_assetCategory_id_fk", - "tableFrom": "gameAssetCategory", - "tableTo": "assetCategory", - "columnsFrom": ["asset_category_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetTag": { - "name": "assetTag", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "asset_tag_id_idx": { - "name": "asset_tag_id_idx", - "columns": ["id"], - "isUnique": false - }, - "asset_tag_name_idx": { - "name": "asset_tag_name_idx", - "columns": ["name"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetTagAsset": { - "name": "assetTagAsset", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "asset_tag_id": { - "name": "asset_tag_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "asset_tags_assets_id_idx": { - "name": "asset_tags_assets_id_idx", - "columns": ["id"], - "isUnique": false - }, - "asset_tags_assets_asset_tag_id_idx": { - "name": "asset_tags_assets_asset_tag_id_idx", - "columns": ["asset_tag_id"], - "isUnique": false - }, - "asset_tags_assets_asset_id_idx": { - "name": "asset_tags_assets_asset_id_idx", - "columns": ["asset_id"], - "isUnique": false - } - }, - "foreignKeys": { - "assetTagAsset_asset_tag_id_assetTag_id_fk": { - "name": "assetTagAsset_asset_tag_id_assetTag_id_fk", - "tableFrom": "assetTagAsset", - "tableTo": "assetTag", - "columnsFrom": ["asset_tag_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "assetTagAsset_asset_id_asset_id_fk": { - "name": "assetTagAsset_asset_id_asset_id_fk", - "tableFrom": "assetTagAsset", - "tableTo": "asset", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "atlas": { - "name": "atlas", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "url": { - "name": "url", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by": { - "name": "uploaded_by", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by_name": { - "name": "uploaded_by_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_date": { - "name": "uploaded_date", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "file_size": { - "name": "file_size", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "atlas_id_idx": { - "name": "atlas_id_idx", - "columns": ["id"], - "isUnique": false - }, - "atlas_uploaded_by_idx": { - "name": "atlas_uploaded_by_idx", - "columns": ["uploaded_by"], - "isUnique": false - }, - "atlas_uploaded_by_name_idx": { - "name": "atlas_uploaded_by_name_idx", - "columns": ["uploaded_by_name"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "atlasToAsset": { - "name": "atlasToAsset", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "atlas_id": { - "name": "atlas_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "atlas_to_assets_id_idx": { - "name": "atlas_to_assets_id_idx", - "columns": ["id"], - "isUnique": false - }, - "atlas_to_assets_atlas_id_idx": { - "name": "atlas_to_assets_atlas_id_idx", - "columns": ["atlas_id"], - "isUnique": false - }, - "atlas_to_assets_asset_id_idx": { - "name": "atlas_to_assets_asset_id_idx", - "columns": ["asset_id"], - "isUnique": false - } - }, - "foreignKeys": { - "atlasToAsset_atlas_id_atlas_id_fk": { - "name": "atlasToAsset_atlas_id_atlas_id_fk", - "tableFrom": "atlasToAsset", - "tableTo": "atlas", - "columnsFrom": ["atlas_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "atlasToAsset_asset_id_asset_id_fk": { - "name": "atlasToAsset_asset_id_asset_id_fk", - "tableFrom": "atlasToAsset", - "tableTo": "asset", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "version": "5", + "dialect": "sqlite", + "id": "6b46f393-1ae5-40d7-ab31-1fd8c0d6a229", + "prevId": "00000000-0000-0000-0000-000000000000", + "tables": { + "asset": { + "name": "asset", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "extension": { + "name": "extension", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false }, "game": { - "name": "game", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - }, - "possible_suggestive_content": { - "name": "possible_suggestive_content", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "game_id_idx": { - "name": "game_id_idx", - "columns": ["id"], - "isUnique": false - }, - "game_name_idx": { - "name": "game_name_idx", - "columns": ["name"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "savedOcGenerators": { - "name": "savedOcGenerators", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "game": { - "name": "game", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "date_created": { - "name": "date_created", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "content": { - "name": "content", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "saved_color_palette": { - "name": "saved_color_palette", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "sakura_url": { - "name": "sakura_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "saved_oc_generators_id_idx": { - "name": "saved_oc_generators_id_idx", - "columns": ["id"], - "isUnique": false - }, - "saved_oc_generators_user_id_idx": { - "name": "saved_oc_generators_user_id_idx", - "columns": ["user_id"], - "isUnique": false - } - }, - "foreignKeys": { - "savedOcGenerators_user_id_authUser_id_fk": { - "name": "savedOcGenerators_user_id_authUser_id_fk", - "tableFrom": "savedOcGenerators", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "authUser": { - "name": "authUser", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "avatar_url": { - "name": "avatar_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "banner_url": { - "name": "banner_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "display_name": { - "name": "display_name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "username": { - "name": "username", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "username_colour": { - "name": "username_colour", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "email": { - "name": "email", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "email_verified": { - "name": "email_verified", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "pronouns": { - "name": "pronouns", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "verified": { - "name": "verified", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "bio": { - "name": "bio", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "'No bio set'" - }, - "date_joined": { - "name": "date_joined", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "role_flags": { - "name": "role_flags", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 1 - }, - "is_contributor": { - "name": "is_contributor", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "self_assignable_role_flags": { - "name": "self_assignable_role_flags", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "user_id_idx": { - "name": "user_id_idx", - "columns": ["id"], - "isUnique": false - }, - "user_username_idx": { - "name": "user_username_idx", - "columns": ["username"], - "isUnique": false - }, - "user_email_idx": { - "name": "user_email_idx", - "columns": ["email"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "authKey": { - "name": "authKey", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "hashed_password": { - "name": "hashed_password", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "key_user_id_idx": { - "name": "key_user_id_idx", - "columns": ["user_id"], - "isUnique": false - } - }, - "foreignKeys": { - "authKey_user_id_authUser_id_fk": { - "name": "authKey_user_id_authUser_id_fk", - "tableFrom": "authKey", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "emailVerificationToken": { - "name": "emailVerificationToken", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "email_verification_token_user_id_idx": { - "name": "email_verification_token_user_id_idx", - "columns": ["user_id"], - "isUnique": false - }, - "email_verification_token_token_idx": { - "name": "email_verification_token_token_idx", - "columns": ["token"], - "isUnique": false - } - }, - "foreignKeys": { - "emailVerificationToken_user_id_authUser_id_fk": { - "name": "emailVerificationToken_user_id_authUser_id_fk", - "tableFrom": "emailVerificationToken", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "passwordResetToken": { - "name": "passwordResetToken", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "password_reset_token_user_id_idx": { - "name": "password_reset_token_user_id_idx", - "columns": ["user_id"], - "isUnique": false - }, - "password_reset_token_token_idx": { - "name": "password_reset_token_token_idx", - "columns": ["token"], - "isUnique": false - } - }, - "foreignKeys": { - "passwordResetToken_user_id_authUser_id_fk": { - "name": "passwordResetToken_user_id_authUser_id_fk", - "tableFrom": "passwordResetToken", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userCollection": { - "name": "userCollection", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "date_created": { - "name": "date_created", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "collection_id_idx": { - "name": "collection_id_idx", - "columns": ["id"], - "isUnique": false - }, - "user_collection_id_idx": { - "name": "user_collection_id_idx", - "columns": ["user_id"], - "isUnique": false - } - }, - "foreignKeys": { - "userCollection_user_id_authUser_id_fk": { - "name": "userCollection_user_id_authUser_id_fk", - "tableFrom": "userCollection", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetCollectionAsset": { - "name": "assetCollectionAsset", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "collection_id": { - "name": "collection_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "collection_assets_id_idx": { - "name": "collection_assets_id_idx", - "columns": ["id"], - "isUnique": false - }, - "collection_assets_collection_id_idx": { - "name": "collection_assets_collection_id_idx", - "columns": ["collection_id"], - "isUnique": false - }, - "collection_assets_asset_id_idx": { - "name": "collection_assets_asset_id_idx", - "columns": ["asset_id"], - "isUnique": false - } - }, - "foreignKeys": { - "assetCollectionAsset_collection_id_userCollection_id_fk": { - "name": "assetCollectionAsset_collection_id_userCollection_id_fk", - "tableFrom": "assetCollectionAsset", - "tableTo": "userCollection", - "columnsFrom": ["collection_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "assetCollectionAsset_asset_id_asset_id_fk": { - "name": "assetCollectionAsset_asset_id_asset_id_fk", - "tableFrom": "assetCollectionAsset", - "tableTo": "asset", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "socialsConnection": { - "name": "socialsConnection", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "discord_id": { - "name": "discord_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "socials_connection_user_id_idx": { - "name": "socials_connection_user_id_idx", - "columns": ["user_id"], - "isUnique": false - }, - "socials_connection_discord_id_idx": { - "name": "socials_connection_discord_id_idx", - "columns": ["discord_id"], - "isUnique": false - } - }, - "foreignKeys": { - "socialsConnection_user_id_authUser_id_fk": { - "name": "socialsConnection_user_id_authUser_id_fk", - "tableFrom": "socialsConnection", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userFavorite": { - "name": "userFavorite", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "favorited_assets_id_idx": { - "name": "favorited_assets_id_idx", - "columns": ["id"], - "isUnique": false - }, - "favorited_assets_user_id_idx": { - "name": "favorited_assets_user_id_idx", - "columns": ["user_id"], - "isUnique": false - } - }, - "foreignKeys": { - "userFavorite_user_id_authUser_id_fk": { - "name": "userFavorite_user_id_authUser_id_fk", - "tableFrom": "userFavorite", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userFavoriteAsset": { - "name": "userFavoriteAsset", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "favorited_assets_id": { - "name": "favorited_assets_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "favorited_assets_assets_id_idx": { - "name": "favorited_assets_assets_id_idx", - "columns": ["id"], - "isUnique": false - }, - "favorited_assets_assets_user_id_idx": { - "name": "favorited_assets_assets_user_id_idx", - "columns": ["favorited_assets_id"], - "isUnique": false - }, - "favorited_assets_assets_asset_id_idx": { - "name": "favorited_assets_assets_asset_id_idx", - "columns": ["asset_id"], - "isUnique": false - } - }, - "foreignKeys": { - "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk": { - "name": "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk", - "tableFrom": "userFavoriteAsset", - "tableTo": "userFavorite", - "columnsFrom": ["favorited_assets_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "userFavoriteAsset_asset_id_asset_id_fk": { - "name": "userFavoriteAsset_asset_id_asset_id_fk", - "tableFrom": "userFavoriteAsset", - "tableTo": "asset", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userNetworking": { - "name": "userNetworking", - "columns": { - "followerId": { - "name": "followerId", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "followingId": { - "name": "followingId", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "updatedAt": { - "name": "updatedAt", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "userNetworking_follower_idx": { - "name": "userNetworking_follower_idx", - "columns": ["followerId"], - "isUnique": false - }, - "userNetworking_following_idx": { - "name": "userNetworking_following_idx", - "columns": ["followingId"], - "isUnique": false - } - }, - "foreignKeys": { - "userNetworking_followerId_authUser_id_fk": { - "name": "userNetworking_followerId_authUser_id_fk", - "tableFrom": "userNetworking", - "tableTo": "authUser", - "columnsFrom": ["followerId"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - }, - "userNetworking_followingId_authUser_id_fk": { - "name": "userNetworking_followingId_authUser_id_fk", - "tableFrom": "userNetworking", - "tableTo": "authUser", - "columnsFrom": ["followingId"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "name": "game", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_category": { + "name": "asset_category", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by": { + "name": "uploaded_by", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'pending'" + }, + "uploaded_date": { + "name": "uploaded_date", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_is_optimized": { + "name": "asset_is_optimized", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "view_count": { + "name": "view_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "download_count": { + "name": "download_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "file_size": { + "name": "file_size", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "width": { + "name": "width", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "height": { + "name": "height", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "assets_id_idx": { + "name": "assets_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "assets_name_idx": { + "name": "assets_name_idx", + "columns": [ + "name" + ], + "isUnique": false + }, + "assets_game_name_idx": { + "name": "assets_game_name_idx", + "columns": [ + "game" + ], + "isUnique": false + }, + "assets_asset_category_name_idx": { + "name": "assets_asset_category_name_idx", + "columns": [ + "asset_category" + ], + "isUnique": false + }, + "assets_uploaded_by_id_idx": { + "name": "assets_uploaded_by_id_idx", + "columns": [ + "uploaded_by" + ], + "isUnique": false + } + }, + "foreignKeys": { + "asset_game_game_id_fk": { + "name": "asset_game_game_id_fk", + "tableFrom": "asset", + "tableTo": "game", + "columnsFrom": [ + "game" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "asset_asset_category_assetCategory_id_fk": { + "name": "asset_asset_category_assetCategory_id_fk", + "tableFrom": "asset", + "tableTo": "assetCategory", + "columnsFrom": [ + "asset_category" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "asset_uploaded_by_authUser_id_fk": { + "name": "asset_uploaded_by_authUser_id_fk", + "tableFrom": "asset", + "tableTo": "authUser", + "columnsFrom": [ + "uploaded_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetCategory": { + "name": "assetCategory", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetCategory_id_unique": { + "name": "assetCategory_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "assetCategory_name_unique": { + "name": "assetCategory_name_unique", + "columns": [ + "name" + ], + "isUnique": true + }, + "asset_category_id_idx": { + "name": "asset_category_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "asset_category_name_idx": { + "name": "asset_category_name_idx", + "columns": [ + "name" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "gameAssetCategory": { + "name": "gameAssetCategory", + "columns": { + "game_id": { + "name": "game_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_category_id": { + "name": "asset_category_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "game_asset_category_game_id_idx": { + "name": "game_asset_category_game_id_idx", + "columns": [ + "game_id" + ], + "isUnique": false + }, + "game_asset_category_asset_category_id_idx": { + "name": "game_asset_category_asset_category_id_idx", + "columns": [ + "asset_category_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "gameAssetCategory_game_id_game_id_fk": { + "name": "gameAssetCategory_game_id_game_id_fk", + "tableFrom": "gameAssetCategory", + "tableTo": "game", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "gameAssetCategory_asset_category_id_assetCategory_id_fk": { + "name": "gameAssetCategory_asset_category_id_assetCategory_id_fk", + "tableFrom": "gameAssetCategory", + "tableTo": "assetCategory", + "columnsFrom": [ + "asset_category_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetTag": { + "name": "assetTag", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetTag_id_unique": { + "name": "assetTag_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "assetTag_name_unique": { + "name": "assetTag_name_unique", + "columns": [ + "name" + ], + "isUnique": true + }, + "asset_tag_id_idx": { + "name": "asset_tag_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "asset_tag_name_idx": { + "name": "asset_tag_name_idx", + "columns": [ + "name" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetTagAsset": { + "name": "assetTagAsset", + "columns": { + "asset_tag_id": { + "name": "asset_tag_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "asset_tags_assets_asset_tag_id_idx": { + "name": "asset_tags_assets_asset_tag_id_idx", + "columns": [ + "asset_tag_id" + ], + "isUnique": false + }, + "asset_tags_assets_asset_id_idx": { + "name": "asset_tags_assets_asset_id_idx", + "columns": [ + "asset_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "assetTagAsset_asset_tag_id_assetTag_id_fk": { + "name": "assetTagAsset_asset_tag_id_assetTag_id_fk", + "tableFrom": "assetTagAsset", + "tableTo": "assetTag", + "columnsFrom": [ + "asset_tag_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "assetTagAsset_asset_id_asset_id_fk": { + "name": "assetTagAsset_asset_id_asset_id_fk", + "tableFrom": "assetTagAsset", + "tableTo": "asset", + "columnsFrom": [ + "asset_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "atlas": { + "name": "atlas", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by": { + "name": "uploaded_by", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by_name": { + "name": "uploaded_by_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_date": { + "name": "uploaded_date", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "file_size": { + "name": "file_size", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "atlas_id_unique": { + "name": "atlas_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "atlas_id_idx": { + "name": "atlas_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "atlas_uploaded_by_idx": { + "name": "atlas_uploaded_by_idx", + "columns": [ + "uploaded_by" + ], + "isUnique": false + }, + "atlas_uploaded_by_name_idx": { + "name": "atlas_uploaded_by_name_idx", + "columns": [ + "uploaded_by_name" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "atlasToAsset": { + "name": "atlasToAsset", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "atlas_id": { + "name": "atlas_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "atlas_to_assets_id_idx": { + "name": "atlas_to_assets_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "atlas_to_assets_atlas_id_idx": { + "name": "atlas_to_assets_atlas_id_idx", + "columns": [ + "atlas_id" + ], + "isUnique": false + }, + "atlas_to_assets_asset_id_idx": { + "name": "atlas_to_assets_asset_id_idx", + "columns": [ + "asset_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "atlasToAsset_atlas_id_atlas_id_fk": { + "name": "atlasToAsset_atlas_id_atlas_id_fk", + "tableFrom": "atlasToAsset", + "tableTo": "atlas", + "columnsFrom": [ + "atlas_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "atlasToAsset_asset_id_asset_id_fk": { + "name": "atlasToAsset_asset_id_asset_id_fk", + "tableFrom": "atlasToAsset", + "tableTo": "asset", + "columnsFrom": [ + "asset_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "game": { + "name": "game", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": 0 + }, + "possible_suggestive_content": { + "name": "possible_suggestive_content", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "game_id_unique": { + "name": "game_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "game_name_unique": { + "name": "game_name_unique", + "columns": [ + "name" + ], + "isUnique": true + }, + "game_id_idx": { + "name": "game_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "game_name_idx": { + "name": "game_name_idx", + "columns": [ + "name" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "savedOcGenerators": { + "name": "savedOcGenerators", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "game": { + "name": "game", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "date_created": { + "name": "date_created", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "saved_color_palette": { + "name": "saved_color_palette", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sakura_url": { + "name": "sakura_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "savedOcGenerators_id_unique": { + "name": "savedOcGenerators_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "saved_oc_generators_id_idx": { + "name": "saved_oc_generators_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "saved_oc_generators_user_id_idx": { + "name": "saved_oc_generators_user_id_idx", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "savedOcGenerators_user_id_authUser_id_fk": { + "name": "savedOcGenerators_user_id_authUser_id_fk", + "tableFrom": "savedOcGenerators", + "tableTo": "authUser", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} }, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} + "authUser": { + "name": "authUser", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "avatar_url": { + "name": "avatar_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "banner_url": { + "name": "banner_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "display_name": { + "name": "display_name", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "username_colour": { + "name": "username_colour", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "email_verified": { + "name": "email_verified", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "pronouns": { + "name": "pronouns", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "verified": { + "name": "verified", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "bio": { + "name": "bio", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'No bio set'" + }, + "date_joined": { + "name": "date_joined", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "role_flags": { + "name": "role_flags", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "is_contributor": { + "name": "is_contributor", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "self_assignable_role_flags": { + "name": "self_assignable_role_flags", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "authUser_id_unique": { + "name": "authUser_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "authUser_username_unique": { + "name": "authUser_username_unique", + "columns": [ + "username" + ], + "isUnique": true + }, + "user_id_idx": { + "name": "user_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "user_username_idx": { + "name": "user_username_idx", + "columns": [ + "username" + ], + "isUnique": false + }, + "user_email_idx": { + "name": "user_email_idx", + "columns": [ + "email" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "authKey": { + "name": "authKey", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "hashed_password": { + "name": "hashed_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "authKey_id_unique": { + "name": "authKey_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "key_user_id_idx": { + "name": "key_user_id_idx", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "authKey_user_id_authUser_id_fk": { + "name": "authKey_user_id_authUser_id_fk", + "tableFrom": "authKey", + "tableTo": "authUser", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "emailVerificationToken": { + "name": "emailVerificationToken", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "emailVerificationToken_id_unique": { + "name": "emailVerificationToken_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "email_verification_token_user_id_idx": { + "name": "email_verification_token_user_id_idx", + "columns": [ + "user_id" + ], + "isUnique": false + }, + "email_verification_token_token_idx": { + "name": "email_verification_token_token_idx", + "columns": [ + "token" + ], + "isUnique": false + } + }, + "foreignKeys": { + "emailVerificationToken_user_id_authUser_id_fk": { + "name": "emailVerificationToken_user_id_authUser_id_fk", + "tableFrom": "emailVerificationToken", + "tableTo": "authUser", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "passwordResetToken": { + "name": "passwordResetToken", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "passwordResetToken_id_unique": { + "name": "passwordResetToken_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "password_reset_token_user_id_idx": { + "name": "password_reset_token_user_id_idx", + "columns": [ + "user_id" + ], + "isUnique": false + }, + "password_reset_token_token_idx": { + "name": "password_reset_token_token_idx", + "columns": [ + "token" + ], + "isUnique": false + } + }, + "foreignKeys": { + "passwordResetToken_user_id_authUser_id_fk": { + "name": "passwordResetToken_user_id_authUser_id_fk", + "tableFrom": "passwordResetToken", + "tableTo": "authUser", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userCollection": { + "name": "userCollection", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "date_created": { + "name": "date_created", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "userCollection_id_unique": { + "name": "userCollection_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "collection_id_idx": { + "name": "collection_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "user_collection_id_idx": { + "name": "user_collection_id_idx", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "userCollection_user_id_authUser_id_fk": { + "name": "userCollection_user_id_authUser_id_fk", + "tableFrom": "userCollection", + "tableTo": "authUser", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetCollectionAsset": { + "name": "assetCollectionAsset", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "collection_id": { + "name": "collection_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetCollectionAsset_id_unique": { + "name": "assetCollectionAsset_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "collection_assets_id_idx": { + "name": "collection_assets_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "collection_assets_collection_id_idx": { + "name": "collection_assets_collection_id_idx", + "columns": [ + "collection_id" + ], + "isUnique": false + }, + "collection_assets_asset_id_idx": { + "name": "collection_assets_asset_id_idx", + "columns": [ + "asset_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "assetCollectionAsset_collection_id_userCollection_id_fk": { + "name": "assetCollectionAsset_collection_id_userCollection_id_fk", + "tableFrom": "assetCollectionAsset", + "tableTo": "userCollection", + "columnsFrom": [ + "collection_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "assetCollectionAsset_asset_id_asset_id_fk": { + "name": "assetCollectionAsset_asset_id_asset_id_fk", + "tableFrom": "assetCollectionAsset", + "tableTo": "asset", + "columnsFrom": [ + "asset_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "socialsConnection": { + "name": "socialsConnection", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "discord_id": { + "name": "discord_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "socialsConnection_id_unique": { + "name": "socialsConnection_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "socials_connection_user_id_idx": { + "name": "socials_connection_user_id_idx", + "columns": [ + "user_id" + ], + "isUnique": false + }, + "socials_connection_discord_id_idx": { + "name": "socials_connection_discord_id_idx", + "columns": [ + "discord_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "socialsConnection_user_id_authUser_id_fk": { + "name": "socialsConnection_user_id_authUser_id_fk", + "tableFrom": "socialsConnection", + "tableTo": "authUser", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userFavorite": { + "name": "userFavorite", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "userFavorite_id_unique": { + "name": "userFavorite_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "favorited_assets_id_idx": { + "name": "favorited_assets_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "favorited_assets_user_id_idx": { + "name": "favorited_assets_user_id_idx", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "userFavorite_user_id_authUser_id_fk": { + "name": "userFavorite_user_id_authUser_id_fk", + "tableFrom": "userFavorite", + "tableTo": "authUser", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userFavoriteAsset": { + "name": "userFavoriteAsset", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "favorited_assets_id": { + "name": "favorited_assets_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "userFavoriteAsset_id_unique": { + "name": "userFavoriteAsset_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "favorited_assets_assets_id_idx": { + "name": "favorited_assets_assets_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "favorited_assets_assets_user_id_idx": { + "name": "favorited_assets_assets_user_id_idx", + "columns": [ + "favorited_assets_id" + ], + "isUnique": false + }, + "favorited_assets_assets_asset_id_idx": { + "name": "favorited_assets_assets_asset_id_idx", + "columns": [ + "asset_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk": { + "name": "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk", + "tableFrom": "userFavoriteAsset", + "tableTo": "userFavorite", + "columnsFrom": [ + "favorited_assets_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "userFavoriteAsset_asset_id_asset_id_fk": { + "name": "userFavoriteAsset_asset_id_asset_id_fk", + "tableFrom": "userFavoriteAsset", + "tableTo": "asset", + "columnsFrom": [ + "asset_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userNetworking": { + "name": "userNetworking", + "columns": { + "followerId": { + "name": "followerId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "followingId": { + "name": "followingId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updatedAt": { + "name": "updatedAt", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "userNetworking_follower_idx": { + "name": "userNetworking_follower_idx", + "columns": [ + "followerId" + ], + "isUnique": false + }, + "userNetworking_following_idx": { + "name": "userNetworking_following_idx", + "columns": [ + "followingId" + ], + "isUnique": false + } + }, + "foreignKeys": { + "userNetworking_followerId_authUser_id_fk": { + "name": "userNetworking_followerId_authUser_id_fk", + "tableFrom": "userNetworking", + "tableTo": "authUser", + "columnsFrom": [ + "followerId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "userNetworking_followingId_authUser_id_fk": { + "name": "userNetworking_followingId_authUser_id_fk", + "tableFrom": "userNetworking", + "tableTo": "authUser", + "columnsFrom": [ + "followingId" + ], + "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/v2/db/migrations/meta/_journal.json b/src/v2/db/migrations/meta/_journal.json index 617c165..fcb5e08 100644 --- a/src/v2/db/migrations/meta/_journal.json +++ b/src/v2/db/migrations/meta/_journal.json @@ -1,13 +1,13 @@ { - "version": "5", - "dialect": "sqlite", - "entries": [ - { - "idx": 0, - "version": "5", - "when": 1699148199191, - "tag": "0000_nifty_killer_shrike", - "breakpoints": true - } - ] -} + "version": "5", + "dialect": "sqlite", + "entries": [ + { + "idx": 0, + "version": "5", + "when": 1699206644646, + "tag": "0000_sparkling_carmella_unuscione", + "breakpoints": true + } + ] +} \ No newline at end of file diff --git a/src/v2/db/schema/asset/asset-atlas.ts b/src/v2/db/schema/asset/asset-atlas.ts index db0aea2..348bd9e 100644 --- a/src/v2/db/schema/asset/asset-atlas.ts +++ b/src/v2/db/schema/asset/asset-atlas.ts @@ -17,7 +17,7 @@ NOTE: this allows for users down the line to link their uploaded assets to appro export const atlas = sqliteTable( tableNames.atlas, { - id: text("id").primaryKey(), + id: text("id").unique().notNull(), url: text("url").notNull(), uploadedById: text("uploaded_by").notNull(), uploadedByName: text("uploaded_by_name").notNull(), @@ -43,7 +43,7 @@ export type NewAtlas = typeof atlas.$inferInsert export const atlasToAsset = sqliteTable( tableNames.atlasToAsset, { - id: text("id").primaryKey(), + id: text("id"), atlasId: text("atlas_id") .notNull() .references(() => atlas.id, { diff --git a/src/v2/db/schema/asset/asset-categories.ts b/src/v2/db/schema/asset/asset-categories.ts index 4f123a2..67d42a1 100644 --- a/src/v2/db/schema/asset/asset-categories.ts +++ b/src/v2/db/schema/asset/asset-categories.ts @@ -19,11 +19,11 @@ NOTE: This setup can look kinda janky. export const assetCategory = sqliteTable( tableNames.assetCategory, { - id: text("id").primaryKey(), - name: text("name").notNull(), // e.g tcg-sheets, splash-art + id: text("id").unique().notNull(), + name: text("name").unique().notNull(), // e.g tcg-sheets, splash-art formattedName: text("formatted_name").notNull(), // e.g TCG Sheets, Splash Art assetCount: integer("asset_count").default(0).notNull(), - lastUpdated: integer("last_updated").notNull(), + lastUpdated: text("last_updated").notNull(), }, (assetCategory) => { return { @@ -41,7 +41,6 @@ export type NewAssetCategory = typeof assetCategory.$inferInsert export const gameAssetCategory = sqliteTable( tableNames.gameAssetCategory, { - id: text("id").primaryKey(), gameId: text("game_id") .notNull() .references(() => game.id, { @@ -57,9 +56,6 @@ export const gameAssetCategory = sqliteTable( }, (gameAssetCategory) => { return { - gameAssetCategoryIdx: index("game_asset_category_id_idx").on( - gameAssetCategory.id - ), gameAssetCategoryGameIdx: index( "game_asset_category_game_id_idx" ).on(gameAssetCategory.gameId), @@ -74,7 +70,7 @@ export type GameAssetCategory = typeof gameAssetCategory.$inferSelect export type NewGameAssetCategory = typeof gameAssetCategory.$inferInsert export const assetCategoryRelations = relations(assetCategory, ({ many }) => ({ - assets: many(asset), + asset: many(asset), gameAssetCategory: many(gameAssetCategory), })) diff --git a/src/v2/db/schema/asset/asset-tags.ts b/src/v2/db/schema/asset/asset-tags.ts index b7d1430..6fa9c95 100644 --- a/src/v2/db/schema/asset/asset-tags.ts +++ b/src/v2/db/schema/asset/asset-tags.ts @@ -18,11 +18,11 @@ NOTE: Asset tags are not stored as ENUMs to allow for better UX, flexibility, an export const assetTag = sqliteTable( tableNames.assetTag, { - id: text("id").primaryKey(), - name: text("name").notNull(), + id: text("id").unique().notNull(), + name: text("name").notNull().unique(), formattedName: text("formatted_name").notNull(), assetCount: integer("asset_count").default(0).notNull(), - lastUpdated: integer("last_updated").notNull(), + lastUpdated: text("last_updated").notNull(), }, (assetTag) => { return { @@ -38,7 +38,6 @@ export type NewAssetTag = typeof assetTag.$inferInsert export const assetTagAsset = sqliteTable( tableNames.assetTagAsset, { - id: text("id").primaryKey(), assetTagId: text("asset_tag_id") .notNull() .references(() => assetTag.id, { @@ -54,9 +53,6 @@ export const assetTagAsset = sqliteTable( }, (assetTagAsset) => { return { - assetTagAssetIdx: index("asset_tags_assets_id_idx").on( - assetTagAsset.id - ), assetTagAssetAssetTagIdx: index( "asset_tags_assets_asset_tag_id_idx" ).on(assetTagAsset.assetTagId), @@ -70,6 +66,10 @@ export const assetTagAsset = sqliteTable( export type AssetTagAsset = typeof assetTagAsset.$inferSelect export type NewAssetTagAsset = typeof assetTagAsset.$inferInsert +export const assetTagRelations = relations(assetTag, ({ many }) => ({ + assetTagAsset: many(assetTagAsset), +})) + export const assetTagAssetRelations = relations(assetTagAsset, ({ one }) => ({ assetTag: one(assetTag, { fields: [assetTagAsset.assetTagId], diff --git a/src/v2/db/schema/asset/asset.ts b/src/v2/db/schema/asset/asset.ts index 7d036ad..f1e75bd 100644 --- a/src/v2/db/schema/asset/asset.ts +++ b/src/v2/db/schema/asset/asset.ts @@ -31,35 +31,26 @@ export const asset = sqliteTable( id: integer("id").primaryKey(), // primary key auto increments on sqlite name: text("name").notNull(), extension: text("extension").notNull(), - game: text("game") - .notNull() - .references(() => game.name, { + gameId: text("game") + .references(() => game.id, { onUpdate: "cascade", onDelete: "cascade", - }), - assetCategory: text("asset_category") - .notNull() - .references(() => assetCategory.name, { + }).notNull(), + assetCategoryId: text("asset_category") + .references(() => assetCategory.id, { onUpdate: "cascade", onDelete: "cascade", - }), + }).notNull(), + uploadedById: text("uploaded_by").references(() => authUser.id, { + onUpdate: "cascade", + onDelete: "cascade", + }).notNull(), url: text("url").notNull(), status: text("status") .$type() .default("pending") .notNull(), - uploadedById: text("uploaded_by").references(() => authUser.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - uploadedByName: text("uploaded_by_name").references( - () => authUser.username, - { - onUpdate: "cascade", - onDelete: "cascade", - } - ), - uploadedDate: integer("uploaded_date").notNull(), + uploadedDate: text("uploaded_date").notNull(), assetIsOptimized: integer("asset_is_optimized").default(0).notNull(), viewCount: integer("view_count").default(0).notNull(), downloadCount: integer("download_count").default(0).notNull(), @@ -71,16 +62,13 @@ export const asset = sqliteTable( return { idIdx: index("assets_id_idx").on(table.id), nameIdx: index("assets_name_idx").on(table.name), - gameIdx: index("assets_game_idx").on(table.game), - assetCategoryIdx: index("assets_asset_category_idx").on( - table.assetCategory + gameIdIdx: index("assets_game_name_idx").on(table.gameId), + assetCategoryIdIdx: index("assets_asset_category_name_idx").on( + table.assetCategoryId ), - uploadedByIdIdx: index("assets_uploaded_by_idx").on( + uploadedByIdIdx: index("assets_uploaded_by_id_idx").on( table.uploadedById ), - uploadedByNameIdx: index("assets_uploaded_by_name_idx").on( - table.uploadedByName - ), } } ) @@ -89,18 +77,18 @@ export type Asset = typeof asset.$inferSelect export type NewAsset = typeof asset.$inferInsert export const assetRelations = relations(asset, ({ one, many }) => ({ - uploadedBy: one(authUser, { - fields: [asset.uploadedById, asset.uploadedByName], - references: [authUser.id, authUser.username], - }), assetTagAsset: many(assetTagAsset), atlas: many(atlasToAsset), - assetCategory: one(assetCategory, { - fields: [asset.assetCategory], - references: [assetCategory.name], + authUser: one(authUser, { + fields: [asset.uploadedById], + references: [authUser.id], }), game: one(game, { - fields: [asset.game], - references: [game.name], + fields: [asset.gameId], + references: [game.id], + }), + assetCategory: one(assetCategory, { + fields: [asset.gameId], + references: [assetCategory.id], }), })) diff --git a/src/v2/db/schema/game/game.ts b/src/v2/db/schema/game/game.ts index ba6c7c1..ae61b47 100644 --- a/src/v2/db/schema/game/game.ts +++ b/src/v2/db/schema/game/game.ts @@ -18,14 +18,14 @@ NOTE: Game relation is easy to understand and self-explanatory. export const game = sqliteTable( tableNames.game, { - id: text("id").primaryKey(), - name: text("name").notNull(), // e.g genshin-impact, honkai-impact-3rd + id: text("id").unique().notNull(), + name: text("name").notNull().unique(), // e.g genshin-impact, honkai-impact-3rd formattedName: text("formatted_name").notNull(), // e.g Genshin Impact, Honkai Impact 3rd assetCount: integer("asset_count").default(0), possibleSuggestiveContent: integer("possible_suggestive_content") .default(0) .notNull(), - lastUpdated: integer("last_updated").notNull(), + lastUpdated: text("last_updated").notNull(), }, (game) => { return { @@ -39,6 +39,6 @@ export type Game = typeof game.$inferSelect export type NewGame = typeof game.$inferInsert export const gameRelations = relations(game, ({ many }) => ({ - assets: many(asset), + asset: many(asset), gameAssetCategory: many(gameAssetCategory), })) diff --git a/src/v2/db/schema/oc-generators/oc-generators.ts b/src/v2/db/schema/oc-generators/oc-generators.ts index 0f7e90b..44fa64b 100644 --- a/src/v2/db/schema/oc-generators/oc-generators.ts +++ b/src/v2/db/schema/oc-generators/oc-generators.ts @@ -18,7 +18,7 @@ NOTE: OC generators are not stored in the database. export const savedOcGenerators = sqliteTable( tableNames.savedOcGenerators, { - id: text("id").primaryKey(), + id: text("id").unique().notNull(), userId: text("user_id") .notNull() .references(() => authUser.id, { diff --git a/src/v2/db/schema/user/user-attributes.ts b/src/v2/db/schema/user/user-attributes.ts index d1e6f94..6085871 100644 --- a/src/v2/db/schema/user/user-attributes.ts +++ b/src/v2/db/schema/user/user-attributes.ts @@ -18,7 +18,7 @@ NOTE: This is mostly security related. export const emailVerificationToken = sqliteTable( tableNames.emailVerificationToken, { - id: text("id").primaryKey(), + id: text("id").unique().notNull(), userId: text("user_id") .notNull() .references(() => authUser.id, { @@ -47,7 +47,7 @@ export type NewEmailVerificationToken = export const passwordResetToken = sqliteTable( tableNames.passwordResetToken, { - id: text("id").primaryKey(), + id: text("id").unique().notNull(), userId: text("user_id") .notNull() .references(() => authUser.id, { diff --git a/src/v2/db/schema/user/user-collections.ts b/src/v2/db/schema/user/user-collections.ts index 5ee3686..30a1674 100644 --- a/src/v2/db/schema/user/user-collections.ts +++ b/src/v2/db/schema/user/user-collections.ts @@ -19,7 +19,7 @@ NOTE: this file is where users store their collections of assets. export const userCollection = sqliteTable( tableNames.userCollection, { - id: text("id").primaryKey(), + id: text("id").unique().notNull(), name: text("name").notNull(), description: text("description").notNull(), userId: text("user_id") @@ -47,7 +47,7 @@ export type NewUserCollection = typeof userCollection.$inferInsert export const userCollectionAsset = sqliteTable( tableNames.userCollectionAsset, { - id: text("id").primaryKey(), + id: text("id").unique().notNull(), collectionId: text("collection_id") .notNull() .references(() => userCollection.id, { diff --git a/src/v2/db/schema/user/user-connections.ts b/src/v2/db/schema/user/user-connections.ts index c180626..0112bfc 100644 --- a/src/v2/db/schema/user/user-connections.ts +++ b/src/v2/db/schema/user/user-connections.ts @@ -11,7 +11,7 @@ NOTE: This file will be expanded on in the future, but for now it's just for Dis export const socialsConnection = sqliteTable( tableNames.socialsConnection, { - id: text("id").primaryKey(), + id: text("id").unique().notNull(), userId: text("user_id") .notNull() .references(() => authUser.id, { diff --git a/src/v2/db/schema/user/user-favorites.ts b/src/v2/db/schema/user/user-favorites.ts index 67402c7..8f205f3 100644 --- a/src/v2/db/schema/user/user-favorites.ts +++ b/src/v2/db/schema/user/user-favorites.ts @@ -19,7 +19,7 @@ NOTE: this file is users favorite assets. export const userFavorite = sqliteTable( tableNames.userFavorite, { - id: text("id").primaryKey(), + id: text("id").unique().notNull(), userId: text("user_id") .notNull() .references(() => authUser.id, { @@ -46,7 +46,7 @@ export type NewUserFavorite = typeof userFavorite.$inferInsert export const userFavoriteAsset = sqliteTable( tableNames.userFavoriteAsset, { - id: text("id").primaryKey(), + id: text("id").unique().notNull(), userFavoriteId: text("favorited_assets_id") .notNull() .references(() => userFavorite.id, { diff --git a/src/v2/db/schema/user/user.ts b/src/v2/db/schema/user/user.ts index 9777544..c3e7049 100644 --- a/src/v2/db/schema/user/user.ts +++ b/src/v2/db/schema/user/user.ts @@ -26,11 +26,11 @@ NOTE: Very basic user information export const authUser = sqliteTable( tableNames.authUser, { - id: text("id").primaryKey(), + id: text("id").unique().notNull(), avatarUrl: text("avatar_url"), bannerUrl: text("banner_url"), displayName: text("display_name"), - username: text("username").notNull(), + username: text("username").notNull().unique(), usernameColour: text("username_colour"), email: text("email").notNull(), emailVerified: integer("email_verified").default(0).notNull(), @@ -59,7 +59,7 @@ export type NewUsers = typeof authUser.$inferInsert export const keys = sqliteTable( tableNames.authKey, { - id: text("id").primaryKey(), + id: text("id").unique().notNull(), userId: text("user_id") .notNull() .references(() => authUser.id, { @@ -86,7 +86,7 @@ export const usersRelations = relations(authUser, ({ one, many }) => ({ relationName: "following", }), key: many(keys), - assets: many(asset), + asset: many(asset), atlas: many(atlas), userFavorite: one(userFavorite), socialsConnection: one(socialsConnection), diff --git a/src/v2/db/turso.ts b/src/v2/db/turso.ts index 792571d..5ae9b46 100644 --- a/src/v2/db/turso.ts +++ b/src/v2/db/turso.ts @@ -50,3 +50,6 @@ export function getConnection(env: Bindings) { turso, } } + +export type DrizzleClient = ReturnType +export type TursoClient = ReturnType \ No newline at end of file diff --git a/src/v2/routes/asset/get-asset-from-id.ts b/src/v2/routes/asset/get-asset-from-id.ts index d91859f..4f5618a 100644 --- a/src/v2/routes/asset/get-asset-from-id.ts +++ b/src/v2/routes/asset/get-asset-from-id.ts @@ -48,7 +48,7 @@ export async function getAssetFromId(c: APIContext): Promise { where: (asset, { eq, and }) => and( eq(asset.status, "approved"), - eq(asset.assetCategory, foundAsset.assetCategory) + eq(asset.assetCategoryId, foundAsset.assetCategoryId) ), limit: 6, orderBy: desc(asset.id), diff --git a/src/v2/routes/auth/asset-categories/create-asset-category.ts b/src/v2/routes/auth/asset-categories/create-asset-category.ts index e235fc3..87a45af 100644 --- a/src/v2/routes/auth/asset-categories/create-asset-category.ts +++ b/src/v2/routes/auth/asset-categories/create-asset-category.ts @@ -30,7 +30,7 @@ export async function createAssetCategory(c: APIContext): Promise { name: formData.get("name") as string, formattedName: formData.get("formattedName") as string, assetCount: 0, - lastUpdated: new Date().getTime(), // unix timestamp + lastUpdated: new Date().toISOString(), } // check if assetCategory.name exists diff --git a/src/v2/routes/auth/assets/modify-asset.ts b/src/v2/routes/auth/assets/modify-asset.ts index 8d354cd..7e02247 100644 --- a/src/v2/routes/auth/assets/modify-asset.ts +++ b/src/v2/routes/auth/assets/modify-asset.ts @@ -100,7 +100,6 @@ export async function modifyAssetData(c: APIContext): Promise { await trx .insert(assetTagAsset) .values({ - id: crypto.randomUUID(), assetId: parseInt(assetIdToModify), assetTagId: tagExists[0].assetTagId, }) diff --git a/src/v2/routes/auth/assets/upload-asset.ts b/src/v2/routes/auth/assets/upload-asset.ts index cc51414..f42b5d6 100644 --- a/src/v2/routes/auth/assets/upload-asset.ts +++ b/src/v2/routes/auth/assets/upload-asset.ts @@ -92,12 +92,12 @@ export async function uploadAsset(c: APIContext): Promise { const newAsset = { name: formData.data.name, extension: formData.data.extension, - game: formData.data.game, - assetCategory: formData.data.category, + gameId: formData.data.game, + assetCategoryId: formData.data.category, url: `/assets/${formData.data.game}/${formData.data.category}/${formData.data.name}.${formData.data.extension}`, uploadedById: session.user.userId, status: bypassApproval ? "approved" : ("pending" as AssetStatus), - uploadedDate: new Date().getTime(), + uploadedDate: new Date().toISOString(), fileSize: formData.data.size, // stored in bytes width: formData.data.width, height: formData.data.height, @@ -159,7 +159,6 @@ export async function uploadAsset(c: APIContext): Promise { await trx .insert(assetTagAsset) .values({ - id: crypto.randomUUID(), assetId: newAssetDB[0].assetId, assetTagId: tagExists.id, }) diff --git a/src/v2/routes/auth/games/create-game.ts b/src/v2/routes/auth/games/create-game.ts index 91ace1b..643809a 100644 --- a/src/v2/routes/auth/games/create-game.ts +++ b/src/v2/routes/auth/games/create-game.ts @@ -30,7 +30,7 @@ export async function createGame(c: APIContext): Promise { name: formData.get("name") as string, formattedName: formData.get("formattedName") as string, assetCount: 0, - lastUpdated: new Date().getTime(), + lastUpdated: new Date().toISOString(), } // check if game.name exists diff --git a/src/v2/routes/auth/tags/create-tag.ts b/src/v2/routes/auth/tags/create-tag.ts index 56827b5..c918819 100644 --- a/src/v2/routes/auth/tags/create-tag.ts +++ b/src/v2/routes/auth/tags/create-tag.ts @@ -53,7 +53,7 @@ export async function createTag(c: APIContext): Promise { name, formattedName, assetCount: 0, - lastUpdated: new Date().getTime(), // unix timestamp + lastUpdated: new Date().toISOString(), } // check if tag.name exists diff --git a/src/v2/routes/search/asset/search-assets.ts b/src/v2/routes/search/asset/search-assets.ts index f650bc3..b4b7393 100644 --- a/src/v2/routes/search/asset/search-assets.ts +++ b/src/v2/routes/search/asset/search-assets.ts @@ -53,11 +53,11 @@ export async function searchForAssets(c: APIContext): Promise { .where( and( searchQuery && like(asset.name, `%${searchQuery}%`), - gameList && or(...gameList.map((game) => eq(asset.game, game))), + gameList && or(...gameList.map((game) => eq(asset.assetCategoryId, game))), assetCategoryList && or( ...assetCategoryList.map((category) => - eq(asset.assetCategory, category) + eq(asset.assetCategoryId, category) ) ), eq(asset.status, "approved") From 0d7ee6f1f38b2efb1c5a2472e2383d731c600093 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Sun, 5 Nov 2023 18:17:24 +0000 Subject: [PATCH 136/318] prettier, add seed to test workflow --- src/scripts/seed/seed.ts | 415 +-- src/v2/db/migrations/meta/0000_snapshot.json | 3120 ++++++++---------- src/v2/db/migrations/meta/_journal.json | 24 +- src/v2/db/schema/asset/asset.ts | 16 +- src/v2/db/turso.ts | 2 +- src/v2/routes/search/asset/search-assets.ts | 7 +- 6 files changed, 1702 insertions(+), 1882 deletions(-) diff --git a/src/scripts/seed/seed.ts b/src/scripts/seed/seed.ts index 57293aa..5317630 100644 --- a/src/scripts/seed/seed.ts +++ b/src/scripts/seed/seed.ts @@ -36,220 +36,245 @@ async function main() { console.log("Seeding database...\n") console.log("[authUser] Seeding users...") - const newUsers = await db.insert(authUser).values([ - { - id: "userid1", - username: "testuser", - email: "hi@dromzeh.dev", - emailVerified: 1, - usernameColour: "#84E6F8", - bio: "test bio", - dateJoined: new Date().toISOString(), - roleFlags: 1, - isContributor: 0, - selfAssignableRoleFlags: 0, - }, - { - id: "userid2", - username: "testuser2", - email: "hi2@dromzeh.dev", - emailVerified: 1, - bio: "test bio 2", - pronouns: "he/him/his", - dateJoined: new Date().toISOString(), - roleFlags: 1, - isContributor: 0, - selfAssignableRoleFlags: 0, - }, - { - id: "userid3", - username: "testuser3", - email: "hi3@dromzeh.dev", - emailVerified: 1, - bio: "test bio 3", - dateJoined: new Date().toISOString(), - roleFlags: 1, - isContributor: 0, - selfAssignableRoleFlags: 0, - }, - ]).returning() + const newUsers = await db + .insert(authUser) + .values([ + { + id: "userid1", + username: "testuser", + email: "hi@dromzeh.dev", + emailVerified: 1, + usernameColour: "#84E6F8", + bio: "test bio", + dateJoined: new Date().toISOString(), + roleFlags: 1, + isContributor: 0, + selfAssignableRoleFlags: 0, + }, + { + id: "userid2", + username: "testuser2", + email: "hi2@dromzeh.dev", + emailVerified: 1, + bio: "test bio 2", + pronouns: "he/him/his", + dateJoined: new Date().toISOString(), + roleFlags: 1, + isContributor: 0, + selfAssignableRoleFlags: 0, + }, + { + id: "userid3", + username: "testuser3", + email: "hi3@dromzeh.dev", + emailVerified: 1, + bio: "test bio 3", + dateJoined: new Date().toISOString(), + roleFlags: 1, + isContributor: 0, + selfAssignableRoleFlags: 0, + }, + ]) + .returning() console.log(`[authUser] inserted ${newUsers.length} rows\n`) console.log("[userNetworking] Seeding user following...") - const newUserNetworking = await db.insert(userNetworking).values([ - { - followerId: newUsers[0].id, - followingId: newUsers[1].id, - createdAt: new Date().toISOString(), - updatedAt: new Date().toISOString(), - }, - { - followerId: newUsers[1].id, - followingId: newUsers[0].id, - createdAt: new Date().toISOString(), - updatedAt: new Date().toISOString(), - }, - { - followerId: newUsers[0].id, - followingId: newUsers[2].id, - createdAt: new Date().toISOString(), - updatedAt: new Date().toISOString(), - }, - ]).returning() + const newUserNetworking = await db + .insert(userNetworking) + .values([ + { + followerId: newUsers[0].id, + followingId: newUsers[1].id, + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), + }, + { + followerId: newUsers[1].id, + followingId: newUsers[0].id, + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), + }, + { + followerId: newUsers[0].id, + followingId: newUsers[2].id, + createdAt: new Date().toISOString(), + updatedAt: new Date().toISOString(), + }, + ]) + .returning() console.log(`[userNetworking] inserted ${newUserNetworking.length} rows\n`) - console.log("[assetTag] Seeding asset tags...") - const newAssetTags = await db.insert(assetTag).values([ - { - id: "official", - name: "official", - formattedName: "Official", - assetCount: 1, - lastUpdated: new Date().toISOString(), - }, - { - id: "1.0", - name: "1.0", - formattedName: "1.0", - assetCount: 1, - lastUpdated: new Date().toISOString(), - }, - ]).returning() + const newAssetTags = await db + .insert(assetTag) + .values([ + { + id: "official", + name: "official", + formattedName: "Official", + assetCount: 1, + lastUpdated: new Date().toISOString(), + }, + { + id: "1.0", + name: "1.0", + formattedName: "1.0", + assetCount: 1, + lastUpdated: new Date().toISOString(), + }, + ]) + .returning() console.log(`[assetTag] inserted ${newAssetTags.length} rows\n`) - + console.log("[game] Seeding games...") - const newGames = await db.insert(game).values([ - { - id: "genshin-impact", - name: "genshin-impact", - formattedName: "Genshin Impact", - assetCount: 1, - possibleSuggestiveContent: 0, - lastUpdated: new Date().toISOString(), - }, - { - id: "honkai-impact-3rd", - name: "honkai-impact-3rd", - formattedName: "Honkai Impact: 3rd", - assetCount: 0, - possibleSuggestiveContent: 0, - lastUpdated: new Date().toISOString(), - }, - ]).returning() + const newGames = await db + .insert(game) + .values([ + { + id: "genshin-impact", + name: "genshin-impact", + formattedName: "Genshin Impact", + assetCount: 1, + possibleSuggestiveContent: 0, + lastUpdated: new Date().toISOString(), + }, + { + id: "honkai-impact-3rd", + name: "honkai-impact-3rd", + formattedName: "Honkai Impact: 3rd", + assetCount: 0, + possibleSuggestiveContent: 0, + lastUpdated: new Date().toISOString(), + }, + ]) + .returning() console.log(`[game] inserted ${newGames.length} rows\n`) console.log("[assetCategory] Seeding asset categories...") - const newAssetCategories = await db.insert(assetCategory).values([ - { - id: "character-sheets", - name: "character-sheets", - formattedName: "Character Sheets", - assetCount: 1, - lastUpdated: new Date().toISOString(), - }, - { - id: "splash-art", - name: "splash-art", - formattedName: "Splash Art", - assetCount: 0, - lastUpdated: new Date().toISOString(), - }, - ]).returning() + const newAssetCategories = await db + .insert(assetCategory) + .values([ + { + id: "character-sheets", + name: "character-sheets", + formattedName: "Character Sheets", + assetCount: 1, + lastUpdated: new Date().toISOString(), + }, + { + id: "splash-art", + name: "splash-art", + formattedName: "Splash Art", + assetCount: 0, + lastUpdated: new Date().toISOString(), + }, + ]) + .returning() console.log(`[assetCategory] inserted ${newAssetCategories.length} rows\n`) console.log("[gameAssetCategory] Linking games to asset categories...") - const newGameAssetCategory = await db.insert(gameAssetCategory).values([ - { - gameId: "genshin-impact", - assetCategoryId: "character-sheets", - }, - { - gameId: "genshin-impact", - assetCategoryId: "splash-art", - }, - { - gameId: "honkai-impact-3rd", - assetCategoryId: "character-sheets", - }, - ]).returning() - console.log(`[gameAssetCategory] inserted ${newGameAssetCategory.length} rows\n`) + const newGameAssetCategory = await db + .insert(gameAssetCategory) + .values([ + { + gameId: "genshin-impact", + assetCategoryId: "character-sheets", + }, + { + gameId: "genshin-impact", + assetCategoryId: "splash-art", + }, + { + gameId: "honkai-impact-3rd", + assetCategoryId: "character-sheets", + }, + ]) + .returning() + console.log( + `[gameAssetCategory] inserted ${newGameAssetCategory.length} rows\n` + ) console.log("[asset] Seeding assets...") - const newAssets = await db.insert(asset).values([ - { - id: 1, - name: "test-asset", - extension: "image/png", - gameId: "genshin-impact", - assetCategoryId: "character-sheets", - url: "/test/image.png", - status: "approved", - uploadedById: "userid1", - uploadedDate: new Date().toISOString(), - assetIsOptimized: 0, - viewCount: 1337, - downloadCount: 1337, - fileSize: 40213, - width: 1920, - height: 1080, - }, - { - id: 2, - name: "test-asset-2", - extension: "image/png", - gameId: "honkai-impact-3rd", - assetCategoryId: "character-sheets", - url: "/test/image.png", - status: "approved", - uploadedById: "userid2", - uploadedDate: new Date().toISOString(), - assetIsOptimized: 0, - viewCount: 1337, - downloadCount: 1337, - fileSize: 40213, - width: 1920, - height: 1080, - }, - { - id: 3, - name: "test-asset-3", - extension: "image/png", - gameId: "genshin-impact", - assetCategoryId: "splash-art", - url: "/test/image.png", - status: "approved", - uploadedById: "userid2", - uploadedDate: new Date().toISOString(), - assetIsOptimized: 0, - viewCount: 1337, - downloadCount: 1337, - fileSize: 40213, - width: 1920, - height: 1080, - }, - ]).returning() + const newAssets = await db + .insert(asset) + .values([ + { + id: 1, + name: "test-asset", + extension: "image/png", + gameId: "genshin-impact", + assetCategoryId: "character-sheets", + url: "/test/image.png", + status: "approved", + uploadedById: "userid1", + uploadedDate: new Date().toISOString(), + assetIsOptimized: 0, + viewCount: 1337, + downloadCount: 1337, + fileSize: 40213, + width: 1920, + height: 1080, + }, + { + id: 2, + name: "test-asset-2", + extension: "image/png", + gameId: "honkai-impact-3rd", + assetCategoryId: "character-sheets", + url: "/test/image.png", + status: "approved", + uploadedById: "userid2", + uploadedDate: new Date().toISOString(), + assetIsOptimized: 0, + viewCount: 1337, + downloadCount: 1337, + fileSize: 40213, + width: 1920, + height: 1080, + }, + { + id: 3, + name: "test-asset-3", + extension: "image/png", + gameId: "genshin-impact", + assetCategoryId: "splash-art", + url: "/test/image.png", + status: "approved", + uploadedById: "userid2", + uploadedDate: new Date().toISOString(), + assetIsOptimized: 0, + viewCount: 1337, + downloadCount: 1337, + fileSize: 40213, + width: 1920, + height: 1080, + }, + ]) + .returning() console.log(`[asset] inserted ${newAssets.length} rows\n`) console.log("[assetTagAsset] Linking assets to asset tags...") - const newAssetTagAsset = await db.insert(assetTagAsset).values([ - { - assetId: 1, - assetTagId: "official", - }, - { - assetId: 1, - assetTagId: "1.0", - }, - { - assetId: 2, - assetTagId: "official", - }, - { - assetId: 3, - assetTagId: "official", - }, - ]).returning() + const newAssetTagAsset = await db + .insert(assetTagAsset) + .values([ + { + assetId: 1, + assetTagId: "official", + }, + { + assetId: 1, + assetTagId: "1.0", + }, + { + assetId: 2, + assetTagId: "official", + }, + { + assetId: 3, + assetTagId: "official", + }, + ]) + .returning() console.log(`[assetTagAsset] inserted ${newAssetTagAsset.length} rows\n`) console.log("Seeded database successfully") diff --git a/src/v2/db/migrations/meta/0000_snapshot.json b/src/v2/db/migrations/meta/0000_snapshot.json index f05f954..a61c1fb 100644 --- a/src/v2/db/migrations/meta/0000_snapshot.json +++ b/src/v2/db/migrations/meta/0000_snapshot.json @@ -1,1673 +1,1459 @@ { - "version": "5", - "dialect": "sqlite", - "id": "6b46f393-1ae5-40d7-ab31-1fd8c0d6a229", - "prevId": "00000000-0000-0000-0000-000000000000", - "tables": { - "asset": { - "name": "asset", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "extension": { - "name": "extension", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false + "version": "5", + "dialect": "sqlite", + "id": "6b46f393-1ae5-40d7-ab31-1fd8c0d6a229", + "prevId": "00000000-0000-0000-0000-000000000000", + "tables": { + "asset": { + "name": "asset", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "extension": { + "name": "extension", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "game": { + "name": "game", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_category": { + "name": "asset_category", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by": { + "name": "uploaded_by", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'pending'" + }, + "uploaded_date": { + "name": "uploaded_date", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_is_optimized": { + "name": "asset_is_optimized", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "view_count": { + "name": "view_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "download_count": { + "name": "download_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "file_size": { + "name": "file_size", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "width": { + "name": "width", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "height": { + "name": "height", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "assets_id_idx": { + "name": "assets_id_idx", + "columns": ["id"], + "isUnique": false + }, + "assets_name_idx": { + "name": "assets_name_idx", + "columns": ["name"], + "isUnique": false + }, + "assets_game_name_idx": { + "name": "assets_game_name_idx", + "columns": ["game"], + "isUnique": false + }, + "assets_asset_category_name_idx": { + "name": "assets_asset_category_name_idx", + "columns": ["asset_category"], + "isUnique": false + }, + "assets_uploaded_by_id_idx": { + "name": "assets_uploaded_by_id_idx", + "columns": ["uploaded_by"], + "isUnique": false + } + }, + "foreignKeys": { + "asset_game_game_id_fk": { + "name": "asset_game_game_id_fk", + "tableFrom": "asset", + "tableTo": "game", + "columnsFrom": ["game"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "asset_asset_category_assetCategory_id_fk": { + "name": "asset_asset_category_assetCategory_id_fk", + "tableFrom": "asset", + "tableTo": "assetCategory", + "columnsFrom": ["asset_category"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "asset_uploaded_by_authUser_id_fk": { + "name": "asset_uploaded_by_authUser_id_fk", + "tableFrom": "asset", + "tableTo": "authUser", + "columnsFrom": ["uploaded_by"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetCategory": { + "name": "assetCategory", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetCategory_id_unique": { + "name": "assetCategory_id_unique", + "columns": ["id"], + "isUnique": true + }, + "assetCategory_name_unique": { + "name": "assetCategory_name_unique", + "columns": ["name"], + "isUnique": true + }, + "asset_category_id_idx": { + "name": "asset_category_id_idx", + "columns": ["id"], + "isUnique": false + }, + "asset_category_name_idx": { + "name": "asset_category_name_idx", + "columns": ["name"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "gameAssetCategory": { + "name": "gameAssetCategory", + "columns": { + "game_id": { + "name": "game_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_category_id": { + "name": "asset_category_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "game_asset_category_game_id_idx": { + "name": "game_asset_category_game_id_idx", + "columns": ["game_id"], + "isUnique": false + }, + "game_asset_category_asset_category_id_idx": { + "name": "game_asset_category_asset_category_id_idx", + "columns": ["asset_category_id"], + "isUnique": false + } + }, + "foreignKeys": { + "gameAssetCategory_game_id_game_id_fk": { + "name": "gameAssetCategory_game_id_game_id_fk", + "tableFrom": "gameAssetCategory", + "tableTo": "game", + "columnsFrom": ["game_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "gameAssetCategory_asset_category_id_assetCategory_id_fk": { + "name": "gameAssetCategory_asset_category_id_assetCategory_id_fk", + "tableFrom": "gameAssetCategory", + "tableTo": "assetCategory", + "columnsFrom": ["asset_category_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetTag": { + "name": "assetTag", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetTag_id_unique": { + "name": "assetTag_id_unique", + "columns": ["id"], + "isUnique": true + }, + "assetTag_name_unique": { + "name": "assetTag_name_unique", + "columns": ["name"], + "isUnique": true + }, + "asset_tag_id_idx": { + "name": "asset_tag_id_idx", + "columns": ["id"], + "isUnique": false + }, + "asset_tag_name_idx": { + "name": "asset_tag_name_idx", + "columns": ["name"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetTagAsset": { + "name": "assetTagAsset", + "columns": { + "asset_tag_id": { + "name": "asset_tag_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "asset_tags_assets_asset_tag_id_idx": { + "name": "asset_tags_assets_asset_tag_id_idx", + "columns": ["asset_tag_id"], + "isUnique": false + }, + "asset_tags_assets_asset_id_idx": { + "name": "asset_tags_assets_asset_id_idx", + "columns": ["asset_id"], + "isUnique": false + } + }, + "foreignKeys": { + "assetTagAsset_asset_tag_id_assetTag_id_fk": { + "name": "assetTagAsset_asset_tag_id_assetTag_id_fk", + "tableFrom": "assetTagAsset", + "tableTo": "assetTag", + "columnsFrom": ["asset_tag_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "assetTagAsset_asset_id_asset_id_fk": { + "name": "assetTagAsset_asset_id_asset_id_fk", + "tableFrom": "assetTagAsset", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "atlas": { + "name": "atlas", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by": { + "name": "uploaded_by", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by_name": { + "name": "uploaded_by_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_date": { + "name": "uploaded_date", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "file_size": { + "name": "file_size", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "atlas_id_unique": { + "name": "atlas_id_unique", + "columns": ["id"], + "isUnique": true + }, + "atlas_id_idx": { + "name": "atlas_id_idx", + "columns": ["id"], + "isUnique": false + }, + "atlas_uploaded_by_idx": { + "name": "atlas_uploaded_by_idx", + "columns": ["uploaded_by"], + "isUnique": false + }, + "atlas_uploaded_by_name_idx": { + "name": "atlas_uploaded_by_name_idx", + "columns": ["uploaded_by_name"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "atlasToAsset": { + "name": "atlasToAsset", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "atlas_id": { + "name": "atlas_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "atlas_to_assets_id_idx": { + "name": "atlas_to_assets_id_idx", + "columns": ["id"], + "isUnique": false + }, + "atlas_to_assets_atlas_id_idx": { + "name": "atlas_to_assets_atlas_id_idx", + "columns": ["atlas_id"], + "isUnique": false + }, + "atlas_to_assets_asset_id_idx": { + "name": "atlas_to_assets_asset_id_idx", + "columns": ["asset_id"], + "isUnique": false + } + }, + "foreignKeys": { + "atlasToAsset_atlas_id_atlas_id_fk": { + "name": "atlasToAsset_atlas_id_atlas_id_fk", + "tableFrom": "atlasToAsset", + "tableTo": "atlas", + "columnsFrom": ["atlas_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "atlasToAsset_asset_id_asset_id_fk": { + "name": "atlasToAsset_asset_id_asset_id_fk", + "tableFrom": "atlasToAsset", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} }, "game": { - "name": "game", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_category": { - "name": "asset_category", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by": { - "name": "uploaded_by", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "url": { - "name": "url", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "status": { - "name": "status", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "'pending'" - }, - "uploaded_date": { - "name": "uploaded_date", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_is_optimized": { - "name": "asset_is_optimized", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "view_count": { - "name": "view_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "download_count": { - "name": "download_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "file_size": { - "name": "file_size", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "width": { - "name": "width", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "height": { - "name": "height", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "assets_id_idx": { - "name": "assets_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "assets_name_idx": { - "name": "assets_name_idx", - "columns": [ - "name" - ], - "isUnique": false - }, - "assets_game_name_idx": { - "name": "assets_game_name_idx", - "columns": [ - "game" - ], - "isUnique": false - }, - "assets_asset_category_name_idx": { - "name": "assets_asset_category_name_idx", - "columns": [ - "asset_category" - ], - "isUnique": false - }, - "assets_uploaded_by_id_idx": { - "name": "assets_uploaded_by_id_idx", - "columns": [ - "uploaded_by" - ], - "isUnique": false - } - }, - "foreignKeys": { - "asset_game_game_id_fk": { - "name": "asset_game_game_id_fk", - "tableFrom": "asset", - "tableTo": "game", - "columnsFrom": [ - "game" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "asset_asset_category_assetCategory_id_fk": { - "name": "asset_asset_category_assetCategory_id_fk", - "tableFrom": "asset", - "tableTo": "assetCategory", - "columnsFrom": [ - "asset_category" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "asset_uploaded_by_authUser_id_fk": { - "name": "asset_uploaded_by_authUser_id_fk", - "tableFrom": "asset", - "tableTo": "authUser", - "columnsFrom": [ - "uploaded_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetCategory": { - "name": "assetCategory", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetCategory_id_unique": { - "name": "assetCategory_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "assetCategory_name_unique": { - "name": "assetCategory_name_unique", - "columns": [ - "name" - ], - "isUnique": true - }, - "asset_category_id_idx": { - "name": "asset_category_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "asset_category_name_idx": { - "name": "asset_category_name_idx", - "columns": [ - "name" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "gameAssetCategory": { - "name": "gameAssetCategory", - "columns": { - "game_id": { - "name": "game_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_category_id": { - "name": "asset_category_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "game_asset_category_game_id_idx": { - "name": "game_asset_category_game_id_idx", - "columns": [ - "game_id" - ], - "isUnique": false - }, - "game_asset_category_asset_category_id_idx": { - "name": "game_asset_category_asset_category_id_idx", - "columns": [ - "asset_category_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "gameAssetCategory_game_id_game_id_fk": { - "name": "gameAssetCategory_game_id_game_id_fk", - "tableFrom": "gameAssetCategory", - "tableTo": "game", - "columnsFrom": [ - "game_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "gameAssetCategory_asset_category_id_assetCategory_id_fk": { - "name": "gameAssetCategory_asset_category_id_assetCategory_id_fk", - "tableFrom": "gameAssetCategory", - "tableTo": "assetCategory", - "columnsFrom": [ - "asset_category_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetTag": { - "name": "assetTag", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetTag_id_unique": { - "name": "assetTag_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "assetTag_name_unique": { - "name": "assetTag_name_unique", - "columns": [ - "name" - ], - "isUnique": true - }, - "asset_tag_id_idx": { - "name": "asset_tag_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "asset_tag_name_idx": { - "name": "asset_tag_name_idx", - "columns": [ - "name" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetTagAsset": { - "name": "assetTagAsset", - "columns": { - "asset_tag_id": { - "name": "asset_tag_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "asset_tags_assets_asset_tag_id_idx": { - "name": "asset_tags_assets_asset_tag_id_idx", - "columns": [ - "asset_tag_id" - ], - "isUnique": false - }, - "asset_tags_assets_asset_id_idx": { - "name": "asset_tags_assets_asset_id_idx", - "columns": [ - "asset_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "assetTagAsset_asset_tag_id_assetTag_id_fk": { - "name": "assetTagAsset_asset_tag_id_assetTag_id_fk", - "tableFrom": "assetTagAsset", - "tableTo": "assetTag", - "columnsFrom": [ - "asset_tag_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "assetTagAsset_asset_id_asset_id_fk": { - "name": "assetTagAsset_asset_id_asset_id_fk", - "tableFrom": "assetTagAsset", - "tableTo": "asset", - "columnsFrom": [ - "asset_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "atlas": { - "name": "atlas", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "url": { - "name": "url", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by": { - "name": "uploaded_by", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by_name": { - "name": "uploaded_by_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_date": { - "name": "uploaded_date", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "file_size": { - "name": "file_size", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "atlas_id_unique": { - "name": "atlas_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "atlas_id_idx": { - "name": "atlas_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "atlas_uploaded_by_idx": { - "name": "atlas_uploaded_by_idx", - "columns": [ - "uploaded_by" - ], - "isUnique": false - }, - "atlas_uploaded_by_name_idx": { - "name": "atlas_uploaded_by_name_idx", - "columns": [ - "uploaded_by_name" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "atlasToAsset": { - "name": "atlasToAsset", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "atlas_id": { - "name": "atlas_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "atlas_to_assets_id_idx": { - "name": "atlas_to_assets_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "atlas_to_assets_atlas_id_idx": { - "name": "atlas_to_assets_atlas_id_idx", - "columns": [ - "atlas_id" - ], - "isUnique": false - }, - "atlas_to_assets_asset_id_idx": { - "name": "atlas_to_assets_asset_id_idx", - "columns": [ - "asset_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "atlasToAsset_atlas_id_atlas_id_fk": { - "name": "atlasToAsset_atlas_id_atlas_id_fk", - "tableFrom": "atlasToAsset", - "tableTo": "atlas", - "columnsFrom": [ - "atlas_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "atlasToAsset_asset_id_asset_id_fk": { - "name": "atlasToAsset_asset_id_asset_id_fk", - "tableFrom": "atlasToAsset", - "tableTo": "asset", - "columnsFrom": [ - "asset_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "game": { - "name": "game", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - }, - "possible_suggestive_content": { - "name": "possible_suggestive_content", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "game_id_unique": { - "name": "game_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "game_name_unique": { - "name": "game_name_unique", - "columns": [ - "name" - ], - "isUnique": true - }, - "game_id_idx": { - "name": "game_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "game_name_idx": { - "name": "game_name_idx", - "columns": [ - "name" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "savedOcGenerators": { - "name": "savedOcGenerators", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "game": { - "name": "game", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "date_created": { - "name": "date_created", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "content": { - "name": "content", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "saved_color_palette": { - "name": "saved_color_palette", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "sakura_url": { - "name": "sakura_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "savedOcGenerators_id_unique": { - "name": "savedOcGenerators_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "saved_oc_generators_id_idx": { - "name": "saved_oc_generators_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "saved_oc_generators_user_id_idx": { - "name": "saved_oc_generators_user_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "savedOcGenerators_user_id_authUser_id_fk": { - "name": "savedOcGenerators_user_id_authUser_id_fk", - "tableFrom": "savedOcGenerators", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" + "name": "game", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": 0 + }, + "possible_suggestive_content": { + "name": "possible_suggestive_content", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "game_id_unique": { + "name": "game_id_unique", + "columns": ["id"], + "isUnique": true + }, + "game_name_unique": { + "name": "game_name_unique", + "columns": ["name"], + "isUnique": true + }, + "game_id_idx": { + "name": "game_id_idx", + "columns": ["id"], + "isUnique": false + }, + "game_name_idx": { + "name": "game_name_idx", + "columns": ["name"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "savedOcGenerators": { + "name": "savedOcGenerators", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "game": { + "name": "game", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "date_created": { + "name": "date_created", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "saved_color_palette": { + "name": "saved_color_palette", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sakura_url": { + "name": "sakura_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "savedOcGenerators_id_unique": { + "name": "savedOcGenerators_id_unique", + "columns": ["id"], + "isUnique": true + }, + "saved_oc_generators_id_idx": { + "name": "saved_oc_generators_id_idx", + "columns": ["id"], + "isUnique": false + }, + "saved_oc_generators_user_id_idx": { + "name": "saved_oc_generators_user_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "savedOcGenerators_user_id_authUser_id_fk": { + "name": "savedOcGenerators_user_id_authUser_id_fk", + "tableFrom": "savedOcGenerators", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "authUser": { + "name": "authUser", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "avatar_url": { + "name": "avatar_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "banner_url": { + "name": "banner_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "display_name": { + "name": "display_name", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "username_colour": { + "name": "username_colour", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "email_verified": { + "name": "email_verified", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "pronouns": { + "name": "pronouns", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "verified": { + "name": "verified", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "bio": { + "name": "bio", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'No bio set'" + }, + "date_joined": { + "name": "date_joined", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "role_flags": { + "name": "role_flags", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "is_contributor": { + "name": "is_contributor", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "self_assignable_role_flags": { + "name": "self_assignable_role_flags", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "authUser_id_unique": { + "name": "authUser_id_unique", + "columns": ["id"], + "isUnique": true + }, + "authUser_username_unique": { + "name": "authUser_username_unique", + "columns": ["username"], + "isUnique": true + }, + "user_id_idx": { + "name": "user_id_idx", + "columns": ["id"], + "isUnique": false + }, + "user_username_idx": { + "name": "user_username_idx", + "columns": ["username"], + "isUnique": false + }, + "user_email_idx": { + "name": "user_email_idx", + "columns": ["email"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "authKey": { + "name": "authKey", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "hashed_password": { + "name": "hashed_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "authKey_id_unique": { + "name": "authKey_id_unique", + "columns": ["id"], + "isUnique": true + }, + "key_user_id_idx": { + "name": "key_user_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "authKey_user_id_authUser_id_fk": { + "name": "authKey_user_id_authUser_id_fk", + "tableFrom": "authKey", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "emailVerificationToken": { + "name": "emailVerificationToken", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "emailVerificationToken_id_unique": { + "name": "emailVerificationToken_id_unique", + "columns": ["id"], + "isUnique": true + }, + "email_verification_token_user_id_idx": { + "name": "email_verification_token_user_id_idx", + "columns": ["user_id"], + "isUnique": false + }, + "email_verification_token_token_idx": { + "name": "email_verification_token_token_idx", + "columns": ["token"], + "isUnique": false + } + }, + "foreignKeys": { + "emailVerificationToken_user_id_authUser_id_fk": { + "name": "emailVerificationToken_user_id_authUser_id_fk", + "tableFrom": "emailVerificationToken", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "passwordResetToken": { + "name": "passwordResetToken", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "passwordResetToken_id_unique": { + "name": "passwordResetToken_id_unique", + "columns": ["id"], + "isUnique": true + }, + "password_reset_token_user_id_idx": { + "name": "password_reset_token_user_id_idx", + "columns": ["user_id"], + "isUnique": false + }, + "password_reset_token_token_idx": { + "name": "password_reset_token_token_idx", + "columns": ["token"], + "isUnique": false + } + }, + "foreignKeys": { + "passwordResetToken_user_id_authUser_id_fk": { + "name": "passwordResetToken_user_id_authUser_id_fk", + "tableFrom": "passwordResetToken", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userCollection": { + "name": "userCollection", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "date_created": { + "name": "date_created", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "userCollection_id_unique": { + "name": "userCollection_id_unique", + "columns": ["id"], + "isUnique": true + }, + "collection_id_idx": { + "name": "collection_id_idx", + "columns": ["id"], + "isUnique": false + }, + "user_collection_id_idx": { + "name": "user_collection_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "userCollection_user_id_authUser_id_fk": { + "name": "userCollection_user_id_authUser_id_fk", + "tableFrom": "userCollection", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetCollectionAsset": { + "name": "assetCollectionAsset", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "collection_id": { + "name": "collection_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetCollectionAsset_id_unique": { + "name": "assetCollectionAsset_id_unique", + "columns": ["id"], + "isUnique": true + }, + "collection_assets_id_idx": { + "name": "collection_assets_id_idx", + "columns": ["id"], + "isUnique": false + }, + "collection_assets_collection_id_idx": { + "name": "collection_assets_collection_id_idx", + "columns": ["collection_id"], + "isUnique": false + }, + "collection_assets_asset_id_idx": { + "name": "collection_assets_asset_id_idx", + "columns": ["asset_id"], + "isUnique": false + } + }, + "foreignKeys": { + "assetCollectionAsset_collection_id_userCollection_id_fk": { + "name": "assetCollectionAsset_collection_id_userCollection_id_fk", + "tableFrom": "assetCollectionAsset", + "tableTo": "userCollection", + "columnsFrom": ["collection_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "assetCollectionAsset_asset_id_asset_id_fk": { + "name": "assetCollectionAsset_asset_id_asset_id_fk", + "tableFrom": "assetCollectionAsset", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "socialsConnection": { + "name": "socialsConnection", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "discord_id": { + "name": "discord_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "socialsConnection_id_unique": { + "name": "socialsConnection_id_unique", + "columns": ["id"], + "isUnique": true + }, + "socials_connection_user_id_idx": { + "name": "socials_connection_user_id_idx", + "columns": ["user_id"], + "isUnique": false + }, + "socials_connection_discord_id_idx": { + "name": "socials_connection_discord_id_idx", + "columns": ["discord_id"], + "isUnique": false + } + }, + "foreignKeys": { + "socialsConnection_user_id_authUser_id_fk": { + "name": "socialsConnection_user_id_authUser_id_fk", + "tableFrom": "socialsConnection", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userFavorite": { + "name": "userFavorite", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "userFavorite_id_unique": { + "name": "userFavorite_id_unique", + "columns": ["id"], + "isUnique": true + }, + "favorited_assets_id_idx": { + "name": "favorited_assets_id_idx", + "columns": ["id"], + "isUnique": false + }, + "favorited_assets_user_id_idx": { + "name": "favorited_assets_user_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "userFavorite_user_id_authUser_id_fk": { + "name": "userFavorite_user_id_authUser_id_fk", + "tableFrom": "userFavorite", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userFavoriteAsset": { + "name": "userFavoriteAsset", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "favorited_assets_id": { + "name": "favorited_assets_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "userFavoriteAsset_id_unique": { + "name": "userFavoriteAsset_id_unique", + "columns": ["id"], + "isUnique": true + }, + "favorited_assets_assets_id_idx": { + "name": "favorited_assets_assets_id_idx", + "columns": ["id"], + "isUnique": false + }, + "favorited_assets_assets_user_id_idx": { + "name": "favorited_assets_assets_user_id_idx", + "columns": ["favorited_assets_id"], + "isUnique": false + }, + "favorited_assets_assets_asset_id_idx": { + "name": "favorited_assets_assets_asset_id_idx", + "columns": ["asset_id"], + "isUnique": false + } + }, + "foreignKeys": { + "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk": { + "name": "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk", + "tableFrom": "userFavoriteAsset", + "tableTo": "userFavorite", + "columnsFrom": ["favorited_assets_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "userFavoriteAsset_asset_id_asset_id_fk": { + "name": "userFavoriteAsset_asset_id_asset_id_fk", + "tableFrom": "userFavoriteAsset", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userNetworking": { + "name": "userNetworking", + "columns": { + "followerId": { + "name": "followerId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "followingId": { + "name": "followingId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updatedAt": { + "name": "updatedAt", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "userNetworking_follower_idx": { + "name": "userNetworking_follower_idx", + "columns": ["followerId"], + "isUnique": false + }, + "userNetworking_following_idx": { + "name": "userNetworking_following_idx", + "columns": ["followingId"], + "isUnique": false + } + }, + "foreignKeys": { + "userNetworking_followerId_authUser_id_fk": { + "name": "userNetworking_followerId_authUser_id_fk", + "tableFrom": "userNetworking", + "tableTo": "authUser", + "columnsFrom": ["followerId"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "userNetworking_followingId_authUser_id_fk": { + "name": "userNetworking_followingId_authUser_id_fk", + "tableFrom": "userNetworking", + "tableTo": "authUser", + "columnsFrom": ["followingId"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} }, - "authUser": { - "name": "authUser", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "avatar_url": { - "name": "avatar_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "banner_url": { - "name": "banner_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "display_name": { - "name": "display_name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "username": { - "name": "username", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "username_colour": { - "name": "username_colour", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "email": { - "name": "email", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "email_verified": { - "name": "email_verified", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "pronouns": { - "name": "pronouns", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "verified": { - "name": "verified", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "bio": { - "name": "bio", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "'No bio set'" - }, - "date_joined": { - "name": "date_joined", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "role_flags": { - "name": "role_flags", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 1 - }, - "is_contributor": { - "name": "is_contributor", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "self_assignable_role_flags": { - "name": "self_assignable_role_flags", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "authUser_id_unique": { - "name": "authUser_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "authUser_username_unique": { - "name": "authUser_username_unique", - "columns": [ - "username" - ], - "isUnique": true - }, - "user_id_idx": { - "name": "user_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "user_username_idx": { - "name": "user_username_idx", - "columns": [ - "username" - ], - "isUnique": false - }, - "user_email_idx": { - "name": "user_email_idx", - "columns": [ - "email" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "authKey": { - "name": "authKey", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "hashed_password": { - "name": "hashed_password", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "authKey_id_unique": { - "name": "authKey_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "key_user_id_idx": { - "name": "key_user_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "authKey_user_id_authUser_id_fk": { - "name": "authKey_user_id_authUser_id_fk", - "tableFrom": "authKey", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "emailVerificationToken": { - "name": "emailVerificationToken", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "emailVerificationToken_id_unique": { - "name": "emailVerificationToken_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "email_verification_token_user_id_idx": { - "name": "email_verification_token_user_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - }, - "email_verification_token_token_idx": { - "name": "email_verification_token_token_idx", - "columns": [ - "token" - ], - "isUnique": false - } - }, - "foreignKeys": { - "emailVerificationToken_user_id_authUser_id_fk": { - "name": "emailVerificationToken_user_id_authUser_id_fk", - "tableFrom": "emailVerificationToken", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "passwordResetToken": { - "name": "passwordResetToken", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "passwordResetToken_id_unique": { - "name": "passwordResetToken_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "password_reset_token_user_id_idx": { - "name": "password_reset_token_user_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - }, - "password_reset_token_token_idx": { - "name": "password_reset_token_token_idx", - "columns": [ - "token" - ], - "isUnique": false - } - }, - "foreignKeys": { - "passwordResetToken_user_id_authUser_id_fk": { - "name": "passwordResetToken_user_id_authUser_id_fk", - "tableFrom": "passwordResetToken", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userCollection": { - "name": "userCollection", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "date_created": { - "name": "date_created", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "userCollection_id_unique": { - "name": "userCollection_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "collection_id_idx": { - "name": "collection_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "user_collection_id_idx": { - "name": "user_collection_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "userCollection_user_id_authUser_id_fk": { - "name": "userCollection_user_id_authUser_id_fk", - "tableFrom": "userCollection", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetCollectionAsset": { - "name": "assetCollectionAsset", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "collection_id": { - "name": "collection_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetCollectionAsset_id_unique": { - "name": "assetCollectionAsset_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "collection_assets_id_idx": { - "name": "collection_assets_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "collection_assets_collection_id_idx": { - "name": "collection_assets_collection_id_idx", - "columns": [ - "collection_id" - ], - "isUnique": false - }, - "collection_assets_asset_id_idx": { - "name": "collection_assets_asset_id_idx", - "columns": [ - "asset_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "assetCollectionAsset_collection_id_userCollection_id_fk": { - "name": "assetCollectionAsset_collection_id_userCollection_id_fk", - "tableFrom": "assetCollectionAsset", - "tableTo": "userCollection", - "columnsFrom": [ - "collection_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "assetCollectionAsset_asset_id_asset_id_fk": { - "name": "assetCollectionAsset_asset_id_asset_id_fk", - "tableFrom": "assetCollectionAsset", - "tableTo": "asset", - "columnsFrom": [ - "asset_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "socialsConnection": { - "name": "socialsConnection", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "discord_id": { - "name": "discord_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "socialsConnection_id_unique": { - "name": "socialsConnection_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "socials_connection_user_id_idx": { - "name": "socials_connection_user_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - }, - "socials_connection_discord_id_idx": { - "name": "socials_connection_discord_id_idx", - "columns": [ - "discord_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "socialsConnection_user_id_authUser_id_fk": { - "name": "socialsConnection_user_id_authUser_id_fk", - "tableFrom": "socialsConnection", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userFavorite": { - "name": "userFavorite", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "userFavorite_id_unique": { - "name": "userFavorite_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "favorited_assets_id_idx": { - "name": "favorited_assets_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "favorited_assets_user_id_idx": { - "name": "favorited_assets_user_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "userFavorite_user_id_authUser_id_fk": { - "name": "userFavorite_user_id_authUser_id_fk", - "tableFrom": "userFavorite", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userFavoriteAsset": { - "name": "userFavoriteAsset", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "favorited_assets_id": { - "name": "favorited_assets_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "userFavoriteAsset_id_unique": { - "name": "userFavoriteAsset_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "favorited_assets_assets_id_idx": { - "name": "favorited_assets_assets_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "favorited_assets_assets_user_id_idx": { - "name": "favorited_assets_assets_user_id_idx", - "columns": [ - "favorited_assets_id" - ], - "isUnique": false - }, - "favorited_assets_assets_asset_id_idx": { - "name": "favorited_assets_assets_asset_id_idx", - "columns": [ - "asset_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk": { - "name": "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk", - "tableFrom": "userFavoriteAsset", - "tableTo": "userFavorite", - "columnsFrom": [ - "favorited_assets_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "userFavoriteAsset_asset_id_asset_id_fk": { - "name": "userFavoriteAsset_asset_id_asset_id_fk", - "tableFrom": "userFavoriteAsset", - "tableTo": "asset", - "columnsFrom": [ - "asset_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userNetworking": { - "name": "userNetworking", - "columns": { - "followerId": { - "name": "followerId", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "followingId": { - "name": "followingId", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "updatedAt": { - "name": "updatedAt", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "userNetworking_follower_idx": { - "name": "userNetworking_follower_idx", - "columns": [ - "followerId" - ], - "isUnique": false - }, - "userNetworking_following_idx": { - "name": "userNetworking_following_idx", - "columns": [ - "followingId" - ], - "isUnique": false - } - }, - "foreignKeys": { - "userNetworking_followerId_authUser_id_fk": { - "name": "userNetworking_followerId_authUser_id_fk", - "tableFrom": "userNetworking", - "tableTo": "authUser", - "columnsFrom": [ - "followerId" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "userNetworking_followingId_authUser_id_fk": { - "name": "userNetworking_followingId_authUser_id_fk", - "tableFrom": "userNetworking", - "tableTo": "authUser", - "columnsFrom": [ - "followingId" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} } - }, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - } -} \ No newline at end of file +} diff --git a/src/v2/db/migrations/meta/_journal.json b/src/v2/db/migrations/meta/_journal.json index fcb5e08..77da97a 100644 --- a/src/v2/db/migrations/meta/_journal.json +++ b/src/v2/db/migrations/meta/_journal.json @@ -1,13 +1,13 @@ { - "version": "5", - "dialect": "sqlite", - "entries": [ - { - "idx": 0, - "version": "5", - "when": 1699206644646, - "tag": "0000_sparkling_carmella_unuscione", - "breakpoints": true - } - ] -} \ No newline at end of file + "version": "5", + "dialect": "sqlite", + "entries": [ + { + "idx": 0, + "version": "5", + "when": 1699206644646, + "tag": "0000_sparkling_carmella_unuscione", + "breakpoints": true + } + ] +} diff --git a/src/v2/db/schema/asset/asset.ts b/src/v2/db/schema/asset/asset.ts index f1e75bd..80dbd44 100644 --- a/src/v2/db/schema/asset/asset.ts +++ b/src/v2/db/schema/asset/asset.ts @@ -35,16 +35,20 @@ export const asset = sqliteTable( .references(() => game.id, { onUpdate: "cascade", onDelete: "cascade", - }).notNull(), + }) + .notNull(), assetCategoryId: text("asset_category") .references(() => assetCategory.id, { onUpdate: "cascade", onDelete: "cascade", - }).notNull(), - uploadedById: text("uploaded_by").references(() => authUser.id, { - onUpdate: "cascade", - onDelete: "cascade", - }).notNull(), + }) + .notNull(), + uploadedById: text("uploaded_by") + .references(() => authUser.id, { + onUpdate: "cascade", + onDelete: "cascade", + }) + .notNull(), url: text("url").notNull(), status: text("status") .$type() diff --git a/src/v2/db/turso.ts b/src/v2/db/turso.ts index 5ae9b46..f34bbee 100644 --- a/src/v2/db/turso.ts +++ b/src/v2/db/turso.ts @@ -52,4 +52,4 @@ export function getConnection(env: Bindings) { } export type DrizzleClient = ReturnType -export type TursoClient = ReturnType \ No newline at end of file +export type TursoClient = ReturnType diff --git a/src/v2/routes/search/asset/search-assets.ts b/src/v2/routes/search/asset/search-assets.ts index b4b7393..e725216 100644 --- a/src/v2/routes/search/asset/search-assets.ts +++ b/src/v2/routes/search/asset/search-assets.ts @@ -53,7 +53,12 @@ export async function searchForAssets(c: APIContext): Promise { .where( and( searchQuery && like(asset.name, `%${searchQuery}%`), - gameList && or(...gameList.map((game) => eq(asset.assetCategoryId, game))), + gameList && + or( + ...gameList.map((game) => + eq(asset.assetCategoryId, game) + ) + ), assetCategoryList && or( ...assetCategoryList.map((category) => From 39986bbf90dd174298bdd2c979d2f80772a7b2a1 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Sun, 5 Nov 2023 18:19:02 +0000 Subject: [PATCH 137/318] actually commit the workflow changes --- .github/workflows/test.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d248cbb..61ce7c8 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -39,3 +39,6 @@ jobs: - name: Migrate Database run: pnpm drizzle:migrate + + - name: Seed Database + run: pnpm drizzle:seed From f518ec41d8ef03ab3df1b8332395f7f01f9e6a7b Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Sun, 5 Nov 2023 18:31:25 +0000 Subject: [PATCH 138/318] seed collections and asset favourites --- src/scripts/seed/seed.ts | 82 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/src/scripts/seed/seed.ts b/src/scripts/seed/seed.ts index 5317630..6a7eb21 100644 --- a/src/scripts/seed/seed.ts +++ b/src/scripts/seed/seed.ts @@ -10,6 +10,10 @@ import { assetTagAsset, authUser, userNetworking, + userCollection, + userCollectionAsset, + userFavoriteAsset, + userFavorite, } from "@/v2/db/schema" const { ENVIRONMENT } = process.env @@ -277,6 +281,84 @@ async function main() { .returning() console.log(`[assetTagAsset] inserted ${newAssetTagAsset.length} rows\n`) + console.log("[userCollection] Seeding user collections...") + const newUserCollections = await db + .insert(userCollection) + .values({ + id: crypto.randomUUID(), + name: "collection name", + description: "collection description", + userId: "userid1", + dateCreated: new Date().toISOString(), + isPublic: 0, // default to private + }) + .returning() + console.log(`[userCollection] inserted ${newUserCollections.length} rows\n`) + + console.log("[userCollectionAsset] Linking user collections to assets...") + const newUserCollectionAssets = await db + .insert(userCollectionAsset) + .values([ + { + id: crypto.randomUUID(), + collectionId: newUserCollections[0].id, + assetId: 1, + }, + { + id: crypto.randomUUID(), + collectionId: newUserCollections[0].id, + assetId: 2, + }, + ]) + .returning() + console.log( + `[userCollectionAsset] inserted ${newUserCollectionAssets.length} rows\n` + ) + + // only one user favorite per user + console.log("[userFavorite] Seeding user favorites...") + const newUserFavorites = await db + .insert(userFavorite) + .values([ + { + id: crypto.randomUUID(), + userId: "userid1", + isPublic: 0, // default to private + }, + { + id: crypto.randomUUID(), + userId: "userid2", + isPublic: 1, + }, + ]) + .returning() + console.log(`[userFavorite] inserted ${newUserFavorites.length} rows\n`) + + console.log("[userFavoriteAsset] Linking user favorites to assets...") + const newUserFavoriteAssets = await db + .insert(userFavoriteAsset) + .values([ + { + id: crypto.randomUUID(), + userFavoriteId: newUserFavorites[0].id, + assetId: 1, + }, + { + id: crypto.randomUUID(), + userFavoriteId: newUserFavorites[0].id, + assetId: 2, + }, + { + id: crypto.randomUUID(), + userFavoriteId: newUserFavorites[1].id, + assetId: 3, + }, + ]) + .returning() + console.log( + `[userFavoriteAsset] inserted ${newUserFavoriteAssets.length} rows\n` + ) + console.log("Seeded database successfully") process.exit(0) } From 501d0628def47f12e2dba531c212cee6e8d18577 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Sun, 5 Nov 2023 18:34:04 +0000 Subject: [PATCH 139/318] replace crypto with uuidv4 for seed --- src/scripts/seed/seed.ts | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/scripts/seed/seed.ts b/src/scripts/seed/seed.ts index 6a7eb21..7bf40ab 100644 --- a/src/scripts/seed/seed.ts +++ b/src/scripts/seed/seed.ts @@ -15,6 +15,7 @@ import { userFavoriteAsset, userFavorite, } from "@/v2/db/schema" +import { uuid } from 'uuidv4' const { ENVIRONMENT } = process.env @@ -285,7 +286,7 @@ async function main() { const newUserCollections = await db .insert(userCollection) .values({ - id: crypto.randomUUID(), + id: "collectionid1", name: "collection name", description: "collection description", userId: "userid1", @@ -300,12 +301,12 @@ async function main() { .insert(userCollectionAsset) .values([ { - id: crypto.randomUUID(), + id: uuid(), collectionId: newUserCollections[0].id, assetId: 1, }, { - id: crypto.randomUUID(), + id: uuid(), collectionId: newUserCollections[0].id, assetId: 2, }, @@ -321,12 +322,12 @@ async function main() { .insert(userFavorite) .values([ { - id: crypto.randomUUID(), + id: uuid(), userId: "userid1", isPublic: 0, // default to private }, { - id: crypto.randomUUID(), + id: uuid(), userId: "userid2", isPublic: 1, }, @@ -339,17 +340,17 @@ async function main() { .insert(userFavoriteAsset) .values([ { - id: crypto.randomUUID(), + id: uuid(), userFavoriteId: newUserFavorites[0].id, assetId: 1, }, { - id: crypto.randomUUID(), + id: uuid(), userFavoriteId: newUserFavorites[0].id, assetId: 2, }, { - id: crypto.randomUUID(), + id: uuid(), userFavoriteId: newUserFavorites[1].id, assetId: 3, }, From 6275808a7e94a9a092f480f88790049c38399087 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Sun, 5 Nov 2023 18:34:50 +0000 Subject: [PATCH 140/318] consistencies... [skip ci] --- src/scripts/seed/seed.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scripts/seed/seed.ts b/src/scripts/seed/seed.ts index 7bf40ab..4f1a67a 100644 --- a/src/scripts/seed/seed.ts +++ b/src/scripts/seed/seed.ts @@ -286,7 +286,7 @@ async function main() { const newUserCollections = await db .insert(userCollection) .values({ - id: "collectionid1", + id: uuid(), name: "collection name", description: "collection description", userId: "userid1", From 0eaeabf6b303ae32940334f66c830edea81459cc Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Sun, 5 Nov 2023 22:14:53 +0000 Subject: [PATCH 141/318] initialize managers for asset, game, category, user & tag --- package.json | 3 +- pnpm-lock.yaml | 43 ++-- src/scripts/seed/seed.ts | 21 +- src/v2/db/schema/user/user-networking.ts | 1 - src/v2/db/turso.ts | 6 +- .../asset-category/asset-category-manager.ts | 120 +++++++++ .../game-asset-category-manager.ts | 47 ++++ src/v2/lib/managers/asset/asset-manager.ts | 235 ++++++++++++++++++ src/v2/lib/managers/game/game-manager.ts | 43 ++++ src/v2/lib/managers/tag/tag-manager.ts | 76 ++++++ .../lib/managers/user/user-follow-manager.ts | 66 +++++ .../lib/managers/user/user-profile-manager.ts | 127 ++++++++++ .../lib/managers/user/user-search-manager.ts | 56 +++++ .../user-relations/follow-user.ts | 1 - 14 files changed, 807 insertions(+), 38 deletions(-) create mode 100644 src/v2/lib/managers/asset-category/asset-category-manager.ts create mode 100644 src/v2/lib/managers/asset-category/game-asset-category-manager.ts create mode 100644 src/v2/lib/managers/asset/asset-manager.ts create mode 100644 src/v2/lib/managers/game/game-manager.ts create mode 100644 src/v2/lib/managers/tag/tag-manager.ts create mode 100644 src/v2/lib/managers/user/user-follow-manager.ts create mode 100644 src/v2/lib/managers/user/user-profile-manager.ts create mode 100644 src/v2/lib/managers/user/user-search-manager.ts diff --git a/package.json b/package.json index aec7f86..6b00c09 100644 --- a/package.json +++ b/package.json @@ -39,13 +39,14 @@ "@typescript-eslint/eslint-plugin": "^6.8.0", "better-sqlite3": "^9.0.0", "drizzle-orm": "^0.28.6", + "drizzle-zod": "^0.5.1", "hono": "^3.8.0", "lucia": "^2.7.1", "miniflare": "^3.20231025.1", "mysql2": "^3.6.2", "prettier": "^3.0.3", "unstorage": "^1.9.0", - "uuidv4": "^6.2.13", + "uuid": "^9.0.1", "zod": "^3.22.4" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e18f23c..6199bae 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -29,6 +29,9 @@ dependencies: drizzle-orm: specifier: ^0.28.6 version: 0.28.6(@cloudflare/workers-types@4.20231016.0)(@libsql/client@0.3.5)(better-sqlite3@9.0.0)(mysql2@3.6.2) + drizzle-zod: + specifier: ^0.5.1 + version: 0.5.1(drizzle-orm@0.28.6)(zod@3.22.4) hono: specifier: ^3.8.0 version: 3.8.0 @@ -47,9 +50,9 @@ dependencies: unstorage: specifier: ^1.9.0 version: 1.9.0 - uuidv4: - specifier: ^6.2.13 - version: 6.2.13 + uuid: + specifier: ^9.0.1 + version: 9.0.1 zod: specifier: ^3.22.4 version: 3.22.4 @@ -1353,13 +1356,6 @@ packages: } dev: false - /@types/uuid@8.3.4: - resolution: - { - integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==, - } - dev: false - /@types/ws@8.5.7: resolution: { @@ -2155,6 +2151,19 @@ packages: mysql2: 3.6.2 dev: false + /drizzle-zod@0.5.1(drizzle-orm@0.28.6)(zod@3.22.4): + resolution: + { + integrity: sha512-C/8bvzUH/zSnVfwdSibOgFjLhtDtbKYmkbPbUCq46QZyZCH6kODIMSOgZ8R7rVjoI+tCj3k06MRJMDqsIeoS4A==, + } + peerDependencies: + drizzle-orm: ">=0.23.13" + zod: "*" + dependencies: + drizzle-orm: 0.28.6(@cloudflare/workers-types@4.20231016.0)(@libsql/client@0.3.5)(better-sqlite3@9.0.0)(mysql2@3.6.2) + zod: 3.22.4 + dev: false + /end-of-stream@1.4.4: resolution: { @@ -4414,24 +4423,14 @@ packages: } dev: false - /uuid@8.3.2: + /uuid@9.0.1: resolution: { - integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==, + integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==, } hasBin: true dev: false - /uuidv4@6.2.13: - resolution: - { - integrity: sha512-AXyzMjazYB3ovL3q051VLH06Ixj//Knx7QnUSi1T//Ie3io6CpsPu9nVMOx5MoLWh6xV0B9J0hIaxungxXUbPQ==, - } - dependencies: - "@types/uuid": 8.3.4 - uuid: 8.3.2 - dev: false - /vscode-json-languageservice@4.2.1: resolution: { diff --git a/src/scripts/seed/seed.ts b/src/scripts/seed/seed.ts index 4f1a67a..bd3058b 100644 --- a/src/scripts/seed/seed.ts +++ b/src/scripts/seed/seed.ts @@ -15,7 +15,7 @@ import { userFavoriteAsset, userFavorite, } from "@/v2/db/schema" -import { uuid } from 'uuidv4' +import { v4 } from "uuid" const { ENVIRONMENT } = process.env @@ -91,19 +91,16 @@ async function main() { followerId: newUsers[0].id, followingId: newUsers[1].id, createdAt: new Date().toISOString(), - updatedAt: new Date().toISOString(), }, { followerId: newUsers[1].id, followingId: newUsers[0].id, createdAt: new Date().toISOString(), - updatedAt: new Date().toISOString(), }, { followerId: newUsers[0].id, followingId: newUsers[2].id, createdAt: new Date().toISOString(), - updatedAt: new Date().toISOString(), }, ]) .returning() @@ -286,7 +283,7 @@ async function main() { const newUserCollections = await db .insert(userCollection) .values({ - id: uuid(), + id: v4(), name: "collection name", description: "collection description", userId: "userid1", @@ -301,12 +298,12 @@ async function main() { .insert(userCollectionAsset) .values([ { - id: uuid(), + id: v4(), collectionId: newUserCollections[0].id, assetId: 1, }, { - id: uuid(), + id: v4(), collectionId: newUserCollections[0].id, assetId: 2, }, @@ -322,12 +319,12 @@ async function main() { .insert(userFavorite) .values([ { - id: uuid(), + id: v4(), userId: "userid1", isPublic: 0, // default to private }, { - id: uuid(), + id: v4(), userId: "userid2", isPublic: 1, }, @@ -340,17 +337,17 @@ async function main() { .insert(userFavoriteAsset) .values([ { - id: uuid(), + id: v4(), userFavoriteId: newUserFavorites[0].id, assetId: 1, }, { - id: uuid(), + id: v4(), userFavoriteId: newUserFavorites[0].id, assetId: 2, }, { - id: uuid(), + id: v4(), userFavoriteId: newUserFavorites[1].id, assetId: 3, }, diff --git a/src/v2/db/schema/user/user-networking.ts b/src/v2/db/schema/user/user-networking.ts index f77d72a..6c2578a 100644 --- a/src/v2/db/schema/user/user-networking.ts +++ b/src/v2/db/schema/user/user-networking.ts @@ -23,7 +23,6 @@ export const userNetworking = sqliteTable( .notNull() .references(() => authUser.id), createdAt: text("createdAt").notNull(), - updatedAt: text("updatedAt").notNull(), }, (userNetworking) => { return { diff --git a/src/v2/db/turso.ts b/src/v2/db/turso.ts index f34bbee..6fec113 100644 --- a/src/v2/db/turso.ts +++ b/src/v2/db/turso.ts @@ -51,5 +51,9 @@ export function getConnection(env: Bindings) { } } -export type DrizzleClient = ReturnType +export type DrizzleInstance = ReturnType["drizzle"] +export type TursoInstance = ReturnType["turso"] + export type TursoClient = ReturnType +export type DrizzleClient = ReturnType +export type Connection = ReturnType diff --git a/src/v2/lib/managers/asset-category/asset-category-manager.ts b/src/v2/lib/managers/asset-category/asset-category-manager.ts new file mode 100644 index 0000000..fbd4027 --- /dev/null +++ b/src/v2/lib/managers/asset-category/asset-category-manager.ts @@ -0,0 +1,120 @@ +import { DrizzleInstance } from "@/v2/db/turso" +import { game, gameAssetCategory, assetCategory } from "@/v2/db/schema" +import { eq, or, like } from "drizzle-orm" +import { z } from "zod" + +/** + * Represents the schema for inserting a new asset category. + */ +const insertAssetCategorySchema = z.object({ + name: z.string(), + formattedName: z.string(), +}) + +/** + * Manages operations related to asset categories. + */ +export class AssetCategoryManager { + constructor(private drizzle: DrizzleInstance) {} + + /** + * Retrieves an asset category by its ID. + * @param assetCategoryId - The unique ID of the asset category to retrieve. + * @returns A promise that resolves to the retrieved asset category. + */ + async getAssetCategoryById(assetCategoryId: string) { + const foundAssetCategory = await this.drizzle + .select() + .from(assetCategory) + .leftJoin( + gameAssetCategory, + eq(gameAssetCategory.assetCategoryId, assetCategoryId) + ) + .leftJoin(game, eq(game.id, gameAssetCategory.gameId)) + .where(eq(assetCategory.id, assetCategoryId)) + + return foundAssetCategory[0] + } + + /** + * Retrieves a list of all asset categories. + * @returns A promise that resolves to an array of asset categories. + */ + async listAssetCategories() { + const assetCategories = await this.drizzle.select().from(assetCategory) + + return assetCategories + } + + /** + * Retrieves asset categories with partial name matching. + * @param assetCategoryName - The partial name to search for within asset categories. + * @returns A promise that resolves to an array of matching asset categories. + */ + async getAssetCategoriesByPartialName(assetCategoryName: string) { + const assetCategories = await this.drizzle + .select() + .from(assetCategory) + .where(or(like(assetCategory.name, `%${assetCategoryName}%`))) + + return assetCategories + } + + /** + * Creates a new asset category. + * @param newAssetCategory - The new asset category to create, adhering to the insertAssetCategorySchema. + * @returns A promise that resolves to the created asset category. + */ + async createAssetCategory( + newAssetCategory: z.infer + ) { + const createdAssetCategory = await this.drizzle + .insert(assetCategory) + .values({ + id: newAssetCategory.name, + name: newAssetCategory.name, + formattedName: newAssetCategory.name, + assetCount: 0, + lastUpdated: new Date().toISOString(), + }) + + return createdAssetCategory + } + + /** + * Deletes an asset category by its ID. + * @param assetCategoryId - The ID of the asset category to delete. + * @returns A promise that resolves to the deleted asset category. + */ + async deleteAssetCategory(assetCategoryId: string) { + const deletedAssetCategory = await this.drizzle + .delete(assetCategory) + .where(eq(assetCategory.id, assetCategoryId)) + .returning() + + return deletedAssetCategory[0] + } + + /** + * Updates an asset category by its ID. + * @param assetCategoryId - The ID of the asset category to update. + * @param newAssetCategory - The updated asset category data, adhering to the insertAssetCategorySchema. + * @returns A promise that resolves to the updated asset category. + */ + async updateAssetCategory( + assetCategoryId: string, + newAssetCategory: z.infer + ) { + const updatedAssetCategory = await this.drizzle + .update(assetCategory) + .set({ + name: newAssetCategory.name, + formattedName: newAssetCategory.name, + lastUpdated: new Date().toISOString(), + }) + .where(eq(assetCategory.id, assetCategoryId)) + .returning() + + return updatedAssetCategory[0] + } +} diff --git a/src/v2/lib/managers/asset-category/game-asset-category-manager.ts b/src/v2/lib/managers/asset-category/game-asset-category-manager.ts new file mode 100644 index 0000000..6378b95 --- /dev/null +++ b/src/v2/lib/managers/asset-category/game-asset-category-manager.ts @@ -0,0 +1,47 @@ +import { DrizzleInstance } from "@/v2/db/turso" +import { gameAssetCategory } from "@/v2/db/schema" +import { eq, and } from "drizzle-orm" + +/** + * Manages operations related to game asset categories. + */ +export class GameAssetCategoryManager { + constructor(private drizzle: DrizzleInstance) {} + + /** + * Links an asset category to a game. + * @param assetCategoryId - The ID of the asset category to link. + * @param gameId - The ID of the game to which the asset category will be linked. + * @returns A promise that resolves to the created game asset category. + */ + async linkAssetCategoryToGame(assetCategoryId: string, gameId: string) { + const createdGameAssetCategory = await this.drizzle + .insert(gameAssetCategory) + .values({ + assetCategoryId, + gameId, + }) + + return createdGameAssetCategory + } + + /** + * Unlinks an asset category from a game. + * @param assetCategoryId - The ID of the asset category to unlink. + * @param gameId - The ID of the game from which the asset category will be unlinked. + * @returns A promise that resolves to the deleted game asset category. + */ + async unlinkAssetCategoryFromGame(assetCategoryId: string, gameId: string) { + const deletedGameAssetCategory = await this.drizzle + .delete(gameAssetCategory) + .where( + and( + eq(gameAssetCategory.assetCategoryId, assetCategoryId), + eq(gameAssetCategory.gameId, gameId) + ) + ) + .returning() + + return deletedGameAssetCategory[0] + } +} diff --git a/src/v2/lib/managers/asset/asset-manager.ts b/src/v2/lib/managers/asset/asset-manager.ts new file mode 100644 index 0000000..a328e59 --- /dev/null +++ b/src/v2/lib/managers/asset/asset-manager.ts @@ -0,0 +1,235 @@ +import { DrizzleInstance } from "@/v2/db/turso" +import { + asset, + assetCategory, + assetTag, + assetTagAsset, + game, +} from "@/v2/db/schema" +import { eq, or, like, sql, and } from "drizzle-orm" +import { R2Bucket } from "@cloudflare/workers-types" +import { SplitQueryByCommas } from "../../helpers/split-query-by-commas" +import { z } from "zod" + +// these are all optional +type AssetSearchQuery = { + name?: string + game?: string + category?: string + tag?: string +} + +const MAX_FILE_SIZE = 5000 +const ACCEPTED_IMAGE_TYPES = ["image/png"] + +export const UploadAssetSchema = z.object({ + asset: z + .any() + .refine((files) => files?.length == 1, "Image is required.") + .refine( + (files) => files?.[0]?.size <= MAX_FILE_SIZE, + `Max file size is 5MB.` + ) + .refine( + (files) => ACCEPTED_IMAGE_TYPES.includes(files?.[0]?.type), + ".jpg, .jpeg, .png and .webp files are accepted." + ), + name: z.string({ + required_error: "Name is required", + invalid_type_error: "Name must be a string", + }), + extension: z.string({ + required_error: "Extension is required", + invalid_type_error: "Extension must be a string", + }), + tags: z.string().optional(), + assetCategoryId: z.string({ + required_error: "Category is required", + invalid_type_error: "Category must be a string", + }), + gameId: z.string({ + required_error: "Game is required", + invalid_type_error: "Game must be a string", + }), + size: z.number({ + required_error: "Size is required", + invalid_type_error: "Size must be a number", + }), + width: z.number({ + required_error: "Width is required", + invalid_type_error: "Width must be a number", + }), + height: z.number({ + required_error: "Height is required", + invalid_type_error: "Height must be a number", + }), +}) + +export class AssetManager { + constructor(private drizzle: DrizzleInstance) {} + + /** + * Retrieves an asset by its ID. + * @param assetId - The unique ID of the asset to retrieve. + * @returns A promise that resolves to the retrieved asset, its game, category and tags. + */ + async getAssetById(assetId: number) { + const foundAsset = await this.drizzle + .select() + .from(asset) + .leftJoin(assetTagAsset, eq(assetTagAsset.assetId, assetId)) + .leftJoin(assetTag, eq(assetTag.id, assetTagAsset.assetTagId)) + .leftJoin(game, eq(game.id, asset.gameId)) + .leftJoin( + assetCategory, + eq(assetCategory.id, asset.assetCategoryId) + ) + .where(eq(asset.id, assetId)) + + return foundAsset[0] + } + + /** + * Retrieves a list of all assets. + * @returns A promise that resolves to an array of assets. + */ + async listAssets() { + const assets = await this.drizzle.select().from(asset) + + return assets + } + + /** + * Searches for assets based on optional query filters. + * @param query - An object containing optional search parameters. + * @returns A promise that resolves to an array of matching assets. + */ + async searchAssets(query: AssetSearchQuery) { + const { name, game, category, tag } = query + + const gameList = game ? SplitQueryByCommas(game.toLowerCase()) : null + const categoryList = category + ? SplitQueryByCommas(category.toLowerCase()) + : null + const tagList = tag + ? SplitQueryByCommas(tag.toLowerCase()) + : ["official"] + const searchQuery = name ?? null + + const assetTagResponse = this.drizzle.$with("sq").as( + this.drizzle + .select({ + assetId: assetTagAsset.assetId, + tags: sql`array_agg(${assetTag})`.as( + "tags" + ), + }) + .from(assetTagAsset) + .leftJoin(assetTag, eq(assetTag.id, assetTagAsset.assetTagId)) + .where(or(...tagList.map((tag) => eq(assetTag.name, tag)))) + .groupBy(assetTagAsset.assetId) + ) + + const foundAssets = await this.drizzle + .with(assetTagResponse) + .select() + .from(asset) + .innerJoin(assetTagResponse, eq(assetTagResponse.assetId, asset.id)) + .where( + and( + searchQuery && like(asset.name, `%${searchQuery}%`), + gameList && + or( + ...gameList.map((game) => + eq(asset.assetCategoryId, game) + ) + ), + categoryList && + or( + ...categoryList.map((category) => + eq(asset.assetCategoryId, category) + ) + ) + ) + ) + .groupBy(asset.id) + .limit(500) + + return foundAssets + } + + /** + * Creates a new asset. + * @param userId - The ID of the user creating the asset. + * @param newAsset - The new asset data, adhering to the UploadAssetSchema. + * @param bucket - The Cloudflare R2Bucket for asset storage. + * @param file - The File object representing the asset to be uploaded. + * @returns A promise that resolves to the created asset. + */ + async createAsset( + userId: string, + newAsset: z.infer, + bucket: R2Bucket, + file: File + ) { + const { key } = await bucket.put( + `/assets/${newAsset.gameId}/${newAsset.assetCategoryId}/${newAsset.name}.${newAsset.extension}`, + file + ) + + await this.drizzle.transaction(async (trx) => { + const createdAsset = await trx + .insert(asset) + .values({ + name: newAsset.name, + extension: newAsset.extension, + gameId: newAsset.gameId, + assetCategoryId: newAsset.assetCategoryId, + url: key, + uploadedById: userId, + status: "pending", + uploadedDate: new Date().toISOString(), + fileSize: newAsset.size, + width: newAsset.width, + height: newAsset.height, + }) + .returning({ + assetId: asset.id, + }) + + await trx + .update(game) + .set({ + assetCount: sql`asset_count + 1`, + }) + .where(eq(game.id, newAsset.gameId)) + + await trx + .update(assetCategory) + .set({ + assetCount: sql`asset_count + 1`, + }) + .where(eq(assetCategory.id, newAsset.assetCategoryId)) + + const tags = newAsset.tags ? SplitQueryByCommas(newAsset.tags) : [] + + if (tags.length === 0) return createdAsset + + for (const tag of tags) { + const foundTag = await trx + .select() + .from(assetTag) + .where(eq(assetTag.name, tag)) + + if (foundTag.length === 0) { + await trx.insert(assetTagAsset).values({ + assetId: createdAsset[0].assetId, + assetTagId: tag, + }) + } + } + + return createdAsset + }) + } +} diff --git a/src/v2/lib/managers/game/game-manager.ts b/src/v2/lib/managers/game/game-manager.ts new file mode 100644 index 0000000..4185ee2 --- /dev/null +++ b/src/v2/lib/managers/game/game-manager.ts @@ -0,0 +1,43 @@ +import { DrizzleInstance } from "@/v2/db/turso" +import { game, gameAssetCategory, assetCategory } from "@/v2/db/schema" +import { eq, or, like } from "drizzle-orm" + +/** + * Manages operations related to games. + */ +export class GameManager { + constructor(private drizzle: DrizzleInstance) {} + + /** + * Retrieves a game by its ID. + * @param gameId - The unique ID of the game to retrieve. + * @returns A promise that resolves to the retrieved game and its asset categories. + */ + async getGameById(gameId: string) { + const foundGame = await this.drizzle + .select() + .from(game) + .leftJoin(gameAssetCategory, eq(gameAssetCategory.gameId, gameId)) + .leftJoin( + assetCategory, + eq(assetCategory.id, gameAssetCategory.assetCategoryId) + ) + .where(eq(game.id, gameId)) + + return foundGame[0] + } + + /** + * Retrieves games with partial name matching. + * @param gameName - The partial name to search for within game names. + * @returns A promise that resolves to an array of matching games. + */ + async getGamesByPartialName(gameName: string) { + const games = await this.drizzle + .select() + .from(game) + .where(or(like(game.name, `%${gameName}%`))) + + return games + } +} diff --git a/src/v2/lib/managers/tag/tag-manager.ts b/src/v2/lib/managers/tag/tag-manager.ts new file mode 100644 index 0000000..24880fd --- /dev/null +++ b/src/v2/lib/managers/tag/tag-manager.ts @@ -0,0 +1,76 @@ +import { DrizzleInstance } from "@/v2/db/turso" +import { assetTag, assetTagAsset, asset } from "@/v2/db/schema" +import { eq, or, like } from "drizzle-orm" +import { z } from "zod" + +/** + * Represents the schema for inserting a new asset tag. + */ +const insertAssetTagSchema = z.object({ + name: z.string(), + formattedName: z.string(), +}) + +/** + * Manages operations related to asset tags. + */ +export class TagManager { + constructor(private drizzle: DrizzleInstance) {} + + /** + * Retrieves an asset tag by its ID. + * @param tagId - The unique ID of the tag to retrieve. + * @returns A promise that resolves to the retrieved asset tag. + */ + async getTagById(tagId: string) { + const foundTag = await this.drizzle + .select() + .from(assetTag) + .leftJoin(assetTagAsset, eq(assetTagAsset.assetTagId, tagId)) + .leftJoin(asset, eq(asset.id, assetTagAsset.assetId)) + .where(eq(assetTag.id, tagId)) + + return foundTag[0] + } + + /** + * Retrieves a list of all asset tags. + * @returns A promise that resolves to an array of asset tags. + */ + async listTags() { + const tags = await this.drizzle.select().from(assetTag) + + return tags + } + + /** + * Retrieves asset tags with partial name matching. + * @param tagName - The partial name to search for within asset tags. + * @returns A promise that resolves to an array of matching asset tags. + */ + async getTagsByPartialName(tagName: string) { + const tags = await this.drizzle + .select() + .from(assetTag) + .where(or(like(assetTag.name, `%${tagName}%`))) + + return tags + } + + /** + * Creates a new asset tag. + * @param newTag - The new asset tag to create, adhering to the insertAssetTagSchema. + * @returns A promise that resolves to the created asset tag. + */ + async createTag(newTag: z.infer) { + const createdTag = await this.drizzle.insert(assetTag).values({ + id: newTag.name, + name: newTag.name, + formattedName: newTag.name, + assetCount: 0, + lastUpdated: new Date().toISOString(), + }) + + return createdTag + } +} diff --git a/src/v2/lib/managers/user/user-follow-manager.ts b/src/v2/lib/managers/user/user-follow-manager.ts new file mode 100644 index 0000000..e86d943 --- /dev/null +++ b/src/v2/lib/managers/user/user-follow-manager.ts @@ -0,0 +1,66 @@ +import { DrizzleInstance } from "@/v2/db/turso" +import { and, eq } from "drizzle-orm" +import { userNetworking } from "@/v2/db/schema" + +/** + * Manages user follow and unfollow operations. + */ +export class UserFollowManager { + constructor(private drizzle: DrizzleInstance) {} + + /** + * Follows a user by creating a following relationship between two users. + * + * @param followerId - The ID of the user who is following. + * @param followingId - The ID of the user being followed. + * @returns The user networking object representing the follow relationship. + */ + async followUser(followerId: string, followingId: string) { + const networking = await this.drizzle + .insert(userNetworking) + .values({ + followerId, + followingId, + createdAt: new Date().toISOString(), + }) + .returning() + + return networking[0] + } + + /** + * Unfollows a user by removing the following relationship between two users. + * + * @param followerId - The ID of the user who is unfollowing. + * @param followingId - The ID of the user being unfollowed. + * @returns The user networking object representing the removed follow relationship. + */ + async unfollowUser(followerId: string, followingId: string) { + const networking = await this.drizzle + .delete(userNetworking) + .where( + and( + eq(userNetworking.followerId, followerId), + eq(userNetworking.followingId, followingId) + ) + ) + .returning() + + return networking[0] + } + + /** + * Retrieves the followers of a user by their user ID. + * + * @param userId - The ID of the user for whom to retrieve followers. + * @returns An array of user networking objects representing followers. + */ + async getFollowers(userId: string) { + const followers = await this.drizzle + .select() + .from(userNetworking) + .where(eq(userNetworking.followingId, userId)) + + return followers + } +} diff --git a/src/v2/lib/managers/user/user-profile-manager.ts b/src/v2/lib/managers/user/user-profile-manager.ts new file mode 100644 index 0000000..01dd36e --- /dev/null +++ b/src/v2/lib/managers/user/user-profile-manager.ts @@ -0,0 +1,127 @@ +import { DrizzleInstance } from "@/v2/db/turso" +import { authUser } from "@/v2/db/schema" +import { R2Bucket } from "@cloudflare/workers-types" +import { eq } from "drizzle-orm" +import { z } from "zod" + +/** + * Represents the schema for user attributes. + */ +const UserAttributesSchema = z + .object({ + displayName: z.string(), + username: z.string(), + bio: z.string(), + pronouns: z.string(), + }) + .partial() + +/** + * Manages user profiles and related operations. + */ +export class UserProfileManager { + constructor(private drizzle: DrizzleInstance) {} + + /** + * Updates the attributes of a user's profile. + * + * @param userId - The ID of the user to update. + * @param attributes - The new user attributes. + * @returns The updated user object. + * @throws Error if the provided attributes are invalid. + */ + async updateUserAttributes( + userId: string, + attributes: z.infer + ) { + const validAttributes = UserAttributesSchema.safeParse(attributes) + if (!validAttributes.success) + throw new Error(`Invalid attributes provided`) + + const user = await this.drizzle + .update(authUser) + .set(attributes) + .where(eq(authUser.id, userId)) + .returning() + + return user[0] + } + + /** + * Updates the user's profile picture. + * + * @param userId - The ID of the user to update. + * @param bucket - The R2Bucket where the picture will be stored. + * @param file - The new profile picture file. + * @returns The URL of the updated profile picture. + */ + async updateProfilePicture(userId: string, bucket: R2Bucket, file: File) { + const { key } = await bucket.put(`/avatars/${userId}.png`, file) + + const user = await this.drizzle + .update(authUser) + .set({ avatarUrl: key }) + .where(eq(authUser.id, userId)) + .returning() + + return user[0].avatarUrl + } + + /** + * Updates the user's profile banner image. + * + * @param userId - The ID of the user to update. + * @param bucket - The R2Bucket where the banner image will be stored. + * @param file - The new banner image file. + * @returns The URL of the updated banner image. + */ + async updateBanner(userId: string, bucket: R2Bucket, file: File) { + const { key } = await bucket.put(`/banners/${userId}.png`, file) + + const user = await this.drizzle + .update(authUser) + .set({ bannerUrl: key }) + .where(eq(authUser.id, userId)) + .returning() + + return user[0].bannerUrl + } + + /** + * Resets the user's profile picture to null. + * + * @param userId - The ID of the user to update. + * @param bucket - The R2Bucket where the picture is stored. + * @returns The URL of the reset profile picture (null). + */ + async resetProfilePicture(userId: string, bucket: R2Bucket) { + await bucket.delete(`/avatars/${userId}.png`) + + const user = await this.drizzle + .update(authUser) + .set({ avatarUrl: null }) + .where(eq(authUser.id, userId)) + .returning() + + return user[0].avatarUrl + } + + /** + * Resets the user's profile banner image to null. + * + * @param userId - The ID of the user to update. + * @param bucket - The R2Bucket where the banner image is stored. + * @returns The URL of the reset banner image (null). + */ + async resetBanner(userId: string, bucket: R2Bucket) { + await bucket.delete(`/banners/${userId}.png`) + + const user = await this.drizzle + .update(authUser) + .set({ bannerUrl: null }) + .where(eq(authUser.id, userId)) + .returning() + + return user[0].bannerUrl + } +} diff --git a/src/v2/lib/managers/user/user-search-manager.ts b/src/v2/lib/managers/user/user-search-manager.ts new file mode 100644 index 0000000..87066c2 --- /dev/null +++ b/src/v2/lib/managers/user/user-search-manager.ts @@ -0,0 +1,56 @@ +import { DrizzleInstance } from "@/v2/db/turso" +import { authUser } from "@/v2/db/schema" +import { eq, or, like } from "drizzle-orm" + +/** + * Manages user search and retrieval operations. + */ +export class UserSearchManager { + constructor(private drizzle: DrizzleInstance) {} + + /** + * Retrieves a user by their user ID. + * + * @param userId - The ID of the user to retrieve. + * @returns The user object or undefined if not found. + */ + async getUserById(userId: string) { + const user = await this.drizzle + .select() + .from(authUser) + .where(eq(authUser.id, userId)) + + return user[0] + } + + /** + * Retrieves a user by their username. + * + * @param username - The username of the user to retrieve. + * @returns The user object or undefined if not found. + */ + async getUserByUsername(username: string) { + const user = await this.drizzle + .select() + .from(authUser) + .where(eq(authUser.username, username)) + + return user[0] + } + + /** + * Retrieves users by partially matching their usernames. + * + * @param username - The partial username to search for. + * @returns An array of user objects matching the search criteria, limited to 25 results. + */ + async getUsersByUsername(username: string) { + const users = await this.drizzle + .select() + .from(authUser) + .where(or(like(authUser.username, `%${username}%`))) + .limit(25) + + return users + } +} diff --git a/src/v2/routes/auth/user-attributes/user-relations/follow-user.ts b/src/v2/routes/auth/user-attributes/user-relations/follow-user.ts index 27186ae..fc1cf02 100644 --- a/src/v2/routes/auth/user-attributes/user-relations/follow-user.ts +++ b/src/v2/routes/auth/user-attributes/user-relations/follow-user.ts @@ -69,7 +69,6 @@ export async function followUser(c: APIContext): Promise { followerId: session.user.userId, followingId: user.id, createdAt: new Date().toISOString(), - updatedAt: new Date().toISOString(), }) } catch (e) { return c.json({ success: false, state: "failed to follow user" }, 200) From 3c386d2c1a85f5d2759b2061be669d91a3b15b55 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Sun, 5 Nov 2023 22:25:10 +0000 Subject: [PATCH 142/318] update readme & fix ci --- README.md | 5 +++-- ...rmella_unuscione.sql => 0000_round_puppet_master.sql} | 1 - src/v2/db/migrations/meta/0000_snapshot.json | 9 +-------- src/v2/db/migrations/meta/_journal.json | 4 ++-- 4 files changed, 6 insertions(+), 13 deletions(-) rename src/v2/db/migrations/{0000_sparkling_carmella_unuscione.sql => 0000_round_puppet_master.sql} (99%) diff --git a/README.md b/README.md index dd8e30c..859a799 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,9 @@ We use Turso as our database. You will need to install the [Turso CLI](https://d The Turso CLI can be ran on Windows using WSL. -The API will connect to the local database if the environment is set to `DEV`, else it will connect to your production database. +The API will connect to the local database if the environment is set to `DEV`, else - it will connect to your production database. + +To generate seed data, generate and migrate, you can run `pnpm drizzle:init:dev`. ### Wrangler @@ -40,7 +42,6 @@ Required environment variables are viewable in `./src/worker-configuration.d.ts` ### Database - When migrating, you will need `tsx`. - - It's not reccomended to use `drizzle:push` in production. However, there is `drizzle:generate` & `drizzle:migrate` available as scripts. ## Authors diff --git a/src/v2/db/migrations/0000_sparkling_carmella_unuscione.sql b/src/v2/db/migrations/0000_round_puppet_master.sql similarity index 99% rename from src/v2/db/migrations/0000_sparkling_carmella_unuscione.sql rename to src/v2/db/migrations/0000_round_puppet_master.sql index 2f64400..4da0f91 100644 --- a/src/v2/db/migrations/0000_sparkling_carmella_unuscione.sql +++ b/src/v2/db/migrations/0000_round_puppet_master.sql @@ -173,7 +173,6 @@ CREATE TABLE `userNetworking` ( `followerId` text NOT NULL, `followingId` text NOT NULL, `createdAt` text NOT NULL, - `updatedAt` text NOT NULL, FOREIGN KEY (`followerId`) REFERENCES `authUser`(`id`) ON UPDATE no action ON DELETE no action, FOREIGN KEY (`followingId`) REFERENCES `authUser`(`id`) ON UPDATE no action ON DELETE no action ); diff --git a/src/v2/db/migrations/meta/0000_snapshot.json b/src/v2/db/migrations/meta/0000_snapshot.json index a61c1fb..50b7e04 100644 --- a/src/v2/db/migrations/meta/0000_snapshot.json +++ b/src/v2/db/migrations/meta/0000_snapshot.json @@ -1,7 +1,7 @@ { "version": "5", "dialect": "sqlite", - "id": "6b46f393-1ae5-40d7-ab31-1fd8c0d6a229", + "id": "5186a741-3874-416e-9e20-bc85d7f47d78", "prevId": "00000000-0000-0000-0000-000000000000", "tables": { "asset": { @@ -1405,13 +1405,6 @@ "primaryKey": false, "notNull": true, "autoincrement": false - }, - "updatedAt": { - "name": "updatedAt", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false } }, "indexes": { diff --git a/src/v2/db/migrations/meta/_journal.json b/src/v2/db/migrations/meta/_journal.json index 77da97a..526e299 100644 --- a/src/v2/db/migrations/meta/_journal.json +++ b/src/v2/db/migrations/meta/_journal.json @@ -5,8 +5,8 @@ { "idx": 0, "version": "5", - "when": 1699206644646, - "tag": "0000_sparkling_carmella_unuscione", + "when": 1699222892993, + "tag": "0000_round_puppet_master", "breakpoints": true } ] From 413dc5ac38fd9ff84cdd5d0ec74a42a70aed8f90 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Sun, 5 Nov 2023 22:46:53 +0000 Subject: [PATCH 143/318] utilize for dates --- src/v2/db/schema/game/game.ts | 6 +++++- src/v2/db/schema/oc-generators/oc-generators.ts | 6 +++++- src/v2/db/schema/user/user-attributes.ts | 17 ++++++++++++++--- src/v2/db/schema/user/user-collections.ts | 6 +++++- src/v2/db/schema/user/user-connections.ts | 3 ++- src/v2/db/schema/user/user-networking.ts | 6 +++++- src/v2/db/schema/user/user.ts | 6 +++++- src/v2/routes/auth/reset-password.ts | 3 +-- src/v2/routes/auth/signup.ts | 1 - 9 files changed, 42 insertions(+), 12 deletions(-) diff --git a/src/v2/db/schema/game/game.ts b/src/v2/db/schema/game/game.ts index ae61b47..bdb9cd8 100644 --- a/src/v2/db/schema/game/game.ts +++ b/src/v2/db/schema/game/game.ts @@ -25,7 +25,11 @@ export const game = sqliteTable( possibleSuggestiveContent: integer("possible_suggestive_content") .default(0) .notNull(), - lastUpdated: text("last_updated").notNull(), + lastUpdated: text("last_updated") + .notNull() + .$defaultFn(() => { + return new Date().toISOString() + }), }, (game) => { return { diff --git a/src/v2/db/schema/oc-generators/oc-generators.ts b/src/v2/db/schema/oc-generators/oc-generators.ts index 44fa64b..bb94dbc 100644 --- a/src/v2/db/schema/oc-generators/oc-generators.ts +++ b/src/v2/db/schema/oc-generators/oc-generators.ts @@ -27,7 +27,11 @@ export const savedOcGenerators = sqliteTable( }), name: text("name").notNull(), game: text("game").notNull(), - dateCreated: text("date_created").notNull(), + dateCreated: text("date_created") + .notNull() + .$defaultFn(() => { + return new Date().toISOString() + }), isPublic: integer("is_public").default(0).notNull(), content: text("content").notNull(), savedColorPalette: text("saved_color_palette"), // array of 5 hex values, completely optional for the user to save diff --git a/src/v2/db/schema/user/user-attributes.ts b/src/v2/db/schema/user/user-attributes.ts index 6085871..a4c779b 100644 --- a/src/v2/db/schema/user/user-attributes.ts +++ b/src/v2/db/schema/user/user-attributes.ts @@ -3,7 +3,6 @@ import { relations } from "drizzle-orm" import { sqliteTable, text, - integer, // uniqueIndex, index, } from "drizzle-orm/sqlite-core" @@ -26,7 +25,13 @@ export const emailVerificationToken = sqliteTable( onDelete: "cascade", }), token: text("token").notNull(), - expiresAt: integer("expires_at").notNull(), + expiresAt: text("expires_at") + .notNull() + .$defaultFn(() => { + const now = new Date() + now.setHours(now.getHours() + 12) + return now.toISOString() + }), }, (emailVerificationToken) => { return { @@ -55,7 +60,13 @@ export const passwordResetToken = sqliteTable( onDelete: "cascade", }), token: text("token").notNull(), - expiresAt: integer("expires_at").notNull(), + expiresAt: text("expires_at") + .notNull() + .$defaultFn(() => { + const now = new Date() + now.setHours(now.getHours() + 12) + return now.toISOString() + }), }, (passwordResetToken) => { return { diff --git a/src/v2/db/schema/user/user-collections.ts b/src/v2/db/schema/user/user-collections.ts index 30a1674..33e5380 100644 --- a/src/v2/db/schema/user/user-collections.ts +++ b/src/v2/db/schema/user/user-collections.ts @@ -28,7 +28,11 @@ export const userCollection = sqliteTable( onUpdate: "cascade", onDelete: "cascade", }), - dateCreated: text("date_created").notNull(), + dateCreated: text("date_created") + .notNull() + .$defaultFn(() => { + return new Date().toISOString() + }), isPublic: integer("is_public").default(0).notNull(), }, (collection) => { diff --git a/src/v2/db/schema/user/user-connections.ts b/src/v2/db/schema/user/user-connections.ts index 0112bfc..981ae96 100644 --- a/src/v2/db/schema/user/user-connections.ts +++ b/src/v2/db/schema/user/user-connections.ts @@ -17,7 +17,8 @@ export const socialsConnection = sqliteTable( .references(() => authUser.id, { onUpdate: "cascade", onDelete: "cascade", - }), + }) + .unique(), discordId: text("discord_id"), }, (socialsConnection) => { diff --git a/src/v2/db/schema/user/user-networking.ts b/src/v2/db/schema/user/user-networking.ts index 6c2578a..9670e79 100644 --- a/src/v2/db/schema/user/user-networking.ts +++ b/src/v2/db/schema/user/user-networking.ts @@ -22,7 +22,11 @@ export const userNetworking = sqliteTable( followingId: text("followingId") .notNull() .references(() => authUser.id), - createdAt: text("createdAt").notNull(), + createdAt: text("createdAt") + .notNull() + .$defaultFn(() => { + return new Date().toISOString() + }), }, (userNetworking) => { return { diff --git a/src/v2/db/schema/user/user.ts b/src/v2/db/schema/user/user.ts index c3e7049..cb3ea35 100644 --- a/src/v2/db/schema/user/user.ts +++ b/src/v2/db/schema/user/user.ts @@ -37,7 +37,11 @@ export const authUser = sqliteTable( pronouns: text("pronouns"), verified: integer("verified").default(0).notNull(), bio: text("bio").default("No bio set").notNull(), - dateJoined: text("date_joined").notNull(), + dateJoined: text("date_joined") + .notNull() + .$defaultFn(() => { + return new Date().toISOString() + }), roleFlags: integer("role_flags").default(1).notNull(), isContributor: integer("is_contributor").default(0).notNull(), selfAssignableRoleFlags: integer("self_assignable_role_flags") diff --git a/src/v2/routes/auth/reset-password.ts b/src/v2/routes/auth/reset-password.ts index 8e93e52..b350348 100644 --- a/src/v2/routes/auth/reset-password.ts +++ b/src/v2/routes/auth/reset-password.ts @@ -59,7 +59,6 @@ export async function generatePasswordResetToken( id: token, userId: user[0].id, token, - expiresAt: Date.now() + 1000 * 60 * 30, }) }) @@ -121,7 +120,7 @@ export async function resetPassword(c: APIContext): Promise { return c.json({ success: false, state: "invalid token entered" }, 200) } - if (relatedUser[0].expiresAt < Date.now()) { + if (new Date(relatedUser[0].expiresAt) < new Date()) { drizzle .delete(passwordResetToken) .where(eq(passwordResetToken.token, token)) diff --git a/src/v2/routes/auth/signup.ts b/src/v2/routes/auth/signup.ts index 2d328cf..a3c583b 100644 --- a/src/v2/routes/auth/signup.ts +++ b/src/v2/routes/auth/signup.ts @@ -140,7 +140,6 @@ export async function signup(c: APIContext): Promise { id: emailVerificationKey, userId: user.userId, token: emailVerificationKey, - expiresAt: Date.now() + 86400000, }) }) From 46404c62a6f001790953f1a295e36f2bd5f6b6c0 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Sun, 5 Nov 2023 22:50:03 +0000 Subject: [PATCH 144/318] asset auto date & cleanup seed --- src/scripts/seed/seed.ts | 10 ---------- src/v2/db/schema/asset/asset.ts | 6 +++++- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/src/scripts/seed/seed.ts b/src/scripts/seed/seed.ts index bd3058b..a88205e 100644 --- a/src/scripts/seed/seed.ts +++ b/src/scripts/seed/seed.ts @@ -51,7 +51,6 @@ async function main() { emailVerified: 1, usernameColour: "#84E6F8", bio: "test bio", - dateJoined: new Date().toISOString(), roleFlags: 1, isContributor: 0, selfAssignableRoleFlags: 0, @@ -63,7 +62,6 @@ async function main() { emailVerified: 1, bio: "test bio 2", pronouns: "he/him/his", - dateJoined: new Date().toISOString(), roleFlags: 1, isContributor: 0, selfAssignableRoleFlags: 0, @@ -74,7 +72,6 @@ async function main() { email: "hi3@dromzeh.dev", emailVerified: 1, bio: "test bio 3", - dateJoined: new Date().toISOString(), roleFlags: 1, isContributor: 0, selfAssignableRoleFlags: 0, @@ -90,17 +87,14 @@ async function main() { { followerId: newUsers[0].id, followingId: newUsers[1].id, - createdAt: new Date().toISOString(), }, { followerId: newUsers[1].id, followingId: newUsers[0].id, - createdAt: new Date().toISOString(), }, { followerId: newUsers[0].id, followingId: newUsers[2].id, - createdAt: new Date().toISOString(), }, ]) .returning() @@ -209,7 +203,6 @@ async function main() { url: "/test/image.png", status: "approved", uploadedById: "userid1", - uploadedDate: new Date().toISOString(), assetIsOptimized: 0, viewCount: 1337, downloadCount: 1337, @@ -226,7 +219,6 @@ async function main() { url: "/test/image.png", status: "approved", uploadedById: "userid2", - uploadedDate: new Date().toISOString(), assetIsOptimized: 0, viewCount: 1337, downloadCount: 1337, @@ -243,7 +235,6 @@ async function main() { url: "/test/image.png", status: "approved", uploadedById: "userid2", - uploadedDate: new Date().toISOString(), assetIsOptimized: 0, viewCount: 1337, downloadCount: 1337, @@ -287,7 +278,6 @@ async function main() { name: "collection name", description: "collection description", userId: "userid1", - dateCreated: new Date().toISOString(), isPublic: 0, // default to private }) .returning() diff --git a/src/v2/db/schema/asset/asset.ts b/src/v2/db/schema/asset/asset.ts index 80dbd44..9ef1730 100644 --- a/src/v2/db/schema/asset/asset.ts +++ b/src/v2/db/schema/asset/asset.ts @@ -54,7 +54,11 @@ export const asset = sqliteTable( .$type() .default("pending") .notNull(), - uploadedDate: text("uploaded_date").notNull(), + uploadedDate: text("uploaded_date") + .notNull() + .$defaultFn(() => { + return new Date().toISOString() + }), assetIsOptimized: integer("asset_is_optimized").default(0).notNull(), viewCount: integer("view_count").default(0).notNull(), downloadCount: integer("download_count").default(0).notNull(), From 605ee53365466ee453c571f7c9619286be4245d6 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Mon, 6 Nov 2023 01:18:07 +0000 Subject: [PATCH 145/318] init oslo & autofill remaining db cols --- package.json | 1 + pnpm-lock.yaml | 369 ++++++++++++++++++ src/scripts/seed/seed.ts | 49 +-- ...t_master.sql => 0000_silky_agent_zero.sql} | 9 +- src/v2/db/migrations/meta/0000_snapshot.json | 35 +- src/v2/db/migrations/meta/_journal.json | 4 +- src/v2/db/schema/asset/asset.ts | 4 +- src/v2/db/schema/user/user-collections.ts | 17 +- src/v2/db/schema/user/user-favorites.ts | 15 +- src/v2/lib/managers/asset/asset-manager.ts | 7 +- src/v2/lib/oslo.ts | 5 + .../collections/add-asset-to-collection.ts | 1 - .../delete-asset-from-collection.ts | 9 +- src/v2/routes/auth/login-methods/discord.ts | 2 + src/v2/routes/auth/signup.ts | 2 + 15 files changed, 457 insertions(+), 72 deletions(-) rename src/v2/db/migrations/{0000_round_puppet_master.sql => 0000_silky_agent_zero.sql} (97%) create mode 100644 src/v2/lib/oslo.ts diff --git a/package.json b/package.json index 6b00c09..a6ce9b3 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "lucia": "^2.7.1", "miniflare": "^3.20231025.1", "mysql2": "^3.6.2", + "oslo": "^0.17.0", "prettier": "^3.0.3", "unstorage": "^1.9.0", "uuid": "^9.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6199bae..fd5dd89 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -44,6 +44,9 @@ dependencies: mysql2: specifier: ^3.6.2 version: 3.6.2 + oslo: + specifier: ^0.17.0 + version: 0.17.0 prettier: specifier: ^3.0.3 version: 3.0.3 @@ -1113,6 +1116,362 @@ packages: } dev: false + /@node-rs/argon2-android-arm-eabi@1.5.2: + resolution: + { + integrity: sha512-vVZec4ITr9GumAy0p8Zj8ozie362gtbZrTkLp9EqvuFZ/HrZzR09uS2IsDgm4mAstg/rc4A1gLRrHI8jDdbjkA==, + } + engines: { node: ">= 10" } + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-android-arm64@1.5.2: + resolution: + { + integrity: sha512-SwhnsXyrpgtWDTwYds1WUnxLA/kVP8HVaImYwQ3Wemqj1lkzcSoIaNyjNWkyrYGqO1tVc1YUrqsbd5eCHh+3sg==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-darwin-arm64@1.5.2: + resolution: + { + integrity: sha512-+1ZMKiCCv2pip/o1Xg09piQru2LOIBPQ1vS4is86f55N3jjZnSfP+db5mYCSRuB0gRYqui98he7su7OGXlF4gQ==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-darwin-x64@1.5.2: + resolution: + { + integrity: sha512-mQ57mORlsxpfjcEsVpiHyHCOp6Ljrz/rVNWk8ihnPWw0qt0EqF1zbHRxTEPemL1iBHL9UyXpXrKS4JKq6xMn5w==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-freebsd-x64@1.5.2: + resolution: + { + integrity: sha512-UjKbFd3viYcpiwflkU4haEdNUMk1V2fVCJImWLWQns/hVval9BrDv5xsBwgdynbPHDlPOiWj816LBQwhWLGVWA==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-arm-gnueabihf@1.5.2: + resolution: + { + integrity: sha512-36GJjJBnVuscV9CTn8RVDeJysnmIzr6Lp7QBCDczYHi6eKFuA8udCJb4SRyJqdvIuzycKG1RL56FbcFBJYCYIA==, + } + engines: { node: ">= 10" } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-arm64-gnu@1.5.2: + resolution: + { + integrity: sha512-sE0ydb2gp6xC+5vbVz8l3paaiBbFQIB2Rwp5wx9MmKiYdTfcO5WkGeADuSgoFiTcSEz1RsHXqrdVy6j/LtSqtA==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-arm64-musl@1.5.2: + resolution: + { + integrity: sha512-LhE0YHB0aJCwlbsQrwePik/KFWUc9qMriJIL5KiejK3bDoTVY4ihH587QT56JyaLvl3nBJaAV8l5yMqQdHnouA==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-x64-gnu@1.5.2: + resolution: + { + integrity: sha512-MnKLiBlyg05pxvKXe3lNgBL9El9ThD74hvVEiWH1Xk40RRrJ507NCOWXVmQ0FDq1mjTeGFxbIvk+AcoF0NSLIQ==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-x64-musl@1.5.2: + resolution: + { + integrity: sha512-tzLgASY0Ng2OTW7Awwl9UWzjbWx8/uD6gXcZ/k/nYGSZE5Xp8EOD2NUqHLbK6KZE3775A0R25ShpiSxCadYqkg==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-win32-arm64-msvc@1.5.2: + resolution: + { + integrity: sha512-vpTwSvv3oUXTpWZh0/HxdJ5wFMlmS7aVDwL4ATWepTZhMG4n+TO0+tVLdcPHCbg0oc6hCWBjWNPlSn9mW+YIgA==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-win32-ia32-msvc@1.5.2: + resolution: + { + integrity: sha512-KPpZR15ui7uQWQXKmtaKyUQRs4UJdXnIIfiyFLGmLWCdEKlr3MtIGFt0fdziu4BF5ZObD8Ic6QvT0VXK4OJiww==, + } + engines: { node: ">= 10" } + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-win32-x64-msvc@1.5.2: + resolution: + { + integrity: sha512-/pGuwixJS8ZlpwhX9iM6g6JEeZYo1TtnNf8exwsOi7gxcUoTUfw5it+5GfbY/n+xRBz/DIU4bzUmXmh+7Gh0ug==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2@1.5.2: + resolution: + { + integrity: sha512-qq7wOSsdP2b4rXEapWNmsCjpaTGZWtp9kZmri98GYCDZqN8UJUG5zSue4XtYWWJMWKJVE/hkaIwk+BgN1ZUn0Q==, + } + engines: { node: ">= 10" } + optionalDependencies: + "@node-rs/argon2-android-arm-eabi": 1.5.2 + "@node-rs/argon2-android-arm64": 1.5.2 + "@node-rs/argon2-darwin-arm64": 1.5.2 + "@node-rs/argon2-darwin-x64": 1.5.2 + "@node-rs/argon2-freebsd-x64": 1.5.2 + "@node-rs/argon2-linux-arm-gnueabihf": 1.5.2 + "@node-rs/argon2-linux-arm64-gnu": 1.5.2 + "@node-rs/argon2-linux-arm64-musl": 1.5.2 + "@node-rs/argon2-linux-x64-gnu": 1.5.2 + "@node-rs/argon2-linux-x64-musl": 1.5.2 + "@node-rs/argon2-win32-arm64-msvc": 1.5.2 + "@node-rs/argon2-win32-ia32-msvc": 1.5.2 + "@node-rs/argon2-win32-x64-msvc": 1.5.2 + dev: false + + /@node-rs/bcrypt-android-arm-eabi@1.7.3: + resolution: + { + integrity: sha512-l53RuBqnqNvBN2jx09Ws6jpLmuQdSDx10n0GeaTfwh1svxsC8bPpVmxkfBExsT2Tu7KF38gTnPZvwsxysZQyPQ==, + } + engines: { node: ">= 10" } + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-android-arm64@1.7.3: + resolution: + { + integrity: sha512-TZpm4VbiViqDMvusrcYzLr1b1M5FDF0cDNiTUciLeBSsKtU5lNdEZGAU7gvCnrKoUWpGuOblHU7613zuB7SiNQ==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-darwin-arm64@1.7.3: + resolution: + { + integrity: sha512-SiUuAabynVsmixZMjh5xrn8w47EnV0HzbW9st4DPoVhn/wzdUcksIXDY75aoQG2EIzKLN8IGb+CIVnPGmRyhxw==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-darwin-x64@1.7.3: + resolution: + { + integrity: sha512-R+81Z0eX4hZPvCXY5Z6l0l+JrTU3WcSYGHP0QYV9uwdaafOz6EhrCXUzZ02AIcAbNoVR8eucYVruq9PiasXoVw==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-freebsd-x64@1.7.3: + resolution: + { + integrity: sha512-0pItU/5K3e83JjcJj9fZv+78txUoZ3hHCT7n/UMdu9mkpUzhX/rqb4jmQpJpD+UQoR76xp3qDo5RMgQBffBVNg==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-arm-gnueabihf@1.7.3: + resolution: + { + integrity: sha512-HTSybWUjNe8rWuXkTkMeFDiQNHc6VioRcgv6AeHZphIxiT6dFbnhXNkfz4Hr0zxvyPhZ3NrYjT2AmPVFT6VW3Q==, + } + engines: { node: ">= 10" } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-arm64-gnu@1.7.3: + resolution: + { + integrity: sha512-rWep6Y+v/c4bZHaM8LmSsrMwMmDR9wG4/q+3Z9VzR8xdnt5VCbuQdYWpf3sgGRGjTRdTBAdSK8x1reOjqsJ3Jg==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-arm64-musl@1.7.3: + resolution: + { + integrity: sha512-TyWEKhxr+yfGcMKzVV/ARZw+Hrky2yl91bo0XYU2ZW6I6LDC0emNsXugdWjwz8ADI4OWhhrOjXD8GCilxiB2Rg==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-x64-gnu@1.7.3: + resolution: + { + integrity: sha512-PofxM1Qg7tZKj1oP0I7tBTSSLr8Xc2uxx+P3pBCPmYzaBwWqGteNHJlF7n2q5xiH7YOlguH4w5CmcEjsiA3K4A==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-x64-musl@1.7.3: + resolution: + { + integrity: sha512-D5V6/dDVKP8S/ieDBLGhTn4oTo3upbrpWInynbhOMjJvPiIxVG1PiI3MXkWBtG9qtfleDk7gUkEKtAOxlIxDTQ==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-win32-arm64-msvc@1.7.3: + resolution: + { + integrity: sha512-b4gH2Yj5R4TwULrfMHd1Qqr+MrnFjVRUAJujDKPqi+PppSqezW8QF6DRSOL4GjnBmz5JEd64wxgeidvy7dsbGw==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-win32-ia32-msvc@1.7.3: + resolution: + { + integrity: sha512-E91ro+ybI0RhNc89aGaZQGll0YhPoHr8JacoWrNKwhg9zwNOYeuO0tokdMZdm6nF0/8obll0Mq7wO9AXO9iffw==, + } + engines: { node: ">= 10" } + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-win32-x64-msvc@1.7.3: + resolution: + { + integrity: sha512-LO/p9yjPODj/pQvPnowBuwpDdqiyUXQbqL1xb1RSP3NoyCFAGmjL5h0plSQrhLh8hskQiozBRXNaQurtsM7o0Q==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt@1.7.3: + resolution: + { + integrity: sha512-BF6u9CBPUiyk1zU+5iwikezf+xM4MFSu5cmrrg/PLKffGgIM13ZsY6DHftcTraETB04ryasjM/5IejotH+sO5Q==, + } + engines: { node: ">= 10" } + optionalDependencies: + "@node-rs/bcrypt-android-arm-eabi": 1.7.3 + "@node-rs/bcrypt-android-arm64": 1.7.3 + "@node-rs/bcrypt-darwin-arm64": 1.7.3 + "@node-rs/bcrypt-darwin-x64": 1.7.3 + "@node-rs/bcrypt-freebsd-x64": 1.7.3 + "@node-rs/bcrypt-linux-arm-gnueabihf": 1.7.3 + "@node-rs/bcrypt-linux-arm64-gnu": 1.7.3 + "@node-rs/bcrypt-linux-arm64-musl": 1.7.3 + "@node-rs/bcrypt-linux-x64-gnu": 1.7.3 + "@node-rs/bcrypt-linux-x64-musl": 1.7.3 + "@node-rs/bcrypt-win32-arm64-msvc": 1.7.3 + "@node-rs/bcrypt-win32-ia32-msvc": 1.7.3 + "@node-rs/bcrypt-win32-x64-msvc": 1.7.3 + dev: false + /@nodelib/fs.scandir@2.1.5: resolution: { @@ -3662,6 +4021,16 @@ packages: prelude-ls: 1.2.1 type-check: 0.4.0 + /oslo@0.17.0: + resolution: + { + integrity: sha512-UJHew6zFEkJYGWjO4/ARHnX+M7umhJ6IXc6cJA2AQ3BpFwqEqaKjySOfXYuNFQddzfP2zk1aG+xYQG1ODHKwfQ==, + } + dependencies: + "@node-rs/argon2": 1.5.2 + "@node-rs/bcrypt": 1.7.3 + dev: false + /p-limit@3.1.0: resolution: { diff --git a/src/scripts/seed/seed.ts b/src/scripts/seed/seed.ts index a88205e..2dc7080 100644 --- a/src/scripts/seed/seed.ts +++ b/src/scripts/seed/seed.ts @@ -15,7 +15,7 @@ import { userFavoriteAsset, userFavorite, } from "@/v2/db/schema" -import { v4 } from "uuid" +import { generateID } from "@/v2/lib/oslo" const { ENVIRONMENT } = process.env @@ -45,7 +45,7 @@ async function main() { .insert(authUser) .values([ { - id: "userid1", + id: generateID(), username: "testuser", email: "hi@dromzeh.dev", emailVerified: 1, @@ -56,7 +56,7 @@ async function main() { selfAssignableRoleFlags: 0, }, { - id: "userid2", + id: generateID(), username: "testuser2", email: "hi2@dromzeh.dev", emailVerified: 1, @@ -67,7 +67,7 @@ async function main() { selfAssignableRoleFlags: 0, }, { - id: "userid3", + id: generateID(), username: "testuser3", email: "hi3@dromzeh.dev", emailVerified: 1, @@ -131,7 +131,6 @@ async function main() { name: "genshin-impact", formattedName: "Genshin Impact", assetCount: 1, - possibleSuggestiveContent: 0, lastUpdated: new Date().toISOString(), }, { @@ -139,7 +138,6 @@ async function main() { name: "honkai-impact-3rd", formattedName: "Honkai Impact: 3rd", assetCount: 0, - possibleSuggestiveContent: 0, lastUpdated: new Date().toISOString(), }, ]) @@ -202,7 +200,7 @@ async function main() { assetCategoryId: "character-sheets", url: "/test/image.png", status: "approved", - uploadedById: "userid1", + uploadedById: newUsers[0].id, assetIsOptimized: 0, viewCount: 1337, downloadCount: 1337, @@ -218,7 +216,7 @@ async function main() { assetCategoryId: "character-sheets", url: "/test/image.png", status: "approved", - uploadedById: "userid2", + uploadedById: newUsers[1].id, assetIsOptimized: 0, viewCount: 1337, downloadCount: 1337, @@ -234,7 +232,7 @@ async function main() { assetCategoryId: "splash-art", url: "/test/image.png", status: "approved", - uploadedById: "userid2", + uploadedById: newUsers[1].id, assetIsOptimized: 0, viewCount: 1337, downloadCount: 1337, @@ -251,19 +249,19 @@ async function main() { .insert(assetTagAsset) .values([ { - assetId: 1, + assetId: newAssets[0].id, assetTagId: "official", }, { - assetId: 1, + assetId: newAssets[0].id, assetTagId: "1.0", }, { - assetId: 2, + assetId: newAssets[1].id, assetTagId: "official", }, { - assetId: 3, + assetId: newAssets[2].id, assetTagId: "official", }, ]) @@ -274,10 +272,9 @@ async function main() { const newUserCollections = await db .insert(userCollection) .values({ - id: v4(), name: "collection name", description: "collection description", - userId: "userid1", + userId: newUsers[0].id, isPublic: 0, // default to private }) .returning() @@ -288,14 +285,12 @@ async function main() { .insert(userCollectionAsset) .values([ { - id: v4(), collectionId: newUserCollections[0].id, - assetId: 1, + assetId: newAssets[0].id, }, { - id: v4(), collectionId: newUserCollections[0].id, - assetId: 2, + assetId: newAssets[1].id, }, ]) .returning() @@ -309,13 +304,10 @@ async function main() { .insert(userFavorite) .values([ { - id: v4(), - userId: "userid1", - isPublic: 0, // default to private + userId: newUsers[0].id, }, { - id: v4(), - userId: "userid2", + userId: newUsers[1].id, isPublic: 1, }, ]) @@ -327,19 +319,16 @@ async function main() { .insert(userFavoriteAsset) .values([ { - id: v4(), userFavoriteId: newUserFavorites[0].id, - assetId: 1, + assetId: newAssets[0].id, }, { - id: v4(), userFavoriteId: newUserFavorites[0].id, - assetId: 2, + assetId: newAssets[1].id, }, { - id: v4(), userFavoriteId: newUserFavorites[1].id, - assetId: 3, + assetId: newAssets[2].id, }, ]) .returning() diff --git a/src/v2/db/migrations/0000_round_puppet_master.sql b/src/v2/db/migrations/0000_silky_agent_zero.sql similarity index 97% rename from src/v2/db/migrations/0000_round_puppet_master.sql rename to src/v2/db/migrations/0000_silky_agent_zero.sql index 4da0f91..de7fc89 100644 --- a/src/v2/db/migrations/0000_round_puppet_master.sql +++ b/src/v2/db/migrations/0000_silky_agent_zero.sql @@ -117,7 +117,7 @@ CREATE TABLE `emailVerificationToken` ( `id` text NOT NULL, `user_id` text NOT NULL, `token` text NOT NULL, - `expires_at` integer NOT NULL, + `expires_at` text NOT NULL, FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade ); --> statement-breakpoint @@ -125,7 +125,7 @@ CREATE TABLE `passwordResetToken` ( `id` text NOT NULL, `user_id` text NOT NULL, `token` text NOT NULL, - `expires_at` integer NOT NULL, + `expires_at` text NOT NULL, FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade ); --> statement-breakpoint @@ -140,9 +140,9 @@ CREATE TABLE `userCollection` ( ); --> statement-breakpoint CREATE TABLE `assetCollectionAsset` ( - `id` text NOT NULL, `collection_id` text NOT NULL, `asset_id` integer NOT NULL, + `date_added` text NOT NULL, FOREIGN KEY (`collection_id`) REFERENCES `userCollection`(`id`) ON UPDATE cascade ON DELETE cascade, FOREIGN KEY (`asset_id`) REFERENCES `asset`(`id`) ON UPDATE cascade ON DELETE cascade ); @@ -224,11 +224,10 @@ CREATE INDEX `password_reset_token_token_idx` ON `passwordResetToken` (`token`); CREATE UNIQUE INDEX `userCollection_id_unique` ON `userCollection` (`id`);--> statement-breakpoint CREATE INDEX `collection_id_idx` ON `userCollection` (`id`);--> statement-breakpoint CREATE INDEX `user_collection_id_idx` ON `userCollection` (`user_id`);--> statement-breakpoint -CREATE UNIQUE INDEX `assetCollectionAsset_id_unique` ON `assetCollectionAsset` (`id`);--> statement-breakpoint -CREATE INDEX `collection_assets_id_idx` ON `assetCollectionAsset` (`id`);--> statement-breakpoint CREATE INDEX `collection_assets_collection_id_idx` ON `assetCollectionAsset` (`collection_id`);--> statement-breakpoint CREATE INDEX `collection_assets_asset_id_idx` ON `assetCollectionAsset` (`asset_id`);--> statement-breakpoint CREATE UNIQUE INDEX `socialsConnection_id_unique` ON `socialsConnection` (`id`);--> statement-breakpoint +CREATE UNIQUE INDEX `socialsConnection_user_id_unique` ON `socialsConnection` (`user_id`);--> statement-breakpoint CREATE INDEX `socials_connection_user_id_idx` ON `socialsConnection` (`user_id`);--> statement-breakpoint CREATE INDEX `socials_connection_discord_id_idx` ON `socialsConnection` (`discord_id`);--> statement-breakpoint CREATE UNIQUE INDEX `userFavorite_id_unique` ON `userFavorite` (`id`);--> statement-breakpoint diff --git a/src/v2/db/migrations/meta/0000_snapshot.json b/src/v2/db/migrations/meta/0000_snapshot.json index 50b7e04..06f3a25 100644 --- a/src/v2/db/migrations/meta/0000_snapshot.json +++ b/src/v2/db/migrations/meta/0000_snapshot.json @@ -1,7 +1,7 @@ { "version": "5", "dialect": "sqlite", - "id": "5186a741-3874-416e-9e20-bc85d7f47d78", + "id": "f2ae8a0d-cb11-48b7-bcfd-52e82220539a", "prevId": "00000000-0000-0000-0000-000000000000", "tables": { "asset": { @@ -951,7 +951,7 @@ }, "expires_at": { "name": "expires_at", - "type": "integer", + "type": "text", "primaryKey": false, "notNull": true, "autoincrement": false @@ -1014,7 +1014,7 @@ }, "expires_at": { "name": "expires_at", - "type": "integer", + "type": "text", "primaryKey": false, "notNull": true, "autoincrement": false @@ -1132,13 +1132,6 @@ "assetCollectionAsset": { "name": "assetCollectionAsset", "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, "collection_id": { "name": "collection_id", "type": "text", @@ -1152,19 +1145,16 @@ "primaryKey": false, "notNull": true, "autoincrement": false + }, + "date_added": { + "name": "date_added", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false } }, "indexes": { - "assetCollectionAsset_id_unique": { - "name": "assetCollectionAsset_id_unique", - "columns": ["id"], - "isUnique": true - }, - "collection_assets_id_idx": { - "name": "collection_assets_id_idx", - "columns": ["id"], - "isUnique": false - }, "collection_assets_collection_id_idx": { "name": "collection_assets_collection_id_idx", "columns": ["collection_id"], @@ -1230,6 +1220,11 @@ "columns": ["id"], "isUnique": true }, + "socialsConnection_user_id_unique": { + "name": "socialsConnection_user_id_unique", + "columns": ["user_id"], + "isUnique": true + }, "socials_connection_user_id_idx": { "name": "socials_connection_user_id_idx", "columns": ["user_id"], diff --git a/src/v2/db/migrations/meta/_journal.json b/src/v2/db/migrations/meta/_journal.json index 526e299..eacc726 100644 --- a/src/v2/db/migrations/meta/_journal.json +++ b/src/v2/db/migrations/meta/_journal.json @@ -5,8 +5,8 @@ { "idx": 0, "version": "5", - "when": 1699222892993, - "tag": "0000_round_puppet_master", + "when": 1699233278726, + "tag": "0000_silky_agent_zero", "breakpoints": true } ] diff --git a/src/v2/db/schema/asset/asset.ts b/src/v2/db/schema/asset/asset.ts index 9ef1730..660780e 100644 --- a/src/v2/db/schema/asset/asset.ts +++ b/src/v2/db/schema/asset/asset.ts @@ -86,7 +86,7 @@ export type NewAsset = typeof asset.$inferInsert export const assetRelations = relations(asset, ({ one, many }) => ({ assetTagAsset: many(assetTagAsset), - atlas: many(atlasToAsset), + atlasToAsset: many(atlasToAsset), authUser: one(authUser, { fields: [asset.uploadedById], references: [authUser.id], @@ -96,7 +96,7 @@ export const assetRelations = relations(asset, ({ one, many }) => ({ references: [game.id], }), assetCategory: one(assetCategory, { - fields: [asset.gameId], + fields: [asset.assetCategoryId], references: [assetCategory.id], }), })) diff --git a/src/v2/db/schema/user/user-collections.ts b/src/v2/db/schema/user/user-collections.ts index 33e5380..69833a2 100644 --- a/src/v2/db/schema/user/user-collections.ts +++ b/src/v2/db/schema/user/user-collections.ts @@ -9,6 +9,7 @@ import { } from "drizzle-orm/sqlite-core" import { authUser } from "./user" import { asset } from "../asset/asset" +import { generateID } from "@/v2/lib/oslo" /* NOTE: this file is where users store their collections of assets. @@ -19,7 +20,12 @@ NOTE: this file is where users store their collections of assets. export const userCollection = sqliteTable( tableNames.userCollection, { - id: text("id").unique().notNull(), + id: text("id") + .unique() + .notNull() + .$defaultFn(() => { + return generateID() + }), name: text("name").notNull(), description: text("description").notNull(), userId: text("user_id") @@ -51,7 +57,6 @@ export type NewUserCollection = typeof userCollection.$inferInsert export const userCollectionAsset = sqliteTable( tableNames.userCollectionAsset, { - id: text("id").unique().notNull(), collectionId: text("collection_id") .notNull() .references(() => userCollection.id, { @@ -64,12 +69,14 @@ export const userCollectionAsset = sqliteTable( onUpdate: "cascade", onDelete: "cascade", }), + dateAdded: text("date_added") + .notNull() + .$defaultFn(() => { + return new Date().toISOString() + }), }, (collectionAssets) => { return { - collectionAssetsIdx: index("collection_assets_id_idx").on( - collectionAssets.id - ), collectionAssetsCollectionIdx: index( "collection_assets_collection_id_idx" ).on(collectionAssets.collectionId), diff --git a/src/v2/db/schema/user/user-favorites.ts b/src/v2/db/schema/user/user-favorites.ts index 8f205f3..90ac9c3 100644 --- a/src/v2/db/schema/user/user-favorites.ts +++ b/src/v2/db/schema/user/user-favorites.ts @@ -9,6 +9,7 @@ import { } from "drizzle-orm/sqlite-core" import { authUser } from "./user" import { asset } from "../asset/asset" +import { generateID } from "@/v2/lib/oslo" /* NOTE: this file is users favorite assets. @@ -19,7 +20,12 @@ NOTE: this file is users favorite assets. export const userFavorite = sqliteTable( tableNames.userFavorite, { - id: text("id").unique().notNull(), + id: text("id") + .unique() + .notNull() + .$defaultFn(() => { + return generateID() + }), userId: text("user_id") .notNull() .references(() => authUser.id, { @@ -46,7 +52,12 @@ export type NewUserFavorite = typeof userFavorite.$inferInsert export const userFavoriteAsset = sqliteTable( tableNames.userFavoriteAsset, { - id: text("id").unique().notNull(), + id: text("id") + .unique() + .notNull() + .$defaultFn(() => { + return generateID() + }), userFavoriteId: text("favorited_assets_id") .notNull() .references(() => userFavorite.id, { diff --git a/src/v2/lib/managers/asset/asset-manager.ts b/src/v2/lib/managers/asset/asset-manager.ts index a328e59..1e06c8c 100644 --- a/src/v2/lib/managers/asset/asset-manager.ts +++ b/src/v2/lib/managers/asset/asset-manager.ts @@ -17,6 +17,7 @@ type AssetSearchQuery = { game?: string category?: string tag?: string + limit?: number } const MAX_FILE_SIZE = 5000 @@ -105,8 +106,9 @@ export class AssetManager { * @returns A promise that resolves to an array of matching assets. */ async searchAssets(query: AssetSearchQuery) { - const { name, game, category, tag } = query + const { name, game, category, tag, limit } = query + const assetLimit = limit ?? 500 const gameList = game ? SplitQueryByCommas(game.toLowerCase()) : null const categoryList = category ? SplitQueryByCommas(category.toLowerCase()) @@ -153,7 +155,7 @@ export class AssetManager { ) ) .groupBy(asset.id) - .limit(500) + .limit(assetLimit) return foundAssets } @@ -188,7 +190,6 @@ export class AssetManager { url: key, uploadedById: userId, status: "pending", - uploadedDate: new Date().toISOString(), fileSize: newAsset.size, width: newAsset.width, height: newAsset.height, diff --git a/src/v2/lib/oslo.ts b/src/v2/lib/oslo.ts new file mode 100644 index 0000000..a1f91ae --- /dev/null +++ b/src/v2/lib/oslo.ts @@ -0,0 +1,5 @@ +import { generateRandomString, alphabet } from "oslo/random" + +export function generateID() { + return generateRandomString(15, alphabet("a-z", "0-9")).toUpperCase() +} diff --git a/src/v2/routes/auth/assets/collections/add-asset-to-collection.ts b/src/v2/routes/auth/assets/collections/add-asset-to-collection.ts index 5b1c8e7..3d36f2d 100644 --- a/src/v2/routes/auth/assets/collections/add-asset-to-collection.ts +++ b/src/v2/routes/auth/assets/collections/add-asset-to-collection.ts @@ -102,7 +102,6 @@ export async function addAssetToCollection(c: APIContext): Promise { await drizzle .insert(userCollectionAsset) .values({ - id: crypto.randomUUID(), collectionId: collectionId, assetId: parseInt(assetId), }) diff --git a/src/v2/routes/auth/assets/collections/delete-asset-from-collection.ts b/src/v2/routes/auth/assets/collections/delete-asset-from-collection.ts index 843880e..7ecbe4d 100644 --- a/src/v2/routes/auth/assets/collections/delete-asset-from-collection.ts +++ b/src/v2/routes/auth/assets/collections/delete-asset-from-collection.ts @@ -2,7 +2,7 @@ import { auth } from "@/v2/lib/auth/lucia" import { getConnection } from "@/v2/db/turso" import { z } from "zod" import { userCollectionAsset } from "@/v2/db/schema" -import { eq } from "drizzle-orm" +import { eq, and } from "drizzle-orm" const DeleteAssetFromCollectionSchema = z.object({ collectionId: z.string({ @@ -98,7 +98,12 @@ export async function deleteAssetFromCollection( try { await drizzle .delete(userCollectionAsset) - .where(eq(userCollectionAsset.id, userCollectionAssetExists.id)) + .where( + and( + eq(userCollectionAsset.collectionId, collectionId), + eq(userCollectionAsset.assetId, parseInt(assetId)) + ) + ) .execute() } catch (e) { return c.json( diff --git a/src/v2/routes/auth/login-methods/discord.ts b/src/v2/routes/auth/login-methods/discord.ts index cd63096..4ae95ff 100644 --- a/src/v2/routes/auth/login-methods/discord.ts +++ b/src/v2/routes/auth/login-methods/discord.ts @@ -5,6 +5,7 @@ import { import { setCookie, getCookie } from "hono/cookie" import { getConnection } from "@/v2/db/turso" import { socialsConnection } from "@/v2/db/schema" +import { generateID } from "@/v2/lib/oslo" export async function loginWithDiscord(c: APIContext): Promise { const auth = await authAdapter(c.env) @@ -97,6 +98,7 @@ export async function discordCallback(c: APIContext): Promise { // if user doesn't exist, create it based off their discord info const createdUser = await createUser({ + userId: generateID(), attributes: { username: discordUser.username, display_name: discordUser.username, diff --git a/src/v2/routes/auth/signup.ts b/src/v2/routes/auth/signup.ts index a3c583b..2a86e3e 100644 --- a/src/v2/routes/auth/signup.ts +++ b/src/v2/routes/auth/signup.ts @@ -4,6 +4,7 @@ import { getConnection } from "@/v2/db/turso" import { generateRandomString } from "lucia/utils" import { emailVerificationToken } from "@/v2/db/schema" import { sendEmailConfirmationEmail } from "@/v2/lib/resend/email" +import { generateID } from "@/v2/lib/oslo" const CreateAccountSchema = z .object({ @@ -100,6 +101,7 @@ export async function signup(c: APIContext): Promise { providerUserId: username.toLowerCase(), password, }, + userId: generateID(), attributes: { username, display_name: username, From 5ec307b8daf08a9745a68ea64205770426edbf44 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Mon, 6 Nov 2023 01:32:58 +0000 Subject: [PATCH 146/318] test: update node version --- .github/workflows/check.yml | 6 +++--- .github/workflows/deploy.yml | 2 +- .github/workflows/test.yml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 856f886..f01bad0 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -20,7 +20,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 20.9.0 - name: Install pnpm uses: pnpm/action-setup@v2 @@ -44,7 +44,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 20.9.0 - name: Install pnpm uses: pnpm/action-setup@v2 @@ -68,7 +68,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 20.9.0 - name: Install pnpm uses: pnpm/action-setup@v2 diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 63b33e8..3b52f3e 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -16,7 +16,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 20.9.0 - name: Install pnpm uses: pnpm/action-setup@v2 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 61ce7c8..e3ac6c3 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -26,7 +26,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 20.9.0 - name: Install pnpm uses: pnpm/action-setup@v2 From 2fbb6d43f037431c6653828218c93578b89a2e1e Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Mon, 6 Nov 2023 02:22:08 +0000 Subject: [PATCH 147/318] user collection & favourite manager --- .../asset-category/asset-category-manager.ts | 12 +- .../game-asset-category-manager.ts | 10 +- src/v2/lib/managers/asset/asset-manager.ts | 8 +- .../managers/collection/collection-manager.ts | 202 ++++++++++++++++++ .../lib/managers/favorite/favorite-manager.ts | 91 ++++++++ src/v2/lib/managers/game/game-manager.ts | 15 +- src/v2/lib/managers/tag/tag-manager.ts | 8 +- .../lib/managers/user/user-follow-manager.ts | 6 +- .../lib/managers/user/user-profile-manager.ts | 14 +- .../lib/managers/user/user-search-manager.ts | 6 +- 10 files changed, 343 insertions(+), 29 deletions(-) create mode 100644 src/v2/lib/managers/collection/collection-manager.ts create mode 100644 src/v2/lib/managers/favorite/favorite-manager.ts diff --git a/src/v2/lib/managers/asset-category/asset-category-manager.ts b/src/v2/lib/managers/asset-category/asset-category-manager.ts index fbd4027..cd9d2ed 100644 --- a/src/v2/lib/managers/asset-category/asset-category-manager.ts +++ b/src/v2/lib/managers/asset-category/asset-category-manager.ts @@ -22,7 +22,7 @@ export class AssetCategoryManager { * @param assetCategoryId - The unique ID of the asset category to retrieve. * @returns A promise that resolves to the retrieved asset category. */ - async getAssetCategoryById(assetCategoryId: string) { + public async getAssetCategoryById(assetCategoryId: string) { const foundAssetCategory = await this.drizzle .select() .from(assetCategory) @@ -40,7 +40,7 @@ export class AssetCategoryManager { * Retrieves a list of all asset categories. * @returns A promise that resolves to an array of asset categories. */ - async listAssetCategories() { + public async listAssetCategories() { const assetCategories = await this.drizzle.select().from(assetCategory) return assetCategories @@ -51,7 +51,7 @@ export class AssetCategoryManager { * @param assetCategoryName - The partial name to search for within asset categories. * @returns A promise that resolves to an array of matching asset categories. */ - async getAssetCategoriesByPartialName(assetCategoryName: string) { + public async getAssetCategoriesByPartialName(assetCategoryName: string) { const assetCategories = await this.drizzle .select() .from(assetCategory) @@ -65,7 +65,7 @@ export class AssetCategoryManager { * @param newAssetCategory - The new asset category to create, adhering to the insertAssetCategorySchema. * @returns A promise that resolves to the created asset category. */ - async createAssetCategory( + public async createAssetCategory( newAssetCategory: z.infer ) { const createdAssetCategory = await this.drizzle @@ -86,7 +86,7 @@ export class AssetCategoryManager { * @param assetCategoryId - The ID of the asset category to delete. * @returns A promise that resolves to the deleted asset category. */ - async deleteAssetCategory(assetCategoryId: string) { + public async deleteAssetCategory(assetCategoryId: string) { const deletedAssetCategory = await this.drizzle .delete(assetCategory) .where(eq(assetCategory.id, assetCategoryId)) @@ -101,7 +101,7 @@ export class AssetCategoryManager { * @param newAssetCategory - The updated asset category data, adhering to the insertAssetCategorySchema. * @returns A promise that resolves to the updated asset category. */ - async updateAssetCategory( + public async updateAssetCategory( assetCategoryId: string, newAssetCategory: z.infer ) { diff --git a/src/v2/lib/managers/asset-category/game-asset-category-manager.ts b/src/v2/lib/managers/asset-category/game-asset-category-manager.ts index 6378b95..38bd14a 100644 --- a/src/v2/lib/managers/asset-category/game-asset-category-manager.ts +++ b/src/v2/lib/managers/asset-category/game-asset-category-manager.ts @@ -14,7 +14,10 @@ export class GameAssetCategoryManager { * @param gameId - The ID of the game to which the asset category will be linked. * @returns A promise that resolves to the created game asset category. */ - async linkAssetCategoryToGame(assetCategoryId: string, gameId: string) { + public async linkAssetCategoryToGame( + assetCategoryId: string, + gameId: string + ) { const createdGameAssetCategory = await this.drizzle .insert(gameAssetCategory) .values({ @@ -31,7 +34,10 @@ export class GameAssetCategoryManager { * @param gameId - The ID of the game from which the asset category will be unlinked. * @returns A promise that resolves to the deleted game asset category. */ - async unlinkAssetCategoryFromGame(assetCategoryId: string, gameId: string) { + public async unlinkAssetCategoryFromGame( + assetCategoryId: string, + gameId: string + ) { const deletedGameAssetCategory = await this.drizzle .delete(gameAssetCategory) .where( diff --git a/src/v2/lib/managers/asset/asset-manager.ts b/src/v2/lib/managers/asset/asset-manager.ts index 1e06c8c..086d021 100644 --- a/src/v2/lib/managers/asset/asset-manager.ts +++ b/src/v2/lib/managers/asset/asset-manager.ts @@ -74,7 +74,7 @@ export class AssetManager { * @param assetId - The unique ID of the asset to retrieve. * @returns A promise that resolves to the retrieved asset, its game, category and tags. */ - async getAssetById(assetId: number) { + public async getAssetById(assetId: number) { const foundAsset = await this.drizzle .select() .from(asset) @@ -94,7 +94,7 @@ export class AssetManager { * Retrieves a list of all assets. * @returns A promise that resolves to an array of assets. */ - async listAssets() { + public async listAssets() { const assets = await this.drizzle.select().from(asset) return assets @@ -105,7 +105,7 @@ export class AssetManager { * @param query - An object containing optional search parameters. * @returns A promise that resolves to an array of matching assets. */ - async searchAssets(query: AssetSearchQuery) { + public async searchAssets(query: AssetSearchQuery) { const { name, game, category, tag, limit } = query const assetLimit = limit ?? 500 @@ -168,7 +168,7 @@ export class AssetManager { * @param file - The File object representing the asset to be uploaded. * @returns A promise that resolves to the created asset. */ - async createAsset( + public async createAsset( userId: string, newAsset: z.infer, bucket: R2Bucket, diff --git a/src/v2/lib/managers/collection/collection-manager.ts b/src/v2/lib/managers/collection/collection-manager.ts new file mode 100644 index 0000000..a1cdd49 --- /dev/null +++ b/src/v2/lib/managers/collection/collection-manager.ts @@ -0,0 +1,202 @@ +import { DrizzleInstance } from "@/v2/db/turso" +import { userCollection, userCollectionAsset } from "@/v2/db/schema" +import { eq, like, and } from "drizzle-orm" +import { z } from "zod" + +const insertCollectionSchema = z.object({ + name: z.string(), + description: z.string(), + isPublic: z.boolean(), +}) + +/** + * Manages operations related to collections. + */ +export class CollectionManager { + constructor(private drizzle: DrizzleInstance) {} + + /** + * Retrieves a collection by its ID. + * @param collectionId - The unique ID of the collection to retrieve. + * @returns A promise that resolves to the retrieved collection. + */ + public async getCollectionById( + collectionId: string, + currentUserId?: string + ) { + const foundCollection = await this.drizzle + .select() + .from(userCollection) + .leftJoin( + userCollectionAsset, + eq(userCollectionAsset.collectionId, collectionId) + ) + .where( + and( + currentUserId + ? eq(userCollection.userId, currentUserId) + : eq(userCollection.isPublic, 1), + eq(userCollection.id, collectionId) + ) + ) + + return foundCollection[0] + } + + /** + * Retrieves a list of all collections. + * @returns A promise that resolves to an array of collections. + */ + public async listCollections(currentUserId?: string) { + const collections = await this.drizzle + .select() + .from(userCollection) + .where( + currentUserId + ? eq(userCollection.userId, currentUserId) + : eq(userCollection.isPublic, 1) + ) + + return collections + } + + /** + * Retrieves collections with partial name matching. + * @param collectionName - The partial name to search for within collections. + * @returns A promise that resolves to an array of matching collections. + */ + public async getCollectionsByPartialName( + collectionName: string, + currentUserId?: string + ) { + const collections = await this.drizzle + .select() + .from(userCollection) + .where( + and( + currentUserId + ? eq(userCollection.userId, currentUserId) + : eq(userCollection.isPublic, 1), + like(userCollection.name, `%${collectionName}%`) + ) + ) + + return collections + } + + /** + * Retrieves public collections for a specific user. + * @param userId - The ID of the user. + * @returns The list of public collections associated with the user. + */ + public async getCollectionsByUserId( + userId: string, + currentUserId?: string + ) { + const collections = await this.drizzle + .select() + .from(userCollection) + .where( + and( + currentUserId + ? eq(userCollection.userId, currentUserId) + : eq(userCollection.isPublic, 1), + eq(userCollection.userId, userId) + ) + ) + + return collections + } + + /** + * Removes an asset from a collection. + * @param collectionId - The ID of the collection. + * @param assetId - The ID of the asset to remove. + */ + public async removeAssetFromCollection( + collectionId: string, + assetId: number + ) { + await this.drizzle + .delete(userCollectionAsset) + .where( + and( + eq(userCollectionAsset.collectionId, collectionId), + eq(userCollectionAsset.assetId, assetId) + ) + ) + } + + /** + * Deletes a collection by its ID. + * @param collectionId - The ID of the collection to delete. + */ + public async deleteCollection(collectionId: string) { + await this.drizzle + .delete(userCollection) + .where(eq(userCollection.id, collectionId)) + } + + /** + * Adds an asset to a collection. + * @param collectionId - The ID of the collection. + * @param assetId - The ID of the asset to add. + */ + public async addAssetToCollection(collectionId: string, assetId: number) { + await this.drizzle.insert(userCollectionAsset).values({ + collectionId: collectionId, + assetId: assetId, + }) + } + + /** + * Creates a new collection. + * @param userId - The ID of the user creating the collection. + * @param collectionSchema - The schema for the new collection. + * @returns The created collection. + */ + public async createCollection( + userId: string, + collectionSchema: z.infer + ) { + const createdCollection = await this.drizzle + .insert(userCollection) + .values({ + userId: userId, + description: collectionSchema.description, + name: collectionSchema.name, + isPublic: collectionSchema.isPublic ? 1 : 0, + }) + .returning({ + collectionId: userCollection.id, + }) + + return createdCollection + } + + /** + * Updates an existing collection. + * + * @param collectionId - The ID of the collection to update. + * @param collectionSchema - The updated schema for the collection. + * @returns The updated collection. + */ + public async updateCollection( + collectionId: string, + collectionSchema: z.infer + ) { + const updatedCollection = await this.drizzle + .update(userCollection) + .set({ + description: collectionSchema.description, + name: collectionSchema.name, + isPublic: collectionSchema.isPublic ? 1 : 0, + }) + .where(eq(userCollection.id, collectionId)) + .returning({ + collectionId: userCollection.id, + }) + + return updatedCollection + } +} diff --git a/src/v2/lib/managers/favorite/favorite-manager.ts b/src/v2/lib/managers/favorite/favorite-manager.ts new file mode 100644 index 0000000..03df0e5 --- /dev/null +++ b/src/v2/lib/managers/favorite/favorite-manager.ts @@ -0,0 +1,91 @@ +import { userFavorite, userFavoriteAsset } from "@/v2/db/schema" +import { eq, and } from "drizzle-orm" +import { DrizzleInstance } from "@/v2/db/turso" + +/** + * Manages operations related to user favorites. + */ +export class FavoriteManager { + constructor(private drizzle: DrizzleInstance) {} + + /** + * Get a user's favorite assets. + * @param userId - The ID of the user to retrieve favorites for. + * @param currentUserId - The optional current user's ID. + * @returns A user's favorite item. + */ + public async getUserFavorite(userId: string, currentUserId?: string) { + const favorite = await this.drizzle + .select() + .from(userFavorite) + .leftJoin( + userFavoriteAsset, + eq(userFavoriteAsset.userFavoriteId, userFavorite.id) + ) + .where( + and( + currentUserId + ? eq(userFavorite.userId, currentUserId) + : eq(userFavorite.isPublic, 1), + eq(userFavorite.userId, userId) + ) + ) + + return favorite[0] + } + + /** + * Create initial user favorite (1 per user!) + * @param userId - The ID of the user to create favorites for. + * @returns A user's favorite item. + */ + public async createInitialFavorite(userId: string) { + const favorite = await this.drizzle + .insert(userFavorite) + .values({ + userId: userId, + }) + .returning() + + return favorite[0] + } + + /** + * Adds an asset to a user's favorites. + * @param assetId - The ID of the asset to add to favorites. + * @param userFavoriteId - User's unique favorite ID. + */ + public async addAssetToFavorites(assetId: number, userFavoriteId: string) { + const favorite = await this.drizzle + .insert(userFavoriteAsset) + .values({ + userFavoriteId: userFavoriteId, + assetId: assetId, + }) + .returning() + + return favorite + } + + /** + * Removes an asset from a user's favorites. + * @param assetId - The ID of the asset to remove from favorites. + * @param userFavoriteId - User's unique favorite ID. + */ + public async removeAssetFromFavorites( + assetId: number, + userFavoriteId: string + ) { + const favorite = await this.drizzle + .delete(userFavoriteAsset) + .where( + and( + eq(userFavoriteAsset.userFavoriteId, userFavoriteId), + eq(userFavoriteAsset.assetId, assetId) + ) + ) + .returning() + + return favorite + } +} diff --git a/src/v2/lib/managers/game/game-manager.ts b/src/v2/lib/managers/game/game-manager.ts index 4185ee2..74772db 100644 --- a/src/v2/lib/managers/game/game-manager.ts +++ b/src/v2/lib/managers/game/game-manager.ts @@ -13,7 +13,7 @@ export class GameManager { * @param gameId - The unique ID of the game to retrieve. * @returns A promise that resolves to the retrieved game and its asset categories. */ - async getGameById(gameId: string) { + public async getGameById(gameId: string) { const foundGame = await this.drizzle .select() .from(game) @@ -32,7 +32,7 @@ export class GameManager { * @param gameName - The partial name to search for within game names. * @returns A promise that resolves to an array of matching games. */ - async getGamesByPartialName(gameName: string) { + public async getGamesByPartialName(gameName: string) { const games = await this.drizzle .select() .from(game) @@ -40,4 +40,15 @@ export class GameManager { return games } + + /** + * Retrieves a list of all games. + * @returns A promise that resolves to an array of games. + */ + + public async listGames() { + const games = await this.drizzle.select().from(game) + + return games + } } diff --git a/src/v2/lib/managers/tag/tag-manager.ts b/src/v2/lib/managers/tag/tag-manager.ts index 24880fd..ea56385 100644 --- a/src/v2/lib/managers/tag/tag-manager.ts +++ b/src/v2/lib/managers/tag/tag-manager.ts @@ -22,7 +22,7 @@ export class TagManager { * @param tagId - The unique ID of the tag to retrieve. * @returns A promise that resolves to the retrieved asset tag. */ - async getTagById(tagId: string) { + public async getTagById(tagId: string) { const foundTag = await this.drizzle .select() .from(assetTag) @@ -37,7 +37,7 @@ export class TagManager { * Retrieves a list of all asset tags. * @returns A promise that resolves to an array of asset tags. */ - async listTags() { + public async listTags() { const tags = await this.drizzle.select().from(assetTag) return tags @@ -48,7 +48,7 @@ export class TagManager { * @param tagName - The partial name to search for within asset tags. * @returns A promise that resolves to an array of matching asset tags. */ - async getTagsByPartialName(tagName: string) { + public async getTagsByPartialName(tagName: string) { const tags = await this.drizzle .select() .from(assetTag) @@ -62,7 +62,7 @@ export class TagManager { * @param newTag - The new asset tag to create, adhering to the insertAssetTagSchema. * @returns A promise that resolves to the created asset tag. */ - async createTag(newTag: z.infer) { + public async createTag(newTag: z.infer) { const createdTag = await this.drizzle.insert(assetTag).values({ id: newTag.name, name: newTag.name, diff --git a/src/v2/lib/managers/user/user-follow-manager.ts b/src/v2/lib/managers/user/user-follow-manager.ts index e86d943..8b232b4 100644 --- a/src/v2/lib/managers/user/user-follow-manager.ts +++ b/src/v2/lib/managers/user/user-follow-manager.ts @@ -15,7 +15,7 @@ export class UserFollowManager { * @param followingId - The ID of the user being followed. * @returns The user networking object representing the follow relationship. */ - async followUser(followerId: string, followingId: string) { + public async followUser(followerId: string, followingId: string) { const networking = await this.drizzle .insert(userNetworking) .values({ @@ -35,7 +35,7 @@ export class UserFollowManager { * @param followingId - The ID of the user being unfollowed. * @returns The user networking object representing the removed follow relationship. */ - async unfollowUser(followerId: string, followingId: string) { + public async unfollowUser(followerId: string, followingId: string) { const networking = await this.drizzle .delete(userNetworking) .where( @@ -55,7 +55,7 @@ export class UserFollowManager { * @param userId - The ID of the user for whom to retrieve followers. * @returns An array of user networking objects representing followers. */ - async getFollowers(userId: string) { + public async getFollowers(userId: string) { const followers = await this.drizzle .select() .from(userNetworking) diff --git a/src/v2/lib/managers/user/user-profile-manager.ts b/src/v2/lib/managers/user/user-profile-manager.ts index 01dd36e..6190ae4 100644 --- a/src/v2/lib/managers/user/user-profile-manager.ts +++ b/src/v2/lib/managers/user/user-profile-manager.ts @@ -30,7 +30,7 @@ export class UserProfileManager { * @returns The updated user object. * @throws Error if the provided attributes are invalid. */ - async updateUserAttributes( + public async updateUserAttributes( userId: string, attributes: z.infer ) { @@ -55,7 +55,11 @@ export class UserProfileManager { * @param file - The new profile picture file. * @returns The URL of the updated profile picture. */ - async updateProfilePicture(userId: string, bucket: R2Bucket, file: File) { + public async updateProfilePicture( + userId: string, + bucket: R2Bucket, + file: File + ) { const { key } = await bucket.put(`/avatars/${userId}.png`, file) const user = await this.drizzle @@ -75,7 +79,7 @@ export class UserProfileManager { * @param file - The new banner image file. * @returns The URL of the updated banner image. */ - async updateBanner(userId: string, bucket: R2Bucket, file: File) { + public async updateBanner(userId: string, bucket: R2Bucket, file: File) { const { key } = await bucket.put(`/banners/${userId}.png`, file) const user = await this.drizzle @@ -94,7 +98,7 @@ export class UserProfileManager { * @param bucket - The R2Bucket where the picture is stored. * @returns The URL of the reset profile picture (null). */ - async resetProfilePicture(userId: string, bucket: R2Bucket) { + public async resetProfilePicture(userId: string, bucket: R2Bucket) { await bucket.delete(`/avatars/${userId}.png`) const user = await this.drizzle @@ -113,7 +117,7 @@ export class UserProfileManager { * @param bucket - The R2Bucket where the banner image is stored. * @returns The URL of the reset banner image (null). */ - async resetBanner(userId: string, bucket: R2Bucket) { + public async resetBanner(userId: string, bucket: R2Bucket) { await bucket.delete(`/banners/${userId}.png`) const user = await this.drizzle diff --git a/src/v2/lib/managers/user/user-search-manager.ts b/src/v2/lib/managers/user/user-search-manager.ts index 87066c2..88d755b 100644 --- a/src/v2/lib/managers/user/user-search-manager.ts +++ b/src/v2/lib/managers/user/user-search-manager.ts @@ -14,7 +14,7 @@ export class UserSearchManager { * @param userId - The ID of the user to retrieve. * @returns The user object or undefined if not found. */ - async getUserById(userId: string) { + public async getUserById(userId: string) { const user = await this.drizzle .select() .from(authUser) @@ -29,7 +29,7 @@ export class UserSearchManager { * @param username - The username of the user to retrieve. * @returns The user object or undefined if not found. */ - async getUserByUsername(username: string) { + public async getUserByUsername(username: string) { const user = await this.drizzle .select() .from(authUser) @@ -44,7 +44,7 @@ export class UserSearchManager { * @param username - The partial username to search for. * @returns An array of user objects matching the search criteria, limited to 25 results. */ - async getUsersByUsername(username: string) { + public async getUsersByUsername(username: string) { const users = await this.drizzle .select() .from(authUser) From 989176e8aa81b7bdd404e8e1ebdf7bff16069930 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Mon, 6 Nov 2023 04:11:44 +0000 Subject: [PATCH 148/318] init restructure, swagger/openapi --- package.json | 1 + pnpm-lock.yaml | 14 ++ src/default/routes/main-routes.ts | 21 -- src/index.ts | 46 ++-- src/v2/routes/asset/asset-routes.ts | 16 -- src/v2/routes/asset/download-asset.ts | 41 ---- src/v2/routes/asset/get-asset-from-id.ts | 71 ------ src/v2/routes/asset/route.ts | 0 src/v2/routes/asset/search/[id]/route.ts | 0 src/v2/routes/asset/search/all/route.ts | 0 src/v2/routes/asset/upload/route.ts | 0 .../asset-categories/asset-category-routes.ts | 24 -- .../asset-categories/create-asset-category.ts | 68 ------ .../asset-categories/delete-asset-category.ts | 80 ------- src/v2/routes/auth/assets/approve-asset.ts | 58 ----- src/v2/routes/auth/assets/asset-routes.ts | 39 ---- .../collections/add-asset-to-collection.ts | 117 ---------- .../assets/collections/collections-routes.ts | 44 ---- .../collections/create-asset-collection.ts | 81 ------- .../collections/delete-asset-collection.ts | 67 ------ .../delete-asset-from-collection.ts | 122 ---------- .../collections/view-asset-collection.ts | 71 ------ .../collections/view-asset-collections.ts | 44 ---- .../assets/favorite/add-favorite-asset.ts | 96 -------- .../assets/favorite/favorite-asset-routes.ts | 29 --- .../assets/favorite/remove-favorite-asset.ts | 100 --------- .../assets/favorite/view-favorite-assets.ts | 40 ---- .../auth/assets/get-unapproved-assets.ts | 40 ---- src/v2/routes/auth/assets/modify-asset.ts | 130 ----------- src/v2/routes/auth/assets/upload-asset.ts | 208 ------------------ src/v2/routes/auth/auth-routes.ts | 61 ----- src/v2/routes/auth/games/create-game.ts | 55 ----- src/v2/routes/auth/games/delete-game.ts | 50 ----- src/v2/routes/auth/games/game-routes.ts | 24 -- src/v2/routes/auth/login-methods/discord.ts | 145 ------------ src/v2/routes/auth/login.ts | 100 --------- src/v2/routes/auth/logout.ts | 17 -- .../delete-oc-generator-response.ts | 66 ------ .../auth/oc-generators/oc-generator-routes.ts | 29 --- .../save-oc-generator-response.ts | 119 ---------- .../view-oc-generator-response.ts | 38 ---- src/v2/routes/auth/reset-password.ts | 152 ------------- src/v2/routes/auth/signup.ts | 169 -------------- src/v2/routes/auth/tags/create-tag.ts | 78 ------- src/v2/routes/auth/tags/delete-tag.ts | 55 ----- src/v2/routes/auth/tags/tag-routes.ts | 24 -- .../self-upload/upload-avatar.ts | 69 ------ .../self-upload/upload-banner.ts | 76 ------- .../user-attributes/update-user-attributes.ts | 87 -------- .../user-attributes/user-attributes-routes.ts | 39 ---- .../user-relations/follow-user.ts | 78 ------- .../user-relations/unfollow-user.ts | 85 ------- src/v2/routes/auth/validate.ts | 30 --- src/v2/routes/auth/verify-email.ts | 49 ----- src/v2/routes/discord/contributors.ts | 69 ------ src/v2/routes/discord/discord-routes.ts | 10 - src/v2/routes/game/route.ts | 0 src/v2/routes/game/search/[id]/route.ts | 0 src/v2/routes/game/search/[name]/route.ts | 0 src/v2/routes/game/search/all/route.ts | 0 src/v2/routes/games/all-games.ts | 53 ----- src/v2/routes/games/games-routes.ts | 10 - src/v2/routes/oc-generators/get-generator.ts | 39 ---- src/v2/routes/oc-generators/get-generators.ts | 42 ---- .../oc-generators/oc-generator-routes.ts | 15 -- src/v2/routes/route.ts | 8 + src/v2/routes/search/all/search-all.ts | 124 ----------- src/v2/routes/search/asset/recent-assets.ts | 36 --- src/v2/routes/search/asset/search-assets.ts | 92 -------- src/v2/routes/search/search-routes.ts | 48 ---- .../search/user/get-user-by-username.ts | 64 ------ .../routes/search/user/get-users-by-search.ts | 48 ---- src/v2/routes/tags/all-tags.ts | 32 --- src/v2/routes/tags/get-tag-by-id.ts | 32 --- src/v2/routes/tags/get-tag-by-name.ts | 32 --- src/v2/routes/tags/tags-routes.ts | 20 -- src/v2/routes/user/route.ts | 18 ++ src/v2/routes/user/search/[id]/openapi.ts | 19 ++ src/v2/routes/user/search/[id]/route.ts | 20 ++ src/v2/routes/user/search/[id]/schema.ts | 12 + src/v2/routes/user/search/[name]/openapi.ts | 19 ++ src/v2/routes/user/search/[name]/route.ts | 20 ++ src/v2/routes/user/search/[name]/schema.ts | 12 + src/v2/routes/user/search/route.ts | 10 + src/worker-configuration.d.ts | 7 +- 85 files changed, 180 insertions(+), 4094 deletions(-) delete mode 100644 src/default/routes/main-routes.ts delete mode 100644 src/v2/routes/asset/asset-routes.ts delete mode 100644 src/v2/routes/asset/download-asset.ts delete mode 100644 src/v2/routes/asset/get-asset-from-id.ts create mode 100644 src/v2/routes/asset/route.ts create mode 100644 src/v2/routes/asset/search/[id]/route.ts create mode 100644 src/v2/routes/asset/search/all/route.ts create mode 100644 src/v2/routes/asset/upload/route.ts delete mode 100644 src/v2/routes/auth/asset-categories/asset-category-routes.ts delete mode 100644 src/v2/routes/auth/asset-categories/create-asset-category.ts delete mode 100644 src/v2/routes/auth/asset-categories/delete-asset-category.ts delete mode 100644 src/v2/routes/auth/assets/approve-asset.ts delete mode 100644 src/v2/routes/auth/assets/asset-routes.ts delete mode 100644 src/v2/routes/auth/assets/collections/add-asset-to-collection.ts delete mode 100644 src/v2/routes/auth/assets/collections/collections-routes.ts delete mode 100644 src/v2/routes/auth/assets/collections/create-asset-collection.ts delete mode 100644 src/v2/routes/auth/assets/collections/delete-asset-collection.ts delete mode 100644 src/v2/routes/auth/assets/collections/delete-asset-from-collection.ts delete mode 100644 src/v2/routes/auth/assets/collections/view-asset-collection.ts delete mode 100644 src/v2/routes/auth/assets/collections/view-asset-collections.ts delete mode 100644 src/v2/routes/auth/assets/favorite/add-favorite-asset.ts delete mode 100644 src/v2/routes/auth/assets/favorite/favorite-asset-routes.ts delete mode 100644 src/v2/routes/auth/assets/favorite/remove-favorite-asset.ts delete mode 100644 src/v2/routes/auth/assets/favorite/view-favorite-assets.ts delete mode 100644 src/v2/routes/auth/assets/get-unapproved-assets.ts delete mode 100644 src/v2/routes/auth/assets/modify-asset.ts delete mode 100644 src/v2/routes/auth/assets/upload-asset.ts delete mode 100644 src/v2/routes/auth/auth-routes.ts delete mode 100644 src/v2/routes/auth/games/create-game.ts delete mode 100644 src/v2/routes/auth/games/delete-game.ts delete mode 100644 src/v2/routes/auth/games/game-routes.ts delete mode 100644 src/v2/routes/auth/login-methods/discord.ts delete mode 100644 src/v2/routes/auth/login.ts delete mode 100644 src/v2/routes/auth/logout.ts delete mode 100644 src/v2/routes/auth/oc-generators/delete-oc-generator-response.ts delete mode 100644 src/v2/routes/auth/oc-generators/oc-generator-routes.ts delete mode 100644 src/v2/routes/auth/oc-generators/save-oc-generator-response.ts delete mode 100644 src/v2/routes/auth/oc-generators/view-oc-generator-response.ts delete mode 100644 src/v2/routes/auth/reset-password.ts delete mode 100644 src/v2/routes/auth/signup.ts delete mode 100644 src/v2/routes/auth/tags/create-tag.ts delete mode 100644 src/v2/routes/auth/tags/delete-tag.ts delete mode 100644 src/v2/routes/auth/tags/tag-routes.ts delete mode 100644 src/v2/routes/auth/user-attributes/self-upload/upload-avatar.ts delete mode 100644 src/v2/routes/auth/user-attributes/self-upload/upload-banner.ts delete mode 100644 src/v2/routes/auth/user-attributes/update-user-attributes.ts delete mode 100644 src/v2/routes/auth/user-attributes/user-attributes-routes.ts delete mode 100644 src/v2/routes/auth/user-attributes/user-relations/follow-user.ts delete mode 100644 src/v2/routes/auth/user-attributes/user-relations/unfollow-user.ts delete mode 100644 src/v2/routes/auth/validate.ts delete mode 100644 src/v2/routes/auth/verify-email.ts delete mode 100644 src/v2/routes/discord/contributors.ts delete mode 100644 src/v2/routes/discord/discord-routes.ts create mode 100644 src/v2/routes/game/route.ts create mode 100644 src/v2/routes/game/search/[id]/route.ts create mode 100644 src/v2/routes/game/search/[name]/route.ts create mode 100644 src/v2/routes/game/search/all/route.ts delete mode 100644 src/v2/routes/games/all-games.ts delete mode 100644 src/v2/routes/games/games-routes.ts delete mode 100644 src/v2/routes/oc-generators/get-generator.ts delete mode 100644 src/v2/routes/oc-generators/get-generators.ts delete mode 100644 src/v2/routes/oc-generators/oc-generator-routes.ts create mode 100644 src/v2/routes/route.ts delete mode 100644 src/v2/routes/search/all/search-all.ts delete mode 100644 src/v2/routes/search/asset/recent-assets.ts delete mode 100644 src/v2/routes/search/asset/search-assets.ts delete mode 100644 src/v2/routes/search/search-routes.ts delete mode 100644 src/v2/routes/search/user/get-user-by-username.ts delete mode 100644 src/v2/routes/search/user/get-users-by-search.ts delete mode 100644 src/v2/routes/tags/all-tags.ts delete mode 100644 src/v2/routes/tags/get-tag-by-id.ts delete mode 100644 src/v2/routes/tags/get-tag-by-name.ts delete mode 100644 src/v2/routes/tags/tags-routes.ts create mode 100644 src/v2/routes/user/route.ts create mode 100644 src/v2/routes/user/search/[id]/openapi.ts create mode 100644 src/v2/routes/user/search/[id]/route.ts create mode 100644 src/v2/routes/user/search/[id]/schema.ts create mode 100644 src/v2/routes/user/search/[name]/openapi.ts create mode 100644 src/v2/routes/user/search/[name]/route.ts create mode 100644 src/v2/routes/user/search/[name]/schema.ts create mode 100644 src/v2/routes/user/search/route.ts diff --git a/package.json b/package.json index a6ce9b3..f1f29ad 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ }, "private": true, "dependencies": { + "@hono/swagger-ui": "^0.1.0", "@hono/zod-openapi": "^0.7.2", "@libsql/client": "0.3.5", "@lucia-auth/adapter-session-unstorage": "^2.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fd5dd89..2090b48 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,6 +5,9 @@ settings: excludeLinksFromLockfile: false dependencies: + "@hono/swagger-ui": + specifier: ^0.1.0 + version: 0.1.0(hono@3.8.0) "@hono/zod-openapi": specifier: ^0.7.2 version: 0.7.2(hono@3.8.0)(zod@3.22.4) @@ -881,6 +884,17 @@ packages: } engines: { node: ">=14" } + /@hono/swagger-ui@0.1.0(hono@3.8.0): + resolution: + { + integrity: sha512-W5WEEhk2QtiqdSfM40FcK98Q5Bz4H/NfNqBUSkcZ46ys+DG4wt1yGsmRZgdJMje6t5Vn8eFN+9nyO+/dAp3drA==, + } + peerDependencies: + hono: "*" + dependencies: + hono: 3.8.0 + dev: false + /@hono/zod-openapi@0.7.2(hono@3.8.0)(zod@3.22.4): resolution: { diff --git a/src/default/routes/main-routes.ts b/src/default/routes/main-routes.ts deleted file mode 100644 index 77553a5..0000000 --- a/src/default/routes/main-routes.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Hono } from "hono" -import { getRuntimeKey } from "hono/adapter" - -const mainRoute = new Hono<{ Bindings: Bindings }>() - -mainRoute.get("/status", (c) => { - return c.json( - { - success: "true", - status: "ok", - runtime: getRuntimeKey(), - }, - 200 - ) -}) - -mainRoute.get("/", (c) => { - return c.json({ success: "true", status: "ok" }, 200) -}) - -export default mainRoute diff --git a/src/index.ts b/src/index.ts index 4b93a8b..b1fb542 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,31 +1,27 @@ -import { Hono } from "hono" -import assetRoute from "./v2/routes/asset/asset-routes" -import discordRoute from "./v2/routes/discord/discord-routes" -import ocGeneratorRoute from "./v2/routes/oc-generators/oc-generator-routes" -import gamesRoute from "./v2/routes/games/games-routes" -import authRoute from "./v2/routes/auth/auth-routes" -import searchRoute from "./v2/routes/search/search-routes" -import tagsRoute from "./v2/routes/tags/tags-routes" -import mainRoute from "./default/routes/main-routes" +import { OpenAPIHono } from "@hono/zod-openapi" +import { swaggerUI } from "@hono/swagger-ui" +import { prettyJSON } from 'hono/pretty-json' +import BaseRoutes from '@/v2/routes/route' -const app = new Hono<{ Bindings: Bindings }>() +const app = new OpenAPIHono<{ Bindings: Bindings, Variables: Variables }>() -app.route("/", mainRoute) -app.route("/v2/asset", assetRoute) -app.route("/v2/discord", discordRoute) -app.route("/v2/oc-generators", ocGeneratorRoute) -app.route("/v2/search", searchRoute) -app.route("/v2/games", gamesRoute) -app.route("/v2/auth", authRoute) -app.route("/v2/tags", tagsRoute) -app.all("*", (c) => { - return c.json( - { success: false, status: "error", error: "route doesn't exist" }, - 404 - ) +app.route("/v2", BaseRoutes) + +app.doc("/openapi", { + openapi: "3.1.0", + info: { + version: "1.0.0", + title: "api.wanderer.moe", + }, }) -// https://hono.dev/api/hono#showroutes -app.showRoutes() +app.get( + "/docs", + swaggerUI({ + url: "/openapi", + }) +) + +app.use("*", prettyJSON()) export default app diff --git a/src/v2/routes/asset/asset-routes.ts b/src/v2/routes/asset/asset-routes.ts deleted file mode 100644 index 17aaecf..0000000 --- a/src/v2/routes/asset/asset-routes.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Hono } from "hono" -import { getAssetFromId } from "./get-asset-from-id" -import { downloadAsset } from "./download-asset" - -const assetRoute = new Hono<{ Bindings: Bindings }>() - -assetRoute.get("/:id", async (c) => { - return getAssetFromId(c) -}) - -// setting both of these to id returns "duplicate param name" error, will fix later -assetRoute.get("/download/:assetId", async (c) => { - return downloadAsset(c) -}) - -export default assetRoute diff --git a/src/v2/routes/asset/download-asset.ts b/src/v2/routes/asset/download-asset.ts deleted file mode 100644 index fe2631d..0000000 --- a/src/v2/routes/asset/download-asset.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { getConnection } from "@/v2/db/turso" -import { eq } from "drizzle-orm" -import { asset } from "@/v2/db/schema" - -export async function downloadAsset(c: APIContext): Promise { - const { assetId } = c.req.param() - - const { drizzle } = getConnection(c.env) - - const foundAsset = await drizzle.query.asset.findFirst({ - where: (asset, { eq }) => eq(asset.id, parseInt(assetId)), - }) - - if (!foundAsset) { - return c.json({ success: false, state: "asset not found" }, 200) - } - - try { - await drizzle - .update(asset) - .set({ downloadCount: foundAsset.downloadCount + 1 }) - .where(eq(asset.id, parseInt(assetId))) - .execute() - } catch (e) { - return c.json( - { success: false, state: "failed to download asset" }, - 500 - ) - } - - const response = await fetch(asset[0].url) - - const blob = await response.blob() - - const headers = new Headers() - headers.set("Content-Disposition", `attachment; filename=${asset[0].name}`) - - return new Response(blob, { - headers: headers, - }) -} diff --git a/src/v2/routes/asset/get-asset-from-id.ts b/src/v2/routes/asset/get-asset-from-id.ts deleted file mode 100644 index 4f5618a..0000000 --- a/src/v2/routes/asset/get-asset-from-id.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { getConnection } from "@/v2/db/turso" -import { asset } from "@/v2/db/schema" -import { desc } from "drizzle-orm" - -export async function getAssetFromId(c: APIContext): Promise { - const { id } = c.req.param() - const cacheKey = new Request(c.req.url.toString(), c.req) - const cache = caches.default - let response = await cache.match(cacheKey) - - if (response) return response - - const { drizzle } = getConnection(c.env) - - const foundAsset = await drizzle.query.asset.findFirst({ - where: (asset, { eq, and }) => - and(eq(asset.status, "approved"), eq(asset.id, parseInt(id))), - with: { - assetTagAsset: { - with: { - assetTag: true, - }, - }, - users: { - columns: { - email: false, - emailVerified: false, - }, - }, - }, - }) - - if (!foundAsset) { - response = c.json( - { - success: false, - status: "not found", - }, - 200 - ) - await cache.put(cacheKey, response.clone()) - return response - } - - await drizzle.update(asset).set({ viewCount: foundAsset.viewCount + 1 }) - - const similarAssets = await drizzle.query.asset.findMany({ - where: (asset, { eq, and }) => - and( - eq(asset.status, "approved"), - eq(asset.assetCategoryId, foundAsset.assetCategoryId) - ), - limit: 6, - orderBy: desc(asset.id), - }) - - response = c.json( - { - success: true, - status: "ok", - asset: foundAsset, - similarAssets: similarAssets ?? [], - }, - 200 - ) - - response.headers.set("Cache-Control", "s-maxage=604800") - await cache.put(cacheKey, response.clone()) - - return response -} diff --git a/src/v2/routes/asset/route.ts b/src/v2/routes/asset/route.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/asset/search/[id]/route.ts b/src/v2/routes/asset/search/[id]/route.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/asset/search/all/route.ts b/src/v2/routes/asset/search/all/route.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/asset/upload/route.ts b/src/v2/routes/asset/upload/route.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/auth/asset-categories/asset-category-routes.ts b/src/v2/routes/auth/asset-categories/asset-category-routes.ts deleted file mode 100644 index 550b0d8..0000000 --- a/src/v2/routes/auth/asset-categories/asset-category-routes.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { createAssetCategory } from "./create-asset-category" -import { deleteAssetCategory } from "./delete-asset-category" -import { Hono } from "hono" -import { cors } from "hono/cors" - -const assetCategoryRoute = new Hono<{ Bindings: Bindings }>() - -assetCategoryRoute.use( - "*", - cors({ - credentials: true, - origin: ["http://localhost:3000"], // TODO: update this - temporary - }) -) - -assetCategoryRoute.post("/create", async (c) => { - return createAssetCategory(c) -}) - -assetCategoryRoute.post("/delete", async (c) => { - return deleteAssetCategory(c) -}) - -export default assetCategoryRoute diff --git a/src/v2/routes/auth/asset-categories/create-asset-category.ts b/src/v2/routes/auth/asset-categories/create-asset-category.ts deleted file mode 100644 index 87a45af..0000000 --- a/src/v2/routes/auth/asset-categories/create-asset-category.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { auth } from "@/v2/lib/auth/lucia" -import { roleFlagsToArray } from "@/v2/lib/helpers/role-flags" -import { getConnection } from "@/v2/db/turso" -import { assetCategory } from "@/v2/db/schema" - -export async function createAssetCategory(c: APIContext): Promise { - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "unauthorized" }, 401) - } - - const roleFlags = roleFlagsToArray(session.user.roleFlags) - - if (!roleFlags.includes("CREATOR")) { - return c.json({ success: false, state: "unauthorized" }, 401) - } - - const { drizzle } = getConnection(c.env) - - const formData = await c.req.formData() - - const newAssetCategory = { - id: crypto.randomUUID(), - name: formData.get("name") as string, - formattedName: formData.get("formattedName") as string, - assetCount: 0, - lastUpdated: new Date().toISOString(), - } - - // check if assetCategory.name exists - const assetCategoryExists = await drizzle.query.assetCategory.findFirst({ - where: (assetCategory, { eq }) => - eq(assetCategory.name, assetCategory.name), - }) - - if (assetCategoryExists) { - return c.json( - { - success: false, - state: "assetCategory with name already exists", - }, - 200 - ) - } - - try { - await drizzle.insert(assetCategory).values(newAssetCategory).execute() - } catch (e) { - return c.json( - { - success: false, - state: "failed to create assetCategory", - }, - 500 - ) - } - - return c.json( - { success: true, state: "created assetcategory", assetCategory }, - 200 - ) -} diff --git a/src/v2/routes/auth/asset-categories/delete-asset-category.ts b/src/v2/routes/auth/asset-categories/delete-asset-category.ts deleted file mode 100644 index d833fa8..0000000 --- a/src/v2/routes/auth/asset-categories/delete-asset-category.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { auth } from "@/v2/lib/auth/lucia" -import { roleFlagsToArray } from "@/v2/lib/helpers/role-flags" -import { getConnection } from "@/v2/db/turso" -import { z } from "zod" -import { eq } from "drizzle-orm" -import { assetCategory } from "@/v2/db/schema" - -const DeleteAssetCategorySchema = z.object({ - id: z.string({ - required_error: "ID is required", - invalid_type_error: "ID must be a string", - }), -}) - -export async function deleteAssetCategory(c: APIContext): Promise { - const formData = DeleteAssetCategorySchema.safeParse( - await c.req.formData().then((formData) => { - const data = Object.fromEntries(formData.entries()) - return data - }) - ) - - if (!formData.success) { - return c.json({ success: false, state: "invalid data" }, 400) - } - - const { id } = formData.data - - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "unauthorized" }, 401) - } - - const roleFlags = roleFlagsToArray(session.user.roleFlags) - - if (!roleFlags.includes("CREATOR")) { - return c.json({ success: false, state: "unauthorized" }, 401) - } - - const { drizzle } = getConnection(c.env) - - if (!id) { - return c.json({ success: false, state: "no id entered" }, 200) - } - - // check if assetCategory exists - const assetCategoryExists = await drizzle.query.assetCategory.findFirst({ - where: (assetCategory, { eq }) => eq(assetCategory.id, id), - }) - - if (!assetCategoryExists) { - return c.json( - { - success: false, - state: "assetCategory with ID doesn't exist", - }, - 200 - ) - } - - try { - await drizzle - .delete(assetCategory) - .where(eq(assetCategory.id, id)) - .execute() - } catch (e) { - return c.json( - { success: false, state: "failed to delete assetCategory" }, - 200 - ) - } - - return c.json({ success: true, state: "deleted assetCategory", id }, 200) -} diff --git a/src/v2/routes/auth/assets/approve-asset.ts b/src/v2/routes/auth/assets/approve-asset.ts deleted file mode 100644 index 103edcb..0000000 --- a/src/v2/routes/auth/assets/approve-asset.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { responseHeaders } from "@/v2/lib/response-headers" -import { getConnection } from "@/v2/db/turso" -import { asset, AssetStatus } from "@/v2/db/schema" -import { eq } from "drizzle-orm" - -import { auth } from "@/v2/lib/auth/lucia" -import { roleFlagsToArray } from "@/v2/lib/helpers/role-flags" - -export async function approveAsset(c: APIContext): Promise { - const { assetIdToApprove } = c.req.param() - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "unauthorized" }, 401) - } - - const roleFlags = roleFlagsToArray(session.user.roleFlags) - - if (!roleFlags.includes("CREATOR")) { - return c.json({ success: false, state: "unauthorized" }, 401) - } - - const { drizzle } = getConnection(c.env) - - const foundAsset = await drizzle.query.asset.findFirst({ - where: (asset, { eq }) => eq(asset.id, parseInt(assetIdToApprove)), - }) - - if (!foundAsset || foundAsset.status === "approved") { - c.json( - { success: false, state: "asset not found or already approved" }, - 200 - ) - } - - const updatedAsset = await drizzle - .update(asset) - .set({ - status: "approved" as AssetStatus, - }) - .where(eq(asset.id, parseInt(assetIdToApprove))) - .execute() - - return c.json( - { - success: true, - status: "ok", - updatedAsset, - }, - 200, - responseHeaders - ) -} diff --git a/src/v2/routes/auth/assets/asset-routes.ts b/src/v2/routes/auth/assets/asset-routes.ts deleted file mode 100644 index 1d046ab..0000000 --- a/src/v2/routes/auth/assets/asset-routes.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { approveAsset } from "./approve-asset" -import { getUnapprovedAssets } from "./get-unapproved-assets" -import { modifyAssetData } from "./modify-asset" -import { uploadAsset } from "./upload-asset" -import { Hono } from "hono" -import { cors } from "hono/cors" -import collectionsRoute from "./collections/collections-routes" -import favoriteAssetRoute from "./favorite/favorite-asset-routes" - -const assetRoute = new Hono<{ Bindings: Bindings }>() - -assetRoute.use( - "*", - cors({ - credentials: true, - origin: ["http://localhost:3000"], // TODO: update this - temporary - }) -) - -assetRoute.get("/unapproved", async (c) => { - return getUnapprovedAssets(c) -}) - -assetRoute.post("/approve/:assetIdToApprove", async (c) => { - return approveAsset(c) -}) - -assetRoute.post("/modify/:assetIdToModify", async (c) => { - return modifyAssetData(c) -}) - -assetRoute.post("/upload", async (c) => { - return uploadAsset(c) -}) - -assetRoute.route("/collections", collectionsRoute) -assetRoute.route("/favorite", favoriteAssetRoute) - -export default assetRoute diff --git a/src/v2/routes/auth/assets/collections/add-asset-to-collection.ts b/src/v2/routes/auth/assets/collections/add-asset-to-collection.ts deleted file mode 100644 index 3d36f2d..0000000 --- a/src/v2/routes/auth/assets/collections/add-asset-to-collection.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { auth } from "@/v2/lib/auth/lucia" -import { getConnection } from "@/v2/db/turso" -import { z } from "zod" -import { userCollectionAsset } from "@/v2/db/schema" - -const AddAssetToCollectionSchema = z.object({ - collectionId: z.string({ - required_error: "Collection ID is required", - invalid_type_error: "Collection ID must be a string", - }), - assetId: z.string({ - required_error: "Asset ID is required", - invalid_type_error: "Asset ID must be a string", - }), -}) - -export async function addAssetToCollection(c: APIContext): Promise { - const formData = AddAssetToCollectionSchema.safeParse( - await c.req.formData().then((formData) => { - const data = Object.fromEntries(formData.entries()) - return data - }) - ) - - if (!formData.success) { - return c.json({ success: false, state: "invalid data" }, 400) - } - - const { collectionId, assetId } = formData.data - - const { drizzle } = getConnection(c.env) - - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "invalid session" }, 401) - } - - if (!collectionId) { - return c.json( - { success: false, state: "no collection id entered" }, - 200 - ) - } - - if (!assetId) { - return c.json({ success: false, state: "no asset id entered" }, 200) - } - - // check if collection exists - const collectionExists = await drizzle.query.userCollection.findFirst({ - where: (userCollection, { eq }) => eq(userCollection.id, collectionId), - }) - - if (!collectionExists) { - return c.json( - { - success: false, - state: "collection with ID doesn't exist", - }, - 200 - ) - } - - // check if asset exists, and status is 1 (approved) - const assetExists = await drizzle.query.asset.findFirst({ - where: (asset, { eq, and }) => - and(eq(asset.id, parseInt(assetId)), eq(asset.status, "approved")), - }) - - if (!assetExists) { - return c.json({ success: false, state: "asset not found" }, 200) - } - - // check if userCollectionAsset exists - const userCollectionAssetExists = - await drizzle.query.userCollectionAsset.findFirst({ - where: (userCollectionAsset, { eq, and }) => - and( - eq(userCollectionAsset.collectionId, collectionId), - eq(userCollectionAsset.assetId, parseInt(assetId)) - ), - }) - - if (userCollectionAssetExists) { - return c.json( - { - success: false, - state: "asset already exists in collection", - }, - 200 - ) - } - - // create entry in userCollectionAsset - try { - await drizzle - .insert(userCollectionAsset) - .values({ - collectionId: collectionId, - assetId: parseInt(assetId), - }) - .execute() - } catch (e) { - return c.json( - { success: false, state: "failed to add asset to collection" }, - 500 - ) - } - - return c.json({ success: true, state: "added asset to collection" }, 200) -} diff --git a/src/v2/routes/auth/assets/collections/collections-routes.ts b/src/v2/routes/auth/assets/collections/collections-routes.ts deleted file mode 100644 index e02d5a1..0000000 --- a/src/v2/routes/auth/assets/collections/collections-routes.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { addAssetToCollection } from "./add-asset-to-collection" -import { createAssetCollection } from "./create-asset-collection" -import { deleteAssetCollection } from "./delete-asset-collection" -import { deleteAssetFromCollection } from "./delete-asset-from-collection" -import { viewAssetCollection } from "./view-asset-collection" -import { viewAssetCollections } from "./view-asset-collections" -import { Hono } from "hono" -import { cors } from "hono/cors" - -const collectionsRoute = new Hono<{ Bindings: Bindings }>() - -collectionsRoute.use( - "*", - cors({ - credentials: true, - origin: ["http://localhost:3000"], // TODO: update this - temporary - }) -) - -collectionsRoute.post("/create", async (c) => { - return createAssetCollection(c) -}) - -collectionsRoute.post("/delete", async (c) => { - return deleteAssetCollection(c) -}) - -collectionsRoute.post("/add", async (c) => { - return addAssetToCollection(c) -}) - -collectionsRoute.post("/remove", async (c) => { - return deleteAssetFromCollection(c) -}) - -collectionsRoute.get("/all", async (c) => { - return viewAssetCollections(c) -}) - -collectionsRoute.get("/:collectionId", async (c) => { - return viewAssetCollection(c) -}) - -export default collectionsRoute diff --git a/src/v2/routes/auth/assets/collections/create-asset-collection.ts b/src/v2/routes/auth/assets/collections/create-asset-collection.ts deleted file mode 100644 index 18d3bd1..0000000 --- a/src/v2/routes/auth/assets/collections/create-asset-collection.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { auth } from "@/v2/lib/auth/lucia" -import { getConnection } from "@/v2/db/turso" - -import { userCollection } from "@/v2/db/schema" - -export async function createAssetCollection(c: APIContext): Promise { - const { drizzle } = getConnection(c.env) - - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "invalid session" }, 401) - } - - const formData = await c.req.formData() - - const collection = { - name: formData.get("collectionName") as string | null, - description: formData.get("collectionDescription") as string | null, - } - - if (!collection.name) { - return c.json( - { success: false, state: "no collection name entered" }, - 200 - ) - } - - if (!collection.description) { - return c.json( - { - success: false, - state: "no collection description entered", - }, - 200 - ) - } - - // check if collection exists - const collectionExists = await drizzle.query.userCollection.findFirst({ - where: (userCollection, { eq }) => - eq(userCollection.name, collection.name), - }) - - if (collectionExists) { - return c.json( - { - success: false, - state: "collection with name already exists", - }, - 200 - ) - } - - // create entry in userCollection - try { - await drizzle - .insert(userCollection) - .values({ - id: crypto.randomUUID(), - name: collection.name, - description: collection.description, - userId: session.user.userId, - dateCreated: new Date().toISOString(), - isPublic: 0, // default to private - }) - .execute() - } catch (e) { - return c.json( - { success: false, state: "failed to create collection" }, - 200 - ) - } - - return c.json({ success: true, state: "created collection" }, 200) -} diff --git a/src/v2/routes/auth/assets/collections/delete-asset-collection.ts b/src/v2/routes/auth/assets/collections/delete-asset-collection.ts deleted file mode 100644 index eb124c7..0000000 --- a/src/v2/routes/auth/assets/collections/delete-asset-collection.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { auth } from "@/v2/lib/auth/lucia" -import { getConnection } from "@/v2/db/turso" -import { z } from "zod" -import { eq } from "drizzle-orm" -import { userCollection } from "@/v2/db/schema" - -const DeleteAssetCollectionSchema = z.object({ - collectionId: z.string({ - required_error: "Collection ID is required", - invalid_type_error: "Collection ID must be a string", - }), -}) - -export async function deleteAssetCollection(c: APIContext): Promise { - const formData = DeleteAssetCollectionSchema.safeParse( - await c.req.formData() - ) - - if (!formData.success) { - return c.json({ success: false, state: "invalid data" }, 400) - } - - const { collectionId } = formData.data - - const { drizzle } = getConnection(c.env) - - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "invalid session" }, 401) - } - - if (!collectionId) { - return c.json( - { success: false, state: "no collection id entered" }, - 200 - ) - } - - // check if collection exists - const collectionExists = await drizzle.query.userCollection.findFirst({ - where: (userCollection, { eq }) => eq(userCollection.id, collectionId), - }) - - if (!collectionExists) { - return c.json( - { - success: false, - state: "collection with ID doesn't exist", - }, - 200 - ) - } - - // delete collection - await drizzle - .delete(userCollection) - .where(eq(userCollection.id, collectionId)) - .execute() - - return c.json({ success: true, state: "collection deleted" }, 200) -} diff --git a/src/v2/routes/auth/assets/collections/delete-asset-from-collection.ts b/src/v2/routes/auth/assets/collections/delete-asset-from-collection.ts deleted file mode 100644 index 7ecbe4d..0000000 --- a/src/v2/routes/auth/assets/collections/delete-asset-from-collection.ts +++ /dev/null @@ -1,122 +0,0 @@ -import { auth } from "@/v2/lib/auth/lucia" -import { getConnection } from "@/v2/db/turso" -import { z } from "zod" -import { userCollectionAsset } from "@/v2/db/schema" -import { eq, and } from "drizzle-orm" - -const DeleteAssetFromCollectionSchema = z.object({ - collectionId: z.string({ - required_error: "Collection ID is required", - invalid_type_error: "Collection ID must be a string", - }), - assetId: z.string({ - required_error: "Asset ID is required", - invalid_type_error: "Asset ID must be a string", - }), -}) - -export async function deleteAssetFromCollection( - c: APIContext -): Promise { - const formData = DeleteAssetFromCollectionSchema.safeParse( - await c.req.formData().then((formData) => { - const data = Object.fromEntries(formData.entries()) - return data - }) - ) - - if (!formData.success) { - return c.json({ success: false, state: "invalid data" }, 400) - } - - const { collectionId, assetId } = formData.data - - const { drizzle } = getConnection(c.env) - - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "invalid session" }, 401) - } - - if (!collectionId) { - return c.json( - { success: false, state: "no collection id entered" }, - 200 - ) - } - - if (!assetId) { - return c.json({ success: false, state: "no asset id entered" }, 401) - } - - const collectionExists = await drizzle.query.userCollection.findFirst({ - where: (userCollection, { eq }) => eq(userCollection.id, collectionId), - }) - - if (!collectionExists) { - return c.json( - { - success: false, - state: "collection with ID doesn't exist", - }, - 200 - ) - } - - // check if asset exists - const foundAsset = await drizzle.query.asset.findFirst({ - where: (asset, { eq }) => eq(asset.id, parseInt(collectionId)), - }) - - if (!foundAsset) { - return c.json({ success: false, state: "asset not found" }, 200) - } - - // check if userCollectionAsset exists - const userCollectionAssetExists = - await drizzle.query.userCollectionAsset.findFirst({ - where: (userCollectionAsset, { eq, and }) => - and( - eq(userCollectionAsset.collectionId, collectionId), - eq(userCollectionAsset.assetId, parseInt(assetId)) - ), - }) - - if (!userCollectionAssetExists) { - return c.json({ - success: false, - state: "asset not found in collection", - }) - } - - try { - await drizzle - .delete(userCollectionAsset) - .where( - and( - eq(userCollectionAsset.collectionId, collectionId), - eq(userCollectionAsset.assetId, parseInt(assetId)) - ) - ) - .execute() - } catch (e) { - return c.json( - { - success: false, - state: "failed to delete asset from collection", - }, - 500 - ) - } - - return c.json( - { success: true, state: "deleted asset from collection" }, - 200 - ) -} diff --git a/src/v2/routes/auth/assets/collections/view-asset-collection.ts b/src/v2/routes/auth/assets/collections/view-asset-collection.ts deleted file mode 100644 index 06c0378..0000000 --- a/src/v2/routes/auth/assets/collections/view-asset-collection.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { auth } from "@/v2/lib/auth/lucia" -import { getConnection } from "@/v2/db/turso" - -export async function viewAssetCollection(c: APIContext): Promise { - const { drizzle } = getConnection(c.env) - - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "invalid session" }, 401) - } - - const collectionId = c.req.param("collectionId") - - if (!collectionId) { - return c.json( - { success: false, state: "no collection id entered" }, - 200 - ) - } - - // check if the user owns the collection, or if the collection is public - try { - await drizzle.query.userCollection.findFirst({ - where: (userCollection, { eq, or, and }) => - and( - or( - eq(userCollection.id, collectionId), - eq(userCollection.isPublic, 1) - ), - eq(userCollection.userId, session.user.userId) - ), - }) - } catch (e) { - return c.json( - { - success: false, - state: "collection with ID doesn't exist", - }, - 200 - ) - } - - const assetCollection = await drizzle.query.userCollection.findFirst({ - where: (userCollection, { eq, or, and }) => - and( - or( - eq(userCollection.id, collectionId), - eq(userCollection.isPublic, 1) - ), - eq(userCollection.userId, session.user.userId) - ), - with: { - userCollectionAsset: { - with: { - assets: true, - }, - }, - }, - }) - - return c.json( - { success: true, state: "found collection", assetCollection }, - 200 - ) -} diff --git a/src/v2/routes/auth/assets/collections/view-asset-collections.ts b/src/v2/routes/auth/assets/collections/view-asset-collections.ts deleted file mode 100644 index 8dd1dee..0000000 --- a/src/v2/routes/auth/assets/collections/view-asset-collections.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { auth } from "@/v2/lib/auth/lucia" -import { getConnection } from "@/v2/db/turso" - -export async function viewAssetCollections(c: APIContext): Promise { - const { drizzle } = getConnection(c.env) - - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "invalid session" }, 401) - } - - // check if userCollection exists - const userCollectionExists = await drizzle.query.userCollection.findFirst({ - where: (userCollection, { eq }) => - eq(userCollection.userId, session.user.userId), - }) - - if (!userCollectionExists) { - return c.json({ success: false, state: "no collections found" }, 200) - } - - const assetCollection = await drizzle.query.userCollectionAsset.findMany({ - where: (userCollectionAsset, { eq }) => - eq(userCollectionAsset.collectionId, userCollectionExists.id), - with: { - assets: true, - }, - }) - - return c.json( - { - success: true, - state: "found collections", - assetCollection, - }, - 200 - ) -} diff --git a/src/v2/routes/auth/assets/favorite/add-favorite-asset.ts b/src/v2/routes/auth/assets/favorite/add-favorite-asset.ts deleted file mode 100644 index 5bf91a0..0000000 --- a/src/v2/routes/auth/assets/favorite/add-favorite-asset.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { auth } from "@/v2/lib/auth/lucia" -import { getConnection } from "@/v2/db/turso" - -import { userFavorite, userFavoriteAsset } from "@/v2/db/schema" - -export async function favoriteAsset(c: APIContext): Promise { - const { drizzle } = getConnection(c.env) - - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "invalid session" }, 200) - } - - const formData = await c.req.formData() - - const assetToFavorite = formData.get("assetIdToFavorite") as string | null - - if (!assetToFavorite) { - return c.json({ success: false, state: "no assetid entered" }, 200) - } - - // check if asset exists, and status is 1 (approved) - const assetExists = await drizzle.query.asset.findFirst({ - where: (asset, { eq, and }) => - and( - eq(asset.id, parseInt(assetToFavorite)), - eq(asset.status, "approved") - ), - }) - - if (!assetExists) { - return c.json({ success: false, state: "asset not found" }, 200) - } - - // this should never happen, but just in case it does, UX over reads/writes to the database - const doesuserFavoriteExist = await drizzle.query.userFavorite.findFirst({ - where: (userFavorite, { eq }) => - eq(userFavorite.userId, session.user.userId), - }) - - if (!doesuserFavoriteExist) { - // create entry in userFavorite - await drizzle - .insert(userFavorite) - .values({ - id: `${session.user.userId}-${assetToFavorite}`, - userId: session.user.userId, - isPublic: 0, // default to private - }) - .execute() - } - - const isFavorited = await drizzle.query.userFavorite.findFirst({ - where: (userFavoriteAsset, { eq }) => - eq( - userFavoriteAsset.id, - `${session.user.userId}-${assetToFavorite}` - ), - }) - - if (isFavorited) { - return c.json( - { - success: false, - state: "asset is already favorited, therefore cannot be favorited", - assetToFavorite, - }, - 200 - ) - } - - // add asset to userFavorite... - try { - await drizzle.insert(userFavoriteAsset).values({ - id: `${session.user.userId}-${assetToFavorite}`, - userFavoriteId: isFavorited.id, - assetId: parseInt(assetToFavorite), - }) - } catch (e) { - return c.json( - { success: false, state: "failed to favorite asset" }, - 500 - ) - } - - return c.json( - { success: true, state: "favorited asset", assetToFavorite }, - 200 - ) -} diff --git a/src/v2/routes/auth/assets/favorite/favorite-asset-routes.ts b/src/v2/routes/auth/assets/favorite/favorite-asset-routes.ts deleted file mode 100644 index fde076f..0000000 --- a/src/v2/routes/auth/assets/favorite/favorite-asset-routes.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Hono } from "hono" -import { cors } from "hono/cors" -import { favoriteAsset } from "./add-favorite-asset" -import { removeFavoriteAsset } from "./remove-favorite-asset" -import { viewFavoriteAssets } from "./view-favorite-assets" - -const favoriteAssetRoute = new Hono<{ Bindings: Bindings }>() - -favoriteAssetRoute.use( - "*", - cors({ - credentials: true, - origin: ["http://localhost:3000"], // TODO: update this - temporary - }) -) - -favoriteAssetRoute.post("/add", async (c) => { - return favoriteAsset(c) -}) - -favoriteAssetRoute.post("/remove", async (c) => { - return removeFavoriteAsset(c) -}) - -favoriteAssetRoute.get("/all", async (c) => { - return viewFavoriteAssets(c) -}) - -export default favoriteAssetRoute diff --git a/src/v2/routes/auth/assets/favorite/remove-favorite-asset.ts b/src/v2/routes/auth/assets/favorite/remove-favorite-asset.ts deleted file mode 100644 index 8c680f1..0000000 --- a/src/v2/routes/auth/assets/favorite/remove-favorite-asset.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { auth } from "@/v2/lib/auth/lucia" -import { getConnection } from "@/v2/db/turso" -import { eq } from "drizzle-orm" -import { z } from "zod" -import { userFavorite, userFavoriteAsset } from "@/v2/db/schema" - -const RemoveFavoriteAssetSchema = z.object({ - assetToRemove: z.string({ - required_error: "Asset ID is required", - invalid_type_error: "Asset ID must be a string", - }), -}) - -export async function removeFavoriteAsset(c: APIContext): Promise { - const formData = RemoveFavoriteAssetSchema.safeParse( - await c.req.formData().then((formData) => { - const data = Object.fromEntries(formData.entries()) - return data - }) - ) - - if (!formData.success) { - return c.json({ success: false, state: "invalid data" }, 400) - } - - const { assetToRemove } = formData.data - - const { drizzle } = getConnection(c.env) - - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "invalid session" }, 200) - } - - // check if asset exists - const foundAsset = await drizzle.query.asset.findFirst({ - where: (asset, { eq }) => eq(asset.id, parseInt(assetToRemove)), - }) - - if (!foundAsset) { - return c.json({ success: false, state: "asset not found" }, 200) - } - - // this should never happen, but just in case it does, UX over reads/writes to the database - const doesuserFavoriteExist = await drizzle.query.userFavorite.findFirst({ - where: (userFavorite, { eq }) => - eq(userFavorite.userId, session.user.userId), - }) - - if (!doesuserFavoriteExist) { - // create entry in userFavorite - await drizzle - .insert(userFavorite) - .values({ - id: `${session.user.userId}-${assetToRemove}`, - userId: session.user.userId, - isPublic: 0, // default to private - }) - .execute() - } - - const isFavorited = await drizzle.query.userFavorite.findFirst({ - where: (userFavoriteAsset, { eq }) => - eq(userFavoriteAsset.id, `${session.user.userId}-${assetToRemove}`), - }) - - if (!isFavorited) { - return c.json( - { - success: false, - state: "asset is not favorited, therefore cannot be removed", - assetToRemove, - }, - 200 - ) - } - - // remove asset from userFavorite... - try { - await drizzle - .delete(userFavoriteAsset) - .where( - eq( - userFavoriteAsset.id, - `${session.user.userId}-${assetToRemove}` - ) - ) - .execute() - } catch (e) { - return c.json({ success: false, state: "failed to remove asset" }, 500) - } - - return c.json({ success: true, state: "removed asset", assetToRemove }, 200) -} diff --git a/src/v2/routes/auth/assets/favorite/view-favorite-assets.ts b/src/v2/routes/auth/assets/favorite/view-favorite-assets.ts deleted file mode 100644 index 71e989d..0000000 --- a/src/v2/routes/auth/assets/favorite/view-favorite-assets.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { auth } from "@/v2/lib/auth/lucia" -import { getConnection } from "@/v2/db/turso" - -export async function viewFavoriteAssets(c: APIContext): Promise { - const { drizzle } = getConnection(c.env) - - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "invalid session" }, 401) - } - - // check if userFavorite exists - const userFavoriteExists = await drizzle.query.userFavorite.findFirst({ - where: (userFavorite, { eq }) => - eq(userFavorite.userId, session.user.userId), - }) - - if (!userFavoriteExists) { - return c.json({ success: false, state: "no favorites found" }, 200) - } - - const favoriteAssets = await drizzle.query.userFavoriteAsset.findMany({ - where: (userFavoriteAsset, { eq }) => - eq(userFavoriteAsset.userFavoriteId, userFavoriteExists.id), - with: { - assets: true, - }, - }) - - return c.json( - { success: true, state: "found favorites", favoriteAssets }, - 200 - ) -} diff --git a/src/v2/routes/auth/assets/get-unapproved-assets.ts b/src/v2/routes/auth/assets/get-unapproved-assets.ts deleted file mode 100644 index 15dc686..0000000 --- a/src/v2/routes/auth/assets/get-unapproved-assets.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { responseHeaders } from "@/v2/lib/response-headers" -import { getConnection } from "@/v2/db/turso" -import { auth } from "@/v2/lib/auth/lucia" -import { roleFlagsToArray } from "@/v2/lib/helpers/role-flags" - -export async function getUnapprovedAssets(c: APIContext): Promise { - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "unauthorized" }, 401) - } - - const roleFlags = roleFlagsToArray(session.user.roleFlags) - - if (!roleFlags.includes("STAFF")) { - return c.json({ success: false, state: "unauthorized" }, 401) - } - - const { drizzle } = getConnection(c.env) - - const unApprovedAssets = - (await drizzle.query.asset.findMany({ - where: (asset, { eq, not }) => not(eq(asset.status, "approved")), - })) ?? [] - - return c.json( - { - success: true, - status: "ok", - unApprovedAssets, - }, - 200, - responseHeaders - ) -} diff --git a/src/v2/routes/auth/assets/modify-asset.ts b/src/v2/routes/auth/assets/modify-asset.ts deleted file mode 100644 index 7e02247..0000000 --- a/src/v2/routes/auth/assets/modify-asset.ts +++ /dev/null @@ -1,130 +0,0 @@ -import { responseHeaders } from "@/v2/lib/response-headers" -import { getConnection } from "@/v2/db/turso" -import { assetTagAsset, asset } from "@/v2/db/schema" -import { eq } from "drizzle-orm" -import { SplitQueryByCommas } from "@/v2/lib/helpers/split-query-by-commas" -import { auth } from "@/v2/lib/auth/lucia" -import { roleFlagsToArray } from "@/v2/lib/helpers/role-flags" - -export async function modifyAssetData(c: APIContext): Promise { - const { assetIdToModify } = c.req.param() - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "invalid session" }, 401) - } - - // return unauthorized if user is not a contributor - if (session.user.isContributor === 0) { - return c.json({ success: false, state: "unauthorized" }, 401) - } - - const { drizzle } = getConnection(c.env) - - const foundAsset = await drizzle.query.asset.findFirst({ - where: (asset, { eq }) => eq(asset.id, parseInt(assetIdToModify)), - with: { - assetTagAsset: { - with: { - assetTag: true, - }, - }, - }, - }) - - if (!foundAsset) { - return c.json({ success: false, state: "asset not found" }, 200) - } - - const roleFlags = roleFlagsToArray(session.user.roleFlags) - - if ( - foundAsset.uploadedById !== session.user.userId || - !roleFlags.includes("CREATOR") - ) { - return c.json( - { - success: false, - state: "unauthorized to modify this asset", - }, - 401 - ) - } - - const formData = await c.req.formData() - - const metadata = { - name: formData.get("name") as string | null, - game: formData.get("game") as string | null, - assetCategory: formData.get("assetCategory") as string | null, - } - - Object.keys(metadata).forEach( - (key) => metadata[key] === null && delete metadata[key] - ) - - const tags = SplitQueryByCommas(formData.get("tags") as string | null) - - const updatedAsset = await drizzle - .update(asset) - .set({ - ...metadata, - }) - .where(eq(asset.id, parseInt(assetIdToModify))) - .execute() - - const validTags = [] - const invalidTags = [] - - if (tags && tags.length > 0) { - // remove all existing tags - await drizzle - .delete(assetTagAsset) - .where(eq(assetTagAsset.assetId, parseInt(assetIdToModify))) - .execute() - - // add new tags - await drizzle.transaction(async (trx) => { - for (const tag of tags) { - const tagExists = await trx.query.assetTag.findFirst({ - where: (assetTag) => { - return eq(assetTag.name, tag) - }, - }) - if (tagExists) { - await trx - .insert(assetTagAsset) - .values({ - assetId: parseInt(assetIdToModify), - assetTagId: tagExists[0].assetTagId, - }) - .returning({ - assetTagId: assetTagAsset.assetTagId, - }) - validTags.push(tag) - } else { - invalidTags.push(tag) - } - } - }) - - const response = c.json( - { - success: true, - status: "ok", - updatedAsset, - validTags: validTags ? validTags : undefined, - invalidTags: invalidTags ? invalidTags : undefined, - }, - 200, - responseHeaders - ) - - return response - } -} diff --git a/src/v2/routes/auth/assets/upload-asset.ts b/src/v2/routes/auth/assets/upload-asset.ts deleted file mode 100644 index f42b5d6..0000000 --- a/src/v2/routes/auth/assets/upload-asset.ts +++ /dev/null @@ -1,208 +0,0 @@ -import { auth } from "@/v2/lib/auth/lucia" -import { getConnection } from "@/v2/db/turso" -import { - asset, - assetTagAsset, - game as gameTable, - assetCategory as assetCategoryTable, - AssetStatus, -} from "@/v2/db/schema" -import { z } from "zod" -import { eq } from "drizzle-orm" -import { SplitQueryByCommas } from "@/v2/lib/helpers/split-query-by-commas" - -const MAX_FILE_SIZE = 5000 -const ACCEPTED_IMAGE_TYPES = ["image/png"] - -const UploadAssetSchema = z.object({ - asset: z - .any() - .refine((files) => files?.length == 1, "Image is required.") - .refine( - (files) => files?.[0]?.size <= MAX_FILE_SIZE, - `Max file size is 5MB.` - ) - .refine( - (files) => ACCEPTED_IMAGE_TYPES.includes(files?.[0]?.type), - ".jpg, .jpeg, .png and .webp files are accepted." - ), - name: z.string({ - required_error: "Name is required", - invalid_type_error: "Name must be a string", - }), - extension: z.string({ - required_error: "Extension is required", - invalid_type_error: "Extension must be a string", - }), - tags: z.string().optional(), - category: z.string({ - required_error: "Category is required", - invalid_type_error: "Category must be a string", - }), - game: z.string({ - required_error: "Game is required", - invalid_type_error: "Game must be a string", - }), - size: z.number({ - required_error: "Size is required", - invalid_type_error: "Size must be a number", - }), - width: z.number({ - required_error: "Width is required", - invalid_type_error: "Width must be a number", - }), - height: z.number({ - required_error: "Height is required", - invalid_type_error: "Height must be a number", - }), -}) - -export async function uploadAsset(c: APIContext): Promise { - const formData = UploadAssetSchema.safeParse( - await c.req.formData().then((formData) => { - const data = Object.fromEntries(formData.entries()) - return data - }) - ) - - if (!formData.success) { - return c.json({ success: false, state: "invalid data" }, 400) - } - - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "unauthorized" }, 401) - } - - // return unauthorized if user is not a contributor - if (session.user.isContributor !== 1) { - return c.json({ success: false, state: "unauthorized" }, 401) - } - - const bypassApproval = session.user.isContributor === 1 - - const { drizzle } = getConnection(c.env) - - const newAsset = { - name: formData.data.name, - extension: formData.data.extension, - gameId: formData.data.game, - assetCategoryId: formData.data.category, - url: `/assets/${formData.data.game}/${formData.data.category}/${formData.data.name}.${formData.data.extension}`, - uploadedById: session.user.userId, - status: bypassApproval ? "approved" : ("pending" as AssetStatus), - uploadedDate: new Date().toISOString(), - fileSize: formData.data.size, // stored in bytes - width: formData.data.width, - height: formData.data.height, - } - - // rename file name to match metadata - const newAssetFile = new File([formData.data.asset], newAsset.name, { - type: "image/png", - }) - - const validTags = [] - const invalidTags = [] - - const game = await drizzle.query.game.findFirst({ - where: (game) => { - return eq(game.name, formData.data.game) - }, - }) - - const assetCategory = await drizzle.query.assetCategory.findFirst({ - where: (assetCategory) => { - return eq(assetCategory.name, formData.data.category) - }, - }) - - if (!game) - return c.json({ success: false, state: "game does not exist" }, 404) - - if (!assetCategory) - return c.json( - { success: false, state: "asset category does not exist" }, - 404 - ) - - try { - await c.env.FILES_BUCKET.put( - `/assets/${formData.data.game}/${formData.data.category}/${formData.data.name}.${formData.data.extension}`, - newAssetFile - ) - - await drizzle.transaction(async (trx) => { - // inserting new asset - const newAssetDB = await trx - .insert(asset) - .values(newAsset) - .returning({ - assetId: asset.id, - }) - - // checking if tags exist and setting relations - if (formData.data.tags.length > 0) { - for (const tag of SplitQueryByCommas(formData.data.tags)) { - const tagExists = await trx.query.assetTag.findFirst({ - where: (assetTag) => { - return eq(assetTag.name, tag) - }, - }) - if (tagExists) { - await trx - .insert(assetTagAsset) - .values({ - assetId: newAssetDB[0].assetId, - assetTagId: tagExists.id, - }) - .returning({ - assetTagId: assetTagAsset.assetTagId, - }) - validTags.push(tag) - } else { - invalidTags.push(tag) - } - } - } - - // updating game and category asset count - await trx - .update(gameTable) - .set({ - assetCount: game.assetCount + 1, - }) - .where(eq(gameTable.name, formData.data.game)) - .execute() - - await trx - .update(assetCategoryTable) - .set({ - assetCount: assetCategory.assetCount + 1, - }) - .where(eq(assetCategoryTable.name, formData.data.category)) - .execute() - }) - } catch (e) { - await c.env.FILES_BUCKET.delete( - `/assets/${formData.data.game}/${formData.data.category}/${formData.data.name}.${formData.data.extension}` - ) - return c.json({ success: false, state: "failed to upload asset" }, 500) - } - - return c.json( - { - success: true, - state: "uploaded asset", - validTags, - invalidTags, - }, - 200 - ) -} diff --git a/src/v2/routes/auth/auth-routes.ts b/src/v2/routes/auth/auth-routes.ts deleted file mode 100644 index 112ff3e..0000000 --- a/src/v2/routes/auth/auth-routes.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { Hono } from "hono" -import { login } from "./login" -import { logout } from "./logout" -import { signup } from "./signup" -import { cors } from "hono/cors" -import { validate } from "./validate" -import { verifyEmail } from "./verify-email" -import { resetPassword, generatePasswordResetToken } from "./reset-password" -import assetCategoryRoute from "./asset-categories/asset-category-routes" -import assetRoute from "./assets/asset-routes" -import ocGeneratorRoute from "./oc-generators/oc-generator-routes" -import gameRoute from "./games/game-routes" -import tagRoute from "./tags/tag-routes" -import userAttributesRoute from "./user-attributes/user-attributes-routes" - -const authRoute = new Hono<{ Bindings: Bindings }>() - -authRoute.use( - "*", - cors({ - credentials: true, - origin: ["http://localhost:3000"], // TODO: update this - temporary - }) -) - -authRoute.post("/login", async (c) => { - return login(c) -}) - -authRoute.get("/verify-email/:token", async (c) => { - return verifyEmail(c) -}) - -authRoute.get("/validate", async (c) => { - return validate(c) -}) - -authRoute.post("/logout", async (c) => { - return logout(c) -}) - -authRoute.post("/signup", async (c) => { - return signup(c) -}) - -authRoute.post("/reset-password", async (c) => { - return resetPassword(c) -}) - -authRoute.post("/generate-password-reset-token", async (c) => { - return generatePasswordResetToken(c) -}) - -authRoute.route("/assets", assetRoute) -authRoute.route("/asset-categories", assetCategoryRoute) -authRoute.route("/oc-generators", ocGeneratorRoute) -authRoute.route("/game", gameRoute) -authRoute.route("/tags", tagRoute) -authRoute.route("/user-attributes", userAttributesRoute) - -export default authRoute diff --git a/src/v2/routes/auth/games/create-game.ts b/src/v2/routes/auth/games/create-game.ts deleted file mode 100644 index 643809a..0000000 --- a/src/v2/routes/auth/games/create-game.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { auth } from "@/v2/lib/auth/lucia" -import { roleFlagsToArray } from "@/v2/lib/helpers/role-flags" -import { getConnection } from "@/v2/db/turso" -import { game } from "@/v2/db/schema" - -export async function createGame(c: APIContext): Promise { - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "invalid session" }, 401) - } - - const roleFlags = roleFlagsToArray(session.user.roleFlags) - - if (!roleFlags.includes("CREATOR")) { - return c.json({ success: false, state: "unauthorized" }, 401) - } - - const { drizzle } = getConnection(c.env) - - const formData = await c.req.formData() - - const newGame = { - id: crypto.randomUUID(), - name: formData.get("name") as string, - formattedName: formData.get("formattedName") as string, - assetCount: 0, - lastUpdated: new Date().toISOString(), - } - - // check if game.name exists - const gameExists = await drizzle.query.game.findFirst({ - where: (game, { eq }) => eq(game.name, game.name), - }) - - if (gameExists) { - return c.json( - { success: false, state: "game with name already exists" }, - 200 - ) - } - - try { - await drizzle.insert(game).values(newGame).execute() - } catch (e) { - return c.json({ success: false, state: "failed to create game" }, 500) - } - - return c.json({ success: true, state: "created game", game }, 200) -} diff --git a/src/v2/routes/auth/games/delete-game.ts b/src/v2/routes/auth/games/delete-game.ts deleted file mode 100644 index 62826b6..0000000 --- a/src/v2/routes/auth/games/delete-game.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { auth } from "@/v2/lib/auth/lucia" -import { roleFlagsToArray } from "@/v2/lib/helpers/role-flags" -import { getConnection } from "@/v2/db/turso" -import { z } from "zod" -import { game } from "@/v2/db/schema" -import { eq } from "drizzle-orm" - -const DeleteGameSchema = z.object({ - id: z.string({ - required_error: "ID is required", - invalid_type_error: "ID must be a string", - }), -}) - -export async function deleteGame(c: APIContext): Promise { - const formData = DeleteGameSchema.safeParse(await c.req.formData()) - - if (!formData.success) { - return c.json({ success: false, state: "invalid data" }, 400) - } - - const { id } = formData.data - - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "invalid session" }, 401) - } - - const roleFlags = roleFlagsToArray(session.user.roleFlags) - - if (!roleFlags.includes("CREATOR")) { - return c.json({ success: false, state: "unauthorized" }, 401) - } - - const { drizzle } = getConnection(c.env) - - try { - await drizzle.delete(game).where(eq(game.id, id)).execute() - } catch (e) { - return c.json({ success: false, state: "failed to delete game" }, 500) - } - - return c.json({ success: true, state: "deleted game", id }, 200) -} diff --git a/src/v2/routes/auth/games/game-routes.ts b/src/v2/routes/auth/games/game-routes.ts deleted file mode 100644 index 97d61b4..0000000 --- a/src/v2/routes/auth/games/game-routes.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { createGame } from "./create-game" -import { deleteGame } from "./delete-game" -import { Hono } from "hono" -import { cors } from "hono/cors" - -const gameRoute = new Hono<{ Bindings: Bindings }>() - -gameRoute.use( - "*", - cors({ - credentials: true, - origin: ["http://localhost:3000"], // TODO: update this - temporary - }) -) - -gameRoute.post("/create", async (c) => { - return createGame(c) -}) - -gameRoute.post("/delete", async (c) => { - return deleteGame(c) -}) - -export default gameRoute diff --git a/src/v2/routes/auth/login-methods/discord.ts b/src/v2/routes/auth/login-methods/discord.ts deleted file mode 100644 index 4ae95ff..0000000 --- a/src/v2/routes/auth/login-methods/discord.ts +++ /dev/null @@ -1,145 +0,0 @@ -import { - auth as authAdapter, - discordAuth as discordAuthAdapter, -} from "@/v2/lib/auth/lucia" -import { setCookie, getCookie } from "hono/cookie" -import { getConnection } from "@/v2/db/turso" -import { socialsConnection } from "@/v2/db/schema" -import { generateID } from "@/v2/lib/oslo" - -export async function loginWithDiscord(c: APIContext): Promise { - const auth = await authAdapter(c.env) - const session = authAdapter(c.env).handleRequest(c).validate() - - if (session) { - return c.json({ success: false, state: "already logged in" }, 200) - } - - const discordAuth = await discordAuthAdapter(auth, c.env) - const [url, state] = await discordAuth.getAuthorizationUrl() - - // set state cookie for validation - setCookie(c, "discord_oauth_state", state, { - httpOnly: true, - secure: true, - path: "/", - maxAge: 60 * 60 * 24 * 7, - sameSite: "Lax", - }) - - return c.json({ success: true, url, state }, 200) -} - -export async function discordCallback(c: APIContext): Promise { - const storedState = getCookie(c, "discord_oauth_state") - const { state, code } = c.req.query() - - // check if state is valid - if (!storedState || !state || storedState !== state || !code) { - return c.json({ success: false, state: "missing parameters" }, 200) - } - - const auth = await authAdapter(c.env) - const discordAuth = await discordAuthAdapter(auth, c.env) - - const { getExistingUser, discordUser, createUser, createKey } = - await discordAuth.validateCallback(code) - - const getDiscordUser = async () => { - const existingUser = await getExistingUser() - if (existingUser) { - return existingUser - } - - // check if discord user exists && they have a verified email - if (!discordUser || discordUser.bot) { - throw new Error("discord user is invalid email") - } - - if (!discordUser.email || !discordUser.verified) { - throw new Error("discord user doesnt have a verified email") - } - - const { drizzle } = getConnection(c.env) - - const userWithEmail = await drizzle.query.authUser.findFirst({ - where: (authUser, { eq }) => eq(authUser.email, discordUser.email), - }) - - // if user exists, we create a discord key for them and update their email_verified attribute - if (userWithEmail) { - // check if user with same email has a discord id set as a social connection - const getUsersConnections = - await drizzle.query.socialsConnection.findFirst({ - where: (socialsConnection, { eq }) => - eq(socialsConnection.userId, userWithEmail.id), - }) - - if ( - getUsersConnections && - getUsersConnections.discordId !== discordUser.id - ) { - throw new Error( - "user with same email has a different discord id set as a social connection" - ) - } - - const user = await auth.getUser(userWithEmail.id) - - await createKey(user.userId) - if (user.emailVerified !== 1) { - await auth.updateUserAttributes(user.userId, { - email_verified: 1, - }) - } - - return user - } - - // if user doesn't exist, create it based off their discord info - const createdUser = await createUser({ - userId: generateID(), - attributes: { - username: discordUser.username, - display_name: discordUser.username, - email: discordUser.email, - email_verified: 1, - date_joined: new Date().toISOString(), - verified: 0, - role_flags: 1, - is_contributor: 0, - self_assignable_role_flags: null, - username_colour: null, - avatar_url: null, - banner_url: null, - pronouns: null, - bio: "No bio set", - }, - }) - - // add discord id as a social connection - await drizzle - .insert(socialsConnection) - .values({ - id: `${createdUser.userId}`, - userId: createdUser.userId, - discordId: discordUser.id, - }) - .execute() - - return createdUser - } - - const user = await getDiscordUser() - - const session = await auth.createSession({ - userId: user.userId, - attributes: { - country_code: c.req.header("cf-ipcountry") ?? "", - user_agent: c.req.header("user-agent") ?? "", - ip_address: c.req.header("cf-connecting-ip") ?? "", - }, - }) - - return c.json({ success: true, state: "logged in", session }, 200) -} diff --git a/src/v2/routes/auth/login.ts b/src/v2/routes/auth/login.ts deleted file mode 100644 index 0f84cd5..0000000 --- a/src/v2/routes/auth/login.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { auth } from "@/v2/lib/auth/lucia" -import { z } from "zod" - -const usernameThrottling = new Map< - string, - { - timeoutUntil: number - timeoutSeconds: number - } ->() - -const LoginSchema = z.object({ - username: z.string({ - required_error: "Username is required", - invalid_type_error: "Username must be a string", - }), - password: z.string({ - required_error: "Password is required", - invalid_type_error: "Password must be a string", - }), -}) - -export async function login(c: APIContext): Promise { - const formData = LoginSchema.safeParse( - await c.req.formData().then((formData) => { - const data = Object.fromEntries(formData.entries()) - return data - }) - ) - - if (!formData.success) { - return c.json({ success: false, state: "invalid data" }, 400) - } - - const { username, password } = formData.data - - const validSession = await auth(c.env).handleRequest(c).validate() - if (validSession) - return c.json({ success: false, state: "already logged in" }, 200) - - const storedThrottling = usernameThrottling.get(username) - const timeoutUntil = storedThrottling?.timeoutUntil ?? 0 - - if (timeoutUntil > Date.now()) { - return c.json( - { - success: false, - status: "error", - error: `Too many login attempts - wait ${ - (timeoutUntil - Date.now()) / 1000 - } seconds`, - }, - 400 - ) - } - - const user = await auth(c.env).useKey( - "username", - username.toLowerCase(), - password - ) - - if (!user) { - const timeoutSeconds = storedThrottling - ? storedThrottling.timeoutSeconds * 2 - : 1 - usernameThrottling.set(username, { - timeoutUntil: Date.now() + timeoutSeconds * 1000, - timeoutSeconds, - }) - return c.json( - { - success: false, - status: "error", - error: `Invalid credentials - wait ${timeoutSeconds} seconds`, - }, - 400 - ) - } - - const userAgent = c.req.header("user-agent") ?? "" - const countryCode = c.req.header("cf-ipcountry") ?? "" - const ipAddress = c.req.header("cf-connecting-ip") ?? "" - - const newSession = await auth(c.env).createSession({ - userId: user.userId, - attributes: { - country_code: countryCode, - user_agent: userAgent, - ip_address: ipAddress, - }, - }) - - console.log("valid session created", countryCode, userAgent) - - const authRequest = await auth(c.env).handleRequest(c) - authRequest.setSession(newSession) - - return c.json({ success: true, state: "logged in" }, 200) -} diff --git a/src/v2/routes/auth/logout.ts b/src/v2/routes/auth/logout.ts deleted file mode 100644 index 623d478..0000000 --- a/src/v2/routes/auth/logout.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { auth } from "@/v2/lib/auth/lucia" - -export async function logout(c: APIContext): Promise { - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session) { - return c.json({ success: false, state: "invalid session" }, 401) - } - - // this is useful to clean up dead sessions that are still in the database - await auth(c.env).deleteDeadUserSessions(session.user.userId) - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - - return c.json({ success: true, state: "logged out" }, 200) -} diff --git a/src/v2/routes/auth/oc-generators/delete-oc-generator-response.ts b/src/v2/routes/auth/oc-generators/delete-oc-generator-response.ts deleted file mode 100644 index fb952e9..0000000 --- a/src/v2/routes/auth/oc-generators/delete-oc-generator-response.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { auth } from "@/v2/lib/auth/lucia" -import { z } from "zod" -import { savedOcGenerators } from "@/v2/db/schema" -import { getConnection } from "@/v2/db/turso" -import { eq, and } from "drizzle-orm" - -const DeleteOCGeneratorResponseSchema = z.object({ - deleteID: z.string({ - required_error: "ID is required", - invalid_type_error: "ID must be a string", - }), -}) - -export async function deleteOCGeneratorResponse( - c: APIContext -): Promise { - const formData = DeleteOCGeneratorResponseSchema.safeParse( - await c.req.formData().then((formData) => { - const data = Object.fromEntries(formData.entries()) - return data - }) - ) - - if (!formData.success) { - return c.json({ success: false, state: "invalid data" }, 400) - } - - const { deleteID } = formData.data - - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "unauthorized" }, 401) - } - - const { drizzle } = getConnection(c.env) - - try { - await drizzle - .delete(savedOcGenerators) - .where( - and( - eq(savedOcGenerators.id, deleteID), - eq(savedOcGenerators.userId, session.user.userId) - ) - ) - } catch (e) { - return c.json( - { success: false, state: "failed to delete saved oc generator" }, - 500 - ) - } - - return c.json( - { - success: true, - state: `deleted saved oc generator with id ${deleteID}`, - }, - 200 - ) -} diff --git a/src/v2/routes/auth/oc-generators/oc-generator-routes.ts b/src/v2/routes/auth/oc-generators/oc-generator-routes.ts deleted file mode 100644 index 18bf210..0000000 --- a/src/v2/routes/auth/oc-generators/oc-generator-routes.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { saveOCGeneratorResponse } from "./save-oc-generator-response" -import { deleteOCGeneratorResponse } from "./delete-oc-generator-response" -import { viewOCGeneratorResponses } from "./view-oc-generator-response" -import { Hono } from "hono" -import { cors } from "hono/cors" - -const ocGeneratorRoute = new Hono<{ Bindings: Bindings }>() - -ocGeneratorRoute.use( - "*", - cors({ - credentials: true, - origin: ["http://localhost:3000"], // TODO: update this - temporary - }) -) - -ocGeneratorRoute.post("/save", async (c) => { - return saveOCGeneratorResponse(c) -}) - -ocGeneratorRoute.post("/delete", async (c) => { - return deleteOCGeneratorResponse(c) -}) - -ocGeneratorRoute.get("/all", async (c) => { - return viewOCGeneratorResponses(c) -}) - -export default ocGeneratorRoute diff --git a/src/v2/routes/auth/oc-generators/save-oc-generator-response.ts b/src/v2/routes/auth/oc-generators/save-oc-generator-response.ts deleted file mode 100644 index 34bf259..0000000 --- a/src/v2/routes/auth/oc-generators/save-oc-generator-response.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { auth } from "@/v2/lib/auth/lucia" -import { listBucket } from "@/v2/lib/list-bucket" -import { savedOcGenerators } from "@/v2/db/schema" -import { getConnection } from "@/v2/db/turso" -import { z } from "zod" -import type { OCGeneratorResponse as OCGeneratorRequestResponse } from "@/v2/lib/types/oc-generator" - -// matches data from oc generator and random entries from oc generator to prevent mismatched data from being saved -function isValidOCGeneratorResponse( - content: string, - response: OCGeneratorRequestResponse -) { - try { - const parsedContent = JSON.parse(content) - - if (typeof parsedContent !== "object") return false - - for (const key of Object.keys(parsedContent)) { - const foundOption = response.options.find( - (option) => option.name === key - ) - - if (!foundOption || !Array.isArray(parsedContent[key])) return false - - if ( - !parsedContent[key].every((entry) => - foundOption.entries.includes(entry) - ) - ) - return false - } - - return true - } catch (error) { - return false - } -} - -const SaveOCGeneratorResponseSchema = z.object({ - name: z.string({ - required_error: "Name is required", - invalid_type_error: "Name must be a string", - }), - game: z.string({ - required_error: "Game is required", - invalid_type_error: "Game must be a string", - }), - isPublic: z.string({ - required_error: "isPublic is required", - invalid_type_error: "isPublic must be a string", - }), - content: z.string({ - required_error: "Content is required", - invalid_type_error: "Content must be a string", - }), -}) - -export async function saveOCGeneratorResponse( - c: APIContext -): Promise { - const formData = SaveOCGeneratorResponseSchema.safeParse( - await c.req.formData().then((formData) => { - const data = Object.fromEntries(formData.entries()) - return data - }) - ) - - if (!formData.success) { - return c.json({ success: false, state: "invalid data" }, 400) - } - - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "invalid session" }, 401) - } - - const { drizzle } = getConnection(c.env) - - // TODO: make sure data is actually valid before inserting it into the database - const ocGeneratorResponse = { - id: crypto.randomUUID(), - userId: session.user.userId, - name: formData.data.name, - game: formData.data.game, - dateCreated: new Date().toISOString(), - isPublic: parseInt(formData.data.isPublic), // 1 = yes, 0 = no, default = 0 - content: formData.data.content, // this is stored as json, which can then be parsed - } - - const files = await listBucket(c.env.FILES_BUCKET, { - prefix: `oc-generators/${ocGeneratorResponse.game}/list.json`, - }) - - if (files.objects.length === 0) - return c.json( - { success: false, state: "no oc generators with name found" }, - 200 - ) - - const ResponseData = await fetch( - `https://files.wanderer.moe/${files.objects[0].key}` - ).then((res) => res.json() as Promise) - - if (!isValidOCGeneratorResponse(ocGeneratorResponse.content, ResponseData)) - return c.json( - { success: false, state: "invalid data attempted to be saved" }, - 200 - ) - - await drizzle.insert(savedOcGenerators).values(ocGeneratorResponse) - - return c.json({ success: true, state: "saved", ocGeneratorResponse }, 200) -} diff --git a/src/v2/routes/auth/oc-generators/view-oc-generator-response.ts b/src/v2/routes/auth/oc-generators/view-oc-generator-response.ts deleted file mode 100644 index dec2725..0000000 --- a/src/v2/routes/auth/oc-generators/view-oc-generator-response.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { auth } from "@/v2/lib/auth/lucia" -import { getConnection } from "@/v2/db/turso" -import { savedOcGenerators } from "@/v2/db/schema" -import { desc } from "drizzle-orm" - -export async function viewOCGeneratorResponses( - c: APIContext -): Promise { - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "unauthorized" }, 401) - } - - const { drizzle } = getConnection(c.env) - - const ocGeneratorResponses = await drizzle.query.savedOcGenerators.findMany( - { - where: (savedOcGenerators, { eq }) => - eq(savedOcGenerators.userId, session.user.userId), - orderBy: desc(savedOcGenerators.dateCreated), - } - ) - - return c.json( - { - success: true, - state: "valid session", - ocGeneratorResponses, - }, - 401 - ) -} diff --git a/src/v2/routes/auth/reset-password.ts b/src/v2/routes/auth/reset-password.ts deleted file mode 100644 index b350348..0000000 --- a/src/v2/routes/auth/reset-password.ts +++ /dev/null @@ -1,152 +0,0 @@ -import { auth } from "@/v2/lib/auth/lucia" -import { getConnection } from "@/v2/db/turso" -import { passwordResetToken, authUser } from "@/v2/db/schema" -import { eq } from "drizzle-orm" -import { generateRandomString } from "lucia/utils" -import { z } from "zod" -import { - sendPasswordResetEmail, - sendPasswordChangeEmail, -} from "@/v2/lib/resend/email" - -const generatePasswordResetTokenSchema = z.object({ - email: z - .string({ - required_error: "Email is required", - invalid_type_error: "Email must be a string", - }) - .email("Email must be a valid email address"), -}) - -export async function generatePasswordResetToken( - c: APIContext -): Promise { - const authRequest = auth(c.env).handleRequest(c) - - const formData = generatePasswordResetTokenSchema.safeParse( - await c.req.formData().then((formData) => { - const data = Object.fromEntries(formData.entries()) - return data - }) - ) - - if (!formData.success) { - return c.json({ success: false, state: "invalid data" }, 400) - } - - const { email } = formData.data - - const { drizzle } = getConnection(c.env) - const session = await authRequest.validate() - - if (session) { - return c.json({ success: false, state: "already logged in" }, 200) - } - - const user = await drizzle - .select() - .from(authUser) - .where(eq(authUser.email, email)) - - if (!user) { - return c.json({ success: false, state: "valid data" }, 200) - } - - const token = generateRandomString(32) - - await drizzle.transaction(async (trx) => { - await trx.insert(passwordResetToken).values({ - id: token, - userId: user[0].id, - token, - }) - }) - - await sendPasswordResetEmail(user[0].email, token, user[0].username, c) - - return c.json({ success: true, state: "valid data" }, 200) -} - -const resetPasswordSchema = z - .object({ - token: z.string({ - required_error: "Token is required", - invalid_type_error: "Token must be a string", - }), - newPassword: z.string({ - required_error: "Password is required", - invalid_type_error: "Password must be a string", - }), - newPasswordConfirm: z.string({ - required_error: "Password confirmation is required", - invalid_type_error: "Password confirmation must be a string", - }), - }) - .refine((data) => data.newPassword === data.newPasswordConfirm, { - message: "Passwords do not match", - path: ["passwordConfirm"], - }) - -export async function resetPassword(c: APIContext): Promise { - const authRequest = auth(c.env).handleRequest(c) - - const formData = resetPasswordSchema.safeParse( - await c.req.formData().then((formData) => { - const data = Object.fromEntries(formData.entries()) - return data - }) - ) - - if (!formData.success) { - return c.json({ success: false, state: "invalid data" }, 400) - } - - const { token, newPassword } = formData.data - - const { drizzle } = getConnection(c.env) - - const session = await authRequest.validate() - - if (session) { - return c.json({ success: false, state: "already logged in" }, 200) - } - - const relatedUser = await drizzle - .select() - .from(passwordResetToken) - .where(eq(passwordResetToken.token, token)) - - if (!relatedUser) { - return c.json({ success: false, state: "invalid token entered" }, 200) - } - - if (new Date(relatedUser[0].expiresAt) < new Date()) { - drizzle - .delete(passwordResetToken) - .where(eq(passwordResetToken.token, token)) - return c.json({ success: false, state: "invalid token entered" }, 200) - } - - let user = await auth(c.env).getUser(relatedUser[0].userId) - - if (!user) { - return c.json({ success: false, state: "invalid token entered" }, 200) - } - - await auth(c.env).invalidateAllUserSessions(user.userId) - await auth(c.env).updateKeyPassword("username", user.userId, newPassword) - - await drizzle - .delete(passwordResetToken) - .where(eq(passwordResetToken.token, token)) - - if (user.emailVerified === 0) { - user = await auth(c.env).updateUserAttributes(user.userId, { - email_verified: 1, - }) - } - - await sendPasswordChangeEmail(user.email, user.username, c) - - return c.json({ success: true, state: "updated credentials" }, 200) -} diff --git a/src/v2/routes/auth/signup.ts b/src/v2/routes/auth/signup.ts deleted file mode 100644 index 2a86e3e..0000000 --- a/src/v2/routes/auth/signup.ts +++ /dev/null @@ -1,169 +0,0 @@ -import { auth } from "@/v2/lib/auth/lucia" -import { z } from "zod" -import { getConnection } from "@/v2/db/turso" -import { generateRandomString } from "lucia/utils" -import { emailVerificationToken } from "@/v2/db/schema" -import { sendEmailConfirmationEmail } from "@/v2/lib/resend/email" -import { generateID } from "@/v2/lib/oslo" - -const CreateAccountSchema = z - .object({ - username: z - .string({ - required_error: "Username is required", - invalid_type_error: "Username must be a string", - }) - .min(3, "Username must be at least 3 characters long") - .max(32, "Username must be at most 32 characters long"), - email: z - .string({ - required_error: "Email is required", - invalid_type_error: "Email must be a string", - }) - .email("Email must be a valid email address"), - password: z - .string({ - required_error: "Password is required", - invalid_type_error: "Password must be a string", - }) - .regex( - new RegExp(".*[A-Z].*"), - "One uppercase character is required" - ) - .regex( - new RegExp(".*[a-z].*"), - "One lowercase character is required" - ) - .regex(new RegExp(".*\\d.*"), "One number is required") - .regex( - new RegExp(".*[`~<>?,./!@#$%^&*()\\-_+=\"'|{}\\[\\];:\\\\].*"), - "One special character is required" - ) - .min(8, "Password must be at least 8 characters long") - .max(128, "Password must be at most 128 characters long"), - passwordConfirm: z - .string({ - required_error: "Password confirmation is required", - invalid_type_error: "Password confirmation must be a string", - }) - .regex( - new RegExp(".*[A-Z].*"), - "One uppercase character is required" - ) - .regex( - new RegExp(".*[a-z].*"), - "One lowercase character is required" - ) - .regex(new RegExp(".*\\d.*"), "One number") - .regex( - new RegExp(".*[`~<>?,./!@#$%^&*()\\-_+=\"'|{}\\[\\];:\\\\].*"), - "One special character is required" - ) - .min(8, "Password must be at least 8 characters long") - .max(128, "Password must be at most 128 characters long"), - secretKey: z - .string({ - required_error: "Secret key is required", - invalid_type_error: "Secret key must be a string", - }) - .min(1, "Secret key must be at least 1 characters long") - .max(128, "Secret key must be at most 128 characters long"), - }) - .refine((data) => data.password === data.passwordConfirm, { - message: "Passwords do not match", - path: ["passwordConfirm"], - }) - -export async function signup(c: APIContext): Promise { - const formData = CreateAccountSchema.safeParse( - await c.req.formData().then((formData) => { - const data = Object.fromEntries(formData.entries()) - return data - }) - ) - - if (!formData.success) { - return c.json({ success: false, state: "invalid data" }, 400) - } - - const { username, email, password } = formData.data - - const validSession = await auth(c.env).handleRequest(c).validate() - if (validSession) - return c.json({ success: false, state: "already logged in" }, 200) - - console.log("creating user") - - try { - const user = await auth(c.env).createUser({ - key: { - providerId: "username", - providerUserId: username.toLowerCase(), - password, - }, - userId: generateID(), - attributes: { - username, - display_name: username, - email, - email_verified: 0, - date_joined: new Date().toISOString(), - verified: 0, - role_flags: 1, - is_contributor: 0, - self_assignable_role_flags: null, - username_colour: null, - avatar_url: null, - banner_url: null, - pronouns: null, // we can splice this into possesive, subject, and object pronouns by "/", e.g "he/him/his" => {subject: "he", object: "him", possesive: "his"} - bio: "No bio set", - }, - }) - - const userAgent = c.req.header("user-agent") ?? "" - const countryCode = c.req.header("cf-ipcountry") ?? "" - const ipAddress = c.req.header("cf-connecting-ip") ?? "" - - // TODO: encrypt session attributes with sha256 - const newSession = await auth(c.env).createSession({ - userId: user.userId, - attributes: { - country_code: countryCode, - user_agent: userAgent, - ip_address: ipAddress, - }, - }) - - const drizzle = await getConnection(c.env).drizzle - const emailVerificationKey = generateRandomString(16) - - await drizzle.transaction(async (trx) => { - await trx.insert(emailVerificationToken).values({ - id: emailVerificationKey, - userId: user.userId, - token: emailVerificationKey, - }) - }) - - await sendEmailConfirmationEmail( - email, - emailVerificationKey, - username, - c - ) - - const authRequest = auth(c.env).handleRequest(c) - authRequest.setSession(newSession) - return c.json({ success: true, state: "logged in" }, 200) - } catch (e) { - console.log(e) - return c.json( - { - success: false, - status: "error", - error: "Error creating user", - }, - 500 - ) - } -} diff --git a/src/v2/routes/auth/tags/create-tag.ts b/src/v2/routes/auth/tags/create-tag.ts deleted file mode 100644 index c918819..0000000 --- a/src/v2/routes/auth/tags/create-tag.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { auth } from "@/v2/lib/auth/lucia" -import { roleFlagsToArray } from "@/v2/lib/helpers/role-flags" -import { getConnection } from "@/v2/db/turso" -import { z } from "zod" -import { assetTag } from "@/v2/db/schema" - -const CreateTagSchema = z.object({ - name: z.string({ - required_error: "Name is required", - invalid_type_error: "Name must be a string", - }), - formattedName: z.string({ - required_error: "Formatted name is required", - invalid_type_error: "Formatted name must be a string", - }), -}) - -export async function createTag(c: APIContext): Promise { - const formData = CreateTagSchema.safeParse( - await c.req.formData().then((formData) => { - const data = Object.fromEntries(formData.entries()) - return data - }) - ) - - if (!formData.success) { - return c.json({ success: false, state: "invalid data" }, 400) - } - - const { name, formattedName } = formData.data - - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "invalid session" }, 401) - } - - const roleFlags = roleFlagsToArray(session.user.roleFlags) - - if (!roleFlags.includes("CREATOR")) { - return c.json({ success: false, state: "unauthorized" }, 401) - } - - const { drizzle } = getConnection(c.env) - - const tag = { - id: crypto.randomUUID(), - name, - formattedName, - assetCount: 0, - lastUpdated: new Date().toISOString(), - } - - // check if tag.name exists - const tagExists = await drizzle.query.assetTag.findFirst({ - where: (assetTag, { eq }) => eq(assetTag.name, tag.name), - }) - - if (tagExists) { - return c.json( - { success: false, state: "tag with name already exists" }, - 200 - ) - } - - try { - await drizzle.insert(assetTag).values(tag).execute() - } catch (e) { - return c.json({ success: false, state: "failed to create tag" }, 200) - } - - return c.json({ success: true, state: "created tag", tag }, 200) -} diff --git a/src/v2/routes/auth/tags/delete-tag.ts b/src/v2/routes/auth/tags/delete-tag.ts deleted file mode 100644 index 5d2050d..0000000 --- a/src/v2/routes/auth/tags/delete-tag.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { auth } from "@/v2/lib/auth/lucia" -import { roleFlagsToArray } from "@/v2/lib/helpers/role-flags" -import { getConnection } from "@/v2/db/turso" -import { z } from "zod" -import { assetTag } from "@/v2/db/schema" -import { eq } from "drizzle-orm" - -const DeleteTagSchema = z.object({ - id: z.string({ - required_error: "ID is required", - invalid_type_error: "ID must be a string", - }), -}) - -export async function deleteTag(c: APIContext): Promise { - const formData = DeleteTagSchema.safeParse( - await c.req.formData().then((formData) => { - const data = Object.fromEntries(formData.entries()) - return data - }) - ) - - if (!formData.success) { - return c.json({ success: false, state: "invalid data" }, 400) - } - - const { id } = formData.data - - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "invalid session" }, 200) - } - - const roleFlags = roleFlagsToArray(session.user.roleFlags) - - if (!roleFlags.includes("CREATOR")) { - return c.json({ success: false, state: "unauthorized" }, 401) - } - - const { drizzle } = getConnection(c.env) - - try { - await drizzle.delete(assetTag).where(eq(assetTag.id, id)).execute() - } catch (e) { - return c.json({ success: false, state: "failed to delete tag" }, 200) - } - - return c.json({ success: true, state: "deleted tag", id }, 200) -} diff --git a/src/v2/routes/auth/tags/tag-routes.ts b/src/v2/routes/auth/tags/tag-routes.ts deleted file mode 100644 index a18c9be..0000000 --- a/src/v2/routes/auth/tags/tag-routes.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { createTag } from "./create-tag" -import { deleteTag } from "./delete-tag" -import { Hono } from "hono" -import { cors } from "hono/cors" - -const tagRoute = new Hono<{ Bindings: Bindings }>() - -tagRoute.use( - "*", - cors({ - credentials: true, - origin: ["http://localhost:3000"], // TODO: update this - temporary - }) -) - -tagRoute.post("/create", async (c) => { - return createTag(c) -}) - -tagRoute.post("/delete", async (c) => { - return deleteTag(c) -}) - -export default tagRoute diff --git a/src/v2/routes/auth/user-attributes/self-upload/upload-avatar.ts b/src/v2/routes/auth/user-attributes/self-upload/upload-avatar.ts deleted file mode 100644 index deacedc..0000000 --- a/src/v2/routes/auth/user-attributes/self-upload/upload-avatar.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { auth } from "@/v2/lib/auth/lucia" -import { z } from "zod" - -const ALLOWED_BANNER_TYPES = ["image/png"] -const MAX_AVATAR_SIZE = 5000 - -const UploadProfileImageSchema = z.object({ - avatar: z - .any() - .refine((files) => files?.length == 1, "Avatar is required.") - .refine( - (files) => files?.[0]?.size <= MAX_AVATAR_SIZE, - `Max file size is 5MB.` - ) - .refine( - (files) => ALLOWED_BANNER_TYPES.includes(files?.[0]?.type), - ".png files are accepted." - ), -}) - -// TODO: add support for animated avatars -export async function uploadProfileImage(c: APIContext): Promise { - const formData = UploadProfileImageSchema.safeParse( - await c.req.formData().then((formData) => { - const data = Object.fromEntries(formData.entries()) - return data - }) - ) - - if (!formData.success) { - return c.json({ success: false, state: "invalid data" }, 400) - } - - const { avatar } = formData.data - - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "invalid session" }, 200) - } - - const newAvatar = new File([avatar], `${session.user.userId}.png`) - const newAvatarURL = `/avatars/${session.user.userId}.png` - - if (!session.user.avatarUrl) { - await auth(c.env).updateUserAttributes(session.user.userId, { - avatar_url: newAvatarURL, - }) - } - - if (session.user.avatarUrl) { - const oldAvatarObject = await c.env.FILES_BUCKET.get( - session.user.avatarUrl - ) - - if (oldAvatarObject) { - await c.env.FILES_BUCKET.delete(session.user.avatarUrl) - } - } - - await c.env.FILES_BUCKET.put(newAvatarURL, newAvatar) - - return c.json({ success: true, state: "uploaded new profile image" }, 200) -} diff --git a/src/v2/routes/auth/user-attributes/self-upload/upload-banner.ts b/src/v2/routes/auth/user-attributes/self-upload/upload-banner.ts deleted file mode 100644 index fac880a..0000000 --- a/src/v2/routes/auth/user-attributes/self-upload/upload-banner.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { auth } from "@/v2/lib/auth/lucia" -import { z } from "zod" - -const ALLOWED_BANNER_TYPES = ["image/png"] -const MAX_BANNER_SIZE = 5000 -// TODO(dromzeh): implement size checks -// const MAX_BANNER_WIDTH = 1920 -// const MAX_BANNER_HEIGHT = 1080 - -const UploadBannerSchema = z.object({ - banner: z - .any() - .refine((files) => files?.length == 1, "Banner is required.") - .refine( - (files) => files?.[0]?.size <= MAX_BANNER_SIZE, - `Max file size is 5MB.` - ) - .refine( - (files) => ALLOWED_BANNER_TYPES.includes(files?.[0]?.type), - ".png files are accepted." - ), -}) - -// TODO: add support for animated banners -export async function uploadBannerImage(c: APIContext): Promise { - const formData = UploadBannerSchema.safeParse( - await c.req.formData().then((formData) => { - const data = Object.fromEntries(formData.entries()) - return data - }) - ) - - if (!formData.success) { - return c.json({ success: false, state: "invalid data" }, 400) - } - - const { banner } = formData.data - - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "invalid session" }, 200) - } - - if (session.user.isContributor !== 1) { - return c.json({ success: false, state: "unauthorized" }, 401) - } - - const newBanner = new File([banner], `${session.user.userId}.png`) - const newBannerURL = `/banners/${session.user.userId}.png` - - if (!session.user.avatarUrl) { - await auth(c.env).updateUserAttributes(session.user.userId, { - banner_url: newBannerURL, - }) - } - - if (session.user.avatarUrl) { - const oldBannerObject = await c.env.FILES_BUCKET.get( - session.user.bannerUrl - ) - - if (oldBannerObject) { - await c.env.FILES_BUCKET.delete(session.user.avatarUrl) - } - } - - await c.env.FILES_BUCKET.put(newBannerURL, newBanner) - - return c.json({ success: true, state: "uploaded new banner" }, 200) -} diff --git a/src/v2/routes/auth/user-attributes/update-user-attributes.ts b/src/v2/routes/auth/user-attributes/update-user-attributes.ts deleted file mode 100644 index 4ac15bd..0000000 --- a/src/v2/routes/auth/user-attributes/update-user-attributes.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { auth } from "@/v2/lib/auth/lucia" -import { z } from "zod" - -type UserAttributes = { - display_name?: string - username?: string - pronouns?: string - self_assignable_role_flags?: number - bio?: string -} - -const UpdateUserAttributesSchema = z - .object({ - display_name: z - .string({ - invalid_type_error: "Display name must be a string", - }) - .optional(), - username: z - .string({ - invalid_type_error: "Username must be a string", - }) - .min(3, "Username must be at least 3 characters long") - .max(32, "Username must be at most 32 characters long") - .optional(), - pronouns: z - .string({ - invalid_type_error: "Pronouns must be a string", - }) - .optional(), - self_assignable_roles: z - .number({ - invalid_type_error: "Self-assignable roles must be a number", - }) - .optional(), - bio: z - .string({ - invalid_type_error: "Bio must be a string", - }) - .optional(), - }) - .partial() - -export async function updateUserAttributes(c: APIContext): Promise { - const formData = UpdateUserAttributesSchema.safeParse( - await c.req.formData().then((formData) => { - const data = Object.fromEntries(formData.entries()) - return data - }) - ) - - if (!formData.success) { - return c.json({ success: false, state: "invalid data" }, 400) - } - - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "unauthorized" }, 401) - } - - const attributes: UserAttributes = { - display_name: formData.data.display_name, - username: formData.data.username, - pronouns: formData.data.pronouns, - self_assignable_role_flags: formData.data.self_assignable_roles, - bio: formData.data.bio, - } - - try { - await auth(c.env).updateUserAttributes(session.user.userId, attributes) - return c.json( - { success: true, state: "updated user attributes", session }, - 200 - ) - } catch (error) { - return c.json( - { success: false, state: "error updating user attributes" }, - 500 - ) - } -} diff --git a/src/v2/routes/auth/user-attributes/user-attributes-routes.ts b/src/v2/routes/auth/user-attributes/user-attributes-routes.ts deleted file mode 100644 index 34a6d66..0000000 --- a/src/v2/routes/auth/user-attributes/user-attributes-routes.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { updateUserAttributes } from "./update-user-attributes" -import { uploadProfileImage } from "./self-upload/upload-avatar" -import { uploadBannerImage } from "./self-upload/upload-banner" -import { followUser } from "./user-relations/follow-user" -import { unfollowUser } from "./user-relations/unfollow-user" -import { Hono } from "hono" -import { cors } from "hono/cors" - -const userAttributesRoute = new Hono<{ Bindings: Bindings }>() - -userAttributesRoute.use( - "*", - cors({ - credentials: true, - origin: ["http://localhost:3000"], // TODO: update this - temporary - }) -) - -userAttributesRoute.post("/update", async (c) => { - return updateUserAttributes(c) -}) - -userAttributesRoute.post("/upload/avatar", async (c) => { - return uploadProfileImage(c) -}) - -userAttributesRoute.post("/upload/banner", async (c) => { - return uploadBannerImage(c) -}) - -userAttributesRoute.post("/follow", async (c) => { - return followUser(c) -}) - -userAttributesRoute.post("/unfollow", async (c) => { - return unfollowUser(c) -}) - -export default userAttributesRoute diff --git a/src/v2/routes/auth/user-attributes/user-relations/follow-user.ts b/src/v2/routes/auth/user-attributes/user-relations/follow-user.ts deleted file mode 100644 index fc1cf02..0000000 --- a/src/v2/routes/auth/user-attributes/user-relations/follow-user.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { auth } from "@/v2/lib/auth/lucia" -import { getConnection } from "@/v2/db/turso" -import { z } from "zod" -import { userNetworking } from "@/v2/db/schema" - -const FollowUserSchema = z.object({ - userIdToFollow: z.string({ - required_error: "User ID is required", - invalid_type_error: "User ID must be a string", - }), -}) - -export async function followUser(c: APIContext): Promise { - const formData = FollowUserSchema.safeParse( - await c.req.formData().then((formData) => { - const data = Object.fromEntries(formData.entries()) - return data - }) - ) - - if (!formData.success) { - return c.json({ success: false, state: "invalid data" }, 400) - } - - const { userIdToFollow: userToFollow } = formData.data - - const { drizzle } = getConnection(c.env) - - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "invalid session" }, 200) - } - - // check if user exists - const user = await drizzle.query.authUser.findFirst({ - where: (authUser, { eq }) => eq(authUser.id, userToFollow), - }) - - if (!user) { - return c.json({ success: false, state: "user not found" }, 200) - } - - if (user.id === session.user.userId) { - return c.json({ success: false, state: "cannot follow yourself" }, 200) - } - - // check if user is already following - - const existingFollow = await drizzle.query.userNetworking.findFirst({ - where: (userNetworking, { and, eq }) => - and( - eq(userNetworking.followerId, session.user.userId), - eq(userNetworking.followingId, user.id) - ), - }) - - if (existingFollow) { - return c.json({ success: false, state: "already following user" }, 200) - } - - try { - await drizzle.insert(userNetworking).values({ - followerId: session.user.userId, - followingId: user.id, - createdAt: new Date().toISOString(), - }) - } catch (e) { - return c.json({ success: false, state: "failed to follow user" }, 200) - } - - return c.json({ success: true, state: "followed" }, 200) -} diff --git a/src/v2/routes/auth/user-attributes/user-relations/unfollow-user.ts b/src/v2/routes/auth/user-attributes/user-relations/unfollow-user.ts deleted file mode 100644 index 7e54981..0000000 --- a/src/v2/routes/auth/user-attributes/user-relations/unfollow-user.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { auth } from "@/v2/lib/auth/lucia" -import { getConnection } from "@/v2/db/turso" -import { z } from "zod" -import { userNetworking } from "@/v2/db/schema" -import { eq, and } from "drizzle-orm" - -const UnfollowUserSchema = z.object({ - userIdToUnFollow: z.string({ - required_error: "User ID is required", - invalid_type_error: "User ID must be a string", - }), -}) - -export async function unfollowUser(c: APIContext): Promise { - const formData = UnfollowUserSchema.safeParse( - await c.req.formData().then((formData) => { - const data = Object.fromEntries(formData.entries()) - return data - }) - ) - if (!formData.success) { - return c.json({ success: false, state: "invalid data" }, 400) - } - - const { userIdToUnFollow: userToUnFollow } = formData.data - - const { drizzle } = getConnection(c.env) - - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - return c.json({ success: false, state: "invalid session" }, 200) - } - - if (userToUnFollow === session.user.userId) { - return c.json( - { success: false, state: "cannot unfollow yourself" }, - 200 - ) - } - - // check if user exists - const user = await drizzle.query.authUser.findFirst({ - where: (authUser, { eq }) => eq(authUser.id, userToUnFollow), - }) - - if (!user) { - return c.json({ success: false, state: "user not found" }, 200) - } - - // check if user is already following - - const existingFollow = await drizzle.query.userNetworking.findFirst({ - where: (networking, { and, eq }) => - and( - eq(networking.followerId, session.user.userId), - eq(networking.followingId, user.id) - ), - }) - - if (!existingFollow) { - return c.json({ success: false, state: "not following user" }, 200) - } - - try { - await drizzle - .delete(userNetworking) - .where( - and( - eq(userNetworking.followerId, session.user.userId), - eq(userNetworking.followingId, user.id) - ) - ) - .returning() - } catch (e) { - return c.json({ success: false, state: "error unfollowing user" }, 200) - } - - return c.json({ success: true, state: "unfollowed user" }, 200) -} diff --git a/src/v2/routes/auth/validate.ts b/src/v2/routes/auth/validate.ts deleted file mode 100644 index d1672ce..0000000 --- a/src/v2/routes/auth/validate.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { auth } from "@/v2/lib/auth/lucia" - -export async function validate(c: APIContext): Promise { - console.log(c) - const authRequest = auth(c.env).handleRequest(c) - - const session = await authRequest.validate() - - const countryCode = c.req.header("cf-ipcountry") ?? "" - const userAgent = c.req.header("user-agent") ?? "" - const ipAddress = c.req.header("cf-connecting-ip") ?? "" - - if (!session) { - authRequest.setSession(null) - return c.json({ success: false, state: "invalid session" }, 401) - } - - if ( - session.userAgent !== userAgent || - session.countryCode !== countryCode || - session.ipAddress !== ipAddress || - session.state === "idle" - ) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - return c.json({ success: false, state: "invalid session" }, 401) - } - - return c.json({ success: true, state: "valid session", session }, 200) -} diff --git a/src/v2/routes/auth/verify-email.ts b/src/v2/routes/auth/verify-email.ts deleted file mode 100644 index c0145fd..0000000 --- a/src/v2/routes/auth/verify-email.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { auth } from "@/v2/lib/auth/lucia" -import { getConnection } from "@/v2/db/turso" -import { emailVerificationToken, authUser } from "@/v2/db/schema" -import { eq } from "drizzle-orm" - -export async function verifyEmail(c: APIContext): Promise { - const authRequest = auth(c.env).handleRequest(c) - - const { token } = c.req.param() - - if (!token) { - return c.json({ success: false, state: "invalid token entered" }, 200) - } - - const { drizzle } = getConnection(c.env) - const session = await authRequest.validate() - - const relatedUser = await drizzle - .select() - .from(emailVerificationToken) - .where(eq(emailVerificationToken.token, token)) - - if (!relatedUser) { - return c.json({ success: false, state: "invalid token entered" }, 200) - } - - if (session) { - if (relatedUser[0].userId !== session.user.userId) { - return c.json( - { success: false, state: "invalid token entered" }, - 200 - ) - } - } - - await drizzle.transaction(async (trx) => { - await trx - .delete(emailVerificationToken) - .where(eq(emailVerificationToken.token, token)) - await trx - .update(authUser) - .set({ - emailVerified: 1, - }) - .where(eq(authUser.id, relatedUser[0].userId)) - }) - - return c.json({ success: true, state: "email validated" }, 200) -} diff --git a/src/v2/routes/discord/contributors.ts b/src/v2/routes/discord/contributors.ts deleted file mode 100644 index d30a043..0000000 --- a/src/v2/routes/discord/contributors.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { responseHeaders } from "@/v2/lib/response-headers" -import { roles, guildId } from "@/v2/lib/discord" -import type { Contributor, GuildMember } from "@/v2/lib/types/discord" - -// TODO: replace discord contributors with roles on the site -export async function contributors(c: APIContext): Promise { - const members: Contributor[] = [] - - let after: string | null = null - let fetchUsers = true - - while (fetchUsers) { - const response = await fetch( - `https://discord.com/api/guilds/${guildId}/members?limit=1000${ - after ? `&after=${after}` : "" - }`, - { - headers: { - Authorization: `Bot ${c.env.DISCORD_TOKEN}`, - }, - } - ) - - // @ts-expect-error: ok - const guildMembers: GuildMember[] = await response.json() - - const filteredMembers: GuildMember[] = guildMembers.filter((member) => { - return member.roles.some((role) => - Object.keys(roles).includes(role) - ) - }) - - const contributors: Contributor[] = filteredMembers.map((member) => { - const rolesArray = member.roles - .map((role) => roles[role]) - .filter((role) => role) - - // TODO: support animated avatars - return { - id: member.user.id, - username: member.user.username, - globalname: member.user.global_name || null, - avatar: `https://cdn.discordapp.com/avatars/${member.user.id}/${member.user.avatar}.webp`, - roles: rolesArray, - } - }) - - members.push(...contributors) - - if ( - !guildMembers.length || - !guildMembers[guildMembers.length - 1].user - ) { - fetchUsers = false - } - - after = guildMembers[guildMembers.length - 1]?.user?.id - } - - return c.json( - { - success: true, - status: "ok", - contributors: members, - }, - 200, - responseHeaders - ) -} diff --git a/src/v2/routes/discord/discord-routes.ts b/src/v2/routes/discord/discord-routes.ts deleted file mode 100644 index 6bd903d..0000000 --- a/src/v2/routes/discord/discord-routes.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Hono } from "hono" -import { contributors } from "./contributors" - -const discordRoute = new Hono<{ Bindings: Bindings }>() - -discordRoute.get("/contributors", async (c) => { - return contributors(c) -}) - -export default discordRoute diff --git a/src/v2/routes/game/route.ts b/src/v2/routes/game/route.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/game/search/[id]/route.ts b/src/v2/routes/game/search/[id]/route.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/game/search/[name]/route.ts b/src/v2/routes/game/search/[name]/route.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/game/search/all/route.ts b/src/v2/routes/game/search/all/route.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/games/all-games.ts b/src/v2/routes/games/all-games.ts deleted file mode 100644 index fcc257a..0000000 --- a/src/v2/routes/games/all-games.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { responseHeaders } from "@/v2/lib/response-headers" -import { getConnection } from "@/v2/db/turso" -import { listBucket } from "@/v2/lib/list-bucket" -import { game } from "@/v2/db/schema" - -export async function getAllGames(c: APIContext): Promise { - const cacheKey = new Request(c.req.url.toString(), c.req) - const cache = caches.default - let response = await cache.match(cacheKey) - - if (response) return response - - const files = await listBucket(c.env.FILES_BUCKET, { - prefix: "oc-generators/", - delimiter: "/", - }) - - const results = files.delimitedPrefixes.map((file) => { - return { - name: file.replace("oc-generators/", "").replace("/", ""), - } - }) - - const { drizzle } = getConnection(c.env) - - const gameList = await drizzle - .select() - .from(game) - .execute() - .then((row) => - row.map((game) => ({ - ...game, - has_generator: results.some( - (generator) => generator.name === game.name - ), - })) - ) - - response = c.json( - { - success: true, - status: "ok", - results: gameList, - }, - 200, - responseHeaders - ) - - response.headers.set("Cache-Control", "s-maxage=1200") - await cache.put(cacheKey, response.clone()) - - return response -} diff --git a/src/v2/routes/games/games-routes.ts b/src/v2/routes/games/games-routes.ts deleted file mode 100644 index 2f13546..0000000 --- a/src/v2/routes/games/games-routes.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Hono } from "hono" -import { getAllGames } from "./all-games" - -const gameRoute = new Hono<{ Bindings: Bindings }>() - -gameRoute.get("/all", async (c) => { - return getAllGames(c) -}) - -export default gameRoute diff --git a/src/v2/routes/oc-generators/get-generator.ts b/src/v2/routes/oc-generators/get-generator.ts deleted file mode 100644 index 6f10db5..0000000 --- a/src/v2/routes/oc-generators/get-generator.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { responseHeaders } from "@/v2/lib/response-headers" -import { listBucket } from "@/v2/lib/list-bucket" -import { createNotFoundResponse } from "@/v2/lib/helpers/responses/not-found" - -export async function getGeneratorFromName(c: APIContext): Promise { - const { gameName } = c.req.param() - const cacheKey = new Request(c.req.url.toString(), c.req) - const cache = caches.default - let response = await cache.match(cacheKey) - - if (response) return response - - const files = await listBucket(c.env.FILES_BUCKET, { - prefix: `oc-generators/${gameName}/list.json`, - }) - - if (files.objects.length === 0) - return createNotFoundResponse(c, "Generator not found", responseHeaders) - - const data = await fetch( - `https://files.wanderer.moe/${files.objects[0].key}` - ) - - const generatorData = await data.json() - - response = c.json( - { - status: "ok", - data: generatorData, - }, - 200, - responseHeaders - ) - - response.headers.set("Cache-Control", "s-maxage=604800") // the content of this file is unlikely to change, so caching is fine - await cache.put(cacheKey, response.clone()) - - return response -} diff --git a/src/v2/routes/oc-generators/get-generators.ts b/src/v2/routes/oc-generators/get-generators.ts deleted file mode 100644 index 8918c7a..0000000 --- a/src/v2/routes/oc-generators/get-generators.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { responseHeaders } from "@/v2/lib/response-headers" -import { listBucket } from "@/v2/lib/list-bucket" - -export async function getGenerators(c: APIContext): Promise { - const cacheKey = new Request(c.req.url.toString(), c.req) - const cache = caches.default - let response = await cache.match(cacheKey) - - if (response) return response - - // listing all files inside of oc-generators subfolder, as they can't be manually inputted - // by users but instead stored on the oc-generators repo which is synced with R2 bucket - const files = await listBucket(c.env.FILES_BUCKET, { - prefix: "oc-generators/", - delimiter: "/", - }) - - // console.log(files); - - const results = files.delimitedPrefixes.map((file) => { - return { - name: file.replace("oc-generators/", "").replace("/", ""), - path: `/oc-generators/${file - .replace("oc-generators/", "") - .replace("/", "")}`, - } - }) - - response = c.json( - { - status: "ok", - data: results, - }, - 200, - responseHeaders - ) - - response.headers.set("Cache-Control", "s-maxage=28800") - await cache.put(cacheKey, response.clone()) - - return response -} diff --git a/src/v2/routes/oc-generators/oc-generator-routes.ts b/src/v2/routes/oc-generators/oc-generator-routes.ts deleted file mode 100644 index 4e7d866..0000000 --- a/src/v2/routes/oc-generators/oc-generator-routes.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Hono } from "hono" -import { getGeneratorFromName } from "./get-generator" -import { getGenerators } from "./get-generators" - -const ocGeneratorRoute = new Hono<{ Bindings: Bindings }>() - -ocGeneratorRoute.get("/", async (c) => { - return getGenerators(c) -}) - -ocGeneratorRoute.get("/:gameName", async (c) => { - return getGeneratorFromName(c) -}) - -export default ocGeneratorRoute diff --git a/src/v2/routes/route.ts b/src/v2/routes/route.ts new file mode 100644 index 0000000..58d27c4 --- /dev/null +++ b/src/v2/routes/route.ts @@ -0,0 +1,8 @@ +import { OpenAPIHono } from "@hono/zod-openapi"; +import UserRoute from "@/v2/routes/user/route"; + +const handler = new OpenAPIHono<{ Bindings: Bindings, Variables: Variables }>() + +handler.route("", UserRoute) + +export default handler \ No newline at end of file diff --git a/src/v2/routes/search/all/search-all.ts b/src/v2/routes/search/all/search-all.ts deleted file mode 100644 index b20414a..0000000 --- a/src/v2/routes/search/all/search-all.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { responseHeaders } from "@/v2/lib/response-headers" -import { getConnection } from "@/v2/db/turso" - -import { like, eq } from "drizzle-orm" -import { auth } from "@/v2/lib/auth/lucia" - -export async function searchAll(c: APIContext): Promise { - const { query } = c.req.param() - const cacheKey = new Request(c.req.url.toString(), c.req) - const cache = caches.default - let response = await cache.match(cacheKey) - - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - } - - if (response) return response - const { drizzle } = getConnection(c.env) - - // this is a disaster - // https://cdn.discordapp.com/attachments/1102306276832202813/1147291827699986572/F.gif - const usersResponse = await drizzle.query.authUser.findMany({ - where: (authUser) => { - return like(authUser.username, `%${query}%`) - }, - columns: { - email: false, - emailVerified: false, - }, - limit: 25, - }) - - const assetCategoryResponse = await drizzle.query.assetCategory.findMany({ - where: (assetCategory) => { - return like(assetCategory.name, `%${query}%`) - }, - limit: 25, - }) - - const assetTagResponse = await drizzle.query.assetTag.findMany({ - where: (assetTag) => { - return like(assetTag.name, `%${query}%`) - }, - limit: 25, - }) - - const assetsResponse = await drizzle.query.asset.findMany({ - where: (asset) => { - return like(asset.name, `%${query}%`) - }, - limit: 25, - }) - - const gameResponse = await drizzle.query.game.findMany({ - where: (game) => { - return like(game.name, `%${query}%`) - }, - limit: 25, - }) - - const savedOcGeneratorsResponse = - await drizzle.query.savedOcGenerators.findMany({ - where: (savedOcGenerators, { or, and }) => { - return or( - and( - eq(savedOcGenerators.isPublic, 1), - session && - eq(savedOcGenerators.userId, session.user.userId) - ), - like(savedOcGenerators.name, `%${query}%`) - ) - }, - limit: 25, - }) - - const collectionsResponse = await drizzle.query.userCollection.findMany({ - where: (userCollection, { or, and }) => { - return and( - or( - session && eq(userCollection.userId, session.user.userId), - eq(userCollection.isPublic, 1) - ), - like(userCollection.name, `%${query}%`) - ) - }, - limit: 25, - }) - - response = c.json( - { - success: true, - status: "ok", - query, - isAuthed: session && session.user.userId ? true : false, - results: { - usersResponse: usersResponse ? usersResponse : [], - assetsResponse: assetsResponse ? assetsResponse : [], - assetCategoryResponse: assetCategoryResponse - ? assetCategoryResponse - : [], - assetTagResponse: assetTagResponse ? assetTagResponse : [], - savedOcGeneratorsResponse: savedOcGeneratorsResponse - ? savedOcGeneratorsResponse - : [], - gameResponse: gameResponse ? gameResponse : [], - collectionsResponse: collectionsResponse - ? collectionsResponse - : [], - }, - }, - 200, - responseHeaders - ) - - response.headers.set("Cache-Control", "s-maxage=1200") - await cache.put(cacheKey, response.clone()) - return response -} diff --git a/src/v2/routes/search/asset/recent-assets.ts b/src/v2/routes/search/asset/recent-assets.ts deleted file mode 100644 index 551067e..0000000 --- a/src/v2/routes/search/asset/recent-assets.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { responseHeaders } from "@/v2/lib/response-headers" -import { getConnection } from "@/v2/db/turso" -import { desc } from "drizzle-orm" - -import { asset } from "@/v2/db/schema" - -// get 100 most recent assets, sorted by asset.uploadedDate -export async function recentAssets(c: APIContext): Promise { - const cacheKey = new Request(c.req.url.toString(), c.req) - const cache = caches.default - let response = await cache.match(cacheKey) - - if (response) return response - - const { drizzle } = getConnection(c.env) - - const assetResponse = await drizzle.query.asset.findMany({ - orderBy: desc(asset.uploadedDate), - limit: 100, - where: (asset, { eq }) => eq(asset.status, "approved"), - }) - - response = c.json( - { - success: true, - status: "ok", - results: assetResponse, - }, - 200, - responseHeaders - ) - - response.headers.set("Cache-Control", "s-maxage=60") - await cache.put(cacheKey, response.clone()) - return response -} diff --git a/src/v2/routes/search/asset/search-assets.ts b/src/v2/routes/search/asset/search-assets.ts deleted file mode 100644 index e725216..0000000 --- a/src/v2/routes/search/asset/search-assets.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { responseHeaders } from "@/v2/lib/response-headers" -import { getConnection } from "@/v2/db/turso" -import { assetTagAsset, asset, assetTag, authUser } from "@/v2/db/schema" -import { desc, like, sql, eq, and, or } from "drizzle-orm" -import { SplitQueryByCommas } from "@/v2/lib/helpers/split-query-by-commas" - -export async function searchForAssets(c: APIContext): Promise { - const cacheKey = new Request(c.req.url.toString(), c.req) - const cache = caches.default - let response = await cache.match(cacheKey) - if (response) return response - - const { query, gameQuery, assetCategoryQuery, assetTagQuery } = - c.req.query() - - // search parameters can include optional search params: query, game, assetCategory, assetTag - // query?: string => ?query=keqing - // game?: comma separated list of game names => ?game=genshin-impact,honkai-impact-3rd - // assetCategory?: comma separated list of asset category names => ?assetCategory=splash-art,character-sheets - // assetTag?: comma separated list of asset tag names => ?assetTag=no-background,fanmade,official - - const { drizzle } = getConnection(c.env) - - const searchQuery = query ?? null - const gameList = gameQuery - ? SplitQueryByCommas(gameQuery.toLowerCase()) - : null - const assetCategoryList = assetCategoryQuery - ? SplitQueryByCommas(assetCategoryQuery.toLowerCase()) - : null - const assetTagList = assetTagQuery - ? SplitQueryByCommas(assetTagQuery.toLowerCase()) - : // TODO(dromzeh): allow for no tags to be specified - ["official"] - - const assetTagResponse = drizzle.$with("sq").as( - drizzle - .select({ - assetId: assetTagAsset.assetId, - tags: sql`array_agg(${assetTag})`.as("tags"), - }) - .from(assetTagAsset) - .leftJoin(assetTag, eq(assetTag.id, assetTagAsset.assetTagId)) - .where(or(...assetTagList.map((tag) => eq(assetTag.name, tag)))) - .groupBy(assetTagAsset.assetId) - ) - - const result = await drizzle - .with(assetTagResponse) - .select() - .from(asset) - .innerJoin(assetTagResponse, eq(assetTagResponse.assetId, asset.id)) - .where( - and( - searchQuery && like(asset.name, `%${searchQuery}%`), - gameList && - or( - ...gameList.map((game) => - eq(asset.assetCategoryId, game) - ) - ), - assetCategoryList && - or( - ...assetCategoryList.map((category) => - eq(asset.assetCategoryId, category) - ) - ), - eq(asset.status, "approved") - ) - ) - .leftJoin(authUser, eq(authUser.id, asset.uploadedById)) - .orderBy(desc(asset.uploadedDate)) - .limit(500) - - response = c.json( - { - success: true, - status: "ok", - query, - gameQuery, - assetCategoryQuery, - assetTagQuery, - results: result ?? [], - }, - 200, - responseHeaders - ) - - response.headers.set("Cache-Control", "s-maxage=600") - await cache.put(cacheKey, response.clone()) - return response -} diff --git a/src/v2/routes/search/search-routes.ts b/src/v2/routes/search/search-routes.ts deleted file mode 100644 index 2d2ddba..0000000 --- a/src/v2/routes/search/search-routes.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { Hono } from "hono" -import { searchAll } from "./all/search-all" -import { getUserByUsername } from "./user/get-user-by-username" -import { getUsersBySearch } from "./user/get-users-by-search" -import authRoute from "../auth/auth-routes" -import { searchForAssets } from "./asset/search-assets" -import { recentAssets } from "./asset/recent-assets" -import { cors } from "hono/cors" - -const searchRoute = new Hono<{ Bindings: Bindings }>() - -searchRoute.get("/all/:query", async (c) => { - return searchAll(c) -}) - -authRoute.use( - "/all/:query", - cors({ - credentials: true, - origin: ["http://localhost:3000"], // TODO: update this - temporary - }) -) - -authRoute.use( - "/users/user/:username", - cors({ - credentials: true, - origin: ["http://localhost:3000"], // TODO: update this - temporary - }) -) - -searchRoute.get("/assets/query", async (c) => { - return searchForAssets(c) -}) - -searchRoute.get("/assets/recent", async (c) => { - return recentAssets(c) -}) - -searchRoute.get("/users/user/:username", async (c) => { - return getUserByUsername(c) -}) - -searchRoute.get("/users/query/:query", async (c) => { - return getUsersBySearch(c) -}) - -export default searchRoute diff --git a/src/v2/routes/search/user/get-user-by-username.ts b/src/v2/routes/search/user/get-user-by-username.ts deleted file mode 100644 index 1060d29..0000000 --- a/src/v2/routes/search/user/get-user-by-username.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { responseHeaders } from "@/v2/lib/response-headers" -import { getConnection } from "@/v2/db/turso" -import { createNotFoundResponse } from "@/v2/lib/helpers/responses/not-found" - -import { auth } from "@/v2/lib/auth/lucia" -import { - roleFlagsToArray, - SelfAssignableRoleFlagsToArray, -} from "@/v2/lib/helpers/role-flags" - -export async function getUserByUsername(c: APIContext): Promise { - const { username } = c.req.param() - const cacheKey = new Request(c.req.url.toString(), c.req) - const cache = caches.default - let response = await cache.match(cacheKey) - - const authRequest = auth(c.env).handleRequest(c) - const session = await authRequest.validate() - - if (!session || session.state === "idle") { - if (session) { - await auth(c.env).invalidateSession(session.sessionId) - authRequest.setSession(null) - } - } - - if (response) return response - const { drizzle } = getConnection(c.env) - - const user = await drizzle.query.authUser.findFirst({ - where: (authUser, { and, eq }) => and(eq(authUser.username, username)), - columns: { - email: false, - emailVerified: false, - }, - }) - - if (!user) { - response = createNotFoundResponse(c, "User not found", responseHeaders) - await cache.put(cacheKey, response.clone()) - return response - } - - response = c.json( - { - success: true, - status: "ok", - accountIsAuthed: session && session.user.userId ? true : false, - userIsQueryingOwnAccount: - session && session.user.userId === user.id ? true : false, - userRoleFlagsArray: roleFlagsToArray(user.roleFlags), - userSelfAssignableRoleFlagsArray: - SelfAssignableRoleFlagsToArray(user.roleFlags) ?? [], - user, - }, - 200, - responseHeaders - ) - - response.headers.set("Cache-Control", "s-maxage=120") - await cache.put(cacheKey, response.clone()) - - return response -} diff --git a/src/v2/routes/search/user/get-users-by-search.ts b/src/v2/routes/search/user/get-users-by-search.ts deleted file mode 100644 index de038ba..0000000 --- a/src/v2/routes/search/user/get-users-by-search.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { getConnection } from "@/v2/db/turso" -import { like } from "drizzle-orm" - -export async function getUsersBySearch(c: APIContext): Promise { - const cacheKey = new Request(c.req.url.toString(), c.req) - const cache = caches.default - let response = await cache.match(cacheKey) - if (response) return response - - const { query } = c.req.param() - const { drizzle } = getConnection(c.env) - - const userList = await drizzle.query.authUser.findMany({ - where: (authUser, { or }) => { - return or(like(authUser.username, `%${query}%`)) - }, - columns: { - email: false, - emailVerified: false, - }, - limit: 25, - }) - - if (!userList) { - return c.json( - { - success: false, - status: "user not found", - }, - 200 - ) - } - - response = c.json( - { - success: true, - status: "ok", - query, - results: userList, - }, - 200 - ) - - response.headers.set("Cache-Control", "s-maxage=60") - await cache.put(cacheKey, response.clone()) - - return response -} diff --git a/src/v2/routes/tags/all-tags.ts b/src/v2/routes/tags/all-tags.ts deleted file mode 100644 index ef05572..0000000 --- a/src/v2/routes/tags/all-tags.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { getConnection } from "@/v2/db/turso" -import { assetTag } from "@/v2/db/schema" -import { asc } from "drizzle-orm" - -export async function listAllassetTag(c: APIContext): Promise { - const cacheKey = new Request(c.req.url.toString(), c.req) - const cache = caches.default - let response = await cache.match(cacheKey) - - if (response) return response - - const { drizzle } = getConnection(c.env) - - const result = await drizzle - .select() - .from(assetTag) - .orderBy(asc(assetTag.name)) - - response = c.json( - { - success: true, - status: "ok", - result, - }, - 200 - ) - - response.headers.set("Cache-Control", "s-maxage=604800") - await cache.put(cacheKey, response.clone()) - - return response -} diff --git a/src/v2/routes/tags/get-tag-by-id.ts b/src/v2/routes/tags/get-tag-by-id.ts deleted file mode 100644 index e27d490..0000000 --- a/src/v2/routes/tags/get-tag-by-id.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { assetTag } from "@/v2/db/schema" -import { getConnection } from "@/v2/db/turso" -import { eq } from "drizzle-orm" - -export async function getTagById(c: APIContext): Promise { - const cacheKey = new Request(c.req.url.toString(), c.req) - const cache = caches.default - let response = await cache.match(cacheKey) - - if (response) return response - - const { drizzle } = getConnection(c.env) - - const result = await drizzle - .select() - .from(assetTag) - .where(eq(assetTag.name, c.req.param("id"))) - - response = c.json( - { - success: true, - status: "ok", - result, - }, - 200 - ) - - response.headers.set("Cache-Control", "s-maxage=120") - await cache.put(cacheKey, response.clone()) - - return response -} diff --git a/src/v2/routes/tags/get-tag-by-name.ts b/src/v2/routes/tags/get-tag-by-name.ts deleted file mode 100644 index 21aa003..0000000 --- a/src/v2/routes/tags/get-tag-by-name.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { getConnection } from "@/v2/db/turso" -import { eq } from "drizzle-orm" -import { assetTag } from "@/v2/db/schema" - -export async function getTagByName(c: APIContext): Promise { - const cacheKey = new Request(c.req.url.toString(), c.req) - const cache = caches.default - let response = await cache.match(cacheKey) - - if (response) return response - - const { drizzle } = getConnection(c.env) - - const result = await drizzle - .select() - .from(assetTag) - .where(eq(assetTag.name, c.req.param("name"))) - - response = c.json( - { - success: true, - status: "ok", - result, - }, - 200 - ) - - response.headers.set("Cache-Control", "s-maxage=120") - await cache.put(cacheKey, response.clone()) - - return response -} diff --git a/src/v2/routes/tags/tags-routes.ts b/src/v2/routes/tags/tags-routes.ts deleted file mode 100644 index 457dc85..0000000 --- a/src/v2/routes/tags/tags-routes.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Hono } from "hono" -import { listAllassetTag } from "./all-tags" -import { getTagById } from "./get-tag-by-id" -import { getTagByName } from "./get-tag-by-name" - -const tagsRoute = new Hono<{ Bindings: Bindings }>() - -tagsRoute.get("/all", async (c) => { - return listAllassetTag(c) -}) - -tagsRoute.get("/id/:id", async (c) => { - return getTagById(c) -}) - -tagsRoute.get("/name/:name", async (c) => { - return getTagByName(c) -}) - -export default tagsRoute diff --git a/src/v2/routes/user/route.ts b/src/v2/routes/user/route.ts new file mode 100644 index 0000000..41ee749 --- /dev/null +++ b/src/v2/routes/user/route.ts @@ -0,0 +1,18 @@ +import { OpenAPIHono } from "@hono/zod-openapi"; +import UserSearchRoute from "@/v2/routes/user/search/route"; +import { getConnection } from "@/v2/db/turso"; + +const handler = new OpenAPIHono<{ Bindings: Bindings, Variables: Variables }>() + +handler.route("/search", UserSearchRoute) + +handler.use("*", async (ctx, next) => { + const { drizzle, turso } = getConnection(ctx.env) + + ctx.set("drizzle", drizzle) + ctx.set("turso", turso) + + await next() +}); + +export default handler \ No newline at end of file diff --git a/src/v2/routes/user/search/[id]/openapi.ts b/src/v2/routes/user/search/[id]/openapi.ts new file mode 100644 index 0000000..3fbc316 --- /dev/null +++ b/src/v2/routes/user/search/[id]/openapi.ts @@ -0,0 +1,19 @@ +import { createRoute } from "@hono/zod-openapi" +import { getUserByIdSchema } from "./schema" + +export const getUserByIdRoute = createRoute({ + path: "/user/id/{id}", + method: "get", + description: "Get a user by their ID.", + request: { + params: getUserByIdSchema, + }, + responses: { + 200: { + description: "The user was found.", + }, + 404: { + description: "The user was not found.", + }, + }, +}) diff --git a/src/v2/routes/user/search/[id]/route.ts b/src/v2/routes/user/search/[id]/route.ts new file mode 100644 index 0000000..33feb64 --- /dev/null +++ b/src/v2/routes/user/search/[id]/route.ts @@ -0,0 +1,20 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { getUserByIdRoute } from "./openapi" +import { UserSearchManager } from "@/v2/lib/managers/user/user-search-manager" + +const handler = new OpenAPIHono<{ Bindings: Bindings, Variables: Variables }>() + +handler.openapi(getUserByIdRoute, async (ctx) => { + const userId = ctx.req.valid("param").id + + const drizzle = ctx.get("drizzle") + + const search = new UserSearchManager(drizzle) + const user = await search.getUserById(userId) + + return ctx.jsonT({ + user, + }) +}) + +export default handler \ No newline at end of file diff --git a/src/v2/routes/user/search/[id]/schema.ts b/src/v2/routes/user/search/[id]/schema.ts new file mode 100644 index 0000000..f1059e2 --- /dev/null +++ b/src/v2/routes/user/search/[id]/schema.ts @@ -0,0 +1,12 @@ +import { z } from "@hono/zod-openapi" + +export const getUserByIdSchema = z.object({ + id: z.string().openapi({ + param: { + name: "id", + in: "path", + required: true, + }, + description: "The ID of the user to retrieve.", + }), +}) diff --git a/src/v2/routes/user/search/[name]/openapi.ts b/src/v2/routes/user/search/[name]/openapi.ts new file mode 100644 index 0000000..80015e8 --- /dev/null +++ b/src/v2/routes/user/search/[name]/openapi.ts @@ -0,0 +1,19 @@ +import { createRoute } from "@hono/zod-openapi" +import { getUserByNameSchema } from "./schema" + +export const getUserByNameRoute = createRoute({ + path: "/user/username/{username}", + method: "get", + description: "Get a user by their username.", + request: { + params: getUserByNameSchema, + }, + responses: { + 200: { + description: "The user was found.", + }, + 404: { + description: "The user was not found.", + }, + }, +}) diff --git a/src/v2/routes/user/search/[name]/route.ts b/src/v2/routes/user/search/[name]/route.ts new file mode 100644 index 0000000..d957937 --- /dev/null +++ b/src/v2/routes/user/search/[name]/route.ts @@ -0,0 +1,20 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { getUserByNameRoute } from "./openapi" +import { UserSearchManager } from "@/v2/lib/managers/user/user-search-manager" + +const handler = new OpenAPIHono<{ Bindings: Bindings, Variables: Variables }>() + +handler.openapi(getUserByNameRoute, async (ctx) => { + const userId = ctx.req.valid("param").username + + const drizzle = ctx.get("drizzle") + + const search = new UserSearchManager(drizzle) + const user = await search.getUserByUsername(userId) + + return ctx.jsonT({ + user, + }) +}) + +export default handler \ No newline at end of file diff --git a/src/v2/routes/user/search/[name]/schema.ts b/src/v2/routes/user/search/[name]/schema.ts new file mode 100644 index 0000000..db065cf --- /dev/null +++ b/src/v2/routes/user/search/[name]/schema.ts @@ -0,0 +1,12 @@ +import { z } from "@hono/zod-openapi" + +export const getUserByNameSchema = z.object({ + username: z.string().openapi({ + param: { + name: "username", + in: "path", + required: true, + }, + description: "The Username of the user to retrieve.", + }), +}) diff --git a/src/v2/routes/user/search/route.ts b/src/v2/routes/user/search/route.ts new file mode 100644 index 0000000..65cbb7c --- /dev/null +++ b/src/v2/routes/user/search/route.ts @@ -0,0 +1,10 @@ +import { OpenAPIHono } from "@hono/zod-openapi"; +import SearchUserByIdRoute from "@/v2/routes/user/search/[id]/route"; +import SearchUserByNameRoute from "@/v2/routes/user/search/[name]/route"; + +const handler = new OpenAPIHono<{ Bindings: Bindings, Variables: Variables }>() + +handler.route("", SearchUserByIdRoute) +handler.route("", SearchUserByNameRoute) + +export default handler \ No newline at end of file diff --git a/src/worker-configuration.d.ts b/src/worker-configuration.d.ts index 3948365..ca77e83 100644 --- a/src/worker-configuration.d.ts +++ b/src/worker-configuration.d.ts @@ -17,10 +17,15 @@ declare global { TURSO_DEV_DATABASE_URL: string | undefined } + type Variables = { + drizzle: import("@/v2/db/turso").DrizzleInstance + turso: import("@/v2/db/turso").TursoInstance + } + /** * Provides access to the request context within routes that are separated into individual functions. */ - type APIContext = import("hono").Context<{ + type APIContext = import("@hono/zod-openapi").Context<{ Bindings: Bindings }> } From 65883477719c9f5e666cffe32cc4249951b70f2d Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Mon, 6 Nov 2023 04:12:52 +0000 Subject: [PATCH 149/318] fix: prettier --- src/index.ts | 6 +++--- src/v2/routes/route.ts | 8 ++++---- src/v2/routes/user/route.ts | 16 ++++++++-------- src/v2/routes/user/search/[id]/route.ts | 4 ++-- src/v2/routes/user/search/[name]/route.ts | 4 ++-- src/v2/routes/user/search/route.ts | 10 +++++----- 6 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/index.ts b/src/index.ts index b1fb542..30ef708 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,9 +1,9 @@ import { OpenAPIHono } from "@hono/zod-openapi" import { swaggerUI } from "@hono/swagger-ui" -import { prettyJSON } from 'hono/pretty-json' -import BaseRoutes from '@/v2/routes/route' +import { prettyJSON } from "hono/pretty-json" +import BaseRoutes from "@/v2/routes/route" -const app = new OpenAPIHono<{ Bindings: Bindings, Variables: Variables }>() +const app = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() app.route("/v2", BaseRoutes) diff --git a/src/v2/routes/route.ts b/src/v2/routes/route.ts index 58d27c4..a4241fc 100644 --- a/src/v2/routes/route.ts +++ b/src/v2/routes/route.ts @@ -1,8 +1,8 @@ -import { OpenAPIHono } from "@hono/zod-openapi"; -import UserRoute from "@/v2/routes/user/route"; +import { OpenAPIHono } from "@hono/zod-openapi" +import UserRoute from "@/v2/routes/user/route" -const handler = new OpenAPIHono<{ Bindings: Bindings, Variables: Variables }>() +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.route("", UserRoute) -export default handler \ No newline at end of file +export default handler diff --git a/src/v2/routes/user/route.ts b/src/v2/routes/user/route.ts index 41ee749..e44088a 100644 --- a/src/v2/routes/user/route.ts +++ b/src/v2/routes/user/route.ts @@ -1,18 +1,18 @@ -import { OpenAPIHono } from "@hono/zod-openapi"; -import UserSearchRoute from "@/v2/routes/user/search/route"; -import { getConnection } from "@/v2/db/turso"; +import { OpenAPIHono } from "@hono/zod-openapi" +import UserSearchRoute from "@/v2/routes/user/search/route" +import { getConnection } from "@/v2/db/turso" -const handler = new OpenAPIHono<{ Bindings: Bindings, Variables: Variables }>() +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.route("/search", UserSearchRoute) handler.use("*", async (ctx, next) => { const { drizzle, turso } = getConnection(ctx.env) - + ctx.set("drizzle", drizzle) ctx.set("turso", turso) - + await next() -}); +}) -export default handler \ No newline at end of file +export default handler diff --git a/src/v2/routes/user/search/[id]/route.ts b/src/v2/routes/user/search/[id]/route.ts index 33feb64..ae646a4 100644 --- a/src/v2/routes/user/search/[id]/route.ts +++ b/src/v2/routes/user/search/[id]/route.ts @@ -2,7 +2,7 @@ import { OpenAPIHono } from "@hono/zod-openapi" import { getUserByIdRoute } from "./openapi" import { UserSearchManager } from "@/v2/lib/managers/user/user-search-manager" -const handler = new OpenAPIHono<{ Bindings: Bindings, Variables: Variables }>() +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.openapi(getUserByIdRoute, async (ctx) => { const userId = ctx.req.valid("param").id @@ -17,4 +17,4 @@ handler.openapi(getUserByIdRoute, async (ctx) => { }) }) -export default handler \ No newline at end of file +export default handler diff --git a/src/v2/routes/user/search/[name]/route.ts b/src/v2/routes/user/search/[name]/route.ts index d957937..1f052ba 100644 --- a/src/v2/routes/user/search/[name]/route.ts +++ b/src/v2/routes/user/search/[name]/route.ts @@ -2,7 +2,7 @@ import { OpenAPIHono } from "@hono/zod-openapi" import { getUserByNameRoute } from "./openapi" import { UserSearchManager } from "@/v2/lib/managers/user/user-search-manager" -const handler = new OpenAPIHono<{ Bindings: Bindings, Variables: Variables }>() +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.openapi(getUserByNameRoute, async (ctx) => { const userId = ctx.req.valid("param").username @@ -17,4 +17,4 @@ handler.openapi(getUserByNameRoute, async (ctx) => { }) }) -export default handler \ No newline at end of file +export default handler diff --git a/src/v2/routes/user/search/route.ts b/src/v2/routes/user/search/route.ts index 65cbb7c..e7d0bae 100644 --- a/src/v2/routes/user/search/route.ts +++ b/src/v2/routes/user/search/route.ts @@ -1,10 +1,10 @@ -import { OpenAPIHono } from "@hono/zod-openapi"; -import SearchUserByIdRoute from "@/v2/routes/user/search/[id]/route"; -import SearchUserByNameRoute from "@/v2/routes/user/search/[name]/route"; +import { OpenAPIHono } from "@hono/zod-openapi" +import SearchUserByIdRoute from "@/v2/routes/user/search/[id]/route" +import SearchUserByNameRoute from "@/v2/routes/user/search/[name]/route" -const handler = new OpenAPIHono<{ Bindings: Bindings, Variables: Variables }>() +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.route("", SearchUserByIdRoute) handler.route("", SearchUserByNameRoute) -export default handler \ No newline at end of file +export default handler From 9e950255ea0ae98d98f54106f51ed9a093ac2b39 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Mon, 6 Nov 2023 04:25:37 +0000 Subject: [PATCH 150/318] parse auth through middleware --- src/index.ts | 2 +- src/v2/routes/route.ts | 15 ++++++++++++++- src/v2/routes/user/route.ts | 10 ---------- src/v2/routes/user/search/[id]/openapi.ts | 2 +- .../user/search/{[name] => [username]}/openapi.ts | 2 +- .../user/search/{[name] => [username]}/route.ts | 0 .../user/search/{[name] => [username]}/schema.ts | 0 src/v2/routes/user/search/route.ts | 6 +++--- src/worker-configuration.d.ts | 1 + 9 files changed, 21 insertions(+), 17 deletions(-) rename src/v2/routes/user/search/{[name] => [username]}/openapi.ts (92%) rename src/v2/routes/user/search/{[name] => [username]}/route.ts (100%) rename src/v2/routes/user/search/{[name] => [username]}/schema.ts (100%) diff --git a/src/index.ts b/src/index.ts index 30ef708..32d7a27 100644 --- a/src/index.ts +++ b/src/index.ts @@ -10,7 +10,7 @@ app.route("/v2", BaseRoutes) app.doc("/openapi", { openapi: "3.1.0", info: { - version: "1.0.0", + version: "2.0.0", title: "api.wanderer.moe", }, }) diff --git a/src/v2/routes/route.ts b/src/v2/routes/route.ts index a4241fc..15d6730 100644 --- a/src/v2/routes/route.ts +++ b/src/v2/routes/route.ts @@ -1,8 +1,21 @@ import { OpenAPIHono } from "@hono/zod-openapi" import UserRoute from "@/v2/routes/user/route" +import { getConnection } from "@/v2/db/turso" +import { auth } from "@/v2/lib/auth/lucia" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() -handler.route("", UserRoute) +handler.route("/user", UserRoute) + +handler.use("*", async (ctx, next) => { + const { drizzle, turso } = getConnection(ctx.env) + const lucia = auth(ctx.env) + + ctx.set("drizzle", drizzle) + ctx.set("turso", turso) + ctx.set("lucia", lucia) + + await next() +}) export default handler diff --git a/src/v2/routes/user/route.ts b/src/v2/routes/user/route.ts index e44088a..655c42e 100644 --- a/src/v2/routes/user/route.ts +++ b/src/v2/routes/user/route.ts @@ -1,18 +1,8 @@ import { OpenAPIHono } from "@hono/zod-openapi" import UserSearchRoute from "@/v2/routes/user/search/route" -import { getConnection } from "@/v2/db/turso" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.route("/search", UserSearchRoute) -handler.use("*", async (ctx, next) => { - const { drizzle, turso } = getConnection(ctx.env) - - ctx.set("drizzle", drizzle) - ctx.set("turso", turso) - - await next() -}) - export default handler diff --git a/src/v2/routes/user/search/[id]/openapi.ts b/src/v2/routes/user/search/[id]/openapi.ts index 3fbc316..1b4c211 100644 --- a/src/v2/routes/user/search/[id]/openapi.ts +++ b/src/v2/routes/user/search/[id]/openapi.ts @@ -2,7 +2,7 @@ import { createRoute } from "@hono/zod-openapi" import { getUserByIdSchema } from "./schema" export const getUserByIdRoute = createRoute({ - path: "/user/id/{id}", + path: "{id}", method: "get", description: "Get a user by their ID.", request: { diff --git a/src/v2/routes/user/search/[name]/openapi.ts b/src/v2/routes/user/search/[username]/openapi.ts similarity index 92% rename from src/v2/routes/user/search/[name]/openapi.ts rename to src/v2/routes/user/search/[username]/openapi.ts index 80015e8..e7160ed 100644 --- a/src/v2/routes/user/search/[name]/openapi.ts +++ b/src/v2/routes/user/search/[username]/openapi.ts @@ -2,7 +2,7 @@ import { createRoute } from "@hono/zod-openapi" import { getUserByNameSchema } from "./schema" export const getUserByNameRoute = createRoute({ - path: "/user/username/{username}", + path: "{username}", method: "get", description: "Get a user by their username.", request: { diff --git a/src/v2/routes/user/search/[name]/route.ts b/src/v2/routes/user/search/[username]/route.ts similarity index 100% rename from src/v2/routes/user/search/[name]/route.ts rename to src/v2/routes/user/search/[username]/route.ts diff --git a/src/v2/routes/user/search/[name]/schema.ts b/src/v2/routes/user/search/[username]/schema.ts similarity index 100% rename from src/v2/routes/user/search/[name]/schema.ts rename to src/v2/routes/user/search/[username]/schema.ts diff --git a/src/v2/routes/user/search/route.ts b/src/v2/routes/user/search/route.ts index e7d0bae..0f3d939 100644 --- a/src/v2/routes/user/search/route.ts +++ b/src/v2/routes/user/search/route.ts @@ -1,10 +1,10 @@ import { OpenAPIHono } from "@hono/zod-openapi" import SearchUserByIdRoute from "@/v2/routes/user/search/[id]/route" -import SearchUserByNameRoute from "@/v2/routes/user/search/[name]/route" +import SearchUserByNameRoute from "@/v2/routes/user/search/[username]/route" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() -handler.route("", SearchUserByIdRoute) -handler.route("", SearchUserByNameRoute) +handler.route("/id", SearchUserByIdRoute) +handler.route("/username", SearchUserByNameRoute) export default handler diff --git a/src/worker-configuration.d.ts b/src/worker-configuration.d.ts index ca77e83..2720a0d 100644 --- a/src/worker-configuration.d.ts +++ b/src/worker-configuration.d.ts @@ -20,6 +20,7 @@ declare global { type Variables = { drizzle: import("@/v2/db/turso").DrizzleInstance turso: import("@/v2/db/turso").TursoInstance + lucia: import("@/v2/lib/auth/lucia").Auth } /** From 6c954617087052a5675b08f62f25b7618cff6d7c Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Mon, 6 Nov 2023 04:28:45 +0000 Subject: [PATCH 151/318] fix path --- src/v2/routes/user/search/[id]/openapi.ts | 2 +- src/v2/routes/user/search/[username]/openapi.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/v2/routes/user/search/[id]/openapi.ts b/src/v2/routes/user/search/[id]/openapi.ts index 1b4c211..9faa3f6 100644 --- a/src/v2/routes/user/search/[id]/openapi.ts +++ b/src/v2/routes/user/search/[id]/openapi.ts @@ -2,7 +2,7 @@ import { createRoute } from "@hono/zod-openapi" import { getUserByIdSchema } from "./schema" export const getUserByIdRoute = createRoute({ - path: "{id}", + path: "/{id}", method: "get", description: "Get a user by their ID.", request: { diff --git a/src/v2/routes/user/search/[username]/openapi.ts b/src/v2/routes/user/search/[username]/openapi.ts index e7160ed..8bddc76 100644 --- a/src/v2/routes/user/search/[username]/openapi.ts +++ b/src/v2/routes/user/search/[username]/openapi.ts @@ -2,7 +2,7 @@ import { createRoute } from "@hono/zod-openapi" import { getUserByNameSchema } from "./schema" export const getUserByNameRoute = createRoute({ - path: "{username}", + path: "/{username}", method: "get", description: "Get a user by their username.", request: { From f1368c3f3ec921ceae3afbaf13547a4647e19da0 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Fri, 10 Nov 2023 04:13:50 +0000 Subject: [PATCH 152/318] going insane (part 1) --- drizzle.config.ts | 7 +- package.json | 34 +- pnpm-lock.yaml | 8603 +++++++---------- .../asset-category/asset-category-manager.ts | 12 +- src/v2/lib/managers/asset/asset-manager.ts | 4 +- .../asset/add/id/[id]/openapi.ts} | 0 .../asset/add/id/[id]}/route.ts | 0 .../asset/add/id/[id]/schema.ts} | 0 .../asset/remove/id/[id]/openapi.ts | 0 .../collection/asset/remove/id/[id]/route.ts | 0 .../collection/asset/remove/id/[id]/schema.ts | 0 src/v2/routes/collection/create/openapi.ts | 0 src/v2/routes/collection/create/route.ts | 0 src/v2/routes/collection/create/schema.ts | 0 .../collection/delete/id/[id]/openapi.ts | 0 .../routes/collection/delete/id/[id]/route.ts | 0 .../collection/delete/id/[id]/schema.ts | 0 .../routes/collection/get/id/[id]/openapi.ts | 0 src/v2/routes/collection/get/id/[id]/route.ts | 0 .../routes/collection/get/id/[id]/schema.ts | 0 .../collection/get/user/id/[id]/openapi.ts | 0 .../collection/get/user/id/[id]/route.ts | 0 .../collection/get/user/id/[id]/schema.ts | 0 .../get/user/username/[username]/openapi.ts | 0 .../get/user/username/[username]/route.ts | 0 .../get/user/username/[username]/schema.ts | 0 src/v2/routes/collection/route.ts | 0 .../favorite/asset/add/id/[id]/openapi.ts | 0 .../favorite/asset/add/id/[id]/route.ts | 0 .../favorite/asset/add/id/[id]/schema.ts | 0 .../favorite/asset/remove/id/[id]/openapi.ts | 0 .../favorite/asset/remove/id/[id]/route.ts | 0 .../favorite/asset/remove/id/[id]/schema.ts | 0 .../get/user/username/[username]/openapi.ts | 0 .../get/user/username/[username]/route.ts | 0 .../get/user/username/[username]/schema.ts | 0 src/v2/routes/favorite/modify/openapi.ts | 0 src/v2/routes/favorite/modify/route.ts | 0 src/v2/routes/favorite/modify/schema.ts | 0 src/v2/routes/favorite/route.ts | 0 src/v2/routes/game/create/openapi.ts | 0 src/v2/routes/game/create/route.ts | 0 src/v2/routes/game/create/schema.ts | 0 src/v2/routes/game/delete/id/[id]/openapi.ts | 0 src/v2/routes/game/delete/id/[id]/route.ts | 0 src/v2/routes/game/delete/id/[id]/schema.ts | 0 src/v2/routes/game/get/all/openapi.ts | 0 src/v2/routes/game/get/all/route.ts | 0 src/v2/routes/game/get/all/schema.ts | 0 src/v2/routes/game/get/id/[id]/openapi.ts | 0 src/v2/routes/game/get/id/[id]/route.ts | 0 src/v2/routes/game/get/id/[id]/schema.ts | 0 src/v2/routes/game/get/name/[name]/openapi.ts | 0 src/v2/routes/game/get/name/[name]/route.ts | 0 src/v2/routes/game/get/name/[name]/schema.ts | 0 src/v2/routes/game/modify/id/[id]/openapi.ts | 0 src/v2/routes/game/modify/id/[id]/route.ts | 0 src/v2/routes/game/modify/id/[id]/schema.ts | 0 .../user/follows/follow/[id]/openapi.ts | 0 .../routes/user/follows/follow/[id]/route.ts | 0 .../routes/user/follows/follow/[id]/schema.ts | 0 .../routes/user/follows/list/[id]/openapi.ts | 0 src/v2/routes/user/follows/list/[id]/route.ts | 0 .../routes/user/follows/list/[id]/schema.ts | 0 src/v2/routes/user/follows/route.ts | 0 .../user/follows/unfollow/[id]/openapi.ts | 0 .../user/follows/unfollow/[id]/route.ts | 0 .../user/follows/unfollow/[id]/schema.ts | 0 .../user/{search => get}/[id]/openapi.ts | 0 .../routes/user/{search => get}/[id]/route.ts | 0 .../user/{search => get}/[id]/schema.ts | 0 .../{search => get}/[username]/openapi.ts | 0 .../user/{search => get}/[username]/route.ts | 0 .../user/{search => get}/[username]/schema.ts | 0 src/v2/routes/user/get/route.ts | 10 + src/v2/routes/user/route.ts | 4 +- src/v2/routes/user/search/route.ts | 10 - .../search/username/[username]/openapi.ts | 0 .../user/search/username/[username]/route.ts | 0 .../user/search/username/[username]/schema.ts | 0 src/v2/routes/user/search/username/route.ts | 0 81 files changed, 3626 insertions(+), 5058 deletions(-) rename src/v2/routes/{game/search/[id]/route.ts => collection/asset/add/id/[id]/openapi.ts} (100%) rename src/v2/routes/{game/search/[name] => collection/asset/add/id/[id]}/route.ts (100%) rename src/v2/routes/{game/search/all/route.ts => collection/asset/add/id/[id]/schema.ts} (100%) create mode 100644 src/v2/routes/collection/asset/remove/id/[id]/openapi.ts create mode 100644 src/v2/routes/collection/asset/remove/id/[id]/route.ts create mode 100644 src/v2/routes/collection/asset/remove/id/[id]/schema.ts create mode 100644 src/v2/routes/collection/create/openapi.ts create mode 100644 src/v2/routes/collection/create/route.ts create mode 100644 src/v2/routes/collection/create/schema.ts create mode 100644 src/v2/routes/collection/delete/id/[id]/openapi.ts create mode 100644 src/v2/routes/collection/delete/id/[id]/route.ts create mode 100644 src/v2/routes/collection/delete/id/[id]/schema.ts create mode 100644 src/v2/routes/collection/get/id/[id]/openapi.ts create mode 100644 src/v2/routes/collection/get/id/[id]/route.ts create mode 100644 src/v2/routes/collection/get/id/[id]/schema.ts create mode 100644 src/v2/routes/collection/get/user/id/[id]/openapi.ts create mode 100644 src/v2/routes/collection/get/user/id/[id]/route.ts create mode 100644 src/v2/routes/collection/get/user/id/[id]/schema.ts create mode 100644 src/v2/routes/collection/get/user/username/[username]/openapi.ts create mode 100644 src/v2/routes/collection/get/user/username/[username]/route.ts create mode 100644 src/v2/routes/collection/get/user/username/[username]/schema.ts create mode 100644 src/v2/routes/collection/route.ts create mode 100644 src/v2/routes/favorite/asset/add/id/[id]/openapi.ts create mode 100644 src/v2/routes/favorite/asset/add/id/[id]/route.ts create mode 100644 src/v2/routes/favorite/asset/add/id/[id]/schema.ts create mode 100644 src/v2/routes/favorite/asset/remove/id/[id]/openapi.ts create mode 100644 src/v2/routes/favorite/asset/remove/id/[id]/route.ts create mode 100644 src/v2/routes/favorite/asset/remove/id/[id]/schema.ts create mode 100644 src/v2/routes/favorite/get/user/username/[username]/openapi.ts create mode 100644 src/v2/routes/favorite/get/user/username/[username]/route.ts create mode 100644 src/v2/routes/favorite/get/user/username/[username]/schema.ts create mode 100644 src/v2/routes/favorite/modify/openapi.ts create mode 100644 src/v2/routes/favorite/modify/route.ts create mode 100644 src/v2/routes/favorite/modify/schema.ts create mode 100644 src/v2/routes/favorite/route.ts create mode 100644 src/v2/routes/game/create/openapi.ts create mode 100644 src/v2/routes/game/create/route.ts create mode 100644 src/v2/routes/game/create/schema.ts create mode 100644 src/v2/routes/game/delete/id/[id]/openapi.ts create mode 100644 src/v2/routes/game/delete/id/[id]/route.ts create mode 100644 src/v2/routes/game/delete/id/[id]/schema.ts create mode 100644 src/v2/routes/game/get/all/openapi.ts create mode 100644 src/v2/routes/game/get/all/route.ts create mode 100644 src/v2/routes/game/get/all/schema.ts create mode 100644 src/v2/routes/game/get/id/[id]/openapi.ts create mode 100644 src/v2/routes/game/get/id/[id]/route.ts create mode 100644 src/v2/routes/game/get/id/[id]/schema.ts create mode 100644 src/v2/routes/game/get/name/[name]/openapi.ts create mode 100644 src/v2/routes/game/get/name/[name]/route.ts create mode 100644 src/v2/routes/game/get/name/[name]/schema.ts create mode 100644 src/v2/routes/game/modify/id/[id]/openapi.ts create mode 100644 src/v2/routes/game/modify/id/[id]/route.ts create mode 100644 src/v2/routes/game/modify/id/[id]/schema.ts create mode 100644 src/v2/routes/user/follows/follow/[id]/openapi.ts create mode 100644 src/v2/routes/user/follows/follow/[id]/route.ts create mode 100644 src/v2/routes/user/follows/follow/[id]/schema.ts create mode 100644 src/v2/routes/user/follows/list/[id]/openapi.ts create mode 100644 src/v2/routes/user/follows/list/[id]/route.ts create mode 100644 src/v2/routes/user/follows/list/[id]/schema.ts create mode 100644 src/v2/routes/user/follows/route.ts create mode 100644 src/v2/routes/user/follows/unfollow/[id]/openapi.ts create mode 100644 src/v2/routes/user/follows/unfollow/[id]/route.ts create mode 100644 src/v2/routes/user/follows/unfollow/[id]/schema.ts rename src/v2/routes/user/{search => get}/[id]/openapi.ts (100%) rename src/v2/routes/user/{search => get}/[id]/route.ts (100%) rename src/v2/routes/user/{search => get}/[id]/schema.ts (100%) rename src/v2/routes/user/{search => get}/[username]/openapi.ts (100%) rename src/v2/routes/user/{search => get}/[username]/route.ts (100%) rename src/v2/routes/user/{search => get}/[username]/schema.ts (100%) create mode 100644 src/v2/routes/user/get/route.ts create mode 100644 src/v2/routes/user/search/username/[username]/openapi.ts create mode 100644 src/v2/routes/user/search/username/[username]/route.ts create mode 100644 src/v2/routes/user/search/username/[username]/schema.ts create mode 100644 src/v2/routes/user/search/username/route.ts diff --git a/drizzle.config.ts b/drizzle.config.ts index fa85e95..2b5ae0e 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -5,7 +5,6 @@ const { TURSO_DATABASE_AUTH_TOKEN, TURSO_DATABASE_URL, ENVIRONMENT } = const TURSO_DEV_DATABASE_URL = process.env.TURSO_DEV_DATABASE_URL ?? "http://127.0.0.1:8080" - const isDev = ENVIRONMENT === "DEV" export default { @@ -16,9 +15,7 @@ export default { strict: true, verbose: true, dbCredentials: { - url: (isDev - ? TURSO_DEV_DATABASE_URL ?? TURSO_DATABASE_URL - : TURSO_DATABASE_URL) as string, - ...(isDev ? {} : { authToken: TURSO_DATABASE_AUTH_TOKEN }), + url: isDev ? TURSO_DEV_DATABASE_URL : TURSO_DATABASE_URL!, + authToken: TURSO_DATABASE_AUTH_TOKEN ?? undefined, }, } satisfies Config diff --git a/package.json b/package.json index f1f29ad..7d638b3 100644 --- a/package.json +++ b/package.json @@ -17,35 +17,35 @@ "drizzle:studio": "drizzle-kit studio --port 7331 --host 127.0.0.1 --verbose" }, "devDependencies": { - "@cloudflare/workers-types": "^4.20231016.0", - "@types/node": "^20.8.6", + "@cloudflare/workers-types": "^4.20231025.0", + "@types/node": "^20.9.0", "dotenv": "^16.3.1", - "drizzle-kit": "^0.19.13", - "eslint": "^8.51.0", + "drizzle-kit": "^0.20.1", + "eslint": "^8.53.0", "eslint-config-google": "^0.14.0", "eslint-plugin-json": "^3.1.0", "husky": "^8.0.3", - "tsx": "^3.13.0", + "tsx": "^4.0.0", "typescript": "^5.2.2", - "wrangler": "3.13.1" + "wrangler": "3.15.0" }, "private": true, "dependencies": { "@hono/swagger-ui": "^0.1.0", - "@hono/zod-openapi": "^0.7.2", - "@libsql/client": "0.3.5", + "@hono/zod-openapi": "^0.8.3", + "@libsql/client": "0.3.6", "@lucia-auth/adapter-session-unstorage": "^2.1.0", - "@lucia-auth/adapter-sqlite": "^2.0.0", - "@lucia-auth/oauth": "^3.3.1", - "@typescript-eslint/eslint-plugin": "^6.8.0", - "better-sqlite3": "^9.0.0", - "drizzle-orm": "^0.28.6", + "@lucia-auth/adapter-sqlite": "^2.0.1", + "@lucia-auth/oauth": "^3.4.0", + "@typescript-eslint/eslint-plugin": "^6.10.0", + "better-sqlite3": "^9.1.1", + "drizzle-orm": "^0.29.0", "drizzle-zod": "^0.5.1", - "hono": "^3.8.0", - "lucia": "^2.7.1", + "hono": "^3.9.2", + "lucia": "^2.7.3", "miniflare": "^3.20231025.1", - "mysql2": "^3.6.2", - "oslo": "^0.17.0", + "mysql2": "^3.6.3", + "oslo": "^0.22.0", "prettier": "^3.0.3", "unstorage": "^1.9.0", "uuid": "^9.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2090b48..f624d4d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,5025 +1,3596 @@ -lockfileVersion: "6.0" +lockfileVersion: '6.0' settings: - autoInstallPeers: true - excludeLinksFromLockfile: false + autoInstallPeers: true + excludeLinksFromLockfile: false dependencies: - "@hono/swagger-ui": - specifier: ^0.1.0 - version: 0.1.0(hono@3.8.0) - "@hono/zod-openapi": - specifier: ^0.7.2 - version: 0.7.2(hono@3.8.0)(zod@3.22.4) - "@libsql/client": - specifier: 0.3.5 - version: 0.3.5 - "@lucia-auth/adapter-session-unstorage": - specifier: ^2.1.0 - version: 2.1.0(lucia@2.7.1)(unstorage@1.9.0) - "@lucia-auth/adapter-sqlite": - specifier: ^2.0.0 - version: 2.0.0(@libsql/client@0.3.5)(better-sqlite3@9.0.0)(lucia@2.7.1) - "@lucia-auth/oauth": - specifier: ^3.3.1 - version: 3.3.1(lucia@2.7.1) - "@typescript-eslint/eslint-plugin": - specifier: ^6.8.0 - version: 6.8.0(@typescript-eslint/parser@6.8.0)(eslint@8.51.0)(typescript@5.2.2) - better-sqlite3: - specifier: ^9.0.0 - version: 9.0.0 - drizzle-orm: - specifier: ^0.28.6 - version: 0.28.6(@cloudflare/workers-types@4.20231016.0)(@libsql/client@0.3.5)(better-sqlite3@9.0.0)(mysql2@3.6.2) - drizzle-zod: - specifier: ^0.5.1 - version: 0.5.1(drizzle-orm@0.28.6)(zod@3.22.4) - hono: - specifier: ^3.8.0 - version: 3.8.0 - lucia: - specifier: ^2.7.1 - version: 2.7.1 - miniflare: - specifier: ^3.20231025.1 - version: 3.20231025.1 - mysql2: - specifier: ^3.6.2 - version: 3.6.2 - oslo: - specifier: ^0.17.0 - version: 0.17.0 - prettier: - specifier: ^3.0.3 - version: 3.0.3 - unstorage: - specifier: ^1.9.0 - version: 1.9.0 - uuid: - specifier: ^9.0.1 - version: 9.0.1 - zod: - specifier: ^3.22.4 - version: 3.22.4 + '@hono/swagger-ui': + specifier: ^0.1.0 + version: 0.1.0(hono@3.9.2) + '@hono/zod-openapi': + specifier: ^0.8.3 + version: 0.8.3(hono@3.9.2)(zod@3.22.4) + '@libsql/client': + specifier: 0.3.6 + version: 0.3.6 + '@lucia-auth/adapter-session-unstorage': + specifier: ^2.1.0 + version: 2.1.0(lucia@2.7.3)(unstorage@1.9.0) + '@lucia-auth/adapter-sqlite': + specifier: ^2.0.1 + version: 2.0.1(@libsql/client@0.3.6)(better-sqlite3@9.1.1)(lucia@2.7.3) + '@lucia-auth/oauth': + specifier: ^3.4.0 + version: 3.4.0(lucia@2.7.3) + '@typescript-eslint/eslint-plugin': + specifier: ^6.10.0 + version: 6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.2.2) + better-sqlite3: + specifier: ^9.1.1 + version: 9.1.1 + drizzle-orm: + specifier: ^0.29.0 + version: 0.29.0(@cloudflare/workers-types@4.20231025.0)(@libsql/client@0.3.6)(better-sqlite3@9.1.1)(mysql2@3.6.3) + drizzle-zod: + specifier: ^0.5.1 + version: 0.5.1(drizzle-orm@0.29.0)(zod@3.22.4) + hono: + specifier: ^3.9.2 + version: 3.9.2 + lucia: + specifier: ^2.7.3 + version: 2.7.3 + miniflare: + specifier: ^3.20231025.1 + version: 3.20231025.1 + mysql2: + specifier: ^3.6.3 + version: 3.6.3 + oslo: + specifier: ^0.22.0 + version: 0.22.0 + prettier: + specifier: ^3.0.3 + version: 3.0.3 + unstorage: + specifier: ^1.9.0 + version: 1.9.0 + uuid: + specifier: ^9.0.1 + version: 9.0.1 + zod: + specifier: ^3.22.4 + version: 3.22.4 devDependencies: - "@cloudflare/workers-types": - specifier: ^4.20231016.0 - version: 4.20231016.0 - "@types/node": - specifier: ^20.8.6 - version: 20.8.6 - dotenv: - specifier: ^16.3.1 - version: 16.3.1 - drizzle-kit: - specifier: ^0.19.13 - version: 0.19.13 - eslint: - specifier: ^8.51.0 - version: 8.51.0 - eslint-config-google: - specifier: ^0.14.0 - version: 0.14.0(eslint@8.51.0) - eslint-plugin-json: - specifier: ^3.1.0 - version: 3.1.0 - husky: - specifier: ^8.0.3 - version: 8.0.3 - tsx: - specifier: ^3.13.0 - version: 3.13.0 - typescript: - specifier: ^5.2.2 - version: 5.2.2 - wrangler: - specifier: 3.13.1 - version: 3.13.1 + '@cloudflare/workers-types': + specifier: ^4.20231025.0 + version: 4.20231025.0 + '@types/node': + specifier: ^20.9.0 + version: 20.9.0 + dotenv: + specifier: ^16.3.1 + version: 16.3.1 + drizzle-kit: + specifier: ^0.20.1 + version: 0.20.1 + eslint: + specifier: ^8.53.0 + version: 8.53.0 + eslint-config-google: + specifier: ^0.14.0 + version: 0.14.0(eslint@8.53.0) + eslint-plugin-json: + specifier: ^3.1.0 + version: 3.1.0 + husky: + specifier: ^8.0.3 + version: 8.0.3 + tsx: + specifier: ^4.0.0 + version: 4.0.0 + typescript: + specifier: ^5.2.2 + version: 5.2.2 + wrangler: + specifier: 3.15.0 + version: 3.15.0 packages: - /@aashutoshrathi/word-wrap@1.2.6: - resolution: - { - integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==, - } - engines: { node: ">=0.10.0" } - - /@asteasolutions/zod-to-openapi@5.5.0(zod@3.22.4): - resolution: - { - integrity: sha512-d5HwrvM6dOKr3XdeF+DmashGvfEc+1oiEfbscugsiwSTrFtuMa7ETpW9sTNnVgn+hJaz+PRxPQUYD7q9/5dUig==, - } - peerDependencies: - zod: ^3.20.2 - dependencies: - openapi3-ts: 4.1.2 - zod: 3.22.4 - dev: false - - /@cloudflare/kv-asset-handler@0.2.0: - resolution: - { - integrity: sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==, - } - dependencies: - mime: 3.0.0 - dev: true - - /@cloudflare/workerd-darwin-64@1.20231010.0: - resolution: - { - integrity: sha512-LM9ePAh88EGoQkYisAfdLMEDzcaMinRer0mY11GOiN4A9ZU+6APRVvhh5JBRzI0F6Dkb8nHtrzhisioWCRaY1w==, - } - engines: { node: ">=16" } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workerd-darwin-64@1.20231025.0: - resolution: - { - integrity: sha512-MYRYTbSl+tjGg6su7savlLIb8cOcKJfdGpA+WdtgqT2OF7O+89Lag0l1SA/iyVlUkT31Jc6OLHqvzsXgmg+niQ==, - } - engines: { node: ">=16" } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@cloudflare/workerd-darwin-arm64@1.20231010.0: - resolution: - { - integrity: sha512-Vr7Z1O+vJRCnVeWaF0YSv0EMHiMRY7yYCxr7O509FzvJAXsZuXZ7DYC5TAD7a8HSeeqsxFTAbF9jg0y9A2wKVw==, - } - engines: { node: ">=16" } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workerd-darwin-arm64@1.20231025.0: - resolution: - { - integrity: sha512-BszjtBDR84TVa6oWe74dePJSAukWlTmLw9zR4KeWuwZLJGV7RMm6AmwGStetjnwZrecZaaOFELfBCAHtsebV0Q==, - } - engines: { node: ">=16" } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@cloudflare/workerd-linux-64@1.20231010.0: - resolution: - { - integrity: sha512-l9oDVPVhPEOHr1JpcGnLSsIf1h8sZnvcIC2Tl1zt+3p/KGFyGqGyAZJMLUoMJ54Q07oRE1x3KAu+JcWWEvdxpg==, - } - engines: { node: ">=16" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workerd-linux-64@1.20231025.0: - resolution: - { - integrity: sha512-AT9dxgKXOa9xZxZ3k2a432axPJJ58KpoNWnPiPYGpuAuLoWnfcYwwh6mr9sZVcTdAdTAK9Xu9c81tp0YABanUw==, - } - engines: { node: ">=16" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@cloudflare/workerd-linux-arm64@1.20231010.0: - resolution: - { - integrity: sha512-NBmYsJu+ns2W8WHcDnglfqLV5O3FP7lXpoTSTvpM64mhexmemdMlOJX5gpRuarTula3fA+GzEehinUojwM9/1g==, - } - engines: { node: ">=16" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workerd-linux-arm64@1.20231025.0: - resolution: - { - integrity: sha512-EIjex5o2k80YZWPix1btGybL/vNZ3o6vqKX9ptS0JcFkHV5aFX5/kcMwSBRjiIC+w04zVjmGQx3N1Vh3njuncg==, - } - engines: { node: ">=16" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@cloudflare/workerd-windows-64@1.20231010.0: - resolution: - { - integrity: sha512-jWiG71Rvuh4FYdEpOP1+BAygdguTlMYYy+v5d4ZOjxDkl+V8aR86EEtDQrv/QLUJFbpcoEX25SxXnN5UMKtjhQ==, - } - engines: { node: ">=16" } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workerd-windows-64@1.20231025.0: - resolution: - { - integrity: sha512-7vtq0mO22A2v0OOsKXa760r9a84Gg8CK0gDu5uNWlj6hojmt011iz7jJt76I7oo/XrVwVlVfu69GnA3ljx6U8w==, - } - engines: { node: ">=16" } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@cloudflare/workers-types@4.20231016.0: - resolution: - { - integrity: sha512-eGB0cRVyoJpeyGJx2re5sbd9R316a61sY73xwnqm4cwGpb+OxCK2gc651RxGiN7H4w6LY1RpysUgeGLmj5B3+g==, - } - - /@drizzle-team/studio@0.0.5: - resolution: - { - integrity: sha512-ps5qF0tMxWRVu+V5gvCRrQNqlY92aTnIKdq27gm9LZMSdaKYZt6AVvSK1dlUMzs6Rt0Jm80b+eWct6xShBKhIw==, - } - 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-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-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-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-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-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-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-community/eslint-utils@4.4.0(eslint@8.51.0): - resolution: - { - integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.51.0 - eslint-visitor-keys: 3.4.3 - - /@eslint-community/regexpp@4.9.1: - resolution: - { - integrity: sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==, - } - engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } - - /@eslint/eslintrc@2.1.2: - resolution: - { - integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.6.1 - globals: 13.23.0 - ignore: 5.2.4 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - /@eslint/js@8.51.0: - resolution: - { - integrity: sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - - /@fastify/busboy@2.0.0: - resolution: - { - integrity: sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==, - } - engines: { node: ">=14" } - - /@hono/swagger-ui@0.1.0(hono@3.8.0): - resolution: - { - integrity: sha512-W5WEEhk2QtiqdSfM40FcK98Q5Bz4H/NfNqBUSkcZ46ys+DG4wt1yGsmRZgdJMje6t5Vn8eFN+9nyO+/dAp3drA==, - } - peerDependencies: - hono: "*" - dependencies: - hono: 3.8.0 - dev: false - - /@hono/zod-openapi@0.7.2(hono@3.8.0)(zod@3.22.4): - resolution: - { - integrity: sha512-rmoRk2wGkniDf7VZSqCUUR+l25uVjsw8CCPeATU0eZAZPo8H2NgDVRx3rS535cdkZKdZgd/votWksuJhZRsKRA==, - } - engines: { node: ">=16.0.0" } - peerDependencies: - hono: "*" - zod: 3.* - dependencies: - "@asteasolutions/zod-to-openapi": 5.5.0(zod@3.22.4) - "@hono/zod-validator": 0.1.9(hono@3.8.0)(zod@3.22.4) - hono: 3.8.0 - zod: 3.22.4 - dev: false - - /@hono/zod-validator@0.1.9(hono@3.8.0)(zod@3.22.4): - resolution: - { - integrity: sha512-qEG5xagKzyif283ldCKzp+aF9Aebclg0sfrgyRQQNAizmXpicZ3UGduST/Jp+a9bjt3mI+VyEXMftb4rogLxQA==, - } - peerDependencies: - hono: 3.* - zod: ^3.19.1 - dependencies: - hono: 3.8.0 - zod: 3.22.4 - dev: false - - /@humanwhocodes/config-array@0.11.11: - resolution: - { - integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==, - } - engines: { node: ">=10.10.0" } - dependencies: - "@humanwhocodes/object-schema": 1.2.1 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - /@humanwhocodes/module-importer@1.0.1: - resolution: - { - integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, - } - engines: { node: ">=12.22" } - - /@humanwhocodes/object-schema@1.2.1: - resolution: - { - integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==, - } - - /@ioredis/commands@1.2.0: - resolution: - { - integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==, - } - dev: false - - /@libsql/client@0.3.5: - resolution: - { - integrity: sha512-4fZxGh0qKW5dtp1yuQLRvRAtbt02V4jzjM9sHSmz5k25xZTLg7/GlNudKdqKZrjJXEV5PvDNsczupBtedZZovw==, - } - dependencies: - "@libsql/hrana-client": 0.5.5 - js-base64: 3.7.5 - libsql: 0.1.29 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - dev: false - - /@libsql/darwin-arm64@0.1.29: - resolution: - { - integrity: sha512-lYSQaJV6Jsjuh/zms7i6QCL2GLQT17zeFVUZBNQxje0GyUtpvvfkz10S32n5+cY1TRbsbBCKzYhYxnTaTdD7Eg==, - } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@libsql/darwin-x64@0.1.29: - resolution: - { - integrity: sha512-LFf6oSiBCQ0jJmh4WrQQKpa99qZVdY6KPNHU621hPV6LarEA/59YErMfAZOQY5A0iAhAzJ9ml0npt0Z63MU9dA==, - } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@libsql/hrana-client@0.5.5: - resolution: - { - integrity: sha512-i+hDBpiV719poqEiHupUUZYKJ9YSbCRFe5Q2PQ0v3mHIftePH6gayLjp2u6TXbqbO/Dv6y8yyvYlBXf/kFfRZA==, - } - dependencies: - "@libsql/isomorphic-fetch": 0.1.10 - "@libsql/isomorphic-ws": 0.1.5 - js-base64: 3.7.5 - node-fetch: 3.3.2 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - dev: false - - /@libsql/isomorphic-fetch@0.1.10: - resolution: - { - integrity: sha512-dH0lMk50gKSvEKD78xWMu60SY1sjp1sY//iFLO0XMmBwfVfG136P9KOk06R4maBdlb8KMXOzJ1D28FR5ZKnHTA==, - } - dependencies: - "@types/node-fetch": 2.6.6 - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding - dev: false - - /@libsql/isomorphic-ws@0.1.5: - resolution: - { - integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==, - } - dependencies: - "@types/ws": 8.5.7 - ws: 8.14.2 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: false - - /@libsql/linux-arm64-gnu@0.1.29: - resolution: - { - integrity: sha512-9Mtz3xRUpj1gRMFqi0+R/e2hAq711u0ogTvvlNWKjA9OZZfPgk0vLlT1Pqm0Pf1gyVc393RafZcCGP3FZMkjmg==, - } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@libsql/linux-x64-gnu@0.1.29: - resolution: - { - integrity: sha512-EE3YpxqSRXnvxwPq38A9j1/poqzEJrDXnGEKcVcWqC2FB/qPJHxnAITBUNYicovdrrZYWRE5EM0LdSO6CMWi6A==, - } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@libsql/linux-x64-musl@0.1.29: - resolution: - { - integrity: sha512-CJc+hKbUzF0JpAqQHT7P3SPb/NLCWsPzBD6j8fvHH34JLRYaIu9H8WrXsxAcVF65B7Jvat/CXnSe+iOctonBow==, - } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@libsql/win32-x64-msvc@0.1.29: - resolution: - { - integrity: sha512-pIdMzY+NOKHDHiTUGLwMd3TICUiHbcxPedPRYJAI6ofTSu77JEmkmfkXcCOL8L8B9gio4ZuNeok+1i/ZPf6oeQ==, - } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@lucia-auth/adapter-session-unstorage@2.1.0(lucia@2.7.1)(unstorage@1.9.0): - resolution: - { - integrity: sha512-ItK7urZhLZv7UO99BcODjRhSAv58UPc+KQAmnkSvri2WBc22vFEjnjd/oWp3CZPdbbrJkuTvsuhFXH1ySBfOLg==, - } - peerDependencies: - lucia: ^2.0.0 - unstorage: ^1.9.0 - dependencies: - lucia: 2.7.1 - unstorage: 1.9.0 - dev: false - - /@lucia-auth/adapter-sqlite@2.0.0(@libsql/client@0.3.5)(better-sqlite3@9.0.0)(lucia@2.7.1): - resolution: - { - integrity: sha512-Hiy8WND/1mi25r0M2ruSml+Ab5GJLr4XZEHApYw1lxybF+VlPUyX7oTtIVCSgvq/SWiP/tvnyPwnXAPmNr8/bg==, - } - peerDependencies: - "@libsql/client": ^0.3.0 - better-sqlite3: ^8.0.0 - lucia: ^2.0.0 - peerDependenciesMeta: - "@libsql/client": - optional: true - better-sqlite3: - optional: true - dependencies: - "@libsql/client": 0.3.5 - better-sqlite3: 9.0.0 - lucia: 2.7.1 - dev: false - - /@lucia-auth/oauth@3.3.1(lucia@2.7.1): - resolution: - { - integrity: sha512-2fGXPRXXQ58YGpN3zzbLSTWBXU4I3URcSXF7enR4cLugUcwdtYaGRL9b92tfZPHudr5BJRrrVqcs/VTjHTrdiw==, - } - peerDependencies: - lucia: ^2.0.0 - dependencies: - lucia: 2.7.1 - dev: false - - /@neon-rs/load@0.0.4: - resolution: - { - integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==, - } - dev: false - - /@node-rs/argon2-android-arm-eabi@1.5.2: - resolution: - { - integrity: sha512-vVZec4ITr9GumAy0p8Zj8ozie362gtbZrTkLp9EqvuFZ/HrZzR09uS2IsDgm4mAstg/rc4A1gLRrHI8jDdbjkA==, - } - engines: { node: ">= 10" } - cpu: [arm] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-android-arm64@1.5.2: - resolution: - { - integrity: sha512-SwhnsXyrpgtWDTwYds1WUnxLA/kVP8HVaImYwQ3Wemqj1lkzcSoIaNyjNWkyrYGqO1tVc1YUrqsbd5eCHh+3sg==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-darwin-arm64@1.5.2: - resolution: - { - integrity: sha512-+1ZMKiCCv2pip/o1Xg09piQru2LOIBPQ1vS4is86f55N3jjZnSfP+db5mYCSRuB0gRYqui98he7su7OGXlF4gQ==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-darwin-x64@1.5.2: - resolution: - { - integrity: sha512-mQ57mORlsxpfjcEsVpiHyHCOp6Ljrz/rVNWk8ihnPWw0qt0EqF1zbHRxTEPemL1iBHL9UyXpXrKS4JKq6xMn5w==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-freebsd-x64@1.5.2: - resolution: - { - integrity: sha512-UjKbFd3viYcpiwflkU4haEdNUMk1V2fVCJImWLWQns/hVval9BrDv5xsBwgdynbPHDlPOiWj816LBQwhWLGVWA==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-arm-gnueabihf@1.5.2: - resolution: - { - integrity: sha512-36GJjJBnVuscV9CTn8RVDeJysnmIzr6Lp7QBCDczYHi6eKFuA8udCJb4SRyJqdvIuzycKG1RL56FbcFBJYCYIA==, - } - engines: { node: ">= 10" } - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-arm64-gnu@1.5.2: - resolution: - { - integrity: sha512-sE0ydb2gp6xC+5vbVz8l3paaiBbFQIB2Rwp5wx9MmKiYdTfcO5WkGeADuSgoFiTcSEz1RsHXqrdVy6j/LtSqtA==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-arm64-musl@1.5.2: - resolution: - { - integrity: sha512-LhE0YHB0aJCwlbsQrwePik/KFWUc9qMriJIL5KiejK3bDoTVY4ihH587QT56JyaLvl3nBJaAV8l5yMqQdHnouA==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-x64-gnu@1.5.2: - resolution: - { - integrity: sha512-MnKLiBlyg05pxvKXe3lNgBL9El9ThD74hvVEiWH1Xk40RRrJ507NCOWXVmQ0FDq1mjTeGFxbIvk+AcoF0NSLIQ==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-x64-musl@1.5.2: - resolution: - { - integrity: sha512-tzLgASY0Ng2OTW7Awwl9UWzjbWx8/uD6gXcZ/k/nYGSZE5Xp8EOD2NUqHLbK6KZE3775A0R25ShpiSxCadYqkg==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-win32-arm64-msvc@1.5.2: - resolution: - { - integrity: sha512-vpTwSvv3oUXTpWZh0/HxdJ5wFMlmS7aVDwL4ATWepTZhMG4n+TO0+tVLdcPHCbg0oc6hCWBjWNPlSn9mW+YIgA==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-win32-ia32-msvc@1.5.2: - resolution: - { - integrity: sha512-KPpZR15ui7uQWQXKmtaKyUQRs4UJdXnIIfiyFLGmLWCdEKlr3MtIGFt0fdziu4BF5ZObD8Ic6QvT0VXK4OJiww==, - } - engines: { node: ">= 10" } - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-win32-x64-msvc@1.5.2: - resolution: - { - integrity: sha512-/pGuwixJS8ZlpwhX9iM6g6JEeZYo1TtnNf8exwsOi7gxcUoTUfw5it+5GfbY/n+xRBz/DIU4bzUmXmh+7Gh0ug==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2@1.5.2: - resolution: - { - integrity: sha512-qq7wOSsdP2b4rXEapWNmsCjpaTGZWtp9kZmri98GYCDZqN8UJUG5zSue4XtYWWJMWKJVE/hkaIwk+BgN1ZUn0Q==, - } - engines: { node: ">= 10" } - optionalDependencies: - "@node-rs/argon2-android-arm-eabi": 1.5.2 - "@node-rs/argon2-android-arm64": 1.5.2 - "@node-rs/argon2-darwin-arm64": 1.5.2 - "@node-rs/argon2-darwin-x64": 1.5.2 - "@node-rs/argon2-freebsd-x64": 1.5.2 - "@node-rs/argon2-linux-arm-gnueabihf": 1.5.2 - "@node-rs/argon2-linux-arm64-gnu": 1.5.2 - "@node-rs/argon2-linux-arm64-musl": 1.5.2 - "@node-rs/argon2-linux-x64-gnu": 1.5.2 - "@node-rs/argon2-linux-x64-musl": 1.5.2 - "@node-rs/argon2-win32-arm64-msvc": 1.5.2 - "@node-rs/argon2-win32-ia32-msvc": 1.5.2 - "@node-rs/argon2-win32-x64-msvc": 1.5.2 - dev: false - - /@node-rs/bcrypt-android-arm-eabi@1.7.3: - resolution: - { - integrity: sha512-l53RuBqnqNvBN2jx09Ws6jpLmuQdSDx10n0GeaTfwh1svxsC8bPpVmxkfBExsT2Tu7KF38gTnPZvwsxysZQyPQ==, - } - engines: { node: ">= 10" } - cpu: [arm] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-android-arm64@1.7.3: - resolution: - { - integrity: sha512-TZpm4VbiViqDMvusrcYzLr1b1M5FDF0cDNiTUciLeBSsKtU5lNdEZGAU7gvCnrKoUWpGuOblHU7613zuB7SiNQ==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-darwin-arm64@1.7.3: - resolution: - { - integrity: sha512-SiUuAabynVsmixZMjh5xrn8w47EnV0HzbW9st4DPoVhn/wzdUcksIXDY75aoQG2EIzKLN8IGb+CIVnPGmRyhxw==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-darwin-x64@1.7.3: - resolution: - { - integrity: sha512-R+81Z0eX4hZPvCXY5Z6l0l+JrTU3WcSYGHP0QYV9uwdaafOz6EhrCXUzZ02AIcAbNoVR8eucYVruq9PiasXoVw==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-freebsd-x64@1.7.3: - resolution: - { - integrity: sha512-0pItU/5K3e83JjcJj9fZv+78txUoZ3hHCT7n/UMdu9mkpUzhX/rqb4jmQpJpD+UQoR76xp3qDo5RMgQBffBVNg==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-arm-gnueabihf@1.7.3: - resolution: - { - integrity: sha512-HTSybWUjNe8rWuXkTkMeFDiQNHc6VioRcgv6AeHZphIxiT6dFbnhXNkfz4Hr0zxvyPhZ3NrYjT2AmPVFT6VW3Q==, - } - engines: { node: ">= 10" } - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-arm64-gnu@1.7.3: - resolution: - { - integrity: sha512-rWep6Y+v/c4bZHaM8LmSsrMwMmDR9wG4/q+3Z9VzR8xdnt5VCbuQdYWpf3sgGRGjTRdTBAdSK8x1reOjqsJ3Jg==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-arm64-musl@1.7.3: - resolution: - { - integrity: sha512-TyWEKhxr+yfGcMKzVV/ARZw+Hrky2yl91bo0XYU2ZW6I6LDC0emNsXugdWjwz8ADI4OWhhrOjXD8GCilxiB2Rg==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-x64-gnu@1.7.3: - resolution: - { - integrity: sha512-PofxM1Qg7tZKj1oP0I7tBTSSLr8Xc2uxx+P3pBCPmYzaBwWqGteNHJlF7n2q5xiH7YOlguH4w5CmcEjsiA3K4A==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-x64-musl@1.7.3: - resolution: - { - integrity: sha512-D5V6/dDVKP8S/ieDBLGhTn4oTo3upbrpWInynbhOMjJvPiIxVG1PiI3MXkWBtG9qtfleDk7gUkEKtAOxlIxDTQ==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-win32-arm64-msvc@1.7.3: - resolution: - { - integrity: sha512-b4gH2Yj5R4TwULrfMHd1Qqr+MrnFjVRUAJujDKPqi+PppSqezW8QF6DRSOL4GjnBmz5JEd64wxgeidvy7dsbGw==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-win32-ia32-msvc@1.7.3: - resolution: - { - integrity: sha512-E91ro+ybI0RhNc89aGaZQGll0YhPoHr8JacoWrNKwhg9zwNOYeuO0tokdMZdm6nF0/8obll0Mq7wO9AXO9iffw==, - } - engines: { node: ">= 10" } - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-win32-x64-msvc@1.7.3: - resolution: - { - integrity: sha512-LO/p9yjPODj/pQvPnowBuwpDdqiyUXQbqL1xb1RSP3NoyCFAGmjL5h0plSQrhLh8hskQiozBRXNaQurtsM7o0Q==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt@1.7.3: - resolution: - { - integrity: sha512-BF6u9CBPUiyk1zU+5iwikezf+xM4MFSu5cmrrg/PLKffGgIM13ZsY6DHftcTraETB04ryasjM/5IejotH+sO5Q==, - } - engines: { node: ">= 10" } - optionalDependencies: - "@node-rs/bcrypt-android-arm-eabi": 1.7.3 - "@node-rs/bcrypt-android-arm64": 1.7.3 - "@node-rs/bcrypt-darwin-arm64": 1.7.3 - "@node-rs/bcrypt-darwin-x64": 1.7.3 - "@node-rs/bcrypt-freebsd-x64": 1.7.3 - "@node-rs/bcrypt-linux-arm-gnueabihf": 1.7.3 - "@node-rs/bcrypt-linux-arm64-gnu": 1.7.3 - "@node-rs/bcrypt-linux-arm64-musl": 1.7.3 - "@node-rs/bcrypt-linux-x64-gnu": 1.7.3 - "@node-rs/bcrypt-linux-x64-musl": 1.7.3 - "@node-rs/bcrypt-win32-arm64-msvc": 1.7.3 - "@node-rs/bcrypt-win32-ia32-msvc": 1.7.3 - "@node-rs/bcrypt-win32-x64-msvc": 1.7.3 - dev: false - - /@nodelib/fs.scandir@2.1.5: - resolution: - { - integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, - } - engines: { node: ">= 8" } - dependencies: - "@nodelib/fs.stat": 2.0.5 - run-parallel: 1.2.0 - - /@nodelib/fs.stat@2.0.5: - resolution: - { - integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, - } - engines: { node: ">= 8" } - - /@nodelib/fs.walk@1.2.8: - resolution: - { - integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, - } - engines: { node: ">= 8" } - dependencies: - "@nodelib/fs.scandir": 2.1.5 - fastq: 1.15.0 - - /@parcel/watcher-android-arm64@2.3.0: - resolution: - { - integrity: sha512-f4o9eA3dgk0XRT3XhB0UWpWpLnKgrh1IwNJKJ7UJek7eTYccQ8LR7XUWFKqw6aEq5KUNlCcGvSzKqSX/vtWVVA==, - } - engines: { node: ">= 10.0.0" } - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-darwin-arm64@2.3.0: - resolution: - { - integrity: sha512-mKY+oijI4ahBMc/GygVGvEdOq0L4DxhYgwQqYAz/7yPzuGi79oXrZG52WdpGA1wLBPrYb0T8uBaGFo7I6rvSKw==, - } - engines: { node: ">= 10.0.0" } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-darwin-x64@2.3.0: - resolution: - { - integrity: sha512-20oBj8LcEOnLE3mgpy6zuOq8AplPu9NcSSSfyVKgfOhNAc4eF4ob3ldj0xWjGGbOF7Dcy1Tvm6ytvgdjlfUeow==, - } - engines: { node: ">= 10.0.0" } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-freebsd-x64@2.3.0: - resolution: - { - integrity: sha512-7LftKlaHunueAEiojhCn+Ef2CTXWsLgTl4hq0pkhkTBFI3ssj2bJXmH2L67mKpiAD5dz66JYk4zS66qzdnIOgw==, - } - engines: { node: ">= 10.0.0" } - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-linux-arm-glibc@2.3.0: - resolution: - { - integrity: sha512-1apPw5cD2xBv1XIHPUlq0cO6iAaEUQ3BcY0ysSyD9Kuyw4MoWm1DV+W9mneWI+1g6OeP6dhikiFE6BlU+AToTQ==, - } - engines: { node: ">= 10.0.0" } - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-linux-arm64-glibc@2.3.0: - resolution: - { - integrity: sha512-mQ0gBSQEiq1k/MMkgcSB0Ic47UORZBmWoAWlMrTW6nbAGoLZP+h7AtUM7H3oDu34TBFFvjy4JCGP43JlylkTQA==, - } - engines: { node: ">= 10.0.0" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-linux-arm64-musl@2.3.0: - resolution: - { - integrity: sha512-LXZAExpepJew0Gp8ZkJ+xDZaTQjLHv48h0p0Vw2VMFQ8A+RKrAvpFuPVCVwKJCr5SE+zvaG+Etg56qXvTDIedw==, - } - engines: { node: ">= 10.0.0" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-linux-x64-glibc@2.3.0: - resolution: - { - integrity: sha512-P7Wo91lKSeSgMTtG7CnBS6WrA5otr1K7shhSjKHNePVmfBHDoAOHYRXgUmhiNfbcGk0uMCHVcdbfxtuiZCHVow==, - } - engines: { node: ">= 10.0.0" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-linux-x64-musl@2.3.0: - resolution: - { - integrity: sha512-+kiRE1JIq8QdxzwoYY+wzBs9YbJ34guBweTK8nlzLKimn5EQ2b2FSC+tAOpq302BuIMjyuUGvBiUhEcLIGMQ5g==, - } - engines: { node: ">= 10.0.0" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-wasm@2.3.0: - resolution: - { - integrity: sha512-ejBAX8H0ZGsD8lSICDNyMbSEtPMWgDL0WFCt/0z7hyf5v8Imz4rAM8xY379mBsECkq/Wdqa5WEDLqtjZ+6NxfA==, - } - engines: { node: ">= 10.0.0" } - dependencies: - is-glob: 4.0.3 - micromatch: 4.0.5 - napi-wasm: 1.1.0 - dev: false - bundledDependencies: - - napi-wasm - - /@parcel/watcher-win32-arm64@2.3.0: - resolution: - { - integrity: sha512-35gXCnaz1AqIXpG42evcoP2+sNL62gZTMZne3IackM+6QlfMcJLy3DrjuL6Iks7Czpd3j4xRBzez3ADCj1l7Aw==, - } - engines: { node: ">= 10.0.0" } - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-win32-ia32@2.3.0: - resolution: - { - integrity: sha512-FJS/IBQHhRpZ6PiCjFt1UAcPr0YmCLHRbTc00IBTrelEjlmmgIVLeOx4MSXzx2HFEy5Jo5YdhGpxCuqCyDJ5ow==, - } - engines: { node: ">= 10.0.0" } - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-win32-x64@2.3.0: - resolution: - { - integrity: sha512-dLx+0XRdMnVI62kU3wbXvbIRhLck4aE28bIGKbRGS7BJNt54IIj9+c/Dkqb+7DJEbHUZAX1bwaoM8PqVlHJmCA==, - } - engines: { node: ">= 10.0.0" } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher@2.3.0: - resolution: - { - integrity: sha512-pW7QaFiL11O0BphO+bq3MgqeX/INAk9jgBldVDYjlQPO4VddoZnF22TcF9onMhnLVHuNqBJeRf+Fj7eezi/+rQ==, - } - engines: { node: ">= 10.0.0" } - dependencies: - detect-libc: 1.0.3 - is-glob: 4.0.3 - micromatch: 4.0.5 - node-addon-api: 7.0.0 - optionalDependencies: - "@parcel/watcher-android-arm64": 2.3.0 - "@parcel/watcher-darwin-arm64": 2.3.0 - "@parcel/watcher-darwin-x64": 2.3.0 - "@parcel/watcher-freebsd-x64": 2.3.0 - "@parcel/watcher-linux-arm-glibc": 2.3.0 - "@parcel/watcher-linux-arm64-glibc": 2.3.0 - "@parcel/watcher-linux-arm64-musl": 2.3.0 - "@parcel/watcher-linux-x64-glibc": 2.3.0 - "@parcel/watcher-linux-x64-musl": 2.3.0 - "@parcel/watcher-win32-arm64": 2.3.0 - "@parcel/watcher-win32-ia32": 2.3.0 - "@parcel/watcher-win32-x64": 2.3.0 - dev: false - - /@types/json-schema@7.0.13: - resolution: - { - integrity: sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==, - } - dev: false - - /@types/node-fetch@2.6.6: - resolution: - { - integrity: sha512-95X8guJYhfqiuVVhRFxVQcf4hW/2bCuoPwDasMf/531STFoNoWTT7YDnWdXHEZKqAGUigmpG31r2FE70LwnzJw==, - } - dependencies: - "@types/node": 20.8.6 - form-data: 4.0.0 - dev: false - - /@types/node@20.8.6: - resolution: - { - integrity: sha512-eWO4K2Ji70QzKUqRy6oyJWUeB7+g2cRagT3T/nxYibYcT4y2BDL8lqolRXjTHmkZCdJfIPaY73KbJAZmcryxTQ==, - } - dependencies: - undici-types: 5.25.3 - - /@types/semver@7.5.3: - resolution: - { - integrity: sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==, - } - dev: false - - /@types/ws@8.5.7: - resolution: - { - integrity: sha512-6UrLjiDUvn40CMrAubXuIVtj2PEfKDffJS7ychvnPU44j+KVeXmdHHTgqcM/dxLUTHxlXHiFM8Skmb8ozGdTnQ==, - } - dependencies: - "@types/node": 20.8.6 - dev: false - - /@typescript-eslint/eslint-plugin@6.8.0(@typescript-eslint/parser@6.8.0)(eslint@8.51.0)(typescript@5.2.2): - resolution: - { - integrity: sha512-GosF4238Tkes2SHPQ1i8f6rMtG6zlKwMEB0abqSJ3Npvos+doIlc/ATG+vX1G9coDF3Ex78zM3heXHLyWEwLUw==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - peerDependencies: - "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - dependencies: - "@eslint-community/regexpp": 4.9.1 - "@typescript-eslint/parser": 6.8.0(eslint@8.51.0)(typescript@5.2.2) - "@typescript-eslint/scope-manager": 6.8.0 - "@typescript-eslint/type-utils": 6.8.0(eslint@8.51.0)(typescript@5.2.2) - "@typescript-eslint/utils": 6.8.0(eslint@8.51.0)(typescript@5.2.2) - "@typescript-eslint/visitor-keys": 6.8.0 - debug: 4.3.4 - eslint: 8.51.0 - graphemer: 1.4.0 - ignore: 5.2.4 - natural-compare: 1.4.0 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/parser@6.8.0(eslint@8.51.0)(typescript@5.2.2): - resolution: - { - integrity: sha512-5tNs6Bw0j6BdWuP8Fx+VH4G9fEPDxnVI7yH1IAPkQH5RUtvKwRoqdecAPdQXv4rSOADAaz1LFBZvZG7VbXivSg==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - dependencies: - "@typescript-eslint/scope-manager": 6.8.0 - "@typescript-eslint/types": 6.8.0 - "@typescript-eslint/typescript-estree": 6.8.0(typescript@5.2.2) - "@typescript-eslint/visitor-keys": 6.8.0 - debug: 4.3.4 - eslint: 8.51.0 - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/scope-manager@6.8.0: - resolution: - { - integrity: sha512-xe0HNBVwCph7rak+ZHcFD6A+q50SMsFwcmfdjs9Kz4qDh5hWhaPhFjRs/SODEhroBI5Ruyvyz9LfwUJ624O40g==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - dependencies: - "@typescript-eslint/types": 6.8.0 - "@typescript-eslint/visitor-keys": 6.8.0 - dev: false - - /@typescript-eslint/type-utils@6.8.0(eslint@8.51.0)(typescript@5.2.2): - resolution: - { - integrity: sha512-RYOJdlkTJIXW7GSldUIHqc/Hkto8E+fZN96dMIFhuTJcQwdRoGN2rEWA8U6oXbLo0qufH7NPElUb+MceHtz54g==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - dependencies: - "@typescript-eslint/typescript-estree": 6.8.0(typescript@5.2.2) - "@typescript-eslint/utils": 6.8.0(eslint@8.51.0)(typescript@5.2.2) - debug: 4.3.4 - eslint: 8.51.0 - ts-api-utils: 1.0.3(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/types@6.8.0: - resolution: - { - integrity: sha512-p5qOxSum7W3k+llc7owEStXlGmSl8FcGvhYt8Vjy7FqEnmkCVlM3P57XQEGj58oqaBWDQXbJDZxwUWMS/EAPNQ==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - dev: false - - /@typescript-eslint/typescript-estree@6.8.0(typescript@5.2.2): - resolution: - { - integrity: sha512-ISgV0lQ8XgW+mvv5My/+iTUdRmGspducmQcDw5JxznasXNnZn3SKNrTRuMsEXv+V/O+Lw9AGcQCfVaOPCAk/Zg==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - peerDependencies: - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - dependencies: - "@typescript-eslint/types": 6.8.0 - "@typescript-eslint/visitor-keys": 6.8.0 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/utils@6.8.0(eslint@8.51.0)(typescript@5.2.2): - resolution: - { - integrity: sha512-dKs1itdE2qFG4jr0dlYLQVppqTE+Itt7GmIf/vX6CSvsW+3ov8PbWauVKyyfNngokhIO9sKZeRGCUo1+N7U98Q==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.51.0) - "@types/json-schema": 7.0.13 - "@types/semver": 7.5.3 - "@typescript-eslint/scope-manager": 6.8.0 - "@typescript-eslint/types": 6.8.0 - "@typescript-eslint/typescript-estree": 6.8.0(typescript@5.2.2) - eslint: 8.51.0 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - - typescript - dev: false - - /@typescript-eslint/visitor-keys@6.8.0: - resolution: - { - integrity: sha512-oqAnbA7c+pgOhW2OhGvxm0t1BULX5peQI/rLsNDpGM78EebV3C9IGbX5HNZabuZ6UQrYveCLjKo8Iy/lLlBkkg==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - dependencies: - "@typescript-eslint/types": 6.8.0 - eslint-visitor-keys: 3.4.3 - dev: false - - /acorn-jsx@5.3.2(acorn@8.10.0): - resolution: - { - integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, - } - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.10.0 - - /acorn-walk@8.2.0: - resolution: - { - integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==, - } - engines: { node: ">=0.4.0" } - - /acorn@8.10.0: - resolution: - { - integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==, - } - engines: { node: ">=0.4.0" } - hasBin: true - - /ajv@6.12.6: - resolution: - { - integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, - } - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - - /ansi-regex@5.0.1: - resolution: - { - integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, - } - engines: { node: ">=8" } - - /ansi-styles@4.3.0: - resolution: - { - integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, - } - engines: { node: ">=8" } - dependencies: - color-convert: 2.0.1 - - /anymatch@3.1.3: - resolution: - { - integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, - } - engines: { node: ">= 8" } - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - /arch@2.2.0: - resolution: - { - integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==, - } - dev: false - - /argparse@2.0.1: - resolution: - { - integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, - } - - /array-union@2.1.0: - resolution: - { - integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, - } - engines: { node: ">=8" } - dev: false - - /as-table@1.0.55: - resolution: - { - integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==, - } - dependencies: - printable-characters: 1.0.42 - - /asynckit@0.4.0: - resolution: - { - integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, - } - dev: false - - /balanced-match@1.0.2: - resolution: - { - integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, - } - - /base64-js@1.5.1: - resolution: - { - integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, - } - dev: false - - /better-sqlite3@9.0.0: - resolution: - { - integrity: sha512-lDxQ9qg/XuUHZG6xzrQaMHkNWl37t35/LPB/VJGV8DdScSuGFNfFSqgscXEd8UIuyk/d9wU8iaMxQa4If5Wqog==, - } - 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" } - - /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 - - /brace-expansion@1.1.11: - resolution: - { - integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, - } - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - /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==, - } - engines: { node: ">=8" } - dependencies: - fill-range: 7.0.1 - - /buffer-from@1.1.2: - resolution: - { - integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, - } - - /buffer@5.7.1: - resolution: - { - integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, - } - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: false - - /callsites@3.1.0: - resolution: - { - integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, - } - engines: { node: ">=6" } - - /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 - - /chalk@4.1.2: - resolution: - { - integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, - } - engines: { node: ">=10" } - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - /chalk@5.3.0: - resolution: - { - integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==, - } - engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } - dev: true - - /chokidar@3.5.3: - resolution: - { - integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, - } - engines: { node: ">= 8.10.0" } - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - /chownr@1.1.4: - resolution: - { - integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==, - } - dev: false - - /citty@0.1.4: - resolution: - { - integrity: sha512-Q3bK1huLxzQrvj7hImJ7Z1vKYJRPQCDnd0EjXfHMidcjecGOMuLrmuQmtWmFkuKLcMThlGh1yCKG8IEc6VeNXQ==, - } - dependencies: - consola: 3.2.3 - dev: false - - /cli-color@2.0.3: - resolution: - { - integrity: sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==, - } - engines: { node: ">=0.10" } - dependencies: - d: 1.0.1 - es5-ext: 0.10.62 - es6-iterator: 2.0.3 - memoizee: 0.4.15 - timers-ext: 0.1.7 - dev: true - - /clipboardy@3.0.0: - resolution: - { - integrity: sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - dependencies: - arch: 2.2.0 - execa: 5.1.1 - is-wsl: 2.2.0 - dev: false - - /cluster-key-slot@1.1.2: - resolution: - { - integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==, - } - engines: { node: ">=0.10.0" } - dev: false - - /color-convert@2.0.1: - resolution: - { - integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, - } - engines: { node: ">=7.0.0" } - dependencies: - color-name: 1.1.4 - - /color-name@1.1.4: - resolution: - { - integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, - } - - /combined-stream@1.0.8: - resolution: - { - integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, - } - engines: { node: ">= 0.8" } - dependencies: - delayed-stream: 1.0.0 - dev: false - - /commander@9.5.0: - resolution: - { - integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==, - } - engines: { node: ^12.20.0 || >=14 } - dev: true - - /concat-map@0.0.1: - resolution: - { - integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, - } - - /consola@3.2.3: - resolution: - { - integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==, - } - engines: { node: ^14.18.0 || >=16.10.0 } - dev: false - - /cookie-es@1.0.0: - resolution: - { - integrity: sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ==, - } - dev: false - - /cookie@0.5.0: - resolution: - { - integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==, - } - engines: { node: ">= 0.6" } - - /cross-spawn@7.0.3: - resolution: - { - integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, - } - engines: { node: ">= 8" } - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - /d@1.0.1: - resolution: - { - integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==, - } - 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==, - } - - /data-uri-to-buffer@4.0.1: - resolution: - { - integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==, - } - engines: { node: ">= 12" } - dev: false - - /debug@4.3.4: - resolution: - { - integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, - } - engines: { node: ">=6.0" } - peerDependencies: - supports-color: "*" - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - - /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==, - } - - /defu@6.1.2: - resolution: - { - integrity: sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ==, - } - dev: false - - /delayed-stream@1.0.0: - resolution: - { - integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, - } - engines: { node: ">=0.4.0" } - dev: false - - /denque@2.1.0: - resolution: - { - integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==, - } - engines: { node: ">=0.10" } - dev: false - - /destr@2.0.1: - resolution: - { - integrity: sha512-M1Ob1zPSIvlARiJUkKqvAZ3VAqQY6Jcuth/pBKQ2b1dX/Qx0OnJ8Vux6J2H5PTMQeRzWrrbTu70VxBfv/OPDJA==, - } - dev: false - - /detect-libc@1.0.3: - resolution: - { - integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==, - } - engines: { node: ">=0.10" } - hasBin: true - dev: false - - /detect-libc@2.0.2: - resolution: - { - integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==, - } - engines: { node: ">=8" } - dev: false - - /difflib@0.2.4: - resolution: - { - integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==, - } - dependencies: - heap: 0.2.7 - dev: true - - /dir-glob@3.0.1: - resolution: - { - integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, - } - engines: { node: ">=8" } - dependencies: - path-type: 4.0.0 - dev: false - - /doctrine@3.0.0: - resolution: - { - integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==, - } - engines: { node: ">=6.0.0" } - dependencies: - esutils: 2.0.3 - - /dotenv@16.3.1: - resolution: - { - integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==, - } - engines: { node: ">=12" } - dev: true - - /dreamopt@0.8.0: - resolution: - { - integrity: sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==, - } - engines: { node: ">=0.4.0" } - dependencies: - wordwrap: 1.0.0 - dev: true - - /drizzle-kit@0.19.13: - resolution: - { - integrity: sha512-Rba5VW1O2JfJlwVBeZ8Zwt2E2us5oZ08PQBDiVSGlug53TOc8hzXjblZFuF+dnll9/RQEHrkzBmJFgqTvn5Rxg==, - } - hasBin: true - dependencies: - "@drizzle-team/studio": 0.0.5 - "@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 - zod: 3.22.4 - transitivePeerDependencies: - - supports-color - dev: true - - /drizzle-orm@0.28.6(@cloudflare/workers-types@4.20231016.0)(@libsql/client@0.3.5)(better-sqlite3@9.0.0)(mysql2@3.6.2): - resolution: - { - integrity: sha512-yBe+F9htrlYER7uXgDJUQsTHFoIrI5yMm5A0bg0GiZ/kY5jNXTWoEy4KQtg35cE27sw1VbgzoMWHAgCckUUUww==, - } - 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: - "@cloudflare/workers-types": 4.20231016.0 - "@libsql/client": 0.3.5 - better-sqlite3: 9.0.0 - mysql2: 3.6.2 - dev: false - - /drizzle-zod@0.5.1(drizzle-orm@0.28.6)(zod@3.22.4): - resolution: - { - integrity: sha512-C/8bvzUH/zSnVfwdSibOgFjLhtDtbKYmkbPbUCq46QZyZCH6kODIMSOgZ8R7rVjoI+tCj3k06MRJMDqsIeoS4A==, - } - peerDependencies: - drizzle-orm: ">=0.23.13" - zod: "*" - dependencies: - drizzle-orm: 0.28.6(@cloudflare/workers-types@4.20231016.0)(@libsql/client@0.3.5)(better-sqlite3@9.0.0)(mysql2@3.6.2) - zod: 3.22.4 - dev: false - - /end-of-stream@1.4.4: - resolution: - { - integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, - } - dependencies: - once: 1.4.0 - dev: false - - /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 - - /escape-string-regexp@4.0.0: - resolution: - { - integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, - } - engines: { node: ">=10" } - - /eslint-config-google@0.14.0(eslint@8.51.0): - resolution: - { - integrity: sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==, - } - engines: { node: ">=0.10.0" } - peerDependencies: - eslint: ">=5.16.0" - dependencies: - eslint: 8.51.0 - dev: true - - /eslint-plugin-json@3.1.0: - resolution: - { - integrity: sha512-MrlG2ynFEHe7wDGwbUuFPsaT2b1uhuEFhJ+W1f1u+1C2EkXmTYJp4B1aAdQQ8M+CC3t//N/oRKiIVw14L2HR1g==, - } - engines: { node: ">=12.0" } - dependencies: - lodash: 4.17.21 - vscode-json-languageservice: 4.2.1 - dev: true - - /eslint-scope@7.2.2: - resolution: - { - integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - /eslint-visitor-keys@3.4.3: - resolution: - { - integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - - /eslint@8.51.0: - resolution: - { - integrity: sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - hasBin: true - dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.51.0) - "@eslint-community/regexpp": 4.9.1 - "@eslint/eslintrc": 2.1.2 - "@eslint/js": 8.51.0 - "@humanwhocodes/config-array": 0.11.11 - "@humanwhocodes/module-importer": 1.0.1 - "@nodelib/fs.walk": 1.2.8 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.23.0 - graphemer: 1.4.0 - ignore: 5.2.4 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.3 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - - /espree@9.6.1: - resolution: - { - integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - acorn: 8.10.0 - acorn-jsx: 5.3.2(acorn@8.10.0) - eslint-visitor-keys: 3.4.3 - - /esquery@1.5.0: - resolution: - { - integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==, - } - engines: { node: ">=0.10" } - dependencies: - estraverse: 5.3.0 - - /esrecurse@4.3.0: - resolution: - { - integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, - } - engines: { node: ">=4.0" } - dependencies: - estraverse: 5.3.0 - - /estraverse@5.3.0: - resolution: - { - integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, - } - engines: { node: ">=4.0" } - - /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" } - - /event-emitter@0.3.5: - resolution: - { - integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==, - } - dependencies: - d: 1.0.1 - es5-ext: 0.10.62 - dev: true - - /execa@5.1.1: - resolution: - { - integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==, - } - engines: { node: ">=10" } - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: false - - /exit-hook@2.2.1: - resolution: - { - integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==, - } - engines: { node: ">=6" } - - /expand-template@2.0.3: - resolution: - { - integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==, - } - engines: { node: ">=6" } - 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==, - } - - /fast-glob@3.3.1: - resolution: - { - integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==, - } - engines: { node: ">=8.6.0" } - dependencies: - "@nodelib/fs.stat": 2.0.5 - "@nodelib/fs.walk": 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: false - - /fast-json-stable-stringify@2.1.0: - resolution: - { - integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, - } - - /fast-levenshtein@2.0.6: - resolution: - { - integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, - } - - /fastq@1.15.0: - resolution: - { - integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==, - } - dependencies: - reusify: 1.0.4 - - /fetch-blob@3.2.0: - resolution: - { - integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==, - } - engines: { node: ^12.20 || >= 14.13 } - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 3.2.1 - dev: false - - /file-entry-cache@6.0.1: - resolution: - { - integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==, - } - engines: { node: ^10.12.0 || >=12.0.0 } - dependencies: - flat-cache: 3.1.1 - - /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" } - dependencies: - to-regex-range: 5.0.1 - - /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 - - /flat-cache@3.1.1: - resolution: - { - integrity: sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==, - } - engines: { node: ">=12.0.0" } - dependencies: - flatted: 3.2.9 - keyv: 4.5.4 - rimraf: 3.0.2 - - /flatted@3.2.9: - resolution: - { - integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==, - } - - /form-data@4.0.0: - resolution: - { - integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==, - } - engines: { node: ">= 6" } - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: false - - /formdata-polyfill@4.0.10: - resolution: - { - integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==, - } - engines: { node: ">=12.20.0" } - dependencies: - fetch-blob: 3.2.0 - dev: false - - /fs-constants@1.0.0: - resolution: - { - integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==, - } - dev: false - - /fs.realpath@1.0.0: - resolution: - { - integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, - } - - /fsevents@2.3.3: - resolution: - { - integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, - } - engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } - os: [darwin] - requiresBuild: true - optional: true - /generate-function@2.3.1: - resolution: - { - integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==, - } - dependencies: - is-property: 1.0.2 - dev: false - - /get-port-please@3.1.1: - resolution: - { - integrity: sha512-3UBAyM3u4ZBVYDsxOQfJDxEa6XTbpBDrOjp4mf7ExFRt5BKs/QywQQiJsh2B+hxcZLSapWqCRvElUe8DnKcFHA==, - } - dev: false - - /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 - - /get-stream@6.0.1: - resolution: - { - integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==, - } - engines: { node: ">=10" } - dev: false - - /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" } - dependencies: - is-glob: 4.0.3 - - /glob-parent@6.0.2: - resolution: - { - integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, - } - engines: { node: ">=10.13.0" } - dependencies: - is-glob: 4.0.3 - - /glob-to-regexp@0.4.1: - resolution: - { - integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==, - } - - /glob@7.2.3: - resolution: - { - integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, - } - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - /glob@8.1.0: - resolution: - { - integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==, - } - engines: { node: ">=12" } - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - dev: true - - /globals@13.23.0: - resolution: - { - integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==, - } - engines: { node: ">=8" } - dependencies: - type-fest: 0.20.2 - - /globby@11.1.0: - resolution: - { - integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, - } - engines: { node: ">=10" } - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.1 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 3.0.0 - dev: false - - /graphemer@1.4.0: - resolution: - { - integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, - } - - /h3@1.8.2: - resolution: - { - integrity: sha512-1Ca0orJJlCaiFY68BvzQtP2lKLk46kcLAxVM8JgYbtm2cUg6IY7pjpYgWMwUvDO9QI30N5JAukOKoT8KD3Q0PQ==, - } - dependencies: - cookie-es: 1.0.0 - defu: 6.1.2 - destr: 2.0.1 - iron-webcrypto: 0.10.1 - radix3: 1.1.0 - ufo: 1.3.1 - uncrypto: 0.1.3 - unenv: 1.7.4 - dev: false - - /hanji@0.0.5: - resolution: - { - integrity: sha512-Abxw1Lq+TnYiL4BueXqMau222fPSPMFtya8HdpWsz/xVAhifXou71mPh/kY2+08RgFcVccjG3uZHs6K5HAe3zw==, - } - dependencies: - lodash.throttle: 4.1.1 - sisteransi: 1.0.5 - dev: true - - /has-flag@4.0.0: - resolution: - { - integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, - } - engines: { node: ">=8" } - - /heap@0.2.7: - resolution: - { - integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==, - } - dev: true - - /hono@3.8.0: - resolution: - { - integrity: sha512-lTkcFzm9abmsYiaX82r707kG7Qo9y/nSuO75VWaI6xRK46yxylMUG10Njy6SS5CcLRAg+0mw8NvPaMPbgV17Gg==, - } - engines: { node: ">=16.0.0" } - dev: false - - /http-shutdown@1.2.2: - resolution: - { - integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==, - } - engines: { iojs: ">= 1.0.0", node: ">= 0.12.0" } - dev: false - - /human-signals@2.1.0: - resolution: - { - integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==, - } - engines: { node: ">=10.17.0" } - dev: false - - /husky@8.0.3: - resolution: - { - integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==, - } - engines: { node: ">=14" } - hasBin: true - dev: true - - /iconv-lite@0.6.3: - resolution: - { - integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, - } - 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@5.2.4: - resolution: - { - integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==, - } - engines: { node: ">= 4" } - - /import-fresh@3.3.0: - resolution: - { - integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, - } - engines: { node: ">=6" } - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - /imurmurhash@0.1.4: - resolution: - { - integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, - } - engines: { node: ">=0.8.19" } - - /inflight@1.0.6: - resolution: - { - integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, - } - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - /inherits@2.0.4: - resolution: - { - integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, - } - - /ini@1.3.8: - resolution: - { - integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, - } - dev: false - - /ioredis@5.3.2: - resolution: - { - integrity: sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==, - } - engines: { node: ">=12.22.0" } - dependencies: - "@ioredis/commands": 1.2.0 - cluster-key-slot: 1.1.2 - debug: 4.3.4 - denque: 2.1.0 - lodash.defaults: 4.2.0 - lodash.isarguments: 3.1.0 - redis-errors: 1.2.0 - redis-parser: 3.0.0 - standard-as-callback: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: false - - /iron-webcrypto@0.10.1: - resolution: - { - integrity: sha512-QGOS8MRMnj/UiOa+aMIgfyHcvkhqNUsUxb1XzskENvbo+rEfp6TOwqd1KPuDzXC4OnGHcMSVxDGRoilqB8ViqA==, - } - dev: false - - /is-binary-path@2.1.0: - resolution: - { - integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, - } - engines: { node: ">=8" } - dependencies: - binary-extensions: 2.2.0 - - /is-docker@2.2.1: - resolution: - { - integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==, - } - engines: { node: ">=8" } - hasBin: true - dev: false - - /is-extglob@2.1.1: - resolution: - { - integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, - } - engines: { node: ">=0.10.0" } - - /is-glob@4.0.3: - resolution: - { - integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, - } - engines: { node: ">=0.10.0" } - dependencies: - is-extglob: 2.1.1 - - /is-number@7.0.0: - resolution: - { - integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, - } - engines: { node: ">=0.12.0" } - - /is-path-inside@3.0.3: - resolution: - { - integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, - } - engines: { node: ">=8" } - - /is-promise@2.2.2: - resolution: - { - integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==, - } - dev: true - - /is-property@1.0.2: - resolution: - { - integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==, - } - dev: false - - /is-stream@2.0.1: - resolution: - { - integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, - } - engines: { node: ">=8" } - dev: false - - /is-wsl@2.2.0: - resolution: - { - integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==, - } - engines: { node: ">=8" } - dependencies: - is-docker: 2.2.1 - dev: false - - /isexe@2.0.0: - resolution: - { - integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, - } - - /jiti@1.20.0: - resolution: - { - integrity: sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==, - } - hasBin: true - dev: false - - /js-base64@3.7.5: - resolution: - { - integrity: sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==, - } - dev: false - - /js-yaml@4.1.0: - resolution: - { - integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, - } - hasBin: true - dependencies: - argparse: 2.0.1 - - /json-buffer@3.0.1: - resolution: - { - integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, - } - - /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-schema-traverse@0.4.1: - resolution: - { - integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, - } - - /json-stable-stringify-without-jsonify@1.0.1: - resolution: - { - integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, - } - - /jsonc-parser@3.2.0: - resolution: - { - integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==, - } - - /keyv@4.5.4: - resolution: - { - integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, - } - dependencies: - json-buffer: 3.0.1 - - /levn@0.4.1: - resolution: - { - integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, - } - engines: { node: ">= 0.8.0" } - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - - /libsql@0.1.29: - resolution: - { - integrity: sha512-m81nXwDjz7WIwAblmhGJ68f6wJPtClG2N9kNxYG92vB7sALUGU3THza2J2+Mfg0YC+cy+hehorb7zHETj8doKw==, - } - cpu: [x64, arm64] - os: [darwin, linux, win32] - dependencies: - "@neon-rs/load": 0.0.4 - detect-libc: 2.0.2 - optionalDependencies: - "@libsql/darwin-arm64": 0.1.29 - "@libsql/darwin-x64": 0.1.29 - "@libsql/linux-arm64-gnu": 0.1.29 - "@libsql/linux-x64-gnu": 0.1.29 - "@libsql/linux-x64-musl": 0.1.29 - "@libsql/win32-x64-msvc": 0.1.29 - dev: false - - /listhen@1.5.5: - resolution: - { - integrity: sha512-LXe8Xlyh3gnxdv4tSjTjscD1vpr/2PRpzq8YIaMJgyKzRG8wdISlWVWnGThJfHnlJ6hmLt2wq1yeeix0TEbuoA==, - } - hasBin: true - dependencies: - "@parcel/watcher": 2.3.0 - "@parcel/watcher-wasm": 2.3.0 - citty: 0.1.4 - clipboardy: 3.0.0 - consola: 3.2.3 - defu: 6.1.2 - get-port-please: 3.1.1 - h3: 1.8.2 - http-shutdown: 1.2.2 - jiti: 1.20.0 - mlly: 1.4.2 - node-forge: 1.3.1 - pathe: 1.1.1 - std-env: 3.4.3 - ufo: 1.3.1 - untun: 0.1.2 - uqr: 0.1.2 - dev: false - - /locate-path@6.0.0: - resolution: - { - integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, - } - engines: { node: ">=10" } - dependencies: - p-locate: 5.0.0 - - /lodash.defaults@4.2.0: - resolution: - { - integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==, - } - dev: false - - /lodash.isarguments@3.1.0: - resolution: - { - integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==, - } - dev: false - - /lodash.merge@4.6.2: - resolution: - { - integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, - } - - /lodash.throttle@4.1.1: - resolution: - { - integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==, - } - dev: true - - /lodash@4.17.21: - resolution: - { - integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, - } - dev: true - - /long@5.2.3: - resolution: - { - integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==, - } - dev: false - - /lru-cache@10.0.1: - resolution: - { - integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==, - } - engines: { node: 14 || >=16.14 } - dev: false - - /lru-cache@6.0.0: - resolution: - { - integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, - } - engines: { node: ">=10" } - dependencies: - yallist: 4.0.0 - dev: false - - /lru-cache@7.18.3: - resolution: - { - integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==, - } - engines: { node: ">=12" } - dev: false - - /lru-cache@8.0.5: - resolution: - { - integrity: sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==, - } - engines: { node: ">=16.14" } - dev: false - - /lru-queue@0.1.0: - resolution: - { - integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==, - } - dependencies: - es5-ext: 0.10.62 - dev: true - - /lucia@2.7.1: - resolution: - { - integrity: sha512-EHDTajS1YWA7Q37jd29Far1l4nfZgsWLp4hDQeaQhVpJd2WKQqA3626kJYmOj1CTweVMkE54xFi5JIph+agZkQ==, - } - dev: false - - /magic-string@0.25.9: - resolution: - { - integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==, - } - dependencies: - sourcemap-codec: 1.4.8 - dev: true - - /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-stream@2.0.0: - resolution: - { - integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, - } - dev: false - - /merge2@1.4.1: - resolution: - { - integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, - } - engines: { node: ">= 8" } - dev: false - - /micromatch@4.0.5: - resolution: - { - integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, - } - engines: { node: ">=8.6" } - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - dev: false - - /mime-db@1.52.0: - resolution: - { - integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, - } - engines: { node: ">= 0.6" } - dev: false - - /mime-types@2.1.35: - resolution: - { - integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, - } - engines: { node: ">= 0.6" } - dependencies: - mime-db: 1.52.0 - 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: false - - /mimic-response@3.1.0: - resolution: - { - integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==, - } - engines: { node: ">=10" } - dev: false - - /miniflare@3.20231010.0: - resolution: - { - integrity: sha512-VETY+/OhJ1RN+yrFpPUqBZysb2R8wXvyx3vzaRZS2qO1aGNKeGASa/vxCvNcBF+gt8UdbWMOalSXX8zY0IgWZA==, - } - engines: { node: ">=16.13" } - dependencies: - acorn: 8.10.0 - acorn-walk: 8.2.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.26.3 - workerd: 1.20231010.0 - ws: 8.14.2 - youch: 3.3.2 - zod: 3.22.4 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - /miniflare@3.20231025.1: - resolution: - { - integrity: sha512-zwvu/f6eivBBF2shuom5DibnZjGSxt6FiC8sZlj+CcqTRss1D2ZHYD09odhAZLY9DYXE0orBFkJKnIDx/QmYdQ==, - } - engines: { node: ">=16.13" } - dependencies: - acorn: 8.10.0 - acorn-walk: 8.2.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.26.3 - workerd: 1.20231025.0 - ws: 8.14.2 - youch: 3.3.2 - zod: 3.22.4 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: false - - /minimatch@3.1.2: - resolution: - { - integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, - } - dependencies: - brace-expansion: 1.1.11 - - /minimatch@5.1.6: - resolution: - { - integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==, - } - engines: { node: ">=10" } - dependencies: - brace-expansion: 2.0.1 - dev: true - - /minimatch@7.4.6: - resolution: - { - integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==, - } - engines: { node: ">=10" } - dependencies: - brace-expansion: 2.0.1 - dev: true - - /minimist@1.2.8: - resolution: - { - integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, - } - dev: false - - /mkdirp-classic@0.5.3: - resolution: - { - integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==, - } - dev: false - - /mlly@1.4.2: - resolution: - { - integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==, - } - dependencies: - acorn: 8.10.0 - pathe: 1.1.1 - pkg-types: 1.0.3 - ufo: 1.3.1 - dev: false - - /mri@1.2.0: - resolution: - { - integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==, - } - engines: { node: ">=4" } - dev: false - - /ms@2.1.2: - resolution: - { - integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, - } - - /mustache@4.2.0: - resolution: - { - integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==, - } - hasBin: true - - /mysql2@3.6.2: - resolution: - { - integrity: sha512-m5erE6bMoWfPXW1D5UrVwlT8PowAoSX69KcZzPuARQ3wY1RJ52NW9PdvdPo076XiSIkQ5IBTis7hxdlrQTlyug==, - } - engines: { node: ">= 8.0" } - dependencies: - denque: 2.1.0 - generate-function: 2.3.1 - iconv-lite: 0.6.3 - long: 5.2.3 - lru-cache: 8.0.5 - named-placeholders: 1.1.3 - seq-queue: 0.0.5 - sqlstring: 2.3.3 - dev: false - - /named-placeholders@1.1.3: - resolution: - { - integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==, - } - engines: { node: ">=12.0.0" } - dependencies: - lru-cache: 7.18.3 - dev: false - - /nanoid@3.3.6: - resolution: - { - integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==, - } - 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==, - } - dev: false - - /napi-wasm@1.1.0: - resolution: - { - integrity: sha512-lHwIAJbmLSjF9VDRm9GoVOy9AGp3aIvkjv+Kvz9h16QR3uSVYH78PNQUnT2U4X53mhlnV2M7wrhibQ3GHicDmg==, - } - dev: false - - /natural-compare@1.4.0: - resolution: - { - integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, - } - - /next-tick@1.1.0: - resolution: - { - integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==, - } - dev: true - - /node-abi@3.51.0: - resolution: - { - integrity: sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA==, - } - engines: { node: ">=10" } - dependencies: - semver: 7.5.4 - dev: false - - /node-addon-api@7.0.0: - resolution: - { - integrity: sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==, - } - dev: false - - /node-domexception@1.0.0: - resolution: - { - integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==, - } - engines: { node: ">=10.5.0" } - dev: false - - /node-fetch-native@1.4.0: - resolution: - { - integrity: sha512-F5kfEj95kX8tkDhUCYdV8dg3/8Olx/94zB8+ZNthFs6Bz31UpUi8Xh40TN3thLwXgrwXry1pEg9lJ++tLWTcqA==, - } - dev: false - - /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-fetch@3.3.2: - resolution: - { - integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - dependencies: - data-uri-to-buffer: 4.0.1 - fetch-blob: 3.2.0 - formdata-polyfill: 4.0.10 - dev: false - - /node-forge@1.3.1: - resolution: - { - integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==, - } - engines: { node: ">= 6.13.0" } - - /normalize-path@3.0.0: - resolution: - { - integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, - } - engines: { node: ">=0.10.0" } - - /npm-run-path@4.0.1: - resolution: - { - integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==, - } - engines: { node: ">=8" } - dependencies: - path-key: 3.1.1 - dev: false - - /ofetch@1.3.3: - resolution: - { - integrity: sha512-s1ZCMmQWXy4b5K/TW9i/DtiN8Ku+xCiHcjQ6/J/nDdssirrQNOoB165Zu8EqLMA2lln1JUth9a0aW9Ap2ctrUg==, - } - dependencies: - destr: 2.0.1 - node-fetch-native: 1.4.0 - ufo: 1.3.1 - dev: false - - /once@1.4.0: - resolution: - { - integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, - } - dependencies: - wrappy: 1.0.2 - - /onetime@5.1.2: - resolution: - { - integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, - } - engines: { node: ">=6" } - dependencies: - mimic-fn: 2.1.0 - dev: false - - /openapi3-ts@4.1.2: - resolution: - { - integrity: sha512-B7gOkwsYMZO7BZXwJzXCuVagym2xhqsrilVvV0dnq2Di4+iLUXKVX9gOK23ZqaAHZOwABXN0QTdW8QnkUTX6DA==, - } - dependencies: - yaml: 2.3.3 - dev: false - - /optionator@0.9.3: - resolution: - { - integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==, - } - engines: { node: ">= 0.8.0" } - dependencies: - "@aashutoshrathi/word-wrap": 1.2.6 - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - - /oslo@0.17.0: - resolution: - { - integrity: sha512-UJHew6zFEkJYGWjO4/ARHnX+M7umhJ6IXc6cJA2AQ3BpFwqEqaKjySOfXYuNFQddzfP2zk1aG+xYQG1ODHKwfQ==, - } - dependencies: - "@node-rs/argon2": 1.5.2 - "@node-rs/bcrypt": 1.7.3 - dev: false - - /p-limit@3.1.0: - resolution: - { - integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, - } - engines: { node: ">=10" } - dependencies: - yocto-queue: 0.1.0 - - /p-locate@5.0.0: - resolution: - { - integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, - } - engines: { node: ">=10" } - dependencies: - p-limit: 3.1.0 - - /parent-module@1.0.1: - resolution: - { - integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, - } - engines: { node: ">=6" } - dependencies: - callsites: 3.1.0 - - /path-exists@4.0.0: - resolution: - { - integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, - } - engines: { node: ">=8" } - - /path-is-absolute@1.0.1: - resolution: - { - integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, - } - engines: { node: ">=0.10.0" } - - /path-key@3.1.1: - resolution: - { - integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, - } - engines: { node: ">=8" } - - /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" } - dev: false - - /pathe@1.1.1: - resolution: - { - integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==, - } - dev: false - - /picomatch@2.3.1: - resolution: - { - integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, - } - engines: { node: ">=8.6" } - - /pkg-types@1.0.3: - resolution: - { - integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==, - } - dependencies: - jsonc-parser: 3.2.0 - mlly: 1.4.2 - pathe: 1.1.1 - dev: false - - /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 - - /prelude-ls@1.2.1: - resolution: - { - integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, - } - engines: { node: ">= 0.8.0" } - - /prettier@3.0.3: - resolution: - { - integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==, - } - engines: { node: ">=14" } - hasBin: true - dev: false - - /printable-characters@1.0.42: - resolution: - { - integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==, - } - - /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.0: - resolution: - { - integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==, - } - engines: { node: ">=6" } - - /queue-microtask@1.2.3: - resolution: - { - integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, - } - - /radix3@1.1.0: - resolution: - { - integrity: sha512-pNsHDxbGORSvuSScqNJ+3Km6QAVqk8CfsCBIEoDgpqLrkD2f3QM4I7d1ozJJ172OmIcoUcerZaNWqtLkRXTV3A==, - } - dev: false - - /rc@1.2.8: - resolution: - { - integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==, - } - hasBin: true - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - dev: false - - /readable-stream@3.6.2: - resolution: - { - integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, - } - engines: { node: ">= 6" } - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - dev: false - - /readdirp@3.6.0: - resolution: - { - integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, - } - engines: { node: ">=8.10.0" } - dependencies: - picomatch: 2.3.1 - - /redis-errors@1.2.0: - resolution: - { - integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==, - } - engines: { node: ">=4" } - dev: false - - /redis-parser@3.0.0: - resolution: - { - integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==, - } - engines: { node: ">=4" } - dependencies: - redis-errors: 1.2.0 - dev: false - - /resolve-from@4.0.0: - resolution: - { - integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, - } - engines: { node: ">=4" } - - /resolve-pkg-maps@1.0.0: - resolution: - { - integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==, - } - dev: true - - /reusify@1.0.4: - resolution: - { - integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, - } - engines: { iojs: ">=1.0.0", node: ">=0.10.0" } - - /rimraf@3.0.2: - resolution: - { - integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, - } - hasBin: true - dependencies: - glob: 7.2.3 - - /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. - 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 - dev: true - - /run-parallel@1.2.0: - resolution: - { - integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, - } - dependencies: - queue-microtask: 1.2.3 - - /safe-buffer@5.2.1: - resolution: - { - integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, - } - dev: false - - /safer-buffer@2.1.2: - resolution: - { - integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, - } - dev: false - - /selfsigned@2.1.1: - resolution: - { - integrity: sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==, - } - engines: { node: ">=10" } - dependencies: - node-forge: 1.3.1 - dev: true - - /semver@7.5.4: - resolution: - { - integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==, - } - engines: { node: ">=10" } - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: false - - /seq-queue@0.0.5: - resolution: - { - integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==, - } - dev: false - - /shebang-command@2.0.0: - resolution: - { - integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, - } - engines: { node: ">=8" } - dependencies: - shebang-regex: 3.0.0 - - /shebang-regex@3.0.0: - resolution: - { - integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, - } - engines: { node: ">=8" } - - /signal-exit@3.0.7: - resolution: - { - integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, - } - dev: false - - /simple-concat@1.0.1: - resolution: - { - integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==, - } - dev: false - - /simple-get@4.0.1: - resolution: - { - integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==, - } - dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 - 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: false - - /source-map-support@0.5.21: - resolution: - { - integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, - } - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - /source-map@0.6.1: - resolution: - { - integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, - } - engines: { node: ">=0.10.0" } - - /sourcemap-codec@1.4.8: - resolution: - { - integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==, - } - deprecated: Please use @jridgewell/sourcemap-codec instead - dev: true - - /sqlstring@2.3.3: - resolution: - { - integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==, - } - engines: { node: ">= 0.6" } - dev: false - - /stacktracey@2.1.8: - resolution: - { - integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==, - } - dependencies: - as-table: 1.0.55 - get-source: 2.0.12 - - /standard-as-callback@2.1.0: - resolution: - { - integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==, - } - dev: false - - /std-env@3.4.3: - resolution: - { - integrity: sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==, - } - dev: false - - /stoppable@1.1.0: - resolution: - { - integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==, - } - engines: { node: ">=4", npm: ">=6" } - - /string_decoder@1.3.0: - resolution: - { - integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, - } - dependencies: - safe-buffer: 5.2.1 - dev: false - - /strip-ansi@6.0.1: - resolution: - { - integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, - } - engines: { node: ">=8" } - dependencies: - ansi-regex: 5.0.1 - - /strip-final-newline@2.0.0: - resolution: - { - integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==, - } - engines: { node: ">=6" } - dev: false - - /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" } - - /supports-color@7.2.0: - resolution: - { - integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, - } - engines: { node: ">=8" } - dependencies: - has-flag: 4.0.0 - - /tar-fs@2.1.1: - resolution: - { - integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==, - } - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.0 - tar-stream: 2.2.0 - dev: false - - /tar-stream@2.2.0: - resolution: - { - integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==, - } - engines: { node: ">=6" } - 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 - - /text-table@0.2.0: - resolution: - { - integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, - } - - /timers-ext@0.1.7: - resolution: - { - integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==, - } - dependencies: - es5-ext: 0.10.62 - next-tick: 1.1.0 - dev: true - - /to-regex-range@5.0.1: - resolution: - { - integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, - } - engines: { node: ">=8.0" } - dependencies: - is-number: 7.0.0 - - /tr46@0.0.3: - resolution: - { - integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, - } - dev: false - - /ts-api-utils@1.0.3(typescript@5.2.2): - resolution: - { - integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==, - } - engines: { node: ">=16.13.0" } - peerDependencies: - typescript: ">=4.2.0" - dependencies: - typescript: 5.2.2 - dev: false - - /tslib@2.6.2: - resolution: - { - integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==, - } - - /tsx@3.13.0: - resolution: - { - integrity: sha512-rjmRpTu3as/5fjNq/kOkOtihgLxuIz6pbKdj9xwP4J5jOLkBxw/rjN5ANw+KyrrOXV5uB7HC8+SrrSJxT65y+A==, - } - hasBin: true - dependencies: - esbuild: 0.18.20 - get-tsconfig: 4.7.2 - source-map-support: 0.5.21 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /tunnel-agent@0.6.0: - resolution: - { - integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==, - } - dependencies: - safe-buffer: 5.2.1 - dev: false - - /type-check@0.4.0: - resolution: - { - integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, - } - engines: { node: ">= 0.8.0" } - dependencies: - prelude-ls: 1.2.1 - - /type-fest@0.20.2: - resolution: - { - integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==, - } - engines: { node: ">=10" } - - /type@1.2.0: - resolution: - { - integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==, - } - dev: true - - /type@2.7.2: - resolution: - { - integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==, - } - dev: true - - /typescript@5.2.2: - resolution: - { - integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==, - } - engines: { node: ">=14.17" } - hasBin: true - - /ufo@1.3.1: - resolution: - { - integrity: sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==, - } - dev: false - - /uncrypto@0.1.3: - resolution: - { - integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==, - } - dev: false - - /undici-types@5.25.3: - resolution: - { - integrity: sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==, - } - - /undici@5.26.3: - resolution: - { - integrity: sha512-H7n2zmKEWgOllKkIUkLvFmsJQj062lSm3uA4EYApG8gLuiOM0/go9bIoC3HVaSnfg4xunowDE2i9p8drkXuvDw==, - } - engines: { node: ">=14.0" } - dependencies: - "@fastify/busboy": 2.0.0 - - /unenv@1.7.4: - resolution: - { - integrity: sha512-fjYsXYi30It0YCQYqLOcT6fHfMXsBr2hw9XC7ycf8rTG7Xxpe3ZssiqUnD0khrjiZEmkBXWLwm42yCSCH46fMw==, - } - dependencies: - consola: 3.2.3 - defu: 6.1.2 - mime: 3.0.0 - node-fetch-native: 1.4.0 - pathe: 1.1.1 - dev: false - - /unstorage@1.9.0: - resolution: - { - integrity: sha512-VpD8ZEYc/le8DZCrny3bnqKE4ZjioQxBRnWE+j5sGNvziPjeDlaS1NaFFHzl/kkXaO3r7UaF8MGQrs14+1B4pQ==, - } - peerDependencies: - "@azure/app-configuration": ^1.4.1 - "@azure/cosmos": ^3.17.3 - "@azure/data-tables": ^13.2.2 - "@azure/identity": ^3.2.3 - "@azure/keyvault-secrets": ^4.7.0 - "@azure/storage-blob": ^12.14.0 - "@capacitor/preferences": ^5.0.0 - "@planetscale/database": ^1.8.0 - "@upstash/redis": ^1.22.0 - "@vercel/kv": ^0.2.2 - idb-keyval: ^6.2.1 - peerDependenciesMeta: - "@azure/app-configuration": - optional: true - "@azure/cosmos": - optional: true - "@azure/data-tables": - optional: true - "@azure/identity": - optional: true - "@azure/keyvault-secrets": - optional: true - "@azure/storage-blob": - optional: true - "@capacitor/preferences": - optional: true - "@planetscale/database": - optional: true - "@upstash/redis": - optional: true - "@vercel/kv": - optional: true - idb-keyval: - optional: true - dependencies: - anymatch: 3.1.3 - chokidar: 3.5.3 - destr: 2.0.1 - h3: 1.8.2 - ioredis: 5.3.2 - listhen: 1.5.5 - lru-cache: 10.0.1 - mri: 1.2.0 - node-fetch-native: 1.4.0 - ofetch: 1.3.3 - ufo: 1.3.1 - transitivePeerDependencies: - - supports-color - dev: false - - /untun@0.1.2: - resolution: - { - integrity: sha512-wLAMWvxfqyTiBODA1lg3IXHQtjggYLeTK7RnSfqtOXixWJ3bAa2kK/HHmOOg19upteqO3muLvN6O/icbyQY33Q==, - } - hasBin: true - dependencies: - citty: 0.1.4 - consola: 3.2.3 - pathe: 1.1.1 - dev: false - - /uqr@0.1.2: - resolution: - { - integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==, - } - dev: false - - /uri-js@4.4.1: - resolution: - { - integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, - } - dependencies: - punycode: 2.3.0 - - /util-deprecate@1.0.2: - resolution: - { - integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, - } - dev: false - - /uuid@9.0.1: - resolution: - { - integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==, - } - hasBin: true - dev: false - - /vscode-json-languageservice@4.2.1: - resolution: - { - integrity: sha512-xGmv9QIWs2H8obGbWg+sIPI/3/pFgj/5OWBhNzs00BkYQ9UaB2F6JJaGB/2/YOZJ3BvLXQTC4Q7muqU25QgAhA==, - } - dependencies: - jsonc-parser: 3.2.0 - vscode-languageserver-textdocument: 1.0.11 - vscode-languageserver-types: 3.17.5 - vscode-nls: 5.2.0 - vscode-uri: 3.0.8 - dev: true - - /vscode-languageserver-textdocument@1.0.11: - resolution: - { - integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==, - } - dev: true - - /vscode-languageserver-types@3.17.5: - resolution: - { - integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==, - } - dev: true - - /vscode-nls@5.2.0: - resolution: - { - integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==, - } - dev: true - - /vscode-uri@3.0.8: - resolution: - { - integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==, - } - dev: true - - /web-streams-polyfill@3.2.1: - resolution: - { - integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==, - } - engines: { node: ">= 8" } - dev: false - - /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@2.0.2: - resolution: - { - integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, - } - engines: { node: ">= 8" } - hasBin: true - dependencies: - isexe: 2.0.0 - - /wordwrap@1.0.0: - resolution: - { - integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==, - } - dev: true - - /workerd@1.20231010.0: - resolution: - { - integrity: sha512-ghxfBU8fBSBDa8fCBPfzWivYsWpewYftgy70N308C+acQ5AaKNM1QTdkQNm9YWeC5Jpl1YvBX04ojt7lCc3juw==, - } - engines: { node: ">=16" } - hasBin: true - requiresBuild: true - optionalDependencies: - "@cloudflare/workerd-darwin-64": 1.20231010.0 - "@cloudflare/workerd-darwin-arm64": 1.20231010.0 - "@cloudflare/workerd-linux-64": 1.20231010.0 - "@cloudflare/workerd-linux-arm64": 1.20231010.0 - "@cloudflare/workerd-windows-64": 1.20231010.0 - dev: true - - /workerd@1.20231025.0: - resolution: - { - integrity: sha512-W1PFtpMFfvmm+ozBf+u70TE3Pviv7WA4qzDeejHDC4z+PFDq4+3KJCkgffaGBO86h+akWO0hSsc0uXL2zAqofQ==, - } - engines: { node: ">=16" } - hasBin: true - requiresBuild: true - optionalDependencies: - "@cloudflare/workerd-darwin-64": 1.20231025.0 - "@cloudflare/workerd-darwin-arm64": 1.20231025.0 - "@cloudflare/workerd-linux-64": 1.20231025.0 - "@cloudflare/workerd-linux-arm64": 1.20231025.0 - "@cloudflare/workerd-windows-64": 1.20231025.0 - dev: false - - /wrangler@3.13.1: - resolution: - { - integrity: sha512-CY73h4lfPx/3CmkC/tPj66DRRZ9Y42sMcHys6B6tjCILUo950IeOvnsj759el3/ewFLY4kG4jCrrrikan6TE+Q==, - } - engines: { node: ">=16.13.0" } - hasBin: true - 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.20231010.0 - nanoid: 3.3.6 - path-to-regexp: 6.2.1 - selfsigned: 2.1.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 - dev: true - - /wrappy@1.0.2: - resolution: - { - integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, - } - - /ws@8.14.2: - resolution: - { - integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==, - } - engines: { node: ">=10.0.0" } - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - /xxhash-wasm@1.0.2: - resolution: - { - integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==, - } - dev: true - - /yallist@4.0.0: - resolution: - { - integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, - } - dev: false - - /yaml@2.3.3: - resolution: - { - integrity: sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==, - } - engines: { node: ">= 14" } - dev: false - - /yocto-queue@0.1.0: - resolution: - { - integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, - } - engines: { node: ">=10" } - - /youch@3.3.2: - resolution: - { - integrity: sha512-9cwz/z7abtcHOIuH45nzmUFCZbyJA1nLqlirKvyNRx4wDMhqsBaifAJzBej7L4fsVPjFxYq3NK3GAcfvZsydFw==, - } - dependencies: - cookie: 0.5.0 - mustache: 4.2.0 - stacktracey: 2.1.8 - - /zod@3.22.4: - resolution: - { - integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==, - } + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + + /@asteasolutions/zod-to-openapi@5.5.0(zod@3.22.4): + resolution: {integrity: sha512-d5HwrvM6dOKr3XdeF+DmashGvfEc+1oiEfbscugsiwSTrFtuMa7ETpW9sTNnVgn+hJaz+PRxPQUYD7q9/5dUig==} + peerDependencies: + zod: ^3.20.2 + dependencies: + openapi3-ts: 4.1.2 + zod: 3.22.4 + dev: false + + /@cloudflare/kv-asset-handler@0.2.0: + resolution: {integrity: sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==} + dependencies: + mime: 3.0.0 + dev: true + + /@cloudflare/workerd-darwin-64@1.20231025.0: + resolution: {integrity: sha512-MYRYTbSl+tjGg6su7savlLIb8cOcKJfdGpA+WdtgqT2OF7O+89Lag0l1SA/iyVlUkT31Jc6OLHqvzsXgmg+niQ==} + engines: {node: '>=16'} + cpu: [x64] + os: [darwin] + requiresBuild: true + optional: true + + /@cloudflare/workerd-darwin-arm64@1.20231025.0: + resolution: {integrity: sha512-BszjtBDR84TVa6oWe74dePJSAukWlTmLw9zR4KeWuwZLJGV7RMm6AmwGStetjnwZrecZaaOFELfBCAHtsebV0Q==} + engines: {node: '>=16'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optional: true + + /@cloudflare/workerd-linux-64@1.20231025.0: + resolution: {integrity: sha512-AT9dxgKXOa9xZxZ3k2a432axPJJ58KpoNWnPiPYGpuAuLoWnfcYwwh6mr9sZVcTdAdTAK9Xu9c81tp0YABanUw==} + engines: {node: '>=16'} + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true + + /@cloudflare/workerd-linux-arm64@1.20231025.0: + resolution: {integrity: sha512-EIjex5o2k80YZWPix1btGybL/vNZ3o6vqKX9ptS0JcFkHV5aFX5/kcMwSBRjiIC+w04zVjmGQx3N1Vh3njuncg==} + engines: {node: '>=16'} + cpu: [arm64] + os: [linux] + requiresBuild: true + optional: true + + /@cloudflare/workerd-windows-64@1.20231025.0: + resolution: {integrity: sha512-7vtq0mO22A2v0OOsKXa760r9a84Gg8CK0gDu5uNWlj6hojmt011iz7jJt76I7oo/XrVwVlVfu69GnA3ljx6U8w==} + engines: {node: '>=16'} + cpu: [x64] + os: [win32] + requiresBuild: true + optional: true + + /@cloudflare/workers-types@4.20231025.0: + resolution: {integrity: sha512-TkcZkntUTOcvJ4vgmwpNfLTclpMbmbClZCe62B25/VTukmyv91joRa4eKzSjzCZUXTbFHNmVdOpmGaaJU2U3+A==} + + /@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-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-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-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-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-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-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-community/eslint-utils@4.4.0(eslint@8.53.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.53.0 + eslint-visitor-keys: 3.4.3 + + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + /@eslint/eslintrc@2.1.3: + resolution: {integrity: sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.23.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + /@eslint/js@8.53.0: + resolution: {integrity: sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + /@fastify/busboy@2.0.0: + resolution: {integrity: sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==} + engines: {node: '>=14'} + + /@hono/swagger-ui@0.1.0(hono@3.9.2): + resolution: {integrity: sha512-W5WEEhk2QtiqdSfM40FcK98Q5Bz4H/NfNqBUSkcZ46ys+DG4wt1yGsmRZgdJMje6t5Vn8eFN+9nyO+/dAp3drA==} + peerDependencies: + hono: '*' + dependencies: + hono: 3.9.2 + dev: false + + /@hono/zod-openapi@0.8.3(hono@3.9.2)(zod@3.22.4): + resolution: {integrity: sha512-TwjSf63miIF3VBqNy4V6EOqZYdTQPeIQQ9Q2HjRWFYH9f2QtBFXziuqIg2Y76gNZ3WDal67NQXmbSErHiFR44g==} + engines: {node: '>=16.0.0'} + peerDependencies: + hono: '>=3.9.0' + zod: 3.* + dependencies: + '@asteasolutions/zod-to-openapi': 5.5.0(zod@3.22.4) + '@hono/zod-validator': 0.1.11(hono@3.9.2)(zod@3.22.4) + hono: 3.9.2 + zod: 3.22.4 + dev: false + + /@hono/zod-validator@0.1.11(hono@3.9.2)(zod@3.22.4): + resolution: {integrity: sha512-PQXeHUP0+36qpRt8yfeD7N2jbK3ETlGvSN6dMof/HwUC/APRokQRjpXZm4rrlG71Ft0aWE01+Bm4XejqPie5Uw==} + peerDependencies: + hono: '>=3.9.0' + zod: ^3.19.1 + dependencies: + hono: 3.9.2 + zod: 3.22.4 + dev: false + + /@humanwhocodes/config-array@0.11.13: + resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 2.0.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + /@humanwhocodes/object-schema@2.0.1: + resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} + + /@ioredis/commands@1.2.0: + resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} + dev: false + + /@libsql/client@0.3.6: + resolution: {integrity: sha512-3Mc4ZDI7X5ZLkMxX5XijiBeqhvyrny356lcj/KVVIeMXt9j6g4l+CRIsUvgcsyCAOUHqWqh0+TjI91bCKmdW+w==} + dependencies: + '@libsql/hrana-client': 0.5.5 + js-base64: 3.7.5 + libsql: 0.1.34 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: false + + /@libsql/darwin-arm64@0.1.34: + resolution: {integrity: sha512-Wv8jvkj/fUAO8DF3A4HaddCMldUUpKcg/WW1sY95FNsSHOxktyxqU80jAp/tCuZ85GQIJozvgSr51/ARIC0gsw==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@libsql/darwin-x64@0.1.34: + resolution: {integrity: sha512-2NQXD9nUzC08hg7FdcZLq5uTEwGz1KbD7YvUzQb/psO1lO/E/p83wl1es1082+Pp0z5pSPDWQeRTuccD41L+3w==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@libsql/hrana-client@0.5.5: + resolution: {integrity: sha512-i+hDBpiV719poqEiHupUUZYKJ9YSbCRFe5Q2PQ0v3mHIftePH6gayLjp2u6TXbqbO/Dv6y8yyvYlBXf/kFfRZA==} + dependencies: + '@libsql/isomorphic-fetch': 0.1.10 + '@libsql/isomorphic-ws': 0.1.5 + js-base64: 3.7.5 + node-fetch: 3.3.2 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: false + + /@libsql/isomorphic-fetch@0.1.10: + resolution: {integrity: sha512-dH0lMk50gKSvEKD78xWMu60SY1sjp1sY//iFLO0XMmBwfVfG136P9KOk06R4maBdlb8KMXOzJ1D28FR5ZKnHTA==} + dependencies: + '@types/node-fetch': 2.6.9 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: false + + /@libsql/isomorphic-ws@0.1.5: + resolution: {integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==} + dependencies: + '@types/ws': 8.5.9 + ws: 8.14.2 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /@libsql/linux-arm64-gnu@0.1.34: + resolution: {integrity: sha512-r3dY1FDYZ7eX5HX7HyAoYSqK5FPugj5NSB5Bt/nz+ygBWdXASgSKxkE/RqjJIM59vXwv300iJX9qhR5fXv8sTw==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@libsql/linux-arm64-musl@0.1.34: + resolution: {integrity: sha512-9AE/eNb9eQRcNsLxqtpLJxVEoIMmItrdwqJDImPJtOp10rhp4U0x/9RGKerl9Mg3ObVj676pyhAR2KzyudrOfQ==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@libsql/linux-x64-gnu@0.1.34: + resolution: {integrity: sha512-o8toY1Txstjt13fBhZbFe8sNAW6OaS6qVcp1Bd6bHkCLSBLZ6pjJmwzQN8rFv9QFBPAnaKP3lI4vaOXXw7huTA==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@libsql/linux-x64-musl@0.1.34: + resolution: {integrity: sha512-EldEmcAxxNPSCjJ73oFxg81PDDIpDbPqK/QOrhmmGYLvYwrnQtVRUIbARf80JQvcy6bCxOO/Q9dh6wGhnyHyYA==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@libsql/win32-x64-msvc@0.1.34: + resolution: {integrity: sha512-jnv0qfVMnrVv00r+wUOe6DHrHuao9y1w1lN543cV2J1JdQNJT/eSZzhyZFSlS3T2ZUvXfZfZ5GeL8U18IAID6w==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@lucia-auth/adapter-session-unstorage@2.1.0(lucia@2.7.3)(unstorage@1.9.0): + resolution: {integrity: sha512-ItK7urZhLZv7UO99BcODjRhSAv58UPc+KQAmnkSvri2WBc22vFEjnjd/oWp3CZPdbbrJkuTvsuhFXH1ySBfOLg==} + peerDependencies: + lucia: ^2.0.0 + unstorage: ^1.9.0 + dependencies: + lucia: 2.7.3 + unstorage: 1.9.0 + dev: false + + /@lucia-auth/adapter-sqlite@2.0.1(@libsql/client@0.3.6)(better-sqlite3@9.1.1)(lucia@2.7.3): + resolution: {integrity: sha512-yc7XQ4X3sWG1gyUGHqaXipJIkmvB4MOgJypnSMWy7Vjhn3AOCM2xw51xTs+dGpLOQIn2Laomg9xpmDM2/9tgqQ==} + peerDependencies: + '@libsql/client': ^0.3.0 + better-sqlite3: 8.x - 9.x + lucia: ^2.0.0 + peerDependenciesMeta: + '@libsql/client': + optional: true + better-sqlite3: + optional: true + dependencies: + '@libsql/client': 0.3.6 + better-sqlite3: 9.1.1 + lucia: 2.7.3 + dev: false + + /@lucia-auth/oauth@3.4.0(lucia@2.7.3): + resolution: {integrity: sha512-3W4TaCiyUViXK2e2+VJo5324agvYz3102I2YKIttkGDKcevaNpLG3LgiR2rbemyF5UXFKiHgfFvRtKs/KDa9kw==} + peerDependencies: + lucia: ^2.0.0 + dependencies: + lucia: 2.7.3 + dev: false + + /@neon-rs/load@0.0.4: + resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==} + dev: false + + /@noble/hashes@1.3.2: + resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} + engines: {node: '>= 16'} + dev: false + + /@node-rs/argon2-android-arm-eabi@1.5.2: + resolution: {integrity: sha512-vVZec4ITr9GumAy0p8Zj8ozie362gtbZrTkLp9EqvuFZ/HrZzR09uS2IsDgm4mAstg/rc4A1gLRrHI8jDdbjkA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-android-arm64@1.5.2: + resolution: {integrity: sha512-SwhnsXyrpgtWDTwYds1WUnxLA/kVP8HVaImYwQ3Wemqj1lkzcSoIaNyjNWkyrYGqO1tVc1YUrqsbd5eCHh+3sg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-darwin-arm64@1.5.2: + resolution: {integrity: sha512-+1ZMKiCCv2pip/o1Xg09piQru2LOIBPQ1vS4is86f55N3jjZnSfP+db5mYCSRuB0gRYqui98he7su7OGXlF4gQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-darwin-x64@1.5.2: + resolution: {integrity: sha512-mQ57mORlsxpfjcEsVpiHyHCOp6Ljrz/rVNWk8ihnPWw0qt0EqF1zbHRxTEPemL1iBHL9UyXpXrKS4JKq6xMn5w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-freebsd-x64@1.5.2: + resolution: {integrity: sha512-UjKbFd3viYcpiwflkU4haEdNUMk1V2fVCJImWLWQns/hVval9BrDv5xsBwgdynbPHDlPOiWj816LBQwhWLGVWA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-arm-gnueabihf@1.5.2: + resolution: {integrity: sha512-36GJjJBnVuscV9CTn8RVDeJysnmIzr6Lp7QBCDczYHi6eKFuA8udCJb4SRyJqdvIuzycKG1RL56FbcFBJYCYIA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-arm64-gnu@1.5.2: + resolution: {integrity: sha512-sE0ydb2gp6xC+5vbVz8l3paaiBbFQIB2Rwp5wx9MmKiYdTfcO5WkGeADuSgoFiTcSEz1RsHXqrdVy6j/LtSqtA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-arm64-musl@1.5.2: + resolution: {integrity: sha512-LhE0YHB0aJCwlbsQrwePik/KFWUc9qMriJIL5KiejK3bDoTVY4ihH587QT56JyaLvl3nBJaAV8l5yMqQdHnouA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-x64-gnu@1.5.2: + resolution: {integrity: sha512-MnKLiBlyg05pxvKXe3lNgBL9El9ThD74hvVEiWH1Xk40RRrJ507NCOWXVmQ0FDq1mjTeGFxbIvk+AcoF0NSLIQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-x64-musl@1.5.2: + resolution: {integrity: sha512-tzLgASY0Ng2OTW7Awwl9UWzjbWx8/uD6gXcZ/k/nYGSZE5Xp8EOD2NUqHLbK6KZE3775A0R25ShpiSxCadYqkg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-win32-arm64-msvc@1.5.2: + resolution: {integrity: sha512-vpTwSvv3oUXTpWZh0/HxdJ5wFMlmS7aVDwL4ATWepTZhMG4n+TO0+tVLdcPHCbg0oc6hCWBjWNPlSn9mW+YIgA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-win32-ia32-msvc@1.5.2: + resolution: {integrity: sha512-KPpZR15ui7uQWQXKmtaKyUQRs4UJdXnIIfiyFLGmLWCdEKlr3MtIGFt0fdziu4BF5ZObD8Ic6QvT0VXK4OJiww==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-win32-x64-msvc@1.5.2: + resolution: {integrity: sha512-/pGuwixJS8ZlpwhX9iM6g6JEeZYo1TtnNf8exwsOi7gxcUoTUfw5it+5GfbY/n+xRBz/DIU4bzUmXmh+7Gh0ug==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2@1.5.2: + resolution: {integrity: sha512-qq7wOSsdP2b4rXEapWNmsCjpaTGZWtp9kZmri98GYCDZqN8UJUG5zSue4XtYWWJMWKJVE/hkaIwk+BgN1ZUn0Q==} + engines: {node: '>= 10'} + optionalDependencies: + '@node-rs/argon2-android-arm-eabi': 1.5.2 + '@node-rs/argon2-android-arm64': 1.5.2 + '@node-rs/argon2-darwin-arm64': 1.5.2 + '@node-rs/argon2-darwin-x64': 1.5.2 + '@node-rs/argon2-freebsd-x64': 1.5.2 + '@node-rs/argon2-linux-arm-gnueabihf': 1.5.2 + '@node-rs/argon2-linux-arm64-gnu': 1.5.2 + '@node-rs/argon2-linux-arm64-musl': 1.5.2 + '@node-rs/argon2-linux-x64-gnu': 1.5.2 + '@node-rs/argon2-linux-x64-musl': 1.5.2 + '@node-rs/argon2-win32-arm64-msvc': 1.5.2 + '@node-rs/argon2-win32-ia32-msvc': 1.5.2 + '@node-rs/argon2-win32-x64-msvc': 1.5.2 + dev: false + + /@node-rs/bcrypt-android-arm-eabi@1.7.3: + resolution: {integrity: sha512-l53RuBqnqNvBN2jx09Ws6jpLmuQdSDx10n0GeaTfwh1svxsC8bPpVmxkfBExsT2Tu7KF38gTnPZvwsxysZQyPQ==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-android-arm64@1.7.3: + resolution: {integrity: sha512-TZpm4VbiViqDMvusrcYzLr1b1M5FDF0cDNiTUciLeBSsKtU5lNdEZGAU7gvCnrKoUWpGuOblHU7613zuB7SiNQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-darwin-arm64@1.7.3: + resolution: {integrity: sha512-SiUuAabynVsmixZMjh5xrn8w47EnV0HzbW9st4DPoVhn/wzdUcksIXDY75aoQG2EIzKLN8IGb+CIVnPGmRyhxw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-darwin-x64@1.7.3: + resolution: {integrity: sha512-R+81Z0eX4hZPvCXY5Z6l0l+JrTU3WcSYGHP0QYV9uwdaafOz6EhrCXUzZ02AIcAbNoVR8eucYVruq9PiasXoVw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-freebsd-x64@1.7.3: + resolution: {integrity: sha512-0pItU/5K3e83JjcJj9fZv+78txUoZ3hHCT7n/UMdu9mkpUzhX/rqb4jmQpJpD+UQoR76xp3qDo5RMgQBffBVNg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-arm-gnueabihf@1.7.3: + resolution: {integrity: sha512-HTSybWUjNe8rWuXkTkMeFDiQNHc6VioRcgv6AeHZphIxiT6dFbnhXNkfz4Hr0zxvyPhZ3NrYjT2AmPVFT6VW3Q==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-arm64-gnu@1.7.3: + resolution: {integrity: sha512-rWep6Y+v/c4bZHaM8LmSsrMwMmDR9wG4/q+3Z9VzR8xdnt5VCbuQdYWpf3sgGRGjTRdTBAdSK8x1reOjqsJ3Jg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-arm64-musl@1.7.3: + resolution: {integrity: sha512-TyWEKhxr+yfGcMKzVV/ARZw+Hrky2yl91bo0XYU2ZW6I6LDC0emNsXugdWjwz8ADI4OWhhrOjXD8GCilxiB2Rg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-x64-gnu@1.7.3: + resolution: {integrity: sha512-PofxM1Qg7tZKj1oP0I7tBTSSLr8Xc2uxx+P3pBCPmYzaBwWqGteNHJlF7n2q5xiH7YOlguH4w5CmcEjsiA3K4A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-x64-musl@1.7.3: + resolution: {integrity: sha512-D5V6/dDVKP8S/ieDBLGhTn4oTo3upbrpWInynbhOMjJvPiIxVG1PiI3MXkWBtG9qtfleDk7gUkEKtAOxlIxDTQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-win32-arm64-msvc@1.7.3: + resolution: {integrity: sha512-b4gH2Yj5R4TwULrfMHd1Qqr+MrnFjVRUAJujDKPqi+PppSqezW8QF6DRSOL4GjnBmz5JEd64wxgeidvy7dsbGw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-win32-ia32-msvc@1.7.3: + resolution: {integrity: sha512-E91ro+ybI0RhNc89aGaZQGll0YhPoHr8JacoWrNKwhg9zwNOYeuO0tokdMZdm6nF0/8obll0Mq7wO9AXO9iffw==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-win32-x64-msvc@1.7.3: + resolution: {integrity: sha512-LO/p9yjPODj/pQvPnowBuwpDdqiyUXQbqL1xb1RSP3NoyCFAGmjL5h0plSQrhLh8hskQiozBRXNaQurtsM7o0Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt@1.7.3: + resolution: {integrity: sha512-BF6u9CBPUiyk1zU+5iwikezf+xM4MFSu5cmrrg/PLKffGgIM13ZsY6DHftcTraETB04ryasjM/5IejotH+sO5Q==} + engines: {node: '>= 10'} + optionalDependencies: + '@node-rs/bcrypt-android-arm-eabi': 1.7.3 + '@node-rs/bcrypt-android-arm64': 1.7.3 + '@node-rs/bcrypt-darwin-arm64': 1.7.3 + '@node-rs/bcrypt-darwin-x64': 1.7.3 + '@node-rs/bcrypt-freebsd-x64': 1.7.3 + '@node-rs/bcrypt-linux-arm-gnueabihf': 1.7.3 + '@node-rs/bcrypt-linux-arm64-gnu': 1.7.3 + '@node-rs/bcrypt-linux-arm64-musl': 1.7.3 + '@node-rs/bcrypt-linux-x64-gnu': 1.7.3 + '@node-rs/bcrypt-linux-x64-musl': 1.7.3 + '@node-rs/bcrypt-win32-arm64-msvc': 1.7.3 + '@node-rs/bcrypt-win32-ia32-msvc': 1.7.3 + '@node-rs/bcrypt-win32-x64-msvc': 1.7.3 + dev: false + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + + /@parcel/watcher-android-arm64@2.3.0: + resolution: {integrity: sha512-f4o9eA3dgk0XRT3XhB0UWpWpLnKgrh1IwNJKJ7UJek7eTYccQ8LR7XUWFKqw6aEq5KUNlCcGvSzKqSX/vtWVVA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-darwin-arm64@2.3.0: + resolution: {integrity: sha512-mKY+oijI4ahBMc/GygVGvEdOq0L4DxhYgwQqYAz/7yPzuGi79oXrZG52WdpGA1wLBPrYb0T8uBaGFo7I6rvSKw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-darwin-x64@2.3.0: + resolution: {integrity: sha512-20oBj8LcEOnLE3mgpy6zuOq8AplPu9NcSSSfyVKgfOhNAc4eF4ob3ldj0xWjGGbOF7Dcy1Tvm6ytvgdjlfUeow==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-freebsd-x64@2.3.0: + resolution: {integrity: sha512-7LftKlaHunueAEiojhCn+Ef2CTXWsLgTl4hq0pkhkTBFI3ssj2bJXmH2L67mKpiAD5dz66JYk4zS66qzdnIOgw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-arm-glibc@2.3.0: + resolution: {integrity: sha512-1apPw5cD2xBv1XIHPUlq0cO6iAaEUQ3BcY0ysSyD9Kuyw4MoWm1DV+W9mneWI+1g6OeP6dhikiFE6BlU+AToTQ==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-arm64-glibc@2.3.0: + resolution: {integrity: sha512-mQ0gBSQEiq1k/MMkgcSB0Ic47UORZBmWoAWlMrTW6nbAGoLZP+h7AtUM7H3oDu34TBFFvjy4JCGP43JlylkTQA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-arm64-musl@2.3.0: + resolution: {integrity: sha512-LXZAExpepJew0Gp8ZkJ+xDZaTQjLHv48h0p0Vw2VMFQ8A+RKrAvpFuPVCVwKJCr5SE+zvaG+Etg56qXvTDIedw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-x64-glibc@2.3.0: + resolution: {integrity: sha512-P7Wo91lKSeSgMTtG7CnBS6WrA5otr1K7shhSjKHNePVmfBHDoAOHYRXgUmhiNfbcGk0uMCHVcdbfxtuiZCHVow==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-x64-musl@2.3.0: + resolution: {integrity: sha512-+kiRE1JIq8QdxzwoYY+wzBs9YbJ34guBweTK8nlzLKimn5EQ2b2FSC+tAOpq302BuIMjyuUGvBiUhEcLIGMQ5g==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-wasm@2.3.0: + resolution: {integrity: sha512-ejBAX8H0ZGsD8lSICDNyMbSEtPMWgDL0WFCt/0z7hyf5v8Imz4rAM8xY379mBsECkq/Wdqa5WEDLqtjZ+6NxfA==} + engines: {node: '>= 10.0.0'} + dependencies: + is-glob: 4.0.3 + micromatch: 4.0.5 + napi-wasm: 1.1.0 + dev: false + bundledDependencies: + - napi-wasm + + /@parcel/watcher-win32-arm64@2.3.0: + resolution: {integrity: sha512-35gXCnaz1AqIXpG42evcoP2+sNL62gZTMZne3IackM+6QlfMcJLy3DrjuL6Iks7Czpd3j4xRBzez3ADCj1l7Aw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-win32-ia32@2.3.0: + resolution: {integrity: sha512-FJS/IBQHhRpZ6PiCjFt1UAcPr0YmCLHRbTc00IBTrelEjlmmgIVLeOx4MSXzx2HFEy5Jo5YdhGpxCuqCyDJ5ow==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-win32-x64@2.3.0: + resolution: {integrity: sha512-dLx+0XRdMnVI62kU3wbXvbIRhLck4aE28bIGKbRGS7BJNt54IIj9+c/Dkqb+7DJEbHUZAX1bwaoM8PqVlHJmCA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher@2.3.0: + resolution: {integrity: sha512-pW7QaFiL11O0BphO+bq3MgqeX/INAk9jgBldVDYjlQPO4VddoZnF22TcF9onMhnLVHuNqBJeRf+Fj7eezi/+rQ==} + engines: {node: '>= 10.0.0'} + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.5 + node-addon-api: 7.0.0 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.3.0 + '@parcel/watcher-darwin-arm64': 2.3.0 + '@parcel/watcher-darwin-x64': 2.3.0 + '@parcel/watcher-freebsd-x64': 2.3.0 + '@parcel/watcher-linux-arm-glibc': 2.3.0 + '@parcel/watcher-linux-arm64-glibc': 2.3.0 + '@parcel/watcher-linux-arm64-musl': 2.3.0 + '@parcel/watcher-linux-x64-glibc': 2.3.0 + '@parcel/watcher-linux-x64-musl': 2.3.0 + '@parcel/watcher-win32-arm64': 2.3.0 + '@parcel/watcher-win32-ia32': 2.3.0 + '@parcel/watcher-win32-x64': 2.3.0 + dev: false + + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + dev: false + + /@types/node-fetch@2.6.9: + resolution: {integrity: sha512-bQVlnMLFJ2d35DkPNjEPmd9ueO/rh5EiaZt2bhqiSarPjZIuIV6bPQVqcrEyvNo+AfTrRGVazle1tl597w3gfA==} + dependencies: + '@types/node': 20.9.0 + form-data: 4.0.0 + dev: false + + /@types/node-forge@1.3.9: + resolution: {integrity: sha512-meK88cx/sTalPSLSoCzkiUB4VPIFHmxtXm5FaaqRDqBX2i/Sy8bJ4odsan0b20RBjPh06dAQ+OTTdnyQyhJZyQ==} + dependencies: + '@types/node': 20.9.0 + dev: true + + /@types/node@20.9.0: + resolution: {integrity: sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==} + dependencies: + undici-types: 5.26.5 + + /@types/semver@7.5.5: + resolution: {integrity: sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==} + dev: false + + /@types/ws@8.5.9: + resolution: {integrity: sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg==} + dependencies: + '@types/node': 20.9.0 + dev: false + + /@typescript-eslint/eslint-plugin@6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.2.2): + resolution: {integrity: sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 6.10.0(eslint@8.53.0)(typescript@5.2.2) + '@typescript-eslint/scope-manager': 6.10.0 + '@typescript-eslint/type-utils': 6.10.0(eslint@8.53.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.10.0(eslint@8.53.0)(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.10.0 + debug: 4.3.4 + eslint: 8.53.0 + graphemer: 1.4.0 + ignore: 5.2.4 + natural-compare: 1.4.0 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.2.2): + resolution: {integrity: sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 6.10.0 + '@typescript-eslint/types': 6.10.0 + '@typescript-eslint/typescript-estree': 6.10.0(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.10.0 + debug: 4.3.4 + eslint: 8.53.0 + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/scope-manager@6.10.0: + resolution: {integrity: sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.10.0 + '@typescript-eslint/visitor-keys': 6.10.0 + dev: false + + /@typescript-eslint/type-utils@6.10.0(eslint@8.53.0)(typescript@5.2.2): + resolution: {integrity: sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 6.10.0(typescript@5.2.2) + '@typescript-eslint/utils': 6.10.0(eslint@8.53.0)(typescript@5.2.2) + debug: 4.3.4 + eslint: 8.53.0 + ts-api-utils: 1.0.3(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/types@6.10.0: + resolution: {integrity: sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==} + engines: {node: ^16.0.0 || >=18.0.0} + dev: false + + /@typescript-eslint/typescript-estree@6.10.0(typescript@5.2.2): + resolution: {integrity: sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 6.10.0 + '@typescript-eslint/visitor-keys': 6.10.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/utils@6.10.0(eslint@8.53.0)(typescript@5.2.2): + resolution: {integrity: sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.5 + '@typescript-eslint/scope-manager': 6.10.0 + '@typescript-eslint/types': 6.10.0 + '@typescript-eslint/typescript-estree': 6.10.0(typescript@5.2.2) + eslint: 8.53.0 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: false + + /@typescript-eslint/visitor-keys@6.10.0: + resolution: {integrity: sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.10.0 + eslint-visitor-keys: 3.4.3 + dev: false + + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + /acorn-jsx@5.3.2(acorn@8.11.2): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.2 + + /acorn-walk@8.3.0: + resolution: {integrity: sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==} + engines: {node: '>=0.4.0'} + + /acorn@8.11.2: + resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} + engines: {node: '>=0.4.0'} + hasBin: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + /arch@2.2.0: + resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} + dev: false + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: false + + /as-table@1.0.55: + resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} + dependencies: + printable-characters: 1.0.42 + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /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'} + + /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 + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /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==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + /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 + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: false + + /citty@0.1.4: + resolution: {integrity: sha512-Q3bK1huLxzQrvj7hImJ7Z1vKYJRPQCDnd0EjXfHMidcjecGOMuLrmuQmtWmFkuKLcMThlGh1yCKG8IEc6VeNXQ==} + dependencies: + consola: 3.2.3 + dev: false + + /cli-color@2.0.3: + resolution: {integrity: sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==} + engines: {node: '>=0.10'} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-iterator: 2.0.3 + memoizee: 0.4.15 + timers-ext: 0.1.7 + dev: true + + /clipboardy@3.0.0: + resolution: {integrity: sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + arch: 2.2.0 + execa: 5.1.1 + is-wsl: 2.2.0 + dev: false + + /cluster-key-slot@1.1.2: + resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} + engines: {node: '>=0.10.0'} + dev: false + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: false + + /commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + /consola@3.2.3: + resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} + engines: {node: ^14.18.0 || >=16.10.0} + dev: false + + /cookie-es@1.0.0: + resolution: {integrity: sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ==} + dev: false + + /cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + /d@1.0.1: + resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} + 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==} + + /data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + dev: false + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /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==} + + /defu@6.1.3: + resolution: {integrity: sha512-Vy2wmG3NTkmHNg/kzpuvHhkqeIx3ODWqasgCRbKtbXEN0G+HpEEv9BtJLp7ZG1CZloFaC41Ah3ZFbq7aqCqMeQ==} + dev: false + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: false + + /denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + dev: false + + /destr@2.0.2: + resolution: {integrity: sha512-65AlobnZMiCET00KaFFjUefxDX0khFA/E4myqZ7a6Sq1yZtR8+FVIvilVX66vF2uobSumxooYZChiRPCKNqhmg==} + dev: false + + /detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + dev: false + + /detect-libc@2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + engines: {node: '>=8'} + dev: false + + /difflib@0.2.4: + resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} + dependencies: + heap: 0.2.7 + dev: true + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: false + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + + /dotenv@16.3.1: + resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + engines: {node: '>=12'} + dev: true + + /dreamopt@0.8.0: + resolution: {integrity: sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==} + engines: {node: '>=0.4.0'} + dependencies: + wordwrap: 1.0.0 + dev: true + + /drizzle-kit@0.20.1: + resolution: {integrity: sha512-W6YAFeT15LcirtAbFmfKOjN+p0EhTW+8KZaPqIEz0VpkBrq3GbBUtaoYWa7l8OLzlOBY54XPG2fa9j+iv3pQRQ==} + 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.15.0 + zod: 3.22.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /drizzle-orm@0.29.0(@cloudflare/workers-types@4.20231025.0)(@libsql/client@0.3.6)(better-sqlite3@9.1.1)(mysql2@3.6.3): + 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: + '@cloudflare/workers-types': 4.20231025.0 + '@libsql/client': 0.3.6 + better-sqlite3: 9.1.1 + mysql2: 3.6.3 + dev: false + + /drizzle-zod@0.5.1(drizzle-orm@0.29.0)(zod@3.22.4): + resolution: {integrity: sha512-C/8bvzUH/zSnVfwdSibOgFjLhtDtbKYmkbPbUCq46QZyZCH6kODIMSOgZ8R7rVjoI+tCj3k06MRJMDqsIeoS4A==} + peerDependencies: + drizzle-orm: '>=0.23.13' + zod: '*' + dependencies: + drizzle-orm: 0.29.0(@cloudflare/workers-types@4.20231025.0)(@libsql/client@0.3.6)(better-sqlite3@9.1.1)(mysql2@3.6.3) + zod: 3.22.4 + dev: false + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: false + + /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 + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + /eslint-config-google@0.14.0(eslint@8.53.0): + resolution: {integrity: sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==} + engines: {node: '>=0.10.0'} + peerDependencies: + eslint: '>=5.16.0' + dependencies: + eslint: 8.53.0 + dev: true + + /eslint-plugin-json@3.1.0: + resolution: {integrity: sha512-MrlG2ynFEHe7wDGwbUuFPsaT2b1uhuEFhJ+W1f1u+1C2EkXmTYJp4B1aAdQQ8M+CC3t//N/oRKiIVw14L2HR1g==} + engines: {node: '>=12.0'} + dependencies: + lodash: 4.17.21 + vscode-json-languageservice: 4.2.1 + dev: true + + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + /eslint@8.53.0: + resolution: {integrity: sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.3 + '@eslint/js': 8.53.0 + '@humanwhocodes/config-array': 0.11.13 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.23.0 + graphemer: 1.4.0 + ignore: 5.2.4 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) + eslint-visitor-keys: 3.4.3 + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + /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'} + + /event-emitter@0.3.5: + resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + dev: true + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: false + + /exit-hook@2.2.1: + resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} + engines: {node: '>=6'} + + /expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + 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==} + + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: false + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + + /fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.2.1 + dev: false + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.1.1 + + /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'} + dependencies: + to-regex-range: 5.0.1 + + /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 + + /flat-cache@3.1.1: + resolution: {integrity: sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==} + engines: {node: '>=12.0.0'} + dependencies: + flatted: 3.2.9 + keyv: 4.5.4 + rimraf: 3.0.2 + + /flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + + /formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + dependencies: + fetch-blob: 3.2.0 + dev: false + + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: false + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + optional: true + + /generate-function@2.3.1: + resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} + dependencies: + is-property: 1.0.2 + dev: false + + /get-port-please@3.1.1: + resolution: {integrity: sha512-3UBAyM3u4ZBVYDsxOQfJDxEa6XTbpBDrOjp4mf7ExFRt5BKs/QywQQiJsh2B+hxcZLSapWqCRvElUe8DnKcFHA==} + dev: false + + /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 + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: false + + /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'} + dependencies: + is-glob: 4.0.3 + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + + /glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + dev: true + + /globals@13.23.0: + resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: false + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + /h3@1.8.2: + resolution: {integrity: sha512-1Ca0orJJlCaiFY68BvzQtP2lKLk46kcLAxVM8JgYbtm2cUg6IY7pjpYgWMwUvDO9QI30N5JAukOKoT8KD3Q0PQ==} + dependencies: + cookie-es: 1.0.0 + defu: 6.1.3 + destr: 2.0.2 + iron-webcrypto: 0.10.1 + radix3: 1.1.0 + ufo: 1.3.1 + uncrypto: 0.1.3 + unenv: 1.7.4 + dev: false + + /hanji@0.0.5: + resolution: {integrity: sha512-Abxw1Lq+TnYiL4BueXqMau222fPSPMFtya8HdpWsz/xVAhifXou71mPh/kY2+08RgFcVccjG3uZHs6K5HAe3zw==} + dependencies: + lodash.throttle: 4.1.1 + sisteransi: 1.0.5 + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + /heap@0.2.7: + resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} + dev: true + + /hono@3.9.2: + resolution: {integrity: sha512-180NOiMadqU3lGmN6ajPDZvZPWus3a9mtVaAUR9uG0SImngBwRLA8vbnV0oUfUAgFT4nX55sGV9dVA06OuikHA==} + engines: {node: '>=16.0.0'} + dev: false + + /http-shutdown@1.2.2: + resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: false + + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: false + + /husky@8.0.3: + resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + 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@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: false + + /ioredis@5.3.2: + resolution: {integrity: sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==} + engines: {node: '>=12.22.0'} + dependencies: + '@ioredis/commands': 1.2.0 + cluster-key-slot: 1.1.2 + debug: 4.3.4 + denque: 2.1.0 + lodash.defaults: 4.2.0 + lodash.isarguments: 3.1.0 + redis-errors: 1.2.0 + redis-parser: 3.0.0 + standard-as-callback: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /iron-webcrypto@0.10.1: + resolution: {integrity: sha512-QGOS8MRMnj/UiOa+aMIgfyHcvkhqNUsUxb1XzskENvbo+rEfp6TOwqd1KPuDzXC4OnGHcMSVxDGRoilqB8ViqA==} + dev: false + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: false + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + /is-promise@2.2.2: + resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + dev: true + + /is-property@1.0.2: + resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} + dev: false + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: false + + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + dev: false + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + /jiti@1.21.0: + resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + hasBin: true + dev: false + + /js-base64@3.7.5: + resolution: {integrity: sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==} + dev: false + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + /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-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + /libsql@0.1.34: + resolution: {integrity: sha512-LGofp7z7gi1Td6vu2GxaA4WyvSPEkuFn0f/ePSti1TsAlBU0LWxdk+bj9D8nqswzxiqe5wpAyTLhVzTIYSyXEA==} + cpu: [x64, arm64] + os: [darwin, linux, win32] + dependencies: + '@neon-rs/load': 0.0.4 + detect-libc: 2.0.2 + optionalDependencies: + '@libsql/darwin-arm64': 0.1.34 + '@libsql/darwin-x64': 0.1.34 + '@libsql/linux-arm64-gnu': 0.1.34 + '@libsql/linux-arm64-musl': 0.1.34 + '@libsql/linux-x64-gnu': 0.1.34 + '@libsql/linux-x64-musl': 0.1.34 + '@libsql/win32-x64-msvc': 0.1.34 + dev: false + + /listhen@1.5.5: + resolution: {integrity: sha512-LXe8Xlyh3gnxdv4tSjTjscD1vpr/2PRpzq8YIaMJgyKzRG8wdISlWVWnGThJfHnlJ6hmLt2wq1yeeix0TEbuoA==} + hasBin: true + dependencies: + '@parcel/watcher': 2.3.0 + '@parcel/watcher-wasm': 2.3.0 + citty: 0.1.4 + clipboardy: 3.0.0 + consola: 3.2.3 + defu: 6.1.3 + get-port-please: 3.1.1 + h3: 1.8.2 + http-shutdown: 1.2.2 + jiti: 1.21.0 + mlly: 1.4.2 + node-forge: 1.3.1 + pathe: 1.1.1 + std-env: 3.4.3 + ufo: 1.3.1 + untun: 0.1.2 + uqr: 0.1.2 + dev: false + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + + /lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + dev: false + + /lodash.isarguments@3.1.0: + resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} + dev: false + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + /lodash.throttle@4.1.1: + resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + dev: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + + /long@5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + dev: false + + /lru-cache@10.0.1: + resolution: {integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==} + engines: {node: 14 || >=16.14} + dev: false + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: false + + /lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + dev: false + + /lru-cache@8.0.5: + resolution: {integrity: sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==} + engines: {node: '>=16.14'} + dev: false + + /lru-queue@0.1.0: + resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} + dependencies: + es5-ext: 0.10.62 + dev: true + + /lucia@2.7.3: + resolution: {integrity: sha512-fzwwsZcijdQmS116J2odQZj/fb8SYXUI2rRWz84gZqkbpX9QAS4m72qlFzsPDv1YXJHNRhYUQCvQl3EKgt3OgA==} + dependencies: + '@noble/hashes': 1.3.2 + nanoid: 5.0.1 + dev: false + + /magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /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-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: false + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: false + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: false + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: false + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + 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: false + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: false + + /miniflare@3.20231025.0: + resolution: {integrity: sha512-pFcr2BRaGIQ26UfdDo8BMJ6kkd/Jo/FkQ/4K7UG/eORlDepsLrR/sTJddcSSIGl07MA+MGjhzopFTPpFskkS+g==} + engines: {node: '>=16.13'} + 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.20231025.0 + ws: 8.14.2 + youch: 3.3.3 + zod: 3.22.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /miniflare@3.20231025.1: + resolution: {integrity: sha512-zwvu/f6eivBBF2shuom5DibnZjGSxt6FiC8sZlj+CcqTRss1D2ZHYD09odhAZLY9DYXE0orBFkJKnIDx/QmYdQ==} + engines: {node: '>=16.13'} + 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.20231025.0 + ws: 8.14.2 + youch: 3.3.3 + zod: 3.22.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimatch@7.4.6: + resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: false + + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: false + + /mlly@1.4.2: + resolution: {integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==} + dependencies: + acorn: 8.11.2 + pathe: 1.1.1 + pkg-types: 1.0.3 + ufo: 1.3.1 + dev: false + + /mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + dev: false + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /mustache@4.2.0: + resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} + hasBin: true + + /mysql2@3.6.3: + resolution: {integrity: sha512-qYd/1CDuW1KYZjD4tzg2O8YS3X/UWuGH8ZMHyMeggMTXL3yOdMisbwZ5SNkHzDGlZXKYLAvV8tMrEH+NUMz3fw==} + engines: {node: '>= 8.0'} + dependencies: + denque: 2.1.0 + generate-function: 2.3.1 + iconv-lite: 0.6.3 + long: 5.2.3 + lru-cache: 8.0.5 + named-placeholders: 1.1.3 + seq-queue: 0.0.5 + sqlstring: 2.3.3 + dev: false + + /named-placeholders@1.1.3: + resolution: {integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==} + engines: {node: '>=12.0.0'} + dependencies: + lru-cache: 7.18.3 + dev: false + + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /nanoid@5.0.1: + resolution: {integrity: sha512-vWeVtV5Cw68aML/QaZvqN/3QQXc6fBfIieAlu05m7FZW2Dgb+3f0xc0TTxuJW+7u30t7iSDTV/j3kVI0oJqIfQ==} + engines: {node: ^18 || >=20} + hasBin: true + dev: false + + /napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + dev: false + + /napi-wasm@1.1.0: + resolution: {integrity: sha512-lHwIAJbmLSjF9VDRm9GoVOy9AGp3aIvkjv+Kvz9h16QR3uSVYH78PNQUnT2U4X53mhlnV2M7wrhibQ3GHicDmg==} + dev: false + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + /next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + dev: true + + /node-abi@3.51.0: + resolution: {integrity: sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 + dev: false + + /node-addon-api@7.0.0: + resolution: {integrity: sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==} + dev: false + + /node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + dev: false + + /node-fetch-native@1.4.1: + resolution: {integrity: sha512-NsXBU0UgBxo2rQLOeWNZqS3fvflWePMECr8CoSWoSTqCqGbVVsvl9vZu1HfQicYN0g5piV9Gh8RTEvo/uP752w==} + dev: false + + /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-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + dev: false + + /node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: false + + /ofetch@1.3.3: + resolution: {integrity: sha512-s1ZCMmQWXy4b5K/TW9i/DtiN8Ku+xCiHcjQ6/J/nDdssirrQNOoB165Zu8EqLMA2lln1JUth9a0aW9Ap2ctrUg==} + dependencies: + destr: 2.0.2 + node-fetch-native: 1.4.1 + ufo: 1.3.1 + dev: false + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: false + + /openapi3-ts@4.1.2: + resolution: {integrity: sha512-B7gOkwsYMZO7BZXwJzXCuVagym2xhqsrilVvV0dnq2Di4+iLUXKVX9gOK23ZqaAHZOwABXN0QTdW8QnkUTX6DA==} + dependencies: + yaml: 2.3.4 + dev: false + + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + + /oslo@0.22.0: + resolution: {integrity: sha512-PSnp+rDJgL3FKvrg+qtxblzCkkUQslYWH5ljSrhX5ibc3p3NqXOfe/LzMCAJ2sqp0nlNEDg2TKCeui4buWt/Tw==} + dependencies: + '@node-rs/argon2': 1.5.2 + '@node-rs/bcrypt': 1.7.3 + dev: false + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + /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'} + dev: false + + /pathe@1.1.1: + resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} + dev: false + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + /pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + dependencies: + jsonc-parser: 3.2.0 + mlly: 1.4.2 + pathe: 1.1.1 + dev: false + + /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 + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + /prettier@3.0.3: + resolution: {integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==} + engines: {node: '>=14'} + hasBin: true + dev: false + + /printable-characters@1.0.42: + resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} + + /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'} + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + /radix3@1.1.0: + resolution: {integrity: sha512-pNsHDxbGORSvuSScqNJ+3Km6QAVqk8CfsCBIEoDgpqLrkD2f3QM4I7d1ozJJ172OmIcoUcerZaNWqtLkRXTV3A==} + dev: false + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: false + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + + /redis-errors@1.2.0: + resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} + engines: {node: '>=4'} + dev: false + + /redis-parser@3.0.0: + resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} + engines: {node: '>=4'} + dependencies: + redis-errors: 1.2.0 + dev: false + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + /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'} + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + + /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. + 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 + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: false + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: false + + /selfsigned@2.4.1: + resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} + engines: {node: '>=10'} + dependencies: + '@types/node-forge': 1.3.9 + node-forge: 1.3.1 + dev: true + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: false + + /seq-queue@0.0.5: + resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==} + dev: false + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: false + + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: false + + /simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + 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: false + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + /sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + dev: true + + /sqlstring@2.3.3: + resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} + engines: {node: '>= 0.6'} + dev: false + + /stacktracey@2.1.8: + resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==} + dependencies: + as-table: 1.0.55 + get-source: 2.0.12 + + /standard-as-callback@2.1.0: + resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} + dev: false + + /std-env@3.4.3: + resolution: {integrity: sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==} + dev: false + + /stoppable@1.1.0: + resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} + engines: {node: '>=4', npm: '>=6'} + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: false + + /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'} + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + + /tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: false + + /tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + 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 + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + /timers-ext@0.1.7: + resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==} + dependencies: + es5-ext: 0.10.62 + next-tick: 1.1.0 + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: false + + /ts-api-utils@1.0.3(typescript@5.2.2): + resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} + engines: {node: '>=16.13.0'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.2.2 + dev: false + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + /tsx@4.0.0: + resolution: {integrity: sha512-jd3C5kw9tR68gtvqHUYo/2IwxaA46/CyKvcVQ4DsKRAPb19/vWgl7zF9mYNjFRY6KcGKiwne41RU91ll31IggQ==} + engines: {node: '>=18.0.0'} + hasBin: true + dependencies: + esbuild: 0.18.20 + get-tsconfig: 4.7.2 + source-map-support: 0.5.21 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + /type@1.2.0: + resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} + dev: true + + /type@2.7.2: + resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} + dev: true + + /typescript@5.2.2: + resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + engines: {node: '>=14.17'} + hasBin: true + + /ufo@1.3.1: + resolution: {integrity: sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==} + dev: false + + /uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + dev: false + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + /undici@5.27.2: + resolution: {integrity: sha512-iS857PdOEy/y3wlM3yRp+6SNQQ6xU0mmZcwRSriqk+et/cwWAtwmIGf6WkoDN2EK/AMdCO/dfXzIwi+rFMrjjQ==} + engines: {node: '>=14.0'} + dependencies: + '@fastify/busboy': 2.0.0 + + /unenv@1.7.4: + resolution: {integrity: sha512-fjYsXYi30It0YCQYqLOcT6fHfMXsBr2hw9XC7ycf8rTG7Xxpe3ZssiqUnD0khrjiZEmkBXWLwm42yCSCH46fMw==} + dependencies: + consola: 3.2.3 + defu: 6.1.3 + mime: 3.0.0 + node-fetch-native: 1.4.1 + pathe: 1.1.1 + dev: false + + /unstorage@1.9.0: + resolution: {integrity: sha512-VpD8ZEYc/le8DZCrny3bnqKE4ZjioQxBRnWE+j5sGNvziPjeDlaS1NaFFHzl/kkXaO3r7UaF8MGQrs14+1B4pQ==} + peerDependencies: + '@azure/app-configuration': ^1.4.1 + '@azure/cosmos': ^3.17.3 + '@azure/data-tables': ^13.2.2 + '@azure/identity': ^3.2.3 + '@azure/keyvault-secrets': ^4.7.0 + '@azure/storage-blob': ^12.14.0 + '@capacitor/preferences': ^5.0.0 + '@planetscale/database': ^1.8.0 + '@upstash/redis': ^1.22.0 + '@vercel/kv': ^0.2.2 + idb-keyval: ^6.2.1 + peerDependenciesMeta: + '@azure/app-configuration': + optional: true + '@azure/cosmos': + optional: true + '@azure/data-tables': + optional: true + '@azure/identity': + optional: true + '@azure/keyvault-secrets': + optional: true + '@azure/storage-blob': + optional: true + '@capacitor/preferences': + optional: true + '@planetscale/database': + optional: true + '@upstash/redis': + optional: true + '@vercel/kv': + optional: true + idb-keyval: + optional: true + dependencies: + anymatch: 3.1.3 + chokidar: 3.5.3 + destr: 2.0.2 + h3: 1.8.2 + ioredis: 5.3.2 + listhen: 1.5.5 + lru-cache: 10.0.1 + mri: 1.2.0 + node-fetch-native: 1.4.1 + ofetch: 1.3.3 + ufo: 1.3.1 + transitivePeerDependencies: + - supports-color + dev: false + + /untun@0.1.2: + resolution: {integrity: sha512-wLAMWvxfqyTiBODA1lg3IXHQtjggYLeTK7RnSfqtOXixWJ3bAa2kK/HHmOOg19upteqO3muLvN6O/icbyQY33Q==} + hasBin: true + dependencies: + citty: 0.1.4 + consola: 3.2.3 + pathe: 1.1.1 + dev: false + + /uqr@0.1.2: + resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==} + dev: false + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: false + + /uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + dev: false + + /vscode-json-languageservice@4.2.1: + resolution: {integrity: sha512-xGmv9QIWs2H8obGbWg+sIPI/3/pFgj/5OWBhNzs00BkYQ9UaB2F6JJaGB/2/YOZJ3BvLXQTC4Q7muqU25QgAhA==} + dependencies: + jsonc-parser: 3.2.0 + vscode-languageserver-textdocument: 1.0.11 + vscode-languageserver-types: 3.17.5 + vscode-nls: 5.2.0 + vscode-uri: 3.0.8 + dev: true + + /vscode-languageserver-textdocument@1.0.11: + resolution: {integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==} + dev: true + + /vscode-languageserver-types@3.17.5: + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + dev: true + + /vscode-nls@5.2.0: + resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==} + dev: true + + /vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + dev: true + + /web-streams-polyfill@3.2.1: + resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} + engines: {node: '>= 8'} + dev: false + + /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@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + + /wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + dev: true + + /workerd@1.20231025.0: + resolution: {integrity: sha512-W1PFtpMFfvmm+ozBf+u70TE3Pviv7WA4qzDeejHDC4z+PFDq4+3KJCkgffaGBO86h+akWO0hSsc0uXL2zAqofQ==} + engines: {node: '>=16'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@cloudflare/workerd-darwin-64': 1.20231025.0 + '@cloudflare/workerd-darwin-arm64': 1.20231025.0 + '@cloudflare/workerd-linux-64': 1.20231025.0 + '@cloudflare/workerd-linux-arm64': 1.20231025.0 + '@cloudflare/workerd-windows-64': 1.20231025.0 + + /wrangler@3.15.0: + resolution: {integrity: sha512-kxzK62rD+LRrDeZZzw8cP6FBub71vJCbfAAb594XobXajgXYh3pFjv18Vm8YLxHzoGMhmAOJPA5b4DHq4HEUCw==} + engines: {node: '>=16.17.0'} + hasBin: true + 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.20231025.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 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /ws@8.14.2: + resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + /xxhash-wasm@1.0.2: + resolution: {integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==} + dev: true + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: false + + /yaml@2.3.4: + resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} + engines: {node: '>= 14'} + dev: false + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + /youch@3.3.3: + resolution: {integrity: sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==} + dependencies: + cookie: 0.5.0 + mustache: 4.2.0 + stacktracey: 2.1.8 + + /zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} diff --git a/src/v2/lib/managers/asset-category/asset-category-manager.ts b/src/v2/lib/managers/asset-category/asset-category-manager.ts index cd9d2ed..9664f6b 100644 --- a/src/v2/lib/managers/asset-category/asset-category-manager.ts +++ b/src/v2/lib/managers/asset-category/asset-category-manager.ts @@ -23,7 +23,7 @@ export class AssetCategoryManager { * @returns A promise that resolves to the retrieved asset category. */ public async getAssetCategoryById(assetCategoryId: string) { - const foundAssetCategory = await this.drizzle + const [foundAssetCategory] = await this.drizzle .select() .from(assetCategory) .leftJoin( @@ -33,7 +33,7 @@ export class AssetCategoryManager { .leftJoin(game, eq(game.id, gameAssetCategory.gameId)) .where(eq(assetCategory.id, assetCategoryId)) - return foundAssetCategory[0] + return foundAssetCategory } /** @@ -87,12 +87,12 @@ export class AssetCategoryManager { * @returns A promise that resolves to the deleted asset category. */ public async deleteAssetCategory(assetCategoryId: string) { - const deletedAssetCategory = await this.drizzle + const [deletedAssetCategory] = await this.drizzle .delete(assetCategory) .where(eq(assetCategory.id, assetCategoryId)) .returning() - return deletedAssetCategory[0] + return deletedAssetCategory } /** @@ -105,7 +105,7 @@ export class AssetCategoryManager { assetCategoryId: string, newAssetCategory: z.infer ) { - const updatedAssetCategory = await this.drizzle + const [updatedAssetCategory] = await this.drizzle .update(assetCategory) .set({ name: newAssetCategory.name, @@ -115,6 +115,6 @@ export class AssetCategoryManager { .where(eq(assetCategory.id, assetCategoryId)) .returning() - return updatedAssetCategory[0] + return updatedAssetCategory } } diff --git a/src/v2/lib/managers/asset/asset-manager.ts b/src/v2/lib/managers/asset/asset-manager.ts index 086d021..06f64a7 100644 --- a/src/v2/lib/managers/asset/asset-manager.ts +++ b/src/v2/lib/managers/asset/asset-manager.ts @@ -75,7 +75,7 @@ export class AssetManager { * @returns A promise that resolves to the retrieved asset, its game, category and tags. */ public async getAssetById(assetId: number) { - const foundAsset = await this.drizzle + const [foundAsset] = await this.drizzle .select() .from(asset) .leftJoin(assetTagAsset, eq(assetTagAsset.assetId, assetId)) @@ -87,7 +87,7 @@ export class AssetManager { ) .where(eq(asset.id, assetId)) - return foundAsset[0] + return foundAsset ?? null } /** diff --git a/src/v2/routes/game/search/[id]/route.ts b/src/v2/routes/collection/asset/add/id/[id]/openapi.ts similarity index 100% rename from src/v2/routes/game/search/[id]/route.ts rename to src/v2/routes/collection/asset/add/id/[id]/openapi.ts diff --git a/src/v2/routes/game/search/[name]/route.ts b/src/v2/routes/collection/asset/add/id/[id]/route.ts similarity index 100% rename from src/v2/routes/game/search/[name]/route.ts rename to src/v2/routes/collection/asset/add/id/[id]/route.ts diff --git a/src/v2/routes/game/search/all/route.ts b/src/v2/routes/collection/asset/add/id/[id]/schema.ts similarity index 100% rename from src/v2/routes/game/search/all/route.ts rename to src/v2/routes/collection/asset/add/id/[id]/schema.ts diff --git a/src/v2/routes/collection/asset/remove/id/[id]/openapi.ts b/src/v2/routes/collection/asset/remove/id/[id]/openapi.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/collection/asset/remove/id/[id]/route.ts b/src/v2/routes/collection/asset/remove/id/[id]/route.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/collection/asset/remove/id/[id]/schema.ts b/src/v2/routes/collection/asset/remove/id/[id]/schema.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/collection/create/openapi.ts b/src/v2/routes/collection/create/openapi.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/collection/create/route.ts b/src/v2/routes/collection/create/route.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/collection/create/schema.ts b/src/v2/routes/collection/create/schema.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/collection/delete/id/[id]/openapi.ts b/src/v2/routes/collection/delete/id/[id]/openapi.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/collection/delete/id/[id]/route.ts b/src/v2/routes/collection/delete/id/[id]/route.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/collection/delete/id/[id]/schema.ts b/src/v2/routes/collection/delete/id/[id]/schema.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/collection/get/id/[id]/openapi.ts b/src/v2/routes/collection/get/id/[id]/openapi.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/collection/get/id/[id]/route.ts b/src/v2/routes/collection/get/id/[id]/route.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/collection/get/id/[id]/schema.ts b/src/v2/routes/collection/get/id/[id]/schema.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/collection/get/user/id/[id]/openapi.ts b/src/v2/routes/collection/get/user/id/[id]/openapi.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/collection/get/user/id/[id]/route.ts b/src/v2/routes/collection/get/user/id/[id]/route.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/collection/get/user/id/[id]/schema.ts b/src/v2/routes/collection/get/user/id/[id]/schema.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/collection/get/user/username/[username]/openapi.ts b/src/v2/routes/collection/get/user/username/[username]/openapi.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/collection/get/user/username/[username]/route.ts b/src/v2/routes/collection/get/user/username/[username]/route.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/collection/get/user/username/[username]/schema.ts b/src/v2/routes/collection/get/user/username/[username]/schema.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/collection/route.ts b/src/v2/routes/collection/route.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/favorite/asset/add/id/[id]/openapi.ts b/src/v2/routes/favorite/asset/add/id/[id]/openapi.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/favorite/asset/add/id/[id]/route.ts b/src/v2/routes/favorite/asset/add/id/[id]/route.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/favorite/asset/add/id/[id]/schema.ts b/src/v2/routes/favorite/asset/add/id/[id]/schema.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/favorite/asset/remove/id/[id]/openapi.ts b/src/v2/routes/favorite/asset/remove/id/[id]/openapi.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/favorite/asset/remove/id/[id]/route.ts b/src/v2/routes/favorite/asset/remove/id/[id]/route.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/favorite/asset/remove/id/[id]/schema.ts b/src/v2/routes/favorite/asset/remove/id/[id]/schema.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/favorite/get/user/username/[username]/openapi.ts b/src/v2/routes/favorite/get/user/username/[username]/openapi.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/favorite/get/user/username/[username]/route.ts b/src/v2/routes/favorite/get/user/username/[username]/route.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/favorite/get/user/username/[username]/schema.ts b/src/v2/routes/favorite/get/user/username/[username]/schema.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/favorite/modify/openapi.ts b/src/v2/routes/favorite/modify/openapi.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/favorite/modify/route.ts b/src/v2/routes/favorite/modify/route.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/favorite/modify/schema.ts b/src/v2/routes/favorite/modify/schema.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/favorite/route.ts b/src/v2/routes/favorite/route.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/game/create/openapi.ts b/src/v2/routes/game/create/openapi.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/game/create/route.ts b/src/v2/routes/game/create/route.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/game/create/schema.ts b/src/v2/routes/game/create/schema.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/game/delete/id/[id]/openapi.ts b/src/v2/routes/game/delete/id/[id]/openapi.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/game/delete/id/[id]/route.ts b/src/v2/routes/game/delete/id/[id]/route.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/game/delete/id/[id]/schema.ts b/src/v2/routes/game/delete/id/[id]/schema.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/game/get/all/openapi.ts b/src/v2/routes/game/get/all/openapi.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/game/get/all/route.ts b/src/v2/routes/game/get/all/route.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/game/get/all/schema.ts b/src/v2/routes/game/get/all/schema.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/game/get/id/[id]/openapi.ts b/src/v2/routes/game/get/id/[id]/openapi.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/game/get/id/[id]/route.ts b/src/v2/routes/game/get/id/[id]/route.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/game/get/id/[id]/schema.ts b/src/v2/routes/game/get/id/[id]/schema.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/game/get/name/[name]/openapi.ts b/src/v2/routes/game/get/name/[name]/openapi.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/game/get/name/[name]/route.ts b/src/v2/routes/game/get/name/[name]/route.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/game/get/name/[name]/schema.ts b/src/v2/routes/game/get/name/[name]/schema.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/game/modify/id/[id]/openapi.ts b/src/v2/routes/game/modify/id/[id]/openapi.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/game/modify/id/[id]/route.ts b/src/v2/routes/game/modify/id/[id]/route.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/game/modify/id/[id]/schema.ts b/src/v2/routes/game/modify/id/[id]/schema.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/user/follows/follow/[id]/openapi.ts b/src/v2/routes/user/follows/follow/[id]/openapi.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/user/follows/follow/[id]/route.ts b/src/v2/routes/user/follows/follow/[id]/route.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/user/follows/follow/[id]/schema.ts b/src/v2/routes/user/follows/follow/[id]/schema.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/user/follows/list/[id]/openapi.ts b/src/v2/routes/user/follows/list/[id]/openapi.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/user/follows/list/[id]/route.ts b/src/v2/routes/user/follows/list/[id]/route.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/user/follows/list/[id]/schema.ts b/src/v2/routes/user/follows/list/[id]/schema.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/user/follows/route.ts b/src/v2/routes/user/follows/route.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/user/follows/unfollow/[id]/openapi.ts b/src/v2/routes/user/follows/unfollow/[id]/openapi.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/user/follows/unfollow/[id]/route.ts b/src/v2/routes/user/follows/unfollow/[id]/route.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/user/follows/unfollow/[id]/schema.ts b/src/v2/routes/user/follows/unfollow/[id]/schema.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/user/search/[id]/openapi.ts b/src/v2/routes/user/get/[id]/openapi.ts similarity index 100% rename from src/v2/routes/user/search/[id]/openapi.ts rename to src/v2/routes/user/get/[id]/openapi.ts diff --git a/src/v2/routes/user/search/[id]/route.ts b/src/v2/routes/user/get/[id]/route.ts similarity index 100% rename from src/v2/routes/user/search/[id]/route.ts rename to src/v2/routes/user/get/[id]/route.ts diff --git a/src/v2/routes/user/search/[id]/schema.ts b/src/v2/routes/user/get/[id]/schema.ts similarity index 100% rename from src/v2/routes/user/search/[id]/schema.ts rename to src/v2/routes/user/get/[id]/schema.ts diff --git a/src/v2/routes/user/search/[username]/openapi.ts b/src/v2/routes/user/get/[username]/openapi.ts similarity index 100% rename from src/v2/routes/user/search/[username]/openapi.ts rename to src/v2/routes/user/get/[username]/openapi.ts diff --git a/src/v2/routes/user/search/[username]/route.ts b/src/v2/routes/user/get/[username]/route.ts similarity index 100% rename from src/v2/routes/user/search/[username]/route.ts rename to src/v2/routes/user/get/[username]/route.ts diff --git a/src/v2/routes/user/search/[username]/schema.ts b/src/v2/routes/user/get/[username]/schema.ts similarity index 100% rename from src/v2/routes/user/search/[username]/schema.ts rename to src/v2/routes/user/get/[username]/schema.ts diff --git a/src/v2/routes/user/get/route.ts b/src/v2/routes/user/get/route.ts new file mode 100644 index 0000000..2ba8017 --- /dev/null +++ b/src/v2/routes/user/get/route.ts @@ -0,0 +1,10 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import SearchUserByIdRoute from "@/v2/routes/user/get/[id]/route" +import SearchUserByNameRoute from "@/v2/routes/user/get/[username]/route" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.route("/id", SearchUserByIdRoute) +handler.route("/username", SearchUserByNameRoute) + +export default handler diff --git a/src/v2/routes/user/route.ts b/src/v2/routes/user/route.ts index 655c42e..eac3d41 100644 --- a/src/v2/routes/user/route.ts +++ b/src/v2/routes/user/route.ts @@ -1,8 +1,8 @@ import { OpenAPIHono } from "@hono/zod-openapi" -import UserSearchRoute from "@/v2/routes/user/search/route" +import UserGetRoute from "@/v2/routes/user/get/route" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() -handler.route("/search", UserSearchRoute) +handler.route("/get", UserGetRoute) export default handler diff --git a/src/v2/routes/user/search/route.ts b/src/v2/routes/user/search/route.ts index 0f3d939..e69de29 100644 --- a/src/v2/routes/user/search/route.ts +++ b/src/v2/routes/user/search/route.ts @@ -1,10 +0,0 @@ -import { OpenAPIHono } from "@hono/zod-openapi" -import SearchUserByIdRoute from "@/v2/routes/user/search/[id]/route" -import SearchUserByNameRoute from "@/v2/routes/user/search/[username]/route" - -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() - -handler.route("/id", SearchUserByIdRoute) -handler.route("/username", SearchUserByNameRoute) - -export default handler diff --git a/src/v2/routes/user/search/username/[username]/openapi.ts b/src/v2/routes/user/search/username/[username]/openapi.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/user/search/username/[username]/route.ts b/src/v2/routes/user/search/username/[username]/route.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/user/search/username/[username]/schema.ts b/src/v2/routes/user/search/username/[username]/schema.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/user/search/username/route.ts b/src/v2/routes/user/search/username/route.ts new file mode 100644 index 0000000..e69de29 From 57da2aa34fdf83e09a8f9e1ad39644233b79f2e8 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Fri, 17 Nov 2023 01:27:31 +0000 Subject: [PATCH 153/318] refactor current classes --- .eslintrc.json | 2 +- drizzle.config.ts | 2 +- pnpm-lock.yaml | 8583 ++++++++++------- src/v2/db/schema/asset/asset-atlas.ts | 3 + src/v2/db/schema/asset/asset-categories.ts | 2 + src/v2/db/schema/asset/asset-tags.ts | 2 + src/v2/db/schema/asset/asset.ts | 3 + .../db/schema/oc-generators/oc-generators.ts | 1 + src/v2/db/schema/user/user-attributes.ts | 2 + src/v2/db/schema/user/user-collections.ts | 3 + src/v2/db/schema/user/user-connections.ts | 1 + src/v2/db/schema/user/user-favorites.ts | 3 + src/v2/db/schema/user/user.ts | 5 +- src/v2/db/turso.ts | 6 +- .../asset-category/asset-category-manager.ts | 148 +- .../game-asset-category-manager.ts | 58 +- src/v2/lib/managers/asset/asset-manager.ts | 270 +- .../managers/collection/collection-manager.ts | 295 +- .../lib/managers/favorite/favorite-manager.ts | 139 +- src/v2/lib/managers/game/game-manager.ts | 63 +- src/v2/lib/managers/tag/tag-manager.ts | 86 +- .../lib/managers/user/user-follow-manager.ts | 86 +- .../lib/managers/user/user-profile-manager.ts | 135 +- .../lib/managers/user/user-search-manager.ts | 54 +- 24 files changed, 5886 insertions(+), 4066 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 6d37209..65056df 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -6,7 +6,7 @@ "rules": { "no-const-assign": "error", "camelcase": "off", - "no-extra-semi": "error" + "no-extra-semi": "off" }, "parserOptions": { "allowImportExportEverywhere": true, diff --git a/drizzle.config.ts b/drizzle.config.ts index 2b5ae0e..95d164f 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -16,6 +16,6 @@ export default { verbose: true, dbCredentials: { url: isDev ? TURSO_DEV_DATABASE_URL : TURSO_DATABASE_URL!, - authToken: TURSO_DATABASE_AUTH_TOKEN ?? undefined, + authToken: isDev ? undefined : TURSO_DATABASE_AUTH_TOKEN!, }, } satisfies Config diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f624d4d..208cc4f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,3596 +1,5005 @@ -lockfileVersion: '6.0' +lockfileVersion: "6.0" settings: - autoInstallPeers: true - excludeLinksFromLockfile: false + autoInstallPeers: true + excludeLinksFromLockfile: false dependencies: - '@hono/swagger-ui': - specifier: ^0.1.0 - version: 0.1.0(hono@3.9.2) - '@hono/zod-openapi': - specifier: ^0.8.3 - version: 0.8.3(hono@3.9.2)(zod@3.22.4) - '@libsql/client': - specifier: 0.3.6 - version: 0.3.6 - '@lucia-auth/adapter-session-unstorage': - specifier: ^2.1.0 - version: 2.1.0(lucia@2.7.3)(unstorage@1.9.0) - '@lucia-auth/adapter-sqlite': - specifier: ^2.0.1 - version: 2.0.1(@libsql/client@0.3.6)(better-sqlite3@9.1.1)(lucia@2.7.3) - '@lucia-auth/oauth': - specifier: ^3.4.0 - version: 3.4.0(lucia@2.7.3) - '@typescript-eslint/eslint-plugin': - specifier: ^6.10.0 - version: 6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.2.2) - better-sqlite3: - specifier: ^9.1.1 - version: 9.1.1 - drizzle-orm: - specifier: ^0.29.0 - version: 0.29.0(@cloudflare/workers-types@4.20231025.0)(@libsql/client@0.3.6)(better-sqlite3@9.1.1)(mysql2@3.6.3) - drizzle-zod: - specifier: ^0.5.1 - version: 0.5.1(drizzle-orm@0.29.0)(zod@3.22.4) - hono: - specifier: ^3.9.2 - version: 3.9.2 - lucia: - specifier: ^2.7.3 - version: 2.7.3 - miniflare: - specifier: ^3.20231025.1 - version: 3.20231025.1 - mysql2: - specifier: ^3.6.3 - version: 3.6.3 - oslo: - specifier: ^0.22.0 - version: 0.22.0 - prettier: - specifier: ^3.0.3 - version: 3.0.3 - unstorage: - specifier: ^1.9.0 - version: 1.9.0 - uuid: - specifier: ^9.0.1 - version: 9.0.1 - zod: - specifier: ^3.22.4 - version: 3.22.4 + "@hono/swagger-ui": + specifier: ^0.1.0 + version: 0.1.0(hono@3.9.2) + "@hono/zod-openapi": + specifier: ^0.8.3 + version: 0.8.3(hono@3.9.2)(zod@3.22.4) + "@libsql/client": + specifier: 0.3.6 + version: 0.3.6 + "@lucia-auth/adapter-session-unstorage": + specifier: ^2.1.0 + version: 2.1.0(lucia@2.7.3)(unstorage@1.9.0) + "@lucia-auth/adapter-sqlite": + specifier: ^2.0.1 + version: 2.0.1(@libsql/client@0.3.6)(better-sqlite3@9.1.1)(lucia@2.7.3) + "@lucia-auth/oauth": + specifier: ^3.4.0 + version: 3.4.0(lucia@2.7.3) + "@typescript-eslint/eslint-plugin": + specifier: ^6.10.0 + version: 6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.2.2) + better-sqlite3: + specifier: ^9.1.1 + version: 9.1.1 + drizzle-orm: + specifier: ^0.29.0 + version: 0.29.0(@cloudflare/workers-types@4.20231025.0)(@libsql/client@0.3.6)(better-sqlite3@9.1.1)(mysql2@3.6.3) + drizzle-zod: + specifier: ^0.5.1 + version: 0.5.1(drizzle-orm@0.29.0)(zod@3.22.4) + hono: + specifier: ^3.9.2 + version: 3.9.2 + lucia: + specifier: ^2.7.3 + version: 2.7.3 + miniflare: + specifier: ^3.20231025.1 + version: 3.20231025.1 + mysql2: + specifier: ^3.6.3 + version: 3.6.3 + oslo: + specifier: ^0.22.0 + version: 0.22.0 + prettier: + specifier: ^3.0.3 + version: 3.0.3 + unstorage: + specifier: ^1.9.0 + version: 1.9.0 + uuid: + specifier: ^9.0.1 + version: 9.0.1 + zod: + specifier: ^3.22.4 + version: 3.22.4 devDependencies: - '@cloudflare/workers-types': - specifier: ^4.20231025.0 - version: 4.20231025.0 - '@types/node': - specifier: ^20.9.0 - version: 20.9.0 - dotenv: - specifier: ^16.3.1 - version: 16.3.1 - drizzle-kit: - specifier: ^0.20.1 - version: 0.20.1 - eslint: - specifier: ^8.53.0 - version: 8.53.0 - eslint-config-google: - specifier: ^0.14.0 - version: 0.14.0(eslint@8.53.0) - eslint-plugin-json: - specifier: ^3.1.0 - version: 3.1.0 - husky: - specifier: ^8.0.3 - version: 8.0.3 - tsx: - specifier: ^4.0.0 - version: 4.0.0 - typescript: - specifier: ^5.2.2 - version: 5.2.2 - wrangler: - specifier: 3.15.0 - version: 3.15.0 + "@cloudflare/workers-types": + specifier: ^4.20231025.0 + version: 4.20231025.0 + "@types/node": + specifier: ^20.9.0 + version: 20.9.0 + dotenv: + specifier: ^16.3.1 + version: 16.3.1 + drizzle-kit: + specifier: ^0.20.1 + version: 0.20.1 + eslint: + specifier: ^8.53.0 + version: 8.53.0 + eslint-config-google: + specifier: ^0.14.0 + version: 0.14.0(eslint@8.53.0) + eslint-plugin-json: + specifier: ^3.1.0 + version: 3.1.0 + husky: + specifier: ^8.0.3 + version: 8.0.3 + tsx: + specifier: ^4.0.0 + version: 4.0.0 + typescript: + specifier: ^5.2.2 + version: 5.2.2 + wrangler: + specifier: 3.15.0 + version: 3.15.0 packages: + /@aashutoshrathi/word-wrap@1.2.6: + resolution: + { + integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==, + } + engines: { node: ">=0.10.0" } + + /@asteasolutions/zod-to-openapi@5.5.0(zod@3.22.4): + resolution: + { + integrity: sha512-d5HwrvM6dOKr3XdeF+DmashGvfEc+1oiEfbscugsiwSTrFtuMa7ETpW9sTNnVgn+hJaz+PRxPQUYD7q9/5dUig==, + } + peerDependencies: + zod: ^3.20.2 + dependencies: + openapi3-ts: 4.1.2 + zod: 3.22.4 + dev: false + + /@cloudflare/kv-asset-handler@0.2.0: + resolution: + { + integrity: sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==, + } + dependencies: + mime: 3.0.0 + dev: true + + /@cloudflare/workerd-darwin-64@1.20231025.0: + resolution: + { + integrity: sha512-MYRYTbSl+tjGg6su7savlLIb8cOcKJfdGpA+WdtgqT2OF7O+89Lag0l1SA/iyVlUkT31Jc6OLHqvzsXgmg+niQ==, + } + engines: { node: ">=16" } + cpu: [x64] + os: [darwin] + requiresBuild: true + optional: true + + /@cloudflare/workerd-darwin-arm64@1.20231025.0: + resolution: + { + integrity: sha512-BszjtBDR84TVa6oWe74dePJSAukWlTmLw9zR4KeWuwZLJGV7RMm6AmwGStetjnwZrecZaaOFELfBCAHtsebV0Q==, + } + engines: { node: ">=16" } + cpu: [arm64] + os: [darwin] + requiresBuild: true + optional: true + + /@cloudflare/workerd-linux-64@1.20231025.0: + resolution: + { + integrity: sha512-AT9dxgKXOa9xZxZ3k2a432axPJJ58KpoNWnPiPYGpuAuLoWnfcYwwh6mr9sZVcTdAdTAK9Xu9c81tp0YABanUw==, + } + engines: { node: ">=16" } + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true + + /@cloudflare/workerd-linux-arm64@1.20231025.0: + resolution: + { + integrity: sha512-EIjex5o2k80YZWPix1btGybL/vNZ3o6vqKX9ptS0JcFkHV5aFX5/kcMwSBRjiIC+w04zVjmGQx3N1Vh3njuncg==, + } + engines: { node: ">=16" } + cpu: [arm64] + os: [linux] + requiresBuild: true + optional: true + + /@cloudflare/workerd-windows-64@1.20231025.0: + resolution: + { + integrity: sha512-7vtq0mO22A2v0OOsKXa760r9a84Gg8CK0gDu5uNWlj6hojmt011iz7jJt76I7oo/XrVwVlVfu69GnA3ljx6U8w==, + } + engines: { node: ">=16" } + cpu: [x64] + os: [win32] + requiresBuild: true + optional: true + + /@cloudflare/workers-types@4.20231025.0: + resolution: + { + integrity: sha512-TkcZkntUTOcvJ4vgmwpNfLTclpMbmbClZCe62B25/VTukmyv91joRa4eKzSjzCZUXTbFHNmVdOpmGaaJU2U3+A==, + } + + /@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-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-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-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-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-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-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-community/eslint-utils@4.4.0(eslint@8.53.0): + resolution: + { + integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.53.0 + eslint-visitor-keys: 3.4.3 + + /@eslint-community/regexpp@4.10.0: + resolution: + { + integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==, + } + engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } + + /@eslint/eslintrc@2.1.3: + resolution: + { + integrity: sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.23.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + /@eslint/js@8.53.0: + resolution: + { + integrity: sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + + /@fastify/busboy@2.0.0: + resolution: + { + integrity: sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==, + } + engines: { node: ">=14" } + + /@hono/swagger-ui@0.1.0(hono@3.9.2): + resolution: + { + integrity: sha512-W5WEEhk2QtiqdSfM40FcK98Q5Bz4H/NfNqBUSkcZ46ys+DG4wt1yGsmRZgdJMje6t5Vn8eFN+9nyO+/dAp3drA==, + } + peerDependencies: + hono: "*" + dependencies: + hono: 3.9.2 + dev: false + + /@hono/zod-openapi@0.8.3(hono@3.9.2)(zod@3.22.4): + resolution: + { + integrity: sha512-TwjSf63miIF3VBqNy4V6EOqZYdTQPeIQQ9Q2HjRWFYH9f2QtBFXziuqIg2Y76gNZ3WDal67NQXmbSErHiFR44g==, + } + engines: { node: ">=16.0.0" } + peerDependencies: + hono: ">=3.9.0" + zod: 3.* + dependencies: + "@asteasolutions/zod-to-openapi": 5.5.0(zod@3.22.4) + "@hono/zod-validator": 0.1.11(hono@3.9.2)(zod@3.22.4) + hono: 3.9.2 + zod: 3.22.4 + dev: false + + /@hono/zod-validator@0.1.11(hono@3.9.2)(zod@3.22.4): + resolution: + { + integrity: sha512-PQXeHUP0+36qpRt8yfeD7N2jbK3ETlGvSN6dMof/HwUC/APRokQRjpXZm4rrlG71Ft0aWE01+Bm4XejqPie5Uw==, + } + peerDependencies: + hono: ">=3.9.0" + zod: ^3.19.1 + dependencies: + hono: 3.9.2 + zod: 3.22.4 + dev: false + + /@humanwhocodes/config-array@0.11.13: + resolution: + { + integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==, + } + engines: { node: ">=10.10.0" } + dependencies: + "@humanwhocodes/object-schema": 2.0.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + /@humanwhocodes/module-importer@1.0.1: + resolution: + { + integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, + } + engines: { node: ">=12.22" } + + /@humanwhocodes/object-schema@2.0.1: + resolution: + { + integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==, + } + + /@ioredis/commands@1.2.0: + resolution: + { + integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==, + } + dev: false + + /@libsql/client@0.3.6: + resolution: + { + integrity: sha512-3Mc4ZDI7X5ZLkMxX5XijiBeqhvyrny356lcj/KVVIeMXt9j6g4l+CRIsUvgcsyCAOUHqWqh0+TjI91bCKmdW+w==, + } + dependencies: + "@libsql/hrana-client": 0.5.5 + js-base64: 3.7.5 + libsql: 0.1.34 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: false + + /@libsql/darwin-arm64@0.1.34: + resolution: + { + integrity: sha512-Wv8jvkj/fUAO8DF3A4HaddCMldUUpKcg/WW1sY95FNsSHOxktyxqU80jAp/tCuZ85GQIJozvgSr51/ARIC0gsw==, + } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@libsql/darwin-x64@0.1.34: + resolution: + { + integrity: sha512-2NQXD9nUzC08hg7FdcZLq5uTEwGz1KbD7YvUzQb/psO1lO/E/p83wl1es1082+Pp0z5pSPDWQeRTuccD41L+3w==, + } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@libsql/hrana-client@0.5.5: + resolution: + { + integrity: sha512-i+hDBpiV719poqEiHupUUZYKJ9YSbCRFe5Q2PQ0v3mHIftePH6gayLjp2u6TXbqbO/Dv6y8yyvYlBXf/kFfRZA==, + } + dependencies: + "@libsql/isomorphic-fetch": 0.1.10 + "@libsql/isomorphic-ws": 0.1.5 + js-base64: 3.7.5 + node-fetch: 3.3.2 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: false + + /@libsql/isomorphic-fetch@0.1.10: + resolution: + { + integrity: sha512-dH0lMk50gKSvEKD78xWMu60SY1sjp1sY//iFLO0XMmBwfVfG136P9KOk06R4maBdlb8KMXOzJ1D28FR5ZKnHTA==, + } + dependencies: + "@types/node-fetch": 2.6.9 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: false + + /@libsql/isomorphic-ws@0.1.5: + resolution: + { + integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==, + } + dependencies: + "@types/ws": 8.5.9 + ws: 8.14.2 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /@libsql/linux-arm64-gnu@0.1.34: + resolution: + { + integrity: sha512-r3dY1FDYZ7eX5HX7HyAoYSqK5FPugj5NSB5Bt/nz+ygBWdXASgSKxkE/RqjJIM59vXwv300iJX9qhR5fXv8sTw==, + } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@libsql/linux-arm64-musl@0.1.34: + resolution: + { + integrity: sha512-9AE/eNb9eQRcNsLxqtpLJxVEoIMmItrdwqJDImPJtOp10rhp4U0x/9RGKerl9Mg3ObVj676pyhAR2KzyudrOfQ==, + } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@libsql/linux-x64-gnu@0.1.34: + resolution: + { + integrity: sha512-o8toY1Txstjt13fBhZbFe8sNAW6OaS6qVcp1Bd6bHkCLSBLZ6pjJmwzQN8rFv9QFBPAnaKP3lI4vaOXXw7huTA==, + } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@libsql/linux-x64-musl@0.1.34: + resolution: + { + integrity: sha512-EldEmcAxxNPSCjJ73oFxg81PDDIpDbPqK/QOrhmmGYLvYwrnQtVRUIbARf80JQvcy6bCxOO/Q9dh6wGhnyHyYA==, + } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@libsql/win32-x64-msvc@0.1.34: + resolution: + { + integrity: sha512-jnv0qfVMnrVv00r+wUOe6DHrHuao9y1w1lN543cV2J1JdQNJT/eSZzhyZFSlS3T2ZUvXfZfZ5GeL8U18IAID6w==, + } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@lucia-auth/adapter-session-unstorage@2.1.0(lucia@2.7.3)(unstorage@1.9.0): + resolution: + { + integrity: sha512-ItK7urZhLZv7UO99BcODjRhSAv58UPc+KQAmnkSvri2WBc22vFEjnjd/oWp3CZPdbbrJkuTvsuhFXH1ySBfOLg==, + } + peerDependencies: + lucia: ^2.0.0 + unstorage: ^1.9.0 + dependencies: + lucia: 2.7.3 + unstorage: 1.9.0 + dev: false + + /@lucia-auth/adapter-sqlite@2.0.1(@libsql/client@0.3.6)(better-sqlite3@9.1.1)(lucia@2.7.3): + resolution: + { + integrity: sha512-yc7XQ4X3sWG1gyUGHqaXipJIkmvB4MOgJypnSMWy7Vjhn3AOCM2xw51xTs+dGpLOQIn2Laomg9xpmDM2/9tgqQ==, + } + peerDependencies: + "@libsql/client": ^0.3.0 + better-sqlite3: 8.x - 9.x + lucia: ^2.0.0 + peerDependenciesMeta: + "@libsql/client": + optional: true + better-sqlite3: + optional: true + dependencies: + "@libsql/client": 0.3.6 + better-sqlite3: 9.1.1 + lucia: 2.7.3 + dev: false + + /@lucia-auth/oauth@3.4.0(lucia@2.7.3): + resolution: + { + integrity: sha512-3W4TaCiyUViXK2e2+VJo5324agvYz3102I2YKIttkGDKcevaNpLG3LgiR2rbemyF5UXFKiHgfFvRtKs/KDa9kw==, + } + peerDependencies: + lucia: ^2.0.0 + dependencies: + lucia: 2.7.3 + dev: false + + /@neon-rs/load@0.0.4: + resolution: + { + integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==, + } + dev: false + + /@noble/hashes@1.3.2: + resolution: + { + integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==, + } + engines: { node: ">= 16" } + dev: false + + /@node-rs/argon2-android-arm-eabi@1.5.2: + resolution: + { + integrity: sha512-vVZec4ITr9GumAy0p8Zj8ozie362gtbZrTkLp9EqvuFZ/HrZzR09uS2IsDgm4mAstg/rc4A1gLRrHI8jDdbjkA==, + } + engines: { node: ">= 10" } + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-android-arm64@1.5.2: + resolution: + { + integrity: sha512-SwhnsXyrpgtWDTwYds1WUnxLA/kVP8HVaImYwQ3Wemqj1lkzcSoIaNyjNWkyrYGqO1tVc1YUrqsbd5eCHh+3sg==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-darwin-arm64@1.5.2: + resolution: + { + integrity: sha512-+1ZMKiCCv2pip/o1Xg09piQru2LOIBPQ1vS4is86f55N3jjZnSfP+db5mYCSRuB0gRYqui98he7su7OGXlF4gQ==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-darwin-x64@1.5.2: + resolution: + { + integrity: sha512-mQ57mORlsxpfjcEsVpiHyHCOp6Ljrz/rVNWk8ihnPWw0qt0EqF1zbHRxTEPemL1iBHL9UyXpXrKS4JKq6xMn5w==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-freebsd-x64@1.5.2: + resolution: + { + integrity: sha512-UjKbFd3viYcpiwflkU4haEdNUMk1V2fVCJImWLWQns/hVval9BrDv5xsBwgdynbPHDlPOiWj816LBQwhWLGVWA==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-arm-gnueabihf@1.5.2: + resolution: + { + integrity: sha512-36GJjJBnVuscV9CTn8RVDeJysnmIzr6Lp7QBCDczYHi6eKFuA8udCJb4SRyJqdvIuzycKG1RL56FbcFBJYCYIA==, + } + engines: { node: ">= 10" } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-arm64-gnu@1.5.2: + resolution: + { + integrity: sha512-sE0ydb2gp6xC+5vbVz8l3paaiBbFQIB2Rwp5wx9MmKiYdTfcO5WkGeADuSgoFiTcSEz1RsHXqrdVy6j/LtSqtA==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-arm64-musl@1.5.2: + resolution: + { + integrity: sha512-LhE0YHB0aJCwlbsQrwePik/KFWUc9qMriJIL5KiejK3bDoTVY4ihH587QT56JyaLvl3nBJaAV8l5yMqQdHnouA==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-x64-gnu@1.5.2: + resolution: + { + integrity: sha512-MnKLiBlyg05pxvKXe3lNgBL9El9ThD74hvVEiWH1Xk40RRrJ507NCOWXVmQ0FDq1mjTeGFxbIvk+AcoF0NSLIQ==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-x64-musl@1.5.2: + resolution: + { + integrity: sha512-tzLgASY0Ng2OTW7Awwl9UWzjbWx8/uD6gXcZ/k/nYGSZE5Xp8EOD2NUqHLbK6KZE3775A0R25ShpiSxCadYqkg==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-win32-arm64-msvc@1.5.2: + resolution: + { + integrity: sha512-vpTwSvv3oUXTpWZh0/HxdJ5wFMlmS7aVDwL4ATWepTZhMG4n+TO0+tVLdcPHCbg0oc6hCWBjWNPlSn9mW+YIgA==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-win32-ia32-msvc@1.5.2: + resolution: + { + integrity: sha512-KPpZR15ui7uQWQXKmtaKyUQRs4UJdXnIIfiyFLGmLWCdEKlr3MtIGFt0fdziu4BF5ZObD8Ic6QvT0VXK4OJiww==, + } + engines: { node: ">= 10" } + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-win32-x64-msvc@1.5.2: + resolution: + { + integrity: sha512-/pGuwixJS8ZlpwhX9iM6g6JEeZYo1TtnNf8exwsOi7gxcUoTUfw5it+5GfbY/n+xRBz/DIU4bzUmXmh+7Gh0ug==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2@1.5.2: + resolution: + { + integrity: sha512-qq7wOSsdP2b4rXEapWNmsCjpaTGZWtp9kZmri98GYCDZqN8UJUG5zSue4XtYWWJMWKJVE/hkaIwk+BgN1ZUn0Q==, + } + engines: { node: ">= 10" } + optionalDependencies: + "@node-rs/argon2-android-arm-eabi": 1.5.2 + "@node-rs/argon2-android-arm64": 1.5.2 + "@node-rs/argon2-darwin-arm64": 1.5.2 + "@node-rs/argon2-darwin-x64": 1.5.2 + "@node-rs/argon2-freebsd-x64": 1.5.2 + "@node-rs/argon2-linux-arm-gnueabihf": 1.5.2 + "@node-rs/argon2-linux-arm64-gnu": 1.5.2 + "@node-rs/argon2-linux-arm64-musl": 1.5.2 + "@node-rs/argon2-linux-x64-gnu": 1.5.2 + "@node-rs/argon2-linux-x64-musl": 1.5.2 + "@node-rs/argon2-win32-arm64-msvc": 1.5.2 + "@node-rs/argon2-win32-ia32-msvc": 1.5.2 + "@node-rs/argon2-win32-x64-msvc": 1.5.2 + dev: false + + /@node-rs/bcrypt-android-arm-eabi@1.7.3: + resolution: + { + integrity: sha512-l53RuBqnqNvBN2jx09Ws6jpLmuQdSDx10n0GeaTfwh1svxsC8bPpVmxkfBExsT2Tu7KF38gTnPZvwsxysZQyPQ==, + } + engines: { node: ">= 10" } + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-android-arm64@1.7.3: + resolution: + { + integrity: sha512-TZpm4VbiViqDMvusrcYzLr1b1M5FDF0cDNiTUciLeBSsKtU5lNdEZGAU7gvCnrKoUWpGuOblHU7613zuB7SiNQ==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-darwin-arm64@1.7.3: + resolution: + { + integrity: sha512-SiUuAabynVsmixZMjh5xrn8w47EnV0HzbW9st4DPoVhn/wzdUcksIXDY75aoQG2EIzKLN8IGb+CIVnPGmRyhxw==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-darwin-x64@1.7.3: + resolution: + { + integrity: sha512-R+81Z0eX4hZPvCXY5Z6l0l+JrTU3WcSYGHP0QYV9uwdaafOz6EhrCXUzZ02AIcAbNoVR8eucYVruq9PiasXoVw==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-freebsd-x64@1.7.3: + resolution: + { + integrity: sha512-0pItU/5K3e83JjcJj9fZv+78txUoZ3hHCT7n/UMdu9mkpUzhX/rqb4jmQpJpD+UQoR76xp3qDo5RMgQBffBVNg==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-arm-gnueabihf@1.7.3: + resolution: + { + integrity: sha512-HTSybWUjNe8rWuXkTkMeFDiQNHc6VioRcgv6AeHZphIxiT6dFbnhXNkfz4Hr0zxvyPhZ3NrYjT2AmPVFT6VW3Q==, + } + engines: { node: ">= 10" } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-arm64-gnu@1.7.3: + resolution: + { + integrity: sha512-rWep6Y+v/c4bZHaM8LmSsrMwMmDR9wG4/q+3Z9VzR8xdnt5VCbuQdYWpf3sgGRGjTRdTBAdSK8x1reOjqsJ3Jg==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-arm64-musl@1.7.3: + resolution: + { + integrity: sha512-TyWEKhxr+yfGcMKzVV/ARZw+Hrky2yl91bo0XYU2ZW6I6LDC0emNsXugdWjwz8ADI4OWhhrOjXD8GCilxiB2Rg==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-x64-gnu@1.7.3: + resolution: + { + integrity: sha512-PofxM1Qg7tZKj1oP0I7tBTSSLr8Xc2uxx+P3pBCPmYzaBwWqGteNHJlF7n2q5xiH7YOlguH4w5CmcEjsiA3K4A==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-x64-musl@1.7.3: + resolution: + { + integrity: sha512-D5V6/dDVKP8S/ieDBLGhTn4oTo3upbrpWInynbhOMjJvPiIxVG1PiI3MXkWBtG9qtfleDk7gUkEKtAOxlIxDTQ==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-win32-arm64-msvc@1.7.3: + resolution: + { + integrity: sha512-b4gH2Yj5R4TwULrfMHd1Qqr+MrnFjVRUAJujDKPqi+PppSqezW8QF6DRSOL4GjnBmz5JEd64wxgeidvy7dsbGw==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-win32-ia32-msvc@1.7.3: + resolution: + { + integrity: sha512-E91ro+ybI0RhNc89aGaZQGll0YhPoHr8JacoWrNKwhg9zwNOYeuO0tokdMZdm6nF0/8obll0Mq7wO9AXO9iffw==, + } + engines: { node: ">= 10" } + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-win32-x64-msvc@1.7.3: + resolution: + { + integrity: sha512-LO/p9yjPODj/pQvPnowBuwpDdqiyUXQbqL1xb1RSP3NoyCFAGmjL5h0plSQrhLh8hskQiozBRXNaQurtsM7o0Q==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt@1.7.3: + resolution: + { + integrity: sha512-BF6u9CBPUiyk1zU+5iwikezf+xM4MFSu5cmrrg/PLKffGgIM13ZsY6DHftcTraETB04ryasjM/5IejotH+sO5Q==, + } + engines: { node: ">= 10" } + optionalDependencies: + "@node-rs/bcrypt-android-arm-eabi": 1.7.3 + "@node-rs/bcrypt-android-arm64": 1.7.3 + "@node-rs/bcrypt-darwin-arm64": 1.7.3 + "@node-rs/bcrypt-darwin-x64": 1.7.3 + "@node-rs/bcrypt-freebsd-x64": 1.7.3 + "@node-rs/bcrypt-linux-arm-gnueabihf": 1.7.3 + "@node-rs/bcrypt-linux-arm64-gnu": 1.7.3 + "@node-rs/bcrypt-linux-arm64-musl": 1.7.3 + "@node-rs/bcrypt-linux-x64-gnu": 1.7.3 + "@node-rs/bcrypt-linux-x64-musl": 1.7.3 + "@node-rs/bcrypt-win32-arm64-msvc": 1.7.3 + "@node-rs/bcrypt-win32-ia32-msvc": 1.7.3 + "@node-rs/bcrypt-win32-x64-msvc": 1.7.3 + dev: false + + /@nodelib/fs.scandir@2.1.5: + resolution: + { + integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, + } + engines: { node: ">= 8" } + dependencies: + "@nodelib/fs.stat": 2.0.5 + run-parallel: 1.2.0 + + /@nodelib/fs.stat@2.0.5: + resolution: + { + integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, + } + engines: { node: ">= 8" } + + /@nodelib/fs.walk@1.2.8: + resolution: + { + integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, + } + engines: { node: ">= 8" } + dependencies: + "@nodelib/fs.scandir": 2.1.5 + fastq: 1.15.0 + + /@parcel/watcher-android-arm64@2.3.0: + resolution: + { + integrity: sha512-f4o9eA3dgk0XRT3XhB0UWpWpLnKgrh1IwNJKJ7UJek7eTYccQ8LR7XUWFKqw6aEq5KUNlCcGvSzKqSX/vtWVVA==, + } + engines: { node: ">= 10.0.0" } + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-darwin-arm64@2.3.0: + resolution: + { + integrity: sha512-mKY+oijI4ahBMc/GygVGvEdOq0L4DxhYgwQqYAz/7yPzuGi79oXrZG52WdpGA1wLBPrYb0T8uBaGFo7I6rvSKw==, + } + engines: { node: ">= 10.0.0" } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-darwin-x64@2.3.0: + resolution: + { + integrity: sha512-20oBj8LcEOnLE3mgpy6zuOq8AplPu9NcSSSfyVKgfOhNAc4eF4ob3ldj0xWjGGbOF7Dcy1Tvm6ytvgdjlfUeow==, + } + engines: { node: ">= 10.0.0" } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-freebsd-x64@2.3.0: + resolution: + { + integrity: sha512-7LftKlaHunueAEiojhCn+Ef2CTXWsLgTl4hq0pkhkTBFI3ssj2bJXmH2L67mKpiAD5dz66JYk4zS66qzdnIOgw==, + } + engines: { node: ">= 10.0.0" } + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-arm-glibc@2.3.0: + resolution: + { + integrity: sha512-1apPw5cD2xBv1XIHPUlq0cO6iAaEUQ3BcY0ysSyD9Kuyw4MoWm1DV+W9mneWI+1g6OeP6dhikiFE6BlU+AToTQ==, + } + engines: { node: ">= 10.0.0" } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-arm64-glibc@2.3.0: + resolution: + { + integrity: sha512-mQ0gBSQEiq1k/MMkgcSB0Ic47UORZBmWoAWlMrTW6nbAGoLZP+h7AtUM7H3oDu34TBFFvjy4JCGP43JlylkTQA==, + } + engines: { node: ">= 10.0.0" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-arm64-musl@2.3.0: + resolution: + { + integrity: sha512-LXZAExpepJew0Gp8ZkJ+xDZaTQjLHv48h0p0Vw2VMFQ8A+RKrAvpFuPVCVwKJCr5SE+zvaG+Etg56qXvTDIedw==, + } + engines: { node: ">= 10.0.0" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-x64-glibc@2.3.0: + resolution: + { + integrity: sha512-P7Wo91lKSeSgMTtG7CnBS6WrA5otr1K7shhSjKHNePVmfBHDoAOHYRXgUmhiNfbcGk0uMCHVcdbfxtuiZCHVow==, + } + engines: { node: ">= 10.0.0" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-x64-musl@2.3.0: + resolution: + { + integrity: sha512-+kiRE1JIq8QdxzwoYY+wzBs9YbJ34guBweTK8nlzLKimn5EQ2b2FSC+tAOpq302BuIMjyuUGvBiUhEcLIGMQ5g==, + } + engines: { node: ">= 10.0.0" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-wasm@2.3.0: + resolution: + { + integrity: sha512-ejBAX8H0ZGsD8lSICDNyMbSEtPMWgDL0WFCt/0z7hyf5v8Imz4rAM8xY379mBsECkq/Wdqa5WEDLqtjZ+6NxfA==, + } + engines: { node: ">= 10.0.0" } + dependencies: + is-glob: 4.0.3 + micromatch: 4.0.5 + napi-wasm: 1.1.0 + dev: false + bundledDependencies: + - napi-wasm + + /@parcel/watcher-win32-arm64@2.3.0: + resolution: + { + integrity: sha512-35gXCnaz1AqIXpG42evcoP2+sNL62gZTMZne3IackM+6QlfMcJLy3DrjuL6Iks7Czpd3j4xRBzez3ADCj1l7Aw==, + } + engines: { node: ">= 10.0.0" } + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-win32-ia32@2.3.0: + resolution: + { + integrity: sha512-FJS/IBQHhRpZ6PiCjFt1UAcPr0YmCLHRbTc00IBTrelEjlmmgIVLeOx4MSXzx2HFEy5Jo5YdhGpxCuqCyDJ5ow==, + } + engines: { node: ">= 10.0.0" } + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-win32-x64@2.3.0: + resolution: + { + integrity: sha512-dLx+0XRdMnVI62kU3wbXvbIRhLck4aE28bIGKbRGS7BJNt54IIj9+c/Dkqb+7DJEbHUZAX1bwaoM8PqVlHJmCA==, + } + engines: { node: ">= 10.0.0" } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher@2.3.0: + resolution: + { + integrity: sha512-pW7QaFiL11O0BphO+bq3MgqeX/INAk9jgBldVDYjlQPO4VddoZnF22TcF9onMhnLVHuNqBJeRf+Fj7eezi/+rQ==, + } + engines: { node: ">= 10.0.0" } + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.5 + node-addon-api: 7.0.0 + optionalDependencies: + "@parcel/watcher-android-arm64": 2.3.0 + "@parcel/watcher-darwin-arm64": 2.3.0 + "@parcel/watcher-darwin-x64": 2.3.0 + "@parcel/watcher-freebsd-x64": 2.3.0 + "@parcel/watcher-linux-arm-glibc": 2.3.0 + "@parcel/watcher-linux-arm64-glibc": 2.3.0 + "@parcel/watcher-linux-arm64-musl": 2.3.0 + "@parcel/watcher-linux-x64-glibc": 2.3.0 + "@parcel/watcher-linux-x64-musl": 2.3.0 + "@parcel/watcher-win32-arm64": 2.3.0 + "@parcel/watcher-win32-ia32": 2.3.0 + "@parcel/watcher-win32-x64": 2.3.0 + dev: false + + /@types/json-schema@7.0.15: + resolution: + { + integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, + } + dev: false + + /@types/node-fetch@2.6.9: + resolution: + { + integrity: sha512-bQVlnMLFJ2d35DkPNjEPmd9ueO/rh5EiaZt2bhqiSarPjZIuIV6bPQVqcrEyvNo+AfTrRGVazle1tl597w3gfA==, + } + dependencies: + "@types/node": 20.9.0 + form-data: 4.0.0 + dev: false + + /@types/node-forge@1.3.9: + resolution: + { + integrity: sha512-meK88cx/sTalPSLSoCzkiUB4VPIFHmxtXm5FaaqRDqBX2i/Sy8bJ4odsan0b20RBjPh06dAQ+OTTdnyQyhJZyQ==, + } + dependencies: + "@types/node": 20.9.0 + dev: true + + /@types/node@20.9.0: + resolution: + { + integrity: sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==, + } + dependencies: + undici-types: 5.26.5 + + /@types/semver@7.5.5: + resolution: + { + integrity: sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==, + } + dev: false + + /@types/ws@8.5.9: + resolution: + { + integrity: sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg==, + } + dependencies: + "@types/node": 20.9.0 + dev: false + + /@typescript-eslint/eslint-plugin@6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.2.2): + resolution: + { + integrity: sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@eslint-community/regexpp": 4.10.0 + "@typescript-eslint/parser": 6.10.0(eslint@8.53.0)(typescript@5.2.2) + "@typescript-eslint/scope-manager": 6.10.0 + "@typescript-eslint/type-utils": 6.10.0(eslint@8.53.0)(typescript@5.2.2) + "@typescript-eslint/utils": 6.10.0(eslint@8.53.0)(typescript@5.2.2) + "@typescript-eslint/visitor-keys": 6.10.0 + debug: 4.3.4 + eslint: 8.53.0 + graphemer: 1.4.0 + ignore: 5.2.4 + natural-compare: 1.4.0 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.2.2): + resolution: + { + integrity: sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@typescript-eslint/scope-manager": 6.10.0 + "@typescript-eslint/types": 6.10.0 + "@typescript-eslint/typescript-estree": 6.10.0(typescript@5.2.2) + "@typescript-eslint/visitor-keys": 6.10.0 + debug: 4.3.4 + eslint: 8.53.0 + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/scope-manager@6.10.0: + resolution: + { + integrity: sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + dependencies: + "@typescript-eslint/types": 6.10.0 + "@typescript-eslint/visitor-keys": 6.10.0 + dev: false + + /@typescript-eslint/type-utils@6.10.0(eslint@8.53.0)(typescript@5.2.2): + resolution: + { + integrity: sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@typescript-eslint/typescript-estree": 6.10.0(typescript@5.2.2) + "@typescript-eslint/utils": 6.10.0(eslint@8.53.0)(typescript@5.2.2) + debug: 4.3.4 + eslint: 8.53.0 + ts-api-utils: 1.0.3(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/types@6.10.0: + resolution: + { + integrity: sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + dev: false + + /@typescript-eslint/typescript-estree@6.10.0(typescript@5.2.2): + resolution: + { + integrity: sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@typescript-eslint/types": 6.10.0 + "@typescript-eslint/visitor-keys": 6.10.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/utils@6.10.0(eslint@8.53.0)(typescript@5.2.2): + resolution: + { + integrity: sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + "@eslint-community/eslint-utils": 4.4.0(eslint@8.53.0) + "@types/json-schema": 7.0.15 + "@types/semver": 7.5.5 + "@typescript-eslint/scope-manager": 6.10.0 + "@typescript-eslint/types": 6.10.0 + "@typescript-eslint/typescript-estree": 6.10.0(typescript@5.2.2) + eslint: 8.53.0 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: false + + /@typescript-eslint/visitor-keys@6.10.0: + resolution: + { + integrity: sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + dependencies: + "@typescript-eslint/types": 6.10.0 + eslint-visitor-keys: 3.4.3 + dev: false + + /@ungap/structured-clone@1.2.0: + resolution: + { + integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==, + } + + /acorn-jsx@5.3.2(acorn@8.11.2): + resolution: + { + integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, + } + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.2 + + /acorn-walk@8.3.0: + resolution: + { + integrity: sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==, + } + engines: { node: ">=0.4.0" } + + /acorn@8.11.2: + resolution: + { + integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==, + } + engines: { node: ">=0.4.0" } + hasBin: true + + /ajv@6.12.6: + resolution: + { + integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, + } + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + /ansi-regex@5.0.1: + resolution: + { + integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, + } + engines: { node: ">=8" } + + /ansi-styles@4.3.0: + resolution: + { + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, + } + engines: { node: ">=8" } + dependencies: + color-convert: 2.0.1 + + /anymatch@3.1.3: + resolution: + { + integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, + } + engines: { node: ">= 8" } + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + /arch@2.2.0: + resolution: + { + integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==, + } + dev: false + + /argparse@2.0.1: + resolution: + { + integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, + } + + /array-union@2.1.0: + resolution: + { + integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, + } + engines: { node: ">=8" } + dev: false + + /as-table@1.0.55: + resolution: + { + integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==, + } + dependencies: + printable-characters: 1.0.42 + + /asynckit@0.4.0: + resolution: + { + integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, + } + dev: false + + /balanced-match@1.0.2: + resolution: + { + integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, + } + + /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" } + + /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 + + /brace-expansion@1.1.11: + resolution: + { + integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, + } + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /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==, + } + engines: { node: ">=8" } + dependencies: + fill-range: 7.0.1 + + /buffer-from@1.1.2: + resolution: + { + integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, + } + + /buffer@5.7.1: + resolution: + { + integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, + } + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /callsites@3.1.0: + resolution: + { + integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, + } + engines: { node: ">=6" } + + /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 + + /chalk@4.1.2: + resolution: + { + integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, + } + engines: { node: ">=10" } + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /chalk@5.3.0: + resolution: + { + integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==, + } + engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } + dev: true + + /chokidar@3.5.3: + resolution: + { + integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, + } + engines: { node: ">= 8.10.0" } + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + /chownr@1.1.4: + resolution: + { + integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==, + } + dev: false + + /citty@0.1.4: + resolution: + { + integrity: sha512-Q3bK1huLxzQrvj7hImJ7Z1vKYJRPQCDnd0EjXfHMidcjecGOMuLrmuQmtWmFkuKLcMThlGh1yCKG8IEc6VeNXQ==, + } + dependencies: + consola: 3.2.3 + dev: false + + /cli-color@2.0.3: + resolution: + { + integrity: sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==, + } + engines: { node: ">=0.10" } + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-iterator: 2.0.3 + memoizee: 0.4.15 + timers-ext: 0.1.7 + dev: true + + /clipboardy@3.0.0: + resolution: + { + integrity: sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dependencies: + arch: 2.2.0 + execa: 5.1.1 + is-wsl: 2.2.0 + dev: false + + /cluster-key-slot@1.1.2: + resolution: + { + integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==, + } + engines: { node: ">=0.10.0" } + dev: false + + /color-convert@2.0.1: + resolution: + { + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, + } + engines: { node: ">=7.0.0" } + dependencies: + color-name: 1.1.4 + + /color-name@1.1.4: + resolution: + { + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, + } + + /combined-stream@1.0.8: + resolution: + { + integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, + } + engines: { node: ">= 0.8" } + dependencies: + delayed-stream: 1.0.0 + dev: false + + /commander@9.5.0: + resolution: + { + integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==, + } + engines: { node: ^12.20.0 || >=14 } + dev: true + + /concat-map@0.0.1: + resolution: + { + integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, + } + + /consola@3.2.3: + resolution: + { + integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==, + } + engines: { node: ^14.18.0 || >=16.10.0 } + dev: false + + /cookie-es@1.0.0: + resolution: + { + integrity: sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ==, + } + dev: false + + /cookie@0.5.0: + resolution: + { + integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==, + } + engines: { node: ">= 0.6" } + + /cross-spawn@7.0.3: + resolution: + { + integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, + } + engines: { node: ">= 8" } + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + /d@1.0.1: + resolution: + { + integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==, + } + 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==, + } + + /data-uri-to-buffer@4.0.1: + resolution: + { + integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==, + } + engines: { node: ">= 12" } + dev: false + + /debug@4.3.4: + resolution: + { + integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, + } + engines: { node: ">=6.0" } + peerDependencies: + supports-color: "*" + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /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==, + } + + /defu@6.1.3: + resolution: + { + integrity: sha512-Vy2wmG3NTkmHNg/kzpuvHhkqeIx3ODWqasgCRbKtbXEN0G+HpEEv9BtJLp7ZG1CZloFaC41Ah3ZFbq7aqCqMeQ==, + } + dev: false + + /delayed-stream@1.0.0: + resolution: + { + integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, + } + engines: { node: ">=0.4.0" } + dev: false + + /denque@2.1.0: + resolution: + { + integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==, + } + engines: { node: ">=0.10" } + dev: false + + /destr@2.0.2: + resolution: + { + integrity: sha512-65AlobnZMiCET00KaFFjUefxDX0khFA/E4myqZ7a6Sq1yZtR8+FVIvilVX66vF2uobSumxooYZChiRPCKNqhmg==, + } + dev: false + + /detect-libc@1.0.3: + resolution: + { + integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==, + } + engines: { node: ">=0.10" } + hasBin: true + dev: false + + /detect-libc@2.0.2: + resolution: + { + integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==, + } + engines: { node: ">=8" } + dev: false + + /difflib@0.2.4: + resolution: + { + integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==, + } + dependencies: + heap: 0.2.7 + dev: true + + /dir-glob@3.0.1: + resolution: + { + integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, + } + engines: { node: ">=8" } + dependencies: + path-type: 4.0.0 + dev: false + + /doctrine@3.0.0: + resolution: + { + integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==, + } + engines: { node: ">=6.0.0" } + dependencies: + esutils: 2.0.3 + + /dotenv@16.3.1: + resolution: + { + integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==, + } + engines: { node: ">=12" } + dev: true + + /dreamopt@0.8.0: + resolution: + { + integrity: sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==, + } + engines: { node: ">=0.4.0" } + dependencies: + wordwrap: 1.0.0 + dev: true + + /drizzle-kit@0.20.1: + resolution: + { + integrity: sha512-W6YAFeT15LcirtAbFmfKOjN+p0EhTW+8KZaPqIEz0VpkBrq3GbBUtaoYWa7l8OLzlOBY54XPG2fa9j+iv3pQRQ==, + } + 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.15.0 + zod: 3.22.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /drizzle-orm@0.29.0(@cloudflare/workers-types@4.20231025.0)(@libsql/client@0.3.6)(better-sqlite3@9.1.1)(mysql2@3.6.3): + 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: + "@cloudflare/workers-types": 4.20231025.0 + "@libsql/client": 0.3.6 + better-sqlite3: 9.1.1 + mysql2: 3.6.3 + dev: false + + /drizzle-zod@0.5.1(drizzle-orm@0.29.0)(zod@3.22.4): + resolution: + { + integrity: sha512-C/8bvzUH/zSnVfwdSibOgFjLhtDtbKYmkbPbUCq46QZyZCH6kODIMSOgZ8R7rVjoI+tCj3k06MRJMDqsIeoS4A==, + } + peerDependencies: + drizzle-orm: ">=0.23.13" + zod: "*" + dependencies: + drizzle-orm: 0.29.0(@cloudflare/workers-types@4.20231025.0)(@libsql/client@0.3.6)(better-sqlite3@9.1.1)(mysql2@3.6.3) + zod: 3.22.4 + dev: false + + /end-of-stream@1.4.4: + resolution: + { + integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, + } + dependencies: + once: 1.4.0 + dev: false + + /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 + + /escape-string-regexp@4.0.0: + resolution: + { + integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, + } + engines: { node: ">=10" } + + /eslint-config-google@0.14.0(eslint@8.53.0): + resolution: + { + integrity: sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==, + } + engines: { node: ">=0.10.0" } + peerDependencies: + eslint: ">=5.16.0" + dependencies: + eslint: 8.53.0 + dev: true + + /eslint-plugin-json@3.1.0: + resolution: + { + integrity: sha512-MrlG2ynFEHe7wDGwbUuFPsaT2b1uhuEFhJ+W1f1u+1C2EkXmTYJp4B1aAdQQ8M+CC3t//N/oRKiIVw14L2HR1g==, + } + engines: { node: ">=12.0" } + dependencies: + lodash: 4.17.21 + vscode-json-languageservice: 4.2.1 + dev: true + + /eslint-scope@7.2.2: + resolution: + { + integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + /eslint-visitor-keys@3.4.3: + resolution: + { + integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + + /eslint@8.53.0: + resolution: + { + integrity: sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + hasBin: true + dependencies: + "@eslint-community/eslint-utils": 4.4.0(eslint@8.53.0) + "@eslint-community/regexpp": 4.10.0 + "@eslint/eslintrc": 2.1.3 + "@eslint/js": 8.53.0 + "@humanwhocodes/config-array": 0.11.13 + "@humanwhocodes/module-importer": 1.0.1 + "@nodelib/fs.walk": 1.2.8 + "@ungap/structured-clone": 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.23.0 + graphemer: 1.4.0 + ignore: 5.2.4 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + /espree@9.6.1: + resolution: + { + integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) + eslint-visitor-keys: 3.4.3 + + /esquery@1.5.0: + resolution: + { + integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==, + } + engines: { node: ">=0.10" } + dependencies: + estraverse: 5.3.0 + + /esrecurse@4.3.0: + resolution: + { + integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, + } + engines: { node: ">=4.0" } + dependencies: + estraverse: 5.3.0 + + /estraverse@5.3.0: + resolution: + { + integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, + } + engines: { node: ">=4.0" } + + /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" } + + /event-emitter@0.3.5: + resolution: + { + integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==, + } + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + dev: true + + /execa@5.1.1: + resolution: + { + integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==, + } + engines: { node: ">=10" } + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: false + + /exit-hook@2.2.1: + resolution: + { + integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==, + } + engines: { node: ">=6" } + + /expand-template@2.0.3: + resolution: + { + integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==, + } + engines: { node: ">=6" } + 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==, + } + + /fast-glob@3.3.2: + resolution: + { + integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==, + } + engines: { node: ">=8.6.0" } + dependencies: + "@nodelib/fs.stat": 2.0.5 + "@nodelib/fs.walk": 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: false + + /fast-json-stable-stringify@2.1.0: + resolution: + { + integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, + } + + /fast-levenshtein@2.0.6: + resolution: + { + integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, + } + + /fastq@1.15.0: + resolution: + { + integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==, + } + dependencies: + reusify: 1.0.4 + + /fetch-blob@3.2.0: + resolution: + { + integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==, + } + engines: { node: ^12.20 || >= 14.13 } + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.2.1 + dev: false + + /file-entry-cache@6.0.1: + resolution: + { + integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==, + } + engines: { node: ^10.12.0 || >=12.0.0 } + dependencies: + flat-cache: 3.1.1 + + /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" } + dependencies: + to-regex-range: 5.0.1 + + /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 + + /flat-cache@3.1.1: + resolution: + { + integrity: sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==, + } + engines: { node: ">=12.0.0" } + dependencies: + flatted: 3.2.9 + keyv: 4.5.4 + rimraf: 3.0.2 + + /flatted@3.2.9: + resolution: + { + integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==, + } + + /form-data@4.0.0: + resolution: + { + integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==, + } + engines: { node: ">= 6" } + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + + /formdata-polyfill@4.0.10: + resolution: + { + integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==, + } + engines: { node: ">=12.20.0" } + dependencies: + fetch-blob: 3.2.0 + dev: false + + /fs-constants@1.0.0: + resolution: + { + integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==, + } + dev: false + + /fs.realpath@1.0.0: + resolution: + { + integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, + } + + /fsevents@2.3.3: + resolution: + { + integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, + } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + os: [darwin] + requiresBuild: true + optional: true - /@aashutoshrathi/word-wrap@1.2.6: - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - - /@asteasolutions/zod-to-openapi@5.5.0(zod@3.22.4): - resolution: {integrity: sha512-d5HwrvM6dOKr3XdeF+DmashGvfEc+1oiEfbscugsiwSTrFtuMa7ETpW9sTNnVgn+hJaz+PRxPQUYD7q9/5dUig==} - peerDependencies: - zod: ^3.20.2 - dependencies: - openapi3-ts: 4.1.2 - zod: 3.22.4 - dev: false - - /@cloudflare/kv-asset-handler@0.2.0: - resolution: {integrity: sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==} - dependencies: - mime: 3.0.0 - dev: true - - /@cloudflare/workerd-darwin-64@1.20231025.0: - resolution: {integrity: sha512-MYRYTbSl+tjGg6su7savlLIb8cOcKJfdGpA+WdtgqT2OF7O+89Lag0l1SA/iyVlUkT31Jc6OLHqvzsXgmg+niQ==} - engines: {node: '>=16'} - cpu: [x64] - os: [darwin] - requiresBuild: true - optional: true - - /@cloudflare/workerd-darwin-arm64@1.20231025.0: - resolution: {integrity: sha512-BszjtBDR84TVa6oWe74dePJSAukWlTmLw9zR4KeWuwZLJGV7RMm6AmwGStetjnwZrecZaaOFELfBCAHtsebV0Q==} - engines: {node: '>=16'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - optional: true - - /@cloudflare/workerd-linux-64@1.20231025.0: - resolution: {integrity: sha512-AT9dxgKXOa9xZxZ3k2a432axPJJ58KpoNWnPiPYGpuAuLoWnfcYwwh6mr9sZVcTdAdTAK9Xu9c81tp0YABanUw==} - engines: {node: '>=16'} - cpu: [x64] - os: [linux] - requiresBuild: true - optional: true - - /@cloudflare/workerd-linux-arm64@1.20231025.0: - resolution: {integrity: sha512-EIjex5o2k80YZWPix1btGybL/vNZ3o6vqKX9ptS0JcFkHV5aFX5/kcMwSBRjiIC+w04zVjmGQx3N1Vh3njuncg==} - engines: {node: '>=16'} - cpu: [arm64] - os: [linux] - requiresBuild: true - optional: true - - /@cloudflare/workerd-windows-64@1.20231025.0: - resolution: {integrity: sha512-7vtq0mO22A2v0OOsKXa760r9a84Gg8CK0gDu5uNWlj6hojmt011iz7jJt76I7oo/XrVwVlVfu69GnA3ljx6U8w==} - engines: {node: '>=16'} - cpu: [x64] - os: [win32] - requiresBuild: true - optional: true - - /@cloudflare/workers-types@4.20231025.0: - resolution: {integrity: sha512-TkcZkntUTOcvJ4vgmwpNfLTclpMbmbClZCe62B25/VTukmyv91joRa4eKzSjzCZUXTbFHNmVdOpmGaaJU2U3+A==} - - /@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-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-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-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-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-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-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-community/eslint-utils@4.4.0(eslint@8.53.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.53.0 - eslint-visitor-keys: 3.4.3 - - /@eslint-community/regexpp@4.10.0: - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - /@eslint/eslintrc@2.1.3: - resolution: {integrity: sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.6.1 - globals: 13.23.0 - ignore: 5.2.4 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - /@eslint/js@8.53.0: - resolution: {integrity: sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - /@fastify/busboy@2.0.0: - resolution: {integrity: sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==} - engines: {node: '>=14'} - - /@hono/swagger-ui@0.1.0(hono@3.9.2): - resolution: {integrity: sha512-W5WEEhk2QtiqdSfM40FcK98Q5Bz4H/NfNqBUSkcZ46ys+DG4wt1yGsmRZgdJMje6t5Vn8eFN+9nyO+/dAp3drA==} - peerDependencies: - hono: '*' - dependencies: - hono: 3.9.2 - dev: false - - /@hono/zod-openapi@0.8.3(hono@3.9.2)(zod@3.22.4): - resolution: {integrity: sha512-TwjSf63miIF3VBqNy4V6EOqZYdTQPeIQQ9Q2HjRWFYH9f2QtBFXziuqIg2Y76gNZ3WDal67NQXmbSErHiFR44g==} - engines: {node: '>=16.0.0'} - peerDependencies: - hono: '>=3.9.0' - zod: 3.* - dependencies: - '@asteasolutions/zod-to-openapi': 5.5.0(zod@3.22.4) - '@hono/zod-validator': 0.1.11(hono@3.9.2)(zod@3.22.4) - hono: 3.9.2 - zod: 3.22.4 - dev: false - - /@hono/zod-validator@0.1.11(hono@3.9.2)(zod@3.22.4): - resolution: {integrity: sha512-PQXeHUP0+36qpRt8yfeD7N2jbK3ETlGvSN6dMof/HwUC/APRokQRjpXZm4rrlG71Ft0aWE01+Bm4XejqPie5Uw==} - peerDependencies: - hono: '>=3.9.0' - zod: ^3.19.1 - dependencies: - hono: 3.9.2 - zod: 3.22.4 - dev: false - - /@humanwhocodes/config-array@0.11.13: - resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} - engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 2.0.1 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - /@humanwhocodes/object-schema@2.0.1: - resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} - - /@ioredis/commands@1.2.0: - resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} - dev: false - - /@libsql/client@0.3.6: - resolution: {integrity: sha512-3Mc4ZDI7X5ZLkMxX5XijiBeqhvyrny356lcj/KVVIeMXt9j6g4l+CRIsUvgcsyCAOUHqWqh0+TjI91bCKmdW+w==} - dependencies: - '@libsql/hrana-client': 0.5.5 - js-base64: 3.7.5 - libsql: 0.1.34 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - dev: false - - /@libsql/darwin-arm64@0.1.34: - resolution: {integrity: sha512-Wv8jvkj/fUAO8DF3A4HaddCMldUUpKcg/WW1sY95FNsSHOxktyxqU80jAp/tCuZ85GQIJozvgSr51/ARIC0gsw==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@libsql/darwin-x64@0.1.34: - resolution: {integrity: sha512-2NQXD9nUzC08hg7FdcZLq5uTEwGz1KbD7YvUzQb/psO1lO/E/p83wl1es1082+Pp0z5pSPDWQeRTuccD41L+3w==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@libsql/hrana-client@0.5.5: - resolution: {integrity: sha512-i+hDBpiV719poqEiHupUUZYKJ9YSbCRFe5Q2PQ0v3mHIftePH6gayLjp2u6TXbqbO/Dv6y8yyvYlBXf/kFfRZA==} - dependencies: - '@libsql/isomorphic-fetch': 0.1.10 - '@libsql/isomorphic-ws': 0.1.5 - js-base64: 3.7.5 - node-fetch: 3.3.2 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - dev: false - - /@libsql/isomorphic-fetch@0.1.10: - resolution: {integrity: sha512-dH0lMk50gKSvEKD78xWMu60SY1sjp1sY//iFLO0XMmBwfVfG136P9KOk06R4maBdlb8KMXOzJ1D28FR5ZKnHTA==} - dependencies: - '@types/node-fetch': 2.6.9 - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding - dev: false - - /@libsql/isomorphic-ws@0.1.5: - resolution: {integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==} - dependencies: - '@types/ws': 8.5.9 - ws: 8.14.2 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: false - - /@libsql/linux-arm64-gnu@0.1.34: - resolution: {integrity: sha512-r3dY1FDYZ7eX5HX7HyAoYSqK5FPugj5NSB5Bt/nz+ygBWdXASgSKxkE/RqjJIM59vXwv300iJX9qhR5fXv8sTw==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@libsql/linux-arm64-musl@0.1.34: - resolution: {integrity: sha512-9AE/eNb9eQRcNsLxqtpLJxVEoIMmItrdwqJDImPJtOp10rhp4U0x/9RGKerl9Mg3ObVj676pyhAR2KzyudrOfQ==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@libsql/linux-x64-gnu@0.1.34: - resolution: {integrity: sha512-o8toY1Txstjt13fBhZbFe8sNAW6OaS6qVcp1Bd6bHkCLSBLZ6pjJmwzQN8rFv9QFBPAnaKP3lI4vaOXXw7huTA==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@libsql/linux-x64-musl@0.1.34: - resolution: {integrity: sha512-EldEmcAxxNPSCjJ73oFxg81PDDIpDbPqK/QOrhmmGYLvYwrnQtVRUIbARf80JQvcy6bCxOO/Q9dh6wGhnyHyYA==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@libsql/win32-x64-msvc@0.1.34: - resolution: {integrity: sha512-jnv0qfVMnrVv00r+wUOe6DHrHuao9y1w1lN543cV2J1JdQNJT/eSZzhyZFSlS3T2ZUvXfZfZ5GeL8U18IAID6w==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@lucia-auth/adapter-session-unstorage@2.1.0(lucia@2.7.3)(unstorage@1.9.0): - resolution: {integrity: sha512-ItK7urZhLZv7UO99BcODjRhSAv58UPc+KQAmnkSvri2WBc22vFEjnjd/oWp3CZPdbbrJkuTvsuhFXH1ySBfOLg==} - peerDependencies: - lucia: ^2.0.0 - unstorage: ^1.9.0 - dependencies: - lucia: 2.7.3 - unstorage: 1.9.0 - dev: false - - /@lucia-auth/adapter-sqlite@2.0.1(@libsql/client@0.3.6)(better-sqlite3@9.1.1)(lucia@2.7.3): - resolution: {integrity: sha512-yc7XQ4X3sWG1gyUGHqaXipJIkmvB4MOgJypnSMWy7Vjhn3AOCM2xw51xTs+dGpLOQIn2Laomg9xpmDM2/9tgqQ==} - peerDependencies: - '@libsql/client': ^0.3.0 - better-sqlite3: 8.x - 9.x - lucia: ^2.0.0 - peerDependenciesMeta: - '@libsql/client': - optional: true - better-sqlite3: - optional: true - dependencies: - '@libsql/client': 0.3.6 - better-sqlite3: 9.1.1 - lucia: 2.7.3 - dev: false - - /@lucia-auth/oauth@3.4.0(lucia@2.7.3): - resolution: {integrity: sha512-3W4TaCiyUViXK2e2+VJo5324agvYz3102I2YKIttkGDKcevaNpLG3LgiR2rbemyF5UXFKiHgfFvRtKs/KDa9kw==} - peerDependencies: - lucia: ^2.0.0 - dependencies: - lucia: 2.7.3 - dev: false - - /@neon-rs/load@0.0.4: - resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==} - dev: false - - /@noble/hashes@1.3.2: - resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} - engines: {node: '>= 16'} - dev: false - - /@node-rs/argon2-android-arm-eabi@1.5.2: - resolution: {integrity: sha512-vVZec4ITr9GumAy0p8Zj8ozie362gtbZrTkLp9EqvuFZ/HrZzR09uS2IsDgm4mAstg/rc4A1gLRrHI8jDdbjkA==} - engines: {node: '>= 10'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-android-arm64@1.5.2: - resolution: {integrity: sha512-SwhnsXyrpgtWDTwYds1WUnxLA/kVP8HVaImYwQ3Wemqj1lkzcSoIaNyjNWkyrYGqO1tVc1YUrqsbd5eCHh+3sg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-darwin-arm64@1.5.2: - resolution: {integrity: sha512-+1ZMKiCCv2pip/o1Xg09piQru2LOIBPQ1vS4is86f55N3jjZnSfP+db5mYCSRuB0gRYqui98he7su7OGXlF4gQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-darwin-x64@1.5.2: - resolution: {integrity: sha512-mQ57mORlsxpfjcEsVpiHyHCOp6Ljrz/rVNWk8ihnPWw0qt0EqF1zbHRxTEPemL1iBHL9UyXpXrKS4JKq6xMn5w==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-freebsd-x64@1.5.2: - resolution: {integrity: sha512-UjKbFd3viYcpiwflkU4haEdNUMk1V2fVCJImWLWQns/hVval9BrDv5xsBwgdynbPHDlPOiWj816LBQwhWLGVWA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-arm-gnueabihf@1.5.2: - resolution: {integrity: sha512-36GJjJBnVuscV9CTn8RVDeJysnmIzr6Lp7QBCDczYHi6eKFuA8udCJb4SRyJqdvIuzycKG1RL56FbcFBJYCYIA==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-arm64-gnu@1.5.2: - resolution: {integrity: sha512-sE0ydb2gp6xC+5vbVz8l3paaiBbFQIB2Rwp5wx9MmKiYdTfcO5WkGeADuSgoFiTcSEz1RsHXqrdVy6j/LtSqtA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-arm64-musl@1.5.2: - resolution: {integrity: sha512-LhE0YHB0aJCwlbsQrwePik/KFWUc9qMriJIL5KiejK3bDoTVY4ihH587QT56JyaLvl3nBJaAV8l5yMqQdHnouA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-x64-gnu@1.5.2: - resolution: {integrity: sha512-MnKLiBlyg05pxvKXe3lNgBL9El9ThD74hvVEiWH1Xk40RRrJ507NCOWXVmQ0FDq1mjTeGFxbIvk+AcoF0NSLIQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-x64-musl@1.5.2: - resolution: {integrity: sha512-tzLgASY0Ng2OTW7Awwl9UWzjbWx8/uD6gXcZ/k/nYGSZE5Xp8EOD2NUqHLbK6KZE3775A0R25ShpiSxCadYqkg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-win32-arm64-msvc@1.5.2: - resolution: {integrity: sha512-vpTwSvv3oUXTpWZh0/HxdJ5wFMlmS7aVDwL4ATWepTZhMG4n+TO0+tVLdcPHCbg0oc6hCWBjWNPlSn9mW+YIgA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-win32-ia32-msvc@1.5.2: - resolution: {integrity: sha512-KPpZR15ui7uQWQXKmtaKyUQRs4UJdXnIIfiyFLGmLWCdEKlr3MtIGFt0fdziu4BF5ZObD8Ic6QvT0VXK4OJiww==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-win32-x64-msvc@1.5.2: - resolution: {integrity: sha512-/pGuwixJS8ZlpwhX9iM6g6JEeZYo1TtnNf8exwsOi7gxcUoTUfw5it+5GfbY/n+xRBz/DIU4bzUmXmh+7Gh0ug==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2@1.5.2: - resolution: {integrity: sha512-qq7wOSsdP2b4rXEapWNmsCjpaTGZWtp9kZmri98GYCDZqN8UJUG5zSue4XtYWWJMWKJVE/hkaIwk+BgN1ZUn0Q==} - engines: {node: '>= 10'} - optionalDependencies: - '@node-rs/argon2-android-arm-eabi': 1.5.2 - '@node-rs/argon2-android-arm64': 1.5.2 - '@node-rs/argon2-darwin-arm64': 1.5.2 - '@node-rs/argon2-darwin-x64': 1.5.2 - '@node-rs/argon2-freebsd-x64': 1.5.2 - '@node-rs/argon2-linux-arm-gnueabihf': 1.5.2 - '@node-rs/argon2-linux-arm64-gnu': 1.5.2 - '@node-rs/argon2-linux-arm64-musl': 1.5.2 - '@node-rs/argon2-linux-x64-gnu': 1.5.2 - '@node-rs/argon2-linux-x64-musl': 1.5.2 - '@node-rs/argon2-win32-arm64-msvc': 1.5.2 - '@node-rs/argon2-win32-ia32-msvc': 1.5.2 - '@node-rs/argon2-win32-x64-msvc': 1.5.2 - dev: false - - /@node-rs/bcrypt-android-arm-eabi@1.7.3: - resolution: {integrity: sha512-l53RuBqnqNvBN2jx09Ws6jpLmuQdSDx10n0GeaTfwh1svxsC8bPpVmxkfBExsT2Tu7KF38gTnPZvwsxysZQyPQ==} - engines: {node: '>= 10'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-android-arm64@1.7.3: - resolution: {integrity: sha512-TZpm4VbiViqDMvusrcYzLr1b1M5FDF0cDNiTUciLeBSsKtU5lNdEZGAU7gvCnrKoUWpGuOblHU7613zuB7SiNQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-darwin-arm64@1.7.3: - resolution: {integrity: sha512-SiUuAabynVsmixZMjh5xrn8w47EnV0HzbW9st4DPoVhn/wzdUcksIXDY75aoQG2EIzKLN8IGb+CIVnPGmRyhxw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-darwin-x64@1.7.3: - resolution: {integrity: sha512-R+81Z0eX4hZPvCXY5Z6l0l+JrTU3WcSYGHP0QYV9uwdaafOz6EhrCXUzZ02AIcAbNoVR8eucYVruq9PiasXoVw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-freebsd-x64@1.7.3: - resolution: {integrity: sha512-0pItU/5K3e83JjcJj9fZv+78txUoZ3hHCT7n/UMdu9mkpUzhX/rqb4jmQpJpD+UQoR76xp3qDo5RMgQBffBVNg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-arm-gnueabihf@1.7.3: - resolution: {integrity: sha512-HTSybWUjNe8rWuXkTkMeFDiQNHc6VioRcgv6AeHZphIxiT6dFbnhXNkfz4Hr0zxvyPhZ3NrYjT2AmPVFT6VW3Q==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-arm64-gnu@1.7.3: - resolution: {integrity: sha512-rWep6Y+v/c4bZHaM8LmSsrMwMmDR9wG4/q+3Z9VzR8xdnt5VCbuQdYWpf3sgGRGjTRdTBAdSK8x1reOjqsJ3Jg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-arm64-musl@1.7.3: - resolution: {integrity: sha512-TyWEKhxr+yfGcMKzVV/ARZw+Hrky2yl91bo0XYU2ZW6I6LDC0emNsXugdWjwz8ADI4OWhhrOjXD8GCilxiB2Rg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-x64-gnu@1.7.3: - resolution: {integrity: sha512-PofxM1Qg7tZKj1oP0I7tBTSSLr8Xc2uxx+P3pBCPmYzaBwWqGteNHJlF7n2q5xiH7YOlguH4w5CmcEjsiA3K4A==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-x64-musl@1.7.3: - resolution: {integrity: sha512-D5V6/dDVKP8S/ieDBLGhTn4oTo3upbrpWInynbhOMjJvPiIxVG1PiI3MXkWBtG9qtfleDk7gUkEKtAOxlIxDTQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-win32-arm64-msvc@1.7.3: - resolution: {integrity: sha512-b4gH2Yj5R4TwULrfMHd1Qqr+MrnFjVRUAJujDKPqi+PppSqezW8QF6DRSOL4GjnBmz5JEd64wxgeidvy7dsbGw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-win32-ia32-msvc@1.7.3: - resolution: {integrity: sha512-E91ro+ybI0RhNc89aGaZQGll0YhPoHr8JacoWrNKwhg9zwNOYeuO0tokdMZdm6nF0/8obll0Mq7wO9AXO9iffw==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-win32-x64-msvc@1.7.3: - resolution: {integrity: sha512-LO/p9yjPODj/pQvPnowBuwpDdqiyUXQbqL1xb1RSP3NoyCFAGmjL5h0plSQrhLh8hskQiozBRXNaQurtsM7o0Q==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt@1.7.3: - resolution: {integrity: sha512-BF6u9CBPUiyk1zU+5iwikezf+xM4MFSu5cmrrg/PLKffGgIM13ZsY6DHftcTraETB04ryasjM/5IejotH+sO5Q==} - engines: {node: '>= 10'} - optionalDependencies: - '@node-rs/bcrypt-android-arm-eabi': 1.7.3 - '@node-rs/bcrypt-android-arm64': 1.7.3 - '@node-rs/bcrypt-darwin-arm64': 1.7.3 - '@node-rs/bcrypt-darwin-x64': 1.7.3 - '@node-rs/bcrypt-freebsd-x64': 1.7.3 - '@node-rs/bcrypt-linux-arm-gnueabihf': 1.7.3 - '@node-rs/bcrypt-linux-arm64-gnu': 1.7.3 - '@node-rs/bcrypt-linux-arm64-musl': 1.7.3 - '@node-rs/bcrypt-linux-x64-gnu': 1.7.3 - '@node-rs/bcrypt-linux-x64-musl': 1.7.3 - '@node-rs/bcrypt-win32-arm64-msvc': 1.7.3 - '@node-rs/bcrypt-win32-ia32-msvc': 1.7.3 - '@node-rs/bcrypt-win32-x64-msvc': 1.7.3 - dev: false - - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 - - /@parcel/watcher-android-arm64@2.3.0: - resolution: {integrity: sha512-f4o9eA3dgk0XRT3XhB0UWpWpLnKgrh1IwNJKJ7UJek7eTYccQ8LR7XUWFKqw6aEq5KUNlCcGvSzKqSX/vtWVVA==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-darwin-arm64@2.3.0: - resolution: {integrity: sha512-mKY+oijI4ahBMc/GygVGvEdOq0L4DxhYgwQqYAz/7yPzuGi79oXrZG52WdpGA1wLBPrYb0T8uBaGFo7I6rvSKw==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-darwin-x64@2.3.0: - resolution: {integrity: sha512-20oBj8LcEOnLE3mgpy6zuOq8AplPu9NcSSSfyVKgfOhNAc4eF4ob3ldj0xWjGGbOF7Dcy1Tvm6ytvgdjlfUeow==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-freebsd-x64@2.3.0: - resolution: {integrity: sha512-7LftKlaHunueAEiojhCn+Ef2CTXWsLgTl4hq0pkhkTBFI3ssj2bJXmH2L67mKpiAD5dz66JYk4zS66qzdnIOgw==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-linux-arm-glibc@2.3.0: - resolution: {integrity: sha512-1apPw5cD2xBv1XIHPUlq0cO6iAaEUQ3BcY0ysSyD9Kuyw4MoWm1DV+W9mneWI+1g6OeP6dhikiFE6BlU+AToTQ==} - engines: {node: '>= 10.0.0'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-linux-arm64-glibc@2.3.0: - resolution: {integrity: sha512-mQ0gBSQEiq1k/MMkgcSB0Ic47UORZBmWoAWlMrTW6nbAGoLZP+h7AtUM7H3oDu34TBFFvjy4JCGP43JlylkTQA==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-linux-arm64-musl@2.3.0: - resolution: {integrity: sha512-LXZAExpepJew0Gp8ZkJ+xDZaTQjLHv48h0p0Vw2VMFQ8A+RKrAvpFuPVCVwKJCr5SE+zvaG+Etg56qXvTDIedw==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-linux-x64-glibc@2.3.0: - resolution: {integrity: sha512-P7Wo91lKSeSgMTtG7CnBS6WrA5otr1K7shhSjKHNePVmfBHDoAOHYRXgUmhiNfbcGk0uMCHVcdbfxtuiZCHVow==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-linux-x64-musl@2.3.0: - resolution: {integrity: sha512-+kiRE1JIq8QdxzwoYY+wzBs9YbJ34guBweTK8nlzLKimn5EQ2b2FSC+tAOpq302BuIMjyuUGvBiUhEcLIGMQ5g==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-wasm@2.3.0: - resolution: {integrity: sha512-ejBAX8H0ZGsD8lSICDNyMbSEtPMWgDL0WFCt/0z7hyf5v8Imz4rAM8xY379mBsECkq/Wdqa5WEDLqtjZ+6NxfA==} - engines: {node: '>= 10.0.0'} - dependencies: - is-glob: 4.0.3 - micromatch: 4.0.5 - napi-wasm: 1.1.0 - dev: false - bundledDependencies: - - napi-wasm - - /@parcel/watcher-win32-arm64@2.3.0: - resolution: {integrity: sha512-35gXCnaz1AqIXpG42evcoP2+sNL62gZTMZne3IackM+6QlfMcJLy3DrjuL6Iks7Czpd3j4xRBzez3ADCj1l7Aw==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-win32-ia32@2.3.0: - resolution: {integrity: sha512-FJS/IBQHhRpZ6PiCjFt1UAcPr0YmCLHRbTc00IBTrelEjlmmgIVLeOx4MSXzx2HFEy5Jo5YdhGpxCuqCyDJ5ow==} - engines: {node: '>= 10.0.0'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-win32-x64@2.3.0: - resolution: {integrity: sha512-dLx+0XRdMnVI62kU3wbXvbIRhLck4aE28bIGKbRGS7BJNt54IIj9+c/Dkqb+7DJEbHUZAX1bwaoM8PqVlHJmCA==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher@2.3.0: - resolution: {integrity: sha512-pW7QaFiL11O0BphO+bq3MgqeX/INAk9jgBldVDYjlQPO4VddoZnF22TcF9onMhnLVHuNqBJeRf+Fj7eezi/+rQ==} - engines: {node: '>= 10.0.0'} - dependencies: - detect-libc: 1.0.3 - is-glob: 4.0.3 - micromatch: 4.0.5 - node-addon-api: 7.0.0 - optionalDependencies: - '@parcel/watcher-android-arm64': 2.3.0 - '@parcel/watcher-darwin-arm64': 2.3.0 - '@parcel/watcher-darwin-x64': 2.3.0 - '@parcel/watcher-freebsd-x64': 2.3.0 - '@parcel/watcher-linux-arm-glibc': 2.3.0 - '@parcel/watcher-linux-arm64-glibc': 2.3.0 - '@parcel/watcher-linux-arm64-musl': 2.3.0 - '@parcel/watcher-linux-x64-glibc': 2.3.0 - '@parcel/watcher-linux-x64-musl': 2.3.0 - '@parcel/watcher-win32-arm64': 2.3.0 - '@parcel/watcher-win32-ia32': 2.3.0 - '@parcel/watcher-win32-x64': 2.3.0 - dev: false - - /@types/json-schema@7.0.15: - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - dev: false - - /@types/node-fetch@2.6.9: - resolution: {integrity: sha512-bQVlnMLFJ2d35DkPNjEPmd9ueO/rh5EiaZt2bhqiSarPjZIuIV6bPQVqcrEyvNo+AfTrRGVazle1tl597w3gfA==} - dependencies: - '@types/node': 20.9.0 - form-data: 4.0.0 - dev: false - - /@types/node-forge@1.3.9: - resolution: {integrity: sha512-meK88cx/sTalPSLSoCzkiUB4VPIFHmxtXm5FaaqRDqBX2i/Sy8bJ4odsan0b20RBjPh06dAQ+OTTdnyQyhJZyQ==} - dependencies: - '@types/node': 20.9.0 - dev: true - - /@types/node@20.9.0: - resolution: {integrity: sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==} - dependencies: - undici-types: 5.26.5 - - /@types/semver@7.5.5: - resolution: {integrity: sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==} - dev: false - - /@types/ws@8.5.9: - resolution: {integrity: sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg==} - dependencies: - '@types/node': 20.9.0 - dev: false - - /@typescript-eslint/eslint-plugin@6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.2.2): - resolution: {integrity: sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 6.10.0(eslint@8.53.0)(typescript@5.2.2) - '@typescript-eslint/scope-manager': 6.10.0 - '@typescript-eslint/type-utils': 6.10.0(eslint@8.53.0)(typescript@5.2.2) - '@typescript-eslint/utils': 6.10.0(eslint@8.53.0)(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 6.10.0 - debug: 4.3.4 - eslint: 8.53.0 - graphemer: 1.4.0 - ignore: 5.2.4 - natural-compare: 1.4.0 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.2.2): - resolution: {integrity: sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 6.10.0 - '@typescript-eslint/types': 6.10.0 - '@typescript-eslint/typescript-estree': 6.10.0(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 6.10.0 - debug: 4.3.4 - eslint: 8.53.0 - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/scope-manager@6.10.0: - resolution: {integrity: sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==} - engines: {node: ^16.0.0 || >=18.0.0} - dependencies: - '@typescript-eslint/types': 6.10.0 - '@typescript-eslint/visitor-keys': 6.10.0 - dev: false - - /@typescript-eslint/type-utils@6.10.0(eslint@8.53.0)(typescript@5.2.2): - resolution: {integrity: sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/typescript-estree': 6.10.0(typescript@5.2.2) - '@typescript-eslint/utils': 6.10.0(eslint@8.53.0)(typescript@5.2.2) - debug: 4.3.4 - eslint: 8.53.0 - ts-api-utils: 1.0.3(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/types@6.10.0: - resolution: {integrity: sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==} - engines: {node: ^16.0.0 || >=18.0.0} - dev: false - - /@typescript-eslint/typescript-estree@6.10.0(typescript@5.2.2): - resolution: {integrity: sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 6.10.0 - '@typescript-eslint/visitor-keys': 6.10.0 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/utils@6.10.0(eslint@8.53.0)(typescript@5.2.2): - resolution: {integrity: sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.5 - '@typescript-eslint/scope-manager': 6.10.0 - '@typescript-eslint/types': 6.10.0 - '@typescript-eslint/typescript-estree': 6.10.0(typescript@5.2.2) - eslint: 8.53.0 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - - typescript - dev: false - - /@typescript-eslint/visitor-keys@6.10.0: - resolution: {integrity: sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==} - engines: {node: ^16.0.0 || >=18.0.0} - dependencies: - '@typescript-eslint/types': 6.10.0 - eslint-visitor-keys: 3.4.3 - dev: false - - /@ungap/structured-clone@1.2.0: - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - - /acorn-jsx@5.3.2(acorn@8.11.2): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.11.2 - - /acorn-walk@8.3.0: - resolution: {integrity: sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==} - engines: {node: '>=0.4.0'} - - /acorn@8.11.2: - resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} - engines: {node: '>=0.4.0'} - hasBin: true - - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - /arch@2.2.0: - resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} - dev: false - - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: false - - /as-table@1.0.55: - resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} - dependencies: - printable-characters: 1.0.42 - - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: false - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - /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'} - - /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 - - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - /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==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: false - - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - - /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 - - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true - - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - /chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - dev: false - - /citty@0.1.4: - resolution: {integrity: sha512-Q3bK1huLxzQrvj7hImJ7Z1vKYJRPQCDnd0EjXfHMidcjecGOMuLrmuQmtWmFkuKLcMThlGh1yCKG8IEc6VeNXQ==} - dependencies: - consola: 3.2.3 - dev: false - - /cli-color@2.0.3: - resolution: {integrity: sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==} - engines: {node: '>=0.10'} - dependencies: - d: 1.0.1 - es5-ext: 0.10.62 - es6-iterator: 2.0.3 - memoizee: 0.4.15 - timers-ext: 0.1.7 - dev: true - - /clipboardy@3.0.0: - resolution: {integrity: sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - arch: 2.2.0 - execa: 5.1.1 - is-wsl: 2.2.0 - dev: false - - /cluster-key-slot@1.1.2: - resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} - engines: {node: '>=0.10.0'} - dev: false - - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - dependencies: - delayed-stream: 1.0.0 - dev: false - - /commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} - dev: true - - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - /consola@3.2.3: - resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} - engines: {node: ^14.18.0 || >=16.10.0} - dev: false - - /cookie-es@1.0.0: - resolution: {integrity: sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ==} - dev: false - - /cookie@0.5.0: - resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} - engines: {node: '>= 0.6'} - - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - /d@1.0.1: - resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} - 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==} - - /data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} - dev: false - - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - - /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==} - - /defu@6.1.3: - resolution: {integrity: sha512-Vy2wmG3NTkmHNg/kzpuvHhkqeIx3ODWqasgCRbKtbXEN0G+HpEEv9BtJLp7ZG1CZloFaC41Ah3ZFbq7aqCqMeQ==} - dev: false - - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dev: false - - /denque@2.1.0: - resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} - engines: {node: '>=0.10'} - dev: false - - /destr@2.0.2: - resolution: {integrity: sha512-65AlobnZMiCET00KaFFjUefxDX0khFA/E4myqZ7a6Sq1yZtR8+FVIvilVX66vF2uobSumxooYZChiRPCKNqhmg==} - dev: false - - /detect-libc@1.0.3: - resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} - engines: {node: '>=0.10'} - hasBin: true - dev: false - - /detect-libc@2.0.2: - resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} - engines: {node: '>=8'} - dev: false - - /difflib@0.2.4: - resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} - dependencies: - heap: 0.2.7 - dev: true - - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - dev: false - - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dependencies: - esutils: 2.0.3 - - /dotenv@16.3.1: - resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} - engines: {node: '>=12'} - dev: true - - /dreamopt@0.8.0: - resolution: {integrity: sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==} - engines: {node: '>=0.4.0'} - dependencies: - wordwrap: 1.0.0 - dev: true - - /drizzle-kit@0.20.1: - resolution: {integrity: sha512-W6YAFeT15LcirtAbFmfKOjN+p0EhTW+8KZaPqIEz0VpkBrq3GbBUtaoYWa7l8OLzlOBY54XPG2fa9j+iv3pQRQ==} - 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.15.0 - zod: 3.22.4 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - /drizzle-orm@0.29.0(@cloudflare/workers-types@4.20231025.0)(@libsql/client@0.3.6)(better-sqlite3@9.1.1)(mysql2@3.6.3): - 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: - '@cloudflare/workers-types': 4.20231025.0 - '@libsql/client': 0.3.6 - better-sqlite3: 9.1.1 - mysql2: 3.6.3 - dev: false - - /drizzle-zod@0.5.1(drizzle-orm@0.29.0)(zod@3.22.4): - resolution: {integrity: sha512-C/8bvzUH/zSnVfwdSibOgFjLhtDtbKYmkbPbUCq46QZyZCH6kODIMSOgZ8R7rVjoI+tCj3k06MRJMDqsIeoS4A==} - peerDependencies: - drizzle-orm: '>=0.23.13' - zod: '*' - dependencies: - drizzle-orm: 0.29.0(@cloudflare/workers-types@4.20231025.0)(@libsql/client@0.3.6)(better-sqlite3@9.1.1)(mysql2@3.6.3) - zod: 3.22.4 - dev: false - - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - dependencies: - once: 1.4.0 - dev: false - - /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 - - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - /eslint-config-google@0.14.0(eslint@8.53.0): - resolution: {integrity: sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==} - engines: {node: '>=0.10.0'} - peerDependencies: - eslint: '>=5.16.0' - dependencies: - eslint: 8.53.0 - dev: true - - /eslint-plugin-json@3.1.0: - resolution: {integrity: sha512-MrlG2ynFEHe7wDGwbUuFPsaT2b1uhuEFhJ+W1f1u+1C2EkXmTYJp4B1aAdQQ8M+CC3t//N/oRKiIVw14L2HR1g==} - engines: {node: '>=12.0'} - dependencies: - lodash: 4.17.21 - vscode-json-languageservice: 4.2.1 - dev: true - - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - /eslint@8.53.0: - resolution: {integrity: sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) - '@eslint-community/regexpp': 4.10.0 - '@eslint/eslintrc': 2.1.3 - '@eslint/js': 8.53.0 - '@humanwhocodes/config-array': 0.11.13 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.23.0 - graphemer: 1.4.0 - ignore: 5.2.4 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.3 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - acorn: 8.11.2 - acorn-jsx: 5.3.2(acorn@8.11.2) - eslint-visitor-keys: 3.4.3 - - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} - dependencies: - estraverse: 5.3.0 - - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - dependencies: - estraverse: 5.3.0 - - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - /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'} - - /event-emitter@0.3.5: - resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} - dependencies: - d: 1.0.1 - es5-ext: 0.10.62 - dev: true - - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: false - - /exit-hook@2.2.1: - resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} - engines: {node: '>=6'} - - /expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} - 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==} - - /fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: false - - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} - dependencies: - reusify: 1.0.4 - - /fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 3.2.1 - dev: false - - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flat-cache: 3.1.1 - - /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'} - dependencies: - to-regex-range: 5.0.1 - - /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 - - /flat-cache@3.1.1: - resolution: {integrity: sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==} - engines: {node: '>=12.0.0'} - dependencies: - flatted: 3.2.9 - keyv: 4.5.4 - rimraf: 3.0.2 - - /flatted@3.2.9: - resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} - - /form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: false - - /formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} - dependencies: - fetch-blob: 3.2.0 - dev: false - - /fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - dev: false - - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - optional: true - - /generate-function@2.3.1: - resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} - dependencies: - is-property: 1.0.2 - dev: false - - /get-port-please@3.1.1: - resolution: {integrity: sha512-3UBAyM3u4ZBVYDsxOQfJDxEa6XTbpBDrOjp4mf7ExFRt5BKs/QywQQiJsh2B+hxcZLSapWqCRvElUe8DnKcFHA==} - dev: false - - /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 - - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: false - - /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'} - dependencies: - is-glob: 4.0.3 - - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - dependencies: - is-glob: 4.0.3 - - /glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - /glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - dev: true - - /globals@13.23.0: - resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.20.2 - - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 3.0.0 - dev: false - - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - - /h3@1.8.2: - resolution: {integrity: sha512-1Ca0orJJlCaiFY68BvzQtP2lKLk46kcLAxVM8JgYbtm2cUg6IY7pjpYgWMwUvDO9QI30N5JAukOKoT8KD3Q0PQ==} - dependencies: - cookie-es: 1.0.0 - defu: 6.1.3 - destr: 2.0.2 - iron-webcrypto: 0.10.1 - radix3: 1.1.0 - ufo: 1.3.1 - uncrypto: 0.1.3 - unenv: 1.7.4 - dev: false - - /hanji@0.0.5: - resolution: {integrity: sha512-Abxw1Lq+TnYiL4BueXqMau222fPSPMFtya8HdpWsz/xVAhifXou71mPh/kY2+08RgFcVccjG3uZHs6K5HAe3zw==} - dependencies: - lodash.throttle: 4.1.1 - sisteransi: 1.0.5 - dev: true - - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - /heap@0.2.7: - resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} - dev: true - - /hono@3.9.2: - resolution: {integrity: sha512-180NOiMadqU3lGmN6ajPDZvZPWus3a9mtVaAUR9uG0SImngBwRLA8vbnV0oUfUAgFT4nX55sGV9dVA06OuikHA==} - engines: {node: '>=16.0.0'} - dev: false - - /http-shutdown@1.2.2: - resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - dev: false - - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - dev: false - - /husky@8.0.3: - resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} - engines: {node: '>=14'} - hasBin: true - dev: true - - /iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - 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@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} - engines: {node: '>= 4'} - - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: false - - /ioredis@5.3.2: - resolution: {integrity: sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==} - engines: {node: '>=12.22.0'} - dependencies: - '@ioredis/commands': 1.2.0 - cluster-key-slot: 1.1.2 - debug: 4.3.4 - denque: 2.1.0 - lodash.defaults: 4.2.0 - lodash.isarguments: 3.1.0 - redis-errors: 1.2.0 - redis-parser: 3.0.0 - standard-as-callback: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: false - - /iron-webcrypto@0.10.1: - resolution: {integrity: sha512-QGOS8MRMnj/UiOa+aMIgfyHcvkhqNUsUxb1XzskENvbo+rEfp6TOwqd1KPuDzXC4OnGHcMSVxDGRoilqB8ViqA==} - dev: false - - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - dependencies: - binary-extensions: 2.2.0 - - /is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - dev: false - - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - - /is-promise@2.2.2: - resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} - dev: true - - /is-property@1.0.2: - resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} - dev: false - - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: false - - /is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - dependencies: - is-docker: 2.2.1 - dev: false - - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - /jiti@1.21.0: - resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} - hasBin: true - dev: false - - /js-base64@3.7.5: - resolution: {integrity: sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==} - dev: false - - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - dependencies: - argparse: 2.0.1 - - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - - /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-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - dependencies: - json-buffer: 3.0.1 - - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - - /libsql@0.1.34: - resolution: {integrity: sha512-LGofp7z7gi1Td6vu2GxaA4WyvSPEkuFn0f/ePSti1TsAlBU0LWxdk+bj9D8nqswzxiqe5wpAyTLhVzTIYSyXEA==} - cpu: [x64, arm64] - os: [darwin, linux, win32] - dependencies: - '@neon-rs/load': 0.0.4 - detect-libc: 2.0.2 - optionalDependencies: - '@libsql/darwin-arm64': 0.1.34 - '@libsql/darwin-x64': 0.1.34 - '@libsql/linux-arm64-gnu': 0.1.34 - '@libsql/linux-arm64-musl': 0.1.34 - '@libsql/linux-x64-gnu': 0.1.34 - '@libsql/linux-x64-musl': 0.1.34 - '@libsql/win32-x64-msvc': 0.1.34 - dev: false - - /listhen@1.5.5: - resolution: {integrity: sha512-LXe8Xlyh3gnxdv4tSjTjscD1vpr/2PRpzq8YIaMJgyKzRG8wdISlWVWnGThJfHnlJ6hmLt2wq1yeeix0TEbuoA==} - hasBin: true - dependencies: - '@parcel/watcher': 2.3.0 - '@parcel/watcher-wasm': 2.3.0 - citty: 0.1.4 - clipboardy: 3.0.0 - consola: 3.2.3 - defu: 6.1.3 - get-port-please: 3.1.1 - h3: 1.8.2 - http-shutdown: 1.2.2 - jiti: 1.21.0 - mlly: 1.4.2 - node-forge: 1.3.1 - pathe: 1.1.1 - std-env: 3.4.3 - ufo: 1.3.1 - untun: 0.1.2 - uqr: 0.1.2 - dev: false - - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - dependencies: - p-locate: 5.0.0 - - /lodash.defaults@4.2.0: - resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} - dev: false - - /lodash.isarguments@3.1.0: - resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} - dev: false - - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - - /lodash.throttle@4.1.1: - resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} - dev: true - - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: true - - /long@5.2.3: - resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} - dev: false - - /lru-cache@10.0.1: - resolution: {integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==} - engines: {node: 14 || >=16.14} - dev: false - - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - dev: false - - /lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} - dev: false - - /lru-cache@8.0.5: - resolution: {integrity: sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==} - engines: {node: '>=16.14'} - dev: false - - /lru-queue@0.1.0: - resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} - dependencies: - es5-ext: 0.10.62 - dev: true - - /lucia@2.7.3: - resolution: {integrity: sha512-fzwwsZcijdQmS116J2odQZj/fb8SYXUI2rRWz84gZqkbpX9QAS4m72qlFzsPDv1YXJHNRhYUQCvQl3EKgt3OgA==} - dependencies: - '@noble/hashes': 1.3.2 - nanoid: 5.0.1 - dev: false - - /magic-string@0.25.9: - resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} - dependencies: - sourcemap-codec: 1.4.8 - dev: true - - /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-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: false - - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: false - - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - dev: false - - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - dev: false - - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - 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: false - - /mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - dev: false - - /miniflare@3.20231025.0: - resolution: {integrity: sha512-pFcr2BRaGIQ26UfdDo8BMJ6kkd/Jo/FkQ/4K7UG/eORlDepsLrR/sTJddcSSIGl07MA+MGjhzopFTPpFskkS+g==} - engines: {node: '>=16.13'} - 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.20231025.0 - ws: 8.14.2 - youch: 3.3.3 - zod: 3.22.4 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - /miniflare@3.20231025.1: - resolution: {integrity: sha512-zwvu/f6eivBBF2shuom5DibnZjGSxt6FiC8sZlj+CcqTRss1D2ZHYD09odhAZLY9DYXE0orBFkJKnIDx/QmYdQ==} - engines: {node: '>=16.13'} - 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.20231025.0 - ws: 8.14.2 - youch: 3.3.3 - zod: 3.22.4 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: false - - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 - - /minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - dev: true - - /minimatch@7.4.6: - resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - dev: true - - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: false - - /mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - dev: false - - /mlly@1.4.2: - resolution: {integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==} - dependencies: - acorn: 8.11.2 - pathe: 1.1.1 - pkg-types: 1.0.3 - ufo: 1.3.1 - dev: false - - /mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} - dev: false - - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - /mustache@4.2.0: - resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} - hasBin: true - - /mysql2@3.6.3: - resolution: {integrity: sha512-qYd/1CDuW1KYZjD4tzg2O8YS3X/UWuGH8ZMHyMeggMTXL3yOdMisbwZ5SNkHzDGlZXKYLAvV8tMrEH+NUMz3fw==} - engines: {node: '>= 8.0'} - dependencies: - denque: 2.1.0 - generate-function: 2.3.1 - iconv-lite: 0.6.3 - long: 5.2.3 - lru-cache: 8.0.5 - named-placeholders: 1.1.3 - seq-queue: 0.0.5 - sqlstring: 2.3.3 - dev: false - - /named-placeholders@1.1.3: - resolution: {integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==} - engines: {node: '>=12.0.0'} - dependencies: - lru-cache: 7.18.3 - dev: false - - /nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: true - - /nanoid@5.0.1: - resolution: {integrity: sha512-vWeVtV5Cw68aML/QaZvqN/3QQXc6fBfIieAlu05m7FZW2Dgb+3f0xc0TTxuJW+7u30t7iSDTV/j3kVI0oJqIfQ==} - engines: {node: ^18 || >=20} - hasBin: true - dev: false - - /napi-build-utils@1.0.2: - resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} - dev: false - - /napi-wasm@1.1.0: - resolution: {integrity: sha512-lHwIAJbmLSjF9VDRm9GoVOy9AGp3aIvkjv+Kvz9h16QR3uSVYH78PNQUnT2U4X53mhlnV2M7wrhibQ3GHicDmg==} - dev: false - - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - - /next-tick@1.1.0: - resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - dev: true - - /node-abi@3.51.0: - resolution: {integrity: sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA==} - engines: {node: '>=10'} - dependencies: - semver: 7.5.4 - dev: false - - /node-addon-api@7.0.0: - resolution: {integrity: sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==} - dev: false - - /node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} - dev: false - - /node-fetch-native@1.4.1: - resolution: {integrity: sha512-NsXBU0UgBxo2rQLOeWNZqS3fvflWePMECr8CoSWoSTqCqGbVVsvl9vZu1HfQicYN0g5piV9Gh8RTEvo/uP752w==} - dev: false - - /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-fetch@3.3.2: - resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - data-uri-to-buffer: 4.0.1 - fetch-blob: 3.2.0 - formdata-polyfill: 4.0.10 - dev: false - - /node-forge@1.3.1: - resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} - engines: {node: '>= 6.13.0'} - - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - dependencies: - path-key: 3.1.1 - dev: false - - /ofetch@1.3.3: - resolution: {integrity: sha512-s1ZCMmQWXy4b5K/TW9i/DtiN8Ku+xCiHcjQ6/J/nDdssirrQNOoB165Zu8EqLMA2lln1JUth9a0aW9Ap2ctrUg==} - dependencies: - destr: 2.0.2 - node-fetch-native: 1.4.1 - ufo: 1.3.1 - dev: false - - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - dependencies: - mimic-fn: 2.1.0 - dev: false - - /openapi3-ts@4.1.2: - resolution: {integrity: sha512-B7gOkwsYMZO7BZXwJzXCuVagym2xhqsrilVvV0dnq2Di4+iLUXKVX9gOK23ZqaAHZOwABXN0QTdW8QnkUTX6DA==} - dependencies: - yaml: 2.3.4 - dev: false - - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} - dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - - /oslo@0.22.0: - resolution: {integrity: sha512-PSnp+rDJgL3FKvrg+qtxblzCkkUQslYWH5ljSrhX5ibc3p3NqXOfe/LzMCAJ2sqp0nlNEDg2TKCeui4buWt/Tw==} - dependencies: - '@node-rs/argon2': 1.5.2 - '@node-rs/bcrypt': 1.7.3 - dev: false - - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - dependencies: - yocto-queue: 0.1.0 - - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - dependencies: - p-limit: 3.1.0 - - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - dependencies: - callsites: 3.1.0 - - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - /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'} - dev: false - - /pathe@1.1.1: - resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} - dev: false - - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - /pkg-types@1.0.3: - resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} - dependencies: - jsonc-parser: 3.2.0 - mlly: 1.4.2 - pathe: 1.1.1 - dev: false - - /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 - - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - - /prettier@3.0.3: - resolution: {integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==} - engines: {node: '>=14'} - hasBin: true - dev: false - - /printable-characters@1.0.42: - resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} - - /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'} - - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - /radix3@1.1.0: - resolution: {integrity: sha512-pNsHDxbGORSvuSScqNJ+3Km6QAVqk8CfsCBIEoDgpqLrkD2f3QM4I7d1ozJJ172OmIcoUcerZaNWqtLkRXTV3A==} - dev: false - - /rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - dev: false - - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - dev: false - - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - - /redis-errors@1.2.0: - resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} - engines: {node: '>=4'} - dev: false - - /redis-parser@3.0.0: - resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} - engines: {node: '>=4'} - dependencies: - redis-errors: 1.2.0 - dev: false - - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - - /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'} - dev: true - - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true - dependencies: - glob: 7.2.3 - - /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. - 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 - dev: true - - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - dependencies: - queue-microtask: 1.2.3 - - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: false - - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: false - - /selfsigned@2.4.1: - resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} - engines: {node: '>=10'} - dependencies: - '@types/node-forge': 1.3.9 - node-forge: 1.3.1 - dev: true - - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: false - - /seq-queue@0.0.5: - resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==} - dev: false - - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: false - - /simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - dev: false - - /simple-get@4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 - 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: false - - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - /sourcemap-codec@1.4.8: - resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} - deprecated: Please use @jridgewell/sourcemap-codec instead - dev: true - - /sqlstring@2.3.3: - resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} - engines: {node: '>= 0.6'} - dev: false - - /stacktracey@2.1.8: - resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==} - dependencies: - as-table: 1.0.55 - get-source: 2.0.12 - - /standard-as-callback@2.1.0: - resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} - dev: false - - /std-env@3.4.3: - resolution: {integrity: sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==} - dev: false - - /stoppable@1.1.0: - resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} - engines: {node: '>=4', npm: '>=6'} - - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - dependencies: - safe-buffer: 5.2.1 - dev: false - - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: false - - /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'} - - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - - /tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.0 - tar-stream: 2.2.0 - dev: false - - /tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - 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 - - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - - /timers-ext@0.1.7: - resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==} - dependencies: - es5-ext: 0.10.62 - next-tick: 1.1.0 - dev: true - - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - dev: false - - /ts-api-utils@1.0.3(typescript@5.2.2): - resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} - engines: {node: '>=16.13.0'} - peerDependencies: - typescript: '>=4.2.0' - dependencies: - typescript: 5.2.2 - dev: false - - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - - /tsx@4.0.0: - resolution: {integrity: sha512-jd3C5kw9tR68gtvqHUYo/2IwxaA46/CyKvcVQ4DsKRAPb19/vWgl7zF9mYNjFRY6KcGKiwne41RU91ll31IggQ==} - engines: {node: '>=18.0.0'} - hasBin: true - dependencies: - esbuild: 0.18.20 - get-tsconfig: 4.7.2 - source-map-support: 0.5.21 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - dependencies: - safe-buffer: 5.2.1 - dev: false - - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - - /type@1.2.0: - resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} - dev: true - - /type@2.7.2: - resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} - dev: true - - /typescript@5.2.2: - resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} - engines: {node: '>=14.17'} - hasBin: true - - /ufo@1.3.1: - resolution: {integrity: sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==} - dev: false - - /uncrypto@0.1.3: - resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} - dev: false - - /undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - - /undici@5.27.2: - resolution: {integrity: sha512-iS857PdOEy/y3wlM3yRp+6SNQQ6xU0mmZcwRSriqk+et/cwWAtwmIGf6WkoDN2EK/AMdCO/dfXzIwi+rFMrjjQ==} - engines: {node: '>=14.0'} - dependencies: - '@fastify/busboy': 2.0.0 - - /unenv@1.7.4: - resolution: {integrity: sha512-fjYsXYi30It0YCQYqLOcT6fHfMXsBr2hw9XC7ycf8rTG7Xxpe3ZssiqUnD0khrjiZEmkBXWLwm42yCSCH46fMw==} - dependencies: - consola: 3.2.3 - defu: 6.1.3 - mime: 3.0.0 - node-fetch-native: 1.4.1 - pathe: 1.1.1 - dev: false - - /unstorage@1.9.0: - resolution: {integrity: sha512-VpD8ZEYc/le8DZCrny3bnqKE4ZjioQxBRnWE+j5sGNvziPjeDlaS1NaFFHzl/kkXaO3r7UaF8MGQrs14+1B4pQ==} - peerDependencies: - '@azure/app-configuration': ^1.4.1 - '@azure/cosmos': ^3.17.3 - '@azure/data-tables': ^13.2.2 - '@azure/identity': ^3.2.3 - '@azure/keyvault-secrets': ^4.7.0 - '@azure/storage-blob': ^12.14.0 - '@capacitor/preferences': ^5.0.0 - '@planetscale/database': ^1.8.0 - '@upstash/redis': ^1.22.0 - '@vercel/kv': ^0.2.2 - idb-keyval: ^6.2.1 - peerDependenciesMeta: - '@azure/app-configuration': - optional: true - '@azure/cosmos': - optional: true - '@azure/data-tables': - optional: true - '@azure/identity': - optional: true - '@azure/keyvault-secrets': - optional: true - '@azure/storage-blob': - optional: true - '@capacitor/preferences': - optional: true - '@planetscale/database': - optional: true - '@upstash/redis': - optional: true - '@vercel/kv': - optional: true - idb-keyval: - optional: true - dependencies: - anymatch: 3.1.3 - chokidar: 3.5.3 - destr: 2.0.2 - h3: 1.8.2 - ioredis: 5.3.2 - listhen: 1.5.5 - lru-cache: 10.0.1 - mri: 1.2.0 - node-fetch-native: 1.4.1 - ofetch: 1.3.3 - ufo: 1.3.1 - transitivePeerDependencies: - - supports-color - dev: false - - /untun@0.1.2: - resolution: {integrity: sha512-wLAMWvxfqyTiBODA1lg3IXHQtjggYLeTK7RnSfqtOXixWJ3bAa2kK/HHmOOg19upteqO3muLvN6O/icbyQY33Q==} - hasBin: true - dependencies: - citty: 0.1.4 - consola: 3.2.3 - pathe: 1.1.1 - dev: false - - /uqr@0.1.2: - resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==} - dev: false - - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - dependencies: - punycode: 2.3.1 - - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: false - - /uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - hasBin: true - dev: false - - /vscode-json-languageservice@4.2.1: - resolution: {integrity: sha512-xGmv9QIWs2H8obGbWg+sIPI/3/pFgj/5OWBhNzs00BkYQ9UaB2F6JJaGB/2/YOZJ3BvLXQTC4Q7muqU25QgAhA==} - dependencies: - jsonc-parser: 3.2.0 - vscode-languageserver-textdocument: 1.0.11 - vscode-languageserver-types: 3.17.5 - vscode-nls: 5.2.0 - vscode-uri: 3.0.8 - dev: true - - /vscode-languageserver-textdocument@1.0.11: - resolution: {integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==} - dev: true - - /vscode-languageserver-types@3.17.5: - resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} - dev: true - - /vscode-nls@5.2.0: - resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==} - dev: true - - /vscode-uri@3.0.8: - resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} - dev: true - - /web-streams-polyfill@3.2.1: - resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} - engines: {node: '>= 8'} - dev: false - - /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@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - - /wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - dev: true - - /workerd@1.20231025.0: - resolution: {integrity: sha512-W1PFtpMFfvmm+ozBf+u70TE3Pviv7WA4qzDeejHDC4z+PFDq4+3KJCkgffaGBO86h+akWO0hSsc0uXL2zAqofQ==} - engines: {node: '>=16'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20231025.0 - '@cloudflare/workerd-darwin-arm64': 1.20231025.0 - '@cloudflare/workerd-linux-64': 1.20231025.0 - '@cloudflare/workerd-linux-arm64': 1.20231025.0 - '@cloudflare/workerd-windows-64': 1.20231025.0 - - /wrangler@3.15.0: - resolution: {integrity: sha512-kxzK62rD+LRrDeZZzw8cP6FBub71vJCbfAAb594XobXajgXYh3pFjv18Vm8YLxHzoGMhmAOJPA5b4DHq4HEUCw==} - engines: {node: '>=16.17.0'} - hasBin: true - 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.20231025.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 - dev: true - - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - /ws@8.14.2: - resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - /xxhash-wasm@1.0.2: - resolution: {integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==} - dev: true - - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: false - - /yaml@2.3.4: - resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} - engines: {node: '>= 14'} - dev: false - - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - - /youch@3.3.3: - resolution: {integrity: sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==} - dependencies: - cookie: 0.5.0 - mustache: 4.2.0 - stacktracey: 2.1.8 - - /zod@3.22.4: - resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + /generate-function@2.3.1: + resolution: + { + integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==, + } + dependencies: + is-property: 1.0.2 + dev: false + + /get-port-please@3.1.1: + resolution: + { + integrity: sha512-3UBAyM3u4ZBVYDsxOQfJDxEa6XTbpBDrOjp4mf7ExFRt5BKs/QywQQiJsh2B+hxcZLSapWqCRvElUe8DnKcFHA==, + } + dev: false + + /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 + + /get-stream@6.0.1: + resolution: + { + integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==, + } + engines: { node: ">=10" } + dev: false + + /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" } + dependencies: + is-glob: 4.0.3 + + /glob-parent@6.0.2: + resolution: + { + integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, + } + engines: { node: ">=10.13.0" } + dependencies: + is-glob: 4.0.3 + + /glob-to-regexp@0.4.1: + resolution: + { + integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==, + } + + /glob@7.2.3: + resolution: + { + integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, + } + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /glob@8.1.0: + resolution: + { + integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==, + } + engines: { node: ">=12" } + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + dev: true + + /globals@13.23.0: + resolution: + { + integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==, + } + engines: { node: ">=8" } + dependencies: + type-fest: 0.20.2 + + /globby@11.1.0: + resolution: + { + integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, + } + engines: { node: ">=10" } + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: false + + /graphemer@1.4.0: + resolution: + { + integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, + } + + /h3@1.8.2: + resolution: + { + integrity: sha512-1Ca0orJJlCaiFY68BvzQtP2lKLk46kcLAxVM8JgYbtm2cUg6IY7pjpYgWMwUvDO9QI30N5JAukOKoT8KD3Q0PQ==, + } + dependencies: + cookie-es: 1.0.0 + defu: 6.1.3 + destr: 2.0.2 + iron-webcrypto: 0.10.1 + radix3: 1.1.0 + ufo: 1.3.1 + uncrypto: 0.1.3 + unenv: 1.7.4 + dev: false + + /hanji@0.0.5: + resolution: + { + integrity: sha512-Abxw1Lq+TnYiL4BueXqMau222fPSPMFtya8HdpWsz/xVAhifXou71mPh/kY2+08RgFcVccjG3uZHs6K5HAe3zw==, + } + dependencies: + lodash.throttle: 4.1.1 + sisteransi: 1.0.5 + dev: true + + /has-flag@4.0.0: + resolution: + { + integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, + } + engines: { node: ">=8" } + + /heap@0.2.7: + resolution: + { + integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==, + } + dev: true + + /hono@3.9.2: + resolution: + { + integrity: sha512-180NOiMadqU3lGmN6ajPDZvZPWus3a9mtVaAUR9uG0SImngBwRLA8vbnV0oUfUAgFT4nX55sGV9dVA06OuikHA==, + } + engines: { node: ">=16.0.0" } + dev: false + + /http-shutdown@1.2.2: + resolution: + { + integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==, + } + engines: { iojs: ">= 1.0.0", node: ">= 0.12.0" } + dev: false + + /human-signals@2.1.0: + resolution: + { + integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==, + } + engines: { node: ">=10.17.0" } + dev: false + + /husky@8.0.3: + resolution: + { + integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==, + } + engines: { node: ">=14" } + hasBin: true + dev: true + + /iconv-lite@0.6.3: + resolution: + { + integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, + } + 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@5.2.4: + resolution: + { + integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==, + } + engines: { node: ">= 4" } + + /import-fresh@3.3.0: + resolution: + { + integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, + } + engines: { node: ">=6" } + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + /imurmurhash@0.1.4: + resolution: + { + integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, + } + engines: { node: ">=0.8.19" } + + /inflight@1.0.6: + resolution: + { + integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, + } + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits@2.0.4: + resolution: + { + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, + } + + /ini@1.3.8: + resolution: + { + integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, + } + dev: false + + /ioredis@5.3.2: + resolution: + { + integrity: sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==, + } + engines: { node: ">=12.22.0" } + dependencies: + "@ioredis/commands": 1.2.0 + cluster-key-slot: 1.1.2 + debug: 4.3.4 + denque: 2.1.0 + lodash.defaults: 4.2.0 + lodash.isarguments: 3.1.0 + redis-errors: 1.2.0 + redis-parser: 3.0.0 + standard-as-callback: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /iron-webcrypto@0.10.1: + resolution: + { + integrity: sha512-QGOS8MRMnj/UiOa+aMIgfyHcvkhqNUsUxb1XzskENvbo+rEfp6TOwqd1KPuDzXC4OnGHcMSVxDGRoilqB8ViqA==, + } + dev: false + + /is-binary-path@2.1.0: + resolution: + { + integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, + } + engines: { node: ">=8" } + dependencies: + binary-extensions: 2.2.0 + + /is-docker@2.2.1: + resolution: + { + integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==, + } + engines: { node: ">=8" } + hasBin: true + dev: false + + /is-extglob@2.1.1: + resolution: + { + integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, + } + engines: { node: ">=0.10.0" } + + /is-glob@4.0.3: + resolution: + { + integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, + } + engines: { node: ">=0.10.0" } + dependencies: + is-extglob: 2.1.1 + + /is-number@7.0.0: + resolution: + { + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, + } + engines: { node: ">=0.12.0" } + + /is-path-inside@3.0.3: + resolution: + { + integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, + } + engines: { node: ">=8" } + + /is-promise@2.2.2: + resolution: + { + integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==, + } + dev: true + + /is-property@1.0.2: + resolution: + { + integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==, + } + dev: false + + /is-stream@2.0.1: + resolution: + { + integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, + } + engines: { node: ">=8" } + dev: false + + /is-wsl@2.2.0: + resolution: + { + integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==, + } + engines: { node: ">=8" } + dependencies: + is-docker: 2.2.1 + dev: false + + /isexe@2.0.0: + resolution: + { + integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, + } + + /jiti@1.21.0: + resolution: + { + integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==, + } + hasBin: true + dev: false + + /js-base64@3.7.5: + resolution: + { + integrity: sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==, + } + dev: false + + /js-yaml@4.1.0: + resolution: + { + integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, + } + hasBin: true + dependencies: + argparse: 2.0.1 + + /json-buffer@3.0.1: + resolution: + { + integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, + } + + /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-schema-traverse@0.4.1: + resolution: + { + integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, + } + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: + { + integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, + } + + /jsonc-parser@3.2.0: + resolution: + { + integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==, + } + + /keyv@4.5.4: + resolution: + { + integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, + } + dependencies: + json-buffer: 3.0.1 + + /levn@0.4.1: + resolution: + { + integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, + } + engines: { node: ">= 0.8.0" } + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + /libsql@0.1.34: + resolution: + { + integrity: sha512-LGofp7z7gi1Td6vu2GxaA4WyvSPEkuFn0f/ePSti1TsAlBU0LWxdk+bj9D8nqswzxiqe5wpAyTLhVzTIYSyXEA==, + } + cpu: [x64, arm64] + os: [darwin, linux, win32] + dependencies: + "@neon-rs/load": 0.0.4 + detect-libc: 2.0.2 + optionalDependencies: + "@libsql/darwin-arm64": 0.1.34 + "@libsql/darwin-x64": 0.1.34 + "@libsql/linux-arm64-gnu": 0.1.34 + "@libsql/linux-arm64-musl": 0.1.34 + "@libsql/linux-x64-gnu": 0.1.34 + "@libsql/linux-x64-musl": 0.1.34 + "@libsql/win32-x64-msvc": 0.1.34 + dev: false + + /listhen@1.5.5: + resolution: + { + integrity: sha512-LXe8Xlyh3gnxdv4tSjTjscD1vpr/2PRpzq8YIaMJgyKzRG8wdISlWVWnGThJfHnlJ6hmLt2wq1yeeix0TEbuoA==, + } + hasBin: true + dependencies: + "@parcel/watcher": 2.3.0 + "@parcel/watcher-wasm": 2.3.0 + citty: 0.1.4 + clipboardy: 3.0.0 + consola: 3.2.3 + defu: 6.1.3 + get-port-please: 3.1.1 + h3: 1.8.2 + http-shutdown: 1.2.2 + jiti: 1.21.0 + mlly: 1.4.2 + node-forge: 1.3.1 + pathe: 1.1.1 + std-env: 3.4.3 + ufo: 1.3.1 + untun: 0.1.2 + uqr: 0.1.2 + dev: false + + /locate-path@6.0.0: + resolution: + { + integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, + } + engines: { node: ">=10" } + dependencies: + p-locate: 5.0.0 + + /lodash.defaults@4.2.0: + resolution: + { + integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==, + } + dev: false + + /lodash.isarguments@3.1.0: + resolution: + { + integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==, + } + dev: false + + /lodash.merge@4.6.2: + resolution: + { + integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, + } + + /lodash.throttle@4.1.1: + resolution: + { + integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==, + } + dev: true + + /lodash@4.17.21: + resolution: + { + integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, + } + dev: true + + /long@5.2.3: + resolution: + { + integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==, + } + dev: false + + /lru-cache@10.0.1: + resolution: + { + integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==, + } + engines: { node: 14 || >=16.14 } + dev: false + + /lru-cache@6.0.0: + resolution: + { + integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, + } + engines: { node: ">=10" } + dependencies: + yallist: 4.0.0 + dev: false + + /lru-cache@7.18.3: + resolution: + { + integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==, + } + engines: { node: ">=12" } + dev: false + + /lru-cache@8.0.5: + resolution: + { + integrity: sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==, + } + engines: { node: ">=16.14" } + dev: false + + /lru-queue@0.1.0: + resolution: + { + integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==, + } + dependencies: + es5-ext: 0.10.62 + dev: true + + /lucia@2.7.3: + resolution: + { + integrity: sha512-fzwwsZcijdQmS116J2odQZj/fb8SYXUI2rRWz84gZqkbpX9QAS4m72qlFzsPDv1YXJHNRhYUQCvQl3EKgt3OgA==, + } + dependencies: + "@noble/hashes": 1.3.2 + nanoid: 5.0.1 + dev: false + + /magic-string@0.25.9: + resolution: + { + integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==, + } + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /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-stream@2.0.0: + resolution: + { + integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, + } + dev: false + + /merge2@1.4.1: + resolution: + { + integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, + } + engines: { node: ">= 8" } + dev: false + + /micromatch@4.0.5: + resolution: + { + integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, + } + engines: { node: ">=8.6" } + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: false + + /mime-db@1.52.0: + resolution: + { + integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, + } + engines: { node: ">= 0.6" } + dev: false + + /mime-types@2.1.35: + resolution: + { + integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, + } + engines: { node: ">= 0.6" } + dependencies: + mime-db: 1.52.0 + 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: false + + /mimic-response@3.1.0: + resolution: + { + integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==, + } + engines: { node: ">=10" } + dev: false + + /miniflare@3.20231025.0: + resolution: + { + integrity: sha512-pFcr2BRaGIQ26UfdDo8BMJ6kkd/Jo/FkQ/4K7UG/eORlDepsLrR/sTJddcSSIGl07MA+MGjhzopFTPpFskkS+g==, + } + engines: { node: ">=16.13" } + 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.20231025.0 + ws: 8.14.2 + youch: 3.3.3 + zod: 3.22.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /miniflare@3.20231025.1: + resolution: + { + integrity: sha512-zwvu/f6eivBBF2shuom5DibnZjGSxt6FiC8sZlj+CcqTRss1D2ZHYD09odhAZLY9DYXE0orBFkJKnIDx/QmYdQ==, + } + engines: { node: ">=16.13" } + 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.20231025.0 + ws: 8.14.2 + youch: 3.3.3 + zod: 3.22.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /minimatch@3.1.2: + resolution: + { + integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, + } + dependencies: + brace-expansion: 1.1.11 + + /minimatch@5.1.6: + resolution: + { + integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==, + } + engines: { node: ">=10" } + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimatch@7.4.6: + resolution: + { + integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==, + } + engines: { node: ">=10" } + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimist@1.2.8: + resolution: + { + integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, + } + dev: false + + /mkdirp-classic@0.5.3: + resolution: + { + integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==, + } + dev: false + + /mlly@1.4.2: + resolution: + { + integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==, + } + dependencies: + acorn: 8.11.2 + pathe: 1.1.1 + pkg-types: 1.0.3 + ufo: 1.3.1 + dev: false + + /mri@1.2.0: + resolution: + { + integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==, + } + engines: { node: ">=4" } + dev: false + + /ms@2.1.2: + resolution: + { + integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, + } + + /mustache@4.2.0: + resolution: + { + integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==, + } + hasBin: true + + /mysql2@3.6.3: + resolution: + { + integrity: sha512-qYd/1CDuW1KYZjD4tzg2O8YS3X/UWuGH8ZMHyMeggMTXL3yOdMisbwZ5SNkHzDGlZXKYLAvV8tMrEH+NUMz3fw==, + } + engines: { node: ">= 8.0" } + dependencies: + denque: 2.1.0 + generate-function: 2.3.1 + iconv-lite: 0.6.3 + long: 5.2.3 + lru-cache: 8.0.5 + named-placeholders: 1.1.3 + seq-queue: 0.0.5 + sqlstring: 2.3.3 + dev: false + + /named-placeholders@1.1.3: + resolution: + { + integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==, + } + engines: { node: ">=12.0.0" } + dependencies: + lru-cache: 7.18.3 + dev: false + + /nanoid@3.3.7: + resolution: + { + integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==, + } + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } + hasBin: true + dev: true + + /nanoid@5.0.1: + resolution: + { + integrity: sha512-vWeVtV5Cw68aML/QaZvqN/3QQXc6fBfIieAlu05m7FZW2Dgb+3f0xc0TTxuJW+7u30t7iSDTV/j3kVI0oJqIfQ==, + } + engines: { node: ^18 || >=20 } + hasBin: true + dev: false + + /napi-build-utils@1.0.2: + resolution: + { + integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==, + } + dev: false + + /napi-wasm@1.1.0: + resolution: + { + integrity: sha512-lHwIAJbmLSjF9VDRm9GoVOy9AGp3aIvkjv+Kvz9h16QR3uSVYH78PNQUnT2U4X53mhlnV2M7wrhibQ3GHicDmg==, + } + dev: false + + /natural-compare@1.4.0: + resolution: + { + integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, + } + + /next-tick@1.1.0: + resolution: + { + integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==, + } + dev: true + + /node-abi@3.51.0: + resolution: + { + integrity: sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA==, + } + engines: { node: ">=10" } + dependencies: + semver: 7.5.4 + dev: false + + /node-addon-api@7.0.0: + resolution: + { + integrity: sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==, + } + dev: false + + /node-domexception@1.0.0: + resolution: + { + integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==, + } + engines: { node: ">=10.5.0" } + dev: false + + /node-fetch-native@1.4.1: + resolution: + { + integrity: sha512-NsXBU0UgBxo2rQLOeWNZqS3fvflWePMECr8CoSWoSTqCqGbVVsvl9vZu1HfQicYN0g5piV9Gh8RTEvo/uP752w==, + } + dev: false + + /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-fetch@3.3.2: + resolution: + { + integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + dev: false + + /node-forge@1.3.1: + resolution: + { + integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==, + } + engines: { node: ">= 6.13.0" } + + /normalize-path@3.0.0: + resolution: + { + integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, + } + engines: { node: ">=0.10.0" } + + /npm-run-path@4.0.1: + resolution: + { + integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==, + } + engines: { node: ">=8" } + dependencies: + path-key: 3.1.1 + dev: false + + /ofetch@1.3.3: + resolution: + { + integrity: sha512-s1ZCMmQWXy4b5K/TW9i/DtiN8Ku+xCiHcjQ6/J/nDdssirrQNOoB165Zu8EqLMA2lln1JUth9a0aW9Ap2ctrUg==, + } + dependencies: + destr: 2.0.2 + node-fetch-native: 1.4.1 + ufo: 1.3.1 + dev: false + + /once@1.4.0: + resolution: + { + integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, + } + dependencies: + wrappy: 1.0.2 + + /onetime@5.1.2: + resolution: + { + integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, + } + engines: { node: ">=6" } + dependencies: + mimic-fn: 2.1.0 + dev: false + + /openapi3-ts@4.1.2: + resolution: + { + integrity: sha512-B7gOkwsYMZO7BZXwJzXCuVagym2xhqsrilVvV0dnq2Di4+iLUXKVX9gOK23ZqaAHZOwABXN0QTdW8QnkUTX6DA==, + } + dependencies: + yaml: 2.3.4 + dev: false + + /optionator@0.9.3: + resolution: + { + integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==, + } + engines: { node: ">= 0.8.0" } + dependencies: + "@aashutoshrathi/word-wrap": 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + + /oslo@0.22.0: + resolution: + { + integrity: sha512-PSnp+rDJgL3FKvrg+qtxblzCkkUQslYWH5ljSrhX5ibc3p3NqXOfe/LzMCAJ2sqp0nlNEDg2TKCeui4buWt/Tw==, + } + dependencies: + "@node-rs/argon2": 1.5.2 + "@node-rs/bcrypt": 1.7.3 + dev: false + + /p-limit@3.1.0: + resolution: + { + integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, + } + engines: { node: ">=10" } + dependencies: + yocto-queue: 0.1.0 + + /p-locate@5.0.0: + resolution: + { + integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, + } + engines: { node: ">=10" } + dependencies: + p-limit: 3.1.0 + + /parent-module@1.0.1: + resolution: + { + integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, + } + engines: { node: ">=6" } + dependencies: + callsites: 3.1.0 + + /path-exists@4.0.0: + resolution: + { + integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, + } + engines: { node: ">=8" } + + /path-is-absolute@1.0.1: + resolution: + { + integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, + } + engines: { node: ">=0.10.0" } + + /path-key@3.1.1: + resolution: + { + integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, + } + engines: { node: ">=8" } + + /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" } + dev: false + + /pathe@1.1.1: + resolution: + { + integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==, + } + dev: false + + /picomatch@2.3.1: + resolution: + { + integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, + } + engines: { node: ">=8.6" } + + /pkg-types@1.0.3: + resolution: + { + integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==, + } + dependencies: + jsonc-parser: 3.2.0 + mlly: 1.4.2 + pathe: 1.1.1 + dev: false + + /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 + + /prelude-ls@1.2.1: + resolution: + { + integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, + } + engines: { node: ">= 0.8.0" } + + /prettier@3.0.3: + resolution: + { + integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==, + } + engines: { node: ">=14" } + hasBin: true + dev: false + + /printable-characters@1.0.42: + resolution: + { + integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==, + } + + /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" } + + /queue-microtask@1.2.3: + resolution: + { + integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, + } + + /radix3@1.1.0: + resolution: + { + integrity: sha512-pNsHDxbGORSvuSScqNJ+3Km6QAVqk8CfsCBIEoDgpqLrkD2f3QM4I7d1ozJJ172OmIcoUcerZaNWqtLkRXTV3A==, + } + dev: false + + /rc@1.2.8: + resolution: + { + integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==, + } + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: false + + /readable-stream@3.6.2: + resolution: + { + integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, + } + engines: { node: ">= 6" } + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + + /readdirp@3.6.0: + resolution: + { + integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, + } + engines: { node: ">=8.10.0" } + dependencies: + picomatch: 2.3.1 + + /redis-errors@1.2.0: + resolution: + { + integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==, + } + engines: { node: ">=4" } + dev: false + + /redis-parser@3.0.0: + resolution: + { + integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==, + } + engines: { node: ">=4" } + dependencies: + redis-errors: 1.2.0 + dev: false + + /resolve-from@4.0.0: + resolution: + { + integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, + } + engines: { node: ">=4" } + + /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" } + dev: true + + /reusify@1.0.4: + resolution: + { + integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, + } + engines: { iojs: ">=1.0.0", node: ">=0.10.0" } + + /rimraf@3.0.2: + resolution: + { + integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, + } + hasBin: true + dependencies: + glob: 7.2.3 + + /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. + 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 + dev: true + + /run-parallel@1.2.0: + resolution: + { + integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, + } + dependencies: + queue-microtask: 1.2.3 + + /safe-buffer@5.2.1: + resolution: + { + integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, + } + dev: false + + /safer-buffer@2.1.2: + resolution: + { + integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, + } + dev: false + + /selfsigned@2.4.1: + resolution: + { + integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==, + } + engines: { node: ">=10" } + dependencies: + "@types/node-forge": 1.3.9 + node-forge: 1.3.1 + dev: true + + /semver@7.5.4: + resolution: + { + integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==, + } + engines: { node: ">=10" } + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: false + + /seq-queue@0.0.5: + resolution: + { + integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==, + } + dev: false + + /shebang-command@2.0.0: + resolution: + { + integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, + } + engines: { node: ">=8" } + dependencies: + shebang-regex: 3.0.0 + + /shebang-regex@3.0.0: + resolution: + { + integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, + } + engines: { node: ">=8" } + + /signal-exit@3.0.7: + resolution: + { + integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, + } + dev: false + + /simple-concat@1.0.1: + resolution: + { + integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==, + } + dev: false + + /simple-get@4.0.1: + resolution: + { + integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==, + } + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + 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: false + + /source-map-support@0.5.21: + resolution: + { + integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, + } + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + /source-map@0.6.1: + resolution: + { + integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, + } + engines: { node: ">=0.10.0" } + + /sourcemap-codec@1.4.8: + resolution: + { + integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==, + } + deprecated: Please use @jridgewell/sourcemap-codec instead + dev: true + + /sqlstring@2.3.3: + resolution: + { + integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==, + } + engines: { node: ">= 0.6" } + dev: false + + /stacktracey@2.1.8: + resolution: + { + integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==, + } + dependencies: + as-table: 1.0.55 + get-source: 2.0.12 + + /standard-as-callback@2.1.0: + resolution: + { + integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==, + } + dev: false + + /std-env@3.4.3: + resolution: + { + integrity: sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==, + } + dev: false + + /stoppable@1.1.0: + resolution: + { + integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==, + } + engines: { node: ">=4", npm: ">=6" } + + /string_decoder@1.3.0: + resolution: + { + integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, + } + dependencies: + safe-buffer: 5.2.1 + dev: false + + /strip-ansi@6.0.1: + resolution: + { + integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, + } + engines: { node: ">=8" } + dependencies: + ansi-regex: 5.0.1 + + /strip-final-newline@2.0.0: + resolution: + { + integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==, + } + engines: { node: ">=6" } + dev: false + + /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" } + + /supports-color@7.2.0: + resolution: + { + integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, + } + engines: { node: ">=8" } + dependencies: + has-flag: 4.0.0 + + /tar-fs@2.1.1: + resolution: + { + integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==, + } + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: false + + /tar-stream@2.2.0: + resolution: + { + integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==, + } + engines: { node: ">=6" } + 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 + + /text-table@0.2.0: + resolution: + { + integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, + } + + /timers-ext@0.1.7: + resolution: + { + integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==, + } + dependencies: + es5-ext: 0.10.62 + next-tick: 1.1.0 + dev: true + + /to-regex-range@5.0.1: + resolution: + { + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, + } + engines: { node: ">=8.0" } + dependencies: + is-number: 7.0.0 + + /tr46@0.0.3: + resolution: + { + integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, + } + dev: false + + /ts-api-utils@1.0.3(typescript@5.2.2): + resolution: + { + integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==, + } + engines: { node: ">=16.13.0" } + peerDependencies: + typescript: ">=4.2.0" + dependencies: + typescript: 5.2.2 + dev: false + + /tslib@2.6.2: + resolution: + { + integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==, + } + + /tsx@4.0.0: + resolution: + { + integrity: sha512-jd3C5kw9tR68gtvqHUYo/2IwxaA46/CyKvcVQ4DsKRAPb19/vWgl7zF9mYNjFRY6KcGKiwne41RU91ll31IggQ==, + } + engines: { node: ">=18.0.0" } + hasBin: true + dependencies: + esbuild: 0.18.20 + get-tsconfig: 4.7.2 + source-map-support: 0.5.21 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /tunnel-agent@0.6.0: + resolution: + { + integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==, + } + dependencies: + safe-buffer: 5.2.1 + dev: false + + /type-check@0.4.0: + resolution: + { + integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, + } + engines: { node: ">= 0.8.0" } + dependencies: + prelude-ls: 1.2.1 + + /type-fest@0.20.2: + resolution: + { + integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==, + } + engines: { node: ">=10" } + + /type@1.2.0: + resolution: + { + integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==, + } + dev: true + + /type@2.7.2: + resolution: + { + integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==, + } + dev: true + + /typescript@5.2.2: + resolution: + { + integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==, + } + engines: { node: ">=14.17" } + hasBin: true + + /ufo@1.3.1: + resolution: + { + integrity: sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==, + } + dev: false + + /uncrypto@0.1.3: + resolution: + { + integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==, + } + dev: false + + /undici-types@5.26.5: + resolution: + { + integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==, + } + + /undici@5.27.2: + resolution: + { + integrity: sha512-iS857PdOEy/y3wlM3yRp+6SNQQ6xU0mmZcwRSriqk+et/cwWAtwmIGf6WkoDN2EK/AMdCO/dfXzIwi+rFMrjjQ==, + } + engines: { node: ">=14.0" } + dependencies: + "@fastify/busboy": 2.0.0 + + /unenv@1.7.4: + resolution: + { + integrity: sha512-fjYsXYi30It0YCQYqLOcT6fHfMXsBr2hw9XC7ycf8rTG7Xxpe3ZssiqUnD0khrjiZEmkBXWLwm42yCSCH46fMw==, + } + dependencies: + consola: 3.2.3 + defu: 6.1.3 + mime: 3.0.0 + node-fetch-native: 1.4.1 + pathe: 1.1.1 + dev: false + + /unstorage@1.9.0: + resolution: + { + integrity: sha512-VpD8ZEYc/le8DZCrny3bnqKE4ZjioQxBRnWE+j5sGNvziPjeDlaS1NaFFHzl/kkXaO3r7UaF8MGQrs14+1B4pQ==, + } + peerDependencies: + "@azure/app-configuration": ^1.4.1 + "@azure/cosmos": ^3.17.3 + "@azure/data-tables": ^13.2.2 + "@azure/identity": ^3.2.3 + "@azure/keyvault-secrets": ^4.7.0 + "@azure/storage-blob": ^12.14.0 + "@capacitor/preferences": ^5.0.0 + "@planetscale/database": ^1.8.0 + "@upstash/redis": ^1.22.0 + "@vercel/kv": ^0.2.2 + idb-keyval: ^6.2.1 + peerDependenciesMeta: + "@azure/app-configuration": + optional: true + "@azure/cosmos": + optional: true + "@azure/data-tables": + optional: true + "@azure/identity": + optional: true + "@azure/keyvault-secrets": + optional: true + "@azure/storage-blob": + optional: true + "@capacitor/preferences": + optional: true + "@planetscale/database": + optional: true + "@upstash/redis": + optional: true + "@vercel/kv": + optional: true + idb-keyval: + optional: true + dependencies: + anymatch: 3.1.3 + chokidar: 3.5.3 + destr: 2.0.2 + h3: 1.8.2 + ioredis: 5.3.2 + listhen: 1.5.5 + lru-cache: 10.0.1 + mri: 1.2.0 + node-fetch-native: 1.4.1 + ofetch: 1.3.3 + ufo: 1.3.1 + transitivePeerDependencies: + - supports-color + dev: false + + /untun@0.1.2: + resolution: + { + integrity: sha512-wLAMWvxfqyTiBODA1lg3IXHQtjggYLeTK7RnSfqtOXixWJ3bAa2kK/HHmOOg19upteqO3muLvN6O/icbyQY33Q==, + } + hasBin: true + dependencies: + citty: 0.1.4 + consola: 3.2.3 + pathe: 1.1.1 + dev: false + + /uqr@0.1.2: + resolution: + { + integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==, + } + dev: false + + /uri-js@4.4.1: + resolution: + { + integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, + } + dependencies: + punycode: 2.3.1 + + /util-deprecate@1.0.2: + resolution: + { + integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, + } + dev: false + + /uuid@9.0.1: + resolution: + { + integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==, + } + hasBin: true + dev: false + + /vscode-json-languageservice@4.2.1: + resolution: + { + integrity: sha512-xGmv9QIWs2H8obGbWg+sIPI/3/pFgj/5OWBhNzs00BkYQ9UaB2F6JJaGB/2/YOZJ3BvLXQTC4Q7muqU25QgAhA==, + } + dependencies: + jsonc-parser: 3.2.0 + vscode-languageserver-textdocument: 1.0.11 + vscode-languageserver-types: 3.17.5 + vscode-nls: 5.2.0 + vscode-uri: 3.0.8 + dev: true + + /vscode-languageserver-textdocument@1.0.11: + resolution: + { + integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==, + } + dev: true + + /vscode-languageserver-types@3.17.5: + resolution: + { + integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==, + } + dev: true + + /vscode-nls@5.2.0: + resolution: + { + integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==, + } + dev: true + + /vscode-uri@3.0.8: + resolution: + { + integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==, + } + dev: true + + /web-streams-polyfill@3.2.1: + resolution: + { + integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==, + } + engines: { node: ">= 8" } + dev: false + + /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@2.0.2: + resolution: + { + integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, + } + engines: { node: ">= 8" } + hasBin: true + dependencies: + isexe: 2.0.0 + + /wordwrap@1.0.0: + resolution: + { + integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==, + } + dev: true + + /workerd@1.20231025.0: + resolution: + { + integrity: sha512-W1PFtpMFfvmm+ozBf+u70TE3Pviv7WA4qzDeejHDC4z+PFDq4+3KJCkgffaGBO86h+akWO0hSsc0uXL2zAqofQ==, + } + engines: { node: ">=16" } + hasBin: true + requiresBuild: true + optionalDependencies: + "@cloudflare/workerd-darwin-64": 1.20231025.0 + "@cloudflare/workerd-darwin-arm64": 1.20231025.0 + "@cloudflare/workerd-linux-64": 1.20231025.0 + "@cloudflare/workerd-linux-arm64": 1.20231025.0 + "@cloudflare/workerd-windows-64": 1.20231025.0 + + /wrangler@3.15.0: + resolution: + { + integrity: sha512-kxzK62rD+LRrDeZZzw8cP6FBub71vJCbfAAb594XobXajgXYh3pFjv18Vm8YLxHzoGMhmAOJPA5b4DHq4HEUCw==, + } + engines: { node: ">=16.17.0" } + hasBin: true + 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.20231025.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 + dev: true + + /wrappy@1.0.2: + resolution: + { + integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, + } + + /ws@8.14.2: + resolution: + { + integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==, + } + engines: { node: ">=10.0.0" } + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + /xxhash-wasm@1.0.2: + resolution: + { + integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==, + } + dev: true + + /yallist@4.0.0: + resolution: + { + integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, + } + dev: false + + /yaml@2.3.4: + resolution: + { + integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==, + } + engines: { node: ">= 14" } + dev: false + + /yocto-queue@0.1.0: + resolution: + { + integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, + } + engines: { node: ">=10" } + + /youch@3.3.3: + resolution: + { + integrity: sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==, + } + dependencies: + cookie: 0.5.0 + mustache: 4.2.0 + stacktracey: 2.1.8 + + /zod@3.22.4: + resolution: + { + integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==, + } diff --git a/src/v2/db/schema/asset/asset-atlas.ts b/src/v2/db/schema/asset/asset-atlas.ts index 348bd9e..1dc7bb2 100644 --- a/src/v2/db/schema/asset/asset-atlas.ts +++ b/src/v2/db/schema/asset/asset-atlas.ts @@ -80,6 +80,7 @@ export const atlasRelations = relations(atlas, ({ one }) => ({ uploadedBy: one(authUser, { fields: [atlas.uploadedById, atlas.uploadedByName], references: [authUser.id, authUser.username], + relationName: "atlas_auth_user", }), })) @@ -87,9 +88,11 @@ export const atlasToAssetRelations = relations(atlasToAsset, ({ one }) => ({ atlas: one(atlas, { fields: [atlasToAsset.atlasId], references: [atlas.id], + relationName: "atlastoasset_atlas", }), asset: one(asset, { fields: [atlasToAsset.assetId], references: [asset.id], + relationName: "atlastoasset_asset", }), })) diff --git a/src/v2/db/schema/asset/asset-categories.ts b/src/v2/db/schema/asset/asset-categories.ts index 67d42a1..9fd3d04 100644 --- a/src/v2/db/schema/asset/asset-categories.ts +++ b/src/v2/db/schema/asset/asset-categories.ts @@ -80,10 +80,12 @@ export const gameAssetCategoryRelations = relations( game: one(game, { fields: [gameAssetCategory.gameId], references: [game.id], + relationName: "gameassetcategory_game", }), assetCategory: one(assetCategory, { fields: [gameAssetCategory.assetCategoryId], references: [assetCategory.id], + relationName: "gameassetcategory_assetcategory", }), }) ) diff --git a/src/v2/db/schema/asset/asset-tags.ts b/src/v2/db/schema/asset/asset-tags.ts index 6fa9c95..701052b 100644 --- a/src/v2/db/schema/asset/asset-tags.ts +++ b/src/v2/db/schema/asset/asset-tags.ts @@ -74,9 +74,11 @@ export const assetTagAssetRelations = relations(assetTagAsset, ({ one }) => ({ assetTag: one(assetTag, { fields: [assetTagAsset.assetTagId], references: [assetTag.id], + relationName: "assettagasset_assettag", }), asset: one(asset, { fields: [assetTagAsset.assetId], references: [asset.id], + relationName: "assettagasset_asset", }), })) diff --git a/src/v2/db/schema/asset/asset.ts b/src/v2/db/schema/asset/asset.ts index 660780e..8f82756 100644 --- a/src/v2/db/schema/asset/asset.ts +++ b/src/v2/db/schema/asset/asset.ts @@ -90,13 +90,16 @@ export const assetRelations = relations(asset, ({ one, many }) => ({ authUser: one(authUser, { fields: [asset.uploadedById], references: [authUser.id], + relationName: "asset_auth_user", }), game: one(game, { fields: [asset.gameId], references: [game.id], + relationName: "asset_game", }), assetCategory: one(assetCategory, { fields: [asset.assetCategoryId], references: [assetCategory.id], + relationName: "asset_asset_category", }), })) diff --git a/src/v2/db/schema/oc-generators/oc-generators.ts b/src/v2/db/schema/oc-generators/oc-generators.ts index bb94dbc..c999837 100644 --- a/src/v2/db/schema/oc-generators/oc-generators.ts +++ b/src/v2/db/schema/oc-generators/oc-generators.ts @@ -58,6 +58,7 @@ export const savedOcGeneratorsRelations = relations( user: one(authUser, { fields: [savedOcGenerators.userId], references: [authUser.id], + relationName: "saved_oc_generators_user", }), }) ) diff --git a/src/v2/db/schema/user/user-attributes.ts b/src/v2/db/schema/user/user-attributes.ts index a4c779b..08256ce 100644 --- a/src/v2/db/schema/user/user-attributes.ts +++ b/src/v2/db/schema/user/user-attributes.ts @@ -86,6 +86,7 @@ export const emailVerificationTokenRelations = relations( user: one(authUser, { fields: [emailVerificationToken.userId], references: [authUser.id], + relationName: "emailverificationtoken_user", }), }) ) @@ -96,6 +97,7 @@ export const passwordResetTokenRelations = relations( user: one(authUser, { fields: [passwordResetToken.userId], references: [authUser.id], + relationName: "passwordresettoken_user", }), }) ) diff --git a/src/v2/db/schema/user/user-collections.ts b/src/v2/db/schema/user/user-collections.ts index 69833a2..423357b 100644 --- a/src/v2/db/schema/user/user-collections.ts +++ b/src/v2/db/schema/user/user-collections.ts @@ -96,6 +96,7 @@ export const collectionRelations = relations( user: one(authUser, { fields: [userCollection.userId], references: [authUser.id], + relationName: "collection_auth_user", }), assets: many(userCollectionAsset), }) @@ -107,10 +108,12 @@ export const collectionAssetsRelations = relations( collection: one(userCollection, { fields: [userCollectionAsset.collectionId], references: [userCollection.id], + relationName: "collectionassets_collection", }), asset: one(asset, { fields: [userCollectionAsset.assetId], references: [asset.id], + relationName: "collectionassets_asset", }), }) ) diff --git a/src/v2/db/schema/user/user-connections.ts b/src/v2/db/schema/user/user-connections.ts index 981ae96..bff1bf7 100644 --- a/src/v2/db/schema/user/user-connections.ts +++ b/src/v2/db/schema/user/user-connections.ts @@ -42,6 +42,7 @@ export const socialsConnectionRelations = relations( user: one(authUser, { fields: [socialsConnection.userId], references: [authUser.id], + relationName: "socials_connection_user", }), }) ) diff --git a/src/v2/db/schema/user/user-favorites.ts b/src/v2/db/schema/user/user-favorites.ts index 90ac9c3..a7f9cb6 100644 --- a/src/v2/db/schema/user/user-favorites.ts +++ b/src/v2/db/schema/user/user-favorites.ts @@ -93,6 +93,7 @@ export const userFavoriteRelations = relations(userFavorite, ({ one }) => ({ user: one(authUser, { fields: [userFavorite.userId], references: [authUser.id], + relationName: "userfavorite_auth_user", }), })) @@ -102,10 +103,12 @@ export const userFavoriteAssetRelations = relations( favoritedAssets: one(userFavorite, { fields: [userFavoriteAsset.userFavoriteId], references: [userFavorite.id], + relationName: "favoritedassets_userfavorite", }), asset: one(asset, { fields: [userFavoriteAsset.assetId], references: [asset.id], + relationName: "favoritedassets_asset", }), }) ) diff --git a/src/v2/db/schema/user/user.ts b/src/v2/db/schema/user/user.ts index cb3ea35..9ee004e 100644 --- a/src/v2/db/schema/user/user.ts +++ b/src/v2/db/schema/user/user.ts @@ -57,8 +57,8 @@ export const authUser = sqliteTable( } ) -export type Users = typeof authUser.$inferSelect -export type NewUsers = typeof authUser.$inferInsert +export type User = typeof authUser.$inferSelect +export type NewUser = typeof authUser.$inferInsert export const keys = sqliteTable( tableNames.authKey, @@ -104,5 +104,6 @@ export const keysRelations = relations(keys, ({ one }) => ({ user: one(authUser, { fields: [keys.userId], references: [authUser.id], + relationName: "key_auth_user", }), })) diff --git a/src/v2/db/turso.ts b/src/v2/db/turso.ts index 6fec113..944f7d1 100644 --- a/src/v2/db/turso.ts +++ b/src/v2/db/turso.ts @@ -30,10 +30,8 @@ export function getConnection(env: Bindings) { env.TURSO_DEV_DATABASE_URL ?? "http://127.0.0.1:8080" const turso = createClient({ - url: isDev - ? TURSO_DEV_DATABASE_URL ?? env.TURSO_DATABASE_URL - : env.TURSO_DATABASE_URL, - ...(isDev ? {} : { authToken: env.TURSO_DATABASE_AUTH_TOKEN }), + url: isDev ? TURSO_DEV_DATABASE_URL : env.TURSO_DATABASE_URL!, + authToken: isDev ? undefined : env.TURSO_DATABASE_AUTH_TOKEN!, }) /** diff --git a/src/v2/lib/managers/asset-category/asset-category-manager.ts b/src/v2/lib/managers/asset-category/asset-category-manager.ts index 9664f6b..bfa8882 100644 --- a/src/v2/lib/managers/asset-category/asset-category-manager.ts +++ b/src/v2/lib/managers/asset-category/asset-category-manager.ts @@ -1,7 +1,8 @@ import { DrizzleInstance } from "@/v2/db/turso" -import { game, gameAssetCategory, assetCategory } from "@/v2/db/schema" +import { assetCategory } from "@/v2/db/schema" import { eq, or, like } from "drizzle-orm" import { z } from "zod" +import type { AssetCategory, NewAssetCategory } from "@/v2/db/schema" /** * Represents the schema for inserting a new asset category. @@ -22,28 +23,42 @@ export class AssetCategoryManager { * @param assetCategoryId - The unique ID of the asset category to retrieve. * @returns A promise that resolves to the retrieved asset category. */ - public async getAssetCategoryById(assetCategoryId: string) { - const [foundAssetCategory] = await this.drizzle - .select() - .from(assetCategory) - .leftJoin( - gameAssetCategory, - eq(gameAssetCategory.assetCategoryId, assetCategoryId) - ) - .leftJoin(game, eq(game.id, gameAssetCategory.gameId)) - .where(eq(assetCategory.id, assetCategoryId)) + public async getAssetCategoryById( + assetCategoryId: string + ): Promise { + try { + const [foundAssetCategory] = await this.drizzle + .select() + .from(assetCategory) + .where(eq(assetCategory.id, assetCategoryId)) - return foundAssetCategory + return foundAssetCategory ?? null + } catch (e) { + console.error( + `Error getting asset category by ID ${assetCategoryId}`, + e + ) + throw new Error( + `Error getting asset category by ID ${assetCategoryId}` + ) + } } /** * Retrieves a list of all asset categories. * @returns A promise that resolves to an array of asset categories. */ - public async listAssetCategories() { - const assetCategories = await this.drizzle.select().from(assetCategory) + public async listAssetCategories(): Promise { + try { + const assetCategories = await this.drizzle + .select() + .from(assetCategory) - return assetCategories + return assetCategories + } catch (e) { + console.error("Error listing asset categories", e) + throw new Error("Error listing asset categories") + } } /** @@ -51,13 +66,20 @@ export class AssetCategoryManager { * @param assetCategoryName - The partial name to search for within asset categories. * @returns A promise that resolves to an array of matching asset categories. */ - public async getAssetCategoriesByPartialName(assetCategoryName: string) { - const assetCategories = await this.drizzle - .select() - .from(assetCategory) - .where(or(like(assetCategory.name, `%${assetCategoryName}%`))) + public async getAssetCategoriesByPartialName( + assetCategoryName: string + ): Promise { + try { + const assetCategories = await this.drizzle + .select() + .from(assetCategory) + .where(or(like(assetCategory.name, `%${assetCategoryName}%`))) - return assetCategories + return assetCategories + } catch (e) { + console.error("Error getting asset categories by partial name", e) + throw new Error("Error getting asset categories by partial name") + } } /** @@ -67,18 +89,24 @@ export class AssetCategoryManager { */ public async createAssetCategory( newAssetCategory: z.infer - ) { - const createdAssetCategory = await this.drizzle - .insert(assetCategory) - .values({ - id: newAssetCategory.name, - name: newAssetCategory.name, - formattedName: newAssetCategory.name, - assetCount: 0, - lastUpdated: new Date().toISOString(), - }) + ): Promise { + try { + const [createdAssetCategory] = await this.drizzle + .insert(assetCategory) + .values({ + id: newAssetCategory.name, + name: newAssetCategory.name, + formattedName: newAssetCategory.name, + assetCount: 0, + lastUpdated: new Date().toISOString(), + }) + .returning() - return createdAssetCategory + return createdAssetCategory + } catch (e) { + console.error("Error creating asset category", e) + throw new Error("Error creating asset category") + } } /** @@ -86,13 +114,25 @@ export class AssetCategoryManager { * @param assetCategoryId - The ID of the asset category to delete. * @returns A promise that resolves to the deleted asset category. */ - public async deleteAssetCategory(assetCategoryId: string) { - const [deletedAssetCategory] = await this.drizzle - .delete(assetCategory) - .where(eq(assetCategory.id, assetCategoryId)) - .returning() + public async deleteAssetCategory( + assetCategoryId: string + ): Promise { + try { + const [deletedAssetCategory] = await this.drizzle + .delete(assetCategory) + .where(eq(assetCategory.id, assetCategoryId)) + .returning() - return deletedAssetCategory + return deletedAssetCategory + } catch (e) { + console.error( + `Error deleting asset category by ID ${assetCategoryId}`, + e + ) + throw new Error( + `Error deleting asset category by ID ${assetCategoryId}` + ) + } } /** @@ -104,17 +144,27 @@ export class AssetCategoryManager { public async updateAssetCategory( assetCategoryId: string, newAssetCategory: z.infer - ) { - const [updatedAssetCategory] = await this.drizzle - .update(assetCategory) - .set({ - name: newAssetCategory.name, - formattedName: newAssetCategory.name, - lastUpdated: new Date().toISOString(), - }) - .where(eq(assetCategory.id, assetCategoryId)) - .returning() + ): Promise { + try { + const [updatedAssetCategory] = await this.drizzle + .update(assetCategory) + .set({ + name: newAssetCategory.name, + formattedName: newAssetCategory.name, + lastUpdated: new Date().toISOString(), + }) + .where(eq(assetCategory.id, assetCategoryId)) + .returning() - return updatedAssetCategory + return updatedAssetCategory + } catch (e) { + console.error( + `Error updating asset category by ID ${assetCategoryId}`, + e + ) + throw new Error( + `Error updating asset category by ID ${assetCategoryId}` + ) + } } } diff --git a/src/v2/lib/managers/asset-category/game-asset-category-manager.ts b/src/v2/lib/managers/asset-category/game-asset-category-manager.ts index 38bd14a..3abe24c 100644 --- a/src/v2/lib/managers/asset-category/game-asset-category-manager.ts +++ b/src/v2/lib/managers/asset-category/game-asset-category-manager.ts @@ -1,6 +1,7 @@ import { DrizzleInstance } from "@/v2/db/turso" import { gameAssetCategory } from "@/v2/db/schema" import { eq, and } from "drizzle-orm" +import type { GameAssetCategory } from "@/v2/db/schema" /** * Manages operations related to game asset categories. @@ -17,15 +18,26 @@ export class GameAssetCategoryManager { public async linkAssetCategoryToGame( assetCategoryId: string, gameId: string - ) { - const createdGameAssetCategory = await this.drizzle - .insert(gameAssetCategory) - .values({ - assetCategoryId, - gameId, - }) + ): Promise { + try { + const [createdGameAssetCategory] = await this.drizzle + .insert(gameAssetCategory) + .values({ + assetCategoryId, + gameId, + }) + .returning() - return createdGameAssetCategory + return createdGameAssetCategory + } catch (e) { + console.error( + `Error linking asset category ${assetCategoryId} to game ${gameId}`, + e + ) + throw new Error( + `Error linking asset category ${assetCategoryId} to game ${gameId}` + ) + } } /** @@ -37,17 +49,27 @@ export class GameAssetCategoryManager { public async unlinkAssetCategoryFromGame( assetCategoryId: string, gameId: string - ) { - const deletedGameAssetCategory = await this.drizzle - .delete(gameAssetCategory) - .where( - and( - eq(gameAssetCategory.assetCategoryId, assetCategoryId), - eq(gameAssetCategory.gameId, gameId) + ): Promise { + try { + const [deletedGameAssetCategory] = await this.drizzle + .delete(gameAssetCategory) + .where( + and( + eq(gameAssetCategory.assetCategoryId, assetCategoryId), + eq(gameAssetCategory.gameId, gameId) + ) ) - ) - .returning() + .returning() - return deletedGameAssetCategory[0] + return deletedGameAssetCategory + } catch (e) { + console.error( + `Error unlinking asset category ${assetCategoryId} from game ${gameId}`, + e + ) + throw new Error( + `Error unlinking asset category ${assetCategoryId} from game ${gameId}` + ) + } } } diff --git a/src/v2/lib/managers/asset/asset-manager.ts b/src/v2/lib/managers/asset/asset-manager.ts index 06f64a7..1136f9c 100644 --- a/src/v2/lib/managers/asset/asset-manager.ts +++ b/src/v2/lib/managers/asset/asset-manager.ts @@ -10,6 +10,7 @@ import { eq, or, like, sql, and } from "drizzle-orm" import { R2Bucket } from "@cloudflare/workers-types" import { SplitQueryByCommas } from "../../helpers/split-query-by-commas" import { z } from "zod" +import type { Asset, NewAsset } from "@/v2/db/schema" // these are all optional type AssetSearchQuery = { @@ -74,30 +75,33 @@ export class AssetManager { * @param assetId - The unique ID of the asset to retrieve. * @returns A promise that resolves to the retrieved asset, its game, category and tags. */ - public async getAssetById(assetId: number) { - const [foundAsset] = await this.drizzle - .select() - .from(asset) - .leftJoin(assetTagAsset, eq(assetTagAsset.assetId, assetId)) - .leftJoin(assetTag, eq(assetTag.id, assetTagAsset.assetTagId)) - .leftJoin(game, eq(game.id, asset.gameId)) - .leftJoin( - assetCategory, - eq(assetCategory.id, asset.assetCategoryId) - ) - .where(eq(asset.id, assetId)) + public async getAssetById(assetId: number): Promise { + try { + const [foundAsset] = await this.drizzle + .select() + .from(asset) + .where(eq(asset.id, assetId)) - return foundAsset ?? null + return foundAsset ?? null + } catch (e) { + console.error(`Error getting asset by ID ${assetId}`, e) + throw new Error(`Error getting asset by ID ${assetId}`) + } } /** * Retrieves a list of all assets. * @returns A promise that resolves to an array of assets. */ - public async listAssets() { - const assets = await this.drizzle.select().from(asset) + public async listAssets(): Promise { + try { + const assets = await this.drizzle.select().from(asset) - return assets + return assets + } catch (e) { + console.error("Error listing assets", e) + throw new Error("Error listing assets") + } } /** @@ -105,59 +109,76 @@ export class AssetManager { * @param query - An object containing optional search parameters. * @returns A promise that resolves to an array of matching assets. */ - public async searchAssets(query: AssetSearchQuery) { - const { name, game, category, tag, limit } = query - - const assetLimit = limit ?? 500 - const gameList = game ? SplitQueryByCommas(game.toLowerCase()) : null - const categoryList = category - ? SplitQueryByCommas(category.toLowerCase()) - : null - const tagList = tag - ? SplitQueryByCommas(tag.toLowerCase()) - : ["official"] - const searchQuery = name ?? null - - const assetTagResponse = this.drizzle.$with("sq").as( - this.drizzle - .select({ - assetId: assetTagAsset.assetId, - tags: sql`array_agg(${assetTag})`.as( - "tags" - ), - }) - .from(assetTagAsset) - .leftJoin(assetTag, eq(assetTag.id, assetTagAsset.assetTagId)) - .where(or(...tagList.map((tag) => eq(assetTag.name, tag)))) - .groupBy(assetTagAsset.assetId) - ) + public async searchAssets( + query: AssetSearchQuery + ): Promise { + try { + const { name, game, category, tag, limit } = query - const foundAssets = await this.drizzle - .with(assetTagResponse) - .select() - .from(asset) - .innerJoin(assetTagResponse, eq(assetTagResponse.assetId, asset.id)) - .where( - and( - searchQuery && like(asset.name, `%${searchQuery}%`), - gameList && - or( - ...gameList.map((game) => - eq(asset.assetCategoryId, game) - ) + const assetLimit = limit ?? 500 + const gameList = game + ? SplitQueryByCommas(game.toLowerCase()) + : null + const categoryList = category + ? SplitQueryByCommas(category.toLowerCase()) + : null + const tagList = tag + ? SplitQueryByCommas(tag.toLowerCase()) + : ["official"] + const searchQuery = name ?? null + + const assetTagResponse = this.drizzle.$with("sq").as( + this.drizzle + .select({ + assetId: assetTagAsset.assetId, + tags: sql`array_agg(${assetTag})`.as( + "tags" ), - categoryList && - or( - ...categoryList.map((category) => - eq(asset.assetCategoryId, category) + }) + .from(assetTagAsset) + .leftJoin( + assetTag, + eq(assetTag.id, assetTagAsset.assetTagId) + ) + .where(or(...tagList.map((tag) => eq(assetTag.name, tag)))) + .groupBy(assetTagAsset.assetId) + ) + + const foundAssets = await this.drizzle + .with(assetTagResponse) + .select() + .from(asset) + .innerJoin( + assetTagResponse, + eq(assetTagResponse.assetId, asset.id) + ) + .where( + and( + searchQuery && like(asset.name, `%${searchQuery}%`), + gameList && + or( + ...gameList.map((game) => + eq(asset.assetCategoryId, game) + ) + ), + categoryList && + or( + ...categoryList.map((category) => + eq(asset.assetCategoryId, category) + ) ) - ) + ) ) - ) - .groupBy(asset.id) - .limit(assetLimit) + .groupBy(asset.id) + .limit(assetLimit) - return foundAssets + // TODO(dromzeh): the incorrect type is occuring becuase of the inner join, idk how to fix it tbh + // @ts-expect-error - i need to fix this + return foundAssets + } catch (e) { + console.error("Error searching assets", e) + throw new Error("Error searching assets") + } } /** @@ -173,64 +194,73 @@ export class AssetManager { newAsset: z.infer, bucket: R2Bucket, file: File - ) { - const { key } = await bucket.put( - `/assets/${newAsset.gameId}/${newAsset.assetCategoryId}/${newAsset.name}.${newAsset.extension}`, - file - ) + ): Promise { + try { + const { key } = await bucket.put( + `/assets/${newAsset.gameId}/${newAsset.assetCategoryId}/${newAsset.name}.${newAsset.extension}`, + file + ) - await this.drizzle.transaction(async (trx) => { - const createdAsset = await trx - .insert(asset) - .values({ - name: newAsset.name, - extension: newAsset.extension, - gameId: newAsset.gameId, - assetCategoryId: newAsset.assetCategoryId, - url: key, - uploadedById: userId, - status: "pending", - fileSize: newAsset.size, - width: newAsset.width, - height: newAsset.height, - }) - .returning({ - assetId: asset.id, - }) - - await trx - .update(game) - .set({ - assetCount: sql`asset_count + 1`, - }) - .where(eq(game.id, newAsset.gameId)) - - await trx - .update(assetCategory) - .set({ - assetCount: sql`asset_count + 1`, - }) - .where(eq(assetCategory.id, newAsset.assetCategoryId)) - - const tags = newAsset.tags ? SplitQueryByCommas(newAsset.tags) : [] - - if (tags.length === 0) return createdAsset - - for (const tag of tags) { - const foundTag = await trx - .select() - .from(assetTag) - .where(eq(assetTag.name, tag)) - - if (foundTag.length === 0) { - await trx.insert(assetTagAsset).values({ - assetId: createdAsset[0].assetId, - assetTagId: tag, - }) + const returnedNewAsset: NewAsset = await this.drizzle.transaction( + async (trx) => { + const [createdAsset] = await trx + .insert(asset) + .values({ + name: newAsset.name, + extension: newAsset.extension, + gameId: newAsset.gameId, + assetCategoryId: newAsset.assetCategoryId, + url: key, + uploadedById: userId, + status: "pending", + fileSize: newAsset.size, + width: newAsset.width, + height: newAsset.height, + }) + .returning() + + await trx + .update(game) + .set({ + assetCount: sql`asset_count + 1`, + }) + .where(eq(game.id, newAsset.gameId)) + + await trx + .update(assetCategory) + .set({ + assetCount: sql`asset_count + 1`, + }) + .where(eq(assetCategory.id, newAsset.assetCategoryId)) + + const tags = newAsset.tags + ? SplitQueryByCommas(newAsset.tags) + : [] + + if (tags.length === 0) return createdAsset + + for (const tag of tags) { + const foundTag = await trx + .select() + .from(assetTag) + .where(eq(assetTag.name, tag)) + + if (foundTag.length === 0) { + await trx.insert(assetTagAsset).values({ + assetId: createdAsset[0].assetId, + assetTagId: tag, + }) + } + } + + return createdAsset } - } + ) - return createdAsset - }) + return returnedNewAsset + } catch (e) { + console.error("Error creating asset", e) + throw new Error("Error creating asset") + } } } diff --git a/src/v2/lib/managers/collection/collection-manager.ts b/src/v2/lib/managers/collection/collection-manager.ts index a1cdd49..fac8749 100644 --- a/src/v2/lib/managers/collection/collection-manager.ts +++ b/src/v2/lib/managers/collection/collection-manager.ts @@ -2,6 +2,12 @@ import { DrizzleInstance } from "@/v2/db/turso" import { userCollection, userCollectionAsset } from "@/v2/db/schema" import { eq, like, and } from "drizzle-orm" import { z } from "zod" +import type { + UserCollection, + NewUserCollection, + UserCollectionAsset, + NewUserCollectionAsset, +} from "@/v2/db/schema" const insertCollectionSchema = z.object({ name: z.string(), @@ -23,41 +29,59 @@ export class CollectionManager { public async getCollectionById( collectionId: string, currentUserId?: string - ) { - const foundCollection = await this.drizzle - .select() - .from(userCollection) - .leftJoin( - userCollectionAsset, - eq(userCollectionAsset.collectionId, collectionId) - ) - .where( - and( - currentUserId - ? eq(userCollection.userId, currentUserId) - : eq(userCollection.isPublic, 1), - eq(userCollection.id, collectionId) + ): Promise { + try { + const [foundCollection] = await this.drizzle + .select() + .from(userCollection) + .where( + and( + currentUserId + ? eq(userCollection.userId, currentUserId) + : eq(userCollection.isPublic, 1), + eq(userCollection.id, collectionId) + ) ) - ) - return foundCollection[0] + return foundCollection ?? null + } catch (e) { + console.error( + `Error in getCollectionById for collectionId ${collectionId} and currentUserId ${currentUserId}`, + e + ) + throw new Error( + `Error in getCollectionById for collectionId ${collectionId} and currentUserId ${currentUserId}` + ) + } } /** * Retrieves a list of all collections. * @returns A promise that resolves to an array of collections. */ - public async listCollections(currentUserId?: string) { - const collections = await this.drizzle - .select() - .from(userCollection) - .where( - currentUserId - ? eq(userCollection.userId, currentUserId) - : eq(userCollection.isPublic, 1) - ) + public async listCollections( + currentUserId?: string + ): Promise { + try { + const collections = await this.drizzle + .select() + .from(userCollection) + .where( + currentUserId + ? eq(userCollection.userId, currentUserId) + : eq(userCollection.isPublic, 1) + ) - return collections + return collections ?? null + } catch (e) { + console.error( + `Error in listCollections for currentUserId ${currentUserId}`, + e + ) + throw new Error( + `Error in listCollections for currentUserId ${currentUserId}` + ) + } } /** @@ -68,22 +92,31 @@ export class CollectionManager { public async getCollectionsByPartialName( collectionName: string, currentUserId?: string - ) { - const collections = await this.drizzle - .select() - .from(userCollection) - .where( - and( - currentUserId - ? eq(userCollection.userId, currentUserId) - : eq(userCollection.isPublic, 1), - like(userCollection.name, `%${collectionName}%`) + ): Promise { + try { + const collections = await this.drizzle + .select() + .from(userCollection) + .where( + and( + currentUserId + ? eq(userCollection.userId, currentUserId) + : eq(userCollection.isPublic, 1), + like(userCollection.name, `%${collectionName}%`) + ) ) - ) - return collections + return collections ?? null + } catch (e) { + console.error( + `Error in getCollectionsByPartialName for collectionName ${collectionName} and currentUserId ${currentUserId}`, + e + ) + throw new Error( + `Error in getCollectionsByPartialName for collectionName ${collectionName} and currentUserId ${currentUserId}` + ) + } } - /** * Retrieves public collections for a specific user. * @param userId - The ID of the user. @@ -92,20 +125,30 @@ export class CollectionManager { public async getCollectionsByUserId( userId: string, currentUserId?: string - ) { - const collections = await this.drizzle - .select() - .from(userCollection) - .where( - and( - currentUserId - ? eq(userCollection.userId, currentUserId) - : eq(userCollection.isPublic, 1), - eq(userCollection.userId, userId) + ): Promise { + try { + const collections = await this.drizzle + .select() + .from(userCollection) + .where( + and( + currentUserId + ? eq(userCollection.userId, currentUserId) + : eq(userCollection.isPublic, 1), + eq(userCollection.userId, userId) + ) ) - ) - return collections + return collections ?? null + } catch (e) { + console.error( + `Error in getCollectionsByUserId for userId ${userId} and currentUserId ${currentUserId}`, + e + ) + throw new Error( + `Error in getCollectionsByUserId for userId ${userId} and currentUserId ${currentUserId}` + ) + } } /** @@ -116,25 +159,53 @@ export class CollectionManager { public async removeAssetFromCollection( collectionId: string, assetId: number - ) { - await this.drizzle - .delete(userCollectionAsset) - .where( - and( - eq(userCollectionAsset.collectionId, collectionId), - eq(userCollectionAsset.assetId, assetId) + ): Promise { + try { + const [removedAsset] = await this.drizzle + .delete(userCollectionAsset) + .where( + and( + eq(userCollectionAsset.collectionId, collectionId), + eq(userCollectionAsset.assetId, assetId) + ) ) + .returning() + + return removedAsset ?? null + } catch (e) { + console.error( + `Error in removeAssetFromCollection for collectionId ${collectionId} and assetId ${assetId}`, + e + ) + throw new Error( + `Error in removeAssetFromCollection for collectionId ${collectionId} and assetId ${assetId}` ) + } } /** * Deletes a collection by its ID. * @param collectionId - The ID of the collection to delete. */ - public async deleteCollection(collectionId: string) { - await this.drizzle - .delete(userCollection) - .where(eq(userCollection.id, collectionId)) + public async deleteCollection( + collectionId: string + ): Promise { + try { + const [deletedCollection] = await this.drizzle + .delete(userCollection) + .where(eq(userCollection.id, collectionId)) + .returning() + + return deletedCollection + } catch (e) { + console.error( + `Error in deleteCollection for collectionId ${collectionId}`, + e + ) + throw new Error( + `Error in deleteCollection for collectionId ${collectionId}` + ) + } } /** @@ -142,11 +213,29 @@ export class CollectionManager { * @param collectionId - The ID of the collection. * @param assetId - The ID of the asset to add. */ - public async addAssetToCollection(collectionId: string, assetId: number) { - await this.drizzle.insert(userCollectionAsset).values({ - collectionId: collectionId, - assetId: assetId, - }) + public async addAssetToCollection( + collectionId: string, + assetId: number + ): Promise { + try { + const [addedAsset] = await this.drizzle + .insert(userCollectionAsset) + .values({ + collectionId: collectionId, + assetId: assetId, + }) + .returning() + + return addedAsset + } catch (e) { + console.error( + `Error in addAssetToCollection for collectionId ${collectionId} and assetId ${assetId}`, + e + ) + throw new Error( + `Error in addAssetToCollection for collectionId ${collectionId} and assetId ${assetId}` + ) + } } /** @@ -158,20 +247,28 @@ export class CollectionManager { public async createCollection( userId: string, collectionSchema: z.infer - ) { - const createdCollection = await this.drizzle - .insert(userCollection) - .values({ - userId: userId, - description: collectionSchema.description, - name: collectionSchema.name, - isPublic: collectionSchema.isPublic ? 1 : 0, - }) - .returning({ - collectionId: userCollection.id, - }) - - return createdCollection + ): Promise { + try { + const [createdCollection] = await this.drizzle + .insert(userCollection) + .values({ + userId: userId, + description: collectionSchema.description, + name: collectionSchema.name, + isPublic: collectionSchema.isPublic ? 1 : 0, + }) + .returning() + + return createdCollection + } catch (e) { + console.error( + `Error in createCollection for userId ${userId} and collectionSchema ${collectionSchema}`, + e + ) + throw new Error( + `Error in createCollection for userId ${userId} and collectionSchema ${collectionSchema}` + ) + } } /** @@ -184,19 +281,27 @@ export class CollectionManager { public async updateCollection( collectionId: string, collectionSchema: z.infer - ) { - const updatedCollection = await this.drizzle - .update(userCollection) - .set({ - description: collectionSchema.description, - name: collectionSchema.name, - isPublic: collectionSchema.isPublic ? 1 : 0, - }) - .where(eq(userCollection.id, collectionId)) - .returning({ - collectionId: userCollection.id, - }) - - return updatedCollection + ): Promise { + try { + const [updatedCollection] = await this.drizzle + .update(userCollection) + .set({ + description: collectionSchema.description, + name: collectionSchema.name, + isPublic: collectionSchema.isPublic ? 1 : 0, + }) + .where(eq(userCollection.id, collectionId)) + .returning() + + return updatedCollection + } catch (e) { + console.error( + `Error in updateCollection for collectionId ${collectionId} and collectionSchema ${collectionSchema}`, + e + ) + throw new Error( + `Error in updateCollection for collectionId ${collectionId} and collectionSchema ${collectionSchema}` + ) + } } } diff --git a/src/v2/lib/managers/favorite/favorite-manager.ts b/src/v2/lib/managers/favorite/favorite-manager.ts index 03df0e5..4ae8af8 100644 --- a/src/v2/lib/managers/favorite/favorite-manager.ts +++ b/src/v2/lib/managers/favorite/favorite-manager.ts @@ -1,6 +1,12 @@ import { userFavorite, userFavoriteAsset } from "@/v2/db/schema" import { eq, and } from "drizzle-orm" import { DrizzleInstance } from "@/v2/db/turso" +import type { + UserFavorite, + UserFavoriteAsset, + NewUserFavorite, + NewUserFavoriteAsset, +} from "@/v2/db/schema" /** * Manages operations related to user favorites. @@ -12,26 +18,35 @@ export class FavoriteManager { * Get a user's favorite assets. * @param userId - The ID of the user to retrieve favorites for. * @param currentUserId - The optional current user's ID. - * @returns A user's favorite item. + * @returns A user's favorite assets. */ - public async getUserFavorite(userId: string, currentUserId?: string) { - const favorite = await this.drizzle - .select() - .from(userFavorite) - .leftJoin( - userFavoriteAsset, - eq(userFavoriteAsset.userFavoriteId, userFavorite.id) - ) - .where( - and( - currentUserId - ? eq(userFavorite.userId, currentUserId) - : eq(userFavorite.isPublic, 1), - eq(userFavorite.userId, userId) + public async getUserFavorite( + userId: string, + currentUserId?: string + ): Promise { + try { + const [favorite] = await this.drizzle + .select() + .from(userFavorite) + .where( + and( + currentUserId + ? eq(userFavorite.userId, currentUserId) + : eq(userFavorite.isPublic, 1), + eq(userFavorite.userId, userId) + ) ) - ) - return favorite[0] + return favorite ?? null + } catch (e) { + console.error( + `Error in getUserFavorite for userId ${userId} and currentUserId ${currentUserId}`, + e + ) + throw new Error( + `Error in getUserFavorite for userId ${userId} and currentUserId ${currentUserId}` + ) + } } /** @@ -39,32 +54,56 @@ export class FavoriteManager { * @param userId - The ID of the user to create favorites for. * @returns A user's favorite item. */ - public async createInitialFavorite(userId: string) { - const favorite = await this.drizzle - .insert(userFavorite) - .values({ - userId: userId, - }) - .returning() + public async createInitialFavorite( + userId: string + ): Promise { + try { + const [favorite] = await this.drizzle + .insert(userFavorite) + .values({ + userId: userId, + }) + .returning() - return favorite[0] + return favorite + } catch (e) { + console.error( + `Error in createInitialFavorite for userId ${userId}`, + e + ) + throw new Error( + `Error in createInitialFavorite for userId ${userId}` + ) + } } - /** * Adds an asset to a user's favorites. * @param assetId - The ID of the asset to add to favorites. * @param userFavoriteId - User's unique favorite ID. */ - public async addAssetToFavorites(assetId: number, userFavoriteId: string) { - const favorite = await this.drizzle - .insert(userFavoriteAsset) - .values({ - userFavoriteId: userFavoriteId, - assetId: assetId, - }) - .returning() + public async addAssetToFavorites( + assetId: number, + userFavoriteId: string + ): Promise { + try { + const [favorite] = await this.drizzle + .insert(userFavoriteAsset) + .values({ + userFavoriteId: userFavoriteId, + assetId: assetId, + }) + .returning() - return favorite + return favorite + } catch (e) { + console.error( + `Error in addAssetToFavorites for userFavoriteId ${userFavoriteId} and assetId ${assetId}`, + e + ) + throw new Error( + `Error in addAssetToFavorites for userFavoriteId ${userFavoriteId} and assetId ${assetId}` + ) + } } /** @@ -75,17 +114,27 @@ export class FavoriteManager { public async removeAssetFromFavorites( assetId: number, userFavoriteId: string - ) { - const favorite = await this.drizzle - .delete(userFavoriteAsset) - .where( - and( - eq(userFavoriteAsset.userFavoriteId, userFavoriteId), - eq(userFavoriteAsset.assetId, assetId) + ): Promise { + try { + const [favorite] = await this.drizzle + .delete(userFavoriteAsset) + .where( + and( + eq(userFavoriteAsset.userFavoriteId, userFavoriteId), + eq(userFavoriteAsset.assetId, assetId) + ) ) - ) - .returning() + .returning() - return favorite + return favorite ?? null + } catch (e) { + console.error( + `Error in removeAssetFromFavorites for userFavoriteId ${userFavoriteId} and assetId ${assetId}`, + e + ) + throw new Error( + `Error in removeAssetFromFavorites for userFavoriteId ${userFavoriteId} and assetId ${assetId}` + ) + } } } diff --git a/src/v2/lib/managers/game/game-manager.ts b/src/v2/lib/managers/game/game-manager.ts index 74772db..7063e71 100644 --- a/src/v2/lib/managers/game/game-manager.ts +++ b/src/v2/lib/managers/game/game-manager.ts @@ -1,6 +1,7 @@ import { DrizzleInstance } from "@/v2/db/turso" -import { game, gameAssetCategory, assetCategory } from "@/v2/db/schema" +import { game } from "@/v2/db/schema" import { eq, or, like } from "drizzle-orm" +import type { Game } from "@/v2/db/schema" /** * Manages operations related to games. @@ -13,18 +14,20 @@ export class GameManager { * @param gameId - The unique ID of the game to retrieve. * @returns A promise that resolves to the retrieved game and its asset categories. */ - public async getGameById(gameId: string) { - const foundGame = await this.drizzle - .select() - .from(game) - .leftJoin(gameAssetCategory, eq(gameAssetCategory.gameId, gameId)) - .leftJoin( - assetCategory, - eq(assetCategory.id, gameAssetCategory.assetCategoryId) - ) - .where(eq(game.id, gameId)) - - return foundGame[0] + public async getGameById(gameId: string): Promise { + let foundGame: Game | null = null + + try { + ;[foundGame] = await this.drizzle + .select() + .from(game) + .where(eq(game.id, gameId)) + } catch (e) { + console.error(`Error getting game by ID ${gameId}`, e) + throw new Error(`Error getting game by ID ${gameId}`) + } + + return foundGame } /** @@ -32,13 +35,22 @@ export class GameManager { * @param gameName - The partial name to search for within game names. * @returns A promise that resolves to an array of matching games. */ - public async getGamesByPartialName(gameName: string) { - const games = await this.drizzle - .select() - .from(game) - .where(or(like(game.name, `%${gameName}%`))) + public async getGamesByPartialName( + gameName: string + ): Promise { + let games: Game[] | null = null - return games + try { + games = await this.drizzle + .select() + .from(game) + .where(or(like(game.name, `%${gameName}%`))) + } catch (e) { + console.error("Error getting games by partial name", e) + throw new Error("Error getting games by partial name") + } + + return games ?? null } /** @@ -46,9 +58,16 @@ export class GameManager { * @returns A promise that resolves to an array of games. */ - public async listGames() { - const games = await this.drizzle.select().from(game) + public async listGames(): Promise { + let games: Game[] | null = null + + try { + games = await this.drizzle.select().from(game) + } catch (e) { + console.error("Error listing games", e) + throw new Error("Error listing games") + } - return games + return games ?? [] } } diff --git a/src/v2/lib/managers/tag/tag-manager.ts b/src/v2/lib/managers/tag/tag-manager.ts index ea56385..58f29b5 100644 --- a/src/v2/lib/managers/tag/tag-manager.ts +++ b/src/v2/lib/managers/tag/tag-manager.ts @@ -1,7 +1,8 @@ import { DrizzleInstance } from "@/v2/db/turso" -import { assetTag, assetTagAsset, asset } from "@/v2/db/schema" +import { assetTag } from "@/v2/db/schema" import { eq, or, like } from "drizzle-orm" import { z } from "zod" +import type { AssetTag, NewAssetTag } from "@/v2/db/schema" /** * Represents the schema for inserting a new asset tag. @@ -22,25 +23,37 @@ export class TagManager { * @param tagId - The unique ID of the tag to retrieve. * @returns A promise that resolves to the retrieved asset tag. */ - public async getTagById(tagId: string) { - const foundTag = await this.drizzle - .select() - .from(assetTag) - .leftJoin(assetTagAsset, eq(assetTagAsset.assetTagId, tagId)) - .leftJoin(asset, eq(asset.id, assetTagAsset.assetId)) - .where(eq(assetTag.id, tagId)) + public async getTagById(tagId: string): Promise { + let foundTag: AssetTag | null = null - return foundTag[0] + try { + ;[foundTag] = await this.drizzle + .select() + .from(assetTag) + .where(eq(assetTag.id, tagId)) + } catch (e) { + console.error(`Error getting tag by ID ${tagId}`, e) + throw new Error(`Error getting tag by ID ${tagId}`) + } + + return foundTag } /** * Retrieves a list of all asset tags. * @returns A promise that resolves to an array of asset tags. */ - public async listTags() { - const tags = await this.drizzle.select().from(assetTag) + public async listTags(): Promise { + let tags: AssetTag[] | null = null - return tags + try { + tags = await this.drizzle.select().from(assetTag) + } catch (e) { + console.error("Error listing tags", e) + throw new Error("Error listing tags") + } + + return tags ?? [] } /** @@ -48,11 +61,20 @@ export class TagManager { * @param tagName - The partial name to search for within asset tags. * @returns A promise that resolves to an array of matching asset tags. */ - public async getTagsByPartialName(tagName: string) { - const tags = await this.drizzle - .select() - .from(assetTag) - .where(or(like(assetTag.name, `%${tagName}%`))) + public async getTagsByPartialName( + tagName: string + ): Promise { + let tags: AssetTag[] | AssetTag | null = null + + try { + tags = await this.drizzle + .select() + .from(assetTag) + .where(or(like(assetTag.name, `%${tagName}%`))) + } catch (e) { + console.error("Error getting tags by partial name", e) + throw new Error("Error getting tags by partial name") + } return tags } @@ -62,15 +84,27 @@ export class TagManager { * @param newTag - The new asset tag to create, adhering to the insertAssetTagSchema. * @returns A promise that resolves to the created asset tag. */ - public async createTag(newTag: z.infer) { - const createdTag = await this.drizzle.insert(assetTag).values({ - id: newTag.name, - name: newTag.name, - formattedName: newTag.name, - assetCount: 0, - lastUpdated: new Date().toISOString(), - }) + public async createTag( + newTag: z.infer + ): Promise { + let createdTag: NewAssetTag | null = null + + try { + ;[createdTag] = await this.drizzle + .insert(assetTag) + .values({ + id: newTag.name, + name: newTag.name, + formattedName: newTag.name, + assetCount: 0, + lastUpdated: new Date().toISOString(), + }) + .returning() + } catch (e) { + console.error("Error creating tag", e) + throw new Error("Error creating tag") + } - return createdTag + return createdTag! } } diff --git a/src/v2/lib/managers/user/user-follow-manager.ts b/src/v2/lib/managers/user/user-follow-manager.ts index 8b232b4..80e0208 100644 --- a/src/v2/lib/managers/user/user-follow-manager.ts +++ b/src/v2/lib/managers/user/user-follow-manager.ts @@ -1,6 +1,7 @@ import { DrizzleInstance } from "@/v2/db/turso" import { and, eq } from "drizzle-orm" import { userNetworking } from "@/v2/db/schema" +import type { UserNetworking, NewUserNetworking } from "@/v2/db/schema" /** * Manages user follow and unfollow operations. @@ -15,17 +16,30 @@ export class UserFollowManager { * @param followingId - The ID of the user being followed. * @returns The user networking object representing the follow relationship. */ - public async followUser(followerId: string, followingId: string) { - const networking = await this.drizzle - .insert(userNetworking) - .values({ - followerId, - followingId, - createdAt: new Date().toISOString(), - }) - .returning() + public async followUser( + followerId: string, + followingId: string + ): Promise { + try { + const [networking] = await this.drizzle + .insert(userNetworking) + .values({ + followerId, + followingId, + createdAt: new Date().toISOString(), + }) + .returning() - return networking[0] + return networking + } catch (e) { + console.error( + `Error following user ${followingId} from user ${followerId}`, + e + ) + throw new Error( + `Error following user ${followingId} from user ${followerId}` + ) + } } /** @@ -35,18 +49,31 @@ export class UserFollowManager { * @param followingId - The ID of the user being unfollowed. * @returns The user networking object representing the removed follow relationship. */ - public async unfollowUser(followerId: string, followingId: string) { - const networking = await this.drizzle - .delete(userNetworking) - .where( - and( - eq(userNetworking.followerId, followerId), - eq(userNetworking.followingId, followingId) + public async unfollowUser( + followerId: string, + followingId: string + ): Promise { + try { + const [networking] = await this.drizzle + .delete(userNetworking) + .where( + and( + eq(userNetworking.followerId, followerId), + eq(userNetworking.followingId, followingId) + ) ) - ) - .returning() + .returning() - return networking[0] + return networking + } catch (e) { + console.error( + `Error unfollowing user ${followingId} from user ${followerId}`, + e + ) + throw new Error( + `Error unfollowing user ${followingId} from user ${followerId}` + ) + } } /** @@ -55,12 +82,19 @@ export class UserFollowManager { * @param userId - The ID of the user for whom to retrieve followers. * @returns An array of user networking objects representing followers. */ - public async getFollowers(userId: string) { - const followers = await this.drizzle - .select() - .from(userNetworking) - .where(eq(userNetworking.followingId, userId)) + public async getFollowers( + userId: string + ): Promise { + try { + const followers = await this.drizzle + .select() + .from(userNetworking) + .where(eq(userNetworking.followingId, userId)) - return followers + return followers ?? null + } catch (e) { + console.error(`Error getting followers for user ${userId}`, e) + throw new Error(`Error getting followers for user ${userId}`) + } } } diff --git a/src/v2/lib/managers/user/user-profile-manager.ts b/src/v2/lib/managers/user/user-profile-manager.ts index 6190ae4..4ee4442 100644 --- a/src/v2/lib/managers/user/user-profile-manager.ts +++ b/src/v2/lib/managers/user/user-profile-manager.ts @@ -1,5 +1,6 @@ import { DrizzleInstance } from "@/v2/db/turso" import { authUser } from "@/v2/db/schema" +import type { User } from "@/v2/db/schema" import { R2Bucket } from "@cloudflare/workers-types" import { eq } from "drizzle-orm" import { z } from "zod" @@ -33,18 +34,23 @@ export class UserProfileManager { public async updateUserAttributes( userId: string, attributes: z.infer - ) { - const validAttributes = UserAttributesSchema.safeParse(attributes) - if (!validAttributes.success) - throw new Error(`Invalid attributes provided`) - - const user = await this.drizzle - .update(authUser) - .set(attributes) - .where(eq(authUser.id, userId)) - .returning() - - return user[0] + ): Promise { + try { + const validAttributes = UserAttributesSchema.safeParse(attributes) + if (!validAttributes.success) + throw new Error(`Invalid attributes provided`) + + const [user] = await this.drizzle + .update(authUser) + .set(attributes) + .where(eq(authUser.id, userId)) + .returning() + + return user + } catch (e) { + console.error(`Error updating user attributes`, e) + throw new Error(`Error updating user attributes`) + } } /** @@ -59,16 +65,21 @@ export class UserProfileManager { userId: string, bucket: R2Bucket, file: File - ) { - const { key } = await bucket.put(`/avatars/${userId}.png`, file) - - const user = await this.drizzle - .update(authUser) - .set({ avatarUrl: key }) - .where(eq(authUser.id, userId)) - .returning() - - return user[0].avatarUrl + ): Promise { + try { + const { key } = await bucket.put(`/avatars/${userId}.png`, file) + + const [user] = await this.drizzle + .update(authUser) + .set({ avatarUrl: key }) + .where(eq(authUser.id, userId)) + .returning() + + return user.avatarUrl + } catch (e) { + console.error(`Error updating profile picture`, e) + throw new Error(`Error updating profile picture`) + } } /** @@ -79,16 +90,25 @@ export class UserProfileManager { * @param file - The new banner image file. * @returns The URL of the updated banner image. */ - public async updateBanner(userId: string, bucket: R2Bucket, file: File) { - const { key } = await bucket.put(`/banners/${userId}.png`, file) - - const user = await this.drizzle - .update(authUser) - .set({ bannerUrl: key }) - .where(eq(authUser.id, userId)) - .returning() - - return user[0].bannerUrl + public async updateBanner( + userId: string, + bucket: R2Bucket, + file: File + ): Promise { + try { + const { key } = await bucket.put(`/banners/${userId}.png`, file) + + const [user] = await this.drizzle + .update(authUser) + .set({ bannerUrl: key }) + .where(eq(authUser.id, userId)) + .returning() + + return user.bannerUrl + } catch (e) { + console.error(`Error updating banner`, e) + throw new Error(`Error updating banner`) + } } /** @@ -98,16 +118,24 @@ export class UserProfileManager { * @param bucket - The R2Bucket where the picture is stored. * @returns The URL of the reset profile picture (null). */ - public async resetProfilePicture(userId: string, bucket: R2Bucket) { - await bucket.delete(`/avatars/${userId}.png`) - - const user = await this.drizzle - .update(authUser) - .set({ avatarUrl: null }) - .where(eq(authUser.id, userId)) - .returning() - - return user[0].avatarUrl + public async resetProfilePicture( + userId: string, + bucket: R2Bucket + ): Promise { + try { + await bucket.delete(`/avatars/${userId}.png`) + + const [user] = await this.drizzle + .update(authUser) + .set({ avatarUrl: null }) + .where(eq(authUser.id, userId)) + .returning() + + return user.avatarUrl + } catch (e) { + console.error(`Error resetting profile picture`, e) + throw new Error(`Error resetting profile picture`) + } } /** @@ -118,14 +146,19 @@ export class UserProfileManager { * @returns The URL of the reset banner image (null). */ public async resetBanner(userId: string, bucket: R2Bucket) { - await bucket.delete(`/banners/${userId}.png`) - - const user = await this.drizzle - .update(authUser) - .set({ bannerUrl: null }) - .where(eq(authUser.id, userId)) - .returning() - - return user[0].bannerUrl + try { + await bucket.delete(`/banners/${userId}.png`) + + const [user] = await this.drizzle + .update(authUser) + .set({ bannerUrl: null }) + .where(eq(authUser.id, userId)) + .returning() + + return user.bannerUrl + } catch (e) { + console.error(`Error resetting banner`, e) + throw new Error(`Error resetting banner`) + } } } diff --git a/src/v2/lib/managers/user/user-search-manager.ts b/src/v2/lib/managers/user/user-search-manager.ts index 88d755b..a54e153 100644 --- a/src/v2/lib/managers/user/user-search-manager.ts +++ b/src/v2/lib/managers/user/user-search-manager.ts @@ -1,6 +1,7 @@ import { DrizzleInstance } from "@/v2/db/turso" import { authUser } from "@/v2/db/schema" import { eq, or, like } from "drizzle-orm" +import type { User } from "@/v2/db/schema" /** * Manages user search and retrieval operations. @@ -14,13 +15,18 @@ export class UserSearchManager { * @param userId - The ID of the user to retrieve. * @returns The user object or undefined if not found. */ - public async getUserById(userId: string) { - const user = await this.drizzle - .select() - .from(authUser) - .where(eq(authUser.id, userId)) + public async getUserById(userId: string): Promise { + try { + const [user] = await this.drizzle + .select() + .from(authUser) + .where(eq(authUser.id, userId)) - return user[0] + return user ?? null + } catch (e) { + console.error(`Error getting user by ID ${userId}`, e) + throw new Error(`Error getting user by ID ${userId}`) + } } /** @@ -29,13 +35,18 @@ export class UserSearchManager { * @param username - The username of the user to retrieve. * @returns The user object or undefined if not found. */ - public async getUserByUsername(username: string) { - const user = await this.drizzle - .select() - .from(authUser) - .where(eq(authUser.username, username)) + public async getUserByUsername(username: string): Promise { + try { + const [user] = await this.drizzle + .select() + .from(authUser) + .where(eq(authUser.username, username)) - return user[0] + return user ?? null + } catch (e) { + console.error(`Error getting user by username ${username}`, e) + throw new Error(`Error getting user by username ${username}`) + } } /** @@ -44,13 +55,18 @@ export class UserSearchManager { * @param username - The partial username to search for. * @returns An array of user objects matching the search criteria, limited to 25 results. */ - public async getUsersByUsername(username: string) { - const users = await this.drizzle - .select() - .from(authUser) - .where(or(like(authUser.username, `%${username}%`))) - .limit(25) + public async getUsersByUsername(username: string): Promise { + try { + const users = await this.drizzle + .select() + .from(authUser) + .where(or(like(authUser.username, `%${username}%`))) + .limit(25) - return users + return users ?? null + } catch (e) { + console.error(`Error getting users by username ${username}`, e) + throw new Error(`Error getting users by username ${username}`) + } } } From a96755b6291b82d4e0c1b9b903f6b01f117419e8 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Fri, 17 Nov 2023 01:30:12 +0000 Subject: [PATCH 154/318] what the fuck --- src/v2/lib/managers/game/game-manager.ts | 25 +++++++++--------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/src/v2/lib/managers/game/game-manager.ts b/src/v2/lib/managers/game/game-manager.ts index 7063e71..812b954 100644 --- a/src/v2/lib/managers/game/game-manager.ts +++ b/src/v2/lib/managers/game/game-manager.ts @@ -15,19 +15,17 @@ export class GameManager { * @returns A promise that resolves to the retrieved game and its asset categories. */ public async getGameById(gameId: string): Promise { - let foundGame: Game | null = null - try { - ;[foundGame] = await this.drizzle + const [foundGame] = await this.drizzle .select() .from(game) .where(eq(game.id, gameId)) + + return foundGame ?? null } catch (e) { console.error(`Error getting game by ID ${gameId}`, e) throw new Error(`Error getting game by ID ${gameId}`) } - - return foundGame } /** @@ -38,19 +36,17 @@ export class GameManager { public async getGamesByPartialName( gameName: string ): Promise { - let games: Game[] | null = null - try { - games = await this.drizzle + const games = await this.drizzle .select() .from(game) .where(or(like(game.name, `%${gameName}%`))) + + return games ?? null } catch (e) { console.error("Error getting games by partial name", e) throw new Error("Error getting games by partial name") } - - return games ?? null } /** @@ -58,16 +54,13 @@ export class GameManager { * @returns A promise that resolves to an array of games. */ - public async listGames(): Promise { - let games: Game[] | null = null - + public async listGames(): Promise { try { - games = await this.drizzle.select().from(game) + const games = await this.drizzle.select().from(game) + return games ?? null } catch (e) { console.error("Error listing games", e) throw new Error("Error listing games") } - - return games ?? [] } } From b33f9139714a8bc86a29d013beb093b88218c3c5 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Fri, 17 Nov 2023 01:33:41 +0000 Subject: [PATCH 155/318] bro [skip ci] --- .eslintrc.json | 4 ++-- src/v2/lib/managers/tag/tag-manager.ts | 33 ++++++++++---------------- 2 files changed, 14 insertions(+), 23 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 65056df..313ca75 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -5,8 +5,8 @@ "plugins": ["json"], "rules": { "no-const-assign": "error", - "camelcase": "off", - "no-extra-semi": "off" + "camelcase": "off", // it complains becuase of zod, idk how to fix it + "no-extra-semi": "error" }, "parserOptions": { "allowImportExportEverywhere": true, diff --git a/src/v2/lib/managers/tag/tag-manager.ts b/src/v2/lib/managers/tag/tag-manager.ts index 58f29b5..457044a 100644 --- a/src/v2/lib/managers/tag/tag-manager.ts +++ b/src/v2/lib/managers/tag/tag-manager.ts @@ -24,36 +24,31 @@ export class TagManager { * @returns A promise that resolves to the retrieved asset tag. */ public async getTagById(tagId: string): Promise { - let foundTag: AssetTag | null = null - try { - ;[foundTag] = await this.drizzle + const [foundTag] = await this.drizzle .select() .from(assetTag) .where(eq(assetTag.id, tagId)) + + return foundTag ?? null } catch (e) { console.error(`Error getting tag by ID ${tagId}`, e) throw new Error(`Error getting tag by ID ${tagId}`) } - - return foundTag } /** * Retrieves a list of all asset tags. * @returns A promise that resolves to an array of asset tags. */ - public async listTags(): Promise { - let tags: AssetTag[] | null = null - + public async listTags(): Promise { try { - tags = await this.drizzle.select().from(assetTag) + const tags = await this.drizzle.select().from(assetTag) + return tags ?? null } catch (e) { console.error("Error listing tags", e) throw new Error("Error listing tags") } - - return tags ?? [] } /** @@ -64,19 +59,17 @@ export class TagManager { public async getTagsByPartialName( tagName: string ): Promise { - let tags: AssetTag[] | AssetTag | null = null - try { - tags = await this.drizzle + const tags = await this.drizzle .select() .from(assetTag) .where(or(like(assetTag.name, `%${tagName}%`))) + + return tags ?? null } catch (e) { console.error("Error getting tags by partial name", e) throw new Error("Error getting tags by partial name") } - - return tags } /** @@ -87,10 +80,8 @@ export class TagManager { public async createTag( newTag: z.infer ): Promise { - let createdTag: NewAssetTag | null = null - try { - ;[createdTag] = await this.drizzle + const [createdTag] = await this.drizzle .insert(assetTag) .values({ id: newTag.name, @@ -100,11 +91,11 @@ export class TagManager { lastUpdated: new Date().toISOString(), }) .returning() + + return createdTag } catch (e) { console.error("Error creating tag", e) throw new Error("Error creating tag") } - - return createdTag! } } From f060e8d0954ed3a61a421270663b340ec978a920 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Fri, 17 Nov 2023 02:50:55 +0000 Subject: [PATCH 156/318] appropriate int cols use mode bool --- src/scripts/seed/seed.ts | 15 +++++++-------- src/v2/db/schema/asset/asset.ts | 7 ++++++- src/v2/db/schema/oc-generators/oc-generators.ts | 4 +++- src/v2/db/schema/user/user-collections.ts | 4 +++- src/v2/db/schema/user/user-favorites.ts | 4 +++- src/v2/db/schema/user/user.ts | 4 +++- .../lib/managers/collection/collection-manager.ts | 12 ++++++------ src/v2/lib/managers/favorite/favorite-manager.ts | 2 +- 8 files changed, 32 insertions(+), 20 deletions(-) diff --git a/src/scripts/seed/seed.ts b/src/scripts/seed/seed.ts index 2dc7080..effd475 100644 --- a/src/scripts/seed/seed.ts +++ b/src/scripts/seed/seed.ts @@ -52,7 +52,7 @@ async function main() { usernameColour: "#84E6F8", bio: "test bio", roleFlags: 1, - isContributor: 0, + isContributor: true, selfAssignableRoleFlags: 0, }, { @@ -63,7 +63,7 @@ async function main() { bio: "test bio 2", pronouns: "he/him/his", roleFlags: 1, - isContributor: 0, + isContributor: false, selfAssignableRoleFlags: 0, }, { @@ -73,7 +73,7 @@ async function main() { emailVerified: 1, bio: "test bio 3", roleFlags: 1, - isContributor: 0, + isContributor: false, selfAssignableRoleFlags: 0, }, ]) @@ -201,7 +201,7 @@ async function main() { url: "/test/image.png", status: "approved", uploadedById: newUsers[0].id, - assetIsOptimized: 0, + assetIsOptimized: true, viewCount: 1337, downloadCount: 1337, fileSize: 40213, @@ -217,7 +217,6 @@ async function main() { url: "/test/image.png", status: "approved", uploadedById: newUsers[1].id, - assetIsOptimized: 0, viewCount: 1337, downloadCount: 1337, fileSize: 40213, @@ -233,7 +232,7 @@ async function main() { url: "/test/image.png", status: "approved", uploadedById: newUsers[1].id, - assetIsOptimized: 0, + assetIsOptimized: true, viewCount: 1337, downloadCount: 1337, fileSize: 40213, @@ -275,7 +274,7 @@ async function main() { name: "collection name", description: "collection description", userId: newUsers[0].id, - isPublic: 0, // default to private + isPublic: true, // default to private }) .returning() console.log(`[userCollection] inserted ${newUserCollections.length} rows\n`) @@ -308,7 +307,7 @@ async function main() { }, { userId: newUsers[1].id, - isPublic: 1, + isPublic: false, }, ]) .returning() diff --git a/src/v2/db/schema/asset/asset.ts b/src/v2/db/schema/asset/asset.ts index 8f82756..ba3ff2a 100644 --- a/src/v2/db/schema/asset/asset.ts +++ b/src/v2/db/schema/asset/asset.ts @@ -59,7 +59,12 @@ export const asset = sqliteTable( .$defaultFn(() => { return new Date().toISOString() }), - assetIsOptimized: integer("asset_is_optimized").default(0).notNull(), + assetIsOptimized: integer("asset_is_optimized", { mode: "boolean" }) + .default(false) + .notNull(), + assetIsSuggestive: integer("asset_is_suggestive", { mode: "boolean" }) + .default(false) + .notNull(), viewCount: integer("view_count").default(0).notNull(), downloadCount: integer("download_count").default(0).notNull(), fileSize: integer("file_size").default(0).notNull(), diff --git a/src/v2/db/schema/oc-generators/oc-generators.ts b/src/v2/db/schema/oc-generators/oc-generators.ts index c999837..57ef5c4 100644 --- a/src/v2/db/schema/oc-generators/oc-generators.ts +++ b/src/v2/db/schema/oc-generators/oc-generators.ts @@ -32,7 +32,9 @@ export const savedOcGenerators = sqliteTable( .$defaultFn(() => { return new Date().toISOString() }), - isPublic: integer("is_public").default(0).notNull(), + isPublic: integer("is_public", { mode: "boolean" }) + .default(false) + .notNull(), content: text("content").notNull(), savedColorPalette: text("saved_color_palette"), // array of 5 hex values, completely optional for the user to save sakuraUrl: text("sakura_url"), diff --git a/src/v2/db/schema/user/user-collections.ts b/src/v2/db/schema/user/user-collections.ts index 423357b..9f0cce5 100644 --- a/src/v2/db/schema/user/user-collections.ts +++ b/src/v2/db/schema/user/user-collections.ts @@ -39,7 +39,9 @@ export const userCollection = sqliteTable( .$defaultFn(() => { return new Date().toISOString() }), - isPublic: integer("is_public").default(0).notNull(), + isPublic: integer("is_public", { mode: "boolean" }) + .default(false) + .notNull(), }, (collection) => { return { diff --git a/src/v2/db/schema/user/user-favorites.ts b/src/v2/db/schema/user/user-favorites.ts index a7f9cb6..e77fe13 100644 --- a/src/v2/db/schema/user/user-favorites.ts +++ b/src/v2/db/schema/user/user-favorites.ts @@ -32,7 +32,9 @@ export const userFavorite = sqliteTable( onUpdate: "cascade", onDelete: "cascade", }), - isPublic: integer("is_public").default(0).notNull(), + isPublic: integer("is_public", { mode: "boolean" }) + .default(false) + .notNull(), }, (userFavorite) => { return { diff --git a/src/v2/db/schema/user/user.ts b/src/v2/db/schema/user/user.ts index 9ee004e..ca9d6df 100644 --- a/src/v2/db/schema/user/user.ts +++ b/src/v2/db/schema/user/user.ts @@ -43,7 +43,9 @@ export const authUser = sqliteTable( return new Date().toISOString() }), roleFlags: integer("role_flags").default(1).notNull(), - isContributor: integer("is_contributor").default(0).notNull(), + isContributor: integer("is_contributor", { mode: "boolean" }) + .default(false) + .notNull(), selfAssignableRoleFlags: integer("self_assignable_role_flags") .default(0) .notNull(), diff --git a/src/v2/lib/managers/collection/collection-manager.ts b/src/v2/lib/managers/collection/collection-manager.ts index fac8749..50c8abb 100644 --- a/src/v2/lib/managers/collection/collection-manager.ts +++ b/src/v2/lib/managers/collection/collection-manager.ts @@ -38,7 +38,7 @@ export class CollectionManager { and( currentUserId ? eq(userCollection.userId, currentUserId) - : eq(userCollection.isPublic, 1), + : eq(userCollection.isPublic, true), eq(userCollection.id, collectionId) ) ) @@ -69,7 +69,7 @@ export class CollectionManager { .where( currentUserId ? eq(userCollection.userId, currentUserId) - : eq(userCollection.isPublic, 1) + : eq(userCollection.isPublic, true) ) return collections ?? null @@ -101,7 +101,7 @@ export class CollectionManager { and( currentUserId ? eq(userCollection.userId, currentUserId) - : eq(userCollection.isPublic, 1), + : eq(userCollection.isPublic, true), like(userCollection.name, `%${collectionName}%`) ) ) @@ -134,7 +134,7 @@ export class CollectionManager { and( currentUserId ? eq(userCollection.userId, currentUserId) - : eq(userCollection.isPublic, 1), + : eq(userCollection.isPublic, true), eq(userCollection.userId, userId) ) ) @@ -255,7 +255,7 @@ export class CollectionManager { userId: userId, description: collectionSchema.description, name: collectionSchema.name, - isPublic: collectionSchema.isPublic ? 1 : 0, + isPublic: collectionSchema.isPublic, }) .returning() @@ -288,7 +288,7 @@ export class CollectionManager { .set({ description: collectionSchema.description, name: collectionSchema.name, - isPublic: collectionSchema.isPublic ? 1 : 0, + isPublic: collectionSchema.isPublic, }) .where(eq(userCollection.id, collectionId)) .returning() diff --git a/src/v2/lib/managers/favorite/favorite-manager.ts b/src/v2/lib/managers/favorite/favorite-manager.ts index 4ae8af8..4d8850f 100644 --- a/src/v2/lib/managers/favorite/favorite-manager.ts +++ b/src/v2/lib/managers/favorite/favorite-manager.ts @@ -32,7 +32,7 @@ export class FavoriteManager { and( currentUserId ? eq(userFavorite.userId, currentUserId) - : eq(userFavorite.isPublic, 1), + : eq(userFavorite.isPublic, true), eq(userFavorite.userId, userId) ) ) From 8f5a75d915ca5f4d43c94fa133170aa15bc700ea Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Fri, 17 Nov 2023 02:52:50 +0000 Subject: [PATCH 157/318] generate new migration --- ...o.sql => 0000_busy_dreaming_celestial.sql} | 11 +- src/v2/db/migrations/meta/0000_snapshot.json | 3102 +++++++++-------- src/v2/db/migrations/meta/_journal.json | 24 +- 3 files changed, 1679 insertions(+), 1458 deletions(-) rename src/v2/db/migrations/{0000_silky_agent_zero.sql => 0000_busy_dreaming_celestial.sql} (97%) diff --git a/src/v2/db/migrations/0000_silky_agent_zero.sql b/src/v2/db/migrations/0000_busy_dreaming_celestial.sql similarity index 97% rename from src/v2/db/migrations/0000_silky_agent_zero.sql rename to src/v2/db/migrations/0000_busy_dreaming_celestial.sql index de7fc89..265d432 100644 --- a/src/v2/db/migrations/0000_silky_agent_zero.sql +++ b/src/v2/db/migrations/0000_busy_dreaming_celestial.sql @@ -8,7 +8,8 @@ CREATE TABLE `asset` ( `url` text NOT NULL, `status` text DEFAULT 'pending' NOT NULL, `uploaded_date` text NOT NULL, - `asset_is_optimized` integer DEFAULT 0 NOT NULL, + `asset_is_optimized` integer DEFAULT false NOT NULL, + `asset_is_suggestive` integer DEFAULT false NOT NULL, `view_count` integer DEFAULT 0 NOT NULL, `download_count` integer DEFAULT 0 NOT NULL, `file_size` integer DEFAULT 0 NOT NULL, @@ -81,7 +82,7 @@ CREATE TABLE `savedOcGenerators` ( `name` text NOT NULL, `game` text NOT NULL, `date_created` text NOT NULL, - `is_public` integer DEFAULT 0 NOT NULL, + `is_public` integer DEFAULT false NOT NULL, `content` text NOT NULL, `saved_color_palette` text, `sakura_url` text, @@ -102,7 +103,7 @@ CREATE TABLE `authUser` ( `bio` text DEFAULT 'No bio set' NOT NULL, `date_joined` text NOT NULL, `role_flags` integer DEFAULT 1 NOT NULL, - `is_contributor` integer DEFAULT 0 NOT NULL, + `is_contributor` integer DEFAULT false NOT NULL, `self_assignable_role_flags` integer DEFAULT 0 NOT NULL ); --> statement-breakpoint @@ -135,7 +136,7 @@ CREATE TABLE `userCollection` ( `description` text NOT NULL, `user_id` text NOT NULL, `date_created` text NOT NULL, - `is_public` integer DEFAULT 0 NOT NULL, + `is_public` integer DEFAULT false NOT NULL, FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade ); --> statement-breakpoint @@ -157,7 +158,7 @@ CREATE TABLE `socialsConnection` ( CREATE TABLE `userFavorite` ( `id` text NOT NULL, `user_id` text NOT NULL, - `is_public` integer DEFAULT 0 NOT NULL, + `is_public` integer DEFAULT false NOT NULL, FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade ); --> statement-breakpoint diff --git a/src/v2/db/migrations/meta/0000_snapshot.json b/src/v2/db/migrations/meta/0000_snapshot.json index 06f3a25..b9017ef 100644 --- a/src/v2/db/migrations/meta/0000_snapshot.json +++ b/src/v2/db/migrations/meta/0000_snapshot.json @@ -1,1447 +1,1667 @@ { - "version": "5", - "dialect": "sqlite", - "id": "f2ae8a0d-cb11-48b7-bcfd-52e82220539a", - "prevId": "00000000-0000-0000-0000-000000000000", - "tables": { - "asset": { - "name": "asset", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "extension": { - "name": "extension", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "game": { - "name": "game", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_category": { - "name": "asset_category", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by": { - "name": "uploaded_by", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "url": { - "name": "url", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "status": { - "name": "status", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "'pending'" - }, - "uploaded_date": { - "name": "uploaded_date", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_is_optimized": { - "name": "asset_is_optimized", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "view_count": { - "name": "view_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "download_count": { - "name": "download_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "file_size": { - "name": "file_size", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "width": { - "name": "width", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "height": { - "name": "height", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "assets_id_idx": { - "name": "assets_id_idx", - "columns": ["id"], - "isUnique": false - }, - "assets_name_idx": { - "name": "assets_name_idx", - "columns": ["name"], - "isUnique": false - }, - "assets_game_name_idx": { - "name": "assets_game_name_idx", - "columns": ["game"], - "isUnique": false - }, - "assets_asset_category_name_idx": { - "name": "assets_asset_category_name_idx", - "columns": ["asset_category"], - "isUnique": false - }, - "assets_uploaded_by_id_idx": { - "name": "assets_uploaded_by_id_idx", - "columns": ["uploaded_by"], - "isUnique": false - } - }, - "foreignKeys": { - "asset_game_game_id_fk": { - "name": "asset_game_game_id_fk", - "tableFrom": "asset", - "tableTo": "game", - "columnsFrom": ["game"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "asset_asset_category_assetCategory_id_fk": { - "name": "asset_asset_category_assetCategory_id_fk", - "tableFrom": "asset", - "tableTo": "assetCategory", - "columnsFrom": ["asset_category"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "asset_uploaded_by_authUser_id_fk": { - "name": "asset_uploaded_by_authUser_id_fk", - "tableFrom": "asset", - "tableTo": "authUser", - "columnsFrom": ["uploaded_by"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetCategory": { - "name": "assetCategory", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetCategory_id_unique": { - "name": "assetCategory_id_unique", - "columns": ["id"], - "isUnique": true - }, - "assetCategory_name_unique": { - "name": "assetCategory_name_unique", - "columns": ["name"], - "isUnique": true - }, - "asset_category_id_idx": { - "name": "asset_category_id_idx", - "columns": ["id"], - "isUnique": false - }, - "asset_category_name_idx": { - "name": "asset_category_name_idx", - "columns": ["name"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "gameAssetCategory": { - "name": "gameAssetCategory", - "columns": { - "game_id": { - "name": "game_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_category_id": { - "name": "asset_category_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "game_asset_category_game_id_idx": { - "name": "game_asset_category_game_id_idx", - "columns": ["game_id"], - "isUnique": false - }, - "game_asset_category_asset_category_id_idx": { - "name": "game_asset_category_asset_category_id_idx", - "columns": ["asset_category_id"], - "isUnique": false - } - }, - "foreignKeys": { - "gameAssetCategory_game_id_game_id_fk": { - "name": "gameAssetCategory_game_id_game_id_fk", - "tableFrom": "gameAssetCategory", - "tableTo": "game", - "columnsFrom": ["game_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "gameAssetCategory_asset_category_id_assetCategory_id_fk": { - "name": "gameAssetCategory_asset_category_id_assetCategory_id_fk", - "tableFrom": "gameAssetCategory", - "tableTo": "assetCategory", - "columnsFrom": ["asset_category_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetTag": { - "name": "assetTag", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetTag_id_unique": { - "name": "assetTag_id_unique", - "columns": ["id"], - "isUnique": true - }, - "assetTag_name_unique": { - "name": "assetTag_name_unique", - "columns": ["name"], - "isUnique": true - }, - "asset_tag_id_idx": { - "name": "asset_tag_id_idx", - "columns": ["id"], - "isUnique": false - }, - "asset_tag_name_idx": { - "name": "asset_tag_name_idx", - "columns": ["name"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetTagAsset": { - "name": "assetTagAsset", - "columns": { - "asset_tag_id": { - "name": "asset_tag_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "asset_tags_assets_asset_tag_id_idx": { - "name": "asset_tags_assets_asset_tag_id_idx", - "columns": ["asset_tag_id"], - "isUnique": false - }, - "asset_tags_assets_asset_id_idx": { - "name": "asset_tags_assets_asset_id_idx", - "columns": ["asset_id"], - "isUnique": false - } - }, - "foreignKeys": { - "assetTagAsset_asset_tag_id_assetTag_id_fk": { - "name": "assetTagAsset_asset_tag_id_assetTag_id_fk", - "tableFrom": "assetTagAsset", - "tableTo": "assetTag", - "columnsFrom": ["asset_tag_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "assetTagAsset_asset_id_asset_id_fk": { - "name": "assetTagAsset_asset_id_asset_id_fk", - "tableFrom": "assetTagAsset", - "tableTo": "asset", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "atlas": { - "name": "atlas", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "url": { - "name": "url", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by": { - "name": "uploaded_by", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by_name": { - "name": "uploaded_by_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_date": { - "name": "uploaded_date", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "file_size": { - "name": "file_size", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "atlas_id_unique": { - "name": "atlas_id_unique", - "columns": ["id"], - "isUnique": true - }, - "atlas_id_idx": { - "name": "atlas_id_idx", - "columns": ["id"], - "isUnique": false - }, - "atlas_uploaded_by_idx": { - "name": "atlas_uploaded_by_idx", - "columns": ["uploaded_by"], - "isUnique": false - }, - "atlas_uploaded_by_name_idx": { - "name": "atlas_uploaded_by_name_idx", - "columns": ["uploaded_by_name"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "atlasToAsset": { - "name": "atlasToAsset", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "atlas_id": { - "name": "atlas_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "atlas_to_assets_id_idx": { - "name": "atlas_to_assets_id_idx", - "columns": ["id"], - "isUnique": false - }, - "atlas_to_assets_atlas_id_idx": { - "name": "atlas_to_assets_atlas_id_idx", - "columns": ["atlas_id"], - "isUnique": false - }, - "atlas_to_assets_asset_id_idx": { - "name": "atlas_to_assets_asset_id_idx", - "columns": ["asset_id"], - "isUnique": false - } - }, - "foreignKeys": { - "atlasToAsset_atlas_id_atlas_id_fk": { - "name": "atlasToAsset_atlas_id_atlas_id_fk", - "tableFrom": "atlasToAsset", - "tableTo": "atlas", - "columnsFrom": ["atlas_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "atlasToAsset_asset_id_asset_id_fk": { - "name": "atlasToAsset_asset_id_asset_id_fk", - "tableFrom": "atlasToAsset", - "tableTo": "asset", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "version": "5", + "dialect": "sqlite", + "id": "f07490ab-84e2-4512-9bfa-2535e05274b7", + "prevId": "00000000-0000-0000-0000-000000000000", + "tables": { + "asset": { + "name": "asset", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "extension": { + "name": "extension", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false }, "game": { - "name": "game", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - }, - "possible_suggestive_content": { - "name": "possible_suggestive_content", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "game_id_unique": { - "name": "game_id_unique", - "columns": ["id"], - "isUnique": true - }, - "game_name_unique": { - "name": "game_name_unique", - "columns": ["name"], - "isUnique": true - }, - "game_id_idx": { - "name": "game_id_idx", - "columns": ["id"], - "isUnique": false - }, - "game_name_idx": { - "name": "game_name_idx", - "columns": ["name"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "savedOcGenerators": { - "name": "savedOcGenerators", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "game": { - "name": "game", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "date_created": { - "name": "date_created", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "content": { - "name": "content", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "saved_color_palette": { - "name": "saved_color_palette", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "sakura_url": { - "name": "sakura_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "savedOcGenerators_id_unique": { - "name": "savedOcGenerators_id_unique", - "columns": ["id"], - "isUnique": true - }, - "saved_oc_generators_id_idx": { - "name": "saved_oc_generators_id_idx", - "columns": ["id"], - "isUnique": false - }, - "saved_oc_generators_user_id_idx": { - "name": "saved_oc_generators_user_id_idx", - "columns": ["user_id"], - "isUnique": false - } - }, - "foreignKeys": { - "savedOcGenerators_user_id_authUser_id_fk": { - "name": "savedOcGenerators_user_id_authUser_id_fk", - "tableFrom": "savedOcGenerators", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "authUser": { - "name": "authUser", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "avatar_url": { - "name": "avatar_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "banner_url": { - "name": "banner_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "display_name": { - "name": "display_name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "username": { - "name": "username", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "username_colour": { - "name": "username_colour", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "email": { - "name": "email", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "email_verified": { - "name": "email_verified", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "pronouns": { - "name": "pronouns", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "verified": { - "name": "verified", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "bio": { - "name": "bio", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "'No bio set'" - }, - "date_joined": { - "name": "date_joined", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "role_flags": { - "name": "role_flags", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 1 - }, - "is_contributor": { - "name": "is_contributor", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "self_assignable_role_flags": { - "name": "self_assignable_role_flags", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "authUser_id_unique": { - "name": "authUser_id_unique", - "columns": ["id"], - "isUnique": true - }, - "authUser_username_unique": { - "name": "authUser_username_unique", - "columns": ["username"], - "isUnique": true - }, - "user_id_idx": { - "name": "user_id_idx", - "columns": ["id"], - "isUnique": false - }, - "user_username_idx": { - "name": "user_username_idx", - "columns": ["username"], - "isUnique": false - }, - "user_email_idx": { - "name": "user_email_idx", - "columns": ["email"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "authKey": { - "name": "authKey", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "hashed_password": { - "name": "hashed_password", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "authKey_id_unique": { - "name": "authKey_id_unique", - "columns": ["id"], - "isUnique": true - }, - "key_user_id_idx": { - "name": "key_user_id_idx", - "columns": ["user_id"], - "isUnique": false - } - }, - "foreignKeys": { - "authKey_user_id_authUser_id_fk": { - "name": "authKey_user_id_authUser_id_fk", - "tableFrom": "authKey", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "emailVerificationToken": { - "name": "emailVerificationToken", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "emailVerificationToken_id_unique": { - "name": "emailVerificationToken_id_unique", - "columns": ["id"], - "isUnique": true - }, - "email_verification_token_user_id_idx": { - "name": "email_verification_token_user_id_idx", - "columns": ["user_id"], - "isUnique": false - }, - "email_verification_token_token_idx": { - "name": "email_verification_token_token_idx", - "columns": ["token"], - "isUnique": false - } - }, - "foreignKeys": { - "emailVerificationToken_user_id_authUser_id_fk": { - "name": "emailVerificationToken_user_id_authUser_id_fk", - "tableFrom": "emailVerificationToken", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "passwordResetToken": { - "name": "passwordResetToken", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "passwordResetToken_id_unique": { - "name": "passwordResetToken_id_unique", - "columns": ["id"], - "isUnique": true - }, - "password_reset_token_user_id_idx": { - "name": "password_reset_token_user_id_idx", - "columns": ["user_id"], - "isUnique": false - }, - "password_reset_token_token_idx": { - "name": "password_reset_token_token_idx", - "columns": ["token"], - "isUnique": false - } - }, - "foreignKeys": { - "passwordResetToken_user_id_authUser_id_fk": { - "name": "passwordResetToken_user_id_authUser_id_fk", - "tableFrom": "passwordResetToken", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userCollection": { - "name": "userCollection", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "date_created": { - "name": "date_created", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "userCollection_id_unique": { - "name": "userCollection_id_unique", - "columns": ["id"], - "isUnique": true - }, - "collection_id_idx": { - "name": "collection_id_idx", - "columns": ["id"], - "isUnique": false - }, - "user_collection_id_idx": { - "name": "user_collection_id_idx", - "columns": ["user_id"], - "isUnique": false - } - }, - "foreignKeys": { - "userCollection_user_id_authUser_id_fk": { - "name": "userCollection_user_id_authUser_id_fk", - "tableFrom": "userCollection", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetCollectionAsset": { - "name": "assetCollectionAsset", - "columns": { - "collection_id": { - "name": "collection_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "date_added": { - "name": "date_added", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "collection_assets_collection_id_idx": { - "name": "collection_assets_collection_id_idx", - "columns": ["collection_id"], - "isUnique": false - }, - "collection_assets_asset_id_idx": { - "name": "collection_assets_asset_id_idx", - "columns": ["asset_id"], - "isUnique": false - } - }, - "foreignKeys": { - "assetCollectionAsset_collection_id_userCollection_id_fk": { - "name": "assetCollectionAsset_collection_id_userCollection_id_fk", - "tableFrom": "assetCollectionAsset", - "tableTo": "userCollection", - "columnsFrom": ["collection_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "assetCollectionAsset_asset_id_asset_id_fk": { - "name": "assetCollectionAsset_asset_id_asset_id_fk", - "tableFrom": "assetCollectionAsset", - "tableTo": "asset", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "socialsConnection": { - "name": "socialsConnection", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "discord_id": { - "name": "discord_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "socialsConnection_id_unique": { - "name": "socialsConnection_id_unique", - "columns": ["id"], - "isUnique": true - }, - "socialsConnection_user_id_unique": { - "name": "socialsConnection_user_id_unique", - "columns": ["user_id"], - "isUnique": true - }, - "socials_connection_user_id_idx": { - "name": "socials_connection_user_id_idx", - "columns": ["user_id"], - "isUnique": false - }, - "socials_connection_discord_id_idx": { - "name": "socials_connection_discord_id_idx", - "columns": ["discord_id"], - "isUnique": false - } - }, - "foreignKeys": { - "socialsConnection_user_id_authUser_id_fk": { - "name": "socialsConnection_user_id_authUser_id_fk", - "tableFrom": "socialsConnection", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userFavorite": { - "name": "userFavorite", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "userFavorite_id_unique": { - "name": "userFavorite_id_unique", - "columns": ["id"], - "isUnique": true - }, - "favorited_assets_id_idx": { - "name": "favorited_assets_id_idx", - "columns": ["id"], - "isUnique": false - }, - "favorited_assets_user_id_idx": { - "name": "favorited_assets_user_id_idx", - "columns": ["user_id"], - "isUnique": false - } - }, - "foreignKeys": { - "userFavorite_user_id_authUser_id_fk": { - "name": "userFavorite_user_id_authUser_id_fk", - "tableFrom": "userFavorite", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userFavoriteAsset": { - "name": "userFavoriteAsset", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "favorited_assets_id": { - "name": "favorited_assets_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "userFavoriteAsset_id_unique": { - "name": "userFavoriteAsset_id_unique", - "columns": ["id"], - "isUnique": true - }, - "favorited_assets_assets_id_idx": { - "name": "favorited_assets_assets_id_idx", - "columns": ["id"], - "isUnique": false - }, - "favorited_assets_assets_user_id_idx": { - "name": "favorited_assets_assets_user_id_idx", - "columns": ["favorited_assets_id"], - "isUnique": false - }, - "favorited_assets_assets_asset_id_idx": { - "name": "favorited_assets_assets_asset_id_idx", - "columns": ["asset_id"], - "isUnique": false - } - }, - "foreignKeys": { - "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk": { - "name": "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk", - "tableFrom": "userFavoriteAsset", - "tableTo": "userFavorite", - "columnsFrom": ["favorited_assets_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "userFavoriteAsset_asset_id_asset_id_fk": { - "name": "userFavoriteAsset_asset_id_asset_id_fk", - "tableFrom": "userFavoriteAsset", - "tableTo": "asset", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userNetworking": { - "name": "userNetworking", - "columns": { - "followerId": { - "name": "followerId", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "followingId": { - "name": "followingId", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "userNetworking_follower_idx": { - "name": "userNetworking_follower_idx", - "columns": ["followerId"], - "isUnique": false - }, - "userNetworking_following_idx": { - "name": "userNetworking_following_idx", - "columns": ["followingId"], - "isUnique": false - } - }, - "foreignKeys": { - "userNetworking_followerId_authUser_id_fk": { - "name": "userNetworking_followerId_authUser_id_fk", - "tableFrom": "userNetworking", - "tableTo": "authUser", - "columnsFrom": ["followerId"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - }, - "userNetworking_followingId_authUser_id_fk": { - "name": "userNetworking_followingId_authUser_id_fk", - "tableFrom": "userNetworking", - "tableTo": "authUser", - "columnsFrom": ["followingId"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "name": "game", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_category": { + "name": "asset_category", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by": { + "name": "uploaded_by", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'pending'" + }, + "uploaded_date": { + "name": "uploaded_date", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_is_optimized": { + "name": "asset_is_optimized", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "asset_is_suggestive": { + "name": "asset_is_suggestive", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "view_count": { + "name": "view_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "download_count": { + "name": "download_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "file_size": { + "name": "file_size", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "width": { + "name": "width", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "height": { + "name": "height", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 } + }, + "indexes": { + "assets_id_idx": { + "name": "assets_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "assets_name_idx": { + "name": "assets_name_idx", + "columns": [ + "name" + ], + "isUnique": false + }, + "assets_game_name_idx": { + "name": "assets_game_name_idx", + "columns": [ + "game" + ], + "isUnique": false + }, + "assets_asset_category_name_idx": { + "name": "assets_asset_category_name_idx", + "columns": [ + "asset_category" + ], + "isUnique": false + }, + "assets_uploaded_by_id_idx": { + "name": "assets_uploaded_by_id_idx", + "columns": [ + "uploaded_by" + ], + "isUnique": false + } + }, + "foreignKeys": { + "asset_game_game_id_fk": { + "name": "asset_game_game_id_fk", + "tableFrom": "asset", + "tableTo": "game", + "columnsFrom": [ + "game" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "asset_asset_category_assetCategory_id_fk": { + "name": "asset_asset_category_assetCategory_id_fk", + "tableFrom": "asset", + "tableTo": "assetCategory", + "columnsFrom": [ + "asset_category" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "asset_uploaded_by_authUser_id_fk": { + "name": "asset_uploaded_by_authUser_id_fk", + "tableFrom": "asset", + "tableTo": "authUser", + "columnsFrom": [ + "uploaded_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} }, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} + "assetCategory": { + "name": "assetCategory", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetCategory_id_unique": { + "name": "assetCategory_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "assetCategory_name_unique": { + "name": "assetCategory_name_unique", + "columns": [ + "name" + ], + "isUnique": true + }, + "asset_category_id_idx": { + "name": "asset_category_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "asset_category_name_idx": { + "name": "asset_category_name_idx", + "columns": [ + "name" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "gameAssetCategory": { + "name": "gameAssetCategory", + "columns": { + "game_id": { + "name": "game_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_category_id": { + "name": "asset_category_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "game_asset_category_game_id_idx": { + "name": "game_asset_category_game_id_idx", + "columns": [ + "game_id" + ], + "isUnique": false + }, + "game_asset_category_asset_category_id_idx": { + "name": "game_asset_category_asset_category_id_idx", + "columns": [ + "asset_category_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "gameAssetCategory_game_id_game_id_fk": { + "name": "gameAssetCategory_game_id_game_id_fk", + "tableFrom": "gameAssetCategory", + "tableTo": "game", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "gameAssetCategory_asset_category_id_assetCategory_id_fk": { + "name": "gameAssetCategory_asset_category_id_assetCategory_id_fk", + "tableFrom": "gameAssetCategory", + "tableTo": "assetCategory", + "columnsFrom": [ + "asset_category_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetTag": { + "name": "assetTag", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetTag_id_unique": { + "name": "assetTag_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "assetTag_name_unique": { + "name": "assetTag_name_unique", + "columns": [ + "name" + ], + "isUnique": true + }, + "asset_tag_id_idx": { + "name": "asset_tag_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "asset_tag_name_idx": { + "name": "asset_tag_name_idx", + "columns": [ + "name" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetTagAsset": { + "name": "assetTagAsset", + "columns": { + "asset_tag_id": { + "name": "asset_tag_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "asset_tags_assets_asset_tag_id_idx": { + "name": "asset_tags_assets_asset_tag_id_idx", + "columns": [ + "asset_tag_id" + ], + "isUnique": false + }, + "asset_tags_assets_asset_id_idx": { + "name": "asset_tags_assets_asset_id_idx", + "columns": [ + "asset_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "assetTagAsset_asset_tag_id_assetTag_id_fk": { + "name": "assetTagAsset_asset_tag_id_assetTag_id_fk", + "tableFrom": "assetTagAsset", + "tableTo": "assetTag", + "columnsFrom": [ + "asset_tag_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "assetTagAsset_asset_id_asset_id_fk": { + "name": "assetTagAsset_asset_id_asset_id_fk", + "tableFrom": "assetTagAsset", + "tableTo": "asset", + "columnsFrom": [ + "asset_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "atlas": { + "name": "atlas", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by": { + "name": "uploaded_by", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by_name": { + "name": "uploaded_by_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_date": { + "name": "uploaded_date", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "file_size": { + "name": "file_size", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "atlas_id_unique": { + "name": "atlas_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "atlas_id_idx": { + "name": "atlas_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "atlas_uploaded_by_idx": { + "name": "atlas_uploaded_by_idx", + "columns": [ + "uploaded_by" + ], + "isUnique": false + }, + "atlas_uploaded_by_name_idx": { + "name": "atlas_uploaded_by_name_idx", + "columns": [ + "uploaded_by_name" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "atlasToAsset": { + "name": "atlasToAsset", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "atlas_id": { + "name": "atlas_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "atlas_to_assets_id_idx": { + "name": "atlas_to_assets_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "atlas_to_assets_atlas_id_idx": { + "name": "atlas_to_assets_atlas_id_idx", + "columns": [ + "atlas_id" + ], + "isUnique": false + }, + "atlas_to_assets_asset_id_idx": { + "name": "atlas_to_assets_asset_id_idx", + "columns": [ + "asset_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "atlasToAsset_atlas_id_atlas_id_fk": { + "name": "atlasToAsset_atlas_id_atlas_id_fk", + "tableFrom": "atlasToAsset", + "tableTo": "atlas", + "columnsFrom": [ + "atlas_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "atlasToAsset_asset_id_asset_id_fk": { + "name": "atlasToAsset_asset_id_asset_id_fk", + "tableFrom": "atlasToAsset", + "tableTo": "asset", + "columnsFrom": [ + "asset_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "game": { + "name": "game", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": 0 + }, + "possible_suggestive_content": { + "name": "possible_suggestive_content", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "game_id_unique": { + "name": "game_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "game_name_unique": { + "name": "game_name_unique", + "columns": [ + "name" + ], + "isUnique": true + }, + "game_id_idx": { + "name": "game_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "game_name_idx": { + "name": "game_name_idx", + "columns": [ + "name" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "savedOcGenerators": { + "name": "savedOcGenerators", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "game": { + "name": "game", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "date_created": { + "name": "date_created", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "saved_color_palette": { + "name": "saved_color_palette", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sakura_url": { + "name": "sakura_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "savedOcGenerators_id_unique": { + "name": "savedOcGenerators_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "saved_oc_generators_id_idx": { + "name": "saved_oc_generators_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "saved_oc_generators_user_id_idx": { + "name": "saved_oc_generators_user_id_idx", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "savedOcGenerators_user_id_authUser_id_fk": { + "name": "savedOcGenerators_user_id_authUser_id_fk", + "tableFrom": "savedOcGenerators", + "tableTo": "authUser", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "authUser": { + "name": "authUser", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "avatar_url": { + "name": "avatar_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "banner_url": { + "name": "banner_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "display_name": { + "name": "display_name", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "username_colour": { + "name": "username_colour", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "email_verified": { + "name": "email_verified", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "pronouns": { + "name": "pronouns", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "verified": { + "name": "verified", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "bio": { + "name": "bio", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'No bio set'" + }, + "date_joined": { + "name": "date_joined", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "role_flags": { + "name": "role_flags", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "is_contributor": { + "name": "is_contributor", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "self_assignable_role_flags": { + "name": "self_assignable_role_flags", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "authUser_id_unique": { + "name": "authUser_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "authUser_username_unique": { + "name": "authUser_username_unique", + "columns": [ + "username" + ], + "isUnique": true + }, + "user_id_idx": { + "name": "user_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "user_username_idx": { + "name": "user_username_idx", + "columns": [ + "username" + ], + "isUnique": false + }, + "user_email_idx": { + "name": "user_email_idx", + "columns": [ + "email" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "authKey": { + "name": "authKey", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "hashed_password": { + "name": "hashed_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "authKey_id_unique": { + "name": "authKey_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "key_user_id_idx": { + "name": "key_user_id_idx", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "authKey_user_id_authUser_id_fk": { + "name": "authKey_user_id_authUser_id_fk", + "tableFrom": "authKey", + "tableTo": "authUser", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "emailVerificationToken": { + "name": "emailVerificationToken", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "emailVerificationToken_id_unique": { + "name": "emailVerificationToken_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "email_verification_token_user_id_idx": { + "name": "email_verification_token_user_id_idx", + "columns": [ + "user_id" + ], + "isUnique": false + }, + "email_verification_token_token_idx": { + "name": "email_verification_token_token_idx", + "columns": [ + "token" + ], + "isUnique": false + } + }, + "foreignKeys": { + "emailVerificationToken_user_id_authUser_id_fk": { + "name": "emailVerificationToken_user_id_authUser_id_fk", + "tableFrom": "emailVerificationToken", + "tableTo": "authUser", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "passwordResetToken": { + "name": "passwordResetToken", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "passwordResetToken_id_unique": { + "name": "passwordResetToken_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "password_reset_token_user_id_idx": { + "name": "password_reset_token_user_id_idx", + "columns": [ + "user_id" + ], + "isUnique": false + }, + "password_reset_token_token_idx": { + "name": "password_reset_token_token_idx", + "columns": [ + "token" + ], + "isUnique": false + } + }, + "foreignKeys": { + "passwordResetToken_user_id_authUser_id_fk": { + "name": "passwordResetToken_user_id_authUser_id_fk", + "tableFrom": "passwordResetToken", + "tableTo": "authUser", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userCollection": { + "name": "userCollection", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "date_created": { + "name": "date_created", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": { + "userCollection_id_unique": { + "name": "userCollection_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "collection_id_idx": { + "name": "collection_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "user_collection_id_idx": { + "name": "user_collection_id_idx", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "userCollection_user_id_authUser_id_fk": { + "name": "userCollection_user_id_authUser_id_fk", + "tableFrom": "userCollection", + "tableTo": "authUser", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetCollectionAsset": { + "name": "assetCollectionAsset", + "columns": { + "collection_id": { + "name": "collection_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "date_added": { + "name": "date_added", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "collection_assets_collection_id_idx": { + "name": "collection_assets_collection_id_idx", + "columns": [ + "collection_id" + ], + "isUnique": false + }, + "collection_assets_asset_id_idx": { + "name": "collection_assets_asset_id_idx", + "columns": [ + "asset_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "assetCollectionAsset_collection_id_userCollection_id_fk": { + "name": "assetCollectionAsset_collection_id_userCollection_id_fk", + "tableFrom": "assetCollectionAsset", + "tableTo": "userCollection", + "columnsFrom": [ + "collection_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "assetCollectionAsset_asset_id_asset_id_fk": { + "name": "assetCollectionAsset_asset_id_asset_id_fk", + "tableFrom": "assetCollectionAsset", + "tableTo": "asset", + "columnsFrom": [ + "asset_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "socialsConnection": { + "name": "socialsConnection", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "discord_id": { + "name": "discord_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "socialsConnection_id_unique": { + "name": "socialsConnection_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "socialsConnection_user_id_unique": { + "name": "socialsConnection_user_id_unique", + "columns": [ + "user_id" + ], + "isUnique": true + }, + "socials_connection_user_id_idx": { + "name": "socials_connection_user_id_idx", + "columns": [ + "user_id" + ], + "isUnique": false + }, + "socials_connection_discord_id_idx": { + "name": "socials_connection_discord_id_idx", + "columns": [ + "discord_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "socialsConnection_user_id_authUser_id_fk": { + "name": "socialsConnection_user_id_authUser_id_fk", + "tableFrom": "socialsConnection", + "tableTo": "authUser", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userFavorite": { + "name": "userFavorite", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": { + "userFavorite_id_unique": { + "name": "userFavorite_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "favorited_assets_id_idx": { + "name": "favorited_assets_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "favorited_assets_user_id_idx": { + "name": "favorited_assets_user_id_idx", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "userFavorite_user_id_authUser_id_fk": { + "name": "userFavorite_user_id_authUser_id_fk", + "tableFrom": "userFavorite", + "tableTo": "authUser", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userFavoriteAsset": { + "name": "userFavoriteAsset", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "favorited_assets_id": { + "name": "favorited_assets_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "userFavoriteAsset_id_unique": { + "name": "userFavoriteAsset_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "favorited_assets_assets_id_idx": { + "name": "favorited_assets_assets_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "favorited_assets_assets_user_id_idx": { + "name": "favorited_assets_assets_user_id_idx", + "columns": [ + "favorited_assets_id" + ], + "isUnique": false + }, + "favorited_assets_assets_asset_id_idx": { + "name": "favorited_assets_assets_asset_id_idx", + "columns": [ + "asset_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk": { + "name": "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk", + "tableFrom": "userFavoriteAsset", + "tableTo": "userFavorite", + "columnsFrom": [ + "favorited_assets_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "userFavoriteAsset_asset_id_asset_id_fk": { + "name": "userFavoriteAsset_asset_id_asset_id_fk", + "tableFrom": "userFavoriteAsset", + "tableTo": "asset", + "columnsFrom": [ + "asset_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userNetworking": { + "name": "userNetworking", + "columns": { + "followerId": { + "name": "followerId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "followingId": { + "name": "followingId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "userNetworking_follower_idx": { + "name": "userNetworking_follower_idx", + "columns": [ + "followerId" + ], + "isUnique": false + }, + "userNetworking_following_idx": { + "name": "userNetworking_following_idx", + "columns": [ + "followingId" + ], + "isUnique": false + } + }, + "foreignKeys": { + "userNetworking_followerId_authUser_id_fk": { + "name": "userNetworking_followerId_authUser_id_fk", + "tableFrom": "userNetworking", + "tableTo": "authUser", + "columnsFrom": [ + "followerId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "userNetworking_followingId_authUser_id_fk": { + "name": "userNetworking_followingId_authUser_id_fk", + "tableFrom": "userNetworking", + "tableTo": "authUser", + "columnsFrom": [ + "followingId" + ], + "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/v2/db/migrations/meta/_journal.json b/src/v2/db/migrations/meta/_journal.json index eacc726..a3e3017 100644 --- a/src/v2/db/migrations/meta/_journal.json +++ b/src/v2/db/migrations/meta/_journal.json @@ -1,13 +1,13 @@ { - "version": "5", - "dialect": "sqlite", - "entries": [ - { - "idx": 0, - "version": "5", - "when": 1699233278726, - "tag": "0000_silky_agent_zero", - "breakpoints": true - } - ] -} + "version": "5", + "dialect": "sqlite", + "entries": [ + { + "idx": 0, + "version": "5", + "when": 1700189550333, + "tag": "0000_busy_dreaming_celestial", + "breakpoints": true + } + ] +} \ No newline at end of file From 7401a9507f6a61dd999ecb2dc5febfc90d3571e7 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Fri, 17 Nov 2023 02:55:23 +0000 Subject: [PATCH 158/318] chore: update deps --- package.json | 26 +- pnpm-lock.yaml | 422 ++- src/v2/db/migrations/meta/0000_snapshot.json | 3110 ++++++++---------- src/v2/db/migrations/meta/_journal.json | 24 +- 4 files changed, 1665 insertions(+), 1917 deletions(-) diff --git a/package.json b/package.json index 7d638b3..b5966c7 100644 --- a/package.json +++ b/package.json @@ -18,36 +18,36 @@ }, "devDependencies": { "@cloudflare/workers-types": "^4.20231025.0", - "@types/node": "^20.9.0", + "@types/node": "^20.9.1", "dotenv": "^16.3.1", - "drizzle-kit": "^0.20.1", + "drizzle-kit": "^0.20.2", "eslint": "^8.53.0", "eslint-config-google": "^0.14.0", "eslint-plugin-json": "^3.1.0", "husky": "^8.0.3", - "tsx": "^4.0.0", + "tsx": "^4.1.2", "typescript": "^5.2.2", - "wrangler": "3.15.0" + "wrangler": "3.16.0" }, "private": true, "dependencies": { "@hono/swagger-ui": "^0.1.0", - "@hono/zod-openapi": "^0.8.3", - "@libsql/client": "0.3.6", + "@hono/zod-openapi": "^0.8.5", + "@libsql/client": "0.4.0-pre.1", "@lucia-auth/adapter-session-unstorage": "^2.1.0", "@lucia-auth/adapter-sqlite": "^2.0.1", - "@lucia-auth/oauth": "^3.4.0", - "@typescript-eslint/eslint-plugin": "^6.10.0", + "@lucia-auth/oauth": "^3.5.0", + "@typescript-eslint/eslint-plugin": "^6.11.0", "better-sqlite3": "^9.1.1", "drizzle-orm": "^0.29.0", "drizzle-zod": "^0.5.1", - "hono": "^3.9.2", - "lucia": "^2.7.3", - "miniflare": "^3.20231025.1", + "hono": "^3.10.1", + "lucia": "^2.7.4", + "miniflare": "^3.20231030.0", "mysql2": "^3.6.3", "oslo": "^0.22.0", - "prettier": "^3.0.3", - "unstorage": "^1.9.0", + "prettier": "^3.1.0", + "unstorage": "^1.10.1", "uuid": "^9.0.1", "zod": "^3.22.4" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 208cc4f..37150f0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,43 +7,43 @@ settings: dependencies: "@hono/swagger-ui": specifier: ^0.1.0 - version: 0.1.0(hono@3.9.2) + version: 0.1.0(hono@3.10.1) "@hono/zod-openapi": - specifier: ^0.8.3 - version: 0.8.3(hono@3.9.2)(zod@3.22.4) + specifier: ^0.8.5 + version: 0.8.5(hono@3.10.1)(zod@3.22.4) "@libsql/client": - specifier: 0.3.6 - version: 0.3.6 + specifier: 0.4.0-pre.1 + version: 0.4.0-pre.1 "@lucia-auth/adapter-session-unstorage": specifier: ^2.1.0 - version: 2.1.0(lucia@2.7.3)(unstorage@1.9.0) + version: 2.1.0(lucia@2.7.4)(unstorage@1.10.1) "@lucia-auth/adapter-sqlite": specifier: ^2.0.1 - version: 2.0.1(@libsql/client@0.3.6)(better-sqlite3@9.1.1)(lucia@2.7.3) + version: 2.0.1(@libsql/client@0.4.0-pre.1)(better-sqlite3@9.1.1)(lucia@2.7.4) "@lucia-auth/oauth": - specifier: ^3.4.0 - version: 3.4.0(lucia@2.7.3) + specifier: ^3.5.0 + version: 3.5.0(lucia@2.7.4) "@typescript-eslint/eslint-plugin": - specifier: ^6.10.0 - version: 6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.2.2) + specifier: ^6.11.0 + version: 6.11.0(@typescript-eslint/parser@6.11.0)(eslint@8.53.0)(typescript@5.2.2) better-sqlite3: specifier: ^9.1.1 version: 9.1.1 drizzle-orm: specifier: ^0.29.0 - version: 0.29.0(@cloudflare/workers-types@4.20231025.0)(@libsql/client@0.3.6)(better-sqlite3@9.1.1)(mysql2@3.6.3) + version: 0.29.0(@cloudflare/workers-types@4.20231025.0)(@libsql/client@0.4.0-pre.1)(better-sqlite3@9.1.1)(mysql2@3.6.3) drizzle-zod: specifier: ^0.5.1 version: 0.5.1(drizzle-orm@0.29.0)(zod@3.22.4) hono: - specifier: ^3.9.2 - version: 3.9.2 + specifier: ^3.10.1 + version: 3.10.1 lucia: - specifier: ^2.7.3 - version: 2.7.3 + specifier: ^2.7.4 + version: 2.7.4 miniflare: - specifier: ^3.20231025.1 - version: 3.20231025.1 + specifier: ^3.20231030.0 + version: 3.20231030.0 mysql2: specifier: ^3.6.3 version: 3.6.3 @@ -51,11 +51,11 @@ dependencies: specifier: ^0.22.0 version: 0.22.0 prettier: - specifier: ^3.0.3 - version: 3.0.3 + specifier: ^3.1.0 + version: 3.1.0 unstorage: - specifier: ^1.9.0 - version: 1.9.0 + specifier: ^1.10.1 + version: 1.10.1 uuid: specifier: ^9.0.1 version: 9.0.1 @@ -68,14 +68,14 @@ devDependencies: specifier: ^4.20231025.0 version: 4.20231025.0 "@types/node": - specifier: ^20.9.0 - version: 20.9.0 + specifier: ^20.9.1 + version: 20.9.1 dotenv: specifier: ^16.3.1 version: 16.3.1 drizzle-kit: - specifier: ^0.20.1 - version: 0.20.1 + specifier: ^0.20.2 + version: 0.20.2 eslint: specifier: ^8.53.0 version: 8.53.0 @@ -89,14 +89,14 @@ devDependencies: specifier: ^8.0.3 version: 8.0.3 tsx: - specifier: ^4.0.0 - version: 4.0.0 + specifier: ^4.1.2 + version: 4.1.2 typescript: specifier: ^5.2.2 version: 5.2.2 wrangler: - specifier: 3.15.0 - version: 3.15.0 + specifier: 3.16.0 + version: 3.16.0 packages: /@aashutoshrathi/word-wrap@1.2.6: @@ -127,10 +127,10 @@ packages: mime: 3.0.0 dev: true - /@cloudflare/workerd-darwin-64@1.20231025.0: + /@cloudflare/workerd-darwin-64@1.20231030.0: resolution: { - integrity: sha512-MYRYTbSl+tjGg6su7savlLIb8cOcKJfdGpA+WdtgqT2OF7O+89Lag0l1SA/iyVlUkT31Jc6OLHqvzsXgmg+niQ==, + integrity: sha512-J4PQ9utPxLya9yHdMMx3AZeC5M/6FxcoYw6jo9jbDDFTy+a4Gslqf4Im9We3aeOEdPXa3tgQHVQOSelJSZLhIw==, } engines: { node: ">=16" } cpu: [x64] @@ -138,10 +138,10 @@ packages: requiresBuild: true optional: true - /@cloudflare/workerd-darwin-arm64@1.20231025.0: + /@cloudflare/workerd-darwin-arm64@1.20231030.0: resolution: { - integrity: sha512-BszjtBDR84TVa6oWe74dePJSAukWlTmLw9zR4KeWuwZLJGV7RMm6AmwGStetjnwZrecZaaOFELfBCAHtsebV0Q==, + integrity: sha512-WSJJjm11Del4hSneiNB7wTXGtBXI4QMCH9l5qf4iT5PAW8cESGcCmdHtWDWDtGAAGcvmLT04KNvmum92vRKKQQ==, } engines: { node: ">=16" } cpu: [arm64] @@ -149,10 +149,10 @@ packages: requiresBuild: true optional: true - /@cloudflare/workerd-linux-64@1.20231025.0: + /@cloudflare/workerd-linux-64@1.20231030.0: resolution: { - integrity: sha512-AT9dxgKXOa9xZxZ3k2a432axPJJ58KpoNWnPiPYGpuAuLoWnfcYwwh6mr9sZVcTdAdTAK9Xu9c81tp0YABanUw==, + integrity: sha512-2HUeRTvoCC17fxE0qdBeR7J9dO8j4A8ZbdcvY8pZxdk+zERU6+N03RTbk/dQMU488PwiDvcC3zZqS4gwLfVT8g==, } engines: { node: ">=16" } cpu: [x64] @@ -160,10 +160,10 @@ packages: requiresBuild: true optional: true - /@cloudflare/workerd-linux-arm64@1.20231025.0: + /@cloudflare/workerd-linux-arm64@1.20231030.0: resolution: { - integrity: sha512-EIjex5o2k80YZWPix1btGybL/vNZ3o6vqKX9ptS0JcFkHV5aFX5/kcMwSBRjiIC+w04zVjmGQx3N1Vh3njuncg==, + integrity: sha512-4/GK5zHh+9JbUI6Z5xTCM0ZmpKKHk7vu9thmHjUxtz+o8Ne9DoD7DlDvXQWgMF6XGaTubDWyp3ttn+Qv8jDFuQ==, } engines: { node: ">=16" } cpu: [arm64] @@ -171,10 +171,10 @@ packages: requiresBuild: true optional: true - /@cloudflare/workerd-windows-64@1.20231025.0: + /@cloudflare/workerd-windows-64@1.20231030.0: resolution: { - integrity: sha512-7vtq0mO22A2v0OOsKXa760r9a84Gg8CK0gDu5uNWlj6hojmt011iz7jJt76I7oo/XrVwVlVfu69GnA3ljx6U8w==, + integrity: sha512-fb/Jgj8Yqy3PO1jLhk7mTrHMkR8jklpbQFud6rL/aMAn5d6MQbaSrYOCjzkKGp0Zng8D2LIzSl+Fc0C9Sggxjg==, } engines: { node: ">=16" } cpu: [x64] @@ -797,7 +797,7 @@ packages: debug: 4.3.4 espree: 9.6.1 globals: 13.23.0 - ignore: 5.2.4 + ignore: 5.3.0 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -812,14 +812,14 @@ packages: } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - /@fastify/busboy@2.0.0: + /@fastify/busboy@2.1.0: resolution: { - integrity: sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==, + integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==, } engines: { node: ">=14" } - /@hono/swagger-ui@0.1.0(hono@3.9.2): + /@hono/swagger-ui@0.1.0(hono@3.10.1): resolution: { integrity: sha512-W5WEEhk2QtiqdSfM40FcK98Q5Bz4H/NfNqBUSkcZ46ys+DG4wt1yGsmRZgdJMje6t5Vn8eFN+9nyO+/dAp3drA==, @@ -827,13 +827,13 @@ packages: peerDependencies: hono: "*" dependencies: - hono: 3.9.2 + hono: 3.10.1 dev: false - /@hono/zod-openapi@0.8.3(hono@3.9.2)(zod@3.22.4): + /@hono/zod-openapi@0.8.5(hono@3.10.1)(zod@3.22.4): resolution: { - integrity: sha512-TwjSf63miIF3VBqNy4V6EOqZYdTQPeIQQ9Q2HjRWFYH9f2QtBFXziuqIg2Y76gNZ3WDal67NQXmbSErHiFR44g==, + integrity: sha512-yqHa8SWPdjO6iA1owdF6vDdNfPGknt8C5xz0QIdJQrgZTww/L071O5G504gzM+6TixprxqThav8hI+cPXs0stw==, } engines: { node: ">=16.0.0" } peerDependencies: @@ -841,12 +841,12 @@ packages: zod: 3.* dependencies: "@asteasolutions/zod-to-openapi": 5.5.0(zod@3.22.4) - "@hono/zod-validator": 0.1.11(hono@3.9.2)(zod@3.22.4) - hono: 3.9.2 + "@hono/zod-validator": 0.1.11(hono@3.10.1)(zod@3.22.4) + hono: 3.10.1 zod: 3.22.4 dev: false - /@hono/zod-validator@0.1.11(hono@3.9.2)(zod@3.22.4): + /@hono/zod-validator@0.1.11(hono@3.10.1)(zod@3.22.4): resolution: { integrity: sha512-PQXeHUP0+36qpRt8yfeD7N2jbK3ETlGvSN6dMof/HwUC/APRokQRjpXZm4rrlG71Ft0aWE01+Bm4XejqPie5Uw==, @@ -855,7 +855,7 @@ packages: hono: ">=3.9.0" zod: ^3.19.1 dependencies: - hono: 3.9.2 + hono: 3.10.1 zod: 3.22.4 dev: false @@ -892,25 +892,25 @@ packages: } dev: false - /@libsql/client@0.3.6: + /@libsql/client@0.4.0-pre.1: resolution: { - integrity: sha512-3Mc4ZDI7X5ZLkMxX5XijiBeqhvyrny356lcj/KVVIeMXt9j6g4l+CRIsUvgcsyCAOUHqWqh0+TjI91bCKmdW+w==, + integrity: sha512-6VvMVl/tmmZG7lcGvTwQnmfHmUL0Bj6XZGOu2z3LcmV7Yx+g6Igla8S+OSUzj/2m9nezGaAtgtjOcZlQacQl/A==, } dependencies: "@libsql/hrana-client": 0.5.5 js-base64: 3.7.5 - libsql: 0.1.34 + libsql: 0.2.0-pre.1 transitivePeerDependencies: - bufferutil - encoding - utf-8-validate dev: false - /@libsql/darwin-arm64@0.1.34: + /@libsql/darwin-arm64@0.2.0-pre.1: resolution: { - integrity: sha512-Wv8jvkj/fUAO8DF3A4HaddCMldUUpKcg/WW1sY95FNsSHOxktyxqU80jAp/tCuZ85GQIJozvgSr51/ARIC0gsw==, + integrity: sha512-U4+Zer7C5FHgYjYp5687k29W4y8YzizCPJX91OrY4d/ZwXducjIMbIAFp160iZ8R7T2uTsGt6HxV17iXEC0V6w==, } cpu: [arm64] os: [darwin] @@ -918,10 +918,10 @@ packages: dev: false optional: true - /@libsql/darwin-x64@0.1.34: + /@libsql/darwin-x64@0.2.0-pre.1: resolution: { - integrity: sha512-2NQXD9nUzC08hg7FdcZLq5uTEwGz1KbD7YvUzQb/psO1lO/E/p83wl1es1082+Pp0z5pSPDWQeRTuccD41L+3w==, + integrity: sha512-rxjjpfEQa1NAR8uek/S0naWvCbuL2qV0Wp6YGctTJFUZHUS32/RFYrmT8D5Dv6XlhqIS8XSLUDSAr9lVm4xi2A==, } cpu: [x64] os: [darwin] @@ -970,10 +970,10 @@ packages: - utf-8-validate dev: false - /@libsql/linux-arm64-gnu@0.1.34: + /@libsql/linux-arm64-gnu@0.2.0-pre.1: resolution: { - integrity: sha512-r3dY1FDYZ7eX5HX7HyAoYSqK5FPugj5NSB5Bt/nz+ygBWdXASgSKxkE/RqjJIM59vXwv300iJX9qhR5fXv8sTw==, + integrity: sha512-dWq75OHHhcP3W07AON2oi8xg+MqAibzCQdjly59lr60rdarllqggf4ua6ktP82qcdShJqL2nGvvcYCHV1kILWQ==, } cpu: [arm64] os: [linux] @@ -981,10 +981,10 @@ packages: dev: false optional: true - /@libsql/linux-arm64-musl@0.1.34: + /@libsql/linux-arm64-musl@0.2.0-pre.1: resolution: { - integrity: sha512-9AE/eNb9eQRcNsLxqtpLJxVEoIMmItrdwqJDImPJtOp10rhp4U0x/9RGKerl9Mg3ObVj676pyhAR2KzyudrOfQ==, + integrity: sha512-6SuESjm0ZRuADhFaXRO7+yK7WJwpdlDWOEEqzZfYRV+twlCRXb8WNSQo3O/WYTFbGIdd4dNSIQCy4+tBmbV7Tg==, } cpu: [arm64] os: [linux] @@ -992,10 +992,10 @@ packages: dev: false optional: true - /@libsql/linux-x64-gnu@0.1.34: + /@libsql/linux-x64-gnu@0.2.0-pre.1: resolution: { - integrity: sha512-o8toY1Txstjt13fBhZbFe8sNAW6OaS6qVcp1Bd6bHkCLSBLZ6pjJmwzQN8rFv9QFBPAnaKP3lI4vaOXXw7huTA==, + integrity: sha512-ATHqNP5hhOgJ3QbgBR+AN3taB0CKbWIFdJ5ObCY841i274zFbZoDe0tjjSlamxS2e1EeG4SjBpLhNhBzDm6jIQ==, } cpu: [x64] os: [linux] @@ -1003,10 +1003,10 @@ packages: dev: false optional: true - /@libsql/linux-x64-musl@0.1.34: + /@libsql/linux-x64-musl@0.2.0-pre.1: resolution: { - integrity: sha512-EldEmcAxxNPSCjJ73oFxg81PDDIpDbPqK/QOrhmmGYLvYwrnQtVRUIbARf80JQvcy6bCxOO/Q9dh6wGhnyHyYA==, + integrity: sha512-ouiAKD0DzuOfLULjn3VrjgU8BEtsE3Dp7wKyeJnhYSipMiBsWzPlBMmME8+zE5SGExBiTBbv1xxi1s3rHQzaFQ==, } cpu: [x64] os: [linux] @@ -1014,10 +1014,10 @@ packages: dev: false optional: true - /@libsql/win32-x64-msvc@0.1.34: + /@libsql/win32-x64-msvc@0.2.0-pre.1: resolution: { - integrity: sha512-jnv0qfVMnrVv00r+wUOe6DHrHuao9y1w1lN543cV2J1JdQNJT/eSZzhyZFSlS3T2ZUvXfZfZ5GeL8U18IAID6w==, + integrity: sha512-P4mT0V+LMKzfraklerCvjrC9rTff7/5JFUpsRpAtw7RFQM2vIt5SqzgGNsHQsWW5/s9Ie0tqQB5A97hVSjgyOw==, } cpu: [x64] os: [win32] @@ -1025,7 +1025,7 @@ packages: dev: false optional: true - /@lucia-auth/adapter-session-unstorage@2.1.0(lucia@2.7.3)(unstorage@1.9.0): + /@lucia-auth/adapter-session-unstorage@2.1.0(lucia@2.7.4)(unstorage@1.10.1): resolution: { integrity: sha512-ItK7urZhLZv7UO99BcODjRhSAv58UPc+KQAmnkSvri2WBc22vFEjnjd/oWp3CZPdbbrJkuTvsuhFXH1ySBfOLg==, @@ -1034,11 +1034,11 @@ packages: lucia: ^2.0.0 unstorage: ^1.9.0 dependencies: - lucia: 2.7.3 - unstorage: 1.9.0 + lucia: 2.7.4 + unstorage: 1.10.1 dev: false - /@lucia-auth/adapter-sqlite@2.0.1(@libsql/client@0.3.6)(better-sqlite3@9.1.1)(lucia@2.7.3): + /@lucia-auth/adapter-sqlite@2.0.1(@libsql/client@0.4.0-pre.1)(better-sqlite3@9.1.1)(lucia@2.7.4): resolution: { integrity: sha512-yc7XQ4X3sWG1gyUGHqaXipJIkmvB4MOgJypnSMWy7Vjhn3AOCM2xw51xTs+dGpLOQIn2Laomg9xpmDM2/9tgqQ==, @@ -1053,20 +1053,20 @@ packages: better-sqlite3: optional: true dependencies: - "@libsql/client": 0.3.6 + "@libsql/client": 0.4.0-pre.1 better-sqlite3: 9.1.1 - lucia: 2.7.3 + lucia: 2.7.4 dev: false - /@lucia-auth/oauth@3.4.0(lucia@2.7.3): + /@lucia-auth/oauth@3.5.0(lucia@2.7.4): resolution: { - integrity: sha512-3W4TaCiyUViXK2e2+VJo5324agvYz3102I2YKIttkGDKcevaNpLG3LgiR2rbemyF5UXFKiHgfFvRtKs/KDa9kw==, + integrity: sha512-JSwAMVwlDJtbvfcJV1nbkv41OD830pgICrx8zFT71SYd5I1MnEQ+GqMTXBGRyxzc5XlLatT8ZS1Jt0k81487xg==, } peerDependencies: lucia: ^2.0.0 dependencies: - lucia: 2.7.3 + lucia: 2.7.4 dev: false /@neon-rs/load@0.0.4: @@ -1076,14 +1076,6 @@ packages: } dev: false - /@noble/hashes@1.3.2: - resolution: - { - integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==, - } - engines: { node: ">= 16" } - dev: false - /@node-rs/argon2-android-arm-eabi@1.5.2: resolution: { @@ -1664,7 +1656,7 @@ packages: integrity: sha512-bQVlnMLFJ2d35DkPNjEPmd9ueO/rh5EiaZt2bhqiSarPjZIuIV6bPQVqcrEyvNo+AfTrRGVazle1tl597w3gfA==, } dependencies: - "@types/node": 20.9.0 + "@types/node": 20.9.1 form-data: 4.0.0 dev: false @@ -1674,13 +1666,13 @@ packages: integrity: sha512-meK88cx/sTalPSLSoCzkiUB4VPIFHmxtXm5FaaqRDqBX2i/Sy8bJ4odsan0b20RBjPh06dAQ+OTTdnyQyhJZyQ==, } dependencies: - "@types/node": 20.9.0 + "@types/node": 20.9.1 dev: true - /@types/node@20.9.0: + /@types/node@20.9.1: resolution: { - integrity: sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==, + integrity: sha512-HhmzZh5LSJNS5O8jQKpJ/3ZcrrlG6L70hpGqMIAoM9YVD0YBRNWYsfwcXq8VnSjlNpCpgLzMXdiPo+dxcvSmiA==, } dependencies: undici-types: 5.26.5 @@ -1698,13 +1690,13 @@ packages: integrity: sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg==, } dependencies: - "@types/node": 20.9.0 + "@types/node": 20.9.1 dev: false - /@typescript-eslint/eslint-plugin@6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.2.2): + /@typescript-eslint/eslint-plugin@6.11.0(@typescript-eslint/parser@6.11.0)(eslint@8.53.0)(typescript@5.2.2): resolution: { - integrity: sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg==, + integrity: sha512-uXnpZDc4VRjY4iuypDBKzW1rz9T5YBBK0snMn8MaTSNd2kMlj50LnLBABELjJiOL5YHk7ZD8hbSpI9ubzqYI0w==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -1716,15 +1708,15 @@ packages: optional: true dependencies: "@eslint-community/regexpp": 4.10.0 - "@typescript-eslint/parser": 6.10.0(eslint@8.53.0)(typescript@5.2.2) - "@typescript-eslint/scope-manager": 6.10.0 - "@typescript-eslint/type-utils": 6.10.0(eslint@8.53.0)(typescript@5.2.2) - "@typescript-eslint/utils": 6.10.0(eslint@8.53.0)(typescript@5.2.2) - "@typescript-eslint/visitor-keys": 6.10.0 + "@typescript-eslint/parser": 6.11.0(eslint@8.53.0)(typescript@5.2.2) + "@typescript-eslint/scope-manager": 6.11.0 + "@typescript-eslint/type-utils": 6.11.0(eslint@8.53.0)(typescript@5.2.2) + "@typescript-eslint/utils": 6.11.0(eslint@8.53.0)(typescript@5.2.2) + "@typescript-eslint/visitor-keys": 6.11.0 debug: 4.3.4 eslint: 8.53.0 graphemer: 1.4.0 - ignore: 5.2.4 + ignore: 5.3.0 natural-compare: 1.4.0 semver: 7.5.4 ts-api-utils: 1.0.3(typescript@5.2.2) @@ -1733,10 +1725,10 @@ packages: - supports-color dev: false - /@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.2.2): + /@typescript-eslint/parser@6.11.0(eslint@8.53.0)(typescript@5.2.2): resolution: { - integrity: sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog==, + integrity: sha512-+whEdjk+d5do5nxfxx73oanLL9ghKO3EwM9kBCkUtWMRwWuPaFv9ScuqlYfQ6pAD6ZiJhky7TZ2ZYhrMsfMxVQ==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -1746,10 +1738,10 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/scope-manager": 6.10.0 - "@typescript-eslint/types": 6.10.0 - "@typescript-eslint/typescript-estree": 6.10.0(typescript@5.2.2) - "@typescript-eslint/visitor-keys": 6.10.0 + "@typescript-eslint/scope-manager": 6.11.0 + "@typescript-eslint/types": 6.11.0 + "@typescript-eslint/typescript-estree": 6.11.0(typescript@5.2.2) + "@typescript-eslint/visitor-keys": 6.11.0 debug: 4.3.4 eslint: 8.53.0 typescript: 5.2.2 @@ -1757,21 +1749,21 @@ packages: - supports-color dev: false - /@typescript-eslint/scope-manager@6.10.0: + /@typescript-eslint/scope-manager@6.11.0: resolution: { - integrity: sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==, + integrity: sha512-0A8KoVvIURG4uhxAdjSaxy8RdRE//HztaZdG8KiHLP8WOXSk0vlF7Pvogv+vlJA5Rnjj/wDcFENvDaHb+gKd1A==, } engines: { node: ^16.0.0 || >=18.0.0 } dependencies: - "@typescript-eslint/types": 6.10.0 - "@typescript-eslint/visitor-keys": 6.10.0 + "@typescript-eslint/types": 6.11.0 + "@typescript-eslint/visitor-keys": 6.11.0 dev: false - /@typescript-eslint/type-utils@6.10.0(eslint@8.53.0)(typescript@5.2.2): + /@typescript-eslint/type-utils@6.11.0(eslint@8.53.0)(typescript@5.2.2): resolution: { - integrity: sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg==, + integrity: sha512-nA4IOXwZtqBjIoYrJcYxLRO+F9ri+leVGoJcMW1uqr4r1Hq7vW5cyWrA43lFbpRvQ9XgNrnfLpIkO3i1emDBIA==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -1781,8 +1773,8 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/typescript-estree": 6.10.0(typescript@5.2.2) - "@typescript-eslint/utils": 6.10.0(eslint@8.53.0)(typescript@5.2.2) + "@typescript-eslint/typescript-estree": 6.11.0(typescript@5.2.2) + "@typescript-eslint/utils": 6.11.0(eslint@8.53.0)(typescript@5.2.2) debug: 4.3.4 eslint: 8.53.0 ts-api-utils: 1.0.3(typescript@5.2.2) @@ -1791,18 +1783,18 @@ packages: - supports-color dev: false - /@typescript-eslint/types@6.10.0: + /@typescript-eslint/types@6.11.0: resolution: { - integrity: sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==, + integrity: sha512-ZbEzuD4DwEJxwPqhv3QULlRj8KYTAnNsXxmfuUXFCxZmO6CF2gM/y+ugBSAQhrqaJL3M+oe4owdWunaHM6beqA==, } engines: { node: ^16.0.0 || >=18.0.0 } dev: false - /@typescript-eslint/typescript-estree@6.10.0(typescript@5.2.2): + /@typescript-eslint/typescript-estree@6.11.0(typescript@5.2.2): resolution: { - integrity: sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==, + integrity: sha512-Aezzv1o2tWJwvZhedzvD5Yv7+Lpu1by/U1LZ5gLc4tCx8jUmuSCMioPFRjliN/6SJIvY6HpTtJIWubKuYYYesQ==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -1811,8 +1803,8 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/types": 6.10.0 - "@typescript-eslint/visitor-keys": 6.10.0 + "@typescript-eslint/types": 6.11.0 + "@typescript-eslint/visitor-keys": 6.11.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -1823,10 +1815,10 @@ packages: - supports-color dev: false - /@typescript-eslint/utils@6.10.0(eslint@8.53.0)(typescript@5.2.2): + /@typescript-eslint/utils@6.11.0(eslint@8.53.0)(typescript@5.2.2): resolution: { - integrity: sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==, + integrity: sha512-p23ibf68fxoZy605dc0dQAEoUsoiNoP3MD9WQGiHLDuTSOuqoTsa4oAy+h3KDkTcxbbfOtUjb9h3Ta0gT4ug2g==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -1835,9 +1827,9 @@ packages: "@eslint-community/eslint-utils": 4.4.0(eslint@8.53.0) "@types/json-schema": 7.0.15 "@types/semver": 7.5.5 - "@typescript-eslint/scope-manager": 6.10.0 - "@typescript-eslint/types": 6.10.0 - "@typescript-eslint/typescript-estree": 6.10.0(typescript@5.2.2) + "@typescript-eslint/scope-manager": 6.11.0 + "@typescript-eslint/types": 6.11.0 + "@typescript-eslint/typescript-estree": 6.11.0(typescript@5.2.2) eslint: 8.53.0 semver: 7.5.4 transitivePeerDependencies: @@ -1845,14 +1837,14 @@ packages: - typescript dev: false - /@typescript-eslint/visitor-keys@6.10.0: + /@typescript-eslint/visitor-keys@6.11.0: resolution: { - integrity: sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==, + integrity: sha512-+SUN/W7WjBr05uRxPggJPSzyB8zUpaYo2hByKasWbqr3PM8AXfZt8UHdNpBS1v9SA62qnSSMF3380SwDqqprgQ==, } engines: { node: ^16.0.0 || >=18.0.0 } dependencies: - "@typescript-eslint/types": 6.10.0 + "@typescript-eslint/types": 6.11.0 eslint-visitor-keys: 3.4.3 dev: false @@ -2399,10 +2391,10 @@ packages: wordwrap: 1.0.0 dev: true - /drizzle-kit@0.20.1: + /drizzle-kit@0.20.2: resolution: { - integrity: sha512-W6YAFeT15LcirtAbFmfKOjN+p0EhTW+8KZaPqIEz0VpkBrq3GbBUtaoYWa7l8OLzlOBY54XPG2fa9j+iv3pQRQ==, + integrity: sha512-4iwjsIj2sY3B3MleKeyNzg/6myjXbTE/CBOXwfePoRVXayM3VwHGZboMkxUkmIQk6o7UAKRb2ODDpO24YNoL2g==, } hasBin: true dependencies: @@ -2417,7 +2409,7 @@ packages: hanji: 0.0.5 json-diff: 0.9.0 minimatch: 7.4.6 - wrangler: 3.15.0 + wrangler: 3.16.0 zod: 3.22.4 transitivePeerDependencies: - bufferutil @@ -2425,7 +2417,7 @@ packages: - utf-8-validate dev: true - /drizzle-orm@0.29.0(@cloudflare/workers-types@4.20231025.0)(@libsql/client@0.3.6)(better-sqlite3@9.1.1)(mysql2@3.6.3): + /drizzle-orm@0.29.0(@cloudflare/workers-types@4.20231025.0)(@libsql/client@0.4.0-pre.1)(better-sqlite3@9.1.1)(mysql2@3.6.3): resolution: { integrity: sha512-AC+CuW4GezVjsZDGU9u9B4HyikudOyYVhjm6he3Xn1D6Kky7bHGKob97MMX2piO+t9b6UuajLzlii/T/lu1qwA==, @@ -2491,7 +2483,7 @@ packages: optional: true dependencies: "@cloudflare/workers-types": 4.20231025.0 - "@libsql/client": 0.3.6 + "@libsql/client": 0.4.0-pre.1 better-sqlite3: 9.1.1 mysql2: 3.6.3 dev: false @@ -2505,7 +2497,7 @@ packages: drizzle-orm: ">=0.23.13" zod: "*" dependencies: - drizzle-orm: 0.29.0(@cloudflare/workers-types@4.20231025.0)(@libsql/client@0.3.6)(better-sqlite3@9.1.1)(mysql2@3.6.3) + drizzle-orm: 0.29.0(@cloudflare/workers-types@4.20231025.0)(@libsql/client@0.4.0-pre.1)(better-sqlite3@9.1.1)(mysql2@3.6.3) zod: 3.22.4 dev: false @@ -2724,7 +2716,7 @@ packages: glob-parent: 6.0.2 globals: 13.23.0 graphemer: 1.4.0 - ignore: 5.2.4 + ignore: 5.3.0 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 @@ -2900,7 +2892,7 @@ packages: } engines: { node: ^10.12.0 || >=12.0.0 } dependencies: - flat-cache: 3.1.1 + flat-cache: 3.2.0 /file-uri-to-path@1.0.0: resolution: @@ -2928,12 +2920,12 @@ packages: locate-path: 6.0.0 path-exists: 4.0.0 - /flat-cache@3.1.1: + /flat-cache@3.2.0: resolution: { - integrity: sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==, + integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==, } - engines: { node: ">=12.0.0" } + engines: { node: ^10.12.0 || >=12.0.0 } dependencies: flatted: 3.2.9 keyv: 4.5.4 @@ -3109,7 +3101,7 @@ packages: array-union: 2.1.0 dir-glob: 3.0.1 fast-glob: 3.3.2 - ignore: 5.2.4 + ignore: 5.3.0 merge2: 1.4.1 slash: 3.0.0 dev: false @@ -3131,7 +3123,7 @@ packages: destr: 2.0.2 iron-webcrypto: 0.10.1 radix3: 1.1.0 - ufo: 1.3.1 + ufo: 1.3.2 uncrypto: 0.1.3 unenv: 1.7.4 dev: false @@ -3160,10 +3152,10 @@ packages: } dev: true - /hono@3.9.2: + /hono@3.10.1: resolution: { - integrity: sha512-180NOiMadqU3lGmN6ajPDZvZPWus3a9mtVaAUR9uG0SImngBwRLA8vbnV0oUfUAgFT4nX55sGV9dVA06OuikHA==, + integrity: sha512-4jPKCmYWLAoCMpmvOU+xNOQYdcNftip7sM/IsO8EPyGAtjk9fGNyUchG6huSzLrY449WDNGFPetVs5doepNnlA==, } engines: { node: ">=16.0.0" } dev: false @@ -3210,10 +3202,10 @@ packages: } dev: false - /ignore@5.2.4: + /ignore@5.3.0: resolution: { - integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==, + integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==, } engines: { node: ">= 4" } @@ -3447,10 +3439,10 @@ packages: prelude-ls: 1.2.1 type-check: 0.4.0 - /libsql@0.1.34: + /libsql@0.2.0-pre.1: resolution: { - integrity: sha512-LGofp7z7gi1Td6vu2GxaA4WyvSPEkuFn0f/ePSti1TsAlBU0LWxdk+bj9D8nqswzxiqe5wpAyTLhVzTIYSyXEA==, + integrity: sha512-wVSUo3S6BY7Yz1fbJGVeHzm2HSeG58iAvCg//81Wv1Z7Zm4MoHedd5/0cbn1v0oM6e5SaGprkYS5lDqHgyHlWA==, } cpu: [x64, arm64] os: [darwin, linux, win32] @@ -3458,13 +3450,13 @@ packages: "@neon-rs/load": 0.0.4 detect-libc: 2.0.2 optionalDependencies: - "@libsql/darwin-arm64": 0.1.34 - "@libsql/darwin-x64": 0.1.34 - "@libsql/linux-arm64-gnu": 0.1.34 - "@libsql/linux-arm64-musl": 0.1.34 - "@libsql/linux-x64-gnu": 0.1.34 - "@libsql/linux-x64-musl": 0.1.34 - "@libsql/win32-x64-msvc": 0.1.34 + "@libsql/darwin-arm64": 0.2.0-pre.1 + "@libsql/darwin-x64": 0.2.0-pre.1 + "@libsql/linux-arm64-gnu": 0.2.0-pre.1 + "@libsql/linux-arm64-musl": 0.2.0-pre.1 + "@libsql/linux-x64-gnu": 0.2.0-pre.1 + "@libsql/linux-x64-musl": 0.2.0-pre.1 + "@libsql/win32-x64-msvc": 0.2.0-pre.1 dev: false /listhen@1.5.5: @@ -3487,8 +3479,8 @@ packages: mlly: 1.4.2 node-forge: 1.3.1 pathe: 1.1.1 - std-env: 3.4.3 - ufo: 1.3.1 + std-env: 3.5.0 + ufo: 1.3.2 untun: 0.1.2 uqr: 0.1.2 dev: false @@ -3543,12 +3535,14 @@ packages: } dev: false - /lru-cache@10.0.1: + /lru-cache@10.0.2: resolution: { - integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==, + integrity: sha512-Yj9mA8fPiVgOUpByoTZO5pNrcl5Yk37FcSHsUINpAsaBIEZIuqcCclDZJCVxqQShDsmYX8QG63svJiTbOATZwg==, } engines: { node: 14 || >=16.14 } + dependencies: + semver: 7.5.4 dev: false /lru-cache@6.0.0: @@ -3586,14 +3580,11 @@ packages: es5-ext: 0.10.62 dev: true - /lucia@2.7.3: + /lucia@2.7.4: resolution: { - integrity: sha512-fzwwsZcijdQmS116J2odQZj/fb8SYXUI2rRWz84gZqkbpX9QAS4m72qlFzsPDv1YXJHNRhYUQCvQl3EKgt3OgA==, + integrity: sha512-do6Aah5kX2DUl7N0CvELWV1/b+qZGF0AUmUrkthYeNfXfgx4RAkWi4BkAlgGDBB/0c1WApb18mUD1pA5qTaWmw==, } - dependencies: - "@noble/hashes": 1.3.2 - nanoid: 5.0.1 dev: false /magic-string@0.25.9: @@ -3689,37 +3680,13 @@ packages: engines: { node: ">=10" } dev: false - /miniflare@3.20231025.0: + /miniflare@3.20231030.0: resolution: { - integrity: sha512-pFcr2BRaGIQ26UfdDo8BMJ6kkd/Jo/FkQ/4K7UG/eORlDepsLrR/sTJddcSSIGl07MA+MGjhzopFTPpFskkS+g==, - } - engines: { node: ">=16.13" } - 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.20231025.0 - ws: 8.14.2 - youch: 3.3.3 - zod: 3.22.4 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - /miniflare@3.20231025.1: - resolution: - { - integrity: sha512-zwvu/f6eivBBF2shuom5DibnZjGSxt6FiC8sZlj+CcqTRss1D2ZHYD09odhAZLY9DYXE0orBFkJKnIDx/QmYdQ==, + integrity: sha512-iCg1dNauUG+kNp7jizcNmV/1XFItuTDvD/6xIC34PrszgKxYCbBO2R72y5NEDJTwaqr5ohQI/320wuJ8GEe7nQ==, } engines: { node: ">=16.13" } + hasBin: true dependencies: acorn: 8.11.2 acorn-walk: 8.3.0 @@ -3729,7 +3696,7 @@ packages: source-map-support: 0.5.21 stoppable: 1.1.0 undici: 5.27.2 - workerd: 1.20231025.0 + workerd: 1.20231030.0 ws: 8.14.2 youch: 3.3.3 zod: 3.22.4 @@ -3737,7 +3704,6 @@ packages: - bufferutil - supports-color - utf-8-validate - dev: false /minimatch@3.1.2: resolution: @@ -3790,7 +3756,7 @@ packages: acorn: 8.11.2 pathe: 1.1.1 pkg-types: 1.0.3 - ufo: 1.3.1 + ufo: 1.3.2 dev: false /mri@1.2.0: @@ -3850,15 +3816,6 @@ packages: hasBin: true dev: true - /nanoid@5.0.1: - resolution: - { - integrity: sha512-vWeVtV5Cw68aML/QaZvqN/3QQXc6fBfIieAlu05m7FZW2Dgb+3f0xc0TTxuJW+7u30t7iSDTV/j3kVI0oJqIfQ==, - } - engines: { node: ^18 || >=20 } - hasBin: true - dev: false - /napi-build-utils@1.0.2: resolution: { @@ -3977,7 +3934,7 @@ packages: dependencies: destr: 2.0.2 node-fetch-native: 1.4.1 - ufo: 1.3.1 + ufo: 1.3.2 dev: false /once@1.4.0: @@ -4148,10 +4105,10 @@ packages: } engines: { node: ">= 0.8.0" } - /prettier@3.0.3: + /prettier@3.1.0: resolution: { - integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==, + integrity: sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==, } engines: { node: ">=14" } hasBin: true @@ -4468,10 +4425,10 @@ packages: } dev: false - /std-env@3.4.3: + /std-env@3.5.0: resolution: { - integrity: sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==, + integrity: sha512-JGUEaALvL0Mf6JCfYnJOTcobY+Nc7sG/TemDRBqCA0wEr4DER7zDchaaixTlmOxAjG1uRJmX82EQcxwTQTkqVA==, } dev: false @@ -4608,10 +4565,10 @@ packages: integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==, } - /tsx@4.0.0: + /tsx@4.1.2: resolution: { - integrity: sha512-jd3C5kw9tR68gtvqHUYo/2IwxaA46/CyKvcVQ4DsKRAPb19/vWgl7zF9mYNjFRY6KcGKiwne41RU91ll31IggQ==, + integrity: sha512-1spM1bFV6MP2s4tO4tDC7g52fsaFdtEWdO4GfGdqi20qUgPbnAJqixOyIAvCSx1DDj3YIUB4CD06owTWUsOAuQ==, } engines: { node: ">=18.0.0" } hasBin: true @@ -4670,10 +4627,10 @@ packages: engines: { node: ">=14.17" } hasBin: true - /ufo@1.3.1: + /ufo@1.3.2: resolution: { - integrity: sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==, + integrity: sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==, } dev: false @@ -4697,7 +4654,7 @@ packages: } engines: { node: ">=14.0" } dependencies: - "@fastify/busboy": 2.0.0 + "@fastify/busboy": 2.1.0 /unenv@1.7.4: resolution: @@ -4712,22 +4669,23 @@ packages: pathe: 1.1.1 dev: false - /unstorage@1.9.0: + /unstorage@1.10.1: resolution: { - integrity: sha512-VpD8ZEYc/le8DZCrny3bnqKE4ZjioQxBRnWE+j5sGNvziPjeDlaS1NaFFHzl/kkXaO3r7UaF8MGQrs14+1B4pQ==, + integrity: sha512-rWQvLRfZNBpF+x8D3/gda5nUCQL2PgXy2jNG4U7/Rc9BGEv9+CAJd0YyGCROUBKs9v49Hg8huw3aih5Bf5TAVw==, } peerDependencies: "@azure/app-configuration": ^1.4.1 - "@azure/cosmos": ^3.17.3 + "@azure/cosmos": ^4.0.0 "@azure/data-tables": ^13.2.2 - "@azure/identity": ^3.2.3 + "@azure/identity": ^3.3.2 "@azure/keyvault-secrets": ^4.7.0 - "@azure/storage-blob": ^12.14.0 - "@capacitor/preferences": ^5.0.0 - "@planetscale/database": ^1.8.0 - "@upstash/redis": ^1.22.0 - "@vercel/kv": ^0.2.2 + "@azure/storage-blob": ^12.16.0 + "@capacitor/preferences": ^5.0.6 + "@netlify/blobs": ^6.2.0 + "@planetscale/database": ^1.11.0 + "@upstash/redis": ^1.23.4 + "@vercel/kv": ^0.2.3 idb-keyval: ^6.2.1 peerDependenciesMeta: "@azure/app-configuration": @@ -4744,6 +4702,8 @@ packages: optional: true "@capacitor/preferences": optional: true + "@netlify/blobs": + optional: true "@planetscale/database": optional: true "@upstash/redis": @@ -4759,11 +4719,11 @@ packages: h3: 1.8.2 ioredis: 5.3.2 listhen: 1.5.5 - lru-cache: 10.0.1 + lru-cache: 10.0.2 mri: 1.2.0 node-fetch-native: 1.4.1 ofetch: 1.3.3 - ufo: 1.3.1 + ufo: 1.3.2 transitivePeerDependencies: - supports-color dev: false @@ -4893,25 +4853,25 @@ packages: } dev: true - /workerd@1.20231025.0: + /workerd@1.20231030.0: resolution: { - integrity: sha512-W1PFtpMFfvmm+ozBf+u70TE3Pviv7WA4qzDeejHDC4z+PFDq4+3KJCkgffaGBO86h+akWO0hSsc0uXL2zAqofQ==, + integrity: sha512-+FSW+d31f8RrjHanFf/R9A+Z0csf3OtsvzdPmAKuwuZm/5HrBv83cvG9fFeTxl7/nI6irUUXIRF9xcj/NomQzQ==, } engines: { node: ">=16" } hasBin: true requiresBuild: true optionalDependencies: - "@cloudflare/workerd-darwin-64": 1.20231025.0 - "@cloudflare/workerd-darwin-arm64": 1.20231025.0 - "@cloudflare/workerd-linux-64": 1.20231025.0 - "@cloudflare/workerd-linux-arm64": 1.20231025.0 - "@cloudflare/workerd-windows-64": 1.20231025.0 + "@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 - /wrangler@3.15.0: + /wrangler@3.16.0: resolution: { - integrity: sha512-kxzK62rD+LRrDeZZzw8cP6FBub71vJCbfAAb594XobXajgXYh3pFjv18Vm8YLxHzoGMhmAOJPA5b4DHq4HEUCw==, + integrity: sha512-MIx35sSdFKE3hnfWB6xWUnrt3OiyKK+PQnc9kFLjksLESX0tLmEk1gdvThYHliY90kkelS+nbH48SUGTFAI5BA==, } engines: { node: ">=16.17.0" } hasBin: true @@ -4922,7 +4882,7 @@ packages: blake3-wasm: 2.1.5 chokidar: 3.5.3 esbuild: 0.17.19 - miniflare: 3.20231025.0 + miniflare: 3.20231030.0 nanoid: 3.3.7 path-to-regexp: 6.2.1 resolve.exports: 2.0.2 diff --git a/src/v2/db/migrations/meta/0000_snapshot.json b/src/v2/db/migrations/meta/0000_snapshot.json index b9017ef..2736883 100644 --- a/src/v2/db/migrations/meta/0000_snapshot.json +++ b/src/v2/db/migrations/meta/0000_snapshot.json @@ -1,1667 +1,1455 @@ { - "version": "5", - "dialect": "sqlite", - "id": "f07490ab-84e2-4512-9bfa-2535e05274b7", - "prevId": "00000000-0000-0000-0000-000000000000", - "tables": { - "asset": { - "name": "asset", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "extension": { - "name": "extension", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false + "version": "5", + "dialect": "sqlite", + "id": "f07490ab-84e2-4512-9bfa-2535e05274b7", + "prevId": "00000000-0000-0000-0000-000000000000", + "tables": { + "asset": { + "name": "asset", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "extension": { + "name": "extension", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "game": { + "name": "game", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_category": { + "name": "asset_category", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by": { + "name": "uploaded_by", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'pending'" + }, + "uploaded_date": { + "name": "uploaded_date", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_is_optimized": { + "name": "asset_is_optimized", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "asset_is_suggestive": { + "name": "asset_is_suggestive", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "view_count": { + "name": "view_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "download_count": { + "name": "download_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "file_size": { + "name": "file_size", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "width": { + "name": "width", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "height": { + "name": "height", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "assets_id_idx": { + "name": "assets_id_idx", + "columns": ["id"], + "isUnique": false + }, + "assets_name_idx": { + "name": "assets_name_idx", + "columns": ["name"], + "isUnique": false + }, + "assets_game_name_idx": { + "name": "assets_game_name_idx", + "columns": ["game"], + "isUnique": false + }, + "assets_asset_category_name_idx": { + "name": "assets_asset_category_name_idx", + "columns": ["asset_category"], + "isUnique": false + }, + "assets_uploaded_by_id_idx": { + "name": "assets_uploaded_by_id_idx", + "columns": ["uploaded_by"], + "isUnique": false + } + }, + "foreignKeys": { + "asset_game_game_id_fk": { + "name": "asset_game_game_id_fk", + "tableFrom": "asset", + "tableTo": "game", + "columnsFrom": ["game"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "asset_asset_category_assetCategory_id_fk": { + "name": "asset_asset_category_assetCategory_id_fk", + "tableFrom": "asset", + "tableTo": "assetCategory", + "columnsFrom": ["asset_category"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "asset_uploaded_by_authUser_id_fk": { + "name": "asset_uploaded_by_authUser_id_fk", + "tableFrom": "asset", + "tableTo": "authUser", + "columnsFrom": ["uploaded_by"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetCategory": { + "name": "assetCategory", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetCategory_id_unique": { + "name": "assetCategory_id_unique", + "columns": ["id"], + "isUnique": true + }, + "assetCategory_name_unique": { + "name": "assetCategory_name_unique", + "columns": ["name"], + "isUnique": true + }, + "asset_category_id_idx": { + "name": "asset_category_id_idx", + "columns": ["id"], + "isUnique": false + }, + "asset_category_name_idx": { + "name": "asset_category_name_idx", + "columns": ["name"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "gameAssetCategory": { + "name": "gameAssetCategory", + "columns": { + "game_id": { + "name": "game_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_category_id": { + "name": "asset_category_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "game_asset_category_game_id_idx": { + "name": "game_asset_category_game_id_idx", + "columns": ["game_id"], + "isUnique": false + }, + "game_asset_category_asset_category_id_idx": { + "name": "game_asset_category_asset_category_id_idx", + "columns": ["asset_category_id"], + "isUnique": false + } + }, + "foreignKeys": { + "gameAssetCategory_game_id_game_id_fk": { + "name": "gameAssetCategory_game_id_game_id_fk", + "tableFrom": "gameAssetCategory", + "tableTo": "game", + "columnsFrom": ["game_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "gameAssetCategory_asset_category_id_assetCategory_id_fk": { + "name": "gameAssetCategory_asset_category_id_assetCategory_id_fk", + "tableFrom": "gameAssetCategory", + "tableTo": "assetCategory", + "columnsFrom": ["asset_category_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetTag": { + "name": "assetTag", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetTag_id_unique": { + "name": "assetTag_id_unique", + "columns": ["id"], + "isUnique": true + }, + "assetTag_name_unique": { + "name": "assetTag_name_unique", + "columns": ["name"], + "isUnique": true + }, + "asset_tag_id_idx": { + "name": "asset_tag_id_idx", + "columns": ["id"], + "isUnique": false + }, + "asset_tag_name_idx": { + "name": "asset_tag_name_idx", + "columns": ["name"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetTagAsset": { + "name": "assetTagAsset", + "columns": { + "asset_tag_id": { + "name": "asset_tag_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "asset_tags_assets_asset_tag_id_idx": { + "name": "asset_tags_assets_asset_tag_id_idx", + "columns": ["asset_tag_id"], + "isUnique": false + }, + "asset_tags_assets_asset_id_idx": { + "name": "asset_tags_assets_asset_id_idx", + "columns": ["asset_id"], + "isUnique": false + } + }, + "foreignKeys": { + "assetTagAsset_asset_tag_id_assetTag_id_fk": { + "name": "assetTagAsset_asset_tag_id_assetTag_id_fk", + "tableFrom": "assetTagAsset", + "tableTo": "assetTag", + "columnsFrom": ["asset_tag_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "assetTagAsset_asset_id_asset_id_fk": { + "name": "assetTagAsset_asset_id_asset_id_fk", + "tableFrom": "assetTagAsset", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "atlas": { + "name": "atlas", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by": { + "name": "uploaded_by", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by_name": { + "name": "uploaded_by_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_date": { + "name": "uploaded_date", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "file_size": { + "name": "file_size", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "atlas_id_unique": { + "name": "atlas_id_unique", + "columns": ["id"], + "isUnique": true + }, + "atlas_id_idx": { + "name": "atlas_id_idx", + "columns": ["id"], + "isUnique": false + }, + "atlas_uploaded_by_idx": { + "name": "atlas_uploaded_by_idx", + "columns": ["uploaded_by"], + "isUnique": false + }, + "atlas_uploaded_by_name_idx": { + "name": "atlas_uploaded_by_name_idx", + "columns": ["uploaded_by_name"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "atlasToAsset": { + "name": "atlasToAsset", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "atlas_id": { + "name": "atlas_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "atlas_to_assets_id_idx": { + "name": "atlas_to_assets_id_idx", + "columns": ["id"], + "isUnique": false + }, + "atlas_to_assets_atlas_id_idx": { + "name": "atlas_to_assets_atlas_id_idx", + "columns": ["atlas_id"], + "isUnique": false + }, + "atlas_to_assets_asset_id_idx": { + "name": "atlas_to_assets_asset_id_idx", + "columns": ["asset_id"], + "isUnique": false + } + }, + "foreignKeys": { + "atlasToAsset_atlas_id_atlas_id_fk": { + "name": "atlasToAsset_atlas_id_atlas_id_fk", + "tableFrom": "atlasToAsset", + "tableTo": "atlas", + "columnsFrom": ["atlas_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "atlasToAsset_asset_id_asset_id_fk": { + "name": "atlasToAsset_asset_id_asset_id_fk", + "tableFrom": "atlasToAsset", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} }, "game": { - "name": "game", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_category": { - "name": "asset_category", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by": { - "name": "uploaded_by", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "url": { - "name": "url", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "status": { - "name": "status", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "'pending'" - }, - "uploaded_date": { - "name": "uploaded_date", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_is_optimized": { - "name": "asset_is_optimized", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "asset_is_suggestive": { - "name": "asset_is_suggestive", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "view_count": { - "name": "view_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "download_count": { - "name": "download_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "file_size": { - "name": "file_size", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "width": { - "name": "width", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "height": { - "name": "height", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 + "name": "game", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": 0 + }, + "possible_suggestive_content": { + "name": "possible_suggestive_content", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "game_id_unique": { + "name": "game_id_unique", + "columns": ["id"], + "isUnique": true + }, + "game_name_unique": { + "name": "game_name_unique", + "columns": ["name"], + "isUnique": true + }, + "game_id_idx": { + "name": "game_id_idx", + "columns": ["id"], + "isUnique": false + }, + "game_name_idx": { + "name": "game_name_idx", + "columns": ["name"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "savedOcGenerators": { + "name": "savedOcGenerators", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "game": { + "name": "game", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "date_created": { + "name": "date_created", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "saved_color_palette": { + "name": "saved_color_palette", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sakura_url": { + "name": "sakura_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "savedOcGenerators_id_unique": { + "name": "savedOcGenerators_id_unique", + "columns": ["id"], + "isUnique": true + }, + "saved_oc_generators_id_idx": { + "name": "saved_oc_generators_id_idx", + "columns": ["id"], + "isUnique": false + }, + "saved_oc_generators_user_id_idx": { + "name": "saved_oc_generators_user_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "savedOcGenerators_user_id_authUser_id_fk": { + "name": "savedOcGenerators_user_id_authUser_id_fk", + "tableFrom": "savedOcGenerators", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "authUser": { + "name": "authUser", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "avatar_url": { + "name": "avatar_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "banner_url": { + "name": "banner_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "display_name": { + "name": "display_name", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "username_colour": { + "name": "username_colour", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "email_verified": { + "name": "email_verified", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "pronouns": { + "name": "pronouns", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "verified": { + "name": "verified", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "bio": { + "name": "bio", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'No bio set'" + }, + "date_joined": { + "name": "date_joined", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "role_flags": { + "name": "role_flags", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "is_contributor": { + "name": "is_contributor", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "self_assignable_role_flags": { + "name": "self_assignable_role_flags", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "authUser_id_unique": { + "name": "authUser_id_unique", + "columns": ["id"], + "isUnique": true + }, + "authUser_username_unique": { + "name": "authUser_username_unique", + "columns": ["username"], + "isUnique": true + }, + "user_id_idx": { + "name": "user_id_idx", + "columns": ["id"], + "isUnique": false + }, + "user_username_idx": { + "name": "user_username_idx", + "columns": ["username"], + "isUnique": false + }, + "user_email_idx": { + "name": "user_email_idx", + "columns": ["email"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "authKey": { + "name": "authKey", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "hashed_password": { + "name": "hashed_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "authKey_id_unique": { + "name": "authKey_id_unique", + "columns": ["id"], + "isUnique": true + }, + "key_user_id_idx": { + "name": "key_user_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "authKey_user_id_authUser_id_fk": { + "name": "authKey_user_id_authUser_id_fk", + "tableFrom": "authKey", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "emailVerificationToken": { + "name": "emailVerificationToken", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "emailVerificationToken_id_unique": { + "name": "emailVerificationToken_id_unique", + "columns": ["id"], + "isUnique": true + }, + "email_verification_token_user_id_idx": { + "name": "email_verification_token_user_id_idx", + "columns": ["user_id"], + "isUnique": false + }, + "email_verification_token_token_idx": { + "name": "email_verification_token_token_idx", + "columns": ["token"], + "isUnique": false + } + }, + "foreignKeys": { + "emailVerificationToken_user_id_authUser_id_fk": { + "name": "emailVerificationToken_user_id_authUser_id_fk", + "tableFrom": "emailVerificationToken", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "passwordResetToken": { + "name": "passwordResetToken", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "passwordResetToken_id_unique": { + "name": "passwordResetToken_id_unique", + "columns": ["id"], + "isUnique": true + }, + "password_reset_token_user_id_idx": { + "name": "password_reset_token_user_id_idx", + "columns": ["user_id"], + "isUnique": false + }, + "password_reset_token_token_idx": { + "name": "password_reset_token_token_idx", + "columns": ["token"], + "isUnique": false + } + }, + "foreignKeys": { + "passwordResetToken_user_id_authUser_id_fk": { + "name": "passwordResetToken_user_id_authUser_id_fk", + "tableFrom": "passwordResetToken", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userCollection": { + "name": "userCollection", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "date_created": { + "name": "date_created", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": { + "userCollection_id_unique": { + "name": "userCollection_id_unique", + "columns": ["id"], + "isUnique": true + }, + "collection_id_idx": { + "name": "collection_id_idx", + "columns": ["id"], + "isUnique": false + }, + "user_collection_id_idx": { + "name": "user_collection_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "userCollection_user_id_authUser_id_fk": { + "name": "userCollection_user_id_authUser_id_fk", + "tableFrom": "userCollection", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetCollectionAsset": { + "name": "assetCollectionAsset", + "columns": { + "collection_id": { + "name": "collection_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "date_added": { + "name": "date_added", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "collection_assets_collection_id_idx": { + "name": "collection_assets_collection_id_idx", + "columns": ["collection_id"], + "isUnique": false + }, + "collection_assets_asset_id_idx": { + "name": "collection_assets_asset_id_idx", + "columns": ["asset_id"], + "isUnique": false + } + }, + "foreignKeys": { + "assetCollectionAsset_collection_id_userCollection_id_fk": { + "name": "assetCollectionAsset_collection_id_userCollection_id_fk", + "tableFrom": "assetCollectionAsset", + "tableTo": "userCollection", + "columnsFrom": ["collection_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "assetCollectionAsset_asset_id_asset_id_fk": { + "name": "assetCollectionAsset_asset_id_asset_id_fk", + "tableFrom": "assetCollectionAsset", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "socialsConnection": { + "name": "socialsConnection", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "discord_id": { + "name": "discord_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "socialsConnection_id_unique": { + "name": "socialsConnection_id_unique", + "columns": ["id"], + "isUnique": true + }, + "socialsConnection_user_id_unique": { + "name": "socialsConnection_user_id_unique", + "columns": ["user_id"], + "isUnique": true + }, + "socials_connection_user_id_idx": { + "name": "socials_connection_user_id_idx", + "columns": ["user_id"], + "isUnique": false + }, + "socials_connection_discord_id_idx": { + "name": "socials_connection_discord_id_idx", + "columns": ["discord_id"], + "isUnique": false + } + }, + "foreignKeys": { + "socialsConnection_user_id_authUser_id_fk": { + "name": "socialsConnection_user_id_authUser_id_fk", + "tableFrom": "socialsConnection", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userFavorite": { + "name": "userFavorite", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": { + "userFavorite_id_unique": { + "name": "userFavorite_id_unique", + "columns": ["id"], + "isUnique": true + }, + "favorited_assets_id_idx": { + "name": "favorited_assets_id_idx", + "columns": ["id"], + "isUnique": false + }, + "favorited_assets_user_id_idx": { + "name": "favorited_assets_user_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "userFavorite_user_id_authUser_id_fk": { + "name": "userFavorite_user_id_authUser_id_fk", + "tableFrom": "userFavorite", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userFavoriteAsset": { + "name": "userFavoriteAsset", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "favorited_assets_id": { + "name": "favorited_assets_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "userFavoriteAsset_id_unique": { + "name": "userFavoriteAsset_id_unique", + "columns": ["id"], + "isUnique": true + }, + "favorited_assets_assets_id_idx": { + "name": "favorited_assets_assets_id_idx", + "columns": ["id"], + "isUnique": false + }, + "favorited_assets_assets_user_id_idx": { + "name": "favorited_assets_assets_user_id_idx", + "columns": ["favorited_assets_id"], + "isUnique": false + }, + "favorited_assets_assets_asset_id_idx": { + "name": "favorited_assets_assets_asset_id_idx", + "columns": ["asset_id"], + "isUnique": false + } + }, + "foreignKeys": { + "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk": { + "name": "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk", + "tableFrom": "userFavoriteAsset", + "tableTo": "userFavorite", + "columnsFrom": ["favorited_assets_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "userFavoriteAsset_asset_id_asset_id_fk": { + "name": "userFavoriteAsset_asset_id_asset_id_fk", + "tableFrom": "userFavoriteAsset", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userNetworking": { + "name": "userNetworking", + "columns": { + "followerId": { + "name": "followerId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "followingId": { + "name": "followingId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "userNetworking_follower_idx": { + "name": "userNetworking_follower_idx", + "columns": ["followerId"], + "isUnique": false + }, + "userNetworking_following_idx": { + "name": "userNetworking_following_idx", + "columns": ["followingId"], + "isUnique": false + } + }, + "foreignKeys": { + "userNetworking_followerId_authUser_id_fk": { + "name": "userNetworking_followerId_authUser_id_fk", + "tableFrom": "userNetworking", + "tableTo": "authUser", + "columnsFrom": ["followerId"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "userNetworking_followingId_authUser_id_fk": { + "name": "userNetworking_followingId_authUser_id_fk", + "tableFrom": "userNetworking", + "tableTo": "authUser", + "columnsFrom": ["followingId"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} } - }, - "indexes": { - "assets_id_idx": { - "name": "assets_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "assets_name_idx": { - "name": "assets_name_idx", - "columns": [ - "name" - ], - "isUnique": false - }, - "assets_game_name_idx": { - "name": "assets_game_name_idx", - "columns": [ - "game" - ], - "isUnique": false - }, - "assets_asset_category_name_idx": { - "name": "assets_asset_category_name_idx", - "columns": [ - "asset_category" - ], - "isUnique": false - }, - "assets_uploaded_by_id_idx": { - "name": "assets_uploaded_by_id_idx", - "columns": [ - "uploaded_by" - ], - "isUnique": false - } - }, - "foreignKeys": { - "asset_game_game_id_fk": { - "name": "asset_game_game_id_fk", - "tableFrom": "asset", - "tableTo": "game", - "columnsFrom": [ - "game" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "asset_asset_category_assetCategory_id_fk": { - "name": "asset_asset_category_assetCategory_id_fk", - "tableFrom": "asset", - "tableTo": "assetCategory", - "columnsFrom": [ - "asset_category" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "asset_uploaded_by_authUser_id_fk": { - "name": "asset_uploaded_by_authUser_id_fk", - "tableFrom": "asset", - "tableTo": "authUser", - "columnsFrom": [ - "uploaded_by" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} }, - "assetCategory": { - "name": "assetCategory", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetCategory_id_unique": { - "name": "assetCategory_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "assetCategory_name_unique": { - "name": "assetCategory_name_unique", - "columns": [ - "name" - ], - "isUnique": true - }, - "asset_category_id_idx": { - "name": "asset_category_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "asset_category_name_idx": { - "name": "asset_category_name_idx", - "columns": [ - "name" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "gameAssetCategory": { - "name": "gameAssetCategory", - "columns": { - "game_id": { - "name": "game_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_category_id": { - "name": "asset_category_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "game_asset_category_game_id_idx": { - "name": "game_asset_category_game_id_idx", - "columns": [ - "game_id" - ], - "isUnique": false - }, - "game_asset_category_asset_category_id_idx": { - "name": "game_asset_category_asset_category_id_idx", - "columns": [ - "asset_category_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "gameAssetCategory_game_id_game_id_fk": { - "name": "gameAssetCategory_game_id_game_id_fk", - "tableFrom": "gameAssetCategory", - "tableTo": "game", - "columnsFrom": [ - "game_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "gameAssetCategory_asset_category_id_assetCategory_id_fk": { - "name": "gameAssetCategory_asset_category_id_assetCategory_id_fk", - "tableFrom": "gameAssetCategory", - "tableTo": "assetCategory", - "columnsFrom": [ - "asset_category_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetTag": { - "name": "assetTag", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetTag_id_unique": { - "name": "assetTag_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "assetTag_name_unique": { - "name": "assetTag_name_unique", - "columns": [ - "name" - ], - "isUnique": true - }, - "asset_tag_id_idx": { - "name": "asset_tag_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "asset_tag_name_idx": { - "name": "asset_tag_name_idx", - "columns": [ - "name" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetTagAsset": { - "name": "assetTagAsset", - "columns": { - "asset_tag_id": { - "name": "asset_tag_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "asset_tags_assets_asset_tag_id_idx": { - "name": "asset_tags_assets_asset_tag_id_idx", - "columns": [ - "asset_tag_id" - ], - "isUnique": false - }, - "asset_tags_assets_asset_id_idx": { - "name": "asset_tags_assets_asset_id_idx", - "columns": [ - "asset_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "assetTagAsset_asset_tag_id_assetTag_id_fk": { - "name": "assetTagAsset_asset_tag_id_assetTag_id_fk", - "tableFrom": "assetTagAsset", - "tableTo": "assetTag", - "columnsFrom": [ - "asset_tag_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "assetTagAsset_asset_id_asset_id_fk": { - "name": "assetTagAsset_asset_id_asset_id_fk", - "tableFrom": "assetTagAsset", - "tableTo": "asset", - "columnsFrom": [ - "asset_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "atlas": { - "name": "atlas", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "url": { - "name": "url", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by": { - "name": "uploaded_by", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by_name": { - "name": "uploaded_by_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_date": { - "name": "uploaded_date", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "file_size": { - "name": "file_size", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "atlas_id_unique": { - "name": "atlas_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "atlas_id_idx": { - "name": "atlas_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "atlas_uploaded_by_idx": { - "name": "atlas_uploaded_by_idx", - "columns": [ - "uploaded_by" - ], - "isUnique": false - }, - "atlas_uploaded_by_name_idx": { - "name": "atlas_uploaded_by_name_idx", - "columns": [ - "uploaded_by_name" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "atlasToAsset": { - "name": "atlasToAsset", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "atlas_id": { - "name": "atlas_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "atlas_to_assets_id_idx": { - "name": "atlas_to_assets_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "atlas_to_assets_atlas_id_idx": { - "name": "atlas_to_assets_atlas_id_idx", - "columns": [ - "atlas_id" - ], - "isUnique": false - }, - "atlas_to_assets_asset_id_idx": { - "name": "atlas_to_assets_asset_id_idx", - "columns": [ - "asset_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "atlasToAsset_atlas_id_atlas_id_fk": { - "name": "atlasToAsset_atlas_id_atlas_id_fk", - "tableFrom": "atlasToAsset", - "tableTo": "atlas", - "columnsFrom": [ - "atlas_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "atlasToAsset_asset_id_asset_id_fk": { - "name": "atlasToAsset_asset_id_asset_id_fk", - "tableFrom": "atlasToAsset", - "tableTo": "asset", - "columnsFrom": [ - "asset_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "game": { - "name": "game", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - }, - "possible_suggestive_content": { - "name": "possible_suggestive_content", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "game_id_unique": { - "name": "game_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "game_name_unique": { - "name": "game_name_unique", - "columns": [ - "name" - ], - "isUnique": true - }, - "game_id_idx": { - "name": "game_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "game_name_idx": { - "name": "game_name_idx", - "columns": [ - "name" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "savedOcGenerators": { - "name": "savedOcGenerators", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "game": { - "name": "game", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "date_created": { - "name": "date_created", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "content": { - "name": "content", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "saved_color_palette": { - "name": "saved_color_palette", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "sakura_url": { - "name": "sakura_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "savedOcGenerators_id_unique": { - "name": "savedOcGenerators_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "saved_oc_generators_id_idx": { - "name": "saved_oc_generators_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "saved_oc_generators_user_id_idx": { - "name": "saved_oc_generators_user_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "savedOcGenerators_user_id_authUser_id_fk": { - "name": "savedOcGenerators_user_id_authUser_id_fk", - "tableFrom": "savedOcGenerators", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "authUser": { - "name": "authUser", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "avatar_url": { - "name": "avatar_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "banner_url": { - "name": "banner_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "display_name": { - "name": "display_name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "username": { - "name": "username", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "username_colour": { - "name": "username_colour", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "email": { - "name": "email", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "email_verified": { - "name": "email_verified", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "pronouns": { - "name": "pronouns", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "verified": { - "name": "verified", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "bio": { - "name": "bio", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "'No bio set'" - }, - "date_joined": { - "name": "date_joined", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "role_flags": { - "name": "role_flags", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 1 - }, - "is_contributor": { - "name": "is_contributor", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "self_assignable_role_flags": { - "name": "self_assignable_role_flags", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "authUser_id_unique": { - "name": "authUser_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "authUser_username_unique": { - "name": "authUser_username_unique", - "columns": [ - "username" - ], - "isUnique": true - }, - "user_id_idx": { - "name": "user_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "user_username_idx": { - "name": "user_username_idx", - "columns": [ - "username" - ], - "isUnique": false - }, - "user_email_idx": { - "name": "user_email_idx", - "columns": [ - "email" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "authKey": { - "name": "authKey", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "hashed_password": { - "name": "hashed_password", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "authKey_id_unique": { - "name": "authKey_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "key_user_id_idx": { - "name": "key_user_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "authKey_user_id_authUser_id_fk": { - "name": "authKey_user_id_authUser_id_fk", - "tableFrom": "authKey", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "emailVerificationToken": { - "name": "emailVerificationToken", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "emailVerificationToken_id_unique": { - "name": "emailVerificationToken_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "email_verification_token_user_id_idx": { - "name": "email_verification_token_user_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - }, - "email_verification_token_token_idx": { - "name": "email_verification_token_token_idx", - "columns": [ - "token" - ], - "isUnique": false - } - }, - "foreignKeys": { - "emailVerificationToken_user_id_authUser_id_fk": { - "name": "emailVerificationToken_user_id_authUser_id_fk", - "tableFrom": "emailVerificationToken", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "passwordResetToken": { - "name": "passwordResetToken", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "passwordResetToken_id_unique": { - "name": "passwordResetToken_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "password_reset_token_user_id_idx": { - "name": "password_reset_token_user_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - }, - "password_reset_token_token_idx": { - "name": "password_reset_token_token_idx", - "columns": [ - "token" - ], - "isUnique": false - } - }, - "foreignKeys": { - "passwordResetToken_user_id_authUser_id_fk": { - "name": "passwordResetToken_user_id_authUser_id_fk", - "tableFrom": "passwordResetToken", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userCollection": { - "name": "userCollection", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "date_created": { - "name": "date_created", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - } - }, - "indexes": { - "userCollection_id_unique": { - "name": "userCollection_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "collection_id_idx": { - "name": "collection_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "user_collection_id_idx": { - "name": "user_collection_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "userCollection_user_id_authUser_id_fk": { - "name": "userCollection_user_id_authUser_id_fk", - "tableFrom": "userCollection", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetCollectionAsset": { - "name": "assetCollectionAsset", - "columns": { - "collection_id": { - "name": "collection_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "date_added": { - "name": "date_added", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "collection_assets_collection_id_idx": { - "name": "collection_assets_collection_id_idx", - "columns": [ - "collection_id" - ], - "isUnique": false - }, - "collection_assets_asset_id_idx": { - "name": "collection_assets_asset_id_idx", - "columns": [ - "asset_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "assetCollectionAsset_collection_id_userCollection_id_fk": { - "name": "assetCollectionAsset_collection_id_userCollection_id_fk", - "tableFrom": "assetCollectionAsset", - "tableTo": "userCollection", - "columnsFrom": [ - "collection_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "assetCollectionAsset_asset_id_asset_id_fk": { - "name": "assetCollectionAsset_asset_id_asset_id_fk", - "tableFrom": "assetCollectionAsset", - "tableTo": "asset", - "columnsFrom": [ - "asset_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "socialsConnection": { - "name": "socialsConnection", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "discord_id": { - "name": "discord_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "socialsConnection_id_unique": { - "name": "socialsConnection_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "socialsConnection_user_id_unique": { - "name": "socialsConnection_user_id_unique", - "columns": [ - "user_id" - ], - "isUnique": true - }, - "socials_connection_user_id_idx": { - "name": "socials_connection_user_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - }, - "socials_connection_discord_id_idx": { - "name": "socials_connection_discord_id_idx", - "columns": [ - "discord_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "socialsConnection_user_id_authUser_id_fk": { - "name": "socialsConnection_user_id_authUser_id_fk", - "tableFrom": "socialsConnection", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userFavorite": { - "name": "userFavorite", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - } - }, - "indexes": { - "userFavorite_id_unique": { - "name": "userFavorite_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "favorited_assets_id_idx": { - "name": "favorited_assets_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "favorited_assets_user_id_idx": { - "name": "favorited_assets_user_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "userFavorite_user_id_authUser_id_fk": { - "name": "userFavorite_user_id_authUser_id_fk", - "tableFrom": "userFavorite", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userFavoriteAsset": { - "name": "userFavoriteAsset", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "favorited_assets_id": { - "name": "favorited_assets_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "userFavoriteAsset_id_unique": { - "name": "userFavoriteAsset_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "favorited_assets_assets_id_idx": { - "name": "favorited_assets_assets_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "favorited_assets_assets_user_id_idx": { - "name": "favorited_assets_assets_user_id_idx", - "columns": [ - "favorited_assets_id" - ], - "isUnique": false - }, - "favorited_assets_assets_asset_id_idx": { - "name": "favorited_assets_assets_asset_id_idx", - "columns": [ - "asset_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk": { - "name": "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk", - "tableFrom": "userFavoriteAsset", - "tableTo": "userFavorite", - "columnsFrom": [ - "favorited_assets_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "userFavoriteAsset_asset_id_asset_id_fk": { - "name": "userFavoriteAsset_asset_id_asset_id_fk", - "tableFrom": "userFavoriteAsset", - "tableTo": "asset", - "columnsFrom": [ - "asset_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userNetworking": { - "name": "userNetworking", - "columns": { - "followerId": { - "name": "followerId", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "followingId": { - "name": "followingId", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "userNetworking_follower_idx": { - "name": "userNetworking_follower_idx", - "columns": [ - "followerId" - ], - "isUnique": false - }, - "userNetworking_following_idx": { - "name": "userNetworking_following_idx", - "columns": [ - "followingId" - ], - "isUnique": false - } - }, - "foreignKeys": { - "userNetworking_followerId_authUser_id_fk": { - "name": "userNetworking_followerId_authUser_id_fk", - "tableFrom": "userNetworking", - "tableTo": "authUser", - "columnsFrom": [ - "followerId" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "userNetworking_followingId_authUser_id_fk": { - "name": "userNetworking_followingId_authUser_id_fk", - "tableFrom": "userNetworking", - "tableTo": "authUser", - "columnsFrom": [ - "followingId" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} } - }, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - } -} \ No newline at end of file +} diff --git a/src/v2/db/migrations/meta/_journal.json b/src/v2/db/migrations/meta/_journal.json index a3e3017..2e17de0 100644 --- a/src/v2/db/migrations/meta/_journal.json +++ b/src/v2/db/migrations/meta/_journal.json @@ -1,13 +1,13 @@ { - "version": "5", - "dialect": "sqlite", - "entries": [ - { - "idx": 0, - "version": "5", - "when": 1700189550333, - "tag": "0000_busy_dreaming_celestial", - "breakpoints": true - } - ] -} \ No newline at end of file + "version": "5", + "dialect": "sqlite", + "entries": [ + { + "idx": 0, + "version": "5", + "when": 1700189550333, + "tag": "0000_busy_dreaming_celestial", + "breakpoints": true + } + ] +} From 464ac15fd9dd33ee6c75ee93d5aa3dd948918e52 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Sat, 18 Nov 2023 04:23:04 +0000 Subject: [PATCH 159/318] we are so fucking back --- .env.example | 3 +-- drizzle.config.ts | 4 +--- src/index.ts | 9 +++++++- src/scripts/migrate/migrate.mts | 8 +++---- src/v2/db/schema/user/user.ts | 1 + src/v2/db/turso.ts | 8 +++---- src/v2/lib/managers/game/game-manager.ts | 19 ++++++++++++++++ src/v2/lib/oslo.ts | 2 +- .../asset/search/{ => id}/[id]/route.ts | 0 .../collection/{route.ts => handler.ts} | 0 src/v2/routes/game/get/all/openapi.ts | 15 +++++++++++++ src/v2/routes/game/get/all/route.ts | 18 +++++++++++++++ src/v2/routes/game/get/handler.ts | 12 ++++++++++ src/v2/routes/game/get/id/[id]/openapi.ts | 19 ++++++++++++++++ src/v2/routes/game/get/id/[id]/route.ts | 20 +++++++++++++++++ src/v2/routes/game/get/id/[id]/schema.ts | 12 ++++++++++ src/v2/routes/game/get/name/[name]/openapi.ts | 22 +++++++++++++++++++ src/v2/routes/game/get/name/[name]/route.ts | 20 +++++++++++++++++ src/v2/routes/game/get/name/[name]/schema.ts | 12 ++++++++++ .../routes/{user/route.ts => game/handler.ts} | 4 ++-- src/v2/routes/handler.ts | 10 +++++++++ src/v2/routes/route.ts | 21 ------------------ .../follows/follow/{ => id}/[id]/openapi.ts | 0 .../follows/follow/id/[id]}/route.ts | 0 .../follows/follow/id/[id]}/schema.ts | 0 .../{follow/[id]/route.ts => handler.ts} | 0 .../follows/list/{ => id}/[id]/openapi.ts | 0 .../user/follows/list/{ => id}/[id]/route.ts | 0 .../{follow => list/id}/[id]/schema.ts | 0 .../user/follows/unfollow/[id]/route.ts | 0 .../user/follows/unfollow/[id]/schema.ts | 0 .../follows/unfollow/{ => id}/[id]/openapi.ts | 0 .../follows/{ => unfollow/id/[id]}/route.ts | 0 .../{list => unfollow/id}/[id]/schema.ts | 0 .../routes/user/get/{route.ts => handler.ts} | 4 ++-- .../routes/user/get/{ => id}/[id]/openapi.ts | 3 +++ src/v2/routes/user/get/{ => id}/[id]/route.ts | 13 ++++++----- .../routes/user/get/{ => id}/[id]/schema.ts | 0 .../get/{ => username}/[username]/openapi.ts | 3 +++ .../get/{ => username}/[username]/route.ts | 4 ++-- .../get/{ => username}/[username]/schema.ts | 0 src/v2/routes/user/handler.ts | 10 +++++++++ src/v2/routes/user/search/handler.ts | 8 +++++++ src/v2/routes/user/search/route.ts | 0 .../search/username/[username]/openapi.ts | 22 +++++++++++++++++++ .../user/search/username/[username]/route.ts | 20 +++++++++++++++++ .../user/search/username/[username]/schema.ts | 12 ++++++++++ src/v2/routes/user/search/username/route.ts | 0 src/worker-configuration.d.ts | 8 +++---- 49 files changed, 294 insertions(+), 52 deletions(-) rename src/v2/routes/asset/search/{ => id}/[id]/route.ts (100%) rename src/v2/routes/collection/{route.ts => handler.ts} (100%) create mode 100644 src/v2/routes/game/get/handler.ts rename src/v2/routes/{user/route.ts => game/handler.ts} (63%) create mode 100644 src/v2/routes/handler.ts delete mode 100644 src/v2/routes/route.ts rename src/v2/routes/user/follows/follow/{ => id}/[id]/openapi.ts (100%) rename src/v2/routes/{game => user/follows/follow/id/[id]}/route.ts (100%) rename src/v2/routes/{game/get/all => user/follows/follow/id/[id]}/schema.ts (100%) rename src/v2/routes/user/follows/{follow/[id]/route.ts => handler.ts} (100%) rename src/v2/routes/user/follows/list/{ => id}/[id]/openapi.ts (100%) rename src/v2/routes/user/follows/list/{ => id}/[id]/route.ts (100%) rename src/v2/routes/user/follows/{follow => list/id}/[id]/schema.ts (100%) delete mode 100644 src/v2/routes/user/follows/unfollow/[id]/route.ts delete mode 100644 src/v2/routes/user/follows/unfollow/[id]/schema.ts rename src/v2/routes/user/follows/unfollow/{ => id}/[id]/openapi.ts (100%) rename src/v2/routes/user/follows/{ => unfollow/id/[id]}/route.ts (100%) rename src/v2/routes/user/follows/{list => unfollow/id}/[id]/schema.ts (100%) rename src/v2/routes/user/get/{route.ts => handler.ts} (61%) rename src/v2/routes/user/get/{ => id}/[id]/openapi.ts (85%) rename src/v2/routes/user/get/{ => id}/[id]/route.ts (72%) rename src/v2/routes/user/get/{ => id}/[id]/schema.ts (100%) rename src/v2/routes/user/get/{ => username}/[username]/openapi.ts (86%) rename src/v2/routes/user/get/{ => username}/[username]/route.ts (84%) rename src/v2/routes/user/get/{ => username}/[username]/schema.ts (100%) create mode 100644 src/v2/routes/user/handler.ts create mode 100644 src/v2/routes/user/search/handler.ts delete mode 100644 src/v2/routes/user/search/route.ts delete mode 100644 src/v2/routes/user/search/username/route.ts diff --git a/.env.example b/.env.example index 08210a3..bfe16ff 100644 --- a/.env.example +++ b/.env.example @@ -1,4 +1,3 @@ -TURSO_DEV_DATABASE_URL = http://127.0.0.1:8080 -ENVIRONMENT = DEV +ENVIRONMENT = DEV # DEV | PROD TURSO_DATABASE_URL = dsikfjhskdlfnjklsdfnjgnfkslndfg TURSO_DATABASE_AUTH_TOKEN = hi \ No newline at end of file diff --git a/drizzle.config.ts b/drizzle.config.ts index 95d164f..4d2f32c 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -3,8 +3,6 @@ import type { Config } from "drizzle-kit" const { TURSO_DATABASE_AUTH_TOKEN, TURSO_DATABASE_URL, ENVIRONMENT } = process.env -const TURSO_DEV_DATABASE_URL = - process.env.TURSO_DEV_DATABASE_URL ?? "http://127.0.0.1:8080" const isDev = ENVIRONMENT === "DEV" export default { @@ -15,7 +13,7 @@ export default { strict: true, verbose: true, dbCredentials: { - url: isDev ? TURSO_DEV_DATABASE_URL : TURSO_DATABASE_URL!, + url: isDev ? "http://127.0.0.1:8080" : TURSO_DATABASE_URL!, authToken: isDev ? undefined : TURSO_DATABASE_AUTH_TOKEN!, }, } satisfies Config diff --git a/src/index.ts b/src/index.ts index 32d7a27..ef53a43 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,7 +1,7 @@ import { OpenAPIHono } from "@hono/zod-openapi" import { swaggerUI } from "@hono/swagger-ui" import { prettyJSON } from "hono/pretty-json" -import BaseRoutes from "@/v2/routes/route" +import BaseRoutes from "@/v2/routes/handler" const app = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() @@ -22,6 +22,13 @@ app.get( }) ) +app.use("*", async (ctx, next) => { + const start = Date.now() + await next() + const ms = Date.now() - start + ctx.res.headers.set("X-Response-Time", `${ms}ms`) +}) + app.use("*", prettyJSON()) export default app diff --git a/src/scripts/migrate/migrate.mts b/src/scripts/migrate/migrate.mts index 66c45fb..b6509c4 100644 --- a/src/scripts/migrate/migrate.mts +++ b/src/scripts/migrate/migrate.mts @@ -15,17 +15,15 @@ async function main() { isDev && console.log("TURSO_DEV_DATABASE_URL: ", TURSO_DEV_DATABASE_URL) !isDev && console.log("TURSO_DATABASE_URL: ", TURSO_DATABASE_URL) - const waitTime = isDev ? 3000 : 1000 + const waitTime = isDev ? 1000 : 10000 console.log(`Waiting ${waitTime}ms until migration...`) await new Promise((resolve) => setTimeout(resolve, waitTime)) console.log("Connecting to database client...") const client = createClient({ - url: (isDev - ? TURSO_DEV_DATABASE_URL ?? TURSO_DATABASE_URL - : TURSO_DATABASE_URL) as string, - ...(isDev ? {} : { authToken: TURSO_DATABASE_AUTH_TOKEN }), + url: isDev ? TURSO_DEV_DATABASE_URL : TURSO_DATABASE_URL!, + authToken: isDev ? undefined : TURSO_DATABASE_AUTH_TOKEN!, }) const db = drizzleORM(client) console.log( diff --git a/src/v2/db/schema/user/user.ts b/src/v2/db/schema/user/user.ts index ca9d6df..64df477 100644 --- a/src/v2/db/schema/user/user.ts +++ b/src/v2/db/schema/user/user.ts @@ -21,6 +21,7 @@ import { atlas } from "../asset/asset-atlas" NOTE: Very basic user information - Users table is user information - Keys table is login methods (i.e Credentials, OAuth, etc.) +- We handle sessions w/ Cloudflare KV instead of a sessions table */ export const authUser = sqliteTable( diff --git a/src/v2/db/turso.ts b/src/v2/db/turso.ts index 944f7d1..0c015c9 100644 --- a/src/v2/db/turso.ts +++ b/src/v2/db/turso.ts @@ -25,12 +25,12 @@ export function getConnection(env: Bindings) { * The `url` option is set to the `TURSO_DATABASE_URL` environment variable. * The `authToken` option is set to the `TURSO_DATABASE_AUTH_TOKEN` environment variable. **/ - const isDev = env.ENVIRONMENT === "DEV" - const TURSO_DEV_DATABASE_URL = - env.TURSO_DEV_DATABASE_URL ?? "http://127.0.0.1:8080" + const isDev = env.ENVIRONMENT !== "PROD" + + console.log(env) const turso = createClient({ - url: isDev ? TURSO_DEV_DATABASE_URL : env.TURSO_DATABASE_URL!, + url: isDev ? "http://127.0.0.1:8080" : env.TURSO_DATABASE_URL!, authToken: isDev ? undefined : env.TURSO_DATABASE_AUTH_TOKEN!, }) diff --git a/src/v2/lib/managers/game/game-manager.ts b/src/v2/lib/managers/game/game-manager.ts index 812b954..7b452f1 100644 --- a/src/v2/lib/managers/game/game-manager.ts +++ b/src/v2/lib/managers/game/game-manager.ts @@ -28,6 +28,25 @@ export class GameManager { } } + /** + * Retrieves a game by its name. + * @param gameName - The name of the game to retrieve. + * @returns A promise that resolves to the retrieved game and its asset categories. + */ + public async getGameByName(gameName: string): Promise { + try { + const [foundGame] = await this.drizzle + .select() + .from(game) + .where(eq(game.name, gameName)) + + return foundGame ?? null + } catch (e) { + console.error(`Error getting game by name ${gameName}`, e) + throw new Error(`Error getting game by name ${gameName}`) + } + } + /** * Retrieves games with partial name matching. * @param gameName - The partial name to search for within game names. diff --git a/src/v2/lib/oslo.ts b/src/v2/lib/oslo.ts index a1f91ae..c42c21f 100644 --- a/src/v2/lib/oslo.ts +++ b/src/v2/lib/oslo.ts @@ -1,5 +1,5 @@ import { generateRandomString, alphabet } from "oslo/random" export function generateID() { - return generateRandomString(15, alphabet("a-z", "0-9")).toUpperCase() + return generateRandomString(15, alphabet("a-z", "0-9")).toLowerCase() } diff --git a/src/v2/routes/asset/search/[id]/route.ts b/src/v2/routes/asset/search/id/[id]/route.ts similarity index 100% rename from src/v2/routes/asset/search/[id]/route.ts rename to src/v2/routes/asset/search/id/[id]/route.ts diff --git a/src/v2/routes/collection/route.ts b/src/v2/routes/collection/handler.ts similarity index 100% rename from src/v2/routes/collection/route.ts rename to src/v2/routes/collection/handler.ts diff --git a/src/v2/routes/game/get/all/openapi.ts b/src/v2/routes/game/get/all/openapi.ts index e69de29..01e1d0a 100644 --- a/src/v2/routes/game/get/all/openapi.ts +++ b/src/v2/routes/game/get/all/openapi.ts @@ -0,0 +1,15 @@ +import { createRoute } from "@hono/zod-openapi" + +export const getAllGamesRoute = createRoute({ + path: "/all", + method: "get", + description: "Get all games.", + responses: { + 200: { + description: "All games.", + }, + 500: { + description: "Internal server error.", + }, + }, +}) diff --git a/src/v2/routes/game/get/all/route.ts b/src/v2/routes/game/get/all/route.ts index e69de29..b6da4b2 100644 --- a/src/v2/routes/game/get/all/route.ts +++ b/src/v2/routes/game/get/all/route.ts @@ -0,0 +1,18 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { getAllGamesRoute } from "./openapi" +import { GameManager } from "@/v2/lib/managers/game/game-manager" +import { getConnection } from "@/v2/db/turso" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.openapi(getAllGamesRoute, async (ctx) => { + const { drizzle } = await getConnection(ctx.env) + const gameManager = new GameManager(drizzle) + const games = await gameManager.listGames() + + return ctx.jsonT({ + games, + }) +}) + +export default handler diff --git a/src/v2/routes/game/get/handler.ts b/src/v2/routes/game/get/handler.ts new file mode 100644 index 0000000..a6be1d7 --- /dev/null +++ b/src/v2/routes/game/get/handler.ts @@ -0,0 +1,12 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import GetGameByNameRoute from "./name/[name]/route" +import GetGameByIdRoute from "./id/[id]/route" +import GetAllGamesRoute from "./all/route" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.route("/name", GetGameByNameRoute) +handler.route("/id", GetGameByIdRoute) +handler.route("/list", GetAllGamesRoute) + +export default handler diff --git a/src/v2/routes/game/get/id/[id]/openapi.ts b/src/v2/routes/game/get/id/[id]/openapi.ts index e69de29..8b15faf 100644 --- a/src/v2/routes/game/get/id/[id]/openapi.ts +++ b/src/v2/routes/game/get/id/[id]/openapi.ts @@ -0,0 +1,19 @@ +import { createRoute } from "@hono/zod-openapi" +import { getGameByIdSchema } from "./schema" + +export const getGameByIdRoute = createRoute({ + path: "/{id}", + method: "get", + description: "Get a game by their ID.", + request: { + params: getGameByIdSchema, + }, + responses: { + 200: { + description: "Game was found.", + }, + 500: { + description: "Internal server error.", + }, + }, +}) diff --git a/src/v2/routes/game/get/id/[id]/route.ts b/src/v2/routes/game/get/id/[id]/route.ts index e69de29..8ed8c7c 100644 --- a/src/v2/routes/game/get/id/[id]/route.ts +++ b/src/v2/routes/game/get/id/[id]/route.ts @@ -0,0 +1,20 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { getGameByIdRoute } from "./openapi" +import { GameManager } from "@/v2/lib/managers/game/game-manager" +import { getConnection } from "@/v2/db/turso" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.openapi(getGameByIdRoute, async (ctx) => { + const id = ctx.req.valid("param").id + + const { drizzle } = await getConnection(ctx.env) + const gameManager = new GameManager(drizzle) + const game = await gameManager.getGameById(id) + + return ctx.jsonT({ + game, + }) +}) + +export default handler diff --git a/src/v2/routes/game/get/id/[id]/schema.ts b/src/v2/routes/game/get/id/[id]/schema.ts index e69de29..5d7e715 100644 --- a/src/v2/routes/game/get/id/[id]/schema.ts +++ b/src/v2/routes/game/get/id/[id]/schema.ts @@ -0,0 +1,12 @@ +import { z } from "@hono/zod-openapi" + +export const getGameByIdSchema = z.object({ + id: z.string().openapi({ + param: { + name: "id", + in: "path", + required: true, + }, + description: "The ID of the game to retrieve.", + }), +}) diff --git a/src/v2/routes/game/get/name/[name]/openapi.ts b/src/v2/routes/game/get/name/[name]/openapi.ts index e69de29..1d90b9e 100644 --- a/src/v2/routes/game/get/name/[name]/openapi.ts +++ b/src/v2/routes/game/get/name/[name]/openapi.ts @@ -0,0 +1,22 @@ +import { createRoute } from "@hono/zod-openapi" +import { getGameByNameSchema } from "./schema" + +export const getGameByNameRoute = createRoute({ + path: "/{name}", + method: "get", + description: "Search for games by their name.", + request: { + params: getGameByNameSchema, + }, + responses: { + 200: { + description: "Game was found.", + }, + 404: { + description: "Game was not found.", + }, + 500: { + description: "Internal server error.", + }, + }, +}) diff --git a/src/v2/routes/game/get/name/[name]/route.ts b/src/v2/routes/game/get/name/[name]/route.ts index e69de29..eb08b69 100644 --- a/src/v2/routes/game/get/name/[name]/route.ts +++ b/src/v2/routes/game/get/name/[name]/route.ts @@ -0,0 +1,20 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { getGameByNameRoute } from "./openapi" +import { GameManager } from "@/v2/lib/managers/game/game-manager" +import { getConnection } from "@/v2/db/turso" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.openapi(getGameByNameRoute, async (ctx) => { + const name = ctx.req.valid("param").name + + const { drizzle } = await getConnection(ctx.env) + const gameManager = new GameManager(drizzle) + const game = await gameManager.getGameByName(name) + + return ctx.jsonT({ + game, + }) +}) + +export default handler diff --git a/src/v2/routes/game/get/name/[name]/schema.ts b/src/v2/routes/game/get/name/[name]/schema.ts index e69de29..1de566b 100644 --- a/src/v2/routes/game/get/name/[name]/schema.ts +++ b/src/v2/routes/game/get/name/[name]/schema.ts @@ -0,0 +1,12 @@ +import { z } from "@hono/zod-openapi" + +export const getGameByNameSchema = z.object({ + name: z.string().openapi({ + param: { + name: "name", + in: "path", + required: true, + }, + description: "The name of the game to retrieve.", + }), +}) diff --git a/src/v2/routes/user/route.ts b/src/v2/routes/game/handler.ts similarity index 63% rename from src/v2/routes/user/route.ts rename to src/v2/routes/game/handler.ts index eac3d41..0bf7a49 100644 --- a/src/v2/routes/user/route.ts +++ b/src/v2/routes/game/handler.ts @@ -1,8 +1,8 @@ import { OpenAPIHono } from "@hono/zod-openapi" -import UserGetRoute from "@/v2/routes/user/get/route" +import GameGetRoute from "./get/handler" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() -handler.route("/get", UserGetRoute) +handler.route("/get", GameGetRoute) export default handler diff --git a/src/v2/routes/handler.ts b/src/v2/routes/handler.ts new file mode 100644 index 0000000..532d4ec --- /dev/null +++ b/src/v2/routes/handler.ts @@ -0,0 +1,10 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import UserRoute from "@/v2/routes/user/handler" +import GameRoute from "@/v2/routes/game/handler" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.route("/user", UserRoute) +handler.route("/game", GameRoute) + +export default handler diff --git a/src/v2/routes/route.ts b/src/v2/routes/route.ts deleted file mode 100644 index 15d6730..0000000 --- a/src/v2/routes/route.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { OpenAPIHono } from "@hono/zod-openapi" -import UserRoute from "@/v2/routes/user/route" -import { getConnection } from "@/v2/db/turso" -import { auth } from "@/v2/lib/auth/lucia" - -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() - -handler.route("/user", UserRoute) - -handler.use("*", async (ctx, next) => { - const { drizzle, turso } = getConnection(ctx.env) - const lucia = auth(ctx.env) - - ctx.set("drizzle", drizzle) - ctx.set("turso", turso) - ctx.set("lucia", lucia) - - await next() -}) - -export default handler diff --git a/src/v2/routes/user/follows/follow/[id]/openapi.ts b/src/v2/routes/user/follows/follow/id/[id]/openapi.ts similarity index 100% rename from src/v2/routes/user/follows/follow/[id]/openapi.ts rename to src/v2/routes/user/follows/follow/id/[id]/openapi.ts diff --git a/src/v2/routes/game/route.ts b/src/v2/routes/user/follows/follow/id/[id]/route.ts similarity index 100% rename from src/v2/routes/game/route.ts rename to src/v2/routes/user/follows/follow/id/[id]/route.ts diff --git a/src/v2/routes/game/get/all/schema.ts b/src/v2/routes/user/follows/follow/id/[id]/schema.ts similarity index 100% rename from src/v2/routes/game/get/all/schema.ts rename to src/v2/routes/user/follows/follow/id/[id]/schema.ts diff --git a/src/v2/routes/user/follows/follow/[id]/route.ts b/src/v2/routes/user/follows/handler.ts similarity index 100% rename from src/v2/routes/user/follows/follow/[id]/route.ts rename to src/v2/routes/user/follows/handler.ts diff --git a/src/v2/routes/user/follows/list/[id]/openapi.ts b/src/v2/routes/user/follows/list/id/[id]/openapi.ts similarity index 100% rename from src/v2/routes/user/follows/list/[id]/openapi.ts rename to src/v2/routes/user/follows/list/id/[id]/openapi.ts diff --git a/src/v2/routes/user/follows/list/[id]/route.ts b/src/v2/routes/user/follows/list/id/[id]/route.ts similarity index 100% rename from src/v2/routes/user/follows/list/[id]/route.ts rename to src/v2/routes/user/follows/list/id/[id]/route.ts diff --git a/src/v2/routes/user/follows/follow/[id]/schema.ts b/src/v2/routes/user/follows/list/id/[id]/schema.ts similarity index 100% rename from src/v2/routes/user/follows/follow/[id]/schema.ts rename to src/v2/routes/user/follows/list/id/[id]/schema.ts diff --git a/src/v2/routes/user/follows/unfollow/[id]/route.ts b/src/v2/routes/user/follows/unfollow/[id]/route.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/user/follows/unfollow/[id]/schema.ts b/src/v2/routes/user/follows/unfollow/[id]/schema.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/user/follows/unfollow/[id]/openapi.ts b/src/v2/routes/user/follows/unfollow/id/[id]/openapi.ts similarity index 100% rename from src/v2/routes/user/follows/unfollow/[id]/openapi.ts rename to src/v2/routes/user/follows/unfollow/id/[id]/openapi.ts diff --git a/src/v2/routes/user/follows/route.ts b/src/v2/routes/user/follows/unfollow/id/[id]/route.ts similarity index 100% rename from src/v2/routes/user/follows/route.ts rename to src/v2/routes/user/follows/unfollow/id/[id]/route.ts diff --git a/src/v2/routes/user/follows/list/[id]/schema.ts b/src/v2/routes/user/follows/unfollow/id/[id]/schema.ts similarity index 100% rename from src/v2/routes/user/follows/list/[id]/schema.ts rename to src/v2/routes/user/follows/unfollow/id/[id]/schema.ts diff --git a/src/v2/routes/user/get/route.ts b/src/v2/routes/user/get/handler.ts similarity index 61% rename from src/v2/routes/user/get/route.ts rename to src/v2/routes/user/get/handler.ts index 2ba8017..8fe46da 100644 --- a/src/v2/routes/user/get/route.ts +++ b/src/v2/routes/user/get/handler.ts @@ -1,6 +1,6 @@ import { OpenAPIHono } from "@hono/zod-openapi" -import SearchUserByIdRoute from "@/v2/routes/user/get/[id]/route" -import SearchUserByNameRoute from "@/v2/routes/user/get/[username]/route" +import SearchUserByIdRoute from "@/v2/routes/user/get/id/[id]/route" +import SearchUserByNameRoute from "@/v2/routes/user/get/username/[username]/route" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() diff --git a/src/v2/routes/user/get/[id]/openapi.ts b/src/v2/routes/user/get/id/[id]/openapi.ts similarity index 85% rename from src/v2/routes/user/get/[id]/openapi.ts rename to src/v2/routes/user/get/id/[id]/openapi.ts index 9faa3f6..919b34b 100644 --- a/src/v2/routes/user/get/[id]/openapi.ts +++ b/src/v2/routes/user/get/id/[id]/openapi.ts @@ -15,5 +15,8 @@ export const getUserByIdRoute = createRoute({ 404: { description: "The user was not found.", }, + 500: { + description: "Internal server error.", + }, }, }) diff --git a/src/v2/routes/user/get/[id]/route.ts b/src/v2/routes/user/get/id/[id]/route.ts similarity index 72% rename from src/v2/routes/user/get/[id]/route.ts rename to src/v2/routes/user/get/id/[id]/route.ts index ae646a4..bd4c8d6 100644 --- a/src/v2/routes/user/get/[id]/route.ts +++ b/src/v2/routes/user/get/id/[id]/route.ts @@ -1,20 +1,23 @@ import { OpenAPIHono } from "@hono/zod-openapi" import { getUserByIdRoute } from "./openapi" import { UserSearchManager } from "@/v2/lib/managers/user/user-search-manager" +import { getConnection } from "@/v2/db/turso" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.openapi(getUserByIdRoute, async (ctx) => { const userId = ctx.req.valid("param").id - const drizzle = ctx.get("drizzle") - + const { drizzle } = await getConnection(ctx.env) const search = new UserSearchManager(drizzle) const user = await search.getUserById(userId) - return ctx.jsonT({ - user, - }) + return ctx.jsonT( + { + user, + }, + 200 + ) }) export default handler diff --git a/src/v2/routes/user/get/[id]/schema.ts b/src/v2/routes/user/get/id/[id]/schema.ts similarity index 100% rename from src/v2/routes/user/get/[id]/schema.ts rename to src/v2/routes/user/get/id/[id]/schema.ts diff --git a/src/v2/routes/user/get/[username]/openapi.ts b/src/v2/routes/user/get/username/[username]/openapi.ts similarity index 86% rename from src/v2/routes/user/get/[username]/openapi.ts rename to src/v2/routes/user/get/username/[username]/openapi.ts index 8bddc76..ad4adf7 100644 --- a/src/v2/routes/user/get/[username]/openapi.ts +++ b/src/v2/routes/user/get/username/[username]/openapi.ts @@ -15,5 +15,8 @@ export const getUserByNameRoute = createRoute({ 404: { description: "The user was not found.", }, + 500: { + description: "Internal server error.", + }, }, }) diff --git a/src/v2/routes/user/get/[username]/route.ts b/src/v2/routes/user/get/username/[username]/route.ts similarity index 84% rename from src/v2/routes/user/get/[username]/route.ts rename to src/v2/routes/user/get/username/[username]/route.ts index 1f052ba..62eb0cf 100644 --- a/src/v2/routes/user/get/[username]/route.ts +++ b/src/v2/routes/user/get/username/[username]/route.ts @@ -1,14 +1,14 @@ import { OpenAPIHono } from "@hono/zod-openapi" import { getUserByNameRoute } from "./openapi" import { UserSearchManager } from "@/v2/lib/managers/user/user-search-manager" +import { getConnection } from "@/v2/db/turso" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.openapi(getUserByNameRoute, async (ctx) => { const userId = ctx.req.valid("param").username - const drizzle = ctx.get("drizzle") - + const { drizzle } = await getConnection(ctx.env) const search = new UserSearchManager(drizzle) const user = await search.getUserByUsername(userId) diff --git a/src/v2/routes/user/get/[username]/schema.ts b/src/v2/routes/user/get/username/[username]/schema.ts similarity index 100% rename from src/v2/routes/user/get/[username]/schema.ts rename to src/v2/routes/user/get/username/[username]/schema.ts diff --git a/src/v2/routes/user/handler.ts b/src/v2/routes/user/handler.ts new file mode 100644 index 0000000..ac9167f --- /dev/null +++ b/src/v2/routes/user/handler.ts @@ -0,0 +1,10 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import UserGetRoute from "@/v2/routes/user/get/handler" +import UserSearchRoute from "@/v2/routes/user/search/handler" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.route("/get", UserGetRoute) +handler.route("/search", UserSearchRoute) + +export default handler diff --git a/src/v2/routes/user/search/handler.ts b/src/v2/routes/user/search/handler.ts new file mode 100644 index 0000000..7bd1d47 --- /dev/null +++ b/src/v2/routes/user/search/handler.ts @@ -0,0 +1,8 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import SearchUsersByUsernameRoute from "./username/[username]/route" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.route("/username", SearchUsersByUsernameRoute) + +export default handler diff --git a/src/v2/routes/user/search/route.ts b/src/v2/routes/user/search/route.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/user/search/username/[username]/openapi.ts b/src/v2/routes/user/search/username/[username]/openapi.ts index e69de29..4a4701f 100644 --- a/src/v2/routes/user/search/username/[username]/openapi.ts +++ b/src/v2/routes/user/search/username/[username]/openapi.ts @@ -0,0 +1,22 @@ +import { createRoute } from "@hono/zod-openapi" +import { getUsersByNameSchema } from "./schema" + +export const searchUsersByUsernameRoute = createRoute({ + path: "/{username}", + method: "get", + description: "Search for users by their username.", + request: { + params: getUsersByNameSchema, + }, + responses: { + 200: { + description: "User(s) were found.", + }, + 404: { + description: "User(s) were not found.", + }, + 500: { + description: "Internal server error.", + }, + }, +}) diff --git a/src/v2/routes/user/search/username/[username]/route.ts b/src/v2/routes/user/search/username/[username]/route.ts index e69de29..64b7e0a 100644 --- a/src/v2/routes/user/search/username/[username]/route.ts +++ b/src/v2/routes/user/search/username/[username]/route.ts @@ -0,0 +1,20 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { searchUsersByUsernameRoute } from "./openapi" +import { UserSearchManager } from "@/v2/lib/managers/user/user-search-manager" +import { getConnection } from "@/v2/db/turso" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.openapi(searchUsersByUsernameRoute, async (ctx) => { + const userQuery = ctx.req.valid("param").username + + const { drizzle } = await getConnection(ctx.env) + const search = new UserSearchManager(drizzle) + const users = await search.getUsersByUsername(userQuery) + + return ctx.jsonT({ + users, + }) +}) + +export default handler diff --git a/src/v2/routes/user/search/username/[username]/schema.ts b/src/v2/routes/user/search/username/[username]/schema.ts index e69de29..4926f0e 100644 --- a/src/v2/routes/user/search/username/[username]/schema.ts +++ b/src/v2/routes/user/search/username/[username]/schema.ts @@ -0,0 +1,12 @@ +import { z } from "@hono/zod-openapi" + +export const getUsersByNameSchema = z.object({ + username: z.string().openapi({ + param: { + name: "username", + in: "path", + required: true, + }, + description: "The username of the user(s) to retrieve.", + }), +}) diff --git a/src/v2/routes/user/search/username/route.ts b/src/v2/routes/user/search/username/route.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/worker-configuration.d.ts b/src/worker-configuration.d.ts index 2720a0d..da45abc 100644 --- a/src/worker-configuration.d.ts +++ b/src/worker-configuration.d.ts @@ -14,13 +14,12 @@ declare global { DISCORD_CLIENT_SECRET: string DISCORD_REDIRECT_URI: string RESEND_API_KEY: string - TURSO_DEV_DATABASE_URL: string | undefined } type Variables = { - drizzle: import("@/v2/db/turso").DrizzleInstance - turso: import("@/v2/db/turso").TursoInstance - lucia: import("@/v2/lib/auth/lucia").Auth + // drizzle: import("@/v2/db/turso").DrizzleInstance + // turso: import("@/v2/db/turso").TursoInstance + // lucia: import("@/v2/lib/auth/lucia").Auth } /** @@ -28,6 +27,7 @@ declare global { */ type APIContext = import("@hono/zod-openapi").Context<{ Bindings: Bindings + Variables: Variables }> } From a3557814a8c0d0bc39c7e8463bc22b64562329df Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Sat, 18 Nov 2023 07:10:51 +0000 Subject: [PATCH 160/318] link init asset route --- src/index.ts | 9 ++ src/v2/lib/managers/asset/asset-manager.ts | 84 +++++++++++++++++-- src/v2/routes/asset/get/handler.ts | 8 ++ src/v2/routes/asset/get/id/[id]/openapi.ts | 19 +++++ src/v2/routes/asset/get/id/[id]/route.ts | 47 +++++++++++ src/v2/routes/asset/get/id/[id]/schema.ts | 12 +++ src/v2/routes/asset/handler.ts | 8 ++ src/v2/routes/asset/route.ts | 0 src/v2/routes/asset/search/id/[id]/route.ts | 0 src/v2/routes/game/get/id/[id]/route.ts | 20 ++++- src/v2/routes/game/get/name/[name]/openapi.ts | 3 - src/v2/routes/game/get/name/[name]/route.ts | 20 ++++- src/v2/routes/handler.ts | 2 + src/v2/routes/user/get/id/[id]/openapi.ts | 3 - src/v2/routes/user/get/id/[id]/route.ts | 1 + .../user/get/username/[username]/openapi.ts | 3 - .../user/get/username/[username]/route.ts | 10 ++- .../search/username/[username]/openapi.ts | 3 - .../user/search/username/[username]/route.ts | 1 + 19 files changed, 227 insertions(+), 26 deletions(-) create mode 100644 src/v2/routes/asset/get/handler.ts create mode 100644 src/v2/routes/asset/get/id/[id]/openapi.ts create mode 100644 src/v2/routes/asset/get/id/[id]/route.ts create mode 100644 src/v2/routes/asset/get/id/[id]/schema.ts create mode 100644 src/v2/routes/asset/handler.ts delete mode 100644 src/v2/routes/asset/route.ts delete mode 100644 src/v2/routes/asset/search/id/[id]/route.ts diff --git a/src/index.ts b/src/index.ts index ef53a43..9877655 100644 --- a/src/index.ts +++ b/src/index.ts @@ -12,6 +12,15 @@ app.doc("/openapi", { info: { version: "2.0.0", title: "api.wanderer.moe", + description: "Public Zod OpenAPI documentation for wanderer.moe's API.", + license: { + name: "GNU General Public License v3.0", + url: "https://www.gnu.org/licenses/gpl-3.0.en.html", + }, + contact: { + url: "https://wanderer.moe", + name: "wanderer.moe", + }, }, }) diff --git a/src/v2/lib/managers/asset/asset-manager.ts b/src/v2/lib/managers/asset/asset-manager.ts index 1136f9c..c08d296 100644 --- a/src/v2/lib/managers/asset/asset-manager.ts +++ b/src/v2/lib/managers/asset/asset-manager.ts @@ -6,7 +6,7 @@ import { assetTagAsset, game, } from "@/v2/db/schema" -import { eq, or, like, sql, and } from "drizzle-orm" +import { eq, or, like, sql, and, not } from "drizzle-orm" import { R2Bucket } from "@cloudflare/workers-types" import { SplitQueryByCommas } from "../../helpers/split-query-by-commas" import { z } from "zod" @@ -77,10 +77,24 @@ export class AssetManager { */ public async getAssetById(assetId: number): Promise { try { - const [foundAsset] = await this.drizzle - .select() - .from(asset) - .where(eq(asset.id, assetId)) + const foundAsset = await this.drizzle.query.asset.findFirst({ + where: (asset, { eq }) => eq(asset.id, assetId), + with: { + assetTagAsset: { + with: { + assetTag: true, + }, + }, + authUser: { + columns: { + email: false, + emailVerified: false, + }, + }, + game: true, + assetCategory: true, + }, + }) return foundAsset ?? null } catch (e) { @@ -89,6 +103,66 @@ export class AssetManager { } } + /** + * Retrieves a list of assets by their IDs. + * @param assetIds - An array of asset IDs to retrieve. + * @returns A promise that resolves to an array of retrieved assets. + * @throws An error if any of the asset IDs are invalid. + */ + public async getSimilarAssets(assetId: number): Promise { + try { + const [foundAsset] = await this.drizzle + .select({ + id: asset.id, + name: asset.name, + assetCategoryId: asset.assetCategoryId, + gameId: asset.gameId, + }) + .from(asset) + .where(eq(asset.id, assetId)) + + if (!foundAsset) return null + + // this is messy: + // we check if assets exist w/ the same game and category + // if not, we check if assets exist w / the same game but different category + // this means theres a higher chance of similar assets ALWAYS being returned, even if they're not "70%" similar + // who needs machine learning when you can just do this :^) + + // TODO(dromzeh): check if there's a better way to do this, and prioritize assets with similar name, asset category, and game + const similarAssets = await this.drizzle.query.asset.findMany({ + where: (asset, { and, eq }) => + and( + not(eq(asset.id, foundAsset.id)), + or( + and( + eq(asset.gameId, foundAsset.gameId), + eq( + asset.assetCategoryId, + foundAsset.assetCategoryId + ) + ), + and( + eq(asset.gameId, foundAsset.gameId), + not( + eq( + asset.assetCategoryId, + foundAsset.assetCategoryId + ) + ) + ) + ) + ), + limit: 6, + }) + + return similarAssets ?? null + } catch (e) { + console.error(`Error getting similar assets by ID ${assetId}`, e) + throw new Error(`Error getting similar assets by ID ${assetId}`) + } + } + /** * Retrieves a list of all assets. * @returns A promise that resolves to an array of assets. diff --git a/src/v2/routes/asset/get/handler.ts b/src/v2/routes/asset/get/handler.ts new file mode 100644 index 0000000..36be2d7 --- /dev/null +++ b/src/v2/routes/asset/get/handler.ts @@ -0,0 +1,8 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import GetAssetByIDRoute from "@/v2/routes/asset/get/id/[id]/route" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.route("/id", GetAssetByIDRoute) + +export default handler diff --git a/src/v2/routes/asset/get/id/[id]/openapi.ts b/src/v2/routes/asset/get/id/[id]/openapi.ts new file mode 100644 index 0000000..569faa6 --- /dev/null +++ b/src/v2/routes/asset/get/id/[id]/openapi.ts @@ -0,0 +1,19 @@ +import { createRoute } from "@hono/zod-openapi" +import { getAssetByIdSchema } from "./schema" + +export const getAssetByIdRoute = createRoute({ + path: "/{id}", + method: "get", + description: "Get an asset by their ID.", + request: { + params: getAssetByIdSchema, + }, + responses: { + 200: { + description: "The asset was found.", + }, + 500: { + description: "Internal server error.", + }, + }, +}) diff --git a/src/v2/routes/asset/get/id/[id]/route.ts b/src/v2/routes/asset/get/id/[id]/route.ts new file mode 100644 index 0000000..a718438 --- /dev/null +++ b/src/v2/routes/asset/get/id/[id]/route.ts @@ -0,0 +1,47 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { getAssetByIdRoute } from "./openapi" +import { getConnection } from "@/v2/db/turso" +import { AssetManager } from "@/v2/lib/managers/asset/asset-manager" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.openapi(getAssetByIdRoute, async (ctx) => { + const assetId = ctx.req.valid("param").id + + if (isNaN(parseInt(assetId))) { + return ctx.jsonT( + { + success: false, + error: "Invalid asset ID", + }, + 400 + ) + } + + const { drizzle } = await getConnection(ctx.env) + const assetManager = new AssetManager(drizzle) + const asset = await assetManager.getAssetById(parseInt(assetId)) + + if (!asset) { + return ctx.jsonT( + { + success: false, + error: "Asset not found", + }, + 404 + ) + } + + const similarAssets = await assetManager.getSimilarAssets(asset.id) + + return ctx.jsonT( + { + success: true, + asset, + similarAssets, + }, + 200 + ) +}) + +export default handler diff --git a/src/v2/routes/asset/get/id/[id]/schema.ts b/src/v2/routes/asset/get/id/[id]/schema.ts new file mode 100644 index 0000000..20414d8 --- /dev/null +++ b/src/v2/routes/asset/get/id/[id]/schema.ts @@ -0,0 +1,12 @@ +import { z } from "@hono/zod-openapi" + +export const getAssetByIdSchema = z.object({ + id: z.string().openapi({ + param: { + name: "id", + in: "path", + required: true, + }, + description: "The ID of the asset to retrieve.", + }), +}) diff --git a/src/v2/routes/asset/handler.ts b/src/v2/routes/asset/handler.ts new file mode 100644 index 0000000..6c05719 --- /dev/null +++ b/src/v2/routes/asset/handler.ts @@ -0,0 +1,8 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import AssetGetRoute from "@/v2/routes/asset/get/handler" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.route("/get", AssetGetRoute) + +export default handler diff --git a/src/v2/routes/asset/route.ts b/src/v2/routes/asset/route.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/asset/search/id/[id]/route.ts b/src/v2/routes/asset/search/id/[id]/route.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/game/get/id/[id]/route.ts b/src/v2/routes/game/get/id/[id]/route.ts index 8ed8c7c..4a3cd0b 100644 --- a/src/v2/routes/game/get/id/[id]/route.ts +++ b/src/v2/routes/game/get/id/[id]/route.ts @@ -12,9 +12,23 @@ handler.openapi(getGameByIdRoute, async (ctx) => { const gameManager = new GameManager(drizzle) const game = await gameManager.getGameById(id) - return ctx.jsonT({ - game, - }) + if (!game) { + return ctx.jsonT( + { + success: false, + error: "Game not found", + }, + 200 + ) + } + + return ctx.jsonT( + { + success: true, + game, + }, + 200 + ) }) export default handler diff --git a/src/v2/routes/game/get/name/[name]/openapi.ts b/src/v2/routes/game/get/name/[name]/openapi.ts index 1d90b9e..434bc3c 100644 --- a/src/v2/routes/game/get/name/[name]/openapi.ts +++ b/src/v2/routes/game/get/name/[name]/openapi.ts @@ -12,9 +12,6 @@ export const getGameByNameRoute = createRoute({ 200: { description: "Game was found.", }, - 404: { - description: "Game was not found.", - }, 500: { description: "Internal server error.", }, diff --git a/src/v2/routes/game/get/name/[name]/route.ts b/src/v2/routes/game/get/name/[name]/route.ts index eb08b69..9277681 100644 --- a/src/v2/routes/game/get/name/[name]/route.ts +++ b/src/v2/routes/game/get/name/[name]/route.ts @@ -12,9 +12,23 @@ handler.openapi(getGameByNameRoute, async (ctx) => { const gameManager = new GameManager(drizzle) const game = await gameManager.getGameByName(name) - return ctx.jsonT({ - game, - }) + if (!game) { + return ctx.jsonT( + { + success: false, + error: "Game not found", + }, + 200 + ) + } + + return ctx.jsonT( + { + success: true, + game, + }, + 200 + ) }) export default handler diff --git a/src/v2/routes/handler.ts b/src/v2/routes/handler.ts index 532d4ec..dd049c1 100644 --- a/src/v2/routes/handler.ts +++ b/src/v2/routes/handler.ts @@ -1,10 +1,12 @@ import { OpenAPIHono } from "@hono/zod-openapi" import UserRoute from "@/v2/routes/user/handler" import GameRoute from "@/v2/routes/game/handler" +import AssetRoute from "@/v2/routes/asset/handler" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.route("/user", UserRoute) handler.route("/game", GameRoute) +handler.route("/asset", AssetRoute) export default handler diff --git a/src/v2/routes/user/get/id/[id]/openapi.ts b/src/v2/routes/user/get/id/[id]/openapi.ts index 919b34b..9719e21 100644 --- a/src/v2/routes/user/get/id/[id]/openapi.ts +++ b/src/v2/routes/user/get/id/[id]/openapi.ts @@ -12,9 +12,6 @@ export const getUserByIdRoute = createRoute({ 200: { description: "The user was found.", }, - 404: { - description: "The user was not found.", - }, 500: { description: "Internal server error.", }, diff --git a/src/v2/routes/user/get/id/[id]/route.ts b/src/v2/routes/user/get/id/[id]/route.ts index bd4c8d6..a4de614 100644 --- a/src/v2/routes/user/get/id/[id]/route.ts +++ b/src/v2/routes/user/get/id/[id]/route.ts @@ -14,6 +14,7 @@ handler.openapi(getUserByIdRoute, async (ctx) => { return ctx.jsonT( { + success: true, user, }, 200 diff --git a/src/v2/routes/user/get/username/[username]/openapi.ts b/src/v2/routes/user/get/username/[username]/openapi.ts index ad4adf7..92a13cc 100644 --- a/src/v2/routes/user/get/username/[username]/openapi.ts +++ b/src/v2/routes/user/get/username/[username]/openapi.ts @@ -12,9 +12,6 @@ export const getUserByNameRoute = createRoute({ 200: { description: "The user was found.", }, - 404: { - description: "The user was not found.", - }, 500: { description: "Internal server error.", }, diff --git a/src/v2/routes/user/get/username/[username]/route.ts b/src/v2/routes/user/get/username/[username]/route.ts index 62eb0cf..380b84d 100644 --- a/src/v2/routes/user/get/username/[username]/route.ts +++ b/src/v2/routes/user/get/username/[username]/route.ts @@ -12,9 +12,13 @@ handler.openapi(getUserByNameRoute, async (ctx) => { const search = new UserSearchManager(drizzle) const user = await search.getUserByUsername(userId) - return ctx.jsonT({ - user, - }) + return ctx.jsonT( + { + success: true, + user, + }, + 200 + ) }) export default handler diff --git a/src/v2/routes/user/search/username/[username]/openapi.ts b/src/v2/routes/user/search/username/[username]/openapi.ts index 4a4701f..132fbdc 100644 --- a/src/v2/routes/user/search/username/[username]/openapi.ts +++ b/src/v2/routes/user/search/username/[username]/openapi.ts @@ -12,9 +12,6 @@ export const searchUsersByUsernameRoute = createRoute({ 200: { description: "User(s) were found.", }, - 404: { - description: "User(s) were not found.", - }, 500: { description: "Internal server error.", }, diff --git a/src/v2/routes/user/search/username/[username]/route.ts b/src/v2/routes/user/search/username/[username]/route.ts index 64b7e0a..b18f6bd 100644 --- a/src/v2/routes/user/search/username/[username]/route.ts +++ b/src/v2/routes/user/search/username/[username]/route.ts @@ -13,6 +13,7 @@ handler.openapi(searchUsersByUsernameRoute, async (ctx) => { const users = await search.getUsersByUsername(userQuery) return ctx.jsonT({ + success: true, users, }) }) From 417be9249ea526baeaab06c24b756326dd2673ac Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Mon, 20 Nov 2023 01:33:26 +0000 Subject: [PATCH 161/318] i am going to kill typescript --- package.json | 1 + src/index.ts | 8 +- src/swagger/theme/dark/SwaggerDark.css | 1780 +++++++++++++++++++ src/v2/db/turso.ts | 41 +- src/v2/lib/managers/asset/asset-manager.ts | 39 +- src/v2/lib/managers/tag/tag-manager.ts | 4 - src/v2/routes/asset/get/id/[id]/route.ts | 4 +- src/v2/routes/game/get/name/[name]/route.ts | 2 +- 8 files changed, 1833 insertions(+), 46 deletions(-) create mode 100644 src/swagger/theme/dark/SwaggerDark.css diff --git a/package.json b/package.json index b5966c7..861d825 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,7 @@ "name": "api", "version": "1.1.0b", "scripts": { + "dev": "wrangler dev", "wrangler:dev:local": "wrangler dev", "wrangler:dev:remote": "wrangler dev --remote", "wrangler:publish": "wrangler publish --minify", diff --git a/src/index.ts b/src/index.ts index 9877655..b5bcaa2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -24,6 +24,7 @@ app.doc("/openapi", { }, }) +// TODO(dromzeh): Serve static css content from API, inject into swaggerUI app.get( "/docs", swaggerUI({ @@ -31,13 +32,6 @@ app.get( }) ) -app.use("*", async (ctx, next) => { - const start = Date.now() - await next() - const ms = Date.now() - start - ctx.res.headers.set("X-Response-Time", `${ms}ms`) -}) - app.use("*", prettyJSON()) export default app diff --git a/src/swagger/theme/dark/SwaggerDark.css b/src/swagger/theme/dark/SwaggerDark.css new file mode 100644 index 0000000..f43f1d7 --- /dev/null +++ b/src/swagger/theme/dark/SwaggerDark.css @@ -0,0 +1,1780 @@ +@media only screen and (prefers-color-scheme: dark) { + a { + color: #8c8cfa; + } + + ::-webkit-scrollbar-track-piece { + background-color: rgba(255, 255, 255, 0.2) !important; + } + + ::-webkit-scrollbar-track { + background-color: rgba(255, 255, 255, 0.3) !important; + } + + ::-webkit-scrollbar-thumb { + background-color: rgba(255, 255, 255, 0.5) !important; + } + + embed[type="application/pdf"] { + filter: invert(90%); + } + + html { + background: #1f1f1f !important; + box-sizing: border-box; + filter: contrast(100%) brightness(100%) saturate(100%); + overflow-y: scroll; + } + + body { + background: #1f1f1f; + background-color: #1f1f1f; + background-image: none !important; + } + + button, + input, + select, + textarea { + background-color: #1f1f1f; + color: #bfbfbf; + } + + font, + html { + color: #bfbfbf; + } + + .swagger-ui, + .swagger-ui section h3 { + color: #b5bac9; + } + + .swagger-ui a { + background-color: transparent; + } + + .swagger-ui mark { + background-color: #664b00; + color: #bfbfbf; + } + + .swagger-ui legend { + color: inherit; + } + + .swagger-ui .debug * { + outline: #e6da99 solid 1px; + } + + .swagger-ui .debug-white * { + outline: #fff solid 1px; + } + + .swagger-ui .debug-black * { + outline: #bfbfbf solid 1px; + } + + .swagger-ui .debug-grid { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTRDOTY4N0U2N0VFMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTRDOTY4N0Q2N0VFMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3NjY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3NzY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsBS+GMAAAAjSURBVHjaYvz//z8DLsD4gcGXiYEAGBIKGBne//fFpwAgwAB98AaF2pjlUQAAAABJRU5ErkJggg==) + 0 0; + } + + .swagger-ui .debug-grid-16 { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODYyRjhERDU2N0YyMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODYyRjhERDQ2N0YyMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3QTY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3QjY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvCS01IAAABMSURBVHjaYmR4/5+BFPBfAMFm/MBgx8RAGWCn1AAmSg34Q6kBDKMGMDCwICeMIemF/5QawEipAWwUhwEjMDvbAWlWkvVBwu8vQIABAEwBCph8U6c0AAAAAElFTkSuQmCC) + 0 0; + } + + .swagger-ui .debug-grid-8-solid { + background: url(data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAAAAD/4QMxaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjYtYzExMSA3OS4xNTgzMjUsIDIwMTUvMDkvMTAtMDE6MTA6MjAgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkIxMjI0OTczNjdCMzExRTZCMkJDRTI0MDgxMDAyMTcxIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkIxMjI0OTc0NjdCMzExRTZCMkJDRTI0MDgxMDAyMTcxIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QjEyMjQ5NzE2N0IzMTFFNkIyQkNFMjQwODEwMDIxNzEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QjEyMjQ5NzI2N0IzMTFFNkIyQkNFMjQwODEwMDIxNzEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7/7gAOQWRvYmUAZMAAAAAB/9sAhAAbGhopHSlBJiZBQi8vL0JHPz4+P0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHAR0pKTQmND8oKD9HPzU/R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0f/wAARCAAIAAgDASIAAhEBAxEB/8QAWQABAQAAAAAAAAAAAAAAAAAAAAYBAQEAAAAAAAAAAAAAAAAAAAIEEAEBAAMBAAAAAAAAAAAAAAABADECA0ERAAEDBQAAAAAAAAAAAAAAAAARITFBUWESIv/aAAwDAQACEQMRAD8AoOnTV1QTD7JJshP3vSM3P//Z) + 0 0 #1c1c21; + } + + .swagger-ui .debug-grid-16-solid { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzY3MkJEN0U2N0M1MTFFNkIyQkNFMjQwODEwMDIxNzEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzY3MkJEN0Y2N0M1MTFFNkIyQkNFMjQwODEwMDIxNzEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3QzY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3RDY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pve6J3kAAAAzSURBVHjaYvz//z8D0UDsMwMjSRoYP5Gq4SPNbRjVMEQ1fCRDg+in/6+J1AJUxsgAEGAA31BAJMS0GYEAAAAASUVORK5CYII=) + 0 0 #1c1c21; + } + + .swagger-ui .b--black { + border-color: #000; + } + + .swagger-ui .b--near-black { + border-color: #121212; + } + + .swagger-ui .b--dark-gray { + border-color: #333; + } + + .swagger-ui .b--mid-gray { + border-color: #545454; + } + + .swagger-ui .b--gray { + border-color: #787878; + } + + .swagger-ui .b--silver { + border-color: #999; + } + + .swagger-ui .b--light-silver { + border-color: #6e6e6e; + } + + .swagger-ui .b--moon-gray { + border-color: #4d4d4d; + } + + .swagger-ui .b--light-gray { + border-color: #2b2b2b; + } + + .swagger-ui .b--near-white { + border-color: #242424; + } + + .swagger-ui .b--white { + border-color: #1c1c21; + } + + .swagger-ui .b--white-90 { + border-color: rgba(28, 28, 33, 0.9); + } + + .swagger-ui .b--white-80 { + border-color: rgba(28, 28, 33, 0.8); + } + + .swagger-ui .b--white-70 { + border-color: rgba(28, 28, 33, 0.7); + } + + .swagger-ui .b--white-60 { + border-color: rgba(28, 28, 33, 0.6); + } + + .swagger-ui .b--white-50 { + border-color: rgba(28, 28, 33, 0.5); + } + + .swagger-ui .b--white-40 { + border-color: rgba(28, 28, 33, 0.4); + } + + .swagger-ui .b--white-30 { + border-color: rgba(28, 28, 33, 0.3); + } + + .swagger-ui .b--white-20 { + border-color: rgba(28, 28, 33, 0.2); + } + + .swagger-ui .b--white-10 { + border-color: rgba(28, 28, 33, 0.1); + } + + .swagger-ui .b--white-05 { + border-color: rgba(28, 28, 33, 0.05); + } + + .swagger-ui .b--white-025 { + border-color: rgba(28, 28, 33, 0.024); + } + + .swagger-ui .b--white-0125 { + border-color: rgba(28, 28, 33, 0.01); + } + + .swagger-ui .b--black-90 { + border-color: rgba(0, 0, 0, 0.9); + } + + .swagger-ui .b--black-80 { + border-color: rgba(0, 0, 0, 0.8); + } + + .swagger-ui .b--black-70 { + border-color: rgba(0, 0, 0, 0.7); + } + + .swagger-ui .b--black-60 { + border-color: rgba(0, 0, 0, 0.6); + } + + .swagger-ui .b--black-50 { + border-color: rgba(0, 0, 0, 0.5); + } + + .swagger-ui .b--black-40 { + border-color: rgba(0, 0, 0, 0.4); + } + + .swagger-ui .b--black-30 { + border-color: rgba(0, 0, 0, 0.3); + } + + .swagger-ui .b--black-20 { + border-color: rgba(0, 0, 0, 0.2); + } + + .swagger-ui .b--black-10 { + border-color: rgba(0, 0, 0, 0.1); + } + + .swagger-ui .b--black-05 { + border-color: rgba(0, 0, 0, 0.05); + } + + .swagger-ui .b--black-025 { + border-color: rgba(0, 0, 0, 0.024); + } + + .swagger-ui .b--black-0125 { + border-color: rgba(0, 0, 0, 0.01); + } + + .swagger-ui .b--dark-red { + border-color: #bc2f36; + } + + .swagger-ui .b--red { + border-color: #c83932; + } + + .swagger-ui .b--light-red { + border-color: #ab3c2b; + } + + .swagger-ui .b--orange { + border-color: #cc6e33; + } + + .swagger-ui .b--purple { + border-color: #5e2ca5; + } + + .swagger-ui .b--light-purple { + border-color: #672caf; + } + + .swagger-ui .b--dark-pink { + border-color: #ab2b81; + } + + .swagger-ui .b--hot-pink { + border-color: #c03086; + } + + .swagger-ui .b--pink { + border-color: #8f2464; + } + + .swagger-ui .b--light-pink { + border-color: #721d4d; + } + + .swagger-ui .b--dark-green { + border-color: #1c6e50; + } + + .swagger-ui .b--green { + border-color: #279b70; + } + + .swagger-ui .b--light-green { + border-color: #228762; + } + + .swagger-ui .b--navy { + border-color: #0d1d35; + } + + .swagger-ui .b--dark-blue { + border-color: #20497e; + } + + .swagger-ui .b--blue { + border-color: #4380d0; + } + + .swagger-ui .b--light-blue { + border-color: #20517e; + } + + .swagger-ui .b--lightest-blue { + border-color: #143a52; + } + + .swagger-ui .b--washed-blue { + border-color: #0c312d; + } + + .swagger-ui .b--washed-green { + border-color: #0f3d2c; + } + + .swagger-ui .b--washed-red { + border-color: #411010; + } + + .swagger-ui .b--transparent { + border-color: transparent; + } + + .swagger-ui .b--gold, + .swagger-ui .b--light-yellow, + .swagger-ui .b--washed-yellow, + .swagger-ui .b--yellow { + border-color: #664b00; + } + + .swagger-ui .shadow-1 { + box-shadow: rgba(0, 0, 0, 0.2) 0 0 4px 2px; + } + + .swagger-ui .shadow-2 { + box-shadow: rgba(0, 0, 0, 0.2) 0 0 8px 2px; + } + + .swagger-ui .shadow-3 { + box-shadow: rgba(0, 0, 0, 0.2) 2px 2px 4px 2px; + } + + .swagger-ui .shadow-4 { + box-shadow: rgba(0, 0, 0, 0.2) 2px 2px 8px 0; + } + + .swagger-ui .shadow-5 { + box-shadow: rgba(0, 0, 0, 0.2) 4px 4px 8px 0; + } + + @media screen and (min-width: 30em) { + .swagger-ui .shadow-1-ns { + box-shadow: rgba(0, 0, 0, 0.2) 0 0 4px 2px; + } + + .swagger-ui .shadow-2-ns { + box-shadow: rgba(0, 0, 0, 0.2) 0 0 8px 2px; + } + + .swagger-ui .shadow-3-ns { + box-shadow: rgba(0, 0, 0, 0.2) 2px 2px 4px 2px; + } + + .swagger-ui .shadow-4-ns { + box-shadow: rgba(0, 0, 0, 0.2) 2px 2px 8px 0; + } + + .swagger-ui .shadow-5-ns { + box-shadow: rgba(0, 0, 0, 0.2) 4px 4px 8px 0; + } + } + + @media screen and (max-width: 60em) and (min-width: 30em) { + .swagger-ui .shadow-1-m { + box-shadow: rgba(0, 0, 0, 0.2) 0 0 4px 2px; + } + + .swagger-ui .shadow-2-m { + box-shadow: rgba(0, 0, 0, 0.2) 0 0 8px 2px; + } + + .swagger-ui .shadow-3-m { + box-shadow: rgba(0, 0, 0, 0.2) 2px 2px 4px 2px; + } + + .swagger-ui .shadow-4-m { + box-shadow: rgba(0, 0, 0, 0.2) 2px 2px 8px 0; + } + + .swagger-ui .shadow-5-m { + box-shadow: rgba(0, 0, 0, 0.2) 4px 4px 8px 0; + } + } + + @media screen and (min-width: 60em) { + .swagger-ui .shadow-1-l { + box-shadow: rgba(0, 0, 0, 0.2) 0 0 4px 2px; + } + + .swagger-ui .shadow-2-l { + box-shadow: rgba(0, 0, 0, 0.2) 0 0 8px 2px; + } + + .swagger-ui .shadow-3-l { + box-shadow: rgba(0, 0, 0, 0.2) 2px 2px 4px 2px; + } + + .swagger-ui .shadow-4-l { + box-shadow: rgba(0, 0, 0, 0.2) 2px 2px 8px 0; + } + + .swagger-ui .shadow-5-l { + box-shadow: rgba(0, 0, 0, 0.2) 4px 4px 8px 0; + } + } + + .swagger-ui .black-05 { + color: rgba(191, 191, 191, 0.05); + } + + .swagger-ui .bg-black-05 { + background-color: rgba(0, 0, 0, 0.05); + } + + .swagger-ui .black-90, + .swagger-ui .hover-black-90:focus, + .swagger-ui .hover-black-90:hover { + color: rgba(191, 191, 191, 0.9); + } + + .swagger-ui .black-80, + .swagger-ui .hover-black-80:focus, + .swagger-ui .hover-black-80:hover { + color: rgba(191, 191, 191, 0.8); + } + + .swagger-ui .black-70, + .swagger-ui .hover-black-70:focus, + .swagger-ui .hover-black-70:hover { + color: rgba(191, 191, 191, 0.7); + } + + .swagger-ui .black-60, + .swagger-ui .hover-black-60:focus, + .swagger-ui .hover-black-60:hover { + color: rgba(191, 191, 191, 0.6); + } + + .swagger-ui .black-50, + .swagger-ui .hover-black-50:focus, + .swagger-ui .hover-black-50:hover { + color: rgba(191, 191, 191, 0.5); + } + + .swagger-ui .black-40, + .swagger-ui .hover-black-40:focus, + .swagger-ui .hover-black-40:hover { + color: rgba(191, 191, 191, 0.4); + } + + .swagger-ui .black-30, + .swagger-ui .hover-black-30:focus, + .swagger-ui .hover-black-30:hover { + color: rgba(191, 191, 191, 0.3); + } + + .swagger-ui .black-20, + .swagger-ui .hover-black-20:focus, + .swagger-ui .hover-black-20:hover { + color: rgba(191, 191, 191, 0.2); + } + + .swagger-ui .black-10, + .swagger-ui .hover-black-10:focus, + .swagger-ui .hover-black-10:hover { + color: rgba(191, 191, 191, 0.1); + } + + .swagger-ui .hover-white-90:focus, + .swagger-ui .hover-white-90:hover, + .swagger-ui .white-90 { + color: rgba(255, 255, 255, 0.9); + } + + .swagger-ui .hover-white-80:focus, + .swagger-ui .hover-white-80:hover, + .swagger-ui .white-80 { + color: rgba(255, 255, 255, 0.8); + } + + .swagger-ui .hover-white-70:focus, + .swagger-ui .hover-white-70:hover, + .swagger-ui .white-70 { + color: rgba(255, 255, 255, 0.7); + } + + .swagger-ui .hover-white-60:focus, + .swagger-ui .hover-white-60:hover, + .swagger-ui .white-60 { + color: rgba(255, 255, 255, 0.6); + } + + .swagger-ui .hover-white-50:focus, + .swagger-ui .hover-white-50:hover, + .swagger-ui .white-50 { + color: rgba(255, 255, 255, 0.5); + } + + .swagger-ui .hover-white-40:focus, + .swagger-ui .hover-white-40:hover, + .swagger-ui .white-40 { + color: rgba(255, 255, 255, 0.4); + } + + .swagger-ui .hover-white-30:focus, + .swagger-ui .hover-white-30:hover, + .swagger-ui .white-30 { + color: rgba(255, 255, 255, 0.3); + } + + .swagger-ui .hover-white-20:focus, + .swagger-ui .hover-white-20:hover, + .swagger-ui .white-20 { + color: rgba(255, 255, 255, 0.2); + } + + .swagger-ui .hover-white-10:focus, + .swagger-ui .hover-white-10:hover, + .swagger-ui .white-10 { + color: rgba(255, 255, 255, 0.1); + } + + .swagger-ui .hover-moon-gray:focus, + .swagger-ui .hover-moon-gray:hover, + .swagger-ui .moon-gray { + color: #ccc; + } + + .swagger-ui .hover-light-gray:focus, + .swagger-ui .hover-light-gray:hover, + .swagger-ui .light-gray { + color: #ededed; + } + + .swagger-ui .hover-near-white:focus, + .swagger-ui .hover-near-white:hover, + .swagger-ui .near-white { + color: #f5f5f5; + } + + .swagger-ui .dark-red, + .swagger-ui .hover-dark-red:focus, + .swagger-ui .hover-dark-red:hover { + color: #e6999d; + } + + .swagger-ui .hover-red:focus, + .swagger-ui .hover-red:hover, + .swagger-ui .red { + color: #e69d99; + } + + .swagger-ui .hover-light-red:focus, + .swagger-ui .hover-light-red:hover, + .swagger-ui .light-red { + color: #e6a399; + } + + .swagger-ui .hover-orange:focus, + .swagger-ui .hover-orange:hover, + .swagger-ui .orange { + color: #e6b699; + } + + .swagger-ui .gold, + .swagger-ui .hover-gold:focus, + .swagger-ui .hover-gold:hover { + color: #e6d099; + } + + .swagger-ui .hover-yellow:focus, + .swagger-ui .hover-yellow:hover, + .swagger-ui .yellow { + color: #e6da99; + } + + .swagger-ui .hover-light-yellow:focus, + .swagger-ui .hover-light-yellow:hover, + .swagger-ui .light-yellow { + color: #ede6b6; + } + + .swagger-ui .hover-purple:focus, + .swagger-ui .hover-purple:hover, + .swagger-ui .purple { + color: #b99ae4; + } + + .swagger-ui .hover-light-purple:focus, + .swagger-ui .hover-light-purple:hover, + .swagger-ui .light-purple { + color: #bb99e6; + } + + .swagger-ui .dark-pink, + .swagger-ui .hover-dark-pink:focus, + .swagger-ui .hover-dark-pink:hover { + color: #e699cc; + } + + .swagger-ui .hot-pink, + .swagger-ui .hover-hot-pink:focus, + .swagger-ui .hover-hot-pink:hover, + .swagger-ui .hover-pink:focus, + .swagger-ui .hover-pink:hover, + .swagger-ui .pink { + color: #e699c7; + } + + .swagger-ui .hover-light-pink:focus, + .swagger-ui .hover-light-pink:hover, + .swagger-ui .light-pink { + color: #edb6d5; + } + + .swagger-ui .dark-green, + .swagger-ui .green, + .swagger-ui .hover-dark-green:focus, + .swagger-ui .hover-dark-green:hover, + .swagger-ui .hover-green:focus, + .swagger-ui .hover-green:hover { + color: #99e6c9; + } + + .swagger-ui .hover-light-green:focus, + .swagger-ui .hover-light-green:hover, + .swagger-ui .light-green { + color: #a1e8ce; + } + + .swagger-ui .hover-navy:focus, + .swagger-ui .hover-navy:hover, + .swagger-ui .navy { + color: #99b8e6; + } + + .swagger-ui .blue, + .swagger-ui .dark-blue, + .swagger-ui .hover-blue:focus, + .swagger-ui .hover-blue:hover, + .swagger-ui .hover-dark-blue:focus, + .swagger-ui .hover-dark-blue:hover { + color: #99bae6; + } + + .swagger-ui .hover-light-blue:focus, + .swagger-ui .hover-light-blue:hover, + .swagger-ui .light-blue { + color: #a9cbea; + } + + .swagger-ui .hover-lightest-blue:focus, + .swagger-ui .hover-lightest-blue:hover, + .swagger-ui .lightest-blue { + color: #d6e9f5; + } + + .swagger-ui .hover-washed-blue:focus, + .swagger-ui .hover-washed-blue:hover, + .swagger-ui .washed-blue { + color: #f7fdfc; + } + + .swagger-ui .hover-washed-green:focus, + .swagger-ui .hover-washed-green:hover, + .swagger-ui .washed-green { + color: #ebfaf4; + } + + .swagger-ui .hover-washed-yellow:focus, + .swagger-ui .hover-washed-yellow:hover, + .swagger-ui .washed-yellow { + color: #fbf9ef; + } + + .swagger-ui .hover-washed-red:focus, + .swagger-ui .hover-washed-red:hover, + .swagger-ui .washed-red { + color: #f9e7e7; + } + + .swagger-ui .color-inherit, + .swagger-ui .hover-inherit:focus, + .swagger-ui .hover-inherit:hover { + color: inherit; + } + + .swagger-ui .bg-black-90, + .swagger-ui .hover-bg-black-90:focus, + .swagger-ui .hover-bg-black-90:hover { + background-color: rgba(0, 0, 0, 0.9); + } + + .swagger-ui .bg-black-80, + .swagger-ui .hover-bg-black-80:focus, + .swagger-ui .hover-bg-black-80:hover { + background-color: rgba(0, 0, 0, 0.8); + } + + .swagger-ui .bg-black-70, + .swagger-ui .hover-bg-black-70:focus, + .swagger-ui .hover-bg-black-70:hover { + background-color: rgba(0, 0, 0, 0.7); + } + + .swagger-ui .bg-black-60, + .swagger-ui .hover-bg-black-60:focus, + .swagger-ui .hover-bg-black-60:hover { + background-color: rgba(0, 0, 0, 0.6); + } + + .swagger-ui .bg-black-50, + .swagger-ui .hover-bg-black-50:focus, + .swagger-ui .hover-bg-black-50:hover { + background-color: rgba(0, 0, 0, 0.5); + } + + .swagger-ui .bg-black-40, + .swagger-ui .hover-bg-black-40:focus, + .swagger-ui .hover-bg-black-40:hover { + background-color: rgba(0, 0, 0, 0.4); + } + + .swagger-ui .bg-black-30, + .swagger-ui .hover-bg-black-30:focus, + .swagger-ui .hover-bg-black-30:hover { + background-color: rgba(0, 0, 0, 0.3); + } + + .swagger-ui .bg-black-20, + .swagger-ui .hover-bg-black-20:focus, + .swagger-ui .hover-bg-black-20:hover { + background-color: rgba(0, 0, 0, 0.2); + } + + .swagger-ui .bg-white-90, + .swagger-ui .hover-bg-white-90:focus, + .swagger-ui .hover-bg-white-90:hover { + background-color: rgba(28, 28, 33, 0.9); + } + + .swagger-ui .bg-white-80, + .swagger-ui .hover-bg-white-80:focus, + .swagger-ui .hover-bg-white-80:hover { + background-color: rgba(28, 28, 33, 0.8); + } + + .swagger-ui .bg-white-70, + .swagger-ui .hover-bg-white-70:focus, + .swagger-ui .hover-bg-white-70:hover { + background-color: rgba(28, 28, 33, 0.7); + } + + .swagger-ui .bg-white-60, + .swagger-ui .hover-bg-white-60:focus, + .swagger-ui .hover-bg-white-60:hover { + background-color: rgba(28, 28, 33, 0.6); + } + + .swagger-ui .bg-white-50, + .swagger-ui .hover-bg-white-50:focus, + .swagger-ui .hover-bg-white-50:hover { + background-color: rgba(28, 28, 33, 0.5); + } + + .swagger-ui .bg-white-40, + .swagger-ui .hover-bg-white-40:focus, + .swagger-ui .hover-bg-white-40:hover { + background-color: rgba(28, 28, 33, 0.4); + } + + .swagger-ui .bg-white-30, + .swagger-ui .hover-bg-white-30:focus, + .swagger-ui .hover-bg-white-30:hover { + background-color: rgba(28, 28, 33, 0.3); + } + + .swagger-ui .bg-white-20, + .swagger-ui .hover-bg-white-20:focus, + .swagger-ui .hover-bg-white-20:hover { + background-color: rgba(28, 28, 33, 0.2); + } + + .swagger-ui .bg-black, + .swagger-ui .hover-bg-black:focus, + .swagger-ui .hover-bg-black:hover { + background-color: #000; + } + + .swagger-ui .bg-near-black, + .swagger-ui .hover-bg-near-black:focus, + .swagger-ui .hover-bg-near-black:hover { + background-color: #121212; + } + + .swagger-ui .bg-dark-gray, + .swagger-ui .hover-bg-dark-gray:focus, + .swagger-ui .hover-bg-dark-gray:hover { + background-color: #333; + } + + .swagger-ui .bg-mid-gray, + .swagger-ui .hover-bg-mid-gray:focus, + .swagger-ui .hover-bg-mid-gray:hover { + background-color: #545454; + } + + .swagger-ui .bg-gray, + .swagger-ui .hover-bg-gray:focus, + .swagger-ui .hover-bg-gray:hover { + background-color: #787878; + } + + .swagger-ui .bg-silver, + .swagger-ui .hover-bg-silver:focus, + .swagger-ui .hover-bg-silver:hover { + background-color: #999; + } + + .swagger-ui .bg-white, + .swagger-ui .hover-bg-white:focus, + .swagger-ui .hover-bg-white:hover { + background-color: #1c1c21; + } + + .swagger-ui .bg-transparent, + .swagger-ui .hover-bg-transparent:focus, + .swagger-ui .hover-bg-transparent:hover { + background-color: transparent; + } + + .swagger-ui .bg-dark-red, + .swagger-ui .hover-bg-dark-red:focus, + .swagger-ui .hover-bg-dark-red:hover { + background-color: #bc2f36; + } + + .swagger-ui .bg-red, + .swagger-ui .hover-bg-red:focus, + .swagger-ui .hover-bg-red:hover { + background-color: #c83932; + } + + .swagger-ui .bg-light-red, + .swagger-ui .hover-bg-light-red:focus, + .swagger-ui .hover-bg-light-red:hover { + background-color: #ab3c2b; + } + + .swagger-ui .bg-orange, + .swagger-ui .hover-bg-orange:focus, + .swagger-ui .hover-bg-orange:hover { + background-color: #cc6e33; + } + + .swagger-ui .bg-gold, + .swagger-ui .bg-light-yellow, + .swagger-ui .bg-washed-yellow, + .swagger-ui .bg-yellow, + .swagger-ui .hover-bg-gold:focus, + .swagger-ui .hover-bg-gold:hover, + .swagger-ui .hover-bg-light-yellow:focus, + .swagger-ui .hover-bg-light-yellow:hover, + .swagger-ui .hover-bg-washed-yellow:focus, + .swagger-ui .hover-bg-washed-yellow:hover, + .swagger-ui .hover-bg-yellow:focus, + .swagger-ui .hover-bg-yellow:hover { + background-color: #664b00; + } + + .swagger-ui .bg-purple, + .swagger-ui .hover-bg-purple:focus, + .swagger-ui .hover-bg-purple:hover { + background-color: #5e2ca5; + } + + .swagger-ui .bg-light-purple, + .swagger-ui .hover-bg-light-purple:focus, + .swagger-ui .hover-bg-light-purple:hover { + background-color: #672caf; + } + + .swagger-ui .bg-dark-pink, + .swagger-ui .hover-bg-dark-pink:focus, + .swagger-ui .hover-bg-dark-pink:hover { + background-color: #ab2b81; + } + + .swagger-ui .bg-hot-pink, + .swagger-ui .hover-bg-hot-pink:focus, + .swagger-ui .hover-bg-hot-pink:hover { + background-color: #c03086; + } + + .swagger-ui .bg-pink, + .swagger-ui .hover-bg-pink:focus, + .swagger-ui .hover-bg-pink:hover { + background-color: #8f2464; + } + + .swagger-ui .bg-light-pink, + .swagger-ui .hover-bg-light-pink:focus, + .swagger-ui .hover-bg-light-pink:hover { + background-color: #721d4d; + } + + .swagger-ui .bg-dark-green, + .swagger-ui .hover-bg-dark-green:focus, + .swagger-ui .hover-bg-dark-green:hover { + background-color: #1c6e50; + } + + .swagger-ui .bg-green, + .swagger-ui .hover-bg-green:focus, + .swagger-ui .hover-bg-green:hover { + background-color: #279b70; + } + + .swagger-ui .bg-light-green, + .swagger-ui .hover-bg-light-green:focus, + .swagger-ui .hover-bg-light-green:hover { + background-color: #228762; + } + + .swagger-ui .bg-navy, + .swagger-ui .hover-bg-navy:focus, + .swagger-ui .hover-bg-navy:hover { + background-color: #0d1d35; + } + + .swagger-ui .bg-dark-blue, + .swagger-ui .hover-bg-dark-blue:focus, + .swagger-ui .hover-bg-dark-blue:hover { + background-color: #20497e; + } + + .swagger-ui .bg-blue, + .swagger-ui .hover-bg-blue:focus, + .swagger-ui .hover-bg-blue:hover { + background-color: #4380d0; + } + + .swagger-ui .bg-light-blue, + .swagger-ui .hover-bg-light-blue:focus, + .swagger-ui .hover-bg-light-blue:hover { + background-color: #20517e; + } + + .swagger-ui .bg-lightest-blue, + .swagger-ui .hover-bg-lightest-blue:focus, + .swagger-ui .hover-bg-lightest-blue:hover { + background-color: #143a52; + } + + .swagger-ui .bg-washed-blue, + .swagger-ui .hover-bg-washed-blue:focus, + .swagger-ui .hover-bg-washed-blue:hover { + background-color: #0c312d; + } + + .swagger-ui .bg-washed-green, + .swagger-ui .hover-bg-washed-green:focus, + .swagger-ui .hover-bg-washed-green:hover { + background-color: #0f3d2c; + } + + .swagger-ui .bg-washed-red, + .swagger-ui .hover-bg-washed-red:focus, + .swagger-ui .hover-bg-washed-red:hover { + background-color: #411010; + } + + .swagger-ui .bg-inherit, + .swagger-ui .hover-bg-inherit:focus, + .swagger-ui .hover-bg-inherit:hover { + background-color: inherit; + } + + .swagger-ui .shadow-hover { + transition: all 0.5s cubic-bezier(0.165, 0.84, 0.44, 1) 0s; + } + + .swagger-ui .shadow-hover::after { + border-radius: inherit; + box-shadow: rgba(0, 0, 0, 0.2) 0 0 16px 2px; + content: ""; + height: 100%; + left: 0; + opacity: 0; + position: absolute; + top: 0; + transition: opacity 0.5s cubic-bezier(0.165, 0.84, 0.44, 1) 0s; + width: 100%; + z-index: -1; + } + + .swagger-ui .bg-animate, + .swagger-ui .bg-animate:focus, + .swagger-ui .bg-animate:hover { + transition: background-color 0.15s ease-in-out 0s; + } + + .swagger-ui .nested-links a { + color: #99bae6; + transition: color 0.15s ease-in 0s; + } + + .swagger-ui .nested-links a:focus, + .swagger-ui .nested-links a:hover { + color: #a9cbea; + transition: color 0.15s ease-in 0s; + } + + .swagger-ui .opblock-tag { + border-bottom: 1px solid rgba(58, 64, 80, 0.3); + color: #b5bac9; + transition: all 0.2s ease 0s; + } + + .swagger-ui .opblock-tag svg, + .swagger-ui section.models h4 svg { + transition: all 0.4s ease 0s; + } + + .swagger-ui .opblock { + border: 1px solid #000; + border-radius: 4px; + box-shadow: rgba(0, 0, 0, 0.19) 0 0 3px; + margin: 0 0 15px; + } + + .swagger-ui .opblock .tab-header .tab-item.active h4 span::after { + background: gray; + } + + .swagger-ui .opblock.is-open .opblock-summary { + border-bottom: 1px solid #000; + } + + .swagger-ui .opblock .opblock-section-header { + background: rgba(28, 28, 33, 0.8); + box-shadow: rgba(0, 0, 0, 0.1) 0 1px 2px; + } + + .swagger-ui .opblock .opblock-section-header > label > span { + padding: 0 10px 0 0; + } + + .swagger-ui .opblock .opblock-summary-method { + background: #000; + color: #fff; + text-shadow: rgba(0, 0, 0, 0.1) 0 1px 0; + } + + .swagger-ui .opblock.opblock-post { + background: rgba(72, 203, 144, 0.1); + border-color: #48cb90; + } + + .swagger-ui .opblock.opblock-post .opblock-summary-method, + .swagger-ui + .opblock.opblock-post + .tab-header + .tab-item.active + h4 + span::after { + background: #48cb90; + } + + .swagger-ui .opblock.opblock-post .opblock-summary { + border-color: #48cb90; + } + + .swagger-ui .opblock.opblock-put { + background: rgba(213, 157, 88, 0.1); + border-color: #d59d58; + } + + .swagger-ui .opblock.opblock-put .opblock-summary-method, + .swagger-ui + .opblock.opblock-put + .tab-header + .tab-item.active + h4 + span::after { + background: #d59d58; + } + + .swagger-ui .opblock.opblock-put .opblock-summary { + border-color: #d59d58; + } + + .swagger-ui .opblock.opblock-delete { + background: rgba(200, 50, 50, 0.1); + border-color: #c83232; + } + + .swagger-ui .opblock.opblock-delete .opblock-summary-method, + .swagger-ui + .opblock.opblock-delete + .tab-header + .tab-item.active + h4 + span::after { + background: #c83232; + } + + .swagger-ui .opblock.opblock-delete .opblock-summary { + border-color: #c83232; + } + + .swagger-ui .opblock.opblock-get { + background: rgba(42, 105, 167, 0.1); + border-color: #2a69a7; + } + + .swagger-ui .opblock.opblock-get .opblock-summary-method, + .swagger-ui + .opblock.opblock-get + .tab-header + .tab-item.active + h4 + span::after { + background: #2a69a7; + } + + .swagger-ui .opblock.opblock-get .opblock-summary { + border-color: #2a69a7; + } + + .swagger-ui .opblock.opblock-patch { + background: rgba(92, 214, 188, 0.1); + border-color: #5cd6bc; + } + + .swagger-ui .opblock.opblock-patch .opblock-summary-method, + .swagger-ui + .opblock.opblock-patch + .tab-header + .tab-item.active + h4 + span::after { + background: #5cd6bc; + } + + .swagger-ui .opblock.opblock-patch .opblock-summary { + border-color: #5cd6bc; + } + + .swagger-ui .opblock.opblock-head { + background: rgba(140, 63, 207, 0.1); + border-color: #8c3fcf; + } + + .swagger-ui .opblock.opblock-head .opblock-summary-method, + .swagger-ui + .opblock.opblock-head + .tab-header + .tab-item.active + h4 + span::after { + background: #8c3fcf; + } + + .swagger-ui .opblock.opblock-head .opblock-summary { + border-color: #8c3fcf; + } + + .swagger-ui .opblock.opblock-options { + background: rgba(36, 89, 143, 0.1); + border-color: #24598f; + } + + .swagger-ui .opblock.opblock-options .opblock-summary-method, + .swagger-ui + .opblock.opblock-options + .tab-header + .tab-item.active + h4 + span::after { + background: #24598f; + } + + .swagger-ui .opblock.opblock-options .opblock-summary { + border-color: #24598f; + } + + .swagger-ui .opblock.opblock-deprecated { + background: rgba(46, 46, 46, 0.1); + border-color: #2e2e2e; + opacity: 0.6; + } + + .swagger-ui .opblock.opblock-deprecated .opblock-summary-method, + .swagger-ui + .opblock.opblock-deprecated + .tab-header + .tab-item.active + h4 + span::after { + background: #2e2e2e; + } + + .swagger-ui .opblock.opblock-deprecated .opblock-summary { + border-color: #2e2e2e; + } + + .swagger-ui .filter .operation-filter-input { + border: 2px solid #2b3446; + } + + .swagger-ui .tab li:first-of-type::after { + background: rgba(0, 0, 0, 0.2); + } + + .swagger-ui .download-contents { + background: #7c8192; + color: #fff; + } + + .swagger-ui .scheme-container { + background: #1c1c21; + box-shadow: rgba(0, 0, 0, 0.15) 0 1px 2px 0; + } + + .swagger-ui .loading-container .loading::before { + animation: + 1s linear 0s infinite normal none running rotation, + 0.5s ease 0s 1 normal none running opacity; + border-color: rgba(0, 0, 0, 0.6) rgba(84, 84, 84, 0.1) + rgba(84, 84, 84, 0.1); + } + + .swagger-ui .response-control-media-type--accept-controller select { + border-color: #196619; + } + + .swagger-ui .response-control-media-type__accept-message { + color: #99e699; + } + + .swagger-ui .version-pragma__message code { + background-color: #3b3b3b; + } + + .swagger-ui .btn { + background: 0 0; + border: 2px solid gray; + box-shadow: rgba(0, 0, 0, 0.1) 0 1px 2px; + color: #b5bac9; + } + + .swagger-ui .btn:hover { + box-shadow: rgba(0, 0, 0, 0.3) 0 0 5px; + } + + .swagger-ui .btn.authorize, + .swagger-ui .btn.cancel { + background-color: transparent; + border-color: #a72a2a; + color: #e69999; + } + + .swagger-ui .btn.cancel:hover { + background-color: #a72a2a; + color: #fff; + } + + .swagger-ui .btn.authorize { + border-color: #48cb90; + color: #9ce3c3; + } + + .swagger-ui .btn.authorize svg { + fill: #9ce3c3; + } + + .btn.authorize.unlocked:hover { + background-color: #48cb90; + color: #fff; + } + + .btn.authorize.unlocked:hover svg { + fill: #fbfbfb; + } + + .swagger-ui .btn.execute { + background-color: #5892d5; + border-color: #5892d5; + color: #fff; + } + + .swagger-ui .copy-to-clipboard { + background: #7c8192; + } + + .swagger-ui .copy-to-clipboard button { + background: url('data:image/svg+xml;charset=utf-8,') + 50% center no-repeat; + } + + .swagger-ui select { + background: url('data:image/svg+xml;charset=utf-8,') + right 10px center/20px no-repeat #212121; + background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMS4wICg0MDM1YTRmYjQ5LCAyMDIwLTA1LTAxKSIKICAgc29kaXBvZGk6ZG9jbmFtZT0iZG93bmxvYWQuc3ZnIgogICBpZD0ic3ZnNCIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMjAgMjAiPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTEwIj4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZGVmcwogICAgIGlkPSJkZWZzOCIgLz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnNCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIgogICAgIGlua3NjYXBlOndpbmRvdy15PSItOSIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iLTkiCiAgICAgaW5rc2NhcGU6Y3k9IjEwIgogICAgIGlua3NjYXBlOmN4PSIxMCIKICAgICBpbmtzY2FwZTp6b29tPSI0MS41IgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpZD0ibmFtZWR2aWV3NiIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSIxMDAxIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTkyMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBncmlkdG9sZXJhbmNlPSIxMCIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGJvcmRlcm9wYWNpdHk9IjEiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIiAvPgogIDxwYXRoCiAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZiIKICAgICBpZD0icGF0aDIiCiAgICAgZD0iTTEzLjQxOCA3Ljg1OWEuNjk1LjY5NSAwIDAxLjk3OCAwIC42OC42OCAwIDAxMCAuOTY5bC0zLjkwOCAzLjgzYS42OTcuNjk3IDAgMDEtLjk3OSAwbC0zLjkwOC0zLjgzYS42OC42OCAwIDAxMC0uOTY5LjY5NS42OTUgMCAwMS45NzggMEwxMCAxMWwzLjQxOC0zLjE0MXoiIC8+Cjwvc3ZnPgo=) + right 10px center/20px no-repeat #1c1c21; + border: 2px solid #41444e; + } + + .swagger-ui select[multiple] { + background: #212121; + } + + .swagger-ui button.invalid, + .swagger-ui input[type="email"].invalid, + .swagger-ui input[type="file"].invalid, + .swagger-ui input[type="password"].invalid, + .swagger-ui input[type="search"].invalid, + .swagger-ui input[type="text"].invalid, + .swagger-ui select.invalid, + .swagger-ui textarea.invalid { + background: #390e0e; + border-color: #c83232; + } + + .swagger-ui input[type="email"], + .swagger-ui input[type="file"], + .swagger-ui input[type="password"], + .swagger-ui input[type="search"], + .swagger-ui input[type="text"], + .swagger-ui textarea { + background: #1c1c21; + border: 1px solid #404040; + } + + .swagger-ui textarea { + background: rgba(28, 28, 33, 0.8); + color: #b5bac9; + } + + .swagger-ui input[disabled], + .swagger-ui select[disabled] { + background-color: #1f1f1f; + color: #bfbfbf; + } + + .swagger-ui textarea[disabled] { + background-color: #41444e; + color: #fff; + } + + .swagger-ui select[disabled] { + border-color: #878787; + } + + .swagger-ui textarea:focus { + border: 2px solid #2a69a7; + } + + .swagger-ui .checkbox input[type="checkbox"] + label > .item { + background: #303030; + box-shadow: #303030 0 0 0 2px; + } + + .swagger-ui .checkbox input[type="checkbox"]:checked + label > .item { + background: url('data:image/svg+xml;charset=utf-8,') + 50% center no-repeat #303030; + } + + .swagger-ui .dialog-ux .backdrop-ux { + background: rgba(0, 0, 0, 0.8); + } + + .swagger-ui .dialog-ux .modal-ux { + background: #1c1c21; + border: 1px solid #2e2e2e; + box-shadow: rgba(0, 0, 0, 0.2) 0 10px 30px 0; + } + + .swagger-ui .dialog-ux .modal-ux-header .close-modal { + background: 0 0; + } + + .swagger-ui .model .deprecated span, + .swagger-ui .model .deprecated td { + color: #bfbfbf !important; + } + + .swagger-ui .model-toggle::after { + background: url('data:image/svg+xml;charset=utf-8,') + 50% center/100% no-repeat; + } + + .swagger-ui .model-hint { + background: rgba(0, 0, 0, 0.7); + color: #ebebeb; + } + + .swagger-ui section.models { + border: 1px solid rgba(58, 64, 80, 0.3); + } + + .swagger-ui section.models.is-open h4 { + border-bottom: 1px solid rgba(58, 64, 80, 0.3); + } + + .swagger-ui section.models .model-container { + background: rgba(0, 0, 0, 0.05); + } + + .swagger-ui section.models .model-container:hover { + background: rgba(0, 0, 0, 0.07); + } + + .swagger-ui .model-box { + background: rgba(0, 0, 0, 0.1); + } + + .swagger-ui .prop-type { + color: #aaaad4; + } + + .swagger-ui table thead tr td, + .swagger-ui table thead tr th { + border-bottom: 1px solid rgba(58, 64, 80, 0.2); + color: #b5bac9; + } + + .swagger-ui .parameter__name.required::after { + color: rgba(230, 153, 153, 0.6); + } + + .swagger-ui .topbar .download-url-wrapper .select-label { + color: #f0f0f0; + } + + .swagger-ui .topbar .download-url-wrapper .download-url-button { + background: #63a040; + color: #fff; + } + + .swagger-ui .info .title small { + background: #7c8492; + } + + .swagger-ui .info .title small.version-stamp { + background-color: #7a9b27; + } + + .swagger-ui .auth-container .errors { + background-color: #350d0d; + color: #b5bac9; + } + + .swagger-ui .errors-wrapper { + background: rgba(200, 50, 50, 0.1); + border: 2px solid #c83232; + } + + .swagger-ui .markdown code, + .swagger-ui .renderedmarkdown code { + background: rgba(0, 0, 0, 0.05); + color: #c299e6; + } + + .swagger-ui .model-toggle:after { + background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMS4wICg0MDM1YTRmYjQ5LCAyMDIwLTA1LTAxKSIKICAgc29kaXBvZGk6ZG9jbmFtZT0iZG93bmxvYWQyLnN2ZyIKICAgaWQ9InN2ZzQiCiAgIHZlcnNpb249IjEuMSIKICAgaGVpZ2h0PSIyNCIKICAgd2lkdGg9IjI0Ij4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGExMCI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGRlZnMKICAgICBpZD0iZGVmczgiIC8+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9InN2ZzQiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iLTkiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9Ii05IgogICAgIGlua3NjYXBlOmN5PSIxMiIKICAgICBpbmtzY2FwZTpjeD0iMTIiCiAgICAgaW5rc2NhcGU6em9vbT0iMzQuNTgzMzMzIgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpZD0ibmFtZWR2aWV3NiIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSIxMDAxIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTkyMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBncmlkdG9sZXJhbmNlPSIxMCIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGJvcmRlcm9wYWNpdHk9IjEiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIiAvPgogIDxwYXRoCiAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZiIKICAgICBpZD0icGF0aDIiCiAgICAgZD0iTTEwIDZMOC41OSA3LjQxIDEzLjE3IDEybC00LjU4IDQuNTlMMTAgMThsNi02eiIgLz4KPC9zdmc+Cg==) + 50% no-repeat; + } + + /* arrows for each operation and request are now white */ + .arrow, + #large-arrow-up { + fill: #fff; + } + + #unlocked { + fill: #fff; + } + + ::-webkit-scrollbar-track { + background-color: #646464 !important; + } + + ::-webkit-scrollbar-thumb { + background-color: #242424 !important; + border: 2px solid #3e4346 !important; + } + + ::-webkit-scrollbar-button:vertical:start:decrement { + background: linear-gradient(130deg, #696969 40%, rgba(255, 0, 0, 0) 41%), + linear-gradient(230deg, #696969 40%, transparent 41%), + linear-gradient(0deg, #696969 40%, transparent 31%); + background-color: #b6b6b6; + } + + ::-webkit-scrollbar-button:vertical:end:increment { + background: linear-gradient(310deg, #696969 40%, transparent 41%), + linear-gradient(50deg, #696969 40%, transparent 41%), + linear-gradient(180deg, #696969 40%, transparent 31%); + background-color: #b6b6b6; + } + + ::-webkit-scrollbar-button:horizontal:end:increment { + background: linear-gradient(210deg, #696969 40%, transparent 41%), + linear-gradient(330deg, #696969 40%, transparent 41%), + linear-gradient(90deg, #696969 30%, transparent 31%); + background-color: #b6b6b6; + } + + ::-webkit-scrollbar-button:horizontal:start:decrement { + background: linear-gradient(30deg, #696969 40%, transparent 41%), + linear-gradient(150deg, #696969 40%, transparent 41%), + linear-gradient(270deg, #696969 30%, transparent 31%); + background-color: #b6b6b6; + } + + ::-webkit-scrollbar-button, + ::-webkit-scrollbar-track-piece { + background-color: #3e4346 !important; + } + + .swagger-ui .black, + .swagger-ui .checkbox, + .swagger-ui .dark-gray, + .swagger-ui .download-url-wrapper .loading, + .swagger-ui .errors-wrapper .errors small, + .swagger-ui .fallback, + .swagger-ui .filter .loading, + .swagger-ui .gray, + .swagger-ui .hover-black:focus, + .swagger-ui .hover-black:hover, + .swagger-ui .hover-dark-gray:focus, + .swagger-ui .hover-dark-gray:hover, + .swagger-ui .hover-gray:focus, + .swagger-ui .hover-gray:hover, + .swagger-ui .hover-light-silver:focus, + .swagger-ui .hover-light-silver:hover, + .swagger-ui .hover-mid-gray:focus, + .swagger-ui .hover-mid-gray:hover, + .swagger-ui .hover-near-black:focus, + .swagger-ui .hover-near-black:hover, + .swagger-ui .hover-silver:focus, + .swagger-ui .hover-silver:hover, + .swagger-ui .light-silver, + .swagger-ui .markdown pre, + .swagger-ui .mid-gray, + .swagger-ui .model .property, + .swagger-ui .model .property.primitive, + .swagger-ui .model-title, + .swagger-ui .near-black, + .swagger-ui .parameter__extension, + .swagger-ui .parameter__in, + .swagger-ui .prop-format, + .swagger-ui .renderedmarkdown pre, + .swagger-ui .response-col_links .response-undocumented, + .swagger-ui .response-col_status .response-undocumented, + .swagger-ui .silver, + .swagger-ui section.models h4, + .swagger-ui section.models h5, + .swagger-ui span.token-not-formatted, + .swagger-ui span.token-string, + .swagger-ui table.headers .header-example, + .swagger-ui table.model tr.description, + .swagger-ui table.model tr.extension { + color: #bfbfbf; + } + + .swagger-ui .hover-white:focus, + .swagger-ui .hover-white:hover, + .swagger-ui .info .title small pre, + .swagger-ui .topbar a, + .swagger-ui .white { + color: #fff; + } + + .swagger-ui .bg-black-10, + .swagger-ui .hover-bg-black-10:focus, + .swagger-ui .hover-bg-black-10:hover, + .swagger-ui .stripe-dark:nth-child(2n + 1) { + background-color: rgba(0, 0, 0, 0.1); + } + + .swagger-ui .bg-white-10, + .swagger-ui .hover-bg-white-10:focus, + .swagger-ui .hover-bg-white-10:hover, + .swagger-ui .stripe-light:nth-child(2n + 1) { + background-color: rgba(28, 28, 33, 0.1); + } + + .swagger-ui .bg-light-silver, + .swagger-ui .hover-bg-light-silver:focus, + .swagger-ui .hover-bg-light-silver:hover, + .swagger-ui .striped--light-silver:nth-child(2n + 1) { + background-color: #6e6e6e; + } + + .swagger-ui .bg-moon-gray, + .swagger-ui .hover-bg-moon-gray:focus, + .swagger-ui .hover-bg-moon-gray:hover, + .swagger-ui .striped--moon-gray:nth-child(2n + 1) { + background-color: #4d4d4d; + } + + .swagger-ui .bg-light-gray, + .swagger-ui .hover-bg-light-gray:focus, + .swagger-ui .hover-bg-light-gray:hover, + .swagger-ui .striped--light-gray:nth-child(2n + 1) { + background-color: #2b2b2b; + } + + .swagger-ui .bg-near-white, + .swagger-ui .hover-bg-near-white:focus, + .swagger-ui .hover-bg-near-white:hover, + .swagger-ui .striped--near-white:nth-child(2n + 1) { + background-color: #242424; + } + + .swagger-ui .opblock-tag:hover, + .swagger-ui section.models h4:hover { + background: rgba(0, 0, 0, 0.02); + } + + .swagger-ui .checkbox p, + .swagger-ui .dialog-ux .modal-ux-content h4, + .swagger-ui .dialog-ux .modal-ux-content p, + .swagger-ui .dialog-ux .modal-ux-header h3, + .swagger-ui .errors-wrapper .errors h4, + .swagger-ui .errors-wrapper hgroup h4, + .swagger-ui .info .base-url, + .swagger-ui .info .title, + .swagger-ui .info h1, + .swagger-ui .info h2, + .swagger-ui .info h3, + .swagger-ui .info h4, + .swagger-ui .info h5, + .swagger-ui .info li, + .swagger-ui .info p, + .swagger-ui .info table, + .swagger-ui .loading-container .loading::after, + .swagger-ui .model, + .swagger-ui .opblock .opblock-section-header h4, + .swagger-ui .opblock .opblock-section-header > label, + .swagger-ui .opblock .opblock-summary-description, + .swagger-ui .opblock .opblock-summary-operation-id, + .swagger-ui .opblock .opblock-summary-path, + .swagger-ui .opblock .opblock-summary-path__deprecated, + .swagger-ui .opblock-description-wrapper, + .swagger-ui .opblock-description-wrapper h4, + .swagger-ui .opblock-description-wrapper p, + .swagger-ui .opblock-external-docs-wrapper, + .swagger-ui .opblock-external-docs-wrapper h4, + .swagger-ui .opblock-external-docs-wrapper p, + .swagger-ui .opblock-tag small, + .swagger-ui .opblock-title_normal, + .swagger-ui .opblock-title_normal h4, + .swagger-ui .opblock-title_normal p, + .swagger-ui .parameter__name, + .swagger-ui .parameter__type, + .swagger-ui .response-col_links, + .swagger-ui .response-col_status, + .swagger-ui .responses-inner h4, + .swagger-ui .responses-inner h5, + .swagger-ui .scheme-container .schemes > label, + .swagger-ui .scopes h2, + .swagger-ui .servers > label, + .swagger-ui .tab li, + .swagger-ui label, + .swagger-ui select, + .swagger-ui table.headers td { + color: #b5bac9; + } + + .swagger-ui .download-url-wrapper .failed, + .swagger-ui .filter .failed, + .swagger-ui .model-deprecated-warning, + .swagger-ui .parameter__deprecated, + .swagger-ui .parameter__name.required span, + .swagger-ui table.model tr.property-row .star { + color: #e69999; + } + + .swagger-ui .opblock-body pre.microlight, + .swagger-ui textarea.curl { + background: #41444e; + border-radius: 4px; + color: #fff; + } + + .swagger-ui .expand-methods svg, + .swagger-ui .expand-methods:hover svg { + fill: #bfbfbf; + } + + .swagger-ui .auth-container, + .swagger-ui .dialog-ux .modal-ux-header { + border-bottom: 1px solid #2e2e2e; + } + + .swagger-ui .topbar .download-url-wrapper .select-label select, + .swagger-ui .topbar .download-url-wrapper input[type="text"] { + border: 2px solid #63a040; + } + + .swagger-ui .info a, + .swagger-ui .info a:hover, + .swagger-ui .scopes h2 a { + color: #99bde6; + } + + /* Dark Scrollbar */ + ::-webkit-scrollbar { + width: 14px; + height: 14px; + } + + ::-webkit-scrollbar-button { + background-color: #3e4346 !important; + } + + ::-webkit-scrollbar-track { + background-color: #646464 !important; + } + + ::-webkit-scrollbar-track-piece { + background-color: #3e4346 !important; + } + + ::-webkit-scrollbar-thumb { + height: 50px; + background-color: #242424 !important; + border: 2px solid #3e4346 !important; + } + + ::-webkit-scrollbar-corner { + } + + ::-webkit-resizer { + } + + ::-webkit-scrollbar-button:vertical:start:decrement { + background: linear-gradient(130deg, #696969 40%, rgba(255, 0, 0, 0) 41%), + linear-gradient(230deg, #696969 40%, rgba(0, 0, 0, 0) 41%), + linear-gradient(0deg, #696969 40%, rgba(0, 0, 0, 0) 31%); + background-color: #b6b6b6; + } + + ::-webkit-scrollbar-button:vertical:end:increment { + background: linear-gradient(310deg, #696969 40%, rgba(0, 0, 0, 0) 41%), + linear-gradient(50deg, #696969 40%, rgba(0, 0, 0, 0) 41%), + linear-gradient(180deg, #696969 40%, rgba(0, 0, 0, 0) 31%); + background-color: #b6b6b6; + } + + ::-webkit-scrollbar-button:horizontal:end:increment { + background: linear-gradient(210deg, #696969 40%, rgba(0, 0, 0, 0) 41%), + linear-gradient(330deg, #696969 40%, rgba(0, 0, 0, 0) 41%), + linear-gradient(90deg, #696969 30%, rgba(0, 0, 0, 0) 31%); + background-color: #b6b6b6; + } + + ::-webkit-scrollbar-button:horizontal:start:decrement { + background: linear-gradient(30deg, #696969 40%, rgba(0, 0, 0, 0) 41%), + linear-gradient(150deg, #696969 40%, rgba(0, 0, 0, 0) 41%), + linear-gradient(270deg, #696969 30%, rgba(0, 0, 0, 0) 31%); + background-color: #b6b6b6; + } +} diff --git a/src/v2/db/turso.ts b/src/v2/db/turso.ts index 0c015c9..2b90993 100644 --- a/src/v2/db/turso.ts +++ b/src/v2/db/turso.ts @@ -1,8 +1,25 @@ -import * as schema from "@/v2/db/schema" import { drizzle as drizzleORM } from "drizzle-orm/libsql" import { createClient } from "@libsql/client/web" // because we're in a worker import { Logger } from "drizzle-orm/logger" +// oh god + +import * as asset from "./schema/asset/asset" +import * as assetcategories from "./schema/asset/asset-categories" +import * as assettags from "./schema/asset/asset-tags" +import * as assetatlas from "./schema/asset/asset-atlas" + +import * as games from "./schema/game/game" + +import * as ocgenerators from "./schema/oc-generators/oc-generators" + +import * as user from "./schema/user/user" +import * as userattributes from "./schema/user/user-attributes" +import * as usercollections from "./schema/user/user-collections" +import * as userconnections from "./schema/user/user-connections" +import * as userfavorites from "./schema/user/user-favorites" +import * as usernetworking from "./schema/user/user-networking" + /** * The `LoggerWrapper` class is used to wrap the `Logger` interface from `drizzle-orm` and provide a custom implementation of the `logQuery` method. * It logs the query and its parameters to the console. @@ -39,7 +56,21 @@ export function getConnection(env: Bindings) { * The `LoggerWrapper` is passed to the `logger` option to log queries to the console. */ const drizzle = drizzleORM(turso, { - schema, + schema: { + // this is the worst thing i've ever seen in my life + ...asset, + ...assetcategories, + ...assettags, + ...assetatlas, + ...games, + ...ocgenerators, + ...user, + ...userattributes, + ...usercollections, + ...userconnections, + ...userfavorites, + ...usernetworking, + }, logger: new LoggerWrapper(), }) @@ -52,6 +83,6 @@ export function getConnection(env: Bindings) { export type DrizzleInstance = ReturnType["drizzle"] export type TursoInstance = ReturnType["turso"] -export type TursoClient = ReturnType -export type DrizzleClient = ReturnType -export type Connection = ReturnType +// export type TursoClient = ReturnType +// export type DrizzleClient = ReturnType +// export type Connection = ReturnType diff --git a/src/v2/lib/managers/asset/asset-manager.ts b/src/v2/lib/managers/asset/asset-manager.ts index c08d296..5f9e963 100644 --- a/src/v2/lib/managers/asset/asset-manager.ts +++ b/src/v2/lib/managers/asset/asset-manager.ts @@ -6,7 +6,7 @@ import { assetTagAsset, game, } from "@/v2/db/schema" -import { eq, or, like, sql, and, not } from "drizzle-orm" +import { eq, or, like, sql, and, not, desc } from "drizzle-orm" import { R2Bucket } from "@cloudflare/workers-types" import { SplitQueryByCommas } from "../../helpers/split-query-by-commas" import { z } from "zod" @@ -70,14 +70,9 @@ export const UploadAssetSchema = z.object({ export class AssetManager { constructor(private drizzle: DrizzleInstance) {} - /** - * Retrieves an asset by its ID. - * @param assetId - The unique ID of the asset to retrieve. - * @returns A promise that resolves to the retrieved asset, its game, category and tags. - */ - public async getAssetById(assetId: number): Promise { + public async getAssetById(assetId: number) { try { - const foundAsset = await this.drizzle.query.asset.findFirst({ + return await this.drizzle.query.asset.findFirst({ where: (asset, { eq }) => eq(asset.id, assetId), with: { assetTagAsset: { @@ -95,8 +90,6 @@ export class AssetManager { assetCategory: true, }, }) - - return foundAsset ?? null } catch (e) { console.error(`Error getting asset by ID ${assetId}`, e) throw new Error(`Error getting asset by ID ${assetId}`) @@ -109,7 +102,7 @@ export class AssetManager { * @returns A promise that resolves to an array of retrieved assets. * @throws An error if any of the asset IDs are invalid. */ - public async getSimilarAssets(assetId: number): Promise { + public async getSimilarAssets(assetId: number) { try { const [foundAsset] = await this.drizzle .select({ @@ -130,7 +123,7 @@ export class AssetManager { // who needs machine learning when you can just do this :^) // TODO(dromzeh): check if there's a better way to do this, and prioritize assets with similar name, asset category, and game - const similarAssets = await this.drizzle.query.asset.findMany({ + return await this.drizzle.query.asset.findMany({ where: (asset, { and, eq }) => and( not(eq(asset.id, foundAsset.id)), @@ -155,8 +148,6 @@ export class AssetManager { ), limit: 6, }) - - return similarAssets ?? null } catch (e) { console.error(`Error getting similar assets by ID ${assetId}`, e) throw new Error(`Error getting similar assets by ID ${assetId}`) @@ -169,9 +160,7 @@ export class AssetManager { */ public async listAssets(): Promise { try { - const assets = await this.drizzle.select().from(asset) - - return assets + return await this.drizzle.select().from(asset) } catch (e) { console.error("Error listing assets", e) throw new Error("Error listing assets") @@ -183,9 +172,7 @@ export class AssetManager { * @param query - An object containing optional search parameters. * @returns A promise that resolves to an array of matching assets. */ - public async searchAssets( - query: AssetSearchQuery - ): Promise { + public async searchAssets(query: AssetSearchQuery) { try { const { name, game, category, tag, limit } = query @@ -218,7 +205,9 @@ export class AssetManager { .groupBy(assetTagAsset.assetId) ) - const foundAssets = await this.drizzle + // TODO(dromzeh): the incorrect type is occuring becuase of the inner join, idk how to fix it tbh + + return await this.drizzle .with(assetTagResponse) .select() .from(asset) @@ -243,12 +232,8 @@ export class AssetManager { ) ) ) - .groupBy(asset.id) .limit(assetLimit) - - // TODO(dromzeh): the incorrect type is occuring becuase of the inner join, idk how to fix it tbh - // @ts-expect-error - i need to fix this - return foundAssets + .orderBy(desc(asset.uploadedDate)) } catch (e) { console.error("Error searching assets", e) throw new Error("Error searching assets") @@ -275,7 +260,7 @@ export class AssetManager { file ) - const returnedNewAsset: NewAsset = await this.drizzle.transaction( + const returnedNewAsset: Asset = await this.drizzle.transaction( async (trx) => { const [createdAsset] = await trx .insert(asset) diff --git a/src/v2/lib/managers/tag/tag-manager.ts b/src/v2/lib/managers/tag/tag-manager.ts index 457044a..5d14674 100644 --- a/src/v2/lib/managers/tag/tag-manager.ts +++ b/src/v2/lib/managers/tag/tag-manager.ts @@ -32,7 +32,6 @@ export class TagManager { return foundTag ?? null } catch (e) { - console.error(`Error getting tag by ID ${tagId}`, e) throw new Error(`Error getting tag by ID ${tagId}`) } } @@ -46,7 +45,6 @@ export class TagManager { const tags = await this.drizzle.select().from(assetTag) return tags ?? null } catch (e) { - console.error("Error listing tags", e) throw new Error("Error listing tags") } } @@ -67,7 +65,6 @@ export class TagManager { return tags ?? null } catch (e) { - console.error("Error getting tags by partial name", e) throw new Error("Error getting tags by partial name") } } @@ -94,7 +91,6 @@ export class TagManager { return createdTag } catch (e) { - console.error("Error creating tag", e) throw new Error("Error creating tag") } } diff --git a/src/v2/routes/asset/get/id/[id]/route.ts b/src/v2/routes/asset/get/id/[id]/route.ts index a718438..848cf67 100644 --- a/src/v2/routes/asset/get/id/[id]/route.ts +++ b/src/v2/routes/asset/get/id/[id]/route.ts @@ -25,10 +25,10 @@ handler.openapi(getAssetByIdRoute, async (ctx) => { if (!asset) { return ctx.jsonT( { - success: false, + success: true, error: "Asset not found", }, - 404 + 200 ) } diff --git a/src/v2/routes/game/get/name/[name]/route.ts b/src/v2/routes/game/get/name/[name]/route.ts index 9277681..443e7ed 100644 --- a/src/v2/routes/game/get/name/[name]/route.ts +++ b/src/v2/routes/game/get/name/[name]/route.ts @@ -15,7 +15,7 @@ handler.openapi(getGameByNameRoute, async (ctx) => { if (!game) { return ctx.jsonT( { - success: false, + success: true, error: "Game not found", }, 200 From db49bfba1ef92e77040a94b7af374a8d7d9f4ea9 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Mon, 20 Nov 2023 01:36:39 +0000 Subject: [PATCH 162/318] i am actually stupid --- src/v2/db/turso.ts | 29 ++--------------------------- 1 file changed, 2 insertions(+), 27 deletions(-) diff --git a/src/v2/db/turso.ts b/src/v2/db/turso.ts index 2b90993..0cb61e8 100644 --- a/src/v2/db/turso.ts +++ b/src/v2/db/turso.ts @@ -4,21 +4,7 @@ import { Logger } from "drizzle-orm/logger" // oh god -import * as asset from "./schema/asset/asset" -import * as assetcategories from "./schema/asset/asset-categories" -import * as assettags from "./schema/asset/asset-tags" -import * as assetatlas from "./schema/asset/asset-atlas" - -import * as games from "./schema/game/game" - -import * as ocgenerators from "./schema/oc-generators/oc-generators" - -import * as user from "./schema/user/user" -import * as userattributes from "./schema/user/user-attributes" -import * as usercollections from "./schema/user/user-collections" -import * as userconnections from "./schema/user/user-connections" -import * as userfavorites from "./schema/user/user-favorites" -import * as usernetworking from "./schema/user/user-networking" +import * as schema from "@/v2/db/schema" /** * The `LoggerWrapper` class is used to wrap the `Logger` interface from `drizzle-orm` and provide a custom implementation of the `logQuery` method. @@ -58,18 +44,7 @@ export function getConnection(env: Bindings) { const drizzle = drizzleORM(turso, { schema: { // this is the worst thing i've ever seen in my life - ...asset, - ...assetcategories, - ...assettags, - ...assetatlas, - ...games, - ...ocgenerators, - ...user, - ...userattributes, - ...usercollections, - ...userconnections, - ...userfavorites, - ...usernetworking, + ...schema, }, logger: new LoggerWrapper(), }) From 1aa5bafcbe5210c5573b9f86a5ca28d86437e389 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Mon, 20 Nov 2023 01:37:45 +0000 Subject: [PATCH 163/318] cleanup db exports bru [skip ci] --- src/v2/db/turso.ts | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/v2/db/turso.ts b/src/v2/db/turso.ts index 0cb61e8..6b6de07 100644 --- a/src/v2/db/turso.ts +++ b/src/v2/db/turso.ts @@ -2,8 +2,6 @@ import { drizzle as drizzleORM } from "drizzle-orm/libsql" import { createClient } from "@libsql/client/web" // because we're in a worker import { Logger } from "drizzle-orm/logger" -// oh god - import * as schema from "@/v2/db/schema" /** @@ -43,7 +41,6 @@ export function getConnection(env: Bindings) { */ const drizzle = drizzleORM(turso, { schema: { - // this is the worst thing i've ever seen in my life ...schema, }, logger: new LoggerWrapper(), @@ -57,7 +54,3 @@ export function getConnection(env: Bindings) { export type DrizzleInstance = ReturnType["drizzle"] export type TursoInstance = ReturnType["turso"] - -// export type TursoClient = ReturnType -// export type DrizzleClient = ReturnType -// export type Connection = ReturnType From 87896a39b8c1bd48847de1deb6fbc81cdf985d62 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Mon, 20 Nov 2023 01:58:11 +0000 Subject: [PATCH 164/318] quote on quote db script refactor --- src/scripts/migrate/migrate.mts | 35 ++++++---- src/scripts/seed/seed.ts | 74 +++++++++++++--------- src/v2/lib/managers/asset/asset-manager.ts | 2 +- 3 files changed, 68 insertions(+), 43 deletions(-) diff --git a/src/scripts/migrate/migrate.mts b/src/scripts/migrate/migrate.mts index b6509c4..0d73ff4 100644 --- a/src/scripts/migrate/migrate.mts +++ b/src/scripts/migrate/migrate.mts @@ -3,41 +3,50 @@ import { migrate } from "drizzle-orm/libsql/migrator" import { createClient } from "@libsql/client" import "dotenv/config" -const { TURSO_DATABASE_AUTH_TOKEN, TURSO_DATABASE_URL, ENVIRONMENT } = - process.env -const TURSO_DEV_DATABASE_URL = - process.env.TURSO_DEV_DATABASE_URL ?? "http://127.0.0.1:8080" +const { + TURSO_DATABASE_AUTH_TOKEN, + TURSO_DATABASE_URL, + ENVIRONMENT, + TURSO_DEV_DATABASE_URL = "http://127.0.0.1:8080", +} = process.env + const isDev = ENVIRONMENT === "DEV" async function main() { - console.log("IS_DEV: ", isDev) + console.log("[MIGRATION] DEV:", isDev) - isDev && console.log("TURSO_DEV_DATABASE_URL: ", TURSO_DEV_DATABASE_URL) - !isDev && console.log("TURSO_DATABASE_URL: ", TURSO_DATABASE_URL) + console.log( + `[MIGRATION] URL: ${ + isDev ? TURSO_DEV_DATABASE_URL : TURSO_DATABASE_URL + }` + ) + // this is what industry standard fuck up prevention looks like const waitTime = isDev ? 1000 : 10000 - console.log(`Waiting ${waitTime}ms until migration...`) + console.log(`[MIGRATION] Waiting ${waitTime}ms until migration...`) await new Promise((resolve) => setTimeout(resolve, waitTime)) - console.log("Connecting to database client...") + console.log("[MIGRATION] Connecting to the database client...") + const client = createClient({ url: isDev ? TURSO_DEV_DATABASE_URL : TURSO_DATABASE_URL!, authToken: isDev ? undefined : TURSO_DATABASE_AUTH_TOKEN!, }) + const db = drizzleORM(client) console.log( - "Connected to database client & initialized drizzle-orm instance" + "[MIGRATION] Connected to the database client & initialized drizzle-orm instance" ) - console.log("Migrating database...") + console.log("[MIGRATION] Migrating database...") await migrate(db, { migrationsFolder: "./src/v2/db/migrations" }) - console.log("Migrations complete!") + console.log("[MIGRATION] Migrations complete!") process.exit(0) } main().catch((err) => { - console.error(`Error: ${err}`) + console.error(`[MIGRATION] Error: ${err}`) process.exit(1) }) diff --git a/src/scripts/seed/seed.ts b/src/scripts/seed/seed.ts index effd475..0d2c4f2 100644 --- a/src/scripts/seed/seed.ts +++ b/src/scripts/seed/seed.ts @@ -29,18 +29,18 @@ async function main() { process.exit(1) } - console.log("Connecting to database client...") + console.log("[SEED] Connecting to database client...") const client = createClient({ url: TURSO_DEV_DATABASE_URL, }) const db = drizzleORM(client) console.log( - "Connected to database client & initialized drizzle-orm instance" + "[SEED] Connected to database client & initialized drizzle-orm instance" ) - console.log("Seeding database...\n") + console.log("[SEED] Seeding database...\n") - console.log("[authUser] Seeding users...") + console.log("[SEED] [authUser] Seeding users...") const newUsers = await db .insert(authUser) .values([ @@ -78,9 +78,9 @@ async function main() { }, ]) .returning() - console.log(`[authUser] inserted ${newUsers.length} rows\n`) + console.log(`[SEED] [authUser] inserted ${newUsers.length} rows\n`) - console.log("[userNetworking] Seeding user following...") + console.log("[SEED] [userNetworking] Seeding user following...") const newUserNetworking = await db .insert(userNetworking) .values([ @@ -98,9 +98,11 @@ async function main() { }, ]) .returning() - console.log(`[userNetworking] inserted ${newUserNetworking.length} rows\n`) + console.log( + `[SEED] [userNetworking] inserted ${newUserNetworking.length} rows\n` + ) - console.log("[assetTag] Seeding asset tags...") + console.log("[SEED] [assetTag] Seeding asset tags...") const newAssetTags = await db .insert(assetTag) .values([ @@ -120,9 +122,9 @@ async function main() { }, ]) .returning() - console.log(`[assetTag] inserted ${newAssetTags.length} rows\n`) + console.log(`[SEED] [assetTag] inserted ${newAssetTags.length} rows\n`) - console.log("[game] Seeding games...") + console.log("[SEED] [game] Seeding games...") const newGames = await db .insert(game) .values([ @@ -142,9 +144,9 @@ async function main() { }, ]) .returning() - console.log(`[game] inserted ${newGames.length} rows\n`) + console.log(`[SEED] [game] inserted ${newGames.length} rows\n`) - console.log("[assetCategory] Seeding asset categories...") + console.log("[SEED] [assetCategory] Seeding asset categories...") const newAssetCategories = await db .insert(assetCategory) .values([ @@ -164,9 +166,13 @@ async function main() { }, ]) .returning() - console.log(`[assetCategory] inserted ${newAssetCategories.length} rows\n`) + console.log( + `[SEED] [assetCategory] inserted ${newAssetCategories.length} rows\n` + ) - console.log("[gameAssetCategory] Linking games to asset categories...") + console.log( + "[SEED] [gameAssetCategory] Linking games to asset categories..." + ) const newGameAssetCategory = await db .insert(gameAssetCategory) .values([ @@ -185,10 +191,10 @@ async function main() { ]) .returning() console.log( - `[gameAssetCategory] inserted ${newGameAssetCategory.length} rows\n` + `[SEED] [gameAssetCategory] inserted ${newGameAssetCategory.length} rows\n` ) - console.log("[asset] Seeding assets...") + console.log("[SEED] [asset] Seeding assets...") const newAssets = await db .insert(asset) .values([ @@ -241,9 +247,9 @@ async function main() { }, ]) .returning() - console.log(`[asset] inserted ${newAssets.length} rows\n`) + console.log(`[SEED] [asset] inserted ${newAssets.length} rows\n`) - console.log("[assetTagAsset] Linking assets to asset tags...") + console.log("[SEED] [assetTagAsset] Linking assets to asset tags...") const newAssetTagAsset = await db .insert(assetTagAsset) .values([ @@ -265,9 +271,11 @@ async function main() { }, ]) .returning() - console.log(`[assetTagAsset] inserted ${newAssetTagAsset.length} rows\n`) + console.log( + `[SEED] [assetTagAsset] inserted ${newAssetTagAsset.length} rows\n` + ) - console.log("[userCollection] Seeding user collections...") + console.log("[SEED] [userCollection] Seeding user collections...") const newUserCollections = await db .insert(userCollection) .values({ @@ -277,9 +285,13 @@ async function main() { isPublic: true, // default to private }) .returning() - console.log(`[userCollection] inserted ${newUserCollections.length} rows\n`) + console.log( + `[SEED] [userCollection] inserted ${newUserCollections.length} rows\n` + ) - console.log("[userCollectionAsset] Linking user collections to assets...") + console.log( + "[SEED] [userCollectionAsset] Linking user collections to assets..." + ) const newUserCollectionAssets = await db .insert(userCollectionAsset) .values([ @@ -294,11 +306,11 @@ async function main() { ]) .returning() console.log( - `[userCollectionAsset] inserted ${newUserCollectionAssets.length} rows\n` + `[SEED] [userCollectionAsset] inserted ${newUserCollectionAssets.length} rows\n` ) // only one user favorite per user - console.log("[userFavorite] Seeding user favorites...") + console.log("[SEED] [userFavorite] Seeding user favorites...") const newUserFavorites = await db .insert(userFavorite) .values([ @@ -311,9 +323,13 @@ async function main() { }, ]) .returning() - console.log(`[userFavorite] inserted ${newUserFavorites.length} rows\n`) + console.log( + `[SEED] [userFavorite] inserted ${newUserFavorites.length} rows\n` + ) - console.log("[userFavoriteAsset] Linking user favorites to assets...") + console.log( + "[SEED] [userFavoriteAsset] Linking user favorites to assets..." + ) const newUserFavoriteAssets = await db .insert(userFavoriteAsset) .values([ @@ -332,14 +348,14 @@ async function main() { ]) .returning() console.log( - `[userFavoriteAsset] inserted ${newUserFavoriteAssets.length} rows\n` + `[SEED] [userFavoriteAsset] inserted ${newUserFavoriteAssets.length} rows\n` ) - console.log("Seeded database successfully") + console.log("[SEED] Seeded database successfully") process.exit(0) } main().catch((err) => { - console.error(`Error: ${err}`) + console.error(`[SEED] Error: ${err}`) process.exit(1) }) diff --git a/src/v2/lib/managers/asset/asset-manager.ts b/src/v2/lib/managers/asset/asset-manager.ts index 5f9e963..10472df 100644 --- a/src/v2/lib/managers/asset/asset-manager.ts +++ b/src/v2/lib/managers/asset/asset-manager.ts @@ -158,7 +158,7 @@ export class AssetManager { * Retrieves a list of all assets. * @returns A promise that resolves to an array of assets. */ - public async listAssets(): Promise { + public async listAssets() { try { return await this.drizzle.select().from(asset) } catch (e) { From 4586123ac30ff71691a62c3c46e31a3083d9fb1c Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Sat, 25 Nov 2023 18:44:07 +0000 Subject: [PATCH 165/318] tagging filter (rawdog sql) LOL --- package.json | 2 + pnpm-lock.yaml | 20 +- src/index.ts | 21 +- src/openapi/config.ts | 18 + src/v2/db/migrations/0001_chubby_bullseye.sql | 10 + src/v2/db/migrations/meta/0001_snapshot.json | 1513 +++++++++++++++++ src/v2/db/migrations/meta/_journal.json | 7 + src/v2/db/schema/user/user.ts | 45 +- src/v2/lib/auth/adapter/adapter.ts | 245 +++ src/v2/lib/auth/lucia.ts | 38 +- src/v2/lib/managers/asset/asset-manager.ts | 92 +- src/v2/routes/asset/handler.ts | 2 + src/v2/routes/asset/search/all/openapi.ts | 19 + src/v2/routes/asset/search/all/route.ts | 22 + src/v2/routes/asset/search/all/schema.ts | 38 + src/v2/routes/asset/search/handler.ts | 8 + src/worker-configuration.d.ts | 17 +- 17 files changed, 2001 insertions(+), 116 deletions(-) create mode 100644 src/openapi/config.ts create mode 100644 src/v2/db/migrations/0001_chubby_bullseye.sql create mode 100644 src/v2/db/migrations/meta/0001_snapshot.json create mode 100644 src/v2/lib/auth/adapter/adapter.ts create mode 100644 src/v2/routes/asset/search/all/openapi.ts create mode 100644 src/v2/routes/asset/search/all/schema.ts create mode 100644 src/v2/routes/asset/search/handler.ts diff --git a/package.json b/package.json index 861d825..410ab1e 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "drizzle:studio": "drizzle-kit studio --port 7331 --host 127.0.0.1 --verbose" }, "devDependencies": { + "@asteasolutions/zod-to-openapi": "^6.3.0", "@cloudflare/workers-types": "^4.20231025.0", "@types/node": "^20.9.1", "dotenv": "^16.3.1", @@ -26,6 +27,7 @@ "eslint-config-google": "^0.14.0", "eslint-plugin-json": "^3.1.0", "husky": "^8.0.3", + "openapi-generator": "link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator", "tsx": "^4.1.2", "typescript": "^5.2.2", "wrangler": "3.16.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 37150f0..8045dc9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -64,6 +64,9 @@ dependencies: version: 3.22.4 devDependencies: + "@asteasolutions/zod-to-openapi": + specifier: ^6.3.0 + version: 6.3.0(zod@3.22.4) "@cloudflare/workers-types": specifier: ^4.20231025.0 version: 4.20231025.0 @@ -88,6 +91,9 @@ devDependencies: husky: specifier: ^8.0.3 version: 8.0.3 + openapi-generator: + specifier: link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator + version: link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator tsx: specifier: ^4.1.2 version: 4.1.2 @@ -118,6 +124,18 @@ packages: zod: 3.22.4 dev: false + /@asteasolutions/zod-to-openapi@6.3.0(zod@3.22.4): + resolution: + { + integrity: sha512-ca7Svz3BWkMaIP3M1YGsyxgp7AcKXlTmy19ozhY0DslhatXbnyxdvxlmiI0TmvkIfi6RpQfm+eK1neVLsh6Riw==, + } + peerDependencies: + zod: ^3.20.2 + dependencies: + openapi3-ts: 4.1.2 + zod: 3.22.4 + dev: true + /@cloudflare/kv-asset-handler@0.2.0: resolution: { @@ -3962,7 +3980,6 @@ packages: } dependencies: yaml: 2.3.4 - dev: false /optionator@0.9.3: resolution: @@ -4939,7 +4956,6 @@ packages: integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==, } engines: { node: ">= 14" } - dev: false /yocto-queue@0.1.0: resolution: diff --git a/src/index.ts b/src/index.ts index b5bcaa2..555b4e7 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,29 +2,12 @@ import { OpenAPIHono } from "@hono/zod-openapi" import { swaggerUI } from "@hono/swagger-ui" import { prettyJSON } from "hono/pretty-json" import BaseRoutes from "@/v2/routes/handler" +import { OpenAPIConfig } from "./openapi/config" const app = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() app.route("/v2", BaseRoutes) -app.doc("/openapi", { - openapi: "3.1.0", - info: { - version: "2.0.0", - title: "api.wanderer.moe", - description: "Public Zod OpenAPI documentation for wanderer.moe's API.", - license: { - name: "GNU General Public License v3.0", - url: "https://www.gnu.org/licenses/gpl-3.0.en.html", - }, - contact: { - url: "https://wanderer.moe", - name: "wanderer.moe", - }, - }, -}) - -// TODO(dromzeh): Serve static css content from API, inject into swaggerUI app.get( "/docs", swaggerUI({ @@ -34,4 +17,6 @@ app.get( app.use("*", prettyJSON()) +app.doc("/openapi", OpenAPIConfig) + export default app diff --git a/src/openapi/config.ts b/src/openapi/config.ts new file mode 100644 index 0000000..76edb83 --- /dev/null +++ b/src/openapi/config.ts @@ -0,0 +1,18 @@ +import { OpenAPIObjectConfig } from "@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator" + +export const OpenAPIConfig: OpenAPIObjectConfig = { + openapi: "3.1.0", + info: { + version: "2.0.0", + title: "api.wanderer.moe", + description: "Public Zod OpenAPI documentation for wanderer.moe's API.", + license: { + name: "GNU General Public License v3.0", + url: "https://www.gnu.org/licenses/gpl-3.0.en.html", + }, + contact: { + url: "https://wanderer.moe", + name: "wanderer.moe", + }, + }, +} diff --git a/src/v2/db/migrations/0001_chubby_bullseye.sql b/src/v2/db/migrations/0001_chubby_bullseye.sql new file mode 100644 index 0000000..bf5a869 --- /dev/null +++ b/src/v2/db/migrations/0001_chubby_bullseye.sql @@ -0,0 +1,10 @@ +CREATE TABLE `authSession` ( + `id` text NOT NULL, + `active_expires` integer NOT NULL, + `idle_expires` integer NOT NULL, + `user_id` text NOT NULL, + FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE UNIQUE INDEX `authSession_id_unique` ON `authSession` (`id`);--> statement-breakpoint +CREATE INDEX `session_user_id_idx` ON `authSession` (`user_id`); \ No newline at end of file diff --git a/src/v2/db/migrations/meta/0001_snapshot.json b/src/v2/db/migrations/meta/0001_snapshot.json new file mode 100644 index 0000000..f25f3f0 --- /dev/null +++ b/src/v2/db/migrations/meta/0001_snapshot.json @@ -0,0 +1,1513 @@ +{ + "version": "5", + "dialect": "sqlite", + "id": "13c485ea-df78-47f3-a6da-768d4c96a686", + "prevId": "f07490ab-84e2-4512-9bfa-2535e05274b7", + "tables": { + "asset": { + "name": "asset", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "extension": { + "name": "extension", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "game": { + "name": "game", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_category": { + "name": "asset_category", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by": { + "name": "uploaded_by", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'pending'" + }, + "uploaded_date": { + "name": "uploaded_date", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_is_optimized": { + "name": "asset_is_optimized", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "asset_is_suggestive": { + "name": "asset_is_suggestive", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "view_count": { + "name": "view_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "download_count": { + "name": "download_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "file_size": { + "name": "file_size", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "width": { + "name": "width", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "height": { + "name": "height", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "assets_id_idx": { + "name": "assets_id_idx", + "columns": ["id"], + "isUnique": false + }, + "assets_name_idx": { + "name": "assets_name_idx", + "columns": ["name"], + "isUnique": false + }, + "assets_game_name_idx": { + "name": "assets_game_name_idx", + "columns": ["game"], + "isUnique": false + }, + "assets_asset_category_name_idx": { + "name": "assets_asset_category_name_idx", + "columns": ["asset_category"], + "isUnique": false + }, + "assets_uploaded_by_id_idx": { + "name": "assets_uploaded_by_id_idx", + "columns": ["uploaded_by"], + "isUnique": false + } + }, + "foreignKeys": { + "asset_game_game_id_fk": { + "name": "asset_game_game_id_fk", + "tableFrom": "asset", + "tableTo": "game", + "columnsFrom": ["game"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "asset_asset_category_assetCategory_id_fk": { + "name": "asset_asset_category_assetCategory_id_fk", + "tableFrom": "asset", + "tableTo": "assetCategory", + "columnsFrom": ["asset_category"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "asset_uploaded_by_authUser_id_fk": { + "name": "asset_uploaded_by_authUser_id_fk", + "tableFrom": "asset", + "tableTo": "authUser", + "columnsFrom": ["uploaded_by"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetCategory": { + "name": "assetCategory", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetCategory_id_unique": { + "name": "assetCategory_id_unique", + "columns": ["id"], + "isUnique": true + }, + "assetCategory_name_unique": { + "name": "assetCategory_name_unique", + "columns": ["name"], + "isUnique": true + }, + "asset_category_id_idx": { + "name": "asset_category_id_idx", + "columns": ["id"], + "isUnique": false + }, + "asset_category_name_idx": { + "name": "asset_category_name_idx", + "columns": ["name"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "gameAssetCategory": { + "name": "gameAssetCategory", + "columns": { + "game_id": { + "name": "game_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_category_id": { + "name": "asset_category_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "game_asset_category_game_id_idx": { + "name": "game_asset_category_game_id_idx", + "columns": ["game_id"], + "isUnique": false + }, + "game_asset_category_asset_category_id_idx": { + "name": "game_asset_category_asset_category_id_idx", + "columns": ["asset_category_id"], + "isUnique": false + } + }, + "foreignKeys": { + "gameAssetCategory_game_id_game_id_fk": { + "name": "gameAssetCategory_game_id_game_id_fk", + "tableFrom": "gameAssetCategory", + "tableTo": "game", + "columnsFrom": ["game_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "gameAssetCategory_asset_category_id_assetCategory_id_fk": { + "name": "gameAssetCategory_asset_category_id_assetCategory_id_fk", + "tableFrom": "gameAssetCategory", + "tableTo": "assetCategory", + "columnsFrom": ["asset_category_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetTag": { + "name": "assetTag", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetTag_id_unique": { + "name": "assetTag_id_unique", + "columns": ["id"], + "isUnique": true + }, + "assetTag_name_unique": { + "name": "assetTag_name_unique", + "columns": ["name"], + "isUnique": true + }, + "asset_tag_id_idx": { + "name": "asset_tag_id_idx", + "columns": ["id"], + "isUnique": false + }, + "asset_tag_name_idx": { + "name": "asset_tag_name_idx", + "columns": ["name"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetTagAsset": { + "name": "assetTagAsset", + "columns": { + "asset_tag_id": { + "name": "asset_tag_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "asset_tags_assets_asset_tag_id_idx": { + "name": "asset_tags_assets_asset_tag_id_idx", + "columns": ["asset_tag_id"], + "isUnique": false + }, + "asset_tags_assets_asset_id_idx": { + "name": "asset_tags_assets_asset_id_idx", + "columns": ["asset_id"], + "isUnique": false + } + }, + "foreignKeys": { + "assetTagAsset_asset_tag_id_assetTag_id_fk": { + "name": "assetTagAsset_asset_tag_id_assetTag_id_fk", + "tableFrom": "assetTagAsset", + "tableTo": "assetTag", + "columnsFrom": ["asset_tag_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "assetTagAsset_asset_id_asset_id_fk": { + "name": "assetTagAsset_asset_id_asset_id_fk", + "tableFrom": "assetTagAsset", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "atlas": { + "name": "atlas", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by": { + "name": "uploaded_by", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by_name": { + "name": "uploaded_by_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_date": { + "name": "uploaded_date", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "file_size": { + "name": "file_size", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "atlas_id_unique": { + "name": "atlas_id_unique", + "columns": ["id"], + "isUnique": true + }, + "atlas_id_idx": { + "name": "atlas_id_idx", + "columns": ["id"], + "isUnique": false + }, + "atlas_uploaded_by_idx": { + "name": "atlas_uploaded_by_idx", + "columns": ["uploaded_by"], + "isUnique": false + }, + "atlas_uploaded_by_name_idx": { + "name": "atlas_uploaded_by_name_idx", + "columns": ["uploaded_by_name"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "atlasToAsset": { + "name": "atlasToAsset", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "atlas_id": { + "name": "atlas_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "atlas_to_assets_id_idx": { + "name": "atlas_to_assets_id_idx", + "columns": ["id"], + "isUnique": false + }, + "atlas_to_assets_atlas_id_idx": { + "name": "atlas_to_assets_atlas_id_idx", + "columns": ["atlas_id"], + "isUnique": false + }, + "atlas_to_assets_asset_id_idx": { + "name": "atlas_to_assets_asset_id_idx", + "columns": ["asset_id"], + "isUnique": false + } + }, + "foreignKeys": { + "atlasToAsset_atlas_id_atlas_id_fk": { + "name": "atlasToAsset_atlas_id_atlas_id_fk", + "tableFrom": "atlasToAsset", + "tableTo": "atlas", + "columnsFrom": ["atlas_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "atlasToAsset_asset_id_asset_id_fk": { + "name": "atlasToAsset_asset_id_asset_id_fk", + "tableFrom": "atlasToAsset", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "game": { + "name": "game", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": 0 + }, + "possible_suggestive_content": { + "name": "possible_suggestive_content", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "game_id_unique": { + "name": "game_id_unique", + "columns": ["id"], + "isUnique": true + }, + "game_name_unique": { + "name": "game_name_unique", + "columns": ["name"], + "isUnique": true + }, + "game_id_idx": { + "name": "game_id_idx", + "columns": ["id"], + "isUnique": false + }, + "game_name_idx": { + "name": "game_name_idx", + "columns": ["name"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "savedOcGenerators": { + "name": "savedOcGenerators", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "game": { + "name": "game", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "date_created": { + "name": "date_created", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "saved_color_palette": { + "name": "saved_color_palette", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sakura_url": { + "name": "sakura_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "savedOcGenerators_id_unique": { + "name": "savedOcGenerators_id_unique", + "columns": ["id"], + "isUnique": true + }, + "saved_oc_generators_id_idx": { + "name": "saved_oc_generators_id_idx", + "columns": ["id"], + "isUnique": false + }, + "saved_oc_generators_user_id_idx": { + "name": "saved_oc_generators_user_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "savedOcGenerators_user_id_authUser_id_fk": { + "name": "savedOcGenerators_user_id_authUser_id_fk", + "tableFrom": "savedOcGenerators", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "authKey": { + "name": "authKey", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "hashed_password": { + "name": "hashed_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "authKey_id_unique": { + "name": "authKey_id_unique", + "columns": ["id"], + "isUnique": true + }, + "key_user_id_idx": { + "name": "key_user_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "authKey_user_id_authUser_id_fk": { + "name": "authKey_user_id_authUser_id_fk", + "tableFrom": "authKey", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "authUser": { + "name": "authUser", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "avatar_url": { + "name": "avatar_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "banner_url": { + "name": "banner_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "display_name": { + "name": "display_name", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "username_colour": { + "name": "username_colour", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "email_verified": { + "name": "email_verified", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "pronouns": { + "name": "pronouns", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "verified": { + "name": "verified", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "bio": { + "name": "bio", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'No bio set'" + }, + "date_joined": { + "name": "date_joined", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "role_flags": { + "name": "role_flags", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "is_contributor": { + "name": "is_contributor", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "self_assignable_role_flags": { + "name": "self_assignable_role_flags", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "authUser_id_unique": { + "name": "authUser_id_unique", + "columns": ["id"], + "isUnique": true + }, + "authUser_username_unique": { + "name": "authUser_username_unique", + "columns": ["username"], + "isUnique": true + }, + "user_id_idx": { + "name": "user_id_idx", + "columns": ["id"], + "isUnique": false + }, + "user_username_idx": { + "name": "user_username_idx", + "columns": ["username"], + "isUnique": false + }, + "user_email_idx": { + "name": "user_email_idx", + "columns": ["email"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "authSession": { + "name": "authSession", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "active_expires": { + "name": "active_expires", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "idle_expires": { + "name": "idle_expires", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "authSession_id_unique": { + "name": "authSession_id_unique", + "columns": ["id"], + "isUnique": true + }, + "session_user_id_idx": { + "name": "session_user_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "authSession_user_id_authUser_id_fk": { + "name": "authSession_user_id_authUser_id_fk", + "tableFrom": "authSession", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "emailVerificationToken": { + "name": "emailVerificationToken", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "emailVerificationToken_id_unique": { + "name": "emailVerificationToken_id_unique", + "columns": ["id"], + "isUnique": true + }, + "email_verification_token_user_id_idx": { + "name": "email_verification_token_user_id_idx", + "columns": ["user_id"], + "isUnique": false + }, + "email_verification_token_token_idx": { + "name": "email_verification_token_token_idx", + "columns": ["token"], + "isUnique": false + } + }, + "foreignKeys": { + "emailVerificationToken_user_id_authUser_id_fk": { + "name": "emailVerificationToken_user_id_authUser_id_fk", + "tableFrom": "emailVerificationToken", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "passwordResetToken": { + "name": "passwordResetToken", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "passwordResetToken_id_unique": { + "name": "passwordResetToken_id_unique", + "columns": ["id"], + "isUnique": true + }, + "password_reset_token_user_id_idx": { + "name": "password_reset_token_user_id_idx", + "columns": ["user_id"], + "isUnique": false + }, + "password_reset_token_token_idx": { + "name": "password_reset_token_token_idx", + "columns": ["token"], + "isUnique": false + } + }, + "foreignKeys": { + "passwordResetToken_user_id_authUser_id_fk": { + "name": "passwordResetToken_user_id_authUser_id_fk", + "tableFrom": "passwordResetToken", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userCollection": { + "name": "userCollection", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "date_created": { + "name": "date_created", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": { + "userCollection_id_unique": { + "name": "userCollection_id_unique", + "columns": ["id"], + "isUnique": true + }, + "collection_id_idx": { + "name": "collection_id_idx", + "columns": ["id"], + "isUnique": false + }, + "user_collection_id_idx": { + "name": "user_collection_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "userCollection_user_id_authUser_id_fk": { + "name": "userCollection_user_id_authUser_id_fk", + "tableFrom": "userCollection", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetCollectionAsset": { + "name": "assetCollectionAsset", + "columns": { + "collection_id": { + "name": "collection_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "date_added": { + "name": "date_added", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "collection_assets_collection_id_idx": { + "name": "collection_assets_collection_id_idx", + "columns": ["collection_id"], + "isUnique": false + }, + "collection_assets_asset_id_idx": { + "name": "collection_assets_asset_id_idx", + "columns": ["asset_id"], + "isUnique": false + } + }, + "foreignKeys": { + "assetCollectionAsset_collection_id_userCollection_id_fk": { + "name": "assetCollectionAsset_collection_id_userCollection_id_fk", + "tableFrom": "assetCollectionAsset", + "tableTo": "userCollection", + "columnsFrom": ["collection_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "assetCollectionAsset_asset_id_asset_id_fk": { + "name": "assetCollectionAsset_asset_id_asset_id_fk", + "tableFrom": "assetCollectionAsset", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "socialsConnection": { + "name": "socialsConnection", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "discord_id": { + "name": "discord_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "socialsConnection_id_unique": { + "name": "socialsConnection_id_unique", + "columns": ["id"], + "isUnique": true + }, + "socialsConnection_user_id_unique": { + "name": "socialsConnection_user_id_unique", + "columns": ["user_id"], + "isUnique": true + }, + "socials_connection_user_id_idx": { + "name": "socials_connection_user_id_idx", + "columns": ["user_id"], + "isUnique": false + }, + "socials_connection_discord_id_idx": { + "name": "socials_connection_discord_id_idx", + "columns": ["discord_id"], + "isUnique": false + } + }, + "foreignKeys": { + "socialsConnection_user_id_authUser_id_fk": { + "name": "socialsConnection_user_id_authUser_id_fk", + "tableFrom": "socialsConnection", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userFavorite": { + "name": "userFavorite", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": { + "userFavorite_id_unique": { + "name": "userFavorite_id_unique", + "columns": ["id"], + "isUnique": true + }, + "favorited_assets_id_idx": { + "name": "favorited_assets_id_idx", + "columns": ["id"], + "isUnique": false + }, + "favorited_assets_user_id_idx": { + "name": "favorited_assets_user_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "userFavorite_user_id_authUser_id_fk": { + "name": "userFavorite_user_id_authUser_id_fk", + "tableFrom": "userFavorite", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userFavoriteAsset": { + "name": "userFavoriteAsset", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "favorited_assets_id": { + "name": "favorited_assets_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "userFavoriteAsset_id_unique": { + "name": "userFavoriteAsset_id_unique", + "columns": ["id"], + "isUnique": true + }, + "favorited_assets_assets_id_idx": { + "name": "favorited_assets_assets_id_idx", + "columns": ["id"], + "isUnique": false + }, + "favorited_assets_assets_user_id_idx": { + "name": "favorited_assets_assets_user_id_idx", + "columns": ["favorited_assets_id"], + "isUnique": false + }, + "favorited_assets_assets_asset_id_idx": { + "name": "favorited_assets_assets_asset_id_idx", + "columns": ["asset_id"], + "isUnique": false + } + }, + "foreignKeys": { + "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk": { + "name": "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk", + "tableFrom": "userFavoriteAsset", + "tableTo": "userFavorite", + "columnsFrom": ["favorited_assets_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "userFavoriteAsset_asset_id_asset_id_fk": { + "name": "userFavoriteAsset_asset_id_asset_id_fk", + "tableFrom": "userFavoriteAsset", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userNetworking": { + "name": "userNetworking", + "columns": { + "followerId": { + "name": "followerId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "followingId": { + "name": "followingId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "userNetworking_follower_idx": { + "name": "userNetworking_follower_idx", + "columns": ["followerId"], + "isUnique": false + }, + "userNetworking_following_idx": { + "name": "userNetworking_following_idx", + "columns": ["followingId"], + "isUnique": false + } + }, + "foreignKeys": { + "userNetworking_followerId_authUser_id_fk": { + "name": "userNetworking_followerId_authUser_id_fk", + "tableFrom": "userNetworking", + "tableTo": "authUser", + "columnsFrom": ["followerId"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "userNetworking_followingId_authUser_id_fk": { + "name": "userNetworking_followingId_authUser_id_fk", + "tableFrom": "userNetworking", + "tableTo": "authUser", + "columnsFrom": ["followingId"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + } + }, + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + } +} diff --git a/src/v2/db/migrations/meta/_journal.json b/src/v2/db/migrations/meta/_journal.json index 2e17de0..9d10dfb 100644 --- a/src/v2/db/migrations/meta/_journal.json +++ b/src/v2/db/migrations/meta/_journal.json @@ -8,6 +8,13 @@ "when": 1700189550333, "tag": "0000_busy_dreaming_celestial", "breakpoints": true + }, + { + "idx": 1, + "version": "5", + "when": 1700935264170, + "tag": "0001_chubby_bullseye", + "breakpoints": true } ] } diff --git a/src/v2/db/schema/user/user.ts b/src/v2/db/schema/user/user.ts index 64df477..74d1d02 100644 --- a/src/v2/db/schema/user/user.ts +++ b/src/v2/db/schema/user/user.ts @@ -21,7 +21,6 @@ import { atlas } from "../asset/asset-atlas" NOTE: Very basic user information - Users table is user information - Keys table is login methods (i.e Credentials, OAuth, etc.) -- We handle sessions w/ Cloudflare KV instead of a sessions table */ export const authUser = sqliteTable( @@ -63,7 +62,7 @@ export const authUser = sqliteTable( export type User = typeof authUser.$inferSelect export type NewUser = typeof authUser.$inferInsert -export const keys = sqliteTable( +export const authKey = sqliteTable( tableNames.authKey, { id: text("id").unique().notNull(), @@ -82,8 +81,31 @@ export const keys = sqliteTable( } ) -export type Keys = typeof keys.$inferSelect -export type NewKeys = typeof keys.$inferInsert +export type Keys = typeof authKey.$inferSelect +export type NewKeys = typeof authKey.$inferInsert + +export const userSession = sqliteTable( + tableNames.authSession, + { + id: text("id").unique().notNull(), + activeExpires: integer("active_expires").notNull(), + idleExpires: integer("idle_expires").notNull(), + userId: text("user_id") + .notNull() + .references(() => authUser.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + }, + (session) => { + return { + userIdx: index("session_user_id_idx").on(session.userId), + } + } +) + +export type Session = typeof userSession.$inferSelect +export type NewSession = typeof userSession.$inferInsert export const usersRelations = relations(authUser, ({ one, many }) => ({ follower: many(userNetworking, { @@ -92,7 +114,8 @@ export const usersRelations = relations(authUser, ({ one, many }) => ({ following: many(userNetworking, { relationName: "following", }), - key: many(keys), + authKey: many(authKey), + userSession: many(userSession), asset: many(asset), atlas: many(atlas), userFavorite: one(userFavorite), @@ -103,10 +126,18 @@ export const usersRelations = relations(authUser, ({ one, many }) => ({ savedOcGenerators: many(savedOcGenerators), })) -export const keysRelations = relations(keys, ({ one }) => ({ +export const keysRelations = relations(authKey, ({ one }) => ({ user: one(authUser, { - fields: [keys.userId], + fields: [authKey.userId], references: [authUser.id], relationName: "key_auth_user", }), })) + +export const sessionRelations = relations(userSession, ({ one }) => ({ + user: one(authUser, { + fields: [userSession.userId], + references: [authUser.id], + relationName: "session_auth_user", + }), +})) diff --git a/src/v2/lib/auth/adapter/adapter.ts b/src/v2/lib/auth/adapter/adapter.ts new file mode 100644 index 0000000..dc8d3ef --- /dev/null +++ b/src/v2/lib/auth/adapter/adapter.ts @@ -0,0 +1,245 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +// TODO(dromzeh) +import type { + SessionSchema, + Adapter, + InitializeAdapter, + UserSchema, + KeySchema, +} from "lucia" +import type { Client, LibsqlError } from "@libsql/client" + +const createPreparedStatementHelper = ( + placeholder: (index: number) => string +) => { + const helper = ( + values: Record + ): readonly [ + fields: string[], + placeholders: string[], + arguments: any[], + ] => { + const keys = Object.keys(values) + return [ + keys.map((k) => escapeName(k)), + keys.map((_, i) => placeholder(i)), + keys.map((k) => values[k]), + ] as const + } + return helper +} + +export const escapeName = (val: string) => { + return `${ESCAPE_CHAR}${val}${ESCAPE_CHAR}` +} + +const ESCAPE_CHAR = "`" + +export const helper = createPreparedStatementHelper(() => "?") + +export const getSetArgs = (fields: string[], placeholders: string[]) => { + return fields + .map((field, i) => [field, placeholders[i]].join(" = ")) + .join(",") +} + +export const LuciaDBAdapter = ( + db: Client, + tables: { + user: string + session: string | null + key: string + } +): InitializeAdapter => { + const ESCAPED_USER_TABLE_NAME = escapeName(tables.user) + const ESCAPED_SESSION_TABLE_NAME = tables.session + ? escapeName(tables.session) + : null + const ESCAPED_KEY_TABLE_NAME = escapeName(tables.key) + + return (LuciaError) => { + return { + getUser: async (userId) => { + const result = await db.execute({ + sql: `SELECT * FROM ${ESCAPED_USER_TABLE_NAME} WHERE id = ?`, + args: [userId], + }) + const rows = result.rows as unknown[] as UserSchema[] + return rows.at(0) ?? null + }, + setUser: async (user, key) => { + const [userFields, userValues, userArgs] = helper(user) + const insertUserQuery = { + sql: `INSERT INTO ${ESCAPED_USER_TABLE_NAME} ( ${userFields} ) VALUES ( ${userValues} )`, + args: userArgs, + } + if (!key) { + await db.execute(insertUserQuery) + return + } + try { + const [keyFields, keyValues, keyArgs] = helper(key) + const insertKeyQuery = { + sql: `INSERT INTO ${ESCAPED_KEY_TABLE_NAME} ( ${keyFields} ) VALUES ( ${keyValues} )`, + args: keyArgs, + } + await db.batch([insertUserQuery, insertKeyQuery], "write") + } catch (e) { + const error = e as Partial + if ( + error.code === "SQLITE_CONSTRAINT_PRIMARYKEY" && + error.message?.includes(".id") + ) { + throw new LuciaError("AUTH_DUPLICATE_KEY_ID") + } + throw e + } + }, + deleteUser: async (userId) => { + await db.execute({ + sql: `DELETE FROM ${ESCAPED_USER_TABLE_NAME} WHERE id = ?`, + args: [userId], + }) + }, + updateUser: async (userId, partialUser) => { + const [fields, values, args] = helper(partialUser) + args.push(userId) + await db.execute({ + sql: `UPDATE ${ESCAPED_USER_TABLE_NAME} SET ${getSetArgs( + fields, + values + )} WHERE id = ?`, + args, + }) + }, + + getSession: async (sessionId) => { + if (!ESCAPED_SESSION_TABLE_NAME) { + throw new Error("Session table not defined") + } + const result = await db.execute({ + sql: `SELECT * FROM ${ESCAPED_SESSION_TABLE_NAME} WHERE id = ?`, + args: [sessionId], + }) + const rows = result.rows as unknown[] as SessionSchema[] + return rows.at(0) ?? null + }, + getSessionsByUserId: async (userId) => { + if (!ESCAPED_SESSION_TABLE_NAME) { + throw new Error("Session table not defined") + } + const result = await db.execute({ + sql: `SELECT * FROM ${ESCAPED_SESSION_TABLE_NAME} WHERE user_id = ?`, + args: [userId], + }) + return result.rows as unknown[] as SessionSchema[] + }, + setSession: async (session) => { + if (!ESCAPED_SESSION_TABLE_NAME) { + throw new Error("Session table not defined") + } + try { + const [fields, values, args] = helper(session) + await db.execute({ + sql: `INSERT INTO ${ESCAPED_SESSION_TABLE_NAME} ( ${fields} ) VALUES ( ${values} )`, + args, + }) + } catch (e) { + const error = e as Partial + if (error.code === "SQLITE_CONSTRAINT_FOREIGNKEY") { + throw new LuciaError("AUTH_INVALID_USER_ID") + } + throw e + } + }, + deleteSession: async (sessionId) => { + if (!ESCAPED_SESSION_TABLE_NAME) { + throw new Error("Session table not defined") + } + await db.execute({ + sql: `DELETE FROM ${ESCAPED_SESSION_TABLE_NAME} WHERE id = ?`, + args: [sessionId], + }) + }, + deleteSessionsByUserId: async (userId) => { + if (!ESCAPED_SESSION_TABLE_NAME) { + throw new Error("Session table not defined") + } + await db.execute({ + sql: `DELETE FROM ${ESCAPED_SESSION_TABLE_NAME} WHERE user_id = ?`, + args: [userId], + }) + }, + updateSession: async (sessionId, partialSession) => { + if (!ESCAPED_SESSION_TABLE_NAME) { + throw new Error("Session table not defined") + } + const [fields, values, args] = helper(partialSession) + const setArgs = getSetArgs(fields, values) + args.push(sessionId) + await db.execute({ + sql: `UPDATE ${ESCAPED_SESSION_TABLE_NAME} SET ${setArgs} WHERE id = ?`, + args, + }) + }, + + getKey: async (keyId) => { + const result = await db.execute({ + sql: `SELECT * FROM ${ESCAPED_KEY_TABLE_NAME} WHERE id = ?`, + args: [keyId], + }) + const rows = result.rows as unknown[] as KeySchema[] + return rows.at(0) ?? null + }, + getKeysByUserId: async (userId) => { + const result = await db.execute({ + sql: `SELECT * FROM ${ESCAPED_KEY_TABLE_NAME} WHERE user_id = ?`, + args: [userId], + }) + return result.rows as unknown[] as KeySchema[] + }, + setKey: async (key) => { + try { + const [fields, values, args] = helper(key) + await db.execute({ + sql: `INSERT INTO ${ESCAPED_KEY_TABLE_NAME} ( ${fields} ) VALUES ( ${values} )`, + args, + }) + } catch (e) { + const error = e as Partial + if (error.code === "SQLITE_CONSTRAINT_FOREIGNKEY") { + throw new LuciaError("AUTH_INVALID_USER_ID") + } + if ( + error.code === "SQLITE_CONSTRAINT_PRIMARYKEY" && + error.message?.includes(".id") + ) { + throw new LuciaError("AUTH_DUPLICATE_KEY_ID") + } + throw e + } + }, + deleteKey: async (keyId) => { + await db.execute({ + sql: `DELETE FROM ${ESCAPED_KEY_TABLE_NAME} WHERE id = ?`, + args: [keyId], + }) + }, + deleteKeysByUserId: async (userId) => { + await db.execute({ + sql: `DELETE FROM ${ESCAPED_KEY_TABLE_NAME} WHERE user_id = ?`, + args: [userId], + }) + }, + updateKey: async (keyId, partialKey) => { + const [fields, values, args] = helper(partialKey) + const setArgs = getSetArgs(fields, values) + args.push(keyId) + await db.execute({ + sql: `UPDATE ${ESCAPED_KEY_TABLE_NAME} SET ${setArgs} WHERE id = ?`, + args, + }) + }, + } + } +} diff --git a/src/v2/lib/auth/lucia.ts b/src/v2/lib/auth/lucia.ts index 8e50cb8..2898818 100644 --- a/src/v2/lib/auth/lucia.ts +++ b/src/v2/lib/auth/lucia.ts @@ -2,46 +2,22 @@ import { lucia } from "lucia" import { hono } from "lucia/middleware" import { getConnection } from "@/v2/db/turso" import { tableNames } from "@/v2/db/drizzle" -import { unstorage } from "@lucia-auth/adapter-session-unstorage" -import { libsql } from "@lucia-auth/adapter-sqlite" -import { createStorage } from "unstorage" -import cloudflareKVBindingDriver from "unstorage/drivers/cloudflare-kv-binding" +import { LuciaDBAdapter } from "./adapter/adapter" import { discord } from "@lucia-auth/oauth/providers" -/** - * Creates a KV session storage using the Cloudflare KV binding driver. - * @param {Bindings} env - Hono environment bindings. - * @returns The KV session storage. - * @see https://unstorage.unjs.io/drivers/cloudflare-kv-binding - */ -export function KVSessionStorage(env: Bindings) { - return createStorage({ - driver: cloudflareKVBindingDriver({ - binding: env.KV_SESSION_STORAGE, - }), - }) -} - /** The `auth` function is used to create a `lucia` instance with authentication middleware and a `libsql` adapter. * @param {Bindings} env - The environment variables used to configure the authentication middleware and adapter. * @returns A `lucia` instance with authentication middleware and a `libsql` adapter. */ export function auth(env: Bindings) { - const db = getConnection(env) - - const storage = KVSessionStorage(env) - // as lucia doesn't have a adapter for drizzle, we instead create a direct connection to the database using libsql - const connection = db.turso + const { turso } = getConnection(env) return lucia({ - adapter: { - user: libsql(connection, { - user: tableNames.authUser, - key: tableNames.authKey, - session: null, // we are handling sessions w/ CF KV - }), - session: unstorage(storage), - }, + adapter: LuciaDBAdapter(turso, { + user: tableNames.authUser, + key: tableNames.authKey, + session: tableNames.authSession, + }), middleware: hono(), // sessionExpiresIn: { // idlePeriod: 0, diff --git a/src/v2/lib/managers/asset/asset-manager.ts b/src/v2/lib/managers/asset/asset-manager.ts index 10472df..dedab3d 100644 --- a/src/v2/lib/managers/asset/asset-manager.ts +++ b/src/v2/lib/managers/asset/asset-manager.ts @@ -6,7 +6,7 @@ import { assetTagAsset, game, } from "@/v2/db/schema" -import { eq, or, like, sql, and, not, desc } from "drizzle-orm" +import { eq, or, sql, not } from "drizzle-orm" import { R2Bucket } from "@cloudflare/workers-types" import { SplitQueryByCommas } from "../../helpers/split-query-by-commas" import { z } from "zod" @@ -17,7 +17,7 @@ type AssetSearchQuery = { name?: string game?: string category?: string - tag?: string + tags?: string limit?: number } @@ -174,7 +174,7 @@ export class AssetManager { */ public async searchAssets(query: AssetSearchQuery) { try { - const { name, game, category, tag, limit } = query + const { name, game, category, limit, tags } = query const assetLimit = limit ?? 500 const gameList = game @@ -183,57 +183,49 @@ export class AssetManager { const categoryList = category ? SplitQueryByCommas(category.toLowerCase()) : null - const tagList = tag - ? SplitQueryByCommas(tag.toLowerCase()) - : ["official"] const searchQuery = name ?? null + const tagList = tags ? SplitQueryByCommas(tags.toLowerCase()) : null - const assetTagResponse = this.drizzle.$with("sq").as( - this.drizzle - .select({ - assetId: assetTagAsset.assetId, - tags: sql`array_agg(${assetTag})`.as( - "tags" - ), - }) - .from(assetTagAsset) - .leftJoin( - assetTag, - eq(assetTag.id, assetTagAsset.assetTagId) - ) - .where(or(...tagList.map((tag) => eq(assetTag.name, tag)))) - .groupBy(assetTagAsset.assetId) - ) - - // TODO(dromzeh): the incorrect type is occuring becuase of the inner join, idk how to fix it tbh + console.log(query) + console.log(categoryList, gameList, searchQuery) - return await this.drizzle - .with(assetTagResponse) - .select() - .from(asset) - .innerJoin( - assetTagResponse, - eq(assetTagResponse.assetId, asset.id) - ) - .where( + const assets = await this.drizzle.query.asset.findMany({ + where: (asset, { and, or, like, eq, sql }) => and( - searchQuery && like(asset.name, `%${searchQuery}%`), - gameList && - or( - ...gameList.map((game) => - eq(asset.assetCategoryId, game) - ) - ), - categoryList && - or( - ...categoryList.map((category) => - eq(asset.assetCategoryId, category) - ) - ) - ) - ) - .limit(assetLimit) - .orderBy(desc(asset.uploadedDate)) + tagList && tagList.length > 0 + ? // rawdog sql because i don't care anymore + or( + ...tagList.map( + (t) => + sql`EXISTS (SELECT 1 FROM assetTagAsset WHERE assetTagAsset.asset_id = ${asset.id} AND assetTagAsset.asset_tag_id = ${t})` + ) + ) + : undefined, + searchQuery + ? like(asset.name, `%${searchQuery}%`) + : undefined, + gameList + ? or(...gameList.map((g) => eq(asset.gameId, g))) + : undefined, + categoryList + ? or( + ...categoryList.map((c) => + eq(asset.assetCategoryId, c) + ) + ) + : undefined, + eq(asset.status, "approved") + ), + limit: assetLimit, + with: { + assetTagAsset: { + with: { + assetTag: true, + }, + }, + }, + }) + return assets } catch (e) { console.error("Error searching assets", e) throw new Error("Error searching assets") diff --git a/src/v2/routes/asset/handler.ts b/src/v2/routes/asset/handler.ts index 6c05719..edff221 100644 --- a/src/v2/routes/asset/handler.ts +++ b/src/v2/routes/asset/handler.ts @@ -1,8 +1,10 @@ import { OpenAPIHono } from "@hono/zod-openapi" import AssetGetRoute from "@/v2/routes/asset/get/handler" +import AssetSearchRoute from "@/v2/routes/asset/search/handler" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.route("/get", AssetGetRoute) +handler.route("/search", AssetSearchRoute) export default handler diff --git a/src/v2/routes/asset/search/all/openapi.ts b/src/v2/routes/asset/search/all/openapi.ts new file mode 100644 index 0000000..75fc11c --- /dev/null +++ b/src/v2/routes/asset/search/all/openapi.ts @@ -0,0 +1,19 @@ +import { createRoute } from "@hono/zod-openapi" +import { assetSearchAllFilterSchema } from "./schema" + +export const assetSearchAllFilterRoute = createRoute({ + path: "/", + method: "get", + description: "Filter all assets.", + request: { + query: assetSearchAllFilterSchema, + }, + responses: { + 200: { + description: "The asset was found.", + }, + 500: { + description: "Internal server error.", + }, + }, +}) diff --git a/src/v2/routes/asset/search/all/route.ts b/src/v2/routes/asset/search/all/route.ts index e69de29..910e0ec 100644 --- a/src/v2/routes/asset/search/all/route.ts +++ b/src/v2/routes/asset/search/all/route.ts @@ -0,0 +1,22 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { assetSearchAllFilterRoute } from "./openapi" +import { getConnection } from "@/v2/db/turso" +import { AssetManager } from "@/v2/lib/managers/asset/asset-manager" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.openapi(assetSearchAllFilterRoute, async (ctx) => { + const { drizzle } = await getConnection(ctx.env) + const assetManager = new AssetManager(drizzle) + const assets = await assetManager.searchAssets(ctx.req.valid("query")) + + return ctx.jsonT( + { + success: true, + assets, + }, + 200 + ) +}) + +export default handler diff --git a/src/v2/routes/asset/search/all/schema.ts b/src/v2/routes/asset/search/all/schema.ts new file mode 100644 index 0000000..f5e0e7f --- /dev/null +++ b/src/v2/routes/asset/search/all/schema.ts @@ -0,0 +1,38 @@ +import { z } from "@hono/zod-openapi" + +export const assetSearchAllFilterSchema = z + .object({ + name: z.string().openapi({ + param: { + name: "name", + in: "query", + required: false, + }, + description: "The Name of the asset to retrieve.", + }), + category: z.string().openapi({ + param: { + name: "category", + in: "query", + required: false, + }, + description: "The Category of the asset to retrieve.", + }), + game: z.string().openapi({ + param: { + name: "game", + in: "query", + required: false, + }, + description: "The Game of the asset to retrieve.", + }), + tags: z.string().openapi({ + param: { + name: "tags", + in: "query", + required: false, + }, + description: "The Tags of the asset to retrieve.", + }), + }) + .partial() diff --git a/src/v2/routes/asset/search/handler.ts b/src/v2/routes/asset/search/handler.ts new file mode 100644 index 0000000..f3a0832 --- /dev/null +++ b/src/v2/routes/asset/search/handler.ts @@ -0,0 +1,8 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import FilterAssetSearchAllRoute from "@/v2/routes/asset/search/all/route" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.route("/all", FilterAssetSearchAllRoute) + +export default handler diff --git a/src/worker-configuration.d.ts b/src/worker-configuration.d.ts index da45abc..780a661 100644 --- a/src/worker-configuration.d.ts +++ b/src/worker-configuration.d.ts @@ -5,7 +5,6 @@ declare global { type Bindings = { DISCORD_TOKEN: string FILES_BUCKET: R2Bucket - KV_SESSION_STORAGE: KVNamespace ENVIRONMENT: "PROD" | "DEV" VERY_SECRET_SIGNUP_KEY: string TURSO_DATABASE_URL: string @@ -17,18 +16,20 @@ declare global { } type Variables = { - // drizzle: import("@/v2/db/turso").DrizzleInstance - // turso: import("@/v2/db/turso").TursoInstance - // lucia: import("@/v2/lib/auth/lucia").Auth + // drizzle: import("@/v2/db/turso").DrizzleInstance + // turso: import("@/v2/db/turso").TursoInstance + // lucia: import("@/v2/lib/auth/lucia").Auth + } + + type Settings = { + Bindings: Bindings + Variables: Variables } /** * Provides access to the request context within routes that are separated into individual functions. */ - type APIContext = import("@hono/zod-openapi").Context<{ - Bindings: Bindings - Variables: Variables - }> + type APIContext = import("@hono/zod-openapi").Context } export default global From 6df505aeaf2ecb46c69b7b6c34db326e7eb31c6c Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Sat, 25 Nov 2023 20:36:52 +0000 Subject: [PATCH 166/318] update openapi specs & seed script --- src/scripts/seed/seed.ts | 73 +- src/swagger/theme/dark/SwaggerDark.css | 1780 ----------------- src/v2/lib/managers/asset/asset-manager.ts | 18 +- src/v2/routes/asset/get/id/[id]/openapi.ts | 1 + src/v2/routes/asset/get/id/[id]/schema.ts | 2 +- src/v2/routes/asset/search/all/openapi.ts | 1 + src/v2/routes/asset/search/all/schema.ts | 35 +- src/v2/routes/game/get/all/openapi.ts | 1 + src/v2/routes/game/get/id/[id]/openapi.ts | 1 + src/v2/routes/game/get/id/[id]/schema.ts | 3 +- src/v2/routes/game/get/name/[name]/openapi.ts | 1 + src/v2/routes/game/get/name/[name]/schema.ts | 3 +- src/v2/routes/handler.ts | 2 +- src/v2/routes/user/get/id/[id]/openapi.ts | 1 + src/v2/routes/user/get/id/[id]/schema.ts | 2 +- .../user/get/username/[username]/openapi.ts | 3 +- .../user/get/username/[username]/schema.ts | 2 +- .../search/username/[username]/openapi.ts | 1 + .../user/search/username/[username]/schema.ts | 2 +- 19 files changed, 121 insertions(+), 1811 deletions(-) delete mode 100644 src/swagger/theme/dark/SwaggerDark.css diff --git a/src/scripts/seed/seed.ts b/src/scripts/seed/seed.ts index 0d2c4f2..2f1f981 100644 --- a/src/scripts/seed/seed.ts +++ b/src/scripts/seed/seed.ts @@ -120,6 +120,13 @@ async function main() { assetCount: 1, lastUpdated: new Date().toISOString(), }, + { + id: "fanmade", + name: "fanmade", + formattedName: "Fanmade", + assetCount: 0, + lastUpdated: new Date().toISOString(), + }, ]) .returning() console.log(`[SEED] [assetTag] inserted ${newAssetTags.length} rows\n`) @@ -211,8 +218,8 @@ async function main() { viewCount: 1337, downloadCount: 1337, fileSize: 40213, - width: 1920, - height: 1080, + width: 512, + height: 512, }, { id: 2, @@ -242,9 +249,51 @@ async function main() { viewCount: 1337, downloadCount: 1337, fileSize: 40213, + width: 1080, + height: 1920, + }, + { + id: 4, + name: "test-asset-4", + extension: "image/png", + gameId: "genshin-impact", + assetCategoryId: "splash-art", + url: "/test/image.png", + status: "approved", + uploadedById: newUsers[1].id, + assetIsOptimized: true, + viewCount: 1337, + downloadCount: 1337, + fileSize: 40213, width: 1920, height: 1080, }, + { + id: 5, + name: "test-asset-5", + extension: "image/png", + gameId: "genshin-impact", + assetCategoryId: "splash-art", + url: "/test/image.png", + status: "approved", + uploadedById: newUsers[2].id, + assetIsOptimized: true, + viewCount: 1337, + downloadCount: 1337, + }, + { + id: 6, + name: "test-asset-6", + extension: "image/png", + gameId: "honkai-impact-3rd", + assetCategoryId: "character-sheets", + url: "/test/image.png", + status: "approved", + uploadedById: newUsers[2].id, + assetIsOptimized: true, + viewCount: 1337, + downloadCount: 1337, + }, ]) .returning() console.log(`[SEED] [asset] inserted ${newAssets.length} rows\n`) @@ -269,6 +318,26 @@ async function main() { assetId: newAssets[2].id, assetTagId: "official", }, + { + assetId: newAssets[2].id, + assetTagId: "1.0", + }, + { + assetId: newAssets[3].id, + assetTagId: "fanmade", + }, + { + assetId: newAssets[4].id, + assetTagId: "fanmade", + }, + { + assetId: newAssets[5].id, + assetTagId: "fanmade", + }, + { + assetId: newAssets[5].id, + assetTagId: "1.0", + }, ]) .returning() console.log( diff --git a/src/swagger/theme/dark/SwaggerDark.css b/src/swagger/theme/dark/SwaggerDark.css deleted file mode 100644 index f43f1d7..0000000 --- a/src/swagger/theme/dark/SwaggerDark.css +++ /dev/null @@ -1,1780 +0,0 @@ -@media only screen and (prefers-color-scheme: dark) { - a { - color: #8c8cfa; - } - - ::-webkit-scrollbar-track-piece { - background-color: rgba(255, 255, 255, 0.2) !important; - } - - ::-webkit-scrollbar-track { - background-color: rgba(255, 255, 255, 0.3) !important; - } - - ::-webkit-scrollbar-thumb { - background-color: rgba(255, 255, 255, 0.5) !important; - } - - embed[type="application/pdf"] { - filter: invert(90%); - } - - html { - background: #1f1f1f !important; - box-sizing: border-box; - filter: contrast(100%) brightness(100%) saturate(100%); - overflow-y: scroll; - } - - body { - background: #1f1f1f; - background-color: #1f1f1f; - background-image: none !important; - } - - button, - input, - select, - textarea { - background-color: #1f1f1f; - color: #bfbfbf; - } - - font, - html { - color: #bfbfbf; - } - - .swagger-ui, - .swagger-ui section h3 { - color: #b5bac9; - } - - .swagger-ui a { - background-color: transparent; - } - - .swagger-ui mark { - background-color: #664b00; - color: #bfbfbf; - } - - .swagger-ui legend { - color: inherit; - } - - .swagger-ui .debug * { - outline: #e6da99 solid 1px; - } - - .swagger-ui .debug-white * { - outline: #fff solid 1px; - } - - .swagger-ui .debug-black * { - outline: #bfbfbf solid 1px; - } - - .swagger-ui .debug-grid { - background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTRDOTY4N0U2N0VFMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTRDOTY4N0Q2N0VFMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3NjY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3NzY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsBS+GMAAAAjSURBVHjaYvz//z8DLsD4gcGXiYEAGBIKGBne//fFpwAgwAB98AaF2pjlUQAAAABJRU5ErkJggg==) - 0 0; - } - - .swagger-ui .debug-grid-16 { - background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODYyRjhERDU2N0YyMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODYyRjhERDQ2N0YyMTFFNjg2MzZDQjkwNkQ4MjgwMEIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3QTY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3QjY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvCS01IAAABMSURBVHjaYmR4/5+BFPBfAMFm/MBgx8RAGWCn1AAmSg34Q6kBDKMGMDCwICeMIemF/5QawEipAWwUhwEjMDvbAWlWkvVBwu8vQIABAEwBCph8U6c0AAAAAElFTkSuQmCC) - 0 0; - } - - .swagger-ui .debug-grid-8-solid { - background: url(data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAAAAD/4QMxaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjYtYzExMSA3OS4xNTgzMjUsIDIwMTUvMDkvMTAtMDE6MTA6MjAgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkIxMjI0OTczNjdCMzExRTZCMkJDRTI0MDgxMDAyMTcxIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkIxMjI0OTc0NjdCMzExRTZCMkJDRTI0MDgxMDAyMTcxIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QjEyMjQ5NzE2N0IzMTFFNkIyQkNFMjQwODEwMDIxNzEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QjEyMjQ5NzI2N0IzMTFFNkIyQkNFMjQwODEwMDIxNzEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7/7gAOQWRvYmUAZMAAAAAB/9sAhAAbGhopHSlBJiZBQi8vL0JHPz4+P0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHAR0pKTQmND8oKD9HPzU/R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0f/wAARCAAIAAgDASIAAhEBAxEB/8QAWQABAQAAAAAAAAAAAAAAAAAAAAYBAQEAAAAAAAAAAAAAAAAAAAIEEAEBAAMBAAAAAAAAAAAAAAABADECA0ERAAEDBQAAAAAAAAAAAAAAAAARITFBUWESIv/aAAwDAQACEQMRAD8AoOnTV1QTD7JJshP3vSM3P//Z) - 0 0 #1c1c21; - } - - .swagger-ui .debug-grid-16-solid { - background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzY3MkJEN0U2N0M1MTFFNkIyQkNFMjQwODEwMDIxNzEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzY3MkJEN0Y2N0M1MTFFNkIyQkNFMjQwODEwMDIxNzEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NjcyQkQ3QzY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NjcyQkQ3RDY3QzUxMUU2QjJCQ0UyNDA4MTAwMjE3MSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pve6J3kAAAAzSURBVHjaYvz//z8D0UDsMwMjSRoYP5Gq4SPNbRjVMEQ1fCRDg+in/6+J1AJUxsgAEGAA31BAJMS0GYEAAAAASUVORK5CYII=) - 0 0 #1c1c21; - } - - .swagger-ui .b--black { - border-color: #000; - } - - .swagger-ui .b--near-black { - border-color: #121212; - } - - .swagger-ui .b--dark-gray { - border-color: #333; - } - - .swagger-ui .b--mid-gray { - border-color: #545454; - } - - .swagger-ui .b--gray { - border-color: #787878; - } - - .swagger-ui .b--silver { - border-color: #999; - } - - .swagger-ui .b--light-silver { - border-color: #6e6e6e; - } - - .swagger-ui .b--moon-gray { - border-color: #4d4d4d; - } - - .swagger-ui .b--light-gray { - border-color: #2b2b2b; - } - - .swagger-ui .b--near-white { - border-color: #242424; - } - - .swagger-ui .b--white { - border-color: #1c1c21; - } - - .swagger-ui .b--white-90 { - border-color: rgba(28, 28, 33, 0.9); - } - - .swagger-ui .b--white-80 { - border-color: rgba(28, 28, 33, 0.8); - } - - .swagger-ui .b--white-70 { - border-color: rgba(28, 28, 33, 0.7); - } - - .swagger-ui .b--white-60 { - border-color: rgba(28, 28, 33, 0.6); - } - - .swagger-ui .b--white-50 { - border-color: rgba(28, 28, 33, 0.5); - } - - .swagger-ui .b--white-40 { - border-color: rgba(28, 28, 33, 0.4); - } - - .swagger-ui .b--white-30 { - border-color: rgba(28, 28, 33, 0.3); - } - - .swagger-ui .b--white-20 { - border-color: rgba(28, 28, 33, 0.2); - } - - .swagger-ui .b--white-10 { - border-color: rgba(28, 28, 33, 0.1); - } - - .swagger-ui .b--white-05 { - border-color: rgba(28, 28, 33, 0.05); - } - - .swagger-ui .b--white-025 { - border-color: rgba(28, 28, 33, 0.024); - } - - .swagger-ui .b--white-0125 { - border-color: rgba(28, 28, 33, 0.01); - } - - .swagger-ui .b--black-90 { - border-color: rgba(0, 0, 0, 0.9); - } - - .swagger-ui .b--black-80 { - border-color: rgba(0, 0, 0, 0.8); - } - - .swagger-ui .b--black-70 { - border-color: rgba(0, 0, 0, 0.7); - } - - .swagger-ui .b--black-60 { - border-color: rgba(0, 0, 0, 0.6); - } - - .swagger-ui .b--black-50 { - border-color: rgba(0, 0, 0, 0.5); - } - - .swagger-ui .b--black-40 { - border-color: rgba(0, 0, 0, 0.4); - } - - .swagger-ui .b--black-30 { - border-color: rgba(0, 0, 0, 0.3); - } - - .swagger-ui .b--black-20 { - border-color: rgba(0, 0, 0, 0.2); - } - - .swagger-ui .b--black-10 { - border-color: rgba(0, 0, 0, 0.1); - } - - .swagger-ui .b--black-05 { - border-color: rgba(0, 0, 0, 0.05); - } - - .swagger-ui .b--black-025 { - border-color: rgba(0, 0, 0, 0.024); - } - - .swagger-ui .b--black-0125 { - border-color: rgba(0, 0, 0, 0.01); - } - - .swagger-ui .b--dark-red { - border-color: #bc2f36; - } - - .swagger-ui .b--red { - border-color: #c83932; - } - - .swagger-ui .b--light-red { - border-color: #ab3c2b; - } - - .swagger-ui .b--orange { - border-color: #cc6e33; - } - - .swagger-ui .b--purple { - border-color: #5e2ca5; - } - - .swagger-ui .b--light-purple { - border-color: #672caf; - } - - .swagger-ui .b--dark-pink { - border-color: #ab2b81; - } - - .swagger-ui .b--hot-pink { - border-color: #c03086; - } - - .swagger-ui .b--pink { - border-color: #8f2464; - } - - .swagger-ui .b--light-pink { - border-color: #721d4d; - } - - .swagger-ui .b--dark-green { - border-color: #1c6e50; - } - - .swagger-ui .b--green { - border-color: #279b70; - } - - .swagger-ui .b--light-green { - border-color: #228762; - } - - .swagger-ui .b--navy { - border-color: #0d1d35; - } - - .swagger-ui .b--dark-blue { - border-color: #20497e; - } - - .swagger-ui .b--blue { - border-color: #4380d0; - } - - .swagger-ui .b--light-blue { - border-color: #20517e; - } - - .swagger-ui .b--lightest-blue { - border-color: #143a52; - } - - .swagger-ui .b--washed-blue { - border-color: #0c312d; - } - - .swagger-ui .b--washed-green { - border-color: #0f3d2c; - } - - .swagger-ui .b--washed-red { - border-color: #411010; - } - - .swagger-ui .b--transparent { - border-color: transparent; - } - - .swagger-ui .b--gold, - .swagger-ui .b--light-yellow, - .swagger-ui .b--washed-yellow, - .swagger-ui .b--yellow { - border-color: #664b00; - } - - .swagger-ui .shadow-1 { - box-shadow: rgba(0, 0, 0, 0.2) 0 0 4px 2px; - } - - .swagger-ui .shadow-2 { - box-shadow: rgba(0, 0, 0, 0.2) 0 0 8px 2px; - } - - .swagger-ui .shadow-3 { - box-shadow: rgba(0, 0, 0, 0.2) 2px 2px 4px 2px; - } - - .swagger-ui .shadow-4 { - box-shadow: rgba(0, 0, 0, 0.2) 2px 2px 8px 0; - } - - .swagger-ui .shadow-5 { - box-shadow: rgba(0, 0, 0, 0.2) 4px 4px 8px 0; - } - - @media screen and (min-width: 30em) { - .swagger-ui .shadow-1-ns { - box-shadow: rgba(0, 0, 0, 0.2) 0 0 4px 2px; - } - - .swagger-ui .shadow-2-ns { - box-shadow: rgba(0, 0, 0, 0.2) 0 0 8px 2px; - } - - .swagger-ui .shadow-3-ns { - box-shadow: rgba(0, 0, 0, 0.2) 2px 2px 4px 2px; - } - - .swagger-ui .shadow-4-ns { - box-shadow: rgba(0, 0, 0, 0.2) 2px 2px 8px 0; - } - - .swagger-ui .shadow-5-ns { - box-shadow: rgba(0, 0, 0, 0.2) 4px 4px 8px 0; - } - } - - @media screen and (max-width: 60em) and (min-width: 30em) { - .swagger-ui .shadow-1-m { - box-shadow: rgba(0, 0, 0, 0.2) 0 0 4px 2px; - } - - .swagger-ui .shadow-2-m { - box-shadow: rgba(0, 0, 0, 0.2) 0 0 8px 2px; - } - - .swagger-ui .shadow-3-m { - box-shadow: rgba(0, 0, 0, 0.2) 2px 2px 4px 2px; - } - - .swagger-ui .shadow-4-m { - box-shadow: rgba(0, 0, 0, 0.2) 2px 2px 8px 0; - } - - .swagger-ui .shadow-5-m { - box-shadow: rgba(0, 0, 0, 0.2) 4px 4px 8px 0; - } - } - - @media screen and (min-width: 60em) { - .swagger-ui .shadow-1-l { - box-shadow: rgba(0, 0, 0, 0.2) 0 0 4px 2px; - } - - .swagger-ui .shadow-2-l { - box-shadow: rgba(0, 0, 0, 0.2) 0 0 8px 2px; - } - - .swagger-ui .shadow-3-l { - box-shadow: rgba(0, 0, 0, 0.2) 2px 2px 4px 2px; - } - - .swagger-ui .shadow-4-l { - box-shadow: rgba(0, 0, 0, 0.2) 2px 2px 8px 0; - } - - .swagger-ui .shadow-5-l { - box-shadow: rgba(0, 0, 0, 0.2) 4px 4px 8px 0; - } - } - - .swagger-ui .black-05 { - color: rgba(191, 191, 191, 0.05); - } - - .swagger-ui .bg-black-05 { - background-color: rgba(0, 0, 0, 0.05); - } - - .swagger-ui .black-90, - .swagger-ui .hover-black-90:focus, - .swagger-ui .hover-black-90:hover { - color: rgba(191, 191, 191, 0.9); - } - - .swagger-ui .black-80, - .swagger-ui .hover-black-80:focus, - .swagger-ui .hover-black-80:hover { - color: rgba(191, 191, 191, 0.8); - } - - .swagger-ui .black-70, - .swagger-ui .hover-black-70:focus, - .swagger-ui .hover-black-70:hover { - color: rgba(191, 191, 191, 0.7); - } - - .swagger-ui .black-60, - .swagger-ui .hover-black-60:focus, - .swagger-ui .hover-black-60:hover { - color: rgba(191, 191, 191, 0.6); - } - - .swagger-ui .black-50, - .swagger-ui .hover-black-50:focus, - .swagger-ui .hover-black-50:hover { - color: rgba(191, 191, 191, 0.5); - } - - .swagger-ui .black-40, - .swagger-ui .hover-black-40:focus, - .swagger-ui .hover-black-40:hover { - color: rgba(191, 191, 191, 0.4); - } - - .swagger-ui .black-30, - .swagger-ui .hover-black-30:focus, - .swagger-ui .hover-black-30:hover { - color: rgba(191, 191, 191, 0.3); - } - - .swagger-ui .black-20, - .swagger-ui .hover-black-20:focus, - .swagger-ui .hover-black-20:hover { - color: rgba(191, 191, 191, 0.2); - } - - .swagger-ui .black-10, - .swagger-ui .hover-black-10:focus, - .swagger-ui .hover-black-10:hover { - color: rgba(191, 191, 191, 0.1); - } - - .swagger-ui .hover-white-90:focus, - .swagger-ui .hover-white-90:hover, - .swagger-ui .white-90 { - color: rgba(255, 255, 255, 0.9); - } - - .swagger-ui .hover-white-80:focus, - .swagger-ui .hover-white-80:hover, - .swagger-ui .white-80 { - color: rgba(255, 255, 255, 0.8); - } - - .swagger-ui .hover-white-70:focus, - .swagger-ui .hover-white-70:hover, - .swagger-ui .white-70 { - color: rgba(255, 255, 255, 0.7); - } - - .swagger-ui .hover-white-60:focus, - .swagger-ui .hover-white-60:hover, - .swagger-ui .white-60 { - color: rgba(255, 255, 255, 0.6); - } - - .swagger-ui .hover-white-50:focus, - .swagger-ui .hover-white-50:hover, - .swagger-ui .white-50 { - color: rgba(255, 255, 255, 0.5); - } - - .swagger-ui .hover-white-40:focus, - .swagger-ui .hover-white-40:hover, - .swagger-ui .white-40 { - color: rgba(255, 255, 255, 0.4); - } - - .swagger-ui .hover-white-30:focus, - .swagger-ui .hover-white-30:hover, - .swagger-ui .white-30 { - color: rgba(255, 255, 255, 0.3); - } - - .swagger-ui .hover-white-20:focus, - .swagger-ui .hover-white-20:hover, - .swagger-ui .white-20 { - color: rgba(255, 255, 255, 0.2); - } - - .swagger-ui .hover-white-10:focus, - .swagger-ui .hover-white-10:hover, - .swagger-ui .white-10 { - color: rgba(255, 255, 255, 0.1); - } - - .swagger-ui .hover-moon-gray:focus, - .swagger-ui .hover-moon-gray:hover, - .swagger-ui .moon-gray { - color: #ccc; - } - - .swagger-ui .hover-light-gray:focus, - .swagger-ui .hover-light-gray:hover, - .swagger-ui .light-gray { - color: #ededed; - } - - .swagger-ui .hover-near-white:focus, - .swagger-ui .hover-near-white:hover, - .swagger-ui .near-white { - color: #f5f5f5; - } - - .swagger-ui .dark-red, - .swagger-ui .hover-dark-red:focus, - .swagger-ui .hover-dark-red:hover { - color: #e6999d; - } - - .swagger-ui .hover-red:focus, - .swagger-ui .hover-red:hover, - .swagger-ui .red { - color: #e69d99; - } - - .swagger-ui .hover-light-red:focus, - .swagger-ui .hover-light-red:hover, - .swagger-ui .light-red { - color: #e6a399; - } - - .swagger-ui .hover-orange:focus, - .swagger-ui .hover-orange:hover, - .swagger-ui .orange { - color: #e6b699; - } - - .swagger-ui .gold, - .swagger-ui .hover-gold:focus, - .swagger-ui .hover-gold:hover { - color: #e6d099; - } - - .swagger-ui .hover-yellow:focus, - .swagger-ui .hover-yellow:hover, - .swagger-ui .yellow { - color: #e6da99; - } - - .swagger-ui .hover-light-yellow:focus, - .swagger-ui .hover-light-yellow:hover, - .swagger-ui .light-yellow { - color: #ede6b6; - } - - .swagger-ui .hover-purple:focus, - .swagger-ui .hover-purple:hover, - .swagger-ui .purple { - color: #b99ae4; - } - - .swagger-ui .hover-light-purple:focus, - .swagger-ui .hover-light-purple:hover, - .swagger-ui .light-purple { - color: #bb99e6; - } - - .swagger-ui .dark-pink, - .swagger-ui .hover-dark-pink:focus, - .swagger-ui .hover-dark-pink:hover { - color: #e699cc; - } - - .swagger-ui .hot-pink, - .swagger-ui .hover-hot-pink:focus, - .swagger-ui .hover-hot-pink:hover, - .swagger-ui .hover-pink:focus, - .swagger-ui .hover-pink:hover, - .swagger-ui .pink { - color: #e699c7; - } - - .swagger-ui .hover-light-pink:focus, - .swagger-ui .hover-light-pink:hover, - .swagger-ui .light-pink { - color: #edb6d5; - } - - .swagger-ui .dark-green, - .swagger-ui .green, - .swagger-ui .hover-dark-green:focus, - .swagger-ui .hover-dark-green:hover, - .swagger-ui .hover-green:focus, - .swagger-ui .hover-green:hover { - color: #99e6c9; - } - - .swagger-ui .hover-light-green:focus, - .swagger-ui .hover-light-green:hover, - .swagger-ui .light-green { - color: #a1e8ce; - } - - .swagger-ui .hover-navy:focus, - .swagger-ui .hover-navy:hover, - .swagger-ui .navy { - color: #99b8e6; - } - - .swagger-ui .blue, - .swagger-ui .dark-blue, - .swagger-ui .hover-blue:focus, - .swagger-ui .hover-blue:hover, - .swagger-ui .hover-dark-blue:focus, - .swagger-ui .hover-dark-blue:hover { - color: #99bae6; - } - - .swagger-ui .hover-light-blue:focus, - .swagger-ui .hover-light-blue:hover, - .swagger-ui .light-blue { - color: #a9cbea; - } - - .swagger-ui .hover-lightest-blue:focus, - .swagger-ui .hover-lightest-blue:hover, - .swagger-ui .lightest-blue { - color: #d6e9f5; - } - - .swagger-ui .hover-washed-blue:focus, - .swagger-ui .hover-washed-blue:hover, - .swagger-ui .washed-blue { - color: #f7fdfc; - } - - .swagger-ui .hover-washed-green:focus, - .swagger-ui .hover-washed-green:hover, - .swagger-ui .washed-green { - color: #ebfaf4; - } - - .swagger-ui .hover-washed-yellow:focus, - .swagger-ui .hover-washed-yellow:hover, - .swagger-ui .washed-yellow { - color: #fbf9ef; - } - - .swagger-ui .hover-washed-red:focus, - .swagger-ui .hover-washed-red:hover, - .swagger-ui .washed-red { - color: #f9e7e7; - } - - .swagger-ui .color-inherit, - .swagger-ui .hover-inherit:focus, - .swagger-ui .hover-inherit:hover { - color: inherit; - } - - .swagger-ui .bg-black-90, - .swagger-ui .hover-bg-black-90:focus, - .swagger-ui .hover-bg-black-90:hover { - background-color: rgba(0, 0, 0, 0.9); - } - - .swagger-ui .bg-black-80, - .swagger-ui .hover-bg-black-80:focus, - .swagger-ui .hover-bg-black-80:hover { - background-color: rgba(0, 0, 0, 0.8); - } - - .swagger-ui .bg-black-70, - .swagger-ui .hover-bg-black-70:focus, - .swagger-ui .hover-bg-black-70:hover { - background-color: rgba(0, 0, 0, 0.7); - } - - .swagger-ui .bg-black-60, - .swagger-ui .hover-bg-black-60:focus, - .swagger-ui .hover-bg-black-60:hover { - background-color: rgba(0, 0, 0, 0.6); - } - - .swagger-ui .bg-black-50, - .swagger-ui .hover-bg-black-50:focus, - .swagger-ui .hover-bg-black-50:hover { - background-color: rgba(0, 0, 0, 0.5); - } - - .swagger-ui .bg-black-40, - .swagger-ui .hover-bg-black-40:focus, - .swagger-ui .hover-bg-black-40:hover { - background-color: rgba(0, 0, 0, 0.4); - } - - .swagger-ui .bg-black-30, - .swagger-ui .hover-bg-black-30:focus, - .swagger-ui .hover-bg-black-30:hover { - background-color: rgba(0, 0, 0, 0.3); - } - - .swagger-ui .bg-black-20, - .swagger-ui .hover-bg-black-20:focus, - .swagger-ui .hover-bg-black-20:hover { - background-color: rgba(0, 0, 0, 0.2); - } - - .swagger-ui .bg-white-90, - .swagger-ui .hover-bg-white-90:focus, - .swagger-ui .hover-bg-white-90:hover { - background-color: rgba(28, 28, 33, 0.9); - } - - .swagger-ui .bg-white-80, - .swagger-ui .hover-bg-white-80:focus, - .swagger-ui .hover-bg-white-80:hover { - background-color: rgba(28, 28, 33, 0.8); - } - - .swagger-ui .bg-white-70, - .swagger-ui .hover-bg-white-70:focus, - .swagger-ui .hover-bg-white-70:hover { - background-color: rgba(28, 28, 33, 0.7); - } - - .swagger-ui .bg-white-60, - .swagger-ui .hover-bg-white-60:focus, - .swagger-ui .hover-bg-white-60:hover { - background-color: rgba(28, 28, 33, 0.6); - } - - .swagger-ui .bg-white-50, - .swagger-ui .hover-bg-white-50:focus, - .swagger-ui .hover-bg-white-50:hover { - background-color: rgba(28, 28, 33, 0.5); - } - - .swagger-ui .bg-white-40, - .swagger-ui .hover-bg-white-40:focus, - .swagger-ui .hover-bg-white-40:hover { - background-color: rgba(28, 28, 33, 0.4); - } - - .swagger-ui .bg-white-30, - .swagger-ui .hover-bg-white-30:focus, - .swagger-ui .hover-bg-white-30:hover { - background-color: rgba(28, 28, 33, 0.3); - } - - .swagger-ui .bg-white-20, - .swagger-ui .hover-bg-white-20:focus, - .swagger-ui .hover-bg-white-20:hover { - background-color: rgba(28, 28, 33, 0.2); - } - - .swagger-ui .bg-black, - .swagger-ui .hover-bg-black:focus, - .swagger-ui .hover-bg-black:hover { - background-color: #000; - } - - .swagger-ui .bg-near-black, - .swagger-ui .hover-bg-near-black:focus, - .swagger-ui .hover-bg-near-black:hover { - background-color: #121212; - } - - .swagger-ui .bg-dark-gray, - .swagger-ui .hover-bg-dark-gray:focus, - .swagger-ui .hover-bg-dark-gray:hover { - background-color: #333; - } - - .swagger-ui .bg-mid-gray, - .swagger-ui .hover-bg-mid-gray:focus, - .swagger-ui .hover-bg-mid-gray:hover { - background-color: #545454; - } - - .swagger-ui .bg-gray, - .swagger-ui .hover-bg-gray:focus, - .swagger-ui .hover-bg-gray:hover { - background-color: #787878; - } - - .swagger-ui .bg-silver, - .swagger-ui .hover-bg-silver:focus, - .swagger-ui .hover-bg-silver:hover { - background-color: #999; - } - - .swagger-ui .bg-white, - .swagger-ui .hover-bg-white:focus, - .swagger-ui .hover-bg-white:hover { - background-color: #1c1c21; - } - - .swagger-ui .bg-transparent, - .swagger-ui .hover-bg-transparent:focus, - .swagger-ui .hover-bg-transparent:hover { - background-color: transparent; - } - - .swagger-ui .bg-dark-red, - .swagger-ui .hover-bg-dark-red:focus, - .swagger-ui .hover-bg-dark-red:hover { - background-color: #bc2f36; - } - - .swagger-ui .bg-red, - .swagger-ui .hover-bg-red:focus, - .swagger-ui .hover-bg-red:hover { - background-color: #c83932; - } - - .swagger-ui .bg-light-red, - .swagger-ui .hover-bg-light-red:focus, - .swagger-ui .hover-bg-light-red:hover { - background-color: #ab3c2b; - } - - .swagger-ui .bg-orange, - .swagger-ui .hover-bg-orange:focus, - .swagger-ui .hover-bg-orange:hover { - background-color: #cc6e33; - } - - .swagger-ui .bg-gold, - .swagger-ui .bg-light-yellow, - .swagger-ui .bg-washed-yellow, - .swagger-ui .bg-yellow, - .swagger-ui .hover-bg-gold:focus, - .swagger-ui .hover-bg-gold:hover, - .swagger-ui .hover-bg-light-yellow:focus, - .swagger-ui .hover-bg-light-yellow:hover, - .swagger-ui .hover-bg-washed-yellow:focus, - .swagger-ui .hover-bg-washed-yellow:hover, - .swagger-ui .hover-bg-yellow:focus, - .swagger-ui .hover-bg-yellow:hover { - background-color: #664b00; - } - - .swagger-ui .bg-purple, - .swagger-ui .hover-bg-purple:focus, - .swagger-ui .hover-bg-purple:hover { - background-color: #5e2ca5; - } - - .swagger-ui .bg-light-purple, - .swagger-ui .hover-bg-light-purple:focus, - .swagger-ui .hover-bg-light-purple:hover { - background-color: #672caf; - } - - .swagger-ui .bg-dark-pink, - .swagger-ui .hover-bg-dark-pink:focus, - .swagger-ui .hover-bg-dark-pink:hover { - background-color: #ab2b81; - } - - .swagger-ui .bg-hot-pink, - .swagger-ui .hover-bg-hot-pink:focus, - .swagger-ui .hover-bg-hot-pink:hover { - background-color: #c03086; - } - - .swagger-ui .bg-pink, - .swagger-ui .hover-bg-pink:focus, - .swagger-ui .hover-bg-pink:hover { - background-color: #8f2464; - } - - .swagger-ui .bg-light-pink, - .swagger-ui .hover-bg-light-pink:focus, - .swagger-ui .hover-bg-light-pink:hover { - background-color: #721d4d; - } - - .swagger-ui .bg-dark-green, - .swagger-ui .hover-bg-dark-green:focus, - .swagger-ui .hover-bg-dark-green:hover { - background-color: #1c6e50; - } - - .swagger-ui .bg-green, - .swagger-ui .hover-bg-green:focus, - .swagger-ui .hover-bg-green:hover { - background-color: #279b70; - } - - .swagger-ui .bg-light-green, - .swagger-ui .hover-bg-light-green:focus, - .swagger-ui .hover-bg-light-green:hover { - background-color: #228762; - } - - .swagger-ui .bg-navy, - .swagger-ui .hover-bg-navy:focus, - .swagger-ui .hover-bg-navy:hover { - background-color: #0d1d35; - } - - .swagger-ui .bg-dark-blue, - .swagger-ui .hover-bg-dark-blue:focus, - .swagger-ui .hover-bg-dark-blue:hover { - background-color: #20497e; - } - - .swagger-ui .bg-blue, - .swagger-ui .hover-bg-blue:focus, - .swagger-ui .hover-bg-blue:hover { - background-color: #4380d0; - } - - .swagger-ui .bg-light-blue, - .swagger-ui .hover-bg-light-blue:focus, - .swagger-ui .hover-bg-light-blue:hover { - background-color: #20517e; - } - - .swagger-ui .bg-lightest-blue, - .swagger-ui .hover-bg-lightest-blue:focus, - .swagger-ui .hover-bg-lightest-blue:hover { - background-color: #143a52; - } - - .swagger-ui .bg-washed-blue, - .swagger-ui .hover-bg-washed-blue:focus, - .swagger-ui .hover-bg-washed-blue:hover { - background-color: #0c312d; - } - - .swagger-ui .bg-washed-green, - .swagger-ui .hover-bg-washed-green:focus, - .swagger-ui .hover-bg-washed-green:hover { - background-color: #0f3d2c; - } - - .swagger-ui .bg-washed-red, - .swagger-ui .hover-bg-washed-red:focus, - .swagger-ui .hover-bg-washed-red:hover { - background-color: #411010; - } - - .swagger-ui .bg-inherit, - .swagger-ui .hover-bg-inherit:focus, - .swagger-ui .hover-bg-inherit:hover { - background-color: inherit; - } - - .swagger-ui .shadow-hover { - transition: all 0.5s cubic-bezier(0.165, 0.84, 0.44, 1) 0s; - } - - .swagger-ui .shadow-hover::after { - border-radius: inherit; - box-shadow: rgba(0, 0, 0, 0.2) 0 0 16px 2px; - content: ""; - height: 100%; - left: 0; - opacity: 0; - position: absolute; - top: 0; - transition: opacity 0.5s cubic-bezier(0.165, 0.84, 0.44, 1) 0s; - width: 100%; - z-index: -1; - } - - .swagger-ui .bg-animate, - .swagger-ui .bg-animate:focus, - .swagger-ui .bg-animate:hover { - transition: background-color 0.15s ease-in-out 0s; - } - - .swagger-ui .nested-links a { - color: #99bae6; - transition: color 0.15s ease-in 0s; - } - - .swagger-ui .nested-links a:focus, - .swagger-ui .nested-links a:hover { - color: #a9cbea; - transition: color 0.15s ease-in 0s; - } - - .swagger-ui .opblock-tag { - border-bottom: 1px solid rgba(58, 64, 80, 0.3); - color: #b5bac9; - transition: all 0.2s ease 0s; - } - - .swagger-ui .opblock-tag svg, - .swagger-ui section.models h4 svg { - transition: all 0.4s ease 0s; - } - - .swagger-ui .opblock { - border: 1px solid #000; - border-radius: 4px; - box-shadow: rgba(0, 0, 0, 0.19) 0 0 3px; - margin: 0 0 15px; - } - - .swagger-ui .opblock .tab-header .tab-item.active h4 span::after { - background: gray; - } - - .swagger-ui .opblock.is-open .opblock-summary { - border-bottom: 1px solid #000; - } - - .swagger-ui .opblock .opblock-section-header { - background: rgba(28, 28, 33, 0.8); - box-shadow: rgba(0, 0, 0, 0.1) 0 1px 2px; - } - - .swagger-ui .opblock .opblock-section-header > label > span { - padding: 0 10px 0 0; - } - - .swagger-ui .opblock .opblock-summary-method { - background: #000; - color: #fff; - text-shadow: rgba(0, 0, 0, 0.1) 0 1px 0; - } - - .swagger-ui .opblock.opblock-post { - background: rgba(72, 203, 144, 0.1); - border-color: #48cb90; - } - - .swagger-ui .opblock.opblock-post .opblock-summary-method, - .swagger-ui - .opblock.opblock-post - .tab-header - .tab-item.active - h4 - span::after { - background: #48cb90; - } - - .swagger-ui .opblock.opblock-post .opblock-summary { - border-color: #48cb90; - } - - .swagger-ui .opblock.opblock-put { - background: rgba(213, 157, 88, 0.1); - border-color: #d59d58; - } - - .swagger-ui .opblock.opblock-put .opblock-summary-method, - .swagger-ui - .opblock.opblock-put - .tab-header - .tab-item.active - h4 - span::after { - background: #d59d58; - } - - .swagger-ui .opblock.opblock-put .opblock-summary { - border-color: #d59d58; - } - - .swagger-ui .opblock.opblock-delete { - background: rgba(200, 50, 50, 0.1); - border-color: #c83232; - } - - .swagger-ui .opblock.opblock-delete .opblock-summary-method, - .swagger-ui - .opblock.opblock-delete - .tab-header - .tab-item.active - h4 - span::after { - background: #c83232; - } - - .swagger-ui .opblock.opblock-delete .opblock-summary { - border-color: #c83232; - } - - .swagger-ui .opblock.opblock-get { - background: rgba(42, 105, 167, 0.1); - border-color: #2a69a7; - } - - .swagger-ui .opblock.opblock-get .opblock-summary-method, - .swagger-ui - .opblock.opblock-get - .tab-header - .tab-item.active - h4 - span::after { - background: #2a69a7; - } - - .swagger-ui .opblock.opblock-get .opblock-summary { - border-color: #2a69a7; - } - - .swagger-ui .opblock.opblock-patch { - background: rgba(92, 214, 188, 0.1); - border-color: #5cd6bc; - } - - .swagger-ui .opblock.opblock-patch .opblock-summary-method, - .swagger-ui - .opblock.opblock-patch - .tab-header - .tab-item.active - h4 - span::after { - background: #5cd6bc; - } - - .swagger-ui .opblock.opblock-patch .opblock-summary { - border-color: #5cd6bc; - } - - .swagger-ui .opblock.opblock-head { - background: rgba(140, 63, 207, 0.1); - border-color: #8c3fcf; - } - - .swagger-ui .opblock.opblock-head .opblock-summary-method, - .swagger-ui - .opblock.opblock-head - .tab-header - .tab-item.active - h4 - span::after { - background: #8c3fcf; - } - - .swagger-ui .opblock.opblock-head .opblock-summary { - border-color: #8c3fcf; - } - - .swagger-ui .opblock.opblock-options { - background: rgba(36, 89, 143, 0.1); - border-color: #24598f; - } - - .swagger-ui .opblock.opblock-options .opblock-summary-method, - .swagger-ui - .opblock.opblock-options - .tab-header - .tab-item.active - h4 - span::after { - background: #24598f; - } - - .swagger-ui .opblock.opblock-options .opblock-summary { - border-color: #24598f; - } - - .swagger-ui .opblock.opblock-deprecated { - background: rgba(46, 46, 46, 0.1); - border-color: #2e2e2e; - opacity: 0.6; - } - - .swagger-ui .opblock.opblock-deprecated .opblock-summary-method, - .swagger-ui - .opblock.opblock-deprecated - .tab-header - .tab-item.active - h4 - span::after { - background: #2e2e2e; - } - - .swagger-ui .opblock.opblock-deprecated .opblock-summary { - border-color: #2e2e2e; - } - - .swagger-ui .filter .operation-filter-input { - border: 2px solid #2b3446; - } - - .swagger-ui .tab li:first-of-type::after { - background: rgba(0, 0, 0, 0.2); - } - - .swagger-ui .download-contents { - background: #7c8192; - color: #fff; - } - - .swagger-ui .scheme-container { - background: #1c1c21; - box-shadow: rgba(0, 0, 0, 0.15) 0 1px 2px 0; - } - - .swagger-ui .loading-container .loading::before { - animation: - 1s linear 0s infinite normal none running rotation, - 0.5s ease 0s 1 normal none running opacity; - border-color: rgba(0, 0, 0, 0.6) rgba(84, 84, 84, 0.1) - rgba(84, 84, 84, 0.1); - } - - .swagger-ui .response-control-media-type--accept-controller select { - border-color: #196619; - } - - .swagger-ui .response-control-media-type__accept-message { - color: #99e699; - } - - .swagger-ui .version-pragma__message code { - background-color: #3b3b3b; - } - - .swagger-ui .btn { - background: 0 0; - border: 2px solid gray; - box-shadow: rgba(0, 0, 0, 0.1) 0 1px 2px; - color: #b5bac9; - } - - .swagger-ui .btn:hover { - box-shadow: rgba(0, 0, 0, 0.3) 0 0 5px; - } - - .swagger-ui .btn.authorize, - .swagger-ui .btn.cancel { - background-color: transparent; - border-color: #a72a2a; - color: #e69999; - } - - .swagger-ui .btn.cancel:hover { - background-color: #a72a2a; - color: #fff; - } - - .swagger-ui .btn.authorize { - border-color: #48cb90; - color: #9ce3c3; - } - - .swagger-ui .btn.authorize svg { - fill: #9ce3c3; - } - - .btn.authorize.unlocked:hover { - background-color: #48cb90; - color: #fff; - } - - .btn.authorize.unlocked:hover svg { - fill: #fbfbfb; - } - - .swagger-ui .btn.execute { - background-color: #5892d5; - border-color: #5892d5; - color: #fff; - } - - .swagger-ui .copy-to-clipboard { - background: #7c8192; - } - - .swagger-ui .copy-to-clipboard button { - background: url('data:image/svg+xml;charset=utf-8,') - 50% center no-repeat; - } - - .swagger-ui select { - background: url('data:image/svg+xml;charset=utf-8,') - right 10px center/20px no-repeat #212121; - background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMS4wICg0MDM1YTRmYjQ5LCAyMDIwLTA1LTAxKSIKICAgc29kaXBvZGk6ZG9jbmFtZT0iZG93bmxvYWQuc3ZnIgogICBpZD0ic3ZnNCIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMjAgMjAiPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTEwIj4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZGVmcwogICAgIGlkPSJkZWZzOCIgLz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnNCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIgogICAgIGlua3NjYXBlOndpbmRvdy15PSItOSIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iLTkiCiAgICAgaW5rc2NhcGU6Y3k9IjEwIgogICAgIGlua3NjYXBlOmN4PSIxMCIKICAgICBpbmtzY2FwZTp6b29tPSI0MS41IgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpZD0ibmFtZWR2aWV3NiIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSIxMDAxIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTkyMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBncmlkdG9sZXJhbmNlPSIxMCIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGJvcmRlcm9wYWNpdHk9IjEiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIiAvPgogIDxwYXRoCiAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZiIKICAgICBpZD0icGF0aDIiCiAgICAgZD0iTTEzLjQxOCA3Ljg1OWEuNjk1LjY5NSAwIDAxLjk3OCAwIC42OC42OCAwIDAxMCAuOTY5bC0zLjkwOCAzLjgzYS42OTcuNjk3IDAgMDEtLjk3OSAwbC0zLjkwOC0zLjgzYS42OC42OCAwIDAxMC0uOTY5LjY5NS42OTUgMCAwMS45NzggMEwxMCAxMWwzLjQxOC0zLjE0MXoiIC8+Cjwvc3ZnPgo=) - right 10px center/20px no-repeat #1c1c21; - border: 2px solid #41444e; - } - - .swagger-ui select[multiple] { - background: #212121; - } - - .swagger-ui button.invalid, - .swagger-ui input[type="email"].invalid, - .swagger-ui input[type="file"].invalid, - .swagger-ui input[type="password"].invalid, - .swagger-ui input[type="search"].invalid, - .swagger-ui input[type="text"].invalid, - .swagger-ui select.invalid, - .swagger-ui textarea.invalid { - background: #390e0e; - border-color: #c83232; - } - - .swagger-ui input[type="email"], - .swagger-ui input[type="file"], - .swagger-ui input[type="password"], - .swagger-ui input[type="search"], - .swagger-ui input[type="text"], - .swagger-ui textarea { - background: #1c1c21; - border: 1px solid #404040; - } - - .swagger-ui textarea { - background: rgba(28, 28, 33, 0.8); - color: #b5bac9; - } - - .swagger-ui input[disabled], - .swagger-ui select[disabled] { - background-color: #1f1f1f; - color: #bfbfbf; - } - - .swagger-ui textarea[disabled] { - background-color: #41444e; - color: #fff; - } - - .swagger-ui select[disabled] { - border-color: #878787; - } - - .swagger-ui textarea:focus { - border: 2px solid #2a69a7; - } - - .swagger-ui .checkbox input[type="checkbox"] + label > .item { - background: #303030; - box-shadow: #303030 0 0 0 2px; - } - - .swagger-ui .checkbox input[type="checkbox"]:checked + label > .item { - background: url('data:image/svg+xml;charset=utf-8,') - 50% center no-repeat #303030; - } - - .swagger-ui .dialog-ux .backdrop-ux { - background: rgba(0, 0, 0, 0.8); - } - - .swagger-ui .dialog-ux .modal-ux { - background: #1c1c21; - border: 1px solid #2e2e2e; - box-shadow: rgba(0, 0, 0, 0.2) 0 10px 30px 0; - } - - .swagger-ui .dialog-ux .modal-ux-header .close-modal { - background: 0 0; - } - - .swagger-ui .model .deprecated span, - .swagger-ui .model .deprecated td { - color: #bfbfbf !important; - } - - .swagger-ui .model-toggle::after { - background: url('data:image/svg+xml;charset=utf-8,') - 50% center/100% no-repeat; - } - - .swagger-ui .model-hint { - background: rgba(0, 0, 0, 0.7); - color: #ebebeb; - } - - .swagger-ui section.models { - border: 1px solid rgba(58, 64, 80, 0.3); - } - - .swagger-ui section.models.is-open h4 { - border-bottom: 1px solid rgba(58, 64, 80, 0.3); - } - - .swagger-ui section.models .model-container { - background: rgba(0, 0, 0, 0.05); - } - - .swagger-ui section.models .model-container:hover { - background: rgba(0, 0, 0, 0.07); - } - - .swagger-ui .model-box { - background: rgba(0, 0, 0, 0.1); - } - - .swagger-ui .prop-type { - color: #aaaad4; - } - - .swagger-ui table thead tr td, - .swagger-ui table thead tr th { - border-bottom: 1px solid rgba(58, 64, 80, 0.2); - color: #b5bac9; - } - - .swagger-ui .parameter__name.required::after { - color: rgba(230, 153, 153, 0.6); - } - - .swagger-ui .topbar .download-url-wrapper .select-label { - color: #f0f0f0; - } - - .swagger-ui .topbar .download-url-wrapper .download-url-button { - background: #63a040; - color: #fff; - } - - .swagger-ui .info .title small { - background: #7c8492; - } - - .swagger-ui .info .title small.version-stamp { - background-color: #7a9b27; - } - - .swagger-ui .auth-container .errors { - background-color: #350d0d; - color: #b5bac9; - } - - .swagger-ui .errors-wrapper { - background: rgba(200, 50, 50, 0.1); - border: 2px solid #c83232; - } - - .swagger-ui .markdown code, - .swagger-ui .renderedmarkdown code { - background: rgba(0, 0, 0, 0.05); - color: #c299e6; - } - - .swagger-ui .model-toggle:after { - background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMS4wICg0MDM1YTRmYjQ5LCAyMDIwLTA1LTAxKSIKICAgc29kaXBvZGk6ZG9jbmFtZT0iZG93bmxvYWQyLnN2ZyIKICAgaWQ9InN2ZzQiCiAgIHZlcnNpb249IjEuMSIKICAgaGVpZ2h0PSIyNCIKICAgd2lkdGg9IjI0Ij4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGExMCI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGRlZnMKICAgICBpZD0iZGVmczgiIC8+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9InN2ZzQiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iLTkiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9Ii05IgogICAgIGlua3NjYXBlOmN5PSIxMiIKICAgICBpbmtzY2FwZTpjeD0iMTIiCiAgICAgaW5rc2NhcGU6em9vbT0iMzQuNTgzMzMzIgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpZD0ibmFtZWR2aWV3NiIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSIxMDAxIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTkyMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBncmlkdG9sZXJhbmNlPSIxMCIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGJvcmRlcm9wYWNpdHk9IjEiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIiAvPgogIDxwYXRoCiAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZiIKICAgICBpZD0icGF0aDIiCiAgICAgZD0iTTEwIDZMOC41OSA3LjQxIDEzLjE3IDEybC00LjU4IDQuNTlMMTAgMThsNi02eiIgLz4KPC9zdmc+Cg==) - 50% no-repeat; - } - - /* arrows for each operation and request are now white */ - .arrow, - #large-arrow-up { - fill: #fff; - } - - #unlocked { - fill: #fff; - } - - ::-webkit-scrollbar-track { - background-color: #646464 !important; - } - - ::-webkit-scrollbar-thumb { - background-color: #242424 !important; - border: 2px solid #3e4346 !important; - } - - ::-webkit-scrollbar-button:vertical:start:decrement { - background: linear-gradient(130deg, #696969 40%, rgba(255, 0, 0, 0) 41%), - linear-gradient(230deg, #696969 40%, transparent 41%), - linear-gradient(0deg, #696969 40%, transparent 31%); - background-color: #b6b6b6; - } - - ::-webkit-scrollbar-button:vertical:end:increment { - background: linear-gradient(310deg, #696969 40%, transparent 41%), - linear-gradient(50deg, #696969 40%, transparent 41%), - linear-gradient(180deg, #696969 40%, transparent 31%); - background-color: #b6b6b6; - } - - ::-webkit-scrollbar-button:horizontal:end:increment { - background: linear-gradient(210deg, #696969 40%, transparent 41%), - linear-gradient(330deg, #696969 40%, transparent 41%), - linear-gradient(90deg, #696969 30%, transparent 31%); - background-color: #b6b6b6; - } - - ::-webkit-scrollbar-button:horizontal:start:decrement { - background: linear-gradient(30deg, #696969 40%, transparent 41%), - linear-gradient(150deg, #696969 40%, transparent 41%), - linear-gradient(270deg, #696969 30%, transparent 31%); - background-color: #b6b6b6; - } - - ::-webkit-scrollbar-button, - ::-webkit-scrollbar-track-piece { - background-color: #3e4346 !important; - } - - .swagger-ui .black, - .swagger-ui .checkbox, - .swagger-ui .dark-gray, - .swagger-ui .download-url-wrapper .loading, - .swagger-ui .errors-wrapper .errors small, - .swagger-ui .fallback, - .swagger-ui .filter .loading, - .swagger-ui .gray, - .swagger-ui .hover-black:focus, - .swagger-ui .hover-black:hover, - .swagger-ui .hover-dark-gray:focus, - .swagger-ui .hover-dark-gray:hover, - .swagger-ui .hover-gray:focus, - .swagger-ui .hover-gray:hover, - .swagger-ui .hover-light-silver:focus, - .swagger-ui .hover-light-silver:hover, - .swagger-ui .hover-mid-gray:focus, - .swagger-ui .hover-mid-gray:hover, - .swagger-ui .hover-near-black:focus, - .swagger-ui .hover-near-black:hover, - .swagger-ui .hover-silver:focus, - .swagger-ui .hover-silver:hover, - .swagger-ui .light-silver, - .swagger-ui .markdown pre, - .swagger-ui .mid-gray, - .swagger-ui .model .property, - .swagger-ui .model .property.primitive, - .swagger-ui .model-title, - .swagger-ui .near-black, - .swagger-ui .parameter__extension, - .swagger-ui .parameter__in, - .swagger-ui .prop-format, - .swagger-ui .renderedmarkdown pre, - .swagger-ui .response-col_links .response-undocumented, - .swagger-ui .response-col_status .response-undocumented, - .swagger-ui .silver, - .swagger-ui section.models h4, - .swagger-ui section.models h5, - .swagger-ui span.token-not-formatted, - .swagger-ui span.token-string, - .swagger-ui table.headers .header-example, - .swagger-ui table.model tr.description, - .swagger-ui table.model tr.extension { - color: #bfbfbf; - } - - .swagger-ui .hover-white:focus, - .swagger-ui .hover-white:hover, - .swagger-ui .info .title small pre, - .swagger-ui .topbar a, - .swagger-ui .white { - color: #fff; - } - - .swagger-ui .bg-black-10, - .swagger-ui .hover-bg-black-10:focus, - .swagger-ui .hover-bg-black-10:hover, - .swagger-ui .stripe-dark:nth-child(2n + 1) { - background-color: rgba(0, 0, 0, 0.1); - } - - .swagger-ui .bg-white-10, - .swagger-ui .hover-bg-white-10:focus, - .swagger-ui .hover-bg-white-10:hover, - .swagger-ui .stripe-light:nth-child(2n + 1) { - background-color: rgba(28, 28, 33, 0.1); - } - - .swagger-ui .bg-light-silver, - .swagger-ui .hover-bg-light-silver:focus, - .swagger-ui .hover-bg-light-silver:hover, - .swagger-ui .striped--light-silver:nth-child(2n + 1) { - background-color: #6e6e6e; - } - - .swagger-ui .bg-moon-gray, - .swagger-ui .hover-bg-moon-gray:focus, - .swagger-ui .hover-bg-moon-gray:hover, - .swagger-ui .striped--moon-gray:nth-child(2n + 1) { - background-color: #4d4d4d; - } - - .swagger-ui .bg-light-gray, - .swagger-ui .hover-bg-light-gray:focus, - .swagger-ui .hover-bg-light-gray:hover, - .swagger-ui .striped--light-gray:nth-child(2n + 1) { - background-color: #2b2b2b; - } - - .swagger-ui .bg-near-white, - .swagger-ui .hover-bg-near-white:focus, - .swagger-ui .hover-bg-near-white:hover, - .swagger-ui .striped--near-white:nth-child(2n + 1) { - background-color: #242424; - } - - .swagger-ui .opblock-tag:hover, - .swagger-ui section.models h4:hover { - background: rgba(0, 0, 0, 0.02); - } - - .swagger-ui .checkbox p, - .swagger-ui .dialog-ux .modal-ux-content h4, - .swagger-ui .dialog-ux .modal-ux-content p, - .swagger-ui .dialog-ux .modal-ux-header h3, - .swagger-ui .errors-wrapper .errors h4, - .swagger-ui .errors-wrapper hgroup h4, - .swagger-ui .info .base-url, - .swagger-ui .info .title, - .swagger-ui .info h1, - .swagger-ui .info h2, - .swagger-ui .info h3, - .swagger-ui .info h4, - .swagger-ui .info h5, - .swagger-ui .info li, - .swagger-ui .info p, - .swagger-ui .info table, - .swagger-ui .loading-container .loading::after, - .swagger-ui .model, - .swagger-ui .opblock .opblock-section-header h4, - .swagger-ui .opblock .opblock-section-header > label, - .swagger-ui .opblock .opblock-summary-description, - .swagger-ui .opblock .opblock-summary-operation-id, - .swagger-ui .opblock .opblock-summary-path, - .swagger-ui .opblock .opblock-summary-path__deprecated, - .swagger-ui .opblock-description-wrapper, - .swagger-ui .opblock-description-wrapper h4, - .swagger-ui .opblock-description-wrapper p, - .swagger-ui .opblock-external-docs-wrapper, - .swagger-ui .opblock-external-docs-wrapper h4, - .swagger-ui .opblock-external-docs-wrapper p, - .swagger-ui .opblock-tag small, - .swagger-ui .opblock-title_normal, - .swagger-ui .opblock-title_normal h4, - .swagger-ui .opblock-title_normal p, - .swagger-ui .parameter__name, - .swagger-ui .parameter__type, - .swagger-ui .response-col_links, - .swagger-ui .response-col_status, - .swagger-ui .responses-inner h4, - .swagger-ui .responses-inner h5, - .swagger-ui .scheme-container .schemes > label, - .swagger-ui .scopes h2, - .swagger-ui .servers > label, - .swagger-ui .tab li, - .swagger-ui label, - .swagger-ui select, - .swagger-ui table.headers td { - color: #b5bac9; - } - - .swagger-ui .download-url-wrapper .failed, - .swagger-ui .filter .failed, - .swagger-ui .model-deprecated-warning, - .swagger-ui .parameter__deprecated, - .swagger-ui .parameter__name.required span, - .swagger-ui table.model tr.property-row .star { - color: #e69999; - } - - .swagger-ui .opblock-body pre.microlight, - .swagger-ui textarea.curl { - background: #41444e; - border-radius: 4px; - color: #fff; - } - - .swagger-ui .expand-methods svg, - .swagger-ui .expand-methods:hover svg { - fill: #bfbfbf; - } - - .swagger-ui .auth-container, - .swagger-ui .dialog-ux .modal-ux-header { - border-bottom: 1px solid #2e2e2e; - } - - .swagger-ui .topbar .download-url-wrapper .select-label select, - .swagger-ui .topbar .download-url-wrapper input[type="text"] { - border: 2px solid #63a040; - } - - .swagger-ui .info a, - .swagger-ui .info a:hover, - .swagger-ui .scopes h2 a { - color: #99bde6; - } - - /* Dark Scrollbar */ - ::-webkit-scrollbar { - width: 14px; - height: 14px; - } - - ::-webkit-scrollbar-button { - background-color: #3e4346 !important; - } - - ::-webkit-scrollbar-track { - background-color: #646464 !important; - } - - ::-webkit-scrollbar-track-piece { - background-color: #3e4346 !important; - } - - ::-webkit-scrollbar-thumb { - height: 50px; - background-color: #242424 !important; - border: 2px solid #3e4346 !important; - } - - ::-webkit-scrollbar-corner { - } - - ::-webkit-resizer { - } - - ::-webkit-scrollbar-button:vertical:start:decrement { - background: linear-gradient(130deg, #696969 40%, rgba(255, 0, 0, 0) 41%), - linear-gradient(230deg, #696969 40%, rgba(0, 0, 0, 0) 41%), - linear-gradient(0deg, #696969 40%, rgba(0, 0, 0, 0) 31%); - background-color: #b6b6b6; - } - - ::-webkit-scrollbar-button:vertical:end:increment { - background: linear-gradient(310deg, #696969 40%, rgba(0, 0, 0, 0) 41%), - linear-gradient(50deg, #696969 40%, rgba(0, 0, 0, 0) 41%), - linear-gradient(180deg, #696969 40%, rgba(0, 0, 0, 0) 31%); - background-color: #b6b6b6; - } - - ::-webkit-scrollbar-button:horizontal:end:increment { - background: linear-gradient(210deg, #696969 40%, rgba(0, 0, 0, 0) 41%), - linear-gradient(330deg, #696969 40%, rgba(0, 0, 0, 0) 41%), - linear-gradient(90deg, #696969 30%, rgba(0, 0, 0, 0) 31%); - background-color: #b6b6b6; - } - - ::-webkit-scrollbar-button:horizontal:start:decrement { - background: linear-gradient(30deg, #696969 40%, rgba(0, 0, 0, 0) 41%), - linear-gradient(150deg, #696969 40%, rgba(0, 0, 0, 0) 41%), - linear-gradient(270deg, #696969 30%, rgba(0, 0, 0, 0) 31%); - background-color: #b6b6b6; - } -} diff --git a/src/v2/lib/managers/asset/asset-manager.ts b/src/v2/lib/managers/asset/asset-manager.ts index dedab3d..1efbe3c 100644 --- a/src/v2/lib/managers/asset/asset-manager.ts +++ b/src/v2/lib/managers/asset/asset-manager.ts @@ -11,15 +11,7 @@ import { R2Bucket } from "@cloudflare/workers-types" import { SplitQueryByCommas } from "../../helpers/split-query-by-commas" import { z } from "zod" import type { Asset, NewAsset } from "@/v2/db/schema" - -// these are all optional -type AssetSearchQuery = { - name?: string - game?: string - category?: string - tags?: string - limit?: number -} +import type { assetSearchAllFilter } from "@/v2/routes/asset/search/all/schema" const MAX_FILE_SIZE = 5000 const ACCEPTED_IMAGE_TYPES = ["image/png"] @@ -172,11 +164,10 @@ export class AssetManager { * @param query - An object containing optional search parameters. * @returns A promise that resolves to an array of matching assets. */ - public async searchAssets(query: AssetSearchQuery) { + public async searchAssets(query: assetSearchAllFilter) { try { - const { name, game, category, limit, tags } = query + const { name, game, category, tags, offset } = query - const assetLimit = limit ?? 500 const gameList = game ? SplitQueryByCommas(game.toLowerCase()) : null @@ -216,7 +207,8 @@ export class AssetManager { : undefined, eq(asset.status, "approved") ), - limit: assetLimit, + limit: 100, + offset: offset ? parseInt(offset) : 0, with: { assetTagAsset: { with: { diff --git a/src/v2/routes/asset/get/id/[id]/openapi.ts b/src/v2/routes/asset/get/id/[id]/openapi.ts index 569faa6..5dfb962 100644 --- a/src/v2/routes/asset/get/id/[id]/openapi.ts +++ b/src/v2/routes/asset/get/id/[id]/openapi.ts @@ -5,6 +5,7 @@ export const getAssetByIdRoute = createRoute({ path: "/{id}", method: "get", description: "Get an asset by their ID.", + tags: ["Asset"], request: { params: getAssetByIdSchema, }, diff --git a/src/v2/routes/asset/get/id/[id]/schema.ts b/src/v2/routes/asset/get/id/[id]/schema.ts index 20414d8..dcb5339 100644 --- a/src/v2/routes/asset/get/id/[id]/schema.ts +++ b/src/v2/routes/asset/get/id/[id]/schema.ts @@ -5,8 +5,8 @@ export const getAssetByIdSchema = z.object({ param: { name: "id", in: "path", + description: "The ID of the asset to retrieve.", required: true, }, - description: "The ID of the asset to retrieve.", }), }) diff --git a/src/v2/routes/asset/search/all/openapi.ts b/src/v2/routes/asset/search/all/openapi.ts index 75fc11c..d806454 100644 --- a/src/v2/routes/asset/search/all/openapi.ts +++ b/src/v2/routes/asset/search/all/openapi.ts @@ -5,6 +5,7 @@ export const assetSearchAllFilterRoute = createRoute({ path: "/", method: "get", description: "Filter all assets.", + tags: ["Asset"], request: { query: assetSearchAllFilterSchema, }, diff --git a/src/v2/routes/asset/search/all/schema.ts b/src/v2/routes/asset/search/all/schema.ts index f5e0e7f..28dfb02 100644 --- a/src/v2/routes/asset/search/all/schema.ts +++ b/src/v2/routes/asset/search/all/schema.ts @@ -4,35 +4,54 @@ export const assetSearchAllFilterSchema = z .object({ name: z.string().openapi({ param: { + description: + "The name of the asset(s) to retrieve. Doesn't have to be exact, uses 'like' operator to search.", name: "name", in: "query", + example: "keqing", required: false, }, - description: "The Name of the asset to retrieve.", }), - category: z.string().openapi({ + game: z.string().openapi({ param: { - name: "category", + description: + "The game id(s) of the asset(s) to retrieve. Comma seperated.", + name: "game", in: "query", + example: "genshin-impact,honkai-impact-3rd", required: false, }, - description: "The Category of the asset to retrieve.", }), - game: z.string().openapi({ + category: z.string().openapi({ param: { - name: "game", + description: + "The category id(s) of the asset(s) to retrieve. Comma seperated.", + name: "category", in: "query", + example: "character-sheets,splash-art", required: false, }, - description: "The Game of the asset to retrieve.", }), tags: z.string().openapi({ param: { + description: "The tag id(s) of the asset(s) to retrieve.", name: "tags", in: "query", + example: "official,fanmade", + required: false, + }, + }), + offset: z.string().openapi({ + param: { + description: + "The offset of the asset(s) to retrieve. For pagination / infinite scrolling.", + name: "offset", + example: "0", + in: "query", required: false, }, - description: "The Tags of the asset to retrieve.", }), }) .partial() + +export type assetSearchAllFilter = z.infer diff --git a/src/v2/routes/game/get/all/openapi.ts b/src/v2/routes/game/get/all/openapi.ts index 01e1d0a..f6e14c8 100644 --- a/src/v2/routes/game/get/all/openapi.ts +++ b/src/v2/routes/game/get/all/openapi.ts @@ -4,6 +4,7 @@ export const getAllGamesRoute = createRoute({ path: "/all", method: "get", description: "Get all games.", + tags: ["Game"], responses: { 200: { description: "All games.", diff --git a/src/v2/routes/game/get/id/[id]/openapi.ts b/src/v2/routes/game/get/id/[id]/openapi.ts index 8b15faf..b4208e4 100644 --- a/src/v2/routes/game/get/id/[id]/openapi.ts +++ b/src/v2/routes/game/get/id/[id]/openapi.ts @@ -5,6 +5,7 @@ export const getGameByIdRoute = createRoute({ path: "/{id}", method: "get", description: "Get a game by their ID.", + tags: ["Game"], request: { params: getGameByIdSchema, }, diff --git a/src/v2/routes/game/get/id/[id]/schema.ts b/src/v2/routes/game/get/id/[id]/schema.ts index 5d7e715..1f3558e 100644 --- a/src/v2/routes/game/get/id/[id]/schema.ts +++ b/src/v2/routes/game/get/id/[id]/schema.ts @@ -5,8 +5,9 @@ export const getGameByIdSchema = z.object({ param: { name: "id", in: "path", + description: "The ID of the game to retrieve.", + example: "genshin-impact", required: true, }, - description: "The ID of the game to retrieve.", }), }) diff --git a/src/v2/routes/game/get/name/[name]/openapi.ts b/src/v2/routes/game/get/name/[name]/openapi.ts index 434bc3c..19d8d2e 100644 --- a/src/v2/routes/game/get/name/[name]/openapi.ts +++ b/src/v2/routes/game/get/name/[name]/openapi.ts @@ -5,6 +5,7 @@ export const getGameByNameRoute = createRoute({ path: "/{name}", method: "get", description: "Search for games by their name.", + tags: ["Game"], request: { params: getGameByNameSchema, }, diff --git a/src/v2/routes/game/get/name/[name]/schema.ts b/src/v2/routes/game/get/name/[name]/schema.ts index 1de566b..3419efc 100644 --- a/src/v2/routes/game/get/name/[name]/schema.ts +++ b/src/v2/routes/game/get/name/[name]/schema.ts @@ -6,7 +6,8 @@ export const getGameByNameSchema = z.object({ name: "name", in: "path", required: true, + description: "The name of the game to retrieve.", + example: "genshin-impact", }, - description: "The name of the game to retrieve.", }), }) diff --git a/src/v2/routes/handler.ts b/src/v2/routes/handler.ts index dd049c1..59db4b2 100644 --- a/src/v2/routes/handler.ts +++ b/src/v2/routes/handler.ts @@ -5,8 +5,8 @@ import AssetRoute from "@/v2/routes/asset/handler" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() -handler.route("/user", UserRoute) handler.route("/game", GameRoute) handler.route("/asset", AssetRoute) +handler.route("/user", UserRoute) export default handler diff --git a/src/v2/routes/user/get/id/[id]/openapi.ts b/src/v2/routes/user/get/id/[id]/openapi.ts index 9719e21..84c8c9d 100644 --- a/src/v2/routes/user/get/id/[id]/openapi.ts +++ b/src/v2/routes/user/get/id/[id]/openapi.ts @@ -5,6 +5,7 @@ export const getUserByIdRoute = createRoute({ path: "/{id}", method: "get", description: "Get a user by their ID.", + tags: ["User"], request: { params: getUserByIdSchema, }, diff --git a/src/v2/routes/user/get/id/[id]/schema.ts b/src/v2/routes/user/get/id/[id]/schema.ts index f1059e2..ad1942e 100644 --- a/src/v2/routes/user/get/id/[id]/schema.ts +++ b/src/v2/routes/user/get/id/[id]/schema.ts @@ -6,7 +6,7 @@ export const getUserByIdSchema = z.object({ name: "id", in: "path", required: true, + description: "The ID of the user to retrieve.", }, - description: "The ID of the user to retrieve.", }), }) diff --git a/src/v2/routes/user/get/username/[username]/openapi.ts b/src/v2/routes/user/get/username/[username]/openapi.ts index 92a13cc..295ce4a 100644 --- a/src/v2/routes/user/get/username/[username]/openapi.ts +++ b/src/v2/routes/user/get/username/[username]/openapi.ts @@ -4,7 +4,8 @@ import { getUserByNameSchema } from "./schema" export const getUserByNameRoute = createRoute({ path: "/{username}", method: "get", - description: "Get a user by their username.", + description: "Get a user by their exact username.", + tags: ["User"], request: { params: getUserByNameSchema, }, diff --git a/src/v2/routes/user/get/username/[username]/schema.ts b/src/v2/routes/user/get/username/[username]/schema.ts index db065cf..f10a088 100644 --- a/src/v2/routes/user/get/username/[username]/schema.ts +++ b/src/v2/routes/user/get/username/[username]/schema.ts @@ -6,7 +6,7 @@ export const getUserByNameSchema = z.object({ name: "username", in: "path", required: true, + description: "The exact Username of the user to retrieve.", }, - description: "The Username of the user to retrieve.", }), }) diff --git a/src/v2/routes/user/search/username/[username]/openapi.ts b/src/v2/routes/user/search/username/[username]/openapi.ts index 132fbdc..69c4f73 100644 --- a/src/v2/routes/user/search/username/[username]/openapi.ts +++ b/src/v2/routes/user/search/username/[username]/openapi.ts @@ -5,6 +5,7 @@ export const searchUsersByUsernameRoute = createRoute({ path: "/{username}", method: "get", description: "Search for users by their username.", + tags: ["User"], request: { params: getUsersByNameSchema, }, diff --git a/src/v2/routes/user/search/username/[username]/schema.ts b/src/v2/routes/user/search/username/[username]/schema.ts index 4926f0e..d9bbefc 100644 --- a/src/v2/routes/user/search/username/[username]/schema.ts +++ b/src/v2/routes/user/search/username/[username]/schema.ts @@ -6,7 +6,7 @@ export const getUsersByNameSchema = z.object({ name: "username", in: "path", required: true, + description: "The username of the user(s) to retrieve.", }, - description: "The username of the user(s) to retrieve.", }), }) From 15ab11a3e02fb3e9f9dec380df5f94a6fd60c1b9 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Sun, 26 Nov 2023 16:24:48 +0000 Subject: [PATCH 167/318] www --- README.md | 2 +- src/v2/db/drizzle.ts | 2 + ...ing_celestial.sql => 0000_harsh_tarot.sql} | 40 +- src/v2/db/migrations/0001_chubby_bullseye.sql | 10 - src/v2/db/migrations/meta/0000_snapshot.json | 210 ++- src/v2/db/migrations/meta/0001_snapshot.json | 1513 ----------------- src/v2/db/migrations/meta/_journal.json | 11 +- src/v2/db/schema.ts | 2 + src/v2/db/schema/asset/asset-networking.ts | 56 + src/v2/db/schema/asset/asset.ts | 2 + .../schema/user/user-collection-networking.ts | 58 + src/v2/db/schema/user/user-collections.ts | 3 +- src/v2/db/schema/user/user.ts | 4 + src/v2/lib/managers/asset/asset-networking.ts | 58 + 14 files changed, 416 insertions(+), 1555 deletions(-) rename src/v2/db/migrations/{0000_busy_dreaming_celestial.sql => 0000_harsh_tarot.sql} (88%) delete mode 100644 src/v2/db/migrations/0001_chubby_bullseye.sql delete mode 100644 src/v2/db/migrations/meta/0001_snapshot.json create mode 100644 src/v2/db/schema/asset/asset-networking.ts create mode 100644 src/v2/db/schema/user/user-collection-networking.ts create mode 100644 src/v2/lib/managers/asset/asset-networking.ts diff --git a/README.md b/README.md index 859a799..d91b5bf 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ ![Quality] -Source code for the API powering [**wanderer.moe**](https://wanderer.moe) — using **Cloudflare Workers** and **Hono** with **R2 Storage** for the CDN, **Turso** and **Drizzle** for the Database and **KV** for session storage. +Source code for the API powering [**wanderer.moe**](https://wanderer.moe) — using **Cloudflare Workers** and **Hono** with **R2 Storage** for the CDN, **Turso** and **Drizzle**. diff --git a/src/v2/db/drizzle.ts b/src/v2/db/drizzle.ts index d6c526b..f45b023 100644 --- a/src/v2/db/drizzle.ts +++ b/src/v2/db/drizzle.ts @@ -5,6 +5,8 @@ export const tableNames = { authUser: "authUser", userNetworking: "userNetworking", gameAssetCategory: "gameAssetCategory", + assetNetworking: "assetNetworking", + userCollectionNetworking: "collectionNetworking", game: "game", atlas: "atlas", atlasToAsset: "atlasToAsset", diff --git a/src/v2/db/migrations/0000_busy_dreaming_celestial.sql b/src/v2/db/migrations/0000_harsh_tarot.sql similarity index 88% rename from src/v2/db/migrations/0000_busy_dreaming_celestial.sql rename to src/v2/db/migrations/0000_harsh_tarot.sql index 265d432..bd599da 100644 --- a/src/v2/db/migrations/0000_busy_dreaming_celestial.sql +++ b/src/v2/db/migrations/0000_harsh_tarot.sql @@ -67,6 +67,14 @@ CREATE TABLE `atlasToAsset` ( FOREIGN KEY (`asset_id`) REFERENCES `asset`(`id`) ON UPDATE cascade ON DELETE cascade ); --> statement-breakpoint +CREATE TABLE `assetNetworking` ( + `follower_id` text NOT NULL, + `following_id` text NOT NULL, + `created_at` text NOT NULL, + FOREIGN KEY (`follower_id`) REFERENCES `authUser`(`id`) ON UPDATE no action ON DELETE no action, + FOREIGN KEY (`following_id`) REFERENCES `authUser`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint CREATE TABLE `game` ( `id` text NOT NULL, `name` text NOT NULL, @@ -89,6 +97,13 @@ CREATE TABLE `savedOcGenerators` ( FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade ); --> statement-breakpoint +CREATE TABLE `authKey` ( + `id` text NOT NULL, + `user_id` text NOT NULL, + `hashed_password` text, + FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint CREATE TABLE `authUser` ( `id` text NOT NULL, `avatar_url` text, @@ -107,10 +122,11 @@ CREATE TABLE `authUser` ( `self_assignable_role_flags` integer DEFAULT 0 NOT NULL ); --> statement-breakpoint -CREATE TABLE `authKey` ( +CREATE TABLE `authSession` ( `id` text NOT NULL, + `active_expires` integer NOT NULL, + `idle_expires` integer NOT NULL, `user_id` text NOT NULL, - `hashed_password` text, FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade ); --> statement-breakpoint @@ -178,6 +194,14 @@ CREATE TABLE `userNetworking` ( FOREIGN KEY (`followingId`) REFERENCES `authUser`(`id`) ON UPDATE no action ON DELETE no action ); --> statement-breakpoint +CREATE TABLE `collectionNetworking` ( + `collection_id` text NOT NULL, + `liked_by_id` text NOT NULL, + `createdAt` text NOT NULL, + FOREIGN KEY (`collection_id`) REFERENCES `userCollection`(`id`) ON UPDATE no action ON DELETE no action, + FOREIGN KEY (`liked_by_id`) REFERENCES `authUser`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint CREATE INDEX `assets_id_idx` ON `asset` (`id`);--> statement-breakpoint CREATE INDEX `assets_name_idx` ON `asset` (`name`);--> statement-breakpoint CREATE INDEX `assets_game_name_idx` ON `asset` (`game`);--> statement-breakpoint @@ -202,6 +226,8 @@ CREATE INDEX `atlas_uploaded_by_name_idx` ON `atlas` (`uploaded_by_name`);--> st CREATE INDEX `atlas_to_assets_id_idx` ON `atlasToAsset` (`id`);--> statement-breakpoint CREATE INDEX `atlas_to_assets_atlas_id_idx` ON `atlasToAsset` (`atlas_id`);--> statement-breakpoint CREATE INDEX `atlas_to_assets_asset_id_idx` ON `atlasToAsset` (`asset_id`);--> statement-breakpoint +CREATE INDEX `assetNetworking_likedAsset_idx` ON `assetNetworking` (`follower_id`);--> statement-breakpoint +CREATE INDEX `assetNetworking_likedBy_idx` ON `assetNetworking` (`following_id`);--> statement-breakpoint CREATE UNIQUE INDEX `game_id_unique` ON `game` (`id`);--> statement-breakpoint CREATE UNIQUE INDEX `game_name_unique` ON `game` (`name`);--> statement-breakpoint CREATE INDEX `game_id_idx` ON `game` (`id`);--> statement-breakpoint @@ -209,13 +235,15 @@ CREATE INDEX `game_name_idx` ON `game` (`name`);--> statement-breakpoint CREATE UNIQUE INDEX `savedOcGenerators_id_unique` ON `savedOcGenerators` (`id`);--> statement-breakpoint CREATE INDEX `saved_oc_generators_id_idx` ON `savedOcGenerators` (`id`);--> statement-breakpoint CREATE INDEX `saved_oc_generators_user_id_idx` ON `savedOcGenerators` (`user_id`);--> statement-breakpoint +CREATE UNIQUE INDEX `authKey_id_unique` ON `authKey` (`id`);--> statement-breakpoint +CREATE INDEX `key_user_id_idx` ON `authKey` (`user_id`);--> statement-breakpoint CREATE UNIQUE INDEX `authUser_id_unique` ON `authUser` (`id`);--> statement-breakpoint CREATE UNIQUE INDEX `authUser_username_unique` ON `authUser` (`username`);--> statement-breakpoint CREATE INDEX `user_id_idx` ON `authUser` (`id`);--> statement-breakpoint CREATE INDEX `user_username_idx` ON `authUser` (`username`);--> statement-breakpoint CREATE INDEX `user_email_idx` ON `authUser` (`email`);--> statement-breakpoint -CREATE UNIQUE INDEX `authKey_id_unique` ON `authKey` (`id`);--> statement-breakpoint -CREATE INDEX `key_user_id_idx` ON `authKey` (`user_id`);--> statement-breakpoint +CREATE UNIQUE INDEX `authSession_id_unique` ON `authSession` (`id`);--> statement-breakpoint +CREATE INDEX `session_user_id_idx` ON `authSession` (`user_id`);--> statement-breakpoint CREATE UNIQUE INDEX `emailVerificationToken_id_unique` ON `emailVerificationToken` (`id`);--> statement-breakpoint CREATE INDEX `email_verification_token_user_id_idx` ON `emailVerificationToken` (`user_id`);--> statement-breakpoint CREATE INDEX `email_verification_token_token_idx` ON `emailVerificationToken` (`token`);--> statement-breakpoint @@ -239,4 +267,6 @@ CREATE INDEX `favorited_assets_assets_id_idx` ON `userFavoriteAsset` (`id`);--> CREATE INDEX `favorited_assets_assets_user_id_idx` ON `userFavoriteAsset` (`favorited_assets_id`);--> statement-breakpoint CREATE INDEX `favorited_assets_assets_asset_id_idx` ON `userFavoriteAsset` (`asset_id`);--> statement-breakpoint CREATE INDEX `userNetworking_follower_idx` ON `userNetworking` (`followerId`);--> statement-breakpoint -CREATE INDEX `userNetworking_following_idx` ON `userNetworking` (`followingId`); \ No newline at end of file +CREATE INDEX `userNetworking_following_idx` ON `userNetworking` (`followingId`);--> statement-breakpoint +CREATE INDEX `userCollectionNetworking_collection_idx` ON `collectionNetworking` (`collection_id`);--> statement-breakpoint +CREATE INDEX `userCollectionNetworking_likedBy_idx` ON `collectionNetworking` (`liked_by_id`); \ No newline at end of file diff --git a/src/v2/db/migrations/0001_chubby_bullseye.sql b/src/v2/db/migrations/0001_chubby_bullseye.sql deleted file mode 100644 index bf5a869..0000000 --- a/src/v2/db/migrations/0001_chubby_bullseye.sql +++ /dev/null @@ -1,10 +0,0 @@ -CREATE TABLE `authSession` ( - `id` text NOT NULL, - `active_expires` integer NOT NULL, - `idle_expires` integer NOT NULL, - `user_id` text NOT NULL, - FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade -); ---> statement-breakpoint -CREATE UNIQUE INDEX `authSession_id_unique` ON `authSession` (`id`);--> statement-breakpoint -CREATE INDEX `session_user_id_idx` ON `authSession` (`user_id`); \ No newline at end of file diff --git a/src/v2/db/migrations/meta/0000_snapshot.json b/src/v2/db/migrations/meta/0000_snapshot.json index 2736883..8388551 100644 --- a/src/v2/db/migrations/meta/0000_snapshot.json +++ b/src/v2/db/migrations/meta/0000_snapshot.json @@ -1,7 +1,7 @@ { "version": "5", "dialect": "sqlite", - "id": "f07490ab-84e2-4512-9bfa-2535e05274b7", + "id": "a76d59ea-41c0-4e99-9480-f203e245fbff", "prevId": "00000000-0000-0000-0000-000000000000", "tables": { "asset": { @@ -563,6 +563,66 @@ "compositePrimaryKeys": {}, "uniqueConstraints": {} }, + "assetNetworking": { + "name": "assetNetworking", + "columns": { + "follower_id": { + "name": "follower_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "following_id": { + "name": "following_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetNetworking_likedAsset_idx": { + "name": "assetNetworking_likedAsset_idx", + "columns": ["follower_id"], + "isUnique": false + }, + "assetNetworking_likedBy_idx": { + "name": "assetNetworking_likedBy_idx", + "columns": ["following_id"], + "isUnique": false + } + }, + "foreignKeys": { + "assetNetworking_follower_id_authUser_id_fk": { + "name": "assetNetworking_follower_id_authUser_id_fk", + "tableFrom": "assetNetworking", + "tableTo": "authUser", + "columnsFrom": ["follower_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "assetNetworking_following_id_authUser_id_fk": { + "name": "assetNetworking_following_id_authUser_id_fk", + "tableFrom": "assetNetworking", + "tableTo": "authUser", + "columnsFrom": ["following_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, "game": { "name": "game", "columns": { @@ -736,6 +796,57 @@ "compositePrimaryKeys": {}, "uniqueConstraints": {} }, + "authKey": { + "name": "authKey", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "hashed_password": { + "name": "hashed_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "authKey_id_unique": { + "name": "authKey_id_unique", + "columns": ["id"], + "isUnique": true + }, + "key_user_id_idx": { + "name": "key_user_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "authKey_user_id_authUser_id_fk": { + "name": "authKey_user_id_authUser_id_fk", + "tableFrom": "authKey", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, "authUser": { "name": "authUser", "columns": { @@ -882,8 +993,8 @@ "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "authKey": { - "name": "authKey", + "authSession": { + "name": "authSession", "columns": { "id": { "name": "id", @@ -892,37 +1003,44 @@ "notNull": true, "autoincrement": false }, - "user_id": { - "name": "user_id", - "type": "text", + "active_expires": { + "name": "active_expires", + "type": "integer", "primaryKey": false, "notNull": true, "autoincrement": false }, - "hashed_password": { - "name": "hashed_password", + "idle_expires": { + "name": "idle_expires", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", "type": "text", "primaryKey": false, - "notNull": false, + "notNull": true, "autoincrement": false } }, "indexes": { - "authKey_id_unique": { - "name": "authKey_id_unique", + "authSession_id_unique": { + "name": "authSession_id_unique", "columns": ["id"], "isUnique": true }, - "key_user_id_idx": { - "name": "key_user_id_idx", + "session_user_id_idx": { + "name": "session_user_id_idx", "columns": ["user_id"], "isUnique": false } }, "foreignKeys": { - "authKey_user_id_authUser_id_fk": { - "name": "authKey_user_id_authUser_id_fk", - "tableFrom": "authKey", + "authSession_user_id_authUser_id_fk": { + "name": "authSession_user_id_authUser_id_fk", + "tableFrom": "authSession", "tableTo": "authUser", "columnsFrom": ["user_id"], "columnsTo": ["id"], @@ -1444,6 +1562,66 @@ }, "compositePrimaryKeys": {}, "uniqueConstraints": {} + }, + "collectionNetworking": { + "name": "collectionNetworking", + "columns": { + "collection_id": { + "name": "collection_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "userCollectionNetworking_collection_idx": { + "name": "userCollectionNetworking_collection_idx", + "columns": ["collection_id"], + "isUnique": false + }, + "userCollectionNetworking_likedBy_idx": { + "name": "userCollectionNetworking_likedBy_idx", + "columns": ["liked_by_id"], + "isUnique": false + } + }, + "foreignKeys": { + "collectionNetworking_collection_id_userCollection_id_fk": { + "name": "collectionNetworking_collection_id_userCollection_id_fk", + "tableFrom": "collectionNetworking", + "tableTo": "userCollection", + "columnsFrom": ["collection_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "collectionNetworking_liked_by_id_authUser_id_fk": { + "name": "collectionNetworking_liked_by_id_authUser_id_fk", + "tableFrom": "collectionNetworking", + "tableTo": "authUser", + "columnsFrom": ["liked_by_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} } }, "enums": {}, diff --git a/src/v2/db/migrations/meta/0001_snapshot.json b/src/v2/db/migrations/meta/0001_snapshot.json deleted file mode 100644 index f25f3f0..0000000 --- a/src/v2/db/migrations/meta/0001_snapshot.json +++ /dev/null @@ -1,1513 +0,0 @@ -{ - "version": "5", - "dialect": "sqlite", - "id": "13c485ea-df78-47f3-a6da-768d4c96a686", - "prevId": "f07490ab-84e2-4512-9bfa-2535e05274b7", - "tables": { - "asset": { - "name": "asset", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "extension": { - "name": "extension", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "game": { - "name": "game", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_category": { - "name": "asset_category", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by": { - "name": "uploaded_by", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "url": { - "name": "url", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "status": { - "name": "status", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "'pending'" - }, - "uploaded_date": { - "name": "uploaded_date", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_is_optimized": { - "name": "asset_is_optimized", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "asset_is_suggestive": { - "name": "asset_is_suggestive", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "view_count": { - "name": "view_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "download_count": { - "name": "download_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "file_size": { - "name": "file_size", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "width": { - "name": "width", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "height": { - "name": "height", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "assets_id_idx": { - "name": "assets_id_idx", - "columns": ["id"], - "isUnique": false - }, - "assets_name_idx": { - "name": "assets_name_idx", - "columns": ["name"], - "isUnique": false - }, - "assets_game_name_idx": { - "name": "assets_game_name_idx", - "columns": ["game"], - "isUnique": false - }, - "assets_asset_category_name_idx": { - "name": "assets_asset_category_name_idx", - "columns": ["asset_category"], - "isUnique": false - }, - "assets_uploaded_by_id_idx": { - "name": "assets_uploaded_by_id_idx", - "columns": ["uploaded_by"], - "isUnique": false - } - }, - "foreignKeys": { - "asset_game_game_id_fk": { - "name": "asset_game_game_id_fk", - "tableFrom": "asset", - "tableTo": "game", - "columnsFrom": ["game"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "asset_asset_category_assetCategory_id_fk": { - "name": "asset_asset_category_assetCategory_id_fk", - "tableFrom": "asset", - "tableTo": "assetCategory", - "columnsFrom": ["asset_category"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "asset_uploaded_by_authUser_id_fk": { - "name": "asset_uploaded_by_authUser_id_fk", - "tableFrom": "asset", - "tableTo": "authUser", - "columnsFrom": ["uploaded_by"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetCategory": { - "name": "assetCategory", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetCategory_id_unique": { - "name": "assetCategory_id_unique", - "columns": ["id"], - "isUnique": true - }, - "assetCategory_name_unique": { - "name": "assetCategory_name_unique", - "columns": ["name"], - "isUnique": true - }, - "asset_category_id_idx": { - "name": "asset_category_id_idx", - "columns": ["id"], - "isUnique": false - }, - "asset_category_name_idx": { - "name": "asset_category_name_idx", - "columns": ["name"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "gameAssetCategory": { - "name": "gameAssetCategory", - "columns": { - "game_id": { - "name": "game_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_category_id": { - "name": "asset_category_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "game_asset_category_game_id_idx": { - "name": "game_asset_category_game_id_idx", - "columns": ["game_id"], - "isUnique": false - }, - "game_asset_category_asset_category_id_idx": { - "name": "game_asset_category_asset_category_id_idx", - "columns": ["asset_category_id"], - "isUnique": false - } - }, - "foreignKeys": { - "gameAssetCategory_game_id_game_id_fk": { - "name": "gameAssetCategory_game_id_game_id_fk", - "tableFrom": "gameAssetCategory", - "tableTo": "game", - "columnsFrom": ["game_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "gameAssetCategory_asset_category_id_assetCategory_id_fk": { - "name": "gameAssetCategory_asset_category_id_assetCategory_id_fk", - "tableFrom": "gameAssetCategory", - "tableTo": "assetCategory", - "columnsFrom": ["asset_category_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetTag": { - "name": "assetTag", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetTag_id_unique": { - "name": "assetTag_id_unique", - "columns": ["id"], - "isUnique": true - }, - "assetTag_name_unique": { - "name": "assetTag_name_unique", - "columns": ["name"], - "isUnique": true - }, - "asset_tag_id_idx": { - "name": "asset_tag_id_idx", - "columns": ["id"], - "isUnique": false - }, - "asset_tag_name_idx": { - "name": "asset_tag_name_idx", - "columns": ["name"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetTagAsset": { - "name": "assetTagAsset", - "columns": { - "asset_tag_id": { - "name": "asset_tag_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "asset_tags_assets_asset_tag_id_idx": { - "name": "asset_tags_assets_asset_tag_id_idx", - "columns": ["asset_tag_id"], - "isUnique": false - }, - "asset_tags_assets_asset_id_idx": { - "name": "asset_tags_assets_asset_id_idx", - "columns": ["asset_id"], - "isUnique": false - } - }, - "foreignKeys": { - "assetTagAsset_asset_tag_id_assetTag_id_fk": { - "name": "assetTagAsset_asset_tag_id_assetTag_id_fk", - "tableFrom": "assetTagAsset", - "tableTo": "assetTag", - "columnsFrom": ["asset_tag_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "assetTagAsset_asset_id_asset_id_fk": { - "name": "assetTagAsset_asset_id_asset_id_fk", - "tableFrom": "assetTagAsset", - "tableTo": "asset", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "atlas": { - "name": "atlas", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "url": { - "name": "url", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by": { - "name": "uploaded_by", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by_name": { - "name": "uploaded_by_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_date": { - "name": "uploaded_date", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "file_size": { - "name": "file_size", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "atlas_id_unique": { - "name": "atlas_id_unique", - "columns": ["id"], - "isUnique": true - }, - "atlas_id_idx": { - "name": "atlas_id_idx", - "columns": ["id"], - "isUnique": false - }, - "atlas_uploaded_by_idx": { - "name": "atlas_uploaded_by_idx", - "columns": ["uploaded_by"], - "isUnique": false - }, - "atlas_uploaded_by_name_idx": { - "name": "atlas_uploaded_by_name_idx", - "columns": ["uploaded_by_name"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "atlasToAsset": { - "name": "atlasToAsset", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "atlas_id": { - "name": "atlas_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "atlas_to_assets_id_idx": { - "name": "atlas_to_assets_id_idx", - "columns": ["id"], - "isUnique": false - }, - "atlas_to_assets_atlas_id_idx": { - "name": "atlas_to_assets_atlas_id_idx", - "columns": ["atlas_id"], - "isUnique": false - }, - "atlas_to_assets_asset_id_idx": { - "name": "atlas_to_assets_asset_id_idx", - "columns": ["asset_id"], - "isUnique": false - } - }, - "foreignKeys": { - "atlasToAsset_atlas_id_atlas_id_fk": { - "name": "atlasToAsset_atlas_id_atlas_id_fk", - "tableFrom": "atlasToAsset", - "tableTo": "atlas", - "columnsFrom": ["atlas_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "atlasToAsset_asset_id_asset_id_fk": { - "name": "atlasToAsset_asset_id_asset_id_fk", - "tableFrom": "atlasToAsset", - "tableTo": "asset", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "game": { - "name": "game", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - }, - "possible_suggestive_content": { - "name": "possible_suggestive_content", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "game_id_unique": { - "name": "game_id_unique", - "columns": ["id"], - "isUnique": true - }, - "game_name_unique": { - "name": "game_name_unique", - "columns": ["name"], - "isUnique": true - }, - "game_id_idx": { - "name": "game_id_idx", - "columns": ["id"], - "isUnique": false - }, - "game_name_idx": { - "name": "game_name_idx", - "columns": ["name"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "savedOcGenerators": { - "name": "savedOcGenerators", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "game": { - "name": "game", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "date_created": { - "name": "date_created", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "content": { - "name": "content", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "saved_color_palette": { - "name": "saved_color_palette", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "sakura_url": { - "name": "sakura_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "savedOcGenerators_id_unique": { - "name": "savedOcGenerators_id_unique", - "columns": ["id"], - "isUnique": true - }, - "saved_oc_generators_id_idx": { - "name": "saved_oc_generators_id_idx", - "columns": ["id"], - "isUnique": false - }, - "saved_oc_generators_user_id_idx": { - "name": "saved_oc_generators_user_id_idx", - "columns": ["user_id"], - "isUnique": false - } - }, - "foreignKeys": { - "savedOcGenerators_user_id_authUser_id_fk": { - "name": "savedOcGenerators_user_id_authUser_id_fk", - "tableFrom": "savedOcGenerators", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "authKey": { - "name": "authKey", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "hashed_password": { - "name": "hashed_password", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "authKey_id_unique": { - "name": "authKey_id_unique", - "columns": ["id"], - "isUnique": true - }, - "key_user_id_idx": { - "name": "key_user_id_idx", - "columns": ["user_id"], - "isUnique": false - } - }, - "foreignKeys": { - "authKey_user_id_authUser_id_fk": { - "name": "authKey_user_id_authUser_id_fk", - "tableFrom": "authKey", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "authUser": { - "name": "authUser", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "avatar_url": { - "name": "avatar_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "banner_url": { - "name": "banner_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "display_name": { - "name": "display_name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "username": { - "name": "username", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "username_colour": { - "name": "username_colour", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "email": { - "name": "email", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "email_verified": { - "name": "email_verified", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "pronouns": { - "name": "pronouns", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "verified": { - "name": "verified", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "bio": { - "name": "bio", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "'No bio set'" - }, - "date_joined": { - "name": "date_joined", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "role_flags": { - "name": "role_flags", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 1 - }, - "is_contributor": { - "name": "is_contributor", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "self_assignable_role_flags": { - "name": "self_assignable_role_flags", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "authUser_id_unique": { - "name": "authUser_id_unique", - "columns": ["id"], - "isUnique": true - }, - "authUser_username_unique": { - "name": "authUser_username_unique", - "columns": ["username"], - "isUnique": true - }, - "user_id_idx": { - "name": "user_id_idx", - "columns": ["id"], - "isUnique": false - }, - "user_username_idx": { - "name": "user_username_idx", - "columns": ["username"], - "isUnique": false - }, - "user_email_idx": { - "name": "user_email_idx", - "columns": ["email"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "authSession": { - "name": "authSession", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "active_expires": { - "name": "active_expires", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "idle_expires": { - "name": "idle_expires", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "authSession_id_unique": { - "name": "authSession_id_unique", - "columns": ["id"], - "isUnique": true - }, - "session_user_id_idx": { - "name": "session_user_id_idx", - "columns": ["user_id"], - "isUnique": false - } - }, - "foreignKeys": { - "authSession_user_id_authUser_id_fk": { - "name": "authSession_user_id_authUser_id_fk", - "tableFrom": "authSession", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "emailVerificationToken": { - "name": "emailVerificationToken", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "emailVerificationToken_id_unique": { - "name": "emailVerificationToken_id_unique", - "columns": ["id"], - "isUnique": true - }, - "email_verification_token_user_id_idx": { - "name": "email_verification_token_user_id_idx", - "columns": ["user_id"], - "isUnique": false - }, - "email_verification_token_token_idx": { - "name": "email_verification_token_token_idx", - "columns": ["token"], - "isUnique": false - } - }, - "foreignKeys": { - "emailVerificationToken_user_id_authUser_id_fk": { - "name": "emailVerificationToken_user_id_authUser_id_fk", - "tableFrom": "emailVerificationToken", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "passwordResetToken": { - "name": "passwordResetToken", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "passwordResetToken_id_unique": { - "name": "passwordResetToken_id_unique", - "columns": ["id"], - "isUnique": true - }, - "password_reset_token_user_id_idx": { - "name": "password_reset_token_user_id_idx", - "columns": ["user_id"], - "isUnique": false - }, - "password_reset_token_token_idx": { - "name": "password_reset_token_token_idx", - "columns": ["token"], - "isUnique": false - } - }, - "foreignKeys": { - "passwordResetToken_user_id_authUser_id_fk": { - "name": "passwordResetToken_user_id_authUser_id_fk", - "tableFrom": "passwordResetToken", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userCollection": { - "name": "userCollection", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "date_created": { - "name": "date_created", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - } - }, - "indexes": { - "userCollection_id_unique": { - "name": "userCollection_id_unique", - "columns": ["id"], - "isUnique": true - }, - "collection_id_idx": { - "name": "collection_id_idx", - "columns": ["id"], - "isUnique": false - }, - "user_collection_id_idx": { - "name": "user_collection_id_idx", - "columns": ["user_id"], - "isUnique": false - } - }, - "foreignKeys": { - "userCollection_user_id_authUser_id_fk": { - "name": "userCollection_user_id_authUser_id_fk", - "tableFrom": "userCollection", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetCollectionAsset": { - "name": "assetCollectionAsset", - "columns": { - "collection_id": { - "name": "collection_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "date_added": { - "name": "date_added", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "collection_assets_collection_id_idx": { - "name": "collection_assets_collection_id_idx", - "columns": ["collection_id"], - "isUnique": false - }, - "collection_assets_asset_id_idx": { - "name": "collection_assets_asset_id_idx", - "columns": ["asset_id"], - "isUnique": false - } - }, - "foreignKeys": { - "assetCollectionAsset_collection_id_userCollection_id_fk": { - "name": "assetCollectionAsset_collection_id_userCollection_id_fk", - "tableFrom": "assetCollectionAsset", - "tableTo": "userCollection", - "columnsFrom": ["collection_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "assetCollectionAsset_asset_id_asset_id_fk": { - "name": "assetCollectionAsset_asset_id_asset_id_fk", - "tableFrom": "assetCollectionAsset", - "tableTo": "asset", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "socialsConnection": { - "name": "socialsConnection", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "discord_id": { - "name": "discord_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "socialsConnection_id_unique": { - "name": "socialsConnection_id_unique", - "columns": ["id"], - "isUnique": true - }, - "socialsConnection_user_id_unique": { - "name": "socialsConnection_user_id_unique", - "columns": ["user_id"], - "isUnique": true - }, - "socials_connection_user_id_idx": { - "name": "socials_connection_user_id_idx", - "columns": ["user_id"], - "isUnique": false - }, - "socials_connection_discord_id_idx": { - "name": "socials_connection_discord_id_idx", - "columns": ["discord_id"], - "isUnique": false - } - }, - "foreignKeys": { - "socialsConnection_user_id_authUser_id_fk": { - "name": "socialsConnection_user_id_authUser_id_fk", - "tableFrom": "socialsConnection", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userFavorite": { - "name": "userFavorite", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - } - }, - "indexes": { - "userFavorite_id_unique": { - "name": "userFavorite_id_unique", - "columns": ["id"], - "isUnique": true - }, - "favorited_assets_id_idx": { - "name": "favorited_assets_id_idx", - "columns": ["id"], - "isUnique": false - }, - "favorited_assets_user_id_idx": { - "name": "favorited_assets_user_id_idx", - "columns": ["user_id"], - "isUnique": false - } - }, - "foreignKeys": { - "userFavorite_user_id_authUser_id_fk": { - "name": "userFavorite_user_id_authUser_id_fk", - "tableFrom": "userFavorite", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userFavoriteAsset": { - "name": "userFavoriteAsset", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "favorited_assets_id": { - "name": "favorited_assets_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "userFavoriteAsset_id_unique": { - "name": "userFavoriteAsset_id_unique", - "columns": ["id"], - "isUnique": true - }, - "favorited_assets_assets_id_idx": { - "name": "favorited_assets_assets_id_idx", - "columns": ["id"], - "isUnique": false - }, - "favorited_assets_assets_user_id_idx": { - "name": "favorited_assets_assets_user_id_idx", - "columns": ["favorited_assets_id"], - "isUnique": false - }, - "favorited_assets_assets_asset_id_idx": { - "name": "favorited_assets_assets_asset_id_idx", - "columns": ["asset_id"], - "isUnique": false - } - }, - "foreignKeys": { - "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk": { - "name": "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk", - "tableFrom": "userFavoriteAsset", - "tableTo": "userFavorite", - "columnsFrom": ["favorited_assets_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "userFavoriteAsset_asset_id_asset_id_fk": { - "name": "userFavoriteAsset_asset_id_asset_id_fk", - "tableFrom": "userFavoriteAsset", - "tableTo": "asset", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userNetworking": { - "name": "userNetworking", - "columns": { - "followerId": { - "name": "followerId", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "followingId": { - "name": "followingId", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "userNetworking_follower_idx": { - "name": "userNetworking_follower_idx", - "columns": ["followerId"], - "isUnique": false - }, - "userNetworking_following_idx": { - "name": "userNetworking_following_idx", - "columns": ["followingId"], - "isUnique": false - } - }, - "foreignKeys": { - "userNetworking_followerId_authUser_id_fk": { - "name": "userNetworking_followerId_authUser_id_fk", - "tableFrom": "userNetworking", - "tableTo": "authUser", - "columnsFrom": ["followerId"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - }, - "userNetworking_followingId_authUser_id_fk": { - "name": "userNetworking_followingId_authUser_id_fk", - "tableFrom": "userNetworking", - "tableTo": "authUser", - "columnsFrom": ["followingId"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - } - }, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - } -} diff --git a/src/v2/db/migrations/meta/_journal.json b/src/v2/db/migrations/meta/_journal.json index 9d10dfb..be6a204 100644 --- a/src/v2/db/migrations/meta/_journal.json +++ b/src/v2/db/migrations/meta/_journal.json @@ -5,15 +5,8 @@ { "idx": 0, "version": "5", - "when": 1700189550333, - "tag": "0000_busy_dreaming_celestial", - "breakpoints": true - }, - { - "idx": 1, - "version": "5", - "when": 1700935264170, - "tag": "0001_chubby_bullseye", + "when": 1701013045181, + "tag": "0000_harsh_tarot", "breakpoints": true } ] diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index 8bd1b9b..04fd5e1 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -2,6 +2,7 @@ export * from "./schema/asset/asset" export * from "./schema/asset/asset-categories" export * from "./schema/asset/asset-tags" export * from "./schema/asset/asset-atlas" +export * from "./schema/asset/asset-networking" export * from "./schema/game/game" @@ -13,3 +14,4 @@ export * from "./schema/user/user-collections" export * from "./schema/user/user-connections" export * from "./schema/user/user-favorites" export * from "./schema/user/user-networking" +export * from "./schema/user/user-collection-networking" diff --git a/src/v2/db/schema/asset/asset-networking.ts b/src/v2/db/schema/asset/asset-networking.ts new file mode 100644 index 0000000..79747a7 --- /dev/null +++ b/src/v2/db/schema/asset/asset-networking.ts @@ -0,0 +1,56 @@ +import { tableNames } from "@/v2/db/drizzle" +import { relations } from "drizzle-orm" +import { + sqliteTable, + text, + // uniqueIndex, + index, +} from "drizzle-orm/sqlite-core" +import { authUser } from "../user/user" +import { asset } from "./asset" + +export const assetNetworking = sqliteTable( + tableNames.assetNetworking, + { + assetId: text("follower_id") + .notNull() + .references(() => authUser.id), + likedById: text("following_id") + .notNull() + .references(() => authUser.id), + createdAt: text("created_at") + .notNull() + .$defaultFn(() => { + return new Date().toISOString() + }), + }, + (assetNetworking) => { + return { + assetIdx: index("assetNetworking_likedAsset_idx").on( + assetNetworking.assetId + ), + likedByIdx: index("assetNetworking_likedBy_idx").on( + assetNetworking.likedById + ), + } + } +) + +export type AssetNetworking = typeof assetNetworking.$inferSelect +export type NewAssetNetworking = typeof assetNetworking.$inferInsert + +export const assetNetworkingRelations = relations( + assetNetworking, + ({ one }) => ({ + asset: one(asset, { + fields: [assetNetworking.assetId], + references: [asset.id], + relationName: "assetnetworking_liked_asset", + }), + likedBy: one(authUser, { + fields: [assetNetworking.likedById], + references: [authUser.id], + relationName: "assetnetworking_liked_by", + }), + }) +) diff --git a/src/v2/db/schema/asset/asset.ts b/src/v2/db/schema/asset/asset.ts index ba3ff2a..bc192b3 100644 --- a/src/v2/db/schema/asset/asset.ts +++ b/src/v2/db/schema/asset/asset.ts @@ -12,6 +12,7 @@ import { assetCategory } from "./asset-categories" import { game } from "../game/game" import { assetTagAsset } from "./asset-tags" import { atlasToAsset } from "./asset-atlas" +import { assetNetworking } from "./asset-networking" /* NOTE: Assets have a lot of relations, and can be quite complex in some cases. @@ -92,6 +93,7 @@ export type NewAsset = typeof asset.$inferInsert export const assetRelations = relations(asset, ({ one, many }) => ({ assetTagAsset: many(assetTagAsset), atlasToAsset: many(atlasToAsset), + assetNetworking: many(assetNetworking), authUser: one(authUser, { fields: [asset.uploadedById], references: [authUser.id], diff --git a/src/v2/db/schema/user/user-collection-networking.ts b/src/v2/db/schema/user/user-collection-networking.ts new file mode 100644 index 0000000..dc33d54 --- /dev/null +++ b/src/v2/db/schema/user/user-collection-networking.ts @@ -0,0 +1,58 @@ +import { tableNames } from "@/v2/db/drizzle" +import { relations } from "drizzle-orm" +import { + sqliteTable, + text, + // uniqueIndex, + index, +} from "drizzle-orm/sqlite-core" +import { authUser } from "../user/user" +import { userCollection } from "./user-collections" + +export const userCollectionNetworking = sqliteTable( + tableNames.userCollectionNetworking, + { + collectionId: text("collection_id") + .notNull() + .references(() => userCollection.id), + likedById: text("liked_by_id") + .notNull() + .references(() => authUser.id), + createdAt: text("createdAt") + .notNull() + .$defaultFn(() => { + return new Date().toISOString() + }), + }, + (userCollectionNetworking) => { + return { + collectionIdx: index("userCollectionNetworking_collection_idx").on( + userCollectionNetworking.collectionId + ), + likedByIdx: index("userCollectionNetworking_likedBy_idx").on( + userCollectionNetworking.likedById + ), + } + } +) + +export type UserCollectionNetworking = + typeof userCollectionNetworking.$inferSelect +export type NewUserCollectionNetworking = + typeof userCollectionNetworking.$inferInsert + +export const userCollectionNetworkingRelations = relations( + userCollectionNetworking, + ({ one }) => ({ + collection: one(userCollection, { + fields: [userCollectionNetworking.collectionId], + references: [userCollection.id], + relationName: "usercollection_liked_collection", + }), + likedBy: one(authUser, { + fields: [userCollectionNetworking.likedById], + references: [authUser.id], + relationName: "usercollection_liked_by", + }), + }) +) diff --git a/src/v2/db/schema/user/user-collections.ts b/src/v2/db/schema/user/user-collections.ts index 9f0cce5..05a5985 100644 --- a/src/v2/db/schema/user/user-collections.ts +++ b/src/v2/db/schema/user/user-collections.ts @@ -10,7 +10,7 @@ import { import { authUser } from "./user" import { asset } from "../asset/asset" import { generateID } from "@/v2/lib/oslo" - +import { userCollectionNetworking } from "./user-collection-networking" /* NOTE: this file is where users store their collections of assets. - UserCollection is the collection itself, which has a name, description, and whether it's public or not. @@ -101,6 +101,7 @@ export const collectionRelations = relations( relationName: "collection_auth_user", }), assets: many(userCollectionAsset), + collectionNetworking: many(userCollectionNetworking), }) ) diff --git a/src/v2/db/schema/user/user.ts b/src/v2/db/schema/user/user.ts index 74d1d02..e3dcbe4 100644 --- a/src/v2/db/schema/user/user.ts +++ b/src/v2/db/schema/user/user.ts @@ -16,6 +16,8 @@ import { userCollection } from "./user-collections" import { passwordResetToken } from "./user-attributes" import { emailVerificationToken } from "./user-attributes" import { atlas } from "../asset/asset-atlas" +import { userCollectionNetworking } from "./user-collection-networking" +import { assetNetworking } from "../asset/asset-networking" /* NOTE: Very basic user information @@ -119,6 +121,8 @@ export const usersRelations = relations(authUser, ({ one, many }) => ({ asset: many(asset), atlas: many(atlas), userFavorite: one(userFavorite), + userCollectionNetworking: many(userCollectionNetworking), + assetNetworking: many(assetNetworking), socialsConnection: one(socialsConnection), userCollection: many(userCollection), passwordResetToken: one(passwordResetToken), diff --git a/src/v2/lib/managers/asset/asset-networking.ts b/src/v2/lib/managers/asset/asset-networking.ts new file mode 100644 index 0000000..d55af96 --- /dev/null +++ b/src/v2/lib/managers/asset/asset-networking.ts @@ -0,0 +1,58 @@ +import { DrizzleInstance } from "@/v2/db/turso" +import { eq, and } from "drizzle-orm" +import { assetNetworking } from "@/v2/db/schema/asset/asset-networking" + +export class AssetNetworkingManager { + constructor(private drizzle: DrizzleInstance) {} + + /** + * Favorites an asset for a user. + * @param assetId - The ID of the asset to favorite. + * @param userId - The ID of the user to favorite the asset for. + */ + public async favoriteAsset(assetId: string, userId: string): Promise { + try { + await this.drizzle.insert(assetNetworking).values({ + assetId, + likedById: userId, + }) + } catch (e) { + console.error( + `Error favoriting asset ${assetId} for user ${userId}`, + e + ) + throw new Error( + `Error favoriting asset ${assetId} for user ${userId}` + ) + } + } + + /** + * Unfavorites an asset for a user. + * @param assetId - The ID of the asset to unfavorite. + * @param userId - The ID of the user to unfavorite the asset for. + */ + public async unfavoriteAsset( + assetId: string, + userId: string + ): Promise { + try { + await this.drizzle + .delete(assetNetworking) + .where( + and( + eq(assetNetworking.assetId, assetId), + eq(assetNetworking.likedById, userId) + ) + ) + } catch (e) { + console.error( + `Error unfavoriting asset ${assetId} for user ${userId}`, + e + ) + throw new Error( + `Error unfavoriting asset ${assetId} for user ${userId}` + ) + } + } +} From 509410969c83980c838ae47e0c70abf36b7fa847 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Sun, 26 Nov 2023 17:45:48 +0000 Subject: [PATCH 168/318] fix inconsistencies --- package.json | 4 +- src/v2/db/drizzle.ts | 4 +- src/v2/db/schema.ts | 4 +- src/v2/db/schema/asset/asset-likes.ts | 51 ++++++++++++++++ src/v2/db/schema/asset/asset-networking.ts | 56 ------------------ src/v2/db/schema/asset/asset.ts | 4 +- ...networking.ts => user-collection-likes.ts} | 30 +++++----- src/v2/db/schema/user/user-collections.ts | 4 +- src/v2/db/schema/user/user.ts | 8 +-- src/v2/lib/managers/asset/asset-likes.ts | 45 ++++++++++++++ src/v2/lib/managers/asset/asset-networking.ts | 58 ------------------- 11 files changed, 125 insertions(+), 143 deletions(-) create mode 100644 src/v2/db/schema/asset/asset-likes.ts delete mode 100644 src/v2/db/schema/asset/asset-networking.ts rename src/v2/db/schema/user/{user-collection-networking.ts => user-collection-likes.ts} (57%) create mode 100644 src/v2/lib/managers/asset/asset-likes.ts delete mode 100644 src/v2/lib/managers/asset/asset-networking.ts diff --git a/package.json b/package.json index 410ab1e..9a03085 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,7 @@ { "name": "api", "version": "1.1.0b", + "type": "module", "scripts": { "dev": "wrangler dev", "wrangler:dev:local": "wrangler dev", @@ -15,7 +16,8 @@ "drizzle:migrate": "tsx src/scripts/migrate/migrate.mts", "drizzle:push": "drizzle-kit push:sqlite", "drizzle:dev:init": "drizzle-kit generate:sqlite && tsx src/scripts/migrate/migrate.mts && tsx src/scripts/seed/seed.ts", - "drizzle:studio": "drizzle-kit studio --port 7331 --host 127.0.0.1 --verbose" + "drizzle:studio": "drizzle-kit studio --port 7331 --host 127.0.0.1 --verbose", + "drizzle:dbml": "tsx ./src/scripts/test.mts" }, "devDependencies": { "@asteasolutions/zod-to-openapi": "^6.3.0", diff --git a/src/v2/db/drizzle.ts b/src/v2/db/drizzle.ts index f45b023..70ade1b 100644 --- a/src/v2/db/drizzle.ts +++ b/src/v2/db/drizzle.ts @@ -5,8 +5,8 @@ export const tableNames = { authUser: "authUser", userNetworking: "userNetworking", gameAssetCategory: "gameAssetCategory", - assetNetworking: "assetNetworking", - userCollectionNetworking: "collectionNetworking", + assetLikes: "assetLikes", + userCollectionLikes: "userCollectionLikes", game: "game", atlas: "atlas", atlasToAsset: "atlasToAsset", diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index 04fd5e1..2ddb8a5 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -2,7 +2,7 @@ export * from "./schema/asset/asset" export * from "./schema/asset/asset-categories" export * from "./schema/asset/asset-tags" export * from "./schema/asset/asset-atlas" -export * from "./schema/asset/asset-networking" +export * from "./schema/asset/asset-likes" export * from "./schema/game/game" @@ -14,4 +14,4 @@ export * from "./schema/user/user-collections" export * from "./schema/user/user-connections" export * from "./schema/user/user-favorites" export * from "./schema/user/user-networking" -export * from "./schema/user/user-collection-networking" +export * from "./schema/user/user-collection-likes" diff --git a/src/v2/db/schema/asset/asset-likes.ts b/src/v2/db/schema/asset/asset-likes.ts new file mode 100644 index 0000000..e1b4435 --- /dev/null +++ b/src/v2/db/schema/asset/asset-likes.ts @@ -0,0 +1,51 @@ +import { tableNames } from "@/v2/db/drizzle" +import { relations } from "drizzle-orm" +import { + sqliteTable, + text, + // uniqueIndex, + index, +} from "drizzle-orm/sqlite-core" +import { authUser } from "../user/user" +import { asset } from "./asset" + +export const assetLikes = sqliteTable( + tableNames.assetLikes, + { + assetId: text("asset_id") + .notNull() + .references(() => authUser.id), + likedById: text("liked_by_id") + .notNull() + .references(() => authUser.id), + createdAt: text("created_at") + .notNull() + .$defaultFn(() => { + return new Date().toISOString() + }), + }, + (assetLikes) => { + return { + assetIdx: index("assetlikes_asset_idx").on(assetLikes.assetId), + likedByIdx: index("assetlikes_likedBy_idx").on( + assetLikes.likedById + ), + } + } +) + +export type AssetLikes = typeof assetLikes.$inferSelect +export type NewAssetLikes = typeof assetLikes.$inferInsert + +export const assetNetworkingRelations = relations(assetLikes, ({ one }) => ({ + asset: one(asset, { + fields: [assetLikes.assetId], + references: [asset.id], + relationName: "assetlikes_liked_asset", + }), + likedBy: one(authUser, { + fields: [assetLikes.likedById], + references: [authUser.id], + relationName: "assetlikes_liked_by", + }), +})) diff --git a/src/v2/db/schema/asset/asset-networking.ts b/src/v2/db/schema/asset/asset-networking.ts deleted file mode 100644 index 79747a7..0000000 --- a/src/v2/db/schema/asset/asset-networking.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { tableNames } from "@/v2/db/drizzle" -import { relations } from "drizzle-orm" -import { - sqliteTable, - text, - // uniqueIndex, - index, -} from "drizzle-orm/sqlite-core" -import { authUser } from "../user/user" -import { asset } from "./asset" - -export const assetNetworking = sqliteTable( - tableNames.assetNetworking, - { - assetId: text("follower_id") - .notNull() - .references(() => authUser.id), - likedById: text("following_id") - .notNull() - .references(() => authUser.id), - createdAt: text("created_at") - .notNull() - .$defaultFn(() => { - return new Date().toISOString() - }), - }, - (assetNetworking) => { - return { - assetIdx: index("assetNetworking_likedAsset_idx").on( - assetNetworking.assetId - ), - likedByIdx: index("assetNetworking_likedBy_idx").on( - assetNetworking.likedById - ), - } - } -) - -export type AssetNetworking = typeof assetNetworking.$inferSelect -export type NewAssetNetworking = typeof assetNetworking.$inferInsert - -export const assetNetworkingRelations = relations( - assetNetworking, - ({ one }) => ({ - asset: one(asset, { - fields: [assetNetworking.assetId], - references: [asset.id], - relationName: "assetnetworking_liked_asset", - }), - likedBy: one(authUser, { - fields: [assetNetworking.likedById], - references: [authUser.id], - relationName: "assetnetworking_liked_by", - }), - }) -) diff --git a/src/v2/db/schema/asset/asset.ts b/src/v2/db/schema/asset/asset.ts index bc192b3..4ac4d6e 100644 --- a/src/v2/db/schema/asset/asset.ts +++ b/src/v2/db/schema/asset/asset.ts @@ -12,7 +12,7 @@ import { assetCategory } from "./asset-categories" import { game } from "../game/game" import { assetTagAsset } from "./asset-tags" import { atlasToAsset } from "./asset-atlas" -import { assetNetworking } from "./asset-networking" +import { assetLikes } from "./asset-likes" /* NOTE: Assets have a lot of relations, and can be quite complex in some cases. @@ -93,7 +93,7 @@ export type NewAsset = typeof asset.$inferInsert export const assetRelations = relations(asset, ({ one, many }) => ({ assetTagAsset: many(assetTagAsset), atlasToAsset: many(atlasToAsset), - assetNetworking: many(assetNetworking), + assetLikes: many(assetLikes), authUser: one(authUser, { fields: [asset.uploadedById], references: [authUser.id], diff --git a/src/v2/db/schema/user/user-collection-networking.ts b/src/v2/db/schema/user/user-collection-likes.ts similarity index 57% rename from src/v2/db/schema/user/user-collection-networking.ts rename to src/v2/db/schema/user/user-collection-likes.ts index dc33d54..86f625d 100644 --- a/src/v2/db/schema/user/user-collection-networking.ts +++ b/src/v2/db/schema/user/user-collection-likes.ts @@ -6,11 +6,11 @@ import { // uniqueIndex, index, } from "drizzle-orm/sqlite-core" -import { authUser } from "../user/user" +import { authUser } from "./user" import { userCollection } from "./user-collections" -export const userCollectionNetworking = sqliteTable( - tableNames.userCollectionNetworking, +export const userCollectionLikes = sqliteTable( + tableNames.userCollectionLikes, { collectionId: text("collection_id") .notNull() @@ -24,35 +24,33 @@ export const userCollectionNetworking = sqliteTable( return new Date().toISOString() }), }, - (userCollectionNetworking) => { + (userCollectionLikes) => { return { collectionIdx: index("userCollectionNetworking_collection_idx").on( - userCollectionNetworking.collectionId + userCollectionLikes.collectionId ), likedByIdx: index("userCollectionNetworking_likedBy_idx").on( - userCollectionNetworking.likedById + userCollectionLikes.likedById ), } } ) -export type UserCollectionNetworking = - typeof userCollectionNetworking.$inferSelect -export type NewUserCollectionNetworking = - typeof userCollectionNetworking.$inferInsert +export type UserCollectionLikes = typeof userCollectionLikes.$inferSelect +export type NewUserCollectionLikes = typeof userCollectionLikes.$inferInsert -export const userCollectionNetworkingRelations = relations( - userCollectionNetworking, +export const userCollectionLikesRelations = relations( + userCollectionLikes, ({ one }) => ({ collection: one(userCollection, { - fields: [userCollectionNetworking.collectionId], + fields: [userCollectionLikes.collectionId], references: [userCollection.id], - relationName: "usercollection_liked_collection", + relationName: "usercollectionlikes_liked_collection", }), likedBy: one(authUser, { - fields: [userCollectionNetworking.likedById], + fields: [userCollectionLikes.likedById], references: [authUser.id], - relationName: "usercollection_liked_by", + relationName: "usercollectionlikes_liked_by", }), }) ) diff --git a/src/v2/db/schema/user/user-collections.ts b/src/v2/db/schema/user/user-collections.ts index 05a5985..78acf77 100644 --- a/src/v2/db/schema/user/user-collections.ts +++ b/src/v2/db/schema/user/user-collections.ts @@ -10,7 +10,7 @@ import { import { authUser } from "./user" import { asset } from "../asset/asset" import { generateID } from "@/v2/lib/oslo" -import { userCollectionNetworking } from "./user-collection-networking" +import { userCollectionLikes } from "./user-collection-likes" /* NOTE: this file is where users store their collections of assets. - UserCollection is the collection itself, which has a name, description, and whether it's public or not. @@ -101,7 +101,7 @@ export const collectionRelations = relations( relationName: "collection_auth_user", }), assets: many(userCollectionAsset), - collectionNetworking: many(userCollectionNetworking), + collectionNetworking: many(userCollectionLikes), }) ) diff --git a/src/v2/db/schema/user/user.ts b/src/v2/db/schema/user/user.ts index e3dcbe4..e955e8f 100644 --- a/src/v2/db/schema/user/user.ts +++ b/src/v2/db/schema/user/user.ts @@ -16,8 +16,8 @@ import { userCollection } from "./user-collections" import { passwordResetToken } from "./user-attributes" import { emailVerificationToken } from "./user-attributes" import { atlas } from "../asset/asset-atlas" -import { userCollectionNetworking } from "./user-collection-networking" -import { assetNetworking } from "../asset/asset-networking" +import { userCollectionLikes } from "./user-collection-likes" +import { assetLikes } from "../asset/asset-likes" /* NOTE: Very basic user information @@ -121,8 +121,8 @@ export const usersRelations = relations(authUser, ({ one, many }) => ({ asset: many(asset), atlas: many(atlas), userFavorite: one(userFavorite), - userCollectionNetworking: many(userCollectionNetworking), - assetNetworking: many(assetNetworking), + userCollectionLikes: many(userCollectionLikes), + assetLikes: many(assetLikes), socialsConnection: one(socialsConnection), userCollection: many(userCollection), passwordResetToken: one(passwordResetToken), diff --git a/src/v2/lib/managers/asset/asset-likes.ts b/src/v2/lib/managers/asset/asset-likes.ts new file mode 100644 index 0000000..f2b3604 --- /dev/null +++ b/src/v2/lib/managers/asset/asset-likes.ts @@ -0,0 +1,45 @@ +import { DrizzleInstance } from "@/v2/db/turso" +import { eq, and } from "drizzle-orm" +import { assetLikes } from "@/v2/db/schema/asset/asset-likes" + +export class AssetLikesManager { + constructor(private drizzle: DrizzleInstance) {} + + /** + * Favorites an asset for a user. + * @param assetId - The ID of the asset to favorite. + * @param userId - The ID of the user to favorite the asset for. + */ + public async likeAsset(assetId: string, userId: string): Promise { + try { + await this.drizzle.insert(assetLikes).values({ + assetId, + likedById: userId, + }) + } catch (e) { + console.error(`Error liking asset ${assetId} for user ${userId}`, e) + throw new Error(`Error liking asset ${assetId} for user ${userId}`) + } + } + + /** + * Unfavorites an asset for a user. + * @param assetId - The ID of the asset to unfavorite. + * @param userId - The ID of the user to unfavorite the asset for. + */ + public async unlikeAsset(assetId: string, userId: string): Promise { + try { + await this.drizzle + .delete(assetLikes) + .where( + and( + eq(assetLikes.assetId, assetId), + eq(assetLikes.likedById, userId) + ) + ) + } catch (e) { + console.error(`Error liking asset ${assetId} for user ${userId}`, e) + throw new Error(`Error liking asset ${assetId} for user ${userId}`) + } + } +} diff --git a/src/v2/lib/managers/asset/asset-networking.ts b/src/v2/lib/managers/asset/asset-networking.ts deleted file mode 100644 index d55af96..0000000 --- a/src/v2/lib/managers/asset/asset-networking.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { DrizzleInstance } from "@/v2/db/turso" -import { eq, and } from "drizzle-orm" -import { assetNetworking } from "@/v2/db/schema/asset/asset-networking" - -export class AssetNetworkingManager { - constructor(private drizzle: DrizzleInstance) {} - - /** - * Favorites an asset for a user. - * @param assetId - The ID of the asset to favorite. - * @param userId - The ID of the user to favorite the asset for. - */ - public async favoriteAsset(assetId: string, userId: string): Promise { - try { - await this.drizzle.insert(assetNetworking).values({ - assetId, - likedById: userId, - }) - } catch (e) { - console.error( - `Error favoriting asset ${assetId} for user ${userId}`, - e - ) - throw new Error( - `Error favoriting asset ${assetId} for user ${userId}` - ) - } - } - - /** - * Unfavorites an asset for a user. - * @param assetId - The ID of the asset to unfavorite. - * @param userId - The ID of the user to unfavorite the asset for. - */ - public async unfavoriteAsset( - assetId: string, - userId: string - ): Promise { - try { - await this.drizzle - .delete(assetNetworking) - .where( - and( - eq(assetNetworking.assetId, assetId), - eq(assetNetworking.likedById, userId) - ) - ) - } catch (e) { - console.error( - `Error unfavoriting asset ${assetId} for user ${userId}`, - e - ) - throw new Error( - `Error unfavoriting asset ${assetId} for user ${userId}` - ) - } - } -} From 68371127624c13d724431d38b4482ef7b68a4e35 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Sun, 26 Nov 2023 17:48:31 +0000 Subject: [PATCH 169/318] migration testing --- package.json | 6 +- ...arsh_tarot.sql => 0000_warm_nick_fury.sql} | 20 +++---- src/v2/db/migrations/meta/0000_snapshot.json | 58 +++++++++---------- src/v2/db/migrations/meta/_journal.json | 4 +- 4 files changed, 43 insertions(+), 45 deletions(-) rename src/v2/db/migrations/{0000_harsh_tarot.sql => 0000_warm_nick_fury.sql} (94%) diff --git a/package.json b/package.json index 9a03085..7f5aeee 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,6 @@ { "name": "api", - "version": "1.1.0b", - "type": "module", + "version": "2.0.0b", "scripts": { "dev": "wrangler dev", "wrangler:dev:local": "wrangler dev", @@ -16,8 +15,7 @@ "drizzle:migrate": "tsx src/scripts/migrate/migrate.mts", "drizzle:push": "drizzle-kit push:sqlite", "drizzle:dev:init": "drizzle-kit generate:sqlite && tsx src/scripts/migrate/migrate.mts && tsx src/scripts/seed/seed.ts", - "drizzle:studio": "drizzle-kit studio --port 7331 --host 127.0.0.1 --verbose", - "drizzle:dbml": "tsx ./src/scripts/test.mts" + "drizzle:studio": "drizzle-kit studio --port 7331 --host 127.0.0.1 --verbose" }, "devDependencies": { "@asteasolutions/zod-to-openapi": "^6.3.0", diff --git a/src/v2/db/migrations/0000_harsh_tarot.sql b/src/v2/db/migrations/0000_warm_nick_fury.sql similarity index 94% rename from src/v2/db/migrations/0000_harsh_tarot.sql rename to src/v2/db/migrations/0000_warm_nick_fury.sql index bd599da..c768f1c 100644 --- a/src/v2/db/migrations/0000_harsh_tarot.sql +++ b/src/v2/db/migrations/0000_warm_nick_fury.sql @@ -67,12 +67,12 @@ CREATE TABLE `atlasToAsset` ( FOREIGN KEY (`asset_id`) REFERENCES `asset`(`id`) ON UPDATE cascade ON DELETE cascade ); --> statement-breakpoint -CREATE TABLE `assetNetworking` ( - `follower_id` text NOT NULL, - `following_id` text NOT NULL, +CREATE TABLE `assetLikes` ( + `asset_id` text NOT NULL, + `liked_by_id` text NOT NULL, `created_at` text NOT NULL, - FOREIGN KEY (`follower_id`) REFERENCES `authUser`(`id`) ON UPDATE no action ON DELETE no action, - FOREIGN KEY (`following_id`) REFERENCES `authUser`(`id`) ON UPDATE no action ON DELETE no action + FOREIGN KEY (`asset_id`) REFERENCES `authUser`(`id`) ON UPDATE no action ON DELETE no action, + FOREIGN KEY (`liked_by_id`) REFERENCES `authUser`(`id`) ON UPDATE no action ON DELETE no action ); --> statement-breakpoint CREATE TABLE `game` ( @@ -194,7 +194,7 @@ CREATE TABLE `userNetworking` ( FOREIGN KEY (`followingId`) REFERENCES `authUser`(`id`) ON UPDATE no action ON DELETE no action ); --> statement-breakpoint -CREATE TABLE `collectionNetworking` ( +CREATE TABLE `userCollectionLikes` ( `collection_id` text NOT NULL, `liked_by_id` text NOT NULL, `createdAt` text NOT NULL, @@ -226,8 +226,8 @@ CREATE INDEX `atlas_uploaded_by_name_idx` ON `atlas` (`uploaded_by_name`);--> st CREATE INDEX `atlas_to_assets_id_idx` ON `atlasToAsset` (`id`);--> statement-breakpoint CREATE INDEX `atlas_to_assets_atlas_id_idx` ON `atlasToAsset` (`atlas_id`);--> statement-breakpoint CREATE INDEX `atlas_to_assets_asset_id_idx` ON `atlasToAsset` (`asset_id`);--> statement-breakpoint -CREATE INDEX `assetNetworking_likedAsset_idx` ON `assetNetworking` (`follower_id`);--> statement-breakpoint -CREATE INDEX `assetNetworking_likedBy_idx` ON `assetNetworking` (`following_id`);--> statement-breakpoint +CREATE INDEX `assetlikes_asset_idx` ON `assetLikes` (`asset_id`);--> statement-breakpoint +CREATE INDEX `assetlikes_likedBy_idx` ON `assetLikes` (`liked_by_id`);--> statement-breakpoint CREATE UNIQUE INDEX `game_id_unique` ON `game` (`id`);--> statement-breakpoint CREATE UNIQUE INDEX `game_name_unique` ON `game` (`name`);--> statement-breakpoint CREATE INDEX `game_id_idx` ON `game` (`id`);--> statement-breakpoint @@ -268,5 +268,5 @@ CREATE INDEX `favorited_assets_assets_user_id_idx` ON `userFavoriteAsset` (`favo CREATE INDEX `favorited_assets_assets_asset_id_idx` ON `userFavoriteAsset` (`asset_id`);--> statement-breakpoint CREATE INDEX `userNetworking_follower_idx` ON `userNetworking` (`followerId`);--> statement-breakpoint CREATE INDEX `userNetworking_following_idx` ON `userNetworking` (`followingId`);--> statement-breakpoint -CREATE INDEX `userCollectionNetworking_collection_idx` ON `collectionNetworking` (`collection_id`);--> statement-breakpoint -CREATE INDEX `userCollectionNetworking_likedBy_idx` ON `collectionNetworking` (`liked_by_id`); \ No newline at end of file +CREATE INDEX `userCollectionNetworking_collection_idx` ON `userCollectionLikes` (`collection_id`);--> statement-breakpoint +CREATE INDEX `userCollectionNetworking_likedBy_idx` ON `userCollectionLikes` (`liked_by_id`); \ No newline at end of file diff --git a/src/v2/db/migrations/meta/0000_snapshot.json b/src/v2/db/migrations/meta/0000_snapshot.json index 8388551..1f563b8 100644 --- a/src/v2/db/migrations/meta/0000_snapshot.json +++ b/src/v2/db/migrations/meta/0000_snapshot.json @@ -1,7 +1,7 @@ { "version": "5", "dialect": "sqlite", - "id": "a76d59ea-41c0-4e99-9480-f203e245fbff", + "id": "2d696f86-b652-410a-bfd1-fc6deda2f5f8", "prevId": "00000000-0000-0000-0000-000000000000", "tables": { "asset": { @@ -563,18 +563,18 @@ "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "assetNetworking": { - "name": "assetNetworking", + "assetLikes": { + "name": "assetLikes", "columns": { - "follower_id": { - "name": "follower_id", + "asset_id": { + "name": "asset_id", "type": "text", "primaryKey": false, "notNull": true, "autoincrement": false }, - "following_id": { - "name": "following_id", + "liked_by_id": { + "name": "liked_by_id", "type": "text", "primaryKey": false, "notNull": true, @@ -589,32 +589,32 @@ } }, "indexes": { - "assetNetworking_likedAsset_idx": { - "name": "assetNetworking_likedAsset_idx", - "columns": ["follower_id"], + "assetlikes_asset_idx": { + "name": "assetlikes_asset_idx", + "columns": ["asset_id"], "isUnique": false }, - "assetNetworking_likedBy_idx": { - "name": "assetNetworking_likedBy_idx", - "columns": ["following_id"], + "assetlikes_likedBy_idx": { + "name": "assetlikes_likedBy_idx", + "columns": ["liked_by_id"], "isUnique": false } }, "foreignKeys": { - "assetNetworking_follower_id_authUser_id_fk": { - "name": "assetNetworking_follower_id_authUser_id_fk", - "tableFrom": "assetNetworking", + "assetLikes_asset_id_authUser_id_fk": { + "name": "assetLikes_asset_id_authUser_id_fk", + "tableFrom": "assetLikes", "tableTo": "authUser", - "columnsFrom": ["follower_id"], + "columnsFrom": ["asset_id"], "columnsTo": ["id"], "onDelete": "no action", "onUpdate": "no action" }, - "assetNetworking_following_id_authUser_id_fk": { - "name": "assetNetworking_following_id_authUser_id_fk", - "tableFrom": "assetNetworking", + "assetLikes_liked_by_id_authUser_id_fk": { + "name": "assetLikes_liked_by_id_authUser_id_fk", + "tableFrom": "assetLikes", "tableTo": "authUser", - "columnsFrom": ["following_id"], + "columnsFrom": ["liked_by_id"], "columnsTo": ["id"], "onDelete": "no action", "onUpdate": "no action" @@ -1563,8 +1563,8 @@ "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "collectionNetworking": { - "name": "collectionNetworking", + "userCollectionLikes": { + "name": "userCollectionLikes", "columns": { "collection_id": { "name": "collection_id", @@ -1601,18 +1601,18 @@ } }, "foreignKeys": { - "collectionNetworking_collection_id_userCollection_id_fk": { - "name": "collectionNetworking_collection_id_userCollection_id_fk", - "tableFrom": "collectionNetworking", + "userCollectionLikes_collection_id_userCollection_id_fk": { + "name": "userCollectionLikes_collection_id_userCollection_id_fk", + "tableFrom": "userCollectionLikes", "tableTo": "userCollection", "columnsFrom": ["collection_id"], "columnsTo": ["id"], "onDelete": "no action", "onUpdate": "no action" }, - "collectionNetworking_liked_by_id_authUser_id_fk": { - "name": "collectionNetworking_liked_by_id_authUser_id_fk", - "tableFrom": "collectionNetworking", + "userCollectionLikes_liked_by_id_authUser_id_fk": { + "name": "userCollectionLikes_liked_by_id_authUser_id_fk", + "tableFrom": "userCollectionLikes", "tableTo": "authUser", "columnsFrom": ["liked_by_id"], "columnsTo": ["id"], diff --git a/src/v2/db/migrations/meta/_journal.json b/src/v2/db/migrations/meta/_journal.json index be6a204..bddd472 100644 --- a/src/v2/db/migrations/meta/_journal.json +++ b/src/v2/db/migrations/meta/_journal.json @@ -5,8 +5,8 @@ { "idx": 0, "version": "5", - "when": 1701013045181, - "tag": "0000_harsh_tarot", + "when": 1701020851212, + "tag": "0000_warm_nick_fury", "breakpoints": true } ] From c0aac68b82e1d846d1fda041033cfc48c6ea22ec Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Mon, 27 Nov 2023 13:48:27 +0000 Subject: [PATCH 170/318] store username directly into asset table --- package.json | 30 +- pnpm-lock.yaml | 8785 +++++++---------- src/scripts/seed/seed.ts | 16 +- src/v2/db/drizzle.ts | 2 +- ..._nick_fury.sql => 0000_shiny_valkyrie.sql} | 14 +- src/v2/db/migrations/meta/0000_snapshot.json | 3518 ++++--- src/v2/db/migrations/meta/_journal.json | 24 +- src/v2/db/schema.ts | 2 +- src/v2/db/schema/asset/asset.ts | 12 +- .../{user-networking.ts => user-following.ts} | 24 +- src/v2/db/schema/user/user.ts | 6 +- src/v2/lib/managers/asset/asset-manager.ts | 2 + .../lib/managers/user/user-follow-manager.ts | 34 +- 13 files changed, 5794 insertions(+), 6675 deletions(-) rename src/v2/db/migrations/{0000_warm_nick_fury.sql => 0000_shiny_valkyrie.sql} (96%) rename src/v2/db/schema/user/{user-networking.ts => user-following.ts} (62%) diff --git a/package.json b/package.json index 7f5aeee..ecb1c7c 100644 --- a/package.json +++ b/package.json @@ -19,36 +19,36 @@ }, "devDependencies": { "@asteasolutions/zod-to-openapi": "^6.3.0", - "@cloudflare/workers-types": "^4.20231025.0", - "@types/node": "^20.9.1", + "@cloudflare/workers-types": "^4.20231121.0", + "@types/node": "^20.10.0", "dotenv": "^16.3.1", - "drizzle-kit": "^0.20.2", - "eslint": "^8.53.0", + "drizzle-kit": "^0.20.6", + "eslint": "^8.54.0", "eslint-config-google": "^0.14.0", "eslint-plugin-json": "^3.1.0", "husky": "^8.0.3", "openapi-generator": "link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator", - "tsx": "^4.1.2", - "typescript": "^5.2.2", - "wrangler": "3.16.0" + "tsx": "^4.5.0", + "typescript": "^5.3.2", + "wrangler": "3.17.1" }, "private": true, "dependencies": { - "@hono/swagger-ui": "^0.1.0", - "@hono/zod-openapi": "^0.8.5", - "@libsql/client": "0.4.0-pre.1", + "@hono/swagger-ui": "^0.2.0", + "@hono/zod-openapi": "^0.8.6", + "@libsql/client": "0.4.0-pre.2", "@lucia-auth/adapter-session-unstorage": "^2.1.0", "@lucia-auth/adapter-sqlite": "^2.0.1", "@lucia-auth/oauth": "^3.5.0", - "@typescript-eslint/eslint-plugin": "^6.11.0", + "@typescript-eslint/eslint-plugin": "^6.12.0", "better-sqlite3": "^9.1.1", "drizzle-orm": "^0.29.0", "drizzle-zod": "^0.5.1", - "hono": "^3.10.1", + "hono": "^3.10.2", "lucia": "^2.7.4", - "miniflare": "^3.20231030.0", - "mysql2": "^3.6.3", - "oslo": "^0.22.0", + "miniflare": "^3.20231030.1", + "mysql2": "^3.6.5", + "oslo": "^0.23.1", "prettier": "^3.1.0", "unstorage": "^1.10.1", "uuid": "^9.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8045dc9..5b0d6df 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4981 +1,3822 @@ -lockfileVersion: "6.0" +lockfileVersion: '6.0' settings: - autoInstallPeers: true - excludeLinksFromLockfile: false + autoInstallPeers: true + excludeLinksFromLockfile: false dependencies: - "@hono/swagger-ui": - specifier: ^0.1.0 - version: 0.1.0(hono@3.10.1) - "@hono/zod-openapi": - specifier: ^0.8.5 - version: 0.8.5(hono@3.10.1)(zod@3.22.4) - "@libsql/client": - specifier: 0.4.0-pre.1 - version: 0.4.0-pre.1 - "@lucia-auth/adapter-session-unstorage": - specifier: ^2.1.0 - version: 2.1.0(lucia@2.7.4)(unstorage@1.10.1) - "@lucia-auth/adapter-sqlite": - specifier: ^2.0.1 - version: 2.0.1(@libsql/client@0.4.0-pre.1)(better-sqlite3@9.1.1)(lucia@2.7.4) - "@lucia-auth/oauth": - specifier: ^3.5.0 - version: 3.5.0(lucia@2.7.4) - "@typescript-eslint/eslint-plugin": - specifier: ^6.11.0 - version: 6.11.0(@typescript-eslint/parser@6.11.0)(eslint@8.53.0)(typescript@5.2.2) - better-sqlite3: - specifier: ^9.1.1 - version: 9.1.1 - drizzle-orm: - specifier: ^0.29.0 - version: 0.29.0(@cloudflare/workers-types@4.20231025.0)(@libsql/client@0.4.0-pre.1)(better-sqlite3@9.1.1)(mysql2@3.6.3) - drizzle-zod: - specifier: ^0.5.1 - version: 0.5.1(drizzle-orm@0.29.0)(zod@3.22.4) - hono: - specifier: ^3.10.1 - version: 3.10.1 - lucia: - specifier: ^2.7.4 - version: 2.7.4 - miniflare: - specifier: ^3.20231030.0 - version: 3.20231030.0 - mysql2: - specifier: ^3.6.3 - version: 3.6.3 - oslo: - specifier: ^0.22.0 - version: 0.22.0 - prettier: - specifier: ^3.1.0 - version: 3.1.0 - unstorage: - specifier: ^1.10.1 - version: 1.10.1 - uuid: - specifier: ^9.0.1 - version: 9.0.1 - zod: - specifier: ^3.22.4 - version: 3.22.4 + '@hono/swagger-ui': + specifier: ^0.2.0 + version: 0.2.0(hono@3.10.2) + '@hono/zod-openapi': + specifier: ^0.8.6 + version: 0.8.6(hono@3.10.2)(zod@3.22.4) + '@libsql/client': + specifier: 0.4.0-pre.2 + version: 0.4.0-pre.2 + '@lucia-auth/adapter-session-unstorage': + specifier: ^2.1.0 + version: 2.1.0(lucia@2.7.4)(unstorage@1.10.1) + '@lucia-auth/adapter-sqlite': + specifier: ^2.0.1 + version: 2.0.1(@libsql/client@0.4.0-pre.2)(better-sqlite3@9.1.1)(lucia@2.7.4) + '@lucia-auth/oauth': + specifier: ^3.5.0 + version: 3.5.0(lucia@2.7.4) + '@typescript-eslint/eslint-plugin': + specifier: ^6.12.0 + version: 6.12.0(@typescript-eslint/parser@6.12.0)(eslint@8.54.0)(typescript@5.3.2) + better-sqlite3: + specifier: ^9.1.1 + version: 9.1.1 + drizzle-orm: + specifier: ^0.29.0 + version: 0.29.0(@cloudflare/workers-types@4.20231121.0)(@libsql/client@0.4.0-pre.2)(better-sqlite3@9.1.1)(mysql2@3.6.5) + drizzle-zod: + specifier: ^0.5.1 + version: 0.5.1(drizzle-orm@0.29.0)(zod@3.22.4) + hono: + specifier: ^3.10.2 + version: 3.10.2 + lucia: + specifier: ^2.7.4 + version: 2.7.4 + miniflare: + specifier: ^3.20231030.1 + version: 3.20231030.1 + mysql2: + specifier: ^3.6.5 + version: 3.6.5 + oslo: + specifier: ^0.23.1 + version: 0.23.1 + prettier: + specifier: ^3.1.0 + version: 3.1.0 + unstorage: + specifier: ^1.10.1 + version: 1.10.1 + uuid: + specifier: ^9.0.1 + version: 9.0.1 + zod: + specifier: ^3.22.4 + version: 3.22.4 devDependencies: - "@asteasolutions/zod-to-openapi": - specifier: ^6.3.0 - version: 6.3.0(zod@3.22.4) - "@cloudflare/workers-types": - specifier: ^4.20231025.0 - version: 4.20231025.0 - "@types/node": - specifier: ^20.9.1 - version: 20.9.1 - dotenv: - specifier: ^16.3.1 - version: 16.3.1 - drizzle-kit: - specifier: ^0.20.2 - version: 0.20.2 - eslint: - specifier: ^8.53.0 - version: 8.53.0 - eslint-config-google: - specifier: ^0.14.0 - version: 0.14.0(eslint@8.53.0) - eslint-plugin-json: - specifier: ^3.1.0 - version: 3.1.0 - husky: - specifier: ^8.0.3 - version: 8.0.3 - openapi-generator: - specifier: link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator - version: link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator - tsx: - specifier: ^4.1.2 - version: 4.1.2 - typescript: - specifier: ^5.2.2 - version: 5.2.2 - wrangler: - specifier: 3.16.0 - version: 3.16.0 + '@asteasolutions/zod-to-openapi': + specifier: ^6.3.0 + version: 6.3.0(zod@3.22.4) + '@cloudflare/workers-types': + specifier: ^4.20231121.0 + version: 4.20231121.0 + '@types/node': + specifier: ^20.10.0 + version: 20.10.0 + dotenv: + specifier: ^16.3.1 + version: 16.3.1 + drizzle-kit: + specifier: ^0.20.6 + version: 0.20.6 + eslint: + specifier: ^8.54.0 + version: 8.54.0 + eslint-config-google: + specifier: ^0.14.0 + version: 0.14.0(eslint@8.54.0) + eslint-plugin-json: + specifier: ^3.1.0 + version: 3.1.0 + husky: + specifier: ^8.0.3 + version: 8.0.3 + openapi-generator: + specifier: link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator + version: link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator + tsx: + specifier: ^4.5.0 + version: 4.5.0 + typescript: + specifier: ^5.3.2 + version: 5.3.2 + wrangler: + specifier: 3.17.1 + version: 3.17.1 packages: - /@aashutoshrathi/word-wrap@1.2.6: - resolution: - { - integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==, - } - engines: { node: ">=0.10.0" } - - /@asteasolutions/zod-to-openapi@5.5.0(zod@3.22.4): - resolution: - { - integrity: sha512-d5HwrvM6dOKr3XdeF+DmashGvfEc+1oiEfbscugsiwSTrFtuMa7ETpW9sTNnVgn+hJaz+PRxPQUYD7q9/5dUig==, - } - peerDependencies: - zod: ^3.20.2 - dependencies: - openapi3-ts: 4.1.2 - zod: 3.22.4 - dev: false - - /@asteasolutions/zod-to-openapi@6.3.0(zod@3.22.4): - resolution: - { - integrity: sha512-ca7Svz3BWkMaIP3M1YGsyxgp7AcKXlTmy19ozhY0DslhatXbnyxdvxlmiI0TmvkIfi6RpQfm+eK1neVLsh6Riw==, - } - peerDependencies: - zod: ^3.20.2 - dependencies: - openapi3-ts: 4.1.2 - zod: 3.22.4 - dev: true - - /@cloudflare/kv-asset-handler@0.2.0: - resolution: - { - integrity: sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==, - } - dependencies: - mime: 3.0.0 - dev: true - - /@cloudflare/workerd-darwin-64@1.20231030.0: - resolution: - { - integrity: sha512-J4PQ9utPxLya9yHdMMx3AZeC5M/6FxcoYw6jo9jbDDFTy+a4Gslqf4Im9We3aeOEdPXa3tgQHVQOSelJSZLhIw==, - } - engines: { node: ">=16" } - cpu: [x64] - os: [darwin] - requiresBuild: true - optional: true - - /@cloudflare/workerd-darwin-arm64@1.20231030.0: - resolution: - { - integrity: sha512-WSJJjm11Del4hSneiNB7wTXGtBXI4QMCH9l5qf4iT5PAW8cESGcCmdHtWDWDtGAAGcvmLT04KNvmum92vRKKQQ==, - } - engines: { node: ">=16" } - cpu: [arm64] - os: [darwin] - requiresBuild: 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 - 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 - 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 - optional: true - - /@cloudflare/workers-types@4.20231025.0: - resolution: - { - integrity: sha512-TkcZkntUTOcvJ4vgmwpNfLTclpMbmbClZCe62B25/VTukmyv91joRa4eKzSjzCZUXTbFHNmVdOpmGaaJU2U3+A==, - } - - /@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-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-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-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-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-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-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-community/eslint-utils@4.4.0(eslint@8.53.0): - resolution: - { - integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.53.0 - eslint-visitor-keys: 3.4.3 - - /@eslint-community/regexpp@4.10.0: - resolution: - { - integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==, - } - engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } - - /@eslint/eslintrc@2.1.3: - resolution: - { - integrity: sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.6.1 - globals: 13.23.0 - ignore: 5.3.0 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - /@eslint/js@8.53.0: - resolution: - { - integrity: sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - - /@fastify/busboy@2.1.0: - resolution: - { - integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==, - } - engines: { node: ">=14" } - - /@hono/swagger-ui@0.1.0(hono@3.10.1): - resolution: - { - integrity: sha512-W5WEEhk2QtiqdSfM40FcK98Q5Bz4H/NfNqBUSkcZ46ys+DG4wt1yGsmRZgdJMje6t5Vn8eFN+9nyO+/dAp3drA==, - } - peerDependencies: - hono: "*" - dependencies: - hono: 3.10.1 - dev: false - - /@hono/zod-openapi@0.8.5(hono@3.10.1)(zod@3.22.4): - resolution: - { - integrity: sha512-yqHa8SWPdjO6iA1owdF6vDdNfPGknt8C5xz0QIdJQrgZTww/L071O5G504gzM+6TixprxqThav8hI+cPXs0stw==, - } - engines: { node: ">=16.0.0" } - peerDependencies: - hono: ">=3.9.0" - zod: 3.* - dependencies: - "@asteasolutions/zod-to-openapi": 5.5.0(zod@3.22.4) - "@hono/zod-validator": 0.1.11(hono@3.10.1)(zod@3.22.4) - hono: 3.10.1 - zod: 3.22.4 - dev: false - - /@hono/zod-validator@0.1.11(hono@3.10.1)(zod@3.22.4): - resolution: - { - integrity: sha512-PQXeHUP0+36qpRt8yfeD7N2jbK3ETlGvSN6dMof/HwUC/APRokQRjpXZm4rrlG71Ft0aWE01+Bm4XejqPie5Uw==, - } - peerDependencies: - hono: ">=3.9.0" - zod: ^3.19.1 - dependencies: - hono: 3.10.1 - zod: 3.22.4 - dev: false - - /@humanwhocodes/config-array@0.11.13: - resolution: - { - integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==, - } - engines: { node: ">=10.10.0" } - dependencies: - "@humanwhocodes/object-schema": 2.0.1 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - /@humanwhocodes/module-importer@1.0.1: - resolution: - { - integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, - } - engines: { node: ">=12.22" } - - /@humanwhocodes/object-schema@2.0.1: - resolution: - { - integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==, - } - - /@ioredis/commands@1.2.0: - resolution: - { - integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==, - } - dev: false - - /@libsql/client@0.4.0-pre.1: - resolution: - { - integrity: sha512-6VvMVl/tmmZG7lcGvTwQnmfHmUL0Bj6XZGOu2z3LcmV7Yx+g6Igla8S+OSUzj/2m9nezGaAtgtjOcZlQacQl/A==, - } - dependencies: - "@libsql/hrana-client": 0.5.5 - js-base64: 3.7.5 - libsql: 0.2.0-pre.1 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - dev: false - - /@libsql/darwin-arm64@0.2.0-pre.1: - resolution: - { - integrity: sha512-U4+Zer7C5FHgYjYp5687k29W4y8YzizCPJX91OrY4d/ZwXducjIMbIAFp160iZ8R7T2uTsGt6HxV17iXEC0V6w==, - } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@libsql/darwin-x64@0.2.0-pre.1: - resolution: - { - integrity: sha512-rxjjpfEQa1NAR8uek/S0naWvCbuL2qV0Wp6YGctTJFUZHUS32/RFYrmT8D5Dv6XlhqIS8XSLUDSAr9lVm4xi2A==, - } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@libsql/hrana-client@0.5.5: - resolution: - { - integrity: sha512-i+hDBpiV719poqEiHupUUZYKJ9YSbCRFe5Q2PQ0v3mHIftePH6gayLjp2u6TXbqbO/Dv6y8yyvYlBXf/kFfRZA==, - } - dependencies: - "@libsql/isomorphic-fetch": 0.1.10 - "@libsql/isomorphic-ws": 0.1.5 - js-base64: 3.7.5 - node-fetch: 3.3.2 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - dev: false - - /@libsql/isomorphic-fetch@0.1.10: - resolution: - { - integrity: sha512-dH0lMk50gKSvEKD78xWMu60SY1sjp1sY//iFLO0XMmBwfVfG136P9KOk06R4maBdlb8KMXOzJ1D28FR5ZKnHTA==, - } - dependencies: - "@types/node-fetch": 2.6.9 - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding - dev: false - - /@libsql/isomorphic-ws@0.1.5: - resolution: - { - integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==, - } - dependencies: - "@types/ws": 8.5.9 - ws: 8.14.2 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: false - - /@libsql/linux-arm64-gnu@0.2.0-pre.1: - resolution: - { - integrity: sha512-dWq75OHHhcP3W07AON2oi8xg+MqAibzCQdjly59lr60rdarllqggf4ua6ktP82qcdShJqL2nGvvcYCHV1kILWQ==, - } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@libsql/linux-arm64-musl@0.2.0-pre.1: - resolution: - { - integrity: sha512-6SuESjm0ZRuADhFaXRO7+yK7WJwpdlDWOEEqzZfYRV+twlCRXb8WNSQo3O/WYTFbGIdd4dNSIQCy4+tBmbV7Tg==, - } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@libsql/linux-x64-gnu@0.2.0-pre.1: - resolution: - { - integrity: sha512-ATHqNP5hhOgJ3QbgBR+AN3taB0CKbWIFdJ5ObCY841i274zFbZoDe0tjjSlamxS2e1EeG4SjBpLhNhBzDm6jIQ==, - } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@libsql/linux-x64-musl@0.2.0-pre.1: - resolution: - { - integrity: sha512-ouiAKD0DzuOfLULjn3VrjgU8BEtsE3Dp7wKyeJnhYSipMiBsWzPlBMmME8+zE5SGExBiTBbv1xxi1s3rHQzaFQ==, - } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@libsql/win32-x64-msvc@0.2.0-pre.1: - resolution: - { - integrity: sha512-P4mT0V+LMKzfraklerCvjrC9rTff7/5JFUpsRpAtw7RFQM2vIt5SqzgGNsHQsWW5/s9Ie0tqQB5A97hVSjgyOw==, - } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@lucia-auth/adapter-session-unstorage@2.1.0(lucia@2.7.4)(unstorage@1.10.1): - resolution: - { - integrity: sha512-ItK7urZhLZv7UO99BcODjRhSAv58UPc+KQAmnkSvri2WBc22vFEjnjd/oWp3CZPdbbrJkuTvsuhFXH1ySBfOLg==, - } - peerDependencies: - lucia: ^2.0.0 - unstorage: ^1.9.0 - dependencies: - lucia: 2.7.4 - unstorage: 1.10.1 - dev: false - - /@lucia-auth/adapter-sqlite@2.0.1(@libsql/client@0.4.0-pre.1)(better-sqlite3@9.1.1)(lucia@2.7.4): - resolution: - { - integrity: sha512-yc7XQ4X3sWG1gyUGHqaXipJIkmvB4MOgJypnSMWy7Vjhn3AOCM2xw51xTs+dGpLOQIn2Laomg9xpmDM2/9tgqQ==, - } - peerDependencies: - "@libsql/client": ^0.3.0 - better-sqlite3: 8.x - 9.x - lucia: ^2.0.0 - peerDependenciesMeta: - "@libsql/client": - optional: true - better-sqlite3: - optional: true - dependencies: - "@libsql/client": 0.4.0-pre.1 - better-sqlite3: 9.1.1 - lucia: 2.7.4 - dev: false - - /@lucia-auth/oauth@3.5.0(lucia@2.7.4): - resolution: - { - integrity: sha512-JSwAMVwlDJtbvfcJV1nbkv41OD830pgICrx8zFT71SYd5I1MnEQ+GqMTXBGRyxzc5XlLatT8ZS1Jt0k81487xg==, - } - peerDependencies: - lucia: ^2.0.0 - dependencies: - lucia: 2.7.4 - dev: false - - /@neon-rs/load@0.0.4: - resolution: - { - integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==, - } - dev: false - - /@node-rs/argon2-android-arm-eabi@1.5.2: - resolution: - { - integrity: sha512-vVZec4ITr9GumAy0p8Zj8ozie362gtbZrTkLp9EqvuFZ/HrZzR09uS2IsDgm4mAstg/rc4A1gLRrHI8jDdbjkA==, - } - engines: { node: ">= 10" } - cpu: [arm] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-android-arm64@1.5.2: - resolution: - { - integrity: sha512-SwhnsXyrpgtWDTwYds1WUnxLA/kVP8HVaImYwQ3Wemqj1lkzcSoIaNyjNWkyrYGqO1tVc1YUrqsbd5eCHh+3sg==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-darwin-arm64@1.5.2: - resolution: - { - integrity: sha512-+1ZMKiCCv2pip/o1Xg09piQru2LOIBPQ1vS4is86f55N3jjZnSfP+db5mYCSRuB0gRYqui98he7su7OGXlF4gQ==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-darwin-x64@1.5.2: - resolution: - { - integrity: sha512-mQ57mORlsxpfjcEsVpiHyHCOp6Ljrz/rVNWk8ihnPWw0qt0EqF1zbHRxTEPemL1iBHL9UyXpXrKS4JKq6xMn5w==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-freebsd-x64@1.5.2: - resolution: - { - integrity: sha512-UjKbFd3viYcpiwflkU4haEdNUMk1V2fVCJImWLWQns/hVval9BrDv5xsBwgdynbPHDlPOiWj816LBQwhWLGVWA==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-arm-gnueabihf@1.5.2: - resolution: - { - integrity: sha512-36GJjJBnVuscV9CTn8RVDeJysnmIzr6Lp7QBCDczYHi6eKFuA8udCJb4SRyJqdvIuzycKG1RL56FbcFBJYCYIA==, - } - engines: { node: ">= 10" } - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-arm64-gnu@1.5.2: - resolution: - { - integrity: sha512-sE0ydb2gp6xC+5vbVz8l3paaiBbFQIB2Rwp5wx9MmKiYdTfcO5WkGeADuSgoFiTcSEz1RsHXqrdVy6j/LtSqtA==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-arm64-musl@1.5.2: - resolution: - { - integrity: sha512-LhE0YHB0aJCwlbsQrwePik/KFWUc9qMriJIL5KiejK3bDoTVY4ihH587QT56JyaLvl3nBJaAV8l5yMqQdHnouA==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-x64-gnu@1.5.2: - resolution: - { - integrity: sha512-MnKLiBlyg05pxvKXe3lNgBL9El9ThD74hvVEiWH1Xk40RRrJ507NCOWXVmQ0FDq1mjTeGFxbIvk+AcoF0NSLIQ==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-x64-musl@1.5.2: - resolution: - { - integrity: sha512-tzLgASY0Ng2OTW7Awwl9UWzjbWx8/uD6gXcZ/k/nYGSZE5Xp8EOD2NUqHLbK6KZE3775A0R25ShpiSxCadYqkg==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-win32-arm64-msvc@1.5.2: - resolution: - { - integrity: sha512-vpTwSvv3oUXTpWZh0/HxdJ5wFMlmS7aVDwL4ATWepTZhMG4n+TO0+tVLdcPHCbg0oc6hCWBjWNPlSn9mW+YIgA==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-win32-ia32-msvc@1.5.2: - resolution: - { - integrity: sha512-KPpZR15ui7uQWQXKmtaKyUQRs4UJdXnIIfiyFLGmLWCdEKlr3MtIGFt0fdziu4BF5ZObD8Ic6QvT0VXK4OJiww==, - } - engines: { node: ">= 10" } - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-win32-x64-msvc@1.5.2: - resolution: - { - integrity: sha512-/pGuwixJS8ZlpwhX9iM6g6JEeZYo1TtnNf8exwsOi7gxcUoTUfw5it+5GfbY/n+xRBz/DIU4bzUmXmh+7Gh0ug==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2@1.5.2: - resolution: - { - integrity: sha512-qq7wOSsdP2b4rXEapWNmsCjpaTGZWtp9kZmri98GYCDZqN8UJUG5zSue4XtYWWJMWKJVE/hkaIwk+BgN1ZUn0Q==, - } - engines: { node: ">= 10" } - optionalDependencies: - "@node-rs/argon2-android-arm-eabi": 1.5.2 - "@node-rs/argon2-android-arm64": 1.5.2 - "@node-rs/argon2-darwin-arm64": 1.5.2 - "@node-rs/argon2-darwin-x64": 1.5.2 - "@node-rs/argon2-freebsd-x64": 1.5.2 - "@node-rs/argon2-linux-arm-gnueabihf": 1.5.2 - "@node-rs/argon2-linux-arm64-gnu": 1.5.2 - "@node-rs/argon2-linux-arm64-musl": 1.5.2 - "@node-rs/argon2-linux-x64-gnu": 1.5.2 - "@node-rs/argon2-linux-x64-musl": 1.5.2 - "@node-rs/argon2-win32-arm64-msvc": 1.5.2 - "@node-rs/argon2-win32-ia32-msvc": 1.5.2 - "@node-rs/argon2-win32-x64-msvc": 1.5.2 - dev: false - - /@node-rs/bcrypt-android-arm-eabi@1.7.3: - resolution: - { - integrity: sha512-l53RuBqnqNvBN2jx09Ws6jpLmuQdSDx10n0GeaTfwh1svxsC8bPpVmxkfBExsT2Tu7KF38gTnPZvwsxysZQyPQ==, - } - engines: { node: ">= 10" } - cpu: [arm] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-android-arm64@1.7.3: - resolution: - { - integrity: sha512-TZpm4VbiViqDMvusrcYzLr1b1M5FDF0cDNiTUciLeBSsKtU5lNdEZGAU7gvCnrKoUWpGuOblHU7613zuB7SiNQ==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-darwin-arm64@1.7.3: - resolution: - { - integrity: sha512-SiUuAabynVsmixZMjh5xrn8w47EnV0HzbW9st4DPoVhn/wzdUcksIXDY75aoQG2EIzKLN8IGb+CIVnPGmRyhxw==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-darwin-x64@1.7.3: - resolution: - { - integrity: sha512-R+81Z0eX4hZPvCXY5Z6l0l+JrTU3WcSYGHP0QYV9uwdaafOz6EhrCXUzZ02AIcAbNoVR8eucYVruq9PiasXoVw==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-freebsd-x64@1.7.3: - resolution: - { - integrity: sha512-0pItU/5K3e83JjcJj9fZv+78txUoZ3hHCT7n/UMdu9mkpUzhX/rqb4jmQpJpD+UQoR76xp3qDo5RMgQBffBVNg==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-arm-gnueabihf@1.7.3: - resolution: - { - integrity: sha512-HTSybWUjNe8rWuXkTkMeFDiQNHc6VioRcgv6AeHZphIxiT6dFbnhXNkfz4Hr0zxvyPhZ3NrYjT2AmPVFT6VW3Q==, - } - engines: { node: ">= 10" } - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-arm64-gnu@1.7.3: - resolution: - { - integrity: sha512-rWep6Y+v/c4bZHaM8LmSsrMwMmDR9wG4/q+3Z9VzR8xdnt5VCbuQdYWpf3sgGRGjTRdTBAdSK8x1reOjqsJ3Jg==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-arm64-musl@1.7.3: - resolution: - { - integrity: sha512-TyWEKhxr+yfGcMKzVV/ARZw+Hrky2yl91bo0XYU2ZW6I6LDC0emNsXugdWjwz8ADI4OWhhrOjXD8GCilxiB2Rg==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-x64-gnu@1.7.3: - resolution: - { - integrity: sha512-PofxM1Qg7tZKj1oP0I7tBTSSLr8Xc2uxx+P3pBCPmYzaBwWqGteNHJlF7n2q5xiH7YOlguH4w5CmcEjsiA3K4A==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-x64-musl@1.7.3: - resolution: - { - integrity: sha512-D5V6/dDVKP8S/ieDBLGhTn4oTo3upbrpWInynbhOMjJvPiIxVG1PiI3MXkWBtG9qtfleDk7gUkEKtAOxlIxDTQ==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-win32-arm64-msvc@1.7.3: - resolution: - { - integrity: sha512-b4gH2Yj5R4TwULrfMHd1Qqr+MrnFjVRUAJujDKPqi+PppSqezW8QF6DRSOL4GjnBmz5JEd64wxgeidvy7dsbGw==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-win32-ia32-msvc@1.7.3: - resolution: - { - integrity: sha512-E91ro+ybI0RhNc89aGaZQGll0YhPoHr8JacoWrNKwhg9zwNOYeuO0tokdMZdm6nF0/8obll0Mq7wO9AXO9iffw==, - } - engines: { node: ">= 10" } - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-win32-x64-msvc@1.7.3: - resolution: - { - integrity: sha512-LO/p9yjPODj/pQvPnowBuwpDdqiyUXQbqL1xb1RSP3NoyCFAGmjL5h0plSQrhLh8hskQiozBRXNaQurtsM7o0Q==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt@1.7.3: - resolution: - { - integrity: sha512-BF6u9CBPUiyk1zU+5iwikezf+xM4MFSu5cmrrg/PLKffGgIM13ZsY6DHftcTraETB04ryasjM/5IejotH+sO5Q==, - } - engines: { node: ">= 10" } - optionalDependencies: - "@node-rs/bcrypt-android-arm-eabi": 1.7.3 - "@node-rs/bcrypt-android-arm64": 1.7.3 - "@node-rs/bcrypt-darwin-arm64": 1.7.3 - "@node-rs/bcrypt-darwin-x64": 1.7.3 - "@node-rs/bcrypt-freebsd-x64": 1.7.3 - "@node-rs/bcrypt-linux-arm-gnueabihf": 1.7.3 - "@node-rs/bcrypt-linux-arm64-gnu": 1.7.3 - "@node-rs/bcrypt-linux-arm64-musl": 1.7.3 - "@node-rs/bcrypt-linux-x64-gnu": 1.7.3 - "@node-rs/bcrypt-linux-x64-musl": 1.7.3 - "@node-rs/bcrypt-win32-arm64-msvc": 1.7.3 - "@node-rs/bcrypt-win32-ia32-msvc": 1.7.3 - "@node-rs/bcrypt-win32-x64-msvc": 1.7.3 - dev: false - - /@nodelib/fs.scandir@2.1.5: - resolution: - { - integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, - } - engines: { node: ">= 8" } - dependencies: - "@nodelib/fs.stat": 2.0.5 - run-parallel: 1.2.0 - - /@nodelib/fs.stat@2.0.5: - resolution: - { - integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, - } - engines: { node: ">= 8" } - - /@nodelib/fs.walk@1.2.8: - resolution: - { - integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, - } - engines: { node: ">= 8" } - dependencies: - "@nodelib/fs.scandir": 2.1.5 - fastq: 1.15.0 - - /@parcel/watcher-android-arm64@2.3.0: - resolution: - { - integrity: sha512-f4o9eA3dgk0XRT3XhB0UWpWpLnKgrh1IwNJKJ7UJek7eTYccQ8LR7XUWFKqw6aEq5KUNlCcGvSzKqSX/vtWVVA==, - } - engines: { node: ">= 10.0.0" } - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-darwin-arm64@2.3.0: - resolution: - { - integrity: sha512-mKY+oijI4ahBMc/GygVGvEdOq0L4DxhYgwQqYAz/7yPzuGi79oXrZG52WdpGA1wLBPrYb0T8uBaGFo7I6rvSKw==, - } - engines: { node: ">= 10.0.0" } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-darwin-x64@2.3.0: - resolution: - { - integrity: sha512-20oBj8LcEOnLE3mgpy6zuOq8AplPu9NcSSSfyVKgfOhNAc4eF4ob3ldj0xWjGGbOF7Dcy1Tvm6ytvgdjlfUeow==, - } - engines: { node: ">= 10.0.0" } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-freebsd-x64@2.3.0: - resolution: - { - integrity: sha512-7LftKlaHunueAEiojhCn+Ef2CTXWsLgTl4hq0pkhkTBFI3ssj2bJXmH2L67mKpiAD5dz66JYk4zS66qzdnIOgw==, - } - engines: { node: ">= 10.0.0" } - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-linux-arm-glibc@2.3.0: - resolution: - { - integrity: sha512-1apPw5cD2xBv1XIHPUlq0cO6iAaEUQ3BcY0ysSyD9Kuyw4MoWm1DV+W9mneWI+1g6OeP6dhikiFE6BlU+AToTQ==, - } - engines: { node: ">= 10.0.0" } - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-linux-arm64-glibc@2.3.0: - resolution: - { - integrity: sha512-mQ0gBSQEiq1k/MMkgcSB0Ic47UORZBmWoAWlMrTW6nbAGoLZP+h7AtUM7H3oDu34TBFFvjy4JCGP43JlylkTQA==, - } - engines: { node: ">= 10.0.0" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-linux-arm64-musl@2.3.0: - resolution: - { - integrity: sha512-LXZAExpepJew0Gp8ZkJ+xDZaTQjLHv48h0p0Vw2VMFQ8A+RKrAvpFuPVCVwKJCr5SE+zvaG+Etg56qXvTDIedw==, - } - engines: { node: ">= 10.0.0" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-linux-x64-glibc@2.3.0: - resolution: - { - integrity: sha512-P7Wo91lKSeSgMTtG7CnBS6WrA5otr1K7shhSjKHNePVmfBHDoAOHYRXgUmhiNfbcGk0uMCHVcdbfxtuiZCHVow==, - } - engines: { node: ">= 10.0.0" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-linux-x64-musl@2.3.0: - resolution: - { - integrity: sha512-+kiRE1JIq8QdxzwoYY+wzBs9YbJ34guBweTK8nlzLKimn5EQ2b2FSC+tAOpq302BuIMjyuUGvBiUhEcLIGMQ5g==, - } - engines: { node: ">= 10.0.0" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-wasm@2.3.0: - resolution: - { - integrity: sha512-ejBAX8H0ZGsD8lSICDNyMbSEtPMWgDL0WFCt/0z7hyf5v8Imz4rAM8xY379mBsECkq/Wdqa5WEDLqtjZ+6NxfA==, - } - engines: { node: ">= 10.0.0" } - dependencies: - is-glob: 4.0.3 - micromatch: 4.0.5 - napi-wasm: 1.1.0 - dev: false - bundledDependencies: - - napi-wasm - - /@parcel/watcher-win32-arm64@2.3.0: - resolution: - { - integrity: sha512-35gXCnaz1AqIXpG42evcoP2+sNL62gZTMZne3IackM+6QlfMcJLy3DrjuL6Iks7Czpd3j4xRBzez3ADCj1l7Aw==, - } - engines: { node: ">= 10.0.0" } - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-win32-ia32@2.3.0: - resolution: - { - integrity: sha512-FJS/IBQHhRpZ6PiCjFt1UAcPr0YmCLHRbTc00IBTrelEjlmmgIVLeOx4MSXzx2HFEy5Jo5YdhGpxCuqCyDJ5ow==, - } - engines: { node: ">= 10.0.0" } - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-win32-x64@2.3.0: - resolution: - { - integrity: sha512-dLx+0XRdMnVI62kU3wbXvbIRhLck4aE28bIGKbRGS7BJNt54IIj9+c/Dkqb+7DJEbHUZAX1bwaoM8PqVlHJmCA==, - } - engines: { node: ">= 10.0.0" } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher@2.3.0: - resolution: - { - integrity: sha512-pW7QaFiL11O0BphO+bq3MgqeX/INAk9jgBldVDYjlQPO4VddoZnF22TcF9onMhnLVHuNqBJeRf+Fj7eezi/+rQ==, - } - engines: { node: ">= 10.0.0" } - dependencies: - detect-libc: 1.0.3 - is-glob: 4.0.3 - micromatch: 4.0.5 - node-addon-api: 7.0.0 - optionalDependencies: - "@parcel/watcher-android-arm64": 2.3.0 - "@parcel/watcher-darwin-arm64": 2.3.0 - "@parcel/watcher-darwin-x64": 2.3.0 - "@parcel/watcher-freebsd-x64": 2.3.0 - "@parcel/watcher-linux-arm-glibc": 2.3.0 - "@parcel/watcher-linux-arm64-glibc": 2.3.0 - "@parcel/watcher-linux-arm64-musl": 2.3.0 - "@parcel/watcher-linux-x64-glibc": 2.3.0 - "@parcel/watcher-linux-x64-musl": 2.3.0 - "@parcel/watcher-win32-arm64": 2.3.0 - "@parcel/watcher-win32-ia32": 2.3.0 - "@parcel/watcher-win32-x64": 2.3.0 - dev: false - - /@types/json-schema@7.0.15: - resolution: - { - integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, - } - dev: false - - /@types/node-fetch@2.6.9: - resolution: - { - integrity: sha512-bQVlnMLFJ2d35DkPNjEPmd9ueO/rh5EiaZt2bhqiSarPjZIuIV6bPQVqcrEyvNo+AfTrRGVazle1tl597w3gfA==, - } - dependencies: - "@types/node": 20.9.1 - form-data: 4.0.0 - dev: false - - /@types/node-forge@1.3.9: - resolution: - { - integrity: sha512-meK88cx/sTalPSLSoCzkiUB4VPIFHmxtXm5FaaqRDqBX2i/Sy8bJ4odsan0b20RBjPh06dAQ+OTTdnyQyhJZyQ==, - } - dependencies: - "@types/node": 20.9.1 - dev: true - - /@types/node@20.9.1: - resolution: - { - integrity: sha512-HhmzZh5LSJNS5O8jQKpJ/3ZcrrlG6L70hpGqMIAoM9YVD0YBRNWYsfwcXq8VnSjlNpCpgLzMXdiPo+dxcvSmiA==, - } - dependencies: - undici-types: 5.26.5 - - /@types/semver@7.5.5: - resolution: - { - integrity: sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==, - } - dev: false - - /@types/ws@8.5.9: - resolution: - { - integrity: sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg==, - } - dependencies: - "@types/node": 20.9.1 - dev: false - - /@typescript-eslint/eslint-plugin@6.11.0(@typescript-eslint/parser@6.11.0)(eslint@8.53.0)(typescript@5.2.2): - resolution: - { - integrity: sha512-uXnpZDc4VRjY4iuypDBKzW1rz9T5YBBK0snMn8MaTSNd2kMlj50LnLBABELjJiOL5YHk7ZD8hbSpI9ubzqYI0w==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - peerDependencies: - "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - dependencies: - "@eslint-community/regexpp": 4.10.0 - "@typescript-eslint/parser": 6.11.0(eslint@8.53.0)(typescript@5.2.2) - "@typescript-eslint/scope-manager": 6.11.0 - "@typescript-eslint/type-utils": 6.11.0(eslint@8.53.0)(typescript@5.2.2) - "@typescript-eslint/utils": 6.11.0(eslint@8.53.0)(typescript@5.2.2) - "@typescript-eslint/visitor-keys": 6.11.0 - debug: 4.3.4 - eslint: 8.53.0 - graphemer: 1.4.0 - ignore: 5.3.0 - natural-compare: 1.4.0 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/parser@6.11.0(eslint@8.53.0)(typescript@5.2.2): - resolution: - { - integrity: sha512-+whEdjk+d5do5nxfxx73oanLL9ghKO3EwM9kBCkUtWMRwWuPaFv9ScuqlYfQ6pAD6ZiJhky7TZ2ZYhrMsfMxVQ==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - dependencies: - "@typescript-eslint/scope-manager": 6.11.0 - "@typescript-eslint/types": 6.11.0 - "@typescript-eslint/typescript-estree": 6.11.0(typescript@5.2.2) - "@typescript-eslint/visitor-keys": 6.11.0 - debug: 4.3.4 - eslint: 8.53.0 - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/scope-manager@6.11.0: - resolution: - { - integrity: sha512-0A8KoVvIURG4uhxAdjSaxy8RdRE//HztaZdG8KiHLP8WOXSk0vlF7Pvogv+vlJA5Rnjj/wDcFENvDaHb+gKd1A==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - dependencies: - "@typescript-eslint/types": 6.11.0 - "@typescript-eslint/visitor-keys": 6.11.0 - dev: false - - /@typescript-eslint/type-utils@6.11.0(eslint@8.53.0)(typescript@5.2.2): - resolution: - { - integrity: sha512-nA4IOXwZtqBjIoYrJcYxLRO+F9ri+leVGoJcMW1uqr4r1Hq7vW5cyWrA43lFbpRvQ9XgNrnfLpIkO3i1emDBIA==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - dependencies: - "@typescript-eslint/typescript-estree": 6.11.0(typescript@5.2.2) - "@typescript-eslint/utils": 6.11.0(eslint@8.53.0)(typescript@5.2.2) - debug: 4.3.4 - eslint: 8.53.0 - ts-api-utils: 1.0.3(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/types@6.11.0: - resolution: - { - integrity: sha512-ZbEzuD4DwEJxwPqhv3QULlRj8KYTAnNsXxmfuUXFCxZmO6CF2gM/y+ugBSAQhrqaJL3M+oe4owdWunaHM6beqA==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - dev: false - - /@typescript-eslint/typescript-estree@6.11.0(typescript@5.2.2): - resolution: - { - integrity: sha512-Aezzv1o2tWJwvZhedzvD5Yv7+Lpu1by/U1LZ5gLc4tCx8jUmuSCMioPFRjliN/6SJIvY6HpTtJIWubKuYYYesQ==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - peerDependencies: - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - dependencies: - "@typescript-eslint/types": 6.11.0 - "@typescript-eslint/visitor-keys": 6.11.0 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/utils@6.11.0(eslint@8.53.0)(typescript@5.2.2): - resolution: - { - integrity: sha512-p23ibf68fxoZy605dc0dQAEoUsoiNoP3MD9WQGiHLDuTSOuqoTsa4oAy+h3KDkTcxbbfOtUjb9h3Ta0gT4ug2g==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.53.0) - "@types/json-schema": 7.0.15 - "@types/semver": 7.5.5 - "@typescript-eslint/scope-manager": 6.11.0 - "@typescript-eslint/types": 6.11.0 - "@typescript-eslint/typescript-estree": 6.11.0(typescript@5.2.2) - eslint: 8.53.0 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - - typescript - dev: false - - /@typescript-eslint/visitor-keys@6.11.0: - resolution: - { - integrity: sha512-+SUN/W7WjBr05uRxPggJPSzyB8zUpaYo2hByKasWbqr3PM8AXfZt8UHdNpBS1v9SA62qnSSMF3380SwDqqprgQ==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - dependencies: - "@typescript-eslint/types": 6.11.0 - eslint-visitor-keys: 3.4.3 - dev: false - - /@ungap/structured-clone@1.2.0: - resolution: - { - integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==, - } - - /acorn-jsx@5.3.2(acorn@8.11.2): - resolution: - { - integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, - } - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.11.2 - - /acorn-walk@8.3.0: - resolution: - { - integrity: sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==, - } - engines: { node: ">=0.4.0" } - - /acorn@8.11.2: - resolution: - { - integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==, - } - engines: { node: ">=0.4.0" } - hasBin: true - - /ajv@6.12.6: - resolution: - { - integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, - } - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - - /ansi-regex@5.0.1: - resolution: - { - integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, - } - engines: { node: ">=8" } - - /ansi-styles@4.3.0: - resolution: - { - integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, - } - engines: { node: ">=8" } - dependencies: - color-convert: 2.0.1 - - /anymatch@3.1.3: - resolution: - { - integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, - } - engines: { node: ">= 8" } - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - /arch@2.2.0: - resolution: - { - integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==, - } - dev: false - - /argparse@2.0.1: - resolution: - { - integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, - } - - /array-union@2.1.0: - resolution: - { - integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, - } - engines: { node: ">=8" } - dev: false - - /as-table@1.0.55: - resolution: - { - integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==, - } - dependencies: - printable-characters: 1.0.42 - - /asynckit@0.4.0: - resolution: - { - integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, - } - dev: false - - /balanced-match@1.0.2: - resolution: - { - integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, - } - - /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" } - - /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 - - /brace-expansion@1.1.11: - resolution: - { - integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, - } - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - /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==, - } - engines: { node: ">=8" } - dependencies: - fill-range: 7.0.1 - - /buffer-from@1.1.2: - resolution: - { - integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, - } - - /buffer@5.7.1: - resolution: - { - integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, - } - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: false - - /callsites@3.1.0: - resolution: - { - integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, - } - engines: { node: ">=6" } - - /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 - - /chalk@4.1.2: - resolution: - { - integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, - } - engines: { node: ">=10" } - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - /chalk@5.3.0: - resolution: - { - integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==, - } - engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } - dev: true - - /chokidar@3.5.3: - resolution: - { - integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, - } - engines: { node: ">= 8.10.0" } - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - /chownr@1.1.4: - resolution: - { - integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==, - } - dev: false - - /citty@0.1.4: - resolution: - { - integrity: sha512-Q3bK1huLxzQrvj7hImJ7Z1vKYJRPQCDnd0EjXfHMidcjecGOMuLrmuQmtWmFkuKLcMThlGh1yCKG8IEc6VeNXQ==, - } - dependencies: - consola: 3.2.3 - dev: false - - /cli-color@2.0.3: - resolution: - { - integrity: sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==, - } - engines: { node: ">=0.10" } - dependencies: - d: 1.0.1 - es5-ext: 0.10.62 - es6-iterator: 2.0.3 - memoizee: 0.4.15 - timers-ext: 0.1.7 - dev: true - - /clipboardy@3.0.0: - resolution: - { - integrity: sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - dependencies: - arch: 2.2.0 - execa: 5.1.1 - is-wsl: 2.2.0 - dev: false - - /cluster-key-slot@1.1.2: - resolution: - { - integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==, - } - engines: { node: ">=0.10.0" } - dev: false - - /color-convert@2.0.1: - resolution: - { - integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, - } - engines: { node: ">=7.0.0" } - dependencies: - color-name: 1.1.4 - - /color-name@1.1.4: - resolution: - { - integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, - } - - /combined-stream@1.0.8: - resolution: - { - integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, - } - engines: { node: ">= 0.8" } - dependencies: - delayed-stream: 1.0.0 - dev: false - - /commander@9.5.0: - resolution: - { - integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==, - } - engines: { node: ^12.20.0 || >=14 } - dev: true - - /concat-map@0.0.1: - resolution: - { - integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, - } - - /consola@3.2.3: - resolution: - { - integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==, - } - engines: { node: ^14.18.0 || >=16.10.0 } - dev: false - - /cookie-es@1.0.0: - resolution: - { - integrity: sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ==, - } - dev: false - - /cookie@0.5.0: - resolution: - { - integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==, - } - engines: { node: ">= 0.6" } - - /cross-spawn@7.0.3: - resolution: - { - integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, - } - engines: { node: ">= 8" } - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - /d@1.0.1: - resolution: - { - integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==, - } - 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==, - } - - /data-uri-to-buffer@4.0.1: - resolution: - { - integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==, - } - engines: { node: ">= 12" } - dev: false - - /debug@4.3.4: - resolution: - { - integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, - } - engines: { node: ">=6.0" } - peerDependencies: - supports-color: "*" - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - - /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==, - } - - /defu@6.1.3: - resolution: - { - integrity: sha512-Vy2wmG3NTkmHNg/kzpuvHhkqeIx3ODWqasgCRbKtbXEN0G+HpEEv9BtJLp7ZG1CZloFaC41Ah3ZFbq7aqCqMeQ==, - } - dev: false - - /delayed-stream@1.0.0: - resolution: - { - integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, - } - engines: { node: ">=0.4.0" } - dev: false - - /denque@2.1.0: - resolution: - { - integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==, - } - engines: { node: ">=0.10" } - dev: false - - /destr@2.0.2: - resolution: - { - integrity: sha512-65AlobnZMiCET00KaFFjUefxDX0khFA/E4myqZ7a6Sq1yZtR8+FVIvilVX66vF2uobSumxooYZChiRPCKNqhmg==, - } - dev: false - - /detect-libc@1.0.3: - resolution: - { - integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==, - } - engines: { node: ">=0.10" } - hasBin: true - dev: false - - /detect-libc@2.0.2: - resolution: - { - integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==, - } - engines: { node: ">=8" } - dev: false - - /difflib@0.2.4: - resolution: - { - integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==, - } - dependencies: - heap: 0.2.7 - dev: true - - /dir-glob@3.0.1: - resolution: - { - integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, - } - engines: { node: ">=8" } - dependencies: - path-type: 4.0.0 - dev: false - - /doctrine@3.0.0: - resolution: - { - integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==, - } - engines: { node: ">=6.0.0" } - dependencies: - esutils: 2.0.3 - - /dotenv@16.3.1: - resolution: - { - integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==, - } - engines: { node: ">=12" } - dev: true - - /dreamopt@0.8.0: - resolution: - { - integrity: sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==, - } - engines: { node: ">=0.4.0" } - dependencies: - wordwrap: 1.0.0 - dev: true - - /drizzle-kit@0.20.2: - resolution: - { - integrity: sha512-4iwjsIj2sY3B3MleKeyNzg/6myjXbTE/CBOXwfePoRVXayM3VwHGZboMkxUkmIQk6o7UAKRb2ODDpO24YNoL2g==, - } - 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(@cloudflare/workers-types@4.20231025.0)(@libsql/client@0.4.0-pre.1)(better-sqlite3@9.1.1)(mysql2@3.6.3): - 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: - "@cloudflare/workers-types": 4.20231025.0 - "@libsql/client": 0.4.0-pre.1 - better-sqlite3: 9.1.1 - mysql2: 3.6.3 - dev: false - - /drizzle-zod@0.5.1(drizzle-orm@0.29.0)(zod@3.22.4): - resolution: - { - integrity: sha512-C/8bvzUH/zSnVfwdSibOgFjLhtDtbKYmkbPbUCq46QZyZCH6kODIMSOgZ8R7rVjoI+tCj3k06MRJMDqsIeoS4A==, - } - peerDependencies: - drizzle-orm: ">=0.23.13" - zod: "*" - dependencies: - drizzle-orm: 0.29.0(@cloudflare/workers-types@4.20231025.0)(@libsql/client@0.4.0-pre.1)(better-sqlite3@9.1.1)(mysql2@3.6.3) - zod: 3.22.4 - dev: false - - /end-of-stream@1.4.4: - resolution: - { - integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, - } - dependencies: - once: 1.4.0 - dev: false - - /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 - - /escape-string-regexp@4.0.0: - resolution: - { - integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, - } - engines: { node: ">=10" } - - /eslint-config-google@0.14.0(eslint@8.53.0): - resolution: - { - integrity: sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==, - } - engines: { node: ">=0.10.0" } - peerDependencies: - eslint: ">=5.16.0" - dependencies: - eslint: 8.53.0 - dev: true - - /eslint-plugin-json@3.1.0: - resolution: - { - integrity: sha512-MrlG2ynFEHe7wDGwbUuFPsaT2b1uhuEFhJ+W1f1u+1C2EkXmTYJp4B1aAdQQ8M+CC3t//N/oRKiIVw14L2HR1g==, - } - engines: { node: ">=12.0" } - dependencies: - lodash: 4.17.21 - vscode-json-languageservice: 4.2.1 - dev: true - - /eslint-scope@7.2.2: - resolution: - { - integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - /eslint-visitor-keys@3.4.3: - resolution: - { - integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - - /eslint@8.53.0: - resolution: - { - integrity: sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - hasBin: true - dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.53.0) - "@eslint-community/regexpp": 4.10.0 - "@eslint/eslintrc": 2.1.3 - "@eslint/js": 8.53.0 - "@humanwhocodes/config-array": 0.11.13 - "@humanwhocodes/module-importer": 1.0.1 - "@nodelib/fs.walk": 1.2.8 - "@ungap/structured-clone": 1.2.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.23.0 - graphemer: 1.4.0 - ignore: 5.3.0 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.3 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - - /espree@9.6.1: - resolution: - { - integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - acorn: 8.11.2 - acorn-jsx: 5.3.2(acorn@8.11.2) - eslint-visitor-keys: 3.4.3 - - /esquery@1.5.0: - resolution: - { - integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==, - } - engines: { node: ">=0.10" } - dependencies: - estraverse: 5.3.0 - - /esrecurse@4.3.0: - resolution: - { - integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, - } - engines: { node: ">=4.0" } - dependencies: - estraverse: 5.3.0 - - /estraverse@5.3.0: - resolution: - { - integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, - } - engines: { node: ">=4.0" } - - /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" } - - /event-emitter@0.3.5: - resolution: - { - integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==, - } - dependencies: - d: 1.0.1 - es5-ext: 0.10.62 - dev: true - - /execa@5.1.1: - resolution: - { - integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==, - } - engines: { node: ">=10" } - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: false - - /exit-hook@2.2.1: - resolution: - { - integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==, - } - engines: { node: ">=6" } - - /expand-template@2.0.3: - resolution: - { - integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==, - } - engines: { node: ">=6" } - 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==, - } - - /fast-glob@3.3.2: - resolution: - { - integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==, - } - engines: { node: ">=8.6.0" } - dependencies: - "@nodelib/fs.stat": 2.0.5 - "@nodelib/fs.walk": 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: false - - /fast-json-stable-stringify@2.1.0: - resolution: - { - integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, - } - - /fast-levenshtein@2.0.6: - resolution: - { - integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, - } - - /fastq@1.15.0: - resolution: - { - integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==, - } - dependencies: - reusify: 1.0.4 - - /fetch-blob@3.2.0: - resolution: - { - integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==, - } - engines: { node: ^12.20 || >= 14.13 } - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 3.2.1 - dev: false - - /file-entry-cache@6.0.1: - resolution: - { - integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==, - } - engines: { node: ^10.12.0 || >=12.0.0 } - dependencies: - flat-cache: 3.2.0 - - /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" } - dependencies: - to-regex-range: 5.0.1 - - /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 - - /flat-cache@3.2.0: - resolution: - { - integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==, - } - engines: { node: ^10.12.0 || >=12.0.0 } - dependencies: - flatted: 3.2.9 - keyv: 4.5.4 - rimraf: 3.0.2 - - /flatted@3.2.9: - resolution: - { - integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==, - } - - /form-data@4.0.0: - resolution: - { - integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==, - } - engines: { node: ">= 6" } - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: false - - /formdata-polyfill@4.0.10: - resolution: - { - integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==, - } - engines: { node: ">=12.20.0" } - dependencies: - fetch-blob: 3.2.0 - dev: false - - /fs-constants@1.0.0: - resolution: - { - integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==, - } - dev: false - - /fs.realpath@1.0.0: - resolution: - { - integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, - } - - /fsevents@2.3.3: - resolution: - { - integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, - } - engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } - os: [darwin] - requiresBuild: true - optional: true - /generate-function@2.3.1: - resolution: - { - integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==, - } - dependencies: - is-property: 1.0.2 - dev: false - - /get-port-please@3.1.1: - resolution: - { - integrity: sha512-3UBAyM3u4ZBVYDsxOQfJDxEa6XTbpBDrOjp4mf7ExFRt5BKs/QywQQiJsh2B+hxcZLSapWqCRvElUe8DnKcFHA==, - } - dev: false - - /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 - - /get-stream@6.0.1: - resolution: - { - integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==, - } - engines: { node: ">=10" } - dev: false - - /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" } - dependencies: - is-glob: 4.0.3 - - /glob-parent@6.0.2: - resolution: - { - integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, - } - engines: { node: ">=10.13.0" } - dependencies: - is-glob: 4.0.3 - - /glob-to-regexp@0.4.1: - resolution: - { - integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==, - } - - /glob@7.2.3: - resolution: - { - integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, - } - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - /glob@8.1.0: - resolution: - { - integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==, - } - engines: { node: ">=12" } - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - dev: true - - /globals@13.23.0: - resolution: - { - integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==, - } - engines: { node: ">=8" } - dependencies: - type-fest: 0.20.2 - - /globby@11.1.0: - resolution: - { - integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, - } - engines: { node: ">=10" } - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.0 - merge2: 1.4.1 - slash: 3.0.0 - dev: false - - /graphemer@1.4.0: - resolution: - { - integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, - } - - /h3@1.8.2: - resolution: - { - integrity: sha512-1Ca0orJJlCaiFY68BvzQtP2lKLk46kcLAxVM8JgYbtm2cUg6IY7pjpYgWMwUvDO9QI30N5JAukOKoT8KD3Q0PQ==, - } - dependencies: - cookie-es: 1.0.0 - defu: 6.1.3 - destr: 2.0.2 - iron-webcrypto: 0.10.1 - radix3: 1.1.0 - ufo: 1.3.2 - uncrypto: 0.1.3 - unenv: 1.7.4 - dev: false - - /hanji@0.0.5: - resolution: - { - integrity: sha512-Abxw1Lq+TnYiL4BueXqMau222fPSPMFtya8HdpWsz/xVAhifXou71mPh/kY2+08RgFcVccjG3uZHs6K5HAe3zw==, - } - dependencies: - lodash.throttle: 4.1.1 - sisteransi: 1.0.5 - dev: true - - /has-flag@4.0.0: - resolution: - { - integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, - } - engines: { node: ">=8" } - - /heap@0.2.7: - resolution: - { - integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==, - } - dev: true - - /hono@3.10.1: - resolution: - { - integrity: sha512-4jPKCmYWLAoCMpmvOU+xNOQYdcNftip7sM/IsO8EPyGAtjk9fGNyUchG6huSzLrY449WDNGFPetVs5doepNnlA==, - } - engines: { node: ">=16.0.0" } - dev: false - - /http-shutdown@1.2.2: - resolution: - { - integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==, - } - engines: { iojs: ">= 1.0.0", node: ">= 0.12.0" } - dev: false - - /human-signals@2.1.0: - resolution: - { - integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==, - } - engines: { node: ">=10.17.0" } - dev: false - - /husky@8.0.3: - resolution: - { - integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==, - } - engines: { node: ">=14" } - hasBin: true - dev: true - - /iconv-lite@0.6.3: - resolution: - { - integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, - } - 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@5.3.0: - resolution: - { - integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==, - } - engines: { node: ">= 4" } - - /import-fresh@3.3.0: - resolution: - { - integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, - } - engines: { node: ">=6" } - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - /imurmurhash@0.1.4: - resolution: - { - integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, - } - engines: { node: ">=0.8.19" } - - /inflight@1.0.6: - resolution: - { - integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, - } - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - /inherits@2.0.4: - resolution: - { - integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, - } - - /ini@1.3.8: - resolution: - { - integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, - } - dev: false - - /ioredis@5.3.2: - resolution: - { - integrity: sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==, - } - engines: { node: ">=12.22.0" } - dependencies: - "@ioredis/commands": 1.2.0 - cluster-key-slot: 1.1.2 - debug: 4.3.4 - denque: 2.1.0 - lodash.defaults: 4.2.0 - lodash.isarguments: 3.1.0 - redis-errors: 1.2.0 - redis-parser: 3.0.0 - standard-as-callback: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: false - - /iron-webcrypto@0.10.1: - resolution: - { - integrity: sha512-QGOS8MRMnj/UiOa+aMIgfyHcvkhqNUsUxb1XzskENvbo+rEfp6TOwqd1KPuDzXC4OnGHcMSVxDGRoilqB8ViqA==, - } - dev: false - - /is-binary-path@2.1.0: - resolution: - { - integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, - } - engines: { node: ">=8" } - dependencies: - binary-extensions: 2.2.0 - - /is-docker@2.2.1: - resolution: - { - integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==, - } - engines: { node: ">=8" } - hasBin: true - dev: false - - /is-extglob@2.1.1: - resolution: - { - integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, - } - engines: { node: ">=0.10.0" } - - /is-glob@4.0.3: - resolution: - { - integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, - } - engines: { node: ">=0.10.0" } - dependencies: - is-extglob: 2.1.1 - - /is-number@7.0.0: - resolution: - { - integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, - } - engines: { node: ">=0.12.0" } - - /is-path-inside@3.0.3: - resolution: - { - integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, - } - engines: { node: ">=8" } - - /is-promise@2.2.2: - resolution: - { - integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==, - } - dev: true - - /is-property@1.0.2: - resolution: - { - integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==, - } - dev: false - - /is-stream@2.0.1: - resolution: - { - integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, - } - engines: { node: ">=8" } - dev: false - - /is-wsl@2.2.0: - resolution: - { - integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==, - } - engines: { node: ">=8" } - dependencies: - is-docker: 2.2.1 - dev: false - - /isexe@2.0.0: - resolution: - { - integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, - } - - /jiti@1.21.0: - resolution: - { - integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==, - } - hasBin: true - dev: false - - /js-base64@3.7.5: - resolution: - { - integrity: sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==, - } - dev: false - - /js-yaml@4.1.0: - resolution: - { - integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, - } - hasBin: true - dependencies: - argparse: 2.0.1 - - /json-buffer@3.0.1: - resolution: - { - integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, - } - - /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-schema-traverse@0.4.1: - resolution: - { - integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, - } - - /json-stable-stringify-without-jsonify@1.0.1: - resolution: - { - integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, - } - - /jsonc-parser@3.2.0: - resolution: - { - integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==, - } - - /keyv@4.5.4: - resolution: - { - integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, - } - dependencies: - json-buffer: 3.0.1 - - /levn@0.4.1: - resolution: - { - integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, - } - engines: { node: ">= 0.8.0" } - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - - /libsql@0.2.0-pre.1: - resolution: - { - integrity: sha512-wVSUo3S6BY7Yz1fbJGVeHzm2HSeG58iAvCg//81Wv1Z7Zm4MoHedd5/0cbn1v0oM6e5SaGprkYS5lDqHgyHlWA==, - } - cpu: [x64, arm64] - os: [darwin, linux, win32] - dependencies: - "@neon-rs/load": 0.0.4 - detect-libc: 2.0.2 - optionalDependencies: - "@libsql/darwin-arm64": 0.2.0-pre.1 - "@libsql/darwin-x64": 0.2.0-pre.1 - "@libsql/linux-arm64-gnu": 0.2.0-pre.1 - "@libsql/linux-arm64-musl": 0.2.0-pre.1 - "@libsql/linux-x64-gnu": 0.2.0-pre.1 - "@libsql/linux-x64-musl": 0.2.0-pre.1 - "@libsql/win32-x64-msvc": 0.2.0-pre.1 - dev: false - - /listhen@1.5.5: - resolution: - { - integrity: sha512-LXe8Xlyh3gnxdv4tSjTjscD1vpr/2PRpzq8YIaMJgyKzRG8wdISlWVWnGThJfHnlJ6hmLt2wq1yeeix0TEbuoA==, - } - hasBin: true - dependencies: - "@parcel/watcher": 2.3.0 - "@parcel/watcher-wasm": 2.3.0 - citty: 0.1.4 - clipboardy: 3.0.0 - consola: 3.2.3 - defu: 6.1.3 - get-port-please: 3.1.1 - h3: 1.8.2 - http-shutdown: 1.2.2 - jiti: 1.21.0 - mlly: 1.4.2 - node-forge: 1.3.1 - pathe: 1.1.1 - std-env: 3.5.0 - ufo: 1.3.2 - untun: 0.1.2 - uqr: 0.1.2 - dev: false - - /locate-path@6.0.0: - resolution: - { - integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, - } - engines: { node: ">=10" } - dependencies: - p-locate: 5.0.0 - - /lodash.defaults@4.2.0: - resolution: - { - integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==, - } - dev: false - - /lodash.isarguments@3.1.0: - resolution: - { - integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==, - } - dev: false - - /lodash.merge@4.6.2: - resolution: - { - integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, - } - - /lodash.throttle@4.1.1: - resolution: - { - integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==, - } - dev: true - - /lodash@4.17.21: - resolution: - { - integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, - } - dev: true - - /long@5.2.3: - resolution: - { - integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==, - } - dev: false - - /lru-cache@10.0.2: - resolution: - { - integrity: sha512-Yj9mA8fPiVgOUpByoTZO5pNrcl5Yk37FcSHsUINpAsaBIEZIuqcCclDZJCVxqQShDsmYX8QG63svJiTbOATZwg==, - } - engines: { node: 14 || >=16.14 } - dependencies: - semver: 7.5.4 - dev: false - - /lru-cache@6.0.0: - resolution: - { - integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, - } - engines: { node: ">=10" } - dependencies: - yallist: 4.0.0 - dev: false - - /lru-cache@7.18.3: - resolution: - { - integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==, - } - engines: { node: ">=12" } - dev: false - - /lru-cache@8.0.5: - resolution: - { - integrity: sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==, - } - engines: { node: ">=16.14" } - dev: false - - /lru-queue@0.1.0: - resolution: - { - integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==, - } - dependencies: - es5-ext: 0.10.62 - dev: true - - /lucia@2.7.4: - resolution: - { - integrity: sha512-do6Aah5kX2DUl7N0CvELWV1/b+qZGF0AUmUrkthYeNfXfgx4RAkWi4BkAlgGDBB/0c1WApb18mUD1pA5qTaWmw==, - } - dev: false - - /magic-string@0.25.9: - resolution: - { - integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==, - } - dependencies: - sourcemap-codec: 1.4.8 - dev: true - - /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-stream@2.0.0: - resolution: - { - integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, - } - dev: false - - /merge2@1.4.1: - resolution: - { - integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, - } - engines: { node: ">= 8" } - dev: false - - /micromatch@4.0.5: - resolution: - { - integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, - } - engines: { node: ">=8.6" } - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - dev: false - - /mime-db@1.52.0: - resolution: - { - integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, - } - engines: { node: ">= 0.6" } - dev: false - - /mime-types@2.1.35: - resolution: - { - integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, - } - engines: { node: ">= 0.6" } - dependencies: - mime-db: 1.52.0 - 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: false - - /mimic-response@3.1.0: - resolution: - { - integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==, - } - engines: { node: ">=10" } - dev: false - - /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 - - /minimatch@3.1.2: - resolution: - { - integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, - } - dependencies: - brace-expansion: 1.1.11 - - /minimatch@5.1.6: - resolution: - { - integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==, - } - engines: { node: ">=10" } - dependencies: - brace-expansion: 2.0.1 - dev: true - - /minimatch@7.4.6: - resolution: - { - integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==, - } - engines: { node: ">=10" } - dependencies: - brace-expansion: 2.0.1 - dev: true - - /minimist@1.2.8: - resolution: - { - integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, - } - dev: false - - /mkdirp-classic@0.5.3: - resolution: - { - integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==, - } - dev: false - - /mlly@1.4.2: - resolution: - { - integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==, - } - dependencies: - acorn: 8.11.2 - pathe: 1.1.1 - pkg-types: 1.0.3 - ufo: 1.3.2 - dev: false - - /mri@1.2.0: - resolution: - { - integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==, - } - engines: { node: ">=4" } - dev: false - - /ms@2.1.2: - resolution: - { - integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, - } - - /mustache@4.2.0: - resolution: - { - integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==, - } - hasBin: true - - /mysql2@3.6.3: - resolution: - { - integrity: sha512-qYd/1CDuW1KYZjD4tzg2O8YS3X/UWuGH8ZMHyMeggMTXL3yOdMisbwZ5SNkHzDGlZXKYLAvV8tMrEH+NUMz3fw==, - } - engines: { node: ">= 8.0" } - dependencies: - denque: 2.1.0 - generate-function: 2.3.1 - iconv-lite: 0.6.3 - long: 5.2.3 - lru-cache: 8.0.5 - named-placeholders: 1.1.3 - seq-queue: 0.0.5 - sqlstring: 2.3.3 - dev: false - - /named-placeholders@1.1.3: - resolution: - { - integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==, - } - engines: { node: ">=12.0.0" } - dependencies: - lru-cache: 7.18.3 - dev: false - - /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==, - } - dev: false - - /napi-wasm@1.1.0: - resolution: - { - integrity: sha512-lHwIAJbmLSjF9VDRm9GoVOy9AGp3aIvkjv+Kvz9h16QR3uSVYH78PNQUnT2U4X53mhlnV2M7wrhibQ3GHicDmg==, - } - dev: false - - /natural-compare@1.4.0: - resolution: - { - integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, - } - - /next-tick@1.1.0: - resolution: - { - integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==, - } - dev: true - - /node-abi@3.51.0: - resolution: - { - integrity: sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA==, - } - engines: { node: ">=10" } - dependencies: - semver: 7.5.4 - dev: false - - /node-addon-api@7.0.0: - resolution: - { - integrity: sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==, - } - dev: false - - /node-domexception@1.0.0: - resolution: - { - integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==, - } - engines: { node: ">=10.5.0" } - dev: false - - /node-fetch-native@1.4.1: - resolution: - { - integrity: sha512-NsXBU0UgBxo2rQLOeWNZqS3fvflWePMECr8CoSWoSTqCqGbVVsvl9vZu1HfQicYN0g5piV9Gh8RTEvo/uP752w==, - } - dev: false - - /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-fetch@3.3.2: - resolution: - { - integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - dependencies: - data-uri-to-buffer: 4.0.1 - fetch-blob: 3.2.0 - formdata-polyfill: 4.0.10 - dev: false - - /node-forge@1.3.1: - resolution: - { - integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==, - } - engines: { node: ">= 6.13.0" } - - /normalize-path@3.0.0: - resolution: - { - integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, - } - engines: { node: ">=0.10.0" } - - /npm-run-path@4.0.1: - resolution: - { - integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==, - } - engines: { node: ">=8" } - dependencies: - path-key: 3.1.1 - dev: false - - /ofetch@1.3.3: - resolution: - { - integrity: sha512-s1ZCMmQWXy4b5K/TW9i/DtiN8Ku+xCiHcjQ6/J/nDdssirrQNOoB165Zu8EqLMA2lln1JUth9a0aW9Ap2ctrUg==, - } - dependencies: - destr: 2.0.2 - node-fetch-native: 1.4.1 - ufo: 1.3.2 - dev: false - - /once@1.4.0: - resolution: - { - integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, - } - dependencies: - wrappy: 1.0.2 - - /onetime@5.1.2: - resolution: - { - integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, - } - engines: { node: ">=6" } - dependencies: - mimic-fn: 2.1.0 - dev: false - - /openapi3-ts@4.1.2: - resolution: - { - integrity: sha512-B7gOkwsYMZO7BZXwJzXCuVagym2xhqsrilVvV0dnq2Di4+iLUXKVX9gOK23ZqaAHZOwABXN0QTdW8QnkUTX6DA==, - } - dependencies: - yaml: 2.3.4 - - /optionator@0.9.3: - resolution: - { - integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==, - } - engines: { node: ">= 0.8.0" } - dependencies: - "@aashutoshrathi/word-wrap": 1.2.6 - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - - /oslo@0.22.0: - resolution: - { - integrity: sha512-PSnp+rDJgL3FKvrg+qtxblzCkkUQslYWH5ljSrhX5ibc3p3NqXOfe/LzMCAJ2sqp0nlNEDg2TKCeui4buWt/Tw==, - } - dependencies: - "@node-rs/argon2": 1.5.2 - "@node-rs/bcrypt": 1.7.3 - dev: false - - /p-limit@3.1.0: - resolution: - { - integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, - } - engines: { node: ">=10" } - dependencies: - yocto-queue: 0.1.0 - - /p-locate@5.0.0: - resolution: - { - integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, - } - engines: { node: ">=10" } - dependencies: - p-limit: 3.1.0 - - /parent-module@1.0.1: - resolution: - { - integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, - } - engines: { node: ">=6" } - dependencies: - callsites: 3.1.0 - - /path-exists@4.0.0: - resolution: - { - integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, - } - engines: { node: ">=8" } - - /path-is-absolute@1.0.1: - resolution: - { - integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, - } - engines: { node: ">=0.10.0" } - - /path-key@3.1.1: - resolution: - { - integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, - } - engines: { node: ">=8" } - - /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" } - dev: false - - /pathe@1.1.1: - resolution: - { - integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==, - } - dev: false - - /picomatch@2.3.1: - resolution: - { - integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, - } - engines: { node: ">=8.6" } - - /pkg-types@1.0.3: - resolution: - { - integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==, - } - dependencies: - jsonc-parser: 3.2.0 - mlly: 1.4.2 - pathe: 1.1.1 - dev: false - - /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 - - /prelude-ls@1.2.1: - resolution: - { - integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, - } - engines: { node: ">= 0.8.0" } - - /prettier@3.1.0: - resolution: - { - integrity: sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==, - } - engines: { node: ">=14" } - hasBin: true - dev: false - - /printable-characters@1.0.42: - resolution: - { - integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==, - } - - /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" } - - /queue-microtask@1.2.3: - resolution: - { - integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, - } - - /radix3@1.1.0: - resolution: - { - integrity: sha512-pNsHDxbGORSvuSScqNJ+3Km6QAVqk8CfsCBIEoDgpqLrkD2f3QM4I7d1ozJJ172OmIcoUcerZaNWqtLkRXTV3A==, - } - dev: false - - /rc@1.2.8: - resolution: - { - integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==, - } - hasBin: true - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - dev: false - - /readable-stream@3.6.2: - resolution: - { - integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, - } - engines: { node: ">= 6" } - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - dev: false - - /readdirp@3.6.0: - resolution: - { - integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, - } - engines: { node: ">=8.10.0" } - dependencies: - picomatch: 2.3.1 - - /redis-errors@1.2.0: - resolution: - { - integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==, - } - engines: { node: ">=4" } - dev: false - - /redis-parser@3.0.0: - resolution: - { - integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==, - } - engines: { node: ">=4" } - dependencies: - redis-errors: 1.2.0 - dev: false - - /resolve-from@4.0.0: - resolution: - { - integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, - } - engines: { node: ">=4" } - - /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" } - dev: true - - /reusify@1.0.4: - resolution: - { - integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, - } - engines: { iojs: ">=1.0.0", node: ">=0.10.0" } - - /rimraf@3.0.2: - resolution: - { - integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, - } - hasBin: true - dependencies: - glob: 7.2.3 - - /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. - 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 - dev: true - - /run-parallel@1.2.0: - resolution: - { - integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, - } - dependencies: - queue-microtask: 1.2.3 - - /safe-buffer@5.2.1: - resolution: - { - integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, - } - dev: false - - /safer-buffer@2.1.2: - resolution: - { - integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, - } - dev: false - - /selfsigned@2.4.1: - resolution: - { - integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==, - } - engines: { node: ">=10" } - dependencies: - "@types/node-forge": 1.3.9 - node-forge: 1.3.1 - dev: true - - /semver@7.5.4: - resolution: - { - integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==, - } - engines: { node: ">=10" } - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: false - - /seq-queue@0.0.5: - resolution: - { - integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==, - } - dev: false - - /shebang-command@2.0.0: - resolution: - { - integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, - } - engines: { node: ">=8" } - dependencies: - shebang-regex: 3.0.0 - - /shebang-regex@3.0.0: - resolution: - { - integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, - } - engines: { node: ">=8" } - - /signal-exit@3.0.7: - resolution: - { - integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, - } - dev: false - - /simple-concat@1.0.1: - resolution: - { - integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==, - } - dev: false - - /simple-get@4.0.1: - resolution: - { - integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==, - } - dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 - 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: false - - /source-map-support@0.5.21: - resolution: - { - integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, - } - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - /source-map@0.6.1: - resolution: - { - integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, - } - engines: { node: ">=0.10.0" } - - /sourcemap-codec@1.4.8: - resolution: - { - integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==, - } - deprecated: Please use @jridgewell/sourcemap-codec instead - dev: true - - /sqlstring@2.3.3: - resolution: - { - integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==, - } - engines: { node: ">= 0.6" } - dev: false - - /stacktracey@2.1.8: - resolution: - { - integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==, - } - dependencies: - as-table: 1.0.55 - get-source: 2.0.12 - - /standard-as-callback@2.1.0: - resolution: - { - integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==, - } - dev: false - - /std-env@3.5.0: - resolution: - { - integrity: sha512-JGUEaALvL0Mf6JCfYnJOTcobY+Nc7sG/TemDRBqCA0wEr4DER7zDchaaixTlmOxAjG1uRJmX82EQcxwTQTkqVA==, - } - dev: false - - /stoppable@1.1.0: - resolution: - { - integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==, - } - engines: { node: ">=4", npm: ">=6" } - - /string_decoder@1.3.0: - resolution: - { - integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, - } - dependencies: - safe-buffer: 5.2.1 - dev: false - - /strip-ansi@6.0.1: - resolution: - { - integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, - } - engines: { node: ">=8" } - dependencies: - ansi-regex: 5.0.1 - - /strip-final-newline@2.0.0: - resolution: - { - integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==, - } - engines: { node: ">=6" } - dev: false - - /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" } - - /supports-color@7.2.0: - resolution: - { - integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, - } - engines: { node: ">=8" } - dependencies: - has-flag: 4.0.0 - - /tar-fs@2.1.1: - resolution: - { - integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==, - } - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.0 - tar-stream: 2.2.0 - dev: false - - /tar-stream@2.2.0: - resolution: - { - integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==, - } - engines: { node: ">=6" } - 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 - - /text-table@0.2.0: - resolution: - { - integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, - } - - /timers-ext@0.1.7: - resolution: - { - integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==, - } - dependencies: - es5-ext: 0.10.62 - next-tick: 1.1.0 - dev: true - - /to-regex-range@5.0.1: - resolution: - { - integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, - } - engines: { node: ">=8.0" } - dependencies: - is-number: 7.0.0 - - /tr46@0.0.3: - resolution: - { - integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, - } - dev: false - - /ts-api-utils@1.0.3(typescript@5.2.2): - resolution: - { - integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==, - } - engines: { node: ">=16.13.0" } - peerDependencies: - typescript: ">=4.2.0" - dependencies: - typescript: 5.2.2 - dev: false - - /tslib@2.6.2: - resolution: - { - integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==, - } - - /tsx@4.1.2: - resolution: - { - integrity: sha512-1spM1bFV6MP2s4tO4tDC7g52fsaFdtEWdO4GfGdqi20qUgPbnAJqixOyIAvCSx1DDj3YIUB4CD06owTWUsOAuQ==, - } - engines: { node: ">=18.0.0" } - hasBin: true - dependencies: - esbuild: 0.18.20 - get-tsconfig: 4.7.2 - source-map-support: 0.5.21 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /tunnel-agent@0.6.0: - resolution: - { - integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==, - } - dependencies: - safe-buffer: 5.2.1 - dev: false - - /type-check@0.4.0: - resolution: - { - integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, - } - engines: { node: ">= 0.8.0" } - dependencies: - prelude-ls: 1.2.1 - - /type-fest@0.20.2: - resolution: - { - integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==, - } - engines: { node: ">=10" } - - /type@1.2.0: - resolution: - { - integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==, - } - dev: true - - /type@2.7.2: - resolution: - { - integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==, - } - dev: true - - /typescript@5.2.2: - resolution: - { - integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==, - } - engines: { node: ">=14.17" } - hasBin: true - - /ufo@1.3.2: - resolution: - { - integrity: sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==, - } - dev: false - - /uncrypto@0.1.3: - resolution: - { - integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==, - } - dev: false - - /undici-types@5.26.5: - resolution: - { - integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==, - } - - /undici@5.27.2: - resolution: - { - integrity: sha512-iS857PdOEy/y3wlM3yRp+6SNQQ6xU0mmZcwRSriqk+et/cwWAtwmIGf6WkoDN2EK/AMdCO/dfXzIwi+rFMrjjQ==, - } - engines: { node: ">=14.0" } - dependencies: - "@fastify/busboy": 2.1.0 - - /unenv@1.7.4: - resolution: - { - integrity: sha512-fjYsXYi30It0YCQYqLOcT6fHfMXsBr2hw9XC7ycf8rTG7Xxpe3ZssiqUnD0khrjiZEmkBXWLwm42yCSCH46fMw==, - } - dependencies: - consola: 3.2.3 - defu: 6.1.3 - mime: 3.0.0 - node-fetch-native: 1.4.1 - pathe: 1.1.1 - dev: false - - /unstorage@1.10.1: - resolution: - { - integrity: sha512-rWQvLRfZNBpF+x8D3/gda5nUCQL2PgXy2jNG4U7/Rc9BGEv9+CAJd0YyGCROUBKs9v49Hg8huw3aih5Bf5TAVw==, - } - peerDependencies: - "@azure/app-configuration": ^1.4.1 - "@azure/cosmos": ^4.0.0 - "@azure/data-tables": ^13.2.2 - "@azure/identity": ^3.3.2 - "@azure/keyvault-secrets": ^4.7.0 - "@azure/storage-blob": ^12.16.0 - "@capacitor/preferences": ^5.0.6 - "@netlify/blobs": ^6.2.0 - "@planetscale/database": ^1.11.0 - "@upstash/redis": ^1.23.4 - "@vercel/kv": ^0.2.3 - idb-keyval: ^6.2.1 - peerDependenciesMeta: - "@azure/app-configuration": - optional: true - "@azure/cosmos": - optional: true - "@azure/data-tables": - optional: true - "@azure/identity": - optional: true - "@azure/keyvault-secrets": - optional: true - "@azure/storage-blob": - optional: true - "@capacitor/preferences": - optional: true - "@netlify/blobs": - optional: true - "@planetscale/database": - optional: true - "@upstash/redis": - optional: true - "@vercel/kv": - optional: true - idb-keyval: - optional: true - dependencies: - anymatch: 3.1.3 - chokidar: 3.5.3 - destr: 2.0.2 - h3: 1.8.2 - ioredis: 5.3.2 - listhen: 1.5.5 - lru-cache: 10.0.2 - mri: 1.2.0 - node-fetch-native: 1.4.1 - ofetch: 1.3.3 - ufo: 1.3.2 - transitivePeerDependencies: - - supports-color - dev: false - - /untun@0.1.2: - resolution: - { - integrity: sha512-wLAMWvxfqyTiBODA1lg3IXHQtjggYLeTK7RnSfqtOXixWJ3bAa2kK/HHmOOg19upteqO3muLvN6O/icbyQY33Q==, - } - hasBin: true - dependencies: - citty: 0.1.4 - consola: 3.2.3 - pathe: 1.1.1 - dev: false - - /uqr@0.1.2: - resolution: - { - integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==, - } - dev: false - - /uri-js@4.4.1: - resolution: - { - integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, - } - dependencies: - punycode: 2.3.1 - - /util-deprecate@1.0.2: - resolution: - { - integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, - } - dev: false - - /uuid@9.0.1: - resolution: - { - integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==, - } - hasBin: true - dev: false - - /vscode-json-languageservice@4.2.1: - resolution: - { - integrity: sha512-xGmv9QIWs2H8obGbWg+sIPI/3/pFgj/5OWBhNzs00BkYQ9UaB2F6JJaGB/2/YOZJ3BvLXQTC4Q7muqU25QgAhA==, - } - dependencies: - jsonc-parser: 3.2.0 - vscode-languageserver-textdocument: 1.0.11 - vscode-languageserver-types: 3.17.5 - vscode-nls: 5.2.0 - vscode-uri: 3.0.8 - dev: true - - /vscode-languageserver-textdocument@1.0.11: - resolution: - { - integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==, - } - dev: true - - /vscode-languageserver-types@3.17.5: - resolution: - { - integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==, - } - dev: true - - /vscode-nls@5.2.0: - resolution: - { - integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==, - } - dev: true - - /vscode-uri@3.0.8: - resolution: - { - integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==, - } - dev: true - - /web-streams-polyfill@3.2.1: - resolution: - { - integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==, - } - engines: { node: ">= 8" } - dev: false - - /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@2.0.2: - resolution: - { - integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, - } - engines: { node: ">= 8" } - hasBin: true - dependencies: - isexe: 2.0.0 - - /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 - - /wrangler@3.16.0: - resolution: - { - integrity: sha512-MIx35sSdFKE3hnfWB6xWUnrt3OiyKK+PQnc9kFLjksLESX0tLmEk1gdvThYHliY90kkelS+nbH48SUGTFAI5BA==, - } - engines: { node: ">=16.17.0" } - hasBin: true - 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 - dev: true - - /wrappy@1.0.2: - resolution: - { - integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, - } - - /ws@8.14.2: - resolution: - { - integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==, - } - engines: { node: ">=10.0.0" } - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - /xxhash-wasm@1.0.2: - resolution: - { - integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==, - } - dev: true - - /yallist@4.0.0: - resolution: - { - integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, - } - dev: false - - /yaml@2.3.4: - resolution: - { - integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==, - } - engines: { node: ">= 14" } - - /yocto-queue@0.1.0: - resolution: - { - integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, - } - engines: { node: ">=10" } - - /youch@3.3.3: - resolution: - { - integrity: sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==, - } - dependencies: - cookie: 0.5.0 - mustache: 4.2.0 - stacktracey: 2.1.8 - - /zod@3.22.4: - resolution: - { - integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==, - } + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + + /@asteasolutions/zod-to-openapi@5.5.0(zod@3.22.4): + resolution: {integrity: sha512-d5HwrvM6dOKr3XdeF+DmashGvfEc+1oiEfbscugsiwSTrFtuMa7ETpW9sTNnVgn+hJaz+PRxPQUYD7q9/5dUig==} + peerDependencies: + zod: ^3.20.2 + dependencies: + openapi3-ts: 4.1.2 + zod: 3.22.4 + dev: false + + /@asteasolutions/zod-to-openapi@6.3.0(zod@3.22.4): + resolution: {integrity: sha512-ca7Svz3BWkMaIP3M1YGsyxgp7AcKXlTmy19ozhY0DslhatXbnyxdvxlmiI0TmvkIfi6RpQfm+eK1neVLsh6Riw==} + peerDependencies: + zod: ^3.20.2 + dependencies: + openapi3-ts: 4.1.2 + zod: 3.22.4 + dev: true + + /@cloudflare/kv-asset-handler@0.2.0: + resolution: {integrity: sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==} + dependencies: + mime: 3.0.0 + dev: true + + /@cloudflare/workerd-darwin-64@1.20231030.0: + resolution: {integrity: sha512-J4PQ9utPxLya9yHdMMx3AZeC5M/6FxcoYw6jo9jbDDFTy+a4Gslqf4Im9We3aeOEdPXa3tgQHVQOSelJSZLhIw==} + engines: {node: '>=16'} + cpu: [x64] + os: [darwin] + requiresBuild: true + optional: true + + /@cloudflare/workerd-darwin-arm64@1.20231030.0: + resolution: {integrity: sha512-WSJJjm11Del4hSneiNB7wTXGtBXI4QMCH9l5qf4iT5PAW8cESGcCmdHtWDWDtGAAGcvmLT04KNvmum92vRKKQQ==} + engines: {node: '>=16'} + cpu: [arm64] + os: [darwin] + requiresBuild: 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 + 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 + 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 + optional: true + + /@cloudflare/workers-types@4.20231121.0: + resolution: {integrity: sha512-+kWfpCkqiepwAKXyHoE0gnkPgkLhz0/9HOBIGhHRsUvUKvhUtm3mbqqoGRWgF1qcjzrDUBbrrOq4MYHfFtc2RA==} + + /@drizzle-team/studio@0.0.35: + resolution: {integrity: sha512-t5LTNOVf+L7Bb/wdssOIPx0ueNvhyaIXdrvKgoHR4wK0GD7SRmILcCTzn6N6Ltr1VnFzQZG/bzn6HMagn17Jtw==} + dependencies: + superjson: 2.2.1 + 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-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-arm64@0.19.8: + resolution: {integrity: sha512-B8JbS61bEunhfx8kasogFENgQfr/dIp+ggYXwTqdbMAgGDhRa3AaPpQMuQU0rNxDLECj6FhDzk1cF9WHMVwrtA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: 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-arm@0.19.8: + resolution: {integrity: sha512-31E2lxlGM1KEfivQl8Yf5aYU/mflz9g06H6S15ITUFQueMFtFjESRMoDSkvMo8thYvLBax+VKTPlpnx+sPicOA==} + engines: {node: '>=12'} + cpu: [arm] + 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/android-x64@0.19.8: + resolution: {integrity: sha512-rdqqYfRIn4jWOp+lzQttYMa2Xar3OK9Yt2fhOhzFXqg0rVWEfSclJvZq5fZslnz6ypHvVf3CT7qyf0A5pM682A==} + 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-arm64@0.19.8: + resolution: {integrity: sha512-RQw9DemMbIq35Bprbboyf8SmOr4UXsRVxJ97LgB55VKKeJOOdvsIPy0nFyF2l8U+h4PtBx/1kRf0BelOYCiQcw==} + 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/darwin-x64@0.19.8: + resolution: {integrity: sha512-3sur80OT9YdeZwIVgERAysAbwncom7b4bCI2XKLjMfPymTud7e/oY4y+ci1XVp5TfQp/bppn7xLw1n/oSQY3/Q==} + 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-arm64@0.19.8: + resolution: {integrity: sha512-WAnPJSDattvS/XtPCTj1tPoTxERjcTpH6HsMr6ujTT+X6rylVe8ggxk8pVxzf5U1wh5sPODpawNicF5ta/9Tmw==} + 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/freebsd-x64@0.19.8: + resolution: {integrity: sha512-ICvZyOplIjmmhjd6mxi+zxSdpPTKFfyPPQMQTK/w+8eNK6WV01AjIztJALDtwNNfFhfZLux0tZLC+U9nSyA5Zg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + 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-arm64@0.19.8: + resolution: {integrity: sha512-z1zMZivxDLHWnyGOctT9JP70h0beY54xDDDJt4VpTX+iwA77IFsE1vCXWmprajJGa+ZYSqkSbRQ4eyLCpCmiCQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + 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-arm@0.19.8: + resolution: {integrity: sha512-H4vmI5PYqSvosPaTJuEppU9oz1dq2A7Mr2vyg5TF9Ga+3+MGgBdGzcyBP7qK9MrwFQZlvNyJrvz6GuCaj3OukQ==} + engines: {node: '>=12'} + cpu: [arm] + 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-ia32@0.19.8: + resolution: {integrity: sha512-1a8suQiFJmZz1khm/rDglOc8lavtzEMRo0v6WhPgxkrjcU0LkHj+TwBrALwoz/OtMExvsqbbMI0ChyelKabSvQ==} + 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-loong64@0.19.8: + resolution: {integrity: sha512-fHZWS2JJxnXt1uYJsDv9+b60WCc2RlvVAy1F76qOLtXRO+H4mjt3Tr6MJ5l7Q78X8KgCFudnTuiQRBhULUyBKQ==} + 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-mips64el@0.19.8: + resolution: {integrity: sha512-Wy/z0EL5qZYLX66dVnEg9riiwls5IYnziwuju2oUiuxVc+/edvqXa04qNtbrs0Ukatg5HEzqT94Zs7J207dN5Q==} + 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-ppc64@0.19.8: + resolution: {integrity: sha512-ETaW6245wK23YIEufhMQ3HSeHO7NgsLx8gygBVldRHKhOlD1oNeNy/P67mIh1zPn2Hr2HLieQrt6tWrVwuqrxg==} + 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-riscv64@0.19.8: + resolution: {integrity: sha512-T2DRQk55SgoleTP+DtPlMrxi/5r9AeFgkhkZ/B0ap99zmxtxdOixOMI570VjdRCs9pE4Wdkz7JYrsPvsl7eESg==} + 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-s390x@0.19.8: + resolution: {integrity: sha512-NPxbdmmo3Bk7mbNeHmcCd7R7fptJaczPYBaELk6NcXxy7HLNyWwCyDJ/Xx+/YcNH7Im5dHdx9gZ5xIwyliQCbg==} + 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/linux-x64@0.19.8: + resolution: {integrity: sha512-lytMAVOM3b1gPypL2TRmZ5rnXl7+6IIk8uB3eLsV1JwcizuolblXRrc5ShPrO9ls/b+RTp+E6gbsuLWHWi2zGg==} + 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/netbsd-x64@0.19.8: + resolution: {integrity: sha512-hvWVo2VsXz/8NVt1UhLzxwAfo5sioj92uo0bCfLibB0xlOmimU/DeAEsQILlBQvkhrGjamP0/el5HU76HAitGw==} + 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/openbsd-x64@0.19.8: + resolution: {integrity: sha512-/7Y7u77rdvmGTxR83PgaSvSBJCC2L3Kb1M/+dmSIvRvQPXXCuC97QAwMugBNG0yGcbEGfFBH7ojPzAOxfGNkwQ==} + 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/sunos-x64@0.19.8: + resolution: {integrity: sha512-9Lc4s7Oi98GqFA4HzA/W2JHIYfnXbUYgekUP/Sm4BG9sfLjyv6GKKHKKVs83SMicBF2JwAX6A1PuOLMqpD001w==} + 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-arm64@0.19.8: + resolution: {integrity: sha512-rq6WzBGjSzihI9deW3fC2Gqiak68+b7qo5/3kmB6Gvbh/NYPA0sJhrnp7wgV4bNwjqM+R2AApXGxMO7ZoGhIJg==} + 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-ia32@0.19.8: + resolution: {integrity: sha512-AIAbverbg5jMvJznYiGhrd3sumfwWs8572mIJL5NQjJa06P8KfCPWZQ0NwZbPQnbQi9OWSZhFVSUWjjIrn4hSw==} + 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 + + /@esbuild/win32-x64@0.19.8: + resolution: {integrity: sha512-bfZ0cQ1uZs2PqpulNL5j/3w+GDhP36k1K5c38QdQg+Swy51jFZWWeIkteNsufkQxp986wnqRRsb/bHbY1WQ7TA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.54.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.54.0 + eslint-visitor-keys: 3.4.3 + + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + /@eslint/eslintrc@2.1.3: + resolution: {integrity: sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.23.0 + ignore: 5.3.0 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + /@eslint/js@8.54.0: + resolution: {integrity: sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + /@fastify/busboy@2.1.0: + resolution: {integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==} + engines: {node: '>=14'} + + /@hono/swagger-ui@0.2.0(hono@3.10.2): + resolution: {integrity: sha512-ulWqCI+38vTlxxBmOAi5VTOUDa5/7fKHPTwyq00kRUjUxPp3Ej5Cs+B/fvGs5gd3KraArLArkln7sHhb5vODZA==} + peerDependencies: + hono: '*' + dependencies: + hono: 3.10.2 + dev: false + + /@hono/zod-openapi@0.8.6(hono@3.10.2)(zod@3.22.4): + resolution: {integrity: sha512-HQNmJoIGyu2kNK9DI8+gIyV4c+bZm5t75PytPSRqMTim9P9HAAPMtepxu44aPZO9ehDxK4KZlRVRqz8OBxOL1A==} + engines: {node: '>=16.0.0'} + peerDependencies: + hono: '>=3.9.0' + zod: 3.* + dependencies: + '@asteasolutions/zod-to-openapi': 5.5.0(zod@3.22.4) + '@hono/zod-validator': 0.1.11(hono@3.10.2)(zod@3.22.4) + hono: 3.10.2 + zod: 3.22.4 + dev: false + + /@hono/zod-validator@0.1.11(hono@3.10.2)(zod@3.22.4): + resolution: {integrity: sha512-PQXeHUP0+36qpRt8yfeD7N2jbK3ETlGvSN6dMof/HwUC/APRokQRjpXZm4rrlG71Ft0aWE01+Bm4XejqPie5Uw==} + peerDependencies: + hono: '>=3.9.0' + zod: ^3.19.1 + dependencies: + hono: 3.10.2 + zod: 3.22.4 + dev: false + + /@humanwhocodes/config-array@0.11.13: + resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 2.0.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + /@humanwhocodes/object-schema@2.0.1: + resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} + + /@ioredis/commands@1.2.0: + resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} + dev: false + + /@libsql/client@0.4.0-pre.2: + resolution: {integrity: sha512-sKWNPU+RQoki5hEoYhpC+fQ/kj+VuwoSXF2PMYGWB19MYBkMaMc7udn1T0ibNjNkFNmd98HvPIHd48NNC2oWvA==} + dependencies: + '@libsql/hrana-client': 0.5.5 + js-base64: 3.7.5 + libsql: 0.2.0-pre.2 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: false + + /@libsql/darwin-arm64@0.2.0-pre.2: + resolution: {integrity: sha512-PKXAKBJF6XwfCT3yU1N/kHyUGcsatf/4rYNzdnc6UGeg+yWf3ZDk7sGnHHj9bDQ9oKLRVJQmc+cNIEsF2GOr9w==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@libsql/darwin-x64@0.2.0-pre.2: + resolution: {integrity: sha512-e3k4LsAFRf8qFfZqkg/VkoXK/UfDYgoDvLmAJpAGKEFp7d/bTmbF1r0YCjtGaPbheRxARAUXNfekvRhdpXE3mg==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@libsql/hrana-client@0.5.5: + resolution: {integrity: sha512-i+hDBpiV719poqEiHupUUZYKJ9YSbCRFe5Q2PQ0v3mHIftePH6gayLjp2u6TXbqbO/Dv6y8yyvYlBXf/kFfRZA==} + dependencies: + '@libsql/isomorphic-fetch': 0.1.10 + '@libsql/isomorphic-ws': 0.1.5 + js-base64: 3.7.5 + node-fetch: 3.3.2 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: false + + /@libsql/isomorphic-fetch@0.1.10: + resolution: {integrity: sha512-dH0lMk50gKSvEKD78xWMu60SY1sjp1sY//iFLO0XMmBwfVfG136P9KOk06R4maBdlb8KMXOzJ1D28FR5ZKnHTA==} + dependencies: + '@types/node-fetch': 2.6.9 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: false + + /@libsql/isomorphic-ws@0.1.5: + resolution: {integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==} + dependencies: + '@types/ws': 8.5.10 + ws: 8.14.2 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /@libsql/linux-arm64-gnu@0.2.0-pre.2: + resolution: {integrity: sha512-ZkN6e129joeUu6cinGMRbCvLTnrM5xV5n9XHs2dRrZfL7yu7utbvrY1l+P6VI1gugs93UhgupqyMsolFjvrPww==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@libsql/linux-arm64-musl@0.2.0-pre.2: + resolution: {integrity: sha512-tEy4UAIzHYtjCBJnZoTcX1LCYy+XGR3hQCsdRYujWJhUtmtU/AqCRZV3q8MyfX7UhKyawJKWoQvwQ6Vs7w9jAA==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@libsql/linux-x64-gnu@0.2.0-pre.2: + resolution: {integrity: sha512-jhHKwz5i9mdlpT4EeaKNUfyW5N9YY8wD5lZ0F5HrrPKhwgufnJY0oPEbvhM4KXDcSJetiIcGJ6K6NQyMSgoJ/Q==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@libsql/linux-x64-musl@0.2.0-pre.2: + resolution: {integrity: sha512-HvwZtSQ2eIT968yxAb+htO+wmibdwW1PIyR7iJ5TN7phj7W1gF962l3ZhV1hVYERaMu+liBH1e/cRP1S35q3vQ==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@libsql/win32-x64-msvc@0.2.0-pre.2: + resolution: {integrity: sha512-BWjInhsZRF9x+W0T5oJVjqoCCdvh82y74b/T3Ge/irXyLdVhHA9Zb1JWDy5uhu8eBR+d2n9B+IO0YwAvhFRTLw==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@lucia-auth/adapter-session-unstorage@2.1.0(lucia@2.7.4)(unstorage@1.10.1): + resolution: {integrity: sha512-ItK7urZhLZv7UO99BcODjRhSAv58UPc+KQAmnkSvri2WBc22vFEjnjd/oWp3CZPdbbrJkuTvsuhFXH1ySBfOLg==} + peerDependencies: + lucia: ^2.0.0 + unstorage: ^1.9.0 + dependencies: + lucia: 2.7.4 + unstorage: 1.10.1 + dev: false + + /@lucia-auth/adapter-sqlite@2.0.1(@libsql/client@0.4.0-pre.2)(better-sqlite3@9.1.1)(lucia@2.7.4): + resolution: {integrity: sha512-yc7XQ4X3sWG1gyUGHqaXipJIkmvB4MOgJypnSMWy7Vjhn3AOCM2xw51xTs+dGpLOQIn2Laomg9xpmDM2/9tgqQ==} + peerDependencies: + '@libsql/client': ^0.3.0 + better-sqlite3: 8.x - 9.x + lucia: ^2.0.0 + peerDependenciesMeta: + '@libsql/client': + optional: true + better-sqlite3: + optional: true + dependencies: + '@libsql/client': 0.4.0-pre.2 + better-sqlite3: 9.1.1 + lucia: 2.7.4 + dev: false + + /@lucia-auth/oauth@3.5.0(lucia@2.7.4): + resolution: {integrity: sha512-JSwAMVwlDJtbvfcJV1nbkv41OD830pgICrx8zFT71SYd5I1MnEQ+GqMTXBGRyxzc5XlLatT8ZS1Jt0k81487xg==} + peerDependencies: + lucia: ^2.0.0 + dependencies: + lucia: 2.7.4 + dev: false + + /@neon-rs/load@0.0.4: + resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==} + dev: false + + /@node-rs/argon2-android-arm-eabi@1.5.2: + resolution: {integrity: sha512-vVZec4ITr9GumAy0p8Zj8ozie362gtbZrTkLp9EqvuFZ/HrZzR09uS2IsDgm4mAstg/rc4A1gLRrHI8jDdbjkA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-android-arm64@1.5.2: + resolution: {integrity: sha512-SwhnsXyrpgtWDTwYds1WUnxLA/kVP8HVaImYwQ3Wemqj1lkzcSoIaNyjNWkyrYGqO1tVc1YUrqsbd5eCHh+3sg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-darwin-arm64@1.5.2: + resolution: {integrity: sha512-+1ZMKiCCv2pip/o1Xg09piQru2LOIBPQ1vS4is86f55N3jjZnSfP+db5mYCSRuB0gRYqui98he7su7OGXlF4gQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-darwin-x64@1.5.2: + resolution: {integrity: sha512-mQ57mORlsxpfjcEsVpiHyHCOp6Ljrz/rVNWk8ihnPWw0qt0EqF1zbHRxTEPemL1iBHL9UyXpXrKS4JKq6xMn5w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-freebsd-x64@1.5.2: + resolution: {integrity: sha512-UjKbFd3viYcpiwflkU4haEdNUMk1V2fVCJImWLWQns/hVval9BrDv5xsBwgdynbPHDlPOiWj816LBQwhWLGVWA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-arm-gnueabihf@1.5.2: + resolution: {integrity: sha512-36GJjJBnVuscV9CTn8RVDeJysnmIzr6Lp7QBCDczYHi6eKFuA8udCJb4SRyJqdvIuzycKG1RL56FbcFBJYCYIA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-arm64-gnu@1.5.2: + resolution: {integrity: sha512-sE0ydb2gp6xC+5vbVz8l3paaiBbFQIB2Rwp5wx9MmKiYdTfcO5WkGeADuSgoFiTcSEz1RsHXqrdVy6j/LtSqtA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-arm64-musl@1.5.2: + resolution: {integrity: sha512-LhE0YHB0aJCwlbsQrwePik/KFWUc9qMriJIL5KiejK3bDoTVY4ihH587QT56JyaLvl3nBJaAV8l5yMqQdHnouA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-x64-gnu@1.5.2: + resolution: {integrity: sha512-MnKLiBlyg05pxvKXe3lNgBL9El9ThD74hvVEiWH1Xk40RRrJ507NCOWXVmQ0FDq1mjTeGFxbIvk+AcoF0NSLIQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-x64-musl@1.5.2: + resolution: {integrity: sha512-tzLgASY0Ng2OTW7Awwl9UWzjbWx8/uD6gXcZ/k/nYGSZE5Xp8EOD2NUqHLbK6KZE3775A0R25ShpiSxCadYqkg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-win32-arm64-msvc@1.5.2: + resolution: {integrity: sha512-vpTwSvv3oUXTpWZh0/HxdJ5wFMlmS7aVDwL4ATWepTZhMG4n+TO0+tVLdcPHCbg0oc6hCWBjWNPlSn9mW+YIgA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-win32-ia32-msvc@1.5.2: + resolution: {integrity: sha512-KPpZR15ui7uQWQXKmtaKyUQRs4UJdXnIIfiyFLGmLWCdEKlr3MtIGFt0fdziu4BF5ZObD8Ic6QvT0VXK4OJiww==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-win32-x64-msvc@1.5.2: + resolution: {integrity: sha512-/pGuwixJS8ZlpwhX9iM6g6JEeZYo1TtnNf8exwsOi7gxcUoTUfw5it+5GfbY/n+xRBz/DIU4bzUmXmh+7Gh0ug==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2@1.5.2: + resolution: {integrity: sha512-qq7wOSsdP2b4rXEapWNmsCjpaTGZWtp9kZmri98GYCDZqN8UJUG5zSue4XtYWWJMWKJVE/hkaIwk+BgN1ZUn0Q==} + engines: {node: '>= 10'} + optionalDependencies: + '@node-rs/argon2-android-arm-eabi': 1.5.2 + '@node-rs/argon2-android-arm64': 1.5.2 + '@node-rs/argon2-darwin-arm64': 1.5.2 + '@node-rs/argon2-darwin-x64': 1.5.2 + '@node-rs/argon2-freebsd-x64': 1.5.2 + '@node-rs/argon2-linux-arm-gnueabihf': 1.5.2 + '@node-rs/argon2-linux-arm64-gnu': 1.5.2 + '@node-rs/argon2-linux-arm64-musl': 1.5.2 + '@node-rs/argon2-linux-x64-gnu': 1.5.2 + '@node-rs/argon2-linux-x64-musl': 1.5.2 + '@node-rs/argon2-win32-arm64-msvc': 1.5.2 + '@node-rs/argon2-win32-ia32-msvc': 1.5.2 + '@node-rs/argon2-win32-x64-msvc': 1.5.2 + dev: false + + /@node-rs/bcrypt-android-arm-eabi@1.7.3: + resolution: {integrity: sha512-l53RuBqnqNvBN2jx09Ws6jpLmuQdSDx10n0GeaTfwh1svxsC8bPpVmxkfBExsT2Tu7KF38gTnPZvwsxysZQyPQ==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-android-arm64@1.7.3: + resolution: {integrity: sha512-TZpm4VbiViqDMvusrcYzLr1b1M5FDF0cDNiTUciLeBSsKtU5lNdEZGAU7gvCnrKoUWpGuOblHU7613zuB7SiNQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-darwin-arm64@1.7.3: + resolution: {integrity: sha512-SiUuAabynVsmixZMjh5xrn8w47EnV0HzbW9st4DPoVhn/wzdUcksIXDY75aoQG2EIzKLN8IGb+CIVnPGmRyhxw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-darwin-x64@1.7.3: + resolution: {integrity: sha512-R+81Z0eX4hZPvCXY5Z6l0l+JrTU3WcSYGHP0QYV9uwdaafOz6EhrCXUzZ02AIcAbNoVR8eucYVruq9PiasXoVw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-freebsd-x64@1.7.3: + resolution: {integrity: sha512-0pItU/5K3e83JjcJj9fZv+78txUoZ3hHCT7n/UMdu9mkpUzhX/rqb4jmQpJpD+UQoR76xp3qDo5RMgQBffBVNg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-arm-gnueabihf@1.7.3: + resolution: {integrity: sha512-HTSybWUjNe8rWuXkTkMeFDiQNHc6VioRcgv6AeHZphIxiT6dFbnhXNkfz4Hr0zxvyPhZ3NrYjT2AmPVFT6VW3Q==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-arm64-gnu@1.7.3: + resolution: {integrity: sha512-rWep6Y+v/c4bZHaM8LmSsrMwMmDR9wG4/q+3Z9VzR8xdnt5VCbuQdYWpf3sgGRGjTRdTBAdSK8x1reOjqsJ3Jg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-arm64-musl@1.7.3: + resolution: {integrity: sha512-TyWEKhxr+yfGcMKzVV/ARZw+Hrky2yl91bo0XYU2ZW6I6LDC0emNsXugdWjwz8ADI4OWhhrOjXD8GCilxiB2Rg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-x64-gnu@1.7.3: + resolution: {integrity: sha512-PofxM1Qg7tZKj1oP0I7tBTSSLr8Xc2uxx+P3pBCPmYzaBwWqGteNHJlF7n2q5xiH7YOlguH4w5CmcEjsiA3K4A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-x64-musl@1.7.3: + resolution: {integrity: sha512-D5V6/dDVKP8S/ieDBLGhTn4oTo3upbrpWInynbhOMjJvPiIxVG1PiI3MXkWBtG9qtfleDk7gUkEKtAOxlIxDTQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-win32-arm64-msvc@1.7.3: + resolution: {integrity: sha512-b4gH2Yj5R4TwULrfMHd1Qqr+MrnFjVRUAJujDKPqi+PppSqezW8QF6DRSOL4GjnBmz5JEd64wxgeidvy7dsbGw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-win32-ia32-msvc@1.7.3: + resolution: {integrity: sha512-E91ro+ybI0RhNc89aGaZQGll0YhPoHr8JacoWrNKwhg9zwNOYeuO0tokdMZdm6nF0/8obll0Mq7wO9AXO9iffw==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-win32-x64-msvc@1.7.3: + resolution: {integrity: sha512-LO/p9yjPODj/pQvPnowBuwpDdqiyUXQbqL1xb1RSP3NoyCFAGmjL5h0plSQrhLh8hskQiozBRXNaQurtsM7o0Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt@1.7.3: + resolution: {integrity: sha512-BF6u9CBPUiyk1zU+5iwikezf+xM4MFSu5cmrrg/PLKffGgIM13ZsY6DHftcTraETB04ryasjM/5IejotH+sO5Q==} + engines: {node: '>= 10'} + optionalDependencies: + '@node-rs/bcrypt-android-arm-eabi': 1.7.3 + '@node-rs/bcrypt-android-arm64': 1.7.3 + '@node-rs/bcrypt-darwin-arm64': 1.7.3 + '@node-rs/bcrypt-darwin-x64': 1.7.3 + '@node-rs/bcrypt-freebsd-x64': 1.7.3 + '@node-rs/bcrypt-linux-arm-gnueabihf': 1.7.3 + '@node-rs/bcrypt-linux-arm64-gnu': 1.7.3 + '@node-rs/bcrypt-linux-arm64-musl': 1.7.3 + '@node-rs/bcrypt-linux-x64-gnu': 1.7.3 + '@node-rs/bcrypt-linux-x64-musl': 1.7.3 + '@node-rs/bcrypt-win32-arm64-msvc': 1.7.3 + '@node-rs/bcrypt-win32-ia32-msvc': 1.7.3 + '@node-rs/bcrypt-win32-x64-msvc': 1.7.3 + dev: false + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + + /@parcel/watcher-android-arm64@2.3.0: + resolution: {integrity: sha512-f4o9eA3dgk0XRT3XhB0UWpWpLnKgrh1IwNJKJ7UJek7eTYccQ8LR7XUWFKqw6aEq5KUNlCcGvSzKqSX/vtWVVA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-darwin-arm64@2.3.0: + resolution: {integrity: sha512-mKY+oijI4ahBMc/GygVGvEdOq0L4DxhYgwQqYAz/7yPzuGi79oXrZG52WdpGA1wLBPrYb0T8uBaGFo7I6rvSKw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-darwin-x64@2.3.0: + resolution: {integrity: sha512-20oBj8LcEOnLE3mgpy6zuOq8AplPu9NcSSSfyVKgfOhNAc4eF4ob3ldj0xWjGGbOF7Dcy1Tvm6ytvgdjlfUeow==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-freebsd-x64@2.3.0: + resolution: {integrity: sha512-7LftKlaHunueAEiojhCn+Ef2CTXWsLgTl4hq0pkhkTBFI3ssj2bJXmH2L67mKpiAD5dz66JYk4zS66qzdnIOgw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-arm-glibc@2.3.0: + resolution: {integrity: sha512-1apPw5cD2xBv1XIHPUlq0cO6iAaEUQ3BcY0ysSyD9Kuyw4MoWm1DV+W9mneWI+1g6OeP6dhikiFE6BlU+AToTQ==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-arm64-glibc@2.3.0: + resolution: {integrity: sha512-mQ0gBSQEiq1k/MMkgcSB0Ic47UORZBmWoAWlMrTW6nbAGoLZP+h7AtUM7H3oDu34TBFFvjy4JCGP43JlylkTQA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-arm64-musl@2.3.0: + resolution: {integrity: sha512-LXZAExpepJew0Gp8ZkJ+xDZaTQjLHv48h0p0Vw2VMFQ8A+RKrAvpFuPVCVwKJCr5SE+zvaG+Etg56qXvTDIedw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-x64-glibc@2.3.0: + resolution: {integrity: sha512-P7Wo91lKSeSgMTtG7CnBS6WrA5otr1K7shhSjKHNePVmfBHDoAOHYRXgUmhiNfbcGk0uMCHVcdbfxtuiZCHVow==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-x64-musl@2.3.0: + resolution: {integrity: sha512-+kiRE1JIq8QdxzwoYY+wzBs9YbJ34guBweTK8nlzLKimn5EQ2b2FSC+tAOpq302BuIMjyuUGvBiUhEcLIGMQ5g==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-wasm@2.3.0: + resolution: {integrity: sha512-ejBAX8H0ZGsD8lSICDNyMbSEtPMWgDL0WFCt/0z7hyf5v8Imz4rAM8xY379mBsECkq/Wdqa5WEDLqtjZ+6NxfA==} + engines: {node: '>= 10.0.0'} + dependencies: + is-glob: 4.0.3 + micromatch: 4.0.5 + napi-wasm: 1.1.0 + dev: false + bundledDependencies: + - napi-wasm + + /@parcel/watcher-win32-arm64@2.3.0: + resolution: {integrity: sha512-35gXCnaz1AqIXpG42evcoP2+sNL62gZTMZne3IackM+6QlfMcJLy3DrjuL6Iks7Czpd3j4xRBzez3ADCj1l7Aw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-win32-ia32@2.3.0: + resolution: {integrity: sha512-FJS/IBQHhRpZ6PiCjFt1UAcPr0YmCLHRbTc00IBTrelEjlmmgIVLeOx4MSXzx2HFEy5Jo5YdhGpxCuqCyDJ5ow==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-win32-x64@2.3.0: + resolution: {integrity: sha512-dLx+0XRdMnVI62kU3wbXvbIRhLck4aE28bIGKbRGS7BJNt54IIj9+c/Dkqb+7DJEbHUZAX1bwaoM8PqVlHJmCA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher@2.3.0: + resolution: {integrity: sha512-pW7QaFiL11O0BphO+bq3MgqeX/INAk9jgBldVDYjlQPO4VddoZnF22TcF9onMhnLVHuNqBJeRf+Fj7eezi/+rQ==} + engines: {node: '>= 10.0.0'} + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.5 + node-addon-api: 7.0.0 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.3.0 + '@parcel/watcher-darwin-arm64': 2.3.0 + '@parcel/watcher-darwin-x64': 2.3.0 + '@parcel/watcher-freebsd-x64': 2.3.0 + '@parcel/watcher-linux-arm-glibc': 2.3.0 + '@parcel/watcher-linux-arm64-glibc': 2.3.0 + '@parcel/watcher-linux-arm64-musl': 2.3.0 + '@parcel/watcher-linux-x64-glibc': 2.3.0 + '@parcel/watcher-linux-x64-musl': 2.3.0 + '@parcel/watcher-win32-arm64': 2.3.0 + '@parcel/watcher-win32-ia32': 2.3.0 + '@parcel/watcher-win32-x64': 2.3.0 + dev: false + + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + dev: false + + /@types/node-fetch@2.6.9: + resolution: {integrity: sha512-bQVlnMLFJ2d35DkPNjEPmd9ueO/rh5EiaZt2bhqiSarPjZIuIV6bPQVqcrEyvNo+AfTrRGVazle1tl597w3gfA==} + dependencies: + '@types/node': 20.10.0 + form-data: 4.0.0 + dev: false + + /@types/node-forge@1.3.10: + resolution: {integrity: sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw==} + dependencies: + '@types/node': 20.10.0 + dev: true + + /@types/node@20.10.0: + resolution: {integrity: sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ==} + dependencies: + undici-types: 5.26.5 + + /@types/semver@7.5.6: + resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} + dev: false + + /@types/ws@8.5.10: + resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} + dependencies: + '@types/node': 20.10.0 + dev: false + + /@typescript-eslint/eslint-plugin@6.12.0(@typescript-eslint/parser@6.12.0)(eslint@8.54.0)(typescript@5.3.2): + resolution: {integrity: sha512-XOpZ3IyJUIV1b15M7HVOpgQxPPF7lGXgsfcEIu3yDxFPaf/xZKt7s9QO/pbk7vpWQyVulpJbu4E5LwpZiQo4kA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 6.12.0(eslint@8.54.0)(typescript@5.3.2) + '@typescript-eslint/scope-manager': 6.12.0 + '@typescript-eslint/type-utils': 6.12.0(eslint@8.54.0)(typescript@5.3.2) + '@typescript-eslint/utils': 6.12.0(eslint@8.54.0)(typescript@5.3.2) + '@typescript-eslint/visitor-keys': 6.12.0 + debug: 4.3.4 + eslint: 8.54.0 + graphemer: 1.4.0 + ignore: 5.3.0 + natural-compare: 1.4.0 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.3.2) + typescript: 5.3.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/parser@6.12.0(eslint@8.54.0)(typescript@5.3.2): + resolution: {integrity: sha512-s8/jNFPKPNRmXEnNXfuo1gemBdVmpQsK1pcu+QIvuNJuhFzGrpD7WjOcvDc/+uEdfzSYpNu7U/+MmbScjoQ6vg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 6.12.0 + '@typescript-eslint/types': 6.12.0 + '@typescript-eslint/typescript-estree': 6.12.0(typescript@5.3.2) + '@typescript-eslint/visitor-keys': 6.12.0 + debug: 4.3.4 + eslint: 8.54.0 + typescript: 5.3.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/scope-manager@6.12.0: + resolution: {integrity: sha512-5gUvjg+XdSj8pcetdL9eXJzQNTl3RD7LgUiYTl8Aabdi8hFkaGSYnaS6BLc0BGNaDH+tVzVwmKtWvu0jLgWVbw==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.12.0 + '@typescript-eslint/visitor-keys': 6.12.0 + dev: false + + /@typescript-eslint/type-utils@6.12.0(eslint@8.54.0)(typescript@5.3.2): + resolution: {integrity: sha512-WWmRXxhm1X8Wlquj+MhsAG4dU/Blvf1xDgGaYCzfvStP2NwPQh6KBvCDbiOEvaE0filhranjIlK/2fSTVwtBng==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 6.12.0(typescript@5.3.2) + '@typescript-eslint/utils': 6.12.0(eslint@8.54.0)(typescript@5.3.2) + debug: 4.3.4 + eslint: 8.54.0 + ts-api-utils: 1.0.3(typescript@5.3.2) + typescript: 5.3.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/types@6.12.0: + resolution: {integrity: sha512-MA16p/+WxM5JG/F3RTpRIcuOghWO30//VEOvzubM8zuOOBYXsP+IfjoCXXiIfy2Ta8FRh9+IO9QLlaFQUU+10Q==} + engines: {node: ^16.0.0 || >=18.0.0} + dev: false + + /@typescript-eslint/typescript-estree@6.12.0(typescript@5.3.2): + resolution: {integrity: sha512-vw9E2P9+3UUWzhgjyyVczLWxZ3GuQNT7QpnIY3o5OMeLO/c8oHljGc8ZpryBMIyympiAAaKgw9e5Hl9dCWFOYw==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 6.12.0 + '@typescript-eslint/visitor-keys': 6.12.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.3.2) + typescript: 5.3.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/utils@6.12.0(eslint@8.54.0)(typescript@5.3.2): + resolution: {integrity: sha512-LywPm8h3tGEbgfyjYnu3dauZ0U7R60m+miXgKcZS8c7QALO9uWJdvNoP+duKTk2XMWc7/Q3d/QiCuLN9X6SWyQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.54.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.6 + '@typescript-eslint/scope-manager': 6.12.0 + '@typescript-eslint/types': 6.12.0 + '@typescript-eslint/typescript-estree': 6.12.0(typescript@5.3.2) + eslint: 8.54.0 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: false + + /@typescript-eslint/visitor-keys@6.12.0: + resolution: {integrity: sha512-rg3BizTZHF1k3ipn8gfrzDXXSFKyOEB5zxYXInQ6z0hUvmQlhaZQzK+YmHmNViMA9HzW5Q9+bPPt90bU6GQwyw==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.12.0 + eslint-visitor-keys: 3.4.3 + dev: false + + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + /acorn-jsx@5.3.2(acorn@8.11.2): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.2 + + /acorn-walk@8.3.0: + resolution: {integrity: sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==} + engines: {node: '>=0.4.0'} + + /acorn@8.11.2: + resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} + engines: {node: '>=0.4.0'} + hasBin: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + /arch@2.2.0: + resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} + dev: false + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: false + + /as-table@1.0.55: + resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} + dependencies: + printable-characters: 1.0.42 + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /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'} + + /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 + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /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==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + /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 + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: false + + /citty@0.1.5: + resolution: {integrity: sha512-AS7n5NSc0OQVMV9v6wt3ByujNIrne0/cTjiC2MYqhvao57VNfiuVksTSr2p17nVOhEr2KtqiAkGwHcgMC/qUuQ==} + dependencies: + consola: 3.2.3 + dev: false + + /cli-color@2.0.3: + resolution: {integrity: sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==} + engines: {node: '>=0.10'} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-iterator: 2.0.3 + memoizee: 0.4.15 + timers-ext: 0.1.7 + dev: true + + /clipboardy@3.0.0: + resolution: {integrity: sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + arch: 2.2.0 + execa: 5.1.1 + is-wsl: 2.2.0 + dev: false + + /cluster-key-slot@1.1.2: + resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} + engines: {node: '>=0.10.0'} + dev: false + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: false + + /commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + /consola@3.2.3: + resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} + engines: {node: ^14.18.0 || >=16.10.0} + dev: false + + /cookie-es@1.0.0: + resolution: {integrity: sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ==} + dev: false + + /cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + + /copy-anything@3.0.5: + resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} + engines: {node: '>=12.13'} + dependencies: + is-what: 4.1.16 + dev: true + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + /d@1.0.1: + resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} + 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==} + + /data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + dev: false + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /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==} + + /defu@6.1.3: + resolution: {integrity: sha512-Vy2wmG3NTkmHNg/kzpuvHhkqeIx3ODWqasgCRbKtbXEN0G+HpEEv9BtJLp7ZG1CZloFaC41Ah3ZFbq7aqCqMeQ==} + dev: false + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: false + + /denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + dev: false + + /destr@2.0.2: + resolution: {integrity: sha512-65AlobnZMiCET00KaFFjUefxDX0khFA/E4myqZ7a6Sq1yZtR8+FVIvilVX66vF2uobSumxooYZChiRPCKNqhmg==} + dev: false + + /detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + dev: false + + /detect-libc@2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + engines: {node: '>=8'} + dev: false + + /difflib@0.2.4: + resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} + dependencies: + heap: 0.2.7 + dev: true + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: false + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + + /dotenv@16.3.1: + resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + engines: {node: '>=12'} + dev: true + + /dreamopt@0.8.0: + resolution: {integrity: sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==} + engines: {node: '>=0.4.0'} + dependencies: + wordwrap: 1.0.0 + dev: true + + /drizzle-kit@0.20.6: + resolution: {integrity: sha512-+AYQY+tJUnfMJYIeh6aEjI21mpMCekqz0LEu2QdFdc/3zSmjyfEhH5dkXlRFME8v1rtisiHfp7bP+gVVKDPiUg==} + hasBin: true + dependencies: + '@drizzle-team/studio': 0.0.35 + '@esbuild-kit/esm-loader': 2.6.5 + camelcase: 7.0.1 + chalk: 5.3.0 + commander: 9.5.0 + esbuild: 0.19.8 + esbuild-register: 3.5.0(esbuild@0.19.8) + glob: 8.1.0 + hanji: 0.0.5 + json-diff: 0.9.0 + minimatch: 7.4.6 + semver: 7.5.4 + wrangler: 3.17.1 + zod: 3.22.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /drizzle-orm@0.29.0(@cloudflare/workers-types@4.20231121.0)(@libsql/client@0.4.0-pre.2)(better-sqlite3@9.1.1)(mysql2@3.6.5): + 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: + '@cloudflare/workers-types': 4.20231121.0 + '@libsql/client': 0.4.0-pre.2 + better-sqlite3: 9.1.1 + mysql2: 3.6.5 + dev: false + + /drizzle-zod@0.5.1(drizzle-orm@0.29.0)(zod@3.22.4): + resolution: {integrity: sha512-C/8bvzUH/zSnVfwdSibOgFjLhtDtbKYmkbPbUCq46QZyZCH6kODIMSOgZ8R7rVjoI+tCj3k06MRJMDqsIeoS4A==} + peerDependencies: + drizzle-orm: '>=0.23.13' + zod: '*' + dependencies: + drizzle-orm: 0.29.0(@cloudflare/workers-types@4.20231121.0)(@libsql/client@0.4.0-pre.2)(better-sqlite3@9.1.1)(mysql2@3.6.5) + zod: 3.22.4 + dev: false + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: false + + /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.19.8): + resolution: {integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==} + peerDependencies: + esbuild: '>=0.12 <1' + dependencies: + debug: 4.3.4 + esbuild: 0.19.8 + 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 + + /esbuild@0.19.8: + resolution: {integrity: sha512-l7iffQpT2OrZfH2rXIp7/FkmaeZM0vxbxN9KfiCwGYuZqzMg/JdvX26R31Zxn/Pxvsrg3Y9N6XTcnknqDyyv4w==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.19.8 + '@esbuild/android-arm64': 0.19.8 + '@esbuild/android-x64': 0.19.8 + '@esbuild/darwin-arm64': 0.19.8 + '@esbuild/darwin-x64': 0.19.8 + '@esbuild/freebsd-arm64': 0.19.8 + '@esbuild/freebsd-x64': 0.19.8 + '@esbuild/linux-arm': 0.19.8 + '@esbuild/linux-arm64': 0.19.8 + '@esbuild/linux-ia32': 0.19.8 + '@esbuild/linux-loong64': 0.19.8 + '@esbuild/linux-mips64el': 0.19.8 + '@esbuild/linux-ppc64': 0.19.8 + '@esbuild/linux-riscv64': 0.19.8 + '@esbuild/linux-s390x': 0.19.8 + '@esbuild/linux-x64': 0.19.8 + '@esbuild/netbsd-x64': 0.19.8 + '@esbuild/openbsd-x64': 0.19.8 + '@esbuild/sunos-x64': 0.19.8 + '@esbuild/win32-arm64': 0.19.8 + '@esbuild/win32-ia32': 0.19.8 + '@esbuild/win32-x64': 0.19.8 + dev: true + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + /eslint-config-google@0.14.0(eslint@8.54.0): + resolution: {integrity: sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==} + engines: {node: '>=0.10.0'} + peerDependencies: + eslint: '>=5.16.0' + dependencies: + eslint: 8.54.0 + dev: true + + /eslint-plugin-json@3.1.0: + resolution: {integrity: sha512-MrlG2ynFEHe7wDGwbUuFPsaT2b1uhuEFhJ+W1f1u+1C2EkXmTYJp4B1aAdQQ8M+CC3t//N/oRKiIVw14L2HR1g==} + engines: {node: '>=12.0'} + dependencies: + lodash: 4.17.21 + vscode-json-languageservice: 4.2.1 + dev: true + + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + /eslint@8.54.0: + resolution: {integrity: sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.54.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.3 + '@eslint/js': 8.54.0 + '@humanwhocodes/config-array': 0.11.13 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.23.0 + graphemer: 1.4.0 + ignore: 5.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) + eslint-visitor-keys: 3.4.3 + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + /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'} + + /event-emitter@0.3.5: + resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + dev: true + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: false + + /exit-hook@2.2.1: + resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} + engines: {node: '>=6'} + + /expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + 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==} + + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: false + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + + /fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.2.1 + dev: false + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.2.0 + + /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'} + dependencies: + to-regex-range: 5.0.1 + + /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 + + /flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.9 + keyv: 4.5.4 + rimraf: 3.0.2 + + /flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + + /formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + dependencies: + fetch-blob: 3.2.0 + dev: false + + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: false + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + optional: true + + /generate-function@2.3.1: + resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} + dependencies: + is-property: 1.0.2 + dev: false + + /get-port-please@3.1.1: + resolution: {integrity: sha512-3UBAyM3u4ZBVYDsxOQfJDxEa6XTbpBDrOjp4mf7ExFRt5BKs/QywQQiJsh2B+hxcZLSapWqCRvElUe8DnKcFHA==} + dev: false + + /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 + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: false + + /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'} + dependencies: + is-glob: 4.0.3 + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + + /glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + dev: true + + /globals@13.23.0: + resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.0 + merge2: 1.4.1 + slash: 3.0.0 + dev: false + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + /h3@1.9.0: + resolution: {integrity: sha512-+F3ZqrNV/CFXXfZ2lXBINHi+rM4Xw3CDC5z2CDK3NMPocjonKipGLLDSkrqY9DOrioZNPTIdDMWfQKm//3X2DA==} + dependencies: + cookie-es: 1.0.0 + defu: 6.1.3 + destr: 2.0.2 + iron-webcrypto: 1.0.0 + radix3: 1.1.0 + ufo: 1.3.2 + uncrypto: 0.1.3 + unenv: 1.8.0 + dev: false + + /hanji@0.0.5: + resolution: {integrity: sha512-Abxw1Lq+TnYiL4BueXqMau222fPSPMFtya8HdpWsz/xVAhifXou71mPh/kY2+08RgFcVccjG3uZHs6K5HAe3zw==} + dependencies: + lodash.throttle: 4.1.1 + sisteransi: 1.0.5 + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + /heap@0.2.7: + resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} + dev: true + + /hono@3.10.2: + resolution: {integrity: sha512-QwJLjWs3e+nZ3b5nQrrdJpYCJqiTK744jeYhX7yhZdxwcQ3KIohBfzI2dA8gSF6HEZkmFUdiKL1BelJ8utIm4w==} + engines: {node: '>=16.0.0'} + dev: false + + /http-shutdown@1.2.2: + resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: false + + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: false + + /husky@8.0.3: + resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + 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@5.3.0: + resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} + engines: {node: '>= 4'} + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: false + + /ioredis@5.3.2: + resolution: {integrity: sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==} + engines: {node: '>=12.22.0'} + dependencies: + '@ioredis/commands': 1.2.0 + cluster-key-slot: 1.1.2 + debug: 4.3.4 + denque: 2.1.0 + lodash.defaults: 4.2.0 + lodash.isarguments: 3.1.0 + redis-errors: 1.2.0 + redis-parser: 3.0.0 + standard-as-callback: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /iron-webcrypto@1.0.0: + resolution: {integrity: sha512-anOK1Mktt8U1Xi7fCM3RELTuYbnFikQY5VtrDj7kPgpejV7d43tWKhzgioO0zpkazLEL/j/iayRqnJhrGfqUsg==} + dev: false + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: false + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + /is-promise@2.2.2: + resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + dev: true + + /is-property@1.0.2: + resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} + dev: false + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: false + + /is-what@4.1.16: + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} + engines: {node: '>=12.13'} + dev: true + + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + dev: false + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + /jiti@1.21.0: + resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + hasBin: true + dev: false + + /js-base64@3.7.5: + resolution: {integrity: sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==} + dev: false + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + /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-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + /libsql@0.2.0-pre.2: + resolution: {integrity: sha512-ErF11J/Q0Uo1TMceX1f7RKfFvQ/j4FS8TagzJnAZBwhHsPcr7uItkSTchkuRHm5+cE4dJO7lqf+MpmlDjp/qAQ==} + cpu: [x64, arm64] + os: [darwin, linux, win32] + dependencies: + '@neon-rs/load': 0.0.4 + detect-libc: 2.0.2 + optionalDependencies: + '@libsql/darwin-arm64': 0.2.0-pre.2 + '@libsql/darwin-x64': 0.2.0-pre.2 + '@libsql/linux-arm64-gnu': 0.2.0-pre.2 + '@libsql/linux-arm64-musl': 0.2.0-pre.2 + '@libsql/linux-x64-gnu': 0.2.0-pre.2 + '@libsql/linux-x64-musl': 0.2.0-pre.2 + '@libsql/win32-x64-msvc': 0.2.0-pre.2 + dev: false + + /listhen@1.5.5: + resolution: {integrity: sha512-LXe8Xlyh3gnxdv4tSjTjscD1vpr/2PRpzq8YIaMJgyKzRG8wdISlWVWnGThJfHnlJ6hmLt2wq1yeeix0TEbuoA==} + hasBin: true + dependencies: + '@parcel/watcher': 2.3.0 + '@parcel/watcher-wasm': 2.3.0 + citty: 0.1.5 + clipboardy: 3.0.0 + consola: 3.2.3 + defu: 6.1.3 + get-port-please: 3.1.1 + h3: 1.9.0 + http-shutdown: 1.2.2 + jiti: 1.21.0 + mlly: 1.4.2 + node-forge: 1.3.1 + pathe: 1.1.1 + std-env: 3.5.0 + ufo: 1.3.2 + untun: 0.1.2 + uqr: 0.1.2 + dev: false + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + + /lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + dev: false + + /lodash.isarguments@3.1.0: + resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} + dev: false + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + /lodash.throttle@4.1.1: + resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + dev: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + + /long@5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + dev: false + + /lru-cache@10.1.0: + resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} + engines: {node: 14 || >=16.14} + dev: false + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + + /lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + dev: false + + /lru-cache@8.0.5: + resolution: {integrity: sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==} + engines: {node: '>=16.14'} + dev: false + + /lru-queue@0.1.0: + resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} + dependencies: + es5-ext: 0.10.62 + dev: true + + /lucia@2.7.4: + resolution: {integrity: sha512-do6Aah5kX2DUl7N0CvELWV1/b+qZGF0AUmUrkthYeNfXfgx4RAkWi4BkAlgGDBB/0c1WApb18mUD1pA5qTaWmw==} + dev: false + + /magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /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-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: false + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: false + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: false + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: false + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + 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: false + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: false + + /miniflare@3.20231030.1: + resolution: {integrity: sha512-Y+EkgV/aFg/3Y/xfFtImK36sLZGXvNS45avVEz0cUCA2pGpg4hGdPu1Udmz5b06SyeUEFVf/dEDMJwdRYVEgLw==} + 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.28.1 + workerd: 1.20231030.0 + ws: 8.14.2 + youch: 3.3.3 + zod: 3.22.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimatch@7.4.6: + resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: false + + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: false + + /mlly@1.4.2: + resolution: {integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==} + dependencies: + acorn: 8.11.2 + pathe: 1.1.1 + pkg-types: 1.0.3 + ufo: 1.3.2 + dev: false + + /mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + dev: false + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /mustache@4.2.0: + resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} + hasBin: true + + /mysql2@3.6.5: + resolution: {integrity: sha512-pS/KqIb0xlXmtmqEuTvBXTmLoQ5LmAz5NW/r8UyQ1ldvnprNEj3P9GbmuQQ2J0A4LO+ynotGi6TbscPa8OUb+w==} + engines: {node: '>= 8.0'} + dependencies: + denque: 2.1.0 + generate-function: 2.3.1 + iconv-lite: 0.6.3 + long: 5.2.3 + lru-cache: 8.0.5 + named-placeholders: 1.1.3 + seq-queue: 0.0.5 + sqlstring: 2.3.3 + dev: false + + /named-placeholders@1.1.3: + resolution: {integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==} + engines: {node: '>=12.0.0'} + dependencies: + lru-cache: 7.18.3 + dev: false + + /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==} + dev: false + + /napi-wasm@1.1.0: + resolution: {integrity: sha512-lHwIAJbmLSjF9VDRm9GoVOy9AGp3aIvkjv+Kvz9h16QR3uSVYH78PNQUnT2U4X53mhlnV2M7wrhibQ3GHicDmg==} + dev: false + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + /next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + dev: true + + /node-abi@3.51.0: + resolution: {integrity: sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 + dev: false + + /node-addon-api@7.0.0: + resolution: {integrity: sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==} + dev: false + + /node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + dev: false + + /node-fetch-native@1.4.1: + resolution: {integrity: sha512-NsXBU0UgBxo2rQLOeWNZqS3fvflWePMECr8CoSWoSTqCqGbVVsvl9vZu1HfQicYN0g5piV9Gh8RTEvo/uP752w==} + dev: false + + /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-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + dev: false + + /node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: false + + /ofetch@1.3.3: + resolution: {integrity: sha512-s1ZCMmQWXy4b5K/TW9i/DtiN8Ku+xCiHcjQ6/J/nDdssirrQNOoB165Zu8EqLMA2lln1JUth9a0aW9Ap2ctrUg==} + dependencies: + destr: 2.0.2 + node-fetch-native: 1.4.1 + ufo: 1.3.2 + dev: false + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: false + + /openapi3-ts@4.1.2: + resolution: {integrity: sha512-B7gOkwsYMZO7BZXwJzXCuVagym2xhqsrilVvV0dnq2Di4+iLUXKVX9gOK23ZqaAHZOwABXN0QTdW8QnkUTX6DA==} + dependencies: + yaml: 2.3.4 + + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + + /oslo@0.23.1: + resolution: {integrity: sha512-E2cc4b+MVXiURqpWC4FpWGEGDOEGiH6EbI0Kowo3+m5MCK79hw3wBscfq6c6yRI1oo17OVqTiCLX3rupg2OAEA==} + dependencies: + '@node-rs/argon2': 1.5.2 + '@node-rs/bcrypt': 1.7.3 + dev: false + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + /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'} + dev: false + + /pathe@1.1.1: + resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} + dev: false + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + /pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + dependencies: + jsonc-parser: 3.2.0 + mlly: 1.4.2 + pathe: 1.1.1 + dev: false + + /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 + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + /prettier@3.1.0: + resolution: {integrity: sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==} + engines: {node: '>=14'} + hasBin: true + dev: false + + /printable-characters@1.0.42: + resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} + + /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'} + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + /radix3@1.1.0: + resolution: {integrity: sha512-pNsHDxbGORSvuSScqNJ+3Km6QAVqk8CfsCBIEoDgpqLrkD2f3QM4I7d1ozJJ172OmIcoUcerZaNWqtLkRXTV3A==} + dev: false + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: false + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + + /redis-errors@1.2.0: + resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} + engines: {node: '>=4'} + dev: false + + /redis-parser@3.0.0: + resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} + engines: {node: '>=4'} + dependencies: + redis-errors: 1.2.0 + dev: false + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + /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'} + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + + /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. + 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 + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: false + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: false + + /selfsigned@2.4.1: + resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} + engines: {node: '>=10'} + dependencies: + '@types/node-forge': 1.3.10 + node-forge: 1.3.1 + dev: true + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /seq-queue@0.0.5: + resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==} + dev: false + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: false + + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: false + + /simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + 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: false + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + /sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + dev: true + + /sqlstring@2.3.3: + resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} + engines: {node: '>= 0.6'} + dev: false + + /stacktracey@2.1.8: + resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==} + dependencies: + as-table: 1.0.55 + get-source: 2.0.12 + + /standard-as-callback@2.1.0: + resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} + dev: false + + /std-env@3.5.0: + resolution: {integrity: sha512-JGUEaALvL0Mf6JCfYnJOTcobY+Nc7sG/TemDRBqCA0wEr4DER7zDchaaixTlmOxAjG1uRJmX82EQcxwTQTkqVA==} + dev: false + + /stoppable@1.1.0: + resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} + engines: {node: '>=4', npm: '>=6'} + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: false + + /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'} + + /superjson@2.2.1: + resolution: {integrity: sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==} + engines: {node: '>=16'} + dependencies: + copy-anything: 3.0.5 + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + + /tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: false + + /tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + 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 + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + /timers-ext@0.1.7: + resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==} + dependencies: + es5-ext: 0.10.62 + next-tick: 1.1.0 + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: false + + /ts-api-utils@1.0.3(typescript@5.3.2): + resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} + engines: {node: '>=16.13.0'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.3.2 + dev: false + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + /tsx@4.5.0: + resolution: {integrity: sha512-hgxdziy9KLaHh9KE+a6tIZFP6kb0MLq/1D0sJVifbGP4QVEYhy6+2FNn7MyCm1pMc63p9CW/L1OzdqTNPxs6rg==} + engines: {node: '>=18.0.0'} + hasBin: true + dependencies: + esbuild: 0.18.20 + get-tsconfig: 4.7.2 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + /type@1.2.0: + resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} + dev: true + + /type@2.7.2: + resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} + dev: true + + /typescript@5.3.2: + resolution: {integrity: sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==} + engines: {node: '>=14.17'} + hasBin: true + + /ufo@1.3.2: + resolution: {integrity: sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==} + dev: false + + /uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + dev: false + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + /undici@5.28.1: + resolution: {integrity: sha512-xcIIvj1LOQH9zAL54iWFkuDEaIVEjLrru7qRpa3GrEEHk6OBhb/LycuUY2m7VCcTuDeLziXCxobQVyKExyGeIA==} + engines: {node: '>=14.0'} + dependencies: + '@fastify/busboy': 2.1.0 + + /unenv@1.8.0: + resolution: {integrity: sha512-uIGbdCWZfhRRmyKj1UioCepQ0jpq638j/Cf0xFTn4zD1nGJ2lSdzYHLzfdXN791oo/0juUiSWW1fBklXMTsuqg==} + dependencies: + consola: 3.2.3 + defu: 6.1.3 + mime: 3.0.0 + node-fetch-native: 1.4.1 + pathe: 1.1.1 + dev: false + + /unstorage@1.10.1: + resolution: {integrity: sha512-rWQvLRfZNBpF+x8D3/gda5nUCQL2PgXy2jNG4U7/Rc9BGEv9+CAJd0YyGCROUBKs9v49Hg8huw3aih5Bf5TAVw==} + peerDependencies: + '@azure/app-configuration': ^1.4.1 + '@azure/cosmos': ^4.0.0 + '@azure/data-tables': ^13.2.2 + '@azure/identity': ^3.3.2 + '@azure/keyvault-secrets': ^4.7.0 + '@azure/storage-blob': ^12.16.0 + '@capacitor/preferences': ^5.0.6 + '@netlify/blobs': ^6.2.0 + '@planetscale/database': ^1.11.0 + '@upstash/redis': ^1.23.4 + '@vercel/kv': ^0.2.3 + idb-keyval: ^6.2.1 + peerDependenciesMeta: + '@azure/app-configuration': + optional: true + '@azure/cosmos': + optional: true + '@azure/data-tables': + optional: true + '@azure/identity': + optional: true + '@azure/keyvault-secrets': + optional: true + '@azure/storage-blob': + optional: true + '@capacitor/preferences': + optional: true + '@netlify/blobs': + optional: true + '@planetscale/database': + optional: true + '@upstash/redis': + optional: true + '@vercel/kv': + optional: true + idb-keyval: + optional: true + dependencies: + anymatch: 3.1.3 + chokidar: 3.5.3 + destr: 2.0.2 + h3: 1.9.0 + ioredis: 5.3.2 + listhen: 1.5.5 + lru-cache: 10.1.0 + mri: 1.2.0 + node-fetch-native: 1.4.1 + ofetch: 1.3.3 + ufo: 1.3.2 + transitivePeerDependencies: + - supports-color + dev: false + + /untun@0.1.2: + resolution: {integrity: sha512-wLAMWvxfqyTiBODA1lg3IXHQtjggYLeTK7RnSfqtOXixWJ3bAa2kK/HHmOOg19upteqO3muLvN6O/icbyQY33Q==} + hasBin: true + dependencies: + citty: 0.1.5 + consola: 3.2.3 + pathe: 1.1.1 + dev: false + + /uqr@0.1.2: + resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==} + dev: false + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: false + + /uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + dev: false + + /vscode-json-languageservice@4.2.1: + resolution: {integrity: sha512-xGmv9QIWs2H8obGbWg+sIPI/3/pFgj/5OWBhNzs00BkYQ9UaB2F6JJaGB/2/YOZJ3BvLXQTC4Q7muqU25QgAhA==} + dependencies: + jsonc-parser: 3.2.0 + vscode-languageserver-textdocument: 1.0.11 + vscode-languageserver-types: 3.17.5 + vscode-nls: 5.2.0 + vscode-uri: 3.0.8 + dev: true + + /vscode-languageserver-textdocument@1.0.11: + resolution: {integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==} + dev: true + + /vscode-languageserver-types@3.17.5: + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + dev: true + + /vscode-nls@5.2.0: + resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==} + dev: true + + /vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + dev: true + + /web-streams-polyfill@3.2.1: + resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} + engines: {node: '>= 8'} + dev: false + + /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@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + + /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 + + /wrangler@3.17.1: + resolution: {integrity: sha512-Pr9+/tjFkthzG63uoVm1NtVvgokT6p92fy1UsOgrntHyTu0pZMC1VJzG0NC8Vhs+z/+yTT8AqVV6AiJb3w8ZOQ==} + engines: {node: '>=16.17.0'} + hasBin: true + 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.1 + 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 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /ws@8.14.2: + resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + /xxhash-wasm@1.0.2: + resolution: {integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==} + dev: true + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + /yaml@2.3.4: + resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} + engines: {node: '>= 14'} + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + /youch@3.3.3: + resolution: {integrity: sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==} + dependencies: + cookie: 0.5.0 + mustache: 4.2.0 + stacktracey: 2.1.8 + + /zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} diff --git a/src/scripts/seed/seed.ts b/src/scripts/seed/seed.ts index 2f1f981..c5aff49 100644 --- a/src/scripts/seed/seed.ts +++ b/src/scripts/seed/seed.ts @@ -9,7 +9,7 @@ import { assetTag, assetTagAsset, authUser, - userNetworking, + userFollowing, userCollection, userCollectionAsset, userFavoriteAsset, @@ -80,9 +80,9 @@ async function main() { .returning() console.log(`[SEED] [authUser] inserted ${newUsers.length} rows\n`) - console.log("[SEED] [userNetworking] Seeding user following...") - const newUserNetworking = await db - .insert(userNetworking) + console.log("[SEED] [userFollowing] Seeding user following...") + const newuserFollowing = await db + .insert(userFollowing) .values([ { followerId: newUsers[0].id, @@ -99,7 +99,7 @@ async function main() { ]) .returning() console.log( - `[SEED] [userNetworking] inserted ${newUserNetworking.length} rows\n` + `[SEED] [userFollowing] inserted ${newuserFollowing.length} rows\n` ) console.log("[SEED] [assetTag] Seeding asset tags...") @@ -214,6 +214,7 @@ async function main() { url: "/test/image.png", status: "approved", uploadedById: newUsers[0].id, + uploadedByName: newUsers[0].username, assetIsOptimized: true, viewCount: 1337, downloadCount: 1337, @@ -230,6 +231,7 @@ async function main() { url: "/test/image.png", status: "approved", uploadedById: newUsers[1].id, + uploadedByName: newUsers[1].username, viewCount: 1337, downloadCount: 1337, fileSize: 40213, @@ -245,6 +247,7 @@ async function main() { url: "/test/image.png", status: "approved", uploadedById: newUsers[1].id, + uploadedByName: newUsers[1].username, assetIsOptimized: true, viewCount: 1337, downloadCount: 1337, @@ -261,6 +264,7 @@ async function main() { url: "/test/image.png", status: "approved", uploadedById: newUsers[1].id, + uploadedByName: newUsers[1].username, assetIsOptimized: true, viewCount: 1337, downloadCount: 1337, @@ -277,6 +281,7 @@ async function main() { url: "/test/image.png", status: "approved", uploadedById: newUsers[2].id, + uploadedByName: newUsers[2].username, assetIsOptimized: true, viewCount: 1337, downloadCount: 1337, @@ -290,6 +295,7 @@ async function main() { url: "/test/image.png", status: "approved", uploadedById: newUsers[2].id, + uploadedByName: newUsers[2].username, assetIsOptimized: true, viewCount: 1337, downloadCount: 1337, diff --git a/src/v2/db/drizzle.ts b/src/v2/db/drizzle.ts index 70ade1b..9fdad06 100644 --- a/src/v2/db/drizzle.ts +++ b/src/v2/db/drizzle.ts @@ -3,7 +3,7 @@ export const tableNames = { authKey: "authKey", authSession: "authSession", authUser: "authUser", - userNetworking: "userNetworking", + userFollowing: "userFollowing", gameAssetCategory: "gameAssetCategory", assetLikes: "assetLikes", userCollectionLikes: "userCollectionLikes", diff --git a/src/v2/db/migrations/0000_warm_nick_fury.sql b/src/v2/db/migrations/0000_shiny_valkyrie.sql similarity index 96% rename from src/v2/db/migrations/0000_warm_nick_fury.sql rename to src/v2/db/migrations/0000_shiny_valkyrie.sql index c768f1c..bac2148 100644 --- a/src/v2/db/migrations/0000_warm_nick_fury.sql +++ b/src/v2/db/migrations/0000_shiny_valkyrie.sql @@ -4,7 +4,8 @@ CREATE TABLE `asset` ( `extension` text NOT NULL, `game` text NOT NULL, `asset_category` text NOT NULL, - `uploaded_by` text NOT NULL, + `uploaded_by_id` text NOT NULL, + `uploaded_by_name` text NOT NULL, `url` text NOT NULL, `status` text DEFAULT 'pending' NOT NULL, `uploaded_date` text NOT NULL, @@ -17,7 +18,8 @@ CREATE TABLE `asset` ( `height` integer DEFAULT 0 NOT NULL, FOREIGN KEY (`game`) REFERENCES `game`(`id`) ON UPDATE cascade ON DELETE cascade, FOREIGN KEY (`asset_category`) REFERENCES `assetCategory`(`id`) ON UPDATE cascade ON DELETE cascade, - FOREIGN KEY (`uploaded_by`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade + FOREIGN KEY (`uploaded_by_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade, + FOREIGN KEY (`uploaded_by_name`) REFERENCES `authUser`(`username`) ON UPDATE cascade ON DELETE cascade ); --> statement-breakpoint CREATE TABLE `assetCategory` ( @@ -186,7 +188,7 @@ CREATE TABLE `userFavoriteAsset` ( FOREIGN KEY (`asset_id`) REFERENCES `asset`(`id`) ON UPDATE cascade ON DELETE cascade ); --> statement-breakpoint -CREATE TABLE `userNetworking` ( +CREATE TABLE `userFollowing` ( `followerId` text NOT NULL, `followingId` text NOT NULL, `createdAt` text NOT NULL, @@ -206,7 +208,7 @@ CREATE INDEX `assets_id_idx` ON `asset` (`id`);--> statement-breakpoint CREATE INDEX `assets_name_idx` ON `asset` (`name`);--> statement-breakpoint CREATE INDEX `assets_game_name_idx` ON `asset` (`game`);--> statement-breakpoint CREATE INDEX `assets_asset_category_name_idx` ON `asset` (`asset_category`);--> statement-breakpoint -CREATE INDEX `assets_uploaded_by_id_idx` ON `asset` (`uploaded_by`);--> statement-breakpoint +CREATE INDEX `assets_uploaded_by_id_idx` ON `asset` (`uploaded_by_id`);--> statement-breakpoint CREATE UNIQUE INDEX `assetCategory_id_unique` ON `assetCategory` (`id`);--> statement-breakpoint CREATE UNIQUE INDEX `assetCategory_name_unique` ON `assetCategory` (`name`);--> statement-breakpoint CREATE INDEX `asset_category_id_idx` ON `assetCategory` (`id`);--> statement-breakpoint @@ -266,7 +268,7 @@ CREATE UNIQUE INDEX `userFavoriteAsset_id_unique` ON `userFavoriteAsset` (`id`); CREATE INDEX `favorited_assets_assets_id_idx` ON `userFavoriteAsset` (`id`);--> statement-breakpoint CREATE INDEX `favorited_assets_assets_user_id_idx` ON `userFavoriteAsset` (`favorited_assets_id`);--> statement-breakpoint CREATE INDEX `favorited_assets_assets_asset_id_idx` ON `userFavoriteAsset` (`asset_id`);--> statement-breakpoint -CREATE INDEX `userNetworking_follower_idx` ON `userNetworking` (`followerId`);--> statement-breakpoint -CREATE INDEX `userNetworking_following_idx` ON `userNetworking` (`followingId`);--> statement-breakpoint +CREATE INDEX `userfollowing_follower_idx` ON `userFollowing` (`followerId`);--> statement-breakpoint +CREATE INDEX `userfollowing_following_idx` ON `userFollowing` (`followingId`);--> statement-breakpoint CREATE INDEX `userCollectionNetworking_collection_idx` ON `userCollectionLikes` (`collection_id`);--> statement-breakpoint CREATE INDEX `userCollectionNetworking_likedBy_idx` ON `userCollectionLikes` (`liked_by_id`); \ No newline at end of file diff --git a/src/v2/db/migrations/meta/0000_snapshot.json b/src/v2/db/migrations/meta/0000_snapshot.json index 1f563b8..d1c7e85 100644 --- a/src/v2/db/migrations/meta/0000_snapshot.json +++ b/src/v2/db/migrations/meta/0000_snapshot.json @@ -1,1633 +1,1897 @@ { - "version": "5", - "dialect": "sqlite", - "id": "2d696f86-b652-410a-bfd1-fc6deda2f5f8", - "prevId": "00000000-0000-0000-0000-000000000000", - "tables": { - "asset": { - "name": "asset", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "extension": { - "name": "extension", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "game": { - "name": "game", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_category": { - "name": "asset_category", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by": { - "name": "uploaded_by", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "url": { - "name": "url", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "status": { - "name": "status", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "'pending'" - }, - "uploaded_date": { - "name": "uploaded_date", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_is_optimized": { - "name": "asset_is_optimized", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "asset_is_suggestive": { - "name": "asset_is_suggestive", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "view_count": { - "name": "view_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "download_count": { - "name": "download_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "file_size": { - "name": "file_size", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "width": { - "name": "width", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "height": { - "name": "height", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "assets_id_idx": { - "name": "assets_id_idx", - "columns": ["id"], - "isUnique": false - }, - "assets_name_idx": { - "name": "assets_name_idx", - "columns": ["name"], - "isUnique": false - }, - "assets_game_name_idx": { - "name": "assets_game_name_idx", - "columns": ["game"], - "isUnique": false - }, - "assets_asset_category_name_idx": { - "name": "assets_asset_category_name_idx", - "columns": ["asset_category"], - "isUnique": false - }, - "assets_uploaded_by_id_idx": { - "name": "assets_uploaded_by_id_idx", - "columns": ["uploaded_by"], - "isUnique": false - } - }, - "foreignKeys": { - "asset_game_game_id_fk": { - "name": "asset_game_game_id_fk", - "tableFrom": "asset", - "tableTo": "game", - "columnsFrom": ["game"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "asset_asset_category_assetCategory_id_fk": { - "name": "asset_asset_category_assetCategory_id_fk", - "tableFrom": "asset", - "tableTo": "assetCategory", - "columnsFrom": ["asset_category"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "asset_uploaded_by_authUser_id_fk": { - "name": "asset_uploaded_by_authUser_id_fk", - "tableFrom": "asset", - "tableTo": "authUser", - "columnsFrom": ["uploaded_by"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetCategory": { - "name": "assetCategory", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetCategory_id_unique": { - "name": "assetCategory_id_unique", - "columns": ["id"], - "isUnique": true - }, - "assetCategory_name_unique": { - "name": "assetCategory_name_unique", - "columns": ["name"], - "isUnique": true - }, - "asset_category_id_idx": { - "name": "asset_category_id_idx", - "columns": ["id"], - "isUnique": false - }, - "asset_category_name_idx": { - "name": "asset_category_name_idx", - "columns": ["name"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "gameAssetCategory": { - "name": "gameAssetCategory", - "columns": { - "game_id": { - "name": "game_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_category_id": { - "name": "asset_category_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "game_asset_category_game_id_idx": { - "name": "game_asset_category_game_id_idx", - "columns": ["game_id"], - "isUnique": false - }, - "game_asset_category_asset_category_id_idx": { - "name": "game_asset_category_asset_category_id_idx", - "columns": ["asset_category_id"], - "isUnique": false - } - }, - "foreignKeys": { - "gameAssetCategory_game_id_game_id_fk": { - "name": "gameAssetCategory_game_id_game_id_fk", - "tableFrom": "gameAssetCategory", - "tableTo": "game", - "columnsFrom": ["game_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "gameAssetCategory_asset_category_id_assetCategory_id_fk": { - "name": "gameAssetCategory_asset_category_id_assetCategory_id_fk", - "tableFrom": "gameAssetCategory", - "tableTo": "assetCategory", - "columnsFrom": ["asset_category_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetTag": { - "name": "assetTag", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetTag_id_unique": { - "name": "assetTag_id_unique", - "columns": ["id"], - "isUnique": true - }, - "assetTag_name_unique": { - "name": "assetTag_name_unique", - "columns": ["name"], - "isUnique": true - }, - "asset_tag_id_idx": { - "name": "asset_tag_id_idx", - "columns": ["id"], - "isUnique": false - }, - "asset_tag_name_idx": { - "name": "asset_tag_name_idx", - "columns": ["name"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetTagAsset": { - "name": "assetTagAsset", - "columns": { - "asset_tag_id": { - "name": "asset_tag_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "asset_tags_assets_asset_tag_id_idx": { - "name": "asset_tags_assets_asset_tag_id_idx", - "columns": ["asset_tag_id"], - "isUnique": false - }, - "asset_tags_assets_asset_id_idx": { - "name": "asset_tags_assets_asset_id_idx", - "columns": ["asset_id"], - "isUnique": false - } - }, - "foreignKeys": { - "assetTagAsset_asset_tag_id_assetTag_id_fk": { - "name": "assetTagAsset_asset_tag_id_assetTag_id_fk", - "tableFrom": "assetTagAsset", - "tableTo": "assetTag", - "columnsFrom": ["asset_tag_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "assetTagAsset_asset_id_asset_id_fk": { - "name": "assetTagAsset_asset_id_asset_id_fk", - "tableFrom": "assetTagAsset", - "tableTo": "asset", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "atlas": { - "name": "atlas", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "url": { - "name": "url", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by": { - "name": "uploaded_by", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by_name": { - "name": "uploaded_by_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_date": { - "name": "uploaded_date", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "file_size": { - "name": "file_size", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "atlas_id_unique": { - "name": "atlas_id_unique", - "columns": ["id"], - "isUnique": true - }, - "atlas_id_idx": { - "name": "atlas_id_idx", - "columns": ["id"], - "isUnique": false - }, - "atlas_uploaded_by_idx": { - "name": "atlas_uploaded_by_idx", - "columns": ["uploaded_by"], - "isUnique": false - }, - "atlas_uploaded_by_name_idx": { - "name": "atlas_uploaded_by_name_idx", - "columns": ["uploaded_by_name"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "atlasToAsset": { - "name": "atlasToAsset", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "atlas_id": { - "name": "atlas_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "atlas_to_assets_id_idx": { - "name": "atlas_to_assets_id_idx", - "columns": ["id"], - "isUnique": false - }, - "atlas_to_assets_atlas_id_idx": { - "name": "atlas_to_assets_atlas_id_idx", - "columns": ["atlas_id"], - "isUnique": false - }, - "atlas_to_assets_asset_id_idx": { - "name": "atlas_to_assets_asset_id_idx", - "columns": ["asset_id"], - "isUnique": false - } - }, - "foreignKeys": { - "atlasToAsset_atlas_id_atlas_id_fk": { - "name": "atlasToAsset_atlas_id_atlas_id_fk", - "tableFrom": "atlasToAsset", - "tableTo": "atlas", - "columnsFrom": ["atlas_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "atlasToAsset_asset_id_asset_id_fk": { - "name": "atlasToAsset_asset_id_asset_id_fk", - "tableFrom": "atlasToAsset", - "tableTo": "asset", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetLikes": { - "name": "assetLikes", - "columns": { - "asset_id": { - "name": "asset_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetlikes_asset_idx": { - "name": "assetlikes_asset_idx", - "columns": ["asset_id"], - "isUnique": false - }, - "assetlikes_likedBy_idx": { - "name": "assetlikes_likedBy_idx", - "columns": ["liked_by_id"], - "isUnique": false - } - }, - "foreignKeys": { - "assetLikes_asset_id_authUser_id_fk": { - "name": "assetLikes_asset_id_authUser_id_fk", - "tableFrom": "assetLikes", - "tableTo": "authUser", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - }, - "assetLikes_liked_by_id_authUser_id_fk": { - "name": "assetLikes_liked_by_id_authUser_id_fk", - "tableFrom": "assetLikes", - "tableTo": "authUser", - "columnsFrom": ["liked_by_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "version": "5", + "dialect": "sqlite", + "id": "65c146c9-3d56-4907-a45f-64781adc3bd5", + "prevId": "00000000-0000-0000-0000-000000000000", + "tables": { + "asset": { + "name": "asset", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "extension": { + "name": "extension", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "game": { + "name": "game", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_category": { + "name": "asset_category", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by_id": { + "name": "uploaded_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by_name": { + "name": "uploaded_by_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'pending'" + }, + "uploaded_date": { + "name": "uploaded_date", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_is_optimized": { + "name": "asset_is_optimized", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "asset_is_suggestive": { + "name": "asset_is_suggestive", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "view_count": { + "name": "view_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "download_count": { + "name": "download_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "file_size": { + "name": "file_size", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "width": { + "name": "width", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "height": { + "name": "height", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "assets_id_idx": { + "name": "assets_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "assets_name_idx": { + "name": "assets_name_idx", + "columns": [ + "name" + ], + "isUnique": false + }, + "assets_game_name_idx": { + "name": "assets_game_name_idx", + "columns": [ + "game" + ], + "isUnique": false + }, + "assets_asset_category_name_idx": { + "name": "assets_asset_category_name_idx", + "columns": [ + "asset_category" + ], + "isUnique": false + }, + "assets_uploaded_by_id_idx": { + "name": "assets_uploaded_by_id_idx", + "columns": [ + "uploaded_by_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "asset_game_game_id_fk": { + "name": "asset_game_game_id_fk", + "tableFrom": "asset", + "tableTo": "game", + "columnsFrom": [ + "game" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "asset_asset_category_assetCategory_id_fk": { + "name": "asset_asset_category_assetCategory_id_fk", + "tableFrom": "asset", + "tableTo": "assetCategory", + "columnsFrom": [ + "asset_category" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "asset_uploaded_by_id_authUser_id_fk": { + "name": "asset_uploaded_by_id_authUser_id_fk", + "tableFrom": "asset", + "tableTo": "authUser", + "columnsFrom": [ + "uploaded_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "asset_uploaded_by_name_authUser_username_fk": { + "name": "asset_uploaded_by_name_authUser_username_fk", + "tableFrom": "asset", + "tableTo": "authUser", + "columnsFrom": [ + "uploaded_by_name" + ], + "columnsTo": [ + "username" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetCategory": { + "name": "assetCategory", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetCategory_id_unique": { + "name": "assetCategory_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "assetCategory_name_unique": { + "name": "assetCategory_name_unique", + "columns": [ + "name" + ], + "isUnique": true + }, + "asset_category_id_idx": { + "name": "asset_category_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "asset_category_name_idx": { + "name": "asset_category_name_idx", + "columns": [ + "name" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "gameAssetCategory": { + "name": "gameAssetCategory", + "columns": { + "game_id": { + "name": "game_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_category_id": { + "name": "asset_category_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "game_asset_category_game_id_idx": { + "name": "game_asset_category_game_id_idx", + "columns": [ + "game_id" + ], + "isUnique": false + }, + "game_asset_category_asset_category_id_idx": { + "name": "game_asset_category_asset_category_id_idx", + "columns": [ + "asset_category_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "gameAssetCategory_game_id_game_id_fk": { + "name": "gameAssetCategory_game_id_game_id_fk", + "tableFrom": "gameAssetCategory", + "tableTo": "game", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "gameAssetCategory_asset_category_id_assetCategory_id_fk": { + "name": "gameAssetCategory_asset_category_id_assetCategory_id_fk", + "tableFrom": "gameAssetCategory", + "tableTo": "assetCategory", + "columnsFrom": [ + "asset_category_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetTag": { + "name": "assetTag", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetTag_id_unique": { + "name": "assetTag_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "assetTag_name_unique": { + "name": "assetTag_name_unique", + "columns": [ + "name" + ], + "isUnique": true + }, + "asset_tag_id_idx": { + "name": "asset_tag_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "asset_tag_name_idx": { + "name": "asset_tag_name_idx", + "columns": [ + "name" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetTagAsset": { + "name": "assetTagAsset", + "columns": { + "asset_tag_id": { + "name": "asset_tag_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "asset_tags_assets_asset_tag_id_idx": { + "name": "asset_tags_assets_asset_tag_id_idx", + "columns": [ + "asset_tag_id" + ], + "isUnique": false + }, + "asset_tags_assets_asset_id_idx": { + "name": "asset_tags_assets_asset_id_idx", + "columns": [ + "asset_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "assetTagAsset_asset_tag_id_assetTag_id_fk": { + "name": "assetTagAsset_asset_tag_id_assetTag_id_fk", + "tableFrom": "assetTagAsset", + "tableTo": "assetTag", + "columnsFrom": [ + "asset_tag_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "assetTagAsset_asset_id_asset_id_fk": { + "name": "assetTagAsset_asset_id_asset_id_fk", + "tableFrom": "assetTagAsset", + "tableTo": "asset", + "columnsFrom": [ + "asset_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "atlas": { + "name": "atlas", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by": { + "name": "uploaded_by", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by_name": { + "name": "uploaded_by_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_date": { + "name": "uploaded_date", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "file_size": { + "name": "file_size", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "atlas_id_unique": { + "name": "atlas_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "atlas_id_idx": { + "name": "atlas_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "atlas_uploaded_by_idx": { + "name": "atlas_uploaded_by_idx", + "columns": [ + "uploaded_by" + ], + "isUnique": false + }, + "atlas_uploaded_by_name_idx": { + "name": "atlas_uploaded_by_name_idx", + "columns": [ + "uploaded_by_name" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "atlasToAsset": { + "name": "atlasToAsset", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "atlas_id": { + "name": "atlas_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "atlas_to_assets_id_idx": { + "name": "atlas_to_assets_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "atlas_to_assets_atlas_id_idx": { + "name": "atlas_to_assets_atlas_id_idx", + "columns": [ + "atlas_id" + ], + "isUnique": false + }, + "atlas_to_assets_asset_id_idx": { + "name": "atlas_to_assets_asset_id_idx", + "columns": [ + "asset_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "atlasToAsset_atlas_id_atlas_id_fk": { + "name": "atlasToAsset_atlas_id_atlas_id_fk", + "tableFrom": "atlasToAsset", + "tableTo": "atlas", + "columnsFrom": [ + "atlas_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "atlasToAsset_asset_id_asset_id_fk": { + "name": "atlasToAsset_asset_id_asset_id_fk", + "tableFrom": "atlasToAsset", + "tableTo": "asset", + "columnsFrom": [ + "asset_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetLikes": { + "name": "assetLikes", + "columns": { + "asset_id": { + "name": "asset_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetlikes_asset_idx": { + "name": "assetlikes_asset_idx", + "columns": [ + "asset_id" + ], + "isUnique": false + }, + "assetlikes_likedBy_idx": { + "name": "assetlikes_likedBy_idx", + "columns": [ + "liked_by_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "assetLikes_asset_id_authUser_id_fk": { + "name": "assetLikes_asset_id_authUser_id_fk", + "tableFrom": "assetLikes", + "tableTo": "authUser", + "columnsFrom": [ + "asset_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "assetLikes_liked_by_id_authUser_id_fk": { + "name": "assetLikes_liked_by_id_authUser_id_fk", + "tableFrom": "assetLikes", + "tableTo": "authUser", + "columnsFrom": [ + "liked_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "game": { + "name": "game", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": 0 + }, + "possible_suggestive_content": { + "name": "possible_suggestive_content", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "game_id_unique": { + "name": "game_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "game_name_unique": { + "name": "game_name_unique", + "columns": [ + "name" + ], + "isUnique": true + }, + "game_id_idx": { + "name": "game_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "game_name_idx": { + "name": "game_name_idx", + "columns": [ + "name" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "savedOcGenerators": { + "name": "savedOcGenerators", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false }, "game": { - "name": "game", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - }, - "possible_suggestive_content": { - "name": "possible_suggestive_content", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "game_id_unique": { - "name": "game_id_unique", - "columns": ["id"], - "isUnique": true - }, - "game_name_unique": { - "name": "game_name_unique", - "columns": ["name"], - "isUnique": true - }, - "game_id_idx": { - "name": "game_id_idx", - "columns": ["id"], - "isUnique": false - }, - "game_name_idx": { - "name": "game_name_idx", - "columns": ["name"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "savedOcGenerators": { - "name": "savedOcGenerators", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "game": { - "name": "game", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "date_created": { - "name": "date_created", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "content": { - "name": "content", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "saved_color_palette": { - "name": "saved_color_palette", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "sakura_url": { - "name": "sakura_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "savedOcGenerators_id_unique": { - "name": "savedOcGenerators_id_unique", - "columns": ["id"], - "isUnique": true - }, - "saved_oc_generators_id_idx": { - "name": "saved_oc_generators_id_idx", - "columns": ["id"], - "isUnique": false - }, - "saved_oc_generators_user_id_idx": { - "name": "saved_oc_generators_user_id_idx", - "columns": ["user_id"], - "isUnique": false - } - }, - "foreignKeys": { - "savedOcGenerators_user_id_authUser_id_fk": { - "name": "savedOcGenerators_user_id_authUser_id_fk", - "tableFrom": "savedOcGenerators", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "authKey": { - "name": "authKey", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "hashed_password": { - "name": "hashed_password", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "authKey_id_unique": { - "name": "authKey_id_unique", - "columns": ["id"], - "isUnique": true - }, - "key_user_id_idx": { - "name": "key_user_id_idx", - "columns": ["user_id"], - "isUnique": false - } - }, - "foreignKeys": { - "authKey_user_id_authUser_id_fk": { - "name": "authKey_user_id_authUser_id_fk", - "tableFrom": "authKey", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "authUser": { - "name": "authUser", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "avatar_url": { - "name": "avatar_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "banner_url": { - "name": "banner_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "display_name": { - "name": "display_name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "username": { - "name": "username", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "username_colour": { - "name": "username_colour", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "email": { - "name": "email", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "email_verified": { - "name": "email_verified", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "pronouns": { - "name": "pronouns", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "verified": { - "name": "verified", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "bio": { - "name": "bio", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "'No bio set'" - }, - "date_joined": { - "name": "date_joined", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "role_flags": { - "name": "role_flags", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 1 - }, - "is_contributor": { - "name": "is_contributor", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "self_assignable_role_flags": { - "name": "self_assignable_role_flags", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "authUser_id_unique": { - "name": "authUser_id_unique", - "columns": ["id"], - "isUnique": true - }, - "authUser_username_unique": { - "name": "authUser_username_unique", - "columns": ["username"], - "isUnique": true - }, - "user_id_idx": { - "name": "user_id_idx", - "columns": ["id"], - "isUnique": false - }, - "user_username_idx": { - "name": "user_username_idx", - "columns": ["username"], - "isUnique": false - }, - "user_email_idx": { - "name": "user_email_idx", - "columns": ["email"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "authSession": { - "name": "authSession", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "active_expires": { - "name": "active_expires", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "idle_expires": { - "name": "idle_expires", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "authSession_id_unique": { - "name": "authSession_id_unique", - "columns": ["id"], - "isUnique": true - }, - "session_user_id_idx": { - "name": "session_user_id_idx", - "columns": ["user_id"], - "isUnique": false - } - }, - "foreignKeys": { - "authSession_user_id_authUser_id_fk": { - "name": "authSession_user_id_authUser_id_fk", - "tableFrom": "authSession", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "emailVerificationToken": { - "name": "emailVerificationToken", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "emailVerificationToken_id_unique": { - "name": "emailVerificationToken_id_unique", - "columns": ["id"], - "isUnique": true - }, - "email_verification_token_user_id_idx": { - "name": "email_verification_token_user_id_idx", - "columns": ["user_id"], - "isUnique": false - }, - "email_verification_token_token_idx": { - "name": "email_verification_token_token_idx", - "columns": ["token"], - "isUnique": false - } - }, - "foreignKeys": { - "emailVerificationToken_user_id_authUser_id_fk": { - "name": "emailVerificationToken_user_id_authUser_id_fk", - "tableFrom": "emailVerificationToken", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "passwordResetToken": { - "name": "passwordResetToken", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "passwordResetToken_id_unique": { - "name": "passwordResetToken_id_unique", - "columns": ["id"], - "isUnique": true - }, - "password_reset_token_user_id_idx": { - "name": "password_reset_token_user_id_idx", - "columns": ["user_id"], - "isUnique": false - }, - "password_reset_token_token_idx": { - "name": "password_reset_token_token_idx", - "columns": ["token"], - "isUnique": false - } - }, - "foreignKeys": { - "passwordResetToken_user_id_authUser_id_fk": { - "name": "passwordResetToken_user_id_authUser_id_fk", - "tableFrom": "passwordResetToken", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userCollection": { - "name": "userCollection", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "date_created": { - "name": "date_created", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - } - }, - "indexes": { - "userCollection_id_unique": { - "name": "userCollection_id_unique", - "columns": ["id"], - "isUnique": true - }, - "collection_id_idx": { - "name": "collection_id_idx", - "columns": ["id"], - "isUnique": false - }, - "user_collection_id_idx": { - "name": "user_collection_id_idx", - "columns": ["user_id"], - "isUnique": false - } - }, - "foreignKeys": { - "userCollection_user_id_authUser_id_fk": { - "name": "userCollection_user_id_authUser_id_fk", - "tableFrom": "userCollection", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetCollectionAsset": { - "name": "assetCollectionAsset", - "columns": { - "collection_id": { - "name": "collection_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "date_added": { - "name": "date_added", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "collection_assets_collection_id_idx": { - "name": "collection_assets_collection_id_idx", - "columns": ["collection_id"], - "isUnique": false - }, - "collection_assets_asset_id_idx": { - "name": "collection_assets_asset_id_idx", - "columns": ["asset_id"], - "isUnique": false - } - }, - "foreignKeys": { - "assetCollectionAsset_collection_id_userCollection_id_fk": { - "name": "assetCollectionAsset_collection_id_userCollection_id_fk", - "tableFrom": "assetCollectionAsset", - "tableTo": "userCollection", - "columnsFrom": ["collection_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "assetCollectionAsset_asset_id_asset_id_fk": { - "name": "assetCollectionAsset_asset_id_asset_id_fk", - "tableFrom": "assetCollectionAsset", - "tableTo": "asset", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "socialsConnection": { - "name": "socialsConnection", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "discord_id": { - "name": "discord_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "socialsConnection_id_unique": { - "name": "socialsConnection_id_unique", - "columns": ["id"], - "isUnique": true - }, - "socialsConnection_user_id_unique": { - "name": "socialsConnection_user_id_unique", - "columns": ["user_id"], - "isUnique": true - }, - "socials_connection_user_id_idx": { - "name": "socials_connection_user_id_idx", - "columns": ["user_id"], - "isUnique": false - }, - "socials_connection_discord_id_idx": { - "name": "socials_connection_discord_id_idx", - "columns": ["discord_id"], - "isUnique": false - } - }, - "foreignKeys": { - "socialsConnection_user_id_authUser_id_fk": { - "name": "socialsConnection_user_id_authUser_id_fk", - "tableFrom": "socialsConnection", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userFavorite": { - "name": "userFavorite", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - } - }, - "indexes": { - "userFavorite_id_unique": { - "name": "userFavorite_id_unique", - "columns": ["id"], - "isUnique": true - }, - "favorited_assets_id_idx": { - "name": "favorited_assets_id_idx", - "columns": ["id"], - "isUnique": false - }, - "favorited_assets_user_id_idx": { - "name": "favorited_assets_user_id_idx", - "columns": ["user_id"], - "isUnique": false - } - }, - "foreignKeys": { - "userFavorite_user_id_authUser_id_fk": { - "name": "userFavorite_user_id_authUser_id_fk", - "tableFrom": "userFavorite", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userFavoriteAsset": { - "name": "userFavoriteAsset", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "favorited_assets_id": { - "name": "favorited_assets_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "userFavoriteAsset_id_unique": { - "name": "userFavoriteAsset_id_unique", - "columns": ["id"], - "isUnique": true - }, - "favorited_assets_assets_id_idx": { - "name": "favorited_assets_assets_id_idx", - "columns": ["id"], - "isUnique": false - }, - "favorited_assets_assets_user_id_idx": { - "name": "favorited_assets_assets_user_id_idx", - "columns": ["favorited_assets_id"], - "isUnique": false - }, - "favorited_assets_assets_asset_id_idx": { - "name": "favorited_assets_assets_asset_id_idx", - "columns": ["asset_id"], - "isUnique": false - } - }, - "foreignKeys": { - "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk": { - "name": "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk", - "tableFrom": "userFavoriteAsset", - "tableTo": "userFavorite", - "columnsFrom": ["favorited_assets_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "userFavoriteAsset_asset_id_asset_id_fk": { - "name": "userFavoriteAsset_asset_id_asset_id_fk", - "tableFrom": "userFavoriteAsset", - "tableTo": "asset", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userNetworking": { - "name": "userNetworking", - "columns": { - "followerId": { - "name": "followerId", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "followingId": { - "name": "followingId", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "userNetworking_follower_idx": { - "name": "userNetworking_follower_idx", - "columns": ["followerId"], - "isUnique": false - }, - "userNetworking_following_idx": { - "name": "userNetworking_following_idx", - "columns": ["followingId"], - "isUnique": false - } - }, - "foreignKeys": { - "userNetworking_followerId_authUser_id_fk": { - "name": "userNetworking_followerId_authUser_id_fk", - "tableFrom": "userNetworking", - "tableTo": "authUser", - "columnsFrom": ["followerId"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - }, - "userNetworking_followingId_authUser_id_fk": { - "name": "userNetworking_followingId_authUser_id_fk", - "tableFrom": "userNetworking", - "tableTo": "authUser", - "columnsFrom": ["followingId"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userCollectionLikes": { - "name": "userCollectionLikes", - "columns": { - "collection_id": { - "name": "collection_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "userCollectionNetworking_collection_idx": { - "name": "userCollectionNetworking_collection_idx", - "columns": ["collection_id"], - "isUnique": false - }, - "userCollectionNetworking_likedBy_idx": { - "name": "userCollectionNetworking_likedBy_idx", - "columns": ["liked_by_id"], - "isUnique": false - } - }, - "foreignKeys": { - "userCollectionLikes_collection_id_userCollection_id_fk": { - "name": "userCollectionLikes_collection_id_userCollection_id_fk", - "tableFrom": "userCollectionLikes", - "tableTo": "userCollection", - "columnsFrom": ["collection_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - }, - "userCollectionLikes_liked_by_id_authUser_id_fk": { - "name": "userCollectionLikes_liked_by_id_authUser_id_fk", - "tableFrom": "userCollectionLikes", - "tableTo": "authUser", - "columnsFrom": ["liked_by_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "name": "game", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "date_created": { + "name": "date_created", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "saved_color_palette": { + "name": "saved_color_palette", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sakura_url": { + "name": "sakura_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "savedOcGenerators_id_unique": { + "name": "savedOcGenerators_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "saved_oc_generators_id_idx": { + "name": "saved_oc_generators_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "saved_oc_generators_user_id_idx": { + "name": "saved_oc_generators_user_id_idx", + "columns": [ + "user_id" + ], + "isUnique": false } + }, + "foreignKeys": { + "savedOcGenerators_user_id_authUser_id_fk": { + "name": "savedOcGenerators_user_id_authUser_id_fk", + "tableFrom": "savedOcGenerators", + "tableTo": "authUser", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} }, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} + "authKey": { + "name": "authKey", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "hashed_password": { + "name": "hashed_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "authKey_id_unique": { + "name": "authKey_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "key_user_id_idx": { + "name": "key_user_id_idx", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "authKey_user_id_authUser_id_fk": { + "name": "authKey_user_id_authUser_id_fk", + "tableFrom": "authKey", + "tableTo": "authUser", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "authUser": { + "name": "authUser", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "avatar_url": { + "name": "avatar_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "banner_url": { + "name": "banner_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "display_name": { + "name": "display_name", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "username_colour": { + "name": "username_colour", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "email_verified": { + "name": "email_verified", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "pronouns": { + "name": "pronouns", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "verified": { + "name": "verified", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "bio": { + "name": "bio", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'No bio set'" + }, + "date_joined": { + "name": "date_joined", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "role_flags": { + "name": "role_flags", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "is_contributor": { + "name": "is_contributor", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "self_assignable_role_flags": { + "name": "self_assignable_role_flags", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "authUser_id_unique": { + "name": "authUser_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "authUser_username_unique": { + "name": "authUser_username_unique", + "columns": [ + "username" + ], + "isUnique": true + }, + "user_id_idx": { + "name": "user_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "user_username_idx": { + "name": "user_username_idx", + "columns": [ + "username" + ], + "isUnique": false + }, + "user_email_idx": { + "name": "user_email_idx", + "columns": [ + "email" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "authSession": { + "name": "authSession", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "active_expires": { + "name": "active_expires", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "idle_expires": { + "name": "idle_expires", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "authSession_id_unique": { + "name": "authSession_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "session_user_id_idx": { + "name": "session_user_id_idx", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "authSession_user_id_authUser_id_fk": { + "name": "authSession_user_id_authUser_id_fk", + "tableFrom": "authSession", + "tableTo": "authUser", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "emailVerificationToken": { + "name": "emailVerificationToken", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "emailVerificationToken_id_unique": { + "name": "emailVerificationToken_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "email_verification_token_user_id_idx": { + "name": "email_verification_token_user_id_idx", + "columns": [ + "user_id" + ], + "isUnique": false + }, + "email_verification_token_token_idx": { + "name": "email_verification_token_token_idx", + "columns": [ + "token" + ], + "isUnique": false + } + }, + "foreignKeys": { + "emailVerificationToken_user_id_authUser_id_fk": { + "name": "emailVerificationToken_user_id_authUser_id_fk", + "tableFrom": "emailVerificationToken", + "tableTo": "authUser", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "passwordResetToken": { + "name": "passwordResetToken", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "passwordResetToken_id_unique": { + "name": "passwordResetToken_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "password_reset_token_user_id_idx": { + "name": "password_reset_token_user_id_idx", + "columns": [ + "user_id" + ], + "isUnique": false + }, + "password_reset_token_token_idx": { + "name": "password_reset_token_token_idx", + "columns": [ + "token" + ], + "isUnique": false + } + }, + "foreignKeys": { + "passwordResetToken_user_id_authUser_id_fk": { + "name": "passwordResetToken_user_id_authUser_id_fk", + "tableFrom": "passwordResetToken", + "tableTo": "authUser", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userCollection": { + "name": "userCollection", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "date_created": { + "name": "date_created", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": { + "userCollection_id_unique": { + "name": "userCollection_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "collection_id_idx": { + "name": "collection_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "user_collection_id_idx": { + "name": "user_collection_id_idx", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "userCollection_user_id_authUser_id_fk": { + "name": "userCollection_user_id_authUser_id_fk", + "tableFrom": "userCollection", + "tableTo": "authUser", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetCollectionAsset": { + "name": "assetCollectionAsset", + "columns": { + "collection_id": { + "name": "collection_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "date_added": { + "name": "date_added", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "collection_assets_collection_id_idx": { + "name": "collection_assets_collection_id_idx", + "columns": [ + "collection_id" + ], + "isUnique": false + }, + "collection_assets_asset_id_idx": { + "name": "collection_assets_asset_id_idx", + "columns": [ + "asset_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "assetCollectionAsset_collection_id_userCollection_id_fk": { + "name": "assetCollectionAsset_collection_id_userCollection_id_fk", + "tableFrom": "assetCollectionAsset", + "tableTo": "userCollection", + "columnsFrom": [ + "collection_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "assetCollectionAsset_asset_id_asset_id_fk": { + "name": "assetCollectionAsset_asset_id_asset_id_fk", + "tableFrom": "assetCollectionAsset", + "tableTo": "asset", + "columnsFrom": [ + "asset_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "socialsConnection": { + "name": "socialsConnection", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "discord_id": { + "name": "discord_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "socialsConnection_id_unique": { + "name": "socialsConnection_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "socialsConnection_user_id_unique": { + "name": "socialsConnection_user_id_unique", + "columns": [ + "user_id" + ], + "isUnique": true + }, + "socials_connection_user_id_idx": { + "name": "socials_connection_user_id_idx", + "columns": [ + "user_id" + ], + "isUnique": false + }, + "socials_connection_discord_id_idx": { + "name": "socials_connection_discord_id_idx", + "columns": [ + "discord_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "socialsConnection_user_id_authUser_id_fk": { + "name": "socialsConnection_user_id_authUser_id_fk", + "tableFrom": "socialsConnection", + "tableTo": "authUser", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userFavorite": { + "name": "userFavorite", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": { + "userFavorite_id_unique": { + "name": "userFavorite_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "favorited_assets_id_idx": { + "name": "favorited_assets_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "favorited_assets_user_id_idx": { + "name": "favorited_assets_user_id_idx", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "userFavorite_user_id_authUser_id_fk": { + "name": "userFavorite_user_id_authUser_id_fk", + "tableFrom": "userFavorite", + "tableTo": "authUser", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userFavoriteAsset": { + "name": "userFavoriteAsset", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "favorited_assets_id": { + "name": "favorited_assets_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "userFavoriteAsset_id_unique": { + "name": "userFavoriteAsset_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "favorited_assets_assets_id_idx": { + "name": "favorited_assets_assets_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "favorited_assets_assets_user_id_idx": { + "name": "favorited_assets_assets_user_id_idx", + "columns": [ + "favorited_assets_id" + ], + "isUnique": false + }, + "favorited_assets_assets_asset_id_idx": { + "name": "favorited_assets_assets_asset_id_idx", + "columns": [ + "asset_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk": { + "name": "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk", + "tableFrom": "userFavoriteAsset", + "tableTo": "userFavorite", + "columnsFrom": [ + "favorited_assets_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "userFavoriteAsset_asset_id_asset_id_fk": { + "name": "userFavoriteAsset_asset_id_asset_id_fk", + "tableFrom": "userFavoriteAsset", + "tableTo": "asset", + "columnsFrom": [ + "asset_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userFollowing": { + "name": "userFollowing", + "columns": { + "followerId": { + "name": "followerId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "followingId": { + "name": "followingId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "userfollowing_follower_idx": { + "name": "userfollowing_follower_idx", + "columns": [ + "followerId" + ], + "isUnique": false + }, + "userfollowing_following_idx": { + "name": "userfollowing_following_idx", + "columns": [ + "followingId" + ], + "isUnique": false + } + }, + "foreignKeys": { + "userFollowing_followerId_authUser_id_fk": { + "name": "userFollowing_followerId_authUser_id_fk", + "tableFrom": "userFollowing", + "tableTo": "authUser", + "columnsFrom": [ + "followerId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "userFollowing_followingId_authUser_id_fk": { + "name": "userFollowing_followingId_authUser_id_fk", + "tableFrom": "userFollowing", + "tableTo": "authUser", + "columnsFrom": [ + "followingId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userCollectionLikes": { + "name": "userCollectionLikes", + "columns": { + "collection_id": { + "name": "collection_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "userCollectionNetworking_collection_idx": { + "name": "userCollectionNetworking_collection_idx", + "columns": [ + "collection_id" + ], + "isUnique": false + }, + "userCollectionNetworking_likedBy_idx": { + "name": "userCollectionNetworking_likedBy_idx", + "columns": [ + "liked_by_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "userCollectionLikes_collection_id_userCollection_id_fk": { + "name": "userCollectionLikes_collection_id_userCollection_id_fk", + "tableFrom": "userCollectionLikes", + "tableTo": "userCollection", + "columnsFrom": [ + "collection_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "userCollectionLikes_liked_by_id_authUser_id_fk": { + "name": "userCollectionLikes_liked_by_id_authUser_id_fk", + "tableFrom": "userCollectionLikes", + "tableTo": "authUser", + "columnsFrom": [ + "liked_by_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/v2/db/migrations/meta/_journal.json b/src/v2/db/migrations/meta/_journal.json index bddd472..fbb7567 100644 --- a/src/v2/db/migrations/meta/_journal.json +++ b/src/v2/db/migrations/meta/_journal.json @@ -1,13 +1,13 @@ { - "version": "5", - "dialect": "sqlite", - "entries": [ - { - "idx": 0, - "version": "5", - "when": 1701020851212, - "tag": "0000_warm_nick_fury", - "breakpoints": true - } - ] -} + "version": "5", + "dialect": "sqlite", + "entries": [ + { + "idx": 0, + "version": "5", + "when": 1701092169578, + "tag": "0000_shiny_valkyrie", + "breakpoints": true + } + ] +} \ No newline at end of file diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index 2ddb8a5..c841e8c 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -13,5 +13,5 @@ export * from "./schema/user/user-attributes" export * from "./schema/user/user-collections" export * from "./schema/user/user-connections" export * from "./schema/user/user-favorites" -export * from "./schema/user/user-networking" +export * from "./schema/user/user-following" export * from "./schema/user/user-collection-likes" diff --git a/src/v2/db/schema/asset/asset.ts b/src/v2/db/schema/asset/asset.ts index 4ac4d6e..6e0f569 100644 --- a/src/v2/db/schema/asset/asset.ts +++ b/src/v2/db/schema/asset/asset.ts @@ -44,12 +44,18 @@ export const asset = sqliteTable( onDelete: "cascade", }) .notNull(), - uploadedById: text("uploaded_by") + uploadedById: text("uploaded_by_id") .references(() => authUser.id, { onUpdate: "cascade", onDelete: "cascade", }) .notNull(), + uploadedByName: text("uploaded_by_name") + .references(() => authUser.username, { + onUpdate: "cascade", + onDelete: "cascade", + }) + .notNull(), url: text("url").notNull(), status: text("status") .$type() @@ -95,8 +101,8 @@ export const assetRelations = relations(asset, ({ one, many }) => ({ atlasToAsset: many(atlasToAsset), assetLikes: many(assetLikes), authUser: one(authUser, { - fields: [asset.uploadedById], - references: [authUser.id], + fields: [asset.uploadedById, asset.uploadedByName], + references: [authUser.id, authUser.username], relationName: "asset_auth_user", }), game: one(game, { diff --git a/src/v2/db/schema/user/user-networking.ts b/src/v2/db/schema/user/user-following.ts similarity index 62% rename from src/v2/db/schema/user/user-networking.ts rename to src/v2/db/schema/user/user-following.ts index 9670e79..8bdf7fb 100644 --- a/src/v2/db/schema/user/user-networking.ts +++ b/src/v2/db/schema/user/user-following.ts @@ -13,8 +13,8 @@ NOTE: this file manages the "social" aspect of users. - This is where users can follow other users, and be followed by other users. */ -export const userNetworking = sqliteTable( - tableNames.userNetworking, +export const userFollowing = sqliteTable( + tableNames.userFollowing, { followerId: text("followerId") .notNull() @@ -28,29 +28,29 @@ export const userNetworking = sqliteTable( return new Date().toISOString() }), }, - (userNetworking) => { + (userFollowing) => { return { - followerIdx: index("userNetworking_follower_idx").on( - userNetworking.followerId + followerIdx: index("userfollowing_follower_idx").on( + userFollowing.followerId ), - followingIdx: index("userNetworking_following_idx").on( - userNetworking.followingId + followingIdx: index("userfollowing_following_idx").on( + userFollowing.followingId ), } } ) -export type UserNetworking = typeof userNetworking.$inferSelect -export type NewUserNetworking = typeof userNetworking.$inferInsert +export type UserFollowing = typeof userFollowing.$inferSelect +export type NewUserFollowing = typeof userFollowing.$inferInsert -export const userNetworkingRelations = relations(userNetworking, ({ one }) => ({ +export const userFollowingRelations = relations(userFollowing, ({ one }) => ({ follower: one(authUser, { - fields: [userNetworking.followerId], + fields: [userFollowing.followerId], references: [authUser.id], relationName: "follower", }), following: one(authUser, { - fields: [userNetworking.followingId], + fields: [userFollowing.followingId], references: [authUser.id], relationName: "following", }), diff --git a/src/v2/db/schema/user/user.ts b/src/v2/db/schema/user/user.ts index e955e8f..5c6f780 100644 --- a/src/v2/db/schema/user/user.ts +++ b/src/v2/db/schema/user/user.ts @@ -7,7 +7,7 @@ import { // uniqueIndex, index, } from "drizzle-orm/sqlite-core" -import { userNetworking } from "./user-networking" +import { userFollowing } from "./user-following" import { asset } from "../asset/asset" import { userFavorite } from "./user-favorites" import { savedOcGenerators } from "../oc-generators/oc-generators" @@ -110,10 +110,10 @@ export type Session = typeof userSession.$inferSelect export type NewSession = typeof userSession.$inferInsert export const usersRelations = relations(authUser, ({ one, many }) => ({ - follower: many(userNetworking, { + follower: many(userFollowing, { relationName: "follower", }), - following: many(userNetworking, { + following: many(userFollowing, { relationName: "following", }), authKey: many(authKey), diff --git a/src/v2/lib/managers/asset/asset-manager.ts b/src/v2/lib/managers/asset/asset-manager.ts index 1efbe3c..be8ff2c 100644 --- a/src/v2/lib/managers/asset/asset-manager.ts +++ b/src/v2/lib/managers/asset/asset-manager.ts @@ -234,6 +234,7 @@ export class AssetManager { */ public async createAsset( userId: string, + userNickname: string, newAsset: z.infer, bucket: R2Bucket, file: File @@ -254,6 +255,7 @@ export class AssetManager { gameId: newAsset.gameId, assetCategoryId: newAsset.assetCategoryId, url: key, + uploadedByName: userNickname, uploadedById: userId, status: "pending", fileSize: newAsset.size, diff --git a/src/v2/lib/managers/user/user-follow-manager.ts b/src/v2/lib/managers/user/user-follow-manager.ts index 80e0208..68a99a8 100644 --- a/src/v2/lib/managers/user/user-follow-manager.ts +++ b/src/v2/lib/managers/user/user-follow-manager.ts @@ -1,7 +1,7 @@ import { DrizzleInstance } from "@/v2/db/turso" import { and, eq } from "drizzle-orm" -import { userNetworking } from "@/v2/db/schema" -import type { UserNetworking, NewUserNetworking } from "@/v2/db/schema" +import { userFollowing } from "@/v2/db/schema" +import type { NewUserFollowing, UserFollowing } from "@/v2/db/schema" /** * Manages user follow and unfollow operations. @@ -14,15 +14,15 @@ export class UserFollowManager { * * @param followerId - The ID of the user who is following. * @param followingId - The ID of the user being followed. - * @returns The user networking object representing the follow relationship. + * @returns The user follow object representing the follow relationship. */ public async followUser( followerId: string, followingId: string - ): Promise { + ): Promise { try { - const [networking] = await this.drizzle - .insert(userNetworking) + const [follow] = await this.drizzle + .insert(userFollowing) .values({ followerId, followingId, @@ -30,7 +30,7 @@ export class UserFollowManager { }) .returning() - return networking + return follow } catch (e) { console.error( `Error following user ${followingId} from user ${followerId}`, @@ -52,19 +52,19 @@ export class UserFollowManager { public async unfollowUser( followerId: string, followingId: string - ): Promise { + ): Promise { try { - const [networking] = await this.drizzle - .delete(userNetworking) + const [unfollow] = await this.drizzle + .delete(userFollowing) .where( and( - eq(userNetworking.followerId, followerId), - eq(userNetworking.followingId, followingId) + eq(userFollowing.followerId, followerId), + eq(userFollowing.followingId, followingId) ) ) .returning() - return networking + return unfollow } catch (e) { console.error( `Error unfollowing user ${followingId} from user ${followerId}`, @@ -82,14 +82,12 @@ export class UserFollowManager { * @param userId - The ID of the user for whom to retrieve followers. * @returns An array of user networking objects representing followers. */ - public async getFollowers( - userId: string - ): Promise { + public async getFollowers(userId: string): Promise { try { const followers = await this.drizzle .select() - .from(userNetworking) - .where(eq(userNetworking.followingId, userId)) + .from(userFollowing) + .where(eq(userFollowing.followingId, userId)) return followers ?? null } catch (e) { From 3e2aad4d78d2c11eb033e8c9e6527817114e0e23 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Wed, 29 Nov 2023 08:59:41 +0000 Subject: [PATCH 171/318] init game, category & tag liking tables --- pnpm-lock.yaml | 9107 ++++++++++------- src/v2/db/drizzle.ts | 3 + ...lkyrie.sql => 0000_spotty_iron_monger.sql} | 110 +- src/v2/db/migrations/meta/0000_snapshot.json | 610 +- src/v2/db/migrations/meta/_journal.json | 4 +- src/v2/db/schema.ts | 9 +- src/v2/db/schema/asset/asset-likes.ts | 2 +- src/v2/db/schema/asset/asset.ts | 4 +- .../categories/asset-categories-likes.ts | 51 + .../{asset => categories}/asset-categories.ts | 16 +- src/v2/db/schema/game/game-likes.ts | 44 + src/v2/db/schema/game/game.ts | 4 +- src/v2/db/schema/tags/asset-tags-likes.ts | 48 + .../db/schema/{asset => tags}/asset-tags.ts | 4 +- src/v2/db/schema/user/user.ts | 6 + src/v2/lib/managers/asset/asset-manager.ts | 3 +- 16 files changed, 5957 insertions(+), 4068 deletions(-) rename src/v2/db/migrations/{0000_shiny_valkyrie.sql => 0000_spotty_iron_monger.sql} (89%) create mode 100644 src/v2/db/schema/categories/asset-categories-likes.ts rename src/v2/db/schema/{asset => categories}/asset-categories.ts (95%) create mode 100644 src/v2/db/schema/game/game-likes.ts create mode 100644 src/v2/db/schema/tags/asset-tags-likes.ts rename src/v2/db/schema/{asset => tags}/asset-tags.ts (95%) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5b0d6df..ec2f143 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,3822 +1,5303 @@ -lockfileVersion: '6.0' +lockfileVersion: "6.0" settings: - autoInstallPeers: true - excludeLinksFromLockfile: false + autoInstallPeers: true + excludeLinksFromLockfile: false dependencies: - '@hono/swagger-ui': - specifier: ^0.2.0 - version: 0.2.0(hono@3.10.2) - '@hono/zod-openapi': - specifier: ^0.8.6 - version: 0.8.6(hono@3.10.2)(zod@3.22.4) - '@libsql/client': - specifier: 0.4.0-pre.2 - version: 0.4.0-pre.2 - '@lucia-auth/adapter-session-unstorage': - specifier: ^2.1.0 - version: 2.1.0(lucia@2.7.4)(unstorage@1.10.1) - '@lucia-auth/adapter-sqlite': - specifier: ^2.0.1 - version: 2.0.1(@libsql/client@0.4.0-pre.2)(better-sqlite3@9.1.1)(lucia@2.7.4) - '@lucia-auth/oauth': - specifier: ^3.5.0 - version: 3.5.0(lucia@2.7.4) - '@typescript-eslint/eslint-plugin': - specifier: ^6.12.0 - version: 6.12.0(@typescript-eslint/parser@6.12.0)(eslint@8.54.0)(typescript@5.3.2) - better-sqlite3: - specifier: ^9.1.1 - version: 9.1.1 - drizzle-orm: - specifier: ^0.29.0 - version: 0.29.0(@cloudflare/workers-types@4.20231121.0)(@libsql/client@0.4.0-pre.2)(better-sqlite3@9.1.1)(mysql2@3.6.5) - drizzle-zod: - specifier: ^0.5.1 - version: 0.5.1(drizzle-orm@0.29.0)(zod@3.22.4) - hono: - specifier: ^3.10.2 - version: 3.10.2 - lucia: - specifier: ^2.7.4 - version: 2.7.4 - miniflare: - specifier: ^3.20231030.1 - version: 3.20231030.1 - mysql2: - specifier: ^3.6.5 - version: 3.6.5 - oslo: - specifier: ^0.23.1 - version: 0.23.1 - prettier: - specifier: ^3.1.0 - version: 3.1.0 - unstorage: - specifier: ^1.10.1 - version: 1.10.1 - uuid: - specifier: ^9.0.1 - version: 9.0.1 - zod: - specifier: ^3.22.4 - version: 3.22.4 + "@hono/swagger-ui": + specifier: ^0.2.0 + version: 0.2.0(hono@3.10.2) + "@hono/zod-openapi": + specifier: ^0.8.6 + version: 0.8.6(hono@3.10.2)(zod@3.22.4) + "@libsql/client": + specifier: 0.4.0-pre.2 + version: 0.4.0-pre.2 + "@lucia-auth/adapter-session-unstorage": + specifier: ^2.1.0 + version: 2.1.0(lucia@2.7.4)(unstorage@1.10.1) + "@lucia-auth/adapter-sqlite": + specifier: ^2.0.1 + version: 2.0.1(@libsql/client@0.4.0-pre.2)(better-sqlite3@9.1.1)(lucia@2.7.4) + "@lucia-auth/oauth": + specifier: ^3.5.0 + version: 3.5.0(lucia@2.7.4) + "@typescript-eslint/eslint-plugin": + specifier: ^6.12.0 + version: 6.12.0(@typescript-eslint/parser@6.12.0)(eslint@8.54.0)(typescript@5.3.2) + better-sqlite3: + specifier: ^9.1.1 + version: 9.1.1 + drizzle-orm: + specifier: ^0.29.0 + version: 0.29.0(@cloudflare/workers-types@4.20231121.0)(@libsql/client@0.4.0-pre.2)(better-sqlite3@9.1.1)(mysql2@3.6.5) + drizzle-zod: + specifier: ^0.5.1 + version: 0.5.1(drizzle-orm@0.29.0)(zod@3.22.4) + hono: + specifier: ^3.10.2 + version: 3.10.2 + lucia: + specifier: ^2.7.4 + version: 2.7.4 + miniflare: + specifier: ^3.20231030.1 + version: 3.20231030.1 + mysql2: + specifier: ^3.6.5 + version: 3.6.5 + oslo: + specifier: ^0.23.1 + version: 0.23.1 + prettier: + specifier: ^3.1.0 + version: 3.1.0 + unstorage: + specifier: ^1.10.1 + version: 1.10.1 + uuid: + specifier: ^9.0.1 + version: 9.0.1 + zod: + specifier: ^3.22.4 + version: 3.22.4 devDependencies: - '@asteasolutions/zod-to-openapi': - specifier: ^6.3.0 - version: 6.3.0(zod@3.22.4) - '@cloudflare/workers-types': - specifier: ^4.20231121.0 - version: 4.20231121.0 - '@types/node': - specifier: ^20.10.0 - version: 20.10.0 - dotenv: - specifier: ^16.3.1 - version: 16.3.1 - drizzle-kit: - specifier: ^0.20.6 - version: 0.20.6 - eslint: - specifier: ^8.54.0 - version: 8.54.0 - eslint-config-google: - specifier: ^0.14.0 - version: 0.14.0(eslint@8.54.0) - eslint-plugin-json: - specifier: ^3.1.0 - version: 3.1.0 - husky: - specifier: ^8.0.3 - version: 8.0.3 - openapi-generator: - specifier: link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator - version: link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator - tsx: - specifier: ^4.5.0 - version: 4.5.0 - typescript: - specifier: ^5.3.2 - version: 5.3.2 - wrangler: - specifier: 3.17.1 - version: 3.17.1 + "@asteasolutions/zod-to-openapi": + specifier: ^6.3.0 + version: 6.3.0(zod@3.22.4) + "@cloudflare/workers-types": + specifier: ^4.20231121.0 + version: 4.20231121.0 + "@types/node": + specifier: ^20.10.0 + version: 20.10.0 + dotenv: + specifier: ^16.3.1 + version: 16.3.1 + drizzle-kit: + specifier: ^0.20.6 + version: 0.20.6 + eslint: + specifier: ^8.54.0 + version: 8.54.0 + eslint-config-google: + specifier: ^0.14.0 + version: 0.14.0(eslint@8.54.0) + eslint-plugin-json: + specifier: ^3.1.0 + version: 3.1.0 + husky: + specifier: ^8.0.3 + version: 8.0.3 + openapi-generator: + specifier: link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator + version: link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator + tsx: + specifier: ^4.5.0 + version: 4.5.0 + typescript: + specifier: ^5.3.2 + version: 5.3.2 + wrangler: + specifier: 3.17.1 + version: 3.17.1 packages: + /@aashutoshrathi/word-wrap@1.2.6: + resolution: + { + integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==, + } + engines: { node: ">=0.10.0" } + + /@asteasolutions/zod-to-openapi@5.5.0(zod@3.22.4): + resolution: + { + integrity: sha512-d5HwrvM6dOKr3XdeF+DmashGvfEc+1oiEfbscugsiwSTrFtuMa7ETpW9sTNnVgn+hJaz+PRxPQUYD7q9/5dUig==, + } + peerDependencies: + zod: ^3.20.2 + dependencies: + openapi3-ts: 4.1.2 + zod: 3.22.4 + dev: false + + /@asteasolutions/zod-to-openapi@6.3.0(zod@3.22.4): + resolution: + { + integrity: sha512-ca7Svz3BWkMaIP3M1YGsyxgp7AcKXlTmy19ozhY0DslhatXbnyxdvxlmiI0TmvkIfi6RpQfm+eK1neVLsh6Riw==, + } + peerDependencies: + zod: ^3.20.2 + dependencies: + openapi3-ts: 4.1.2 + zod: 3.22.4 + dev: true + + /@cloudflare/kv-asset-handler@0.2.0: + resolution: + { + integrity: sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==, + } + dependencies: + mime: 3.0.0 + dev: true + + /@cloudflare/workerd-darwin-64@1.20231030.0: + resolution: + { + integrity: sha512-J4PQ9utPxLya9yHdMMx3AZeC5M/6FxcoYw6jo9jbDDFTy+a4Gslqf4Im9We3aeOEdPXa3tgQHVQOSelJSZLhIw==, + } + engines: { node: ">=16" } + cpu: [x64] + os: [darwin] + requiresBuild: true + optional: true + + /@cloudflare/workerd-darwin-arm64@1.20231030.0: + resolution: + { + integrity: sha512-WSJJjm11Del4hSneiNB7wTXGtBXI4QMCH9l5qf4iT5PAW8cESGcCmdHtWDWDtGAAGcvmLT04KNvmum92vRKKQQ==, + } + engines: { node: ">=16" } + cpu: [arm64] + os: [darwin] + requiresBuild: 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 + 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 + 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 + optional: true + + /@cloudflare/workers-types@4.20231121.0: + resolution: + { + integrity: sha512-+kWfpCkqiepwAKXyHoE0gnkPgkLhz0/9HOBIGhHRsUvUKvhUtm3mbqqoGRWgF1qcjzrDUBbrrOq4MYHfFtc2RA==, + } + + /@drizzle-team/studio@0.0.35: + resolution: + { + integrity: sha512-t5LTNOVf+L7Bb/wdssOIPx0ueNvhyaIXdrvKgoHR4wK0GD7SRmILcCTzn6N6Ltr1VnFzQZG/bzn6HMagn17Jtw==, + } + dependencies: + superjson: 2.2.1 + 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-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-arm64@0.19.8: + resolution: + { + integrity: sha512-B8JbS61bEunhfx8kasogFENgQfr/dIp+ggYXwTqdbMAgGDhRa3AaPpQMuQU0rNxDLECj6FhDzk1cF9WHMVwrtA==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: 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-arm@0.19.8: + resolution: + { + integrity: sha512-31E2lxlGM1KEfivQl8Yf5aYU/mflz9g06H6S15ITUFQueMFtFjESRMoDSkvMo8thYvLBax+VKTPlpnx+sPicOA==, + } + engines: { node: ">=12" } + cpu: [arm] + 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/android-x64@0.19.8: + resolution: + { + integrity: sha512-rdqqYfRIn4jWOp+lzQttYMa2Xar3OK9Yt2fhOhzFXqg0rVWEfSclJvZq5fZslnz6ypHvVf3CT7qyf0A5pM682A==, + } + 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-arm64@0.19.8: + resolution: + { + integrity: sha512-RQw9DemMbIq35Bprbboyf8SmOr4UXsRVxJ97LgB55VKKeJOOdvsIPy0nFyF2l8U+h4PtBx/1kRf0BelOYCiQcw==, + } + 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/darwin-x64@0.19.8: + resolution: + { + integrity: sha512-3sur80OT9YdeZwIVgERAysAbwncom7b4bCI2XKLjMfPymTud7e/oY4y+ci1XVp5TfQp/bppn7xLw1n/oSQY3/Q==, + } + 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-arm64@0.19.8: + resolution: + { + integrity: sha512-WAnPJSDattvS/XtPCTj1tPoTxERjcTpH6HsMr6ujTT+X6rylVe8ggxk8pVxzf5U1wh5sPODpawNicF5ta/9Tmw==, + } + 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/freebsd-x64@0.19.8: + resolution: + { + integrity: sha512-ICvZyOplIjmmhjd6mxi+zxSdpPTKFfyPPQMQTK/w+8eNK6WV01AjIztJALDtwNNfFhfZLux0tZLC+U9nSyA5Zg==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [freebsd] + 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-arm64@0.19.8: + resolution: + { + integrity: sha512-z1zMZivxDLHWnyGOctT9JP70h0beY54xDDDJt4VpTX+iwA77IFsE1vCXWmprajJGa+ZYSqkSbRQ4eyLCpCmiCQ==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [linux] + 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-arm@0.19.8: + resolution: + { + integrity: sha512-H4vmI5PYqSvosPaTJuEppU9oz1dq2A7Mr2vyg5TF9Ga+3+MGgBdGzcyBP7qK9MrwFQZlvNyJrvz6GuCaj3OukQ==, + } + engines: { node: ">=12" } + cpu: [arm] + 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-ia32@0.19.8: + resolution: + { + integrity: sha512-1a8suQiFJmZz1khm/rDglOc8lavtzEMRo0v6WhPgxkrjcU0LkHj+TwBrALwoz/OtMExvsqbbMI0ChyelKabSvQ==, + } + 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-loong64@0.19.8: + resolution: + { + integrity: sha512-fHZWS2JJxnXt1uYJsDv9+b60WCc2RlvVAy1F76qOLtXRO+H4mjt3Tr6MJ5l7Q78X8KgCFudnTuiQRBhULUyBKQ==, + } + 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-mips64el@0.19.8: + resolution: + { + integrity: sha512-Wy/z0EL5qZYLX66dVnEg9riiwls5IYnziwuju2oUiuxVc+/edvqXa04qNtbrs0Ukatg5HEzqT94Zs7J207dN5Q==, + } + 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-ppc64@0.19.8: + resolution: + { + integrity: sha512-ETaW6245wK23YIEufhMQ3HSeHO7NgsLx8gygBVldRHKhOlD1oNeNy/P67mIh1zPn2Hr2HLieQrt6tWrVwuqrxg==, + } + 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-riscv64@0.19.8: + resolution: + { + integrity: sha512-T2DRQk55SgoleTP+DtPlMrxi/5r9AeFgkhkZ/B0ap99zmxtxdOixOMI570VjdRCs9pE4Wdkz7JYrsPvsl7eESg==, + } + 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-s390x@0.19.8: + resolution: + { + integrity: sha512-NPxbdmmo3Bk7mbNeHmcCd7R7fptJaczPYBaELk6NcXxy7HLNyWwCyDJ/Xx+/YcNH7Im5dHdx9gZ5xIwyliQCbg==, + } + 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/linux-x64@0.19.8: + resolution: + { + integrity: sha512-lytMAVOM3b1gPypL2TRmZ5rnXl7+6IIk8uB3eLsV1JwcizuolblXRrc5ShPrO9ls/b+RTp+E6gbsuLWHWi2zGg==, + } + 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/netbsd-x64@0.19.8: + resolution: + { + integrity: sha512-hvWVo2VsXz/8NVt1UhLzxwAfo5sioj92uo0bCfLibB0xlOmimU/DeAEsQILlBQvkhrGjamP0/el5HU76HAitGw==, + } + 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/openbsd-x64@0.19.8: + resolution: + { + integrity: sha512-/7Y7u77rdvmGTxR83PgaSvSBJCC2L3Kb1M/+dmSIvRvQPXXCuC97QAwMugBNG0yGcbEGfFBH7ojPzAOxfGNkwQ==, + } + 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/sunos-x64@0.19.8: + resolution: + { + integrity: sha512-9Lc4s7Oi98GqFA4HzA/W2JHIYfnXbUYgekUP/Sm4BG9sfLjyv6GKKHKKVs83SMicBF2JwAX6A1PuOLMqpD001w==, + } + 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-arm64@0.19.8: + resolution: + { + integrity: sha512-rq6WzBGjSzihI9deW3fC2Gqiak68+b7qo5/3kmB6Gvbh/NYPA0sJhrnp7wgV4bNwjqM+R2AApXGxMO7ZoGhIJg==, + } + 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-ia32@0.19.8: + resolution: + { + integrity: sha512-AIAbverbg5jMvJznYiGhrd3sumfwWs8572mIJL5NQjJa06P8KfCPWZQ0NwZbPQnbQi9OWSZhFVSUWjjIrn4hSw==, + } + 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 + + /@esbuild/win32-x64@0.19.8: + resolution: + { + integrity: sha512-bfZ0cQ1uZs2PqpulNL5j/3w+GDhP36k1K5c38QdQg+Swy51jFZWWeIkteNsufkQxp986wnqRRsb/bHbY1WQ7TA==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.54.0): + resolution: + { + integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.54.0 + eslint-visitor-keys: 3.4.3 + + /@eslint-community/regexpp@4.10.0: + resolution: + { + integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==, + } + engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } + + /@eslint/eslintrc@2.1.3: + resolution: + { + integrity: sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.23.0 + ignore: 5.3.0 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + /@eslint/js@8.54.0: + resolution: + { + integrity: sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + + /@fastify/busboy@2.1.0: + resolution: + { + integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==, + } + engines: { node: ">=14" } + + /@hono/swagger-ui@0.2.0(hono@3.10.2): + resolution: + { + integrity: sha512-ulWqCI+38vTlxxBmOAi5VTOUDa5/7fKHPTwyq00kRUjUxPp3Ej5Cs+B/fvGs5gd3KraArLArkln7sHhb5vODZA==, + } + peerDependencies: + hono: "*" + dependencies: + hono: 3.10.2 + dev: false + + /@hono/zod-openapi@0.8.6(hono@3.10.2)(zod@3.22.4): + resolution: + { + integrity: sha512-HQNmJoIGyu2kNK9DI8+gIyV4c+bZm5t75PytPSRqMTim9P9HAAPMtepxu44aPZO9ehDxK4KZlRVRqz8OBxOL1A==, + } + engines: { node: ">=16.0.0" } + peerDependencies: + hono: ">=3.9.0" + zod: 3.* + dependencies: + "@asteasolutions/zod-to-openapi": 5.5.0(zod@3.22.4) + "@hono/zod-validator": 0.1.11(hono@3.10.2)(zod@3.22.4) + hono: 3.10.2 + zod: 3.22.4 + dev: false + + /@hono/zod-validator@0.1.11(hono@3.10.2)(zod@3.22.4): + resolution: + { + integrity: sha512-PQXeHUP0+36qpRt8yfeD7N2jbK3ETlGvSN6dMof/HwUC/APRokQRjpXZm4rrlG71Ft0aWE01+Bm4XejqPie5Uw==, + } + peerDependencies: + hono: ">=3.9.0" + zod: ^3.19.1 + dependencies: + hono: 3.10.2 + zod: 3.22.4 + dev: false + + /@humanwhocodes/config-array@0.11.13: + resolution: + { + integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==, + } + engines: { node: ">=10.10.0" } + dependencies: + "@humanwhocodes/object-schema": 2.0.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + /@humanwhocodes/module-importer@1.0.1: + resolution: + { + integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, + } + engines: { node: ">=12.22" } + + /@humanwhocodes/object-schema@2.0.1: + resolution: + { + integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==, + } + + /@ioredis/commands@1.2.0: + resolution: + { + integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==, + } + dev: false + + /@libsql/client@0.4.0-pre.2: + resolution: + { + integrity: sha512-sKWNPU+RQoki5hEoYhpC+fQ/kj+VuwoSXF2PMYGWB19MYBkMaMc7udn1T0ibNjNkFNmd98HvPIHd48NNC2oWvA==, + } + dependencies: + "@libsql/hrana-client": 0.5.5 + js-base64: 3.7.5 + libsql: 0.2.0-pre.2 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: false + + /@libsql/darwin-arm64@0.2.0-pre.2: + resolution: + { + integrity: sha512-PKXAKBJF6XwfCT3yU1N/kHyUGcsatf/4rYNzdnc6UGeg+yWf3ZDk7sGnHHj9bDQ9oKLRVJQmc+cNIEsF2GOr9w==, + } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@libsql/darwin-x64@0.2.0-pre.2: + resolution: + { + integrity: sha512-e3k4LsAFRf8qFfZqkg/VkoXK/UfDYgoDvLmAJpAGKEFp7d/bTmbF1r0YCjtGaPbheRxARAUXNfekvRhdpXE3mg==, + } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@libsql/hrana-client@0.5.5: + resolution: + { + integrity: sha512-i+hDBpiV719poqEiHupUUZYKJ9YSbCRFe5Q2PQ0v3mHIftePH6gayLjp2u6TXbqbO/Dv6y8yyvYlBXf/kFfRZA==, + } + dependencies: + "@libsql/isomorphic-fetch": 0.1.10 + "@libsql/isomorphic-ws": 0.1.5 + js-base64: 3.7.5 + node-fetch: 3.3.2 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: false + + /@libsql/isomorphic-fetch@0.1.10: + resolution: + { + integrity: sha512-dH0lMk50gKSvEKD78xWMu60SY1sjp1sY//iFLO0XMmBwfVfG136P9KOk06R4maBdlb8KMXOzJ1D28FR5ZKnHTA==, + } + dependencies: + "@types/node-fetch": 2.6.9 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: false + + /@libsql/isomorphic-ws@0.1.5: + resolution: + { + integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==, + } + dependencies: + "@types/ws": 8.5.10 + ws: 8.14.2 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /@libsql/linux-arm64-gnu@0.2.0-pre.2: + resolution: + { + integrity: sha512-ZkN6e129joeUu6cinGMRbCvLTnrM5xV5n9XHs2dRrZfL7yu7utbvrY1l+P6VI1gugs93UhgupqyMsolFjvrPww==, + } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@libsql/linux-arm64-musl@0.2.0-pre.2: + resolution: + { + integrity: sha512-tEy4UAIzHYtjCBJnZoTcX1LCYy+XGR3hQCsdRYujWJhUtmtU/AqCRZV3q8MyfX7UhKyawJKWoQvwQ6Vs7w9jAA==, + } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@libsql/linux-x64-gnu@0.2.0-pre.2: + resolution: + { + integrity: sha512-jhHKwz5i9mdlpT4EeaKNUfyW5N9YY8wD5lZ0F5HrrPKhwgufnJY0oPEbvhM4KXDcSJetiIcGJ6K6NQyMSgoJ/Q==, + } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@libsql/linux-x64-musl@0.2.0-pre.2: + resolution: + { + integrity: sha512-HvwZtSQ2eIT968yxAb+htO+wmibdwW1PIyR7iJ5TN7phj7W1gF962l3ZhV1hVYERaMu+liBH1e/cRP1S35q3vQ==, + } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@libsql/win32-x64-msvc@0.2.0-pre.2: + resolution: + { + integrity: sha512-BWjInhsZRF9x+W0T5oJVjqoCCdvh82y74b/T3Ge/irXyLdVhHA9Zb1JWDy5uhu8eBR+d2n9B+IO0YwAvhFRTLw==, + } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@lucia-auth/adapter-session-unstorage@2.1.0(lucia@2.7.4)(unstorage@1.10.1): + resolution: + { + integrity: sha512-ItK7urZhLZv7UO99BcODjRhSAv58UPc+KQAmnkSvri2WBc22vFEjnjd/oWp3CZPdbbrJkuTvsuhFXH1ySBfOLg==, + } + peerDependencies: + lucia: ^2.0.0 + unstorage: ^1.9.0 + dependencies: + lucia: 2.7.4 + unstorage: 1.10.1 + dev: false + + /@lucia-auth/adapter-sqlite@2.0.1(@libsql/client@0.4.0-pre.2)(better-sqlite3@9.1.1)(lucia@2.7.4): + resolution: + { + integrity: sha512-yc7XQ4X3sWG1gyUGHqaXipJIkmvB4MOgJypnSMWy7Vjhn3AOCM2xw51xTs+dGpLOQIn2Laomg9xpmDM2/9tgqQ==, + } + peerDependencies: + "@libsql/client": ^0.3.0 + better-sqlite3: 8.x - 9.x + lucia: ^2.0.0 + peerDependenciesMeta: + "@libsql/client": + optional: true + better-sqlite3: + optional: true + dependencies: + "@libsql/client": 0.4.0-pre.2 + better-sqlite3: 9.1.1 + lucia: 2.7.4 + dev: false + + /@lucia-auth/oauth@3.5.0(lucia@2.7.4): + resolution: + { + integrity: sha512-JSwAMVwlDJtbvfcJV1nbkv41OD830pgICrx8zFT71SYd5I1MnEQ+GqMTXBGRyxzc5XlLatT8ZS1Jt0k81487xg==, + } + peerDependencies: + lucia: ^2.0.0 + dependencies: + lucia: 2.7.4 + dev: false + + /@neon-rs/load@0.0.4: + resolution: + { + integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==, + } + dev: false + + /@node-rs/argon2-android-arm-eabi@1.5.2: + resolution: + { + integrity: sha512-vVZec4ITr9GumAy0p8Zj8ozie362gtbZrTkLp9EqvuFZ/HrZzR09uS2IsDgm4mAstg/rc4A1gLRrHI8jDdbjkA==, + } + engines: { node: ">= 10" } + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-android-arm64@1.5.2: + resolution: + { + integrity: sha512-SwhnsXyrpgtWDTwYds1WUnxLA/kVP8HVaImYwQ3Wemqj1lkzcSoIaNyjNWkyrYGqO1tVc1YUrqsbd5eCHh+3sg==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-darwin-arm64@1.5.2: + resolution: + { + integrity: sha512-+1ZMKiCCv2pip/o1Xg09piQru2LOIBPQ1vS4is86f55N3jjZnSfP+db5mYCSRuB0gRYqui98he7su7OGXlF4gQ==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-darwin-x64@1.5.2: + resolution: + { + integrity: sha512-mQ57mORlsxpfjcEsVpiHyHCOp6Ljrz/rVNWk8ihnPWw0qt0EqF1zbHRxTEPemL1iBHL9UyXpXrKS4JKq6xMn5w==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-freebsd-x64@1.5.2: + resolution: + { + integrity: sha512-UjKbFd3viYcpiwflkU4haEdNUMk1V2fVCJImWLWQns/hVval9BrDv5xsBwgdynbPHDlPOiWj816LBQwhWLGVWA==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-arm-gnueabihf@1.5.2: + resolution: + { + integrity: sha512-36GJjJBnVuscV9CTn8RVDeJysnmIzr6Lp7QBCDczYHi6eKFuA8udCJb4SRyJqdvIuzycKG1RL56FbcFBJYCYIA==, + } + engines: { node: ">= 10" } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-arm64-gnu@1.5.2: + resolution: + { + integrity: sha512-sE0ydb2gp6xC+5vbVz8l3paaiBbFQIB2Rwp5wx9MmKiYdTfcO5WkGeADuSgoFiTcSEz1RsHXqrdVy6j/LtSqtA==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-arm64-musl@1.5.2: + resolution: + { + integrity: sha512-LhE0YHB0aJCwlbsQrwePik/KFWUc9qMriJIL5KiejK3bDoTVY4ihH587QT56JyaLvl3nBJaAV8l5yMqQdHnouA==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-x64-gnu@1.5.2: + resolution: + { + integrity: sha512-MnKLiBlyg05pxvKXe3lNgBL9El9ThD74hvVEiWH1Xk40RRrJ507NCOWXVmQ0FDq1mjTeGFxbIvk+AcoF0NSLIQ==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-x64-musl@1.5.2: + resolution: + { + integrity: sha512-tzLgASY0Ng2OTW7Awwl9UWzjbWx8/uD6gXcZ/k/nYGSZE5Xp8EOD2NUqHLbK6KZE3775A0R25ShpiSxCadYqkg==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-win32-arm64-msvc@1.5.2: + resolution: + { + integrity: sha512-vpTwSvv3oUXTpWZh0/HxdJ5wFMlmS7aVDwL4ATWepTZhMG4n+TO0+tVLdcPHCbg0oc6hCWBjWNPlSn9mW+YIgA==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-win32-ia32-msvc@1.5.2: + resolution: + { + integrity: sha512-KPpZR15ui7uQWQXKmtaKyUQRs4UJdXnIIfiyFLGmLWCdEKlr3MtIGFt0fdziu4BF5ZObD8Ic6QvT0VXK4OJiww==, + } + engines: { node: ">= 10" } + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-win32-x64-msvc@1.5.2: + resolution: + { + integrity: sha512-/pGuwixJS8ZlpwhX9iM6g6JEeZYo1TtnNf8exwsOi7gxcUoTUfw5it+5GfbY/n+xRBz/DIU4bzUmXmh+7Gh0ug==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2@1.5.2: + resolution: + { + integrity: sha512-qq7wOSsdP2b4rXEapWNmsCjpaTGZWtp9kZmri98GYCDZqN8UJUG5zSue4XtYWWJMWKJVE/hkaIwk+BgN1ZUn0Q==, + } + engines: { node: ">= 10" } + optionalDependencies: + "@node-rs/argon2-android-arm-eabi": 1.5.2 + "@node-rs/argon2-android-arm64": 1.5.2 + "@node-rs/argon2-darwin-arm64": 1.5.2 + "@node-rs/argon2-darwin-x64": 1.5.2 + "@node-rs/argon2-freebsd-x64": 1.5.2 + "@node-rs/argon2-linux-arm-gnueabihf": 1.5.2 + "@node-rs/argon2-linux-arm64-gnu": 1.5.2 + "@node-rs/argon2-linux-arm64-musl": 1.5.2 + "@node-rs/argon2-linux-x64-gnu": 1.5.2 + "@node-rs/argon2-linux-x64-musl": 1.5.2 + "@node-rs/argon2-win32-arm64-msvc": 1.5.2 + "@node-rs/argon2-win32-ia32-msvc": 1.5.2 + "@node-rs/argon2-win32-x64-msvc": 1.5.2 + dev: false + + /@node-rs/bcrypt-android-arm-eabi@1.7.3: + resolution: + { + integrity: sha512-l53RuBqnqNvBN2jx09Ws6jpLmuQdSDx10n0GeaTfwh1svxsC8bPpVmxkfBExsT2Tu7KF38gTnPZvwsxysZQyPQ==, + } + engines: { node: ">= 10" } + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-android-arm64@1.7.3: + resolution: + { + integrity: sha512-TZpm4VbiViqDMvusrcYzLr1b1M5FDF0cDNiTUciLeBSsKtU5lNdEZGAU7gvCnrKoUWpGuOblHU7613zuB7SiNQ==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-darwin-arm64@1.7.3: + resolution: + { + integrity: sha512-SiUuAabynVsmixZMjh5xrn8w47EnV0HzbW9st4DPoVhn/wzdUcksIXDY75aoQG2EIzKLN8IGb+CIVnPGmRyhxw==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-darwin-x64@1.7.3: + resolution: + { + integrity: sha512-R+81Z0eX4hZPvCXY5Z6l0l+JrTU3WcSYGHP0QYV9uwdaafOz6EhrCXUzZ02AIcAbNoVR8eucYVruq9PiasXoVw==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-freebsd-x64@1.7.3: + resolution: + { + integrity: sha512-0pItU/5K3e83JjcJj9fZv+78txUoZ3hHCT7n/UMdu9mkpUzhX/rqb4jmQpJpD+UQoR76xp3qDo5RMgQBffBVNg==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-arm-gnueabihf@1.7.3: + resolution: + { + integrity: sha512-HTSybWUjNe8rWuXkTkMeFDiQNHc6VioRcgv6AeHZphIxiT6dFbnhXNkfz4Hr0zxvyPhZ3NrYjT2AmPVFT6VW3Q==, + } + engines: { node: ">= 10" } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-arm64-gnu@1.7.3: + resolution: + { + integrity: sha512-rWep6Y+v/c4bZHaM8LmSsrMwMmDR9wG4/q+3Z9VzR8xdnt5VCbuQdYWpf3sgGRGjTRdTBAdSK8x1reOjqsJ3Jg==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-arm64-musl@1.7.3: + resolution: + { + integrity: sha512-TyWEKhxr+yfGcMKzVV/ARZw+Hrky2yl91bo0XYU2ZW6I6LDC0emNsXugdWjwz8ADI4OWhhrOjXD8GCilxiB2Rg==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-x64-gnu@1.7.3: + resolution: + { + integrity: sha512-PofxM1Qg7tZKj1oP0I7tBTSSLr8Xc2uxx+P3pBCPmYzaBwWqGteNHJlF7n2q5xiH7YOlguH4w5CmcEjsiA3K4A==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-x64-musl@1.7.3: + resolution: + { + integrity: sha512-D5V6/dDVKP8S/ieDBLGhTn4oTo3upbrpWInynbhOMjJvPiIxVG1PiI3MXkWBtG9qtfleDk7gUkEKtAOxlIxDTQ==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-win32-arm64-msvc@1.7.3: + resolution: + { + integrity: sha512-b4gH2Yj5R4TwULrfMHd1Qqr+MrnFjVRUAJujDKPqi+PppSqezW8QF6DRSOL4GjnBmz5JEd64wxgeidvy7dsbGw==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-win32-ia32-msvc@1.7.3: + resolution: + { + integrity: sha512-E91ro+ybI0RhNc89aGaZQGll0YhPoHr8JacoWrNKwhg9zwNOYeuO0tokdMZdm6nF0/8obll0Mq7wO9AXO9iffw==, + } + engines: { node: ">= 10" } + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-win32-x64-msvc@1.7.3: + resolution: + { + integrity: sha512-LO/p9yjPODj/pQvPnowBuwpDdqiyUXQbqL1xb1RSP3NoyCFAGmjL5h0plSQrhLh8hskQiozBRXNaQurtsM7o0Q==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt@1.7.3: + resolution: + { + integrity: sha512-BF6u9CBPUiyk1zU+5iwikezf+xM4MFSu5cmrrg/PLKffGgIM13ZsY6DHftcTraETB04ryasjM/5IejotH+sO5Q==, + } + engines: { node: ">= 10" } + optionalDependencies: + "@node-rs/bcrypt-android-arm-eabi": 1.7.3 + "@node-rs/bcrypt-android-arm64": 1.7.3 + "@node-rs/bcrypt-darwin-arm64": 1.7.3 + "@node-rs/bcrypt-darwin-x64": 1.7.3 + "@node-rs/bcrypt-freebsd-x64": 1.7.3 + "@node-rs/bcrypt-linux-arm-gnueabihf": 1.7.3 + "@node-rs/bcrypt-linux-arm64-gnu": 1.7.3 + "@node-rs/bcrypt-linux-arm64-musl": 1.7.3 + "@node-rs/bcrypt-linux-x64-gnu": 1.7.3 + "@node-rs/bcrypt-linux-x64-musl": 1.7.3 + "@node-rs/bcrypt-win32-arm64-msvc": 1.7.3 + "@node-rs/bcrypt-win32-ia32-msvc": 1.7.3 + "@node-rs/bcrypt-win32-x64-msvc": 1.7.3 + dev: false + + /@nodelib/fs.scandir@2.1.5: + resolution: + { + integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, + } + engines: { node: ">= 8" } + dependencies: + "@nodelib/fs.stat": 2.0.5 + run-parallel: 1.2.0 + + /@nodelib/fs.stat@2.0.5: + resolution: + { + integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, + } + engines: { node: ">= 8" } + + /@nodelib/fs.walk@1.2.8: + resolution: + { + integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, + } + engines: { node: ">= 8" } + dependencies: + "@nodelib/fs.scandir": 2.1.5 + fastq: 1.15.0 + + /@parcel/watcher-android-arm64@2.3.0: + resolution: + { + integrity: sha512-f4o9eA3dgk0XRT3XhB0UWpWpLnKgrh1IwNJKJ7UJek7eTYccQ8LR7XUWFKqw6aEq5KUNlCcGvSzKqSX/vtWVVA==, + } + engines: { node: ">= 10.0.0" } + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-darwin-arm64@2.3.0: + resolution: + { + integrity: sha512-mKY+oijI4ahBMc/GygVGvEdOq0L4DxhYgwQqYAz/7yPzuGi79oXrZG52WdpGA1wLBPrYb0T8uBaGFo7I6rvSKw==, + } + engines: { node: ">= 10.0.0" } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-darwin-x64@2.3.0: + resolution: + { + integrity: sha512-20oBj8LcEOnLE3mgpy6zuOq8AplPu9NcSSSfyVKgfOhNAc4eF4ob3ldj0xWjGGbOF7Dcy1Tvm6ytvgdjlfUeow==, + } + engines: { node: ">= 10.0.0" } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-freebsd-x64@2.3.0: + resolution: + { + integrity: sha512-7LftKlaHunueAEiojhCn+Ef2CTXWsLgTl4hq0pkhkTBFI3ssj2bJXmH2L67mKpiAD5dz66JYk4zS66qzdnIOgw==, + } + engines: { node: ">= 10.0.0" } + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-arm-glibc@2.3.0: + resolution: + { + integrity: sha512-1apPw5cD2xBv1XIHPUlq0cO6iAaEUQ3BcY0ysSyD9Kuyw4MoWm1DV+W9mneWI+1g6OeP6dhikiFE6BlU+AToTQ==, + } + engines: { node: ">= 10.0.0" } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-arm64-glibc@2.3.0: + resolution: + { + integrity: sha512-mQ0gBSQEiq1k/MMkgcSB0Ic47UORZBmWoAWlMrTW6nbAGoLZP+h7AtUM7H3oDu34TBFFvjy4JCGP43JlylkTQA==, + } + engines: { node: ">= 10.0.0" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-arm64-musl@2.3.0: + resolution: + { + integrity: sha512-LXZAExpepJew0Gp8ZkJ+xDZaTQjLHv48h0p0Vw2VMFQ8A+RKrAvpFuPVCVwKJCr5SE+zvaG+Etg56qXvTDIedw==, + } + engines: { node: ">= 10.0.0" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-x64-glibc@2.3.0: + resolution: + { + integrity: sha512-P7Wo91lKSeSgMTtG7CnBS6WrA5otr1K7shhSjKHNePVmfBHDoAOHYRXgUmhiNfbcGk0uMCHVcdbfxtuiZCHVow==, + } + engines: { node: ">= 10.0.0" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-x64-musl@2.3.0: + resolution: + { + integrity: sha512-+kiRE1JIq8QdxzwoYY+wzBs9YbJ34guBweTK8nlzLKimn5EQ2b2FSC+tAOpq302BuIMjyuUGvBiUhEcLIGMQ5g==, + } + engines: { node: ">= 10.0.0" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-wasm@2.3.0: + resolution: + { + integrity: sha512-ejBAX8H0ZGsD8lSICDNyMbSEtPMWgDL0WFCt/0z7hyf5v8Imz4rAM8xY379mBsECkq/Wdqa5WEDLqtjZ+6NxfA==, + } + engines: { node: ">= 10.0.0" } + dependencies: + is-glob: 4.0.3 + micromatch: 4.0.5 + napi-wasm: 1.1.0 + dev: false + bundledDependencies: + - napi-wasm + + /@parcel/watcher-win32-arm64@2.3.0: + resolution: + { + integrity: sha512-35gXCnaz1AqIXpG42evcoP2+sNL62gZTMZne3IackM+6QlfMcJLy3DrjuL6Iks7Czpd3j4xRBzez3ADCj1l7Aw==, + } + engines: { node: ">= 10.0.0" } + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-win32-ia32@2.3.0: + resolution: + { + integrity: sha512-FJS/IBQHhRpZ6PiCjFt1UAcPr0YmCLHRbTc00IBTrelEjlmmgIVLeOx4MSXzx2HFEy5Jo5YdhGpxCuqCyDJ5ow==, + } + engines: { node: ">= 10.0.0" } + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-win32-x64@2.3.0: + resolution: + { + integrity: sha512-dLx+0XRdMnVI62kU3wbXvbIRhLck4aE28bIGKbRGS7BJNt54IIj9+c/Dkqb+7DJEbHUZAX1bwaoM8PqVlHJmCA==, + } + engines: { node: ">= 10.0.0" } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher@2.3.0: + resolution: + { + integrity: sha512-pW7QaFiL11O0BphO+bq3MgqeX/INAk9jgBldVDYjlQPO4VddoZnF22TcF9onMhnLVHuNqBJeRf+Fj7eezi/+rQ==, + } + engines: { node: ">= 10.0.0" } + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.5 + node-addon-api: 7.0.0 + optionalDependencies: + "@parcel/watcher-android-arm64": 2.3.0 + "@parcel/watcher-darwin-arm64": 2.3.0 + "@parcel/watcher-darwin-x64": 2.3.0 + "@parcel/watcher-freebsd-x64": 2.3.0 + "@parcel/watcher-linux-arm-glibc": 2.3.0 + "@parcel/watcher-linux-arm64-glibc": 2.3.0 + "@parcel/watcher-linux-arm64-musl": 2.3.0 + "@parcel/watcher-linux-x64-glibc": 2.3.0 + "@parcel/watcher-linux-x64-musl": 2.3.0 + "@parcel/watcher-win32-arm64": 2.3.0 + "@parcel/watcher-win32-ia32": 2.3.0 + "@parcel/watcher-win32-x64": 2.3.0 + dev: false + + /@types/json-schema@7.0.15: + resolution: + { + integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, + } + dev: false + + /@types/node-fetch@2.6.9: + resolution: + { + integrity: sha512-bQVlnMLFJ2d35DkPNjEPmd9ueO/rh5EiaZt2bhqiSarPjZIuIV6bPQVqcrEyvNo+AfTrRGVazle1tl597w3gfA==, + } + dependencies: + "@types/node": 20.10.0 + form-data: 4.0.0 + dev: false + + /@types/node-forge@1.3.10: + resolution: + { + integrity: sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw==, + } + dependencies: + "@types/node": 20.10.0 + dev: true + + /@types/node@20.10.0: + resolution: + { + integrity: sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ==, + } + dependencies: + undici-types: 5.26.5 + + /@types/semver@7.5.6: + resolution: + { + integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==, + } + dev: false + + /@types/ws@8.5.10: + resolution: + { + integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==, + } + dependencies: + "@types/node": 20.10.0 + dev: false + + /@typescript-eslint/eslint-plugin@6.12.0(@typescript-eslint/parser@6.12.0)(eslint@8.54.0)(typescript@5.3.2): + resolution: + { + integrity: sha512-XOpZ3IyJUIV1b15M7HVOpgQxPPF7lGXgsfcEIu3yDxFPaf/xZKt7s9QO/pbk7vpWQyVulpJbu4E5LwpZiQo4kA==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@eslint-community/regexpp": 4.10.0 + "@typescript-eslint/parser": 6.12.0(eslint@8.54.0)(typescript@5.3.2) + "@typescript-eslint/scope-manager": 6.12.0 + "@typescript-eslint/type-utils": 6.12.0(eslint@8.54.0)(typescript@5.3.2) + "@typescript-eslint/utils": 6.12.0(eslint@8.54.0)(typescript@5.3.2) + "@typescript-eslint/visitor-keys": 6.12.0 + debug: 4.3.4 + eslint: 8.54.0 + graphemer: 1.4.0 + ignore: 5.3.0 + natural-compare: 1.4.0 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.3.2) + typescript: 5.3.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/parser@6.12.0(eslint@8.54.0)(typescript@5.3.2): + resolution: + { + integrity: sha512-s8/jNFPKPNRmXEnNXfuo1gemBdVmpQsK1pcu+QIvuNJuhFzGrpD7WjOcvDc/+uEdfzSYpNu7U/+MmbScjoQ6vg==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@typescript-eslint/scope-manager": 6.12.0 + "@typescript-eslint/types": 6.12.0 + "@typescript-eslint/typescript-estree": 6.12.0(typescript@5.3.2) + "@typescript-eslint/visitor-keys": 6.12.0 + debug: 4.3.4 + eslint: 8.54.0 + typescript: 5.3.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/scope-manager@6.12.0: + resolution: + { + integrity: sha512-5gUvjg+XdSj8pcetdL9eXJzQNTl3RD7LgUiYTl8Aabdi8hFkaGSYnaS6BLc0BGNaDH+tVzVwmKtWvu0jLgWVbw==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + dependencies: + "@typescript-eslint/types": 6.12.0 + "@typescript-eslint/visitor-keys": 6.12.0 + dev: false + + /@typescript-eslint/type-utils@6.12.0(eslint@8.54.0)(typescript@5.3.2): + resolution: + { + integrity: sha512-WWmRXxhm1X8Wlquj+MhsAG4dU/Blvf1xDgGaYCzfvStP2NwPQh6KBvCDbiOEvaE0filhranjIlK/2fSTVwtBng==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@typescript-eslint/typescript-estree": 6.12.0(typescript@5.3.2) + "@typescript-eslint/utils": 6.12.0(eslint@8.54.0)(typescript@5.3.2) + debug: 4.3.4 + eslint: 8.54.0 + ts-api-utils: 1.0.3(typescript@5.3.2) + typescript: 5.3.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/types@6.12.0: + resolution: + { + integrity: sha512-MA16p/+WxM5JG/F3RTpRIcuOghWO30//VEOvzubM8zuOOBYXsP+IfjoCXXiIfy2Ta8FRh9+IO9QLlaFQUU+10Q==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + dev: false + + /@typescript-eslint/typescript-estree@6.12.0(typescript@5.3.2): + resolution: + { + integrity: sha512-vw9E2P9+3UUWzhgjyyVczLWxZ3GuQNT7QpnIY3o5OMeLO/c8oHljGc8ZpryBMIyympiAAaKgw9e5Hl9dCWFOYw==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@typescript-eslint/types": 6.12.0 + "@typescript-eslint/visitor-keys": 6.12.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.3.2) + typescript: 5.3.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/utils@6.12.0(eslint@8.54.0)(typescript@5.3.2): + resolution: + { + integrity: sha512-LywPm8h3tGEbgfyjYnu3dauZ0U7R60m+miXgKcZS8c7QALO9uWJdvNoP+duKTk2XMWc7/Q3d/QiCuLN9X6SWyQ==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + "@eslint-community/eslint-utils": 4.4.0(eslint@8.54.0) + "@types/json-schema": 7.0.15 + "@types/semver": 7.5.6 + "@typescript-eslint/scope-manager": 6.12.0 + "@typescript-eslint/types": 6.12.0 + "@typescript-eslint/typescript-estree": 6.12.0(typescript@5.3.2) + eslint: 8.54.0 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: false + + /@typescript-eslint/visitor-keys@6.12.0: + resolution: + { + integrity: sha512-rg3BizTZHF1k3ipn8gfrzDXXSFKyOEB5zxYXInQ6z0hUvmQlhaZQzK+YmHmNViMA9HzW5Q9+bPPt90bU6GQwyw==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + dependencies: + "@typescript-eslint/types": 6.12.0 + eslint-visitor-keys: 3.4.3 + dev: false + + /@ungap/structured-clone@1.2.0: + resolution: + { + integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==, + } + + /acorn-jsx@5.3.2(acorn@8.11.2): + resolution: + { + integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, + } + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.2 + + /acorn-walk@8.3.0: + resolution: + { + integrity: sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==, + } + engines: { node: ">=0.4.0" } + + /acorn@8.11.2: + resolution: + { + integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==, + } + engines: { node: ">=0.4.0" } + hasBin: true + + /ajv@6.12.6: + resolution: + { + integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, + } + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + /ansi-regex@5.0.1: + resolution: + { + integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, + } + engines: { node: ">=8" } + + /ansi-styles@4.3.0: + resolution: + { + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, + } + engines: { node: ">=8" } + dependencies: + color-convert: 2.0.1 + + /anymatch@3.1.3: + resolution: + { + integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, + } + engines: { node: ">= 8" } + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + /arch@2.2.0: + resolution: + { + integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==, + } + dev: false + + /argparse@2.0.1: + resolution: + { + integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, + } + + /array-union@2.1.0: + resolution: + { + integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, + } + engines: { node: ">=8" } + dev: false + + /as-table@1.0.55: + resolution: + { + integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==, + } + dependencies: + printable-characters: 1.0.42 + + /asynckit@0.4.0: + resolution: + { + integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, + } + dev: false + + /balanced-match@1.0.2: + resolution: + { + integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, + } + + /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" } + + /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 + + /brace-expansion@1.1.11: + resolution: + { + integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, + } + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /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==, + } + engines: { node: ">=8" } + dependencies: + fill-range: 7.0.1 + + /buffer-from@1.1.2: + resolution: + { + integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, + } + + /buffer@5.7.1: + resolution: + { + integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, + } + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /callsites@3.1.0: + resolution: + { + integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, + } + engines: { node: ">=6" } + + /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 + + /chalk@4.1.2: + resolution: + { + integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, + } + engines: { node: ">=10" } + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /chalk@5.3.0: + resolution: + { + integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==, + } + engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } + dev: true + + /chokidar@3.5.3: + resolution: + { + integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, + } + engines: { node: ">= 8.10.0" } + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + /chownr@1.1.4: + resolution: + { + integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==, + } + dev: false + + /citty@0.1.5: + resolution: + { + integrity: sha512-AS7n5NSc0OQVMV9v6wt3ByujNIrne0/cTjiC2MYqhvao57VNfiuVksTSr2p17nVOhEr2KtqiAkGwHcgMC/qUuQ==, + } + dependencies: + consola: 3.2.3 + dev: false + + /cli-color@2.0.3: + resolution: + { + integrity: sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==, + } + engines: { node: ">=0.10" } + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-iterator: 2.0.3 + memoizee: 0.4.15 + timers-ext: 0.1.7 + dev: true + + /clipboardy@3.0.0: + resolution: + { + integrity: sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dependencies: + arch: 2.2.0 + execa: 5.1.1 + is-wsl: 2.2.0 + dev: false + + /cluster-key-slot@1.1.2: + resolution: + { + integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==, + } + engines: { node: ">=0.10.0" } + dev: false + + /color-convert@2.0.1: + resolution: + { + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, + } + engines: { node: ">=7.0.0" } + dependencies: + color-name: 1.1.4 + + /color-name@1.1.4: + resolution: + { + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, + } + + /combined-stream@1.0.8: + resolution: + { + integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, + } + engines: { node: ">= 0.8" } + dependencies: + delayed-stream: 1.0.0 + dev: false + + /commander@9.5.0: + resolution: + { + integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==, + } + engines: { node: ^12.20.0 || >=14 } + dev: true + + /concat-map@0.0.1: + resolution: + { + integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, + } + + /consola@3.2.3: + resolution: + { + integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==, + } + engines: { node: ^14.18.0 || >=16.10.0 } + dev: false + + /cookie-es@1.0.0: + resolution: + { + integrity: sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ==, + } + dev: false + + /cookie@0.5.0: + resolution: + { + integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==, + } + engines: { node: ">= 0.6" } + + /copy-anything@3.0.5: + resolution: + { + integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==, + } + engines: { node: ">=12.13" } + dependencies: + is-what: 4.1.16 + dev: true + + /cross-spawn@7.0.3: + resolution: + { + integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, + } + engines: { node: ">= 8" } + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + /d@1.0.1: + resolution: + { + integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==, + } + 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==, + } + + /data-uri-to-buffer@4.0.1: + resolution: + { + integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==, + } + engines: { node: ">= 12" } + dev: false + + /debug@4.3.4: + resolution: + { + integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, + } + engines: { node: ">=6.0" } + peerDependencies: + supports-color: "*" + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /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==, + } + + /defu@6.1.3: + resolution: + { + integrity: sha512-Vy2wmG3NTkmHNg/kzpuvHhkqeIx3ODWqasgCRbKtbXEN0G+HpEEv9BtJLp7ZG1CZloFaC41Ah3ZFbq7aqCqMeQ==, + } + dev: false + + /delayed-stream@1.0.0: + resolution: + { + integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, + } + engines: { node: ">=0.4.0" } + dev: false + + /denque@2.1.0: + resolution: + { + integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==, + } + engines: { node: ">=0.10" } + dev: false + + /destr@2.0.2: + resolution: + { + integrity: sha512-65AlobnZMiCET00KaFFjUefxDX0khFA/E4myqZ7a6Sq1yZtR8+FVIvilVX66vF2uobSumxooYZChiRPCKNqhmg==, + } + dev: false + + /detect-libc@1.0.3: + resolution: + { + integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==, + } + engines: { node: ">=0.10" } + hasBin: true + dev: false + + /detect-libc@2.0.2: + resolution: + { + integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==, + } + engines: { node: ">=8" } + dev: false + + /difflib@0.2.4: + resolution: + { + integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==, + } + dependencies: + heap: 0.2.7 + dev: true + + /dir-glob@3.0.1: + resolution: + { + integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, + } + engines: { node: ">=8" } + dependencies: + path-type: 4.0.0 + dev: false + + /doctrine@3.0.0: + resolution: + { + integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==, + } + engines: { node: ">=6.0.0" } + dependencies: + esutils: 2.0.3 + + /dotenv@16.3.1: + resolution: + { + integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==, + } + engines: { node: ">=12" } + dev: true + + /dreamopt@0.8.0: + resolution: + { + integrity: sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==, + } + engines: { node: ">=0.4.0" } + dependencies: + wordwrap: 1.0.0 + dev: true + + /drizzle-kit@0.20.6: + resolution: + { + integrity: sha512-+AYQY+tJUnfMJYIeh6aEjI21mpMCekqz0LEu2QdFdc/3zSmjyfEhH5dkXlRFME8v1rtisiHfp7bP+gVVKDPiUg==, + } + hasBin: true + dependencies: + "@drizzle-team/studio": 0.0.35 + "@esbuild-kit/esm-loader": 2.6.5 + camelcase: 7.0.1 + chalk: 5.3.0 + commander: 9.5.0 + esbuild: 0.19.8 + esbuild-register: 3.5.0(esbuild@0.19.8) + glob: 8.1.0 + hanji: 0.0.5 + json-diff: 0.9.0 + minimatch: 7.4.6 + semver: 7.5.4 + wrangler: 3.17.1 + zod: 3.22.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /drizzle-orm@0.29.0(@cloudflare/workers-types@4.20231121.0)(@libsql/client@0.4.0-pre.2)(better-sqlite3@9.1.1)(mysql2@3.6.5): + 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: + "@cloudflare/workers-types": 4.20231121.0 + "@libsql/client": 0.4.0-pre.2 + better-sqlite3: 9.1.1 + mysql2: 3.6.5 + dev: false + + /drizzle-zod@0.5.1(drizzle-orm@0.29.0)(zod@3.22.4): + resolution: + { + integrity: sha512-C/8bvzUH/zSnVfwdSibOgFjLhtDtbKYmkbPbUCq46QZyZCH6kODIMSOgZ8R7rVjoI+tCj3k06MRJMDqsIeoS4A==, + } + peerDependencies: + drizzle-orm: ">=0.23.13" + zod: "*" + dependencies: + drizzle-orm: 0.29.0(@cloudflare/workers-types@4.20231121.0)(@libsql/client@0.4.0-pre.2)(better-sqlite3@9.1.1)(mysql2@3.6.5) + zod: 3.22.4 + dev: false + + /end-of-stream@1.4.4: + resolution: + { + integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, + } + dependencies: + once: 1.4.0 + dev: false + + /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.19.8): + resolution: + { + integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==, + } + peerDependencies: + esbuild: ">=0.12 <1" + dependencies: + debug: 4.3.4 + esbuild: 0.19.8 + 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 + + /esbuild@0.19.8: + resolution: + { + integrity: sha512-l7iffQpT2OrZfH2rXIp7/FkmaeZM0vxbxN9KfiCwGYuZqzMg/JdvX26R31Zxn/Pxvsrg3Y9N6XTcnknqDyyv4w==, + } + engines: { node: ">=12" } + hasBin: true + requiresBuild: true + optionalDependencies: + "@esbuild/android-arm": 0.19.8 + "@esbuild/android-arm64": 0.19.8 + "@esbuild/android-x64": 0.19.8 + "@esbuild/darwin-arm64": 0.19.8 + "@esbuild/darwin-x64": 0.19.8 + "@esbuild/freebsd-arm64": 0.19.8 + "@esbuild/freebsd-x64": 0.19.8 + "@esbuild/linux-arm": 0.19.8 + "@esbuild/linux-arm64": 0.19.8 + "@esbuild/linux-ia32": 0.19.8 + "@esbuild/linux-loong64": 0.19.8 + "@esbuild/linux-mips64el": 0.19.8 + "@esbuild/linux-ppc64": 0.19.8 + "@esbuild/linux-riscv64": 0.19.8 + "@esbuild/linux-s390x": 0.19.8 + "@esbuild/linux-x64": 0.19.8 + "@esbuild/netbsd-x64": 0.19.8 + "@esbuild/openbsd-x64": 0.19.8 + "@esbuild/sunos-x64": 0.19.8 + "@esbuild/win32-arm64": 0.19.8 + "@esbuild/win32-ia32": 0.19.8 + "@esbuild/win32-x64": 0.19.8 + dev: true + + /escape-string-regexp@4.0.0: + resolution: + { + integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, + } + engines: { node: ">=10" } + + /eslint-config-google@0.14.0(eslint@8.54.0): + resolution: + { + integrity: sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==, + } + engines: { node: ">=0.10.0" } + peerDependencies: + eslint: ">=5.16.0" + dependencies: + eslint: 8.54.0 + dev: true + + /eslint-plugin-json@3.1.0: + resolution: + { + integrity: sha512-MrlG2ynFEHe7wDGwbUuFPsaT2b1uhuEFhJ+W1f1u+1C2EkXmTYJp4B1aAdQQ8M+CC3t//N/oRKiIVw14L2HR1g==, + } + engines: { node: ">=12.0" } + dependencies: + lodash: 4.17.21 + vscode-json-languageservice: 4.2.1 + dev: true + + /eslint-scope@7.2.2: + resolution: + { + integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + /eslint-visitor-keys@3.4.3: + resolution: + { + integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + + /eslint@8.54.0: + resolution: + { + integrity: sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + hasBin: true + dependencies: + "@eslint-community/eslint-utils": 4.4.0(eslint@8.54.0) + "@eslint-community/regexpp": 4.10.0 + "@eslint/eslintrc": 2.1.3 + "@eslint/js": 8.54.0 + "@humanwhocodes/config-array": 0.11.13 + "@humanwhocodes/module-importer": 1.0.1 + "@nodelib/fs.walk": 1.2.8 + "@ungap/structured-clone": 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.23.0 + graphemer: 1.4.0 + ignore: 5.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + /espree@9.6.1: + resolution: + { + integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) + eslint-visitor-keys: 3.4.3 + + /esquery@1.5.0: + resolution: + { + integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==, + } + engines: { node: ">=0.10" } + dependencies: + estraverse: 5.3.0 + + /esrecurse@4.3.0: + resolution: + { + integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, + } + engines: { node: ">=4.0" } + dependencies: + estraverse: 5.3.0 + + /estraverse@5.3.0: + resolution: + { + integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, + } + engines: { node: ">=4.0" } + + /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" } + + /event-emitter@0.3.5: + resolution: + { + integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==, + } + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + dev: true + + /execa@5.1.1: + resolution: + { + integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==, + } + engines: { node: ">=10" } + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: false + + /exit-hook@2.2.1: + resolution: + { + integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==, + } + engines: { node: ">=6" } + + /expand-template@2.0.3: + resolution: + { + integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==, + } + engines: { node: ">=6" } + 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==, + } + + /fast-glob@3.3.2: + resolution: + { + integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==, + } + engines: { node: ">=8.6.0" } + dependencies: + "@nodelib/fs.stat": 2.0.5 + "@nodelib/fs.walk": 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: false + + /fast-json-stable-stringify@2.1.0: + resolution: + { + integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, + } + + /fast-levenshtein@2.0.6: + resolution: + { + integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, + } + + /fastq@1.15.0: + resolution: + { + integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==, + } + dependencies: + reusify: 1.0.4 + + /fetch-blob@3.2.0: + resolution: + { + integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==, + } + engines: { node: ^12.20 || >= 14.13 } + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.2.1 + dev: false + + /file-entry-cache@6.0.1: + resolution: + { + integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==, + } + engines: { node: ^10.12.0 || >=12.0.0 } + dependencies: + flat-cache: 3.2.0 + + /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" } + dependencies: + to-regex-range: 5.0.1 + + /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 + + /flat-cache@3.2.0: + resolution: + { + integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==, + } + engines: { node: ^10.12.0 || >=12.0.0 } + dependencies: + flatted: 3.2.9 + keyv: 4.5.4 + rimraf: 3.0.2 + + /flatted@3.2.9: + resolution: + { + integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==, + } + + /form-data@4.0.0: + resolution: + { + integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==, + } + engines: { node: ">= 6" } + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + + /formdata-polyfill@4.0.10: + resolution: + { + integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==, + } + engines: { node: ">=12.20.0" } + dependencies: + fetch-blob: 3.2.0 + dev: false + + /fs-constants@1.0.0: + resolution: + { + integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==, + } + dev: false + + /fs.realpath@1.0.0: + resolution: + { + integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, + } + + /fsevents@2.3.3: + resolution: + { + integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, + } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + os: [darwin] + requiresBuild: true + optional: true - /@aashutoshrathi/word-wrap@1.2.6: - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - - /@asteasolutions/zod-to-openapi@5.5.0(zod@3.22.4): - resolution: {integrity: sha512-d5HwrvM6dOKr3XdeF+DmashGvfEc+1oiEfbscugsiwSTrFtuMa7ETpW9sTNnVgn+hJaz+PRxPQUYD7q9/5dUig==} - peerDependencies: - zod: ^3.20.2 - dependencies: - openapi3-ts: 4.1.2 - zod: 3.22.4 - dev: false - - /@asteasolutions/zod-to-openapi@6.3.0(zod@3.22.4): - resolution: {integrity: sha512-ca7Svz3BWkMaIP3M1YGsyxgp7AcKXlTmy19ozhY0DslhatXbnyxdvxlmiI0TmvkIfi6RpQfm+eK1neVLsh6Riw==} - peerDependencies: - zod: ^3.20.2 - dependencies: - openapi3-ts: 4.1.2 - zod: 3.22.4 - dev: true - - /@cloudflare/kv-asset-handler@0.2.0: - resolution: {integrity: sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==} - dependencies: - mime: 3.0.0 - dev: true - - /@cloudflare/workerd-darwin-64@1.20231030.0: - resolution: {integrity: sha512-J4PQ9utPxLya9yHdMMx3AZeC5M/6FxcoYw6jo9jbDDFTy+a4Gslqf4Im9We3aeOEdPXa3tgQHVQOSelJSZLhIw==} - engines: {node: '>=16'} - cpu: [x64] - os: [darwin] - requiresBuild: true - optional: true - - /@cloudflare/workerd-darwin-arm64@1.20231030.0: - resolution: {integrity: sha512-WSJJjm11Del4hSneiNB7wTXGtBXI4QMCH9l5qf4iT5PAW8cESGcCmdHtWDWDtGAAGcvmLT04KNvmum92vRKKQQ==} - engines: {node: '>=16'} - cpu: [arm64] - os: [darwin] - requiresBuild: 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 - 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 - 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 - optional: true - - /@cloudflare/workers-types@4.20231121.0: - resolution: {integrity: sha512-+kWfpCkqiepwAKXyHoE0gnkPgkLhz0/9HOBIGhHRsUvUKvhUtm3mbqqoGRWgF1qcjzrDUBbrrOq4MYHfFtc2RA==} - - /@drizzle-team/studio@0.0.35: - resolution: {integrity: sha512-t5LTNOVf+L7Bb/wdssOIPx0ueNvhyaIXdrvKgoHR4wK0GD7SRmILcCTzn6N6Ltr1VnFzQZG/bzn6HMagn17Jtw==} - dependencies: - superjson: 2.2.1 - 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-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-arm64@0.19.8: - resolution: {integrity: sha512-B8JbS61bEunhfx8kasogFENgQfr/dIp+ggYXwTqdbMAgGDhRa3AaPpQMuQU0rNxDLECj6FhDzk1cF9WHMVwrtA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: 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-arm@0.19.8: - resolution: {integrity: sha512-31E2lxlGM1KEfivQl8Yf5aYU/mflz9g06H6S15ITUFQueMFtFjESRMoDSkvMo8thYvLBax+VKTPlpnx+sPicOA==} - engines: {node: '>=12'} - cpu: [arm] - 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/android-x64@0.19.8: - resolution: {integrity: sha512-rdqqYfRIn4jWOp+lzQttYMa2Xar3OK9Yt2fhOhzFXqg0rVWEfSclJvZq5fZslnz6ypHvVf3CT7qyf0A5pM682A==} - 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-arm64@0.19.8: - resolution: {integrity: sha512-RQw9DemMbIq35Bprbboyf8SmOr4UXsRVxJ97LgB55VKKeJOOdvsIPy0nFyF2l8U+h4PtBx/1kRf0BelOYCiQcw==} - 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/darwin-x64@0.19.8: - resolution: {integrity: sha512-3sur80OT9YdeZwIVgERAysAbwncom7b4bCI2XKLjMfPymTud7e/oY4y+ci1XVp5TfQp/bppn7xLw1n/oSQY3/Q==} - 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-arm64@0.19.8: - resolution: {integrity: sha512-WAnPJSDattvS/XtPCTj1tPoTxERjcTpH6HsMr6ujTT+X6rylVe8ggxk8pVxzf5U1wh5sPODpawNicF5ta/9Tmw==} - 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/freebsd-x64@0.19.8: - resolution: {integrity: sha512-ICvZyOplIjmmhjd6mxi+zxSdpPTKFfyPPQMQTK/w+8eNK6WV01AjIztJALDtwNNfFhfZLux0tZLC+U9nSyA5Zg==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - 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-arm64@0.19.8: - resolution: {integrity: sha512-z1zMZivxDLHWnyGOctT9JP70h0beY54xDDDJt4VpTX+iwA77IFsE1vCXWmprajJGa+ZYSqkSbRQ4eyLCpCmiCQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - 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-arm@0.19.8: - resolution: {integrity: sha512-H4vmI5PYqSvosPaTJuEppU9oz1dq2A7Mr2vyg5TF9Ga+3+MGgBdGzcyBP7qK9MrwFQZlvNyJrvz6GuCaj3OukQ==} - engines: {node: '>=12'} - cpu: [arm] - 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-ia32@0.19.8: - resolution: {integrity: sha512-1a8suQiFJmZz1khm/rDglOc8lavtzEMRo0v6WhPgxkrjcU0LkHj+TwBrALwoz/OtMExvsqbbMI0ChyelKabSvQ==} - 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-loong64@0.19.8: - resolution: {integrity: sha512-fHZWS2JJxnXt1uYJsDv9+b60WCc2RlvVAy1F76qOLtXRO+H4mjt3Tr6MJ5l7Q78X8KgCFudnTuiQRBhULUyBKQ==} - 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-mips64el@0.19.8: - resolution: {integrity: sha512-Wy/z0EL5qZYLX66dVnEg9riiwls5IYnziwuju2oUiuxVc+/edvqXa04qNtbrs0Ukatg5HEzqT94Zs7J207dN5Q==} - 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-ppc64@0.19.8: - resolution: {integrity: sha512-ETaW6245wK23YIEufhMQ3HSeHO7NgsLx8gygBVldRHKhOlD1oNeNy/P67mIh1zPn2Hr2HLieQrt6tWrVwuqrxg==} - 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-riscv64@0.19.8: - resolution: {integrity: sha512-T2DRQk55SgoleTP+DtPlMrxi/5r9AeFgkhkZ/B0ap99zmxtxdOixOMI570VjdRCs9pE4Wdkz7JYrsPvsl7eESg==} - 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-s390x@0.19.8: - resolution: {integrity: sha512-NPxbdmmo3Bk7mbNeHmcCd7R7fptJaczPYBaELk6NcXxy7HLNyWwCyDJ/Xx+/YcNH7Im5dHdx9gZ5xIwyliQCbg==} - 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/linux-x64@0.19.8: - resolution: {integrity: sha512-lytMAVOM3b1gPypL2TRmZ5rnXl7+6IIk8uB3eLsV1JwcizuolblXRrc5ShPrO9ls/b+RTp+E6gbsuLWHWi2zGg==} - 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/netbsd-x64@0.19.8: - resolution: {integrity: sha512-hvWVo2VsXz/8NVt1UhLzxwAfo5sioj92uo0bCfLibB0xlOmimU/DeAEsQILlBQvkhrGjamP0/el5HU76HAitGw==} - 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/openbsd-x64@0.19.8: - resolution: {integrity: sha512-/7Y7u77rdvmGTxR83PgaSvSBJCC2L3Kb1M/+dmSIvRvQPXXCuC97QAwMugBNG0yGcbEGfFBH7ojPzAOxfGNkwQ==} - 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/sunos-x64@0.19.8: - resolution: {integrity: sha512-9Lc4s7Oi98GqFA4HzA/W2JHIYfnXbUYgekUP/Sm4BG9sfLjyv6GKKHKKVs83SMicBF2JwAX6A1PuOLMqpD001w==} - 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-arm64@0.19.8: - resolution: {integrity: sha512-rq6WzBGjSzihI9deW3fC2Gqiak68+b7qo5/3kmB6Gvbh/NYPA0sJhrnp7wgV4bNwjqM+R2AApXGxMO7ZoGhIJg==} - 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-ia32@0.19.8: - resolution: {integrity: sha512-AIAbverbg5jMvJznYiGhrd3sumfwWs8572mIJL5NQjJa06P8KfCPWZQ0NwZbPQnbQi9OWSZhFVSUWjjIrn4hSw==} - 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 - - /@esbuild/win32-x64@0.19.8: - resolution: {integrity: sha512-bfZ0cQ1uZs2PqpulNL5j/3w+GDhP36k1K5c38QdQg+Swy51jFZWWeIkteNsufkQxp986wnqRRsb/bHbY1WQ7TA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@eslint-community/eslint-utils@4.4.0(eslint@8.54.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.54.0 - eslint-visitor-keys: 3.4.3 - - /@eslint-community/regexpp@4.10.0: - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - /@eslint/eslintrc@2.1.3: - resolution: {integrity: sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.6.1 - globals: 13.23.0 - ignore: 5.3.0 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - /@eslint/js@8.54.0: - resolution: {integrity: sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - /@fastify/busboy@2.1.0: - resolution: {integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==} - engines: {node: '>=14'} - - /@hono/swagger-ui@0.2.0(hono@3.10.2): - resolution: {integrity: sha512-ulWqCI+38vTlxxBmOAi5VTOUDa5/7fKHPTwyq00kRUjUxPp3Ej5Cs+B/fvGs5gd3KraArLArkln7sHhb5vODZA==} - peerDependencies: - hono: '*' - dependencies: - hono: 3.10.2 - dev: false - - /@hono/zod-openapi@0.8.6(hono@3.10.2)(zod@3.22.4): - resolution: {integrity: sha512-HQNmJoIGyu2kNK9DI8+gIyV4c+bZm5t75PytPSRqMTim9P9HAAPMtepxu44aPZO9ehDxK4KZlRVRqz8OBxOL1A==} - engines: {node: '>=16.0.0'} - peerDependencies: - hono: '>=3.9.0' - zod: 3.* - dependencies: - '@asteasolutions/zod-to-openapi': 5.5.0(zod@3.22.4) - '@hono/zod-validator': 0.1.11(hono@3.10.2)(zod@3.22.4) - hono: 3.10.2 - zod: 3.22.4 - dev: false - - /@hono/zod-validator@0.1.11(hono@3.10.2)(zod@3.22.4): - resolution: {integrity: sha512-PQXeHUP0+36qpRt8yfeD7N2jbK3ETlGvSN6dMof/HwUC/APRokQRjpXZm4rrlG71Ft0aWE01+Bm4XejqPie5Uw==} - peerDependencies: - hono: '>=3.9.0' - zod: ^3.19.1 - dependencies: - hono: 3.10.2 - zod: 3.22.4 - dev: false - - /@humanwhocodes/config-array@0.11.13: - resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} - engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 2.0.1 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - /@humanwhocodes/object-schema@2.0.1: - resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} - - /@ioredis/commands@1.2.0: - resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} - dev: false - - /@libsql/client@0.4.0-pre.2: - resolution: {integrity: sha512-sKWNPU+RQoki5hEoYhpC+fQ/kj+VuwoSXF2PMYGWB19MYBkMaMc7udn1T0ibNjNkFNmd98HvPIHd48NNC2oWvA==} - dependencies: - '@libsql/hrana-client': 0.5.5 - js-base64: 3.7.5 - libsql: 0.2.0-pre.2 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - dev: false - - /@libsql/darwin-arm64@0.2.0-pre.2: - resolution: {integrity: sha512-PKXAKBJF6XwfCT3yU1N/kHyUGcsatf/4rYNzdnc6UGeg+yWf3ZDk7sGnHHj9bDQ9oKLRVJQmc+cNIEsF2GOr9w==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@libsql/darwin-x64@0.2.0-pre.2: - resolution: {integrity: sha512-e3k4LsAFRf8qFfZqkg/VkoXK/UfDYgoDvLmAJpAGKEFp7d/bTmbF1r0YCjtGaPbheRxARAUXNfekvRhdpXE3mg==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@libsql/hrana-client@0.5.5: - resolution: {integrity: sha512-i+hDBpiV719poqEiHupUUZYKJ9YSbCRFe5Q2PQ0v3mHIftePH6gayLjp2u6TXbqbO/Dv6y8yyvYlBXf/kFfRZA==} - dependencies: - '@libsql/isomorphic-fetch': 0.1.10 - '@libsql/isomorphic-ws': 0.1.5 - js-base64: 3.7.5 - node-fetch: 3.3.2 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - dev: false - - /@libsql/isomorphic-fetch@0.1.10: - resolution: {integrity: sha512-dH0lMk50gKSvEKD78xWMu60SY1sjp1sY//iFLO0XMmBwfVfG136P9KOk06R4maBdlb8KMXOzJ1D28FR5ZKnHTA==} - dependencies: - '@types/node-fetch': 2.6.9 - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding - dev: false - - /@libsql/isomorphic-ws@0.1.5: - resolution: {integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==} - dependencies: - '@types/ws': 8.5.10 - ws: 8.14.2 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: false - - /@libsql/linux-arm64-gnu@0.2.0-pre.2: - resolution: {integrity: sha512-ZkN6e129joeUu6cinGMRbCvLTnrM5xV5n9XHs2dRrZfL7yu7utbvrY1l+P6VI1gugs93UhgupqyMsolFjvrPww==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@libsql/linux-arm64-musl@0.2.0-pre.2: - resolution: {integrity: sha512-tEy4UAIzHYtjCBJnZoTcX1LCYy+XGR3hQCsdRYujWJhUtmtU/AqCRZV3q8MyfX7UhKyawJKWoQvwQ6Vs7w9jAA==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@libsql/linux-x64-gnu@0.2.0-pre.2: - resolution: {integrity: sha512-jhHKwz5i9mdlpT4EeaKNUfyW5N9YY8wD5lZ0F5HrrPKhwgufnJY0oPEbvhM4KXDcSJetiIcGJ6K6NQyMSgoJ/Q==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@libsql/linux-x64-musl@0.2.0-pre.2: - resolution: {integrity: sha512-HvwZtSQ2eIT968yxAb+htO+wmibdwW1PIyR7iJ5TN7phj7W1gF962l3ZhV1hVYERaMu+liBH1e/cRP1S35q3vQ==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@libsql/win32-x64-msvc@0.2.0-pre.2: - resolution: {integrity: sha512-BWjInhsZRF9x+W0T5oJVjqoCCdvh82y74b/T3Ge/irXyLdVhHA9Zb1JWDy5uhu8eBR+d2n9B+IO0YwAvhFRTLw==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@lucia-auth/adapter-session-unstorage@2.1.0(lucia@2.7.4)(unstorage@1.10.1): - resolution: {integrity: sha512-ItK7urZhLZv7UO99BcODjRhSAv58UPc+KQAmnkSvri2WBc22vFEjnjd/oWp3CZPdbbrJkuTvsuhFXH1ySBfOLg==} - peerDependencies: - lucia: ^2.0.0 - unstorage: ^1.9.0 - dependencies: - lucia: 2.7.4 - unstorage: 1.10.1 - dev: false - - /@lucia-auth/adapter-sqlite@2.0.1(@libsql/client@0.4.0-pre.2)(better-sqlite3@9.1.1)(lucia@2.7.4): - resolution: {integrity: sha512-yc7XQ4X3sWG1gyUGHqaXipJIkmvB4MOgJypnSMWy7Vjhn3AOCM2xw51xTs+dGpLOQIn2Laomg9xpmDM2/9tgqQ==} - peerDependencies: - '@libsql/client': ^0.3.0 - better-sqlite3: 8.x - 9.x - lucia: ^2.0.0 - peerDependenciesMeta: - '@libsql/client': - optional: true - better-sqlite3: - optional: true - dependencies: - '@libsql/client': 0.4.0-pre.2 - better-sqlite3: 9.1.1 - lucia: 2.7.4 - dev: false - - /@lucia-auth/oauth@3.5.0(lucia@2.7.4): - resolution: {integrity: sha512-JSwAMVwlDJtbvfcJV1nbkv41OD830pgICrx8zFT71SYd5I1MnEQ+GqMTXBGRyxzc5XlLatT8ZS1Jt0k81487xg==} - peerDependencies: - lucia: ^2.0.0 - dependencies: - lucia: 2.7.4 - dev: false - - /@neon-rs/load@0.0.4: - resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==} - dev: false - - /@node-rs/argon2-android-arm-eabi@1.5.2: - resolution: {integrity: sha512-vVZec4ITr9GumAy0p8Zj8ozie362gtbZrTkLp9EqvuFZ/HrZzR09uS2IsDgm4mAstg/rc4A1gLRrHI8jDdbjkA==} - engines: {node: '>= 10'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-android-arm64@1.5.2: - resolution: {integrity: sha512-SwhnsXyrpgtWDTwYds1WUnxLA/kVP8HVaImYwQ3Wemqj1lkzcSoIaNyjNWkyrYGqO1tVc1YUrqsbd5eCHh+3sg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-darwin-arm64@1.5.2: - resolution: {integrity: sha512-+1ZMKiCCv2pip/o1Xg09piQru2LOIBPQ1vS4is86f55N3jjZnSfP+db5mYCSRuB0gRYqui98he7su7OGXlF4gQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-darwin-x64@1.5.2: - resolution: {integrity: sha512-mQ57mORlsxpfjcEsVpiHyHCOp6Ljrz/rVNWk8ihnPWw0qt0EqF1zbHRxTEPemL1iBHL9UyXpXrKS4JKq6xMn5w==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-freebsd-x64@1.5.2: - resolution: {integrity: sha512-UjKbFd3viYcpiwflkU4haEdNUMk1V2fVCJImWLWQns/hVval9BrDv5xsBwgdynbPHDlPOiWj816LBQwhWLGVWA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-arm-gnueabihf@1.5.2: - resolution: {integrity: sha512-36GJjJBnVuscV9CTn8RVDeJysnmIzr6Lp7QBCDczYHi6eKFuA8udCJb4SRyJqdvIuzycKG1RL56FbcFBJYCYIA==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-arm64-gnu@1.5.2: - resolution: {integrity: sha512-sE0ydb2gp6xC+5vbVz8l3paaiBbFQIB2Rwp5wx9MmKiYdTfcO5WkGeADuSgoFiTcSEz1RsHXqrdVy6j/LtSqtA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-arm64-musl@1.5.2: - resolution: {integrity: sha512-LhE0YHB0aJCwlbsQrwePik/KFWUc9qMriJIL5KiejK3bDoTVY4ihH587QT56JyaLvl3nBJaAV8l5yMqQdHnouA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-x64-gnu@1.5.2: - resolution: {integrity: sha512-MnKLiBlyg05pxvKXe3lNgBL9El9ThD74hvVEiWH1Xk40RRrJ507NCOWXVmQ0FDq1mjTeGFxbIvk+AcoF0NSLIQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-x64-musl@1.5.2: - resolution: {integrity: sha512-tzLgASY0Ng2OTW7Awwl9UWzjbWx8/uD6gXcZ/k/nYGSZE5Xp8EOD2NUqHLbK6KZE3775A0R25ShpiSxCadYqkg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-win32-arm64-msvc@1.5.2: - resolution: {integrity: sha512-vpTwSvv3oUXTpWZh0/HxdJ5wFMlmS7aVDwL4ATWepTZhMG4n+TO0+tVLdcPHCbg0oc6hCWBjWNPlSn9mW+YIgA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-win32-ia32-msvc@1.5.2: - resolution: {integrity: sha512-KPpZR15ui7uQWQXKmtaKyUQRs4UJdXnIIfiyFLGmLWCdEKlr3MtIGFt0fdziu4BF5ZObD8Ic6QvT0VXK4OJiww==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-win32-x64-msvc@1.5.2: - resolution: {integrity: sha512-/pGuwixJS8ZlpwhX9iM6g6JEeZYo1TtnNf8exwsOi7gxcUoTUfw5it+5GfbY/n+xRBz/DIU4bzUmXmh+7Gh0ug==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2@1.5.2: - resolution: {integrity: sha512-qq7wOSsdP2b4rXEapWNmsCjpaTGZWtp9kZmri98GYCDZqN8UJUG5zSue4XtYWWJMWKJVE/hkaIwk+BgN1ZUn0Q==} - engines: {node: '>= 10'} - optionalDependencies: - '@node-rs/argon2-android-arm-eabi': 1.5.2 - '@node-rs/argon2-android-arm64': 1.5.2 - '@node-rs/argon2-darwin-arm64': 1.5.2 - '@node-rs/argon2-darwin-x64': 1.5.2 - '@node-rs/argon2-freebsd-x64': 1.5.2 - '@node-rs/argon2-linux-arm-gnueabihf': 1.5.2 - '@node-rs/argon2-linux-arm64-gnu': 1.5.2 - '@node-rs/argon2-linux-arm64-musl': 1.5.2 - '@node-rs/argon2-linux-x64-gnu': 1.5.2 - '@node-rs/argon2-linux-x64-musl': 1.5.2 - '@node-rs/argon2-win32-arm64-msvc': 1.5.2 - '@node-rs/argon2-win32-ia32-msvc': 1.5.2 - '@node-rs/argon2-win32-x64-msvc': 1.5.2 - dev: false - - /@node-rs/bcrypt-android-arm-eabi@1.7.3: - resolution: {integrity: sha512-l53RuBqnqNvBN2jx09Ws6jpLmuQdSDx10n0GeaTfwh1svxsC8bPpVmxkfBExsT2Tu7KF38gTnPZvwsxysZQyPQ==} - engines: {node: '>= 10'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-android-arm64@1.7.3: - resolution: {integrity: sha512-TZpm4VbiViqDMvusrcYzLr1b1M5FDF0cDNiTUciLeBSsKtU5lNdEZGAU7gvCnrKoUWpGuOblHU7613zuB7SiNQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-darwin-arm64@1.7.3: - resolution: {integrity: sha512-SiUuAabynVsmixZMjh5xrn8w47EnV0HzbW9st4DPoVhn/wzdUcksIXDY75aoQG2EIzKLN8IGb+CIVnPGmRyhxw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-darwin-x64@1.7.3: - resolution: {integrity: sha512-R+81Z0eX4hZPvCXY5Z6l0l+JrTU3WcSYGHP0QYV9uwdaafOz6EhrCXUzZ02AIcAbNoVR8eucYVruq9PiasXoVw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-freebsd-x64@1.7.3: - resolution: {integrity: sha512-0pItU/5K3e83JjcJj9fZv+78txUoZ3hHCT7n/UMdu9mkpUzhX/rqb4jmQpJpD+UQoR76xp3qDo5RMgQBffBVNg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-arm-gnueabihf@1.7.3: - resolution: {integrity: sha512-HTSybWUjNe8rWuXkTkMeFDiQNHc6VioRcgv6AeHZphIxiT6dFbnhXNkfz4Hr0zxvyPhZ3NrYjT2AmPVFT6VW3Q==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-arm64-gnu@1.7.3: - resolution: {integrity: sha512-rWep6Y+v/c4bZHaM8LmSsrMwMmDR9wG4/q+3Z9VzR8xdnt5VCbuQdYWpf3sgGRGjTRdTBAdSK8x1reOjqsJ3Jg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-arm64-musl@1.7.3: - resolution: {integrity: sha512-TyWEKhxr+yfGcMKzVV/ARZw+Hrky2yl91bo0XYU2ZW6I6LDC0emNsXugdWjwz8ADI4OWhhrOjXD8GCilxiB2Rg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-x64-gnu@1.7.3: - resolution: {integrity: sha512-PofxM1Qg7tZKj1oP0I7tBTSSLr8Xc2uxx+P3pBCPmYzaBwWqGteNHJlF7n2q5xiH7YOlguH4w5CmcEjsiA3K4A==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-x64-musl@1.7.3: - resolution: {integrity: sha512-D5V6/dDVKP8S/ieDBLGhTn4oTo3upbrpWInynbhOMjJvPiIxVG1PiI3MXkWBtG9qtfleDk7gUkEKtAOxlIxDTQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-win32-arm64-msvc@1.7.3: - resolution: {integrity: sha512-b4gH2Yj5R4TwULrfMHd1Qqr+MrnFjVRUAJujDKPqi+PppSqezW8QF6DRSOL4GjnBmz5JEd64wxgeidvy7dsbGw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-win32-ia32-msvc@1.7.3: - resolution: {integrity: sha512-E91ro+ybI0RhNc89aGaZQGll0YhPoHr8JacoWrNKwhg9zwNOYeuO0tokdMZdm6nF0/8obll0Mq7wO9AXO9iffw==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-win32-x64-msvc@1.7.3: - resolution: {integrity: sha512-LO/p9yjPODj/pQvPnowBuwpDdqiyUXQbqL1xb1RSP3NoyCFAGmjL5h0plSQrhLh8hskQiozBRXNaQurtsM7o0Q==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt@1.7.3: - resolution: {integrity: sha512-BF6u9CBPUiyk1zU+5iwikezf+xM4MFSu5cmrrg/PLKffGgIM13ZsY6DHftcTraETB04ryasjM/5IejotH+sO5Q==} - engines: {node: '>= 10'} - optionalDependencies: - '@node-rs/bcrypt-android-arm-eabi': 1.7.3 - '@node-rs/bcrypt-android-arm64': 1.7.3 - '@node-rs/bcrypt-darwin-arm64': 1.7.3 - '@node-rs/bcrypt-darwin-x64': 1.7.3 - '@node-rs/bcrypt-freebsd-x64': 1.7.3 - '@node-rs/bcrypt-linux-arm-gnueabihf': 1.7.3 - '@node-rs/bcrypt-linux-arm64-gnu': 1.7.3 - '@node-rs/bcrypt-linux-arm64-musl': 1.7.3 - '@node-rs/bcrypt-linux-x64-gnu': 1.7.3 - '@node-rs/bcrypt-linux-x64-musl': 1.7.3 - '@node-rs/bcrypt-win32-arm64-msvc': 1.7.3 - '@node-rs/bcrypt-win32-ia32-msvc': 1.7.3 - '@node-rs/bcrypt-win32-x64-msvc': 1.7.3 - dev: false - - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 - - /@parcel/watcher-android-arm64@2.3.0: - resolution: {integrity: sha512-f4o9eA3dgk0XRT3XhB0UWpWpLnKgrh1IwNJKJ7UJek7eTYccQ8LR7XUWFKqw6aEq5KUNlCcGvSzKqSX/vtWVVA==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-darwin-arm64@2.3.0: - resolution: {integrity: sha512-mKY+oijI4ahBMc/GygVGvEdOq0L4DxhYgwQqYAz/7yPzuGi79oXrZG52WdpGA1wLBPrYb0T8uBaGFo7I6rvSKw==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-darwin-x64@2.3.0: - resolution: {integrity: sha512-20oBj8LcEOnLE3mgpy6zuOq8AplPu9NcSSSfyVKgfOhNAc4eF4ob3ldj0xWjGGbOF7Dcy1Tvm6ytvgdjlfUeow==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-freebsd-x64@2.3.0: - resolution: {integrity: sha512-7LftKlaHunueAEiojhCn+Ef2CTXWsLgTl4hq0pkhkTBFI3ssj2bJXmH2L67mKpiAD5dz66JYk4zS66qzdnIOgw==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-linux-arm-glibc@2.3.0: - resolution: {integrity: sha512-1apPw5cD2xBv1XIHPUlq0cO6iAaEUQ3BcY0ysSyD9Kuyw4MoWm1DV+W9mneWI+1g6OeP6dhikiFE6BlU+AToTQ==} - engines: {node: '>= 10.0.0'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-linux-arm64-glibc@2.3.0: - resolution: {integrity: sha512-mQ0gBSQEiq1k/MMkgcSB0Ic47UORZBmWoAWlMrTW6nbAGoLZP+h7AtUM7H3oDu34TBFFvjy4JCGP43JlylkTQA==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-linux-arm64-musl@2.3.0: - resolution: {integrity: sha512-LXZAExpepJew0Gp8ZkJ+xDZaTQjLHv48h0p0Vw2VMFQ8A+RKrAvpFuPVCVwKJCr5SE+zvaG+Etg56qXvTDIedw==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-linux-x64-glibc@2.3.0: - resolution: {integrity: sha512-P7Wo91lKSeSgMTtG7CnBS6WrA5otr1K7shhSjKHNePVmfBHDoAOHYRXgUmhiNfbcGk0uMCHVcdbfxtuiZCHVow==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-linux-x64-musl@2.3.0: - resolution: {integrity: sha512-+kiRE1JIq8QdxzwoYY+wzBs9YbJ34guBweTK8nlzLKimn5EQ2b2FSC+tAOpq302BuIMjyuUGvBiUhEcLIGMQ5g==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-wasm@2.3.0: - resolution: {integrity: sha512-ejBAX8H0ZGsD8lSICDNyMbSEtPMWgDL0WFCt/0z7hyf5v8Imz4rAM8xY379mBsECkq/Wdqa5WEDLqtjZ+6NxfA==} - engines: {node: '>= 10.0.0'} - dependencies: - is-glob: 4.0.3 - micromatch: 4.0.5 - napi-wasm: 1.1.0 - dev: false - bundledDependencies: - - napi-wasm - - /@parcel/watcher-win32-arm64@2.3.0: - resolution: {integrity: sha512-35gXCnaz1AqIXpG42evcoP2+sNL62gZTMZne3IackM+6QlfMcJLy3DrjuL6Iks7Czpd3j4xRBzez3ADCj1l7Aw==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-win32-ia32@2.3.0: - resolution: {integrity: sha512-FJS/IBQHhRpZ6PiCjFt1UAcPr0YmCLHRbTc00IBTrelEjlmmgIVLeOx4MSXzx2HFEy5Jo5YdhGpxCuqCyDJ5ow==} - engines: {node: '>= 10.0.0'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-win32-x64@2.3.0: - resolution: {integrity: sha512-dLx+0XRdMnVI62kU3wbXvbIRhLck4aE28bIGKbRGS7BJNt54IIj9+c/Dkqb+7DJEbHUZAX1bwaoM8PqVlHJmCA==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher@2.3.0: - resolution: {integrity: sha512-pW7QaFiL11O0BphO+bq3MgqeX/INAk9jgBldVDYjlQPO4VddoZnF22TcF9onMhnLVHuNqBJeRf+Fj7eezi/+rQ==} - engines: {node: '>= 10.0.0'} - dependencies: - detect-libc: 1.0.3 - is-glob: 4.0.3 - micromatch: 4.0.5 - node-addon-api: 7.0.0 - optionalDependencies: - '@parcel/watcher-android-arm64': 2.3.0 - '@parcel/watcher-darwin-arm64': 2.3.0 - '@parcel/watcher-darwin-x64': 2.3.0 - '@parcel/watcher-freebsd-x64': 2.3.0 - '@parcel/watcher-linux-arm-glibc': 2.3.0 - '@parcel/watcher-linux-arm64-glibc': 2.3.0 - '@parcel/watcher-linux-arm64-musl': 2.3.0 - '@parcel/watcher-linux-x64-glibc': 2.3.0 - '@parcel/watcher-linux-x64-musl': 2.3.0 - '@parcel/watcher-win32-arm64': 2.3.0 - '@parcel/watcher-win32-ia32': 2.3.0 - '@parcel/watcher-win32-x64': 2.3.0 - dev: false - - /@types/json-schema@7.0.15: - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - dev: false - - /@types/node-fetch@2.6.9: - resolution: {integrity: sha512-bQVlnMLFJ2d35DkPNjEPmd9ueO/rh5EiaZt2bhqiSarPjZIuIV6bPQVqcrEyvNo+AfTrRGVazle1tl597w3gfA==} - dependencies: - '@types/node': 20.10.0 - form-data: 4.0.0 - dev: false - - /@types/node-forge@1.3.10: - resolution: {integrity: sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw==} - dependencies: - '@types/node': 20.10.0 - dev: true - - /@types/node@20.10.0: - resolution: {integrity: sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ==} - dependencies: - undici-types: 5.26.5 - - /@types/semver@7.5.6: - resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} - dev: false - - /@types/ws@8.5.10: - resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} - dependencies: - '@types/node': 20.10.0 - dev: false - - /@typescript-eslint/eslint-plugin@6.12.0(@typescript-eslint/parser@6.12.0)(eslint@8.54.0)(typescript@5.3.2): - resolution: {integrity: sha512-XOpZ3IyJUIV1b15M7HVOpgQxPPF7lGXgsfcEIu3yDxFPaf/xZKt7s9QO/pbk7vpWQyVulpJbu4E5LwpZiQo4kA==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 6.12.0(eslint@8.54.0)(typescript@5.3.2) - '@typescript-eslint/scope-manager': 6.12.0 - '@typescript-eslint/type-utils': 6.12.0(eslint@8.54.0)(typescript@5.3.2) - '@typescript-eslint/utils': 6.12.0(eslint@8.54.0)(typescript@5.3.2) - '@typescript-eslint/visitor-keys': 6.12.0 - debug: 4.3.4 - eslint: 8.54.0 - graphemer: 1.4.0 - ignore: 5.3.0 - natural-compare: 1.4.0 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.3.2) - typescript: 5.3.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/parser@6.12.0(eslint@8.54.0)(typescript@5.3.2): - resolution: {integrity: sha512-s8/jNFPKPNRmXEnNXfuo1gemBdVmpQsK1pcu+QIvuNJuhFzGrpD7WjOcvDc/+uEdfzSYpNu7U/+MmbScjoQ6vg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 6.12.0 - '@typescript-eslint/types': 6.12.0 - '@typescript-eslint/typescript-estree': 6.12.0(typescript@5.3.2) - '@typescript-eslint/visitor-keys': 6.12.0 - debug: 4.3.4 - eslint: 8.54.0 - typescript: 5.3.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/scope-manager@6.12.0: - resolution: {integrity: sha512-5gUvjg+XdSj8pcetdL9eXJzQNTl3RD7LgUiYTl8Aabdi8hFkaGSYnaS6BLc0BGNaDH+tVzVwmKtWvu0jLgWVbw==} - engines: {node: ^16.0.0 || >=18.0.0} - dependencies: - '@typescript-eslint/types': 6.12.0 - '@typescript-eslint/visitor-keys': 6.12.0 - dev: false - - /@typescript-eslint/type-utils@6.12.0(eslint@8.54.0)(typescript@5.3.2): - resolution: {integrity: sha512-WWmRXxhm1X8Wlquj+MhsAG4dU/Blvf1xDgGaYCzfvStP2NwPQh6KBvCDbiOEvaE0filhranjIlK/2fSTVwtBng==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/typescript-estree': 6.12.0(typescript@5.3.2) - '@typescript-eslint/utils': 6.12.0(eslint@8.54.0)(typescript@5.3.2) - debug: 4.3.4 - eslint: 8.54.0 - ts-api-utils: 1.0.3(typescript@5.3.2) - typescript: 5.3.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/types@6.12.0: - resolution: {integrity: sha512-MA16p/+WxM5JG/F3RTpRIcuOghWO30//VEOvzubM8zuOOBYXsP+IfjoCXXiIfy2Ta8FRh9+IO9QLlaFQUU+10Q==} - engines: {node: ^16.0.0 || >=18.0.0} - dev: false - - /@typescript-eslint/typescript-estree@6.12.0(typescript@5.3.2): - resolution: {integrity: sha512-vw9E2P9+3UUWzhgjyyVczLWxZ3GuQNT7QpnIY3o5OMeLO/c8oHljGc8ZpryBMIyympiAAaKgw9e5Hl9dCWFOYw==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 6.12.0 - '@typescript-eslint/visitor-keys': 6.12.0 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.3.2) - typescript: 5.3.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/utils@6.12.0(eslint@8.54.0)(typescript@5.3.2): - resolution: {integrity: sha512-LywPm8h3tGEbgfyjYnu3dauZ0U7R60m+miXgKcZS8c7QALO9uWJdvNoP+duKTk2XMWc7/Q3d/QiCuLN9X6SWyQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.54.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.6 - '@typescript-eslint/scope-manager': 6.12.0 - '@typescript-eslint/types': 6.12.0 - '@typescript-eslint/typescript-estree': 6.12.0(typescript@5.3.2) - eslint: 8.54.0 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - - typescript - dev: false - - /@typescript-eslint/visitor-keys@6.12.0: - resolution: {integrity: sha512-rg3BizTZHF1k3ipn8gfrzDXXSFKyOEB5zxYXInQ6z0hUvmQlhaZQzK+YmHmNViMA9HzW5Q9+bPPt90bU6GQwyw==} - engines: {node: ^16.0.0 || >=18.0.0} - dependencies: - '@typescript-eslint/types': 6.12.0 - eslint-visitor-keys: 3.4.3 - dev: false - - /@ungap/structured-clone@1.2.0: - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - - /acorn-jsx@5.3.2(acorn@8.11.2): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.11.2 - - /acorn-walk@8.3.0: - resolution: {integrity: sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==} - engines: {node: '>=0.4.0'} - - /acorn@8.11.2: - resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} - engines: {node: '>=0.4.0'} - hasBin: true - - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - /arch@2.2.0: - resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} - dev: false - - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: false - - /as-table@1.0.55: - resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} - dependencies: - printable-characters: 1.0.42 - - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: false - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - /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'} - - /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 - - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - /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==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: false - - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - - /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 - - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true - - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - /chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - dev: false - - /citty@0.1.5: - resolution: {integrity: sha512-AS7n5NSc0OQVMV9v6wt3ByujNIrne0/cTjiC2MYqhvao57VNfiuVksTSr2p17nVOhEr2KtqiAkGwHcgMC/qUuQ==} - dependencies: - consola: 3.2.3 - dev: false - - /cli-color@2.0.3: - resolution: {integrity: sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==} - engines: {node: '>=0.10'} - dependencies: - d: 1.0.1 - es5-ext: 0.10.62 - es6-iterator: 2.0.3 - memoizee: 0.4.15 - timers-ext: 0.1.7 - dev: true - - /clipboardy@3.0.0: - resolution: {integrity: sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - arch: 2.2.0 - execa: 5.1.1 - is-wsl: 2.2.0 - dev: false - - /cluster-key-slot@1.1.2: - resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} - engines: {node: '>=0.10.0'} - dev: false - - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - dependencies: - delayed-stream: 1.0.0 - dev: false - - /commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} - dev: true - - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - /consola@3.2.3: - resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} - engines: {node: ^14.18.0 || >=16.10.0} - dev: false - - /cookie-es@1.0.0: - resolution: {integrity: sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ==} - dev: false - - /cookie@0.5.0: - resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} - engines: {node: '>= 0.6'} - - /copy-anything@3.0.5: - resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} - engines: {node: '>=12.13'} - dependencies: - is-what: 4.1.16 - dev: true - - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - /d@1.0.1: - resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} - 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==} - - /data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} - dev: false - - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - - /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==} - - /defu@6.1.3: - resolution: {integrity: sha512-Vy2wmG3NTkmHNg/kzpuvHhkqeIx3ODWqasgCRbKtbXEN0G+HpEEv9BtJLp7ZG1CZloFaC41Ah3ZFbq7aqCqMeQ==} - dev: false - - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dev: false - - /denque@2.1.0: - resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} - engines: {node: '>=0.10'} - dev: false - - /destr@2.0.2: - resolution: {integrity: sha512-65AlobnZMiCET00KaFFjUefxDX0khFA/E4myqZ7a6Sq1yZtR8+FVIvilVX66vF2uobSumxooYZChiRPCKNqhmg==} - dev: false - - /detect-libc@1.0.3: - resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} - engines: {node: '>=0.10'} - hasBin: true - dev: false - - /detect-libc@2.0.2: - resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} - engines: {node: '>=8'} - dev: false - - /difflib@0.2.4: - resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} - dependencies: - heap: 0.2.7 - dev: true - - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - dev: false - - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dependencies: - esutils: 2.0.3 - - /dotenv@16.3.1: - resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} - engines: {node: '>=12'} - dev: true - - /dreamopt@0.8.0: - resolution: {integrity: sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==} - engines: {node: '>=0.4.0'} - dependencies: - wordwrap: 1.0.0 - dev: true - - /drizzle-kit@0.20.6: - resolution: {integrity: sha512-+AYQY+tJUnfMJYIeh6aEjI21mpMCekqz0LEu2QdFdc/3zSmjyfEhH5dkXlRFME8v1rtisiHfp7bP+gVVKDPiUg==} - hasBin: true - dependencies: - '@drizzle-team/studio': 0.0.35 - '@esbuild-kit/esm-loader': 2.6.5 - camelcase: 7.0.1 - chalk: 5.3.0 - commander: 9.5.0 - esbuild: 0.19.8 - esbuild-register: 3.5.0(esbuild@0.19.8) - glob: 8.1.0 - hanji: 0.0.5 - json-diff: 0.9.0 - minimatch: 7.4.6 - semver: 7.5.4 - wrangler: 3.17.1 - zod: 3.22.4 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - /drizzle-orm@0.29.0(@cloudflare/workers-types@4.20231121.0)(@libsql/client@0.4.0-pre.2)(better-sqlite3@9.1.1)(mysql2@3.6.5): - 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: - '@cloudflare/workers-types': 4.20231121.0 - '@libsql/client': 0.4.0-pre.2 - better-sqlite3: 9.1.1 - mysql2: 3.6.5 - dev: false - - /drizzle-zod@0.5.1(drizzle-orm@0.29.0)(zod@3.22.4): - resolution: {integrity: sha512-C/8bvzUH/zSnVfwdSibOgFjLhtDtbKYmkbPbUCq46QZyZCH6kODIMSOgZ8R7rVjoI+tCj3k06MRJMDqsIeoS4A==} - peerDependencies: - drizzle-orm: '>=0.23.13' - zod: '*' - dependencies: - drizzle-orm: 0.29.0(@cloudflare/workers-types@4.20231121.0)(@libsql/client@0.4.0-pre.2)(better-sqlite3@9.1.1)(mysql2@3.6.5) - zod: 3.22.4 - dev: false - - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - dependencies: - once: 1.4.0 - dev: false - - /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.19.8): - resolution: {integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==} - peerDependencies: - esbuild: '>=0.12 <1' - dependencies: - debug: 4.3.4 - esbuild: 0.19.8 - 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 - - /esbuild@0.19.8: - resolution: {integrity: sha512-l7iffQpT2OrZfH2rXIp7/FkmaeZM0vxbxN9KfiCwGYuZqzMg/JdvX26R31Zxn/Pxvsrg3Y9N6XTcnknqDyyv4w==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.19.8 - '@esbuild/android-arm64': 0.19.8 - '@esbuild/android-x64': 0.19.8 - '@esbuild/darwin-arm64': 0.19.8 - '@esbuild/darwin-x64': 0.19.8 - '@esbuild/freebsd-arm64': 0.19.8 - '@esbuild/freebsd-x64': 0.19.8 - '@esbuild/linux-arm': 0.19.8 - '@esbuild/linux-arm64': 0.19.8 - '@esbuild/linux-ia32': 0.19.8 - '@esbuild/linux-loong64': 0.19.8 - '@esbuild/linux-mips64el': 0.19.8 - '@esbuild/linux-ppc64': 0.19.8 - '@esbuild/linux-riscv64': 0.19.8 - '@esbuild/linux-s390x': 0.19.8 - '@esbuild/linux-x64': 0.19.8 - '@esbuild/netbsd-x64': 0.19.8 - '@esbuild/openbsd-x64': 0.19.8 - '@esbuild/sunos-x64': 0.19.8 - '@esbuild/win32-arm64': 0.19.8 - '@esbuild/win32-ia32': 0.19.8 - '@esbuild/win32-x64': 0.19.8 - dev: true - - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - /eslint-config-google@0.14.0(eslint@8.54.0): - resolution: {integrity: sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==} - engines: {node: '>=0.10.0'} - peerDependencies: - eslint: '>=5.16.0' - dependencies: - eslint: 8.54.0 - dev: true - - /eslint-plugin-json@3.1.0: - resolution: {integrity: sha512-MrlG2ynFEHe7wDGwbUuFPsaT2b1uhuEFhJ+W1f1u+1C2EkXmTYJp4B1aAdQQ8M+CC3t//N/oRKiIVw14L2HR1g==} - engines: {node: '>=12.0'} - dependencies: - lodash: 4.17.21 - vscode-json-languageservice: 4.2.1 - dev: true - - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - /eslint@8.54.0: - resolution: {integrity: sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.54.0) - '@eslint-community/regexpp': 4.10.0 - '@eslint/eslintrc': 2.1.3 - '@eslint/js': 8.54.0 - '@humanwhocodes/config-array': 0.11.13 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.23.0 - graphemer: 1.4.0 - ignore: 5.3.0 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.3 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - acorn: 8.11.2 - acorn-jsx: 5.3.2(acorn@8.11.2) - eslint-visitor-keys: 3.4.3 - - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} - dependencies: - estraverse: 5.3.0 - - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - dependencies: - estraverse: 5.3.0 - - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - /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'} - - /event-emitter@0.3.5: - resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} - dependencies: - d: 1.0.1 - es5-ext: 0.10.62 - dev: true - - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: false - - /exit-hook@2.2.1: - resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} - engines: {node: '>=6'} - - /expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} - 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==} - - /fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: false - - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} - dependencies: - reusify: 1.0.4 - - /fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 3.2.1 - dev: false - - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flat-cache: 3.2.0 - - /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'} - dependencies: - to-regex-range: 5.0.1 - - /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 - - /flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flatted: 3.2.9 - keyv: 4.5.4 - rimraf: 3.0.2 - - /flatted@3.2.9: - resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} - - /form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: false - - /formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} - dependencies: - fetch-blob: 3.2.0 - dev: false - - /fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - dev: false - - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - optional: true - - /generate-function@2.3.1: - resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} - dependencies: - is-property: 1.0.2 - dev: false - - /get-port-please@3.1.1: - resolution: {integrity: sha512-3UBAyM3u4ZBVYDsxOQfJDxEa6XTbpBDrOjp4mf7ExFRt5BKs/QywQQiJsh2B+hxcZLSapWqCRvElUe8DnKcFHA==} - dev: false - - /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 - - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: false - - /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'} - dependencies: - is-glob: 4.0.3 - - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - dependencies: - is-glob: 4.0.3 - - /glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - /glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - dev: true - - /globals@13.23.0: - resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.20.2 - - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.0 - merge2: 1.4.1 - slash: 3.0.0 - dev: false - - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - - /h3@1.9.0: - resolution: {integrity: sha512-+F3ZqrNV/CFXXfZ2lXBINHi+rM4Xw3CDC5z2CDK3NMPocjonKipGLLDSkrqY9DOrioZNPTIdDMWfQKm//3X2DA==} - dependencies: - cookie-es: 1.0.0 - defu: 6.1.3 - destr: 2.0.2 - iron-webcrypto: 1.0.0 - radix3: 1.1.0 - ufo: 1.3.2 - uncrypto: 0.1.3 - unenv: 1.8.0 - dev: false - - /hanji@0.0.5: - resolution: {integrity: sha512-Abxw1Lq+TnYiL4BueXqMau222fPSPMFtya8HdpWsz/xVAhifXou71mPh/kY2+08RgFcVccjG3uZHs6K5HAe3zw==} - dependencies: - lodash.throttle: 4.1.1 - sisteransi: 1.0.5 - dev: true - - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - /heap@0.2.7: - resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} - dev: true - - /hono@3.10.2: - resolution: {integrity: sha512-QwJLjWs3e+nZ3b5nQrrdJpYCJqiTK744jeYhX7yhZdxwcQ3KIohBfzI2dA8gSF6HEZkmFUdiKL1BelJ8utIm4w==} - engines: {node: '>=16.0.0'} - dev: false - - /http-shutdown@1.2.2: - resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - dev: false - - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - dev: false - - /husky@8.0.3: - resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} - engines: {node: '>=14'} - hasBin: true - dev: true - - /iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - 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@5.3.0: - resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} - engines: {node: '>= 4'} - - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: false - - /ioredis@5.3.2: - resolution: {integrity: sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==} - engines: {node: '>=12.22.0'} - dependencies: - '@ioredis/commands': 1.2.0 - cluster-key-slot: 1.1.2 - debug: 4.3.4 - denque: 2.1.0 - lodash.defaults: 4.2.0 - lodash.isarguments: 3.1.0 - redis-errors: 1.2.0 - redis-parser: 3.0.0 - standard-as-callback: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: false - - /iron-webcrypto@1.0.0: - resolution: {integrity: sha512-anOK1Mktt8U1Xi7fCM3RELTuYbnFikQY5VtrDj7kPgpejV7d43tWKhzgioO0zpkazLEL/j/iayRqnJhrGfqUsg==} - dev: false - - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - dependencies: - binary-extensions: 2.2.0 - - /is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - dev: false - - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - - /is-promise@2.2.2: - resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} - dev: true - - /is-property@1.0.2: - resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} - dev: false - - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: false - - /is-what@4.1.16: - resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} - engines: {node: '>=12.13'} - dev: true - - /is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - dependencies: - is-docker: 2.2.1 - dev: false - - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - /jiti@1.21.0: - resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} - hasBin: true - dev: false - - /js-base64@3.7.5: - resolution: {integrity: sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==} - dev: false - - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - dependencies: - argparse: 2.0.1 - - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - - /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-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - dependencies: - json-buffer: 3.0.1 - - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - - /libsql@0.2.0-pre.2: - resolution: {integrity: sha512-ErF11J/Q0Uo1TMceX1f7RKfFvQ/j4FS8TagzJnAZBwhHsPcr7uItkSTchkuRHm5+cE4dJO7lqf+MpmlDjp/qAQ==} - cpu: [x64, arm64] - os: [darwin, linux, win32] - dependencies: - '@neon-rs/load': 0.0.4 - detect-libc: 2.0.2 - optionalDependencies: - '@libsql/darwin-arm64': 0.2.0-pre.2 - '@libsql/darwin-x64': 0.2.0-pre.2 - '@libsql/linux-arm64-gnu': 0.2.0-pre.2 - '@libsql/linux-arm64-musl': 0.2.0-pre.2 - '@libsql/linux-x64-gnu': 0.2.0-pre.2 - '@libsql/linux-x64-musl': 0.2.0-pre.2 - '@libsql/win32-x64-msvc': 0.2.0-pre.2 - dev: false - - /listhen@1.5.5: - resolution: {integrity: sha512-LXe8Xlyh3gnxdv4tSjTjscD1vpr/2PRpzq8YIaMJgyKzRG8wdISlWVWnGThJfHnlJ6hmLt2wq1yeeix0TEbuoA==} - hasBin: true - dependencies: - '@parcel/watcher': 2.3.0 - '@parcel/watcher-wasm': 2.3.0 - citty: 0.1.5 - clipboardy: 3.0.0 - consola: 3.2.3 - defu: 6.1.3 - get-port-please: 3.1.1 - h3: 1.9.0 - http-shutdown: 1.2.2 - jiti: 1.21.0 - mlly: 1.4.2 - node-forge: 1.3.1 - pathe: 1.1.1 - std-env: 3.5.0 - ufo: 1.3.2 - untun: 0.1.2 - uqr: 0.1.2 - dev: false - - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - dependencies: - p-locate: 5.0.0 - - /lodash.defaults@4.2.0: - resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} - dev: false - - /lodash.isarguments@3.1.0: - resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} - dev: false - - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - - /lodash.throttle@4.1.1: - resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} - dev: true - - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: true - - /long@5.2.3: - resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} - dev: false - - /lru-cache@10.1.0: - resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} - engines: {node: 14 || >=16.14} - dev: false - - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - - /lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} - dev: false - - /lru-cache@8.0.5: - resolution: {integrity: sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==} - engines: {node: '>=16.14'} - dev: false - - /lru-queue@0.1.0: - resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} - dependencies: - es5-ext: 0.10.62 - dev: true - - /lucia@2.7.4: - resolution: {integrity: sha512-do6Aah5kX2DUl7N0CvELWV1/b+qZGF0AUmUrkthYeNfXfgx4RAkWi4BkAlgGDBB/0c1WApb18mUD1pA5qTaWmw==} - dev: false - - /magic-string@0.25.9: - resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} - dependencies: - sourcemap-codec: 1.4.8 - dev: true - - /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-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: false - - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: false - - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - dev: false - - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - dev: false - - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - 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: false - - /mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - dev: false - - /miniflare@3.20231030.1: - resolution: {integrity: sha512-Y+EkgV/aFg/3Y/xfFtImK36sLZGXvNS45avVEz0cUCA2pGpg4hGdPu1Udmz5b06SyeUEFVf/dEDMJwdRYVEgLw==} - 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.28.1 - workerd: 1.20231030.0 - ws: 8.14.2 - youch: 3.3.3 - zod: 3.22.4 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 - - /minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - dev: true - - /minimatch@7.4.6: - resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - dev: true - - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: false - - /mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - dev: false - - /mlly@1.4.2: - resolution: {integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==} - dependencies: - acorn: 8.11.2 - pathe: 1.1.1 - pkg-types: 1.0.3 - ufo: 1.3.2 - dev: false - - /mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} - dev: false - - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - /mustache@4.2.0: - resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} - hasBin: true - - /mysql2@3.6.5: - resolution: {integrity: sha512-pS/KqIb0xlXmtmqEuTvBXTmLoQ5LmAz5NW/r8UyQ1ldvnprNEj3P9GbmuQQ2J0A4LO+ynotGi6TbscPa8OUb+w==} - engines: {node: '>= 8.0'} - dependencies: - denque: 2.1.0 - generate-function: 2.3.1 - iconv-lite: 0.6.3 - long: 5.2.3 - lru-cache: 8.0.5 - named-placeholders: 1.1.3 - seq-queue: 0.0.5 - sqlstring: 2.3.3 - dev: false - - /named-placeholders@1.1.3: - resolution: {integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==} - engines: {node: '>=12.0.0'} - dependencies: - lru-cache: 7.18.3 - dev: false - - /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==} - dev: false - - /napi-wasm@1.1.0: - resolution: {integrity: sha512-lHwIAJbmLSjF9VDRm9GoVOy9AGp3aIvkjv+Kvz9h16QR3uSVYH78PNQUnT2U4X53mhlnV2M7wrhibQ3GHicDmg==} - dev: false - - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - - /next-tick@1.1.0: - resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - dev: true - - /node-abi@3.51.0: - resolution: {integrity: sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA==} - engines: {node: '>=10'} - dependencies: - semver: 7.5.4 - dev: false - - /node-addon-api@7.0.0: - resolution: {integrity: sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==} - dev: false - - /node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} - dev: false - - /node-fetch-native@1.4.1: - resolution: {integrity: sha512-NsXBU0UgBxo2rQLOeWNZqS3fvflWePMECr8CoSWoSTqCqGbVVsvl9vZu1HfQicYN0g5piV9Gh8RTEvo/uP752w==} - dev: false - - /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-fetch@3.3.2: - resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - data-uri-to-buffer: 4.0.1 - fetch-blob: 3.2.0 - formdata-polyfill: 4.0.10 - dev: false - - /node-forge@1.3.1: - resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} - engines: {node: '>= 6.13.0'} - - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - dependencies: - path-key: 3.1.1 - dev: false - - /ofetch@1.3.3: - resolution: {integrity: sha512-s1ZCMmQWXy4b5K/TW9i/DtiN8Ku+xCiHcjQ6/J/nDdssirrQNOoB165Zu8EqLMA2lln1JUth9a0aW9Ap2ctrUg==} - dependencies: - destr: 2.0.2 - node-fetch-native: 1.4.1 - ufo: 1.3.2 - dev: false - - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - dependencies: - mimic-fn: 2.1.0 - dev: false - - /openapi3-ts@4.1.2: - resolution: {integrity: sha512-B7gOkwsYMZO7BZXwJzXCuVagym2xhqsrilVvV0dnq2Di4+iLUXKVX9gOK23ZqaAHZOwABXN0QTdW8QnkUTX6DA==} - dependencies: - yaml: 2.3.4 - - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} - dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - - /oslo@0.23.1: - resolution: {integrity: sha512-E2cc4b+MVXiURqpWC4FpWGEGDOEGiH6EbI0Kowo3+m5MCK79hw3wBscfq6c6yRI1oo17OVqTiCLX3rupg2OAEA==} - dependencies: - '@node-rs/argon2': 1.5.2 - '@node-rs/bcrypt': 1.7.3 - dev: false - - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - dependencies: - yocto-queue: 0.1.0 - - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - dependencies: - p-limit: 3.1.0 - - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - dependencies: - callsites: 3.1.0 - - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - /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'} - dev: false - - /pathe@1.1.1: - resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} - dev: false - - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - /pkg-types@1.0.3: - resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} - dependencies: - jsonc-parser: 3.2.0 - mlly: 1.4.2 - pathe: 1.1.1 - dev: false - - /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 - - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - - /prettier@3.1.0: - resolution: {integrity: sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==} - engines: {node: '>=14'} - hasBin: true - dev: false - - /printable-characters@1.0.42: - resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} - - /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'} - - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - /radix3@1.1.0: - resolution: {integrity: sha512-pNsHDxbGORSvuSScqNJ+3Km6QAVqk8CfsCBIEoDgpqLrkD2f3QM4I7d1ozJJ172OmIcoUcerZaNWqtLkRXTV3A==} - dev: false - - /rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - dev: false - - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - dev: false - - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - - /redis-errors@1.2.0: - resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} - engines: {node: '>=4'} - dev: false - - /redis-parser@3.0.0: - resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} - engines: {node: '>=4'} - dependencies: - redis-errors: 1.2.0 - dev: false - - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - - /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'} - dev: true - - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true - dependencies: - glob: 7.2.3 - - /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. - 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 - dev: true - - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - dependencies: - queue-microtask: 1.2.3 - - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: false - - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: false - - /selfsigned@2.4.1: - resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} - engines: {node: '>=10'} - dependencies: - '@types/node-forge': 1.3.10 - node-forge: 1.3.1 - dev: true - - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - - /seq-queue@0.0.5: - resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==} - dev: false - - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: false - - /simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - dev: false - - /simple-get@4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 - 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: false - - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - /sourcemap-codec@1.4.8: - resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} - deprecated: Please use @jridgewell/sourcemap-codec instead - dev: true - - /sqlstring@2.3.3: - resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} - engines: {node: '>= 0.6'} - dev: false - - /stacktracey@2.1.8: - resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==} - dependencies: - as-table: 1.0.55 - get-source: 2.0.12 - - /standard-as-callback@2.1.0: - resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} - dev: false - - /std-env@3.5.0: - resolution: {integrity: sha512-JGUEaALvL0Mf6JCfYnJOTcobY+Nc7sG/TemDRBqCA0wEr4DER7zDchaaixTlmOxAjG1uRJmX82EQcxwTQTkqVA==} - dev: false - - /stoppable@1.1.0: - resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} - engines: {node: '>=4', npm: '>=6'} - - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - dependencies: - safe-buffer: 5.2.1 - dev: false - - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: false - - /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'} - - /superjson@2.2.1: - resolution: {integrity: sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==} - engines: {node: '>=16'} - dependencies: - copy-anything: 3.0.5 - dev: true - - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - - /tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.0 - tar-stream: 2.2.0 - dev: false - - /tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - 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 - - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - - /timers-ext@0.1.7: - resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==} - dependencies: - es5-ext: 0.10.62 - next-tick: 1.1.0 - dev: true - - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - dev: false - - /ts-api-utils@1.0.3(typescript@5.3.2): - resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} - engines: {node: '>=16.13.0'} - peerDependencies: - typescript: '>=4.2.0' - dependencies: - typescript: 5.3.2 - dev: false - - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - - /tsx@4.5.0: - resolution: {integrity: sha512-hgxdziy9KLaHh9KE+a6tIZFP6kb0MLq/1D0sJVifbGP4QVEYhy6+2FNn7MyCm1pMc63p9CW/L1OzdqTNPxs6rg==} - engines: {node: '>=18.0.0'} - hasBin: true - dependencies: - esbuild: 0.18.20 - get-tsconfig: 4.7.2 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - dependencies: - safe-buffer: 5.2.1 - dev: false - - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - - /type@1.2.0: - resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} - dev: true - - /type@2.7.2: - resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} - dev: true - - /typescript@5.3.2: - resolution: {integrity: sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==} - engines: {node: '>=14.17'} - hasBin: true - - /ufo@1.3.2: - resolution: {integrity: sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==} - dev: false - - /uncrypto@0.1.3: - resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} - dev: false - - /undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - - /undici@5.28.1: - resolution: {integrity: sha512-xcIIvj1LOQH9zAL54iWFkuDEaIVEjLrru7qRpa3GrEEHk6OBhb/LycuUY2m7VCcTuDeLziXCxobQVyKExyGeIA==} - engines: {node: '>=14.0'} - dependencies: - '@fastify/busboy': 2.1.0 - - /unenv@1.8.0: - resolution: {integrity: sha512-uIGbdCWZfhRRmyKj1UioCepQ0jpq638j/Cf0xFTn4zD1nGJ2lSdzYHLzfdXN791oo/0juUiSWW1fBklXMTsuqg==} - dependencies: - consola: 3.2.3 - defu: 6.1.3 - mime: 3.0.0 - node-fetch-native: 1.4.1 - pathe: 1.1.1 - dev: false - - /unstorage@1.10.1: - resolution: {integrity: sha512-rWQvLRfZNBpF+x8D3/gda5nUCQL2PgXy2jNG4U7/Rc9BGEv9+CAJd0YyGCROUBKs9v49Hg8huw3aih5Bf5TAVw==} - peerDependencies: - '@azure/app-configuration': ^1.4.1 - '@azure/cosmos': ^4.0.0 - '@azure/data-tables': ^13.2.2 - '@azure/identity': ^3.3.2 - '@azure/keyvault-secrets': ^4.7.0 - '@azure/storage-blob': ^12.16.0 - '@capacitor/preferences': ^5.0.6 - '@netlify/blobs': ^6.2.0 - '@planetscale/database': ^1.11.0 - '@upstash/redis': ^1.23.4 - '@vercel/kv': ^0.2.3 - idb-keyval: ^6.2.1 - peerDependenciesMeta: - '@azure/app-configuration': - optional: true - '@azure/cosmos': - optional: true - '@azure/data-tables': - optional: true - '@azure/identity': - optional: true - '@azure/keyvault-secrets': - optional: true - '@azure/storage-blob': - optional: true - '@capacitor/preferences': - optional: true - '@netlify/blobs': - optional: true - '@planetscale/database': - optional: true - '@upstash/redis': - optional: true - '@vercel/kv': - optional: true - idb-keyval: - optional: true - dependencies: - anymatch: 3.1.3 - chokidar: 3.5.3 - destr: 2.0.2 - h3: 1.9.0 - ioredis: 5.3.2 - listhen: 1.5.5 - lru-cache: 10.1.0 - mri: 1.2.0 - node-fetch-native: 1.4.1 - ofetch: 1.3.3 - ufo: 1.3.2 - transitivePeerDependencies: - - supports-color - dev: false - - /untun@0.1.2: - resolution: {integrity: sha512-wLAMWvxfqyTiBODA1lg3IXHQtjggYLeTK7RnSfqtOXixWJ3bAa2kK/HHmOOg19upteqO3muLvN6O/icbyQY33Q==} - hasBin: true - dependencies: - citty: 0.1.5 - consola: 3.2.3 - pathe: 1.1.1 - dev: false - - /uqr@0.1.2: - resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==} - dev: false - - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - dependencies: - punycode: 2.3.1 - - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: false - - /uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - hasBin: true - dev: false - - /vscode-json-languageservice@4.2.1: - resolution: {integrity: sha512-xGmv9QIWs2H8obGbWg+sIPI/3/pFgj/5OWBhNzs00BkYQ9UaB2F6JJaGB/2/YOZJ3BvLXQTC4Q7muqU25QgAhA==} - dependencies: - jsonc-parser: 3.2.0 - vscode-languageserver-textdocument: 1.0.11 - vscode-languageserver-types: 3.17.5 - vscode-nls: 5.2.0 - vscode-uri: 3.0.8 - dev: true - - /vscode-languageserver-textdocument@1.0.11: - resolution: {integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==} - dev: true - - /vscode-languageserver-types@3.17.5: - resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} - dev: true - - /vscode-nls@5.2.0: - resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==} - dev: true - - /vscode-uri@3.0.8: - resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} - dev: true - - /web-streams-polyfill@3.2.1: - resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} - engines: {node: '>= 8'} - dev: false - - /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@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - - /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 - - /wrangler@3.17.1: - resolution: {integrity: sha512-Pr9+/tjFkthzG63uoVm1NtVvgokT6p92fy1UsOgrntHyTu0pZMC1VJzG0NC8Vhs+z/+yTT8AqVV6AiJb3w8ZOQ==} - engines: {node: '>=16.17.0'} - hasBin: true - 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.1 - 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 - dev: true - - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - /ws@8.14.2: - resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - /xxhash-wasm@1.0.2: - resolution: {integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==} - dev: true - - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - - /yaml@2.3.4: - resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} - engines: {node: '>= 14'} - - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - - /youch@3.3.3: - resolution: {integrity: sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==} - dependencies: - cookie: 0.5.0 - mustache: 4.2.0 - stacktracey: 2.1.8 - - /zod@3.22.4: - resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + /generate-function@2.3.1: + resolution: + { + integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==, + } + dependencies: + is-property: 1.0.2 + dev: false + + /get-port-please@3.1.1: + resolution: + { + integrity: sha512-3UBAyM3u4ZBVYDsxOQfJDxEa6XTbpBDrOjp4mf7ExFRt5BKs/QywQQiJsh2B+hxcZLSapWqCRvElUe8DnKcFHA==, + } + dev: false + + /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 + + /get-stream@6.0.1: + resolution: + { + integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==, + } + engines: { node: ">=10" } + dev: false + + /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" } + dependencies: + is-glob: 4.0.3 + + /glob-parent@6.0.2: + resolution: + { + integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, + } + engines: { node: ">=10.13.0" } + dependencies: + is-glob: 4.0.3 + + /glob-to-regexp@0.4.1: + resolution: + { + integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==, + } + + /glob@7.2.3: + resolution: + { + integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, + } + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /glob@8.1.0: + resolution: + { + integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==, + } + engines: { node: ">=12" } + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + dev: true + + /globals@13.23.0: + resolution: + { + integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==, + } + engines: { node: ">=8" } + dependencies: + type-fest: 0.20.2 + + /globby@11.1.0: + resolution: + { + integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, + } + engines: { node: ">=10" } + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.0 + merge2: 1.4.1 + slash: 3.0.0 + dev: false + + /graphemer@1.4.0: + resolution: + { + integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, + } + + /h3@1.9.0: + resolution: + { + integrity: sha512-+F3ZqrNV/CFXXfZ2lXBINHi+rM4Xw3CDC5z2CDK3NMPocjonKipGLLDSkrqY9DOrioZNPTIdDMWfQKm//3X2DA==, + } + dependencies: + cookie-es: 1.0.0 + defu: 6.1.3 + destr: 2.0.2 + iron-webcrypto: 1.0.0 + radix3: 1.1.0 + ufo: 1.3.2 + uncrypto: 0.1.3 + unenv: 1.8.0 + dev: false + + /hanji@0.0.5: + resolution: + { + integrity: sha512-Abxw1Lq+TnYiL4BueXqMau222fPSPMFtya8HdpWsz/xVAhifXou71mPh/kY2+08RgFcVccjG3uZHs6K5HAe3zw==, + } + dependencies: + lodash.throttle: 4.1.1 + sisteransi: 1.0.5 + dev: true + + /has-flag@4.0.0: + resolution: + { + integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, + } + engines: { node: ">=8" } + + /heap@0.2.7: + resolution: + { + integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==, + } + dev: true + + /hono@3.10.2: + resolution: + { + integrity: sha512-QwJLjWs3e+nZ3b5nQrrdJpYCJqiTK744jeYhX7yhZdxwcQ3KIohBfzI2dA8gSF6HEZkmFUdiKL1BelJ8utIm4w==, + } + engines: { node: ">=16.0.0" } + dev: false + + /http-shutdown@1.2.2: + resolution: + { + integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==, + } + engines: { iojs: ">= 1.0.0", node: ">= 0.12.0" } + dev: false + + /human-signals@2.1.0: + resolution: + { + integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==, + } + engines: { node: ">=10.17.0" } + dev: false + + /husky@8.0.3: + resolution: + { + integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==, + } + engines: { node: ">=14" } + hasBin: true + dev: true + + /iconv-lite@0.6.3: + resolution: + { + integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, + } + 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@5.3.0: + resolution: + { + integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==, + } + engines: { node: ">= 4" } + + /import-fresh@3.3.0: + resolution: + { + integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, + } + engines: { node: ">=6" } + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + /imurmurhash@0.1.4: + resolution: + { + integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, + } + engines: { node: ">=0.8.19" } + + /inflight@1.0.6: + resolution: + { + integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, + } + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits@2.0.4: + resolution: + { + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, + } + + /ini@1.3.8: + resolution: + { + integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, + } + dev: false + + /ioredis@5.3.2: + resolution: + { + integrity: sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==, + } + engines: { node: ">=12.22.0" } + dependencies: + "@ioredis/commands": 1.2.0 + cluster-key-slot: 1.1.2 + debug: 4.3.4 + denque: 2.1.0 + lodash.defaults: 4.2.0 + lodash.isarguments: 3.1.0 + redis-errors: 1.2.0 + redis-parser: 3.0.0 + standard-as-callback: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /iron-webcrypto@1.0.0: + resolution: + { + integrity: sha512-anOK1Mktt8U1Xi7fCM3RELTuYbnFikQY5VtrDj7kPgpejV7d43tWKhzgioO0zpkazLEL/j/iayRqnJhrGfqUsg==, + } + dev: false + + /is-binary-path@2.1.0: + resolution: + { + integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, + } + engines: { node: ">=8" } + dependencies: + binary-extensions: 2.2.0 + + /is-docker@2.2.1: + resolution: + { + integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==, + } + engines: { node: ">=8" } + hasBin: true + dev: false + + /is-extglob@2.1.1: + resolution: + { + integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, + } + engines: { node: ">=0.10.0" } + + /is-glob@4.0.3: + resolution: + { + integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, + } + engines: { node: ">=0.10.0" } + dependencies: + is-extglob: 2.1.1 + + /is-number@7.0.0: + resolution: + { + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, + } + engines: { node: ">=0.12.0" } + + /is-path-inside@3.0.3: + resolution: + { + integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, + } + engines: { node: ">=8" } + + /is-promise@2.2.2: + resolution: + { + integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==, + } + dev: true + + /is-property@1.0.2: + resolution: + { + integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==, + } + dev: false + + /is-stream@2.0.1: + resolution: + { + integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, + } + engines: { node: ">=8" } + dev: false + + /is-what@4.1.16: + resolution: + { + integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==, + } + engines: { node: ">=12.13" } + dev: true + + /is-wsl@2.2.0: + resolution: + { + integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==, + } + engines: { node: ">=8" } + dependencies: + is-docker: 2.2.1 + dev: false + + /isexe@2.0.0: + resolution: + { + integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, + } + + /jiti@1.21.0: + resolution: + { + integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==, + } + hasBin: true + dev: false + + /js-base64@3.7.5: + resolution: + { + integrity: sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==, + } + dev: false + + /js-yaml@4.1.0: + resolution: + { + integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, + } + hasBin: true + dependencies: + argparse: 2.0.1 + + /json-buffer@3.0.1: + resolution: + { + integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, + } + + /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-schema-traverse@0.4.1: + resolution: + { + integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, + } + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: + { + integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, + } + + /jsonc-parser@3.2.0: + resolution: + { + integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==, + } + + /keyv@4.5.4: + resolution: + { + integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, + } + dependencies: + json-buffer: 3.0.1 + + /levn@0.4.1: + resolution: + { + integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, + } + engines: { node: ">= 0.8.0" } + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + /libsql@0.2.0-pre.2: + resolution: + { + integrity: sha512-ErF11J/Q0Uo1TMceX1f7RKfFvQ/j4FS8TagzJnAZBwhHsPcr7uItkSTchkuRHm5+cE4dJO7lqf+MpmlDjp/qAQ==, + } + cpu: [x64, arm64] + os: [darwin, linux, win32] + dependencies: + "@neon-rs/load": 0.0.4 + detect-libc: 2.0.2 + optionalDependencies: + "@libsql/darwin-arm64": 0.2.0-pre.2 + "@libsql/darwin-x64": 0.2.0-pre.2 + "@libsql/linux-arm64-gnu": 0.2.0-pre.2 + "@libsql/linux-arm64-musl": 0.2.0-pre.2 + "@libsql/linux-x64-gnu": 0.2.0-pre.2 + "@libsql/linux-x64-musl": 0.2.0-pre.2 + "@libsql/win32-x64-msvc": 0.2.0-pre.2 + dev: false + + /listhen@1.5.5: + resolution: + { + integrity: sha512-LXe8Xlyh3gnxdv4tSjTjscD1vpr/2PRpzq8YIaMJgyKzRG8wdISlWVWnGThJfHnlJ6hmLt2wq1yeeix0TEbuoA==, + } + hasBin: true + dependencies: + "@parcel/watcher": 2.3.0 + "@parcel/watcher-wasm": 2.3.0 + citty: 0.1.5 + clipboardy: 3.0.0 + consola: 3.2.3 + defu: 6.1.3 + get-port-please: 3.1.1 + h3: 1.9.0 + http-shutdown: 1.2.2 + jiti: 1.21.0 + mlly: 1.4.2 + node-forge: 1.3.1 + pathe: 1.1.1 + std-env: 3.5.0 + ufo: 1.3.2 + untun: 0.1.2 + uqr: 0.1.2 + dev: false + + /locate-path@6.0.0: + resolution: + { + integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, + } + engines: { node: ">=10" } + dependencies: + p-locate: 5.0.0 + + /lodash.defaults@4.2.0: + resolution: + { + integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==, + } + dev: false + + /lodash.isarguments@3.1.0: + resolution: + { + integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==, + } + dev: false + + /lodash.merge@4.6.2: + resolution: + { + integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, + } + + /lodash.throttle@4.1.1: + resolution: + { + integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==, + } + dev: true + + /lodash@4.17.21: + resolution: + { + integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, + } + dev: true + + /long@5.2.3: + resolution: + { + integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==, + } + dev: false + + /lru-cache@10.1.0: + resolution: + { + integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==, + } + engines: { node: 14 || >=16.14 } + dev: false + + /lru-cache@6.0.0: + resolution: + { + integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, + } + engines: { node: ">=10" } + dependencies: + yallist: 4.0.0 + + /lru-cache@7.18.3: + resolution: + { + integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==, + } + engines: { node: ">=12" } + dev: false + + /lru-cache@8.0.5: + resolution: + { + integrity: sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==, + } + engines: { node: ">=16.14" } + dev: false + + /lru-queue@0.1.0: + resolution: + { + integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==, + } + dependencies: + es5-ext: 0.10.62 + dev: true + + /lucia@2.7.4: + resolution: + { + integrity: sha512-do6Aah5kX2DUl7N0CvELWV1/b+qZGF0AUmUrkthYeNfXfgx4RAkWi4BkAlgGDBB/0c1WApb18mUD1pA5qTaWmw==, + } + dev: false + + /magic-string@0.25.9: + resolution: + { + integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==, + } + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /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-stream@2.0.0: + resolution: + { + integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, + } + dev: false + + /merge2@1.4.1: + resolution: + { + integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, + } + engines: { node: ">= 8" } + dev: false + + /micromatch@4.0.5: + resolution: + { + integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, + } + engines: { node: ">=8.6" } + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: false + + /mime-db@1.52.0: + resolution: + { + integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, + } + engines: { node: ">= 0.6" } + dev: false + + /mime-types@2.1.35: + resolution: + { + integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, + } + engines: { node: ">= 0.6" } + dependencies: + mime-db: 1.52.0 + 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: false + + /mimic-response@3.1.0: + resolution: + { + integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==, + } + engines: { node: ">=10" } + dev: false + + /miniflare@3.20231030.1: + resolution: + { + integrity: sha512-Y+EkgV/aFg/3Y/xfFtImK36sLZGXvNS45avVEz0cUCA2pGpg4hGdPu1Udmz5b06SyeUEFVf/dEDMJwdRYVEgLw==, + } + 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.28.1 + workerd: 1.20231030.0 + ws: 8.14.2 + youch: 3.3.3 + zod: 3.22.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + /minimatch@3.1.2: + resolution: + { + integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, + } + dependencies: + brace-expansion: 1.1.11 + + /minimatch@5.1.6: + resolution: + { + integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==, + } + engines: { node: ">=10" } + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimatch@7.4.6: + resolution: + { + integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==, + } + engines: { node: ">=10" } + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimist@1.2.8: + resolution: + { + integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, + } + dev: false + + /mkdirp-classic@0.5.3: + resolution: + { + integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==, + } + dev: false + + /mlly@1.4.2: + resolution: + { + integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==, + } + dependencies: + acorn: 8.11.2 + pathe: 1.1.1 + pkg-types: 1.0.3 + ufo: 1.3.2 + dev: false + + /mri@1.2.0: + resolution: + { + integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==, + } + engines: { node: ">=4" } + dev: false + + /ms@2.1.2: + resolution: + { + integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, + } + + /mustache@4.2.0: + resolution: + { + integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==, + } + hasBin: true + + /mysql2@3.6.5: + resolution: + { + integrity: sha512-pS/KqIb0xlXmtmqEuTvBXTmLoQ5LmAz5NW/r8UyQ1ldvnprNEj3P9GbmuQQ2J0A4LO+ynotGi6TbscPa8OUb+w==, + } + engines: { node: ">= 8.0" } + dependencies: + denque: 2.1.0 + generate-function: 2.3.1 + iconv-lite: 0.6.3 + long: 5.2.3 + lru-cache: 8.0.5 + named-placeholders: 1.1.3 + seq-queue: 0.0.5 + sqlstring: 2.3.3 + dev: false + + /named-placeholders@1.1.3: + resolution: + { + integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==, + } + engines: { node: ">=12.0.0" } + dependencies: + lru-cache: 7.18.3 + dev: false + + /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==, + } + dev: false + + /napi-wasm@1.1.0: + resolution: + { + integrity: sha512-lHwIAJbmLSjF9VDRm9GoVOy9AGp3aIvkjv+Kvz9h16QR3uSVYH78PNQUnT2U4X53mhlnV2M7wrhibQ3GHicDmg==, + } + dev: false + + /natural-compare@1.4.0: + resolution: + { + integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, + } + + /next-tick@1.1.0: + resolution: + { + integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==, + } + dev: true + + /node-abi@3.51.0: + resolution: + { + integrity: sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA==, + } + engines: { node: ">=10" } + dependencies: + semver: 7.5.4 + dev: false + + /node-addon-api@7.0.0: + resolution: + { + integrity: sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==, + } + dev: false + + /node-domexception@1.0.0: + resolution: + { + integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==, + } + engines: { node: ">=10.5.0" } + dev: false + + /node-fetch-native@1.4.1: + resolution: + { + integrity: sha512-NsXBU0UgBxo2rQLOeWNZqS3fvflWePMECr8CoSWoSTqCqGbVVsvl9vZu1HfQicYN0g5piV9Gh8RTEvo/uP752w==, + } + dev: false + + /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-fetch@3.3.2: + resolution: + { + integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + dev: false + + /node-forge@1.3.1: + resolution: + { + integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==, + } + engines: { node: ">= 6.13.0" } + + /normalize-path@3.0.0: + resolution: + { + integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, + } + engines: { node: ">=0.10.0" } + + /npm-run-path@4.0.1: + resolution: + { + integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==, + } + engines: { node: ">=8" } + dependencies: + path-key: 3.1.1 + dev: false + + /ofetch@1.3.3: + resolution: + { + integrity: sha512-s1ZCMmQWXy4b5K/TW9i/DtiN8Ku+xCiHcjQ6/J/nDdssirrQNOoB165Zu8EqLMA2lln1JUth9a0aW9Ap2ctrUg==, + } + dependencies: + destr: 2.0.2 + node-fetch-native: 1.4.1 + ufo: 1.3.2 + dev: false + + /once@1.4.0: + resolution: + { + integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, + } + dependencies: + wrappy: 1.0.2 + + /onetime@5.1.2: + resolution: + { + integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, + } + engines: { node: ">=6" } + dependencies: + mimic-fn: 2.1.0 + dev: false + + /openapi3-ts@4.1.2: + resolution: + { + integrity: sha512-B7gOkwsYMZO7BZXwJzXCuVagym2xhqsrilVvV0dnq2Di4+iLUXKVX9gOK23ZqaAHZOwABXN0QTdW8QnkUTX6DA==, + } + dependencies: + yaml: 2.3.4 + + /optionator@0.9.3: + resolution: + { + integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==, + } + engines: { node: ">= 0.8.0" } + dependencies: + "@aashutoshrathi/word-wrap": 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + + /oslo@0.23.1: + resolution: + { + integrity: sha512-E2cc4b+MVXiURqpWC4FpWGEGDOEGiH6EbI0Kowo3+m5MCK79hw3wBscfq6c6yRI1oo17OVqTiCLX3rupg2OAEA==, + } + dependencies: + "@node-rs/argon2": 1.5.2 + "@node-rs/bcrypt": 1.7.3 + dev: false + + /p-limit@3.1.0: + resolution: + { + integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, + } + engines: { node: ">=10" } + dependencies: + yocto-queue: 0.1.0 + + /p-locate@5.0.0: + resolution: + { + integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, + } + engines: { node: ">=10" } + dependencies: + p-limit: 3.1.0 + + /parent-module@1.0.1: + resolution: + { + integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, + } + engines: { node: ">=6" } + dependencies: + callsites: 3.1.0 + + /path-exists@4.0.0: + resolution: + { + integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, + } + engines: { node: ">=8" } + + /path-is-absolute@1.0.1: + resolution: + { + integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, + } + engines: { node: ">=0.10.0" } + + /path-key@3.1.1: + resolution: + { + integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, + } + engines: { node: ">=8" } + + /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" } + dev: false + + /pathe@1.1.1: + resolution: + { + integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==, + } + dev: false + + /picomatch@2.3.1: + resolution: + { + integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, + } + engines: { node: ">=8.6" } + + /pkg-types@1.0.3: + resolution: + { + integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==, + } + dependencies: + jsonc-parser: 3.2.0 + mlly: 1.4.2 + pathe: 1.1.1 + dev: false + + /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 + + /prelude-ls@1.2.1: + resolution: + { + integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, + } + engines: { node: ">= 0.8.0" } + + /prettier@3.1.0: + resolution: + { + integrity: sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==, + } + engines: { node: ">=14" } + hasBin: true + dev: false + + /printable-characters@1.0.42: + resolution: + { + integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==, + } + + /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" } + + /queue-microtask@1.2.3: + resolution: + { + integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, + } + + /radix3@1.1.0: + resolution: + { + integrity: sha512-pNsHDxbGORSvuSScqNJ+3Km6QAVqk8CfsCBIEoDgpqLrkD2f3QM4I7d1ozJJ172OmIcoUcerZaNWqtLkRXTV3A==, + } + dev: false + + /rc@1.2.8: + resolution: + { + integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==, + } + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: false + + /readable-stream@3.6.2: + resolution: + { + integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, + } + engines: { node: ">= 6" } + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + + /readdirp@3.6.0: + resolution: + { + integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, + } + engines: { node: ">=8.10.0" } + dependencies: + picomatch: 2.3.1 + + /redis-errors@1.2.0: + resolution: + { + integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==, + } + engines: { node: ">=4" } + dev: false + + /redis-parser@3.0.0: + resolution: + { + integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==, + } + engines: { node: ">=4" } + dependencies: + redis-errors: 1.2.0 + dev: false + + /resolve-from@4.0.0: + resolution: + { + integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, + } + engines: { node: ">=4" } + + /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" } + dev: true + + /reusify@1.0.4: + resolution: + { + integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, + } + engines: { iojs: ">=1.0.0", node: ">=0.10.0" } + + /rimraf@3.0.2: + resolution: + { + integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, + } + hasBin: true + dependencies: + glob: 7.2.3 + + /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. + 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 + dev: true + + /run-parallel@1.2.0: + resolution: + { + integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, + } + dependencies: + queue-microtask: 1.2.3 + + /safe-buffer@5.2.1: + resolution: + { + integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, + } + dev: false + + /safer-buffer@2.1.2: + resolution: + { + integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, + } + dev: false + + /selfsigned@2.4.1: + resolution: + { + integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==, + } + engines: { node: ">=10" } + dependencies: + "@types/node-forge": 1.3.10 + node-forge: 1.3.1 + dev: true + + /semver@7.5.4: + resolution: + { + integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==, + } + engines: { node: ">=10" } + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /seq-queue@0.0.5: + resolution: + { + integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==, + } + dev: false + + /shebang-command@2.0.0: + resolution: + { + integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, + } + engines: { node: ">=8" } + dependencies: + shebang-regex: 3.0.0 + + /shebang-regex@3.0.0: + resolution: + { + integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, + } + engines: { node: ">=8" } + + /signal-exit@3.0.7: + resolution: + { + integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, + } + dev: false + + /simple-concat@1.0.1: + resolution: + { + integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==, + } + dev: false + + /simple-get@4.0.1: + resolution: + { + integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==, + } + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + 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: false + + /source-map-support@0.5.21: + resolution: + { + integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, + } + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + /source-map@0.6.1: + resolution: + { + integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, + } + engines: { node: ">=0.10.0" } + + /sourcemap-codec@1.4.8: + resolution: + { + integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==, + } + deprecated: Please use @jridgewell/sourcemap-codec instead + dev: true + + /sqlstring@2.3.3: + resolution: + { + integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==, + } + engines: { node: ">= 0.6" } + dev: false + + /stacktracey@2.1.8: + resolution: + { + integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==, + } + dependencies: + as-table: 1.0.55 + get-source: 2.0.12 + + /standard-as-callback@2.1.0: + resolution: + { + integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==, + } + dev: false + + /std-env@3.5.0: + resolution: + { + integrity: sha512-JGUEaALvL0Mf6JCfYnJOTcobY+Nc7sG/TemDRBqCA0wEr4DER7zDchaaixTlmOxAjG1uRJmX82EQcxwTQTkqVA==, + } + dev: false + + /stoppable@1.1.0: + resolution: + { + integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==, + } + engines: { node: ">=4", npm: ">=6" } + + /string_decoder@1.3.0: + resolution: + { + integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, + } + dependencies: + safe-buffer: 5.2.1 + dev: false + + /strip-ansi@6.0.1: + resolution: + { + integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, + } + engines: { node: ">=8" } + dependencies: + ansi-regex: 5.0.1 + + /strip-final-newline@2.0.0: + resolution: + { + integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==, + } + engines: { node: ">=6" } + dev: false + + /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" } + + /superjson@2.2.1: + resolution: + { + integrity: sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==, + } + engines: { node: ">=16" } + dependencies: + copy-anything: 3.0.5 + dev: true + + /supports-color@7.2.0: + resolution: + { + integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, + } + engines: { node: ">=8" } + dependencies: + has-flag: 4.0.0 + + /tar-fs@2.1.1: + resolution: + { + integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==, + } + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: false + + /tar-stream@2.2.0: + resolution: + { + integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==, + } + engines: { node: ">=6" } + 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 + + /text-table@0.2.0: + resolution: + { + integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, + } + + /timers-ext@0.1.7: + resolution: + { + integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==, + } + dependencies: + es5-ext: 0.10.62 + next-tick: 1.1.0 + dev: true + + /to-regex-range@5.0.1: + resolution: + { + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, + } + engines: { node: ">=8.0" } + dependencies: + is-number: 7.0.0 + + /tr46@0.0.3: + resolution: + { + integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, + } + dev: false + + /ts-api-utils@1.0.3(typescript@5.3.2): + resolution: + { + integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==, + } + engines: { node: ">=16.13.0" } + peerDependencies: + typescript: ">=4.2.0" + dependencies: + typescript: 5.3.2 + dev: false + + /tslib@2.6.2: + resolution: + { + integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==, + } + + /tsx@4.5.0: + resolution: + { + integrity: sha512-hgxdziy9KLaHh9KE+a6tIZFP6kb0MLq/1D0sJVifbGP4QVEYhy6+2FNn7MyCm1pMc63p9CW/L1OzdqTNPxs6rg==, + } + engines: { node: ">=18.0.0" } + hasBin: true + dependencies: + esbuild: 0.18.20 + get-tsconfig: 4.7.2 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /tunnel-agent@0.6.0: + resolution: + { + integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==, + } + dependencies: + safe-buffer: 5.2.1 + dev: false + + /type-check@0.4.0: + resolution: + { + integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, + } + engines: { node: ">= 0.8.0" } + dependencies: + prelude-ls: 1.2.1 + + /type-fest@0.20.2: + resolution: + { + integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==, + } + engines: { node: ">=10" } + + /type@1.2.0: + resolution: + { + integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==, + } + dev: true + + /type@2.7.2: + resolution: + { + integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==, + } + dev: true + + /typescript@5.3.2: + resolution: + { + integrity: sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==, + } + engines: { node: ">=14.17" } + hasBin: true + + /ufo@1.3.2: + resolution: + { + integrity: sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==, + } + dev: false + + /uncrypto@0.1.3: + resolution: + { + integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==, + } + dev: false + + /undici-types@5.26.5: + resolution: + { + integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==, + } + + /undici@5.28.1: + resolution: + { + integrity: sha512-xcIIvj1LOQH9zAL54iWFkuDEaIVEjLrru7qRpa3GrEEHk6OBhb/LycuUY2m7VCcTuDeLziXCxobQVyKExyGeIA==, + } + engines: { node: ">=14.0" } + dependencies: + "@fastify/busboy": 2.1.0 + + /unenv@1.8.0: + resolution: + { + integrity: sha512-uIGbdCWZfhRRmyKj1UioCepQ0jpq638j/Cf0xFTn4zD1nGJ2lSdzYHLzfdXN791oo/0juUiSWW1fBklXMTsuqg==, + } + dependencies: + consola: 3.2.3 + defu: 6.1.3 + mime: 3.0.0 + node-fetch-native: 1.4.1 + pathe: 1.1.1 + dev: false + + /unstorage@1.10.1: + resolution: + { + integrity: sha512-rWQvLRfZNBpF+x8D3/gda5nUCQL2PgXy2jNG4U7/Rc9BGEv9+CAJd0YyGCROUBKs9v49Hg8huw3aih5Bf5TAVw==, + } + peerDependencies: + "@azure/app-configuration": ^1.4.1 + "@azure/cosmos": ^4.0.0 + "@azure/data-tables": ^13.2.2 + "@azure/identity": ^3.3.2 + "@azure/keyvault-secrets": ^4.7.0 + "@azure/storage-blob": ^12.16.0 + "@capacitor/preferences": ^5.0.6 + "@netlify/blobs": ^6.2.0 + "@planetscale/database": ^1.11.0 + "@upstash/redis": ^1.23.4 + "@vercel/kv": ^0.2.3 + idb-keyval: ^6.2.1 + peerDependenciesMeta: + "@azure/app-configuration": + optional: true + "@azure/cosmos": + optional: true + "@azure/data-tables": + optional: true + "@azure/identity": + optional: true + "@azure/keyvault-secrets": + optional: true + "@azure/storage-blob": + optional: true + "@capacitor/preferences": + optional: true + "@netlify/blobs": + optional: true + "@planetscale/database": + optional: true + "@upstash/redis": + optional: true + "@vercel/kv": + optional: true + idb-keyval: + optional: true + dependencies: + anymatch: 3.1.3 + chokidar: 3.5.3 + destr: 2.0.2 + h3: 1.9.0 + ioredis: 5.3.2 + listhen: 1.5.5 + lru-cache: 10.1.0 + mri: 1.2.0 + node-fetch-native: 1.4.1 + ofetch: 1.3.3 + ufo: 1.3.2 + transitivePeerDependencies: + - supports-color + dev: false + + /untun@0.1.2: + resolution: + { + integrity: sha512-wLAMWvxfqyTiBODA1lg3IXHQtjggYLeTK7RnSfqtOXixWJ3bAa2kK/HHmOOg19upteqO3muLvN6O/icbyQY33Q==, + } + hasBin: true + dependencies: + citty: 0.1.5 + consola: 3.2.3 + pathe: 1.1.1 + dev: false + + /uqr@0.1.2: + resolution: + { + integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==, + } + dev: false + + /uri-js@4.4.1: + resolution: + { + integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, + } + dependencies: + punycode: 2.3.1 + + /util-deprecate@1.0.2: + resolution: + { + integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, + } + dev: false + + /uuid@9.0.1: + resolution: + { + integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==, + } + hasBin: true + dev: false + + /vscode-json-languageservice@4.2.1: + resolution: + { + integrity: sha512-xGmv9QIWs2H8obGbWg+sIPI/3/pFgj/5OWBhNzs00BkYQ9UaB2F6JJaGB/2/YOZJ3BvLXQTC4Q7muqU25QgAhA==, + } + dependencies: + jsonc-parser: 3.2.0 + vscode-languageserver-textdocument: 1.0.11 + vscode-languageserver-types: 3.17.5 + vscode-nls: 5.2.0 + vscode-uri: 3.0.8 + dev: true + + /vscode-languageserver-textdocument@1.0.11: + resolution: + { + integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==, + } + dev: true + + /vscode-languageserver-types@3.17.5: + resolution: + { + integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==, + } + dev: true + + /vscode-nls@5.2.0: + resolution: + { + integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==, + } + dev: true + + /vscode-uri@3.0.8: + resolution: + { + integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==, + } + dev: true + + /web-streams-polyfill@3.2.1: + resolution: + { + integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==, + } + engines: { node: ">= 8" } + dev: false + + /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@2.0.2: + resolution: + { + integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, + } + engines: { node: ">= 8" } + hasBin: true + dependencies: + isexe: 2.0.0 + + /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 + + /wrangler@3.17.1: + resolution: + { + integrity: sha512-Pr9+/tjFkthzG63uoVm1NtVvgokT6p92fy1UsOgrntHyTu0pZMC1VJzG0NC8Vhs+z/+yTT8AqVV6AiJb3w8ZOQ==, + } + engines: { node: ">=16.17.0" } + hasBin: true + 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.1 + 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 + dev: true + + /wrappy@1.0.2: + resolution: + { + integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, + } + + /ws@8.14.2: + resolution: + { + integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==, + } + engines: { node: ">=10.0.0" } + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + /xxhash-wasm@1.0.2: + resolution: + { + integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==, + } + dev: true + + /yallist@4.0.0: + resolution: + { + integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, + } + + /yaml@2.3.4: + resolution: + { + integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==, + } + engines: { node: ">= 14" } + + /yocto-queue@0.1.0: + resolution: + { + integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, + } + engines: { node: ">=10" } + + /youch@3.3.3: + resolution: + { + integrity: sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==, + } + dependencies: + cookie: 0.5.0 + mustache: 4.2.0 + stacktracey: 2.1.8 + + /zod@3.22.4: + resolution: + { + integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==, + } diff --git a/src/v2/db/drizzle.ts b/src/v2/db/drizzle.ts index 9fdad06..562e061 100644 --- a/src/v2/db/drizzle.ts +++ b/src/v2/db/drizzle.ts @@ -8,13 +8,16 @@ export const tableNames = { assetLikes: "assetLikes", userCollectionLikes: "userCollectionLikes", game: "game", + gameLikes: "gameLikes", atlas: "atlas", atlasToAsset: "atlasToAsset", assetTag: "assetTag", + assetTagLikes: "assetTagLikes", assetTagAsset: "assetTagAsset", emailVerificationToken: "emailVerificationToken", passwordResetToken: "passwordResetToken", assetCategory: "assetCategory", + assetCategoryLikes: "assetCategoryLikes", savedOcGenerators: "savedOcGenerators", userFavorite: "userFavorite", userFavoriteAsset: "userFavoriteAsset", diff --git a/src/v2/db/migrations/0000_shiny_valkyrie.sql b/src/v2/db/migrations/0000_spotty_iron_monger.sql similarity index 89% rename from src/v2/db/migrations/0000_shiny_valkyrie.sql rename to src/v2/db/migrations/0000_spotty_iron_monger.sql index bac2148..8eabf56 100644 --- a/src/v2/db/migrations/0000_shiny_valkyrie.sql +++ b/src/v2/db/migrations/0000_spotty_iron_monger.sql @@ -22,6 +22,31 @@ CREATE TABLE `asset` ( FOREIGN KEY (`uploaded_by_name`) REFERENCES `authUser`(`username`) ON UPDATE cascade ON DELETE cascade ); --> statement-breakpoint +CREATE TABLE `atlas` ( + `id` text NOT NULL, + `url` text NOT NULL, + `uploaded_by` text NOT NULL, + `uploaded_by_name` text NOT NULL, + `uploaded_date` integer NOT NULL, + `file_size` integer DEFAULT 0 NOT NULL +); +--> statement-breakpoint +CREATE TABLE `atlasToAsset` ( + `id` text, + `atlas_id` text NOT NULL, + `asset_id` integer NOT NULL, + FOREIGN KEY (`atlas_id`) REFERENCES `atlas`(`id`) ON UPDATE cascade ON DELETE cascade, + FOREIGN KEY (`asset_id`) REFERENCES `asset`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `assetLikes` ( + `asset_id` text NOT NULL, + `liked_by_id` text NOT NULL, + `created_at` text NOT NULL, + FOREIGN KEY (`asset_id`) REFERENCES `asset`(`id`) ON UPDATE no action ON DELETE no action, + FOREIGN KEY (`liked_by_id`) REFERENCES `authUser`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint CREATE TABLE `assetCategory` ( `id` text NOT NULL, `name` text NOT NULL, @@ -37,55 +62,54 @@ CREATE TABLE `gameAssetCategory` ( FOREIGN KEY (`asset_category_id`) REFERENCES `assetCategory`(`id`) ON UPDATE cascade ON DELETE cascade ); --> statement-breakpoint -CREATE TABLE `assetTag` ( +CREATE TABLE `assetCategoryLikes` ( + `asset_id` text NOT NULL, + `liked_by_id` text NOT NULL, + `created_at` text NOT NULL, + FOREIGN KEY (`asset_id`) REFERENCES `assetCategory`(`id`) ON UPDATE no action ON DELETE no action, + FOREIGN KEY (`liked_by_id`) REFERENCES `authUser`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE TABLE `game` ( `id` text NOT NULL, `name` text NOT NULL, `formatted_name` text NOT NULL, - `asset_count` integer DEFAULT 0 NOT NULL, + `asset_count` integer DEFAULT 0, + `possible_suggestive_content` integer DEFAULT 0 NOT NULL, `last_updated` text NOT NULL ); --> statement-breakpoint -CREATE TABLE `assetTagAsset` ( - `asset_tag_id` text NOT NULL, - `asset_id` integer NOT NULL, - FOREIGN KEY (`asset_tag_id`) REFERENCES `assetTag`(`id`) ON UPDATE cascade ON DELETE cascade, - FOREIGN KEY (`asset_id`) REFERENCES `asset`(`id`) ON UPDATE cascade ON DELETE cascade +CREATE TABLE `gameLikes` ( + `asset_id` text NOT NULL, + `liked_by_id` text NOT NULL, + `created_at` text NOT NULL, + FOREIGN KEY (`asset_id`) REFERENCES `game`(`id`) ON UPDATE no action ON DELETE no action, + FOREIGN KEY (`liked_by_id`) REFERENCES `authUser`(`id`) ON UPDATE no action ON DELETE no action ); --> statement-breakpoint -CREATE TABLE `atlas` ( +CREATE TABLE `assetTag` ( `id` text NOT NULL, - `url` text NOT NULL, - `uploaded_by` text NOT NULL, - `uploaded_by_name` text NOT NULL, - `uploaded_date` integer NOT NULL, - `file_size` integer DEFAULT 0 NOT NULL + `name` text NOT NULL, + `formatted_name` text NOT NULL, + `asset_count` integer DEFAULT 0 NOT NULL, + `last_updated` text NOT NULL ); --> statement-breakpoint -CREATE TABLE `atlasToAsset` ( - `id` text, - `atlas_id` text NOT NULL, +CREATE TABLE `assetTagAsset` ( + `asset_tag_id` text NOT NULL, `asset_id` integer NOT NULL, - FOREIGN KEY (`atlas_id`) REFERENCES `atlas`(`id`) ON UPDATE cascade ON DELETE cascade, + FOREIGN KEY (`asset_tag_id`) REFERENCES `assetTag`(`id`) ON UPDATE cascade ON DELETE cascade, FOREIGN KEY (`asset_id`) REFERENCES `asset`(`id`) ON UPDATE cascade ON DELETE cascade ); --> statement-breakpoint -CREATE TABLE `assetLikes` ( +CREATE TABLE `assetTagLikes` ( `asset_id` text NOT NULL, `liked_by_id` text NOT NULL, `created_at` text NOT NULL, - FOREIGN KEY (`asset_id`) REFERENCES `authUser`(`id`) ON UPDATE no action ON DELETE no action, + FOREIGN KEY (`asset_id`) REFERENCES `assetTag`(`id`) ON UPDATE no action ON DELETE no action, FOREIGN KEY (`liked_by_id`) REFERENCES `authUser`(`id`) ON UPDATE no action ON DELETE no action ); --> statement-breakpoint -CREATE TABLE `game` ( - `id` text NOT NULL, - `name` text NOT NULL, - `formatted_name` text NOT NULL, - `asset_count` integer DEFAULT 0, - `possible_suggestive_content` integer DEFAULT 0 NOT NULL, - `last_updated` text NOT NULL -); ---> statement-breakpoint CREATE TABLE `savedOcGenerators` ( `id` text NOT NULL, `user_id` text NOT NULL, @@ -209,18 +233,6 @@ CREATE INDEX `assets_name_idx` ON `asset` (`name`);--> statement-breakpoint CREATE INDEX `assets_game_name_idx` ON `asset` (`game`);--> statement-breakpoint CREATE INDEX `assets_asset_category_name_idx` ON `asset` (`asset_category`);--> statement-breakpoint CREATE INDEX `assets_uploaded_by_id_idx` ON `asset` (`uploaded_by_id`);--> statement-breakpoint -CREATE UNIQUE INDEX `assetCategory_id_unique` ON `assetCategory` (`id`);--> statement-breakpoint -CREATE UNIQUE INDEX `assetCategory_name_unique` ON `assetCategory` (`name`);--> statement-breakpoint -CREATE INDEX `asset_category_id_idx` ON `assetCategory` (`id`);--> statement-breakpoint -CREATE INDEX `asset_category_name_idx` ON `assetCategory` (`name`);--> statement-breakpoint -CREATE INDEX `game_asset_category_game_id_idx` ON `gameAssetCategory` (`game_id`);--> statement-breakpoint -CREATE INDEX `game_asset_category_asset_category_id_idx` ON `gameAssetCategory` (`asset_category_id`);--> statement-breakpoint -CREATE UNIQUE INDEX `assetTag_id_unique` ON `assetTag` (`id`);--> statement-breakpoint -CREATE UNIQUE INDEX `assetTag_name_unique` ON `assetTag` (`name`);--> statement-breakpoint -CREATE INDEX `asset_tag_id_idx` ON `assetTag` (`id`);--> statement-breakpoint -CREATE INDEX `asset_tag_name_idx` ON `assetTag` (`name`);--> statement-breakpoint -CREATE INDEX `asset_tags_assets_asset_tag_id_idx` ON `assetTagAsset` (`asset_tag_id`);--> statement-breakpoint -CREATE INDEX `asset_tags_assets_asset_id_idx` ON `assetTagAsset` (`asset_id`);--> statement-breakpoint CREATE UNIQUE INDEX `atlas_id_unique` ON `atlas` (`id`);--> statement-breakpoint CREATE INDEX `atlas_id_idx` ON `atlas` (`id`);--> statement-breakpoint CREATE INDEX `atlas_uploaded_by_idx` ON `atlas` (`uploaded_by`);--> statement-breakpoint @@ -230,10 +242,28 @@ CREATE INDEX `atlas_to_assets_atlas_id_idx` ON `atlasToAsset` (`atlas_id`);--> s CREATE INDEX `atlas_to_assets_asset_id_idx` ON `atlasToAsset` (`asset_id`);--> statement-breakpoint CREATE INDEX `assetlikes_asset_idx` ON `assetLikes` (`asset_id`);--> statement-breakpoint CREATE INDEX `assetlikes_likedBy_idx` ON `assetLikes` (`liked_by_id`);--> statement-breakpoint +CREATE UNIQUE INDEX `assetCategory_id_unique` ON `assetCategory` (`id`);--> statement-breakpoint +CREATE UNIQUE INDEX `assetCategory_name_unique` ON `assetCategory` (`name`);--> statement-breakpoint +CREATE INDEX `asset_category_id_idx` ON `assetCategory` (`id`);--> statement-breakpoint +CREATE INDEX `asset_category_name_idx` ON `assetCategory` (`name`);--> statement-breakpoint +CREATE INDEX `game_asset_category_game_id_idx` ON `gameAssetCategory` (`game_id`);--> statement-breakpoint +CREATE INDEX `game_asset_category_asset_category_id_idx` ON `gameAssetCategory` (`asset_category_id`);--> statement-breakpoint +CREATE INDEX `assetCategoryLikes_asset_idx` ON `assetCategoryLikes` (`asset_id`);--> statement-breakpoint +CREATE INDEX `assetCategoryLikes_likedby_idx` ON `assetCategoryLikes` (`liked_by_id`);--> statement-breakpoint CREATE UNIQUE INDEX `game_id_unique` ON `game` (`id`);--> statement-breakpoint CREATE UNIQUE INDEX `game_name_unique` ON `game` (`name`);--> statement-breakpoint CREATE INDEX `game_id_idx` ON `game` (`id`);--> statement-breakpoint CREATE INDEX `game_name_idx` ON `game` (`name`);--> statement-breakpoint +CREATE INDEX `gamelikes_game_idx` ON `gameLikes` (`asset_id`);--> statement-breakpoint +CREATE INDEX `gamelikes_likedby_idx` ON `gameLikes` (`liked_by_id`);--> statement-breakpoint +CREATE UNIQUE INDEX `assetTag_id_unique` ON `assetTag` (`id`);--> statement-breakpoint +CREATE UNIQUE INDEX `assetTag_name_unique` ON `assetTag` (`name`);--> statement-breakpoint +CREATE INDEX `asset_tag_id_idx` ON `assetTag` (`id`);--> statement-breakpoint +CREATE INDEX `asset_tag_name_idx` ON `assetTag` (`name`);--> statement-breakpoint +CREATE INDEX `asset_tags_assets_asset_tag_id_idx` ON `assetTagAsset` (`asset_tag_id`);--> statement-breakpoint +CREATE INDEX `asset_tags_assets_asset_id_idx` ON `assetTagAsset` (`asset_id`);--> statement-breakpoint +CREATE INDEX `assetTagLikes_asset_idx` ON `assetTagLikes` (`asset_id`);--> statement-breakpoint +CREATE INDEX `assetTagLikes_likedby_idx` ON `assetTagLikes` (`liked_by_id`);--> statement-breakpoint CREATE UNIQUE INDEX `savedOcGenerators_id_unique` ON `savedOcGenerators` (`id`);--> statement-breakpoint CREATE INDEX `saved_oc_generators_id_idx` ON `savedOcGenerators` (`id`);--> statement-breakpoint CREATE INDEX `saved_oc_generators_user_id_idx` ON `savedOcGenerators` (`user_id`);--> statement-breakpoint diff --git a/src/v2/db/migrations/meta/0000_snapshot.json b/src/v2/db/migrations/meta/0000_snapshot.json index d1c7e85..bf4051c 100644 --- a/src/v2/db/migrations/meta/0000_snapshot.json +++ b/src/v2/db/migrations/meta/0000_snapshot.json @@ -1,7 +1,7 @@ { "version": "5", "dialect": "sqlite", - "id": "65c146c9-3d56-4907-a45f-64781adc3bd5", + "id": "1e99eb2e-cdfd-4807-b82b-8d4d72bc4a31", "prevId": "00000000-0000-0000-0000-000000000000", "tables": { "asset": { @@ -229,6 +229,238 @@ "compositePrimaryKeys": {}, "uniqueConstraints": {} }, + "atlas": { + "name": "atlas", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by": { + "name": "uploaded_by", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by_name": { + "name": "uploaded_by_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_date": { + "name": "uploaded_date", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "file_size": { + "name": "file_size", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "atlas_id_unique": { + "name": "atlas_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "atlas_id_idx": { + "name": "atlas_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "atlas_uploaded_by_idx": { + "name": "atlas_uploaded_by_idx", + "columns": [ + "uploaded_by" + ], + "isUnique": false + }, + "atlas_uploaded_by_name_idx": { + "name": "atlas_uploaded_by_name_idx", + "columns": [ + "uploaded_by_name" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "atlasToAsset": { + "name": "atlasToAsset", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "atlas_id": { + "name": "atlas_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "atlas_to_assets_id_idx": { + "name": "atlas_to_assets_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "atlas_to_assets_atlas_id_idx": { + "name": "atlas_to_assets_atlas_id_idx", + "columns": [ + "atlas_id" + ], + "isUnique": false + }, + "atlas_to_assets_asset_id_idx": { + "name": "atlas_to_assets_asset_id_idx", + "columns": [ + "asset_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "atlasToAsset_atlas_id_atlas_id_fk": { + "name": "atlasToAsset_atlas_id_atlas_id_fk", + "tableFrom": "atlasToAsset", + "tableTo": "atlas", + "columnsFrom": [ + "atlas_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "atlasToAsset_asset_id_asset_id_fk": { + "name": "atlasToAsset_asset_id_asset_id_fk", + "tableFrom": "atlasToAsset", + "tableTo": "asset", + "columnsFrom": [ + "asset_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetLikes": { + "name": "assetLikes", + "columns": { + "asset_id": { + "name": "asset_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetlikes_asset_idx": { + "name": "assetlikes_asset_idx", + "columns": [ + "asset_id" + ], + "isUnique": false + }, + "assetlikes_likedBy_idx": { + "name": "assetlikes_likedBy_idx", + "columns": [ + "liked_by_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "assetLikes_asset_id_asset_id_fk": { + "name": "assetLikes_asset_id_asset_id_fk", + "tableFrom": "assetLikes", + "tableTo": "asset", + "columnsFrom": [ + "asset_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "assetLikes_liked_by_id_authUser_id_fk": { + "name": "assetLikes_liked_by_id_authUser_id_fk", + "tableFrom": "assetLikes", + "tableTo": "authUser", + "columnsFrom": [ + "liked_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, "assetCategory": { "name": "assetCategory", "columns": { @@ -368,8 +600,80 @@ "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "assetTag": { - "name": "assetTag", + "assetCategoryLikes": { + "name": "assetCategoryLikes", + "columns": { + "asset_id": { + "name": "asset_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetCategoryLikes_asset_idx": { + "name": "assetCategoryLikes_asset_idx", + "columns": [ + "asset_id" + ], + "isUnique": false + }, + "assetCategoryLikes_likedby_idx": { + "name": "assetCategoryLikes_likedby_idx", + "columns": [ + "liked_by_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "assetCategoryLikes_asset_id_assetCategory_id_fk": { + "name": "assetCategoryLikes_asset_id_assetCategory_id_fk", + "tableFrom": "assetCategoryLikes", + "tableTo": "assetCategory", + "columnsFrom": [ + "asset_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "assetCategoryLikes_liked_by_id_authUser_id_fk": { + "name": "assetCategoryLikes_liked_by_id_authUser_id_fk", + "tableFrom": "assetCategoryLikes", + "tableTo": "authUser", + "columnsFrom": [ + "liked_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "game": { + "name": "game", "columns": { "id": { "name": "id", @@ -396,6 +700,14 @@ "name": "asset_count", "type": "integer", "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": 0 + }, + "possible_suggestive_content": { + "name": "possible_suggestive_content", + "type": "integer", + "primaryKey": false, "notNull": true, "autoincrement": false, "default": 0 @@ -409,29 +721,29 @@ } }, "indexes": { - "assetTag_id_unique": { - "name": "assetTag_id_unique", + "game_id_unique": { + "name": "game_id_unique", "columns": [ "id" ], "isUnique": true }, - "assetTag_name_unique": { - "name": "assetTag_name_unique", + "game_name_unique": { + "name": "game_name_unique", "columns": [ "name" ], "isUnique": true }, - "asset_tag_id_idx": { - "name": "asset_tag_id_idx", + "game_id_idx": { + "name": "game_id_idx", "columns": [ "id" ], "isUnique": false }, - "asset_tag_name_idx": { - "name": "asset_tag_name_idx", + "game_name_idx": { + "name": "game_name_idx", "columns": [ "name" ], @@ -442,73 +754,80 @@ "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "assetTagAsset": { - "name": "assetTagAsset", + "gameLikes": { + "name": "gameLikes", "columns": { - "asset_tag_id": { - "name": "asset_tag_id", + "asset_id": { + "name": "asset_id", "type": "text", "primaryKey": false, "notNull": true, "autoincrement": false }, - "asset_id": { - "name": "asset_id", - "type": "integer", + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", "primaryKey": false, "notNull": true, "autoincrement": false } }, "indexes": { - "asset_tags_assets_asset_tag_id_idx": { - "name": "asset_tags_assets_asset_tag_id_idx", + "gamelikes_game_idx": { + "name": "gamelikes_game_idx", "columns": [ - "asset_tag_id" + "asset_id" ], "isUnique": false }, - "asset_tags_assets_asset_id_idx": { - "name": "asset_tags_assets_asset_id_idx", + "gamelikes_likedby_idx": { + "name": "gamelikes_likedby_idx", "columns": [ - "asset_id" + "liked_by_id" ], "isUnique": false } }, "foreignKeys": { - "assetTagAsset_asset_tag_id_assetTag_id_fk": { - "name": "assetTagAsset_asset_tag_id_assetTag_id_fk", - "tableFrom": "assetTagAsset", - "tableTo": "assetTag", + "gameLikes_asset_id_game_id_fk": { + "name": "gameLikes_asset_id_game_id_fk", + "tableFrom": "gameLikes", + "tableTo": "game", "columnsFrom": [ - "asset_tag_id" + "asset_id" ], "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "cascade" + "onDelete": "no action", + "onUpdate": "no action" }, - "assetTagAsset_asset_id_asset_id_fk": { - "name": "assetTagAsset_asset_id_asset_id_fk", - "tableFrom": "assetTagAsset", - "tableTo": "asset", + "gameLikes_liked_by_id_authUser_id_fk": { + "name": "gameLikes_liked_by_id_authUser_id_fk", + "tableFrom": "gameLikes", + "tableTo": "authUser", "columnsFrom": [ - "asset_id" + "liked_by_id" ], "columnsTo": [ "id" ], - "onDelete": "cascade", - "onUpdate": "cascade" + "onDelete": "no action", + "onUpdate": "no action" } }, "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "atlas": { - "name": "atlas", + "assetTag": { + "name": "assetTag", "columns": { "id": { "name": "id", @@ -517,69 +836,62 @@ "notNull": true, "autoincrement": false }, - "url": { - "name": "url", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by": { - "name": "uploaded_by", + "name": { + "name": "name", "type": "text", "primaryKey": false, "notNull": true, "autoincrement": false }, - "uploaded_by_name": { - "name": "uploaded_by_name", + "formatted_name": { + "name": "formatted_name", "type": "text", "primaryKey": false, "notNull": true, "autoincrement": false }, - "uploaded_date": { - "name": "uploaded_date", + "asset_count": { + "name": "asset_count", "type": "integer", "primaryKey": false, "notNull": true, - "autoincrement": false + "autoincrement": false, + "default": 0 }, - "file_size": { - "name": "file_size", - "type": "integer", + "last_updated": { + "name": "last_updated", + "type": "text", "primaryKey": false, "notNull": true, - "autoincrement": false, - "default": 0 + "autoincrement": false } }, "indexes": { - "atlas_id_unique": { - "name": "atlas_id_unique", + "assetTag_id_unique": { + "name": "assetTag_id_unique", "columns": [ "id" ], "isUnique": true }, - "atlas_id_idx": { - "name": "atlas_id_idx", + "assetTag_name_unique": { + "name": "assetTag_name_unique", "columns": [ - "id" + "name" ], - "isUnique": false + "isUnique": true }, - "atlas_uploaded_by_idx": { - "name": "atlas_uploaded_by_idx", + "asset_tag_id_idx": { + "name": "asset_tag_id_idx", "columns": [ - "uploaded_by" + "id" ], "isUnique": false }, - "atlas_uploaded_by_name_idx": { - "name": "atlas_uploaded_by_name_idx", + "asset_tag_name_idx": { + "name": "asset_tag_name_idx", "columns": [ - "uploaded_by_name" + "name" ], "isUnique": false } @@ -588,18 +900,11 @@ "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "atlasToAsset": { - "name": "atlasToAsset", + "assetTagAsset": { + "name": "assetTagAsset", "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "atlas_id": { - "name": "atlas_id", + "asset_tag_id": { + "name": "asset_tag_id", "type": "text", "primaryKey": false, "notNull": true, @@ -614,22 +919,15 @@ } }, "indexes": { - "atlas_to_assets_id_idx": { - "name": "atlas_to_assets_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "atlas_to_assets_atlas_id_idx": { - "name": "atlas_to_assets_atlas_id_idx", + "asset_tags_assets_asset_tag_id_idx": { + "name": "asset_tags_assets_asset_tag_id_idx", "columns": [ - "atlas_id" + "asset_tag_id" ], "isUnique": false }, - "atlas_to_assets_asset_id_idx": { - "name": "atlas_to_assets_asset_id_idx", + "asset_tags_assets_asset_id_idx": { + "name": "asset_tags_assets_asset_id_idx", "columns": [ "asset_id" ], @@ -637,12 +935,12 @@ } }, "foreignKeys": { - "atlasToAsset_atlas_id_atlas_id_fk": { - "name": "atlasToAsset_atlas_id_atlas_id_fk", - "tableFrom": "atlasToAsset", - "tableTo": "atlas", + "assetTagAsset_asset_tag_id_assetTag_id_fk": { + "name": "assetTagAsset_asset_tag_id_assetTag_id_fk", + "tableFrom": "assetTagAsset", + "tableTo": "assetTag", "columnsFrom": [ - "atlas_id" + "asset_tag_id" ], "columnsTo": [ "id" @@ -650,9 +948,9 @@ "onDelete": "cascade", "onUpdate": "cascade" }, - "atlasToAsset_asset_id_asset_id_fk": { - "name": "atlasToAsset_asset_id_asset_id_fk", - "tableFrom": "atlasToAsset", + "assetTagAsset_asset_id_asset_id_fk": { + "name": "assetTagAsset_asset_id_asset_id_fk", + "tableFrom": "assetTagAsset", "tableTo": "asset", "columnsFrom": [ "asset_id" @@ -667,8 +965,8 @@ "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "assetLikes": { - "name": "assetLikes", + "assetTagLikes": { + "name": "assetTagLikes", "columns": { "asset_id": { "name": "asset_id", @@ -693,15 +991,15 @@ } }, "indexes": { - "assetlikes_asset_idx": { - "name": "assetlikes_asset_idx", + "assetTagLikes_asset_idx": { + "name": "assetTagLikes_asset_idx", "columns": [ "asset_id" ], "isUnique": false }, - "assetlikes_likedBy_idx": { - "name": "assetlikes_likedBy_idx", + "assetTagLikes_likedby_idx": { + "name": "assetTagLikes_likedby_idx", "columns": [ "liked_by_id" ], @@ -709,10 +1007,10 @@ } }, "foreignKeys": { - "assetLikes_asset_id_authUser_id_fk": { - "name": "assetLikes_asset_id_authUser_id_fk", - "tableFrom": "assetLikes", - "tableTo": "authUser", + "assetTagLikes_asset_id_assetTag_id_fk": { + "name": "assetTagLikes_asset_id_assetTag_id_fk", + "tableFrom": "assetTagLikes", + "tableTo": "assetTag", "columnsFrom": [ "asset_id" ], @@ -722,9 +1020,9 @@ "onDelete": "no action", "onUpdate": "no action" }, - "assetLikes_liked_by_id_authUser_id_fk": { - "name": "assetLikes_liked_by_id_authUser_id_fk", - "tableFrom": "assetLikes", + "assetTagLikes_liked_by_id_authUser_id_fk": { + "name": "assetTagLikes_liked_by_id_authUser_id_fk", + "tableFrom": "assetTagLikes", "tableTo": "authUser", "columnsFrom": [ "liked_by_id" @@ -739,88 +1037,6 @@ "compositePrimaryKeys": {}, "uniqueConstraints": {} }, - "game": { - "name": "game", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - }, - "possible_suggestive_content": { - "name": "possible_suggestive_content", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "game_id_unique": { - "name": "game_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "game_name_unique": { - "name": "game_name_unique", - "columns": [ - "name" - ], - "isUnique": true - }, - "game_id_idx": { - "name": "game_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "game_name_idx": { - "name": "game_name_idx", - "columns": [ - "name" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, "savedOcGenerators": { "name": "savedOcGenerators", "columns": { diff --git a/src/v2/db/migrations/meta/_journal.json b/src/v2/db/migrations/meta/_journal.json index fbb7567..8ab7d8a 100644 --- a/src/v2/db/migrations/meta/_journal.json +++ b/src/v2/db/migrations/meta/_journal.json @@ -5,8 +5,8 @@ { "idx": 0, "version": "5", - "when": 1701092169578, - "tag": "0000_shiny_valkyrie", + "when": 1701248157083, + "tag": "0000_spotty_iron_monger", "breakpoints": true } ] diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index c841e8c..f12aa15 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -1,10 +1,15 @@ export * from "./schema/asset/asset" -export * from "./schema/asset/asset-categories" -export * from "./schema/asset/asset-tags" export * from "./schema/asset/asset-atlas" export * from "./schema/asset/asset-likes" +export * from "./schema/categories/asset-categories" +export * from "./schema/categories/asset-categories-likes" + export * from "./schema/game/game" +export * from "./schema/game/game-likes" + +export * from "./schema/tags/asset-tags" +export * from "./schema/tags/asset-tags-likes" export * from "./schema/oc-generators/oc-generators" diff --git a/src/v2/db/schema/asset/asset-likes.ts b/src/v2/db/schema/asset/asset-likes.ts index e1b4435..36edba4 100644 --- a/src/v2/db/schema/asset/asset-likes.ts +++ b/src/v2/db/schema/asset/asset-likes.ts @@ -14,7 +14,7 @@ export const assetLikes = sqliteTable( { assetId: text("asset_id") .notNull() - .references(() => authUser.id), + .references(() => asset.id), likedById: text("liked_by_id") .notNull() .references(() => authUser.id), diff --git a/src/v2/db/schema/asset/asset.ts b/src/v2/db/schema/asset/asset.ts index 6e0f569..f3962b1 100644 --- a/src/v2/db/schema/asset/asset.ts +++ b/src/v2/db/schema/asset/asset.ts @@ -8,9 +8,9 @@ import { index, } from "drizzle-orm/sqlite-core" import { authUser } from "../user/user" -import { assetCategory } from "./asset-categories" +import { assetCategory } from "../categories/asset-categories" import { game } from "../game/game" -import { assetTagAsset } from "./asset-tags" +import { assetTagAsset } from "../tags/asset-tags" import { atlasToAsset } from "./asset-atlas" import { assetLikes } from "./asset-likes" diff --git a/src/v2/db/schema/categories/asset-categories-likes.ts b/src/v2/db/schema/categories/asset-categories-likes.ts new file mode 100644 index 0000000..32b5b92 --- /dev/null +++ b/src/v2/db/schema/categories/asset-categories-likes.ts @@ -0,0 +1,51 @@ +import { tableNames } from "@/v2/db/drizzle" +import { relations } from "drizzle-orm" +import { sqliteTable, text, index } from "drizzle-orm/sqlite-core" +import { authUser } from "../user/user" +import { assetCategory } from "./asset-categories" + +export const assetCategoryLikes = sqliteTable( + tableNames.assetCategoryLikes, + { + assetCategoryId: text("asset_id") + .notNull() + .references(() => assetCategory.id), + likedById: text("liked_by_id") + .notNull() + .references(() => authUser.id), + createdAt: text("created_at") + .notNull() + .$defaultFn(() => { + return new Date().toISOString() + }), + }, + (gameLikes) => { + return { + assetCategoryIdx: index("assetCategoryLikes_asset_idx").on( + gameLikes.assetCategoryId + ), + likedByIdx: index("assetCategoryLikes_likedby_idx").on( + gameLikes.likedById + ), + } + } +) + +export type AssetCategoryLikes = typeof assetCategoryLikes.$inferSelect +export type NewAssetCategoryLikes = typeof assetCategoryLikes.$inferInsert + +export const assetCategoryLikesRelations = relations( + assetCategoryLikes, + ({ one }) => ({ + assetCategory: one(assetCategory, { + fields: [assetCategoryLikes.assetCategoryId], + references: [assetCategory.id], + relationName: "assetCategoryLikes_liked_assetCategory", + }), + likedBy: one(authUser, { + fields: [assetCategoryLikes.likedById], + references: [authUser.id], + relationName: "assetTagLikes_liked_by", + }), + }) +) diff --git a/src/v2/db/schema/asset/asset-categories.ts b/src/v2/db/schema/categories/asset-categories.ts similarity index 95% rename from src/v2/db/schema/asset/asset-categories.ts rename to src/v2/db/schema/categories/asset-categories.ts index 9fd3d04..1bfed35 100644 --- a/src/v2/db/schema/asset/asset-categories.ts +++ b/src/v2/db/schema/categories/asset-categories.ts @@ -8,13 +8,8 @@ import { index, } from "drizzle-orm/sqlite-core" import { game } from "../game/game" -import { asset } from "./asset" - -/* -NOTE: This setup can look kinda janky. -- All asset categories have a game associated with them. This is for better UX so users know what asset categories exist for a game. -- It's not a necessary join, but just nice to have. -*/ +import { asset } from "../asset/asset" +import { assetCategoryLikes } from "./asset-categories-likes" export const assetCategory = sqliteTable( tableNames.assetCategory, @@ -38,6 +33,12 @@ export const assetCategory = sqliteTable( export type AssetCategory = typeof assetCategory.$inferSelect export type NewAssetCategory = typeof assetCategory.$inferInsert +/* +NOTE: This setup can look kinda janky. +- All asset categories have a game associated with them. This is for better UX so users know what asset categories exist for a game. +- It's not a necessary join, but just nice to have. +*/ + export const gameAssetCategory = sqliteTable( tableNames.gameAssetCategory, { @@ -72,6 +73,7 @@ export type NewGameAssetCategory = typeof gameAssetCategory.$inferInsert export const assetCategoryRelations = relations(assetCategory, ({ many }) => ({ asset: many(asset), gameAssetCategory: many(gameAssetCategory), + assetCategoryLikes: many(assetCategoryLikes), })) export const gameAssetCategoryRelations = relations( diff --git a/src/v2/db/schema/game/game-likes.ts b/src/v2/db/schema/game/game-likes.ts new file mode 100644 index 0000000..5040ae4 --- /dev/null +++ b/src/v2/db/schema/game/game-likes.ts @@ -0,0 +1,44 @@ +import { tableNames } from "@/v2/db/drizzle" +import { relations } from "drizzle-orm" +import { sqliteTable, text, index } from "drizzle-orm/sqlite-core" +import { authUser } from "../user/user" +import { game } from "./game" + +export const gameLikes = sqliteTable( + tableNames.gameLikes, + { + gameId: text("asset_id") + .notNull() + .references(() => game.id), + likedById: text("liked_by_id") + .notNull() + .references(() => authUser.id), + createdAt: text("created_at") + .notNull() + .$defaultFn(() => { + return new Date().toISOString() + }), + }, + (gameLikes) => { + return { + gameIdx: index("gamelikes_game_idx").on(gameLikes.gameId), + likedByIdx: index("gamelikes_likedby_idx").on(gameLikes.likedById), + } + } +) + +export type GameLikes = typeof gameLikes.$inferSelect +export type NewGameLikes = typeof gameLikes.$inferInsert + +export const gameLikesRelations = relations(gameLikes, ({ one }) => ({ + game: one(game, { + fields: [gameLikes.gameId], + references: [game.id], + relationName: "gamelikes_liked_game", + }), + likedBy: one(authUser, { + fields: [gameLikes.likedById], + references: [authUser.id], + relationName: "gamelikes_liked_by", + }), +})) diff --git a/src/v2/db/schema/game/game.ts b/src/v2/db/schema/game/game.ts index bdb9cd8..9e2dd59 100644 --- a/src/v2/db/schema/game/game.ts +++ b/src/v2/db/schema/game/game.ts @@ -8,7 +8,8 @@ import { index, } from "drizzle-orm/sqlite-core" import { asset } from "../asset/asset" -import { gameAssetCategory } from "../asset/asset-categories" +import { gameAssetCategory } from "../categories/asset-categories" +import { gameLikes } from "./game-likes" /* NOTE: Game relation is easy to understand and self-explanatory. @@ -45,4 +46,5 @@ export type NewGame = typeof game.$inferInsert export const gameRelations = relations(game, ({ many }) => ({ asset: many(asset), gameAssetCategory: many(gameAssetCategory), + gameLikes: many(gameLikes), })) diff --git a/src/v2/db/schema/tags/asset-tags-likes.ts b/src/v2/db/schema/tags/asset-tags-likes.ts new file mode 100644 index 0000000..3966849 --- /dev/null +++ b/src/v2/db/schema/tags/asset-tags-likes.ts @@ -0,0 +1,48 @@ +import { tableNames } from "@/v2/db/drizzle" +import { relations } from "drizzle-orm" +import { sqliteTable, text, index } from "drizzle-orm/sqlite-core" +import { authUser } from "../user/user" +import { assetTag } from "./asset-tags" + +export const assetTagLikes = sqliteTable( + tableNames.assetTagLikes, + { + assetTagId: text("asset_id") + .notNull() + .references(() => assetTag.id), + likedById: text("liked_by_id") + .notNull() + .references(() => authUser.id), + createdAt: text("created_at") + .notNull() + .$defaultFn(() => { + return new Date().toISOString() + }), + }, + (gameLikes) => { + return { + assetTagIdx: index("assetTagLikes_asset_idx").on( + gameLikes.assetTagId + ), + likedByIdx: index("assetTagLikes_likedby_idx").on( + gameLikes.likedById + ), + } + } +) + +export type AssetTagLikes = typeof assetTagLikes.$inferSelect +export type NewAssetTagLikes = typeof assetTagLikes.$inferInsert + +export const assetTagLikesRelations = relations(assetTagLikes, ({ one }) => ({ + assetTag: one(assetTag, { + fields: [assetTagLikes.assetTagId], + references: [assetTag.id], + relationName: "assetTagLikes_liked_assetTag", + }), + likedBy: one(authUser, { + fields: [assetTagLikes.likedById], + references: [authUser.id], + relationName: "assetTagLikes_liked_by", + }), +})) diff --git a/src/v2/db/schema/asset/asset-tags.ts b/src/v2/db/schema/tags/asset-tags.ts similarity index 95% rename from src/v2/db/schema/asset/asset-tags.ts rename to src/v2/db/schema/tags/asset-tags.ts index 701052b..5e315a6 100644 --- a/src/v2/db/schema/asset/asset-tags.ts +++ b/src/v2/db/schema/tags/asset-tags.ts @@ -7,7 +7,8 @@ import { // uniqueIndex, index, } from "drizzle-orm/sqlite-core" -import { asset } from "./asset" +import { asset } from "../asset/asset" +import { assetTagLikes } from "./asset-tags-likes" /* NOTE: Asset tags are not stored as ENUMs to allow for better UX, flexibility, and extensibility. @@ -68,6 +69,7 @@ export type NewAssetTagAsset = typeof assetTagAsset.$inferInsert export const assetTagRelations = relations(assetTag, ({ many }) => ({ assetTagAsset: many(assetTagAsset), + assetTagLikes: many(assetTagLikes), })) export const assetTagAssetRelations = relations(assetTagAsset, ({ one }) => ({ diff --git a/src/v2/db/schema/user/user.ts b/src/v2/db/schema/user/user.ts index 5c6f780..03f6c7a 100644 --- a/src/v2/db/schema/user/user.ts +++ b/src/v2/db/schema/user/user.ts @@ -18,6 +18,9 @@ import { emailVerificationToken } from "./user-attributes" import { atlas } from "../asset/asset-atlas" import { userCollectionLikes } from "./user-collection-likes" import { assetLikes } from "../asset/asset-likes" +import { gameLikes } from "../game/game-likes" +import { assetTagLikes } from "../tags/asset-tags-likes" +import { assetCategoryLikes } from "../categories/asset-categories-likes" /* NOTE: Very basic user information @@ -128,6 +131,9 @@ export const usersRelations = relations(authUser, ({ one, many }) => ({ passwordResetToken: one(passwordResetToken), emailVerificationToken: one(emailVerificationToken), savedOcGenerators: many(savedOcGenerators), + gameLikes: many(gameLikes), + assetTagLikes: many(assetTagLikes), + assetCategoryLikes: many(assetCategoryLikes), })) export const keysRelations = relations(authKey, ({ one }) => ({ diff --git a/src/v2/lib/managers/asset/asset-manager.ts b/src/v2/lib/managers/asset/asset-manager.ts index be8ff2c..b22e46e 100644 --- a/src/v2/lib/managers/asset/asset-manager.ts +++ b/src/v2/lib/managers/asset/asset-manager.ts @@ -184,8 +184,7 @@ export class AssetManager { where: (asset, { and, or, like, eq, sql }) => and( tagList && tagList.length > 0 - ? // rawdog sql because i don't care anymore - or( + ? or( ...tagList.map( (t) => sql`EXISTS (SELECT 1 FROM assetTagAsset WHERE assetTagAsset.asset_id = ${asset.id} AND assetTagAsset.asset_tag_id = ${t})` From 68d1828dc1c3bb54b2cd974a39d50035d56a7097 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Wed, 29 Nov 2023 10:40:28 +0000 Subject: [PATCH 172/318] create new liking managers --- src/v2/db/migrations/meta/0000_snapshot.json | 3930 ++++++++--------- src/v2/db/migrations/meta/_journal.json | 24 +- src/v2/db/schema.ts | 4 +- .../user-collection-likes.ts | 2 +- .../{user => collections}/user-collections.ts | 2 +- src/v2/db/schema/user/user.ts | 4 +- .../asset-category/asset-category-likes.ts | 61 + src/v2/lib/managers/asset/asset-likes.ts | 12 +- .../managers/collection/collection-likes.ts | 61 + src/v2/lib/managers/game/game-likes.ts | 45 + src/v2/lib/managers/tag/tag-likes.ts | 51 + 11 files changed, 2065 insertions(+), 2131 deletions(-) rename src/v2/db/schema/{user => collections}/user-collection-likes.ts (97%) rename src/v2/db/schema/{user => collections}/user-collections.ts (98%) create mode 100644 src/v2/lib/managers/asset-category/asset-category-likes.ts create mode 100644 src/v2/lib/managers/collection/collection-likes.ts create mode 100644 src/v2/lib/managers/game/game-likes.ts create mode 100644 src/v2/lib/managers/tag/tag-likes.ts diff --git a/src/v2/db/migrations/meta/0000_snapshot.json b/src/v2/db/migrations/meta/0000_snapshot.json index bf4051c..2634119 100644 --- a/src/v2/db/migrations/meta/0000_snapshot.json +++ b/src/v2/db/migrations/meta/0000_snapshot.json @@ -1,2113 +1,1829 @@ { - "version": "5", - "dialect": "sqlite", - "id": "1e99eb2e-cdfd-4807-b82b-8d4d72bc4a31", - "prevId": "00000000-0000-0000-0000-000000000000", - "tables": { - "asset": { - "name": "asset", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "extension": { - "name": "extension", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false + "version": "5", + "dialect": "sqlite", + "id": "1e99eb2e-cdfd-4807-b82b-8d4d72bc4a31", + "prevId": "00000000-0000-0000-0000-000000000000", + "tables": { + "asset": { + "name": "asset", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "extension": { + "name": "extension", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "game": { + "name": "game", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_category": { + "name": "asset_category", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by_id": { + "name": "uploaded_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by_name": { + "name": "uploaded_by_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'pending'" + }, + "uploaded_date": { + "name": "uploaded_date", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_is_optimized": { + "name": "asset_is_optimized", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "asset_is_suggestive": { + "name": "asset_is_suggestive", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "view_count": { + "name": "view_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "download_count": { + "name": "download_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "file_size": { + "name": "file_size", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "width": { + "name": "width", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "height": { + "name": "height", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "assets_id_idx": { + "name": "assets_id_idx", + "columns": ["id"], + "isUnique": false + }, + "assets_name_idx": { + "name": "assets_name_idx", + "columns": ["name"], + "isUnique": false + }, + "assets_game_name_idx": { + "name": "assets_game_name_idx", + "columns": ["game"], + "isUnique": false + }, + "assets_asset_category_name_idx": { + "name": "assets_asset_category_name_idx", + "columns": ["asset_category"], + "isUnique": false + }, + "assets_uploaded_by_id_idx": { + "name": "assets_uploaded_by_id_idx", + "columns": ["uploaded_by_id"], + "isUnique": false + } + }, + "foreignKeys": { + "asset_game_game_id_fk": { + "name": "asset_game_game_id_fk", + "tableFrom": "asset", + "tableTo": "game", + "columnsFrom": ["game"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "asset_asset_category_assetCategory_id_fk": { + "name": "asset_asset_category_assetCategory_id_fk", + "tableFrom": "asset", + "tableTo": "assetCategory", + "columnsFrom": ["asset_category"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "asset_uploaded_by_id_authUser_id_fk": { + "name": "asset_uploaded_by_id_authUser_id_fk", + "tableFrom": "asset", + "tableTo": "authUser", + "columnsFrom": ["uploaded_by_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "asset_uploaded_by_name_authUser_username_fk": { + "name": "asset_uploaded_by_name_authUser_username_fk", + "tableFrom": "asset", + "tableTo": "authUser", + "columnsFrom": ["uploaded_by_name"], + "columnsTo": ["username"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "atlas": { + "name": "atlas", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by": { + "name": "uploaded_by", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by_name": { + "name": "uploaded_by_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_date": { + "name": "uploaded_date", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "file_size": { + "name": "file_size", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "atlas_id_unique": { + "name": "atlas_id_unique", + "columns": ["id"], + "isUnique": true + }, + "atlas_id_idx": { + "name": "atlas_id_idx", + "columns": ["id"], + "isUnique": false + }, + "atlas_uploaded_by_idx": { + "name": "atlas_uploaded_by_idx", + "columns": ["uploaded_by"], + "isUnique": false + }, + "atlas_uploaded_by_name_idx": { + "name": "atlas_uploaded_by_name_idx", + "columns": ["uploaded_by_name"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "atlasToAsset": { + "name": "atlasToAsset", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "atlas_id": { + "name": "atlas_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "atlas_to_assets_id_idx": { + "name": "atlas_to_assets_id_idx", + "columns": ["id"], + "isUnique": false + }, + "atlas_to_assets_atlas_id_idx": { + "name": "atlas_to_assets_atlas_id_idx", + "columns": ["atlas_id"], + "isUnique": false + }, + "atlas_to_assets_asset_id_idx": { + "name": "atlas_to_assets_asset_id_idx", + "columns": ["asset_id"], + "isUnique": false + } + }, + "foreignKeys": { + "atlasToAsset_atlas_id_atlas_id_fk": { + "name": "atlasToAsset_atlas_id_atlas_id_fk", + "tableFrom": "atlasToAsset", + "tableTo": "atlas", + "columnsFrom": ["atlas_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "atlasToAsset_asset_id_asset_id_fk": { + "name": "atlasToAsset_asset_id_asset_id_fk", + "tableFrom": "atlasToAsset", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetLikes": { + "name": "assetLikes", + "columns": { + "asset_id": { + "name": "asset_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetlikes_asset_idx": { + "name": "assetlikes_asset_idx", + "columns": ["asset_id"], + "isUnique": false + }, + "assetlikes_likedBy_idx": { + "name": "assetlikes_likedBy_idx", + "columns": ["liked_by_id"], + "isUnique": false + } + }, + "foreignKeys": { + "assetLikes_asset_id_asset_id_fk": { + "name": "assetLikes_asset_id_asset_id_fk", + "tableFrom": "assetLikes", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "assetLikes_liked_by_id_authUser_id_fk": { + "name": "assetLikes_liked_by_id_authUser_id_fk", + "tableFrom": "assetLikes", + "tableTo": "authUser", + "columnsFrom": ["liked_by_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetCategory": { + "name": "assetCategory", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetCategory_id_unique": { + "name": "assetCategory_id_unique", + "columns": ["id"], + "isUnique": true + }, + "assetCategory_name_unique": { + "name": "assetCategory_name_unique", + "columns": ["name"], + "isUnique": true + }, + "asset_category_id_idx": { + "name": "asset_category_id_idx", + "columns": ["id"], + "isUnique": false + }, + "asset_category_name_idx": { + "name": "asset_category_name_idx", + "columns": ["name"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "gameAssetCategory": { + "name": "gameAssetCategory", + "columns": { + "game_id": { + "name": "game_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_category_id": { + "name": "asset_category_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "game_asset_category_game_id_idx": { + "name": "game_asset_category_game_id_idx", + "columns": ["game_id"], + "isUnique": false + }, + "game_asset_category_asset_category_id_idx": { + "name": "game_asset_category_asset_category_id_idx", + "columns": ["asset_category_id"], + "isUnique": false + } + }, + "foreignKeys": { + "gameAssetCategory_game_id_game_id_fk": { + "name": "gameAssetCategory_game_id_game_id_fk", + "tableFrom": "gameAssetCategory", + "tableTo": "game", + "columnsFrom": ["game_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "gameAssetCategory_asset_category_id_assetCategory_id_fk": { + "name": "gameAssetCategory_asset_category_id_assetCategory_id_fk", + "tableFrom": "gameAssetCategory", + "tableTo": "assetCategory", + "columnsFrom": ["asset_category_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetCategoryLikes": { + "name": "assetCategoryLikes", + "columns": { + "asset_id": { + "name": "asset_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetCategoryLikes_asset_idx": { + "name": "assetCategoryLikes_asset_idx", + "columns": ["asset_id"], + "isUnique": false + }, + "assetCategoryLikes_likedby_idx": { + "name": "assetCategoryLikes_likedby_idx", + "columns": ["liked_by_id"], + "isUnique": false + } + }, + "foreignKeys": { + "assetCategoryLikes_asset_id_assetCategory_id_fk": { + "name": "assetCategoryLikes_asset_id_assetCategory_id_fk", + "tableFrom": "assetCategoryLikes", + "tableTo": "assetCategory", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "assetCategoryLikes_liked_by_id_authUser_id_fk": { + "name": "assetCategoryLikes_liked_by_id_authUser_id_fk", + "tableFrom": "assetCategoryLikes", + "tableTo": "authUser", + "columnsFrom": ["liked_by_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} }, "game": { - "name": "game", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_category": { - "name": "asset_category", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by_id": { - "name": "uploaded_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by_name": { - "name": "uploaded_by_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "url": { - "name": "url", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "status": { - "name": "status", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "'pending'" - }, - "uploaded_date": { - "name": "uploaded_date", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_is_optimized": { - "name": "asset_is_optimized", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "asset_is_suggestive": { - "name": "asset_is_suggestive", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "view_count": { - "name": "view_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "download_count": { - "name": "download_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "file_size": { - "name": "file_size", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "width": { - "name": "width", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "height": { - "name": "height", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "assets_id_idx": { - "name": "assets_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "assets_name_idx": { - "name": "assets_name_idx", - "columns": [ - "name" - ], - "isUnique": false - }, - "assets_game_name_idx": { - "name": "assets_game_name_idx", - "columns": [ - "game" - ], - "isUnique": false - }, - "assets_asset_category_name_idx": { - "name": "assets_asset_category_name_idx", - "columns": [ - "asset_category" - ], - "isUnique": false - }, - "assets_uploaded_by_id_idx": { - "name": "assets_uploaded_by_id_idx", - "columns": [ - "uploaded_by_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "asset_game_game_id_fk": { - "name": "asset_game_game_id_fk", - "tableFrom": "asset", - "tableTo": "game", - "columnsFrom": [ - "game" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "asset_asset_category_assetCategory_id_fk": { - "name": "asset_asset_category_assetCategory_id_fk", - "tableFrom": "asset", - "tableTo": "assetCategory", - "columnsFrom": [ - "asset_category" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "asset_uploaded_by_id_authUser_id_fk": { - "name": "asset_uploaded_by_id_authUser_id_fk", - "tableFrom": "asset", - "tableTo": "authUser", - "columnsFrom": [ - "uploaded_by_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "asset_uploaded_by_name_authUser_username_fk": { - "name": "asset_uploaded_by_name_authUser_username_fk", - "tableFrom": "asset", - "tableTo": "authUser", - "columnsFrom": [ - "uploaded_by_name" - ], - "columnsTo": [ - "username" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "atlas": { - "name": "atlas", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "url": { - "name": "url", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by": { - "name": "uploaded_by", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by_name": { - "name": "uploaded_by_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_date": { - "name": "uploaded_date", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "file_size": { - "name": "file_size", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "atlas_id_unique": { - "name": "atlas_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "atlas_id_idx": { - "name": "atlas_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "atlas_uploaded_by_idx": { - "name": "atlas_uploaded_by_idx", - "columns": [ - "uploaded_by" - ], - "isUnique": false - }, - "atlas_uploaded_by_name_idx": { - "name": "atlas_uploaded_by_name_idx", - "columns": [ - "uploaded_by_name" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "atlasToAsset": { - "name": "atlasToAsset", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "atlas_id": { - "name": "atlas_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "atlas_to_assets_id_idx": { - "name": "atlas_to_assets_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "atlas_to_assets_atlas_id_idx": { - "name": "atlas_to_assets_atlas_id_idx", - "columns": [ - "atlas_id" - ], - "isUnique": false - }, - "atlas_to_assets_asset_id_idx": { - "name": "atlas_to_assets_asset_id_idx", - "columns": [ - "asset_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "atlasToAsset_atlas_id_atlas_id_fk": { - "name": "atlasToAsset_atlas_id_atlas_id_fk", - "tableFrom": "atlasToAsset", - "tableTo": "atlas", - "columnsFrom": [ - "atlas_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "atlasToAsset_asset_id_asset_id_fk": { - "name": "atlasToAsset_asset_id_asset_id_fk", - "tableFrom": "atlasToAsset", - "tableTo": "asset", - "columnsFrom": [ - "asset_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetLikes": { - "name": "assetLikes", - "columns": { - "asset_id": { - "name": "asset_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetlikes_asset_idx": { - "name": "assetlikes_asset_idx", - "columns": [ - "asset_id" - ], - "isUnique": false - }, - "assetlikes_likedBy_idx": { - "name": "assetlikes_likedBy_idx", - "columns": [ - "liked_by_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "assetLikes_asset_id_asset_id_fk": { - "name": "assetLikes_asset_id_asset_id_fk", - "tableFrom": "assetLikes", - "tableTo": "asset", - "columnsFrom": [ - "asset_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "assetLikes_liked_by_id_authUser_id_fk": { - "name": "assetLikes_liked_by_id_authUser_id_fk", - "tableFrom": "assetLikes", - "tableTo": "authUser", - "columnsFrom": [ - "liked_by_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetCategory": { - "name": "assetCategory", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetCategory_id_unique": { - "name": "assetCategory_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "assetCategory_name_unique": { - "name": "assetCategory_name_unique", - "columns": [ - "name" - ], - "isUnique": true - }, - "asset_category_id_idx": { - "name": "asset_category_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "asset_category_name_idx": { - "name": "asset_category_name_idx", - "columns": [ - "name" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "gameAssetCategory": { - "name": "gameAssetCategory", - "columns": { - "game_id": { - "name": "game_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_category_id": { - "name": "asset_category_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "game_asset_category_game_id_idx": { - "name": "game_asset_category_game_id_idx", - "columns": [ - "game_id" - ], - "isUnique": false - }, - "game_asset_category_asset_category_id_idx": { - "name": "game_asset_category_asset_category_id_idx", - "columns": [ - "asset_category_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "gameAssetCategory_game_id_game_id_fk": { - "name": "gameAssetCategory_game_id_game_id_fk", - "tableFrom": "gameAssetCategory", - "tableTo": "game", - "columnsFrom": [ - "game_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "gameAssetCategory_asset_category_id_assetCategory_id_fk": { - "name": "gameAssetCategory_asset_category_id_assetCategory_id_fk", - "tableFrom": "gameAssetCategory", - "tableTo": "assetCategory", - "columnsFrom": [ - "asset_category_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetCategoryLikes": { - "name": "assetCategoryLikes", - "columns": { - "asset_id": { - "name": "asset_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetCategoryLikes_asset_idx": { - "name": "assetCategoryLikes_asset_idx", - "columns": [ - "asset_id" - ], - "isUnique": false - }, - "assetCategoryLikes_likedby_idx": { - "name": "assetCategoryLikes_likedby_idx", - "columns": [ - "liked_by_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "assetCategoryLikes_asset_id_assetCategory_id_fk": { - "name": "assetCategoryLikes_asset_id_assetCategory_id_fk", - "tableFrom": "assetCategoryLikes", - "tableTo": "assetCategory", - "columnsFrom": [ - "asset_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "assetCategoryLikes_liked_by_id_authUser_id_fk": { - "name": "assetCategoryLikes_liked_by_id_authUser_id_fk", - "tableFrom": "assetCategoryLikes", - "tableTo": "authUser", - "columnsFrom": [ - "liked_by_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "game": { - "name": "game", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - }, - "possible_suggestive_content": { - "name": "possible_suggestive_content", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "game_id_unique": { - "name": "game_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "game_name_unique": { - "name": "game_name_unique", - "columns": [ - "name" - ], - "isUnique": true - }, - "game_id_idx": { - "name": "game_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "game_name_idx": { - "name": "game_name_idx", - "columns": [ - "name" - ], - "isUnique": false + "name": "game", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": 0 + }, + "possible_suggestive_content": { + "name": "possible_suggestive_content", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "game_id_unique": { + "name": "game_id_unique", + "columns": ["id"], + "isUnique": true + }, + "game_name_unique": { + "name": "game_name_unique", + "columns": ["name"], + "isUnique": true + }, + "game_id_idx": { + "name": "game_id_idx", + "columns": ["id"], + "isUnique": false + }, + "game_name_idx": { + "name": "game_name_idx", + "columns": ["name"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "gameLikes": { + "name": "gameLikes", + "columns": { + "asset_id": { + "name": "asset_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "gamelikes_game_idx": { + "name": "gamelikes_game_idx", + "columns": ["asset_id"], + "isUnique": false + }, + "gamelikes_likedby_idx": { + "name": "gamelikes_likedby_idx", + "columns": ["liked_by_id"], + "isUnique": false + } + }, + "foreignKeys": { + "gameLikes_asset_id_game_id_fk": { + "name": "gameLikes_asset_id_game_id_fk", + "tableFrom": "gameLikes", + "tableTo": "game", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "gameLikes_liked_by_id_authUser_id_fk": { + "name": "gameLikes_liked_by_id_authUser_id_fk", + "tableFrom": "gameLikes", + "tableTo": "authUser", + "columnsFrom": ["liked_by_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetTag": { + "name": "assetTag", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetTag_id_unique": { + "name": "assetTag_id_unique", + "columns": ["id"], + "isUnique": true + }, + "assetTag_name_unique": { + "name": "assetTag_name_unique", + "columns": ["name"], + "isUnique": true + }, + "asset_tag_id_idx": { + "name": "asset_tag_id_idx", + "columns": ["id"], + "isUnique": false + }, + "asset_tag_name_idx": { + "name": "asset_tag_name_idx", + "columns": ["name"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetTagAsset": { + "name": "assetTagAsset", + "columns": { + "asset_tag_id": { + "name": "asset_tag_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "asset_tags_assets_asset_tag_id_idx": { + "name": "asset_tags_assets_asset_tag_id_idx", + "columns": ["asset_tag_id"], + "isUnique": false + }, + "asset_tags_assets_asset_id_idx": { + "name": "asset_tags_assets_asset_id_idx", + "columns": ["asset_id"], + "isUnique": false + } + }, + "foreignKeys": { + "assetTagAsset_asset_tag_id_assetTag_id_fk": { + "name": "assetTagAsset_asset_tag_id_assetTag_id_fk", + "tableFrom": "assetTagAsset", + "tableTo": "assetTag", + "columnsFrom": ["asset_tag_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "assetTagAsset_asset_id_asset_id_fk": { + "name": "assetTagAsset_asset_id_asset_id_fk", + "tableFrom": "assetTagAsset", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetTagLikes": { + "name": "assetTagLikes", + "columns": { + "asset_id": { + "name": "asset_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetTagLikes_asset_idx": { + "name": "assetTagLikes_asset_idx", + "columns": ["asset_id"], + "isUnique": false + }, + "assetTagLikes_likedby_idx": { + "name": "assetTagLikes_likedby_idx", + "columns": ["liked_by_id"], + "isUnique": false + } + }, + "foreignKeys": { + "assetTagLikes_asset_id_assetTag_id_fk": { + "name": "assetTagLikes_asset_id_assetTag_id_fk", + "tableFrom": "assetTagLikes", + "tableTo": "assetTag", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "assetTagLikes_liked_by_id_authUser_id_fk": { + "name": "assetTagLikes_liked_by_id_authUser_id_fk", + "tableFrom": "assetTagLikes", + "tableTo": "authUser", + "columnsFrom": ["liked_by_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "savedOcGenerators": { + "name": "savedOcGenerators", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "game": { + "name": "game", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "date_created": { + "name": "date_created", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "saved_color_palette": { + "name": "saved_color_palette", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sakura_url": { + "name": "sakura_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "savedOcGenerators_id_unique": { + "name": "savedOcGenerators_id_unique", + "columns": ["id"], + "isUnique": true + }, + "saved_oc_generators_id_idx": { + "name": "saved_oc_generators_id_idx", + "columns": ["id"], + "isUnique": false + }, + "saved_oc_generators_user_id_idx": { + "name": "saved_oc_generators_user_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "savedOcGenerators_user_id_authUser_id_fk": { + "name": "savedOcGenerators_user_id_authUser_id_fk", + "tableFrom": "savedOcGenerators", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "authKey": { + "name": "authKey", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "hashed_password": { + "name": "hashed_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "authKey_id_unique": { + "name": "authKey_id_unique", + "columns": ["id"], + "isUnique": true + }, + "key_user_id_idx": { + "name": "key_user_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "authKey_user_id_authUser_id_fk": { + "name": "authKey_user_id_authUser_id_fk", + "tableFrom": "authKey", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "authUser": { + "name": "authUser", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "avatar_url": { + "name": "avatar_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "banner_url": { + "name": "banner_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "display_name": { + "name": "display_name", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "username_colour": { + "name": "username_colour", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "email_verified": { + "name": "email_verified", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "pronouns": { + "name": "pronouns", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "verified": { + "name": "verified", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "bio": { + "name": "bio", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'No bio set'" + }, + "date_joined": { + "name": "date_joined", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "role_flags": { + "name": "role_flags", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "is_contributor": { + "name": "is_contributor", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "self_assignable_role_flags": { + "name": "self_assignable_role_flags", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "authUser_id_unique": { + "name": "authUser_id_unique", + "columns": ["id"], + "isUnique": true + }, + "authUser_username_unique": { + "name": "authUser_username_unique", + "columns": ["username"], + "isUnique": true + }, + "user_id_idx": { + "name": "user_id_idx", + "columns": ["id"], + "isUnique": false + }, + "user_username_idx": { + "name": "user_username_idx", + "columns": ["username"], + "isUnique": false + }, + "user_email_idx": { + "name": "user_email_idx", + "columns": ["email"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "authSession": { + "name": "authSession", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "active_expires": { + "name": "active_expires", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "idle_expires": { + "name": "idle_expires", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "authSession_id_unique": { + "name": "authSession_id_unique", + "columns": ["id"], + "isUnique": true + }, + "session_user_id_idx": { + "name": "session_user_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "authSession_user_id_authUser_id_fk": { + "name": "authSession_user_id_authUser_id_fk", + "tableFrom": "authSession", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "emailVerificationToken": { + "name": "emailVerificationToken", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "emailVerificationToken_id_unique": { + "name": "emailVerificationToken_id_unique", + "columns": ["id"], + "isUnique": true + }, + "email_verification_token_user_id_idx": { + "name": "email_verification_token_user_id_idx", + "columns": ["user_id"], + "isUnique": false + }, + "email_verification_token_token_idx": { + "name": "email_verification_token_token_idx", + "columns": ["token"], + "isUnique": false + } + }, + "foreignKeys": { + "emailVerificationToken_user_id_authUser_id_fk": { + "name": "emailVerificationToken_user_id_authUser_id_fk", + "tableFrom": "emailVerificationToken", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "passwordResetToken": { + "name": "passwordResetToken", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "passwordResetToken_id_unique": { + "name": "passwordResetToken_id_unique", + "columns": ["id"], + "isUnique": true + }, + "password_reset_token_user_id_idx": { + "name": "password_reset_token_user_id_idx", + "columns": ["user_id"], + "isUnique": false + }, + "password_reset_token_token_idx": { + "name": "password_reset_token_token_idx", + "columns": ["token"], + "isUnique": false + } + }, + "foreignKeys": { + "passwordResetToken_user_id_authUser_id_fk": { + "name": "passwordResetToken_user_id_authUser_id_fk", + "tableFrom": "passwordResetToken", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userCollection": { + "name": "userCollection", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "date_created": { + "name": "date_created", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": { + "userCollection_id_unique": { + "name": "userCollection_id_unique", + "columns": ["id"], + "isUnique": true + }, + "collection_id_idx": { + "name": "collection_id_idx", + "columns": ["id"], + "isUnique": false + }, + "user_collection_id_idx": { + "name": "user_collection_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "userCollection_user_id_authUser_id_fk": { + "name": "userCollection_user_id_authUser_id_fk", + "tableFrom": "userCollection", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetCollectionAsset": { + "name": "assetCollectionAsset", + "columns": { + "collection_id": { + "name": "collection_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "date_added": { + "name": "date_added", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "collection_assets_collection_id_idx": { + "name": "collection_assets_collection_id_idx", + "columns": ["collection_id"], + "isUnique": false + }, + "collection_assets_asset_id_idx": { + "name": "collection_assets_asset_id_idx", + "columns": ["asset_id"], + "isUnique": false + } + }, + "foreignKeys": { + "assetCollectionAsset_collection_id_userCollection_id_fk": { + "name": "assetCollectionAsset_collection_id_userCollection_id_fk", + "tableFrom": "assetCollectionAsset", + "tableTo": "userCollection", + "columnsFrom": ["collection_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "assetCollectionAsset_asset_id_asset_id_fk": { + "name": "assetCollectionAsset_asset_id_asset_id_fk", + "tableFrom": "assetCollectionAsset", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "socialsConnection": { + "name": "socialsConnection", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "discord_id": { + "name": "discord_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "socialsConnection_id_unique": { + "name": "socialsConnection_id_unique", + "columns": ["id"], + "isUnique": true + }, + "socialsConnection_user_id_unique": { + "name": "socialsConnection_user_id_unique", + "columns": ["user_id"], + "isUnique": true + }, + "socials_connection_user_id_idx": { + "name": "socials_connection_user_id_idx", + "columns": ["user_id"], + "isUnique": false + }, + "socials_connection_discord_id_idx": { + "name": "socials_connection_discord_id_idx", + "columns": ["discord_id"], + "isUnique": false + } + }, + "foreignKeys": { + "socialsConnection_user_id_authUser_id_fk": { + "name": "socialsConnection_user_id_authUser_id_fk", + "tableFrom": "socialsConnection", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userFavorite": { + "name": "userFavorite", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": { + "userFavorite_id_unique": { + "name": "userFavorite_id_unique", + "columns": ["id"], + "isUnique": true + }, + "favorited_assets_id_idx": { + "name": "favorited_assets_id_idx", + "columns": ["id"], + "isUnique": false + }, + "favorited_assets_user_id_idx": { + "name": "favorited_assets_user_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "userFavorite_user_id_authUser_id_fk": { + "name": "userFavorite_user_id_authUser_id_fk", + "tableFrom": "userFavorite", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userFavoriteAsset": { + "name": "userFavoriteAsset", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "favorited_assets_id": { + "name": "favorited_assets_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "userFavoriteAsset_id_unique": { + "name": "userFavoriteAsset_id_unique", + "columns": ["id"], + "isUnique": true + }, + "favorited_assets_assets_id_idx": { + "name": "favorited_assets_assets_id_idx", + "columns": ["id"], + "isUnique": false + }, + "favorited_assets_assets_user_id_idx": { + "name": "favorited_assets_assets_user_id_idx", + "columns": ["favorited_assets_id"], + "isUnique": false + }, + "favorited_assets_assets_asset_id_idx": { + "name": "favorited_assets_assets_asset_id_idx", + "columns": ["asset_id"], + "isUnique": false + } + }, + "foreignKeys": { + "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk": { + "name": "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk", + "tableFrom": "userFavoriteAsset", + "tableTo": "userFavorite", + "columnsFrom": ["favorited_assets_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "userFavoriteAsset_asset_id_asset_id_fk": { + "name": "userFavoriteAsset_asset_id_asset_id_fk", + "tableFrom": "userFavoriteAsset", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userFollowing": { + "name": "userFollowing", + "columns": { + "followerId": { + "name": "followerId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "followingId": { + "name": "followingId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "userfollowing_follower_idx": { + "name": "userfollowing_follower_idx", + "columns": ["followerId"], + "isUnique": false + }, + "userfollowing_following_idx": { + "name": "userfollowing_following_idx", + "columns": ["followingId"], + "isUnique": false + } + }, + "foreignKeys": { + "userFollowing_followerId_authUser_id_fk": { + "name": "userFollowing_followerId_authUser_id_fk", + "tableFrom": "userFollowing", + "tableTo": "authUser", + "columnsFrom": ["followerId"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "userFollowing_followingId_authUser_id_fk": { + "name": "userFollowing_followingId_authUser_id_fk", + "tableFrom": "userFollowing", + "tableTo": "authUser", + "columnsFrom": ["followingId"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userCollectionLikes": { + "name": "userCollectionLikes", + "columns": { + "collection_id": { + "name": "collection_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "userCollectionNetworking_collection_idx": { + "name": "userCollectionNetworking_collection_idx", + "columns": ["collection_id"], + "isUnique": false + }, + "userCollectionNetworking_likedBy_idx": { + "name": "userCollectionNetworking_likedBy_idx", + "columns": ["liked_by_id"], + "isUnique": false + } + }, + "foreignKeys": { + "userCollectionLikes_collection_id_userCollection_id_fk": { + "name": "userCollectionLikes_collection_id_userCollection_id_fk", + "tableFrom": "userCollectionLikes", + "tableTo": "userCollection", + "columnsFrom": ["collection_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "userCollectionLikes_liked_by_id_authUser_id_fk": { + "name": "userCollectionLikes_liked_by_id_authUser_id_fk", + "tableFrom": "userCollectionLikes", + "tableTo": "authUser", + "columnsFrom": ["liked_by_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} }, - "gameLikes": { - "name": "gameLikes", - "columns": { - "asset_id": { - "name": "asset_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "gamelikes_game_idx": { - "name": "gamelikes_game_idx", - "columns": [ - "asset_id" - ], - "isUnique": false - }, - "gamelikes_likedby_idx": { - "name": "gamelikes_likedby_idx", - "columns": [ - "liked_by_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "gameLikes_asset_id_game_id_fk": { - "name": "gameLikes_asset_id_game_id_fk", - "tableFrom": "gameLikes", - "tableTo": "game", - "columnsFrom": [ - "asset_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "gameLikes_liked_by_id_authUser_id_fk": { - "name": "gameLikes_liked_by_id_authUser_id_fk", - "tableFrom": "gameLikes", - "tableTo": "authUser", - "columnsFrom": [ - "liked_by_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetTag": { - "name": "assetTag", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetTag_id_unique": { - "name": "assetTag_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "assetTag_name_unique": { - "name": "assetTag_name_unique", - "columns": [ - "name" - ], - "isUnique": true - }, - "asset_tag_id_idx": { - "name": "asset_tag_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "asset_tag_name_idx": { - "name": "asset_tag_name_idx", - "columns": [ - "name" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetTagAsset": { - "name": "assetTagAsset", - "columns": { - "asset_tag_id": { - "name": "asset_tag_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "asset_tags_assets_asset_tag_id_idx": { - "name": "asset_tags_assets_asset_tag_id_idx", - "columns": [ - "asset_tag_id" - ], - "isUnique": false - }, - "asset_tags_assets_asset_id_idx": { - "name": "asset_tags_assets_asset_id_idx", - "columns": [ - "asset_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "assetTagAsset_asset_tag_id_assetTag_id_fk": { - "name": "assetTagAsset_asset_tag_id_assetTag_id_fk", - "tableFrom": "assetTagAsset", - "tableTo": "assetTag", - "columnsFrom": [ - "asset_tag_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "assetTagAsset_asset_id_asset_id_fk": { - "name": "assetTagAsset_asset_id_asset_id_fk", - "tableFrom": "assetTagAsset", - "tableTo": "asset", - "columnsFrom": [ - "asset_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetTagLikes": { - "name": "assetTagLikes", - "columns": { - "asset_id": { - "name": "asset_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetTagLikes_asset_idx": { - "name": "assetTagLikes_asset_idx", - "columns": [ - "asset_id" - ], - "isUnique": false - }, - "assetTagLikes_likedby_idx": { - "name": "assetTagLikes_likedby_idx", - "columns": [ - "liked_by_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "assetTagLikes_asset_id_assetTag_id_fk": { - "name": "assetTagLikes_asset_id_assetTag_id_fk", - "tableFrom": "assetTagLikes", - "tableTo": "assetTag", - "columnsFrom": [ - "asset_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "assetTagLikes_liked_by_id_authUser_id_fk": { - "name": "assetTagLikes_liked_by_id_authUser_id_fk", - "tableFrom": "assetTagLikes", - "tableTo": "authUser", - "columnsFrom": [ - "liked_by_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "savedOcGenerators": { - "name": "savedOcGenerators", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "game": { - "name": "game", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "date_created": { - "name": "date_created", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "content": { - "name": "content", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "saved_color_palette": { - "name": "saved_color_palette", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "sakura_url": { - "name": "sakura_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "savedOcGenerators_id_unique": { - "name": "savedOcGenerators_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "saved_oc_generators_id_idx": { - "name": "saved_oc_generators_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "saved_oc_generators_user_id_idx": { - "name": "saved_oc_generators_user_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "savedOcGenerators_user_id_authUser_id_fk": { - "name": "savedOcGenerators_user_id_authUser_id_fk", - "tableFrom": "savedOcGenerators", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "authKey": { - "name": "authKey", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "hashed_password": { - "name": "hashed_password", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "authKey_id_unique": { - "name": "authKey_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "key_user_id_idx": { - "name": "key_user_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "authKey_user_id_authUser_id_fk": { - "name": "authKey_user_id_authUser_id_fk", - "tableFrom": "authKey", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "authUser": { - "name": "authUser", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "avatar_url": { - "name": "avatar_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "banner_url": { - "name": "banner_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "display_name": { - "name": "display_name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "username": { - "name": "username", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "username_colour": { - "name": "username_colour", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "email": { - "name": "email", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "email_verified": { - "name": "email_verified", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "pronouns": { - "name": "pronouns", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "verified": { - "name": "verified", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "bio": { - "name": "bio", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "'No bio set'" - }, - "date_joined": { - "name": "date_joined", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "role_flags": { - "name": "role_flags", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 1 - }, - "is_contributor": { - "name": "is_contributor", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "self_assignable_role_flags": { - "name": "self_assignable_role_flags", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "authUser_id_unique": { - "name": "authUser_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "authUser_username_unique": { - "name": "authUser_username_unique", - "columns": [ - "username" - ], - "isUnique": true - }, - "user_id_idx": { - "name": "user_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "user_username_idx": { - "name": "user_username_idx", - "columns": [ - "username" - ], - "isUnique": false - }, - "user_email_idx": { - "name": "user_email_idx", - "columns": [ - "email" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "authSession": { - "name": "authSession", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "active_expires": { - "name": "active_expires", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "idle_expires": { - "name": "idle_expires", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "authSession_id_unique": { - "name": "authSession_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "session_user_id_idx": { - "name": "session_user_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "authSession_user_id_authUser_id_fk": { - "name": "authSession_user_id_authUser_id_fk", - "tableFrom": "authSession", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "emailVerificationToken": { - "name": "emailVerificationToken", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "emailVerificationToken_id_unique": { - "name": "emailVerificationToken_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "email_verification_token_user_id_idx": { - "name": "email_verification_token_user_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - }, - "email_verification_token_token_idx": { - "name": "email_verification_token_token_idx", - "columns": [ - "token" - ], - "isUnique": false - } - }, - "foreignKeys": { - "emailVerificationToken_user_id_authUser_id_fk": { - "name": "emailVerificationToken_user_id_authUser_id_fk", - "tableFrom": "emailVerificationToken", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "passwordResetToken": { - "name": "passwordResetToken", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "passwordResetToken_id_unique": { - "name": "passwordResetToken_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "password_reset_token_user_id_idx": { - "name": "password_reset_token_user_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - }, - "password_reset_token_token_idx": { - "name": "password_reset_token_token_idx", - "columns": [ - "token" - ], - "isUnique": false - } - }, - "foreignKeys": { - "passwordResetToken_user_id_authUser_id_fk": { - "name": "passwordResetToken_user_id_authUser_id_fk", - "tableFrom": "passwordResetToken", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userCollection": { - "name": "userCollection", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "date_created": { - "name": "date_created", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - } - }, - "indexes": { - "userCollection_id_unique": { - "name": "userCollection_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "collection_id_idx": { - "name": "collection_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "user_collection_id_idx": { - "name": "user_collection_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "userCollection_user_id_authUser_id_fk": { - "name": "userCollection_user_id_authUser_id_fk", - "tableFrom": "userCollection", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetCollectionAsset": { - "name": "assetCollectionAsset", - "columns": { - "collection_id": { - "name": "collection_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "date_added": { - "name": "date_added", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "collection_assets_collection_id_idx": { - "name": "collection_assets_collection_id_idx", - "columns": [ - "collection_id" - ], - "isUnique": false - }, - "collection_assets_asset_id_idx": { - "name": "collection_assets_asset_id_idx", - "columns": [ - "asset_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "assetCollectionAsset_collection_id_userCollection_id_fk": { - "name": "assetCollectionAsset_collection_id_userCollection_id_fk", - "tableFrom": "assetCollectionAsset", - "tableTo": "userCollection", - "columnsFrom": [ - "collection_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "assetCollectionAsset_asset_id_asset_id_fk": { - "name": "assetCollectionAsset_asset_id_asset_id_fk", - "tableFrom": "assetCollectionAsset", - "tableTo": "asset", - "columnsFrom": [ - "asset_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "socialsConnection": { - "name": "socialsConnection", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "discord_id": { - "name": "discord_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "socialsConnection_id_unique": { - "name": "socialsConnection_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "socialsConnection_user_id_unique": { - "name": "socialsConnection_user_id_unique", - "columns": [ - "user_id" - ], - "isUnique": true - }, - "socials_connection_user_id_idx": { - "name": "socials_connection_user_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - }, - "socials_connection_discord_id_idx": { - "name": "socials_connection_discord_id_idx", - "columns": [ - "discord_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "socialsConnection_user_id_authUser_id_fk": { - "name": "socialsConnection_user_id_authUser_id_fk", - "tableFrom": "socialsConnection", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userFavorite": { - "name": "userFavorite", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - } - }, - "indexes": { - "userFavorite_id_unique": { - "name": "userFavorite_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "favorited_assets_id_idx": { - "name": "favorited_assets_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "favorited_assets_user_id_idx": { - "name": "favorited_assets_user_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "userFavorite_user_id_authUser_id_fk": { - "name": "userFavorite_user_id_authUser_id_fk", - "tableFrom": "userFavorite", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userFavoriteAsset": { - "name": "userFavoriteAsset", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "favorited_assets_id": { - "name": "favorited_assets_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "userFavoriteAsset_id_unique": { - "name": "userFavoriteAsset_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "favorited_assets_assets_id_idx": { - "name": "favorited_assets_assets_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "favorited_assets_assets_user_id_idx": { - "name": "favorited_assets_assets_user_id_idx", - "columns": [ - "favorited_assets_id" - ], - "isUnique": false - }, - "favorited_assets_assets_asset_id_idx": { - "name": "favorited_assets_assets_asset_id_idx", - "columns": [ - "asset_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk": { - "name": "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk", - "tableFrom": "userFavoriteAsset", - "tableTo": "userFavorite", - "columnsFrom": [ - "favorited_assets_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "userFavoriteAsset_asset_id_asset_id_fk": { - "name": "userFavoriteAsset_asset_id_asset_id_fk", - "tableFrom": "userFavoriteAsset", - "tableTo": "asset", - "columnsFrom": [ - "asset_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userFollowing": { - "name": "userFollowing", - "columns": { - "followerId": { - "name": "followerId", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "followingId": { - "name": "followingId", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "userfollowing_follower_idx": { - "name": "userfollowing_follower_idx", - "columns": [ - "followerId" - ], - "isUnique": false - }, - "userfollowing_following_idx": { - "name": "userfollowing_following_idx", - "columns": [ - "followingId" - ], - "isUnique": false - } - }, - "foreignKeys": { - "userFollowing_followerId_authUser_id_fk": { - "name": "userFollowing_followerId_authUser_id_fk", - "tableFrom": "userFollowing", - "tableTo": "authUser", - "columnsFrom": [ - "followerId" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "userFollowing_followingId_authUser_id_fk": { - "name": "userFollowing_followingId_authUser_id_fk", - "tableFrom": "userFollowing", - "tableTo": "authUser", - "columnsFrom": [ - "followingId" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userCollectionLikes": { - "name": "userCollectionLikes", - "columns": { - "collection_id": { - "name": "collection_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "userCollectionNetworking_collection_idx": { - "name": "userCollectionNetworking_collection_idx", - "columns": [ - "collection_id" - ], - "isUnique": false - }, - "userCollectionNetworking_likedBy_idx": { - "name": "userCollectionNetworking_likedBy_idx", - "columns": [ - "liked_by_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "userCollectionLikes_collection_id_userCollection_id_fk": { - "name": "userCollectionLikes_collection_id_userCollection_id_fk", - "tableFrom": "userCollectionLikes", - "tableTo": "userCollection", - "columnsFrom": [ - "collection_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "userCollectionLikes_liked_by_id_authUser_id_fk": { - "name": "userCollectionLikes_liked_by_id_authUser_id_fk", - "tableFrom": "userCollectionLikes", - "tableTo": "authUser", - "columnsFrom": [ - "liked_by_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} } - }, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - } -} \ No newline at end of file +} diff --git a/src/v2/db/migrations/meta/_journal.json b/src/v2/db/migrations/meta/_journal.json index 8ab7d8a..a0e2a74 100644 --- a/src/v2/db/migrations/meta/_journal.json +++ b/src/v2/db/migrations/meta/_journal.json @@ -1,13 +1,13 @@ { - "version": "5", - "dialect": "sqlite", - "entries": [ - { - "idx": 0, - "version": "5", - "when": 1701248157083, - "tag": "0000_spotty_iron_monger", - "breakpoints": true - } - ] -} \ No newline at end of file + "version": "5", + "dialect": "sqlite", + "entries": [ + { + "idx": 0, + "version": "5", + "when": 1701248157083, + "tag": "0000_spotty_iron_monger", + "breakpoints": true + } + ] +} diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index f12aa15..1dd19df 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -15,8 +15,8 @@ export * from "./schema/oc-generators/oc-generators" export * from "./schema/user/user" export * from "./schema/user/user-attributes" -export * from "./schema/user/user-collections" +export * from "./schema/collections/user-collections" export * from "./schema/user/user-connections" export * from "./schema/user/user-favorites" export * from "./schema/user/user-following" -export * from "./schema/user/user-collection-likes" +export * from "./schema/collections/user-collection-likes" diff --git a/src/v2/db/schema/user/user-collection-likes.ts b/src/v2/db/schema/collections/user-collection-likes.ts similarity index 97% rename from src/v2/db/schema/user/user-collection-likes.ts rename to src/v2/db/schema/collections/user-collection-likes.ts index 86f625d..8050e03 100644 --- a/src/v2/db/schema/user/user-collection-likes.ts +++ b/src/v2/db/schema/collections/user-collection-likes.ts @@ -6,7 +6,7 @@ import { // uniqueIndex, index, } from "drizzle-orm/sqlite-core" -import { authUser } from "./user" +import { authUser } from "../user/user" import { userCollection } from "./user-collections" export const userCollectionLikes = sqliteTable( diff --git a/src/v2/db/schema/user/user-collections.ts b/src/v2/db/schema/collections/user-collections.ts similarity index 98% rename from src/v2/db/schema/user/user-collections.ts rename to src/v2/db/schema/collections/user-collections.ts index 78acf77..8099e25 100644 --- a/src/v2/db/schema/user/user-collections.ts +++ b/src/v2/db/schema/collections/user-collections.ts @@ -7,7 +7,7 @@ import { // uniqueIndex, index, } from "drizzle-orm/sqlite-core" -import { authUser } from "./user" +import { authUser } from "../user/user" import { asset } from "../asset/asset" import { generateID } from "@/v2/lib/oslo" import { userCollectionLikes } from "./user-collection-likes" diff --git a/src/v2/db/schema/user/user.ts b/src/v2/db/schema/user/user.ts index 03f6c7a..edfbc7a 100644 --- a/src/v2/db/schema/user/user.ts +++ b/src/v2/db/schema/user/user.ts @@ -12,11 +12,11 @@ import { asset } from "../asset/asset" import { userFavorite } from "./user-favorites" import { savedOcGenerators } from "../oc-generators/oc-generators" import { socialsConnection } from "./user-connections" -import { userCollection } from "./user-collections" +import { userCollection } from "../collections/user-collections" import { passwordResetToken } from "./user-attributes" import { emailVerificationToken } from "./user-attributes" import { atlas } from "../asset/asset-atlas" -import { userCollectionLikes } from "./user-collection-likes" +import { userCollectionLikes } from "../collections/user-collection-likes" import { assetLikes } from "../asset/asset-likes" import { gameLikes } from "../game/game-likes" import { assetTagLikes } from "../tags/asset-tags-likes" diff --git a/src/v2/lib/managers/asset-category/asset-category-likes.ts b/src/v2/lib/managers/asset-category/asset-category-likes.ts new file mode 100644 index 0000000..a72a03c --- /dev/null +++ b/src/v2/lib/managers/asset-category/asset-category-likes.ts @@ -0,0 +1,61 @@ +import { DrizzleInstance } from "@/v2/db/turso" +import { eq, and } from "drizzle-orm" +import { assetCategoryLikes } from "@/v2/db/schema/categories/asset-categories-likes" + +export class AssetCategoryLikesManager { + constructor(private drizzle: DrizzleInstance) {} + + /** + * Likes a category for a user. + * @param assetCategoryId - The ID of the collection to like. + * @param userId - The ID of the user to like the collection for. + */ + public async likeAssetCategory( + assetCategoryId: string, + userId: string + ): Promise { + try { + await this.drizzle.insert(assetCategoryLikes).values({ + assetCategoryId, + likedById: userId, + }) + } catch (e) { + console.error( + `Error liking category ${assetCategoryId} for user ${userId}`, + e + ) + throw new Error( + `Error liking category ${assetCategoryId} for user ${userId}` + ) + } + } + + /** + * Unlikes a category for a user. + * @param assetCategoryId - The ID of the category to unlike. + * @param userId - The ID of the user to unlike the category for. + */ + public async unlikeAssetCategory( + assetCategoryId: string, + userId: string + ): Promise { + try { + await this.drizzle + .delete(assetCategoryLikes) + .where( + and( + eq(assetCategoryLikes.assetCategoryId, assetCategoryId), + eq(assetCategoryLikes.likedById, userId) + ) + ) + } catch (e) { + console.error( + `Error liking category ${assetCategoryId} for user ${userId}`, + e + ) + throw new Error( + `Error liking category ${assetCategoryId} for user ${userId}` + ) + } + } +} diff --git a/src/v2/lib/managers/asset/asset-likes.ts b/src/v2/lib/managers/asset/asset-likes.ts index f2b3604..8704165 100644 --- a/src/v2/lib/managers/asset/asset-likes.ts +++ b/src/v2/lib/managers/asset/asset-likes.ts @@ -6,9 +6,9 @@ export class AssetLikesManager { constructor(private drizzle: DrizzleInstance) {} /** - * Favorites an asset for a user. - * @param assetId - The ID of the asset to favorite. - * @param userId - The ID of the user to favorite the asset for. + * Likes an asset for a user. + * @param assetId - The ID of the asset to like. + * @param userId - The ID of the user to like the asset for. */ public async likeAsset(assetId: string, userId: string): Promise { try { @@ -23,9 +23,9 @@ export class AssetLikesManager { } /** - * Unfavorites an asset for a user. - * @param assetId - The ID of the asset to unfavorite. - * @param userId - The ID of the user to unfavorite the asset for. + * Unlikes an asset for a user. + * @param assetId - The ID of the asset to like. + * @param userId - The ID of the user to like the asset for. */ public async unlikeAsset(assetId: string, userId: string): Promise { try { diff --git a/src/v2/lib/managers/collection/collection-likes.ts b/src/v2/lib/managers/collection/collection-likes.ts new file mode 100644 index 0000000..0e35275 --- /dev/null +++ b/src/v2/lib/managers/collection/collection-likes.ts @@ -0,0 +1,61 @@ +import { DrizzleInstance } from "@/v2/db/turso" +import { eq, and } from "drizzle-orm" +import { userCollectionLikes } from "@/v2/db/schema/collections/user-collection-likes" + +export class UserCollectionLikesManager { + constructor(private drizzle: DrizzleInstance) {} + + /** + * Likes a collection for a user. + * @param collectionId - The ID of the collection to like. + * @param userId - The ID of the user to like the collection for. + */ + public async likeCollection( + collectionId: string, + userId: string + ): Promise { + try { + await this.drizzle.insert(userCollectionLikes).values({ + collectionId, + likedById: userId, + }) + } catch (e) { + console.error( + `Error liking game ${collectionId} for user ${userId}`, + e + ) + throw new Error( + `Error liking game ${collectionId} for user ${userId}` + ) + } + } + + /** + * Unlikes a collection for a user. + * @param collectionId - The ID of the collection to unlike. + * @param userId - The ID of the user to unlike the collection for. + */ + public async unlikeCollection( + collectionId: string, + userId: string + ): Promise { + try { + await this.drizzle + .delete(userCollectionLikes) + .where( + and( + eq(userCollectionLikes.collectionId, collectionId), + eq(userCollectionLikes.likedById, userId) + ) + ) + } catch (e) { + console.error( + `Error liking game ${collectionId} for user ${userId}`, + e + ) + throw new Error( + `Error liking game ${collectionId} for user ${userId}` + ) + } + } +} diff --git a/src/v2/lib/managers/game/game-likes.ts b/src/v2/lib/managers/game/game-likes.ts new file mode 100644 index 0000000..69fa05d --- /dev/null +++ b/src/v2/lib/managers/game/game-likes.ts @@ -0,0 +1,45 @@ +import { DrizzleInstance } from "@/v2/db/turso" +import { eq, and } from "drizzle-orm" +import { gameLikes } from "@/v2/db/schema/game/game-likes" + +export class GameLikesManager { + constructor(private drizzle: DrizzleInstance) {} + + /** + * Likes a game for a user. + * @param gameId - The ID of the game to like. + * @param userId - The ID of the user to unlike the game for. + */ + public async likeGame(gameId: string, userId: string): Promise { + try { + await this.drizzle.insert(gameLikes).values({ + gameId, + likedById: userId, + }) + } catch (e) { + console.error(`Error liking game ${gameId} for user ${userId}`, e) + throw new Error(`Error liking game ${gameId} for user ${userId}`) + } + } + + /** + * Unlikes a game for a user. + * @param gameId - The ID of the game to unlike. + * @param userId - The ID of the user to unlike the game for. + */ + public async unlikeGame(gameId: string, userId: string): Promise { + try { + await this.drizzle + .delete(gameLikes) + .where( + and( + eq(gameLikes.gameId, gameId), + eq(gameLikes.likedById, userId) + ) + ) + } catch (e) { + console.error(`Error liking game ${gameId} for user ${userId}`, e) + throw new Error(`Error liking game ${gameId} for user ${userId}`) + } + } +} diff --git a/src/v2/lib/managers/tag/tag-likes.ts b/src/v2/lib/managers/tag/tag-likes.ts new file mode 100644 index 0000000..d0794db --- /dev/null +++ b/src/v2/lib/managers/tag/tag-likes.ts @@ -0,0 +1,51 @@ +import { DrizzleInstance } from "@/v2/db/turso" +import { eq, and } from "drizzle-orm" +import { assetTagLikes } from "@/v2/db/schema/tags/asset-tags-likes" + +export class AssetTagLikesManager { + constructor(private drizzle: DrizzleInstance) {} + + /** + * Likes a game for a user. + * @param assetTagId - The ID of the tag to like. + * @param userId - The ID of the user to like the tag for. + */ + public async likeTag(assetTagId: string, userId: string): Promise { + try { + await this.drizzle.insert(assetTagLikes).values({ + assetTagId, + likedById: userId, + }) + } catch (e) { + console.error( + `Error liking tag ${assetTagId} for user ${userId}`, + e + ) + throw new Error(`Error liking tag ${assetTagId} for user ${userId}`) + } + } + + /** + * Likes a tag for a user. + * @param assetTagId - The ID of the tag to unlike. + * @param userId - The ID of the user to unlike the tag for. + */ + public async unlikeTag(assetTagId: string, userId: string): Promise { + try { + await this.drizzle + .delete(assetTagLikes) + .where( + and( + eq(assetTagLikes.assetTagId, assetTagId), + eq(assetTagLikes.likedById, userId) + ) + ) + } catch (e) { + console.error( + `Error liking tag ${assetTagId} for user ${userId}`, + e + ) + throw new Error(`Error liking tag ${assetTagId} for user ${userId}`) + } + } +} From 10aad41d478c544d9c3facaa05a7cf6d27f1f4d8 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Wed, 29 Nov 2023 11:05:26 +0000 Subject: [PATCH 173/318] fix tablename --- src/v2/db/drizzle.ts | 5 +- ...nger.sql => 0000_smart_scarlet_spider.sql} | 6 +- src/v2/db/migrations/meta/0000_snapshot.json | 3930 +++++++++-------- src/v2/db/migrations/meta/_journal.json | 24 +- src/v2/db/turso.ts | 2 - 5 files changed, 2124 insertions(+), 1843 deletions(-) rename src/v2/db/migrations/{0000_spotty_iron_monger.sql => 0000_smart_scarlet_spider.sql} (98%) diff --git a/src/v2/db/drizzle.ts b/src/v2/db/drizzle.ts index 562e061..4f6d52f 100644 --- a/src/v2/db/drizzle.ts +++ b/src/v2/db/drizzle.ts @@ -1,3 +1,4 @@ +// TODO(dromzeh): organize this, not a priority right now though export const tableNames = { asset: "asset", authKey: "authKey", @@ -22,8 +23,6 @@ export const tableNames = { userFavorite: "userFavorite", userFavoriteAsset: "userFavoriteAsset", userCollection: "userCollection", - userCollectionAsset: "assetCollectionAsset", + userCollectionAsset: "userCollectionAsset", socialsConnection: "socialsConnection", } - -export * as schema from "@/v2/db/schema" diff --git a/src/v2/db/migrations/0000_spotty_iron_monger.sql b/src/v2/db/migrations/0000_smart_scarlet_spider.sql similarity index 98% rename from src/v2/db/migrations/0000_spotty_iron_monger.sql rename to src/v2/db/migrations/0000_smart_scarlet_spider.sql index 8eabf56..d30ec80 100644 --- a/src/v2/db/migrations/0000_spotty_iron_monger.sql +++ b/src/v2/db/migrations/0000_smart_scarlet_spider.sql @@ -182,7 +182,7 @@ CREATE TABLE `userCollection` ( FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade ); --> statement-breakpoint -CREATE TABLE `assetCollectionAsset` ( +CREATE TABLE `userCollectionAsset` ( `collection_id` text NOT NULL, `asset_id` integer NOT NULL, `date_added` text NOT NULL, @@ -285,8 +285,8 @@ CREATE INDEX `password_reset_token_token_idx` ON `passwordResetToken` (`token`); CREATE UNIQUE INDEX `userCollection_id_unique` ON `userCollection` (`id`);--> statement-breakpoint CREATE INDEX `collection_id_idx` ON `userCollection` (`id`);--> statement-breakpoint CREATE INDEX `user_collection_id_idx` ON `userCollection` (`user_id`);--> statement-breakpoint -CREATE INDEX `collection_assets_collection_id_idx` ON `assetCollectionAsset` (`collection_id`);--> statement-breakpoint -CREATE INDEX `collection_assets_asset_id_idx` ON `assetCollectionAsset` (`asset_id`);--> statement-breakpoint +CREATE INDEX `collection_assets_collection_id_idx` ON `userCollectionAsset` (`collection_id`);--> statement-breakpoint +CREATE INDEX `collection_assets_asset_id_idx` ON `userCollectionAsset` (`asset_id`);--> statement-breakpoint CREATE UNIQUE INDEX `socialsConnection_id_unique` ON `socialsConnection` (`id`);--> statement-breakpoint CREATE UNIQUE INDEX `socialsConnection_user_id_unique` ON `socialsConnection` (`user_id`);--> statement-breakpoint CREATE INDEX `socials_connection_user_id_idx` ON `socialsConnection` (`user_id`);--> statement-breakpoint diff --git a/src/v2/db/migrations/meta/0000_snapshot.json b/src/v2/db/migrations/meta/0000_snapshot.json index 2634119..768d3e9 100644 --- a/src/v2/db/migrations/meta/0000_snapshot.json +++ b/src/v2/db/migrations/meta/0000_snapshot.json @@ -1,1829 +1,2113 @@ { - "version": "5", - "dialect": "sqlite", - "id": "1e99eb2e-cdfd-4807-b82b-8d4d72bc4a31", - "prevId": "00000000-0000-0000-0000-000000000000", - "tables": { - "asset": { - "name": "asset", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "extension": { - "name": "extension", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "game": { - "name": "game", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_category": { - "name": "asset_category", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by_id": { - "name": "uploaded_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by_name": { - "name": "uploaded_by_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "url": { - "name": "url", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "status": { - "name": "status", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "'pending'" - }, - "uploaded_date": { - "name": "uploaded_date", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_is_optimized": { - "name": "asset_is_optimized", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "asset_is_suggestive": { - "name": "asset_is_suggestive", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "view_count": { - "name": "view_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "download_count": { - "name": "download_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "file_size": { - "name": "file_size", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "width": { - "name": "width", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "height": { - "name": "height", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "assets_id_idx": { - "name": "assets_id_idx", - "columns": ["id"], - "isUnique": false - }, - "assets_name_idx": { - "name": "assets_name_idx", - "columns": ["name"], - "isUnique": false - }, - "assets_game_name_idx": { - "name": "assets_game_name_idx", - "columns": ["game"], - "isUnique": false - }, - "assets_asset_category_name_idx": { - "name": "assets_asset_category_name_idx", - "columns": ["asset_category"], - "isUnique": false - }, - "assets_uploaded_by_id_idx": { - "name": "assets_uploaded_by_id_idx", - "columns": ["uploaded_by_id"], - "isUnique": false - } - }, - "foreignKeys": { - "asset_game_game_id_fk": { - "name": "asset_game_game_id_fk", - "tableFrom": "asset", - "tableTo": "game", - "columnsFrom": ["game"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "asset_asset_category_assetCategory_id_fk": { - "name": "asset_asset_category_assetCategory_id_fk", - "tableFrom": "asset", - "tableTo": "assetCategory", - "columnsFrom": ["asset_category"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "asset_uploaded_by_id_authUser_id_fk": { - "name": "asset_uploaded_by_id_authUser_id_fk", - "tableFrom": "asset", - "tableTo": "authUser", - "columnsFrom": ["uploaded_by_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "asset_uploaded_by_name_authUser_username_fk": { - "name": "asset_uploaded_by_name_authUser_username_fk", - "tableFrom": "asset", - "tableTo": "authUser", - "columnsFrom": ["uploaded_by_name"], - "columnsTo": ["username"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "atlas": { - "name": "atlas", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "url": { - "name": "url", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by": { - "name": "uploaded_by", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by_name": { - "name": "uploaded_by_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_date": { - "name": "uploaded_date", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "file_size": { - "name": "file_size", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "atlas_id_unique": { - "name": "atlas_id_unique", - "columns": ["id"], - "isUnique": true - }, - "atlas_id_idx": { - "name": "atlas_id_idx", - "columns": ["id"], - "isUnique": false - }, - "atlas_uploaded_by_idx": { - "name": "atlas_uploaded_by_idx", - "columns": ["uploaded_by"], - "isUnique": false - }, - "atlas_uploaded_by_name_idx": { - "name": "atlas_uploaded_by_name_idx", - "columns": ["uploaded_by_name"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "atlasToAsset": { - "name": "atlasToAsset", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "atlas_id": { - "name": "atlas_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "atlas_to_assets_id_idx": { - "name": "atlas_to_assets_id_idx", - "columns": ["id"], - "isUnique": false - }, - "atlas_to_assets_atlas_id_idx": { - "name": "atlas_to_assets_atlas_id_idx", - "columns": ["atlas_id"], - "isUnique": false - }, - "atlas_to_assets_asset_id_idx": { - "name": "atlas_to_assets_asset_id_idx", - "columns": ["asset_id"], - "isUnique": false - } - }, - "foreignKeys": { - "atlasToAsset_atlas_id_atlas_id_fk": { - "name": "atlasToAsset_atlas_id_atlas_id_fk", - "tableFrom": "atlasToAsset", - "tableTo": "atlas", - "columnsFrom": ["atlas_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "atlasToAsset_asset_id_asset_id_fk": { - "name": "atlasToAsset_asset_id_asset_id_fk", - "tableFrom": "atlasToAsset", - "tableTo": "asset", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetLikes": { - "name": "assetLikes", - "columns": { - "asset_id": { - "name": "asset_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetlikes_asset_idx": { - "name": "assetlikes_asset_idx", - "columns": ["asset_id"], - "isUnique": false - }, - "assetlikes_likedBy_idx": { - "name": "assetlikes_likedBy_idx", - "columns": ["liked_by_id"], - "isUnique": false - } - }, - "foreignKeys": { - "assetLikes_asset_id_asset_id_fk": { - "name": "assetLikes_asset_id_asset_id_fk", - "tableFrom": "assetLikes", - "tableTo": "asset", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - }, - "assetLikes_liked_by_id_authUser_id_fk": { - "name": "assetLikes_liked_by_id_authUser_id_fk", - "tableFrom": "assetLikes", - "tableTo": "authUser", - "columnsFrom": ["liked_by_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetCategory": { - "name": "assetCategory", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetCategory_id_unique": { - "name": "assetCategory_id_unique", - "columns": ["id"], - "isUnique": true - }, - "assetCategory_name_unique": { - "name": "assetCategory_name_unique", - "columns": ["name"], - "isUnique": true - }, - "asset_category_id_idx": { - "name": "asset_category_id_idx", - "columns": ["id"], - "isUnique": false - }, - "asset_category_name_idx": { - "name": "asset_category_name_idx", - "columns": ["name"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "gameAssetCategory": { - "name": "gameAssetCategory", - "columns": { - "game_id": { - "name": "game_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_category_id": { - "name": "asset_category_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "game_asset_category_game_id_idx": { - "name": "game_asset_category_game_id_idx", - "columns": ["game_id"], - "isUnique": false - }, - "game_asset_category_asset_category_id_idx": { - "name": "game_asset_category_asset_category_id_idx", - "columns": ["asset_category_id"], - "isUnique": false - } - }, - "foreignKeys": { - "gameAssetCategory_game_id_game_id_fk": { - "name": "gameAssetCategory_game_id_game_id_fk", - "tableFrom": "gameAssetCategory", - "tableTo": "game", - "columnsFrom": ["game_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "gameAssetCategory_asset_category_id_assetCategory_id_fk": { - "name": "gameAssetCategory_asset_category_id_assetCategory_id_fk", - "tableFrom": "gameAssetCategory", - "tableTo": "assetCategory", - "columnsFrom": ["asset_category_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetCategoryLikes": { - "name": "assetCategoryLikes", - "columns": { - "asset_id": { - "name": "asset_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetCategoryLikes_asset_idx": { - "name": "assetCategoryLikes_asset_idx", - "columns": ["asset_id"], - "isUnique": false - }, - "assetCategoryLikes_likedby_idx": { - "name": "assetCategoryLikes_likedby_idx", - "columns": ["liked_by_id"], - "isUnique": false - } - }, - "foreignKeys": { - "assetCategoryLikes_asset_id_assetCategory_id_fk": { - "name": "assetCategoryLikes_asset_id_assetCategory_id_fk", - "tableFrom": "assetCategoryLikes", - "tableTo": "assetCategory", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - }, - "assetCategoryLikes_liked_by_id_authUser_id_fk": { - "name": "assetCategoryLikes_liked_by_id_authUser_id_fk", - "tableFrom": "assetCategoryLikes", - "tableTo": "authUser", - "columnsFrom": ["liked_by_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "version": "5", + "dialect": "sqlite", + "id": "eac08da1-c397-4208-af88-cc268fafa3df", + "prevId": "00000000-0000-0000-0000-000000000000", + "tables": { + "asset": { + "name": "asset", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "extension": { + "name": "extension", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false }, "game": { - "name": "game", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - }, - "possible_suggestive_content": { - "name": "possible_suggestive_content", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "game_id_unique": { - "name": "game_id_unique", - "columns": ["id"], - "isUnique": true - }, - "game_name_unique": { - "name": "game_name_unique", - "columns": ["name"], - "isUnique": true - }, - "game_id_idx": { - "name": "game_id_idx", - "columns": ["id"], - "isUnique": false - }, - "game_name_idx": { - "name": "game_name_idx", - "columns": ["name"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "gameLikes": { - "name": "gameLikes", - "columns": { - "asset_id": { - "name": "asset_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "gamelikes_game_idx": { - "name": "gamelikes_game_idx", - "columns": ["asset_id"], - "isUnique": false - }, - "gamelikes_likedby_idx": { - "name": "gamelikes_likedby_idx", - "columns": ["liked_by_id"], - "isUnique": false - } - }, - "foreignKeys": { - "gameLikes_asset_id_game_id_fk": { - "name": "gameLikes_asset_id_game_id_fk", - "tableFrom": "gameLikes", - "tableTo": "game", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - }, - "gameLikes_liked_by_id_authUser_id_fk": { - "name": "gameLikes_liked_by_id_authUser_id_fk", - "tableFrom": "gameLikes", - "tableTo": "authUser", - "columnsFrom": ["liked_by_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetTag": { - "name": "assetTag", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetTag_id_unique": { - "name": "assetTag_id_unique", - "columns": ["id"], - "isUnique": true - }, - "assetTag_name_unique": { - "name": "assetTag_name_unique", - "columns": ["name"], - "isUnique": true - }, - "asset_tag_id_idx": { - "name": "asset_tag_id_idx", - "columns": ["id"], - "isUnique": false - }, - "asset_tag_name_idx": { - "name": "asset_tag_name_idx", - "columns": ["name"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetTagAsset": { - "name": "assetTagAsset", - "columns": { - "asset_tag_id": { - "name": "asset_tag_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "asset_tags_assets_asset_tag_id_idx": { - "name": "asset_tags_assets_asset_tag_id_idx", - "columns": ["asset_tag_id"], - "isUnique": false - }, - "asset_tags_assets_asset_id_idx": { - "name": "asset_tags_assets_asset_id_idx", - "columns": ["asset_id"], - "isUnique": false - } - }, - "foreignKeys": { - "assetTagAsset_asset_tag_id_assetTag_id_fk": { - "name": "assetTagAsset_asset_tag_id_assetTag_id_fk", - "tableFrom": "assetTagAsset", - "tableTo": "assetTag", - "columnsFrom": ["asset_tag_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "assetTagAsset_asset_id_asset_id_fk": { - "name": "assetTagAsset_asset_id_asset_id_fk", - "tableFrom": "assetTagAsset", - "tableTo": "asset", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetTagLikes": { - "name": "assetTagLikes", - "columns": { - "asset_id": { - "name": "asset_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetTagLikes_asset_idx": { - "name": "assetTagLikes_asset_idx", - "columns": ["asset_id"], - "isUnique": false - }, - "assetTagLikes_likedby_idx": { - "name": "assetTagLikes_likedby_idx", - "columns": ["liked_by_id"], - "isUnique": false - } - }, - "foreignKeys": { - "assetTagLikes_asset_id_assetTag_id_fk": { - "name": "assetTagLikes_asset_id_assetTag_id_fk", - "tableFrom": "assetTagLikes", - "tableTo": "assetTag", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - }, - "assetTagLikes_liked_by_id_authUser_id_fk": { - "name": "assetTagLikes_liked_by_id_authUser_id_fk", - "tableFrom": "assetTagLikes", - "tableTo": "authUser", - "columnsFrom": ["liked_by_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "savedOcGenerators": { - "name": "savedOcGenerators", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "game": { - "name": "game", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "date_created": { - "name": "date_created", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "content": { - "name": "content", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "saved_color_palette": { - "name": "saved_color_palette", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "sakura_url": { - "name": "sakura_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "savedOcGenerators_id_unique": { - "name": "savedOcGenerators_id_unique", - "columns": ["id"], - "isUnique": true - }, - "saved_oc_generators_id_idx": { - "name": "saved_oc_generators_id_idx", - "columns": ["id"], - "isUnique": false - }, - "saved_oc_generators_user_id_idx": { - "name": "saved_oc_generators_user_id_idx", - "columns": ["user_id"], - "isUnique": false - } - }, - "foreignKeys": { - "savedOcGenerators_user_id_authUser_id_fk": { - "name": "savedOcGenerators_user_id_authUser_id_fk", - "tableFrom": "savedOcGenerators", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "authKey": { - "name": "authKey", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "hashed_password": { - "name": "hashed_password", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "authKey_id_unique": { - "name": "authKey_id_unique", - "columns": ["id"], - "isUnique": true - }, - "key_user_id_idx": { - "name": "key_user_id_idx", - "columns": ["user_id"], - "isUnique": false - } - }, - "foreignKeys": { - "authKey_user_id_authUser_id_fk": { - "name": "authKey_user_id_authUser_id_fk", - "tableFrom": "authKey", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "authUser": { - "name": "authUser", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "avatar_url": { - "name": "avatar_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "banner_url": { - "name": "banner_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "display_name": { - "name": "display_name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "username": { - "name": "username", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "username_colour": { - "name": "username_colour", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "email": { - "name": "email", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "email_verified": { - "name": "email_verified", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "pronouns": { - "name": "pronouns", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "verified": { - "name": "verified", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "bio": { - "name": "bio", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "'No bio set'" - }, - "date_joined": { - "name": "date_joined", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "role_flags": { - "name": "role_flags", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 1 - }, - "is_contributor": { - "name": "is_contributor", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "self_assignable_role_flags": { - "name": "self_assignable_role_flags", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "authUser_id_unique": { - "name": "authUser_id_unique", - "columns": ["id"], - "isUnique": true - }, - "authUser_username_unique": { - "name": "authUser_username_unique", - "columns": ["username"], - "isUnique": true - }, - "user_id_idx": { - "name": "user_id_idx", - "columns": ["id"], - "isUnique": false - }, - "user_username_idx": { - "name": "user_username_idx", - "columns": ["username"], - "isUnique": false - }, - "user_email_idx": { - "name": "user_email_idx", - "columns": ["email"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "authSession": { - "name": "authSession", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "active_expires": { - "name": "active_expires", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "idle_expires": { - "name": "idle_expires", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "authSession_id_unique": { - "name": "authSession_id_unique", - "columns": ["id"], - "isUnique": true - }, - "session_user_id_idx": { - "name": "session_user_id_idx", - "columns": ["user_id"], - "isUnique": false - } - }, - "foreignKeys": { - "authSession_user_id_authUser_id_fk": { - "name": "authSession_user_id_authUser_id_fk", - "tableFrom": "authSession", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "emailVerificationToken": { - "name": "emailVerificationToken", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "emailVerificationToken_id_unique": { - "name": "emailVerificationToken_id_unique", - "columns": ["id"], - "isUnique": true - }, - "email_verification_token_user_id_idx": { - "name": "email_verification_token_user_id_idx", - "columns": ["user_id"], - "isUnique": false - }, - "email_verification_token_token_idx": { - "name": "email_verification_token_token_idx", - "columns": ["token"], - "isUnique": false - } - }, - "foreignKeys": { - "emailVerificationToken_user_id_authUser_id_fk": { - "name": "emailVerificationToken_user_id_authUser_id_fk", - "tableFrom": "emailVerificationToken", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "passwordResetToken": { - "name": "passwordResetToken", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "passwordResetToken_id_unique": { - "name": "passwordResetToken_id_unique", - "columns": ["id"], - "isUnique": true - }, - "password_reset_token_user_id_idx": { - "name": "password_reset_token_user_id_idx", - "columns": ["user_id"], - "isUnique": false - }, - "password_reset_token_token_idx": { - "name": "password_reset_token_token_idx", - "columns": ["token"], - "isUnique": false - } - }, - "foreignKeys": { - "passwordResetToken_user_id_authUser_id_fk": { - "name": "passwordResetToken_user_id_authUser_id_fk", - "tableFrom": "passwordResetToken", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userCollection": { - "name": "userCollection", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "date_created": { - "name": "date_created", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - } - }, - "indexes": { - "userCollection_id_unique": { - "name": "userCollection_id_unique", - "columns": ["id"], - "isUnique": true - }, - "collection_id_idx": { - "name": "collection_id_idx", - "columns": ["id"], - "isUnique": false - }, - "user_collection_id_idx": { - "name": "user_collection_id_idx", - "columns": ["user_id"], - "isUnique": false - } - }, - "foreignKeys": { - "userCollection_user_id_authUser_id_fk": { - "name": "userCollection_user_id_authUser_id_fk", - "tableFrom": "userCollection", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetCollectionAsset": { - "name": "assetCollectionAsset", - "columns": { - "collection_id": { - "name": "collection_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "date_added": { - "name": "date_added", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "collection_assets_collection_id_idx": { - "name": "collection_assets_collection_id_idx", - "columns": ["collection_id"], - "isUnique": false - }, - "collection_assets_asset_id_idx": { - "name": "collection_assets_asset_id_idx", - "columns": ["asset_id"], - "isUnique": false - } - }, - "foreignKeys": { - "assetCollectionAsset_collection_id_userCollection_id_fk": { - "name": "assetCollectionAsset_collection_id_userCollection_id_fk", - "tableFrom": "assetCollectionAsset", - "tableTo": "userCollection", - "columnsFrom": ["collection_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "assetCollectionAsset_asset_id_asset_id_fk": { - "name": "assetCollectionAsset_asset_id_asset_id_fk", - "tableFrom": "assetCollectionAsset", - "tableTo": "asset", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "socialsConnection": { - "name": "socialsConnection", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "discord_id": { - "name": "discord_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "socialsConnection_id_unique": { - "name": "socialsConnection_id_unique", - "columns": ["id"], - "isUnique": true - }, - "socialsConnection_user_id_unique": { - "name": "socialsConnection_user_id_unique", - "columns": ["user_id"], - "isUnique": true - }, - "socials_connection_user_id_idx": { - "name": "socials_connection_user_id_idx", - "columns": ["user_id"], - "isUnique": false - }, - "socials_connection_discord_id_idx": { - "name": "socials_connection_discord_id_idx", - "columns": ["discord_id"], - "isUnique": false - } - }, - "foreignKeys": { - "socialsConnection_user_id_authUser_id_fk": { - "name": "socialsConnection_user_id_authUser_id_fk", - "tableFrom": "socialsConnection", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userFavorite": { - "name": "userFavorite", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - } - }, - "indexes": { - "userFavorite_id_unique": { - "name": "userFavorite_id_unique", - "columns": ["id"], - "isUnique": true - }, - "favorited_assets_id_idx": { - "name": "favorited_assets_id_idx", - "columns": ["id"], - "isUnique": false - }, - "favorited_assets_user_id_idx": { - "name": "favorited_assets_user_id_idx", - "columns": ["user_id"], - "isUnique": false - } - }, - "foreignKeys": { - "userFavorite_user_id_authUser_id_fk": { - "name": "userFavorite_user_id_authUser_id_fk", - "tableFrom": "userFavorite", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userFavoriteAsset": { - "name": "userFavoriteAsset", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "favorited_assets_id": { - "name": "favorited_assets_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "userFavoriteAsset_id_unique": { - "name": "userFavoriteAsset_id_unique", - "columns": ["id"], - "isUnique": true - }, - "favorited_assets_assets_id_idx": { - "name": "favorited_assets_assets_id_idx", - "columns": ["id"], - "isUnique": false - }, - "favorited_assets_assets_user_id_idx": { - "name": "favorited_assets_assets_user_id_idx", - "columns": ["favorited_assets_id"], - "isUnique": false - }, - "favorited_assets_assets_asset_id_idx": { - "name": "favorited_assets_assets_asset_id_idx", - "columns": ["asset_id"], - "isUnique": false - } - }, - "foreignKeys": { - "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk": { - "name": "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk", - "tableFrom": "userFavoriteAsset", - "tableTo": "userFavorite", - "columnsFrom": ["favorited_assets_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "userFavoriteAsset_asset_id_asset_id_fk": { - "name": "userFavoriteAsset_asset_id_asset_id_fk", - "tableFrom": "userFavoriteAsset", - "tableTo": "asset", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userFollowing": { - "name": "userFollowing", - "columns": { - "followerId": { - "name": "followerId", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "followingId": { - "name": "followingId", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "userfollowing_follower_idx": { - "name": "userfollowing_follower_idx", - "columns": ["followerId"], - "isUnique": false - }, - "userfollowing_following_idx": { - "name": "userfollowing_following_idx", - "columns": ["followingId"], - "isUnique": false - } - }, - "foreignKeys": { - "userFollowing_followerId_authUser_id_fk": { - "name": "userFollowing_followerId_authUser_id_fk", - "tableFrom": "userFollowing", - "tableTo": "authUser", - "columnsFrom": ["followerId"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - }, - "userFollowing_followingId_authUser_id_fk": { - "name": "userFollowing_followingId_authUser_id_fk", - "tableFrom": "userFollowing", - "tableTo": "authUser", - "columnsFrom": ["followingId"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userCollectionLikes": { - "name": "userCollectionLikes", - "columns": { - "collection_id": { - "name": "collection_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "userCollectionNetworking_collection_idx": { - "name": "userCollectionNetworking_collection_idx", - "columns": ["collection_id"], - "isUnique": false - }, - "userCollectionNetworking_likedBy_idx": { - "name": "userCollectionNetworking_likedBy_idx", - "columns": ["liked_by_id"], - "isUnique": false - } - }, - "foreignKeys": { - "userCollectionLikes_collection_id_userCollection_id_fk": { - "name": "userCollectionLikes_collection_id_userCollection_id_fk", - "tableFrom": "userCollectionLikes", - "tableTo": "userCollection", - "columnsFrom": ["collection_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - }, - "userCollectionLikes_liked_by_id_authUser_id_fk": { - "name": "userCollectionLikes_liked_by_id_authUser_id_fk", - "tableFrom": "userCollectionLikes", - "tableTo": "authUser", - "columnsFrom": ["liked_by_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "name": "game", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_category": { + "name": "asset_category", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by_id": { + "name": "uploaded_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by_name": { + "name": "uploaded_by_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'pending'" + }, + "uploaded_date": { + "name": "uploaded_date", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_is_optimized": { + "name": "asset_is_optimized", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "asset_is_suggestive": { + "name": "asset_is_suggestive", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "view_count": { + "name": "view_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "download_count": { + "name": "download_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "file_size": { + "name": "file_size", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "width": { + "name": "width", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "height": { + "name": "height", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "assets_id_idx": { + "name": "assets_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "assets_name_idx": { + "name": "assets_name_idx", + "columns": [ + "name" + ], + "isUnique": false + }, + "assets_game_name_idx": { + "name": "assets_game_name_idx", + "columns": [ + "game" + ], + "isUnique": false + }, + "assets_asset_category_name_idx": { + "name": "assets_asset_category_name_idx", + "columns": [ + "asset_category" + ], + "isUnique": false + }, + "assets_uploaded_by_id_idx": { + "name": "assets_uploaded_by_id_idx", + "columns": [ + "uploaded_by_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "asset_game_game_id_fk": { + "name": "asset_game_game_id_fk", + "tableFrom": "asset", + "tableTo": "game", + "columnsFrom": [ + "game" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "asset_asset_category_assetCategory_id_fk": { + "name": "asset_asset_category_assetCategory_id_fk", + "tableFrom": "asset", + "tableTo": "assetCategory", + "columnsFrom": [ + "asset_category" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "asset_uploaded_by_id_authUser_id_fk": { + "name": "asset_uploaded_by_id_authUser_id_fk", + "tableFrom": "asset", + "tableTo": "authUser", + "columnsFrom": [ + "uploaded_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "asset_uploaded_by_name_authUser_username_fk": { + "name": "asset_uploaded_by_name_authUser_username_fk", + "tableFrom": "asset", + "tableTo": "authUser", + "columnsFrom": [ + "uploaded_by_name" + ], + "columnsTo": [ + "username" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "atlas": { + "name": "atlas", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by": { + "name": "uploaded_by", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by_name": { + "name": "uploaded_by_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_date": { + "name": "uploaded_date", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "file_size": { + "name": "file_size", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "atlas_id_unique": { + "name": "atlas_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "atlas_id_idx": { + "name": "atlas_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "atlas_uploaded_by_idx": { + "name": "atlas_uploaded_by_idx", + "columns": [ + "uploaded_by" + ], + "isUnique": false + }, + "atlas_uploaded_by_name_idx": { + "name": "atlas_uploaded_by_name_idx", + "columns": [ + "uploaded_by_name" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "atlasToAsset": { + "name": "atlasToAsset", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "atlas_id": { + "name": "atlas_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "atlas_to_assets_id_idx": { + "name": "atlas_to_assets_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "atlas_to_assets_atlas_id_idx": { + "name": "atlas_to_assets_atlas_id_idx", + "columns": [ + "atlas_id" + ], + "isUnique": false + }, + "atlas_to_assets_asset_id_idx": { + "name": "atlas_to_assets_asset_id_idx", + "columns": [ + "asset_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "atlasToAsset_atlas_id_atlas_id_fk": { + "name": "atlasToAsset_atlas_id_atlas_id_fk", + "tableFrom": "atlasToAsset", + "tableTo": "atlas", + "columnsFrom": [ + "atlas_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "atlasToAsset_asset_id_asset_id_fk": { + "name": "atlasToAsset_asset_id_asset_id_fk", + "tableFrom": "atlasToAsset", + "tableTo": "asset", + "columnsFrom": [ + "asset_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetLikes": { + "name": "assetLikes", + "columns": { + "asset_id": { + "name": "asset_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetlikes_asset_idx": { + "name": "assetlikes_asset_idx", + "columns": [ + "asset_id" + ], + "isUnique": false + }, + "assetlikes_likedBy_idx": { + "name": "assetlikes_likedBy_idx", + "columns": [ + "liked_by_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "assetLikes_asset_id_asset_id_fk": { + "name": "assetLikes_asset_id_asset_id_fk", + "tableFrom": "assetLikes", + "tableTo": "asset", + "columnsFrom": [ + "asset_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "assetLikes_liked_by_id_authUser_id_fk": { + "name": "assetLikes_liked_by_id_authUser_id_fk", + "tableFrom": "assetLikes", + "tableTo": "authUser", + "columnsFrom": [ + "liked_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetCategory": { + "name": "assetCategory", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetCategory_id_unique": { + "name": "assetCategory_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "assetCategory_name_unique": { + "name": "assetCategory_name_unique", + "columns": [ + "name" + ], + "isUnique": true + }, + "asset_category_id_idx": { + "name": "asset_category_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "asset_category_name_idx": { + "name": "asset_category_name_idx", + "columns": [ + "name" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "gameAssetCategory": { + "name": "gameAssetCategory", + "columns": { + "game_id": { + "name": "game_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_category_id": { + "name": "asset_category_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "game_asset_category_game_id_idx": { + "name": "game_asset_category_game_id_idx", + "columns": [ + "game_id" + ], + "isUnique": false + }, + "game_asset_category_asset_category_id_idx": { + "name": "game_asset_category_asset_category_id_idx", + "columns": [ + "asset_category_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "gameAssetCategory_game_id_game_id_fk": { + "name": "gameAssetCategory_game_id_game_id_fk", + "tableFrom": "gameAssetCategory", + "tableTo": "game", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "gameAssetCategory_asset_category_id_assetCategory_id_fk": { + "name": "gameAssetCategory_asset_category_id_assetCategory_id_fk", + "tableFrom": "gameAssetCategory", + "tableTo": "assetCategory", + "columnsFrom": [ + "asset_category_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetCategoryLikes": { + "name": "assetCategoryLikes", + "columns": { + "asset_id": { + "name": "asset_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetCategoryLikes_asset_idx": { + "name": "assetCategoryLikes_asset_idx", + "columns": [ + "asset_id" + ], + "isUnique": false + }, + "assetCategoryLikes_likedby_idx": { + "name": "assetCategoryLikes_likedby_idx", + "columns": [ + "liked_by_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "assetCategoryLikes_asset_id_assetCategory_id_fk": { + "name": "assetCategoryLikes_asset_id_assetCategory_id_fk", + "tableFrom": "assetCategoryLikes", + "tableTo": "assetCategory", + "columnsFrom": [ + "asset_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "assetCategoryLikes_liked_by_id_authUser_id_fk": { + "name": "assetCategoryLikes_liked_by_id_authUser_id_fk", + "tableFrom": "assetCategoryLikes", + "tableTo": "authUser", + "columnsFrom": [ + "liked_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "game": { + "name": "game", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": 0 + }, + "possible_suggestive_content": { + "name": "possible_suggestive_content", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "game_id_unique": { + "name": "game_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "game_name_unique": { + "name": "game_name_unique", + "columns": [ + "name" + ], + "isUnique": true + }, + "game_id_idx": { + "name": "game_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "game_name_idx": { + "name": "game_name_idx", + "columns": [ + "name" + ], + "isUnique": false } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} }, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} + "gameLikes": { + "name": "gameLikes", + "columns": { + "asset_id": { + "name": "asset_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "gamelikes_game_idx": { + "name": "gamelikes_game_idx", + "columns": [ + "asset_id" + ], + "isUnique": false + }, + "gamelikes_likedby_idx": { + "name": "gamelikes_likedby_idx", + "columns": [ + "liked_by_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "gameLikes_asset_id_game_id_fk": { + "name": "gameLikes_asset_id_game_id_fk", + "tableFrom": "gameLikes", + "tableTo": "game", + "columnsFrom": [ + "asset_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "gameLikes_liked_by_id_authUser_id_fk": { + "name": "gameLikes_liked_by_id_authUser_id_fk", + "tableFrom": "gameLikes", + "tableTo": "authUser", + "columnsFrom": [ + "liked_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetTag": { + "name": "assetTag", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetTag_id_unique": { + "name": "assetTag_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "assetTag_name_unique": { + "name": "assetTag_name_unique", + "columns": [ + "name" + ], + "isUnique": true + }, + "asset_tag_id_idx": { + "name": "asset_tag_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "asset_tag_name_idx": { + "name": "asset_tag_name_idx", + "columns": [ + "name" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetTagAsset": { + "name": "assetTagAsset", + "columns": { + "asset_tag_id": { + "name": "asset_tag_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "asset_tags_assets_asset_tag_id_idx": { + "name": "asset_tags_assets_asset_tag_id_idx", + "columns": [ + "asset_tag_id" + ], + "isUnique": false + }, + "asset_tags_assets_asset_id_idx": { + "name": "asset_tags_assets_asset_id_idx", + "columns": [ + "asset_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "assetTagAsset_asset_tag_id_assetTag_id_fk": { + "name": "assetTagAsset_asset_tag_id_assetTag_id_fk", + "tableFrom": "assetTagAsset", + "tableTo": "assetTag", + "columnsFrom": [ + "asset_tag_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "assetTagAsset_asset_id_asset_id_fk": { + "name": "assetTagAsset_asset_id_asset_id_fk", + "tableFrom": "assetTagAsset", + "tableTo": "asset", + "columnsFrom": [ + "asset_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetTagLikes": { + "name": "assetTagLikes", + "columns": { + "asset_id": { + "name": "asset_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetTagLikes_asset_idx": { + "name": "assetTagLikes_asset_idx", + "columns": [ + "asset_id" + ], + "isUnique": false + }, + "assetTagLikes_likedby_idx": { + "name": "assetTagLikes_likedby_idx", + "columns": [ + "liked_by_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "assetTagLikes_asset_id_assetTag_id_fk": { + "name": "assetTagLikes_asset_id_assetTag_id_fk", + "tableFrom": "assetTagLikes", + "tableTo": "assetTag", + "columnsFrom": [ + "asset_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "assetTagLikes_liked_by_id_authUser_id_fk": { + "name": "assetTagLikes_liked_by_id_authUser_id_fk", + "tableFrom": "assetTagLikes", + "tableTo": "authUser", + "columnsFrom": [ + "liked_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "savedOcGenerators": { + "name": "savedOcGenerators", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "game": { + "name": "game", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "date_created": { + "name": "date_created", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "saved_color_palette": { + "name": "saved_color_palette", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sakura_url": { + "name": "sakura_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "savedOcGenerators_id_unique": { + "name": "savedOcGenerators_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "saved_oc_generators_id_idx": { + "name": "saved_oc_generators_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "saved_oc_generators_user_id_idx": { + "name": "saved_oc_generators_user_id_idx", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "savedOcGenerators_user_id_authUser_id_fk": { + "name": "savedOcGenerators_user_id_authUser_id_fk", + "tableFrom": "savedOcGenerators", + "tableTo": "authUser", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "authKey": { + "name": "authKey", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "hashed_password": { + "name": "hashed_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "authKey_id_unique": { + "name": "authKey_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "key_user_id_idx": { + "name": "key_user_id_idx", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "authKey_user_id_authUser_id_fk": { + "name": "authKey_user_id_authUser_id_fk", + "tableFrom": "authKey", + "tableTo": "authUser", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "authUser": { + "name": "authUser", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "avatar_url": { + "name": "avatar_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "banner_url": { + "name": "banner_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "display_name": { + "name": "display_name", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "username_colour": { + "name": "username_colour", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "email_verified": { + "name": "email_verified", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "pronouns": { + "name": "pronouns", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "verified": { + "name": "verified", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "bio": { + "name": "bio", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'No bio set'" + }, + "date_joined": { + "name": "date_joined", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "role_flags": { + "name": "role_flags", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "is_contributor": { + "name": "is_contributor", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "self_assignable_role_flags": { + "name": "self_assignable_role_flags", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "authUser_id_unique": { + "name": "authUser_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "authUser_username_unique": { + "name": "authUser_username_unique", + "columns": [ + "username" + ], + "isUnique": true + }, + "user_id_idx": { + "name": "user_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "user_username_idx": { + "name": "user_username_idx", + "columns": [ + "username" + ], + "isUnique": false + }, + "user_email_idx": { + "name": "user_email_idx", + "columns": [ + "email" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "authSession": { + "name": "authSession", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "active_expires": { + "name": "active_expires", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "idle_expires": { + "name": "idle_expires", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "authSession_id_unique": { + "name": "authSession_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "session_user_id_idx": { + "name": "session_user_id_idx", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "authSession_user_id_authUser_id_fk": { + "name": "authSession_user_id_authUser_id_fk", + "tableFrom": "authSession", + "tableTo": "authUser", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "emailVerificationToken": { + "name": "emailVerificationToken", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "emailVerificationToken_id_unique": { + "name": "emailVerificationToken_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "email_verification_token_user_id_idx": { + "name": "email_verification_token_user_id_idx", + "columns": [ + "user_id" + ], + "isUnique": false + }, + "email_verification_token_token_idx": { + "name": "email_verification_token_token_idx", + "columns": [ + "token" + ], + "isUnique": false + } + }, + "foreignKeys": { + "emailVerificationToken_user_id_authUser_id_fk": { + "name": "emailVerificationToken_user_id_authUser_id_fk", + "tableFrom": "emailVerificationToken", + "tableTo": "authUser", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "passwordResetToken": { + "name": "passwordResetToken", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "passwordResetToken_id_unique": { + "name": "passwordResetToken_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "password_reset_token_user_id_idx": { + "name": "password_reset_token_user_id_idx", + "columns": [ + "user_id" + ], + "isUnique": false + }, + "password_reset_token_token_idx": { + "name": "password_reset_token_token_idx", + "columns": [ + "token" + ], + "isUnique": false + } + }, + "foreignKeys": { + "passwordResetToken_user_id_authUser_id_fk": { + "name": "passwordResetToken_user_id_authUser_id_fk", + "tableFrom": "passwordResetToken", + "tableTo": "authUser", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userCollection": { + "name": "userCollection", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "date_created": { + "name": "date_created", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": { + "userCollection_id_unique": { + "name": "userCollection_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "collection_id_idx": { + "name": "collection_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "user_collection_id_idx": { + "name": "user_collection_id_idx", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "userCollection_user_id_authUser_id_fk": { + "name": "userCollection_user_id_authUser_id_fk", + "tableFrom": "userCollection", + "tableTo": "authUser", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userCollectionAsset": { + "name": "userCollectionAsset", + "columns": { + "collection_id": { + "name": "collection_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "date_added": { + "name": "date_added", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "collection_assets_collection_id_idx": { + "name": "collection_assets_collection_id_idx", + "columns": [ + "collection_id" + ], + "isUnique": false + }, + "collection_assets_asset_id_idx": { + "name": "collection_assets_asset_id_idx", + "columns": [ + "asset_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "userCollectionAsset_collection_id_userCollection_id_fk": { + "name": "userCollectionAsset_collection_id_userCollection_id_fk", + "tableFrom": "userCollectionAsset", + "tableTo": "userCollection", + "columnsFrom": [ + "collection_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "userCollectionAsset_asset_id_asset_id_fk": { + "name": "userCollectionAsset_asset_id_asset_id_fk", + "tableFrom": "userCollectionAsset", + "tableTo": "asset", + "columnsFrom": [ + "asset_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "socialsConnection": { + "name": "socialsConnection", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "discord_id": { + "name": "discord_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "socialsConnection_id_unique": { + "name": "socialsConnection_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "socialsConnection_user_id_unique": { + "name": "socialsConnection_user_id_unique", + "columns": [ + "user_id" + ], + "isUnique": true + }, + "socials_connection_user_id_idx": { + "name": "socials_connection_user_id_idx", + "columns": [ + "user_id" + ], + "isUnique": false + }, + "socials_connection_discord_id_idx": { + "name": "socials_connection_discord_id_idx", + "columns": [ + "discord_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "socialsConnection_user_id_authUser_id_fk": { + "name": "socialsConnection_user_id_authUser_id_fk", + "tableFrom": "socialsConnection", + "tableTo": "authUser", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userFavorite": { + "name": "userFavorite", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": { + "userFavorite_id_unique": { + "name": "userFavorite_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "favorited_assets_id_idx": { + "name": "favorited_assets_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "favorited_assets_user_id_idx": { + "name": "favorited_assets_user_id_idx", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "userFavorite_user_id_authUser_id_fk": { + "name": "userFavorite_user_id_authUser_id_fk", + "tableFrom": "userFavorite", + "tableTo": "authUser", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userFavoriteAsset": { + "name": "userFavoriteAsset", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "favorited_assets_id": { + "name": "favorited_assets_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "userFavoriteAsset_id_unique": { + "name": "userFavoriteAsset_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "favorited_assets_assets_id_idx": { + "name": "favorited_assets_assets_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "favorited_assets_assets_user_id_idx": { + "name": "favorited_assets_assets_user_id_idx", + "columns": [ + "favorited_assets_id" + ], + "isUnique": false + }, + "favorited_assets_assets_asset_id_idx": { + "name": "favorited_assets_assets_asset_id_idx", + "columns": [ + "asset_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk": { + "name": "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk", + "tableFrom": "userFavoriteAsset", + "tableTo": "userFavorite", + "columnsFrom": [ + "favorited_assets_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "userFavoriteAsset_asset_id_asset_id_fk": { + "name": "userFavoriteAsset_asset_id_asset_id_fk", + "tableFrom": "userFavoriteAsset", + "tableTo": "asset", + "columnsFrom": [ + "asset_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userFollowing": { + "name": "userFollowing", + "columns": { + "followerId": { + "name": "followerId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "followingId": { + "name": "followingId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "userfollowing_follower_idx": { + "name": "userfollowing_follower_idx", + "columns": [ + "followerId" + ], + "isUnique": false + }, + "userfollowing_following_idx": { + "name": "userfollowing_following_idx", + "columns": [ + "followingId" + ], + "isUnique": false + } + }, + "foreignKeys": { + "userFollowing_followerId_authUser_id_fk": { + "name": "userFollowing_followerId_authUser_id_fk", + "tableFrom": "userFollowing", + "tableTo": "authUser", + "columnsFrom": [ + "followerId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "userFollowing_followingId_authUser_id_fk": { + "name": "userFollowing_followingId_authUser_id_fk", + "tableFrom": "userFollowing", + "tableTo": "authUser", + "columnsFrom": [ + "followingId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userCollectionLikes": { + "name": "userCollectionLikes", + "columns": { + "collection_id": { + "name": "collection_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "userCollectionNetworking_collection_idx": { + "name": "userCollectionNetworking_collection_idx", + "columns": [ + "collection_id" + ], + "isUnique": false + }, + "userCollectionNetworking_likedBy_idx": { + "name": "userCollectionNetworking_likedBy_idx", + "columns": [ + "liked_by_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "userCollectionLikes_collection_id_userCollection_id_fk": { + "name": "userCollectionLikes_collection_id_userCollection_id_fk", + "tableFrom": "userCollectionLikes", + "tableTo": "userCollection", + "columnsFrom": [ + "collection_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "userCollectionLikes_liked_by_id_authUser_id_fk": { + "name": "userCollectionLikes_liked_by_id_authUser_id_fk", + "tableFrom": "userCollectionLikes", + "tableTo": "authUser", + "columnsFrom": [ + "liked_by_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/v2/db/migrations/meta/_journal.json b/src/v2/db/migrations/meta/_journal.json index a0e2a74..1b1b05b 100644 --- a/src/v2/db/migrations/meta/_journal.json +++ b/src/v2/db/migrations/meta/_journal.json @@ -1,13 +1,13 @@ { - "version": "5", - "dialect": "sqlite", - "entries": [ - { - "idx": 0, - "version": "5", - "when": 1701248157083, - "tag": "0000_spotty_iron_monger", - "breakpoints": true - } - ] -} + "version": "5", + "dialect": "sqlite", + "entries": [ + { + "idx": 0, + "version": "5", + "when": 1701255870880, + "tag": "0000_smart_scarlet_spider", + "breakpoints": true + } + ] +} \ No newline at end of file diff --git a/src/v2/db/turso.ts b/src/v2/db/turso.ts index 6b6de07..67fad66 100644 --- a/src/v2/db/turso.ts +++ b/src/v2/db/turso.ts @@ -28,8 +28,6 @@ export function getConnection(env: Bindings) { **/ const isDev = env.ENVIRONMENT !== "PROD" - console.log(env) - const turso = createClient({ url: isDev ? "http://127.0.0.1:8080" : env.TURSO_DATABASE_URL!, authToken: isDev ? undefined : env.TURSO_DATABASE_AUTH_TOKEN!, From 4550fb2d7a23aadb95bb25ea949312a4cd4d6d76 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Fri, 8 Dec 2023 13:53:42 +0000 Subject: [PATCH 174/318] update deps --- package.json | 26 +- pnpm-lock.yaml | 338 +- src/v2/db/migrations/meta/0000_snapshot.json | 3930 ++++++++---------- src/v2/db/migrations/meta/_journal.json | 24 +- src/v2/lib/auth/lucia.ts | 4 - 5 files changed, 2017 insertions(+), 2305 deletions(-) diff --git a/package.json b/package.json index ecb1c7c..90ccdc1 100644 --- a/package.json +++ b/package.json @@ -20,35 +20,35 @@ "devDependencies": { "@asteasolutions/zod-to-openapi": "^6.3.0", "@cloudflare/workers-types": "^4.20231121.0", - "@types/node": "^20.10.0", + "@types/node": "^20.10.4", "dotenv": "^16.3.1", "drizzle-kit": "^0.20.6", - "eslint": "^8.54.0", + "eslint": "^8.55.0", "eslint-config-google": "^0.14.0", "eslint-plugin-json": "^3.1.0", "husky": "^8.0.3", "openapi-generator": "link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator", - "tsx": "^4.5.0", - "typescript": "^5.3.2", - "wrangler": "3.17.1" + "tsx": "^4.6.2", + "typescript": "^5.3.3", + "wrangler": "3.19.0" }, "private": true, "dependencies": { "@hono/swagger-ui": "^0.2.0", - "@hono/zod-openapi": "^0.8.6", - "@libsql/client": "0.4.0-pre.2", + "@hono/zod-openapi": "^0.9.3", + "@libsql/client": "0.4.0-pre.5", "@lucia-auth/adapter-session-unstorage": "^2.1.0", "@lucia-auth/adapter-sqlite": "^2.0.1", "@lucia-auth/oauth": "^3.5.0", - "@typescript-eslint/eslint-plugin": "^6.12.0", - "better-sqlite3": "^9.1.1", - "drizzle-orm": "^0.29.0", + "@typescript-eslint/eslint-plugin": "^6.13.2", + "better-sqlite3": "^9.2.2", + "drizzle-orm": "^0.29.1", "drizzle-zod": "^0.5.1", - "hono": "^3.10.2", + "hono": "^3.11.3", "lucia": "^2.7.4", - "miniflare": "^3.20231030.1", + "miniflare": "^3.20231030.3", "mysql2": "^3.6.5", - "oslo": "^0.23.1", + "oslo": "^0.23.5", "prettier": "^3.1.0", "unstorage": "^1.10.1", "uuid": "^9.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ec2f143..06952f0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,49 +7,49 @@ settings: dependencies: "@hono/swagger-ui": specifier: ^0.2.0 - version: 0.2.0(hono@3.10.2) + version: 0.2.0(hono@3.11.3) "@hono/zod-openapi": - specifier: ^0.8.6 - version: 0.8.6(hono@3.10.2)(zod@3.22.4) + specifier: ^0.9.3 + version: 0.9.3(hono@3.11.3)(zod@3.22.4) "@libsql/client": - specifier: 0.4.0-pre.2 - version: 0.4.0-pre.2 + specifier: 0.4.0-pre.5 + version: 0.4.0-pre.5 "@lucia-auth/adapter-session-unstorage": specifier: ^2.1.0 version: 2.1.0(lucia@2.7.4)(unstorage@1.10.1) "@lucia-auth/adapter-sqlite": specifier: ^2.0.1 - version: 2.0.1(@libsql/client@0.4.0-pre.2)(better-sqlite3@9.1.1)(lucia@2.7.4) + version: 2.0.1(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2)(lucia@2.7.4) "@lucia-auth/oauth": specifier: ^3.5.0 version: 3.5.0(lucia@2.7.4) "@typescript-eslint/eslint-plugin": - specifier: ^6.12.0 - version: 6.12.0(@typescript-eslint/parser@6.12.0)(eslint@8.54.0)(typescript@5.3.2) + specifier: ^6.13.2 + version: 6.13.2(@typescript-eslint/parser@6.13.2)(eslint@8.55.0)(typescript@5.3.3) better-sqlite3: - specifier: ^9.1.1 - version: 9.1.1 + specifier: ^9.2.2 + version: 9.2.2 drizzle-orm: - specifier: ^0.29.0 - version: 0.29.0(@cloudflare/workers-types@4.20231121.0)(@libsql/client@0.4.0-pre.2)(better-sqlite3@9.1.1)(mysql2@3.6.5) + specifier: ^0.29.1 + version: 0.29.1(@cloudflare/workers-types@4.20231121.0)(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2)(mysql2@3.6.5) drizzle-zod: specifier: ^0.5.1 - version: 0.5.1(drizzle-orm@0.29.0)(zod@3.22.4) + version: 0.5.1(drizzle-orm@0.29.1)(zod@3.22.4) hono: - specifier: ^3.10.2 - version: 3.10.2 + specifier: ^3.11.3 + version: 3.11.3 lucia: specifier: ^2.7.4 version: 2.7.4 miniflare: - specifier: ^3.20231030.1 - version: 3.20231030.1 + specifier: ^3.20231030.3 + version: 3.20231030.3 mysql2: specifier: ^3.6.5 version: 3.6.5 oslo: - specifier: ^0.23.1 - version: 0.23.1 + specifier: ^0.23.5 + version: 0.23.5 prettier: specifier: ^3.1.0 version: 3.1.0 @@ -71,8 +71,8 @@ devDependencies: specifier: ^4.20231121.0 version: 4.20231121.0 "@types/node": - specifier: ^20.10.0 - version: 20.10.0 + specifier: ^20.10.4 + version: 20.10.4 dotenv: specifier: ^16.3.1 version: 16.3.1 @@ -80,11 +80,11 @@ devDependencies: specifier: ^0.20.6 version: 0.20.6 eslint: - specifier: ^8.54.0 - version: 8.54.0 + specifier: ^8.55.0 + version: 8.55.0 eslint-config-google: specifier: ^0.14.0 - version: 0.14.0(eslint@8.54.0) + version: 0.14.0(eslint@8.55.0) eslint-plugin-json: specifier: ^3.1.0 version: 3.1.0 @@ -95,14 +95,14 @@ devDependencies: specifier: link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator version: link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator tsx: - specifier: ^4.5.0 - version: 4.5.0 + specifier: ^4.6.2 + version: 4.6.2 typescript: - specifier: ^5.3.2 - version: 5.3.2 + specifier: ^5.3.3 + version: 5.3.3 wrangler: - specifier: 3.17.1 - version: 3.17.1 + specifier: 3.19.0 + version: 3.19.0 packages: /@aashutoshrathi/word-wrap@1.2.6: @@ -1051,7 +1051,7 @@ packages: dev: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.54.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.55.0): resolution: { integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, @@ -1060,7 +1060,7 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.54.0 + eslint: 8.55.0 eslint-visitor-keys: 3.4.3 /@eslint-community/regexpp@4.10.0: @@ -1070,10 +1070,10 @@ packages: } engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } - /@eslint/eslintrc@2.1.3: + /@eslint/eslintrc@2.1.4: resolution: { - integrity: sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==, + integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dependencies: @@ -1089,10 +1089,10 @@ packages: transitivePeerDependencies: - supports-color - /@eslint/js@8.54.0: + /@eslint/js@8.55.0: resolution: { - integrity: sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==, + integrity: sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } @@ -1103,7 +1103,7 @@ packages: } engines: { node: ">=14" } - /@hono/swagger-ui@0.2.0(hono@3.10.2): + /@hono/swagger-ui@0.2.0(hono@3.11.3): resolution: { integrity: sha512-ulWqCI+38vTlxxBmOAi5VTOUDa5/7fKHPTwyq00kRUjUxPp3Ej5Cs+B/fvGs5gd3KraArLArkln7sHhb5vODZA==, @@ -1111,26 +1111,26 @@ packages: peerDependencies: hono: "*" dependencies: - hono: 3.10.2 + hono: 3.11.3 dev: false - /@hono/zod-openapi@0.8.6(hono@3.10.2)(zod@3.22.4): + /@hono/zod-openapi@0.9.3(hono@3.11.3)(zod@3.22.4): resolution: { - integrity: sha512-HQNmJoIGyu2kNK9DI8+gIyV4c+bZm5t75PytPSRqMTim9P9HAAPMtepxu44aPZO9ehDxK4KZlRVRqz8OBxOL1A==, + integrity: sha512-PdKWwUvMdoQ2eqJZtbo4N4qb2VRjHNnDcfWW3/IqSeJDyK4vIPHAzWfgtUOYHAXJAiooQQ87m0sw2iME2H1+zQ==, } engines: { node: ">=16.0.0" } peerDependencies: - hono: ">=3.9.0" + hono: ">=3.11.3" zod: 3.* dependencies: "@asteasolutions/zod-to-openapi": 5.5.0(zod@3.22.4) - "@hono/zod-validator": 0.1.11(hono@3.10.2)(zod@3.22.4) - hono: 3.10.2 + "@hono/zod-validator": 0.1.11(hono@3.11.3)(zod@3.22.4) + hono: 3.11.3 zod: 3.22.4 dev: false - /@hono/zod-validator@0.1.11(hono@3.10.2)(zod@3.22.4): + /@hono/zod-validator@0.1.11(hono@3.11.3)(zod@3.22.4): resolution: { integrity: sha512-PQXeHUP0+36qpRt8yfeD7N2jbK3ETlGvSN6dMof/HwUC/APRokQRjpXZm4rrlG71Ft0aWE01+Bm4XejqPie5Uw==, @@ -1139,7 +1139,7 @@ packages: hono: ">=3.9.0" zod: ^3.19.1 dependencies: - hono: 3.10.2 + hono: 3.11.3 zod: 3.22.4 dev: false @@ -1176,25 +1176,25 @@ packages: } dev: false - /@libsql/client@0.4.0-pre.2: + /@libsql/client@0.4.0-pre.5: resolution: { - integrity: sha512-sKWNPU+RQoki5hEoYhpC+fQ/kj+VuwoSXF2PMYGWB19MYBkMaMc7udn1T0ibNjNkFNmd98HvPIHd48NNC2oWvA==, + integrity: sha512-GyKigCBslE5uztwT7mpvp9Zn0z3iWjnufcfeTeDSFPMyXCPjSAHUOiwSLAaHii909w6EQacA692CXmYYFo/eig==, } dependencies: "@libsql/hrana-client": 0.5.5 js-base64: 3.7.5 - libsql: 0.2.0-pre.2 + libsql: 0.2.0-pre.4 transitivePeerDependencies: - bufferutil - encoding - utf-8-validate dev: false - /@libsql/darwin-arm64@0.2.0-pre.2: + /@libsql/darwin-arm64@0.2.0-pre.4: resolution: { - integrity: sha512-PKXAKBJF6XwfCT3yU1N/kHyUGcsatf/4rYNzdnc6UGeg+yWf3ZDk7sGnHHj9bDQ9oKLRVJQmc+cNIEsF2GOr9w==, + integrity: sha512-kb0f/FeZxzeqa+j6O7xI9toOeoTNCJnErOcNyWWzoqA5JZ4LJ9dCMrLPWe4Np22+Rg57NPmFz/Z7MFNP2y5Gow==, } cpu: [arm64] os: [darwin] @@ -1202,10 +1202,10 @@ packages: dev: false optional: true - /@libsql/darwin-x64@0.2.0-pre.2: + /@libsql/darwin-x64@0.2.0-pre.4: resolution: { - integrity: sha512-e3k4LsAFRf8qFfZqkg/VkoXK/UfDYgoDvLmAJpAGKEFp7d/bTmbF1r0YCjtGaPbheRxARAUXNfekvRhdpXE3mg==, + integrity: sha512-HQM9cmGP4t+ujbyhA6rjQ8K4iHw5DStq3YnL8030k5z4KHGkAOIcRbVj3m65J72Gy+tCsisUCZTrBjIFkjOFhA==, } cpu: [x64] os: [darwin] @@ -1254,10 +1254,10 @@ packages: - utf-8-validate dev: false - /@libsql/linux-arm64-gnu@0.2.0-pre.2: + /@libsql/linux-arm64-gnu@0.2.0-pre.4: resolution: { - integrity: sha512-ZkN6e129joeUu6cinGMRbCvLTnrM5xV5n9XHs2dRrZfL7yu7utbvrY1l+P6VI1gugs93UhgupqyMsolFjvrPww==, + integrity: sha512-1VVhnSx+vSDCLXxfUP9kRGbZyy+Si6tvPQZ8JqZftt9EJG1Dvzp1E1TT8zFYMeBQeVyoV4KryctW5b5uZkqVQA==, } cpu: [arm64] os: [linux] @@ -1265,10 +1265,10 @@ packages: dev: false optional: true - /@libsql/linux-arm64-musl@0.2.0-pre.2: + /@libsql/linux-arm64-musl@0.2.0-pre.4: resolution: { - integrity: sha512-tEy4UAIzHYtjCBJnZoTcX1LCYy+XGR3hQCsdRYujWJhUtmtU/AqCRZV3q8MyfX7UhKyawJKWoQvwQ6Vs7w9jAA==, + integrity: sha512-lbSeR5agUDkpHTT3OOnuINWEr7OsX+XCwJ21bkceoXu/napW7A3auiOjzK7mneI+vT7fRjay0caivrdoqgeKKg==, } cpu: [arm64] os: [linux] @@ -1276,10 +1276,10 @@ packages: dev: false optional: true - /@libsql/linux-x64-gnu@0.2.0-pre.2: + /@libsql/linux-x64-gnu@0.2.0-pre.4: resolution: { - integrity: sha512-jhHKwz5i9mdlpT4EeaKNUfyW5N9YY8wD5lZ0F5HrrPKhwgufnJY0oPEbvhM4KXDcSJetiIcGJ6K6NQyMSgoJ/Q==, + integrity: sha512-OBiu0+tEVj2daJJrcg1uhEtHx7CsED8QesEqz8dhoK0Dad1oSn8XUpulhiMiXP1JFlcr7Zz37eKJdQxv17WTfw==, } cpu: [x64] os: [linux] @@ -1287,10 +1287,10 @@ packages: dev: false optional: true - /@libsql/linux-x64-musl@0.2.0-pre.2: + /@libsql/linux-x64-musl@0.2.0-pre.4: resolution: { - integrity: sha512-HvwZtSQ2eIT968yxAb+htO+wmibdwW1PIyR7iJ5TN7phj7W1gF962l3ZhV1hVYERaMu+liBH1e/cRP1S35q3vQ==, + integrity: sha512-iJr3XiUTsB8ic4+DTG8412o9NZ3ifCEM+FaZ0/uxh3xlERbYUMUZhAIylxJqYjovld0edd6Nns7OJfu5b8Ae2g==, } cpu: [x64] os: [linux] @@ -1298,10 +1298,10 @@ packages: dev: false optional: true - /@libsql/win32-x64-msvc@0.2.0-pre.2: + /@libsql/win32-x64-msvc@0.2.0-pre.4: resolution: { - integrity: sha512-BWjInhsZRF9x+W0T5oJVjqoCCdvh82y74b/T3Ge/irXyLdVhHA9Zb1JWDy5uhu8eBR+d2n9B+IO0YwAvhFRTLw==, + integrity: sha512-kV/Bl6RBMCm24LFmlowl//TvD8jhRjSmUjComXdQ4j5JrAW29MVEb5EtrA16qGzeWb06tSMII0z5yqEaYxvQbQ==, } cpu: [x64] os: [win32] @@ -1322,7 +1322,7 @@ packages: unstorage: 1.10.1 dev: false - /@lucia-auth/adapter-sqlite@2.0.1(@libsql/client@0.4.0-pre.2)(better-sqlite3@9.1.1)(lucia@2.7.4): + /@lucia-auth/adapter-sqlite@2.0.1(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2)(lucia@2.7.4): resolution: { integrity: sha512-yc7XQ4X3sWG1gyUGHqaXipJIkmvB4MOgJypnSMWy7Vjhn3AOCM2xw51xTs+dGpLOQIn2Laomg9xpmDM2/9tgqQ==, @@ -1337,8 +1337,8 @@ packages: better-sqlite3: optional: true dependencies: - "@libsql/client": 0.4.0-pre.2 - better-sqlite3: 9.1.1 + "@libsql/client": 0.4.0-pre.5 + better-sqlite3: 9.2.2 lucia: 2.7.4 dev: false @@ -1940,7 +1940,7 @@ packages: integrity: sha512-bQVlnMLFJ2d35DkPNjEPmd9ueO/rh5EiaZt2bhqiSarPjZIuIV6bPQVqcrEyvNo+AfTrRGVazle1tl597w3gfA==, } dependencies: - "@types/node": 20.10.0 + "@types/node": 20.10.4 form-data: 4.0.0 dev: false @@ -1950,13 +1950,13 @@ packages: integrity: sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw==, } dependencies: - "@types/node": 20.10.0 + "@types/node": 20.10.4 dev: true - /@types/node@20.10.0: + /@types/node@20.10.4: resolution: { - integrity: sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ==, + integrity: sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==, } dependencies: undici-types: 5.26.5 @@ -1974,13 +1974,13 @@ packages: integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==, } dependencies: - "@types/node": 20.10.0 + "@types/node": 20.10.4 dev: false - /@typescript-eslint/eslint-plugin@6.12.0(@typescript-eslint/parser@6.12.0)(eslint@8.54.0)(typescript@5.3.2): + /@typescript-eslint/eslint-plugin@6.13.2(@typescript-eslint/parser@6.13.2)(eslint@8.55.0)(typescript@5.3.3): resolution: { - integrity: sha512-XOpZ3IyJUIV1b15M7HVOpgQxPPF7lGXgsfcEIu3yDxFPaf/xZKt7s9QO/pbk7vpWQyVulpJbu4E5LwpZiQo4kA==, + integrity: sha512-3+9OGAWHhk4O1LlcwLBONbdXsAhLjyCFogJY/cWy2lxdVJ2JrcTF2pTGMaLl2AE7U1l31n8Py4a8bx5DLf/0dQ==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -1992,27 +1992,27 @@ packages: optional: true dependencies: "@eslint-community/regexpp": 4.10.0 - "@typescript-eslint/parser": 6.12.0(eslint@8.54.0)(typescript@5.3.2) - "@typescript-eslint/scope-manager": 6.12.0 - "@typescript-eslint/type-utils": 6.12.0(eslint@8.54.0)(typescript@5.3.2) - "@typescript-eslint/utils": 6.12.0(eslint@8.54.0)(typescript@5.3.2) - "@typescript-eslint/visitor-keys": 6.12.0 + "@typescript-eslint/parser": 6.13.2(eslint@8.55.0)(typescript@5.3.3) + "@typescript-eslint/scope-manager": 6.13.2 + "@typescript-eslint/type-utils": 6.13.2(eslint@8.55.0)(typescript@5.3.3) + "@typescript-eslint/utils": 6.13.2(eslint@8.55.0)(typescript@5.3.3) + "@typescript-eslint/visitor-keys": 6.13.2 debug: 4.3.4 - eslint: 8.54.0 + eslint: 8.55.0 graphemer: 1.4.0 ignore: 5.3.0 natural-compare: 1.4.0 semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.3.2) - typescript: 5.3.2 + ts-api-utils: 1.0.3(typescript@5.3.3) + typescript: 5.3.3 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/parser@6.12.0(eslint@8.54.0)(typescript@5.3.2): + /@typescript-eslint/parser@6.13.2(eslint@8.55.0)(typescript@5.3.3): resolution: { - integrity: sha512-s8/jNFPKPNRmXEnNXfuo1gemBdVmpQsK1pcu+QIvuNJuhFzGrpD7WjOcvDc/+uEdfzSYpNu7U/+MmbScjoQ6vg==, + integrity: sha512-MUkcC+7Wt/QOGeVlM8aGGJZy1XV5YKjTpq9jK6r6/iLsGXhBVaGP5N0UYvFsu9BFlSpwY9kMretzdBH01rkRXg==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -2022,32 +2022,32 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/scope-manager": 6.12.0 - "@typescript-eslint/types": 6.12.0 - "@typescript-eslint/typescript-estree": 6.12.0(typescript@5.3.2) - "@typescript-eslint/visitor-keys": 6.12.0 + "@typescript-eslint/scope-manager": 6.13.2 + "@typescript-eslint/types": 6.13.2 + "@typescript-eslint/typescript-estree": 6.13.2(typescript@5.3.3) + "@typescript-eslint/visitor-keys": 6.13.2 debug: 4.3.4 - eslint: 8.54.0 - typescript: 5.3.2 + eslint: 8.55.0 + typescript: 5.3.3 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/scope-manager@6.12.0: + /@typescript-eslint/scope-manager@6.13.2: resolution: { - integrity: sha512-5gUvjg+XdSj8pcetdL9eXJzQNTl3RD7LgUiYTl8Aabdi8hFkaGSYnaS6BLc0BGNaDH+tVzVwmKtWvu0jLgWVbw==, + integrity: sha512-CXQA0xo7z6x13FeDYCgBkjWzNqzBn8RXaE3QVQVIUm74fWJLkJkaHmHdKStrxQllGh6Q4eUGyNpMe0b1hMkXFA==, } engines: { node: ^16.0.0 || >=18.0.0 } dependencies: - "@typescript-eslint/types": 6.12.0 - "@typescript-eslint/visitor-keys": 6.12.0 + "@typescript-eslint/types": 6.13.2 + "@typescript-eslint/visitor-keys": 6.13.2 dev: false - /@typescript-eslint/type-utils@6.12.0(eslint@8.54.0)(typescript@5.3.2): + /@typescript-eslint/type-utils@6.13.2(eslint@8.55.0)(typescript@5.3.3): resolution: { - integrity: sha512-WWmRXxhm1X8Wlquj+MhsAG4dU/Blvf1xDgGaYCzfvStP2NwPQh6KBvCDbiOEvaE0filhranjIlK/2fSTVwtBng==, + integrity: sha512-Qr6ssS1GFongzH2qfnWKkAQmMUyZSyOr0W54nZNU1MDfo+U4Mv3XveeLZzadc/yq8iYhQZHYT+eoXJqnACM1tw==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -2057,28 +2057,28 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/typescript-estree": 6.12.0(typescript@5.3.2) - "@typescript-eslint/utils": 6.12.0(eslint@8.54.0)(typescript@5.3.2) + "@typescript-eslint/typescript-estree": 6.13.2(typescript@5.3.3) + "@typescript-eslint/utils": 6.13.2(eslint@8.55.0)(typescript@5.3.3) debug: 4.3.4 - eslint: 8.54.0 - ts-api-utils: 1.0.3(typescript@5.3.2) - typescript: 5.3.2 + eslint: 8.55.0 + ts-api-utils: 1.0.3(typescript@5.3.3) + typescript: 5.3.3 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/types@6.12.0: + /@typescript-eslint/types@6.13.2: resolution: { - integrity: sha512-MA16p/+WxM5JG/F3RTpRIcuOghWO30//VEOvzubM8zuOOBYXsP+IfjoCXXiIfy2Ta8FRh9+IO9QLlaFQUU+10Q==, + integrity: sha512-7sxbQ+EMRubQc3wTfTsycgYpSujyVbI1xw+3UMRUcrhSy+pN09y/lWzeKDbvhoqcRbHdc+APLs/PWYi/cisLPg==, } engines: { node: ^16.0.0 || >=18.0.0 } dev: false - /@typescript-eslint/typescript-estree@6.12.0(typescript@5.3.2): + /@typescript-eslint/typescript-estree@6.13.2(typescript@5.3.3): resolution: { - integrity: sha512-vw9E2P9+3UUWzhgjyyVczLWxZ3GuQNT7QpnIY3o5OMeLO/c8oHljGc8ZpryBMIyympiAAaKgw9e5Hl9dCWFOYw==, + integrity: sha512-SuD8YLQv6WHnOEtKv8D6HZUzOub855cfPnPMKvdM/Bh1plv1f7Q/0iFUDLKKlxHcEstQnaUU4QZskgQq74t+3w==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -2087,48 +2087,48 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/types": 6.12.0 - "@typescript-eslint/visitor-keys": 6.12.0 + "@typescript-eslint/types": 6.13.2 + "@typescript-eslint/visitor-keys": 6.13.2 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.3.2) - typescript: 5.3.2 + ts-api-utils: 1.0.3(typescript@5.3.3) + typescript: 5.3.3 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/utils@6.12.0(eslint@8.54.0)(typescript@5.3.2): + /@typescript-eslint/utils@6.13.2(eslint@8.55.0)(typescript@5.3.3): resolution: { - integrity: sha512-LywPm8h3tGEbgfyjYnu3dauZ0U7R60m+miXgKcZS8c7QALO9uWJdvNoP+duKTk2XMWc7/Q3d/QiCuLN9X6SWyQ==, + integrity: sha512-b9Ptq4eAZUym4idijCRzl61oPCwwREcfDI8xGk751Vhzig5fFZR9CyzDz4Sp/nxSLBYxUPyh4QdIDqWykFhNmQ==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.54.0) + "@eslint-community/eslint-utils": 4.4.0(eslint@8.55.0) "@types/json-schema": 7.0.15 "@types/semver": 7.5.6 - "@typescript-eslint/scope-manager": 6.12.0 - "@typescript-eslint/types": 6.12.0 - "@typescript-eslint/typescript-estree": 6.12.0(typescript@5.3.2) - eslint: 8.54.0 + "@typescript-eslint/scope-manager": 6.13.2 + "@typescript-eslint/types": 6.13.2 + "@typescript-eslint/typescript-estree": 6.13.2(typescript@5.3.3) + eslint: 8.55.0 semver: 7.5.4 transitivePeerDependencies: - supports-color - typescript dev: false - /@typescript-eslint/visitor-keys@6.12.0: + /@typescript-eslint/visitor-keys@6.13.2: resolution: { - integrity: sha512-rg3BizTZHF1k3ipn8gfrzDXXSFKyOEB5zxYXInQ6z0hUvmQlhaZQzK+YmHmNViMA9HzW5Q9+bPPt90bU6GQwyw==, + integrity: sha512-OGznFs0eAQXJsp+xSd6k/O1UbFi/K/L7WjqeRoFE7vadjAF9y0uppXhYNQNEqygjou782maGClOoZwPqF0Drlw==, } engines: { node: ^16.0.0 || >=18.0.0 } dependencies: - "@typescript-eslint/types": 6.12.0 + "@typescript-eslint/types": 6.13.2 eslint-visitor-keys: 3.4.3 dev: false @@ -2148,10 +2148,10 @@ packages: dependencies: acorn: 8.11.2 - /acorn-walk@8.3.0: + /acorn-walk@8.3.1: resolution: { - integrity: sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==, + integrity: sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==, } engines: { node: ">=0.4.0" } @@ -2249,10 +2249,10 @@ packages: } dev: false - /better-sqlite3@9.1.1: + /better-sqlite3@9.2.2: resolution: { - integrity: sha512-FhW7bS7cXwkB2SFnPJrSGPmQerVSCzwBgmQ1cIRcYKxLsyiKjljzCbyEqqhYXo5TTBqt5BISiBj2YE2Sy2ynaA==, + integrity: sha512-qwjWB46il0lsDkeB4rSRI96HyDQr8sxeu1MkBVLMrwusq1KRu4Bpt1TMI+8zIJkDUtZ3umjAkaEjIlokZKWCQw==, } requiresBuild: true dependencies: @@ -2704,7 +2704,7 @@ packages: json-diff: 0.9.0 minimatch: 7.4.6 semver: 7.5.4 - wrangler: 3.17.1 + wrangler: 3.19.0 zod: 3.22.4 transitivePeerDependencies: - bufferutil @@ -2712,10 +2712,10 @@ packages: - utf-8-validate dev: true - /drizzle-orm@0.29.0(@cloudflare/workers-types@4.20231121.0)(@libsql/client@0.4.0-pre.2)(better-sqlite3@9.1.1)(mysql2@3.6.5): + /drizzle-orm@0.29.1(@cloudflare/workers-types@4.20231121.0)(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2)(mysql2@3.6.5): resolution: { - integrity: sha512-AC+CuW4GezVjsZDGU9u9B4HyikudOyYVhjm6he3Xn1D6Kky7bHGKob97MMX2piO+t9b6UuajLzlii/T/lu1qwA==, + integrity: sha512-yItc4unfHnk8XkDD3/bdC63vdboTY7e7I03lCF1OJYABXSIfQYU9BFTQJXMMovVeb3T1/OJWwfW/70T1XPnuUA==, } peerDependencies: "@aws-sdk/client-rds-data": ">=3" @@ -2778,12 +2778,12 @@ packages: optional: true dependencies: "@cloudflare/workers-types": 4.20231121.0 - "@libsql/client": 0.4.0-pre.2 - better-sqlite3: 9.1.1 + "@libsql/client": 0.4.0-pre.5 + better-sqlite3: 9.2.2 mysql2: 3.6.5 dev: false - /drizzle-zod@0.5.1(drizzle-orm@0.29.0)(zod@3.22.4): + /drizzle-zod@0.5.1(drizzle-orm@0.29.1)(zod@3.22.4): resolution: { integrity: sha512-C/8bvzUH/zSnVfwdSibOgFjLhtDtbKYmkbPbUCq46QZyZCH6kODIMSOgZ8R7rVjoI+tCj3k06MRJMDqsIeoS4A==, @@ -2792,7 +2792,7 @@ packages: drizzle-orm: ">=0.23.13" zod: "*" dependencies: - drizzle-orm: 0.29.0(@cloudflare/workers-types@4.20231121.0)(@libsql/client@0.4.0-pre.2)(better-sqlite3@9.1.1)(mysql2@3.6.5) + drizzle-orm: 0.29.1(@cloudflare/workers-types@4.20231121.0)(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2)(mysql2@3.6.5) zod: 3.22.4 dev: false @@ -2971,7 +2971,7 @@ packages: } engines: { node: ">=10" } - /eslint-config-google@0.14.0(eslint@8.54.0): + /eslint-config-google@0.14.0(eslint@8.55.0): resolution: { integrity: sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==, @@ -2980,7 +2980,7 @@ packages: peerDependencies: eslint: ">=5.16.0" dependencies: - eslint: 8.54.0 + eslint: 8.55.0 dev: true /eslint-plugin-json@3.1.0: @@ -3011,18 +3011,18 @@ packages: } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - /eslint@8.54.0: + /eslint@8.55.0: resolution: { - integrity: sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==, + integrity: sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } hasBin: true dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.54.0) + "@eslint-community/eslint-utils": 4.4.0(eslint@8.55.0) "@eslint-community/regexpp": 4.10.0 - "@eslint/eslintrc": 2.1.3 - "@eslint/js": 8.54.0 + "@eslint/eslintrc": 2.1.4 + "@eslint/js": 8.55.0 "@humanwhocodes/config-array": 0.11.13 "@humanwhocodes/module-importer": 1.0.1 "@nodelib/fs.walk": 1.2.8 @@ -3480,10 +3480,10 @@ packages: } dev: true - /hono@3.10.2: + /hono@3.11.3: resolution: { - integrity: sha512-QwJLjWs3e+nZ3b5nQrrdJpYCJqiTK744jeYhX7yhZdxwcQ3KIohBfzI2dA8gSF6HEZkmFUdiKL1BelJ8utIm4w==, + integrity: sha512-MWYBcIS4dZJo9e/852Zwl+gqBiUSRknMOZ/MbW7kW8JiWixTJ58pzXVIeBq7jnvFq3AZ9uQ35QyVpzV05sdNFw==, } engines: { node: ">=16.0.0" } dev: false @@ -3775,10 +3775,10 @@ packages: prelude-ls: 1.2.1 type-check: 0.4.0 - /libsql@0.2.0-pre.2: + /libsql@0.2.0-pre.4: resolution: { - integrity: sha512-ErF11J/Q0Uo1TMceX1f7RKfFvQ/j4FS8TagzJnAZBwhHsPcr7uItkSTchkuRHm5+cE4dJO7lqf+MpmlDjp/qAQ==, + integrity: sha512-ZAud4bIZwWJjZUKvQOgg3yVX2fVuqVuPOtjFAPuo+FpfMcsnBpGfOcIJxvfik5qKchyqHd/fpHWbFk7/X0XuHg==, } cpu: [x64, arm64] os: [darwin, linux, win32] @@ -3786,13 +3786,13 @@ packages: "@neon-rs/load": 0.0.4 detect-libc: 2.0.2 optionalDependencies: - "@libsql/darwin-arm64": 0.2.0-pre.2 - "@libsql/darwin-x64": 0.2.0-pre.2 - "@libsql/linux-arm64-gnu": 0.2.0-pre.2 - "@libsql/linux-arm64-musl": 0.2.0-pre.2 - "@libsql/linux-x64-gnu": 0.2.0-pre.2 - "@libsql/linux-x64-musl": 0.2.0-pre.2 - "@libsql/win32-x64-msvc": 0.2.0-pre.2 + "@libsql/darwin-arm64": 0.2.0-pre.4 + "@libsql/darwin-x64": 0.2.0-pre.4 + "@libsql/linux-arm64-gnu": 0.2.0-pre.4 + "@libsql/linux-arm64-musl": 0.2.0-pre.4 + "@libsql/linux-x64-gnu": 0.2.0-pre.4 + "@libsql/linux-x64-musl": 0.2.0-pre.4 + "@libsql/win32-x64-msvc": 0.2.0-pre.4 dev: false /listhen@1.5.5: @@ -3815,7 +3815,7 @@ packages: mlly: 1.4.2 node-forge: 1.3.1 pathe: 1.1.1 - std-env: 3.5.0 + std-env: 3.6.0 ufo: 1.3.2 untun: 0.1.2 uqr: 0.1.2 @@ -4013,22 +4013,22 @@ packages: engines: { node: ">=10" } dev: false - /miniflare@3.20231030.1: + /miniflare@3.20231030.3: resolution: { - integrity: sha512-Y+EkgV/aFg/3Y/xfFtImK36sLZGXvNS45avVEz0cUCA2pGpg4hGdPu1Udmz5b06SyeUEFVf/dEDMJwdRYVEgLw==, + integrity: sha512-lquHSh0XiO8uoWDujOLHtDS9mkUTJTc5C5amiQ6A++5y0f+DWiMqbDBvvwjlYf4Dvqk6ChFya9dztk7fg2ZVxA==, } engines: { node: ">=16.13" } hasBin: true dependencies: acorn: 8.11.2 - acorn-walk: 8.3.0 + acorn-walk: 8.3.1 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.28.1 + undici: 5.28.2 workerd: 1.20231030.0 ws: 8.14.2 youch: 3.3.3 @@ -4176,10 +4176,10 @@ packages: } dev: true - /node-abi@3.51.0: + /node-abi@3.52.0: resolution: { - integrity: sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA==, + integrity: sha512-JJ98b02z16ILv7859irtXn4oUaFWADtvkzy2c0IAatNVX2Mc9Yoh8z6hZInn3QwvMEYhHuQloYi+TTQy67SIdQ==, } engines: { node: ">=10" } dependencies: @@ -4310,10 +4310,10 @@ packages: prelude-ls: 1.2.1 type-check: 0.4.0 - /oslo@0.23.1: + /oslo@0.23.5: resolution: { - integrity: sha512-E2cc4b+MVXiURqpWC4FpWGEGDOEGiH6EbI0Kowo3+m5MCK79hw3wBscfq6c6yRI1oo17OVqTiCLX3rupg2OAEA==, + integrity: sha512-G+q/MkR0IPaUA1+FpHL0pneAHJzhNpg9P4VXASy4JQy1KGFyfhi30DphVHYNKQC+C05VhDi/sTGdOX+yfcrT3g==, } dependencies: "@node-rs/argon2": 1.5.2 @@ -4422,7 +4422,7 @@ packages: minimist: 1.2.8 mkdirp-classic: 0.5.3 napi-build-utils: 1.0.2 - node-abi: 3.51.0 + node-abi: 3.52.0 pump: 3.0.0 rc: 1.2.8 simple-get: 4.0.1 @@ -4756,10 +4756,10 @@ packages: } dev: false - /std-env@3.5.0: + /std-env@3.6.0: resolution: { - integrity: sha512-JGUEaALvL0Mf6JCfYnJOTcobY+Nc7sG/TemDRBqCA0wEr4DER7zDchaaixTlmOxAjG1uRJmX82EQcxwTQTkqVA==, + integrity: sha512-aFZ19IgVmhdB2uX599ve2kE6BIE3YMnQ6Gp6BURhW/oIzpXGKr878TQfAQZn1+i0Flcc/UKUy1gOlcfaUBCryg==, } dev: false @@ -4888,7 +4888,7 @@ packages: } dev: false - /ts-api-utils@1.0.3(typescript@5.3.2): + /ts-api-utils@1.0.3(typescript@5.3.3): resolution: { integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==, @@ -4897,7 +4897,7 @@ packages: peerDependencies: typescript: ">=4.2.0" dependencies: - typescript: 5.3.2 + typescript: 5.3.3 dev: false /tslib@2.6.2: @@ -4906,10 +4906,10 @@ packages: integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==, } - /tsx@4.5.0: + /tsx@4.6.2: resolution: { - integrity: sha512-hgxdziy9KLaHh9KE+a6tIZFP6kb0MLq/1D0sJVifbGP4QVEYhy6+2FNn7MyCm1pMc63p9CW/L1OzdqTNPxs6rg==, + integrity: sha512-QPpBdJo+ZDtqZgAnq86iY/PD2KYCUPSUGIunHdGwyII99GKH+f3z3FZ8XNFLSGQIA4I365ui8wnQpl8OKLqcsg==, } engines: { node: ">=18.0.0" } hasBin: true @@ -4959,10 +4959,10 @@ packages: } dev: true - /typescript@5.3.2: + /typescript@5.3.3: resolution: { - integrity: sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==, + integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==, } engines: { node: ">=14.17" } hasBin: true @@ -4987,10 +4987,10 @@ packages: integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==, } - /undici@5.28.1: + /undici@5.28.2: resolution: { - integrity: sha512-xcIIvj1LOQH9zAL54iWFkuDEaIVEjLrru7qRpa3GrEEHk6OBhb/LycuUY2m7VCcTuDeLziXCxobQVyKExyGeIA==, + integrity: sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==, } engines: { node: ">=14.0" } dependencies: @@ -5208,10 +5208,10 @@ packages: "@cloudflare/workerd-linux-arm64": 1.20231030.0 "@cloudflare/workerd-windows-64": 1.20231030.0 - /wrangler@3.17.1: + /wrangler@3.19.0: resolution: { - integrity: sha512-Pr9+/tjFkthzG63uoVm1NtVvgokT6p92fy1UsOgrntHyTu0pZMC1VJzG0NC8Vhs+z/+yTT8AqVV6AiJb3w8ZOQ==, + integrity: sha512-pY7xWqkQn6DJ+1vz9YHz2pCftEmK+JCTj9sqnucp0NZnlUiILDmBWegsjjCLZycgfiA62J213N7NvjLPr2LB8w==, } engines: { node: ">=16.17.0" } hasBin: true @@ -5222,7 +5222,7 @@ packages: blake3-wasm: 2.1.5 chokidar: 3.5.3 esbuild: 0.17.19 - miniflare: 3.20231030.1 + miniflare: 3.20231030.3 nanoid: 3.3.7 path-to-regexp: 6.2.1 resolve.exports: 2.0.2 diff --git a/src/v2/db/migrations/meta/0000_snapshot.json b/src/v2/db/migrations/meta/0000_snapshot.json index 768d3e9..3cba8fc 100644 --- a/src/v2/db/migrations/meta/0000_snapshot.json +++ b/src/v2/db/migrations/meta/0000_snapshot.json @@ -1,2113 +1,1829 @@ { - "version": "5", - "dialect": "sqlite", - "id": "eac08da1-c397-4208-af88-cc268fafa3df", - "prevId": "00000000-0000-0000-0000-000000000000", - "tables": { - "asset": { - "name": "asset", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "extension": { - "name": "extension", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false + "version": "5", + "dialect": "sqlite", + "id": "eac08da1-c397-4208-af88-cc268fafa3df", + "prevId": "00000000-0000-0000-0000-000000000000", + "tables": { + "asset": { + "name": "asset", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "extension": { + "name": "extension", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "game": { + "name": "game", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_category": { + "name": "asset_category", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by_id": { + "name": "uploaded_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by_name": { + "name": "uploaded_by_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'pending'" + }, + "uploaded_date": { + "name": "uploaded_date", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_is_optimized": { + "name": "asset_is_optimized", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "asset_is_suggestive": { + "name": "asset_is_suggestive", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "view_count": { + "name": "view_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "download_count": { + "name": "download_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "file_size": { + "name": "file_size", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "width": { + "name": "width", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "height": { + "name": "height", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "assets_id_idx": { + "name": "assets_id_idx", + "columns": ["id"], + "isUnique": false + }, + "assets_name_idx": { + "name": "assets_name_idx", + "columns": ["name"], + "isUnique": false + }, + "assets_game_name_idx": { + "name": "assets_game_name_idx", + "columns": ["game"], + "isUnique": false + }, + "assets_asset_category_name_idx": { + "name": "assets_asset_category_name_idx", + "columns": ["asset_category"], + "isUnique": false + }, + "assets_uploaded_by_id_idx": { + "name": "assets_uploaded_by_id_idx", + "columns": ["uploaded_by_id"], + "isUnique": false + } + }, + "foreignKeys": { + "asset_game_game_id_fk": { + "name": "asset_game_game_id_fk", + "tableFrom": "asset", + "tableTo": "game", + "columnsFrom": ["game"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "asset_asset_category_assetCategory_id_fk": { + "name": "asset_asset_category_assetCategory_id_fk", + "tableFrom": "asset", + "tableTo": "assetCategory", + "columnsFrom": ["asset_category"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "asset_uploaded_by_id_authUser_id_fk": { + "name": "asset_uploaded_by_id_authUser_id_fk", + "tableFrom": "asset", + "tableTo": "authUser", + "columnsFrom": ["uploaded_by_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "asset_uploaded_by_name_authUser_username_fk": { + "name": "asset_uploaded_by_name_authUser_username_fk", + "tableFrom": "asset", + "tableTo": "authUser", + "columnsFrom": ["uploaded_by_name"], + "columnsTo": ["username"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "atlas": { + "name": "atlas", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by": { + "name": "uploaded_by", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by_name": { + "name": "uploaded_by_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_date": { + "name": "uploaded_date", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "file_size": { + "name": "file_size", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "atlas_id_unique": { + "name": "atlas_id_unique", + "columns": ["id"], + "isUnique": true + }, + "atlas_id_idx": { + "name": "atlas_id_idx", + "columns": ["id"], + "isUnique": false + }, + "atlas_uploaded_by_idx": { + "name": "atlas_uploaded_by_idx", + "columns": ["uploaded_by"], + "isUnique": false + }, + "atlas_uploaded_by_name_idx": { + "name": "atlas_uploaded_by_name_idx", + "columns": ["uploaded_by_name"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "atlasToAsset": { + "name": "atlasToAsset", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "atlas_id": { + "name": "atlas_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "atlas_to_assets_id_idx": { + "name": "atlas_to_assets_id_idx", + "columns": ["id"], + "isUnique": false + }, + "atlas_to_assets_atlas_id_idx": { + "name": "atlas_to_assets_atlas_id_idx", + "columns": ["atlas_id"], + "isUnique": false + }, + "atlas_to_assets_asset_id_idx": { + "name": "atlas_to_assets_asset_id_idx", + "columns": ["asset_id"], + "isUnique": false + } + }, + "foreignKeys": { + "atlasToAsset_atlas_id_atlas_id_fk": { + "name": "atlasToAsset_atlas_id_atlas_id_fk", + "tableFrom": "atlasToAsset", + "tableTo": "atlas", + "columnsFrom": ["atlas_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "atlasToAsset_asset_id_asset_id_fk": { + "name": "atlasToAsset_asset_id_asset_id_fk", + "tableFrom": "atlasToAsset", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetLikes": { + "name": "assetLikes", + "columns": { + "asset_id": { + "name": "asset_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetlikes_asset_idx": { + "name": "assetlikes_asset_idx", + "columns": ["asset_id"], + "isUnique": false + }, + "assetlikes_likedBy_idx": { + "name": "assetlikes_likedBy_idx", + "columns": ["liked_by_id"], + "isUnique": false + } + }, + "foreignKeys": { + "assetLikes_asset_id_asset_id_fk": { + "name": "assetLikes_asset_id_asset_id_fk", + "tableFrom": "assetLikes", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "assetLikes_liked_by_id_authUser_id_fk": { + "name": "assetLikes_liked_by_id_authUser_id_fk", + "tableFrom": "assetLikes", + "tableTo": "authUser", + "columnsFrom": ["liked_by_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetCategory": { + "name": "assetCategory", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetCategory_id_unique": { + "name": "assetCategory_id_unique", + "columns": ["id"], + "isUnique": true + }, + "assetCategory_name_unique": { + "name": "assetCategory_name_unique", + "columns": ["name"], + "isUnique": true + }, + "asset_category_id_idx": { + "name": "asset_category_id_idx", + "columns": ["id"], + "isUnique": false + }, + "asset_category_name_idx": { + "name": "asset_category_name_idx", + "columns": ["name"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "gameAssetCategory": { + "name": "gameAssetCategory", + "columns": { + "game_id": { + "name": "game_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_category_id": { + "name": "asset_category_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "game_asset_category_game_id_idx": { + "name": "game_asset_category_game_id_idx", + "columns": ["game_id"], + "isUnique": false + }, + "game_asset_category_asset_category_id_idx": { + "name": "game_asset_category_asset_category_id_idx", + "columns": ["asset_category_id"], + "isUnique": false + } + }, + "foreignKeys": { + "gameAssetCategory_game_id_game_id_fk": { + "name": "gameAssetCategory_game_id_game_id_fk", + "tableFrom": "gameAssetCategory", + "tableTo": "game", + "columnsFrom": ["game_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "gameAssetCategory_asset_category_id_assetCategory_id_fk": { + "name": "gameAssetCategory_asset_category_id_assetCategory_id_fk", + "tableFrom": "gameAssetCategory", + "tableTo": "assetCategory", + "columnsFrom": ["asset_category_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetCategoryLikes": { + "name": "assetCategoryLikes", + "columns": { + "asset_id": { + "name": "asset_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetCategoryLikes_asset_idx": { + "name": "assetCategoryLikes_asset_idx", + "columns": ["asset_id"], + "isUnique": false + }, + "assetCategoryLikes_likedby_idx": { + "name": "assetCategoryLikes_likedby_idx", + "columns": ["liked_by_id"], + "isUnique": false + } + }, + "foreignKeys": { + "assetCategoryLikes_asset_id_assetCategory_id_fk": { + "name": "assetCategoryLikes_asset_id_assetCategory_id_fk", + "tableFrom": "assetCategoryLikes", + "tableTo": "assetCategory", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "assetCategoryLikes_liked_by_id_authUser_id_fk": { + "name": "assetCategoryLikes_liked_by_id_authUser_id_fk", + "tableFrom": "assetCategoryLikes", + "tableTo": "authUser", + "columnsFrom": ["liked_by_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} }, "game": { - "name": "game", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_category": { - "name": "asset_category", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by_id": { - "name": "uploaded_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by_name": { - "name": "uploaded_by_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "url": { - "name": "url", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "status": { - "name": "status", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "'pending'" - }, - "uploaded_date": { - "name": "uploaded_date", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_is_optimized": { - "name": "asset_is_optimized", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "asset_is_suggestive": { - "name": "asset_is_suggestive", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "view_count": { - "name": "view_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "download_count": { - "name": "download_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "file_size": { - "name": "file_size", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "width": { - "name": "width", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "height": { - "name": "height", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "assets_id_idx": { - "name": "assets_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "assets_name_idx": { - "name": "assets_name_idx", - "columns": [ - "name" - ], - "isUnique": false - }, - "assets_game_name_idx": { - "name": "assets_game_name_idx", - "columns": [ - "game" - ], - "isUnique": false - }, - "assets_asset_category_name_idx": { - "name": "assets_asset_category_name_idx", - "columns": [ - "asset_category" - ], - "isUnique": false - }, - "assets_uploaded_by_id_idx": { - "name": "assets_uploaded_by_id_idx", - "columns": [ - "uploaded_by_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "asset_game_game_id_fk": { - "name": "asset_game_game_id_fk", - "tableFrom": "asset", - "tableTo": "game", - "columnsFrom": [ - "game" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "asset_asset_category_assetCategory_id_fk": { - "name": "asset_asset_category_assetCategory_id_fk", - "tableFrom": "asset", - "tableTo": "assetCategory", - "columnsFrom": [ - "asset_category" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "asset_uploaded_by_id_authUser_id_fk": { - "name": "asset_uploaded_by_id_authUser_id_fk", - "tableFrom": "asset", - "tableTo": "authUser", - "columnsFrom": [ - "uploaded_by_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "asset_uploaded_by_name_authUser_username_fk": { - "name": "asset_uploaded_by_name_authUser_username_fk", - "tableFrom": "asset", - "tableTo": "authUser", - "columnsFrom": [ - "uploaded_by_name" - ], - "columnsTo": [ - "username" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "atlas": { - "name": "atlas", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "url": { - "name": "url", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by": { - "name": "uploaded_by", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by_name": { - "name": "uploaded_by_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_date": { - "name": "uploaded_date", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "file_size": { - "name": "file_size", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "atlas_id_unique": { - "name": "atlas_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "atlas_id_idx": { - "name": "atlas_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "atlas_uploaded_by_idx": { - "name": "atlas_uploaded_by_idx", - "columns": [ - "uploaded_by" - ], - "isUnique": false - }, - "atlas_uploaded_by_name_idx": { - "name": "atlas_uploaded_by_name_idx", - "columns": [ - "uploaded_by_name" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "atlasToAsset": { - "name": "atlasToAsset", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "atlas_id": { - "name": "atlas_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "atlas_to_assets_id_idx": { - "name": "atlas_to_assets_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "atlas_to_assets_atlas_id_idx": { - "name": "atlas_to_assets_atlas_id_idx", - "columns": [ - "atlas_id" - ], - "isUnique": false - }, - "atlas_to_assets_asset_id_idx": { - "name": "atlas_to_assets_asset_id_idx", - "columns": [ - "asset_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "atlasToAsset_atlas_id_atlas_id_fk": { - "name": "atlasToAsset_atlas_id_atlas_id_fk", - "tableFrom": "atlasToAsset", - "tableTo": "atlas", - "columnsFrom": [ - "atlas_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "atlasToAsset_asset_id_asset_id_fk": { - "name": "atlasToAsset_asset_id_asset_id_fk", - "tableFrom": "atlasToAsset", - "tableTo": "asset", - "columnsFrom": [ - "asset_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetLikes": { - "name": "assetLikes", - "columns": { - "asset_id": { - "name": "asset_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetlikes_asset_idx": { - "name": "assetlikes_asset_idx", - "columns": [ - "asset_id" - ], - "isUnique": false - }, - "assetlikes_likedBy_idx": { - "name": "assetlikes_likedBy_idx", - "columns": [ - "liked_by_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "assetLikes_asset_id_asset_id_fk": { - "name": "assetLikes_asset_id_asset_id_fk", - "tableFrom": "assetLikes", - "tableTo": "asset", - "columnsFrom": [ - "asset_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "assetLikes_liked_by_id_authUser_id_fk": { - "name": "assetLikes_liked_by_id_authUser_id_fk", - "tableFrom": "assetLikes", - "tableTo": "authUser", - "columnsFrom": [ - "liked_by_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetCategory": { - "name": "assetCategory", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetCategory_id_unique": { - "name": "assetCategory_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "assetCategory_name_unique": { - "name": "assetCategory_name_unique", - "columns": [ - "name" - ], - "isUnique": true - }, - "asset_category_id_idx": { - "name": "asset_category_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "asset_category_name_idx": { - "name": "asset_category_name_idx", - "columns": [ - "name" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "gameAssetCategory": { - "name": "gameAssetCategory", - "columns": { - "game_id": { - "name": "game_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_category_id": { - "name": "asset_category_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "game_asset_category_game_id_idx": { - "name": "game_asset_category_game_id_idx", - "columns": [ - "game_id" - ], - "isUnique": false - }, - "game_asset_category_asset_category_id_idx": { - "name": "game_asset_category_asset_category_id_idx", - "columns": [ - "asset_category_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "gameAssetCategory_game_id_game_id_fk": { - "name": "gameAssetCategory_game_id_game_id_fk", - "tableFrom": "gameAssetCategory", - "tableTo": "game", - "columnsFrom": [ - "game_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "gameAssetCategory_asset_category_id_assetCategory_id_fk": { - "name": "gameAssetCategory_asset_category_id_assetCategory_id_fk", - "tableFrom": "gameAssetCategory", - "tableTo": "assetCategory", - "columnsFrom": [ - "asset_category_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetCategoryLikes": { - "name": "assetCategoryLikes", - "columns": { - "asset_id": { - "name": "asset_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetCategoryLikes_asset_idx": { - "name": "assetCategoryLikes_asset_idx", - "columns": [ - "asset_id" - ], - "isUnique": false - }, - "assetCategoryLikes_likedby_idx": { - "name": "assetCategoryLikes_likedby_idx", - "columns": [ - "liked_by_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "assetCategoryLikes_asset_id_assetCategory_id_fk": { - "name": "assetCategoryLikes_asset_id_assetCategory_id_fk", - "tableFrom": "assetCategoryLikes", - "tableTo": "assetCategory", - "columnsFrom": [ - "asset_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "assetCategoryLikes_liked_by_id_authUser_id_fk": { - "name": "assetCategoryLikes_liked_by_id_authUser_id_fk", - "tableFrom": "assetCategoryLikes", - "tableTo": "authUser", - "columnsFrom": [ - "liked_by_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "game": { - "name": "game", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - }, - "possible_suggestive_content": { - "name": "possible_suggestive_content", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "game_id_unique": { - "name": "game_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "game_name_unique": { - "name": "game_name_unique", - "columns": [ - "name" - ], - "isUnique": true - }, - "game_id_idx": { - "name": "game_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "game_name_idx": { - "name": "game_name_idx", - "columns": [ - "name" - ], - "isUnique": false + "name": "game", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": 0 + }, + "possible_suggestive_content": { + "name": "possible_suggestive_content", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "game_id_unique": { + "name": "game_id_unique", + "columns": ["id"], + "isUnique": true + }, + "game_name_unique": { + "name": "game_name_unique", + "columns": ["name"], + "isUnique": true + }, + "game_id_idx": { + "name": "game_id_idx", + "columns": ["id"], + "isUnique": false + }, + "game_name_idx": { + "name": "game_name_idx", + "columns": ["name"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "gameLikes": { + "name": "gameLikes", + "columns": { + "asset_id": { + "name": "asset_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "gamelikes_game_idx": { + "name": "gamelikes_game_idx", + "columns": ["asset_id"], + "isUnique": false + }, + "gamelikes_likedby_idx": { + "name": "gamelikes_likedby_idx", + "columns": ["liked_by_id"], + "isUnique": false + } + }, + "foreignKeys": { + "gameLikes_asset_id_game_id_fk": { + "name": "gameLikes_asset_id_game_id_fk", + "tableFrom": "gameLikes", + "tableTo": "game", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "gameLikes_liked_by_id_authUser_id_fk": { + "name": "gameLikes_liked_by_id_authUser_id_fk", + "tableFrom": "gameLikes", + "tableTo": "authUser", + "columnsFrom": ["liked_by_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetTag": { + "name": "assetTag", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetTag_id_unique": { + "name": "assetTag_id_unique", + "columns": ["id"], + "isUnique": true + }, + "assetTag_name_unique": { + "name": "assetTag_name_unique", + "columns": ["name"], + "isUnique": true + }, + "asset_tag_id_idx": { + "name": "asset_tag_id_idx", + "columns": ["id"], + "isUnique": false + }, + "asset_tag_name_idx": { + "name": "asset_tag_name_idx", + "columns": ["name"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetTagAsset": { + "name": "assetTagAsset", + "columns": { + "asset_tag_id": { + "name": "asset_tag_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "asset_tags_assets_asset_tag_id_idx": { + "name": "asset_tags_assets_asset_tag_id_idx", + "columns": ["asset_tag_id"], + "isUnique": false + }, + "asset_tags_assets_asset_id_idx": { + "name": "asset_tags_assets_asset_id_idx", + "columns": ["asset_id"], + "isUnique": false + } + }, + "foreignKeys": { + "assetTagAsset_asset_tag_id_assetTag_id_fk": { + "name": "assetTagAsset_asset_tag_id_assetTag_id_fk", + "tableFrom": "assetTagAsset", + "tableTo": "assetTag", + "columnsFrom": ["asset_tag_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "assetTagAsset_asset_id_asset_id_fk": { + "name": "assetTagAsset_asset_id_asset_id_fk", + "tableFrom": "assetTagAsset", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetTagLikes": { + "name": "assetTagLikes", + "columns": { + "asset_id": { + "name": "asset_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetTagLikes_asset_idx": { + "name": "assetTagLikes_asset_idx", + "columns": ["asset_id"], + "isUnique": false + }, + "assetTagLikes_likedby_idx": { + "name": "assetTagLikes_likedby_idx", + "columns": ["liked_by_id"], + "isUnique": false + } + }, + "foreignKeys": { + "assetTagLikes_asset_id_assetTag_id_fk": { + "name": "assetTagLikes_asset_id_assetTag_id_fk", + "tableFrom": "assetTagLikes", + "tableTo": "assetTag", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "assetTagLikes_liked_by_id_authUser_id_fk": { + "name": "assetTagLikes_liked_by_id_authUser_id_fk", + "tableFrom": "assetTagLikes", + "tableTo": "authUser", + "columnsFrom": ["liked_by_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "savedOcGenerators": { + "name": "savedOcGenerators", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "game": { + "name": "game", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "date_created": { + "name": "date_created", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "saved_color_palette": { + "name": "saved_color_palette", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sakura_url": { + "name": "sakura_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "savedOcGenerators_id_unique": { + "name": "savedOcGenerators_id_unique", + "columns": ["id"], + "isUnique": true + }, + "saved_oc_generators_id_idx": { + "name": "saved_oc_generators_id_idx", + "columns": ["id"], + "isUnique": false + }, + "saved_oc_generators_user_id_idx": { + "name": "saved_oc_generators_user_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "savedOcGenerators_user_id_authUser_id_fk": { + "name": "savedOcGenerators_user_id_authUser_id_fk", + "tableFrom": "savedOcGenerators", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "authKey": { + "name": "authKey", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "hashed_password": { + "name": "hashed_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "authKey_id_unique": { + "name": "authKey_id_unique", + "columns": ["id"], + "isUnique": true + }, + "key_user_id_idx": { + "name": "key_user_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "authKey_user_id_authUser_id_fk": { + "name": "authKey_user_id_authUser_id_fk", + "tableFrom": "authKey", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "authUser": { + "name": "authUser", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "avatar_url": { + "name": "avatar_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "banner_url": { + "name": "banner_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "display_name": { + "name": "display_name", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "username_colour": { + "name": "username_colour", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "email_verified": { + "name": "email_verified", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "pronouns": { + "name": "pronouns", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "verified": { + "name": "verified", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "bio": { + "name": "bio", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'No bio set'" + }, + "date_joined": { + "name": "date_joined", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "role_flags": { + "name": "role_flags", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "is_contributor": { + "name": "is_contributor", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "self_assignable_role_flags": { + "name": "self_assignable_role_flags", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "authUser_id_unique": { + "name": "authUser_id_unique", + "columns": ["id"], + "isUnique": true + }, + "authUser_username_unique": { + "name": "authUser_username_unique", + "columns": ["username"], + "isUnique": true + }, + "user_id_idx": { + "name": "user_id_idx", + "columns": ["id"], + "isUnique": false + }, + "user_username_idx": { + "name": "user_username_idx", + "columns": ["username"], + "isUnique": false + }, + "user_email_idx": { + "name": "user_email_idx", + "columns": ["email"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "authSession": { + "name": "authSession", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "active_expires": { + "name": "active_expires", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "idle_expires": { + "name": "idle_expires", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "authSession_id_unique": { + "name": "authSession_id_unique", + "columns": ["id"], + "isUnique": true + }, + "session_user_id_idx": { + "name": "session_user_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "authSession_user_id_authUser_id_fk": { + "name": "authSession_user_id_authUser_id_fk", + "tableFrom": "authSession", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "emailVerificationToken": { + "name": "emailVerificationToken", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "emailVerificationToken_id_unique": { + "name": "emailVerificationToken_id_unique", + "columns": ["id"], + "isUnique": true + }, + "email_verification_token_user_id_idx": { + "name": "email_verification_token_user_id_idx", + "columns": ["user_id"], + "isUnique": false + }, + "email_verification_token_token_idx": { + "name": "email_verification_token_token_idx", + "columns": ["token"], + "isUnique": false + } + }, + "foreignKeys": { + "emailVerificationToken_user_id_authUser_id_fk": { + "name": "emailVerificationToken_user_id_authUser_id_fk", + "tableFrom": "emailVerificationToken", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "passwordResetToken": { + "name": "passwordResetToken", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "passwordResetToken_id_unique": { + "name": "passwordResetToken_id_unique", + "columns": ["id"], + "isUnique": true + }, + "password_reset_token_user_id_idx": { + "name": "password_reset_token_user_id_idx", + "columns": ["user_id"], + "isUnique": false + }, + "password_reset_token_token_idx": { + "name": "password_reset_token_token_idx", + "columns": ["token"], + "isUnique": false + } + }, + "foreignKeys": { + "passwordResetToken_user_id_authUser_id_fk": { + "name": "passwordResetToken_user_id_authUser_id_fk", + "tableFrom": "passwordResetToken", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userCollection": { + "name": "userCollection", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "date_created": { + "name": "date_created", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": { + "userCollection_id_unique": { + "name": "userCollection_id_unique", + "columns": ["id"], + "isUnique": true + }, + "collection_id_idx": { + "name": "collection_id_idx", + "columns": ["id"], + "isUnique": false + }, + "user_collection_id_idx": { + "name": "user_collection_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "userCollection_user_id_authUser_id_fk": { + "name": "userCollection_user_id_authUser_id_fk", + "tableFrom": "userCollection", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userCollectionAsset": { + "name": "userCollectionAsset", + "columns": { + "collection_id": { + "name": "collection_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "date_added": { + "name": "date_added", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "collection_assets_collection_id_idx": { + "name": "collection_assets_collection_id_idx", + "columns": ["collection_id"], + "isUnique": false + }, + "collection_assets_asset_id_idx": { + "name": "collection_assets_asset_id_idx", + "columns": ["asset_id"], + "isUnique": false + } + }, + "foreignKeys": { + "userCollectionAsset_collection_id_userCollection_id_fk": { + "name": "userCollectionAsset_collection_id_userCollection_id_fk", + "tableFrom": "userCollectionAsset", + "tableTo": "userCollection", + "columnsFrom": ["collection_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "userCollectionAsset_asset_id_asset_id_fk": { + "name": "userCollectionAsset_asset_id_asset_id_fk", + "tableFrom": "userCollectionAsset", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "socialsConnection": { + "name": "socialsConnection", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "discord_id": { + "name": "discord_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "socialsConnection_id_unique": { + "name": "socialsConnection_id_unique", + "columns": ["id"], + "isUnique": true + }, + "socialsConnection_user_id_unique": { + "name": "socialsConnection_user_id_unique", + "columns": ["user_id"], + "isUnique": true + }, + "socials_connection_user_id_idx": { + "name": "socials_connection_user_id_idx", + "columns": ["user_id"], + "isUnique": false + }, + "socials_connection_discord_id_idx": { + "name": "socials_connection_discord_id_idx", + "columns": ["discord_id"], + "isUnique": false + } + }, + "foreignKeys": { + "socialsConnection_user_id_authUser_id_fk": { + "name": "socialsConnection_user_id_authUser_id_fk", + "tableFrom": "socialsConnection", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userFavorite": { + "name": "userFavorite", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": { + "userFavorite_id_unique": { + "name": "userFavorite_id_unique", + "columns": ["id"], + "isUnique": true + }, + "favorited_assets_id_idx": { + "name": "favorited_assets_id_idx", + "columns": ["id"], + "isUnique": false + }, + "favorited_assets_user_id_idx": { + "name": "favorited_assets_user_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "userFavorite_user_id_authUser_id_fk": { + "name": "userFavorite_user_id_authUser_id_fk", + "tableFrom": "userFavorite", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userFavoriteAsset": { + "name": "userFavoriteAsset", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "favorited_assets_id": { + "name": "favorited_assets_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "userFavoriteAsset_id_unique": { + "name": "userFavoriteAsset_id_unique", + "columns": ["id"], + "isUnique": true + }, + "favorited_assets_assets_id_idx": { + "name": "favorited_assets_assets_id_idx", + "columns": ["id"], + "isUnique": false + }, + "favorited_assets_assets_user_id_idx": { + "name": "favorited_assets_assets_user_id_idx", + "columns": ["favorited_assets_id"], + "isUnique": false + }, + "favorited_assets_assets_asset_id_idx": { + "name": "favorited_assets_assets_asset_id_idx", + "columns": ["asset_id"], + "isUnique": false + } + }, + "foreignKeys": { + "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk": { + "name": "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk", + "tableFrom": "userFavoriteAsset", + "tableTo": "userFavorite", + "columnsFrom": ["favorited_assets_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "userFavoriteAsset_asset_id_asset_id_fk": { + "name": "userFavoriteAsset_asset_id_asset_id_fk", + "tableFrom": "userFavoriteAsset", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userFollowing": { + "name": "userFollowing", + "columns": { + "followerId": { + "name": "followerId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "followingId": { + "name": "followingId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "userfollowing_follower_idx": { + "name": "userfollowing_follower_idx", + "columns": ["followerId"], + "isUnique": false + }, + "userfollowing_following_idx": { + "name": "userfollowing_following_idx", + "columns": ["followingId"], + "isUnique": false + } + }, + "foreignKeys": { + "userFollowing_followerId_authUser_id_fk": { + "name": "userFollowing_followerId_authUser_id_fk", + "tableFrom": "userFollowing", + "tableTo": "authUser", + "columnsFrom": ["followerId"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "userFollowing_followingId_authUser_id_fk": { + "name": "userFollowing_followingId_authUser_id_fk", + "tableFrom": "userFollowing", + "tableTo": "authUser", + "columnsFrom": ["followingId"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userCollectionLikes": { + "name": "userCollectionLikes", + "columns": { + "collection_id": { + "name": "collection_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "userCollectionNetworking_collection_idx": { + "name": "userCollectionNetworking_collection_idx", + "columns": ["collection_id"], + "isUnique": false + }, + "userCollectionNetworking_likedBy_idx": { + "name": "userCollectionNetworking_likedBy_idx", + "columns": ["liked_by_id"], + "isUnique": false + } + }, + "foreignKeys": { + "userCollectionLikes_collection_id_userCollection_id_fk": { + "name": "userCollectionLikes_collection_id_userCollection_id_fk", + "tableFrom": "userCollectionLikes", + "tableTo": "userCollection", + "columnsFrom": ["collection_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "userCollectionLikes_liked_by_id_authUser_id_fk": { + "name": "userCollectionLikes_liked_by_id_authUser_id_fk", + "tableFrom": "userCollectionLikes", + "tableTo": "authUser", + "columnsFrom": ["liked_by_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} }, - "gameLikes": { - "name": "gameLikes", - "columns": { - "asset_id": { - "name": "asset_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "gamelikes_game_idx": { - "name": "gamelikes_game_idx", - "columns": [ - "asset_id" - ], - "isUnique": false - }, - "gamelikes_likedby_idx": { - "name": "gamelikes_likedby_idx", - "columns": [ - "liked_by_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "gameLikes_asset_id_game_id_fk": { - "name": "gameLikes_asset_id_game_id_fk", - "tableFrom": "gameLikes", - "tableTo": "game", - "columnsFrom": [ - "asset_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "gameLikes_liked_by_id_authUser_id_fk": { - "name": "gameLikes_liked_by_id_authUser_id_fk", - "tableFrom": "gameLikes", - "tableTo": "authUser", - "columnsFrom": [ - "liked_by_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetTag": { - "name": "assetTag", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetTag_id_unique": { - "name": "assetTag_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "assetTag_name_unique": { - "name": "assetTag_name_unique", - "columns": [ - "name" - ], - "isUnique": true - }, - "asset_tag_id_idx": { - "name": "asset_tag_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "asset_tag_name_idx": { - "name": "asset_tag_name_idx", - "columns": [ - "name" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetTagAsset": { - "name": "assetTagAsset", - "columns": { - "asset_tag_id": { - "name": "asset_tag_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "asset_tags_assets_asset_tag_id_idx": { - "name": "asset_tags_assets_asset_tag_id_idx", - "columns": [ - "asset_tag_id" - ], - "isUnique": false - }, - "asset_tags_assets_asset_id_idx": { - "name": "asset_tags_assets_asset_id_idx", - "columns": [ - "asset_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "assetTagAsset_asset_tag_id_assetTag_id_fk": { - "name": "assetTagAsset_asset_tag_id_assetTag_id_fk", - "tableFrom": "assetTagAsset", - "tableTo": "assetTag", - "columnsFrom": [ - "asset_tag_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "assetTagAsset_asset_id_asset_id_fk": { - "name": "assetTagAsset_asset_id_asset_id_fk", - "tableFrom": "assetTagAsset", - "tableTo": "asset", - "columnsFrom": [ - "asset_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetTagLikes": { - "name": "assetTagLikes", - "columns": { - "asset_id": { - "name": "asset_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetTagLikes_asset_idx": { - "name": "assetTagLikes_asset_idx", - "columns": [ - "asset_id" - ], - "isUnique": false - }, - "assetTagLikes_likedby_idx": { - "name": "assetTagLikes_likedby_idx", - "columns": [ - "liked_by_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "assetTagLikes_asset_id_assetTag_id_fk": { - "name": "assetTagLikes_asset_id_assetTag_id_fk", - "tableFrom": "assetTagLikes", - "tableTo": "assetTag", - "columnsFrom": [ - "asset_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "assetTagLikes_liked_by_id_authUser_id_fk": { - "name": "assetTagLikes_liked_by_id_authUser_id_fk", - "tableFrom": "assetTagLikes", - "tableTo": "authUser", - "columnsFrom": [ - "liked_by_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "savedOcGenerators": { - "name": "savedOcGenerators", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "game": { - "name": "game", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "date_created": { - "name": "date_created", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "content": { - "name": "content", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "saved_color_palette": { - "name": "saved_color_palette", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "sakura_url": { - "name": "sakura_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "savedOcGenerators_id_unique": { - "name": "savedOcGenerators_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "saved_oc_generators_id_idx": { - "name": "saved_oc_generators_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "saved_oc_generators_user_id_idx": { - "name": "saved_oc_generators_user_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "savedOcGenerators_user_id_authUser_id_fk": { - "name": "savedOcGenerators_user_id_authUser_id_fk", - "tableFrom": "savedOcGenerators", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "authKey": { - "name": "authKey", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "hashed_password": { - "name": "hashed_password", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "authKey_id_unique": { - "name": "authKey_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "key_user_id_idx": { - "name": "key_user_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "authKey_user_id_authUser_id_fk": { - "name": "authKey_user_id_authUser_id_fk", - "tableFrom": "authKey", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "authUser": { - "name": "authUser", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "avatar_url": { - "name": "avatar_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "banner_url": { - "name": "banner_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "display_name": { - "name": "display_name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "username": { - "name": "username", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "username_colour": { - "name": "username_colour", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "email": { - "name": "email", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "email_verified": { - "name": "email_verified", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "pronouns": { - "name": "pronouns", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "verified": { - "name": "verified", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "bio": { - "name": "bio", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "'No bio set'" - }, - "date_joined": { - "name": "date_joined", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "role_flags": { - "name": "role_flags", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 1 - }, - "is_contributor": { - "name": "is_contributor", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "self_assignable_role_flags": { - "name": "self_assignable_role_flags", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "authUser_id_unique": { - "name": "authUser_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "authUser_username_unique": { - "name": "authUser_username_unique", - "columns": [ - "username" - ], - "isUnique": true - }, - "user_id_idx": { - "name": "user_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "user_username_idx": { - "name": "user_username_idx", - "columns": [ - "username" - ], - "isUnique": false - }, - "user_email_idx": { - "name": "user_email_idx", - "columns": [ - "email" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "authSession": { - "name": "authSession", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "active_expires": { - "name": "active_expires", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "idle_expires": { - "name": "idle_expires", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "authSession_id_unique": { - "name": "authSession_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "session_user_id_idx": { - "name": "session_user_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "authSession_user_id_authUser_id_fk": { - "name": "authSession_user_id_authUser_id_fk", - "tableFrom": "authSession", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "emailVerificationToken": { - "name": "emailVerificationToken", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "emailVerificationToken_id_unique": { - "name": "emailVerificationToken_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "email_verification_token_user_id_idx": { - "name": "email_verification_token_user_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - }, - "email_verification_token_token_idx": { - "name": "email_verification_token_token_idx", - "columns": [ - "token" - ], - "isUnique": false - } - }, - "foreignKeys": { - "emailVerificationToken_user_id_authUser_id_fk": { - "name": "emailVerificationToken_user_id_authUser_id_fk", - "tableFrom": "emailVerificationToken", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "passwordResetToken": { - "name": "passwordResetToken", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "passwordResetToken_id_unique": { - "name": "passwordResetToken_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "password_reset_token_user_id_idx": { - "name": "password_reset_token_user_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - }, - "password_reset_token_token_idx": { - "name": "password_reset_token_token_idx", - "columns": [ - "token" - ], - "isUnique": false - } - }, - "foreignKeys": { - "passwordResetToken_user_id_authUser_id_fk": { - "name": "passwordResetToken_user_id_authUser_id_fk", - "tableFrom": "passwordResetToken", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userCollection": { - "name": "userCollection", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "date_created": { - "name": "date_created", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - } - }, - "indexes": { - "userCollection_id_unique": { - "name": "userCollection_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "collection_id_idx": { - "name": "collection_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "user_collection_id_idx": { - "name": "user_collection_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "userCollection_user_id_authUser_id_fk": { - "name": "userCollection_user_id_authUser_id_fk", - "tableFrom": "userCollection", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userCollectionAsset": { - "name": "userCollectionAsset", - "columns": { - "collection_id": { - "name": "collection_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "date_added": { - "name": "date_added", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "collection_assets_collection_id_idx": { - "name": "collection_assets_collection_id_idx", - "columns": [ - "collection_id" - ], - "isUnique": false - }, - "collection_assets_asset_id_idx": { - "name": "collection_assets_asset_id_idx", - "columns": [ - "asset_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "userCollectionAsset_collection_id_userCollection_id_fk": { - "name": "userCollectionAsset_collection_id_userCollection_id_fk", - "tableFrom": "userCollectionAsset", - "tableTo": "userCollection", - "columnsFrom": [ - "collection_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "userCollectionAsset_asset_id_asset_id_fk": { - "name": "userCollectionAsset_asset_id_asset_id_fk", - "tableFrom": "userCollectionAsset", - "tableTo": "asset", - "columnsFrom": [ - "asset_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "socialsConnection": { - "name": "socialsConnection", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "discord_id": { - "name": "discord_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "socialsConnection_id_unique": { - "name": "socialsConnection_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "socialsConnection_user_id_unique": { - "name": "socialsConnection_user_id_unique", - "columns": [ - "user_id" - ], - "isUnique": true - }, - "socials_connection_user_id_idx": { - "name": "socials_connection_user_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - }, - "socials_connection_discord_id_idx": { - "name": "socials_connection_discord_id_idx", - "columns": [ - "discord_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "socialsConnection_user_id_authUser_id_fk": { - "name": "socialsConnection_user_id_authUser_id_fk", - "tableFrom": "socialsConnection", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userFavorite": { - "name": "userFavorite", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - } - }, - "indexes": { - "userFavorite_id_unique": { - "name": "userFavorite_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "favorited_assets_id_idx": { - "name": "favorited_assets_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "favorited_assets_user_id_idx": { - "name": "favorited_assets_user_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "userFavorite_user_id_authUser_id_fk": { - "name": "userFavorite_user_id_authUser_id_fk", - "tableFrom": "userFavorite", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userFavoriteAsset": { - "name": "userFavoriteAsset", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "favorited_assets_id": { - "name": "favorited_assets_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "userFavoriteAsset_id_unique": { - "name": "userFavoriteAsset_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "favorited_assets_assets_id_idx": { - "name": "favorited_assets_assets_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "favorited_assets_assets_user_id_idx": { - "name": "favorited_assets_assets_user_id_idx", - "columns": [ - "favorited_assets_id" - ], - "isUnique": false - }, - "favorited_assets_assets_asset_id_idx": { - "name": "favorited_assets_assets_asset_id_idx", - "columns": [ - "asset_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk": { - "name": "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk", - "tableFrom": "userFavoriteAsset", - "tableTo": "userFavorite", - "columnsFrom": [ - "favorited_assets_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "userFavoriteAsset_asset_id_asset_id_fk": { - "name": "userFavoriteAsset_asset_id_asset_id_fk", - "tableFrom": "userFavoriteAsset", - "tableTo": "asset", - "columnsFrom": [ - "asset_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userFollowing": { - "name": "userFollowing", - "columns": { - "followerId": { - "name": "followerId", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "followingId": { - "name": "followingId", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "userfollowing_follower_idx": { - "name": "userfollowing_follower_idx", - "columns": [ - "followerId" - ], - "isUnique": false - }, - "userfollowing_following_idx": { - "name": "userfollowing_following_idx", - "columns": [ - "followingId" - ], - "isUnique": false - } - }, - "foreignKeys": { - "userFollowing_followerId_authUser_id_fk": { - "name": "userFollowing_followerId_authUser_id_fk", - "tableFrom": "userFollowing", - "tableTo": "authUser", - "columnsFrom": [ - "followerId" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "userFollowing_followingId_authUser_id_fk": { - "name": "userFollowing_followingId_authUser_id_fk", - "tableFrom": "userFollowing", - "tableTo": "authUser", - "columnsFrom": [ - "followingId" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userCollectionLikes": { - "name": "userCollectionLikes", - "columns": { - "collection_id": { - "name": "collection_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "userCollectionNetworking_collection_idx": { - "name": "userCollectionNetworking_collection_idx", - "columns": [ - "collection_id" - ], - "isUnique": false - }, - "userCollectionNetworking_likedBy_idx": { - "name": "userCollectionNetworking_likedBy_idx", - "columns": [ - "liked_by_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "userCollectionLikes_collection_id_userCollection_id_fk": { - "name": "userCollectionLikes_collection_id_userCollection_id_fk", - "tableFrom": "userCollectionLikes", - "tableTo": "userCollection", - "columnsFrom": [ - "collection_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "userCollectionLikes_liked_by_id_authUser_id_fk": { - "name": "userCollectionLikes_liked_by_id_authUser_id_fk", - "tableFrom": "userCollectionLikes", - "tableTo": "authUser", - "columnsFrom": [ - "liked_by_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} } - }, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - } -} \ No newline at end of file +} diff --git a/src/v2/db/migrations/meta/_journal.json b/src/v2/db/migrations/meta/_journal.json index 1b1b05b..9a10d76 100644 --- a/src/v2/db/migrations/meta/_journal.json +++ b/src/v2/db/migrations/meta/_journal.json @@ -1,13 +1,13 @@ { - "version": "5", - "dialect": "sqlite", - "entries": [ - { - "idx": 0, - "version": "5", - "when": 1701255870880, - "tag": "0000_smart_scarlet_spider", - "breakpoints": true - } - ] -} \ No newline at end of file + "version": "5", + "dialect": "sqlite", + "entries": [ + { + "idx": 0, + "version": "5", + "when": 1701255870880, + "tag": "0000_smart_scarlet_spider", + "breakpoints": true + } + ] +} diff --git a/src/v2/lib/auth/lucia.ts b/src/v2/lib/auth/lucia.ts index 2898818..8813afe 100644 --- a/src/v2/lib/auth/lucia.ts +++ b/src/v2/lib/auth/lucia.ts @@ -19,10 +19,6 @@ export function auth(env: Bindings) { session: tableNames.authSession, }), middleware: hono(), - // sessionExpiresIn: { - // idlePeriod: 0, - // activePeriod: 30 * 24 * 60 * 60 * 1000, // 30 days - // }, env: env.ENVIRONMENT === "DEV" ? "DEV" : "PROD", experimental: { debugMode: env.ENVIRONMENT === "DEV" ? true : false, From eadf0ea1bef05146e82c48d9572d17acf718fe6e Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Fri, 8 Dec 2023 14:30:01 +0000 Subject: [PATCH 175/318] migrate lucia config to v3 --- package.json | 6 +- pnpm-lock.yaml | 52 +--- src/v2/lib/auth/adapter/adapter.ts | 245 ------------------ .../lib/auth/definitions/auth-definitions.ts | 27 ++ src/v2/lib/auth/lucia.ts | 101 +++----- src/v2/lib/auth/oauth/discord.ts | 1 + 6 files changed, 83 insertions(+), 349 deletions(-) delete mode 100644 src/v2/lib/auth/adapter/adapter.ts create mode 100644 src/v2/lib/auth/definitions/auth-definitions.ts create mode 100644 src/v2/lib/auth/oauth/discord.ts diff --git a/package.json b/package.json index 90ccdc1..635dc98 100644 --- a/package.json +++ b/package.json @@ -37,15 +37,13 @@ "@hono/swagger-ui": "^0.2.0", "@hono/zod-openapi": "^0.9.3", "@libsql/client": "0.4.0-pre.5", - "@lucia-auth/adapter-session-unstorage": "^2.1.0", - "@lucia-auth/adapter-sqlite": "^2.0.1", - "@lucia-auth/oauth": "^3.5.0", + "@lucia-auth/adapter-sqlite": "3.0.0-beta.9", "@typescript-eslint/eslint-plugin": "^6.13.2", "better-sqlite3": "^9.2.2", "drizzle-orm": "^0.29.1", "drizzle-zod": "^0.5.1", "hono": "^3.11.3", - "lucia": "^2.7.4", + "lucia": "3.0.0-beta.11", "miniflare": "^3.20231030.3", "mysql2": "^3.6.5", "oslo": "^0.23.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 06952f0..cd6b758 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,15 +14,9 @@ dependencies: "@libsql/client": specifier: 0.4.0-pre.5 version: 0.4.0-pre.5 - "@lucia-auth/adapter-session-unstorage": - specifier: ^2.1.0 - version: 2.1.0(lucia@2.7.4)(unstorage@1.10.1) "@lucia-auth/adapter-sqlite": - specifier: ^2.0.1 - version: 2.0.1(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2)(lucia@2.7.4) - "@lucia-auth/oauth": - specifier: ^3.5.0 - version: 3.5.0(lucia@2.7.4) + specifier: 3.0.0-beta.9 + version: 3.0.0-beta.9(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2)(lucia@3.0.0-beta.11) "@typescript-eslint/eslint-plugin": specifier: ^6.13.2 version: 6.13.2(@typescript-eslint/parser@6.13.2)(eslint@8.55.0)(typescript@5.3.3) @@ -39,8 +33,8 @@ dependencies: specifier: ^3.11.3 version: 3.11.3 lucia: - specifier: ^2.7.4 - version: 2.7.4 + specifier: 3.0.0-beta.11 + version: 3.0.0-beta.11 miniflare: specifier: ^3.20231030.3 version: 3.20231030.3 @@ -1309,28 +1303,15 @@ packages: dev: false optional: true - /@lucia-auth/adapter-session-unstorage@2.1.0(lucia@2.7.4)(unstorage@1.10.1): + /@lucia-auth/adapter-sqlite@3.0.0-beta.9(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2)(lucia@3.0.0-beta.11): resolution: { - integrity: sha512-ItK7urZhLZv7UO99BcODjRhSAv58UPc+KQAmnkSvri2WBc22vFEjnjd/oWp3CZPdbbrJkuTvsuhFXH1ySBfOLg==, - } - peerDependencies: - lucia: ^2.0.0 - unstorage: ^1.9.0 - dependencies: - lucia: 2.7.4 - unstorage: 1.10.1 - dev: false - - /@lucia-auth/adapter-sqlite@2.0.1(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2)(lucia@2.7.4): - resolution: - { - integrity: sha512-yc7XQ4X3sWG1gyUGHqaXipJIkmvB4MOgJypnSMWy7Vjhn3AOCM2xw51xTs+dGpLOQIn2Laomg9xpmDM2/9tgqQ==, + integrity: sha512-Z6kW5ebeEDMlUcJu3bf4USbUuPa2rcCKWJxHdK0jqiPoJfNJrUpg/yBfoUZ7CJ/mucTAKV9EjcrVZSUTHvesGA==, } peerDependencies: "@libsql/client": ^0.3.0 better-sqlite3: 8.x - 9.x - lucia: ^2.0.0 + lucia: 3.0.0-beta.11 peerDependenciesMeta: "@libsql/client": optional: true @@ -1339,18 +1320,7 @@ packages: dependencies: "@libsql/client": 0.4.0-pre.5 better-sqlite3: 9.2.2 - lucia: 2.7.4 - dev: false - - /@lucia-auth/oauth@3.5.0(lucia@2.7.4): - resolution: - { - integrity: sha512-JSwAMVwlDJtbvfcJV1nbkv41OD830pgICrx8zFT71SYd5I1MnEQ+GqMTXBGRyxzc5XlLatT8ZS1Jt0k81487xg==, - } - peerDependencies: - lucia: ^2.0.0 - dependencies: - lucia: 2.7.4 + lucia: 3.0.0-beta.11 dev: false /@neon-rs/load@0.0.4: @@ -3913,11 +3883,13 @@ packages: es5-ext: 0.10.62 dev: true - /lucia@2.7.4: + /lucia@3.0.0-beta.11: resolution: { - integrity: sha512-do6Aah5kX2DUl7N0CvELWV1/b+qZGF0AUmUrkthYeNfXfgx4RAkWi4BkAlgGDBB/0c1WApb18mUD1pA5qTaWmw==, + integrity: sha512-OXZfnM4KifDjkTTG3ruihormyOcXBz6wjAWibAAlw42zWBXDsleFR34gwKBxxXBa+TodzuKy7rcg8FGOMwwSGA==, } + dependencies: + oslo: 0.23.5 dev: false /magic-string@0.25.9: diff --git a/src/v2/lib/auth/adapter/adapter.ts b/src/v2/lib/auth/adapter/adapter.ts deleted file mode 100644 index dc8d3ef..0000000 --- a/src/v2/lib/auth/adapter/adapter.ts +++ /dev/null @@ -1,245 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -// TODO(dromzeh) -import type { - SessionSchema, - Adapter, - InitializeAdapter, - UserSchema, - KeySchema, -} from "lucia" -import type { Client, LibsqlError } from "@libsql/client" - -const createPreparedStatementHelper = ( - placeholder: (index: number) => string -) => { - const helper = ( - values: Record - ): readonly [ - fields: string[], - placeholders: string[], - arguments: any[], - ] => { - const keys = Object.keys(values) - return [ - keys.map((k) => escapeName(k)), - keys.map((_, i) => placeholder(i)), - keys.map((k) => values[k]), - ] as const - } - return helper -} - -export const escapeName = (val: string) => { - return `${ESCAPE_CHAR}${val}${ESCAPE_CHAR}` -} - -const ESCAPE_CHAR = "`" - -export const helper = createPreparedStatementHelper(() => "?") - -export const getSetArgs = (fields: string[], placeholders: string[]) => { - return fields - .map((field, i) => [field, placeholders[i]].join(" = ")) - .join(",") -} - -export const LuciaDBAdapter = ( - db: Client, - tables: { - user: string - session: string | null - key: string - } -): InitializeAdapter => { - const ESCAPED_USER_TABLE_NAME = escapeName(tables.user) - const ESCAPED_SESSION_TABLE_NAME = tables.session - ? escapeName(tables.session) - : null - const ESCAPED_KEY_TABLE_NAME = escapeName(tables.key) - - return (LuciaError) => { - return { - getUser: async (userId) => { - const result = await db.execute({ - sql: `SELECT * FROM ${ESCAPED_USER_TABLE_NAME} WHERE id = ?`, - args: [userId], - }) - const rows = result.rows as unknown[] as UserSchema[] - return rows.at(0) ?? null - }, - setUser: async (user, key) => { - const [userFields, userValues, userArgs] = helper(user) - const insertUserQuery = { - sql: `INSERT INTO ${ESCAPED_USER_TABLE_NAME} ( ${userFields} ) VALUES ( ${userValues} )`, - args: userArgs, - } - if (!key) { - await db.execute(insertUserQuery) - return - } - try { - const [keyFields, keyValues, keyArgs] = helper(key) - const insertKeyQuery = { - sql: `INSERT INTO ${ESCAPED_KEY_TABLE_NAME} ( ${keyFields} ) VALUES ( ${keyValues} )`, - args: keyArgs, - } - await db.batch([insertUserQuery, insertKeyQuery], "write") - } catch (e) { - const error = e as Partial - if ( - error.code === "SQLITE_CONSTRAINT_PRIMARYKEY" && - error.message?.includes(".id") - ) { - throw new LuciaError("AUTH_DUPLICATE_KEY_ID") - } - throw e - } - }, - deleteUser: async (userId) => { - await db.execute({ - sql: `DELETE FROM ${ESCAPED_USER_TABLE_NAME} WHERE id = ?`, - args: [userId], - }) - }, - updateUser: async (userId, partialUser) => { - const [fields, values, args] = helper(partialUser) - args.push(userId) - await db.execute({ - sql: `UPDATE ${ESCAPED_USER_TABLE_NAME} SET ${getSetArgs( - fields, - values - )} WHERE id = ?`, - args, - }) - }, - - getSession: async (sessionId) => { - if (!ESCAPED_SESSION_TABLE_NAME) { - throw new Error("Session table not defined") - } - const result = await db.execute({ - sql: `SELECT * FROM ${ESCAPED_SESSION_TABLE_NAME} WHERE id = ?`, - args: [sessionId], - }) - const rows = result.rows as unknown[] as SessionSchema[] - return rows.at(0) ?? null - }, - getSessionsByUserId: async (userId) => { - if (!ESCAPED_SESSION_TABLE_NAME) { - throw new Error("Session table not defined") - } - const result = await db.execute({ - sql: `SELECT * FROM ${ESCAPED_SESSION_TABLE_NAME} WHERE user_id = ?`, - args: [userId], - }) - return result.rows as unknown[] as SessionSchema[] - }, - setSession: async (session) => { - if (!ESCAPED_SESSION_TABLE_NAME) { - throw new Error("Session table not defined") - } - try { - const [fields, values, args] = helper(session) - await db.execute({ - sql: `INSERT INTO ${ESCAPED_SESSION_TABLE_NAME} ( ${fields} ) VALUES ( ${values} )`, - args, - }) - } catch (e) { - const error = e as Partial - if (error.code === "SQLITE_CONSTRAINT_FOREIGNKEY") { - throw new LuciaError("AUTH_INVALID_USER_ID") - } - throw e - } - }, - deleteSession: async (sessionId) => { - if (!ESCAPED_SESSION_TABLE_NAME) { - throw new Error("Session table not defined") - } - await db.execute({ - sql: `DELETE FROM ${ESCAPED_SESSION_TABLE_NAME} WHERE id = ?`, - args: [sessionId], - }) - }, - deleteSessionsByUserId: async (userId) => { - if (!ESCAPED_SESSION_TABLE_NAME) { - throw new Error("Session table not defined") - } - await db.execute({ - sql: `DELETE FROM ${ESCAPED_SESSION_TABLE_NAME} WHERE user_id = ?`, - args: [userId], - }) - }, - updateSession: async (sessionId, partialSession) => { - if (!ESCAPED_SESSION_TABLE_NAME) { - throw new Error("Session table not defined") - } - const [fields, values, args] = helper(partialSession) - const setArgs = getSetArgs(fields, values) - args.push(sessionId) - await db.execute({ - sql: `UPDATE ${ESCAPED_SESSION_TABLE_NAME} SET ${setArgs} WHERE id = ?`, - args, - }) - }, - - getKey: async (keyId) => { - const result = await db.execute({ - sql: `SELECT * FROM ${ESCAPED_KEY_TABLE_NAME} WHERE id = ?`, - args: [keyId], - }) - const rows = result.rows as unknown[] as KeySchema[] - return rows.at(0) ?? null - }, - getKeysByUserId: async (userId) => { - const result = await db.execute({ - sql: `SELECT * FROM ${ESCAPED_KEY_TABLE_NAME} WHERE user_id = ?`, - args: [userId], - }) - return result.rows as unknown[] as KeySchema[] - }, - setKey: async (key) => { - try { - const [fields, values, args] = helper(key) - await db.execute({ - sql: `INSERT INTO ${ESCAPED_KEY_TABLE_NAME} ( ${fields} ) VALUES ( ${values} )`, - args, - }) - } catch (e) { - const error = e as Partial - if (error.code === "SQLITE_CONSTRAINT_FOREIGNKEY") { - throw new LuciaError("AUTH_INVALID_USER_ID") - } - if ( - error.code === "SQLITE_CONSTRAINT_PRIMARYKEY" && - error.message?.includes(".id") - ) { - throw new LuciaError("AUTH_DUPLICATE_KEY_ID") - } - throw e - } - }, - deleteKey: async (keyId) => { - await db.execute({ - sql: `DELETE FROM ${ESCAPED_KEY_TABLE_NAME} WHERE id = ?`, - args: [keyId], - }) - }, - deleteKeysByUserId: async (userId) => { - await db.execute({ - sql: `DELETE FROM ${ESCAPED_KEY_TABLE_NAME} WHERE user_id = ?`, - args: [userId], - }) - }, - updateKey: async (keyId, partialKey) => { - const [fields, values, args] = helper(partialKey) - const setArgs = getSetArgs(fields, values) - args.push(keyId) - await db.execute({ - sql: `UPDATE ${ESCAPED_KEY_TABLE_NAME} SET ${setArgs} WHERE id = ?`, - args, - }) - }, - } - } -} diff --git a/src/v2/lib/auth/definitions/auth-definitions.ts b/src/v2/lib/auth/definitions/auth-definitions.ts new file mode 100644 index 0000000..632612a --- /dev/null +++ b/src/v2/lib/auth/definitions/auth-definitions.ts @@ -0,0 +1,27 @@ +import { auth } from "../lucia" + +declare module "lucia" { + interface Register { + Lucia: typeof auth + DatabaseUserAttributes: { + avatar_url: string | null + banner_url: string | null + username: string + username_colour: string | null + email: string + email_verified: boolean + pronouns: string | null + verified: boolean + bio: string | null + date_joined: string + role_flags: number + is_contributor: boolean + self_assignable_role_flags: number | null + } + DatabaseSessionAttributes: { + user_agent: string + country_code: string + ip_address: string + } + } +} diff --git a/src/v2/lib/auth/lucia.ts b/src/v2/lib/auth/lucia.ts index 8813afe..4ccb215 100644 --- a/src/v2/lib/auth/lucia.ts +++ b/src/v2/lib/auth/lucia.ts @@ -1,72 +1,53 @@ -import { lucia } from "lucia" -import { hono } from "lucia/middleware" +import { Lucia } from "lucia" import { getConnection } from "@/v2/db/turso" import { tableNames } from "@/v2/db/drizzle" -import { LuciaDBAdapter } from "./adapter/adapter" -import { discord } from "@lucia-auth/oauth/providers" +import { LibSQLAdapter } from "@lucia-auth/adapter-sqlite" -/** The `auth` function is used to create a `lucia` instance with authentication middleware and a `libsql` adapter. - * @param {Bindings} env - The environment variables used to configure the authentication middleware and adapter. - * @returns A `lucia` instance with authentication middleware and a `libsql` adapter. - */ export function auth(env: Bindings) { const { turso } = getConnection(env) - return lucia({ - adapter: LuciaDBAdapter(turso, { + // TODO(dromzeh): should probably utilize to the v3 drizzle adapter - it's okay for now though + return new Lucia( + new LibSQLAdapter(turso, { user: tableNames.authUser, - key: tableNames.authKey, session: tableNames.authSession, }), - middleware: hono(), - env: env.ENVIRONMENT === "DEV" ? "DEV" : "PROD", - experimental: { - debugMode: env.ENVIRONMENT === "DEV" ? true : false, - }, - csrfProtection: { - enabled: true, - allowedSubDomains: ["*"], - }, - getUserAttributes: (user) => { - return { - avatarUrl: user.avatar_url, - bannerUrl: user.banner_url, - username: user.username, - usernameColour: user.username_colour, - email: user.email, - emailVerified: user.email_verified, - pronouns: user.pronouns, - verified: user.verified, - bio: user.bio, - dateJoined: user.date_joined, - roleFlags: user.role_flags, - isContributor: user.is_contributor, - selfAssignableRoleFlags: user.self_assignable_role_flags, - } - }, - getSessionAttributes: (session) => { - return { - userAgent: session.user_agent, - countryCode: session.country_code, - ipAddress: session.ip_address, - } - }, - }) + { + getUserAttributes: (user) => { + return { + avatarUrl: user.avatar_url, + bannerUrl: user.banner_url, + username: user.username, + usernameColour: user.username_colour, + email: user.email, + emailVerified: user.email_verified, + pronouns: user.pronouns, + verified: user.verified, + bio: user.bio, + dateJoined: user.date_joined, + roleFlags: user.role_flags, + isContributor: user.is_contributor, + selfAssignableRoleFlags: user.self_assignable_role_flags, + } + }, + getSessionAttributes: (session) => { + return { + userAgent: session.user_agent, + countryCode: session.country_code, + ipAddress: session.ip_address, + } + }, + sessionCookie: { + name: "user_auth_session", + expires: false, + attributes: { + secure: env.ENVIRONMENT === "PROD", + sameSite: env.ENVIRONMENT === "PROD" ? "strict" : "lax", + path: "/", + }, + }, + } + ) } export type Auth = ReturnType - -/** - * The `discordAuth` function is used to create a `discord` object for use with the `auth` function. - * @param {Auth} auth - Auth instance used by Lucia. - * @param {Bindings} env - Hono environment bindings. - * @returns - Discord Object. - */ -export function discordAuth(auth: Auth, env: Bindings) { - return discord(auth, { - clientId: env.DISCORD_CLIENT_ID, - clientSecret: env.DISCORD_CLIENT_SECRET, - redirectUri: env.DISCORD_REDIRECT_URI, - scope: ["identify", "email"], - }) -} diff --git a/src/v2/lib/auth/oauth/discord.ts b/src/v2/lib/auth/oauth/discord.ts new file mode 100644 index 0000000..039e845 --- /dev/null +++ b/src/v2/lib/auth/oauth/discord.ts @@ -0,0 +1 @@ +// TODO: discord oauth config From 850c89f9dd31ee6a0d99c9871b17daf6909da344 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Fri, 8 Dec 2023 15:00:54 +0000 Subject: [PATCH 176/318] csrf middleware & set user var --- src/index.ts | 6 ++++ src/v2/lib/managers/auth/user-session.ts | 5 ++++ src/v2/lib/resend/email.ts | 11 ++++---- src/v2/lib/resend/wrapper.ts | 6 ++-- src/v2/middleware/auth-user.ts | 35 ++++++++++++++++++++++++ src/v2/middleware/csrf.ts | 21 ++++++++++++++ src/worker-configuration.d.ts | 11 ++------ 7 files changed, 80 insertions(+), 15 deletions(-) create mode 100644 src/v2/lib/managers/auth/user-session.ts create mode 100644 src/v2/middleware/auth-user.ts create mode 100644 src/v2/middleware/csrf.ts diff --git a/src/index.ts b/src/index.ts index 555b4e7..b6c9437 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,6 +4,9 @@ import { prettyJSON } from "hono/pretty-json" import BaseRoutes from "@/v2/routes/handler" import { OpenAPIConfig } from "./openapi/config" +import { csrfValidation } from "./v2/middleware/csrf" +import { setUserVariable } from "./v2/middleware/auth-user" + const app = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() app.route("/v2", BaseRoutes) @@ -15,6 +18,9 @@ app.get( }) ) +app.use("*", setUserVariable) +app.use("*", csrfValidation) + app.use("*", prettyJSON()) app.doc("/openapi", OpenAPIConfig) diff --git a/src/v2/lib/managers/auth/user-session.ts b/src/v2/lib/managers/auth/user-session.ts new file mode 100644 index 0000000..6b839dd --- /dev/null +++ b/src/v2/lib/managers/auth/user-session.ts @@ -0,0 +1,5 @@ +// import { Context } from "hono" +// import { Auth } from "../../auth/lucia" +// import { verifyRequestOrigin } from "oslo/request" + +export class AuthManager {} diff --git a/src/v2/lib/resend/email.ts b/src/v2/lib/resend/email.ts index 6b6a8b4..f04e703 100644 --- a/src/v2/lib/resend/email.ts +++ b/src/v2/lib/resend/email.ts @@ -1,8 +1,9 @@ import { Resend, type EmailData } from "@/v2/lib/resend/wrapper" +import type { Context } from "hono" const emailFrom = "Test " -const sendEmail = async (emailData: EmailData, c: APIContext) => { +const sendEmail = async (emailData: EmailData, c: Context) => { try { const resend = new Resend(c) await resend.sendEmail(emailData) @@ -28,7 +29,7 @@ export const sendPasswordResetEmail = async ( email: string, link: string, username: string, - c: APIContext + c: Context ) => { const emailData = createEmailData( email, @@ -41,7 +42,7 @@ export const sendPasswordResetEmail = async ( export const sendPasswordChangeEmail = async ( email: string, username: string, - c: APIContext + c: Context ) => { const emailData = createEmailData( email, @@ -54,7 +55,7 @@ export const sendPasswordChangeEmail = async ( export const sendEmailChangeEmail = async ( email: string, username: string, - c: APIContext + c: Context ) => { const emailData = createEmailData( email, @@ -68,7 +69,7 @@ export const sendEmailConfirmationEmail = async ( email: string, link: string, username: string, - c: APIContext + c: Context ) => { const emailData = createEmailData( email, diff --git a/src/v2/lib/resend/wrapper.ts b/src/v2/lib/resend/wrapper.ts index 39a0207..50fea64 100644 --- a/src/v2/lib/resend/wrapper.ts +++ b/src/v2/lib/resend/wrapper.ts @@ -1,3 +1,5 @@ +import type { Context } from "hono" + export type EmailData = { to: string from: string @@ -6,9 +8,9 @@ export type EmailData = { } export class Resend { - private context: APIContext + private context: Context - constructor(context: APIContext) { + constructor(context: Context) { this.context = context } diff --git a/src/v2/middleware/auth-user.ts b/src/v2/middleware/auth-user.ts new file mode 100644 index 0000000..786ba97 --- /dev/null +++ b/src/v2/middleware/auth-user.ts @@ -0,0 +1,35 @@ +import type { Context, Next } from "hono" +import { auth } from "@/v2/lib/auth/lucia" +import { getCookie } from "hono/cookie" + +export async function setUserVariable(c: Context, next: Next) { + const setAuth = auth(c.env) + + const sessionId = getCookie(c, setAuth.sessionCookieName) ?? null + + if (!sessionId) { + c.set("user", null) + return next() + } + + const { session, user } = await setAuth.validateSession(sessionId) + + if (session && session.fresh) { + c.header( + "Set-Cookie", + setAuth.createSessionCookie(session.id).serialize(), + { + append: true, + } + ) + } + + if (!session) { + c.header("Set-Cookie", setAuth.createBlankSessionCookie().serialize(), { + append: true, + }) + } + + c.set("user", user) + return next() +} diff --git a/src/v2/middleware/csrf.ts b/src/v2/middleware/csrf.ts new file mode 100644 index 0000000..35ecfe1 --- /dev/null +++ b/src/v2/middleware/csrf.ts @@ -0,0 +1,21 @@ +import type { Context, Next } from "hono" +import { verifyRequestOrigin } from "oslo/request" + +export async function csrfValidation(c: Context, next: Next) { + if (c.req.method === "GET") { + return next() + } + + const originHeader = c.req.header("Origin") + const hostHeader = c.req.header("Host") + + if ( + !originHeader || + !hostHeader || + !verifyRequestOrigin(originHeader, [hostHeader]) + ) { + return c.body(null, 403) + } + + return next() +} diff --git a/src/worker-configuration.d.ts b/src/worker-configuration.d.ts index 780a661..337cc22 100644 --- a/src/worker-configuration.d.ts +++ b/src/worker-configuration.d.ts @@ -1,3 +1,5 @@ +import { User } from "lucia" + declare global { /** * Environment variables that are required by the API. @@ -16,20 +18,13 @@ declare global { } type Variables = { - // drizzle: import("@/v2/db/turso").DrizzleInstance - // turso: import("@/v2/db/turso").TursoInstance - // lucia: import("@/v2/lib/auth/lucia").Auth + user: User | null } type Settings = { Bindings: Bindings Variables: Variables } - - /** - * Provides access to the request context within routes that are separated into individual functions. - */ - type APIContext = import("@hono/zod-openapi").Context } export default global From e7f5ad8c775142b7492165b5578ac7958fd70c0b Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Fri, 8 Dec 2023 15:05:36 +0000 Subject: [PATCH 177/318] [skip ci] replace returned jsonT with json --- src/v2/routes/asset/get/id/[id]/route.ts | 6 +++--- src/v2/routes/asset/search/all/route.ts | 2 +- src/v2/routes/game/get/all/route.ts | 2 +- src/v2/routes/game/get/id/[id]/route.ts | 4 ++-- src/v2/routes/game/get/name/[name]/route.ts | 4 ++-- src/v2/routes/user/get/id/[id]/route.ts | 2 +- src/v2/routes/user/get/username/[username]/route.ts | 2 +- src/v2/routes/user/search/username/[username]/route.ts | 2 +- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/v2/routes/asset/get/id/[id]/route.ts b/src/v2/routes/asset/get/id/[id]/route.ts index 848cf67..fc2881d 100644 --- a/src/v2/routes/asset/get/id/[id]/route.ts +++ b/src/v2/routes/asset/get/id/[id]/route.ts @@ -9,7 +9,7 @@ handler.openapi(getAssetByIdRoute, async (ctx) => { const assetId = ctx.req.valid("param").id if (isNaN(parseInt(assetId))) { - return ctx.jsonT( + return ctx.json( { success: false, error: "Invalid asset ID", @@ -23,7 +23,7 @@ handler.openapi(getAssetByIdRoute, async (ctx) => { const asset = await assetManager.getAssetById(parseInt(assetId)) if (!asset) { - return ctx.jsonT( + return ctx.json( { success: true, error: "Asset not found", @@ -34,7 +34,7 @@ handler.openapi(getAssetByIdRoute, async (ctx) => { const similarAssets = await assetManager.getSimilarAssets(asset.id) - return ctx.jsonT( + return ctx.json( { success: true, asset, diff --git a/src/v2/routes/asset/search/all/route.ts b/src/v2/routes/asset/search/all/route.ts index 910e0ec..bf945d4 100644 --- a/src/v2/routes/asset/search/all/route.ts +++ b/src/v2/routes/asset/search/all/route.ts @@ -10,7 +10,7 @@ handler.openapi(assetSearchAllFilterRoute, async (ctx) => { const assetManager = new AssetManager(drizzle) const assets = await assetManager.searchAssets(ctx.req.valid("query")) - return ctx.jsonT( + return ctx.json( { success: true, assets, diff --git a/src/v2/routes/game/get/all/route.ts b/src/v2/routes/game/get/all/route.ts index b6da4b2..23770f9 100644 --- a/src/v2/routes/game/get/all/route.ts +++ b/src/v2/routes/game/get/all/route.ts @@ -10,7 +10,7 @@ handler.openapi(getAllGamesRoute, async (ctx) => { const gameManager = new GameManager(drizzle) const games = await gameManager.listGames() - return ctx.jsonT({ + return ctx.json({ games, }) }) diff --git a/src/v2/routes/game/get/id/[id]/route.ts b/src/v2/routes/game/get/id/[id]/route.ts index 4a3cd0b..810d98b 100644 --- a/src/v2/routes/game/get/id/[id]/route.ts +++ b/src/v2/routes/game/get/id/[id]/route.ts @@ -13,7 +13,7 @@ handler.openapi(getGameByIdRoute, async (ctx) => { const game = await gameManager.getGameById(id) if (!game) { - return ctx.jsonT( + return ctx.json( { success: false, error: "Game not found", @@ -22,7 +22,7 @@ handler.openapi(getGameByIdRoute, async (ctx) => { ) } - return ctx.jsonT( + return ctx.json( { success: true, game, diff --git a/src/v2/routes/game/get/name/[name]/route.ts b/src/v2/routes/game/get/name/[name]/route.ts index 443e7ed..77093c1 100644 --- a/src/v2/routes/game/get/name/[name]/route.ts +++ b/src/v2/routes/game/get/name/[name]/route.ts @@ -13,7 +13,7 @@ handler.openapi(getGameByNameRoute, async (ctx) => { const game = await gameManager.getGameByName(name) if (!game) { - return ctx.jsonT( + return ctx.json( { success: true, error: "Game not found", @@ -22,7 +22,7 @@ handler.openapi(getGameByNameRoute, async (ctx) => { ) } - return ctx.jsonT( + return ctx.json( { success: true, game, diff --git a/src/v2/routes/user/get/id/[id]/route.ts b/src/v2/routes/user/get/id/[id]/route.ts index a4de614..d1fcf01 100644 --- a/src/v2/routes/user/get/id/[id]/route.ts +++ b/src/v2/routes/user/get/id/[id]/route.ts @@ -12,7 +12,7 @@ handler.openapi(getUserByIdRoute, async (ctx) => { const search = new UserSearchManager(drizzle) const user = await search.getUserById(userId) - return ctx.jsonT( + return ctx.json( { success: true, user, diff --git a/src/v2/routes/user/get/username/[username]/route.ts b/src/v2/routes/user/get/username/[username]/route.ts index 380b84d..0e4132d 100644 --- a/src/v2/routes/user/get/username/[username]/route.ts +++ b/src/v2/routes/user/get/username/[username]/route.ts @@ -12,7 +12,7 @@ handler.openapi(getUserByNameRoute, async (ctx) => { const search = new UserSearchManager(drizzle) const user = await search.getUserByUsername(userId) - return ctx.jsonT( + return ctx.json( { success: true, user, diff --git a/src/v2/routes/user/search/username/[username]/route.ts b/src/v2/routes/user/search/username/[username]/route.ts index b18f6bd..a6fd2bf 100644 --- a/src/v2/routes/user/search/username/[username]/route.ts +++ b/src/v2/routes/user/search/username/[username]/route.ts @@ -12,7 +12,7 @@ handler.openapi(searchUsersByUsernameRoute, async (ctx) => { const search = new UserSearchManager(drizzle) const users = await search.getUsersByUsername(userQuery) - return ctx.jsonT({ + return ctx.json({ success: true, users, }) From 8481b5e36b689a7578a5a3e9253cdfbc7cb038cf Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Fri, 8 Dec 2023 18:17:07 +0000 Subject: [PATCH 178/318] init new auth route handler --- src/v2/lib/helpers/responses/not-found.ts | 11 ----------- src/v2/lib/managers/auth/user-session.ts | 14 ++++++++++---- src/v2/middleware/auth-user.ts | 1 + src/v2/routes/auth/handler.ts | 8 ++++++++ src/v2/routes/auth/session/all/openapi.ts | 16 ++++++++++++++++ src/v2/routes/auth/session/all/route.ts | 18 ++++++++++++++++++ src/v2/routes/auth/session/handler.ts | 10 ++++++++++ src/v2/routes/auth/session/validate/openapi.ts | 16 ++++++++++++++++ src/v2/routes/auth/session/validate/route.ts | 18 ++++++++++++++++++ src/v2/routes/handler.ts | 2 ++ 10 files changed, 99 insertions(+), 15 deletions(-) delete mode 100644 src/v2/lib/helpers/responses/not-found.ts create mode 100644 src/v2/routes/auth/handler.ts create mode 100644 src/v2/routes/auth/session/all/openapi.ts create mode 100644 src/v2/routes/auth/session/all/route.ts create mode 100644 src/v2/routes/auth/session/handler.ts create mode 100644 src/v2/routes/auth/session/validate/openapi.ts create mode 100644 src/v2/routes/auth/session/validate/route.ts diff --git a/src/v2/lib/helpers/responses/not-found.ts b/src/v2/lib/helpers/responses/not-found.ts deleted file mode 100644 index 509ad5a..0000000 --- a/src/v2/lib/helpers/responses/not-found.ts +++ /dev/null @@ -1,11 +0,0 @@ -// helper function to create a 404 Not Found response -export function createNotFoundResponse(c, errorMessage, responseHeaders) { - return c.json( - { - success: false, - status: "error", - error: errorMessage, - }, - responseHeaders - ) -} diff --git a/src/v2/lib/managers/auth/user-session.ts b/src/v2/lib/managers/auth/user-session.ts index 6b839dd..429b328 100644 --- a/src/v2/lib/managers/auth/user-session.ts +++ b/src/v2/lib/managers/auth/user-session.ts @@ -1,5 +1,11 @@ -// import { Context } from "hono" -// import { Auth } from "../../auth/lucia" -// import { verifyRequestOrigin } from "oslo/request" +import { Context } from "hono" +import { auth } from "../../auth/lucia" -export class AuthManager {} +export class AuthSessionManager { + constructor(private ctx: Context) {} + private auth = auth(this.ctx.env as Bindings) + + async validateSession(sessionId: string) { + return await this.auth.validateSession(sessionId) + } +} diff --git a/src/v2/middleware/auth-user.ts b/src/v2/middleware/auth-user.ts index 786ba97..d89806c 100644 --- a/src/v2/middleware/auth-user.ts +++ b/src/v2/middleware/auth-user.ts @@ -31,5 +31,6 @@ export async function setUserVariable(c: Context, next: Next) { } c.set("user", user) + return next() } diff --git a/src/v2/routes/auth/handler.ts b/src/v2/routes/auth/handler.ts new file mode 100644 index 0000000..756cb06 --- /dev/null +++ b/src/v2/routes/auth/handler.ts @@ -0,0 +1,8 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import SessionHandler from "@/v2/routes/auth/session/handler" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.route("/session", SessionHandler) + +export default handler diff --git a/src/v2/routes/auth/session/all/openapi.ts b/src/v2/routes/auth/session/all/openapi.ts new file mode 100644 index 0000000..7b8f0b4 --- /dev/null +++ b/src/v2/routes/auth/session/all/openapi.ts @@ -0,0 +1,16 @@ +import { createRoute } from "@hono/zod-openapi" + +export const authAllCurrentSessions = createRoute({ + path: "/", + method: "get", + description: "Get all current sessions.", + tags: ["Auth"], + responses: { + 200: { + description: "All current sessions or null is returned.", + }, + 500: { + description: "Internal server error.", + }, + }, +}) diff --git a/src/v2/routes/auth/session/all/route.ts b/src/v2/routes/auth/session/all/route.ts new file mode 100644 index 0000000..8486f98 --- /dev/null +++ b/src/v2/routes/auth/session/all/route.ts @@ -0,0 +1,18 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { authAllCurrentSessions } from "./openapi" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.openapi(authAllCurrentSessions, async (ctx) => { + const currentUser = ctx.get("user") + + return ctx.json( + { + success: true, + currentUser: currentUser ? currentUser : null, + }, + 200 + ) +}) + +export default handler diff --git a/src/v2/routes/auth/session/handler.ts b/src/v2/routes/auth/session/handler.ts new file mode 100644 index 0000000..a46f2f5 --- /dev/null +++ b/src/v2/routes/auth/session/handler.ts @@ -0,0 +1,10 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import GetAllSessionsRoute from "@/v2/routes/auth/session/all/route" +import ValidateSessionRoute from "@/v2/routes/auth/session/validate/route" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.route("/all", GetAllSessionsRoute) +handler.route("/validate", ValidateSessionRoute) + +export default handler diff --git a/src/v2/routes/auth/session/validate/openapi.ts b/src/v2/routes/auth/session/validate/openapi.ts new file mode 100644 index 0000000..8b5584c --- /dev/null +++ b/src/v2/routes/auth/session/validate/openapi.ts @@ -0,0 +1,16 @@ +import { createRoute } from "@hono/zod-openapi" + +export const authValidationRoute = createRoute({ + path: "/", + method: "get", + description: "Validate current session.", + tags: ["Auth"], + responses: { + 200: { + description: "User information or null is returned.", + }, + 500: { + description: "Internal server error.", + }, + }, +}) diff --git a/src/v2/routes/auth/session/validate/route.ts b/src/v2/routes/auth/session/validate/route.ts new file mode 100644 index 0000000..408af4c --- /dev/null +++ b/src/v2/routes/auth/session/validate/route.ts @@ -0,0 +1,18 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { authValidationRoute } from "./openapi" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.openapi(authValidationRoute, async (ctx) => { + const currentUser = ctx.get("user") + + return ctx.json( + { + success: true, + currentUser: currentUser ? currentUser : null, + }, + 200 + ) +}) + +export default handler diff --git a/src/v2/routes/handler.ts b/src/v2/routes/handler.ts index 59db4b2..be447cd 100644 --- a/src/v2/routes/handler.ts +++ b/src/v2/routes/handler.ts @@ -2,11 +2,13 @@ import { OpenAPIHono } from "@hono/zod-openapi" import UserRoute from "@/v2/routes/user/handler" import GameRoute from "@/v2/routes/game/handler" import AssetRoute from "@/v2/routes/asset/handler" +import AuthRoute from "@/v2/routes/auth/handler" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.route("/game", GameRoute) handler.route("/asset", AssetRoute) handler.route("/user", UserRoute) +handler.route("/auth", AuthRoute) export default handler From 47b84c64bc400891c02507704e3801c810093856 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Fri, 8 Dec 2023 19:08:58 +0000 Subject: [PATCH 179/318] i fucking love typescript --- src/v2/db/drizzle.ts | 2 +- src/v2/db/schema/user/user.ts | 27 +++++---- .../lib/auth/definitions/auth-definitions.ts | 4 +- src/v2/lib/auth/lucia.ts | 4 +- src/v2/lib/managers/auth/user-auth.ts | 57 +++++++++++++++++++ src/v2/lib/managers/auth/user-session.ts | 6 +- src/v2/lib/oslo.ts | 4 +- src/v2/lib/resend/email.ts | 20 +++---- src/v2/middleware/auth-user.ts | 22 +++---- src/v2/middleware/csrf.ts | 18 ++++-- src/worker-configuration.d.ts | 3 + 11 files changed, 118 insertions(+), 49 deletions(-) create mode 100644 src/v2/lib/managers/auth/user-auth.ts diff --git a/src/v2/db/drizzle.ts b/src/v2/db/drizzle.ts index 4f6d52f..64fe401 100644 --- a/src/v2/db/drizzle.ts +++ b/src/v2/db/drizzle.ts @@ -1,7 +1,7 @@ // TODO(dromzeh): organize this, not a priority right now though export const tableNames = { asset: "asset", - authKey: "authKey", + authCredentials: "authCredentials", authSession: "authSession", authUser: "authUser", userFollowing: "userFollowing", diff --git a/src/v2/db/schema/user/user.ts b/src/v2/db/schema/user/user.ts index edfbc7a..1be2cc2 100644 --- a/src/v2/db/schema/user/user.ts +++ b/src/v2/db/schema/user/user.ts @@ -67,8 +67,8 @@ export const authUser = sqliteTable( export type User = typeof authUser.$inferSelect export type NewUser = typeof authUser.$inferInsert -export const authKey = sqliteTable( - tableNames.authKey, +export const authCredentials = sqliteTable( + tableNames.authCredentials, { id: text("id").unique().notNull(), userId: text("user_id") @@ -86,8 +86,8 @@ export const authKey = sqliteTable( } ) -export type Keys = typeof authKey.$inferSelect -export type NewKeys = typeof authKey.$inferInsert +export type Keys = typeof authCredentials.$inferSelect +export type NewKeys = typeof authCredentials.$inferInsert export const userSession = sqliteTable( tableNames.authSession, @@ -119,7 +119,7 @@ export const usersRelations = relations(authUser, ({ one, many }) => ({ following: many(userFollowing, { relationName: "following", }), - authKey: many(authKey), + authCredentials: many(authCredentials), userSession: many(userSession), asset: many(asset), atlas: many(atlas), @@ -136,13 +136,16 @@ export const usersRelations = relations(authUser, ({ one, many }) => ({ assetCategoryLikes: many(assetCategoryLikes), })) -export const keysRelations = relations(authKey, ({ one }) => ({ - user: one(authUser, { - fields: [authKey.userId], - references: [authUser.id], - relationName: "key_auth_user", - }), -})) +export const authCredentialsRelations = relations( + authCredentials, + ({ one }) => ({ + user: one(authUser, { + fields: [authCredentials.userId], + references: [authUser.id], + relationName: "key_auth_user", + }), + }) +) export const sessionRelations = relations(userSession, ({ one }) => ({ user: one(authUser, { diff --git a/src/v2/lib/auth/definitions/auth-definitions.ts b/src/v2/lib/auth/definitions/auth-definitions.ts index 632612a..b872f06 100644 --- a/src/v2/lib/auth/definitions/auth-definitions.ts +++ b/src/v2/lib/auth/definitions/auth-definitions.ts @@ -1,8 +1,8 @@ -import { auth } from "../lucia" +import { luciaAuth } from "../lucia" declare module "lucia" { interface Register { - Lucia: typeof auth + Lucia: typeof luciaAuth DatabaseUserAttributes: { avatar_url: string | null banner_url: string | null diff --git a/src/v2/lib/auth/lucia.ts b/src/v2/lib/auth/lucia.ts index 4ccb215..7920314 100644 --- a/src/v2/lib/auth/lucia.ts +++ b/src/v2/lib/auth/lucia.ts @@ -3,7 +3,7 @@ import { getConnection } from "@/v2/db/turso" import { tableNames } from "@/v2/db/drizzle" import { LibSQLAdapter } from "@lucia-auth/adapter-sqlite" -export function auth(env: Bindings) { +export function luciaAuth(env: Bindings) { const { turso } = getConnection(env) // TODO(dromzeh): should probably utilize to the v3 drizzle adapter - it's okay for now though @@ -50,4 +50,4 @@ export function auth(env: Bindings) { ) } -export type Auth = ReturnType +export type Auth = ReturnType diff --git a/src/v2/lib/managers/auth/user-auth.ts b/src/v2/lib/managers/auth/user-auth.ts new file mode 100644 index 0000000..b37e273 --- /dev/null +++ b/src/v2/lib/managers/auth/user-auth.ts @@ -0,0 +1,57 @@ +import { Context } from "hono" +import { luciaAuth } from "../../auth/lucia" +import { Scrypt } from "oslo/password" +import { getConnection } from "@/v2/db/turso" +import { authCredentials, authUser } from "@/v2/db/schema" +import { createInsertSchema } from "drizzle-zod" +import { z } from "zod" +import { generateID } from "../../oslo" + +const authUserInsertSchema = createInsertSchema(authUser).pick({ + username: true, + email: true, +}) + +export class UserAuthenticationManager { + constructor(private ctx: Context) {} + private lucia = luciaAuth(this.ctx.env as Bindings) + private drizzleInstance = getConnection(this.ctx.env).drizzle + + public async createAccount( + attributes: Required>, + password: string + ) { + const createUserTransaction = await this.drizzleInstance.transaction( + async (db) => { + try { + const [newUser] = await db + .insert(authUser) + .values({ + id: generateID(), + username: attributes.username, + email: attributes.email, + }) + .returning() + + await db.insert(authCredentials).values({ + id: generateID(20), + userId: newUser.id, + hashedPassword: await new Scrypt().hash(password), + }) + + return newUser + } catch (e) { + await db.rollback() + } + } + ) + + await this.lucia.createSession(createUserTransaction.id, { + user_agent: this.ctx.req.header("user-agent") || "", + ip_address: this.ctx.req.header("cf-connecting-ip") || "", + country_code: this.ctx.req.header("cf-ipcountry") || "", + }) + + return createUserTransaction.id + } +} diff --git a/src/v2/lib/managers/auth/user-session.ts b/src/v2/lib/managers/auth/user-session.ts index 429b328..e622347 100644 --- a/src/v2/lib/managers/auth/user-session.ts +++ b/src/v2/lib/managers/auth/user-session.ts @@ -1,11 +1,11 @@ import { Context } from "hono" -import { auth } from "../../auth/lucia" +import { luciaAuth } from "../../auth/lucia" export class AuthSessionManager { constructor(private ctx: Context) {} - private auth = auth(this.ctx.env as Bindings) + private lucia = luciaAuth(this.ctx.env as Bindings) async validateSession(sessionId: string) { - return await this.auth.validateSession(sessionId) + return await this.lucia.validateSession(sessionId) } } diff --git a/src/v2/lib/oslo.ts b/src/v2/lib/oslo.ts index c42c21f..6bf9a79 100644 --- a/src/v2/lib/oslo.ts +++ b/src/v2/lib/oslo.ts @@ -1,5 +1,5 @@ import { generateRandomString, alphabet } from "oslo/random" -export function generateID() { - return generateRandomString(15, alphabet("a-z", "0-9")).toLowerCase() +export function generateID(length: number = 15) { + return generateRandomString(length, alphabet("a-z", "0-9")).toLowerCase() } diff --git a/src/v2/lib/resend/email.ts b/src/v2/lib/resend/email.ts index f04e703..7c766e2 100644 --- a/src/v2/lib/resend/email.ts +++ b/src/v2/lib/resend/email.ts @@ -3,9 +3,9 @@ import type { Context } from "hono" const emailFrom = "Test " -const sendEmail = async (emailData: EmailData, c: Context) => { +const sendEmail = async (emailData: EmailData, ctx: Context) => { try { - const resend = new Resend(c) + const resend = new Resend(ctx) await resend.sendEmail(emailData) } catch (error) { throw new Error(`[RESEND]: ${error.message}`) @@ -29,52 +29,52 @@ export const sendPasswordResetEmail = async ( email: string, link: string, username: string, - c: Context + ctx: Context ) => { const emailData = createEmailData( email, "Password Reset Request", `Password reset for ${username}
Click here to reset your password` ) - return sendEmail(emailData, c) + return sendEmail(emailData, ctx) } export const sendPasswordChangeEmail = async ( email: string, username: string, - c: Context + ctx: Context ) => { const emailData = createEmailData( email, "Password Change Request", `Your password for ${username} has been changed.
Wasn't you? Contact us at support@wanderer.moe` ) - return sendEmail(emailData, c) + return sendEmail(emailData, ctx) } export const sendEmailChangeEmail = async ( email: string, username: string, - c: Context + ctx: Context ) => { const emailData = createEmailData( email, "Email Change Request", `Your email address for ${username} has been changed.
Wasn't you? Contact us at support@wanderer.moe` ) - return sendEmail(emailData, c) + return sendEmail(emailData, ctx) } export const sendEmailConfirmationEmail = async ( email: string, link: string, username: string, - c: Context + ctx: Context ) => { const emailData = createEmailData( email, "Email Confirmation", `Email confirmation for ${username}
Click here to confirm your email` ) - return sendEmail(emailData, c) + return sendEmail(emailData, ctx) } diff --git a/src/v2/middleware/auth-user.ts b/src/v2/middleware/auth-user.ts index d89806c..cbb1d41 100644 --- a/src/v2/middleware/auth-user.ts +++ b/src/v2/middleware/auth-user.ts @@ -1,23 +1,23 @@ -import type { Context, Next } from "hono" -import { auth } from "@/v2/lib/auth/lucia" +import type { Next } from "hono" +import { luciaAuth } from "@/v2/lib/auth/lucia" import { getCookie } from "hono/cookie" -export async function setUserVariable(c: Context, next: Next) { - const setAuth = auth(c.env) +export async function setUserVariable(ctx: APIContext, next: Next) { + const lucia = luciaAuth(ctx.env) - const sessionId = getCookie(c, setAuth.sessionCookieName) ?? null + const sessionId = getCookie(ctx, lucia.sessionCookieName) ?? null if (!sessionId) { - c.set("user", null) + ctx.set("user", null) return next() } - const { session, user } = await setAuth.validateSession(sessionId) + const { session, user } = await lucia.validateSession(sessionId) if (session && session.fresh) { - c.header( + ctx.header( "Set-Cookie", - setAuth.createSessionCookie(session.id).serialize(), + lucia.createSessionCookie(session.id).serialize(), { append: true, } @@ -25,12 +25,12 @@ export async function setUserVariable(c: Context, next: Next) { } if (!session) { - c.header("Set-Cookie", setAuth.createBlankSessionCookie().serialize(), { + ctx.header("Set-Cookie", lucia.createBlankSessionCookie().serialize(), { append: true, }) } - c.set("user", user) + ctx.set("user", user) return next() } diff --git a/src/v2/middleware/csrf.ts b/src/v2/middleware/csrf.ts index 35ecfe1..29f20a1 100644 --- a/src/v2/middleware/csrf.ts +++ b/src/v2/middleware/csrf.ts @@ -1,20 +1,26 @@ -import type { Context, Next } from "hono" +import type { Next } from "hono" import { verifyRequestOrigin } from "oslo/request" -export async function csrfValidation(c: Context, next: Next) { - if (c.req.method === "GET") { +export async function csrfValidation(ctx: APIContext, next: Next) { + if (ctx.req.method === "GET") { return next() } - const originHeader = c.req.header("Origin") - const hostHeader = c.req.header("Host") + const originHeader = ctx.req.header("Origin") + const hostHeader = ctx.req.header("Host") if ( !originHeader || !hostHeader || !verifyRequestOrigin(originHeader, [hostHeader]) ) { - return c.body(null, 403) + return ctx.json( + { + success: false, + error: "Forbidden", + }, + 403 + ) } return next() diff --git a/src/worker-configuration.d.ts b/src/worker-configuration.d.ts index 337cc22..3fbcaad 100644 --- a/src/worker-configuration.d.ts +++ b/src/worker-configuration.d.ts @@ -1,4 +1,5 @@ import { User } from "lucia" +import { Context } from "hono" declare global { /** @@ -25,6 +26,8 @@ declare global { Bindings: Bindings Variables: Variables } + + export type APIContext = Context } export default global From dfee95bb6c7264c25fe1f090b8986c319cd10849 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Fri, 8 Dec 2023 19:11:28 +0000 Subject: [PATCH 180/318] [skip ci] authKey => authCredentials --- ...t_spider.sql => 0000_jittery_hardball.sql} | 6 +- src/v2/db/migrations/meta/0000_snapshot.json | 3930 +++++++++-------- src/v2/db/migrations/meta/_journal.json | 24 +- 3 files changed, 2122 insertions(+), 1838 deletions(-) rename src/v2/db/migrations/{0000_smart_scarlet_spider.sql => 0000_jittery_hardball.sql} (98%) diff --git a/src/v2/db/migrations/0000_smart_scarlet_spider.sql b/src/v2/db/migrations/0000_jittery_hardball.sql similarity index 98% rename from src/v2/db/migrations/0000_smart_scarlet_spider.sql rename to src/v2/db/migrations/0000_jittery_hardball.sql index d30ec80..105a768 100644 --- a/src/v2/db/migrations/0000_smart_scarlet_spider.sql +++ b/src/v2/db/migrations/0000_jittery_hardball.sql @@ -123,7 +123,7 @@ CREATE TABLE `savedOcGenerators` ( FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade ); --> statement-breakpoint -CREATE TABLE `authKey` ( +CREATE TABLE `authCredentials` ( `id` text NOT NULL, `user_id` text NOT NULL, `hashed_password` text, @@ -267,8 +267,8 @@ CREATE INDEX `assetTagLikes_likedby_idx` ON `assetTagLikes` (`liked_by_id`);--> CREATE UNIQUE INDEX `savedOcGenerators_id_unique` ON `savedOcGenerators` (`id`);--> statement-breakpoint CREATE INDEX `saved_oc_generators_id_idx` ON `savedOcGenerators` (`id`);--> statement-breakpoint CREATE INDEX `saved_oc_generators_user_id_idx` ON `savedOcGenerators` (`user_id`);--> statement-breakpoint -CREATE UNIQUE INDEX `authKey_id_unique` ON `authKey` (`id`);--> statement-breakpoint -CREATE INDEX `key_user_id_idx` ON `authKey` (`user_id`);--> statement-breakpoint +CREATE UNIQUE INDEX `authCredentials_id_unique` ON `authCredentials` (`id`);--> statement-breakpoint +CREATE INDEX `key_user_id_idx` ON `authCredentials` (`user_id`);--> statement-breakpoint CREATE UNIQUE INDEX `authUser_id_unique` ON `authUser` (`id`);--> statement-breakpoint CREATE UNIQUE INDEX `authUser_username_unique` ON `authUser` (`username`);--> statement-breakpoint CREATE INDEX `user_id_idx` ON `authUser` (`id`);--> statement-breakpoint diff --git a/src/v2/db/migrations/meta/0000_snapshot.json b/src/v2/db/migrations/meta/0000_snapshot.json index 3cba8fc..d740882 100644 --- a/src/v2/db/migrations/meta/0000_snapshot.json +++ b/src/v2/db/migrations/meta/0000_snapshot.json @@ -1,1829 +1,2113 @@ { - "version": "5", - "dialect": "sqlite", - "id": "eac08da1-c397-4208-af88-cc268fafa3df", - "prevId": "00000000-0000-0000-0000-000000000000", - "tables": { - "asset": { - "name": "asset", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "extension": { - "name": "extension", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "game": { - "name": "game", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_category": { - "name": "asset_category", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by_id": { - "name": "uploaded_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by_name": { - "name": "uploaded_by_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "url": { - "name": "url", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "status": { - "name": "status", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "'pending'" - }, - "uploaded_date": { - "name": "uploaded_date", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_is_optimized": { - "name": "asset_is_optimized", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "asset_is_suggestive": { - "name": "asset_is_suggestive", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "view_count": { - "name": "view_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "download_count": { - "name": "download_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "file_size": { - "name": "file_size", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "width": { - "name": "width", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "height": { - "name": "height", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "assets_id_idx": { - "name": "assets_id_idx", - "columns": ["id"], - "isUnique": false - }, - "assets_name_idx": { - "name": "assets_name_idx", - "columns": ["name"], - "isUnique": false - }, - "assets_game_name_idx": { - "name": "assets_game_name_idx", - "columns": ["game"], - "isUnique": false - }, - "assets_asset_category_name_idx": { - "name": "assets_asset_category_name_idx", - "columns": ["asset_category"], - "isUnique": false - }, - "assets_uploaded_by_id_idx": { - "name": "assets_uploaded_by_id_idx", - "columns": ["uploaded_by_id"], - "isUnique": false - } - }, - "foreignKeys": { - "asset_game_game_id_fk": { - "name": "asset_game_game_id_fk", - "tableFrom": "asset", - "tableTo": "game", - "columnsFrom": ["game"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "asset_asset_category_assetCategory_id_fk": { - "name": "asset_asset_category_assetCategory_id_fk", - "tableFrom": "asset", - "tableTo": "assetCategory", - "columnsFrom": ["asset_category"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "asset_uploaded_by_id_authUser_id_fk": { - "name": "asset_uploaded_by_id_authUser_id_fk", - "tableFrom": "asset", - "tableTo": "authUser", - "columnsFrom": ["uploaded_by_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "asset_uploaded_by_name_authUser_username_fk": { - "name": "asset_uploaded_by_name_authUser_username_fk", - "tableFrom": "asset", - "tableTo": "authUser", - "columnsFrom": ["uploaded_by_name"], - "columnsTo": ["username"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "atlas": { - "name": "atlas", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "url": { - "name": "url", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by": { - "name": "uploaded_by", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by_name": { - "name": "uploaded_by_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_date": { - "name": "uploaded_date", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "file_size": { - "name": "file_size", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "atlas_id_unique": { - "name": "atlas_id_unique", - "columns": ["id"], - "isUnique": true - }, - "atlas_id_idx": { - "name": "atlas_id_idx", - "columns": ["id"], - "isUnique": false - }, - "atlas_uploaded_by_idx": { - "name": "atlas_uploaded_by_idx", - "columns": ["uploaded_by"], - "isUnique": false - }, - "atlas_uploaded_by_name_idx": { - "name": "atlas_uploaded_by_name_idx", - "columns": ["uploaded_by_name"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "atlasToAsset": { - "name": "atlasToAsset", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "atlas_id": { - "name": "atlas_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "atlas_to_assets_id_idx": { - "name": "atlas_to_assets_id_idx", - "columns": ["id"], - "isUnique": false - }, - "atlas_to_assets_atlas_id_idx": { - "name": "atlas_to_assets_atlas_id_idx", - "columns": ["atlas_id"], - "isUnique": false - }, - "atlas_to_assets_asset_id_idx": { - "name": "atlas_to_assets_asset_id_idx", - "columns": ["asset_id"], - "isUnique": false - } - }, - "foreignKeys": { - "atlasToAsset_atlas_id_atlas_id_fk": { - "name": "atlasToAsset_atlas_id_atlas_id_fk", - "tableFrom": "atlasToAsset", - "tableTo": "atlas", - "columnsFrom": ["atlas_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "atlasToAsset_asset_id_asset_id_fk": { - "name": "atlasToAsset_asset_id_asset_id_fk", - "tableFrom": "atlasToAsset", - "tableTo": "asset", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetLikes": { - "name": "assetLikes", - "columns": { - "asset_id": { - "name": "asset_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetlikes_asset_idx": { - "name": "assetlikes_asset_idx", - "columns": ["asset_id"], - "isUnique": false - }, - "assetlikes_likedBy_idx": { - "name": "assetlikes_likedBy_idx", - "columns": ["liked_by_id"], - "isUnique": false - } - }, - "foreignKeys": { - "assetLikes_asset_id_asset_id_fk": { - "name": "assetLikes_asset_id_asset_id_fk", - "tableFrom": "assetLikes", - "tableTo": "asset", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - }, - "assetLikes_liked_by_id_authUser_id_fk": { - "name": "assetLikes_liked_by_id_authUser_id_fk", - "tableFrom": "assetLikes", - "tableTo": "authUser", - "columnsFrom": ["liked_by_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetCategory": { - "name": "assetCategory", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetCategory_id_unique": { - "name": "assetCategory_id_unique", - "columns": ["id"], - "isUnique": true - }, - "assetCategory_name_unique": { - "name": "assetCategory_name_unique", - "columns": ["name"], - "isUnique": true - }, - "asset_category_id_idx": { - "name": "asset_category_id_idx", - "columns": ["id"], - "isUnique": false - }, - "asset_category_name_idx": { - "name": "asset_category_name_idx", - "columns": ["name"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "gameAssetCategory": { - "name": "gameAssetCategory", - "columns": { - "game_id": { - "name": "game_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_category_id": { - "name": "asset_category_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "game_asset_category_game_id_idx": { - "name": "game_asset_category_game_id_idx", - "columns": ["game_id"], - "isUnique": false - }, - "game_asset_category_asset_category_id_idx": { - "name": "game_asset_category_asset_category_id_idx", - "columns": ["asset_category_id"], - "isUnique": false - } - }, - "foreignKeys": { - "gameAssetCategory_game_id_game_id_fk": { - "name": "gameAssetCategory_game_id_game_id_fk", - "tableFrom": "gameAssetCategory", - "tableTo": "game", - "columnsFrom": ["game_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "gameAssetCategory_asset_category_id_assetCategory_id_fk": { - "name": "gameAssetCategory_asset_category_id_assetCategory_id_fk", - "tableFrom": "gameAssetCategory", - "tableTo": "assetCategory", - "columnsFrom": ["asset_category_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetCategoryLikes": { - "name": "assetCategoryLikes", - "columns": { - "asset_id": { - "name": "asset_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetCategoryLikes_asset_idx": { - "name": "assetCategoryLikes_asset_idx", - "columns": ["asset_id"], - "isUnique": false - }, - "assetCategoryLikes_likedby_idx": { - "name": "assetCategoryLikes_likedby_idx", - "columns": ["liked_by_id"], - "isUnique": false - } - }, - "foreignKeys": { - "assetCategoryLikes_asset_id_assetCategory_id_fk": { - "name": "assetCategoryLikes_asset_id_assetCategory_id_fk", - "tableFrom": "assetCategoryLikes", - "tableTo": "assetCategory", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - }, - "assetCategoryLikes_liked_by_id_authUser_id_fk": { - "name": "assetCategoryLikes_liked_by_id_authUser_id_fk", - "tableFrom": "assetCategoryLikes", - "tableTo": "authUser", - "columnsFrom": ["liked_by_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "version": "5", + "dialect": "sqlite", + "id": "62d78f01-fa41-4210-9f30-93df02adfa75", + "prevId": "00000000-0000-0000-0000-000000000000", + "tables": { + "asset": { + "name": "asset", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "extension": { + "name": "extension", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false }, "game": { - "name": "game", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - }, - "possible_suggestive_content": { - "name": "possible_suggestive_content", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "game_id_unique": { - "name": "game_id_unique", - "columns": ["id"], - "isUnique": true - }, - "game_name_unique": { - "name": "game_name_unique", - "columns": ["name"], - "isUnique": true - }, - "game_id_idx": { - "name": "game_id_idx", - "columns": ["id"], - "isUnique": false - }, - "game_name_idx": { - "name": "game_name_idx", - "columns": ["name"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "gameLikes": { - "name": "gameLikes", - "columns": { - "asset_id": { - "name": "asset_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "gamelikes_game_idx": { - "name": "gamelikes_game_idx", - "columns": ["asset_id"], - "isUnique": false - }, - "gamelikes_likedby_idx": { - "name": "gamelikes_likedby_idx", - "columns": ["liked_by_id"], - "isUnique": false - } - }, - "foreignKeys": { - "gameLikes_asset_id_game_id_fk": { - "name": "gameLikes_asset_id_game_id_fk", - "tableFrom": "gameLikes", - "tableTo": "game", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - }, - "gameLikes_liked_by_id_authUser_id_fk": { - "name": "gameLikes_liked_by_id_authUser_id_fk", - "tableFrom": "gameLikes", - "tableTo": "authUser", - "columnsFrom": ["liked_by_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetTag": { - "name": "assetTag", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetTag_id_unique": { - "name": "assetTag_id_unique", - "columns": ["id"], - "isUnique": true - }, - "assetTag_name_unique": { - "name": "assetTag_name_unique", - "columns": ["name"], - "isUnique": true - }, - "asset_tag_id_idx": { - "name": "asset_tag_id_idx", - "columns": ["id"], - "isUnique": false - }, - "asset_tag_name_idx": { - "name": "asset_tag_name_idx", - "columns": ["name"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetTagAsset": { - "name": "assetTagAsset", - "columns": { - "asset_tag_id": { - "name": "asset_tag_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "asset_tags_assets_asset_tag_id_idx": { - "name": "asset_tags_assets_asset_tag_id_idx", - "columns": ["asset_tag_id"], - "isUnique": false - }, - "asset_tags_assets_asset_id_idx": { - "name": "asset_tags_assets_asset_id_idx", - "columns": ["asset_id"], - "isUnique": false - } - }, - "foreignKeys": { - "assetTagAsset_asset_tag_id_assetTag_id_fk": { - "name": "assetTagAsset_asset_tag_id_assetTag_id_fk", - "tableFrom": "assetTagAsset", - "tableTo": "assetTag", - "columnsFrom": ["asset_tag_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "assetTagAsset_asset_id_asset_id_fk": { - "name": "assetTagAsset_asset_id_asset_id_fk", - "tableFrom": "assetTagAsset", - "tableTo": "asset", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetTagLikes": { - "name": "assetTagLikes", - "columns": { - "asset_id": { - "name": "asset_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetTagLikes_asset_idx": { - "name": "assetTagLikes_asset_idx", - "columns": ["asset_id"], - "isUnique": false - }, - "assetTagLikes_likedby_idx": { - "name": "assetTagLikes_likedby_idx", - "columns": ["liked_by_id"], - "isUnique": false - } - }, - "foreignKeys": { - "assetTagLikes_asset_id_assetTag_id_fk": { - "name": "assetTagLikes_asset_id_assetTag_id_fk", - "tableFrom": "assetTagLikes", - "tableTo": "assetTag", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - }, - "assetTagLikes_liked_by_id_authUser_id_fk": { - "name": "assetTagLikes_liked_by_id_authUser_id_fk", - "tableFrom": "assetTagLikes", - "tableTo": "authUser", - "columnsFrom": ["liked_by_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "savedOcGenerators": { - "name": "savedOcGenerators", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "game": { - "name": "game", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "date_created": { - "name": "date_created", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "content": { - "name": "content", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "saved_color_palette": { - "name": "saved_color_palette", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "sakura_url": { - "name": "sakura_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "savedOcGenerators_id_unique": { - "name": "savedOcGenerators_id_unique", - "columns": ["id"], - "isUnique": true - }, - "saved_oc_generators_id_idx": { - "name": "saved_oc_generators_id_idx", - "columns": ["id"], - "isUnique": false - }, - "saved_oc_generators_user_id_idx": { - "name": "saved_oc_generators_user_id_idx", - "columns": ["user_id"], - "isUnique": false - } - }, - "foreignKeys": { - "savedOcGenerators_user_id_authUser_id_fk": { - "name": "savedOcGenerators_user_id_authUser_id_fk", - "tableFrom": "savedOcGenerators", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "authKey": { - "name": "authKey", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "hashed_password": { - "name": "hashed_password", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "authKey_id_unique": { - "name": "authKey_id_unique", - "columns": ["id"], - "isUnique": true - }, - "key_user_id_idx": { - "name": "key_user_id_idx", - "columns": ["user_id"], - "isUnique": false - } - }, - "foreignKeys": { - "authKey_user_id_authUser_id_fk": { - "name": "authKey_user_id_authUser_id_fk", - "tableFrom": "authKey", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "authUser": { - "name": "authUser", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "avatar_url": { - "name": "avatar_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "banner_url": { - "name": "banner_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "display_name": { - "name": "display_name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "username": { - "name": "username", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "username_colour": { - "name": "username_colour", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "email": { - "name": "email", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "email_verified": { - "name": "email_verified", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "pronouns": { - "name": "pronouns", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "verified": { - "name": "verified", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "bio": { - "name": "bio", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "'No bio set'" - }, - "date_joined": { - "name": "date_joined", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "role_flags": { - "name": "role_flags", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 1 - }, - "is_contributor": { - "name": "is_contributor", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "self_assignable_role_flags": { - "name": "self_assignable_role_flags", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "authUser_id_unique": { - "name": "authUser_id_unique", - "columns": ["id"], - "isUnique": true - }, - "authUser_username_unique": { - "name": "authUser_username_unique", - "columns": ["username"], - "isUnique": true - }, - "user_id_idx": { - "name": "user_id_idx", - "columns": ["id"], - "isUnique": false - }, - "user_username_idx": { - "name": "user_username_idx", - "columns": ["username"], - "isUnique": false - }, - "user_email_idx": { - "name": "user_email_idx", - "columns": ["email"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "authSession": { - "name": "authSession", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "active_expires": { - "name": "active_expires", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "idle_expires": { - "name": "idle_expires", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "authSession_id_unique": { - "name": "authSession_id_unique", - "columns": ["id"], - "isUnique": true - }, - "session_user_id_idx": { - "name": "session_user_id_idx", - "columns": ["user_id"], - "isUnique": false - } - }, - "foreignKeys": { - "authSession_user_id_authUser_id_fk": { - "name": "authSession_user_id_authUser_id_fk", - "tableFrom": "authSession", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "emailVerificationToken": { - "name": "emailVerificationToken", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "emailVerificationToken_id_unique": { - "name": "emailVerificationToken_id_unique", - "columns": ["id"], - "isUnique": true - }, - "email_verification_token_user_id_idx": { - "name": "email_verification_token_user_id_idx", - "columns": ["user_id"], - "isUnique": false - }, - "email_verification_token_token_idx": { - "name": "email_verification_token_token_idx", - "columns": ["token"], - "isUnique": false - } - }, - "foreignKeys": { - "emailVerificationToken_user_id_authUser_id_fk": { - "name": "emailVerificationToken_user_id_authUser_id_fk", - "tableFrom": "emailVerificationToken", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "passwordResetToken": { - "name": "passwordResetToken", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "passwordResetToken_id_unique": { - "name": "passwordResetToken_id_unique", - "columns": ["id"], - "isUnique": true - }, - "password_reset_token_user_id_idx": { - "name": "password_reset_token_user_id_idx", - "columns": ["user_id"], - "isUnique": false - }, - "password_reset_token_token_idx": { - "name": "password_reset_token_token_idx", - "columns": ["token"], - "isUnique": false - } - }, - "foreignKeys": { - "passwordResetToken_user_id_authUser_id_fk": { - "name": "passwordResetToken_user_id_authUser_id_fk", - "tableFrom": "passwordResetToken", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userCollection": { - "name": "userCollection", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "date_created": { - "name": "date_created", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - } - }, - "indexes": { - "userCollection_id_unique": { - "name": "userCollection_id_unique", - "columns": ["id"], - "isUnique": true - }, - "collection_id_idx": { - "name": "collection_id_idx", - "columns": ["id"], - "isUnique": false - }, - "user_collection_id_idx": { - "name": "user_collection_id_idx", - "columns": ["user_id"], - "isUnique": false - } - }, - "foreignKeys": { - "userCollection_user_id_authUser_id_fk": { - "name": "userCollection_user_id_authUser_id_fk", - "tableFrom": "userCollection", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userCollectionAsset": { - "name": "userCollectionAsset", - "columns": { - "collection_id": { - "name": "collection_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "date_added": { - "name": "date_added", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "collection_assets_collection_id_idx": { - "name": "collection_assets_collection_id_idx", - "columns": ["collection_id"], - "isUnique": false - }, - "collection_assets_asset_id_idx": { - "name": "collection_assets_asset_id_idx", - "columns": ["asset_id"], - "isUnique": false - } - }, - "foreignKeys": { - "userCollectionAsset_collection_id_userCollection_id_fk": { - "name": "userCollectionAsset_collection_id_userCollection_id_fk", - "tableFrom": "userCollectionAsset", - "tableTo": "userCollection", - "columnsFrom": ["collection_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "userCollectionAsset_asset_id_asset_id_fk": { - "name": "userCollectionAsset_asset_id_asset_id_fk", - "tableFrom": "userCollectionAsset", - "tableTo": "asset", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "socialsConnection": { - "name": "socialsConnection", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "discord_id": { - "name": "discord_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "socialsConnection_id_unique": { - "name": "socialsConnection_id_unique", - "columns": ["id"], - "isUnique": true - }, - "socialsConnection_user_id_unique": { - "name": "socialsConnection_user_id_unique", - "columns": ["user_id"], - "isUnique": true - }, - "socials_connection_user_id_idx": { - "name": "socials_connection_user_id_idx", - "columns": ["user_id"], - "isUnique": false - }, - "socials_connection_discord_id_idx": { - "name": "socials_connection_discord_id_idx", - "columns": ["discord_id"], - "isUnique": false - } - }, - "foreignKeys": { - "socialsConnection_user_id_authUser_id_fk": { - "name": "socialsConnection_user_id_authUser_id_fk", - "tableFrom": "socialsConnection", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userFavorite": { - "name": "userFavorite", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - } - }, - "indexes": { - "userFavorite_id_unique": { - "name": "userFavorite_id_unique", - "columns": ["id"], - "isUnique": true - }, - "favorited_assets_id_idx": { - "name": "favorited_assets_id_idx", - "columns": ["id"], - "isUnique": false - }, - "favorited_assets_user_id_idx": { - "name": "favorited_assets_user_id_idx", - "columns": ["user_id"], - "isUnique": false - } - }, - "foreignKeys": { - "userFavorite_user_id_authUser_id_fk": { - "name": "userFavorite_user_id_authUser_id_fk", - "tableFrom": "userFavorite", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userFavoriteAsset": { - "name": "userFavoriteAsset", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "favorited_assets_id": { - "name": "favorited_assets_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "userFavoriteAsset_id_unique": { - "name": "userFavoriteAsset_id_unique", - "columns": ["id"], - "isUnique": true - }, - "favorited_assets_assets_id_idx": { - "name": "favorited_assets_assets_id_idx", - "columns": ["id"], - "isUnique": false - }, - "favorited_assets_assets_user_id_idx": { - "name": "favorited_assets_assets_user_id_idx", - "columns": ["favorited_assets_id"], - "isUnique": false - }, - "favorited_assets_assets_asset_id_idx": { - "name": "favorited_assets_assets_asset_id_idx", - "columns": ["asset_id"], - "isUnique": false - } - }, - "foreignKeys": { - "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk": { - "name": "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk", - "tableFrom": "userFavoriteAsset", - "tableTo": "userFavorite", - "columnsFrom": ["favorited_assets_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "userFavoriteAsset_asset_id_asset_id_fk": { - "name": "userFavoriteAsset_asset_id_asset_id_fk", - "tableFrom": "userFavoriteAsset", - "tableTo": "asset", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userFollowing": { - "name": "userFollowing", - "columns": { - "followerId": { - "name": "followerId", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "followingId": { - "name": "followingId", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "userfollowing_follower_idx": { - "name": "userfollowing_follower_idx", - "columns": ["followerId"], - "isUnique": false - }, - "userfollowing_following_idx": { - "name": "userfollowing_following_idx", - "columns": ["followingId"], - "isUnique": false - } - }, - "foreignKeys": { - "userFollowing_followerId_authUser_id_fk": { - "name": "userFollowing_followerId_authUser_id_fk", - "tableFrom": "userFollowing", - "tableTo": "authUser", - "columnsFrom": ["followerId"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - }, - "userFollowing_followingId_authUser_id_fk": { - "name": "userFollowing_followingId_authUser_id_fk", - "tableFrom": "userFollowing", - "tableTo": "authUser", - "columnsFrom": ["followingId"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userCollectionLikes": { - "name": "userCollectionLikes", - "columns": { - "collection_id": { - "name": "collection_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "userCollectionNetworking_collection_idx": { - "name": "userCollectionNetworking_collection_idx", - "columns": ["collection_id"], - "isUnique": false - }, - "userCollectionNetworking_likedBy_idx": { - "name": "userCollectionNetworking_likedBy_idx", - "columns": ["liked_by_id"], - "isUnique": false - } - }, - "foreignKeys": { - "userCollectionLikes_collection_id_userCollection_id_fk": { - "name": "userCollectionLikes_collection_id_userCollection_id_fk", - "tableFrom": "userCollectionLikes", - "tableTo": "userCollection", - "columnsFrom": ["collection_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - }, - "userCollectionLikes_liked_by_id_authUser_id_fk": { - "name": "userCollectionLikes_liked_by_id_authUser_id_fk", - "tableFrom": "userCollectionLikes", - "tableTo": "authUser", - "columnsFrom": ["liked_by_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "name": "game", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_category": { + "name": "asset_category", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by_id": { + "name": "uploaded_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by_name": { + "name": "uploaded_by_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'pending'" + }, + "uploaded_date": { + "name": "uploaded_date", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_is_optimized": { + "name": "asset_is_optimized", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "asset_is_suggestive": { + "name": "asset_is_suggestive", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "view_count": { + "name": "view_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "download_count": { + "name": "download_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "file_size": { + "name": "file_size", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "width": { + "name": "width", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "height": { + "name": "height", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "assets_id_idx": { + "name": "assets_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "assets_name_idx": { + "name": "assets_name_idx", + "columns": [ + "name" + ], + "isUnique": false + }, + "assets_game_name_idx": { + "name": "assets_game_name_idx", + "columns": [ + "game" + ], + "isUnique": false + }, + "assets_asset_category_name_idx": { + "name": "assets_asset_category_name_idx", + "columns": [ + "asset_category" + ], + "isUnique": false + }, + "assets_uploaded_by_id_idx": { + "name": "assets_uploaded_by_id_idx", + "columns": [ + "uploaded_by_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "asset_game_game_id_fk": { + "name": "asset_game_game_id_fk", + "tableFrom": "asset", + "tableTo": "game", + "columnsFrom": [ + "game" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "asset_asset_category_assetCategory_id_fk": { + "name": "asset_asset_category_assetCategory_id_fk", + "tableFrom": "asset", + "tableTo": "assetCategory", + "columnsFrom": [ + "asset_category" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "asset_uploaded_by_id_authUser_id_fk": { + "name": "asset_uploaded_by_id_authUser_id_fk", + "tableFrom": "asset", + "tableTo": "authUser", + "columnsFrom": [ + "uploaded_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "asset_uploaded_by_name_authUser_username_fk": { + "name": "asset_uploaded_by_name_authUser_username_fk", + "tableFrom": "asset", + "tableTo": "authUser", + "columnsFrom": [ + "uploaded_by_name" + ], + "columnsTo": [ + "username" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "atlas": { + "name": "atlas", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by": { + "name": "uploaded_by", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by_name": { + "name": "uploaded_by_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_date": { + "name": "uploaded_date", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "file_size": { + "name": "file_size", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "atlas_id_unique": { + "name": "atlas_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "atlas_id_idx": { + "name": "atlas_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "atlas_uploaded_by_idx": { + "name": "atlas_uploaded_by_idx", + "columns": [ + "uploaded_by" + ], + "isUnique": false + }, + "atlas_uploaded_by_name_idx": { + "name": "atlas_uploaded_by_name_idx", + "columns": [ + "uploaded_by_name" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "atlasToAsset": { + "name": "atlasToAsset", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "atlas_id": { + "name": "atlas_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "atlas_to_assets_id_idx": { + "name": "atlas_to_assets_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "atlas_to_assets_atlas_id_idx": { + "name": "atlas_to_assets_atlas_id_idx", + "columns": [ + "atlas_id" + ], + "isUnique": false + }, + "atlas_to_assets_asset_id_idx": { + "name": "atlas_to_assets_asset_id_idx", + "columns": [ + "asset_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "atlasToAsset_atlas_id_atlas_id_fk": { + "name": "atlasToAsset_atlas_id_atlas_id_fk", + "tableFrom": "atlasToAsset", + "tableTo": "atlas", + "columnsFrom": [ + "atlas_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "atlasToAsset_asset_id_asset_id_fk": { + "name": "atlasToAsset_asset_id_asset_id_fk", + "tableFrom": "atlasToAsset", + "tableTo": "asset", + "columnsFrom": [ + "asset_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetLikes": { + "name": "assetLikes", + "columns": { + "asset_id": { + "name": "asset_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetlikes_asset_idx": { + "name": "assetlikes_asset_idx", + "columns": [ + "asset_id" + ], + "isUnique": false + }, + "assetlikes_likedBy_idx": { + "name": "assetlikes_likedBy_idx", + "columns": [ + "liked_by_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "assetLikes_asset_id_asset_id_fk": { + "name": "assetLikes_asset_id_asset_id_fk", + "tableFrom": "assetLikes", + "tableTo": "asset", + "columnsFrom": [ + "asset_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "assetLikes_liked_by_id_authUser_id_fk": { + "name": "assetLikes_liked_by_id_authUser_id_fk", + "tableFrom": "assetLikes", + "tableTo": "authUser", + "columnsFrom": [ + "liked_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetCategory": { + "name": "assetCategory", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetCategory_id_unique": { + "name": "assetCategory_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "assetCategory_name_unique": { + "name": "assetCategory_name_unique", + "columns": [ + "name" + ], + "isUnique": true + }, + "asset_category_id_idx": { + "name": "asset_category_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "asset_category_name_idx": { + "name": "asset_category_name_idx", + "columns": [ + "name" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "gameAssetCategory": { + "name": "gameAssetCategory", + "columns": { + "game_id": { + "name": "game_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_category_id": { + "name": "asset_category_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "game_asset_category_game_id_idx": { + "name": "game_asset_category_game_id_idx", + "columns": [ + "game_id" + ], + "isUnique": false + }, + "game_asset_category_asset_category_id_idx": { + "name": "game_asset_category_asset_category_id_idx", + "columns": [ + "asset_category_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "gameAssetCategory_game_id_game_id_fk": { + "name": "gameAssetCategory_game_id_game_id_fk", + "tableFrom": "gameAssetCategory", + "tableTo": "game", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "gameAssetCategory_asset_category_id_assetCategory_id_fk": { + "name": "gameAssetCategory_asset_category_id_assetCategory_id_fk", + "tableFrom": "gameAssetCategory", + "tableTo": "assetCategory", + "columnsFrom": [ + "asset_category_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetCategoryLikes": { + "name": "assetCategoryLikes", + "columns": { + "asset_id": { + "name": "asset_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetCategoryLikes_asset_idx": { + "name": "assetCategoryLikes_asset_idx", + "columns": [ + "asset_id" + ], + "isUnique": false + }, + "assetCategoryLikes_likedby_idx": { + "name": "assetCategoryLikes_likedby_idx", + "columns": [ + "liked_by_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "assetCategoryLikes_asset_id_assetCategory_id_fk": { + "name": "assetCategoryLikes_asset_id_assetCategory_id_fk", + "tableFrom": "assetCategoryLikes", + "tableTo": "assetCategory", + "columnsFrom": [ + "asset_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "assetCategoryLikes_liked_by_id_authUser_id_fk": { + "name": "assetCategoryLikes_liked_by_id_authUser_id_fk", + "tableFrom": "assetCategoryLikes", + "tableTo": "authUser", + "columnsFrom": [ + "liked_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "game": { + "name": "game", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": 0 + }, + "possible_suggestive_content": { + "name": "possible_suggestive_content", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "game_id_unique": { + "name": "game_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "game_name_unique": { + "name": "game_name_unique", + "columns": [ + "name" + ], + "isUnique": true + }, + "game_id_idx": { + "name": "game_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "game_name_idx": { + "name": "game_name_idx", + "columns": [ + "name" + ], + "isUnique": false } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} }, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} + "gameLikes": { + "name": "gameLikes", + "columns": { + "asset_id": { + "name": "asset_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "gamelikes_game_idx": { + "name": "gamelikes_game_idx", + "columns": [ + "asset_id" + ], + "isUnique": false + }, + "gamelikes_likedby_idx": { + "name": "gamelikes_likedby_idx", + "columns": [ + "liked_by_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "gameLikes_asset_id_game_id_fk": { + "name": "gameLikes_asset_id_game_id_fk", + "tableFrom": "gameLikes", + "tableTo": "game", + "columnsFrom": [ + "asset_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "gameLikes_liked_by_id_authUser_id_fk": { + "name": "gameLikes_liked_by_id_authUser_id_fk", + "tableFrom": "gameLikes", + "tableTo": "authUser", + "columnsFrom": [ + "liked_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetTag": { + "name": "assetTag", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetTag_id_unique": { + "name": "assetTag_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "assetTag_name_unique": { + "name": "assetTag_name_unique", + "columns": [ + "name" + ], + "isUnique": true + }, + "asset_tag_id_idx": { + "name": "asset_tag_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "asset_tag_name_idx": { + "name": "asset_tag_name_idx", + "columns": [ + "name" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetTagAsset": { + "name": "assetTagAsset", + "columns": { + "asset_tag_id": { + "name": "asset_tag_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "asset_tags_assets_asset_tag_id_idx": { + "name": "asset_tags_assets_asset_tag_id_idx", + "columns": [ + "asset_tag_id" + ], + "isUnique": false + }, + "asset_tags_assets_asset_id_idx": { + "name": "asset_tags_assets_asset_id_idx", + "columns": [ + "asset_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "assetTagAsset_asset_tag_id_assetTag_id_fk": { + "name": "assetTagAsset_asset_tag_id_assetTag_id_fk", + "tableFrom": "assetTagAsset", + "tableTo": "assetTag", + "columnsFrom": [ + "asset_tag_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "assetTagAsset_asset_id_asset_id_fk": { + "name": "assetTagAsset_asset_id_asset_id_fk", + "tableFrom": "assetTagAsset", + "tableTo": "asset", + "columnsFrom": [ + "asset_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetTagLikes": { + "name": "assetTagLikes", + "columns": { + "asset_id": { + "name": "asset_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetTagLikes_asset_idx": { + "name": "assetTagLikes_asset_idx", + "columns": [ + "asset_id" + ], + "isUnique": false + }, + "assetTagLikes_likedby_idx": { + "name": "assetTagLikes_likedby_idx", + "columns": [ + "liked_by_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "assetTagLikes_asset_id_assetTag_id_fk": { + "name": "assetTagLikes_asset_id_assetTag_id_fk", + "tableFrom": "assetTagLikes", + "tableTo": "assetTag", + "columnsFrom": [ + "asset_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "assetTagLikes_liked_by_id_authUser_id_fk": { + "name": "assetTagLikes_liked_by_id_authUser_id_fk", + "tableFrom": "assetTagLikes", + "tableTo": "authUser", + "columnsFrom": [ + "liked_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "savedOcGenerators": { + "name": "savedOcGenerators", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "game": { + "name": "game", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "date_created": { + "name": "date_created", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "saved_color_palette": { + "name": "saved_color_palette", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sakura_url": { + "name": "sakura_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "savedOcGenerators_id_unique": { + "name": "savedOcGenerators_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "saved_oc_generators_id_idx": { + "name": "saved_oc_generators_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "saved_oc_generators_user_id_idx": { + "name": "saved_oc_generators_user_id_idx", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "savedOcGenerators_user_id_authUser_id_fk": { + "name": "savedOcGenerators_user_id_authUser_id_fk", + "tableFrom": "savedOcGenerators", + "tableTo": "authUser", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "authCredentials": { + "name": "authCredentials", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "hashed_password": { + "name": "hashed_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "authCredentials_id_unique": { + "name": "authCredentials_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "key_user_id_idx": { + "name": "key_user_id_idx", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "authCredentials_user_id_authUser_id_fk": { + "name": "authCredentials_user_id_authUser_id_fk", + "tableFrom": "authCredentials", + "tableTo": "authUser", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "authUser": { + "name": "authUser", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "avatar_url": { + "name": "avatar_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "banner_url": { + "name": "banner_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "display_name": { + "name": "display_name", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "username_colour": { + "name": "username_colour", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "email_verified": { + "name": "email_verified", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "pronouns": { + "name": "pronouns", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "verified": { + "name": "verified", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "bio": { + "name": "bio", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'No bio set'" + }, + "date_joined": { + "name": "date_joined", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "role_flags": { + "name": "role_flags", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "is_contributor": { + "name": "is_contributor", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "self_assignable_role_flags": { + "name": "self_assignable_role_flags", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "authUser_id_unique": { + "name": "authUser_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "authUser_username_unique": { + "name": "authUser_username_unique", + "columns": [ + "username" + ], + "isUnique": true + }, + "user_id_idx": { + "name": "user_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "user_username_idx": { + "name": "user_username_idx", + "columns": [ + "username" + ], + "isUnique": false + }, + "user_email_idx": { + "name": "user_email_idx", + "columns": [ + "email" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "authSession": { + "name": "authSession", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "active_expires": { + "name": "active_expires", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "idle_expires": { + "name": "idle_expires", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "authSession_id_unique": { + "name": "authSession_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "session_user_id_idx": { + "name": "session_user_id_idx", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "authSession_user_id_authUser_id_fk": { + "name": "authSession_user_id_authUser_id_fk", + "tableFrom": "authSession", + "tableTo": "authUser", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "emailVerificationToken": { + "name": "emailVerificationToken", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "emailVerificationToken_id_unique": { + "name": "emailVerificationToken_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "email_verification_token_user_id_idx": { + "name": "email_verification_token_user_id_idx", + "columns": [ + "user_id" + ], + "isUnique": false + }, + "email_verification_token_token_idx": { + "name": "email_verification_token_token_idx", + "columns": [ + "token" + ], + "isUnique": false + } + }, + "foreignKeys": { + "emailVerificationToken_user_id_authUser_id_fk": { + "name": "emailVerificationToken_user_id_authUser_id_fk", + "tableFrom": "emailVerificationToken", + "tableTo": "authUser", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "passwordResetToken": { + "name": "passwordResetToken", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "passwordResetToken_id_unique": { + "name": "passwordResetToken_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "password_reset_token_user_id_idx": { + "name": "password_reset_token_user_id_idx", + "columns": [ + "user_id" + ], + "isUnique": false + }, + "password_reset_token_token_idx": { + "name": "password_reset_token_token_idx", + "columns": [ + "token" + ], + "isUnique": false + } + }, + "foreignKeys": { + "passwordResetToken_user_id_authUser_id_fk": { + "name": "passwordResetToken_user_id_authUser_id_fk", + "tableFrom": "passwordResetToken", + "tableTo": "authUser", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userCollection": { + "name": "userCollection", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "date_created": { + "name": "date_created", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": { + "userCollection_id_unique": { + "name": "userCollection_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "collection_id_idx": { + "name": "collection_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "user_collection_id_idx": { + "name": "user_collection_id_idx", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "userCollection_user_id_authUser_id_fk": { + "name": "userCollection_user_id_authUser_id_fk", + "tableFrom": "userCollection", + "tableTo": "authUser", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userCollectionAsset": { + "name": "userCollectionAsset", + "columns": { + "collection_id": { + "name": "collection_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "date_added": { + "name": "date_added", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "collection_assets_collection_id_idx": { + "name": "collection_assets_collection_id_idx", + "columns": [ + "collection_id" + ], + "isUnique": false + }, + "collection_assets_asset_id_idx": { + "name": "collection_assets_asset_id_idx", + "columns": [ + "asset_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "userCollectionAsset_collection_id_userCollection_id_fk": { + "name": "userCollectionAsset_collection_id_userCollection_id_fk", + "tableFrom": "userCollectionAsset", + "tableTo": "userCollection", + "columnsFrom": [ + "collection_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "userCollectionAsset_asset_id_asset_id_fk": { + "name": "userCollectionAsset_asset_id_asset_id_fk", + "tableFrom": "userCollectionAsset", + "tableTo": "asset", + "columnsFrom": [ + "asset_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "socialsConnection": { + "name": "socialsConnection", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "discord_id": { + "name": "discord_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "socialsConnection_id_unique": { + "name": "socialsConnection_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "socialsConnection_user_id_unique": { + "name": "socialsConnection_user_id_unique", + "columns": [ + "user_id" + ], + "isUnique": true + }, + "socials_connection_user_id_idx": { + "name": "socials_connection_user_id_idx", + "columns": [ + "user_id" + ], + "isUnique": false + }, + "socials_connection_discord_id_idx": { + "name": "socials_connection_discord_id_idx", + "columns": [ + "discord_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "socialsConnection_user_id_authUser_id_fk": { + "name": "socialsConnection_user_id_authUser_id_fk", + "tableFrom": "socialsConnection", + "tableTo": "authUser", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userFavorite": { + "name": "userFavorite", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": { + "userFavorite_id_unique": { + "name": "userFavorite_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "favorited_assets_id_idx": { + "name": "favorited_assets_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "favorited_assets_user_id_idx": { + "name": "favorited_assets_user_id_idx", + "columns": [ + "user_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "userFavorite_user_id_authUser_id_fk": { + "name": "userFavorite_user_id_authUser_id_fk", + "tableFrom": "userFavorite", + "tableTo": "authUser", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userFavoriteAsset": { + "name": "userFavoriteAsset", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "favorited_assets_id": { + "name": "favorited_assets_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "userFavoriteAsset_id_unique": { + "name": "userFavoriteAsset_id_unique", + "columns": [ + "id" + ], + "isUnique": true + }, + "favorited_assets_assets_id_idx": { + "name": "favorited_assets_assets_id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "favorited_assets_assets_user_id_idx": { + "name": "favorited_assets_assets_user_id_idx", + "columns": [ + "favorited_assets_id" + ], + "isUnique": false + }, + "favorited_assets_assets_asset_id_idx": { + "name": "favorited_assets_assets_asset_id_idx", + "columns": [ + "asset_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk": { + "name": "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk", + "tableFrom": "userFavoriteAsset", + "tableTo": "userFavorite", + "columnsFrom": [ + "favorited_assets_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "userFavoriteAsset_asset_id_asset_id_fk": { + "name": "userFavoriteAsset_asset_id_asset_id_fk", + "tableFrom": "userFavoriteAsset", + "tableTo": "asset", + "columnsFrom": [ + "asset_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userFollowing": { + "name": "userFollowing", + "columns": { + "followerId": { + "name": "followerId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "followingId": { + "name": "followingId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "userfollowing_follower_idx": { + "name": "userfollowing_follower_idx", + "columns": [ + "followerId" + ], + "isUnique": false + }, + "userfollowing_following_idx": { + "name": "userfollowing_following_idx", + "columns": [ + "followingId" + ], + "isUnique": false + } + }, + "foreignKeys": { + "userFollowing_followerId_authUser_id_fk": { + "name": "userFollowing_followerId_authUser_id_fk", + "tableFrom": "userFollowing", + "tableTo": "authUser", + "columnsFrom": [ + "followerId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "userFollowing_followingId_authUser_id_fk": { + "name": "userFollowing_followingId_authUser_id_fk", + "tableFrom": "userFollowing", + "tableTo": "authUser", + "columnsFrom": [ + "followingId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userCollectionLikes": { + "name": "userCollectionLikes", + "columns": { + "collection_id": { + "name": "collection_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "userCollectionNetworking_collection_idx": { + "name": "userCollectionNetworking_collection_idx", + "columns": [ + "collection_id" + ], + "isUnique": false + }, + "userCollectionNetworking_likedBy_idx": { + "name": "userCollectionNetworking_likedBy_idx", + "columns": [ + "liked_by_id" + ], + "isUnique": false + } + }, + "foreignKeys": { + "userCollectionLikes_collection_id_userCollection_id_fk": { + "name": "userCollectionLikes_collection_id_userCollection_id_fk", + "tableFrom": "userCollectionLikes", + "tableTo": "userCollection", + "columnsFrom": [ + "collection_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "userCollectionLikes_liked_by_id_authUser_id_fk": { + "name": "userCollectionLikes_liked_by_id_authUser_id_fk", + "tableFrom": "userCollectionLikes", + "tableTo": "authUser", + "columnsFrom": [ + "liked_by_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/v2/db/migrations/meta/_journal.json b/src/v2/db/migrations/meta/_journal.json index 9a10d76..89fe7ef 100644 --- a/src/v2/db/migrations/meta/_journal.json +++ b/src/v2/db/migrations/meta/_journal.json @@ -1,13 +1,13 @@ { - "version": "5", - "dialect": "sqlite", - "entries": [ - { - "idx": 0, - "version": "5", - "when": 1701255870880, - "tag": "0000_smart_scarlet_spider", - "breakpoints": true - } - ] -} + "version": "5", + "dialect": "sqlite", + "entries": [ + { + "idx": 0, + "version": "5", + "when": 1702062637541, + "tag": "0000_jittery_hardball", + "breakpoints": true + } + ] +} \ No newline at end of file From 658a58cad8d5e32b135c13b186f62853195b9c0d Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Fri, 8 Dec 2023 20:11:23 +0000 Subject: [PATCH 181/318] reimpl login w/ password and signup --- src/scripts/seed/seed.ts | 29 +- src/v2/db/migrations/meta/0000_snapshot.json | 3930 ++++++++---------- src/v2/db/migrations/meta/_journal.json | 24 +- src/v2/db/schema/user/user.ts | 2 +- src/v2/lib/managers/auth/user-auth.ts | 67 +- src/v2/lib/managers/auth/user-session.ts | 5 +- 6 files changed, 1919 insertions(+), 2138 deletions(-) diff --git a/src/scripts/seed/seed.ts b/src/scripts/seed/seed.ts index c5aff49..c7836e5 100644 --- a/src/scripts/seed/seed.ts +++ b/src/scripts/seed/seed.ts @@ -14,8 +14,10 @@ import { userCollectionAsset, userFavoriteAsset, userFavorite, + authCredentials, } from "@/v2/db/schema" import { generateID } from "@/v2/lib/oslo" +import { Scrypt } from "oslo/password" const { ENVIRONMENT } = process.env @@ -46,8 +48,8 @@ async function main() { .values([ { id: generateID(), - username: "testuser", - email: "hi@dromzeh.dev", + username: "adminuser", + email: "admin@wanderer.moe", emailVerified: 1, usernameColour: "#84E6F8", bio: "test bio", @@ -58,7 +60,7 @@ async function main() { { id: generateID(), username: "testuser2", - email: "hi2@dromzeh.dev", + email: "testuser2@dromzeh.dev", emailVerified: 1, bio: "test bio 2", pronouns: "he/him/his", @@ -69,7 +71,7 @@ async function main() { { id: generateID(), username: "testuser3", - email: "hi3@dromzeh.dev", + email: "testuser3@wanderer.moe", emailVerified: 1, bio: "test bio 3", roleFlags: 1, @@ -80,6 +82,25 @@ async function main() { .returning() console.log(`[SEED] [authUser] inserted ${newUsers.length} rows\n`) + const devAdminPassword = generateID(12) + + console.log( + `[SEED] [userCredentials] Seeding user login for admin with password ${devAdminPassword}...` + ) + + const newCredentials = await db + .insert(authCredentials) + .values({ + id: generateID(20), + userId: newUsers[0].id, + hashedPassword: await new Scrypt().hash(devAdminPassword), + }) + .returning() + + console.log( + `[SEED] [userCredentials] inserted ${newCredentials.length} rows\n` + ) + console.log("[SEED] [userFollowing] Seeding user following...") const newuserFollowing = await db .insert(userFollowing) diff --git a/src/v2/db/migrations/meta/0000_snapshot.json b/src/v2/db/migrations/meta/0000_snapshot.json index d740882..c285077 100644 --- a/src/v2/db/migrations/meta/0000_snapshot.json +++ b/src/v2/db/migrations/meta/0000_snapshot.json @@ -1,2113 +1,1829 @@ { - "version": "5", - "dialect": "sqlite", - "id": "62d78f01-fa41-4210-9f30-93df02adfa75", - "prevId": "00000000-0000-0000-0000-000000000000", - "tables": { - "asset": { - "name": "asset", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "extension": { - "name": "extension", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false + "version": "5", + "dialect": "sqlite", + "id": "62d78f01-fa41-4210-9f30-93df02adfa75", + "prevId": "00000000-0000-0000-0000-000000000000", + "tables": { + "asset": { + "name": "asset", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "extension": { + "name": "extension", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "game": { + "name": "game", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_category": { + "name": "asset_category", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by_id": { + "name": "uploaded_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by_name": { + "name": "uploaded_by_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'pending'" + }, + "uploaded_date": { + "name": "uploaded_date", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_is_optimized": { + "name": "asset_is_optimized", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "asset_is_suggestive": { + "name": "asset_is_suggestive", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "view_count": { + "name": "view_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "download_count": { + "name": "download_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "file_size": { + "name": "file_size", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "width": { + "name": "width", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "height": { + "name": "height", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "assets_id_idx": { + "name": "assets_id_idx", + "columns": ["id"], + "isUnique": false + }, + "assets_name_idx": { + "name": "assets_name_idx", + "columns": ["name"], + "isUnique": false + }, + "assets_game_name_idx": { + "name": "assets_game_name_idx", + "columns": ["game"], + "isUnique": false + }, + "assets_asset_category_name_idx": { + "name": "assets_asset_category_name_idx", + "columns": ["asset_category"], + "isUnique": false + }, + "assets_uploaded_by_id_idx": { + "name": "assets_uploaded_by_id_idx", + "columns": ["uploaded_by_id"], + "isUnique": false + } + }, + "foreignKeys": { + "asset_game_game_id_fk": { + "name": "asset_game_game_id_fk", + "tableFrom": "asset", + "tableTo": "game", + "columnsFrom": ["game"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "asset_asset_category_assetCategory_id_fk": { + "name": "asset_asset_category_assetCategory_id_fk", + "tableFrom": "asset", + "tableTo": "assetCategory", + "columnsFrom": ["asset_category"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "asset_uploaded_by_id_authUser_id_fk": { + "name": "asset_uploaded_by_id_authUser_id_fk", + "tableFrom": "asset", + "tableTo": "authUser", + "columnsFrom": ["uploaded_by_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "asset_uploaded_by_name_authUser_username_fk": { + "name": "asset_uploaded_by_name_authUser_username_fk", + "tableFrom": "asset", + "tableTo": "authUser", + "columnsFrom": ["uploaded_by_name"], + "columnsTo": ["username"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "atlas": { + "name": "atlas", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by": { + "name": "uploaded_by", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by_name": { + "name": "uploaded_by_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_date": { + "name": "uploaded_date", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "file_size": { + "name": "file_size", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "atlas_id_unique": { + "name": "atlas_id_unique", + "columns": ["id"], + "isUnique": true + }, + "atlas_id_idx": { + "name": "atlas_id_idx", + "columns": ["id"], + "isUnique": false + }, + "atlas_uploaded_by_idx": { + "name": "atlas_uploaded_by_idx", + "columns": ["uploaded_by"], + "isUnique": false + }, + "atlas_uploaded_by_name_idx": { + "name": "atlas_uploaded_by_name_idx", + "columns": ["uploaded_by_name"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "atlasToAsset": { + "name": "atlasToAsset", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "atlas_id": { + "name": "atlas_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "atlas_to_assets_id_idx": { + "name": "atlas_to_assets_id_idx", + "columns": ["id"], + "isUnique": false + }, + "atlas_to_assets_atlas_id_idx": { + "name": "atlas_to_assets_atlas_id_idx", + "columns": ["atlas_id"], + "isUnique": false + }, + "atlas_to_assets_asset_id_idx": { + "name": "atlas_to_assets_asset_id_idx", + "columns": ["asset_id"], + "isUnique": false + } + }, + "foreignKeys": { + "atlasToAsset_atlas_id_atlas_id_fk": { + "name": "atlasToAsset_atlas_id_atlas_id_fk", + "tableFrom": "atlasToAsset", + "tableTo": "atlas", + "columnsFrom": ["atlas_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "atlasToAsset_asset_id_asset_id_fk": { + "name": "atlasToAsset_asset_id_asset_id_fk", + "tableFrom": "atlasToAsset", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetLikes": { + "name": "assetLikes", + "columns": { + "asset_id": { + "name": "asset_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetlikes_asset_idx": { + "name": "assetlikes_asset_idx", + "columns": ["asset_id"], + "isUnique": false + }, + "assetlikes_likedBy_idx": { + "name": "assetlikes_likedBy_idx", + "columns": ["liked_by_id"], + "isUnique": false + } + }, + "foreignKeys": { + "assetLikes_asset_id_asset_id_fk": { + "name": "assetLikes_asset_id_asset_id_fk", + "tableFrom": "assetLikes", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "assetLikes_liked_by_id_authUser_id_fk": { + "name": "assetLikes_liked_by_id_authUser_id_fk", + "tableFrom": "assetLikes", + "tableTo": "authUser", + "columnsFrom": ["liked_by_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetCategory": { + "name": "assetCategory", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetCategory_id_unique": { + "name": "assetCategory_id_unique", + "columns": ["id"], + "isUnique": true + }, + "assetCategory_name_unique": { + "name": "assetCategory_name_unique", + "columns": ["name"], + "isUnique": true + }, + "asset_category_id_idx": { + "name": "asset_category_id_idx", + "columns": ["id"], + "isUnique": false + }, + "asset_category_name_idx": { + "name": "asset_category_name_idx", + "columns": ["name"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "gameAssetCategory": { + "name": "gameAssetCategory", + "columns": { + "game_id": { + "name": "game_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_category_id": { + "name": "asset_category_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "game_asset_category_game_id_idx": { + "name": "game_asset_category_game_id_idx", + "columns": ["game_id"], + "isUnique": false + }, + "game_asset_category_asset_category_id_idx": { + "name": "game_asset_category_asset_category_id_idx", + "columns": ["asset_category_id"], + "isUnique": false + } + }, + "foreignKeys": { + "gameAssetCategory_game_id_game_id_fk": { + "name": "gameAssetCategory_game_id_game_id_fk", + "tableFrom": "gameAssetCategory", + "tableTo": "game", + "columnsFrom": ["game_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "gameAssetCategory_asset_category_id_assetCategory_id_fk": { + "name": "gameAssetCategory_asset_category_id_assetCategory_id_fk", + "tableFrom": "gameAssetCategory", + "tableTo": "assetCategory", + "columnsFrom": ["asset_category_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetCategoryLikes": { + "name": "assetCategoryLikes", + "columns": { + "asset_id": { + "name": "asset_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetCategoryLikes_asset_idx": { + "name": "assetCategoryLikes_asset_idx", + "columns": ["asset_id"], + "isUnique": false + }, + "assetCategoryLikes_likedby_idx": { + "name": "assetCategoryLikes_likedby_idx", + "columns": ["liked_by_id"], + "isUnique": false + } + }, + "foreignKeys": { + "assetCategoryLikes_asset_id_assetCategory_id_fk": { + "name": "assetCategoryLikes_asset_id_assetCategory_id_fk", + "tableFrom": "assetCategoryLikes", + "tableTo": "assetCategory", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "assetCategoryLikes_liked_by_id_authUser_id_fk": { + "name": "assetCategoryLikes_liked_by_id_authUser_id_fk", + "tableFrom": "assetCategoryLikes", + "tableTo": "authUser", + "columnsFrom": ["liked_by_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} }, "game": { - "name": "game", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_category": { - "name": "asset_category", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by_id": { - "name": "uploaded_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by_name": { - "name": "uploaded_by_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "url": { - "name": "url", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "status": { - "name": "status", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "'pending'" - }, - "uploaded_date": { - "name": "uploaded_date", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_is_optimized": { - "name": "asset_is_optimized", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "asset_is_suggestive": { - "name": "asset_is_suggestive", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "view_count": { - "name": "view_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "download_count": { - "name": "download_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "file_size": { - "name": "file_size", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "width": { - "name": "width", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "height": { - "name": "height", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "assets_id_idx": { - "name": "assets_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "assets_name_idx": { - "name": "assets_name_idx", - "columns": [ - "name" - ], - "isUnique": false - }, - "assets_game_name_idx": { - "name": "assets_game_name_idx", - "columns": [ - "game" - ], - "isUnique": false - }, - "assets_asset_category_name_idx": { - "name": "assets_asset_category_name_idx", - "columns": [ - "asset_category" - ], - "isUnique": false - }, - "assets_uploaded_by_id_idx": { - "name": "assets_uploaded_by_id_idx", - "columns": [ - "uploaded_by_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "asset_game_game_id_fk": { - "name": "asset_game_game_id_fk", - "tableFrom": "asset", - "tableTo": "game", - "columnsFrom": [ - "game" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "asset_asset_category_assetCategory_id_fk": { - "name": "asset_asset_category_assetCategory_id_fk", - "tableFrom": "asset", - "tableTo": "assetCategory", - "columnsFrom": [ - "asset_category" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "asset_uploaded_by_id_authUser_id_fk": { - "name": "asset_uploaded_by_id_authUser_id_fk", - "tableFrom": "asset", - "tableTo": "authUser", - "columnsFrom": [ - "uploaded_by_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "asset_uploaded_by_name_authUser_username_fk": { - "name": "asset_uploaded_by_name_authUser_username_fk", - "tableFrom": "asset", - "tableTo": "authUser", - "columnsFrom": [ - "uploaded_by_name" - ], - "columnsTo": [ - "username" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "atlas": { - "name": "atlas", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "url": { - "name": "url", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by": { - "name": "uploaded_by", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by_name": { - "name": "uploaded_by_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_date": { - "name": "uploaded_date", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "file_size": { - "name": "file_size", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "atlas_id_unique": { - "name": "atlas_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "atlas_id_idx": { - "name": "atlas_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "atlas_uploaded_by_idx": { - "name": "atlas_uploaded_by_idx", - "columns": [ - "uploaded_by" - ], - "isUnique": false - }, - "atlas_uploaded_by_name_idx": { - "name": "atlas_uploaded_by_name_idx", - "columns": [ - "uploaded_by_name" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "atlasToAsset": { - "name": "atlasToAsset", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "atlas_id": { - "name": "atlas_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "atlas_to_assets_id_idx": { - "name": "atlas_to_assets_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "atlas_to_assets_atlas_id_idx": { - "name": "atlas_to_assets_atlas_id_idx", - "columns": [ - "atlas_id" - ], - "isUnique": false - }, - "atlas_to_assets_asset_id_idx": { - "name": "atlas_to_assets_asset_id_idx", - "columns": [ - "asset_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "atlasToAsset_atlas_id_atlas_id_fk": { - "name": "atlasToAsset_atlas_id_atlas_id_fk", - "tableFrom": "atlasToAsset", - "tableTo": "atlas", - "columnsFrom": [ - "atlas_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "atlasToAsset_asset_id_asset_id_fk": { - "name": "atlasToAsset_asset_id_asset_id_fk", - "tableFrom": "atlasToAsset", - "tableTo": "asset", - "columnsFrom": [ - "asset_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetLikes": { - "name": "assetLikes", - "columns": { - "asset_id": { - "name": "asset_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetlikes_asset_idx": { - "name": "assetlikes_asset_idx", - "columns": [ - "asset_id" - ], - "isUnique": false - }, - "assetlikes_likedBy_idx": { - "name": "assetlikes_likedBy_idx", - "columns": [ - "liked_by_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "assetLikes_asset_id_asset_id_fk": { - "name": "assetLikes_asset_id_asset_id_fk", - "tableFrom": "assetLikes", - "tableTo": "asset", - "columnsFrom": [ - "asset_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "assetLikes_liked_by_id_authUser_id_fk": { - "name": "assetLikes_liked_by_id_authUser_id_fk", - "tableFrom": "assetLikes", - "tableTo": "authUser", - "columnsFrom": [ - "liked_by_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetCategory": { - "name": "assetCategory", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetCategory_id_unique": { - "name": "assetCategory_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "assetCategory_name_unique": { - "name": "assetCategory_name_unique", - "columns": [ - "name" - ], - "isUnique": true - }, - "asset_category_id_idx": { - "name": "asset_category_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "asset_category_name_idx": { - "name": "asset_category_name_idx", - "columns": [ - "name" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "gameAssetCategory": { - "name": "gameAssetCategory", - "columns": { - "game_id": { - "name": "game_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_category_id": { - "name": "asset_category_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "game_asset_category_game_id_idx": { - "name": "game_asset_category_game_id_idx", - "columns": [ - "game_id" - ], - "isUnique": false - }, - "game_asset_category_asset_category_id_idx": { - "name": "game_asset_category_asset_category_id_idx", - "columns": [ - "asset_category_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "gameAssetCategory_game_id_game_id_fk": { - "name": "gameAssetCategory_game_id_game_id_fk", - "tableFrom": "gameAssetCategory", - "tableTo": "game", - "columnsFrom": [ - "game_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "gameAssetCategory_asset_category_id_assetCategory_id_fk": { - "name": "gameAssetCategory_asset_category_id_assetCategory_id_fk", - "tableFrom": "gameAssetCategory", - "tableTo": "assetCategory", - "columnsFrom": [ - "asset_category_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetCategoryLikes": { - "name": "assetCategoryLikes", - "columns": { - "asset_id": { - "name": "asset_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetCategoryLikes_asset_idx": { - "name": "assetCategoryLikes_asset_idx", - "columns": [ - "asset_id" - ], - "isUnique": false - }, - "assetCategoryLikes_likedby_idx": { - "name": "assetCategoryLikes_likedby_idx", - "columns": [ - "liked_by_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "assetCategoryLikes_asset_id_assetCategory_id_fk": { - "name": "assetCategoryLikes_asset_id_assetCategory_id_fk", - "tableFrom": "assetCategoryLikes", - "tableTo": "assetCategory", - "columnsFrom": [ - "asset_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "assetCategoryLikes_liked_by_id_authUser_id_fk": { - "name": "assetCategoryLikes_liked_by_id_authUser_id_fk", - "tableFrom": "assetCategoryLikes", - "tableTo": "authUser", - "columnsFrom": [ - "liked_by_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "game": { - "name": "game", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - }, - "possible_suggestive_content": { - "name": "possible_suggestive_content", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "game_id_unique": { - "name": "game_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "game_name_unique": { - "name": "game_name_unique", - "columns": [ - "name" - ], - "isUnique": true - }, - "game_id_idx": { - "name": "game_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "game_name_idx": { - "name": "game_name_idx", - "columns": [ - "name" - ], - "isUnique": false + "name": "game", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": 0 + }, + "possible_suggestive_content": { + "name": "possible_suggestive_content", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "game_id_unique": { + "name": "game_id_unique", + "columns": ["id"], + "isUnique": true + }, + "game_name_unique": { + "name": "game_name_unique", + "columns": ["name"], + "isUnique": true + }, + "game_id_idx": { + "name": "game_id_idx", + "columns": ["id"], + "isUnique": false + }, + "game_name_idx": { + "name": "game_name_idx", + "columns": ["name"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "gameLikes": { + "name": "gameLikes", + "columns": { + "asset_id": { + "name": "asset_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "gamelikes_game_idx": { + "name": "gamelikes_game_idx", + "columns": ["asset_id"], + "isUnique": false + }, + "gamelikes_likedby_idx": { + "name": "gamelikes_likedby_idx", + "columns": ["liked_by_id"], + "isUnique": false + } + }, + "foreignKeys": { + "gameLikes_asset_id_game_id_fk": { + "name": "gameLikes_asset_id_game_id_fk", + "tableFrom": "gameLikes", + "tableTo": "game", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "gameLikes_liked_by_id_authUser_id_fk": { + "name": "gameLikes_liked_by_id_authUser_id_fk", + "tableFrom": "gameLikes", + "tableTo": "authUser", + "columnsFrom": ["liked_by_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetTag": { + "name": "assetTag", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetTag_id_unique": { + "name": "assetTag_id_unique", + "columns": ["id"], + "isUnique": true + }, + "assetTag_name_unique": { + "name": "assetTag_name_unique", + "columns": ["name"], + "isUnique": true + }, + "asset_tag_id_idx": { + "name": "asset_tag_id_idx", + "columns": ["id"], + "isUnique": false + }, + "asset_tag_name_idx": { + "name": "asset_tag_name_idx", + "columns": ["name"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetTagAsset": { + "name": "assetTagAsset", + "columns": { + "asset_tag_id": { + "name": "asset_tag_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "asset_tags_assets_asset_tag_id_idx": { + "name": "asset_tags_assets_asset_tag_id_idx", + "columns": ["asset_tag_id"], + "isUnique": false + }, + "asset_tags_assets_asset_id_idx": { + "name": "asset_tags_assets_asset_id_idx", + "columns": ["asset_id"], + "isUnique": false + } + }, + "foreignKeys": { + "assetTagAsset_asset_tag_id_assetTag_id_fk": { + "name": "assetTagAsset_asset_tag_id_assetTag_id_fk", + "tableFrom": "assetTagAsset", + "tableTo": "assetTag", + "columnsFrom": ["asset_tag_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "assetTagAsset_asset_id_asset_id_fk": { + "name": "assetTagAsset_asset_id_asset_id_fk", + "tableFrom": "assetTagAsset", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetTagLikes": { + "name": "assetTagLikes", + "columns": { + "asset_id": { + "name": "asset_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetTagLikes_asset_idx": { + "name": "assetTagLikes_asset_idx", + "columns": ["asset_id"], + "isUnique": false + }, + "assetTagLikes_likedby_idx": { + "name": "assetTagLikes_likedby_idx", + "columns": ["liked_by_id"], + "isUnique": false + } + }, + "foreignKeys": { + "assetTagLikes_asset_id_assetTag_id_fk": { + "name": "assetTagLikes_asset_id_assetTag_id_fk", + "tableFrom": "assetTagLikes", + "tableTo": "assetTag", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "assetTagLikes_liked_by_id_authUser_id_fk": { + "name": "assetTagLikes_liked_by_id_authUser_id_fk", + "tableFrom": "assetTagLikes", + "tableTo": "authUser", + "columnsFrom": ["liked_by_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "savedOcGenerators": { + "name": "savedOcGenerators", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "game": { + "name": "game", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "date_created": { + "name": "date_created", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "saved_color_palette": { + "name": "saved_color_palette", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sakura_url": { + "name": "sakura_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "savedOcGenerators_id_unique": { + "name": "savedOcGenerators_id_unique", + "columns": ["id"], + "isUnique": true + }, + "saved_oc_generators_id_idx": { + "name": "saved_oc_generators_id_idx", + "columns": ["id"], + "isUnique": false + }, + "saved_oc_generators_user_id_idx": { + "name": "saved_oc_generators_user_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "savedOcGenerators_user_id_authUser_id_fk": { + "name": "savedOcGenerators_user_id_authUser_id_fk", + "tableFrom": "savedOcGenerators", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "authCredentials": { + "name": "authCredentials", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "hashed_password": { + "name": "hashed_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "authCredentials_id_unique": { + "name": "authCredentials_id_unique", + "columns": ["id"], + "isUnique": true + }, + "key_user_id_idx": { + "name": "key_user_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "authCredentials_user_id_authUser_id_fk": { + "name": "authCredentials_user_id_authUser_id_fk", + "tableFrom": "authCredentials", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "authUser": { + "name": "authUser", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "avatar_url": { + "name": "avatar_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "banner_url": { + "name": "banner_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "display_name": { + "name": "display_name", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "username_colour": { + "name": "username_colour", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "email_verified": { + "name": "email_verified", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "pronouns": { + "name": "pronouns", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "verified": { + "name": "verified", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "bio": { + "name": "bio", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'No bio set'" + }, + "date_joined": { + "name": "date_joined", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "role_flags": { + "name": "role_flags", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "is_contributor": { + "name": "is_contributor", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "self_assignable_role_flags": { + "name": "self_assignable_role_flags", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "authUser_id_unique": { + "name": "authUser_id_unique", + "columns": ["id"], + "isUnique": true + }, + "authUser_username_unique": { + "name": "authUser_username_unique", + "columns": ["username"], + "isUnique": true + }, + "user_id_idx": { + "name": "user_id_idx", + "columns": ["id"], + "isUnique": false + }, + "user_username_idx": { + "name": "user_username_idx", + "columns": ["username"], + "isUnique": false + }, + "user_email_idx": { + "name": "user_email_idx", + "columns": ["email"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "authSession": { + "name": "authSession", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "active_expires": { + "name": "active_expires", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "idle_expires": { + "name": "idle_expires", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "authSession_id_unique": { + "name": "authSession_id_unique", + "columns": ["id"], + "isUnique": true + }, + "session_user_id_idx": { + "name": "session_user_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "authSession_user_id_authUser_id_fk": { + "name": "authSession_user_id_authUser_id_fk", + "tableFrom": "authSession", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "emailVerificationToken": { + "name": "emailVerificationToken", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "emailVerificationToken_id_unique": { + "name": "emailVerificationToken_id_unique", + "columns": ["id"], + "isUnique": true + }, + "email_verification_token_user_id_idx": { + "name": "email_verification_token_user_id_idx", + "columns": ["user_id"], + "isUnique": false + }, + "email_verification_token_token_idx": { + "name": "email_verification_token_token_idx", + "columns": ["token"], + "isUnique": false + } + }, + "foreignKeys": { + "emailVerificationToken_user_id_authUser_id_fk": { + "name": "emailVerificationToken_user_id_authUser_id_fk", + "tableFrom": "emailVerificationToken", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "passwordResetToken": { + "name": "passwordResetToken", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "passwordResetToken_id_unique": { + "name": "passwordResetToken_id_unique", + "columns": ["id"], + "isUnique": true + }, + "password_reset_token_user_id_idx": { + "name": "password_reset_token_user_id_idx", + "columns": ["user_id"], + "isUnique": false + }, + "password_reset_token_token_idx": { + "name": "password_reset_token_token_idx", + "columns": ["token"], + "isUnique": false + } + }, + "foreignKeys": { + "passwordResetToken_user_id_authUser_id_fk": { + "name": "passwordResetToken_user_id_authUser_id_fk", + "tableFrom": "passwordResetToken", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userCollection": { + "name": "userCollection", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "date_created": { + "name": "date_created", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": { + "userCollection_id_unique": { + "name": "userCollection_id_unique", + "columns": ["id"], + "isUnique": true + }, + "collection_id_idx": { + "name": "collection_id_idx", + "columns": ["id"], + "isUnique": false + }, + "user_collection_id_idx": { + "name": "user_collection_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "userCollection_user_id_authUser_id_fk": { + "name": "userCollection_user_id_authUser_id_fk", + "tableFrom": "userCollection", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userCollectionAsset": { + "name": "userCollectionAsset", + "columns": { + "collection_id": { + "name": "collection_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "date_added": { + "name": "date_added", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "collection_assets_collection_id_idx": { + "name": "collection_assets_collection_id_idx", + "columns": ["collection_id"], + "isUnique": false + }, + "collection_assets_asset_id_idx": { + "name": "collection_assets_asset_id_idx", + "columns": ["asset_id"], + "isUnique": false + } + }, + "foreignKeys": { + "userCollectionAsset_collection_id_userCollection_id_fk": { + "name": "userCollectionAsset_collection_id_userCollection_id_fk", + "tableFrom": "userCollectionAsset", + "tableTo": "userCollection", + "columnsFrom": ["collection_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "userCollectionAsset_asset_id_asset_id_fk": { + "name": "userCollectionAsset_asset_id_asset_id_fk", + "tableFrom": "userCollectionAsset", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "socialsConnection": { + "name": "socialsConnection", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "discord_id": { + "name": "discord_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "socialsConnection_id_unique": { + "name": "socialsConnection_id_unique", + "columns": ["id"], + "isUnique": true + }, + "socialsConnection_user_id_unique": { + "name": "socialsConnection_user_id_unique", + "columns": ["user_id"], + "isUnique": true + }, + "socials_connection_user_id_idx": { + "name": "socials_connection_user_id_idx", + "columns": ["user_id"], + "isUnique": false + }, + "socials_connection_discord_id_idx": { + "name": "socials_connection_discord_id_idx", + "columns": ["discord_id"], + "isUnique": false + } + }, + "foreignKeys": { + "socialsConnection_user_id_authUser_id_fk": { + "name": "socialsConnection_user_id_authUser_id_fk", + "tableFrom": "socialsConnection", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userFavorite": { + "name": "userFavorite", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": { + "userFavorite_id_unique": { + "name": "userFavorite_id_unique", + "columns": ["id"], + "isUnique": true + }, + "favorited_assets_id_idx": { + "name": "favorited_assets_id_idx", + "columns": ["id"], + "isUnique": false + }, + "favorited_assets_user_id_idx": { + "name": "favorited_assets_user_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "userFavorite_user_id_authUser_id_fk": { + "name": "userFavorite_user_id_authUser_id_fk", + "tableFrom": "userFavorite", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userFavoriteAsset": { + "name": "userFavoriteAsset", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "favorited_assets_id": { + "name": "favorited_assets_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "userFavoriteAsset_id_unique": { + "name": "userFavoriteAsset_id_unique", + "columns": ["id"], + "isUnique": true + }, + "favorited_assets_assets_id_idx": { + "name": "favorited_assets_assets_id_idx", + "columns": ["id"], + "isUnique": false + }, + "favorited_assets_assets_user_id_idx": { + "name": "favorited_assets_assets_user_id_idx", + "columns": ["favorited_assets_id"], + "isUnique": false + }, + "favorited_assets_assets_asset_id_idx": { + "name": "favorited_assets_assets_asset_id_idx", + "columns": ["asset_id"], + "isUnique": false + } + }, + "foreignKeys": { + "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk": { + "name": "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk", + "tableFrom": "userFavoriteAsset", + "tableTo": "userFavorite", + "columnsFrom": ["favorited_assets_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "userFavoriteAsset_asset_id_asset_id_fk": { + "name": "userFavoriteAsset_asset_id_asset_id_fk", + "tableFrom": "userFavoriteAsset", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userFollowing": { + "name": "userFollowing", + "columns": { + "followerId": { + "name": "followerId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "followingId": { + "name": "followingId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "userfollowing_follower_idx": { + "name": "userfollowing_follower_idx", + "columns": ["followerId"], + "isUnique": false + }, + "userfollowing_following_idx": { + "name": "userfollowing_following_idx", + "columns": ["followingId"], + "isUnique": false + } + }, + "foreignKeys": { + "userFollowing_followerId_authUser_id_fk": { + "name": "userFollowing_followerId_authUser_id_fk", + "tableFrom": "userFollowing", + "tableTo": "authUser", + "columnsFrom": ["followerId"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "userFollowing_followingId_authUser_id_fk": { + "name": "userFollowing_followingId_authUser_id_fk", + "tableFrom": "userFollowing", + "tableTo": "authUser", + "columnsFrom": ["followingId"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userCollectionLikes": { + "name": "userCollectionLikes", + "columns": { + "collection_id": { + "name": "collection_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "userCollectionNetworking_collection_idx": { + "name": "userCollectionNetworking_collection_idx", + "columns": ["collection_id"], + "isUnique": false + }, + "userCollectionNetworking_likedBy_idx": { + "name": "userCollectionNetworking_likedBy_idx", + "columns": ["liked_by_id"], + "isUnique": false + } + }, + "foreignKeys": { + "userCollectionLikes_collection_id_userCollection_id_fk": { + "name": "userCollectionLikes_collection_id_userCollection_id_fk", + "tableFrom": "userCollectionLikes", + "tableTo": "userCollection", + "columnsFrom": ["collection_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "userCollectionLikes_liked_by_id_authUser_id_fk": { + "name": "userCollectionLikes_liked_by_id_authUser_id_fk", + "tableFrom": "userCollectionLikes", + "tableTo": "authUser", + "columnsFrom": ["liked_by_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} }, - "gameLikes": { - "name": "gameLikes", - "columns": { - "asset_id": { - "name": "asset_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "gamelikes_game_idx": { - "name": "gamelikes_game_idx", - "columns": [ - "asset_id" - ], - "isUnique": false - }, - "gamelikes_likedby_idx": { - "name": "gamelikes_likedby_idx", - "columns": [ - "liked_by_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "gameLikes_asset_id_game_id_fk": { - "name": "gameLikes_asset_id_game_id_fk", - "tableFrom": "gameLikes", - "tableTo": "game", - "columnsFrom": [ - "asset_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "gameLikes_liked_by_id_authUser_id_fk": { - "name": "gameLikes_liked_by_id_authUser_id_fk", - "tableFrom": "gameLikes", - "tableTo": "authUser", - "columnsFrom": [ - "liked_by_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetTag": { - "name": "assetTag", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetTag_id_unique": { - "name": "assetTag_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "assetTag_name_unique": { - "name": "assetTag_name_unique", - "columns": [ - "name" - ], - "isUnique": true - }, - "asset_tag_id_idx": { - "name": "asset_tag_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "asset_tag_name_idx": { - "name": "asset_tag_name_idx", - "columns": [ - "name" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetTagAsset": { - "name": "assetTagAsset", - "columns": { - "asset_tag_id": { - "name": "asset_tag_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "asset_tags_assets_asset_tag_id_idx": { - "name": "asset_tags_assets_asset_tag_id_idx", - "columns": [ - "asset_tag_id" - ], - "isUnique": false - }, - "asset_tags_assets_asset_id_idx": { - "name": "asset_tags_assets_asset_id_idx", - "columns": [ - "asset_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "assetTagAsset_asset_tag_id_assetTag_id_fk": { - "name": "assetTagAsset_asset_tag_id_assetTag_id_fk", - "tableFrom": "assetTagAsset", - "tableTo": "assetTag", - "columnsFrom": [ - "asset_tag_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "assetTagAsset_asset_id_asset_id_fk": { - "name": "assetTagAsset_asset_id_asset_id_fk", - "tableFrom": "assetTagAsset", - "tableTo": "asset", - "columnsFrom": [ - "asset_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetTagLikes": { - "name": "assetTagLikes", - "columns": { - "asset_id": { - "name": "asset_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetTagLikes_asset_idx": { - "name": "assetTagLikes_asset_idx", - "columns": [ - "asset_id" - ], - "isUnique": false - }, - "assetTagLikes_likedby_idx": { - "name": "assetTagLikes_likedby_idx", - "columns": [ - "liked_by_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "assetTagLikes_asset_id_assetTag_id_fk": { - "name": "assetTagLikes_asset_id_assetTag_id_fk", - "tableFrom": "assetTagLikes", - "tableTo": "assetTag", - "columnsFrom": [ - "asset_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "assetTagLikes_liked_by_id_authUser_id_fk": { - "name": "assetTagLikes_liked_by_id_authUser_id_fk", - "tableFrom": "assetTagLikes", - "tableTo": "authUser", - "columnsFrom": [ - "liked_by_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "savedOcGenerators": { - "name": "savedOcGenerators", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "game": { - "name": "game", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "date_created": { - "name": "date_created", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "content": { - "name": "content", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "saved_color_palette": { - "name": "saved_color_palette", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "sakura_url": { - "name": "sakura_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "savedOcGenerators_id_unique": { - "name": "savedOcGenerators_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "saved_oc_generators_id_idx": { - "name": "saved_oc_generators_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "saved_oc_generators_user_id_idx": { - "name": "saved_oc_generators_user_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "savedOcGenerators_user_id_authUser_id_fk": { - "name": "savedOcGenerators_user_id_authUser_id_fk", - "tableFrom": "savedOcGenerators", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "authCredentials": { - "name": "authCredentials", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "hashed_password": { - "name": "hashed_password", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "authCredentials_id_unique": { - "name": "authCredentials_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "key_user_id_idx": { - "name": "key_user_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "authCredentials_user_id_authUser_id_fk": { - "name": "authCredentials_user_id_authUser_id_fk", - "tableFrom": "authCredentials", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "authUser": { - "name": "authUser", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "avatar_url": { - "name": "avatar_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "banner_url": { - "name": "banner_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "display_name": { - "name": "display_name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "username": { - "name": "username", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "username_colour": { - "name": "username_colour", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "email": { - "name": "email", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "email_verified": { - "name": "email_verified", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "pronouns": { - "name": "pronouns", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "verified": { - "name": "verified", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "bio": { - "name": "bio", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "'No bio set'" - }, - "date_joined": { - "name": "date_joined", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "role_flags": { - "name": "role_flags", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 1 - }, - "is_contributor": { - "name": "is_contributor", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "self_assignable_role_flags": { - "name": "self_assignable_role_flags", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "authUser_id_unique": { - "name": "authUser_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "authUser_username_unique": { - "name": "authUser_username_unique", - "columns": [ - "username" - ], - "isUnique": true - }, - "user_id_idx": { - "name": "user_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "user_username_idx": { - "name": "user_username_idx", - "columns": [ - "username" - ], - "isUnique": false - }, - "user_email_idx": { - "name": "user_email_idx", - "columns": [ - "email" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "authSession": { - "name": "authSession", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "active_expires": { - "name": "active_expires", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "idle_expires": { - "name": "idle_expires", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "authSession_id_unique": { - "name": "authSession_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "session_user_id_idx": { - "name": "session_user_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "authSession_user_id_authUser_id_fk": { - "name": "authSession_user_id_authUser_id_fk", - "tableFrom": "authSession", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "emailVerificationToken": { - "name": "emailVerificationToken", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "emailVerificationToken_id_unique": { - "name": "emailVerificationToken_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "email_verification_token_user_id_idx": { - "name": "email_verification_token_user_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - }, - "email_verification_token_token_idx": { - "name": "email_verification_token_token_idx", - "columns": [ - "token" - ], - "isUnique": false - } - }, - "foreignKeys": { - "emailVerificationToken_user_id_authUser_id_fk": { - "name": "emailVerificationToken_user_id_authUser_id_fk", - "tableFrom": "emailVerificationToken", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "passwordResetToken": { - "name": "passwordResetToken", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "passwordResetToken_id_unique": { - "name": "passwordResetToken_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "password_reset_token_user_id_idx": { - "name": "password_reset_token_user_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - }, - "password_reset_token_token_idx": { - "name": "password_reset_token_token_idx", - "columns": [ - "token" - ], - "isUnique": false - } - }, - "foreignKeys": { - "passwordResetToken_user_id_authUser_id_fk": { - "name": "passwordResetToken_user_id_authUser_id_fk", - "tableFrom": "passwordResetToken", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userCollection": { - "name": "userCollection", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "date_created": { - "name": "date_created", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - } - }, - "indexes": { - "userCollection_id_unique": { - "name": "userCollection_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "collection_id_idx": { - "name": "collection_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "user_collection_id_idx": { - "name": "user_collection_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "userCollection_user_id_authUser_id_fk": { - "name": "userCollection_user_id_authUser_id_fk", - "tableFrom": "userCollection", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userCollectionAsset": { - "name": "userCollectionAsset", - "columns": { - "collection_id": { - "name": "collection_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "date_added": { - "name": "date_added", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "collection_assets_collection_id_idx": { - "name": "collection_assets_collection_id_idx", - "columns": [ - "collection_id" - ], - "isUnique": false - }, - "collection_assets_asset_id_idx": { - "name": "collection_assets_asset_id_idx", - "columns": [ - "asset_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "userCollectionAsset_collection_id_userCollection_id_fk": { - "name": "userCollectionAsset_collection_id_userCollection_id_fk", - "tableFrom": "userCollectionAsset", - "tableTo": "userCollection", - "columnsFrom": [ - "collection_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "userCollectionAsset_asset_id_asset_id_fk": { - "name": "userCollectionAsset_asset_id_asset_id_fk", - "tableFrom": "userCollectionAsset", - "tableTo": "asset", - "columnsFrom": [ - "asset_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "socialsConnection": { - "name": "socialsConnection", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "discord_id": { - "name": "discord_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "socialsConnection_id_unique": { - "name": "socialsConnection_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "socialsConnection_user_id_unique": { - "name": "socialsConnection_user_id_unique", - "columns": [ - "user_id" - ], - "isUnique": true - }, - "socials_connection_user_id_idx": { - "name": "socials_connection_user_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - }, - "socials_connection_discord_id_idx": { - "name": "socials_connection_discord_id_idx", - "columns": [ - "discord_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "socialsConnection_user_id_authUser_id_fk": { - "name": "socialsConnection_user_id_authUser_id_fk", - "tableFrom": "socialsConnection", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userFavorite": { - "name": "userFavorite", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - } - }, - "indexes": { - "userFavorite_id_unique": { - "name": "userFavorite_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "favorited_assets_id_idx": { - "name": "favorited_assets_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "favorited_assets_user_id_idx": { - "name": "favorited_assets_user_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "userFavorite_user_id_authUser_id_fk": { - "name": "userFavorite_user_id_authUser_id_fk", - "tableFrom": "userFavorite", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userFavoriteAsset": { - "name": "userFavoriteAsset", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "favorited_assets_id": { - "name": "favorited_assets_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "userFavoriteAsset_id_unique": { - "name": "userFavoriteAsset_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "favorited_assets_assets_id_idx": { - "name": "favorited_assets_assets_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "favorited_assets_assets_user_id_idx": { - "name": "favorited_assets_assets_user_id_idx", - "columns": [ - "favorited_assets_id" - ], - "isUnique": false - }, - "favorited_assets_assets_asset_id_idx": { - "name": "favorited_assets_assets_asset_id_idx", - "columns": [ - "asset_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk": { - "name": "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk", - "tableFrom": "userFavoriteAsset", - "tableTo": "userFavorite", - "columnsFrom": [ - "favorited_assets_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "userFavoriteAsset_asset_id_asset_id_fk": { - "name": "userFavoriteAsset_asset_id_asset_id_fk", - "tableFrom": "userFavoriteAsset", - "tableTo": "asset", - "columnsFrom": [ - "asset_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userFollowing": { - "name": "userFollowing", - "columns": { - "followerId": { - "name": "followerId", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "followingId": { - "name": "followingId", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "userfollowing_follower_idx": { - "name": "userfollowing_follower_idx", - "columns": [ - "followerId" - ], - "isUnique": false - }, - "userfollowing_following_idx": { - "name": "userfollowing_following_idx", - "columns": [ - "followingId" - ], - "isUnique": false - } - }, - "foreignKeys": { - "userFollowing_followerId_authUser_id_fk": { - "name": "userFollowing_followerId_authUser_id_fk", - "tableFrom": "userFollowing", - "tableTo": "authUser", - "columnsFrom": [ - "followerId" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "userFollowing_followingId_authUser_id_fk": { - "name": "userFollowing_followingId_authUser_id_fk", - "tableFrom": "userFollowing", - "tableTo": "authUser", - "columnsFrom": [ - "followingId" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userCollectionLikes": { - "name": "userCollectionLikes", - "columns": { - "collection_id": { - "name": "collection_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "userCollectionNetworking_collection_idx": { - "name": "userCollectionNetworking_collection_idx", - "columns": [ - "collection_id" - ], - "isUnique": false - }, - "userCollectionNetworking_likedBy_idx": { - "name": "userCollectionNetworking_likedBy_idx", - "columns": [ - "liked_by_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "userCollectionLikes_collection_id_userCollection_id_fk": { - "name": "userCollectionLikes_collection_id_userCollection_id_fk", - "tableFrom": "userCollectionLikes", - "tableTo": "userCollection", - "columnsFrom": [ - "collection_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "userCollectionLikes_liked_by_id_authUser_id_fk": { - "name": "userCollectionLikes_liked_by_id_authUser_id_fk", - "tableFrom": "userCollectionLikes", - "tableTo": "authUser", - "columnsFrom": [ - "liked_by_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} } - }, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - } -} \ No newline at end of file +} diff --git a/src/v2/db/migrations/meta/_journal.json b/src/v2/db/migrations/meta/_journal.json index 89fe7ef..912f9d9 100644 --- a/src/v2/db/migrations/meta/_journal.json +++ b/src/v2/db/migrations/meta/_journal.json @@ -1,13 +1,13 @@ { - "version": "5", - "dialect": "sqlite", - "entries": [ - { - "idx": 0, - "version": "5", - "when": 1702062637541, - "tag": "0000_jittery_hardball", - "breakpoints": true - } - ] -} \ No newline at end of file + "version": "5", + "dialect": "sqlite", + "entries": [ + { + "idx": 0, + "version": "5", + "when": 1702062637541, + "tag": "0000_jittery_hardball", + "breakpoints": true + } + ] +} diff --git a/src/v2/db/schema/user/user.ts b/src/v2/db/schema/user/user.ts index 1be2cc2..6707f63 100644 --- a/src/v2/db/schema/user/user.ts +++ b/src/v2/db/schema/user/user.ts @@ -119,7 +119,7 @@ export const usersRelations = relations(authUser, ({ one, many }) => ({ following: many(userFollowing, { relationName: "following", }), - authCredentials: many(authCredentials), + authCredentials: one(authCredentials), userSession: many(userSession), asset: many(asset), atlas: many(atlas), diff --git a/src/v2/lib/managers/auth/user-auth.ts b/src/v2/lib/managers/auth/user-auth.ts index b37e273..513eefd 100644 --- a/src/v2/lib/managers/auth/user-auth.ts +++ b/src/v2/lib/managers/auth/user-auth.ts @@ -1,4 +1,3 @@ -import { Context } from "hono" import { luciaAuth } from "../../auth/lucia" import { Scrypt } from "oslo/password" import { getConnection } from "@/v2/db/turso" @@ -6,6 +5,7 @@ import { authCredentials, authUser } from "@/v2/db/schema" import { createInsertSchema } from "drizzle-zod" import { z } from "zod" import { generateID } from "../../oslo" +import { eq } from "drizzle-orm" const authUserInsertSchema = createInsertSchema(authUser).pick({ username: true, @@ -13,15 +13,15 @@ const authUserInsertSchema = createInsertSchema(authUser).pick({ }) export class UserAuthenticationManager { - constructor(private ctx: Context) {} + constructor(private ctx: APIContext) {} private lucia = luciaAuth(this.ctx.env as Bindings) - private drizzleInstance = getConnection(this.ctx.env).drizzle + private drizzle = getConnection(this.ctx.env).drizzle public async createAccount( attributes: Required>, - password: string + password?: string ) { - const createUserTransaction = await this.drizzleInstance.transaction( + const createUserTransaction = await this.drizzle.transaction( async (db) => { try { const [newUser] = await db @@ -33,11 +33,13 @@ export class UserAuthenticationManager { }) .returning() - await db.insert(authCredentials).values({ - id: generateID(20), - userId: newUser.id, - hashedPassword: await new Scrypt().hash(password), - }) + if (password) { + await db.insert(authCredentials).values({ + id: generateID(20), + userId: newUser.id, + hashedPassword: await new Scrypt().hash(password), + }) + } return newUser } catch (e) { @@ -46,12 +48,53 @@ export class UserAuthenticationManager { } ) - await this.lucia.createSession(createUserTransaction.id, { + const newSession = await this.lucia.createSession( + createUserTransaction.id, + { + user_agent: this.ctx.req.header("user-agent") || "", + ip_address: this.ctx.req.header("cf-connecting-ip") || "", + country_code: this.ctx.req.header("cf-ipcountry") || "", + } + ) + + const newSessionCookie = await this.lucia.createSessionCookie( + newSession.id + ) + + return newSessionCookie + } + + public async loginViaPassword(email: string, password: string) { + const [foundUser] = await this.drizzle + .select({ id: authUser.id, email: authUser.email }) + .from(authUser) + .where(eq(authUser.email, email)) + + if (!foundUser) { + return null + } + + const [credentials] = await this.drizzle + .select() + .from(authCredentials) + .where(eq(authCredentials.userId, foundUser.id)) + + if ( + !(await new Scrypt().verify(password, credentials.hashedPassword)) + ) { + return null + } + + const newSession = await this.lucia.createSession(foundUser.id, { user_agent: this.ctx.req.header("user-agent") || "", ip_address: this.ctx.req.header("cf-connecting-ip") || "", country_code: this.ctx.req.header("cf-ipcountry") || "", }) - return createUserTransaction.id + const newSessionCookie = await this.lucia.createSessionCookie( + newSession.id + ) + + return newSessionCookie } } diff --git a/src/v2/lib/managers/auth/user-session.ts b/src/v2/lib/managers/auth/user-session.ts index e622347..becfd30 100644 --- a/src/v2/lib/managers/auth/user-session.ts +++ b/src/v2/lib/managers/auth/user-session.ts @@ -1,9 +1,10 @@ -import { Context } from "hono" import { luciaAuth } from "../../auth/lucia" +import { getConnection } from "@/v2/db/turso" export class AuthSessionManager { - constructor(private ctx: Context) {} + constructor(private ctx: APIContext) {} private lucia = luciaAuth(this.ctx.env as Bindings) + private drizzleInstance = getConnection(this.ctx.env).drizzle async validateSession(sessionId: string) { return await this.lucia.validateSession(sessionId) From 94c26cad7ea046e2fc97ddf446b2d33ce17591dc Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Fri, 8 Dec 2023 21:56:09 +0000 Subject: [PATCH 182/318] lfg --- src/index.ts | 2 - src/lucia.d.ts | 26 ------ src/scripts/seed/seed.ts | 4 +- ...y_hardball.sql => 0000_tiny_human_fly.sql} | 6 +- src/v2/db/migrations/meta/0000_snapshot.json | 32 +++++--- src/v2/db/migrations/meta/_journal.json | 4 +- src/v2/db/schema/user/user.ts | 13 ++- .../lib/auth/definitions/auth-definitions.ts | 4 +- src/v2/lib/auth/lucia.ts | 2 +- .../{user-auth.ts => user-auth-manager.ts} | 28 +++++-- .../lib/managers/auth/user-session-manager.ts | 81 +++++++++++++++++++ src/v2/lib/managers/auth/user-session.ts | 12 --- src/v2/middleware/auth-user.ts | 36 --------- src/v2/routes/auth/handler.ts | 11 +++ src/v2/routes/auth/login/openapi.ts | 27 +++++++ src/v2/routes/auth/login/route.ts | 51 ++++++++++++ src/v2/routes/auth/login/schema.ts | 16 ++++ src/v2/routes/auth/session/all/route.ts | 13 ++- src/v2/routes/auth/session/validate/route.ts | 7 +- src/worker-configuration.d.ts | 9 +-- 20 files changed, 271 insertions(+), 113 deletions(-) delete mode 100644 src/lucia.d.ts rename src/v2/db/migrations/{0000_jittery_hardball.sql => 0000_tiny_human_fly.sql} (99%) rename src/v2/lib/managers/auth/{user-auth.ts => user-auth-manager.ts} (83%) create mode 100644 src/v2/lib/managers/auth/user-session-manager.ts delete mode 100644 src/v2/lib/managers/auth/user-session.ts delete mode 100644 src/v2/middleware/auth-user.ts create mode 100644 src/v2/routes/auth/login/openapi.ts create mode 100644 src/v2/routes/auth/login/route.ts create mode 100644 src/v2/routes/auth/login/schema.ts diff --git a/src/index.ts b/src/index.ts index b6c9437..3975f17 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,7 +5,6 @@ import BaseRoutes from "@/v2/routes/handler" import { OpenAPIConfig } from "./openapi/config" import { csrfValidation } from "./v2/middleware/csrf" -import { setUserVariable } from "./v2/middleware/auth-user" const app = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() @@ -18,7 +17,6 @@ app.get( }) ) -app.use("*", setUserVariable) app.use("*", csrfValidation) app.use("*", prettyJSON()) diff --git a/src/lucia.d.ts b/src/lucia.d.ts deleted file mode 100644 index 50078c9..0000000 --- a/src/lucia.d.ts +++ /dev/null @@ -1,26 +0,0 @@ -/// -declare namespace Lucia { - type Auth = import("./v2/lib/auth/lucia").Auth - type DatabaseUserAttributes = { - avatar_url: string | null - banner_url: string | null - display_name: string | null - username: string - username_colour: string | null - email: string - email_verified: number - pronouns: string | null - verified: number - bio: string | null - date_joined: string - role_flags: number - is_contributor: number - self_assignable_role_flags: number | null - } - // stored to prevent session hijacking by checking if the session attributes match the ones stored in the database - type DatabaseSessionAttributes = { - country_code: string - user_agent: string - ip_address: string - } -} diff --git a/src/scripts/seed/seed.ts b/src/scripts/seed/seed.ts index c7836e5..1ce1335 100644 --- a/src/scripts/seed/seed.ts +++ b/src/scripts/seed/seed.ts @@ -17,7 +17,7 @@ import { authCredentials, } from "@/v2/db/schema" import { generateID } from "@/v2/lib/oslo" -import { Scrypt } from "oslo/password" +import { Scrypt } from "lucia" const { ENVIRONMENT } = process.env @@ -82,7 +82,7 @@ async function main() { .returning() console.log(`[SEED] [authUser] inserted ${newUsers.length} rows\n`) - const devAdminPassword = generateID(12) + const devAdminPassword = "password123" console.log( `[SEED] [userCredentials] Seeding user login for admin with password ${devAdminPassword}...` diff --git a/src/v2/db/migrations/0000_jittery_hardball.sql b/src/v2/db/migrations/0000_tiny_human_fly.sql similarity index 99% rename from src/v2/db/migrations/0000_jittery_hardball.sql rename to src/v2/db/migrations/0000_tiny_human_fly.sql index 105a768..ea65136 100644 --- a/src/v2/db/migrations/0000_jittery_hardball.sql +++ b/src/v2/db/migrations/0000_tiny_human_fly.sql @@ -150,9 +150,11 @@ CREATE TABLE `authUser` ( --> statement-breakpoint CREATE TABLE `authSession` ( `id` text NOT NULL, - `active_expires` integer NOT NULL, - `idle_expires` integer NOT NULL, `user_id` text NOT NULL, + `expires_at` text NOT NULL, + `user_agent` text NOT NULL, + `country_code` text NOT NULL, + `ip_address` text NOT NULL, FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade ); --> statement-breakpoint diff --git a/src/v2/db/migrations/meta/0000_snapshot.json b/src/v2/db/migrations/meta/0000_snapshot.json index c285077..1efe267 100644 --- a/src/v2/db/migrations/meta/0000_snapshot.json +++ b/src/v2/db/migrations/meta/0000_snapshot.json @@ -1,7 +1,7 @@ { "version": "5", "dialect": "sqlite", - "id": "62d78f01-fa41-4210-9f30-93df02adfa75", + "id": "fefc70cd-e4e3-4829-a71a-bc6a0dcc7214", "prevId": "00000000-0000-0000-0000-000000000000", "tables": { "asset": { @@ -1199,22 +1199,36 @@ "notNull": true, "autoincrement": false }, - "active_expires": { - "name": "active_expires", - "type": "integer", + "user_id": { + "name": "user_id", + "type": "text", "primaryKey": false, "notNull": true, "autoincrement": false }, - "idle_expires": { - "name": "idle_expires", - "type": "integer", + "expires_at": { + "name": "expires_at", + "type": "text", "primaryKey": false, "notNull": true, "autoincrement": false }, - "user_id": { - "name": "user_id", + "user_agent": { + "name": "user_agent", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "country_code": { + "name": "country_code", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "ip_address": { + "name": "ip_address", "type": "text", "primaryKey": false, "notNull": true, diff --git a/src/v2/db/migrations/meta/_journal.json b/src/v2/db/migrations/meta/_journal.json index 912f9d9..3490e76 100644 --- a/src/v2/db/migrations/meta/_journal.json +++ b/src/v2/db/migrations/meta/_journal.json @@ -5,8 +5,8 @@ { "idx": 0, "version": "5", - "when": 1702062637541, - "tag": "0000_jittery_hardball", + "when": 1702070538818, + "tag": "0000_tiny_human_fly", "breakpoints": true } ] diff --git a/src/v2/db/schema/user/user.ts b/src/v2/db/schema/user/user.ts index 6707f63..c951a36 100644 --- a/src/v2/db/schema/user/user.ts +++ b/src/v2/db/schema/user/user.ts @@ -89,18 +89,27 @@ export const authCredentials = sqliteTable( export type Keys = typeof authCredentials.$inferSelect export type NewKeys = typeof authCredentials.$inferInsert +// interface Session extends SessionAttributes { +// id: string; +// userId: string; +// expiresAt: Date; +// fresh: boolean; +// } + export const userSession = sqliteTable( tableNames.authSession, { id: text("id").unique().notNull(), - activeExpires: integer("active_expires").notNull(), - idleExpires: integer("idle_expires").notNull(), userId: text("user_id") .notNull() .references(() => authUser.id, { onUpdate: "cascade", onDelete: "cascade", }), + expiresAt: text("expires_at").notNull(), + userAgent: text("user_agent").notNull(), + countryCode: text("country_code").notNull(), + ipAddress: text("ip_address").notNull(), }, (session) => { return { diff --git a/src/v2/lib/auth/definitions/auth-definitions.ts b/src/v2/lib/auth/definitions/auth-definitions.ts index b872f06..8e3c92b 100644 --- a/src/v2/lib/auth/definitions/auth-definitions.ts +++ b/src/v2/lib/auth/definitions/auth-definitions.ts @@ -1,8 +1,8 @@ -import { luciaAuth } from "../lucia" +import type { LuciaAuth } from "../lucia" declare module "lucia" { interface Register { - Lucia: typeof luciaAuth + Lucia: LuciaAuth DatabaseUserAttributes: { avatar_url: string | null banner_url: string | null diff --git a/src/v2/lib/auth/lucia.ts b/src/v2/lib/auth/lucia.ts index 7920314..49111f5 100644 --- a/src/v2/lib/auth/lucia.ts +++ b/src/v2/lib/auth/lucia.ts @@ -50,4 +50,4 @@ export function luciaAuth(env: Bindings) { ) } -export type Auth = ReturnType +export type LuciaAuth = ReturnType diff --git a/src/v2/lib/managers/auth/user-auth.ts b/src/v2/lib/managers/auth/user-auth-manager.ts similarity index 83% rename from src/v2/lib/managers/auth/user-auth.ts rename to src/v2/lib/managers/auth/user-auth-manager.ts index 513eefd..ee141f4 100644 --- a/src/v2/lib/managers/auth/user-auth.ts +++ b/src/v2/lib/managers/auth/user-auth-manager.ts @@ -1,5 +1,5 @@ import { luciaAuth } from "../../auth/lucia" -import { Scrypt } from "oslo/password" +import { Scrypt } from "lucia" import { getConnection } from "@/v2/db/turso" import { authCredentials, authUser } from "@/v2/db/schema" import { createInsertSchema } from "drizzle-zod" @@ -13,10 +13,13 @@ const authUserInsertSchema = createInsertSchema(authUser).pick({ }) export class UserAuthenticationManager { - constructor(private ctx: APIContext) {} - private lucia = luciaAuth(this.ctx.env as Bindings) - private drizzle = getConnection(this.ctx.env).drizzle + private lucia: ReturnType + private drizzle: ReturnType["drizzle"] + constructor(private ctx: APIContext) { + this.lucia = luciaAuth(this.ctx.env) + this.drizzle = getConnection(this.ctx.env).drizzle + } public async createAccount( attributes: Required>, password?: string @@ -79,9 +82,20 @@ export class UserAuthenticationManager { .from(authCredentials) .where(eq(authCredentials.userId, foundUser.id)) - if ( - !(await new Scrypt().verify(password, credentials.hashedPassword)) - ) { + if (!credentials) { + return null + } + + console.log(credentials, password) + + const validPassword = await new Scrypt().verify( + credentials.hashedPassword, + password + ) + + console.log(validPassword) + + if (!validPassword) { return null } diff --git a/src/v2/lib/managers/auth/user-session-manager.ts b/src/v2/lib/managers/auth/user-session-manager.ts new file mode 100644 index 0000000..b32cdd5 --- /dev/null +++ b/src/v2/lib/managers/auth/user-session-manager.ts @@ -0,0 +1,81 @@ +import { luciaAuth } from "../../auth/lucia" +import { getConnection } from "@/v2/db/turso" +import { getCookie } from "hono/cookie" +export class AuthSessionManager { + private lucia: ReturnType + private drizzle: ReturnType["drizzle"] + + constructor(private ctx: APIContext) { + this.lucia = luciaAuth(this.ctx.env) + this.drizzle = getConnection(this.ctx.env).drizzle + } + + public async validateSession() { + const sessionCookie = getCookie(this.ctx, this.lucia.sessionCookieName) + + if (!sessionCookie) { + return null + } + + const { user, session } = + await this.lucia.validateSession(sessionCookie) + + if (!session) { + return null + } + + return { user, session } + } + + public async getAllSessions() { + const sessionCookie = getCookie(this.ctx, this.lucia.sessionCookieName) + + if (!sessionCookie) { + return null + } + + const { user } = await this.lucia.validateSession(sessionCookie) + + if (!user) { + return null + } + + return await this.lucia.getUserSessions(user.id) + } + + public async invalidateCurrentSession() { + const sessionCookie = getCookie(this.ctx, this.lucia.sessionCookieName) + + if (!sessionCookie) { + return null + } + + const { session } = await this.lucia.validateSession(sessionCookie) + + if (!session) { + return null + } + + await this.lucia.invalidateSession(session.id) + + return true + } + + public async invalidateAllSessions() { + const sessionCookie = getCookie(this.ctx, this.lucia.sessionCookieName) + + if (!sessionCookie) { + return null + } + + const { user } = await this.lucia.validateSession(sessionCookie) + + if (!user) { + return null + } + + await this.lucia.invalidateUserSessions(user.id) + + return true + } +} diff --git a/src/v2/lib/managers/auth/user-session.ts b/src/v2/lib/managers/auth/user-session.ts deleted file mode 100644 index becfd30..0000000 --- a/src/v2/lib/managers/auth/user-session.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { luciaAuth } from "../../auth/lucia" -import { getConnection } from "@/v2/db/turso" - -export class AuthSessionManager { - constructor(private ctx: APIContext) {} - private lucia = luciaAuth(this.ctx.env as Bindings) - private drizzleInstance = getConnection(this.ctx.env).drizzle - - async validateSession(sessionId: string) { - return await this.lucia.validateSession(sessionId) - } -} diff --git a/src/v2/middleware/auth-user.ts b/src/v2/middleware/auth-user.ts deleted file mode 100644 index cbb1d41..0000000 --- a/src/v2/middleware/auth-user.ts +++ /dev/null @@ -1,36 +0,0 @@ -import type { Next } from "hono" -import { luciaAuth } from "@/v2/lib/auth/lucia" -import { getCookie } from "hono/cookie" - -export async function setUserVariable(ctx: APIContext, next: Next) { - const lucia = luciaAuth(ctx.env) - - const sessionId = getCookie(ctx, lucia.sessionCookieName) ?? null - - if (!sessionId) { - ctx.set("user", null) - return next() - } - - const { session, user } = await lucia.validateSession(sessionId) - - if (session && session.fresh) { - ctx.header( - "Set-Cookie", - lucia.createSessionCookie(session.id).serialize(), - { - append: true, - } - ) - } - - if (!session) { - ctx.header("Set-Cookie", lucia.createBlankSessionCookie().serialize(), { - append: true, - }) - } - - ctx.set("user", user) - - return next() -} diff --git a/src/v2/routes/auth/handler.ts b/src/v2/routes/auth/handler.ts index 756cb06..cd305d7 100644 --- a/src/v2/routes/auth/handler.ts +++ b/src/v2/routes/auth/handler.ts @@ -1,8 +1,19 @@ import { OpenAPIHono } from "@hono/zod-openapi" import SessionHandler from "@/v2/routes/auth/session/handler" +import LoginRoute from "@/v2/routes/auth/login/route" +import { cors } from "hono/cors" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() +handler.use( + "*", + cors({ + origin: "*", + credentials: true, + }) +) + handler.route("/session", SessionHandler) +handler.route("/login", LoginRoute) export default handler diff --git a/src/v2/routes/auth/login/openapi.ts b/src/v2/routes/auth/login/openapi.ts new file mode 100644 index 0000000..f76d81a --- /dev/null +++ b/src/v2/routes/auth/login/openapi.ts @@ -0,0 +1,27 @@ +import { createRoute } from "@hono/zod-openapi" +import { loginSchema } from "./schema" + +export const userLoginRoute = createRoute({ + path: "/", + method: "post", + description: "Login to a user with an email and password.", + tags: ["Auth"], + request: { + body: { + description: "The email and password of the user.", + content: { + "application/json": { + schema: loginSchema, + }, + }, + }, + }, + responses: { + 200: { + description: "Returns the user object or null.", + }, + 500: { + description: "Internal server error.", + }, + }, +}) diff --git a/src/v2/routes/auth/login/route.ts b/src/v2/routes/auth/login/route.ts new file mode 100644 index 0000000..7b556a5 --- /dev/null +++ b/src/v2/routes/auth/login/route.ts @@ -0,0 +1,51 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { userLoginRoute } from "./openapi" +import { UserAuthenticationManager } from "@/v2/lib/managers/auth/user-auth-manager" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.openapi(userLoginRoute, async (ctx) => { + const currentUser = "hi" + + if (currentUser) { + return ctx.json( + { + success: false, + error: "Already logged in", + }, + 401 + ) + } + + const { email, password } = ctx.req.valid("json") + + const userAuthManager = new UserAuthenticationManager(ctx) + + const newLoginCookie = await userAuthManager.loginViaPassword( + email, + password + ) + + if (!newLoginCookie) { + return ctx.json( + { + success: false, + error: "Invalid credentials", + }, + 401 + ) + } + + ctx.header("Set-Cookie", newLoginCookie.serialize(), { + append: true, + }) + + return ctx.json( + { + success: true, + }, + 200 + ) +}) + +export default handler diff --git a/src/v2/routes/auth/login/schema.ts b/src/v2/routes/auth/login/schema.ts new file mode 100644 index 0000000..6339388 --- /dev/null +++ b/src/v2/routes/auth/login/schema.ts @@ -0,0 +1,16 @@ +import { z } from "@hono/zod-openapi" + +export const loginSchema = z.object({ + email: z.string().min(3).max(32).openapi({ + description: "The email of the user.", + example: "user@domain.com", + }), + password: z.string().min(8).max(64).openapi({ + description: "The password of the user.", + example: "password1234", + }), + passwordConfirmation: z.string().min(8).max(64).openapi({ + description: "The password confirmation of the user.", + example: "password1234", + }), +}) diff --git a/src/v2/routes/auth/session/all/route.ts b/src/v2/routes/auth/session/all/route.ts index 8486f98..eb16eaa 100644 --- a/src/v2/routes/auth/session/all/route.ts +++ b/src/v2/routes/auth/session/all/route.ts @@ -1,15 +1,24 @@ import { OpenAPIHono } from "@hono/zod-openapi" import { authAllCurrentSessions } from "./openapi" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.openapi(authAllCurrentSessions, async (ctx) => { - const currentUser = ctx.get("user") + const authSessionManager = new AuthSessionManager(ctx) + + const sessions = await authSessionManager.getAllSessions() return ctx.json( { success: true, - currentUser: currentUser ? currentUser : null, + currentSessions: sessions.map((session) => { + return { + id: session.id, + expiresAt: session.expiresAt.toISOString(), + userAgent: session.userAgent, + } + }), }, 200 ) diff --git a/src/v2/routes/auth/session/validate/route.ts b/src/v2/routes/auth/session/validate/route.ts index 408af4c..8db2d7c 100644 --- a/src/v2/routes/auth/session/validate/route.ts +++ b/src/v2/routes/auth/session/validate/route.ts @@ -1,15 +1,18 @@ import { OpenAPIHono } from "@hono/zod-openapi" import { authValidationRoute } from "./openapi" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.openapi(authValidationRoute, async (ctx) => { - const currentUser = ctx.get("user") + const authSessionManager = new AuthSessionManager(ctx) + + const { user } = await authSessionManager.validateSession() return ctx.json( { success: true, - currentUser: currentUser ? currentUser : null, + user: user ? user : null, }, 200 ) diff --git a/src/worker-configuration.d.ts b/src/worker-configuration.d.ts index 3fbcaad..3a123ae 100644 --- a/src/worker-configuration.d.ts +++ b/src/worker-configuration.d.ts @@ -1,4 +1,3 @@ -import { User } from "lucia" import { Context } from "hono" declare global { @@ -19,15 +18,13 @@ declare global { } type Variables = { - user: User | null + // } - type Settings = { + export type APIContext = Context<{ Bindings: Bindings Variables: Variables - } - - export type APIContext = Context + }> } export default global From ceb7981622b56be7177e51d9bb83edc84843f30c Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Fri, 8 Dec 2023 22:31:11 +0000 Subject: [PATCH 183/318] auth create init --- src/v2/lib/managers/auth/user-auth-manager.ts | 25 ++++++- .../lib/managers/auth/user-session-manager.ts | 52 ++++++-------- .../lib/managers/user/user-search-manager.ts | 14 ++++ src/v2/routes/auth/create/openapi.ts | 26 +++++++ src/v2/routes/auth/create/route.ts | 69 +++++++++++++++++++ src/v2/routes/auth/create/schema.ts | 20 ++++++ src/v2/routes/auth/handler.ts | 2 + src/v2/routes/auth/login/openapi.ts | 1 - src/v2/routes/auth/login/route.ts | 7 +- 9 files changed, 180 insertions(+), 36 deletions(-) create mode 100644 src/v2/routes/auth/create/openapi.ts create mode 100644 src/v2/routes/auth/create/route.ts create mode 100644 src/v2/routes/auth/create/schema.ts diff --git a/src/v2/lib/managers/auth/user-auth-manager.ts b/src/v2/lib/managers/auth/user-auth-manager.ts index ee141f4..69bfe36 100644 --- a/src/v2/lib/managers/auth/user-auth-manager.ts +++ b/src/v2/lib/managers/auth/user-auth-manager.ts @@ -5,7 +5,7 @@ import { authCredentials, authUser } from "@/v2/db/schema" import { createInsertSchema } from "drizzle-zod" import { z } from "zod" import { generateID } from "../../oslo" -import { eq } from "drizzle-orm" +import { eq, or } from "drizzle-orm" const authUserInsertSchema = createInsertSchema(authUser).pick({ username: true, @@ -20,10 +20,33 @@ export class UserAuthenticationManager { this.lucia = luciaAuth(this.ctx.env) this.drizzle = getConnection(this.ctx.env).drizzle } + + private async checkForExistingUser( + attributes: Required> + ) { + const [existingUser] = await this.drizzle + .select({ id: authUser.id }) + .from(authUser) + .where( + or( + eq(authUser.username, attributes.username), + eq(authUser.email, attributes.email) + ) + ) + + return existingUser ? true : false + } + public async createAccount( attributes: Required>, password?: string ) { + const existingUser = await this.checkForExistingUser(attributes) + + if (existingUser) { + return null + } + const createUserTransaction = await this.drizzle.transaction( async (db) => { try { diff --git a/src/v2/lib/managers/auth/user-session-manager.ts b/src/v2/lib/managers/auth/user-session-manager.ts index b32cdd5..c02820b 100644 --- a/src/v2/lib/managers/auth/user-session-manager.ts +++ b/src/v2/lib/managers/auth/user-session-manager.ts @@ -1,40 +1,40 @@ import { luciaAuth } from "../../auth/lucia" import { getConnection } from "@/v2/db/turso" +import type { User, Session } from "lucia" import { getCookie } from "hono/cookie" + export class AuthSessionManager { private lucia: ReturnType private drizzle: ReturnType["drizzle"] + private sessionCookie: string | undefined constructor(private ctx: APIContext) { this.lucia = luciaAuth(this.ctx.env) this.drizzle = getConnection(this.ctx.env).drizzle + this.sessionCookie = getCookie(this.ctx, this.lucia.sessionCookieName) } - public async validateSession() { - const sessionCookie = getCookie(this.ctx, this.lucia.sessionCookieName) - - if (!sessionCookie) { - return null + private async validateAndGetSession(): Promise<{ + user: User | null + session: Session | null + }> { + if (!this.sessionCookie) { + return { user: null, session: null } } - const { user, session } = - await this.lucia.validateSession(sessionCookie) + const { user, session } = await this.lucia.validateSession( + this.sessionCookie + ) - if (!session) { - return null - } + return { user: user ? user : null, session: session ? session : null } + } - return { user, session } + public async validateSession() { + return this.validateAndGetSession() } public async getAllSessions() { - const sessionCookie = getCookie(this.ctx, this.lucia.sessionCookieName) - - if (!sessionCookie) { - return null - } - - const { user } = await this.lucia.validateSession(sessionCookie) + const { user } = await this.validateAndGetSession() if (!user) { return null @@ -44,13 +44,7 @@ export class AuthSessionManager { } public async invalidateCurrentSession() { - const sessionCookie = getCookie(this.ctx, this.lucia.sessionCookieName) - - if (!sessionCookie) { - return null - } - - const { session } = await this.lucia.validateSession(sessionCookie) + const { session } = await this.validateAndGetSession() if (!session) { return null @@ -62,13 +56,7 @@ export class AuthSessionManager { } public async invalidateAllSessions() { - const sessionCookie = getCookie(this.ctx, this.lucia.sessionCookieName) - - if (!sessionCookie) { - return null - } - - const { user } = await this.lucia.validateSession(sessionCookie) + const { user } = await this.validateAndGetSession() if (!user) { return null diff --git a/src/v2/lib/managers/user/user-search-manager.ts b/src/v2/lib/managers/user/user-search-manager.ts index a54e153..9241fc2 100644 --- a/src/v2/lib/managers/user/user-search-manager.ts +++ b/src/v2/lib/managers/user/user-search-manager.ts @@ -29,6 +29,20 @@ export class UserSearchManager { } } + public async getUserByEmail(email: string): Promise { + try { + const [user] = await this.drizzle + .select() + .from(authUser) + .where(eq(authUser.email, email)) + + return user ?? null + } catch (e) { + console.error(`Error getting user by email ${email}`, e) + throw new Error(`Error getting user by email ${email}`) + } + } + /** * Retrieves a user by their username. * diff --git a/src/v2/routes/auth/create/openapi.ts b/src/v2/routes/auth/create/openapi.ts new file mode 100644 index 0000000..1837056 --- /dev/null +++ b/src/v2/routes/auth/create/openapi.ts @@ -0,0 +1,26 @@ +import { createRoute } from "@hono/zod-openapi" +import { createAccountSchema } from "./schema" + +export const userCreateAccountRoute = createRoute({ + path: "/", + method: "post", + description: "Create a new user account with an email and password.", + tags: ["Auth"], + request: { + body: { + content: { + "application/json": { + schema: createAccountSchema, + }, + }, + }, + }, + responses: { + 200: { + description: "Returns the user object or null.", + }, + 500: { + description: "Internal server error.", + }, + }, +}) diff --git a/src/v2/routes/auth/create/route.ts b/src/v2/routes/auth/create/route.ts new file mode 100644 index 0000000..1fe3d75 --- /dev/null +++ b/src/v2/routes/auth/create/route.ts @@ -0,0 +1,69 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { userCreateAccountRoute } from "./openapi" +import { UserAuthenticationManager } from "@/v2/lib/managers/auth/user-auth-manager" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.openapi(userCreateAccountRoute, async (ctx) => { + const authSessionManager = new AuthSessionManager(ctx) + + const { user } = await authSessionManager.validateSession() + + if (user) { + return ctx.json( + { + success: false, + error: "Already logged in", + }, + 401 + ) + } + + const { email, password, username } = ctx.req.valid("json") + + const userAuthManager = new UserAuthenticationManager(ctx) + + const existingUser = false + + if (existingUser) { + return ctx.json( + { + success: false, + error: "User already exists with that email", + }, + 400 + ) + } + + const newLoginCookie = await userAuthManager.createAccount( + { + email, + username, + }, + password + ) + + if (!newLoginCookie) { + return ctx.json( + { + success: false, + error: "Failed to create account", + }, + 500 + ) + } + + ctx.header("Set-Cookie", newLoginCookie.serialize(), { + append: true, + }) + + return ctx.json( + { + success: true, + }, + 200 + ) +}) + +export default handler diff --git a/src/v2/routes/auth/create/schema.ts b/src/v2/routes/auth/create/schema.ts new file mode 100644 index 0000000..e4a4664 --- /dev/null +++ b/src/v2/routes/auth/create/schema.ts @@ -0,0 +1,20 @@ +import { z } from "@hono/zod-openapi" + +export const createAccountSchema = z.object({ + username: z.string().min(3).max(32).openapi({ + description: "The username of the user.", + example: "user", + }), + email: z.string().min(3).max(32).openapi({ + description: "The email of the user.", + example: "user@domain.com", + }), + password: z.string().min(8).max(64).openapi({ + description: "The password of the user.", + example: "password1234", + }), + passwordConfirmation: z.string().min(8).max(64).openapi({ + description: "The password confirmation of the user.", + example: "password1234", + }), +}) diff --git a/src/v2/routes/auth/handler.ts b/src/v2/routes/auth/handler.ts index cd305d7..e43ff6f 100644 --- a/src/v2/routes/auth/handler.ts +++ b/src/v2/routes/auth/handler.ts @@ -1,6 +1,7 @@ import { OpenAPIHono } from "@hono/zod-openapi" import SessionHandler from "@/v2/routes/auth/session/handler" import LoginRoute from "@/v2/routes/auth/login/route" +import CreateAccountRoute from "@/v2/routes/auth/create/route" import { cors } from "hono/cors" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() @@ -15,5 +16,6 @@ handler.use( handler.route("/session", SessionHandler) handler.route("/login", LoginRoute) +handler.route("/create", CreateAccountRoute) export default handler diff --git a/src/v2/routes/auth/login/openapi.ts b/src/v2/routes/auth/login/openapi.ts index f76d81a..0082728 100644 --- a/src/v2/routes/auth/login/openapi.ts +++ b/src/v2/routes/auth/login/openapi.ts @@ -8,7 +8,6 @@ export const userLoginRoute = createRoute({ tags: ["Auth"], request: { body: { - description: "The email and password of the user.", content: { "application/json": { schema: loginSchema, diff --git a/src/v2/routes/auth/login/route.ts b/src/v2/routes/auth/login/route.ts index 7b556a5..b99ee2b 100644 --- a/src/v2/routes/auth/login/route.ts +++ b/src/v2/routes/auth/login/route.ts @@ -1,13 +1,16 @@ import { OpenAPIHono } from "@hono/zod-openapi" import { userLoginRoute } from "./openapi" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" import { UserAuthenticationManager } from "@/v2/lib/managers/auth/user-auth-manager" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.openapi(userLoginRoute, async (ctx) => { - const currentUser = "hi" + const authSessionManager = new AuthSessionManager(ctx) - if (currentUser) { + const { user } = await authSessionManager.validateSession() + + if (user) { return ctx.json( { success: false, From afa0954bb2828ab63bda39b5c6ad2b2949935436 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Fri, 8 Dec 2023 22:39:55 +0000 Subject: [PATCH 184/318] psa: dont log passwords in prod --- src/v2/lib/managers/auth/user-auth-manager.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/v2/lib/managers/auth/user-auth-manager.ts b/src/v2/lib/managers/auth/user-auth-manager.ts index 69bfe36..7152f21 100644 --- a/src/v2/lib/managers/auth/user-auth-manager.ts +++ b/src/v2/lib/managers/auth/user-auth-manager.ts @@ -109,15 +109,11 @@ export class UserAuthenticationManager { return null } - console.log(credentials, password) - const validPassword = await new Scrypt().verify( credentials.hashedPassword, password ) - console.log(validPassword) - if (!validPassword) { return null } From a4b79f2f6ce9204532f8bb43956f18f8951583ed Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Mon, 11 Dec 2023 18:31:08 +0000 Subject: [PATCH 185/318] refactor time --- .eslintrc.json | 5 +- package.json | 1 + src/index.ts | 14 +++++ src/scripts/seed/seed.ts | 10 ++-- .../categories/asset-categories-likes.ts | 2 +- src/v2/db/schema/game/game-likes.ts | 2 +- src/v2/db/schema/tags/asset-tags-likes.ts | 2 +- src/v2/db/schema/user/user-connections.ts | 2 +- .../asset-category/asset-category-likes.ts | 2 +- .../asset-category/asset-category-manager.ts | 2 +- .../game-asset-category-manager.ts | 2 +- src/v2/lib/managers/asset/asset-likes.ts | 2 +- src/v2/lib/managers/asset/asset-manager.ts | 2 +- src/v2/lib/managers/auth/user-auth-manager.ts | 57 ++++++++----------- .../lib/managers/auth/user-session-manager.ts | 2 +- .../managers/collection/collection-likes.ts | 2 +- .../managers/collection/collection-manager.ts | 6 +- .../lib/managers/favorite/favorite-manager.ts | 6 +- src/v2/lib/managers/game/game-likes.ts | 2 +- src/v2/lib/managers/game/game-manager.ts | 2 +- src/v2/lib/managers/tag/tag-likes.ts | 2 +- src/v2/lib/managers/tag/tag-manager.ts | 2 +- .../lib/managers/user/user-search-manager.ts | 2 +- src/v2/lib/oslo.ts | 2 +- src/v2/lib/resend/email.ts | 2 +- src/v2/middleware/time-taken.ts | 7 +++ src/worker-configuration.d.ts | 1 + 27 files changed, 80 insertions(+), 63 deletions(-) create mode 100644 src/v2/middleware/time-taken.ts diff --git a/.eslintrc.json b/.eslintrc.json index 313ca75..3e8583d 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -5,8 +5,9 @@ "plugins": ["json"], "rules": { "no-const-assign": "error", - "camelcase": "off", // it complains becuase of zod, idk how to fix it - "no-extra-semi": "error" + "no-extra-semi": "error", + "no-unreachable": "error" + // "sort-imports": "error" }, "parserOptions": { "allowImportExportEverywhere": true, diff --git a/package.json b/package.json index 635dc98..306e3fb 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "wrangler:dev:remote": "wrangler dev --remote", "wrangler:publish": "wrangler publish --minify", "lint": "eslint . --ext .ts", + "lint:fix": "eslint . --ext .ts --fix", "typecheck": "tsc --noEmit", "prettier:format": "prettier --write .", "prettier:check": "prettier --check .", diff --git a/src/index.ts b/src/index.ts index 3975f17..2f23129 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,6 +5,7 @@ import BaseRoutes from "@/v2/routes/handler" import { OpenAPIConfig } from "./openapi/config" import { csrfValidation } from "./v2/middleware/csrf" +import { LogTime } from "./v2/middleware/time-taken" const app = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() @@ -18,9 +19,22 @@ app.get( ) app.use("*", csrfValidation) +app.use("*", LogTime) app.use("*", prettyJSON()) app.doc("/openapi", OpenAPIConfig) +app.onError((err, ctx) => { + console.error(err) + // TODO: error logging + return ctx.json( + { + success: false, + error: "Internal Server Error", + }, + 500 + ) +}) + export default app diff --git a/src/scripts/seed/seed.ts b/src/scripts/seed/seed.ts index 1ce1335..7e31254 100644 --- a/src/scripts/seed/seed.ts +++ b/src/scripts/seed/seed.ts @@ -3,18 +3,18 @@ import { createClient } from "@libsql/client" import "dotenv/config" import { asset, - game, - gameAssetCategory, assetCategory, assetTag, assetTagAsset, + authCredentials, authUser, - userFollowing, + game, + gameAssetCategory, userCollection, userCollectionAsset, - userFavoriteAsset, userFavorite, - authCredentials, + userFavoriteAsset, + userFollowing, } from "@/v2/db/schema" import { generateID } from "@/v2/lib/oslo" import { Scrypt } from "lucia" diff --git a/src/v2/db/schema/categories/asset-categories-likes.ts b/src/v2/db/schema/categories/asset-categories-likes.ts index 32b5b92..bc61c31 100644 --- a/src/v2/db/schema/categories/asset-categories-likes.ts +++ b/src/v2/db/schema/categories/asset-categories-likes.ts @@ -1,6 +1,6 @@ import { tableNames } from "@/v2/db/drizzle" import { relations } from "drizzle-orm" -import { sqliteTable, text, index } from "drizzle-orm/sqlite-core" +import { index, sqliteTable, text } from "drizzle-orm/sqlite-core" import { authUser } from "../user/user" import { assetCategory } from "./asset-categories" diff --git a/src/v2/db/schema/game/game-likes.ts b/src/v2/db/schema/game/game-likes.ts index 5040ae4..074d368 100644 --- a/src/v2/db/schema/game/game-likes.ts +++ b/src/v2/db/schema/game/game-likes.ts @@ -1,6 +1,6 @@ import { tableNames } from "@/v2/db/drizzle" import { relations } from "drizzle-orm" -import { sqliteTable, text, index } from "drizzle-orm/sqlite-core" +import { index, sqliteTable, text } from "drizzle-orm/sqlite-core" import { authUser } from "../user/user" import { game } from "./game" diff --git a/src/v2/db/schema/tags/asset-tags-likes.ts b/src/v2/db/schema/tags/asset-tags-likes.ts index 3966849..056bcee 100644 --- a/src/v2/db/schema/tags/asset-tags-likes.ts +++ b/src/v2/db/schema/tags/asset-tags-likes.ts @@ -1,6 +1,6 @@ import { tableNames } from "@/v2/db/drizzle" import { relations } from "drizzle-orm" -import { sqliteTable, text, index } from "drizzle-orm/sqlite-core" +import { index, sqliteTable, text } from "drizzle-orm/sqlite-core" import { authUser } from "../user/user" import { assetTag } from "./asset-tags" diff --git a/src/v2/db/schema/user/user-connections.ts b/src/v2/db/schema/user/user-connections.ts index bff1bf7..cda63f3 100644 --- a/src/v2/db/schema/user/user-connections.ts +++ b/src/v2/db/schema/user/user-connections.ts @@ -1,6 +1,6 @@ import { tableNames } from "@/v2/db/drizzle" import { relations } from "drizzle-orm" -import { sqliteTable, text, index } from "drizzle-orm/sqlite-core" +import { index, sqliteTable, text } from "drizzle-orm/sqlite-core" import { authUser } from "./user" /* diff --git a/src/v2/lib/managers/asset-category/asset-category-likes.ts b/src/v2/lib/managers/asset-category/asset-category-likes.ts index a72a03c..cc5a176 100644 --- a/src/v2/lib/managers/asset-category/asset-category-likes.ts +++ b/src/v2/lib/managers/asset-category/asset-category-likes.ts @@ -1,5 +1,5 @@ import { DrizzleInstance } from "@/v2/db/turso" -import { eq, and } from "drizzle-orm" +import { and, eq } from "drizzle-orm" import { assetCategoryLikes } from "@/v2/db/schema/categories/asset-categories-likes" export class AssetCategoryLikesManager { diff --git a/src/v2/lib/managers/asset-category/asset-category-manager.ts b/src/v2/lib/managers/asset-category/asset-category-manager.ts index bfa8882..9519971 100644 --- a/src/v2/lib/managers/asset-category/asset-category-manager.ts +++ b/src/v2/lib/managers/asset-category/asset-category-manager.ts @@ -1,6 +1,6 @@ import { DrizzleInstance } from "@/v2/db/turso" import { assetCategory } from "@/v2/db/schema" -import { eq, or, like } from "drizzle-orm" +import { eq, like, or } from "drizzle-orm" import { z } from "zod" import type { AssetCategory, NewAssetCategory } from "@/v2/db/schema" diff --git a/src/v2/lib/managers/asset-category/game-asset-category-manager.ts b/src/v2/lib/managers/asset-category/game-asset-category-manager.ts index 3abe24c..79a3468 100644 --- a/src/v2/lib/managers/asset-category/game-asset-category-manager.ts +++ b/src/v2/lib/managers/asset-category/game-asset-category-manager.ts @@ -1,6 +1,6 @@ import { DrizzleInstance } from "@/v2/db/turso" import { gameAssetCategory } from "@/v2/db/schema" -import { eq, and } from "drizzle-orm" +import { and, eq } from "drizzle-orm" import type { GameAssetCategory } from "@/v2/db/schema" /** diff --git a/src/v2/lib/managers/asset/asset-likes.ts b/src/v2/lib/managers/asset/asset-likes.ts index 8704165..ae446bb 100644 --- a/src/v2/lib/managers/asset/asset-likes.ts +++ b/src/v2/lib/managers/asset/asset-likes.ts @@ -1,5 +1,5 @@ import { DrizzleInstance } from "@/v2/db/turso" -import { eq, and } from "drizzle-orm" +import { and, eq } from "drizzle-orm" import { assetLikes } from "@/v2/db/schema/asset/asset-likes" export class AssetLikesManager { diff --git a/src/v2/lib/managers/asset/asset-manager.ts b/src/v2/lib/managers/asset/asset-manager.ts index b22e46e..90a21f9 100644 --- a/src/v2/lib/managers/asset/asset-manager.ts +++ b/src/v2/lib/managers/asset/asset-manager.ts @@ -6,7 +6,7 @@ import { assetTagAsset, game, } from "@/v2/db/schema" -import { eq, or, sql, not } from "drizzle-orm" +import { eq, not, or, sql } from "drizzle-orm" import { R2Bucket } from "@cloudflare/workers-types" import { SplitQueryByCommas } from "../../helpers/split-query-by-commas" import { z } from "zod" diff --git a/src/v2/lib/managers/auth/user-auth-manager.ts b/src/v2/lib/managers/auth/user-auth-manager.ts index 7152f21..6aadfda 100644 --- a/src/v2/lib/managers/auth/user-auth-manager.ts +++ b/src/v2/lib/managers/auth/user-auth-manager.ts @@ -12,6 +12,10 @@ const authUserInsertSchema = createInsertSchema(authUser).pick({ email: true, }) +const USER_AGENT = "user-agent" +const CONNECTING_IP = "cf-connecting-ip" +const IP_COUNTRY = "cf-ipcountry" + export class UserAuthenticationManager { private lucia: ReturnType private drizzle: ReturnType["drizzle"] @@ -37,6 +41,16 @@ export class UserAuthenticationManager { return existingUser ? true : false } + private async createSessionAndCookie(userId: string) { + const newSession = await this.lucia.createSession(userId, { + user_agent: this.ctx.req.header(USER_AGENT) || "", + ip_address: this.ctx.req.header(CONNECTING_IP) || "", + country_code: this.ctx.req.header(IP_COUNTRY) || "", + }) + + return this.lucia.createSessionCookie(newSession.id) + } + public async createAccount( attributes: Required>, password?: string @@ -47,9 +61,10 @@ export class UserAuthenticationManager { return null } - const createUserTransaction = await this.drizzle.transaction( - async (db) => { - try { + let newUser: typeof authUser.$inferSelect + try { + const createUserTransaction = await this.drizzle.transaction( + async (db) => { const [newUser] = await db .insert(authUser) .values({ @@ -68,26 +83,14 @@ export class UserAuthenticationManager { } return newUser - } catch (e) { - await db.rollback() } - } - ) - - const newSession = await this.lucia.createSession( - createUserTransaction.id, - { - user_agent: this.ctx.req.header("user-agent") || "", - ip_address: this.ctx.req.header("cf-connecting-ip") || "", - country_code: this.ctx.req.header("cf-ipcountry") || "", - } - ) - - const newSessionCookie = await this.lucia.createSessionCookie( - newSession.id - ) + ) + newUser = createUserTransaction + } catch (e) { + throw new Error("Failed to create user") + } - return newSessionCookie + return this.createSessionAndCookie(newUser.id) } public async loginViaPassword(email: string, password: string) { @@ -118,16 +121,6 @@ export class UserAuthenticationManager { return null } - const newSession = await this.lucia.createSession(foundUser.id, { - user_agent: this.ctx.req.header("user-agent") || "", - ip_address: this.ctx.req.header("cf-connecting-ip") || "", - country_code: this.ctx.req.header("cf-ipcountry") || "", - }) - - const newSessionCookie = await this.lucia.createSessionCookie( - newSession.id - ) - - return newSessionCookie + return this.createSessionAndCookie(foundUser.id) } } diff --git a/src/v2/lib/managers/auth/user-session-manager.ts b/src/v2/lib/managers/auth/user-session-manager.ts index c02820b..1ac5920 100644 --- a/src/v2/lib/managers/auth/user-session-manager.ts +++ b/src/v2/lib/managers/auth/user-session-manager.ts @@ -1,6 +1,6 @@ import { luciaAuth } from "../../auth/lucia" import { getConnection } from "@/v2/db/turso" -import type { User, Session } from "lucia" +import type { Session, User } from "lucia" import { getCookie } from "hono/cookie" export class AuthSessionManager { diff --git a/src/v2/lib/managers/collection/collection-likes.ts b/src/v2/lib/managers/collection/collection-likes.ts index 0e35275..f5b777b 100644 --- a/src/v2/lib/managers/collection/collection-likes.ts +++ b/src/v2/lib/managers/collection/collection-likes.ts @@ -1,5 +1,5 @@ import { DrizzleInstance } from "@/v2/db/turso" -import { eq, and } from "drizzle-orm" +import { and, eq } from "drizzle-orm" import { userCollectionLikes } from "@/v2/db/schema/collections/user-collection-likes" export class UserCollectionLikesManager { diff --git a/src/v2/lib/managers/collection/collection-manager.ts b/src/v2/lib/managers/collection/collection-manager.ts index 50c8abb..d0776bb 100644 --- a/src/v2/lib/managers/collection/collection-manager.ts +++ b/src/v2/lib/managers/collection/collection-manager.ts @@ -1,12 +1,12 @@ import { DrizzleInstance } from "@/v2/db/turso" import { userCollection, userCollectionAsset } from "@/v2/db/schema" -import { eq, like, and } from "drizzle-orm" +import { and, eq, like } from "drizzle-orm" import { z } from "zod" import type { - UserCollection, NewUserCollection, - UserCollectionAsset, NewUserCollectionAsset, + UserCollection, + UserCollectionAsset, } from "@/v2/db/schema" const insertCollectionSchema = z.object({ diff --git a/src/v2/lib/managers/favorite/favorite-manager.ts b/src/v2/lib/managers/favorite/favorite-manager.ts index 4d8850f..6f7da71 100644 --- a/src/v2/lib/managers/favorite/favorite-manager.ts +++ b/src/v2/lib/managers/favorite/favorite-manager.ts @@ -1,11 +1,11 @@ import { userFavorite, userFavoriteAsset } from "@/v2/db/schema" -import { eq, and } from "drizzle-orm" +import { and, eq } from "drizzle-orm" import { DrizzleInstance } from "@/v2/db/turso" import type { - UserFavorite, - UserFavoriteAsset, NewUserFavorite, NewUserFavoriteAsset, + UserFavorite, + UserFavoriteAsset, } from "@/v2/db/schema" /** diff --git a/src/v2/lib/managers/game/game-likes.ts b/src/v2/lib/managers/game/game-likes.ts index 69fa05d..36c20a5 100644 --- a/src/v2/lib/managers/game/game-likes.ts +++ b/src/v2/lib/managers/game/game-likes.ts @@ -1,5 +1,5 @@ import { DrizzleInstance } from "@/v2/db/turso" -import { eq, and } from "drizzle-orm" +import { and, eq } from "drizzle-orm" import { gameLikes } from "@/v2/db/schema/game/game-likes" export class GameLikesManager { diff --git a/src/v2/lib/managers/game/game-manager.ts b/src/v2/lib/managers/game/game-manager.ts index 7b452f1..34112e3 100644 --- a/src/v2/lib/managers/game/game-manager.ts +++ b/src/v2/lib/managers/game/game-manager.ts @@ -1,6 +1,6 @@ import { DrizzleInstance } from "@/v2/db/turso" import { game } from "@/v2/db/schema" -import { eq, or, like } from "drizzle-orm" +import { eq, like, or } from "drizzle-orm" import type { Game } from "@/v2/db/schema" /** diff --git a/src/v2/lib/managers/tag/tag-likes.ts b/src/v2/lib/managers/tag/tag-likes.ts index d0794db..3bbf5c9 100644 --- a/src/v2/lib/managers/tag/tag-likes.ts +++ b/src/v2/lib/managers/tag/tag-likes.ts @@ -1,5 +1,5 @@ import { DrizzleInstance } from "@/v2/db/turso" -import { eq, and } from "drizzle-orm" +import { and, eq } from "drizzle-orm" import { assetTagLikes } from "@/v2/db/schema/tags/asset-tags-likes" export class AssetTagLikesManager { diff --git a/src/v2/lib/managers/tag/tag-manager.ts b/src/v2/lib/managers/tag/tag-manager.ts index 5d14674..d1edee4 100644 --- a/src/v2/lib/managers/tag/tag-manager.ts +++ b/src/v2/lib/managers/tag/tag-manager.ts @@ -1,6 +1,6 @@ import { DrizzleInstance } from "@/v2/db/turso" import { assetTag } from "@/v2/db/schema" -import { eq, or, like } from "drizzle-orm" +import { eq, like, or } from "drizzle-orm" import { z } from "zod" import type { AssetTag, NewAssetTag } from "@/v2/db/schema" diff --git a/src/v2/lib/managers/user/user-search-manager.ts b/src/v2/lib/managers/user/user-search-manager.ts index 9241fc2..863f082 100644 --- a/src/v2/lib/managers/user/user-search-manager.ts +++ b/src/v2/lib/managers/user/user-search-manager.ts @@ -1,6 +1,6 @@ import { DrizzleInstance } from "@/v2/db/turso" import { authUser } from "@/v2/db/schema" -import { eq, or, like } from "drizzle-orm" +import { eq, like, or } from "drizzle-orm" import type { User } from "@/v2/db/schema" /** diff --git a/src/v2/lib/oslo.ts b/src/v2/lib/oslo.ts index 6bf9a79..749fb24 100644 --- a/src/v2/lib/oslo.ts +++ b/src/v2/lib/oslo.ts @@ -1,4 +1,4 @@ -import { generateRandomString, alphabet } from "oslo/random" +import { alphabet, generateRandomString } from "oslo/random" export function generateID(length: number = 15) { return generateRandomString(length, alphabet("a-z", "0-9")).toLowerCase() diff --git a/src/v2/lib/resend/email.ts b/src/v2/lib/resend/email.ts index 7c766e2..e994e6f 100644 --- a/src/v2/lib/resend/email.ts +++ b/src/v2/lib/resend/email.ts @@ -1,4 +1,4 @@ -import { Resend, type EmailData } from "@/v2/lib/resend/wrapper" +import { type EmailData, Resend } from "@/v2/lib/resend/wrapper" import type { Context } from "hono" const emailFrom = "Test " diff --git a/src/v2/middleware/time-taken.ts b/src/v2/middleware/time-taken.ts new file mode 100644 index 0000000..aefdfae --- /dev/null +++ b/src/v2/middleware/time-taken.ts @@ -0,0 +1,7 @@ +import type { Next } from "hono" + +export async function LogTime(ctx: APIContext, next: Next): Promise { + const start = Date.now() + await next() + ctx.res.headers.set("x-response-time", `${Date.now() - start}ms`) +} diff --git a/src/worker-configuration.d.ts b/src/worker-configuration.d.ts index 3a123ae..d74a499 100644 --- a/src/worker-configuration.d.ts +++ b/src/worker-configuration.d.ts @@ -15,6 +15,7 @@ declare global { DISCORD_CLIENT_SECRET: string DISCORD_REDIRECT_URI: string RESEND_API_KEY: string + AXIOM_TOKEN: string } type Variables = { From 82f2e2fe1d634d428b5de8923561c6a41988ccba Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Wed, 13 Dec 2023 20:47:54 +0000 Subject: [PATCH 186/318] update authUser properties --- src/v2/db/migrations/0000_tiny_human_fly.sql | 306 --- src/v2/db/migrations/meta/0000_snapshot.json | 1843 ------------------ src/v2/db/migrations/meta/_journal.json | 13 - src/v2/db/schema/user/user.ts | 9 +- src/worker-configuration.d.ts | 1 - 5 files changed, 8 insertions(+), 2164 deletions(-) delete mode 100644 src/v2/db/migrations/0000_tiny_human_fly.sql delete mode 100644 src/v2/db/migrations/meta/0000_snapshot.json delete mode 100644 src/v2/db/migrations/meta/_journal.json diff --git a/src/v2/db/migrations/0000_tiny_human_fly.sql b/src/v2/db/migrations/0000_tiny_human_fly.sql deleted file mode 100644 index ea65136..0000000 --- a/src/v2/db/migrations/0000_tiny_human_fly.sql +++ /dev/null @@ -1,306 +0,0 @@ -CREATE TABLE `asset` ( - `id` integer PRIMARY KEY NOT NULL, - `name` text NOT NULL, - `extension` text NOT NULL, - `game` text NOT NULL, - `asset_category` text NOT NULL, - `uploaded_by_id` text NOT NULL, - `uploaded_by_name` text NOT NULL, - `url` text NOT NULL, - `status` text DEFAULT 'pending' NOT NULL, - `uploaded_date` text NOT NULL, - `asset_is_optimized` integer DEFAULT false NOT NULL, - `asset_is_suggestive` integer DEFAULT false NOT NULL, - `view_count` integer DEFAULT 0 NOT NULL, - `download_count` integer DEFAULT 0 NOT NULL, - `file_size` integer DEFAULT 0 NOT NULL, - `width` integer DEFAULT 0 NOT NULL, - `height` integer DEFAULT 0 NOT NULL, - FOREIGN KEY (`game`) REFERENCES `game`(`id`) ON UPDATE cascade ON DELETE cascade, - FOREIGN KEY (`asset_category`) REFERENCES `assetCategory`(`id`) ON UPDATE cascade ON DELETE cascade, - FOREIGN KEY (`uploaded_by_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade, - FOREIGN KEY (`uploaded_by_name`) REFERENCES `authUser`(`username`) ON UPDATE cascade ON DELETE cascade -); ---> statement-breakpoint -CREATE TABLE `atlas` ( - `id` text NOT NULL, - `url` text NOT NULL, - `uploaded_by` text NOT NULL, - `uploaded_by_name` text NOT NULL, - `uploaded_date` integer NOT NULL, - `file_size` integer DEFAULT 0 NOT NULL -); ---> statement-breakpoint -CREATE TABLE `atlasToAsset` ( - `id` text, - `atlas_id` text NOT NULL, - `asset_id` integer NOT NULL, - FOREIGN KEY (`atlas_id`) REFERENCES `atlas`(`id`) ON UPDATE cascade ON DELETE cascade, - FOREIGN KEY (`asset_id`) REFERENCES `asset`(`id`) ON UPDATE cascade ON DELETE cascade -); ---> statement-breakpoint -CREATE TABLE `assetLikes` ( - `asset_id` text NOT NULL, - `liked_by_id` text NOT NULL, - `created_at` text NOT NULL, - FOREIGN KEY (`asset_id`) REFERENCES `asset`(`id`) ON UPDATE no action ON DELETE no action, - FOREIGN KEY (`liked_by_id`) REFERENCES `authUser`(`id`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -CREATE TABLE `assetCategory` ( - `id` text NOT NULL, - `name` text NOT NULL, - `formatted_name` text NOT NULL, - `asset_count` integer DEFAULT 0 NOT NULL, - `last_updated` text NOT NULL -); ---> statement-breakpoint -CREATE TABLE `gameAssetCategory` ( - `game_id` text NOT NULL, - `asset_category_id` text NOT NULL, - FOREIGN KEY (`game_id`) REFERENCES `game`(`id`) ON UPDATE cascade ON DELETE cascade, - FOREIGN KEY (`asset_category_id`) REFERENCES `assetCategory`(`id`) ON UPDATE cascade ON DELETE cascade -); ---> statement-breakpoint -CREATE TABLE `assetCategoryLikes` ( - `asset_id` text NOT NULL, - `liked_by_id` text NOT NULL, - `created_at` text NOT NULL, - FOREIGN KEY (`asset_id`) REFERENCES `assetCategory`(`id`) ON UPDATE no action ON DELETE no action, - FOREIGN KEY (`liked_by_id`) REFERENCES `authUser`(`id`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -CREATE TABLE `game` ( - `id` text NOT NULL, - `name` text NOT NULL, - `formatted_name` text NOT NULL, - `asset_count` integer DEFAULT 0, - `possible_suggestive_content` integer DEFAULT 0 NOT NULL, - `last_updated` text NOT NULL -); ---> statement-breakpoint -CREATE TABLE `gameLikes` ( - `asset_id` text NOT NULL, - `liked_by_id` text NOT NULL, - `created_at` text NOT NULL, - FOREIGN KEY (`asset_id`) REFERENCES `game`(`id`) ON UPDATE no action ON DELETE no action, - FOREIGN KEY (`liked_by_id`) REFERENCES `authUser`(`id`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -CREATE TABLE `assetTag` ( - `id` text NOT NULL, - `name` text NOT NULL, - `formatted_name` text NOT NULL, - `asset_count` integer DEFAULT 0 NOT NULL, - `last_updated` text NOT NULL -); ---> statement-breakpoint -CREATE TABLE `assetTagAsset` ( - `asset_tag_id` text NOT NULL, - `asset_id` integer NOT NULL, - FOREIGN KEY (`asset_tag_id`) REFERENCES `assetTag`(`id`) ON UPDATE cascade ON DELETE cascade, - FOREIGN KEY (`asset_id`) REFERENCES `asset`(`id`) ON UPDATE cascade ON DELETE cascade -); ---> statement-breakpoint -CREATE TABLE `assetTagLikes` ( - `asset_id` text NOT NULL, - `liked_by_id` text NOT NULL, - `created_at` text NOT NULL, - FOREIGN KEY (`asset_id`) REFERENCES `assetTag`(`id`) ON UPDATE no action ON DELETE no action, - FOREIGN KEY (`liked_by_id`) REFERENCES `authUser`(`id`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -CREATE TABLE `savedOcGenerators` ( - `id` text NOT NULL, - `user_id` text NOT NULL, - `name` text NOT NULL, - `game` text NOT NULL, - `date_created` text NOT NULL, - `is_public` integer DEFAULT false NOT NULL, - `content` text NOT NULL, - `saved_color_palette` text, - `sakura_url` text, - FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade -); ---> statement-breakpoint -CREATE TABLE `authCredentials` ( - `id` text NOT NULL, - `user_id` text NOT NULL, - `hashed_password` text, - FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade -); ---> statement-breakpoint -CREATE TABLE `authUser` ( - `id` text NOT NULL, - `avatar_url` text, - `banner_url` text, - `display_name` text, - `username` text NOT NULL, - `username_colour` text, - `email` text NOT NULL, - `email_verified` integer DEFAULT 0 NOT NULL, - `pronouns` text, - `verified` integer DEFAULT 0 NOT NULL, - `bio` text DEFAULT 'No bio set' NOT NULL, - `date_joined` text NOT NULL, - `role_flags` integer DEFAULT 1 NOT NULL, - `is_contributor` integer DEFAULT false NOT NULL, - `self_assignable_role_flags` integer DEFAULT 0 NOT NULL -); ---> statement-breakpoint -CREATE TABLE `authSession` ( - `id` text NOT NULL, - `user_id` text NOT NULL, - `expires_at` text NOT NULL, - `user_agent` text NOT NULL, - `country_code` text NOT NULL, - `ip_address` text NOT NULL, - FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade -); ---> statement-breakpoint -CREATE TABLE `emailVerificationToken` ( - `id` text NOT NULL, - `user_id` text NOT NULL, - `token` text NOT NULL, - `expires_at` text NOT NULL, - FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade -); ---> statement-breakpoint -CREATE TABLE `passwordResetToken` ( - `id` text NOT NULL, - `user_id` text NOT NULL, - `token` text NOT NULL, - `expires_at` text NOT NULL, - FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade -); ---> statement-breakpoint -CREATE TABLE `userCollection` ( - `id` text NOT NULL, - `name` text NOT NULL, - `description` text NOT NULL, - `user_id` text NOT NULL, - `date_created` text NOT NULL, - `is_public` integer DEFAULT false NOT NULL, - FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade -); ---> statement-breakpoint -CREATE TABLE `userCollectionAsset` ( - `collection_id` text NOT NULL, - `asset_id` integer NOT NULL, - `date_added` text NOT NULL, - FOREIGN KEY (`collection_id`) REFERENCES `userCollection`(`id`) ON UPDATE cascade ON DELETE cascade, - FOREIGN KEY (`asset_id`) REFERENCES `asset`(`id`) ON UPDATE cascade ON DELETE cascade -); ---> statement-breakpoint -CREATE TABLE `socialsConnection` ( - `id` text NOT NULL, - `user_id` text NOT NULL, - `discord_id` text, - FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade -); ---> statement-breakpoint -CREATE TABLE `userFavorite` ( - `id` text NOT NULL, - `user_id` text NOT NULL, - `is_public` integer DEFAULT false NOT NULL, - FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade -); ---> statement-breakpoint -CREATE TABLE `userFavoriteAsset` ( - `id` text NOT NULL, - `favorited_assets_id` text NOT NULL, - `asset_id` integer NOT NULL, - FOREIGN KEY (`favorited_assets_id`) REFERENCES `userFavorite`(`id`) ON UPDATE cascade ON DELETE cascade, - FOREIGN KEY (`asset_id`) REFERENCES `asset`(`id`) ON UPDATE cascade ON DELETE cascade -); ---> statement-breakpoint -CREATE TABLE `userFollowing` ( - `followerId` text NOT NULL, - `followingId` text NOT NULL, - `createdAt` text NOT NULL, - FOREIGN KEY (`followerId`) REFERENCES `authUser`(`id`) ON UPDATE no action ON DELETE no action, - FOREIGN KEY (`followingId`) REFERENCES `authUser`(`id`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -CREATE TABLE `userCollectionLikes` ( - `collection_id` text NOT NULL, - `liked_by_id` text NOT NULL, - `createdAt` text NOT NULL, - FOREIGN KEY (`collection_id`) REFERENCES `userCollection`(`id`) ON UPDATE no action ON DELETE no action, - FOREIGN KEY (`liked_by_id`) REFERENCES `authUser`(`id`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -CREATE INDEX `assets_id_idx` ON `asset` (`id`);--> statement-breakpoint -CREATE INDEX `assets_name_idx` ON `asset` (`name`);--> statement-breakpoint -CREATE INDEX `assets_game_name_idx` ON `asset` (`game`);--> statement-breakpoint -CREATE INDEX `assets_asset_category_name_idx` ON `asset` (`asset_category`);--> statement-breakpoint -CREATE INDEX `assets_uploaded_by_id_idx` ON `asset` (`uploaded_by_id`);--> statement-breakpoint -CREATE UNIQUE INDEX `atlas_id_unique` ON `atlas` (`id`);--> statement-breakpoint -CREATE INDEX `atlas_id_idx` ON `atlas` (`id`);--> statement-breakpoint -CREATE INDEX `atlas_uploaded_by_idx` ON `atlas` (`uploaded_by`);--> statement-breakpoint -CREATE INDEX `atlas_uploaded_by_name_idx` ON `atlas` (`uploaded_by_name`);--> statement-breakpoint -CREATE INDEX `atlas_to_assets_id_idx` ON `atlasToAsset` (`id`);--> statement-breakpoint -CREATE INDEX `atlas_to_assets_atlas_id_idx` ON `atlasToAsset` (`atlas_id`);--> statement-breakpoint -CREATE INDEX `atlas_to_assets_asset_id_idx` ON `atlasToAsset` (`asset_id`);--> statement-breakpoint -CREATE INDEX `assetlikes_asset_idx` ON `assetLikes` (`asset_id`);--> statement-breakpoint -CREATE INDEX `assetlikes_likedBy_idx` ON `assetLikes` (`liked_by_id`);--> statement-breakpoint -CREATE UNIQUE INDEX `assetCategory_id_unique` ON `assetCategory` (`id`);--> statement-breakpoint -CREATE UNIQUE INDEX `assetCategory_name_unique` ON `assetCategory` (`name`);--> statement-breakpoint -CREATE INDEX `asset_category_id_idx` ON `assetCategory` (`id`);--> statement-breakpoint -CREATE INDEX `asset_category_name_idx` ON `assetCategory` (`name`);--> statement-breakpoint -CREATE INDEX `game_asset_category_game_id_idx` ON `gameAssetCategory` (`game_id`);--> statement-breakpoint -CREATE INDEX `game_asset_category_asset_category_id_idx` ON `gameAssetCategory` (`asset_category_id`);--> statement-breakpoint -CREATE INDEX `assetCategoryLikes_asset_idx` ON `assetCategoryLikes` (`asset_id`);--> statement-breakpoint -CREATE INDEX `assetCategoryLikes_likedby_idx` ON `assetCategoryLikes` (`liked_by_id`);--> statement-breakpoint -CREATE UNIQUE INDEX `game_id_unique` ON `game` (`id`);--> statement-breakpoint -CREATE UNIQUE INDEX `game_name_unique` ON `game` (`name`);--> statement-breakpoint -CREATE INDEX `game_id_idx` ON `game` (`id`);--> statement-breakpoint -CREATE INDEX `game_name_idx` ON `game` (`name`);--> statement-breakpoint -CREATE INDEX `gamelikes_game_idx` ON `gameLikes` (`asset_id`);--> statement-breakpoint -CREATE INDEX `gamelikes_likedby_idx` ON `gameLikes` (`liked_by_id`);--> statement-breakpoint -CREATE UNIQUE INDEX `assetTag_id_unique` ON `assetTag` (`id`);--> statement-breakpoint -CREATE UNIQUE INDEX `assetTag_name_unique` ON `assetTag` (`name`);--> statement-breakpoint -CREATE INDEX `asset_tag_id_idx` ON `assetTag` (`id`);--> statement-breakpoint -CREATE INDEX `asset_tag_name_idx` ON `assetTag` (`name`);--> statement-breakpoint -CREATE INDEX `asset_tags_assets_asset_tag_id_idx` ON `assetTagAsset` (`asset_tag_id`);--> statement-breakpoint -CREATE INDEX `asset_tags_assets_asset_id_idx` ON `assetTagAsset` (`asset_id`);--> statement-breakpoint -CREATE INDEX `assetTagLikes_asset_idx` ON `assetTagLikes` (`asset_id`);--> statement-breakpoint -CREATE INDEX `assetTagLikes_likedby_idx` ON `assetTagLikes` (`liked_by_id`);--> statement-breakpoint -CREATE UNIQUE INDEX `savedOcGenerators_id_unique` ON `savedOcGenerators` (`id`);--> statement-breakpoint -CREATE INDEX `saved_oc_generators_id_idx` ON `savedOcGenerators` (`id`);--> statement-breakpoint -CREATE INDEX `saved_oc_generators_user_id_idx` ON `savedOcGenerators` (`user_id`);--> statement-breakpoint -CREATE UNIQUE INDEX `authCredentials_id_unique` ON `authCredentials` (`id`);--> statement-breakpoint -CREATE INDEX `key_user_id_idx` ON `authCredentials` (`user_id`);--> statement-breakpoint -CREATE UNIQUE INDEX `authUser_id_unique` ON `authUser` (`id`);--> statement-breakpoint -CREATE UNIQUE INDEX `authUser_username_unique` ON `authUser` (`username`);--> statement-breakpoint -CREATE INDEX `user_id_idx` ON `authUser` (`id`);--> statement-breakpoint -CREATE INDEX `user_username_idx` ON `authUser` (`username`);--> statement-breakpoint -CREATE INDEX `user_email_idx` ON `authUser` (`email`);--> statement-breakpoint -CREATE UNIQUE INDEX `authSession_id_unique` ON `authSession` (`id`);--> statement-breakpoint -CREATE INDEX `session_user_id_idx` ON `authSession` (`user_id`);--> statement-breakpoint -CREATE UNIQUE INDEX `emailVerificationToken_id_unique` ON `emailVerificationToken` (`id`);--> statement-breakpoint -CREATE INDEX `email_verification_token_user_id_idx` ON `emailVerificationToken` (`user_id`);--> statement-breakpoint -CREATE INDEX `email_verification_token_token_idx` ON `emailVerificationToken` (`token`);--> statement-breakpoint -CREATE UNIQUE INDEX `passwordResetToken_id_unique` ON `passwordResetToken` (`id`);--> statement-breakpoint -CREATE INDEX `password_reset_token_user_id_idx` ON `passwordResetToken` (`user_id`);--> statement-breakpoint -CREATE INDEX `password_reset_token_token_idx` ON `passwordResetToken` (`token`);--> statement-breakpoint -CREATE UNIQUE INDEX `userCollection_id_unique` ON `userCollection` (`id`);--> statement-breakpoint -CREATE INDEX `collection_id_idx` ON `userCollection` (`id`);--> statement-breakpoint -CREATE INDEX `user_collection_id_idx` ON `userCollection` (`user_id`);--> statement-breakpoint -CREATE INDEX `collection_assets_collection_id_idx` ON `userCollectionAsset` (`collection_id`);--> statement-breakpoint -CREATE INDEX `collection_assets_asset_id_idx` ON `userCollectionAsset` (`asset_id`);--> statement-breakpoint -CREATE UNIQUE INDEX `socialsConnection_id_unique` ON `socialsConnection` (`id`);--> statement-breakpoint -CREATE UNIQUE INDEX `socialsConnection_user_id_unique` ON `socialsConnection` (`user_id`);--> statement-breakpoint -CREATE INDEX `socials_connection_user_id_idx` ON `socialsConnection` (`user_id`);--> statement-breakpoint -CREATE INDEX `socials_connection_discord_id_idx` ON `socialsConnection` (`discord_id`);--> statement-breakpoint -CREATE UNIQUE INDEX `userFavorite_id_unique` ON `userFavorite` (`id`);--> statement-breakpoint -CREATE INDEX `favorited_assets_id_idx` ON `userFavorite` (`id`);--> statement-breakpoint -CREATE INDEX `favorited_assets_user_id_idx` ON `userFavorite` (`user_id`);--> statement-breakpoint -CREATE UNIQUE INDEX `userFavoriteAsset_id_unique` ON `userFavoriteAsset` (`id`);--> statement-breakpoint -CREATE INDEX `favorited_assets_assets_id_idx` ON `userFavoriteAsset` (`id`);--> statement-breakpoint -CREATE INDEX `favorited_assets_assets_user_id_idx` ON `userFavoriteAsset` (`favorited_assets_id`);--> statement-breakpoint -CREATE INDEX `favorited_assets_assets_asset_id_idx` ON `userFavoriteAsset` (`asset_id`);--> statement-breakpoint -CREATE INDEX `userfollowing_follower_idx` ON `userFollowing` (`followerId`);--> statement-breakpoint -CREATE INDEX `userfollowing_following_idx` ON `userFollowing` (`followingId`);--> statement-breakpoint -CREATE INDEX `userCollectionNetworking_collection_idx` ON `userCollectionLikes` (`collection_id`);--> statement-breakpoint -CREATE INDEX `userCollectionNetworking_likedBy_idx` ON `userCollectionLikes` (`liked_by_id`); \ No newline at end of file diff --git a/src/v2/db/migrations/meta/0000_snapshot.json b/src/v2/db/migrations/meta/0000_snapshot.json deleted file mode 100644 index 1efe267..0000000 --- a/src/v2/db/migrations/meta/0000_snapshot.json +++ /dev/null @@ -1,1843 +0,0 @@ -{ - "version": "5", - "dialect": "sqlite", - "id": "fefc70cd-e4e3-4829-a71a-bc6a0dcc7214", - "prevId": "00000000-0000-0000-0000-000000000000", - "tables": { - "asset": { - "name": "asset", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "extension": { - "name": "extension", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "game": { - "name": "game", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_category": { - "name": "asset_category", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by_id": { - "name": "uploaded_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by_name": { - "name": "uploaded_by_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "url": { - "name": "url", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "status": { - "name": "status", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "'pending'" - }, - "uploaded_date": { - "name": "uploaded_date", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_is_optimized": { - "name": "asset_is_optimized", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "asset_is_suggestive": { - "name": "asset_is_suggestive", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "view_count": { - "name": "view_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "download_count": { - "name": "download_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "file_size": { - "name": "file_size", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "width": { - "name": "width", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "height": { - "name": "height", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "assets_id_idx": { - "name": "assets_id_idx", - "columns": ["id"], - "isUnique": false - }, - "assets_name_idx": { - "name": "assets_name_idx", - "columns": ["name"], - "isUnique": false - }, - "assets_game_name_idx": { - "name": "assets_game_name_idx", - "columns": ["game"], - "isUnique": false - }, - "assets_asset_category_name_idx": { - "name": "assets_asset_category_name_idx", - "columns": ["asset_category"], - "isUnique": false - }, - "assets_uploaded_by_id_idx": { - "name": "assets_uploaded_by_id_idx", - "columns": ["uploaded_by_id"], - "isUnique": false - } - }, - "foreignKeys": { - "asset_game_game_id_fk": { - "name": "asset_game_game_id_fk", - "tableFrom": "asset", - "tableTo": "game", - "columnsFrom": ["game"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "asset_asset_category_assetCategory_id_fk": { - "name": "asset_asset_category_assetCategory_id_fk", - "tableFrom": "asset", - "tableTo": "assetCategory", - "columnsFrom": ["asset_category"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "asset_uploaded_by_id_authUser_id_fk": { - "name": "asset_uploaded_by_id_authUser_id_fk", - "tableFrom": "asset", - "tableTo": "authUser", - "columnsFrom": ["uploaded_by_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "asset_uploaded_by_name_authUser_username_fk": { - "name": "asset_uploaded_by_name_authUser_username_fk", - "tableFrom": "asset", - "tableTo": "authUser", - "columnsFrom": ["uploaded_by_name"], - "columnsTo": ["username"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "atlas": { - "name": "atlas", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "url": { - "name": "url", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by": { - "name": "uploaded_by", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by_name": { - "name": "uploaded_by_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_date": { - "name": "uploaded_date", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "file_size": { - "name": "file_size", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "atlas_id_unique": { - "name": "atlas_id_unique", - "columns": ["id"], - "isUnique": true - }, - "atlas_id_idx": { - "name": "atlas_id_idx", - "columns": ["id"], - "isUnique": false - }, - "atlas_uploaded_by_idx": { - "name": "atlas_uploaded_by_idx", - "columns": ["uploaded_by"], - "isUnique": false - }, - "atlas_uploaded_by_name_idx": { - "name": "atlas_uploaded_by_name_idx", - "columns": ["uploaded_by_name"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "atlasToAsset": { - "name": "atlasToAsset", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "atlas_id": { - "name": "atlas_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "atlas_to_assets_id_idx": { - "name": "atlas_to_assets_id_idx", - "columns": ["id"], - "isUnique": false - }, - "atlas_to_assets_atlas_id_idx": { - "name": "atlas_to_assets_atlas_id_idx", - "columns": ["atlas_id"], - "isUnique": false - }, - "atlas_to_assets_asset_id_idx": { - "name": "atlas_to_assets_asset_id_idx", - "columns": ["asset_id"], - "isUnique": false - } - }, - "foreignKeys": { - "atlasToAsset_atlas_id_atlas_id_fk": { - "name": "atlasToAsset_atlas_id_atlas_id_fk", - "tableFrom": "atlasToAsset", - "tableTo": "atlas", - "columnsFrom": ["atlas_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "atlasToAsset_asset_id_asset_id_fk": { - "name": "atlasToAsset_asset_id_asset_id_fk", - "tableFrom": "atlasToAsset", - "tableTo": "asset", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetLikes": { - "name": "assetLikes", - "columns": { - "asset_id": { - "name": "asset_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetlikes_asset_idx": { - "name": "assetlikes_asset_idx", - "columns": ["asset_id"], - "isUnique": false - }, - "assetlikes_likedBy_idx": { - "name": "assetlikes_likedBy_idx", - "columns": ["liked_by_id"], - "isUnique": false - } - }, - "foreignKeys": { - "assetLikes_asset_id_asset_id_fk": { - "name": "assetLikes_asset_id_asset_id_fk", - "tableFrom": "assetLikes", - "tableTo": "asset", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - }, - "assetLikes_liked_by_id_authUser_id_fk": { - "name": "assetLikes_liked_by_id_authUser_id_fk", - "tableFrom": "assetLikes", - "tableTo": "authUser", - "columnsFrom": ["liked_by_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetCategory": { - "name": "assetCategory", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetCategory_id_unique": { - "name": "assetCategory_id_unique", - "columns": ["id"], - "isUnique": true - }, - "assetCategory_name_unique": { - "name": "assetCategory_name_unique", - "columns": ["name"], - "isUnique": true - }, - "asset_category_id_idx": { - "name": "asset_category_id_idx", - "columns": ["id"], - "isUnique": false - }, - "asset_category_name_idx": { - "name": "asset_category_name_idx", - "columns": ["name"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "gameAssetCategory": { - "name": "gameAssetCategory", - "columns": { - "game_id": { - "name": "game_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_category_id": { - "name": "asset_category_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "game_asset_category_game_id_idx": { - "name": "game_asset_category_game_id_idx", - "columns": ["game_id"], - "isUnique": false - }, - "game_asset_category_asset_category_id_idx": { - "name": "game_asset_category_asset_category_id_idx", - "columns": ["asset_category_id"], - "isUnique": false - } - }, - "foreignKeys": { - "gameAssetCategory_game_id_game_id_fk": { - "name": "gameAssetCategory_game_id_game_id_fk", - "tableFrom": "gameAssetCategory", - "tableTo": "game", - "columnsFrom": ["game_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "gameAssetCategory_asset_category_id_assetCategory_id_fk": { - "name": "gameAssetCategory_asset_category_id_assetCategory_id_fk", - "tableFrom": "gameAssetCategory", - "tableTo": "assetCategory", - "columnsFrom": ["asset_category_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetCategoryLikes": { - "name": "assetCategoryLikes", - "columns": { - "asset_id": { - "name": "asset_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetCategoryLikes_asset_idx": { - "name": "assetCategoryLikes_asset_idx", - "columns": ["asset_id"], - "isUnique": false - }, - "assetCategoryLikes_likedby_idx": { - "name": "assetCategoryLikes_likedby_idx", - "columns": ["liked_by_id"], - "isUnique": false - } - }, - "foreignKeys": { - "assetCategoryLikes_asset_id_assetCategory_id_fk": { - "name": "assetCategoryLikes_asset_id_assetCategory_id_fk", - "tableFrom": "assetCategoryLikes", - "tableTo": "assetCategory", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - }, - "assetCategoryLikes_liked_by_id_authUser_id_fk": { - "name": "assetCategoryLikes_liked_by_id_authUser_id_fk", - "tableFrom": "assetCategoryLikes", - "tableTo": "authUser", - "columnsFrom": ["liked_by_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "game": { - "name": "game", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - }, - "possible_suggestive_content": { - "name": "possible_suggestive_content", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "game_id_unique": { - "name": "game_id_unique", - "columns": ["id"], - "isUnique": true - }, - "game_name_unique": { - "name": "game_name_unique", - "columns": ["name"], - "isUnique": true - }, - "game_id_idx": { - "name": "game_id_idx", - "columns": ["id"], - "isUnique": false - }, - "game_name_idx": { - "name": "game_name_idx", - "columns": ["name"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "gameLikes": { - "name": "gameLikes", - "columns": { - "asset_id": { - "name": "asset_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "gamelikes_game_idx": { - "name": "gamelikes_game_idx", - "columns": ["asset_id"], - "isUnique": false - }, - "gamelikes_likedby_idx": { - "name": "gamelikes_likedby_idx", - "columns": ["liked_by_id"], - "isUnique": false - } - }, - "foreignKeys": { - "gameLikes_asset_id_game_id_fk": { - "name": "gameLikes_asset_id_game_id_fk", - "tableFrom": "gameLikes", - "tableTo": "game", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - }, - "gameLikes_liked_by_id_authUser_id_fk": { - "name": "gameLikes_liked_by_id_authUser_id_fk", - "tableFrom": "gameLikes", - "tableTo": "authUser", - "columnsFrom": ["liked_by_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetTag": { - "name": "assetTag", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetTag_id_unique": { - "name": "assetTag_id_unique", - "columns": ["id"], - "isUnique": true - }, - "assetTag_name_unique": { - "name": "assetTag_name_unique", - "columns": ["name"], - "isUnique": true - }, - "asset_tag_id_idx": { - "name": "asset_tag_id_idx", - "columns": ["id"], - "isUnique": false - }, - "asset_tag_name_idx": { - "name": "asset_tag_name_idx", - "columns": ["name"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetTagAsset": { - "name": "assetTagAsset", - "columns": { - "asset_tag_id": { - "name": "asset_tag_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "asset_tags_assets_asset_tag_id_idx": { - "name": "asset_tags_assets_asset_tag_id_idx", - "columns": ["asset_tag_id"], - "isUnique": false - }, - "asset_tags_assets_asset_id_idx": { - "name": "asset_tags_assets_asset_id_idx", - "columns": ["asset_id"], - "isUnique": false - } - }, - "foreignKeys": { - "assetTagAsset_asset_tag_id_assetTag_id_fk": { - "name": "assetTagAsset_asset_tag_id_assetTag_id_fk", - "tableFrom": "assetTagAsset", - "tableTo": "assetTag", - "columnsFrom": ["asset_tag_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "assetTagAsset_asset_id_asset_id_fk": { - "name": "assetTagAsset_asset_id_asset_id_fk", - "tableFrom": "assetTagAsset", - "tableTo": "asset", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetTagLikes": { - "name": "assetTagLikes", - "columns": { - "asset_id": { - "name": "asset_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetTagLikes_asset_idx": { - "name": "assetTagLikes_asset_idx", - "columns": ["asset_id"], - "isUnique": false - }, - "assetTagLikes_likedby_idx": { - "name": "assetTagLikes_likedby_idx", - "columns": ["liked_by_id"], - "isUnique": false - } - }, - "foreignKeys": { - "assetTagLikes_asset_id_assetTag_id_fk": { - "name": "assetTagLikes_asset_id_assetTag_id_fk", - "tableFrom": "assetTagLikes", - "tableTo": "assetTag", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - }, - "assetTagLikes_liked_by_id_authUser_id_fk": { - "name": "assetTagLikes_liked_by_id_authUser_id_fk", - "tableFrom": "assetTagLikes", - "tableTo": "authUser", - "columnsFrom": ["liked_by_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "savedOcGenerators": { - "name": "savedOcGenerators", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "game": { - "name": "game", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "date_created": { - "name": "date_created", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "content": { - "name": "content", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "saved_color_palette": { - "name": "saved_color_palette", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "sakura_url": { - "name": "sakura_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "savedOcGenerators_id_unique": { - "name": "savedOcGenerators_id_unique", - "columns": ["id"], - "isUnique": true - }, - "saved_oc_generators_id_idx": { - "name": "saved_oc_generators_id_idx", - "columns": ["id"], - "isUnique": false - }, - "saved_oc_generators_user_id_idx": { - "name": "saved_oc_generators_user_id_idx", - "columns": ["user_id"], - "isUnique": false - } - }, - "foreignKeys": { - "savedOcGenerators_user_id_authUser_id_fk": { - "name": "savedOcGenerators_user_id_authUser_id_fk", - "tableFrom": "savedOcGenerators", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "authCredentials": { - "name": "authCredentials", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "hashed_password": { - "name": "hashed_password", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "authCredentials_id_unique": { - "name": "authCredentials_id_unique", - "columns": ["id"], - "isUnique": true - }, - "key_user_id_idx": { - "name": "key_user_id_idx", - "columns": ["user_id"], - "isUnique": false - } - }, - "foreignKeys": { - "authCredentials_user_id_authUser_id_fk": { - "name": "authCredentials_user_id_authUser_id_fk", - "tableFrom": "authCredentials", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "authUser": { - "name": "authUser", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "avatar_url": { - "name": "avatar_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "banner_url": { - "name": "banner_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "display_name": { - "name": "display_name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "username": { - "name": "username", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "username_colour": { - "name": "username_colour", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "email": { - "name": "email", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "email_verified": { - "name": "email_verified", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "pronouns": { - "name": "pronouns", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "verified": { - "name": "verified", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "bio": { - "name": "bio", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "'No bio set'" - }, - "date_joined": { - "name": "date_joined", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "role_flags": { - "name": "role_flags", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 1 - }, - "is_contributor": { - "name": "is_contributor", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "self_assignable_role_flags": { - "name": "self_assignable_role_flags", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "authUser_id_unique": { - "name": "authUser_id_unique", - "columns": ["id"], - "isUnique": true - }, - "authUser_username_unique": { - "name": "authUser_username_unique", - "columns": ["username"], - "isUnique": true - }, - "user_id_idx": { - "name": "user_id_idx", - "columns": ["id"], - "isUnique": false - }, - "user_username_idx": { - "name": "user_username_idx", - "columns": ["username"], - "isUnique": false - }, - "user_email_idx": { - "name": "user_email_idx", - "columns": ["email"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "authSession": { - "name": "authSession", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_agent": { - "name": "user_agent", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "country_code": { - "name": "country_code", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "ip_address": { - "name": "ip_address", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "authSession_id_unique": { - "name": "authSession_id_unique", - "columns": ["id"], - "isUnique": true - }, - "session_user_id_idx": { - "name": "session_user_id_idx", - "columns": ["user_id"], - "isUnique": false - } - }, - "foreignKeys": { - "authSession_user_id_authUser_id_fk": { - "name": "authSession_user_id_authUser_id_fk", - "tableFrom": "authSession", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "emailVerificationToken": { - "name": "emailVerificationToken", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "emailVerificationToken_id_unique": { - "name": "emailVerificationToken_id_unique", - "columns": ["id"], - "isUnique": true - }, - "email_verification_token_user_id_idx": { - "name": "email_verification_token_user_id_idx", - "columns": ["user_id"], - "isUnique": false - }, - "email_verification_token_token_idx": { - "name": "email_verification_token_token_idx", - "columns": ["token"], - "isUnique": false - } - }, - "foreignKeys": { - "emailVerificationToken_user_id_authUser_id_fk": { - "name": "emailVerificationToken_user_id_authUser_id_fk", - "tableFrom": "emailVerificationToken", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "passwordResetToken": { - "name": "passwordResetToken", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "passwordResetToken_id_unique": { - "name": "passwordResetToken_id_unique", - "columns": ["id"], - "isUnique": true - }, - "password_reset_token_user_id_idx": { - "name": "password_reset_token_user_id_idx", - "columns": ["user_id"], - "isUnique": false - }, - "password_reset_token_token_idx": { - "name": "password_reset_token_token_idx", - "columns": ["token"], - "isUnique": false - } - }, - "foreignKeys": { - "passwordResetToken_user_id_authUser_id_fk": { - "name": "passwordResetToken_user_id_authUser_id_fk", - "tableFrom": "passwordResetToken", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userCollection": { - "name": "userCollection", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "date_created": { - "name": "date_created", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - } - }, - "indexes": { - "userCollection_id_unique": { - "name": "userCollection_id_unique", - "columns": ["id"], - "isUnique": true - }, - "collection_id_idx": { - "name": "collection_id_idx", - "columns": ["id"], - "isUnique": false - }, - "user_collection_id_idx": { - "name": "user_collection_id_idx", - "columns": ["user_id"], - "isUnique": false - } - }, - "foreignKeys": { - "userCollection_user_id_authUser_id_fk": { - "name": "userCollection_user_id_authUser_id_fk", - "tableFrom": "userCollection", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userCollectionAsset": { - "name": "userCollectionAsset", - "columns": { - "collection_id": { - "name": "collection_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "date_added": { - "name": "date_added", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "collection_assets_collection_id_idx": { - "name": "collection_assets_collection_id_idx", - "columns": ["collection_id"], - "isUnique": false - }, - "collection_assets_asset_id_idx": { - "name": "collection_assets_asset_id_idx", - "columns": ["asset_id"], - "isUnique": false - } - }, - "foreignKeys": { - "userCollectionAsset_collection_id_userCollection_id_fk": { - "name": "userCollectionAsset_collection_id_userCollection_id_fk", - "tableFrom": "userCollectionAsset", - "tableTo": "userCollection", - "columnsFrom": ["collection_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "userCollectionAsset_asset_id_asset_id_fk": { - "name": "userCollectionAsset_asset_id_asset_id_fk", - "tableFrom": "userCollectionAsset", - "tableTo": "asset", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "socialsConnection": { - "name": "socialsConnection", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "discord_id": { - "name": "discord_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "socialsConnection_id_unique": { - "name": "socialsConnection_id_unique", - "columns": ["id"], - "isUnique": true - }, - "socialsConnection_user_id_unique": { - "name": "socialsConnection_user_id_unique", - "columns": ["user_id"], - "isUnique": true - }, - "socials_connection_user_id_idx": { - "name": "socials_connection_user_id_idx", - "columns": ["user_id"], - "isUnique": false - }, - "socials_connection_discord_id_idx": { - "name": "socials_connection_discord_id_idx", - "columns": ["discord_id"], - "isUnique": false - } - }, - "foreignKeys": { - "socialsConnection_user_id_authUser_id_fk": { - "name": "socialsConnection_user_id_authUser_id_fk", - "tableFrom": "socialsConnection", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userFavorite": { - "name": "userFavorite", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - } - }, - "indexes": { - "userFavorite_id_unique": { - "name": "userFavorite_id_unique", - "columns": ["id"], - "isUnique": true - }, - "favorited_assets_id_idx": { - "name": "favorited_assets_id_idx", - "columns": ["id"], - "isUnique": false - }, - "favorited_assets_user_id_idx": { - "name": "favorited_assets_user_id_idx", - "columns": ["user_id"], - "isUnique": false - } - }, - "foreignKeys": { - "userFavorite_user_id_authUser_id_fk": { - "name": "userFavorite_user_id_authUser_id_fk", - "tableFrom": "userFavorite", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userFavoriteAsset": { - "name": "userFavoriteAsset", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "favorited_assets_id": { - "name": "favorited_assets_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "userFavoriteAsset_id_unique": { - "name": "userFavoriteAsset_id_unique", - "columns": ["id"], - "isUnique": true - }, - "favorited_assets_assets_id_idx": { - "name": "favorited_assets_assets_id_idx", - "columns": ["id"], - "isUnique": false - }, - "favorited_assets_assets_user_id_idx": { - "name": "favorited_assets_assets_user_id_idx", - "columns": ["favorited_assets_id"], - "isUnique": false - }, - "favorited_assets_assets_asset_id_idx": { - "name": "favorited_assets_assets_asset_id_idx", - "columns": ["asset_id"], - "isUnique": false - } - }, - "foreignKeys": { - "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk": { - "name": "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk", - "tableFrom": "userFavoriteAsset", - "tableTo": "userFavorite", - "columnsFrom": ["favorited_assets_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "userFavoriteAsset_asset_id_asset_id_fk": { - "name": "userFavoriteAsset_asset_id_asset_id_fk", - "tableFrom": "userFavoriteAsset", - "tableTo": "asset", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userFollowing": { - "name": "userFollowing", - "columns": { - "followerId": { - "name": "followerId", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "followingId": { - "name": "followingId", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "userfollowing_follower_idx": { - "name": "userfollowing_follower_idx", - "columns": ["followerId"], - "isUnique": false - }, - "userfollowing_following_idx": { - "name": "userfollowing_following_idx", - "columns": ["followingId"], - "isUnique": false - } - }, - "foreignKeys": { - "userFollowing_followerId_authUser_id_fk": { - "name": "userFollowing_followerId_authUser_id_fk", - "tableFrom": "userFollowing", - "tableTo": "authUser", - "columnsFrom": ["followerId"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - }, - "userFollowing_followingId_authUser_id_fk": { - "name": "userFollowing_followingId_authUser_id_fk", - "tableFrom": "userFollowing", - "tableTo": "authUser", - "columnsFrom": ["followingId"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userCollectionLikes": { - "name": "userCollectionLikes", - "columns": { - "collection_id": { - "name": "collection_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "userCollectionNetworking_collection_idx": { - "name": "userCollectionNetworking_collection_idx", - "columns": ["collection_id"], - "isUnique": false - }, - "userCollectionNetworking_likedBy_idx": { - "name": "userCollectionNetworking_likedBy_idx", - "columns": ["liked_by_id"], - "isUnique": false - } - }, - "foreignKeys": { - "userCollectionLikes_collection_id_userCollection_id_fk": { - "name": "userCollectionLikes_collection_id_userCollection_id_fk", - "tableFrom": "userCollectionLikes", - "tableTo": "userCollection", - "columnsFrom": ["collection_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - }, - "userCollectionLikes_liked_by_id_authUser_id_fk": { - "name": "userCollectionLikes_liked_by_id_authUser_id_fk", - "tableFrom": "userCollectionLikes", - "tableTo": "authUser", - "columnsFrom": ["liked_by_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - } - }, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - } -} diff --git a/src/v2/db/migrations/meta/_journal.json b/src/v2/db/migrations/meta/_journal.json deleted file mode 100644 index 3490e76..0000000 --- a/src/v2/db/migrations/meta/_journal.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "version": "5", - "dialect": "sqlite", - "entries": [ - { - "idx": 0, - "version": "5", - "when": 1702070538818, - "tag": "0000_tiny_human_fly", - "breakpoints": true - } - ] -} diff --git a/src/v2/db/schema/user/user.ts b/src/v2/db/schema/user/user.ts index c951a36..54c3919 100644 --- a/src/v2/db/schema/user/user.ts +++ b/src/v2/db/schema/user/user.ts @@ -47,10 +47,17 @@ export const authUser = sqliteTable( .$defaultFn(() => { return new Date().toISOString() }), - roleFlags: integer("role_flags").default(1).notNull(), + isSupporter: integer("is_supporter", { mode: "boolean" }) + .default(false) + .notNull(), + supporterExpiresAt: text("supporter_expires_at"), + isBanned: integer("is_banned", { mode: "boolean" }) + .default(false) + .notNull(), isContributor: integer("is_contributor", { mode: "boolean" }) .default(false) .notNull(), + roleFlags: integer("role_flags").default(1).notNull(), selfAssignableRoleFlags: integer("self_assignable_role_flags") .default(0) .notNull(), diff --git a/src/worker-configuration.d.ts b/src/worker-configuration.d.ts index d74a499..3a123ae 100644 --- a/src/worker-configuration.d.ts +++ b/src/worker-configuration.d.ts @@ -15,7 +15,6 @@ declare global { DISCORD_CLIENT_SECRET: string DISCORD_REDIRECT_URI: string RESEND_API_KEY: string - AXIOM_TOKEN: string } type Variables = { From 70371aebca8cf2add70083b2373e6b5bfbc08f39 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Wed, 13 Dec 2023 20:50:53 +0000 Subject: [PATCH 187/318] workflow test --- .github/workflows/test.yml | 7 ++----- wrangler.toml | 5 ----- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e3ac6c3..20045be 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -37,8 +37,5 @@ jobs: - name: Install dependencies run: pnpm install - - name: Migrate Database - run: pnpm drizzle:migrate - - - name: Seed Database - run: pnpm drizzle:seed + - name: Initialize Drizzle + run: pnpm drizzle:dev:init diff --git a/wrangler.toml b/wrangler.toml index 0ccc33a..da8fbf5 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -10,9 +10,4 @@ binding = 'FILES_BUCKET' bucket_name = 'files' preview_bucket_name = 'files' -[[kv_namespaces]] -binding = "KV_SESSION_STORAGE" -preview_id = "a5ee030621cf4dfda60e0ad81bfd2f3b" -id = "a5ee030621cf4dfda60e0ad81bfd2f3b" - [vars] From ce30e505b96d78e4af30af7616a7cf80d98e306a Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Wed, 13 Dec 2023 20:54:33 +0000 Subject: [PATCH 188/318] remove unused deps --- package.json | 3 - pnpm-lock.yaml | 8504 ++++++++++++++++++------------------------------ 2 files changed, 3238 insertions(+), 5269 deletions(-) diff --git a/package.json b/package.json index 306e3fb..1404d2d 100644 --- a/package.json +++ b/package.json @@ -45,11 +45,8 @@ "drizzle-zod": "^0.5.1", "hono": "^3.11.3", "lucia": "3.0.0-beta.11", - "miniflare": "^3.20231030.3", - "mysql2": "^3.6.5", "oslo": "^0.23.5", "prettier": "^3.1.0", - "unstorage": "^1.10.1", "uuid": "^9.0.1", "zod": "^3.22.4" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cd6b758..2f5a741 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,5275 +1,3247 @@ -lockfileVersion: "6.0" +lockfileVersion: '6.0' settings: - autoInstallPeers: true - excludeLinksFromLockfile: false + autoInstallPeers: true + excludeLinksFromLockfile: false dependencies: - "@hono/swagger-ui": - specifier: ^0.2.0 - version: 0.2.0(hono@3.11.3) - "@hono/zod-openapi": - specifier: ^0.9.3 - version: 0.9.3(hono@3.11.3)(zod@3.22.4) - "@libsql/client": - specifier: 0.4.0-pre.5 - version: 0.4.0-pre.5 - "@lucia-auth/adapter-sqlite": - specifier: 3.0.0-beta.9 - version: 3.0.0-beta.9(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2)(lucia@3.0.0-beta.11) - "@typescript-eslint/eslint-plugin": - specifier: ^6.13.2 - version: 6.13.2(@typescript-eslint/parser@6.13.2)(eslint@8.55.0)(typescript@5.3.3) - better-sqlite3: - specifier: ^9.2.2 - version: 9.2.2 - drizzle-orm: - specifier: ^0.29.1 - version: 0.29.1(@cloudflare/workers-types@4.20231121.0)(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2)(mysql2@3.6.5) - drizzle-zod: - specifier: ^0.5.1 - version: 0.5.1(drizzle-orm@0.29.1)(zod@3.22.4) - hono: - specifier: ^3.11.3 - version: 3.11.3 - lucia: - specifier: 3.0.0-beta.11 - version: 3.0.0-beta.11 - miniflare: - specifier: ^3.20231030.3 - version: 3.20231030.3 - mysql2: - specifier: ^3.6.5 - version: 3.6.5 - oslo: - specifier: ^0.23.5 - version: 0.23.5 - prettier: - specifier: ^3.1.0 - version: 3.1.0 - unstorage: - specifier: ^1.10.1 - version: 1.10.1 - uuid: - specifier: ^9.0.1 - version: 9.0.1 - zod: - specifier: ^3.22.4 - version: 3.22.4 + '@hono/swagger-ui': + specifier: ^0.2.0 + version: 0.2.0(hono@3.11.3) + '@hono/zod-openapi': + specifier: ^0.9.3 + version: 0.9.3(hono@3.11.3)(zod@3.22.4) + '@libsql/client': + specifier: 0.4.0-pre.5 + version: 0.4.0-pre.5 + '@lucia-auth/adapter-sqlite': + specifier: 3.0.0-beta.9 + version: 3.0.0-beta.9(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2)(lucia@3.0.0-beta.11) + '@typescript-eslint/eslint-plugin': + specifier: ^6.13.2 + version: 6.13.2(@typescript-eslint/parser@6.13.2)(eslint@8.55.0)(typescript@5.3.3) + better-sqlite3: + specifier: ^9.2.2 + version: 9.2.2 + drizzle-orm: + specifier: ^0.29.1 + version: 0.29.1(@cloudflare/workers-types@4.20231121.0)(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2) + drizzle-zod: + specifier: ^0.5.1 + version: 0.5.1(drizzle-orm@0.29.1)(zod@3.22.4) + hono: + specifier: ^3.11.3 + version: 3.11.3 + lucia: + specifier: 3.0.0-beta.11 + version: 3.0.0-beta.11 + oslo: + specifier: ^0.23.5 + version: 0.23.5 + prettier: + specifier: ^3.1.0 + version: 3.1.0 + uuid: + specifier: ^9.0.1 + version: 9.0.1 + zod: + specifier: ^3.22.4 + version: 3.22.4 devDependencies: - "@asteasolutions/zod-to-openapi": - specifier: ^6.3.0 - version: 6.3.0(zod@3.22.4) - "@cloudflare/workers-types": - specifier: ^4.20231121.0 - version: 4.20231121.0 - "@types/node": - specifier: ^20.10.4 - version: 20.10.4 - dotenv: - specifier: ^16.3.1 - version: 16.3.1 - drizzle-kit: - specifier: ^0.20.6 - version: 0.20.6 - eslint: - specifier: ^8.55.0 - version: 8.55.0 - eslint-config-google: - specifier: ^0.14.0 - version: 0.14.0(eslint@8.55.0) - eslint-plugin-json: - specifier: ^3.1.0 - version: 3.1.0 - husky: - specifier: ^8.0.3 - version: 8.0.3 - openapi-generator: - specifier: link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator - version: link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator - tsx: - specifier: ^4.6.2 - version: 4.6.2 - typescript: - specifier: ^5.3.3 - version: 5.3.3 - wrangler: - specifier: 3.19.0 - version: 3.19.0 + '@asteasolutions/zod-to-openapi': + specifier: ^6.3.0 + version: 6.3.0(zod@3.22.4) + '@cloudflare/workers-types': + specifier: ^4.20231121.0 + version: 4.20231121.0 + '@types/node': + specifier: ^20.10.4 + version: 20.10.4 + dotenv: + specifier: ^16.3.1 + version: 16.3.1 + drizzle-kit: + specifier: ^0.20.6 + version: 0.20.6 + eslint: + specifier: ^8.55.0 + version: 8.55.0 + eslint-config-google: + specifier: ^0.14.0 + version: 0.14.0(eslint@8.55.0) + eslint-plugin-json: + specifier: ^3.1.0 + version: 3.1.0 + husky: + specifier: ^8.0.3 + version: 8.0.3 + openapi-generator: + specifier: link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator + version: link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator + tsx: + specifier: ^4.6.2 + version: 4.6.2 + typescript: + specifier: ^5.3.3 + version: 5.3.3 + wrangler: + specifier: 3.19.0 + version: 3.19.0 packages: - /@aashutoshrathi/word-wrap@1.2.6: - resolution: - { - integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==, - } - engines: { node: ">=0.10.0" } - - /@asteasolutions/zod-to-openapi@5.5.0(zod@3.22.4): - resolution: - { - integrity: sha512-d5HwrvM6dOKr3XdeF+DmashGvfEc+1oiEfbscugsiwSTrFtuMa7ETpW9sTNnVgn+hJaz+PRxPQUYD7q9/5dUig==, - } - peerDependencies: - zod: ^3.20.2 - dependencies: - openapi3-ts: 4.1.2 - zod: 3.22.4 - dev: false - - /@asteasolutions/zod-to-openapi@6.3.0(zod@3.22.4): - resolution: - { - integrity: sha512-ca7Svz3BWkMaIP3M1YGsyxgp7AcKXlTmy19ozhY0DslhatXbnyxdvxlmiI0TmvkIfi6RpQfm+eK1neVLsh6Riw==, - } - peerDependencies: - zod: ^3.20.2 - dependencies: - openapi3-ts: 4.1.2 - zod: 3.22.4 - dev: true - - /@cloudflare/kv-asset-handler@0.2.0: - resolution: - { - integrity: sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==, - } - dependencies: - mime: 3.0.0 - dev: true - - /@cloudflare/workerd-darwin-64@1.20231030.0: - resolution: - { - integrity: sha512-J4PQ9utPxLya9yHdMMx3AZeC5M/6FxcoYw6jo9jbDDFTy+a4Gslqf4Im9We3aeOEdPXa3tgQHVQOSelJSZLhIw==, - } - engines: { node: ">=16" } - cpu: [x64] - os: [darwin] - requiresBuild: true - optional: true - - /@cloudflare/workerd-darwin-arm64@1.20231030.0: - resolution: - { - integrity: sha512-WSJJjm11Del4hSneiNB7wTXGtBXI4QMCH9l5qf4iT5PAW8cESGcCmdHtWDWDtGAAGcvmLT04KNvmum92vRKKQQ==, - } - engines: { node: ">=16" } - cpu: [arm64] - os: [darwin] - requiresBuild: 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 - 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 - 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 - optional: true - - /@cloudflare/workers-types@4.20231121.0: - resolution: - { - integrity: sha512-+kWfpCkqiepwAKXyHoE0gnkPgkLhz0/9HOBIGhHRsUvUKvhUtm3mbqqoGRWgF1qcjzrDUBbrrOq4MYHfFtc2RA==, - } - - /@drizzle-team/studio@0.0.35: - resolution: - { - integrity: sha512-t5LTNOVf+L7Bb/wdssOIPx0ueNvhyaIXdrvKgoHR4wK0GD7SRmILcCTzn6N6Ltr1VnFzQZG/bzn6HMagn17Jtw==, - } - dependencies: - superjson: 2.2.1 - 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-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-arm64@0.19.8: - resolution: - { - integrity: sha512-B8JbS61bEunhfx8kasogFENgQfr/dIp+ggYXwTqdbMAgGDhRa3AaPpQMuQU0rNxDLECj6FhDzk1cF9WHMVwrtA==, - } - engines: { node: ">=12" } - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: 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-arm@0.19.8: - resolution: - { - integrity: sha512-31E2lxlGM1KEfivQl8Yf5aYU/mflz9g06H6S15ITUFQueMFtFjESRMoDSkvMo8thYvLBax+VKTPlpnx+sPicOA==, - } - engines: { node: ">=12" } - cpu: [arm] - 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/android-x64@0.19.8: - resolution: - { - integrity: sha512-rdqqYfRIn4jWOp+lzQttYMa2Xar3OK9Yt2fhOhzFXqg0rVWEfSclJvZq5fZslnz6ypHvVf3CT7qyf0A5pM682A==, - } - 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-arm64@0.19.8: - resolution: - { - integrity: sha512-RQw9DemMbIq35Bprbboyf8SmOr4UXsRVxJ97LgB55VKKeJOOdvsIPy0nFyF2l8U+h4PtBx/1kRf0BelOYCiQcw==, - } - 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/darwin-x64@0.19.8: - resolution: - { - integrity: sha512-3sur80OT9YdeZwIVgERAysAbwncom7b4bCI2XKLjMfPymTud7e/oY4y+ci1XVp5TfQp/bppn7xLw1n/oSQY3/Q==, - } - 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-arm64@0.19.8: - resolution: - { - integrity: sha512-WAnPJSDattvS/XtPCTj1tPoTxERjcTpH6HsMr6ujTT+X6rylVe8ggxk8pVxzf5U1wh5sPODpawNicF5ta/9Tmw==, - } - 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/freebsd-x64@0.19.8: - resolution: - { - integrity: sha512-ICvZyOplIjmmhjd6mxi+zxSdpPTKFfyPPQMQTK/w+8eNK6WV01AjIztJALDtwNNfFhfZLux0tZLC+U9nSyA5Zg==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [freebsd] - 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-arm64@0.19.8: - resolution: - { - integrity: sha512-z1zMZivxDLHWnyGOctT9JP70h0beY54xDDDJt4VpTX+iwA77IFsE1vCXWmprajJGa+ZYSqkSbRQ4eyLCpCmiCQ==, - } - engines: { node: ">=12" } - cpu: [arm64] - os: [linux] - 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-arm@0.19.8: - resolution: - { - integrity: sha512-H4vmI5PYqSvosPaTJuEppU9oz1dq2A7Mr2vyg5TF9Ga+3+MGgBdGzcyBP7qK9MrwFQZlvNyJrvz6GuCaj3OukQ==, - } - engines: { node: ">=12" } - cpu: [arm] - 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-ia32@0.19.8: - resolution: - { - integrity: sha512-1a8suQiFJmZz1khm/rDglOc8lavtzEMRo0v6WhPgxkrjcU0LkHj+TwBrALwoz/OtMExvsqbbMI0ChyelKabSvQ==, - } - 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-loong64@0.19.8: - resolution: - { - integrity: sha512-fHZWS2JJxnXt1uYJsDv9+b60WCc2RlvVAy1F76qOLtXRO+H4mjt3Tr6MJ5l7Q78X8KgCFudnTuiQRBhULUyBKQ==, - } - 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-mips64el@0.19.8: - resolution: - { - integrity: sha512-Wy/z0EL5qZYLX66dVnEg9riiwls5IYnziwuju2oUiuxVc+/edvqXa04qNtbrs0Ukatg5HEzqT94Zs7J207dN5Q==, - } - 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-ppc64@0.19.8: - resolution: - { - integrity: sha512-ETaW6245wK23YIEufhMQ3HSeHO7NgsLx8gygBVldRHKhOlD1oNeNy/P67mIh1zPn2Hr2HLieQrt6tWrVwuqrxg==, - } - 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-riscv64@0.19.8: - resolution: - { - integrity: sha512-T2DRQk55SgoleTP+DtPlMrxi/5r9AeFgkhkZ/B0ap99zmxtxdOixOMI570VjdRCs9pE4Wdkz7JYrsPvsl7eESg==, - } - 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-s390x@0.19.8: - resolution: - { - integrity: sha512-NPxbdmmo3Bk7mbNeHmcCd7R7fptJaczPYBaELk6NcXxy7HLNyWwCyDJ/Xx+/YcNH7Im5dHdx9gZ5xIwyliQCbg==, - } - 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/linux-x64@0.19.8: - resolution: - { - integrity: sha512-lytMAVOM3b1gPypL2TRmZ5rnXl7+6IIk8uB3eLsV1JwcizuolblXRrc5ShPrO9ls/b+RTp+E6gbsuLWHWi2zGg==, - } - 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/netbsd-x64@0.19.8: - resolution: - { - integrity: sha512-hvWVo2VsXz/8NVt1UhLzxwAfo5sioj92uo0bCfLibB0xlOmimU/DeAEsQILlBQvkhrGjamP0/el5HU76HAitGw==, - } - 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/openbsd-x64@0.19.8: - resolution: - { - integrity: sha512-/7Y7u77rdvmGTxR83PgaSvSBJCC2L3Kb1M/+dmSIvRvQPXXCuC97QAwMugBNG0yGcbEGfFBH7ojPzAOxfGNkwQ==, - } - 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/sunos-x64@0.19.8: - resolution: - { - integrity: sha512-9Lc4s7Oi98GqFA4HzA/W2JHIYfnXbUYgekUP/Sm4BG9sfLjyv6GKKHKKVs83SMicBF2JwAX6A1PuOLMqpD001w==, - } - 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-arm64@0.19.8: - resolution: - { - integrity: sha512-rq6WzBGjSzihI9deW3fC2Gqiak68+b7qo5/3kmB6Gvbh/NYPA0sJhrnp7wgV4bNwjqM+R2AApXGxMO7ZoGhIJg==, - } - 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-ia32@0.19.8: - resolution: - { - integrity: sha512-AIAbverbg5jMvJznYiGhrd3sumfwWs8572mIJL5NQjJa06P8KfCPWZQ0NwZbPQnbQi9OWSZhFVSUWjjIrn4hSw==, - } - 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 - - /@esbuild/win32-x64@0.19.8: - resolution: - { - integrity: sha512-bfZ0cQ1uZs2PqpulNL5j/3w+GDhP36k1K5c38QdQg+Swy51jFZWWeIkteNsufkQxp986wnqRRsb/bHbY1WQ7TA==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@eslint-community/eslint-utils@4.4.0(eslint@8.55.0): - resolution: - { - integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.55.0 - eslint-visitor-keys: 3.4.3 - - /@eslint-community/regexpp@4.10.0: - resolution: - { - integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==, - } - engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } - - /@eslint/eslintrc@2.1.4: - resolution: - { - integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.6.1 - globals: 13.23.0 - ignore: 5.3.0 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - /@eslint/js@8.55.0: - resolution: - { - integrity: sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - - /@fastify/busboy@2.1.0: - resolution: - { - integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==, - } - engines: { node: ">=14" } - - /@hono/swagger-ui@0.2.0(hono@3.11.3): - resolution: - { - integrity: sha512-ulWqCI+38vTlxxBmOAi5VTOUDa5/7fKHPTwyq00kRUjUxPp3Ej5Cs+B/fvGs5gd3KraArLArkln7sHhb5vODZA==, - } - peerDependencies: - hono: "*" - dependencies: - hono: 3.11.3 - dev: false - - /@hono/zod-openapi@0.9.3(hono@3.11.3)(zod@3.22.4): - resolution: - { - integrity: sha512-PdKWwUvMdoQ2eqJZtbo4N4qb2VRjHNnDcfWW3/IqSeJDyK4vIPHAzWfgtUOYHAXJAiooQQ87m0sw2iME2H1+zQ==, - } - engines: { node: ">=16.0.0" } - peerDependencies: - hono: ">=3.11.3" - zod: 3.* - dependencies: - "@asteasolutions/zod-to-openapi": 5.5.0(zod@3.22.4) - "@hono/zod-validator": 0.1.11(hono@3.11.3)(zod@3.22.4) - hono: 3.11.3 - zod: 3.22.4 - dev: false - - /@hono/zod-validator@0.1.11(hono@3.11.3)(zod@3.22.4): - resolution: - { - integrity: sha512-PQXeHUP0+36qpRt8yfeD7N2jbK3ETlGvSN6dMof/HwUC/APRokQRjpXZm4rrlG71Ft0aWE01+Bm4XejqPie5Uw==, - } - peerDependencies: - hono: ">=3.9.0" - zod: ^3.19.1 - dependencies: - hono: 3.11.3 - zod: 3.22.4 - dev: false - - /@humanwhocodes/config-array@0.11.13: - resolution: - { - integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==, - } - engines: { node: ">=10.10.0" } - dependencies: - "@humanwhocodes/object-schema": 2.0.1 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - /@humanwhocodes/module-importer@1.0.1: - resolution: - { - integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, - } - engines: { node: ">=12.22" } - - /@humanwhocodes/object-schema@2.0.1: - resolution: - { - integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==, - } - - /@ioredis/commands@1.2.0: - resolution: - { - integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==, - } - dev: false - - /@libsql/client@0.4.0-pre.5: - resolution: - { - integrity: sha512-GyKigCBslE5uztwT7mpvp9Zn0z3iWjnufcfeTeDSFPMyXCPjSAHUOiwSLAaHii909w6EQacA692CXmYYFo/eig==, - } - dependencies: - "@libsql/hrana-client": 0.5.5 - js-base64: 3.7.5 - libsql: 0.2.0-pre.4 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - dev: false - - /@libsql/darwin-arm64@0.2.0-pre.4: - resolution: - { - integrity: sha512-kb0f/FeZxzeqa+j6O7xI9toOeoTNCJnErOcNyWWzoqA5JZ4LJ9dCMrLPWe4Np22+Rg57NPmFz/Z7MFNP2y5Gow==, - } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@libsql/darwin-x64@0.2.0-pre.4: - resolution: - { - integrity: sha512-HQM9cmGP4t+ujbyhA6rjQ8K4iHw5DStq3YnL8030k5z4KHGkAOIcRbVj3m65J72Gy+tCsisUCZTrBjIFkjOFhA==, - } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@libsql/hrana-client@0.5.5: - resolution: - { - integrity: sha512-i+hDBpiV719poqEiHupUUZYKJ9YSbCRFe5Q2PQ0v3mHIftePH6gayLjp2u6TXbqbO/Dv6y8yyvYlBXf/kFfRZA==, - } - dependencies: - "@libsql/isomorphic-fetch": 0.1.10 - "@libsql/isomorphic-ws": 0.1.5 - js-base64: 3.7.5 - node-fetch: 3.3.2 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - dev: false - - /@libsql/isomorphic-fetch@0.1.10: - resolution: - { - integrity: sha512-dH0lMk50gKSvEKD78xWMu60SY1sjp1sY//iFLO0XMmBwfVfG136P9KOk06R4maBdlb8KMXOzJ1D28FR5ZKnHTA==, - } - dependencies: - "@types/node-fetch": 2.6.9 - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding - dev: false - - /@libsql/isomorphic-ws@0.1.5: - resolution: - { - integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==, - } - dependencies: - "@types/ws": 8.5.10 - ws: 8.14.2 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: false - - /@libsql/linux-arm64-gnu@0.2.0-pre.4: - resolution: - { - integrity: sha512-1VVhnSx+vSDCLXxfUP9kRGbZyy+Si6tvPQZ8JqZftt9EJG1Dvzp1E1TT8zFYMeBQeVyoV4KryctW5b5uZkqVQA==, - } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@libsql/linux-arm64-musl@0.2.0-pre.4: - resolution: - { - integrity: sha512-lbSeR5agUDkpHTT3OOnuINWEr7OsX+XCwJ21bkceoXu/napW7A3auiOjzK7mneI+vT7fRjay0caivrdoqgeKKg==, - } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@libsql/linux-x64-gnu@0.2.0-pre.4: - resolution: - { - integrity: sha512-OBiu0+tEVj2daJJrcg1uhEtHx7CsED8QesEqz8dhoK0Dad1oSn8XUpulhiMiXP1JFlcr7Zz37eKJdQxv17WTfw==, - } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@libsql/linux-x64-musl@0.2.0-pre.4: - resolution: - { - integrity: sha512-iJr3XiUTsB8ic4+DTG8412o9NZ3ifCEM+FaZ0/uxh3xlERbYUMUZhAIylxJqYjovld0edd6Nns7OJfu5b8Ae2g==, - } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@libsql/win32-x64-msvc@0.2.0-pre.4: - resolution: - { - integrity: sha512-kV/Bl6RBMCm24LFmlowl//TvD8jhRjSmUjComXdQ4j5JrAW29MVEb5EtrA16qGzeWb06tSMII0z5yqEaYxvQbQ==, - } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@lucia-auth/adapter-sqlite@3.0.0-beta.9(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2)(lucia@3.0.0-beta.11): - resolution: - { - integrity: sha512-Z6kW5ebeEDMlUcJu3bf4USbUuPa2rcCKWJxHdK0jqiPoJfNJrUpg/yBfoUZ7CJ/mucTAKV9EjcrVZSUTHvesGA==, - } - peerDependencies: - "@libsql/client": ^0.3.0 - better-sqlite3: 8.x - 9.x - lucia: 3.0.0-beta.11 - peerDependenciesMeta: - "@libsql/client": - optional: true - better-sqlite3: - optional: true - dependencies: - "@libsql/client": 0.4.0-pre.5 - better-sqlite3: 9.2.2 - lucia: 3.0.0-beta.11 - dev: false - - /@neon-rs/load@0.0.4: - resolution: - { - integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==, - } - dev: false - - /@node-rs/argon2-android-arm-eabi@1.5.2: - resolution: - { - integrity: sha512-vVZec4ITr9GumAy0p8Zj8ozie362gtbZrTkLp9EqvuFZ/HrZzR09uS2IsDgm4mAstg/rc4A1gLRrHI8jDdbjkA==, - } - engines: { node: ">= 10" } - cpu: [arm] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-android-arm64@1.5.2: - resolution: - { - integrity: sha512-SwhnsXyrpgtWDTwYds1WUnxLA/kVP8HVaImYwQ3Wemqj1lkzcSoIaNyjNWkyrYGqO1tVc1YUrqsbd5eCHh+3sg==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-darwin-arm64@1.5.2: - resolution: - { - integrity: sha512-+1ZMKiCCv2pip/o1Xg09piQru2LOIBPQ1vS4is86f55N3jjZnSfP+db5mYCSRuB0gRYqui98he7su7OGXlF4gQ==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-darwin-x64@1.5.2: - resolution: - { - integrity: sha512-mQ57mORlsxpfjcEsVpiHyHCOp6Ljrz/rVNWk8ihnPWw0qt0EqF1zbHRxTEPemL1iBHL9UyXpXrKS4JKq6xMn5w==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-freebsd-x64@1.5.2: - resolution: - { - integrity: sha512-UjKbFd3viYcpiwflkU4haEdNUMk1V2fVCJImWLWQns/hVval9BrDv5xsBwgdynbPHDlPOiWj816LBQwhWLGVWA==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-arm-gnueabihf@1.5.2: - resolution: - { - integrity: sha512-36GJjJBnVuscV9CTn8RVDeJysnmIzr6Lp7QBCDczYHi6eKFuA8udCJb4SRyJqdvIuzycKG1RL56FbcFBJYCYIA==, - } - engines: { node: ">= 10" } - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-arm64-gnu@1.5.2: - resolution: - { - integrity: sha512-sE0ydb2gp6xC+5vbVz8l3paaiBbFQIB2Rwp5wx9MmKiYdTfcO5WkGeADuSgoFiTcSEz1RsHXqrdVy6j/LtSqtA==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-arm64-musl@1.5.2: - resolution: - { - integrity: sha512-LhE0YHB0aJCwlbsQrwePik/KFWUc9qMriJIL5KiejK3bDoTVY4ihH587QT56JyaLvl3nBJaAV8l5yMqQdHnouA==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-x64-gnu@1.5.2: - resolution: - { - integrity: sha512-MnKLiBlyg05pxvKXe3lNgBL9El9ThD74hvVEiWH1Xk40RRrJ507NCOWXVmQ0FDq1mjTeGFxbIvk+AcoF0NSLIQ==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-x64-musl@1.5.2: - resolution: - { - integrity: sha512-tzLgASY0Ng2OTW7Awwl9UWzjbWx8/uD6gXcZ/k/nYGSZE5Xp8EOD2NUqHLbK6KZE3775A0R25ShpiSxCadYqkg==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-win32-arm64-msvc@1.5.2: - resolution: - { - integrity: sha512-vpTwSvv3oUXTpWZh0/HxdJ5wFMlmS7aVDwL4ATWepTZhMG4n+TO0+tVLdcPHCbg0oc6hCWBjWNPlSn9mW+YIgA==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-win32-ia32-msvc@1.5.2: - resolution: - { - integrity: sha512-KPpZR15ui7uQWQXKmtaKyUQRs4UJdXnIIfiyFLGmLWCdEKlr3MtIGFt0fdziu4BF5ZObD8Ic6QvT0VXK4OJiww==, - } - engines: { node: ">= 10" } - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-win32-x64-msvc@1.5.2: - resolution: - { - integrity: sha512-/pGuwixJS8ZlpwhX9iM6g6JEeZYo1TtnNf8exwsOi7gxcUoTUfw5it+5GfbY/n+xRBz/DIU4bzUmXmh+7Gh0ug==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2@1.5.2: - resolution: - { - integrity: sha512-qq7wOSsdP2b4rXEapWNmsCjpaTGZWtp9kZmri98GYCDZqN8UJUG5zSue4XtYWWJMWKJVE/hkaIwk+BgN1ZUn0Q==, - } - engines: { node: ">= 10" } - optionalDependencies: - "@node-rs/argon2-android-arm-eabi": 1.5.2 - "@node-rs/argon2-android-arm64": 1.5.2 - "@node-rs/argon2-darwin-arm64": 1.5.2 - "@node-rs/argon2-darwin-x64": 1.5.2 - "@node-rs/argon2-freebsd-x64": 1.5.2 - "@node-rs/argon2-linux-arm-gnueabihf": 1.5.2 - "@node-rs/argon2-linux-arm64-gnu": 1.5.2 - "@node-rs/argon2-linux-arm64-musl": 1.5.2 - "@node-rs/argon2-linux-x64-gnu": 1.5.2 - "@node-rs/argon2-linux-x64-musl": 1.5.2 - "@node-rs/argon2-win32-arm64-msvc": 1.5.2 - "@node-rs/argon2-win32-ia32-msvc": 1.5.2 - "@node-rs/argon2-win32-x64-msvc": 1.5.2 - dev: false - - /@node-rs/bcrypt-android-arm-eabi@1.7.3: - resolution: - { - integrity: sha512-l53RuBqnqNvBN2jx09Ws6jpLmuQdSDx10n0GeaTfwh1svxsC8bPpVmxkfBExsT2Tu7KF38gTnPZvwsxysZQyPQ==, - } - engines: { node: ">= 10" } - cpu: [arm] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-android-arm64@1.7.3: - resolution: - { - integrity: sha512-TZpm4VbiViqDMvusrcYzLr1b1M5FDF0cDNiTUciLeBSsKtU5lNdEZGAU7gvCnrKoUWpGuOblHU7613zuB7SiNQ==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-darwin-arm64@1.7.3: - resolution: - { - integrity: sha512-SiUuAabynVsmixZMjh5xrn8w47EnV0HzbW9st4DPoVhn/wzdUcksIXDY75aoQG2EIzKLN8IGb+CIVnPGmRyhxw==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-darwin-x64@1.7.3: - resolution: - { - integrity: sha512-R+81Z0eX4hZPvCXY5Z6l0l+JrTU3WcSYGHP0QYV9uwdaafOz6EhrCXUzZ02AIcAbNoVR8eucYVruq9PiasXoVw==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-freebsd-x64@1.7.3: - resolution: - { - integrity: sha512-0pItU/5K3e83JjcJj9fZv+78txUoZ3hHCT7n/UMdu9mkpUzhX/rqb4jmQpJpD+UQoR76xp3qDo5RMgQBffBVNg==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-arm-gnueabihf@1.7.3: - resolution: - { - integrity: sha512-HTSybWUjNe8rWuXkTkMeFDiQNHc6VioRcgv6AeHZphIxiT6dFbnhXNkfz4Hr0zxvyPhZ3NrYjT2AmPVFT6VW3Q==, - } - engines: { node: ">= 10" } - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-arm64-gnu@1.7.3: - resolution: - { - integrity: sha512-rWep6Y+v/c4bZHaM8LmSsrMwMmDR9wG4/q+3Z9VzR8xdnt5VCbuQdYWpf3sgGRGjTRdTBAdSK8x1reOjqsJ3Jg==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-arm64-musl@1.7.3: - resolution: - { - integrity: sha512-TyWEKhxr+yfGcMKzVV/ARZw+Hrky2yl91bo0XYU2ZW6I6LDC0emNsXugdWjwz8ADI4OWhhrOjXD8GCilxiB2Rg==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-x64-gnu@1.7.3: - resolution: - { - integrity: sha512-PofxM1Qg7tZKj1oP0I7tBTSSLr8Xc2uxx+P3pBCPmYzaBwWqGteNHJlF7n2q5xiH7YOlguH4w5CmcEjsiA3K4A==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-x64-musl@1.7.3: - resolution: - { - integrity: sha512-D5V6/dDVKP8S/ieDBLGhTn4oTo3upbrpWInynbhOMjJvPiIxVG1PiI3MXkWBtG9qtfleDk7gUkEKtAOxlIxDTQ==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-win32-arm64-msvc@1.7.3: - resolution: - { - integrity: sha512-b4gH2Yj5R4TwULrfMHd1Qqr+MrnFjVRUAJujDKPqi+PppSqezW8QF6DRSOL4GjnBmz5JEd64wxgeidvy7dsbGw==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-win32-ia32-msvc@1.7.3: - resolution: - { - integrity: sha512-E91ro+ybI0RhNc89aGaZQGll0YhPoHr8JacoWrNKwhg9zwNOYeuO0tokdMZdm6nF0/8obll0Mq7wO9AXO9iffw==, - } - engines: { node: ">= 10" } - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-win32-x64-msvc@1.7.3: - resolution: - { - integrity: sha512-LO/p9yjPODj/pQvPnowBuwpDdqiyUXQbqL1xb1RSP3NoyCFAGmjL5h0plSQrhLh8hskQiozBRXNaQurtsM7o0Q==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt@1.7.3: - resolution: - { - integrity: sha512-BF6u9CBPUiyk1zU+5iwikezf+xM4MFSu5cmrrg/PLKffGgIM13ZsY6DHftcTraETB04ryasjM/5IejotH+sO5Q==, - } - engines: { node: ">= 10" } - optionalDependencies: - "@node-rs/bcrypt-android-arm-eabi": 1.7.3 - "@node-rs/bcrypt-android-arm64": 1.7.3 - "@node-rs/bcrypt-darwin-arm64": 1.7.3 - "@node-rs/bcrypt-darwin-x64": 1.7.3 - "@node-rs/bcrypt-freebsd-x64": 1.7.3 - "@node-rs/bcrypt-linux-arm-gnueabihf": 1.7.3 - "@node-rs/bcrypt-linux-arm64-gnu": 1.7.3 - "@node-rs/bcrypt-linux-arm64-musl": 1.7.3 - "@node-rs/bcrypt-linux-x64-gnu": 1.7.3 - "@node-rs/bcrypt-linux-x64-musl": 1.7.3 - "@node-rs/bcrypt-win32-arm64-msvc": 1.7.3 - "@node-rs/bcrypt-win32-ia32-msvc": 1.7.3 - "@node-rs/bcrypt-win32-x64-msvc": 1.7.3 - dev: false - - /@nodelib/fs.scandir@2.1.5: - resolution: - { - integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, - } - engines: { node: ">= 8" } - dependencies: - "@nodelib/fs.stat": 2.0.5 - run-parallel: 1.2.0 - - /@nodelib/fs.stat@2.0.5: - resolution: - { - integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, - } - engines: { node: ">= 8" } - - /@nodelib/fs.walk@1.2.8: - resolution: - { - integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, - } - engines: { node: ">= 8" } - dependencies: - "@nodelib/fs.scandir": 2.1.5 - fastq: 1.15.0 - - /@parcel/watcher-android-arm64@2.3.0: - resolution: - { - integrity: sha512-f4o9eA3dgk0XRT3XhB0UWpWpLnKgrh1IwNJKJ7UJek7eTYccQ8LR7XUWFKqw6aEq5KUNlCcGvSzKqSX/vtWVVA==, - } - engines: { node: ">= 10.0.0" } - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-darwin-arm64@2.3.0: - resolution: - { - integrity: sha512-mKY+oijI4ahBMc/GygVGvEdOq0L4DxhYgwQqYAz/7yPzuGi79oXrZG52WdpGA1wLBPrYb0T8uBaGFo7I6rvSKw==, - } - engines: { node: ">= 10.0.0" } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-darwin-x64@2.3.0: - resolution: - { - integrity: sha512-20oBj8LcEOnLE3mgpy6zuOq8AplPu9NcSSSfyVKgfOhNAc4eF4ob3ldj0xWjGGbOF7Dcy1Tvm6ytvgdjlfUeow==, - } - engines: { node: ">= 10.0.0" } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-freebsd-x64@2.3.0: - resolution: - { - integrity: sha512-7LftKlaHunueAEiojhCn+Ef2CTXWsLgTl4hq0pkhkTBFI3ssj2bJXmH2L67mKpiAD5dz66JYk4zS66qzdnIOgw==, - } - engines: { node: ">= 10.0.0" } - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-linux-arm-glibc@2.3.0: - resolution: - { - integrity: sha512-1apPw5cD2xBv1XIHPUlq0cO6iAaEUQ3BcY0ysSyD9Kuyw4MoWm1DV+W9mneWI+1g6OeP6dhikiFE6BlU+AToTQ==, - } - engines: { node: ">= 10.0.0" } - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-linux-arm64-glibc@2.3.0: - resolution: - { - integrity: sha512-mQ0gBSQEiq1k/MMkgcSB0Ic47UORZBmWoAWlMrTW6nbAGoLZP+h7AtUM7H3oDu34TBFFvjy4JCGP43JlylkTQA==, - } - engines: { node: ">= 10.0.0" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-linux-arm64-musl@2.3.0: - resolution: - { - integrity: sha512-LXZAExpepJew0Gp8ZkJ+xDZaTQjLHv48h0p0Vw2VMFQ8A+RKrAvpFuPVCVwKJCr5SE+zvaG+Etg56qXvTDIedw==, - } - engines: { node: ">= 10.0.0" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-linux-x64-glibc@2.3.0: - resolution: - { - integrity: sha512-P7Wo91lKSeSgMTtG7CnBS6WrA5otr1K7shhSjKHNePVmfBHDoAOHYRXgUmhiNfbcGk0uMCHVcdbfxtuiZCHVow==, - } - engines: { node: ">= 10.0.0" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-linux-x64-musl@2.3.0: - resolution: - { - integrity: sha512-+kiRE1JIq8QdxzwoYY+wzBs9YbJ34guBweTK8nlzLKimn5EQ2b2FSC+tAOpq302BuIMjyuUGvBiUhEcLIGMQ5g==, - } - engines: { node: ">= 10.0.0" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-wasm@2.3.0: - resolution: - { - integrity: sha512-ejBAX8H0ZGsD8lSICDNyMbSEtPMWgDL0WFCt/0z7hyf5v8Imz4rAM8xY379mBsECkq/Wdqa5WEDLqtjZ+6NxfA==, - } - engines: { node: ">= 10.0.0" } - dependencies: - is-glob: 4.0.3 - micromatch: 4.0.5 - napi-wasm: 1.1.0 - dev: false - bundledDependencies: - - napi-wasm - - /@parcel/watcher-win32-arm64@2.3.0: - resolution: - { - integrity: sha512-35gXCnaz1AqIXpG42evcoP2+sNL62gZTMZne3IackM+6QlfMcJLy3DrjuL6Iks7Czpd3j4xRBzez3ADCj1l7Aw==, - } - engines: { node: ">= 10.0.0" } - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-win32-ia32@2.3.0: - resolution: - { - integrity: sha512-FJS/IBQHhRpZ6PiCjFt1UAcPr0YmCLHRbTc00IBTrelEjlmmgIVLeOx4MSXzx2HFEy5Jo5YdhGpxCuqCyDJ5ow==, - } - engines: { node: ">= 10.0.0" } - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher-win32-x64@2.3.0: - resolution: - { - integrity: sha512-dLx+0XRdMnVI62kU3wbXvbIRhLck4aE28bIGKbRGS7BJNt54IIj9+c/Dkqb+7DJEbHUZAX1bwaoM8PqVlHJmCA==, - } - engines: { node: ">= 10.0.0" } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@parcel/watcher@2.3.0: - resolution: - { - integrity: sha512-pW7QaFiL11O0BphO+bq3MgqeX/INAk9jgBldVDYjlQPO4VddoZnF22TcF9onMhnLVHuNqBJeRf+Fj7eezi/+rQ==, - } - engines: { node: ">= 10.0.0" } - dependencies: - detect-libc: 1.0.3 - is-glob: 4.0.3 - micromatch: 4.0.5 - node-addon-api: 7.0.0 - optionalDependencies: - "@parcel/watcher-android-arm64": 2.3.0 - "@parcel/watcher-darwin-arm64": 2.3.0 - "@parcel/watcher-darwin-x64": 2.3.0 - "@parcel/watcher-freebsd-x64": 2.3.0 - "@parcel/watcher-linux-arm-glibc": 2.3.0 - "@parcel/watcher-linux-arm64-glibc": 2.3.0 - "@parcel/watcher-linux-arm64-musl": 2.3.0 - "@parcel/watcher-linux-x64-glibc": 2.3.0 - "@parcel/watcher-linux-x64-musl": 2.3.0 - "@parcel/watcher-win32-arm64": 2.3.0 - "@parcel/watcher-win32-ia32": 2.3.0 - "@parcel/watcher-win32-x64": 2.3.0 - dev: false - - /@types/json-schema@7.0.15: - resolution: - { - integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, - } - dev: false - - /@types/node-fetch@2.6.9: - resolution: - { - integrity: sha512-bQVlnMLFJ2d35DkPNjEPmd9ueO/rh5EiaZt2bhqiSarPjZIuIV6bPQVqcrEyvNo+AfTrRGVazle1tl597w3gfA==, - } - dependencies: - "@types/node": 20.10.4 - form-data: 4.0.0 - dev: false - - /@types/node-forge@1.3.10: - resolution: - { - integrity: sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw==, - } - dependencies: - "@types/node": 20.10.4 - dev: true - - /@types/node@20.10.4: - resolution: - { - integrity: sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==, - } - dependencies: - undici-types: 5.26.5 - - /@types/semver@7.5.6: - resolution: - { - integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==, - } - dev: false - - /@types/ws@8.5.10: - resolution: - { - integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==, - } - dependencies: - "@types/node": 20.10.4 - dev: false - - /@typescript-eslint/eslint-plugin@6.13.2(@typescript-eslint/parser@6.13.2)(eslint@8.55.0)(typescript@5.3.3): - resolution: - { - integrity: sha512-3+9OGAWHhk4O1LlcwLBONbdXsAhLjyCFogJY/cWy2lxdVJ2JrcTF2pTGMaLl2AE7U1l31n8Py4a8bx5DLf/0dQ==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - peerDependencies: - "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - dependencies: - "@eslint-community/regexpp": 4.10.0 - "@typescript-eslint/parser": 6.13.2(eslint@8.55.0)(typescript@5.3.3) - "@typescript-eslint/scope-manager": 6.13.2 - "@typescript-eslint/type-utils": 6.13.2(eslint@8.55.0)(typescript@5.3.3) - "@typescript-eslint/utils": 6.13.2(eslint@8.55.0)(typescript@5.3.3) - "@typescript-eslint/visitor-keys": 6.13.2 - debug: 4.3.4 - eslint: 8.55.0 - graphemer: 1.4.0 - ignore: 5.3.0 - natural-compare: 1.4.0 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.3.3) - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/parser@6.13.2(eslint@8.55.0)(typescript@5.3.3): - resolution: - { - integrity: sha512-MUkcC+7Wt/QOGeVlM8aGGJZy1XV5YKjTpq9jK6r6/iLsGXhBVaGP5N0UYvFsu9BFlSpwY9kMretzdBH01rkRXg==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - dependencies: - "@typescript-eslint/scope-manager": 6.13.2 - "@typescript-eslint/types": 6.13.2 - "@typescript-eslint/typescript-estree": 6.13.2(typescript@5.3.3) - "@typescript-eslint/visitor-keys": 6.13.2 - debug: 4.3.4 - eslint: 8.55.0 - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/scope-manager@6.13.2: - resolution: - { - integrity: sha512-CXQA0xo7z6x13FeDYCgBkjWzNqzBn8RXaE3QVQVIUm74fWJLkJkaHmHdKStrxQllGh6Q4eUGyNpMe0b1hMkXFA==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - dependencies: - "@typescript-eslint/types": 6.13.2 - "@typescript-eslint/visitor-keys": 6.13.2 - dev: false - - /@typescript-eslint/type-utils@6.13.2(eslint@8.55.0)(typescript@5.3.3): - resolution: - { - integrity: sha512-Qr6ssS1GFongzH2qfnWKkAQmMUyZSyOr0W54nZNU1MDfo+U4Mv3XveeLZzadc/yq8iYhQZHYT+eoXJqnACM1tw==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - dependencies: - "@typescript-eslint/typescript-estree": 6.13.2(typescript@5.3.3) - "@typescript-eslint/utils": 6.13.2(eslint@8.55.0)(typescript@5.3.3) - debug: 4.3.4 - eslint: 8.55.0 - ts-api-utils: 1.0.3(typescript@5.3.3) - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/types@6.13.2: - resolution: - { - integrity: sha512-7sxbQ+EMRubQc3wTfTsycgYpSujyVbI1xw+3UMRUcrhSy+pN09y/lWzeKDbvhoqcRbHdc+APLs/PWYi/cisLPg==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - dev: false - - /@typescript-eslint/typescript-estree@6.13.2(typescript@5.3.3): - resolution: - { - integrity: sha512-SuD8YLQv6WHnOEtKv8D6HZUzOub855cfPnPMKvdM/Bh1plv1f7Q/0iFUDLKKlxHcEstQnaUU4QZskgQq74t+3w==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - peerDependencies: - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - dependencies: - "@typescript-eslint/types": 6.13.2 - "@typescript-eslint/visitor-keys": 6.13.2 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.3.3) - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/utils@6.13.2(eslint@8.55.0)(typescript@5.3.3): - resolution: - { - integrity: sha512-b9Ptq4eAZUym4idijCRzl61oPCwwREcfDI8xGk751Vhzig5fFZR9CyzDz4Sp/nxSLBYxUPyh4QdIDqWykFhNmQ==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.55.0) - "@types/json-schema": 7.0.15 - "@types/semver": 7.5.6 - "@typescript-eslint/scope-manager": 6.13.2 - "@typescript-eslint/types": 6.13.2 - "@typescript-eslint/typescript-estree": 6.13.2(typescript@5.3.3) - eslint: 8.55.0 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - - typescript - dev: false - - /@typescript-eslint/visitor-keys@6.13.2: - resolution: - { - integrity: sha512-OGznFs0eAQXJsp+xSd6k/O1UbFi/K/L7WjqeRoFE7vadjAF9y0uppXhYNQNEqygjou782maGClOoZwPqF0Drlw==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - dependencies: - "@typescript-eslint/types": 6.13.2 - eslint-visitor-keys: 3.4.3 - dev: false - - /@ungap/structured-clone@1.2.0: - resolution: - { - integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==, - } - - /acorn-jsx@5.3.2(acorn@8.11.2): - resolution: - { - integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, - } - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.11.2 - - /acorn-walk@8.3.1: - resolution: - { - integrity: sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==, - } - engines: { node: ">=0.4.0" } - - /acorn@8.11.2: - resolution: - { - integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==, - } - engines: { node: ">=0.4.0" } - hasBin: true - - /ajv@6.12.6: - resolution: - { - integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, - } - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - - /ansi-regex@5.0.1: - resolution: - { - integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, - } - engines: { node: ">=8" } - - /ansi-styles@4.3.0: - resolution: - { - integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, - } - engines: { node: ">=8" } - dependencies: - color-convert: 2.0.1 - - /anymatch@3.1.3: - resolution: - { - integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, - } - engines: { node: ">= 8" } - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - /arch@2.2.0: - resolution: - { - integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==, - } - dev: false - - /argparse@2.0.1: - resolution: - { - integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, - } - - /array-union@2.1.0: - resolution: - { - integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, - } - engines: { node: ">=8" } - dev: false - - /as-table@1.0.55: - resolution: - { - integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==, - } - dependencies: - printable-characters: 1.0.42 - - /asynckit@0.4.0: - resolution: - { - integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, - } - dev: false - - /balanced-match@1.0.2: - resolution: - { - integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, - } - - /base64-js@1.5.1: - resolution: - { - integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, - } - dev: false - - /better-sqlite3@9.2.2: - resolution: - { - integrity: sha512-qwjWB46il0lsDkeB4rSRI96HyDQr8sxeu1MkBVLMrwusq1KRu4Bpt1TMI+8zIJkDUtZ3umjAkaEjIlokZKWCQw==, - } - 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" } - - /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 - - /brace-expansion@1.1.11: - resolution: - { - integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, - } - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - /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==, - } - engines: { node: ">=8" } - dependencies: - fill-range: 7.0.1 - - /buffer-from@1.1.2: - resolution: - { - integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, - } - - /buffer@5.7.1: - resolution: - { - integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, - } - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: false - - /callsites@3.1.0: - resolution: - { - integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, - } - engines: { node: ">=6" } - - /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 - - /chalk@4.1.2: - resolution: - { - integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, - } - engines: { node: ">=10" } - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - /chalk@5.3.0: - resolution: - { - integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==, - } - engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } - dev: true - - /chokidar@3.5.3: - resolution: - { - integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, - } - engines: { node: ">= 8.10.0" } - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - /chownr@1.1.4: - resolution: - { - integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==, - } - dev: false - - /citty@0.1.5: - resolution: - { - integrity: sha512-AS7n5NSc0OQVMV9v6wt3ByujNIrne0/cTjiC2MYqhvao57VNfiuVksTSr2p17nVOhEr2KtqiAkGwHcgMC/qUuQ==, - } - dependencies: - consola: 3.2.3 - dev: false - - /cli-color@2.0.3: - resolution: - { - integrity: sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==, - } - engines: { node: ">=0.10" } - dependencies: - d: 1.0.1 - es5-ext: 0.10.62 - es6-iterator: 2.0.3 - memoizee: 0.4.15 - timers-ext: 0.1.7 - dev: true - - /clipboardy@3.0.0: - resolution: - { - integrity: sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - dependencies: - arch: 2.2.0 - execa: 5.1.1 - is-wsl: 2.2.0 - dev: false - - /cluster-key-slot@1.1.2: - resolution: - { - integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==, - } - engines: { node: ">=0.10.0" } - dev: false - - /color-convert@2.0.1: - resolution: - { - integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, - } - engines: { node: ">=7.0.0" } - dependencies: - color-name: 1.1.4 - - /color-name@1.1.4: - resolution: - { - integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, - } - - /combined-stream@1.0.8: - resolution: - { - integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, - } - engines: { node: ">= 0.8" } - dependencies: - delayed-stream: 1.0.0 - dev: false - - /commander@9.5.0: - resolution: - { - integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==, - } - engines: { node: ^12.20.0 || >=14 } - dev: true - - /concat-map@0.0.1: - resolution: - { - integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, - } - - /consola@3.2.3: - resolution: - { - integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==, - } - engines: { node: ^14.18.0 || >=16.10.0 } - dev: false - - /cookie-es@1.0.0: - resolution: - { - integrity: sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ==, - } - dev: false - - /cookie@0.5.0: - resolution: - { - integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==, - } - engines: { node: ">= 0.6" } - - /copy-anything@3.0.5: - resolution: - { - integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==, - } - engines: { node: ">=12.13" } - dependencies: - is-what: 4.1.16 - dev: true - - /cross-spawn@7.0.3: - resolution: - { - integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, - } - engines: { node: ">= 8" } - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - /d@1.0.1: - resolution: - { - integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==, - } - 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==, - } - - /data-uri-to-buffer@4.0.1: - resolution: - { - integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==, - } - engines: { node: ">= 12" } - dev: false - - /debug@4.3.4: - resolution: - { - integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, - } - engines: { node: ">=6.0" } - peerDependencies: - supports-color: "*" - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - - /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==, - } - - /defu@6.1.3: - resolution: - { - integrity: sha512-Vy2wmG3NTkmHNg/kzpuvHhkqeIx3ODWqasgCRbKtbXEN0G+HpEEv9BtJLp7ZG1CZloFaC41Ah3ZFbq7aqCqMeQ==, - } - dev: false - - /delayed-stream@1.0.0: - resolution: - { - integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, - } - engines: { node: ">=0.4.0" } - dev: false - - /denque@2.1.0: - resolution: - { - integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==, - } - engines: { node: ">=0.10" } - dev: false - - /destr@2.0.2: - resolution: - { - integrity: sha512-65AlobnZMiCET00KaFFjUefxDX0khFA/E4myqZ7a6Sq1yZtR8+FVIvilVX66vF2uobSumxooYZChiRPCKNqhmg==, - } - dev: false - - /detect-libc@1.0.3: - resolution: - { - integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==, - } - engines: { node: ">=0.10" } - hasBin: true - dev: false - - /detect-libc@2.0.2: - resolution: - { - integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==, - } - engines: { node: ">=8" } - dev: false - - /difflib@0.2.4: - resolution: - { - integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==, - } - dependencies: - heap: 0.2.7 - dev: true - - /dir-glob@3.0.1: - resolution: - { - integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, - } - engines: { node: ">=8" } - dependencies: - path-type: 4.0.0 - dev: false - - /doctrine@3.0.0: - resolution: - { - integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==, - } - engines: { node: ">=6.0.0" } - dependencies: - esutils: 2.0.3 - - /dotenv@16.3.1: - resolution: - { - integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==, - } - engines: { node: ">=12" } - dev: true - - /dreamopt@0.8.0: - resolution: - { - integrity: sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==, - } - engines: { node: ">=0.4.0" } - dependencies: - wordwrap: 1.0.0 - dev: true - - /drizzle-kit@0.20.6: - resolution: - { - integrity: sha512-+AYQY+tJUnfMJYIeh6aEjI21mpMCekqz0LEu2QdFdc/3zSmjyfEhH5dkXlRFME8v1rtisiHfp7bP+gVVKDPiUg==, - } - hasBin: true - dependencies: - "@drizzle-team/studio": 0.0.35 - "@esbuild-kit/esm-loader": 2.6.5 - camelcase: 7.0.1 - chalk: 5.3.0 - commander: 9.5.0 - esbuild: 0.19.8 - esbuild-register: 3.5.0(esbuild@0.19.8) - glob: 8.1.0 - hanji: 0.0.5 - json-diff: 0.9.0 - minimatch: 7.4.6 - semver: 7.5.4 - wrangler: 3.19.0 - zod: 3.22.4 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - /drizzle-orm@0.29.1(@cloudflare/workers-types@4.20231121.0)(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2)(mysql2@3.6.5): - resolution: - { - integrity: sha512-yItc4unfHnk8XkDD3/bdC63vdboTY7e7I03lCF1OJYABXSIfQYU9BFTQJXMMovVeb3T1/OJWwfW/70T1XPnuUA==, - } - 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: - "@cloudflare/workers-types": 4.20231121.0 - "@libsql/client": 0.4.0-pre.5 - better-sqlite3: 9.2.2 - mysql2: 3.6.5 - dev: false - - /drizzle-zod@0.5.1(drizzle-orm@0.29.1)(zod@3.22.4): - resolution: - { - integrity: sha512-C/8bvzUH/zSnVfwdSibOgFjLhtDtbKYmkbPbUCq46QZyZCH6kODIMSOgZ8R7rVjoI+tCj3k06MRJMDqsIeoS4A==, - } - peerDependencies: - drizzle-orm: ">=0.23.13" - zod: "*" - dependencies: - drizzle-orm: 0.29.1(@cloudflare/workers-types@4.20231121.0)(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2)(mysql2@3.6.5) - zod: 3.22.4 - dev: false - - /end-of-stream@1.4.4: - resolution: - { - integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, - } - dependencies: - once: 1.4.0 - dev: false - - /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.19.8): - resolution: - { - integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==, - } - peerDependencies: - esbuild: ">=0.12 <1" - dependencies: - debug: 4.3.4 - esbuild: 0.19.8 - 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 - - /esbuild@0.19.8: - resolution: - { - integrity: sha512-l7iffQpT2OrZfH2rXIp7/FkmaeZM0vxbxN9KfiCwGYuZqzMg/JdvX26R31Zxn/Pxvsrg3Y9N6XTcnknqDyyv4w==, - } - engines: { node: ">=12" } - hasBin: true - requiresBuild: true - optionalDependencies: - "@esbuild/android-arm": 0.19.8 - "@esbuild/android-arm64": 0.19.8 - "@esbuild/android-x64": 0.19.8 - "@esbuild/darwin-arm64": 0.19.8 - "@esbuild/darwin-x64": 0.19.8 - "@esbuild/freebsd-arm64": 0.19.8 - "@esbuild/freebsd-x64": 0.19.8 - "@esbuild/linux-arm": 0.19.8 - "@esbuild/linux-arm64": 0.19.8 - "@esbuild/linux-ia32": 0.19.8 - "@esbuild/linux-loong64": 0.19.8 - "@esbuild/linux-mips64el": 0.19.8 - "@esbuild/linux-ppc64": 0.19.8 - "@esbuild/linux-riscv64": 0.19.8 - "@esbuild/linux-s390x": 0.19.8 - "@esbuild/linux-x64": 0.19.8 - "@esbuild/netbsd-x64": 0.19.8 - "@esbuild/openbsd-x64": 0.19.8 - "@esbuild/sunos-x64": 0.19.8 - "@esbuild/win32-arm64": 0.19.8 - "@esbuild/win32-ia32": 0.19.8 - "@esbuild/win32-x64": 0.19.8 - dev: true - - /escape-string-regexp@4.0.0: - resolution: - { - integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, - } - engines: { node: ">=10" } - - /eslint-config-google@0.14.0(eslint@8.55.0): - resolution: - { - integrity: sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==, - } - engines: { node: ">=0.10.0" } - peerDependencies: - eslint: ">=5.16.0" - dependencies: - eslint: 8.55.0 - dev: true - - /eslint-plugin-json@3.1.0: - resolution: - { - integrity: sha512-MrlG2ynFEHe7wDGwbUuFPsaT2b1uhuEFhJ+W1f1u+1C2EkXmTYJp4B1aAdQQ8M+CC3t//N/oRKiIVw14L2HR1g==, - } - engines: { node: ">=12.0" } - dependencies: - lodash: 4.17.21 - vscode-json-languageservice: 4.2.1 - dev: true - - /eslint-scope@7.2.2: - resolution: - { - integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - /eslint-visitor-keys@3.4.3: - resolution: - { - integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - - /eslint@8.55.0: - resolution: - { - integrity: sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - hasBin: true - dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.55.0) - "@eslint-community/regexpp": 4.10.0 - "@eslint/eslintrc": 2.1.4 - "@eslint/js": 8.55.0 - "@humanwhocodes/config-array": 0.11.13 - "@humanwhocodes/module-importer": 1.0.1 - "@nodelib/fs.walk": 1.2.8 - "@ungap/structured-clone": 1.2.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.23.0 - graphemer: 1.4.0 - ignore: 5.3.0 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.3 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - - /espree@9.6.1: - resolution: - { - integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - acorn: 8.11.2 - acorn-jsx: 5.3.2(acorn@8.11.2) - eslint-visitor-keys: 3.4.3 - - /esquery@1.5.0: - resolution: - { - integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==, - } - engines: { node: ">=0.10" } - dependencies: - estraverse: 5.3.0 - - /esrecurse@4.3.0: - resolution: - { - integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, - } - engines: { node: ">=4.0" } - dependencies: - estraverse: 5.3.0 - - /estraverse@5.3.0: - resolution: - { - integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, - } - engines: { node: ">=4.0" } - - /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" } - - /event-emitter@0.3.5: - resolution: - { - integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==, - } - dependencies: - d: 1.0.1 - es5-ext: 0.10.62 - dev: true - - /execa@5.1.1: - resolution: - { - integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==, - } - engines: { node: ">=10" } - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: false - - /exit-hook@2.2.1: - resolution: - { - integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==, - } - engines: { node: ">=6" } - - /expand-template@2.0.3: - resolution: - { - integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==, - } - engines: { node: ">=6" } - 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==, - } - - /fast-glob@3.3.2: - resolution: - { - integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==, - } - engines: { node: ">=8.6.0" } - dependencies: - "@nodelib/fs.stat": 2.0.5 - "@nodelib/fs.walk": 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: false - - /fast-json-stable-stringify@2.1.0: - resolution: - { - integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, - } - - /fast-levenshtein@2.0.6: - resolution: - { - integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, - } - - /fastq@1.15.0: - resolution: - { - integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==, - } - dependencies: - reusify: 1.0.4 - - /fetch-blob@3.2.0: - resolution: - { - integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==, - } - engines: { node: ^12.20 || >= 14.13 } - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 3.2.1 - dev: false - - /file-entry-cache@6.0.1: - resolution: - { - integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==, - } - engines: { node: ^10.12.0 || >=12.0.0 } - dependencies: - flat-cache: 3.2.0 - - /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" } - dependencies: - to-regex-range: 5.0.1 - - /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 - - /flat-cache@3.2.0: - resolution: - { - integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==, - } - engines: { node: ^10.12.0 || >=12.0.0 } - dependencies: - flatted: 3.2.9 - keyv: 4.5.4 - rimraf: 3.0.2 - - /flatted@3.2.9: - resolution: - { - integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==, - } - - /form-data@4.0.0: - resolution: - { - integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==, - } - engines: { node: ">= 6" } - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: false - - /formdata-polyfill@4.0.10: - resolution: - { - integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==, - } - engines: { node: ">=12.20.0" } - dependencies: - fetch-blob: 3.2.0 - dev: false - - /fs-constants@1.0.0: - resolution: - { - integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==, - } - dev: false - - /fs.realpath@1.0.0: - resolution: - { - integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, - } - - /fsevents@2.3.3: - resolution: - { - integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, - } - engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } - os: [darwin] - requiresBuild: true - optional: true - /generate-function@2.3.1: - resolution: - { - integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==, - } - dependencies: - is-property: 1.0.2 - dev: false - - /get-port-please@3.1.1: - resolution: - { - integrity: sha512-3UBAyM3u4ZBVYDsxOQfJDxEa6XTbpBDrOjp4mf7ExFRt5BKs/QywQQiJsh2B+hxcZLSapWqCRvElUe8DnKcFHA==, - } - dev: false - - /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 - - /get-stream@6.0.1: - resolution: - { - integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==, - } - engines: { node: ">=10" } - dev: false - - /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" } - dependencies: - is-glob: 4.0.3 - - /glob-parent@6.0.2: - resolution: - { - integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, - } - engines: { node: ">=10.13.0" } - dependencies: - is-glob: 4.0.3 - - /glob-to-regexp@0.4.1: - resolution: - { - integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==, - } - - /glob@7.2.3: - resolution: - { - integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, - } - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - /glob@8.1.0: - resolution: - { - integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==, - } - engines: { node: ">=12" } - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - dev: true - - /globals@13.23.0: - resolution: - { - integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==, - } - engines: { node: ">=8" } - dependencies: - type-fest: 0.20.2 - - /globby@11.1.0: - resolution: - { - integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, - } - engines: { node: ">=10" } - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.0 - merge2: 1.4.1 - slash: 3.0.0 - dev: false - - /graphemer@1.4.0: - resolution: - { - integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, - } - - /h3@1.9.0: - resolution: - { - integrity: sha512-+F3ZqrNV/CFXXfZ2lXBINHi+rM4Xw3CDC5z2CDK3NMPocjonKipGLLDSkrqY9DOrioZNPTIdDMWfQKm//3X2DA==, - } - dependencies: - cookie-es: 1.0.0 - defu: 6.1.3 - destr: 2.0.2 - iron-webcrypto: 1.0.0 - radix3: 1.1.0 - ufo: 1.3.2 - uncrypto: 0.1.3 - unenv: 1.8.0 - dev: false - - /hanji@0.0.5: - resolution: - { - integrity: sha512-Abxw1Lq+TnYiL4BueXqMau222fPSPMFtya8HdpWsz/xVAhifXou71mPh/kY2+08RgFcVccjG3uZHs6K5HAe3zw==, - } - dependencies: - lodash.throttle: 4.1.1 - sisteransi: 1.0.5 - dev: true - - /has-flag@4.0.0: - resolution: - { - integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, - } - engines: { node: ">=8" } - - /heap@0.2.7: - resolution: - { - integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==, - } - dev: true - - /hono@3.11.3: - resolution: - { - integrity: sha512-MWYBcIS4dZJo9e/852Zwl+gqBiUSRknMOZ/MbW7kW8JiWixTJ58pzXVIeBq7jnvFq3AZ9uQ35QyVpzV05sdNFw==, - } - engines: { node: ">=16.0.0" } - dev: false - - /http-shutdown@1.2.2: - resolution: - { - integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==, - } - engines: { iojs: ">= 1.0.0", node: ">= 0.12.0" } - dev: false - - /human-signals@2.1.0: - resolution: - { - integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==, - } - engines: { node: ">=10.17.0" } - dev: false - - /husky@8.0.3: - resolution: - { - integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==, - } - engines: { node: ">=14" } - hasBin: true - dev: true - - /iconv-lite@0.6.3: - resolution: - { - integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, - } - 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@5.3.0: - resolution: - { - integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==, - } - engines: { node: ">= 4" } - - /import-fresh@3.3.0: - resolution: - { - integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, - } - engines: { node: ">=6" } - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - /imurmurhash@0.1.4: - resolution: - { - integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, - } - engines: { node: ">=0.8.19" } - - /inflight@1.0.6: - resolution: - { - integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, - } - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - /inherits@2.0.4: - resolution: - { - integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, - } - - /ini@1.3.8: - resolution: - { - integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, - } - dev: false - - /ioredis@5.3.2: - resolution: - { - integrity: sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==, - } - engines: { node: ">=12.22.0" } - dependencies: - "@ioredis/commands": 1.2.0 - cluster-key-slot: 1.1.2 - debug: 4.3.4 - denque: 2.1.0 - lodash.defaults: 4.2.0 - lodash.isarguments: 3.1.0 - redis-errors: 1.2.0 - redis-parser: 3.0.0 - standard-as-callback: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: false - - /iron-webcrypto@1.0.0: - resolution: - { - integrity: sha512-anOK1Mktt8U1Xi7fCM3RELTuYbnFikQY5VtrDj7kPgpejV7d43tWKhzgioO0zpkazLEL/j/iayRqnJhrGfqUsg==, - } - dev: false - - /is-binary-path@2.1.0: - resolution: - { - integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, - } - engines: { node: ">=8" } - dependencies: - binary-extensions: 2.2.0 - - /is-docker@2.2.1: - resolution: - { - integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==, - } - engines: { node: ">=8" } - hasBin: true - dev: false - - /is-extglob@2.1.1: - resolution: - { - integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, - } - engines: { node: ">=0.10.0" } - - /is-glob@4.0.3: - resolution: - { - integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, - } - engines: { node: ">=0.10.0" } - dependencies: - is-extglob: 2.1.1 - - /is-number@7.0.0: - resolution: - { - integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, - } - engines: { node: ">=0.12.0" } - - /is-path-inside@3.0.3: - resolution: - { - integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, - } - engines: { node: ">=8" } - - /is-promise@2.2.2: - resolution: - { - integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==, - } - dev: true - - /is-property@1.0.2: - resolution: - { - integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==, - } - dev: false - - /is-stream@2.0.1: - resolution: - { - integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, - } - engines: { node: ">=8" } - dev: false - - /is-what@4.1.16: - resolution: - { - integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==, - } - engines: { node: ">=12.13" } - dev: true - - /is-wsl@2.2.0: - resolution: - { - integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==, - } - engines: { node: ">=8" } - dependencies: - is-docker: 2.2.1 - dev: false - - /isexe@2.0.0: - resolution: - { - integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, - } - - /jiti@1.21.0: - resolution: - { - integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==, - } - hasBin: true - dev: false - - /js-base64@3.7.5: - resolution: - { - integrity: sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==, - } - dev: false - - /js-yaml@4.1.0: - resolution: - { - integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, - } - hasBin: true - dependencies: - argparse: 2.0.1 - - /json-buffer@3.0.1: - resolution: - { - integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, - } - - /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-schema-traverse@0.4.1: - resolution: - { - integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, - } - - /json-stable-stringify-without-jsonify@1.0.1: - resolution: - { - integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, - } - - /jsonc-parser@3.2.0: - resolution: - { - integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==, - } - - /keyv@4.5.4: - resolution: - { - integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, - } - dependencies: - json-buffer: 3.0.1 - - /levn@0.4.1: - resolution: - { - integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, - } - engines: { node: ">= 0.8.0" } - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - - /libsql@0.2.0-pre.4: - resolution: - { - integrity: sha512-ZAud4bIZwWJjZUKvQOgg3yVX2fVuqVuPOtjFAPuo+FpfMcsnBpGfOcIJxvfik5qKchyqHd/fpHWbFk7/X0XuHg==, - } - cpu: [x64, arm64] - os: [darwin, linux, win32] - dependencies: - "@neon-rs/load": 0.0.4 - detect-libc: 2.0.2 - optionalDependencies: - "@libsql/darwin-arm64": 0.2.0-pre.4 - "@libsql/darwin-x64": 0.2.0-pre.4 - "@libsql/linux-arm64-gnu": 0.2.0-pre.4 - "@libsql/linux-arm64-musl": 0.2.0-pre.4 - "@libsql/linux-x64-gnu": 0.2.0-pre.4 - "@libsql/linux-x64-musl": 0.2.0-pre.4 - "@libsql/win32-x64-msvc": 0.2.0-pre.4 - dev: false - - /listhen@1.5.5: - resolution: - { - integrity: sha512-LXe8Xlyh3gnxdv4tSjTjscD1vpr/2PRpzq8YIaMJgyKzRG8wdISlWVWnGThJfHnlJ6hmLt2wq1yeeix0TEbuoA==, - } - hasBin: true - dependencies: - "@parcel/watcher": 2.3.0 - "@parcel/watcher-wasm": 2.3.0 - citty: 0.1.5 - clipboardy: 3.0.0 - consola: 3.2.3 - defu: 6.1.3 - get-port-please: 3.1.1 - h3: 1.9.0 - http-shutdown: 1.2.2 - jiti: 1.21.0 - mlly: 1.4.2 - node-forge: 1.3.1 - pathe: 1.1.1 - std-env: 3.6.0 - ufo: 1.3.2 - untun: 0.1.2 - uqr: 0.1.2 - dev: false - - /locate-path@6.0.0: - resolution: - { - integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, - } - engines: { node: ">=10" } - dependencies: - p-locate: 5.0.0 - - /lodash.defaults@4.2.0: - resolution: - { - integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==, - } - dev: false - - /lodash.isarguments@3.1.0: - resolution: - { - integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==, - } - dev: false - - /lodash.merge@4.6.2: - resolution: - { - integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, - } - - /lodash.throttle@4.1.1: - resolution: - { - integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==, - } - dev: true - - /lodash@4.17.21: - resolution: - { - integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, - } - dev: true - - /long@5.2.3: - resolution: - { - integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==, - } - dev: false - - /lru-cache@10.1.0: - resolution: - { - integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==, - } - engines: { node: 14 || >=16.14 } - dev: false - - /lru-cache@6.0.0: - resolution: - { - integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, - } - engines: { node: ">=10" } - dependencies: - yallist: 4.0.0 - - /lru-cache@7.18.3: - resolution: - { - integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==, - } - engines: { node: ">=12" } - dev: false - - /lru-cache@8.0.5: - resolution: - { - integrity: sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==, - } - engines: { node: ">=16.14" } - dev: false - - /lru-queue@0.1.0: - resolution: - { - integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==, - } - dependencies: - es5-ext: 0.10.62 - dev: true - - /lucia@3.0.0-beta.11: - resolution: - { - integrity: sha512-OXZfnM4KifDjkTTG3ruihormyOcXBz6wjAWibAAlw42zWBXDsleFR34gwKBxxXBa+TodzuKy7rcg8FGOMwwSGA==, - } - dependencies: - oslo: 0.23.5 - dev: false - - /magic-string@0.25.9: - resolution: - { - integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==, - } - dependencies: - sourcemap-codec: 1.4.8 - dev: true - - /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-stream@2.0.0: - resolution: - { - integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, - } - dev: false - - /merge2@1.4.1: - resolution: - { - integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, - } - engines: { node: ">= 8" } - dev: false - - /micromatch@4.0.5: - resolution: - { - integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, - } - engines: { node: ">=8.6" } - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - dev: false - - /mime-db@1.52.0: - resolution: - { - integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, - } - engines: { node: ">= 0.6" } - dev: false - - /mime-types@2.1.35: - resolution: - { - integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, - } - engines: { node: ">= 0.6" } - dependencies: - mime-db: 1.52.0 - 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: false - - /mimic-response@3.1.0: - resolution: - { - integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==, - } - engines: { node: ">=10" } - dev: false - - /miniflare@3.20231030.3: - resolution: - { - integrity: sha512-lquHSh0XiO8uoWDujOLHtDS9mkUTJTc5C5amiQ6A++5y0f+DWiMqbDBvvwjlYf4Dvqk6ChFya9dztk7fg2ZVxA==, - } - engines: { node: ">=16.13" } - hasBin: true - dependencies: - acorn: 8.11.2 - acorn-walk: 8.3.1 - 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.28.2 - workerd: 1.20231030.0 - ws: 8.14.2 - youch: 3.3.3 - zod: 3.22.4 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - /minimatch@3.1.2: - resolution: - { - integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, - } - dependencies: - brace-expansion: 1.1.11 - - /minimatch@5.1.6: - resolution: - { - integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==, - } - engines: { node: ">=10" } - dependencies: - brace-expansion: 2.0.1 - dev: true - - /minimatch@7.4.6: - resolution: - { - integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==, - } - engines: { node: ">=10" } - dependencies: - brace-expansion: 2.0.1 - dev: true - - /minimist@1.2.8: - resolution: - { - integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, - } - dev: false - - /mkdirp-classic@0.5.3: - resolution: - { - integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==, - } - dev: false - - /mlly@1.4.2: - resolution: - { - integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==, - } - dependencies: - acorn: 8.11.2 - pathe: 1.1.1 - pkg-types: 1.0.3 - ufo: 1.3.2 - dev: false - - /mri@1.2.0: - resolution: - { - integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==, - } - engines: { node: ">=4" } - dev: false - - /ms@2.1.2: - resolution: - { - integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, - } - - /mustache@4.2.0: - resolution: - { - integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==, - } - hasBin: true - - /mysql2@3.6.5: - resolution: - { - integrity: sha512-pS/KqIb0xlXmtmqEuTvBXTmLoQ5LmAz5NW/r8UyQ1ldvnprNEj3P9GbmuQQ2J0A4LO+ynotGi6TbscPa8OUb+w==, - } - engines: { node: ">= 8.0" } - dependencies: - denque: 2.1.0 - generate-function: 2.3.1 - iconv-lite: 0.6.3 - long: 5.2.3 - lru-cache: 8.0.5 - named-placeholders: 1.1.3 - seq-queue: 0.0.5 - sqlstring: 2.3.3 - dev: false - - /named-placeholders@1.1.3: - resolution: - { - integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==, - } - engines: { node: ">=12.0.0" } - dependencies: - lru-cache: 7.18.3 - dev: false - - /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==, - } - dev: false - - /napi-wasm@1.1.0: - resolution: - { - integrity: sha512-lHwIAJbmLSjF9VDRm9GoVOy9AGp3aIvkjv+Kvz9h16QR3uSVYH78PNQUnT2U4X53mhlnV2M7wrhibQ3GHicDmg==, - } - dev: false - - /natural-compare@1.4.0: - resolution: - { - integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, - } - - /next-tick@1.1.0: - resolution: - { - integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==, - } - dev: true - - /node-abi@3.52.0: - resolution: - { - integrity: sha512-JJ98b02z16ILv7859irtXn4oUaFWADtvkzy2c0IAatNVX2Mc9Yoh8z6hZInn3QwvMEYhHuQloYi+TTQy67SIdQ==, - } - engines: { node: ">=10" } - dependencies: - semver: 7.5.4 - dev: false - - /node-addon-api@7.0.0: - resolution: - { - integrity: sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==, - } - dev: false - - /node-domexception@1.0.0: - resolution: - { - integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==, - } - engines: { node: ">=10.5.0" } - dev: false - - /node-fetch-native@1.4.1: - resolution: - { - integrity: sha512-NsXBU0UgBxo2rQLOeWNZqS3fvflWePMECr8CoSWoSTqCqGbVVsvl9vZu1HfQicYN0g5piV9Gh8RTEvo/uP752w==, - } - dev: false - - /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-fetch@3.3.2: - resolution: - { - integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - dependencies: - data-uri-to-buffer: 4.0.1 - fetch-blob: 3.2.0 - formdata-polyfill: 4.0.10 - dev: false - - /node-forge@1.3.1: - resolution: - { - integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==, - } - engines: { node: ">= 6.13.0" } - - /normalize-path@3.0.0: - resolution: - { - integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, - } - engines: { node: ">=0.10.0" } - - /npm-run-path@4.0.1: - resolution: - { - integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==, - } - engines: { node: ">=8" } - dependencies: - path-key: 3.1.1 - dev: false - - /ofetch@1.3.3: - resolution: - { - integrity: sha512-s1ZCMmQWXy4b5K/TW9i/DtiN8Ku+xCiHcjQ6/J/nDdssirrQNOoB165Zu8EqLMA2lln1JUth9a0aW9Ap2ctrUg==, - } - dependencies: - destr: 2.0.2 - node-fetch-native: 1.4.1 - ufo: 1.3.2 - dev: false - - /once@1.4.0: - resolution: - { - integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, - } - dependencies: - wrappy: 1.0.2 - - /onetime@5.1.2: - resolution: - { - integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, - } - engines: { node: ">=6" } - dependencies: - mimic-fn: 2.1.0 - dev: false - - /openapi3-ts@4.1.2: - resolution: - { - integrity: sha512-B7gOkwsYMZO7BZXwJzXCuVagym2xhqsrilVvV0dnq2Di4+iLUXKVX9gOK23ZqaAHZOwABXN0QTdW8QnkUTX6DA==, - } - dependencies: - yaml: 2.3.4 - - /optionator@0.9.3: - resolution: - { - integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==, - } - engines: { node: ">= 0.8.0" } - dependencies: - "@aashutoshrathi/word-wrap": 1.2.6 - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - - /oslo@0.23.5: - resolution: - { - integrity: sha512-G+q/MkR0IPaUA1+FpHL0pneAHJzhNpg9P4VXASy4JQy1KGFyfhi30DphVHYNKQC+C05VhDi/sTGdOX+yfcrT3g==, - } - dependencies: - "@node-rs/argon2": 1.5.2 - "@node-rs/bcrypt": 1.7.3 - dev: false - - /p-limit@3.1.0: - resolution: - { - integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, - } - engines: { node: ">=10" } - dependencies: - yocto-queue: 0.1.0 - - /p-locate@5.0.0: - resolution: - { - integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, - } - engines: { node: ">=10" } - dependencies: - p-limit: 3.1.0 - - /parent-module@1.0.1: - resolution: - { - integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, - } - engines: { node: ">=6" } - dependencies: - callsites: 3.1.0 - - /path-exists@4.0.0: - resolution: - { - integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, - } - engines: { node: ">=8" } - - /path-is-absolute@1.0.1: - resolution: - { - integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, - } - engines: { node: ">=0.10.0" } - - /path-key@3.1.1: - resolution: - { - integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, - } - engines: { node: ">=8" } - - /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" } - dev: false - - /pathe@1.1.1: - resolution: - { - integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==, - } - dev: false - - /picomatch@2.3.1: - resolution: - { - integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, - } - engines: { node: ">=8.6" } - - /pkg-types@1.0.3: - resolution: - { - integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==, - } - dependencies: - jsonc-parser: 3.2.0 - mlly: 1.4.2 - pathe: 1.1.1 - dev: false - - /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.52.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 - - /prelude-ls@1.2.1: - resolution: - { - integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, - } - engines: { node: ">= 0.8.0" } - - /prettier@3.1.0: - resolution: - { - integrity: sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==, - } - engines: { node: ">=14" } - hasBin: true - dev: false - - /printable-characters@1.0.42: - resolution: - { - integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==, - } - - /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" } - - /queue-microtask@1.2.3: - resolution: - { - integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, - } - - /radix3@1.1.0: - resolution: - { - integrity: sha512-pNsHDxbGORSvuSScqNJ+3Km6QAVqk8CfsCBIEoDgpqLrkD2f3QM4I7d1ozJJ172OmIcoUcerZaNWqtLkRXTV3A==, - } - dev: false - - /rc@1.2.8: - resolution: - { - integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==, - } - hasBin: true - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - dev: false - - /readable-stream@3.6.2: - resolution: - { - integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, - } - engines: { node: ">= 6" } - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - dev: false - - /readdirp@3.6.0: - resolution: - { - integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, - } - engines: { node: ">=8.10.0" } - dependencies: - picomatch: 2.3.1 - - /redis-errors@1.2.0: - resolution: - { - integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==, - } - engines: { node: ">=4" } - dev: false - - /redis-parser@3.0.0: - resolution: - { - integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==, - } - engines: { node: ">=4" } - dependencies: - redis-errors: 1.2.0 - dev: false - - /resolve-from@4.0.0: - resolution: - { - integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, - } - engines: { node: ">=4" } - - /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" } - dev: true - - /reusify@1.0.4: - resolution: - { - integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, - } - engines: { iojs: ">=1.0.0", node: ">=0.10.0" } - - /rimraf@3.0.2: - resolution: - { - integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, - } - hasBin: true - dependencies: - glob: 7.2.3 - - /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. - 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 - dev: true - - /run-parallel@1.2.0: - resolution: - { - integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, - } - dependencies: - queue-microtask: 1.2.3 - - /safe-buffer@5.2.1: - resolution: - { - integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, - } - dev: false - - /safer-buffer@2.1.2: - resolution: - { - integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, - } - dev: false - - /selfsigned@2.4.1: - resolution: - { - integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==, - } - engines: { node: ">=10" } - dependencies: - "@types/node-forge": 1.3.10 - node-forge: 1.3.1 - dev: true - - /semver@7.5.4: - resolution: - { - integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==, - } - engines: { node: ">=10" } - hasBin: true - dependencies: - lru-cache: 6.0.0 - - /seq-queue@0.0.5: - resolution: - { - integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==, - } - dev: false - - /shebang-command@2.0.0: - resolution: - { - integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, - } - engines: { node: ">=8" } - dependencies: - shebang-regex: 3.0.0 - - /shebang-regex@3.0.0: - resolution: - { - integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, - } - engines: { node: ">=8" } - - /signal-exit@3.0.7: - resolution: - { - integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, - } - dev: false - - /simple-concat@1.0.1: - resolution: - { - integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==, - } - dev: false - - /simple-get@4.0.1: - resolution: - { - integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==, - } - dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 - 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: false - - /source-map-support@0.5.21: - resolution: - { - integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, - } - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - /source-map@0.6.1: - resolution: - { - integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, - } - engines: { node: ">=0.10.0" } - - /sourcemap-codec@1.4.8: - resolution: - { - integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==, - } - deprecated: Please use @jridgewell/sourcemap-codec instead - dev: true - - /sqlstring@2.3.3: - resolution: - { - integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==, - } - engines: { node: ">= 0.6" } - dev: false - - /stacktracey@2.1.8: - resolution: - { - integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==, - } - dependencies: - as-table: 1.0.55 - get-source: 2.0.12 - - /standard-as-callback@2.1.0: - resolution: - { - integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==, - } - dev: false - - /std-env@3.6.0: - resolution: - { - integrity: sha512-aFZ19IgVmhdB2uX599ve2kE6BIE3YMnQ6Gp6BURhW/oIzpXGKr878TQfAQZn1+i0Flcc/UKUy1gOlcfaUBCryg==, - } - dev: false - - /stoppable@1.1.0: - resolution: - { - integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==, - } - engines: { node: ">=4", npm: ">=6" } - - /string_decoder@1.3.0: - resolution: - { - integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, - } - dependencies: - safe-buffer: 5.2.1 - dev: false - - /strip-ansi@6.0.1: - resolution: - { - integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, - } - engines: { node: ">=8" } - dependencies: - ansi-regex: 5.0.1 - - /strip-final-newline@2.0.0: - resolution: - { - integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==, - } - engines: { node: ">=6" } - dev: false - - /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" } - - /superjson@2.2.1: - resolution: - { - integrity: sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==, - } - engines: { node: ">=16" } - dependencies: - copy-anything: 3.0.5 - dev: true - - /supports-color@7.2.0: - resolution: - { - integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, - } - engines: { node: ">=8" } - dependencies: - has-flag: 4.0.0 - - /tar-fs@2.1.1: - resolution: - { - integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==, - } - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.0 - tar-stream: 2.2.0 - dev: false - - /tar-stream@2.2.0: - resolution: - { - integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==, - } - engines: { node: ">=6" } - 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 - - /text-table@0.2.0: - resolution: - { - integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, - } - - /timers-ext@0.1.7: - resolution: - { - integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==, - } - dependencies: - es5-ext: 0.10.62 - next-tick: 1.1.0 - dev: true - - /to-regex-range@5.0.1: - resolution: - { - integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, - } - engines: { node: ">=8.0" } - dependencies: - is-number: 7.0.0 - - /tr46@0.0.3: - resolution: - { - integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, - } - dev: false - - /ts-api-utils@1.0.3(typescript@5.3.3): - resolution: - { - integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==, - } - engines: { node: ">=16.13.0" } - peerDependencies: - typescript: ">=4.2.0" - dependencies: - typescript: 5.3.3 - dev: false - - /tslib@2.6.2: - resolution: - { - integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==, - } - - /tsx@4.6.2: - resolution: - { - integrity: sha512-QPpBdJo+ZDtqZgAnq86iY/PD2KYCUPSUGIunHdGwyII99GKH+f3z3FZ8XNFLSGQIA4I365ui8wnQpl8OKLqcsg==, - } - engines: { node: ">=18.0.0" } - hasBin: true - dependencies: - esbuild: 0.18.20 - get-tsconfig: 4.7.2 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /tunnel-agent@0.6.0: - resolution: - { - integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==, - } - dependencies: - safe-buffer: 5.2.1 - dev: false - - /type-check@0.4.0: - resolution: - { - integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, - } - engines: { node: ">= 0.8.0" } - dependencies: - prelude-ls: 1.2.1 - - /type-fest@0.20.2: - resolution: - { - integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==, - } - engines: { node: ">=10" } - - /type@1.2.0: - resolution: - { - integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==, - } - dev: true - - /type@2.7.2: - resolution: - { - integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==, - } - dev: true - - /typescript@5.3.3: - resolution: - { - integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==, - } - engines: { node: ">=14.17" } - hasBin: true - - /ufo@1.3.2: - resolution: - { - integrity: sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==, - } - dev: false - - /uncrypto@0.1.3: - resolution: - { - integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==, - } - dev: false - - /undici-types@5.26.5: - resolution: - { - integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==, - } - - /undici@5.28.2: - resolution: - { - integrity: sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==, - } - engines: { node: ">=14.0" } - dependencies: - "@fastify/busboy": 2.1.0 - - /unenv@1.8.0: - resolution: - { - integrity: sha512-uIGbdCWZfhRRmyKj1UioCepQ0jpq638j/Cf0xFTn4zD1nGJ2lSdzYHLzfdXN791oo/0juUiSWW1fBklXMTsuqg==, - } - dependencies: - consola: 3.2.3 - defu: 6.1.3 - mime: 3.0.0 - node-fetch-native: 1.4.1 - pathe: 1.1.1 - dev: false - - /unstorage@1.10.1: - resolution: - { - integrity: sha512-rWQvLRfZNBpF+x8D3/gda5nUCQL2PgXy2jNG4U7/Rc9BGEv9+CAJd0YyGCROUBKs9v49Hg8huw3aih5Bf5TAVw==, - } - peerDependencies: - "@azure/app-configuration": ^1.4.1 - "@azure/cosmos": ^4.0.0 - "@azure/data-tables": ^13.2.2 - "@azure/identity": ^3.3.2 - "@azure/keyvault-secrets": ^4.7.0 - "@azure/storage-blob": ^12.16.0 - "@capacitor/preferences": ^5.0.6 - "@netlify/blobs": ^6.2.0 - "@planetscale/database": ^1.11.0 - "@upstash/redis": ^1.23.4 - "@vercel/kv": ^0.2.3 - idb-keyval: ^6.2.1 - peerDependenciesMeta: - "@azure/app-configuration": - optional: true - "@azure/cosmos": - optional: true - "@azure/data-tables": - optional: true - "@azure/identity": - optional: true - "@azure/keyvault-secrets": - optional: true - "@azure/storage-blob": - optional: true - "@capacitor/preferences": - optional: true - "@netlify/blobs": - optional: true - "@planetscale/database": - optional: true - "@upstash/redis": - optional: true - "@vercel/kv": - optional: true - idb-keyval: - optional: true - dependencies: - anymatch: 3.1.3 - chokidar: 3.5.3 - destr: 2.0.2 - h3: 1.9.0 - ioredis: 5.3.2 - listhen: 1.5.5 - lru-cache: 10.1.0 - mri: 1.2.0 - node-fetch-native: 1.4.1 - ofetch: 1.3.3 - ufo: 1.3.2 - transitivePeerDependencies: - - supports-color - dev: false - - /untun@0.1.2: - resolution: - { - integrity: sha512-wLAMWvxfqyTiBODA1lg3IXHQtjggYLeTK7RnSfqtOXixWJ3bAa2kK/HHmOOg19upteqO3muLvN6O/icbyQY33Q==, - } - hasBin: true - dependencies: - citty: 0.1.5 - consola: 3.2.3 - pathe: 1.1.1 - dev: false - - /uqr@0.1.2: - resolution: - { - integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==, - } - dev: false - - /uri-js@4.4.1: - resolution: - { - integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, - } - dependencies: - punycode: 2.3.1 - - /util-deprecate@1.0.2: - resolution: - { - integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, - } - dev: false - - /uuid@9.0.1: - resolution: - { - integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==, - } - hasBin: true - dev: false - - /vscode-json-languageservice@4.2.1: - resolution: - { - integrity: sha512-xGmv9QIWs2H8obGbWg+sIPI/3/pFgj/5OWBhNzs00BkYQ9UaB2F6JJaGB/2/YOZJ3BvLXQTC4Q7muqU25QgAhA==, - } - dependencies: - jsonc-parser: 3.2.0 - vscode-languageserver-textdocument: 1.0.11 - vscode-languageserver-types: 3.17.5 - vscode-nls: 5.2.0 - vscode-uri: 3.0.8 - dev: true - - /vscode-languageserver-textdocument@1.0.11: - resolution: - { - integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==, - } - dev: true - - /vscode-languageserver-types@3.17.5: - resolution: - { - integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==, - } - dev: true - - /vscode-nls@5.2.0: - resolution: - { - integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==, - } - dev: true - - /vscode-uri@3.0.8: - resolution: - { - integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==, - } - dev: true - - /web-streams-polyfill@3.2.1: - resolution: - { - integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==, - } - engines: { node: ">= 8" } - dev: false - - /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@2.0.2: - resolution: - { - integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, - } - engines: { node: ">= 8" } - hasBin: true - dependencies: - isexe: 2.0.0 - - /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 - - /wrangler@3.19.0: - resolution: - { - integrity: sha512-pY7xWqkQn6DJ+1vz9YHz2pCftEmK+JCTj9sqnucp0NZnlUiILDmBWegsjjCLZycgfiA62J213N7NvjLPr2LB8w==, - } - engines: { node: ">=16.17.0" } - hasBin: true - 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.3 - 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 - dev: true - - /wrappy@1.0.2: - resolution: - { - integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, - } - - /ws@8.14.2: - resolution: - { - integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==, - } - engines: { node: ">=10.0.0" } - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - /xxhash-wasm@1.0.2: - resolution: - { - integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==, - } - dev: true - - /yallist@4.0.0: - resolution: - { - integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, - } - - /yaml@2.3.4: - resolution: - { - integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==, - } - engines: { node: ">= 14" } - - /yocto-queue@0.1.0: - resolution: - { - integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, - } - engines: { node: ">=10" } - - /youch@3.3.3: - resolution: - { - integrity: sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==, - } - dependencies: - cookie: 0.5.0 - mustache: 4.2.0 - stacktracey: 2.1.8 - - /zod@3.22.4: - resolution: - { - integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==, - } + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + + /@asteasolutions/zod-to-openapi@5.5.0(zod@3.22.4): + resolution: {integrity: sha512-d5HwrvM6dOKr3XdeF+DmashGvfEc+1oiEfbscugsiwSTrFtuMa7ETpW9sTNnVgn+hJaz+PRxPQUYD7q9/5dUig==} + peerDependencies: + zod: ^3.20.2 + dependencies: + openapi3-ts: 4.1.2 + zod: 3.22.4 + dev: false + + /@asteasolutions/zod-to-openapi@6.3.0(zod@3.22.4): + resolution: {integrity: sha512-ca7Svz3BWkMaIP3M1YGsyxgp7AcKXlTmy19ozhY0DslhatXbnyxdvxlmiI0TmvkIfi6RpQfm+eK1neVLsh6Riw==} + peerDependencies: + zod: ^3.20.2 + dependencies: + openapi3-ts: 4.1.2 + zod: 3.22.4 + dev: true + + /@cloudflare/kv-asset-handler@0.2.0: + resolution: {integrity: sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==} + dependencies: + mime: 3.0.0 + dev: true + + /@cloudflare/workerd-darwin-64@1.20231030.0: + resolution: {integrity: sha512-J4PQ9utPxLya9yHdMMx3AZeC5M/6FxcoYw6jo9jbDDFTy+a4Gslqf4Im9We3aeOEdPXa3tgQHVQOSelJSZLhIw==} + engines: {node: '>=16'} + cpu: [x64] + os: [darwin] + requiresBuild: true + 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 + + /@cloudflare/workers-types@4.20231121.0: + resolution: {integrity: sha512-+kWfpCkqiepwAKXyHoE0gnkPgkLhz0/9HOBIGhHRsUvUKvhUtm3mbqqoGRWgF1qcjzrDUBbrrOq4MYHfFtc2RA==} + + /@drizzle-team/studio@0.0.35: + resolution: {integrity: sha512-t5LTNOVf+L7Bb/wdssOIPx0ueNvhyaIXdrvKgoHR4wK0GD7SRmILcCTzn6N6Ltr1VnFzQZG/bzn6HMagn17Jtw==} + dependencies: + superjson: 2.2.1 + 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-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-arm64@0.19.8: + resolution: {integrity: sha512-B8JbS61bEunhfx8kasogFENgQfr/dIp+ggYXwTqdbMAgGDhRa3AaPpQMuQU0rNxDLECj6FhDzk1cF9WHMVwrtA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: 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-arm@0.19.8: + resolution: {integrity: sha512-31E2lxlGM1KEfivQl8Yf5aYU/mflz9g06H6S15ITUFQueMFtFjESRMoDSkvMo8thYvLBax+VKTPlpnx+sPicOA==} + engines: {node: '>=12'} + cpu: [arm] + 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/android-x64@0.19.8: + resolution: {integrity: sha512-rdqqYfRIn4jWOp+lzQttYMa2Xar3OK9Yt2fhOhzFXqg0rVWEfSclJvZq5fZslnz6ypHvVf3CT7qyf0A5pM682A==} + 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-arm64@0.19.8: + resolution: {integrity: sha512-RQw9DemMbIq35Bprbboyf8SmOr4UXsRVxJ97LgB55VKKeJOOdvsIPy0nFyF2l8U+h4PtBx/1kRf0BelOYCiQcw==} + 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/darwin-x64@0.19.8: + resolution: {integrity: sha512-3sur80OT9YdeZwIVgERAysAbwncom7b4bCI2XKLjMfPymTud7e/oY4y+ci1XVp5TfQp/bppn7xLw1n/oSQY3/Q==} + 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-arm64@0.19.8: + resolution: {integrity: sha512-WAnPJSDattvS/XtPCTj1tPoTxERjcTpH6HsMr6ujTT+X6rylVe8ggxk8pVxzf5U1wh5sPODpawNicF5ta/9Tmw==} + 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/freebsd-x64@0.19.8: + resolution: {integrity: sha512-ICvZyOplIjmmhjd6mxi+zxSdpPTKFfyPPQMQTK/w+8eNK6WV01AjIztJALDtwNNfFhfZLux0tZLC+U9nSyA5Zg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + 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-arm64@0.19.8: + resolution: {integrity: sha512-z1zMZivxDLHWnyGOctT9JP70h0beY54xDDDJt4VpTX+iwA77IFsE1vCXWmprajJGa+ZYSqkSbRQ4eyLCpCmiCQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + 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-arm@0.19.8: + resolution: {integrity: sha512-H4vmI5PYqSvosPaTJuEppU9oz1dq2A7Mr2vyg5TF9Ga+3+MGgBdGzcyBP7qK9MrwFQZlvNyJrvz6GuCaj3OukQ==} + engines: {node: '>=12'} + cpu: [arm] + 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-ia32@0.19.8: + resolution: {integrity: sha512-1a8suQiFJmZz1khm/rDglOc8lavtzEMRo0v6WhPgxkrjcU0LkHj+TwBrALwoz/OtMExvsqbbMI0ChyelKabSvQ==} + 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-loong64@0.19.8: + resolution: {integrity: sha512-fHZWS2JJxnXt1uYJsDv9+b60WCc2RlvVAy1F76qOLtXRO+H4mjt3Tr6MJ5l7Q78X8KgCFudnTuiQRBhULUyBKQ==} + 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-mips64el@0.19.8: + resolution: {integrity: sha512-Wy/z0EL5qZYLX66dVnEg9riiwls5IYnziwuju2oUiuxVc+/edvqXa04qNtbrs0Ukatg5HEzqT94Zs7J207dN5Q==} + 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-ppc64@0.19.8: + resolution: {integrity: sha512-ETaW6245wK23YIEufhMQ3HSeHO7NgsLx8gygBVldRHKhOlD1oNeNy/P67mIh1zPn2Hr2HLieQrt6tWrVwuqrxg==} + 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-riscv64@0.19.8: + resolution: {integrity: sha512-T2DRQk55SgoleTP+DtPlMrxi/5r9AeFgkhkZ/B0ap99zmxtxdOixOMI570VjdRCs9pE4Wdkz7JYrsPvsl7eESg==} + 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-s390x@0.19.8: + resolution: {integrity: sha512-NPxbdmmo3Bk7mbNeHmcCd7R7fptJaczPYBaELk6NcXxy7HLNyWwCyDJ/Xx+/YcNH7Im5dHdx9gZ5xIwyliQCbg==} + 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/linux-x64@0.19.8: + resolution: {integrity: sha512-lytMAVOM3b1gPypL2TRmZ5rnXl7+6IIk8uB3eLsV1JwcizuolblXRrc5ShPrO9ls/b+RTp+E6gbsuLWHWi2zGg==} + 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/netbsd-x64@0.19.8: + resolution: {integrity: sha512-hvWVo2VsXz/8NVt1UhLzxwAfo5sioj92uo0bCfLibB0xlOmimU/DeAEsQILlBQvkhrGjamP0/el5HU76HAitGw==} + 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/openbsd-x64@0.19.8: + resolution: {integrity: sha512-/7Y7u77rdvmGTxR83PgaSvSBJCC2L3Kb1M/+dmSIvRvQPXXCuC97QAwMugBNG0yGcbEGfFBH7ojPzAOxfGNkwQ==} + 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/sunos-x64@0.19.8: + resolution: {integrity: sha512-9Lc4s7Oi98GqFA4HzA/W2JHIYfnXbUYgekUP/Sm4BG9sfLjyv6GKKHKKVs83SMicBF2JwAX6A1PuOLMqpD001w==} + 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-arm64@0.19.8: + resolution: {integrity: sha512-rq6WzBGjSzihI9deW3fC2Gqiak68+b7qo5/3kmB6Gvbh/NYPA0sJhrnp7wgV4bNwjqM+R2AApXGxMO7ZoGhIJg==} + 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-ia32@0.19.8: + resolution: {integrity: sha512-AIAbverbg5jMvJznYiGhrd3sumfwWs8572mIJL5NQjJa06P8KfCPWZQ0NwZbPQnbQi9OWSZhFVSUWjjIrn4hSw==} + 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 + + /@esbuild/win32-x64@0.19.8: + resolution: {integrity: sha512-bfZ0cQ1uZs2PqpulNL5j/3w+GDhP36k1K5c38QdQg+Swy51jFZWWeIkteNsufkQxp986wnqRRsb/bHbY1WQ7TA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.55.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.55.0 + eslint-visitor-keys: 3.4.3 + + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + /@eslint/eslintrc@2.1.4: + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.23.0 + ignore: 5.3.0 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + /@eslint/js@8.55.0: + resolution: {integrity: sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + /@fastify/busboy@2.1.0: + resolution: {integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==} + engines: {node: '>=14'} + dev: true + + /@hono/swagger-ui@0.2.0(hono@3.11.3): + resolution: {integrity: sha512-ulWqCI+38vTlxxBmOAi5VTOUDa5/7fKHPTwyq00kRUjUxPp3Ej5Cs+B/fvGs5gd3KraArLArkln7sHhb5vODZA==} + peerDependencies: + hono: '*' + dependencies: + hono: 3.11.3 + dev: false + + /@hono/zod-openapi@0.9.3(hono@3.11.3)(zod@3.22.4): + resolution: {integrity: sha512-PdKWwUvMdoQ2eqJZtbo4N4qb2VRjHNnDcfWW3/IqSeJDyK4vIPHAzWfgtUOYHAXJAiooQQ87m0sw2iME2H1+zQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + hono: '>=3.11.3' + zod: 3.* + dependencies: + '@asteasolutions/zod-to-openapi': 5.5.0(zod@3.22.4) + '@hono/zod-validator': 0.1.11(hono@3.11.3)(zod@3.22.4) + hono: 3.11.3 + zod: 3.22.4 + dev: false + + /@hono/zod-validator@0.1.11(hono@3.11.3)(zod@3.22.4): + resolution: {integrity: sha512-PQXeHUP0+36qpRt8yfeD7N2jbK3ETlGvSN6dMof/HwUC/APRokQRjpXZm4rrlG71Ft0aWE01+Bm4XejqPie5Uw==} + peerDependencies: + hono: '>=3.9.0' + zod: ^3.19.1 + dependencies: + hono: 3.11.3 + zod: 3.22.4 + dev: false + + /@humanwhocodes/config-array@0.11.13: + resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 2.0.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + /@humanwhocodes/object-schema@2.0.1: + resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} + + /@libsql/client@0.4.0-pre.5: + resolution: {integrity: sha512-GyKigCBslE5uztwT7mpvp9Zn0z3iWjnufcfeTeDSFPMyXCPjSAHUOiwSLAaHii909w6EQacA692CXmYYFo/eig==} + dependencies: + '@libsql/hrana-client': 0.5.5 + js-base64: 3.7.5 + libsql: 0.2.0-pre.4 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: false + + /@libsql/darwin-arm64@0.2.0-pre.4: + resolution: {integrity: sha512-kb0f/FeZxzeqa+j6O7xI9toOeoTNCJnErOcNyWWzoqA5JZ4LJ9dCMrLPWe4Np22+Rg57NPmFz/Z7MFNP2y5Gow==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@libsql/darwin-x64@0.2.0-pre.4: + resolution: {integrity: sha512-HQM9cmGP4t+ujbyhA6rjQ8K4iHw5DStq3YnL8030k5z4KHGkAOIcRbVj3m65J72Gy+tCsisUCZTrBjIFkjOFhA==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@libsql/hrana-client@0.5.5: + resolution: {integrity: sha512-i+hDBpiV719poqEiHupUUZYKJ9YSbCRFe5Q2PQ0v3mHIftePH6gayLjp2u6TXbqbO/Dv6y8yyvYlBXf/kFfRZA==} + dependencies: + '@libsql/isomorphic-fetch': 0.1.10 + '@libsql/isomorphic-ws': 0.1.5 + js-base64: 3.7.5 + node-fetch: 3.3.2 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: false + + /@libsql/isomorphic-fetch@0.1.10: + resolution: {integrity: sha512-dH0lMk50gKSvEKD78xWMu60SY1sjp1sY//iFLO0XMmBwfVfG136P9KOk06R4maBdlb8KMXOzJ1D28FR5ZKnHTA==} + dependencies: + '@types/node-fetch': 2.6.9 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: false + + /@libsql/isomorphic-ws@0.1.5: + resolution: {integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==} + dependencies: + '@types/ws': 8.5.10 + ws: 8.14.2 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /@libsql/linux-arm64-gnu@0.2.0-pre.4: + resolution: {integrity: sha512-1VVhnSx+vSDCLXxfUP9kRGbZyy+Si6tvPQZ8JqZftt9EJG1Dvzp1E1TT8zFYMeBQeVyoV4KryctW5b5uZkqVQA==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@libsql/linux-arm64-musl@0.2.0-pre.4: + resolution: {integrity: sha512-lbSeR5agUDkpHTT3OOnuINWEr7OsX+XCwJ21bkceoXu/napW7A3auiOjzK7mneI+vT7fRjay0caivrdoqgeKKg==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@libsql/linux-x64-gnu@0.2.0-pre.4: + resolution: {integrity: sha512-OBiu0+tEVj2daJJrcg1uhEtHx7CsED8QesEqz8dhoK0Dad1oSn8XUpulhiMiXP1JFlcr7Zz37eKJdQxv17WTfw==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@libsql/linux-x64-musl@0.2.0-pre.4: + resolution: {integrity: sha512-iJr3XiUTsB8ic4+DTG8412o9NZ3ifCEM+FaZ0/uxh3xlERbYUMUZhAIylxJqYjovld0edd6Nns7OJfu5b8Ae2g==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@libsql/win32-x64-msvc@0.2.0-pre.4: + resolution: {integrity: sha512-kV/Bl6RBMCm24LFmlowl//TvD8jhRjSmUjComXdQ4j5JrAW29MVEb5EtrA16qGzeWb06tSMII0z5yqEaYxvQbQ==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@lucia-auth/adapter-sqlite@3.0.0-beta.9(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2)(lucia@3.0.0-beta.11): + resolution: {integrity: sha512-Z6kW5ebeEDMlUcJu3bf4USbUuPa2rcCKWJxHdK0jqiPoJfNJrUpg/yBfoUZ7CJ/mucTAKV9EjcrVZSUTHvesGA==} + peerDependencies: + '@libsql/client': ^0.3.0 + better-sqlite3: 8.x - 9.x + lucia: 3.0.0-beta.11 + peerDependenciesMeta: + '@libsql/client': + optional: true + better-sqlite3: + optional: true + dependencies: + '@libsql/client': 0.4.0-pre.5 + better-sqlite3: 9.2.2 + lucia: 3.0.0-beta.11 + dev: false + + /@neon-rs/load@0.0.4: + resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==} + dev: false + + /@node-rs/argon2-android-arm-eabi@1.5.2: + resolution: {integrity: sha512-vVZec4ITr9GumAy0p8Zj8ozie362gtbZrTkLp9EqvuFZ/HrZzR09uS2IsDgm4mAstg/rc4A1gLRrHI8jDdbjkA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-android-arm64@1.5.2: + resolution: {integrity: sha512-SwhnsXyrpgtWDTwYds1WUnxLA/kVP8HVaImYwQ3Wemqj1lkzcSoIaNyjNWkyrYGqO1tVc1YUrqsbd5eCHh+3sg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-darwin-arm64@1.5.2: + resolution: {integrity: sha512-+1ZMKiCCv2pip/o1Xg09piQru2LOIBPQ1vS4is86f55N3jjZnSfP+db5mYCSRuB0gRYqui98he7su7OGXlF4gQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-darwin-x64@1.5.2: + resolution: {integrity: sha512-mQ57mORlsxpfjcEsVpiHyHCOp6Ljrz/rVNWk8ihnPWw0qt0EqF1zbHRxTEPemL1iBHL9UyXpXrKS4JKq6xMn5w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-freebsd-x64@1.5.2: + resolution: {integrity: sha512-UjKbFd3viYcpiwflkU4haEdNUMk1V2fVCJImWLWQns/hVval9BrDv5xsBwgdynbPHDlPOiWj816LBQwhWLGVWA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-arm-gnueabihf@1.5.2: + resolution: {integrity: sha512-36GJjJBnVuscV9CTn8RVDeJysnmIzr6Lp7QBCDczYHi6eKFuA8udCJb4SRyJqdvIuzycKG1RL56FbcFBJYCYIA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-arm64-gnu@1.5.2: + resolution: {integrity: sha512-sE0ydb2gp6xC+5vbVz8l3paaiBbFQIB2Rwp5wx9MmKiYdTfcO5WkGeADuSgoFiTcSEz1RsHXqrdVy6j/LtSqtA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-arm64-musl@1.5.2: + resolution: {integrity: sha512-LhE0YHB0aJCwlbsQrwePik/KFWUc9qMriJIL5KiejK3bDoTVY4ihH587QT56JyaLvl3nBJaAV8l5yMqQdHnouA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-x64-gnu@1.5.2: + resolution: {integrity: sha512-MnKLiBlyg05pxvKXe3lNgBL9El9ThD74hvVEiWH1Xk40RRrJ507NCOWXVmQ0FDq1mjTeGFxbIvk+AcoF0NSLIQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-x64-musl@1.5.2: + resolution: {integrity: sha512-tzLgASY0Ng2OTW7Awwl9UWzjbWx8/uD6gXcZ/k/nYGSZE5Xp8EOD2NUqHLbK6KZE3775A0R25ShpiSxCadYqkg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-win32-arm64-msvc@1.5.2: + resolution: {integrity: sha512-vpTwSvv3oUXTpWZh0/HxdJ5wFMlmS7aVDwL4ATWepTZhMG4n+TO0+tVLdcPHCbg0oc6hCWBjWNPlSn9mW+YIgA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-win32-ia32-msvc@1.5.2: + resolution: {integrity: sha512-KPpZR15ui7uQWQXKmtaKyUQRs4UJdXnIIfiyFLGmLWCdEKlr3MtIGFt0fdziu4BF5ZObD8Ic6QvT0VXK4OJiww==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-win32-x64-msvc@1.5.2: + resolution: {integrity: sha512-/pGuwixJS8ZlpwhX9iM6g6JEeZYo1TtnNf8exwsOi7gxcUoTUfw5it+5GfbY/n+xRBz/DIU4bzUmXmh+7Gh0ug==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2@1.5.2: + resolution: {integrity: sha512-qq7wOSsdP2b4rXEapWNmsCjpaTGZWtp9kZmri98GYCDZqN8UJUG5zSue4XtYWWJMWKJVE/hkaIwk+BgN1ZUn0Q==} + engines: {node: '>= 10'} + optionalDependencies: + '@node-rs/argon2-android-arm-eabi': 1.5.2 + '@node-rs/argon2-android-arm64': 1.5.2 + '@node-rs/argon2-darwin-arm64': 1.5.2 + '@node-rs/argon2-darwin-x64': 1.5.2 + '@node-rs/argon2-freebsd-x64': 1.5.2 + '@node-rs/argon2-linux-arm-gnueabihf': 1.5.2 + '@node-rs/argon2-linux-arm64-gnu': 1.5.2 + '@node-rs/argon2-linux-arm64-musl': 1.5.2 + '@node-rs/argon2-linux-x64-gnu': 1.5.2 + '@node-rs/argon2-linux-x64-musl': 1.5.2 + '@node-rs/argon2-win32-arm64-msvc': 1.5.2 + '@node-rs/argon2-win32-ia32-msvc': 1.5.2 + '@node-rs/argon2-win32-x64-msvc': 1.5.2 + dev: false + + /@node-rs/bcrypt-android-arm-eabi@1.7.3: + resolution: {integrity: sha512-l53RuBqnqNvBN2jx09Ws6jpLmuQdSDx10n0GeaTfwh1svxsC8bPpVmxkfBExsT2Tu7KF38gTnPZvwsxysZQyPQ==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-android-arm64@1.7.3: + resolution: {integrity: sha512-TZpm4VbiViqDMvusrcYzLr1b1M5FDF0cDNiTUciLeBSsKtU5lNdEZGAU7gvCnrKoUWpGuOblHU7613zuB7SiNQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-darwin-arm64@1.7.3: + resolution: {integrity: sha512-SiUuAabynVsmixZMjh5xrn8w47EnV0HzbW9st4DPoVhn/wzdUcksIXDY75aoQG2EIzKLN8IGb+CIVnPGmRyhxw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-darwin-x64@1.7.3: + resolution: {integrity: sha512-R+81Z0eX4hZPvCXY5Z6l0l+JrTU3WcSYGHP0QYV9uwdaafOz6EhrCXUzZ02AIcAbNoVR8eucYVruq9PiasXoVw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-freebsd-x64@1.7.3: + resolution: {integrity: sha512-0pItU/5K3e83JjcJj9fZv+78txUoZ3hHCT7n/UMdu9mkpUzhX/rqb4jmQpJpD+UQoR76xp3qDo5RMgQBffBVNg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-arm-gnueabihf@1.7.3: + resolution: {integrity: sha512-HTSybWUjNe8rWuXkTkMeFDiQNHc6VioRcgv6AeHZphIxiT6dFbnhXNkfz4Hr0zxvyPhZ3NrYjT2AmPVFT6VW3Q==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-arm64-gnu@1.7.3: + resolution: {integrity: sha512-rWep6Y+v/c4bZHaM8LmSsrMwMmDR9wG4/q+3Z9VzR8xdnt5VCbuQdYWpf3sgGRGjTRdTBAdSK8x1reOjqsJ3Jg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-arm64-musl@1.7.3: + resolution: {integrity: sha512-TyWEKhxr+yfGcMKzVV/ARZw+Hrky2yl91bo0XYU2ZW6I6LDC0emNsXugdWjwz8ADI4OWhhrOjXD8GCilxiB2Rg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-x64-gnu@1.7.3: + resolution: {integrity: sha512-PofxM1Qg7tZKj1oP0I7tBTSSLr8Xc2uxx+P3pBCPmYzaBwWqGteNHJlF7n2q5xiH7YOlguH4w5CmcEjsiA3K4A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-x64-musl@1.7.3: + resolution: {integrity: sha512-D5V6/dDVKP8S/ieDBLGhTn4oTo3upbrpWInynbhOMjJvPiIxVG1PiI3MXkWBtG9qtfleDk7gUkEKtAOxlIxDTQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-win32-arm64-msvc@1.7.3: + resolution: {integrity: sha512-b4gH2Yj5R4TwULrfMHd1Qqr+MrnFjVRUAJujDKPqi+PppSqezW8QF6DRSOL4GjnBmz5JEd64wxgeidvy7dsbGw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-win32-ia32-msvc@1.7.3: + resolution: {integrity: sha512-E91ro+ybI0RhNc89aGaZQGll0YhPoHr8JacoWrNKwhg9zwNOYeuO0tokdMZdm6nF0/8obll0Mq7wO9AXO9iffw==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-win32-x64-msvc@1.7.3: + resolution: {integrity: sha512-LO/p9yjPODj/pQvPnowBuwpDdqiyUXQbqL1xb1RSP3NoyCFAGmjL5h0plSQrhLh8hskQiozBRXNaQurtsM7o0Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt@1.7.3: + resolution: {integrity: sha512-BF6u9CBPUiyk1zU+5iwikezf+xM4MFSu5cmrrg/PLKffGgIM13ZsY6DHftcTraETB04ryasjM/5IejotH+sO5Q==} + engines: {node: '>= 10'} + optionalDependencies: + '@node-rs/bcrypt-android-arm-eabi': 1.7.3 + '@node-rs/bcrypt-android-arm64': 1.7.3 + '@node-rs/bcrypt-darwin-arm64': 1.7.3 + '@node-rs/bcrypt-darwin-x64': 1.7.3 + '@node-rs/bcrypt-freebsd-x64': 1.7.3 + '@node-rs/bcrypt-linux-arm-gnueabihf': 1.7.3 + '@node-rs/bcrypt-linux-arm64-gnu': 1.7.3 + '@node-rs/bcrypt-linux-arm64-musl': 1.7.3 + '@node-rs/bcrypt-linux-x64-gnu': 1.7.3 + '@node-rs/bcrypt-linux-x64-musl': 1.7.3 + '@node-rs/bcrypt-win32-arm64-msvc': 1.7.3 + '@node-rs/bcrypt-win32-ia32-msvc': 1.7.3 + '@node-rs/bcrypt-win32-x64-msvc': 1.7.3 + dev: false + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + dev: false + + /@types/node-fetch@2.6.9: + resolution: {integrity: sha512-bQVlnMLFJ2d35DkPNjEPmd9ueO/rh5EiaZt2bhqiSarPjZIuIV6bPQVqcrEyvNo+AfTrRGVazle1tl597w3gfA==} + dependencies: + '@types/node': 20.10.4 + form-data: 4.0.0 + dev: false + + /@types/node-forge@1.3.10: + resolution: {integrity: sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw==} + dependencies: + '@types/node': 20.10.4 + dev: true + + /@types/node@20.10.4: + resolution: {integrity: sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==} + dependencies: + undici-types: 5.26.5 + + /@types/semver@7.5.6: + resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} + dev: false + + /@types/ws@8.5.10: + resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} + dependencies: + '@types/node': 20.10.4 + dev: false + + /@typescript-eslint/eslint-plugin@6.13.2(@typescript-eslint/parser@6.13.2)(eslint@8.55.0)(typescript@5.3.3): + resolution: {integrity: sha512-3+9OGAWHhk4O1LlcwLBONbdXsAhLjyCFogJY/cWy2lxdVJ2JrcTF2pTGMaLl2AE7U1l31n8Py4a8bx5DLf/0dQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 6.13.2(eslint@8.55.0)(typescript@5.3.3) + '@typescript-eslint/scope-manager': 6.13.2 + '@typescript-eslint/type-utils': 6.13.2(eslint@8.55.0)(typescript@5.3.3) + '@typescript-eslint/utils': 6.13.2(eslint@8.55.0)(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 6.13.2 + debug: 4.3.4 + eslint: 8.55.0 + graphemer: 1.4.0 + ignore: 5.3.0 + natural-compare: 1.4.0 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/parser@6.13.2(eslint@8.55.0)(typescript@5.3.3): + resolution: {integrity: sha512-MUkcC+7Wt/QOGeVlM8aGGJZy1XV5YKjTpq9jK6r6/iLsGXhBVaGP5N0UYvFsu9BFlSpwY9kMretzdBH01rkRXg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 6.13.2 + '@typescript-eslint/types': 6.13.2 + '@typescript-eslint/typescript-estree': 6.13.2(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 6.13.2 + debug: 4.3.4 + eslint: 8.55.0 + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/scope-manager@6.13.2: + resolution: {integrity: sha512-CXQA0xo7z6x13FeDYCgBkjWzNqzBn8RXaE3QVQVIUm74fWJLkJkaHmHdKStrxQllGh6Q4eUGyNpMe0b1hMkXFA==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.13.2 + '@typescript-eslint/visitor-keys': 6.13.2 + dev: false + + /@typescript-eslint/type-utils@6.13.2(eslint@8.55.0)(typescript@5.3.3): + resolution: {integrity: sha512-Qr6ssS1GFongzH2qfnWKkAQmMUyZSyOr0W54nZNU1MDfo+U4Mv3XveeLZzadc/yq8iYhQZHYT+eoXJqnACM1tw==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 6.13.2(typescript@5.3.3) + '@typescript-eslint/utils': 6.13.2(eslint@8.55.0)(typescript@5.3.3) + debug: 4.3.4 + eslint: 8.55.0 + ts-api-utils: 1.0.3(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/types@6.13.2: + resolution: {integrity: sha512-7sxbQ+EMRubQc3wTfTsycgYpSujyVbI1xw+3UMRUcrhSy+pN09y/lWzeKDbvhoqcRbHdc+APLs/PWYi/cisLPg==} + engines: {node: ^16.0.0 || >=18.0.0} + dev: false + + /@typescript-eslint/typescript-estree@6.13.2(typescript@5.3.3): + resolution: {integrity: sha512-SuD8YLQv6WHnOEtKv8D6HZUzOub855cfPnPMKvdM/Bh1plv1f7Q/0iFUDLKKlxHcEstQnaUU4QZskgQq74t+3w==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 6.13.2 + '@typescript-eslint/visitor-keys': 6.13.2 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/utils@6.13.2(eslint@8.55.0)(typescript@5.3.3): + resolution: {integrity: sha512-b9Ptq4eAZUym4idijCRzl61oPCwwREcfDI8xGk751Vhzig5fFZR9CyzDz4Sp/nxSLBYxUPyh4QdIDqWykFhNmQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.55.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.6 + '@typescript-eslint/scope-manager': 6.13.2 + '@typescript-eslint/types': 6.13.2 + '@typescript-eslint/typescript-estree': 6.13.2(typescript@5.3.3) + eslint: 8.55.0 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: false + + /@typescript-eslint/visitor-keys@6.13.2: + resolution: {integrity: sha512-OGznFs0eAQXJsp+xSd6k/O1UbFi/K/L7WjqeRoFE7vadjAF9y0uppXhYNQNEqygjou782maGClOoZwPqF0Drlw==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.13.2 + eslint-visitor-keys: 3.4.3 + dev: false + + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + /acorn-jsx@5.3.2(acorn@8.11.2): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.2 + + /acorn-walk@8.3.1: + resolution: {integrity: sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@8.11.2: + resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} + engines: {node: '>=0.4.0'} + hasBin: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: false + + /as-table@1.0.55: + resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} + dependencies: + printable-characters: 1.0.42 + dev: true + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: false + + /better-sqlite3@9.2.2: + resolution: {integrity: sha512-qwjWB46il0lsDkeB4rSRI96HyDQr8sxeu1MkBVLMrwusq1KRu4Bpt1TMI+8zIJkDUtZ3umjAkaEjIlokZKWCQw==} + 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 + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /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==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + /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@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: false + + /cli-color@2.0.3: + resolution: {integrity: sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==} + engines: {node: '>=0.10'} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-iterator: 2.0.3 + memoizee: 0.4.15 + timers-ext: 0.1.7 + dev: true + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: false + + /commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + /cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + dev: true + + /copy-anything@3.0.5: + resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} + engines: {node: '>=12.13'} + dependencies: + is-what: 4.1.16 + dev: true + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + /d@1.0.1: + resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} + 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 + + /data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + dev: false + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /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==} + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: false + + /detect-libc@2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + engines: {node: '>=8'} + dev: false + + /difflib@0.2.4: + resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} + dependencies: + heap: 0.2.7 + dev: true + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: false + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + + /dotenv@16.3.1: + resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + engines: {node: '>=12'} + dev: true + + /dreamopt@0.8.0: + resolution: {integrity: sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==} + engines: {node: '>=0.4.0'} + dependencies: + wordwrap: 1.0.0 + dev: true + + /drizzle-kit@0.20.6: + resolution: {integrity: sha512-+AYQY+tJUnfMJYIeh6aEjI21mpMCekqz0LEu2QdFdc/3zSmjyfEhH5dkXlRFME8v1rtisiHfp7bP+gVVKDPiUg==} + hasBin: true + dependencies: + '@drizzle-team/studio': 0.0.35 + '@esbuild-kit/esm-loader': 2.6.5 + camelcase: 7.0.1 + chalk: 5.3.0 + commander: 9.5.0 + esbuild: 0.19.8 + esbuild-register: 3.5.0(esbuild@0.19.8) + glob: 8.1.0 + hanji: 0.0.5 + json-diff: 0.9.0 + minimatch: 7.4.6 + semver: 7.5.4 + wrangler: 3.19.0 + zod: 3.22.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /drizzle-orm@0.29.1(@cloudflare/workers-types@4.20231121.0)(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2): + resolution: {integrity: sha512-yItc4unfHnk8XkDD3/bdC63vdboTY7e7I03lCF1OJYABXSIfQYU9BFTQJXMMovVeb3T1/OJWwfW/70T1XPnuUA==} + 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: + '@cloudflare/workers-types': 4.20231121.0 + '@libsql/client': 0.4.0-pre.5 + better-sqlite3: 9.2.2 + dev: false + + /drizzle-zod@0.5.1(drizzle-orm@0.29.1)(zod@3.22.4): + resolution: {integrity: sha512-C/8bvzUH/zSnVfwdSibOgFjLhtDtbKYmkbPbUCq46QZyZCH6kODIMSOgZ8R7rVjoI+tCj3k06MRJMDqsIeoS4A==} + peerDependencies: + drizzle-orm: '>=0.23.13' + zod: '*' + dependencies: + drizzle-orm: 0.29.1(@cloudflare/workers-types@4.20231121.0)(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2) + zod: 3.22.4 + dev: false + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: false + + /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.19.8): + resolution: {integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==} + peerDependencies: + esbuild: '>=0.12 <1' + dependencies: + debug: 4.3.4 + esbuild: 0.19.8 + 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 + + /esbuild@0.19.8: + resolution: {integrity: sha512-l7iffQpT2OrZfH2rXIp7/FkmaeZM0vxbxN9KfiCwGYuZqzMg/JdvX26R31Zxn/Pxvsrg3Y9N6XTcnknqDyyv4w==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.19.8 + '@esbuild/android-arm64': 0.19.8 + '@esbuild/android-x64': 0.19.8 + '@esbuild/darwin-arm64': 0.19.8 + '@esbuild/darwin-x64': 0.19.8 + '@esbuild/freebsd-arm64': 0.19.8 + '@esbuild/freebsd-x64': 0.19.8 + '@esbuild/linux-arm': 0.19.8 + '@esbuild/linux-arm64': 0.19.8 + '@esbuild/linux-ia32': 0.19.8 + '@esbuild/linux-loong64': 0.19.8 + '@esbuild/linux-mips64el': 0.19.8 + '@esbuild/linux-ppc64': 0.19.8 + '@esbuild/linux-riscv64': 0.19.8 + '@esbuild/linux-s390x': 0.19.8 + '@esbuild/linux-x64': 0.19.8 + '@esbuild/netbsd-x64': 0.19.8 + '@esbuild/openbsd-x64': 0.19.8 + '@esbuild/sunos-x64': 0.19.8 + '@esbuild/win32-arm64': 0.19.8 + '@esbuild/win32-ia32': 0.19.8 + '@esbuild/win32-x64': 0.19.8 + dev: true + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + /eslint-config-google@0.14.0(eslint@8.55.0): + resolution: {integrity: sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==} + engines: {node: '>=0.10.0'} + peerDependencies: + eslint: '>=5.16.0' + dependencies: + eslint: 8.55.0 + dev: true + + /eslint-plugin-json@3.1.0: + resolution: {integrity: sha512-MrlG2ynFEHe7wDGwbUuFPsaT2b1uhuEFhJ+W1f1u+1C2EkXmTYJp4B1aAdQQ8M+CC3t//N/oRKiIVw14L2HR1g==} + engines: {node: '>=12.0'} + dependencies: + lodash: 4.17.21 + vscode-json-languageservice: 4.2.1 + dev: true + + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + /eslint@8.55.0: + resolution: {integrity: sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.55.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.55.0 + '@humanwhocodes/config-array': 0.11.13 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.23.0 + graphemer: 1.4.0 + ignore: 5.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) + eslint-visitor-keys: 3.4.3 + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + /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'} + + /event-emitter@0.3.5: + resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + dev: true + + /exit-hook@2.2.1: + resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} + engines: {node: '>=6'} + dev: true + + /expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + 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==} + + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: false + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + + /fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.2.1 + dev: false + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.2.0 + + /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'} + dependencies: + to-regex-range: 5.0.1 + + /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 + + /flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.9 + keyv: 4.5.4 + rimraf: 3.0.2 + + /flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + + /formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + dependencies: + fetch-blob: 3.2.0 + dev: false + + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: false + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /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-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'} + dependencies: + is-glob: 4.0.3 + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + + /glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + dev: true + + /globals@13.23.0: + resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.0 + merge2: 1.4.1 + slash: 3.0.0 + dev: false + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + /hanji@0.0.5: + resolution: {integrity: sha512-Abxw1Lq+TnYiL4BueXqMau222fPSPMFtya8HdpWsz/xVAhifXou71mPh/kY2+08RgFcVccjG3uZHs6K5HAe3zw==} + dependencies: + lodash.throttle: 4.1.1 + sisteransi: 1.0.5 + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + /heap@0.2.7: + resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} + dev: true + + /hono@3.11.3: + resolution: {integrity: sha512-MWYBcIS4dZJo9e/852Zwl+gqBiUSRknMOZ/MbW7kW8JiWixTJ58pzXVIeBq7jnvFq3AZ9uQ35QyVpzV05sdNFw==} + engines: {node: '>=16.0.0'} + dev: false + + /husky@8.0.3: + resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: false + + /ignore@5.3.0: + resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} + engines: {node: '>= 4'} + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: false + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + /is-promise@2.2.2: + resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + dev: true + + /is-what@4.1.16: + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} + engines: {node: '>=12.13'} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + /js-base64@3.7.5: + resolution: {integrity: sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==} + dev: false + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + /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-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: true + + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + /libsql@0.2.0-pre.4: + resolution: {integrity: sha512-ZAud4bIZwWJjZUKvQOgg3yVX2fVuqVuPOtjFAPuo+FpfMcsnBpGfOcIJxvfik5qKchyqHd/fpHWbFk7/X0XuHg==} + cpu: [x64, arm64] + os: [darwin, linux, win32] + dependencies: + '@neon-rs/load': 0.0.4 + detect-libc: 2.0.2 + optionalDependencies: + '@libsql/darwin-arm64': 0.2.0-pre.4 + '@libsql/darwin-x64': 0.2.0-pre.4 + '@libsql/linux-arm64-gnu': 0.2.0-pre.4 + '@libsql/linux-arm64-musl': 0.2.0-pre.4 + '@libsql/linux-x64-gnu': 0.2.0-pre.4 + '@libsql/linux-x64-musl': 0.2.0-pre.4 + '@libsql/win32-x64-msvc': 0.2.0-pre.4 + dev: false + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + /lodash.throttle@4.1.1: + resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + dev: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + 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 + + /lucia@3.0.0-beta.11: + resolution: {integrity: sha512-OXZfnM4KifDjkTTG3ruihormyOcXBz6wjAWibAAlw42zWBXDsleFR34gwKBxxXBa+TodzuKy7rcg8FGOMwwSGA==} + dependencies: + oslo: 0.23.5 + dev: false + + /magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /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 + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: false + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: false + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: false + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: false + + /mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + dev: true + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: false + + /miniflare@3.20231030.3: + resolution: {integrity: sha512-lquHSh0XiO8uoWDujOLHtDS9mkUTJTc5C5amiQ6A++5y0f+DWiMqbDBvvwjlYf4Dvqk6ChFya9dztk7fg2ZVxA==} + engines: {node: '>=16.13'} + hasBin: true + dependencies: + acorn: 8.11.2 + acorn-walk: 8.3.1 + 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.28.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 + + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimatch@7.4.6: + resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: false + + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: false + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /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==} + dev: false + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + /next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + dev: true + + /node-abi@3.52.0: + resolution: {integrity: sha512-JJ98b02z16ILv7859irtXn4oUaFWADtvkzy2c0IAatNVX2Mc9Yoh8z6hZInn3QwvMEYhHuQloYi+TTQy67SIdQ==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 + dev: false + + /node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + dev: false + + /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-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + dev: false + + /node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + + /openapi3-ts@4.1.2: + resolution: {integrity: sha512-B7gOkwsYMZO7BZXwJzXCuVagym2xhqsrilVvV0dnq2Di4+iLUXKVX9gOK23ZqaAHZOwABXN0QTdW8QnkUTX6DA==} + dependencies: + yaml: 2.3.4 + + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + + /oslo@0.23.5: + resolution: {integrity: sha512-G+q/MkR0IPaUA1+FpHL0pneAHJzhNpg9P4VXASy4JQy1KGFyfhi30DphVHYNKQC+C05VhDi/sTGdOX+yfcrT3g==} + dependencies: + '@node-rs/argon2': 1.5.2 + '@node-rs/bcrypt': 1.7.3 + dev: false + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + /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'} + dev: false + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + /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.52.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 + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + /prettier@3.1.0: + resolution: {integrity: sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==} + engines: {node: '>=14'} + hasBin: true + dev: false + + /printable-characters@1.0.42: + resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} + dev: true + + /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'} + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: false + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + /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'} + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + + /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. + 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 + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: false + + /selfsigned@2.4.1: + resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} + engines: {node: '>=10'} + dependencies: + '@types/node-forge': 1.3.10 + node-forge: 1.3.1 + dev: true + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: false + + /simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + 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: false + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + dev: true + + /stacktracey@2.1.8: + resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==} + dependencies: + as-table: 1.0.55 + get-source: 2.0.12 + dev: true + + /stoppable@1.1.0: + resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} + engines: {node: '>=4', npm: '>=6'} + dev: true + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /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'} + + /superjson@2.2.1: + resolution: {integrity: sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==} + engines: {node: '>=16'} + dependencies: + copy-anything: 3.0.5 + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + + /tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: false + + /tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + 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 + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + /timers-ext@0.1.7: + resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==} + dependencies: + es5-ext: 0.10.62 + next-tick: 1.1.0 + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: false + + /ts-api-utils@1.0.3(typescript@5.3.3): + resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} + engines: {node: '>=16.13.0'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.3.3 + dev: false + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + dev: true + + /tsx@4.6.2: + resolution: {integrity: sha512-QPpBdJo+ZDtqZgAnq86iY/PD2KYCUPSUGIunHdGwyII99GKH+f3z3FZ8XNFLSGQIA4I365ui8wnQpl8OKLqcsg==} + engines: {node: '>=18.0.0'} + hasBin: true + dependencies: + esbuild: 0.18.20 + get-tsconfig: 4.7.2 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + /type@1.2.0: + resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} + dev: true + + /type@2.7.2: + resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} + dev: true + + /typescript@5.3.3: + resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + engines: {node: '>=14.17'} + hasBin: true + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + /undici@5.28.2: + resolution: {integrity: sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==} + engines: {node: '>=14.0'} + dependencies: + '@fastify/busboy': 2.1.0 + dev: true + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: false + + /uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + dev: false + + /vscode-json-languageservice@4.2.1: + resolution: {integrity: sha512-xGmv9QIWs2H8obGbWg+sIPI/3/pFgj/5OWBhNzs00BkYQ9UaB2F6JJaGB/2/YOZJ3BvLXQTC4Q7muqU25QgAhA==} + dependencies: + jsonc-parser: 3.2.0 + vscode-languageserver-textdocument: 1.0.11 + vscode-languageserver-types: 3.17.5 + vscode-nls: 5.2.0 + vscode-uri: 3.0.8 + dev: true + + /vscode-languageserver-textdocument@1.0.11: + resolution: {integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==} + dev: true + + /vscode-languageserver-types@3.17.5: + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + dev: true + + /vscode-nls@5.2.0: + resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==} + dev: true + + /vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + dev: true + + /web-streams-polyfill@3.2.1: + resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} + engines: {node: '>= 8'} + dev: false + + /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@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + + /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.19.0: + resolution: {integrity: sha512-pY7xWqkQn6DJ+1vz9YHz2pCftEmK+JCTj9sqnucp0NZnlUiILDmBWegsjjCLZycgfiA62J213N7NvjLPr2LB8w==} + engines: {node: '>=16.17.0'} + hasBin: true + 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.3 + 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 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /ws@8.14.2: + resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + /xxhash-wasm@1.0.2: + resolution: {integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==} + dev: true + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + /yaml@2.3.4: + resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} + engines: {node: '>= 14'} + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + /youch@3.3.3: + resolution: {integrity: sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==} + dependencies: + cookie: 0.5.0 + mustache: 4.2.0 + stacktracey: 2.1.8 + dev: true + + /zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} From f7d33320ccd61602ec934fe7eea4cd632d2c752c Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Wed, 13 Dec 2023 20:56:03 +0000 Subject: [PATCH 189/318] [no ci] prettier --- pnpm-lock.yaml | 7720 ++++++++++++++++++++++++++++-------------------- 1 file changed, 4482 insertions(+), 3238 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2f5a741..113df48 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,3247 +1,4491 @@ -lockfileVersion: '6.0' +lockfileVersion: "6.0" settings: - autoInstallPeers: true - excludeLinksFromLockfile: false + autoInstallPeers: true + excludeLinksFromLockfile: false dependencies: - '@hono/swagger-ui': - specifier: ^0.2.0 - version: 0.2.0(hono@3.11.3) - '@hono/zod-openapi': - specifier: ^0.9.3 - version: 0.9.3(hono@3.11.3)(zod@3.22.4) - '@libsql/client': - specifier: 0.4.0-pre.5 - version: 0.4.0-pre.5 - '@lucia-auth/adapter-sqlite': - specifier: 3.0.0-beta.9 - version: 3.0.0-beta.9(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2)(lucia@3.0.0-beta.11) - '@typescript-eslint/eslint-plugin': - specifier: ^6.13.2 - version: 6.13.2(@typescript-eslint/parser@6.13.2)(eslint@8.55.0)(typescript@5.3.3) - better-sqlite3: - specifier: ^9.2.2 - version: 9.2.2 - drizzle-orm: - specifier: ^0.29.1 - version: 0.29.1(@cloudflare/workers-types@4.20231121.0)(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2) - drizzle-zod: - specifier: ^0.5.1 - version: 0.5.1(drizzle-orm@0.29.1)(zod@3.22.4) - hono: - specifier: ^3.11.3 - version: 3.11.3 - lucia: - specifier: 3.0.0-beta.11 - version: 3.0.0-beta.11 - oslo: - specifier: ^0.23.5 - version: 0.23.5 - prettier: - specifier: ^3.1.0 - version: 3.1.0 - uuid: - specifier: ^9.0.1 - version: 9.0.1 - zod: - specifier: ^3.22.4 - version: 3.22.4 + "@hono/swagger-ui": + specifier: ^0.2.0 + version: 0.2.0(hono@3.11.3) + "@hono/zod-openapi": + specifier: ^0.9.3 + version: 0.9.3(hono@3.11.3)(zod@3.22.4) + "@libsql/client": + specifier: 0.4.0-pre.5 + version: 0.4.0-pre.5 + "@lucia-auth/adapter-sqlite": + specifier: 3.0.0-beta.9 + version: 3.0.0-beta.9(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2)(lucia@3.0.0-beta.11) + "@typescript-eslint/eslint-plugin": + specifier: ^6.13.2 + version: 6.13.2(@typescript-eslint/parser@6.13.2)(eslint@8.55.0)(typescript@5.3.3) + better-sqlite3: + specifier: ^9.2.2 + version: 9.2.2 + drizzle-orm: + specifier: ^0.29.1 + version: 0.29.1(@cloudflare/workers-types@4.20231121.0)(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2) + drizzle-zod: + specifier: ^0.5.1 + version: 0.5.1(drizzle-orm@0.29.1)(zod@3.22.4) + hono: + specifier: ^3.11.3 + version: 3.11.3 + lucia: + specifier: 3.0.0-beta.11 + version: 3.0.0-beta.11 + oslo: + specifier: ^0.23.5 + version: 0.23.5 + prettier: + specifier: ^3.1.0 + version: 3.1.0 + uuid: + specifier: ^9.0.1 + version: 9.0.1 + zod: + specifier: ^3.22.4 + version: 3.22.4 devDependencies: - '@asteasolutions/zod-to-openapi': - specifier: ^6.3.0 - version: 6.3.0(zod@3.22.4) - '@cloudflare/workers-types': - specifier: ^4.20231121.0 - version: 4.20231121.0 - '@types/node': - specifier: ^20.10.4 - version: 20.10.4 - dotenv: - specifier: ^16.3.1 - version: 16.3.1 - drizzle-kit: - specifier: ^0.20.6 - version: 0.20.6 - eslint: - specifier: ^8.55.0 - version: 8.55.0 - eslint-config-google: - specifier: ^0.14.0 - version: 0.14.0(eslint@8.55.0) - eslint-plugin-json: - specifier: ^3.1.0 - version: 3.1.0 - husky: - specifier: ^8.0.3 - version: 8.0.3 - openapi-generator: - specifier: link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator - version: link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator - tsx: - specifier: ^4.6.2 - version: 4.6.2 - typescript: - specifier: ^5.3.3 - version: 5.3.3 - wrangler: - specifier: 3.19.0 - version: 3.19.0 + "@asteasolutions/zod-to-openapi": + specifier: ^6.3.0 + version: 6.3.0(zod@3.22.4) + "@cloudflare/workers-types": + specifier: ^4.20231121.0 + version: 4.20231121.0 + "@types/node": + specifier: ^20.10.4 + version: 20.10.4 + dotenv: + specifier: ^16.3.1 + version: 16.3.1 + drizzle-kit: + specifier: ^0.20.6 + version: 0.20.6 + eslint: + specifier: ^8.55.0 + version: 8.55.0 + eslint-config-google: + specifier: ^0.14.0 + version: 0.14.0(eslint@8.55.0) + eslint-plugin-json: + specifier: ^3.1.0 + version: 3.1.0 + husky: + specifier: ^8.0.3 + version: 8.0.3 + openapi-generator: + specifier: link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator + version: link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator + tsx: + specifier: ^4.6.2 + version: 4.6.2 + typescript: + specifier: ^5.3.3 + version: 5.3.3 + wrangler: + specifier: 3.19.0 + version: 3.19.0 packages: + /@aashutoshrathi/word-wrap@1.2.6: + resolution: + { + integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==, + } + engines: { node: ">=0.10.0" } + + /@asteasolutions/zod-to-openapi@5.5.0(zod@3.22.4): + resolution: + { + integrity: sha512-d5HwrvM6dOKr3XdeF+DmashGvfEc+1oiEfbscugsiwSTrFtuMa7ETpW9sTNnVgn+hJaz+PRxPQUYD7q9/5dUig==, + } + peerDependencies: + zod: ^3.20.2 + dependencies: + openapi3-ts: 4.1.2 + zod: 3.22.4 + dev: false + + /@asteasolutions/zod-to-openapi@6.3.0(zod@3.22.4): + resolution: + { + integrity: sha512-ca7Svz3BWkMaIP3M1YGsyxgp7AcKXlTmy19ozhY0DslhatXbnyxdvxlmiI0TmvkIfi6RpQfm+eK1neVLsh6Riw==, + } + peerDependencies: + zod: ^3.20.2 + dependencies: + openapi3-ts: 4.1.2 + zod: 3.22.4 + dev: true + + /@cloudflare/kv-asset-handler@0.2.0: + resolution: + { + integrity: sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==, + } + dependencies: + mime: 3.0.0 + dev: true + + /@cloudflare/workerd-darwin-64@1.20231030.0: + resolution: + { + integrity: sha512-J4PQ9utPxLya9yHdMMx3AZeC5M/6FxcoYw6jo9jbDDFTy+a4Gslqf4Im9We3aeOEdPXa3tgQHVQOSelJSZLhIw==, + } + engines: { node: ">=16" } + cpu: [x64] + os: [darwin] + requiresBuild: true + 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 + + /@cloudflare/workers-types@4.20231121.0: + resolution: + { + integrity: sha512-+kWfpCkqiepwAKXyHoE0gnkPgkLhz0/9HOBIGhHRsUvUKvhUtm3mbqqoGRWgF1qcjzrDUBbrrOq4MYHfFtc2RA==, + } + + /@drizzle-team/studio@0.0.35: + resolution: + { + integrity: sha512-t5LTNOVf+L7Bb/wdssOIPx0ueNvhyaIXdrvKgoHR4wK0GD7SRmILcCTzn6N6Ltr1VnFzQZG/bzn6HMagn17Jtw==, + } + dependencies: + superjson: 2.2.1 + 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-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-arm64@0.19.8: + resolution: + { + integrity: sha512-B8JbS61bEunhfx8kasogFENgQfr/dIp+ggYXwTqdbMAgGDhRa3AaPpQMuQU0rNxDLECj6FhDzk1cF9WHMVwrtA==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: 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-arm@0.19.8: + resolution: + { + integrity: sha512-31E2lxlGM1KEfivQl8Yf5aYU/mflz9g06H6S15ITUFQueMFtFjESRMoDSkvMo8thYvLBax+VKTPlpnx+sPicOA==, + } + engines: { node: ">=12" } + cpu: [arm] + 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/android-x64@0.19.8: + resolution: + { + integrity: sha512-rdqqYfRIn4jWOp+lzQttYMa2Xar3OK9Yt2fhOhzFXqg0rVWEfSclJvZq5fZslnz6ypHvVf3CT7qyf0A5pM682A==, + } + 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-arm64@0.19.8: + resolution: + { + integrity: sha512-RQw9DemMbIq35Bprbboyf8SmOr4UXsRVxJ97LgB55VKKeJOOdvsIPy0nFyF2l8U+h4PtBx/1kRf0BelOYCiQcw==, + } + 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/darwin-x64@0.19.8: + resolution: + { + integrity: sha512-3sur80OT9YdeZwIVgERAysAbwncom7b4bCI2XKLjMfPymTud7e/oY4y+ci1XVp5TfQp/bppn7xLw1n/oSQY3/Q==, + } + 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-arm64@0.19.8: + resolution: + { + integrity: sha512-WAnPJSDattvS/XtPCTj1tPoTxERjcTpH6HsMr6ujTT+X6rylVe8ggxk8pVxzf5U1wh5sPODpawNicF5ta/9Tmw==, + } + 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/freebsd-x64@0.19.8: + resolution: + { + integrity: sha512-ICvZyOplIjmmhjd6mxi+zxSdpPTKFfyPPQMQTK/w+8eNK6WV01AjIztJALDtwNNfFhfZLux0tZLC+U9nSyA5Zg==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [freebsd] + 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-arm64@0.19.8: + resolution: + { + integrity: sha512-z1zMZivxDLHWnyGOctT9JP70h0beY54xDDDJt4VpTX+iwA77IFsE1vCXWmprajJGa+ZYSqkSbRQ4eyLCpCmiCQ==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [linux] + 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-arm@0.19.8: + resolution: + { + integrity: sha512-H4vmI5PYqSvosPaTJuEppU9oz1dq2A7Mr2vyg5TF9Ga+3+MGgBdGzcyBP7qK9MrwFQZlvNyJrvz6GuCaj3OukQ==, + } + engines: { node: ">=12" } + cpu: [arm] + 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-ia32@0.19.8: + resolution: + { + integrity: sha512-1a8suQiFJmZz1khm/rDglOc8lavtzEMRo0v6WhPgxkrjcU0LkHj+TwBrALwoz/OtMExvsqbbMI0ChyelKabSvQ==, + } + 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-loong64@0.19.8: + resolution: + { + integrity: sha512-fHZWS2JJxnXt1uYJsDv9+b60WCc2RlvVAy1F76qOLtXRO+H4mjt3Tr6MJ5l7Q78X8KgCFudnTuiQRBhULUyBKQ==, + } + 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-mips64el@0.19.8: + resolution: + { + integrity: sha512-Wy/z0EL5qZYLX66dVnEg9riiwls5IYnziwuju2oUiuxVc+/edvqXa04qNtbrs0Ukatg5HEzqT94Zs7J207dN5Q==, + } + 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-ppc64@0.19.8: + resolution: + { + integrity: sha512-ETaW6245wK23YIEufhMQ3HSeHO7NgsLx8gygBVldRHKhOlD1oNeNy/P67mIh1zPn2Hr2HLieQrt6tWrVwuqrxg==, + } + 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-riscv64@0.19.8: + resolution: + { + integrity: sha512-T2DRQk55SgoleTP+DtPlMrxi/5r9AeFgkhkZ/B0ap99zmxtxdOixOMI570VjdRCs9pE4Wdkz7JYrsPvsl7eESg==, + } + 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-s390x@0.19.8: + resolution: + { + integrity: sha512-NPxbdmmo3Bk7mbNeHmcCd7R7fptJaczPYBaELk6NcXxy7HLNyWwCyDJ/Xx+/YcNH7Im5dHdx9gZ5xIwyliQCbg==, + } + 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/linux-x64@0.19.8: + resolution: + { + integrity: sha512-lytMAVOM3b1gPypL2TRmZ5rnXl7+6IIk8uB3eLsV1JwcizuolblXRrc5ShPrO9ls/b+RTp+E6gbsuLWHWi2zGg==, + } + 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/netbsd-x64@0.19.8: + resolution: + { + integrity: sha512-hvWVo2VsXz/8NVt1UhLzxwAfo5sioj92uo0bCfLibB0xlOmimU/DeAEsQILlBQvkhrGjamP0/el5HU76HAitGw==, + } + 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/openbsd-x64@0.19.8: + resolution: + { + integrity: sha512-/7Y7u77rdvmGTxR83PgaSvSBJCC2L3Kb1M/+dmSIvRvQPXXCuC97QAwMugBNG0yGcbEGfFBH7ojPzAOxfGNkwQ==, + } + 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/sunos-x64@0.19.8: + resolution: + { + integrity: sha512-9Lc4s7Oi98GqFA4HzA/W2JHIYfnXbUYgekUP/Sm4BG9sfLjyv6GKKHKKVs83SMicBF2JwAX6A1PuOLMqpD001w==, + } + 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-arm64@0.19.8: + resolution: + { + integrity: sha512-rq6WzBGjSzihI9deW3fC2Gqiak68+b7qo5/3kmB6Gvbh/NYPA0sJhrnp7wgV4bNwjqM+R2AApXGxMO7ZoGhIJg==, + } + 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-ia32@0.19.8: + resolution: + { + integrity: sha512-AIAbverbg5jMvJznYiGhrd3sumfwWs8572mIJL5NQjJa06P8KfCPWZQ0NwZbPQnbQi9OWSZhFVSUWjjIrn4hSw==, + } + 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 + + /@esbuild/win32-x64@0.19.8: + resolution: + { + integrity: sha512-bfZ0cQ1uZs2PqpulNL5j/3w+GDhP36k1K5c38QdQg+Swy51jFZWWeIkteNsufkQxp986wnqRRsb/bHbY1WQ7TA==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.55.0): + resolution: + { + integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.55.0 + eslint-visitor-keys: 3.4.3 + + /@eslint-community/regexpp@4.10.0: + resolution: + { + integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==, + } + engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } + + /@eslint/eslintrc@2.1.4: + resolution: + { + integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.23.0 + ignore: 5.3.0 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + /@eslint/js@8.55.0: + resolution: + { + integrity: sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + + /@fastify/busboy@2.1.0: + resolution: + { + integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==, + } + engines: { node: ">=14" } + dev: true + + /@hono/swagger-ui@0.2.0(hono@3.11.3): + resolution: + { + integrity: sha512-ulWqCI+38vTlxxBmOAi5VTOUDa5/7fKHPTwyq00kRUjUxPp3Ej5Cs+B/fvGs5gd3KraArLArkln7sHhb5vODZA==, + } + peerDependencies: + hono: "*" + dependencies: + hono: 3.11.3 + dev: false + + /@hono/zod-openapi@0.9.3(hono@3.11.3)(zod@3.22.4): + resolution: + { + integrity: sha512-PdKWwUvMdoQ2eqJZtbo4N4qb2VRjHNnDcfWW3/IqSeJDyK4vIPHAzWfgtUOYHAXJAiooQQ87m0sw2iME2H1+zQ==, + } + engines: { node: ">=16.0.0" } + peerDependencies: + hono: ">=3.11.3" + zod: 3.* + dependencies: + "@asteasolutions/zod-to-openapi": 5.5.0(zod@3.22.4) + "@hono/zod-validator": 0.1.11(hono@3.11.3)(zod@3.22.4) + hono: 3.11.3 + zod: 3.22.4 + dev: false + + /@hono/zod-validator@0.1.11(hono@3.11.3)(zod@3.22.4): + resolution: + { + integrity: sha512-PQXeHUP0+36qpRt8yfeD7N2jbK3ETlGvSN6dMof/HwUC/APRokQRjpXZm4rrlG71Ft0aWE01+Bm4XejqPie5Uw==, + } + peerDependencies: + hono: ">=3.9.0" + zod: ^3.19.1 + dependencies: + hono: 3.11.3 + zod: 3.22.4 + dev: false + + /@humanwhocodes/config-array@0.11.13: + resolution: + { + integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==, + } + engines: { node: ">=10.10.0" } + dependencies: + "@humanwhocodes/object-schema": 2.0.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + /@humanwhocodes/module-importer@1.0.1: + resolution: + { + integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, + } + engines: { node: ">=12.22" } + + /@humanwhocodes/object-schema@2.0.1: + resolution: + { + integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==, + } + + /@libsql/client@0.4.0-pre.5: + resolution: + { + integrity: sha512-GyKigCBslE5uztwT7mpvp9Zn0z3iWjnufcfeTeDSFPMyXCPjSAHUOiwSLAaHii909w6EQacA692CXmYYFo/eig==, + } + dependencies: + "@libsql/hrana-client": 0.5.5 + js-base64: 3.7.5 + libsql: 0.2.0-pre.4 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: false + + /@libsql/darwin-arm64@0.2.0-pre.4: + resolution: + { + integrity: sha512-kb0f/FeZxzeqa+j6O7xI9toOeoTNCJnErOcNyWWzoqA5JZ4LJ9dCMrLPWe4Np22+Rg57NPmFz/Z7MFNP2y5Gow==, + } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@libsql/darwin-x64@0.2.0-pre.4: + resolution: + { + integrity: sha512-HQM9cmGP4t+ujbyhA6rjQ8K4iHw5DStq3YnL8030k5z4KHGkAOIcRbVj3m65J72Gy+tCsisUCZTrBjIFkjOFhA==, + } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@libsql/hrana-client@0.5.5: + resolution: + { + integrity: sha512-i+hDBpiV719poqEiHupUUZYKJ9YSbCRFe5Q2PQ0v3mHIftePH6gayLjp2u6TXbqbO/Dv6y8yyvYlBXf/kFfRZA==, + } + dependencies: + "@libsql/isomorphic-fetch": 0.1.10 + "@libsql/isomorphic-ws": 0.1.5 + js-base64: 3.7.5 + node-fetch: 3.3.2 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: false + + /@libsql/isomorphic-fetch@0.1.10: + resolution: + { + integrity: sha512-dH0lMk50gKSvEKD78xWMu60SY1sjp1sY//iFLO0XMmBwfVfG136P9KOk06R4maBdlb8KMXOzJ1D28FR5ZKnHTA==, + } + dependencies: + "@types/node-fetch": 2.6.9 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: false + + /@libsql/isomorphic-ws@0.1.5: + resolution: + { + integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==, + } + dependencies: + "@types/ws": 8.5.10 + ws: 8.14.2 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /@libsql/linux-arm64-gnu@0.2.0-pre.4: + resolution: + { + integrity: sha512-1VVhnSx+vSDCLXxfUP9kRGbZyy+Si6tvPQZ8JqZftt9EJG1Dvzp1E1TT8zFYMeBQeVyoV4KryctW5b5uZkqVQA==, + } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@libsql/linux-arm64-musl@0.2.0-pre.4: + resolution: + { + integrity: sha512-lbSeR5agUDkpHTT3OOnuINWEr7OsX+XCwJ21bkceoXu/napW7A3auiOjzK7mneI+vT7fRjay0caivrdoqgeKKg==, + } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@libsql/linux-x64-gnu@0.2.0-pre.4: + resolution: + { + integrity: sha512-OBiu0+tEVj2daJJrcg1uhEtHx7CsED8QesEqz8dhoK0Dad1oSn8XUpulhiMiXP1JFlcr7Zz37eKJdQxv17WTfw==, + } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@libsql/linux-x64-musl@0.2.0-pre.4: + resolution: + { + integrity: sha512-iJr3XiUTsB8ic4+DTG8412o9NZ3ifCEM+FaZ0/uxh3xlERbYUMUZhAIylxJqYjovld0edd6Nns7OJfu5b8Ae2g==, + } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@libsql/win32-x64-msvc@0.2.0-pre.4: + resolution: + { + integrity: sha512-kV/Bl6RBMCm24LFmlowl//TvD8jhRjSmUjComXdQ4j5JrAW29MVEb5EtrA16qGzeWb06tSMII0z5yqEaYxvQbQ==, + } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@lucia-auth/adapter-sqlite@3.0.0-beta.9(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2)(lucia@3.0.0-beta.11): + resolution: + { + integrity: sha512-Z6kW5ebeEDMlUcJu3bf4USbUuPa2rcCKWJxHdK0jqiPoJfNJrUpg/yBfoUZ7CJ/mucTAKV9EjcrVZSUTHvesGA==, + } + peerDependencies: + "@libsql/client": ^0.3.0 + better-sqlite3: 8.x - 9.x + lucia: 3.0.0-beta.11 + peerDependenciesMeta: + "@libsql/client": + optional: true + better-sqlite3: + optional: true + dependencies: + "@libsql/client": 0.4.0-pre.5 + better-sqlite3: 9.2.2 + lucia: 3.0.0-beta.11 + dev: false + + /@neon-rs/load@0.0.4: + resolution: + { + integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==, + } + dev: false + + /@node-rs/argon2-android-arm-eabi@1.5.2: + resolution: + { + integrity: sha512-vVZec4ITr9GumAy0p8Zj8ozie362gtbZrTkLp9EqvuFZ/HrZzR09uS2IsDgm4mAstg/rc4A1gLRrHI8jDdbjkA==, + } + engines: { node: ">= 10" } + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-android-arm64@1.5.2: + resolution: + { + integrity: sha512-SwhnsXyrpgtWDTwYds1WUnxLA/kVP8HVaImYwQ3Wemqj1lkzcSoIaNyjNWkyrYGqO1tVc1YUrqsbd5eCHh+3sg==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-darwin-arm64@1.5.2: + resolution: + { + integrity: sha512-+1ZMKiCCv2pip/o1Xg09piQru2LOIBPQ1vS4is86f55N3jjZnSfP+db5mYCSRuB0gRYqui98he7su7OGXlF4gQ==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-darwin-x64@1.5.2: + resolution: + { + integrity: sha512-mQ57mORlsxpfjcEsVpiHyHCOp6Ljrz/rVNWk8ihnPWw0qt0EqF1zbHRxTEPemL1iBHL9UyXpXrKS4JKq6xMn5w==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-freebsd-x64@1.5.2: + resolution: + { + integrity: sha512-UjKbFd3viYcpiwflkU4haEdNUMk1V2fVCJImWLWQns/hVval9BrDv5xsBwgdynbPHDlPOiWj816LBQwhWLGVWA==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-arm-gnueabihf@1.5.2: + resolution: + { + integrity: sha512-36GJjJBnVuscV9CTn8RVDeJysnmIzr6Lp7QBCDczYHi6eKFuA8udCJb4SRyJqdvIuzycKG1RL56FbcFBJYCYIA==, + } + engines: { node: ">= 10" } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-arm64-gnu@1.5.2: + resolution: + { + integrity: sha512-sE0ydb2gp6xC+5vbVz8l3paaiBbFQIB2Rwp5wx9MmKiYdTfcO5WkGeADuSgoFiTcSEz1RsHXqrdVy6j/LtSqtA==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-arm64-musl@1.5.2: + resolution: + { + integrity: sha512-LhE0YHB0aJCwlbsQrwePik/KFWUc9qMriJIL5KiejK3bDoTVY4ihH587QT56JyaLvl3nBJaAV8l5yMqQdHnouA==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-x64-gnu@1.5.2: + resolution: + { + integrity: sha512-MnKLiBlyg05pxvKXe3lNgBL9El9ThD74hvVEiWH1Xk40RRrJ507NCOWXVmQ0FDq1mjTeGFxbIvk+AcoF0NSLIQ==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-x64-musl@1.5.2: + resolution: + { + integrity: sha512-tzLgASY0Ng2OTW7Awwl9UWzjbWx8/uD6gXcZ/k/nYGSZE5Xp8EOD2NUqHLbK6KZE3775A0R25ShpiSxCadYqkg==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-win32-arm64-msvc@1.5.2: + resolution: + { + integrity: sha512-vpTwSvv3oUXTpWZh0/HxdJ5wFMlmS7aVDwL4ATWepTZhMG4n+TO0+tVLdcPHCbg0oc6hCWBjWNPlSn9mW+YIgA==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-win32-ia32-msvc@1.5.2: + resolution: + { + integrity: sha512-KPpZR15ui7uQWQXKmtaKyUQRs4UJdXnIIfiyFLGmLWCdEKlr3MtIGFt0fdziu4BF5ZObD8Ic6QvT0VXK4OJiww==, + } + engines: { node: ">= 10" } + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-win32-x64-msvc@1.5.2: + resolution: + { + integrity: sha512-/pGuwixJS8ZlpwhX9iM6g6JEeZYo1TtnNf8exwsOi7gxcUoTUfw5it+5GfbY/n+xRBz/DIU4bzUmXmh+7Gh0ug==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2@1.5.2: + resolution: + { + integrity: sha512-qq7wOSsdP2b4rXEapWNmsCjpaTGZWtp9kZmri98GYCDZqN8UJUG5zSue4XtYWWJMWKJVE/hkaIwk+BgN1ZUn0Q==, + } + engines: { node: ">= 10" } + optionalDependencies: + "@node-rs/argon2-android-arm-eabi": 1.5.2 + "@node-rs/argon2-android-arm64": 1.5.2 + "@node-rs/argon2-darwin-arm64": 1.5.2 + "@node-rs/argon2-darwin-x64": 1.5.2 + "@node-rs/argon2-freebsd-x64": 1.5.2 + "@node-rs/argon2-linux-arm-gnueabihf": 1.5.2 + "@node-rs/argon2-linux-arm64-gnu": 1.5.2 + "@node-rs/argon2-linux-arm64-musl": 1.5.2 + "@node-rs/argon2-linux-x64-gnu": 1.5.2 + "@node-rs/argon2-linux-x64-musl": 1.5.2 + "@node-rs/argon2-win32-arm64-msvc": 1.5.2 + "@node-rs/argon2-win32-ia32-msvc": 1.5.2 + "@node-rs/argon2-win32-x64-msvc": 1.5.2 + dev: false + + /@node-rs/bcrypt-android-arm-eabi@1.7.3: + resolution: + { + integrity: sha512-l53RuBqnqNvBN2jx09Ws6jpLmuQdSDx10n0GeaTfwh1svxsC8bPpVmxkfBExsT2Tu7KF38gTnPZvwsxysZQyPQ==, + } + engines: { node: ">= 10" } + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-android-arm64@1.7.3: + resolution: + { + integrity: sha512-TZpm4VbiViqDMvusrcYzLr1b1M5FDF0cDNiTUciLeBSsKtU5lNdEZGAU7gvCnrKoUWpGuOblHU7613zuB7SiNQ==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-darwin-arm64@1.7.3: + resolution: + { + integrity: sha512-SiUuAabynVsmixZMjh5xrn8w47EnV0HzbW9st4DPoVhn/wzdUcksIXDY75aoQG2EIzKLN8IGb+CIVnPGmRyhxw==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-darwin-x64@1.7.3: + resolution: + { + integrity: sha512-R+81Z0eX4hZPvCXY5Z6l0l+JrTU3WcSYGHP0QYV9uwdaafOz6EhrCXUzZ02AIcAbNoVR8eucYVruq9PiasXoVw==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-freebsd-x64@1.7.3: + resolution: + { + integrity: sha512-0pItU/5K3e83JjcJj9fZv+78txUoZ3hHCT7n/UMdu9mkpUzhX/rqb4jmQpJpD+UQoR76xp3qDo5RMgQBffBVNg==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-arm-gnueabihf@1.7.3: + resolution: + { + integrity: sha512-HTSybWUjNe8rWuXkTkMeFDiQNHc6VioRcgv6AeHZphIxiT6dFbnhXNkfz4Hr0zxvyPhZ3NrYjT2AmPVFT6VW3Q==, + } + engines: { node: ">= 10" } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-arm64-gnu@1.7.3: + resolution: + { + integrity: sha512-rWep6Y+v/c4bZHaM8LmSsrMwMmDR9wG4/q+3Z9VzR8xdnt5VCbuQdYWpf3sgGRGjTRdTBAdSK8x1reOjqsJ3Jg==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-arm64-musl@1.7.3: + resolution: + { + integrity: sha512-TyWEKhxr+yfGcMKzVV/ARZw+Hrky2yl91bo0XYU2ZW6I6LDC0emNsXugdWjwz8ADI4OWhhrOjXD8GCilxiB2Rg==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-x64-gnu@1.7.3: + resolution: + { + integrity: sha512-PofxM1Qg7tZKj1oP0I7tBTSSLr8Xc2uxx+P3pBCPmYzaBwWqGteNHJlF7n2q5xiH7YOlguH4w5CmcEjsiA3K4A==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-x64-musl@1.7.3: + resolution: + { + integrity: sha512-D5V6/dDVKP8S/ieDBLGhTn4oTo3upbrpWInynbhOMjJvPiIxVG1PiI3MXkWBtG9qtfleDk7gUkEKtAOxlIxDTQ==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-win32-arm64-msvc@1.7.3: + resolution: + { + integrity: sha512-b4gH2Yj5R4TwULrfMHd1Qqr+MrnFjVRUAJujDKPqi+PppSqezW8QF6DRSOL4GjnBmz5JEd64wxgeidvy7dsbGw==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-win32-ia32-msvc@1.7.3: + resolution: + { + integrity: sha512-E91ro+ybI0RhNc89aGaZQGll0YhPoHr8JacoWrNKwhg9zwNOYeuO0tokdMZdm6nF0/8obll0Mq7wO9AXO9iffw==, + } + engines: { node: ">= 10" } + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-win32-x64-msvc@1.7.3: + resolution: + { + integrity: sha512-LO/p9yjPODj/pQvPnowBuwpDdqiyUXQbqL1xb1RSP3NoyCFAGmjL5h0plSQrhLh8hskQiozBRXNaQurtsM7o0Q==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt@1.7.3: + resolution: + { + integrity: sha512-BF6u9CBPUiyk1zU+5iwikezf+xM4MFSu5cmrrg/PLKffGgIM13ZsY6DHftcTraETB04ryasjM/5IejotH+sO5Q==, + } + engines: { node: ">= 10" } + optionalDependencies: + "@node-rs/bcrypt-android-arm-eabi": 1.7.3 + "@node-rs/bcrypt-android-arm64": 1.7.3 + "@node-rs/bcrypt-darwin-arm64": 1.7.3 + "@node-rs/bcrypt-darwin-x64": 1.7.3 + "@node-rs/bcrypt-freebsd-x64": 1.7.3 + "@node-rs/bcrypt-linux-arm-gnueabihf": 1.7.3 + "@node-rs/bcrypt-linux-arm64-gnu": 1.7.3 + "@node-rs/bcrypt-linux-arm64-musl": 1.7.3 + "@node-rs/bcrypt-linux-x64-gnu": 1.7.3 + "@node-rs/bcrypt-linux-x64-musl": 1.7.3 + "@node-rs/bcrypt-win32-arm64-msvc": 1.7.3 + "@node-rs/bcrypt-win32-ia32-msvc": 1.7.3 + "@node-rs/bcrypt-win32-x64-msvc": 1.7.3 + dev: false + + /@nodelib/fs.scandir@2.1.5: + resolution: + { + integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, + } + engines: { node: ">= 8" } + dependencies: + "@nodelib/fs.stat": 2.0.5 + run-parallel: 1.2.0 + + /@nodelib/fs.stat@2.0.5: + resolution: + { + integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, + } + engines: { node: ">= 8" } + + /@nodelib/fs.walk@1.2.8: + resolution: + { + integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, + } + engines: { node: ">= 8" } + dependencies: + "@nodelib/fs.scandir": 2.1.5 + fastq: 1.15.0 + + /@types/json-schema@7.0.15: + resolution: + { + integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, + } + dev: false + + /@types/node-fetch@2.6.9: + resolution: + { + integrity: sha512-bQVlnMLFJ2d35DkPNjEPmd9ueO/rh5EiaZt2bhqiSarPjZIuIV6bPQVqcrEyvNo+AfTrRGVazle1tl597w3gfA==, + } + dependencies: + "@types/node": 20.10.4 + form-data: 4.0.0 + dev: false + + /@types/node-forge@1.3.10: + resolution: + { + integrity: sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw==, + } + dependencies: + "@types/node": 20.10.4 + dev: true + + /@types/node@20.10.4: + resolution: + { + integrity: sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==, + } + dependencies: + undici-types: 5.26.5 + + /@types/semver@7.5.6: + resolution: + { + integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==, + } + dev: false + + /@types/ws@8.5.10: + resolution: + { + integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==, + } + dependencies: + "@types/node": 20.10.4 + dev: false + + /@typescript-eslint/eslint-plugin@6.13.2(@typescript-eslint/parser@6.13.2)(eslint@8.55.0)(typescript@5.3.3): + resolution: + { + integrity: sha512-3+9OGAWHhk4O1LlcwLBONbdXsAhLjyCFogJY/cWy2lxdVJ2JrcTF2pTGMaLl2AE7U1l31n8Py4a8bx5DLf/0dQ==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@eslint-community/regexpp": 4.10.0 + "@typescript-eslint/parser": 6.13.2(eslint@8.55.0)(typescript@5.3.3) + "@typescript-eslint/scope-manager": 6.13.2 + "@typescript-eslint/type-utils": 6.13.2(eslint@8.55.0)(typescript@5.3.3) + "@typescript-eslint/utils": 6.13.2(eslint@8.55.0)(typescript@5.3.3) + "@typescript-eslint/visitor-keys": 6.13.2 + debug: 4.3.4 + eslint: 8.55.0 + graphemer: 1.4.0 + ignore: 5.3.0 + natural-compare: 1.4.0 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/parser@6.13.2(eslint@8.55.0)(typescript@5.3.3): + resolution: + { + integrity: sha512-MUkcC+7Wt/QOGeVlM8aGGJZy1XV5YKjTpq9jK6r6/iLsGXhBVaGP5N0UYvFsu9BFlSpwY9kMretzdBH01rkRXg==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@typescript-eslint/scope-manager": 6.13.2 + "@typescript-eslint/types": 6.13.2 + "@typescript-eslint/typescript-estree": 6.13.2(typescript@5.3.3) + "@typescript-eslint/visitor-keys": 6.13.2 + debug: 4.3.4 + eslint: 8.55.0 + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/scope-manager@6.13.2: + resolution: + { + integrity: sha512-CXQA0xo7z6x13FeDYCgBkjWzNqzBn8RXaE3QVQVIUm74fWJLkJkaHmHdKStrxQllGh6Q4eUGyNpMe0b1hMkXFA==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + dependencies: + "@typescript-eslint/types": 6.13.2 + "@typescript-eslint/visitor-keys": 6.13.2 + dev: false + + /@typescript-eslint/type-utils@6.13.2(eslint@8.55.0)(typescript@5.3.3): + resolution: + { + integrity: sha512-Qr6ssS1GFongzH2qfnWKkAQmMUyZSyOr0W54nZNU1MDfo+U4Mv3XveeLZzadc/yq8iYhQZHYT+eoXJqnACM1tw==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@typescript-eslint/typescript-estree": 6.13.2(typescript@5.3.3) + "@typescript-eslint/utils": 6.13.2(eslint@8.55.0)(typescript@5.3.3) + debug: 4.3.4 + eslint: 8.55.0 + ts-api-utils: 1.0.3(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/types@6.13.2: + resolution: + { + integrity: sha512-7sxbQ+EMRubQc3wTfTsycgYpSujyVbI1xw+3UMRUcrhSy+pN09y/lWzeKDbvhoqcRbHdc+APLs/PWYi/cisLPg==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + dev: false + + /@typescript-eslint/typescript-estree@6.13.2(typescript@5.3.3): + resolution: + { + integrity: sha512-SuD8YLQv6WHnOEtKv8D6HZUzOub855cfPnPMKvdM/Bh1plv1f7Q/0iFUDLKKlxHcEstQnaUU4QZskgQq74t+3w==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@typescript-eslint/types": 6.13.2 + "@typescript-eslint/visitor-keys": 6.13.2 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/utils@6.13.2(eslint@8.55.0)(typescript@5.3.3): + resolution: + { + integrity: sha512-b9Ptq4eAZUym4idijCRzl61oPCwwREcfDI8xGk751Vhzig5fFZR9CyzDz4Sp/nxSLBYxUPyh4QdIDqWykFhNmQ==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + "@eslint-community/eslint-utils": 4.4.0(eslint@8.55.0) + "@types/json-schema": 7.0.15 + "@types/semver": 7.5.6 + "@typescript-eslint/scope-manager": 6.13.2 + "@typescript-eslint/types": 6.13.2 + "@typescript-eslint/typescript-estree": 6.13.2(typescript@5.3.3) + eslint: 8.55.0 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: false + + /@typescript-eslint/visitor-keys@6.13.2: + resolution: + { + integrity: sha512-OGznFs0eAQXJsp+xSd6k/O1UbFi/K/L7WjqeRoFE7vadjAF9y0uppXhYNQNEqygjou782maGClOoZwPqF0Drlw==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + dependencies: + "@typescript-eslint/types": 6.13.2 + eslint-visitor-keys: 3.4.3 + dev: false + + /@ungap/structured-clone@1.2.0: + resolution: + { + integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==, + } + + /acorn-jsx@5.3.2(acorn@8.11.2): + resolution: + { + integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, + } + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.2 + + /acorn-walk@8.3.1: + resolution: + { + integrity: sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==, + } + engines: { node: ">=0.4.0" } + dev: true + + /acorn@8.11.2: + resolution: + { + integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==, + } + engines: { node: ">=0.4.0" } + hasBin: true + + /ajv@6.12.6: + resolution: + { + integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, + } + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + /ansi-regex@5.0.1: + resolution: + { + integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, + } + engines: { node: ">=8" } + + /ansi-styles@4.3.0: + resolution: + { + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, + } + engines: { node: ">=8" } + dependencies: + color-convert: 2.0.1 + + /anymatch@3.1.3: + resolution: + { + integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, + } + engines: { node: ">= 8" } + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /argparse@2.0.1: + resolution: + { + integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, + } + + /array-union@2.1.0: + resolution: + { + integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, + } + engines: { node: ">=8" } + dev: false + + /as-table@1.0.55: + resolution: + { + integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==, + } + dependencies: + printable-characters: 1.0.42 + dev: true + + /asynckit@0.4.0: + resolution: + { + integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, + } + dev: false + + /balanced-match@1.0.2: + resolution: + { + integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, + } + + /base64-js@1.5.1: + resolution: + { + integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, + } + dev: false + + /better-sqlite3@9.2.2: + resolution: + { + integrity: sha512-qwjWB46il0lsDkeB4rSRI96HyDQr8sxeu1MkBVLMrwusq1KRu4Bpt1TMI+8zIJkDUtZ3umjAkaEjIlokZKWCQw==, + } + 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 + + /brace-expansion@1.1.11: + resolution: + { + integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, + } + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /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==, + } + engines: { node: ">=8" } + dependencies: + fill-range: 7.0.1 + + /buffer-from@1.1.2: + resolution: + { + integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, + } + dev: true + + /buffer@5.7.1: + resolution: + { + integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, + } + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /callsites@3.1.0: + resolution: + { + integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, + } + engines: { node: ">=6" } + + /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@4.1.2: + resolution: + { + integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, + } + engines: { node: ">=10" } + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /chalk@5.3.0: + resolution: + { + integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==, + } + engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } + dev: true + + /chokidar@3.5.3: + resolution: + { + integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, + } + engines: { node: ">= 8.10.0" } + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /chownr@1.1.4: + resolution: + { + integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==, + } + dev: false + + /cli-color@2.0.3: + resolution: + { + integrity: sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==, + } + engines: { node: ">=0.10" } + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-iterator: 2.0.3 + memoizee: 0.4.15 + timers-ext: 0.1.7 + dev: true + + /color-convert@2.0.1: + resolution: + { + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, + } + engines: { node: ">=7.0.0" } + dependencies: + color-name: 1.1.4 + + /color-name@1.1.4: + resolution: + { + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, + } + + /combined-stream@1.0.8: + resolution: + { + integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, + } + engines: { node: ">= 0.8" } + dependencies: + delayed-stream: 1.0.0 + dev: false + + /commander@9.5.0: + resolution: + { + integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==, + } + engines: { node: ^12.20.0 || >=14 } + dev: true + + /concat-map@0.0.1: + resolution: + { + integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, + } + + /cookie@0.5.0: + resolution: + { + integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==, + } + engines: { node: ">= 0.6" } + dev: true + + /copy-anything@3.0.5: + resolution: + { + integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==, + } + engines: { node: ">=12.13" } + dependencies: + is-what: 4.1.16 + dev: true + + /cross-spawn@7.0.3: + resolution: + { + integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, + } + engines: { node: ">= 8" } + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + /d@1.0.1: + resolution: + { + integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==, + } + 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 + + /data-uri-to-buffer@4.0.1: + resolution: + { + integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==, + } + engines: { node: ">= 12" } + dev: false + + /debug@4.3.4: + resolution: + { + integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, + } + engines: { node: ">=6.0" } + peerDependencies: + supports-color: "*" + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /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==, + } + + /delayed-stream@1.0.0: + resolution: + { + integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, + } + engines: { node: ">=0.4.0" } + dev: false + + /detect-libc@2.0.2: + resolution: + { + integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==, + } + engines: { node: ">=8" } + dev: false + + /difflib@0.2.4: + resolution: + { + integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==, + } + dependencies: + heap: 0.2.7 + dev: true + + /dir-glob@3.0.1: + resolution: + { + integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, + } + engines: { node: ">=8" } + dependencies: + path-type: 4.0.0 + dev: false + + /doctrine@3.0.0: + resolution: + { + integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==, + } + engines: { node: ">=6.0.0" } + dependencies: + esutils: 2.0.3 + + /dotenv@16.3.1: + resolution: + { + integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==, + } + engines: { node: ">=12" } + dev: true + + /dreamopt@0.8.0: + resolution: + { + integrity: sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==, + } + engines: { node: ">=0.4.0" } + dependencies: + wordwrap: 1.0.0 + dev: true + + /drizzle-kit@0.20.6: + resolution: + { + integrity: sha512-+AYQY+tJUnfMJYIeh6aEjI21mpMCekqz0LEu2QdFdc/3zSmjyfEhH5dkXlRFME8v1rtisiHfp7bP+gVVKDPiUg==, + } + hasBin: true + dependencies: + "@drizzle-team/studio": 0.0.35 + "@esbuild-kit/esm-loader": 2.6.5 + camelcase: 7.0.1 + chalk: 5.3.0 + commander: 9.5.0 + esbuild: 0.19.8 + esbuild-register: 3.5.0(esbuild@0.19.8) + glob: 8.1.0 + hanji: 0.0.5 + json-diff: 0.9.0 + minimatch: 7.4.6 + semver: 7.5.4 + wrangler: 3.19.0 + zod: 3.22.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /drizzle-orm@0.29.1(@cloudflare/workers-types@4.20231121.0)(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2): + resolution: + { + integrity: sha512-yItc4unfHnk8XkDD3/bdC63vdboTY7e7I03lCF1OJYABXSIfQYU9BFTQJXMMovVeb3T1/OJWwfW/70T1XPnuUA==, + } + 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: + "@cloudflare/workers-types": 4.20231121.0 + "@libsql/client": 0.4.0-pre.5 + better-sqlite3: 9.2.2 + dev: false + + /drizzle-zod@0.5.1(drizzle-orm@0.29.1)(zod@3.22.4): + resolution: + { + integrity: sha512-C/8bvzUH/zSnVfwdSibOgFjLhtDtbKYmkbPbUCq46QZyZCH6kODIMSOgZ8R7rVjoI+tCj3k06MRJMDqsIeoS4A==, + } + peerDependencies: + drizzle-orm: ">=0.23.13" + zod: "*" + dependencies: + drizzle-orm: 0.29.1(@cloudflare/workers-types@4.20231121.0)(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2) + zod: 3.22.4 + dev: false + + /end-of-stream@1.4.4: + resolution: + { + integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, + } + dependencies: + once: 1.4.0 + dev: false + + /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.19.8): + resolution: + { + integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==, + } + peerDependencies: + esbuild: ">=0.12 <1" + dependencies: + debug: 4.3.4 + esbuild: 0.19.8 + 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 + + /esbuild@0.19.8: + resolution: + { + integrity: sha512-l7iffQpT2OrZfH2rXIp7/FkmaeZM0vxbxN9KfiCwGYuZqzMg/JdvX26R31Zxn/Pxvsrg3Y9N6XTcnknqDyyv4w==, + } + engines: { node: ">=12" } + hasBin: true + requiresBuild: true + optionalDependencies: + "@esbuild/android-arm": 0.19.8 + "@esbuild/android-arm64": 0.19.8 + "@esbuild/android-x64": 0.19.8 + "@esbuild/darwin-arm64": 0.19.8 + "@esbuild/darwin-x64": 0.19.8 + "@esbuild/freebsd-arm64": 0.19.8 + "@esbuild/freebsd-x64": 0.19.8 + "@esbuild/linux-arm": 0.19.8 + "@esbuild/linux-arm64": 0.19.8 + "@esbuild/linux-ia32": 0.19.8 + "@esbuild/linux-loong64": 0.19.8 + "@esbuild/linux-mips64el": 0.19.8 + "@esbuild/linux-ppc64": 0.19.8 + "@esbuild/linux-riscv64": 0.19.8 + "@esbuild/linux-s390x": 0.19.8 + "@esbuild/linux-x64": 0.19.8 + "@esbuild/netbsd-x64": 0.19.8 + "@esbuild/openbsd-x64": 0.19.8 + "@esbuild/sunos-x64": 0.19.8 + "@esbuild/win32-arm64": 0.19.8 + "@esbuild/win32-ia32": 0.19.8 + "@esbuild/win32-x64": 0.19.8 + dev: true + + /escape-string-regexp@4.0.0: + resolution: + { + integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, + } + engines: { node: ">=10" } + + /eslint-config-google@0.14.0(eslint@8.55.0): + resolution: + { + integrity: sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==, + } + engines: { node: ">=0.10.0" } + peerDependencies: + eslint: ">=5.16.0" + dependencies: + eslint: 8.55.0 + dev: true + + /eslint-plugin-json@3.1.0: + resolution: + { + integrity: sha512-MrlG2ynFEHe7wDGwbUuFPsaT2b1uhuEFhJ+W1f1u+1C2EkXmTYJp4B1aAdQQ8M+CC3t//N/oRKiIVw14L2HR1g==, + } + engines: { node: ">=12.0" } + dependencies: + lodash: 4.17.21 + vscode-json-languageservice: 4.2.1 + dev: true + + /eslint-scope@7.2.2: + resolution: + { + integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + /eslint-visitor-keys@3.4.3: + resolution: + { + integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + + /eslint@8.55.0: + resolution: + { + integrity: sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + hasBin: true + dependencies: + "@eslint-community/eslint-utils": 4.4.0(eslint@8.55.0) + "@eslint-community/regexpp": 4.10.0 + "@eslint/eslintrc": 2.1.4 + "@eslint/js": 8.55.0 + "@humanwhocodes/config-array": 0.11.13 + "@humanwhocodes/module-importer": 1.0.1 + "@nodelib/fs.walk": 1.2.8 + "@ungap/structured-clone": 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.23.0 + graphemer: 1.4.0 + ignore: 5.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + /espree@9.6.1: + resolution: + { + integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) + eslint-visitor-keys: 3.4.3 + + /esquery@1.5.0: + resolution: + { + integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==, + } + engines: { node: ">=0.10" } + dependencies: + estraverse: 5.3.0 + + /esrecurse@4.3.0: + resolution: + { + integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, + } + engines: { node: ">=4.0" } + dependencies: + estraverse: 5.3.0 + + /estraverse@5.3.0: + resolution: + { + integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, + } + engines: { node: ">=4.0" } + + /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" } + + /event-emitter@0.3.5: + resolution: + { + integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==, + } + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + dev: true + + /exit-hook@2.2.1: + resolution: + { + integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==, + } + engines: { node: ">=6" } + dev: true + + /expand-template@2.0.3: + resolution: + { + integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==, + } + engines: { node: ">=6" } + 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==, + } + + /fast-glob@3.3.2: + resolution: + { + integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==, + } + engines: { node: ">=8.6.0" } + dependencies: + "@nodelib/fs.stat": 2.0.5 + "@nodelib/fs.walk": 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: false + + /fast-json-stable-stringify@2.1.0: + resolution: + { + integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, + } + + /fast-levenshtein@2.0.6: + resolution: + { + integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, + } + + /fastq@1.15.0: + resolution: + { + integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==, + } + dependencies: + reusify: 1.0.4 + + /fetch-blob@3.2.0: + resolution: + { + integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==, + } + engines: { node: ^12.20 || >= 14.13 } + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.2.1 + dev: false + + /file-entry-cache@6.0.1: + resolution: + { + integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==, + } + engines: { node: ^10.12.0 || >=12.0.0 } + dependencies: + flat-cache: 3.2.0 + + /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" } + dependencies: + to-regex-range: 5.0.1 + + /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 + + /flat-cache@3.2.0: + resolution: + { + integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==, + } + engines: { node: ^10.12.0 || >=12.0.0 } + dependencies: + flatted: 3.2.9 + keyv: 4.5.4 + rimraf: 3.0.2 + + /flatted@3.2.9: + resolution: + { + integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==, + } + + /form-data@4.0.0: + resolution: + { + integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==, + } + engines: { node: ">= 6" } + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + + /formdata-polyfill@4.0.10: + resolution: + { + integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==, + } + engines: { node: ">=12.20.0" } + dependencies: + fetch-blob: 3.2.0 + dev: false + + /fs-constants@1.0.0: + resolution: + { + integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==, + } + dev: false + + /fs.realpath@1.0.0: + resolution: + { + integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, + } + + /fsevents@2.3.3: + resolution: + { + integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, + } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + os: [darwin] + requiresBuild: true + dev: true + optional: true - /@aashutoshrathi/word-wrap@1.2.6: - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - - /@asteasolutions/zod-to-openapi@5.5.0(zod@3.22.4): - resolution: {integrity: sha512-d5HwrvM6dOKr3XdeF+DmashGvfEc+1oiEfbscugsiwSTrFtuMa7ETpW9sTNnVgn+hJaz+PRxPQUYD7q9/5dUig==} - peerDependencies: - zod: ^3.20.2 - dependencies: - openapi3-ts: 4.1.2 - zod: 3.22.4 - dev: false - - /@asteasolutions/zod-to-openapi@6.3.0(zod@3.22.4): - resolution: {integrity: sha512-ca7Svz3BWkMaIP3M1YGsyxgp7AcKXlTmy19ozhY0DslhatXbnyxdvxlmiI0TmvkIfi6RpQfm+eK1neVLsh6Riw==} - peerDependencies: - zod: ^3.20.2 - dependencies: - openapi3-ts: 4.1.2 - zod: 3.22.4 - dev: true - - /@cloudflare/kv-asset-handler@0.2.0: - resolution: {integrity: sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==} - dependencies: - mime: 3.0.0 - dev: true - - /@cloudflare/workerd-darwin-64@1.20231030.0: - resolution: {integrity: sha512-J4PQ9utPxLya9yHdMMx3AZeC5M/6FxcoYw6jo9jbDDFTy+a4Gslqf4Im9We3aeOEdPXa3tgQHVQOSelJSZLhIw==} - engines: {node: '>=16'} - cpu: [x64] - os: [darwin] - requiresBuild: true - 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 - - /@cloudflare/workers-types@4.20231121.0: - resolution: {integrity: sha512-+kWfpCkqiepwAKXyHoE0gnkPgkLhz0/9HOBIGhHRsUvUKvhUtm3mbqqoGRWgF1qcjzrDUBbrrOq4MYHfFtc2RA==} - - /@drizzle-team/studio@0.0.35: - resolution: {integrity: sha512-t5LTNOVf+L7Bb/wdssOIPx0ueNvhyaIXdrvKgoHR4wK0GD7SRmILcCTzn6N6Ltr1VnFzQZG/bzn6HMagn17Jtw==} - dependencies: - superjson: 2.2.1 - 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-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-arm64@0.19.8: - resolution: {integrity: sha512-B8JbS61bEunhfx8kasogFENgQfr/dIp+ggYXwTqdbMAgGDhRa3AaPpQMuQU0rNxDLECj6FhDzk1cF9WHMVwrtA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: 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-arm@0.19.8: - resolution: {integrity: sha512-31E2lxlGM1KEfivQl8Yf5aYU/mflz9g06H6S15ITUFQueMFtFjESRMoDSkvMo8thYvLBax+VKTPlpnx+sPicOA==} - engines: {node: '>=12'} - cpu: [arm] - 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/android-x64@0.19.8: - resolution: {integrity: sha512-rdqqYfRIn4jWOp+lzQttYMa2Xar3OK9Yt2fhOhzFXqg0rVWEfSclJvZq5fZslnz6ypHvVf3CT7qyf0A5pM682A==} - 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-arm64@0.19.8: - resolution: {integrity: sha512-RQw9DemMbIq35Bprbboyf8SmOr4UXsRVxJ97LgB55VKKeJOOdvsIPy0nFyF2l8U+h4PtBx/1kRf0BelOYCiQcw==} - 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/darwin-x64@0.19.8: - resolution: {integrity: sha512-3sur80OT9YdeZwIVgERAysAbwncom7b4bCI2XKLjMfPymTud7e/oY4y+ci1XVp5TfQp/bppn7xLw1n/oSQY3/Q==} - 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-arm64@0.19.8: - resolution: {integrity: sha512-WAnPJSDattvS/XtPCTj1tPoTxERjcTpH6HsMr6ujTT+X6rylVe8ggxk8pVxzf5U1wh5sPODpawNicF5ta/9Tmw==} - 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/freebsd-x64@0.19.8: - resolution: {integrity: sha512-ICvZyOplIjmmhjd6mxi+zxSdpPTKFfyPPQMQTK/w+8eNK6WV01AjIztJALDtwNNfFhfZLux0tZLC+U9nSyA5Zg==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - 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-arm64@0.19.8: - resolution: {integrity: sha512-z1zMZivxDLHWnyGOctT9JP70h0beY54xDDDJt4VpTX+iwA77IFsE1vCXWmprajJGa+ZYSqkSbRQ4eyLCpCmiCQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - 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-arm@0.19.8: - resolution: {integrity: sha512-H4vmI5PYqSvosPaTJuEppU9oz1dq2A7Mr2vyg5TF9Ga+3+MGgBdGzcyBP7qK9MrwFQZlvNyJrvz6GuCaj3OukQ==} - engines: {node: '>=12'} - cpu: [arm] - 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-ia32@0.19.8: - resolution: {integrity: sha512-1a8suQiFJmZz1khm/rDglOc8lavtzEMRo0v6WhPgxkrjcU0LkHj+TwBrALwoz/OtMExvsqbbMI0ChyelKabSvQ==} - 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-loong64@0.19.8: - resolution: {integrity: sha512-fHZWS2JJxnXt1uYJsDv9+b60WCc2RlvVAy1F76qOLtXRO+H4mjt3Tr6MJ5l7Q78X8KgCFudnTuiQRBhULUyBKQ==} - 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-mips64el@0.19.8: - resolution: {integrity: sha512-Wy/z0EL5qZYLX66dVnEg9riiwls5IYnziwuju2oUiuxVc+/edvqXa04qNtbrs0Ukatg5HEzqT94Zs7J207dN5Q==} - 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-ppc64@0.19.8: - resolution: {integrity: sha512-ETaW6245wK23YIEufhMQ3HSeHO7NgsLx8gygBVldRHKhOlD1oNeNy/P67mIh1zPn2Hr2HLieQrt6tWrVwuqrxg==} - 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-riscv64@0.19.8: - resolution: {integrity: sha512-T2DRQk55SgoleTP+DtPlMrxi/5r9AeFgkhkZ/B0ap99zmxtxdOixOMI570VjdRCs9pE4Wdkz7JYrsPvsl7eESg==} - 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-s390x@0.19.8: - resolution: {integrity: sha512-NPxbdmmo3Bk7mbNeHmcCd7R7fptJaczPYBaELk6NcXxy7HLNyWwCyDJ/Xx+/YcNH7Im5dHdx9gZ5xIwyliQCbg==} - 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/linux-x64@0.19.8: - resolution: {integrity: sha512-lytMAVOM3b1gPypL2TRmZ5rnXl7+6IIk8uB3eLsV1JwcizuolblXRrc5ShPrO9ls/b+RTp+E6gbsuLWHWi2zGg==} - 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/netbsd-x64@0.19.8: - resolution: {integrity: sha512-hvWVo2VsXz/8NVt1UhLzxwAfo5sioj92uo0bCfLibB0xlOmimU/DeAEsQILlBQvkhrGjamP0/el5HU76HAitGw==} - 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/openbsd-x64@0.19.8: - resolution: {integrity: sha512-/7Y7u77rdvmGTxR83PgaSvSBJCC2L3Kb1M/+dmSIvRvQPXXCuC97QAwMugBNG0yGcbEGfFBH7ojPzAOxfGNkwQ==} - 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/sunos-x64@0.19.8: - resolution: {integrity: sha512-9Lc4s7Oi98GqFA4HzA/W2JHIYfnXbUYgekUP/Sm4BG9sfLjyv6GKKHKKVs83SMicBF2JwAX6A1PuOLMqpD001w==} - 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-arm64@0.19.8: - resolution: {integrity: sha512-rq6WzBGjSzihI9deW3fC2Gqiak68+b7qo5/3kmB6Gvbh/NYPA0sJhrnp7wgV4bNwjqM+R2AApXGxMO7ZoGhIJg==} - 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-ia32@0.19.8: - resolution: {integrity: sha512-AIAbverbg5jMvJznYiGhrd3sumfwWs8572mIJL5NQjJa06P8KfCPWZQ0NwZbPQnbQi9OWSZhFVSUWjjIrn4hSw==} - 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 - - /@esbuild/win32-x64@0.19.8: - resolution: {integrity: sha512-bfZ0cQ1uZs2PqpulNL5j/3w+GDhP36k1K5c38QdQg+Swy51jFZWWeIkteNsufkQxp986wnqRRsb/bHbY1WQ7TA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@eslint-community/eslint-utils@4.4.0(eslint@8.55.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.55.0 - eslint-visitor-keys: 3.4.3 - - /@eslint-community/regexpp@4.10.0: - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - /@eslint/eslintrc@2.1.4: - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.6.1 - globals: 13.23.0 - ignore: 5.3.0 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - /@eslint/js@8.55.0: - resolution: {integrity: sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - /@fastify/busboy@2.1.0: - resolution: {integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==} - engines: {node: '>=14'} - dev: true - - /@hono/swagger-ui@0.2.0(hono@3.11.3): - resolution: {integrity: sha512-ulWqCI+38vTlxxBmOAi5VTOUDa5/7fKHPTwyq00kRUjUxPp3Ej5Cs+B/fvGs5gd3KraArLArkln7sHhb5vODZA==} - peerDependencies: - hono: '*' - dependencies: - hono: 3.11.3 - dev: false - - /@hono/zod-openapi@0.9.3(hono@3.11.3)(zod@3.22.4): - resolution: {integrity: sha512-PdKWwUvMdoQ2eqJZtbo4N4qb2VRjHNnDcfWW3/IqSeJDyK4vIPHAzWfgtUOYHAXJAiooQQ87m0sw2iME2H1+zQ==} - engines: {node: '>=16.0.0'} - peerDependencies: - hono: '>=3.11.3' - zod: 3.* - dependencies: - '@asteasolutions/zod-to-openapi': 5.5.0(zod@3.22.4) - '@hono/zod-validator': 0.1.11(hono@3.11.3)(zod@3.22.4) - hono: 3.11.3 - zod: 3.22.4 - dev: false - - /@hono/zod-validator@0.1.11(hono@3.11.3)(zod@3.22.4): - resolution: {integrity: sha512-PQXeHUP0+36qpRt8yfeD7N2jbK3ETlGvSN6dMof/HwUC/APRokQRjpXZm4rrlG71Ft0aWE01+Bm4XejqPie5Uw==} - peerDependencies: - hono: '>=3.9.0' - zod: ^3.19.1 - dependencies: - hono: 3.11.3 - zod: 3.22.4 - dev: false - - /@humanwhocodes/config-array@0.11.13: - resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} - engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 2.0.1 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - /@humanwhocodes/object-schema@2.0.1: - resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} - - /@libsql/client@0.4.0-pre.5: - resolution: {integrity: sha512-GyKigCBslE5uztwT7mpvp9Zn0z3iWjnufcfeTeDSFPMyXCPjSAHUOiwSLAaHii909w6EQacA692CXmYYFo/eig==} - dependencies: - '@libsql/hrana-client': 0.5.5 - js-base64: 3.7.5 - libsql: 0.2.0-pre.4 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - dev: false - - /@libsql/darwin-arm64@0.2.0-pre.4: - resolution: {integrity: sha512-kb0f/FeZxzeqa+j6O7xI9toOeoTNCJnErOcNyWWzoqA5JZ4LJ9dCMrLPWe4Np22+Rg57NPmFz/Z7MFNP2y5Gow==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@libsql/darwin-x64@0.2.0-pre.4: - resolution: {integrity: sha512-HQM9cmGP4t+ujbyhA6rjQ8K4iHw5DStq3YnL8030k5z4KHGkAOIcRbVj3m65J72Gy+tCsisUCZTrBjIFkjOFhA==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@libsql/hrana-client@0.5.5: - resolution: {integrity: sha512-i+hDBpiV719poqEiHupUUZYKJ9YSbCRFe5Q2PQ0v3mHIftePH6gayLjp2u6TXbqbO/Dv6y8yyvYlBXf/kFfRZA==} - dependencies: - '@libsql/isomorphic-fetch': 0.1.10 - '@libsql/isomorphic-ws': 0.1.5 - js-base64: 3.7.5 - node-fetch: 3.3.2 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - dev: false - - /@libsql/isomorphic-fetch@0.1.10: - resolution: {integrity: sha512-dH0lMk50gKSvEKD78xWMu60SY1sjp1sY//iFLO0XMmBwfVfG136P9KOk06R4maBdlb8KMXOzJ1D28FR5ZKnHTA==} - dependencies: - '@types/node-fetch': 2.6.9 - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding - dev: false - - /@libsql/isomorphic-ws@0.1.5: - resolution: {integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==} - dependencies: - '@types/ws': 8.5.10 - ws: 8.14.2 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: false - - /@libsql/linux-arm64-gnu@0.2.0-pre.4: - resolution: {integrity: sha512-1VVhnSx+vSDCLXxfUP9kRGbZyy+Si6tvPQZ8JqZftt9EJG1Dvzp1E1TT8zFYMeBQeVyoV4KryctW5b5uZkqVQA==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@libsql/linux-arm64-musl@0.2.0-pre.4: - resolution: {integrity: sha512-lbSeR5agUDkpHTT3OOnuINWEr7OsX+XCwJ21bkceoXu/napW7A3auiOjzK7mneI+vT7fRjay0caivrdoqgeKKg==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@libsql/linux-x64-gnu@0.2.0-pre.4: - resolution: {integrity: sha512-OBiu0+tEVj2daJJrcg1uhEtHx7CsED8QesEqz8dhoK0Dad1oSn8XUpulhiMiXP1JFlcr7Zz37eKJdQxv17WTfw==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@libsql/linux-x64-musl@0.2.0-pre.4: - resolution: {integrity: sha512-iJr3XiUTsB8ic4+DTG8412o9NZ3ifCEM+FaZ0/uxh3xlERbYUMUZhAIylxJqYjovld0edd6Nns7OJfu5b8Ae2g==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@libsql/win32-x64-msvc@0.2.0-pre.4: - resolution: {integrity: sha512-kV/Bl6RBMCm24LFmlowl//TvD8jhRjSmUjComXdQ4j5JrAW29MVEb5EtrA16qGzeWb06tSMII0z5yqEaYxvQbQ==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@lucia-auth/adapter-sqlite@3.0.0-beta.9(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2)(lucia@3.0.0-beta.11): - resolution: {integrity: sha512-Z6kW5ebeEDMlUcJu3bf4USbUuPa2rcCKWJxHdK0jqiPoJfNJrUpg/yBfoUZ7CJ/mucTAKV9EjcrVZSUTHvesGA==} - peerDependencies: - '@libsql/client': ^0.3.0 - better-sqlite3: 8.x - 9.x - lucia: 3.0.0-beta.11 - peerDependenciesMeta: - '@libsql/client': - optional: true - better-sqlite3: - optional: true - dependencies: - '@libsql/client': 0.4.0-pre.5 - better-sqlite3: 9.2.2 - lucia: 3.0.0-beta.11 - dev: false - - /@neon-rs/load@0.0.4: - resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==} - dev: false - - /@node-rs/argon2-android-arm-eabi@1.5.2: - resolution: {integrity: sha512-vVZec4ITr9GumAy0p8Zj8ozie362gtbZrTkLp9EqvuFZ/HrZzR09uS2IsDgm4mAstg/rc4A1gLRrHI8jDdbjkA==} - engines: {node: '>= 10'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-android-arm64@1.5.2: - resolution: {integrity: sha512-SwhnsXyrpgtWDTwYds1WUnxLA/kVP8HVaImYwQ3Wemqj1lkzcSoIaNyjNWkyrYGqO1tVc1YUrqsbd5eCHh+3sg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-darwin-arm64@1.5.2: - resolution: {integrity: sha512-+1ZMKiCCv2pip/o1Xg09piQru2LOIBPQ1vS4is86f55N3jjZnSfP+db5mYCSRuB0gRYqui98he7su7OGXlF4gQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-darwin-x64@1.5.2: - resolution: {integrity: sha512-mQ57mORlsxpfjcEsVpiHyHCOp6Ljrz/rVNWk8ihnPWw0qt0EqF1zbHRxTEPemL1iBHL9UyXpXrKS4JKq6xMn5w==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-freebsd-x64@1.5.2: - resolution: {integrity: sha512-UjKbFd3viYcpiwflkU4haEdNUMk1V2fVCJImWLWQns/hVval9BrDv5xsBwgdynbPHDlPOiWj816LBQwhWLGVWA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-arm-gnueabihf@1.5.2: - resolution: {integrity: sha512-36GJjJBnVuscV9CTn8RVDeJysnmIzr6Lp7QBCDczYHi6eKFuA8udCJb4SRyJqdvIuzycKG1RL56FbcFBJYCYIA==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-arm64-gnu@1.5.2: - resolution: {integrity: sha512-sE0ydb2gp6xC+5vbVz8l3paaiBbFQIB2Rwp5wx9MmKiYdTfcO5WkGeADuSgoFiTcSEz1RsHXqrdVy6j/LtSqtA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-arm64-musl@1.5.2: - resolution: {integrity: sha512-LhE0YHB0aJCwlbsQrwePik/KFWUc9qMriJIL5KiejK3bDoTVY4ihH587QT56JyaLvl3nBJaAV8l5yMqQdHnouA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-x64-gnu@1.5.2: - resolution: {integrity: sha512-MnKLiBlyg05pxvKXe3lNgBL9El9ThD74hvVEiWH1Xk40RRrJ507NCOWXVmQ0FDq1mjTeGFxbIvk+AcoF0NSLIQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-x64-musl@1.5.2: - resolution: {integrity: sha512-tzLgASY0Ng2OTW7Awwl9UWzjbWx8/uD6gXcZ/k/nYGSZE5Xp8EOD2NUqHLbK6KZE3775A0R25ShpiSxCadYqkg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-win32-arm64-msvc@1.5.2: - resolution: {integrity: sha512-vpTwSvv3oUXTpWZh0/HxdJ5wFMlmS7aVDwL4ATWepTZhMG4n+TO0+tVLdcPHCbg0oc6hCWBjWNPlSn9mW+YIgA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-win32-ia32-msvc@1.5.2: - resolution: {integrity: sha512-KPpZR15ui7uQWQXKmtaKyUQRs4UJdXnIIfiyFLGmLWCdEKlr3MtIGFt0fdziu4BF5ZObD8Ic6QvT0VXK4OJiww==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-win32-x64-msvc@1.5.2: - resolution: {integrity: sha512-/pGuwixJS8ZlpwhX9iM6g6JEeZYo1TtnNf8exwsOi7gxcUoTUfw5it+5GfbY/n+xRBz/DIU4bzUmXmh+7Gh0ug==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2@1.5.2: - resolution: {integrity: sha512-qq7wOSsdP2b4rXEapWNmsCjpaTGZWtp9kZmri98GYCDZqN8UJUG5zSue4XtYWWJMWKJVE/hkaIwk+BgN1ZUn0Q==} - engines: {node: '>= 10'} - optionalDependencies: - '@node-rs/argon2-android-arm-eabi': 1.5.2 - '@node-rs/argon2-android-arm64': 1.5.2 - '@node-rs/argon2-darwin-arm64': 1.5.2 - '@node-rs/argon2-darwin-x64': 1.5.2 - '@node-rs/argon2-freebsd-x64': 1.5.2 - '@node-rs/argon2-linux-arm-gnueabihf': 1.5.2 - '@node-rs/argon2-linux-arm64-gnu': 1.5.2 - '@node-rs/argon2-linux-arm64-musl': 1.5.2 - '@node-rs/argon2-linux-x64-gnu': 1.5.2 - '@node-rs/argon2-linux-x64-musl': 1.5.2 - '@node-rs/argon2-win32-arm64-msvc': 1.5.2 - '@node-rs/argon2-win32-ia32-msvc': 1.5.2 - '@node-rs/argon2-win32-x64-msvc': 1.5.2 - dev: false - - /@node-rs/bcrypt-android-arm-eabi@1.7.3: - resolution: {integrity: sha512-l53RuBqnqNvBN2jx09Ws6jpLmuQdSDx10n0GeaTfwh1svxsC8bPpVmxkfBExsT2Tu7KF38gTnPZvwsxysZQyPQ==} - engines: {node: '>= 10'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-android-arm64@1.7.3: - resolution: {integrity: sha512-TZpm4VbiViqDMvusrcYzLr1b1M5FDF0cDNiTUciLeBSsKtU5lNdEZGAU7gvCnrKoUWpGuOblHU7613zuB7SiNQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-darwin-arm64@1.7.3: - resolution: {integrity: sha512-SiUuAabynVsmixZMjh5xrn8w47EnV0HzbW9st4DPoVhn/wzdUcksIXDY75aoQG2EIzKLN8IGb+CIVnPGmRyhxw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-darwin-x64@1.7.3: - resolution: {integrity: sha512-R+81Z0eX4hZPvCXY5Z6l0l+JrTU3WcSYGHP0QYV9uwdaafOz6EhrCXUzZ02AIcAbNoVR8eucYVruq9PiasXoVw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-freebsd-x64@1.7.3: - resolution: {integrity: sha512-0pItU/5K3e83JjcJj9fZv+78txUoZ3hHCT7n/UMdu9mkpUzhX/rqb4jmQpJpD+UQoR76xp3qDo5RMgQBffBVNg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-arm-gnueabihf@1.7.3: - resolution: {integrity: sha512-HTSybWUjNe8rWuXkTkMeFDiQNHc6VioRcgv6AeHZphIxiT6dFbnhXNkfz4Hr0zxvyPhZ3NrYjT2AmPVFT6VW3Q==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-arm64-gnu@1.7.3: - resolution: {integrity: sha512-rWep6Y+v/c4bZHaM8LmSsrMwMmDR9wG4/q+3Z9VzR8xdnt5VCbuQdYWpf3sgGRGjTRdTBAdSK8x1reOjqsJ3Jg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-arm64-musl@1.7.3: - resolution: {integrity: sha512-TyWEKhxr+yfGcMKzVV/ARZw+Hrky2yl91bo0XYU2ZW6I6LDC0emNsXugdWjwz8ADI4OWhhrOjXD8GCilxiB2Rg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-x64-gnu@1.7.3: - resolution: {integrity: sha512-PofxM1Qg7tZKj1oP0I7tBTSSLr8Xc2uxx+P3pBCPmYzaBwWqGteNHJlF7n2q5xiH7YOlguH4w5CmcEjsiA3K4A==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-x64-musl@1.7.3: - resolution: {integrity: sha512-D5V6/dDVKP8S/ieDBLGhTn4oTo3upbrpWInynbhOMjJvPiIxVG1PiI3MXkWBtG9qtfleDk7gUkEKtAOxlIxDTQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-win32-arm64-msvc@1.7.3: - resolution: {integrity: sha512-b4gH2Yj5R4TwULrfMHd1Qqr+MrnFjVRUAJujDKPqi+PppSqezW8QF6DRSOL4GjnBmz5JEd64wxgeidvy7dsbGw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-win32-ia32-msvc@1.7.3: - resolution: {integrity: sha512-E91ro+ybI0RhNc89aGaZQGll0YhPoHr8JacoWrNKwhg9zwNOYeuO0tokdMZdm6nF0/8obll0Mq7wO9AXO9iffw==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-win32-x64-msvc@1.7.3: - resolution: {integrity: sha512-LO/p9yjPODj/pQvPnowBuwpDdqiyUXQbqL1xb1RSP3NoyCFAGmjL5h0plSQrhLh8hskQiozBRXNaQurtsM7o0Q==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt@1.7.3: - resolution: {integrity: sha512-BF6u9CBPUiyk1zU+5iwikezf+xM4MFSu5cmrrg/PLKffGgIM13ZsY6DHftcTraETB04ryasjM/5IejotH+sO5Q==} - engines: {node: '>= 10'} - optionalDependencies: - '@node-rs/bcrypt-android-arm-eabi': 1.7.3 - '@node-rs/bcrypt-android-arm64': 1.7.3 - '@node-rs/bcrypt-darwin-arm64': 1.7.3 - '@node-rs/bcrypt-darwin-x64': 1.7.3 - '@node-rs/bcrypt-freebsd-x64': 1.7.3 - '@node-rs/bcrypt-linux-arm-gnueabihf': 1.7.3 - '@node-rs/bcrypt-linux-arm64-gnu': 1.7.3 - '@node-rs/bcrypt-linux-arm64-musl': 1.7.3 - '@node-rs/bcrypt-linux-x64-gnu': 1.7.3 - '@node-rs/bcrypt-linux-x64-musl': 1.7.3 - '@node-rs/bcrypt-win32-arm64-msvc': 1.7.3 - '@node-rs/bcrypt-win32-ia32-msvc': 1.7.3 - '@node-rs/bcrypt-win32-x64-msvc': 1.7.3 - dev: false - - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 - - /@types/json-schema@7.0.15: - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - dev: false - - /@types/node-fetch@2.6.9: - resolution: {integrity: sha512-bQVlnMLFJ2d35DkPNjEPmd9ueO/rh5EiaZt2bhqiSarPjZIuIV6bPQVqcrEyvNo+AfTrRGVazle1tl597w3gfA==} - dependencies: - '@types/node': 20.10.4 - form-data: 4.0.0 - dev: false - - /@types/node-forge@1.3.10: - resolution: {integrity: sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw==} - dependencies: - '@types/node': 20.10.4 - dev: true - - /@types/node@20.10.4: - resolution: {integrity: sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==} - dependencies: - undici-types: 5.26.5 - - /@types/semver@7.5.6: - resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} - dev: false - - /@types/ws@8.5.10: - resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} - dependencies: - '@types/node': 20.10.4 - dev: false - - /@typescript-eslint/eslint-plugin@6.13.2(@typescript-eslint/parser@6.13.2)(eslint@8.55.0)(typescript@5.3.3): - resolution: {integrity: sha512-3+9OGAWHhk4O1LlcwLBONbdXsAhLjyCFogJY/cWy2lxdVJ2JrcTF2pTGMaLl2AE7U1l31n8Py4a8bx5DLf/0dQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 6.13.2(eslint@8.55.0)(typescript@5.3.3) - '@typescript-eslint/scope-manager': 6.13.2 - '@typescript-eslint/type-utils': 6.13.2(eslint@8.55.0)(typescript@5.3.3) - '@typescript-eslint/utils': 6.13.2(eslint@8.55.0)(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 6.13.2 - debug: 4.3.4 - eslint: 8.55.0 - graphemer: 1.4.0 - ignore: 5.3.0 - natural-compare: 1.4.0 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.3.3) - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/parser@6.13.2(eslint@8.55.0)(typescript@5.3.3): - resolution: {integrity: sha512-MUkcC+7Wt/QOGeVlM8aGGJZy1XV5YKjTpq9jK6r6/iLsGXhBVaGP5N0UYvFsu9BFlSpwY9kMretzdBH01rkRXg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 6.13.2 - '@typescript-eslint/types': 6.13.2 - '@typescript-eslint/typescript-estree': 6.13.2(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 6.13.2 - debug: 4.3.4 - eslint: 8.55.0 - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/scope-manager@6.13.2: - resolution: {integrity: sha512-CXQA0xo7z6x13FeDYCgBkjWzNqzBn8RXaE3QVQVIUm74fWJLkJkaHmHdKStrxQllGh6Q4eUGyNpMe0b1hMkXFA==} - engines: {node: ^16.0.0 || >=18.0.0} - dependencies: - '@typescript-eslint/types': 6.13.2 - '@typescript-eslint/visitor-keys': 6.13.2 - dev: false - - /@typescript-eslint/type-utils@6.13.2(eslint@8.55.0)(typescript@5.3.3): - resolution: {integrity: sha512-Qr6ssS1GFongzH2qfnWKkAQmMUyZSyOr0W54nZNU1MDfo+U4Mv3XveeLZzadc/yq8iYhQZHYT+eoXJqnACM1tw==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/typescript-estree': 6.13.2(typescript@5.3.3) - '@typescript-eslint/utils': 6.13.2(eslint@8.55.0)(typescript@5.3.3) - debug: 4.3.4 - eslint: 8.55.0 - ts-api-utils: 1.0.3(typescript@5.3.3) - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/types@6.13.2: - resolution: {integrity: sha512-7sxbQ+EMRubQc3wTfTsycgYpSujyVbI1xw+3UMRUcrhSy+pN09y/lWzeKDbvhoqcRbHdc+APLs/PWYi/cisLPg==} - engines: {node: ^16.0.0 || >=18.0.0} - dev: false - - /@typescript-eslint/typescript-estree@6.13.2(typescript@5.3.3): - resolution: {integrity: sha512-SuD8YLQv6WHnOEtKv8D6HZUzOub855cfPnPMKvdM/Bh1plv1f7Q/0iFUDLKKlxHcEstQnaUU4QZskgQq74t+3w==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 6.13.2 - '@typescript-eslint/visitor-keys': 6.13.2 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.3.3) - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/utils@6.13.2(eslint@8.55.0)(typescript@5.3.3): - resolution: {integrity: sha512-b9Ptq4eAZUym4idijCRzl61oPCwwREcfDI8xGk751Vhzig5fFZR9CyzDz4Sp/nxSLBYxUPyh4QdIDqWykFhNmQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.55.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.6 - '@typescript-eslint/scope-manager': 6.13.2 - '@typescript-eslint/types': 6.13.2 - '@typescript-eslint/typescript-estree': 6.13.2(typescript@5.3.3) - eslint: 8.55.0 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - - typescript - dev: false - - /@typescript-eslint/visitor-keys@6.13.2: - resolution: {integrity: sha512-OGznFs0eAQXJsp+xSd6k/O1UbFi/K/L7WjqeRoFE7vadjAF9y0uppXhYNQNEqygjou782maGClOoZwPqF0Drlw==} - engines: {node: ^16.0.0 || >=18.0.0} - dependencies: - '@typescript-eslint/types': 6.13.2 - eslint-visitor-keys: 3.4.3 - dev: false - - /@ungap/structured-clone@1.2.0: - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - - /acorn-jsx@5.3.2(acorn@8.11.2): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.11.2 - - /acorn-walk@8.3.1: - resolution: {integrity: sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==} - engines: {node: '>=0.4.0'} - dev: true - - /acorn@8.11.2: - resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} - engines: {node: '>=0.4.0'} - hasBin: true - - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: false - - /as-table@1.0.55: - resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} - dependencies: - printable-characters: 1.0.42 - dev: true - - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: false - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: false - - /better-sqlite3@9.2.2: - resolution: {integrity: sha512-qwjWB46il0lsDkeB4rSRI96HyDQr8sxeu1MkBVLMrwusq1KRu4Bpt1TMI+8zIJkDUtZ3umjAkaEjIlokZKWCQw==} - 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 - - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - /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==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: true - - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: false - - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - - /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@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true - - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - dev: false - - /cli-color@2.0.3: - resolution: {integrity: sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==} - engines: {node: '>=0.10'} - dependencies: - d: 1.0.1 - es5-ext: 0.10.62 - es6-iterator: 2.0.3 - memoizee: 0.4.15 - timers-ext: 0.1.7 - dev: true - - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - dependencies: - delayed-stream: 1.0.0 - dev: false - - /commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} - dev: true - - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - /cookie@0.5.0: - resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} - engines: {node: '>= 0.6'} - dev: true - - /copy-anything@3.0.5: - resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} - engines: {node: '>=12.13'} - dependencies: - is-what: 4.1.16 - dev: true - - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - /d@1.0.1: - resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} - 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 - - /data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} - dev: false - - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - - /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==} - - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dev: false - - /detect-libc@2.0.2: - resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} - engines: {node: '>=8'} - dev: false - - /difflib@0.2.4: - resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} - dependencies: - heap: 0.2.7 - dev: true - - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - dev: false - - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dependencies: - esutils: 2.0.3 - - /dotenv@16.3.1: - resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} - engines: {node: '>=12'} - dev: true - - /dreamopt@0.8.0: - resolution: {integrity: sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==} - engines: {node: '>=0.4.0'} - dependencies: - wordwrap: 1.0.0 - dev: true - - /drizzle-kit@0.20.6: - resolution: {integrity: sha512-+AYQY+tJUnfMJYIeh6aEjI21mpMCekqz0LEu2QdFdc/3zSmjyfEhH5dkXlRFME8v1rtisiHfp7bP+gVVKDPiUg==} - hasBin: true - dependencies: - '@drizzle-team/studio': 0.0.35 - '@esbuild-kit/esm-loader': 2.6.5 - camelcase: 7.0.1 - chalk: 5.3.0 - commander: 9.5.0 - esbuild: 0.19.8 - esbuild-register: 3.5.0(esbuild@0.19.8) - glob: 8.1.0 - hanji: 0.0.5 - json-diff: 0.9.0 - minimatch: 7.4.6 - semver: 7.5.4 - wrangler: 3.19.0 - zod: 3.22.4 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - /drizzle-orm@0.29.1(@cloudflare/workers-types@4.20231121.0)(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2): - resolution: {integrity: sha512-yItc4unfHnk8XkDD3/bdC63vdboTY7e7I03lCF1OJYABXSIfQYU9BFTQJXMMovVeb3T1/OJWwfW/70T1XPnuUA==} - 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: - '@cloudflare/workers-types': 4.20231121.0 - '@libsql/client': 0.4.0-pre.5 - better-sqlite3: 9.2.2 - dev: false - - /drizzle-zod@0.5.1(drizzle-orm@0.29.1)(zod@3.22.4): - resolution: {integrity: sha512-C/8bvzUH/zSnVfwdSibOgFjLhtDtbKYmkbPbUCq46QZyZCH6kODIMSOgZ8R7rVjoI+tCj3k06MRJMDqsIeoS4A==} - peerDependencies: - drizzle-orm: '>=0.23.13' - zod: '*' - dependencies: - drizzle-orm: 0.29.1(@cloudflare/workers-types@4.20231121.0)(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2) - zod: 3.22.4 - dev: false - - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - dependencies: - once: 1.4.0 - dev: false - - /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.19.8): - resolution: {integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==} - peerDependencies: - esbuild: '>=0.12 <1' - dependencies: - debug: 4.3.4 - esbuild: 0.19.8 - 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 - - /esbuild@0.19.8: - resolution: {integrity: sha512-l7iffQpT2OrZfH2rXIp7/FkmaeZM0vxbxN9KfiCwGYuZqzMg/JdvX26R31Zxn/Pxvsrg3Y9N6XTcnknqDyyv4w==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.19.8 - '@esbuild/android-arm64': 0.19.8 - '@esbuild/android-x64': 0.19.8 - '@esbuild/darwin-arm64': 0.19.8 - '@esbuild/darwin-x64': 0.19.8 - '@esbuild/freebsd-arm64': 0.19.8 - '@esbuild/freebsd-x64': 0.19.8 - '@esbuild/linux-arm': 0.19.8 - '@esbuild/linux-arm64': 0.19.8 - '@esbuild/linux-ia32': 0.19.8 - '@esbuild/linux-loong64': 0.19.8 - '@esbuild/linux-mips64el': 0.19.8 - '@esbuild/linux-ppc64': 0.19.8 - '@esbuild/linux-riscv64': 0.19.8 - '@esbuild/linux-s390x': 0.19.8 - '@esbuild/linux-x64': 0.19.8 - '@esbuild/netbsd-x64': 0.19.8 - '@esbuild/openbsd-x64': 0.19.8 - '@esbuild/sunos-x64': 0.19.8 - '@esbuild/win32-arm64': 0.19.8 - '@esbuild/win32-ia32': 0.19.8 - '@esbuild/win32-x64': 0.19.8 - dev: true - - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - /eslint-config-google@0.14.0(eslint@8.55.0): - resolution: {integrity: sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==} - engines: {node: '>=0.10.0'} - peerDependencies: - eslint: '>=5.16.0' - dependencies: - eslint: 8.55.0 - dev: true - - /eslint-plugin-json@3.1.0: - resolution: {integrity: sha512-MrlG2ynFEHe7wDGwbUuFPsaT2b1uhuEFhJ+W1f1u+1C2EkXmTYJp4B1aAdQQ8M+CC3t//N/oRKiIVw14L2HR1g==} - engines: {node: '>=12.0'} - dependencies: - lodash: 4.17.21 - vscode-json-languageservice: 4.2.1 - dev: true - - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - /eslint@8.55.0: - resolution: {integrity: sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.55.0) - '@eslint-community/regexpp': 4.10.0 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.55.0 - '@humanwhocodes/config-array': 0.11.13 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.23.0 - graphemer: 1.4.0 - ignore: 5.3.0 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.3 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - acorn: 8.11.2 - acorn-jsx: 5.3.2(acorn@8.11.2) - eslint-visitor-keys: 3.4.3 - - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} - dependencies: - estraverse: 5.3.0 - - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - dependencies: - estraverse: 5.3.0 - - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - /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'} - - /event-emitter@0.3.5: - resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} - dependencies: - d: 1.0.1 - es5-ext: 0.10.62 - dev: true - - /exit-hook@2.2.1: - resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} - engines: {node: '>=6'} - dev: true - - /expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} - 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==} - - /fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: false - - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} - dependencies: - reusify: 1.0.4 - - /fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 3.2.1 - dev: false - - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flat-cache: 3.2.0 - - /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'} - dependencies: - to-regex-range: 5.0.1 - - /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 - - /flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flatted: 3.2.9 - keyv: 4.5.4 - rimraf: 3.0.2 - - /flatted@3.2.9: - resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} - - /form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: false - - /formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} - dependencies: - fetch-blob: 3.2.0 - dev: false - - /fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - dev: false - - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /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-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'} - dependencies: - is-glob: 4.0.3 - - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - dependencies: - is-glob: 4.0.3 - - /glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - dev: true - - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - /glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - dev: true - - /globals@13.23.0: - resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.20.2 - - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.0 - merge2: 1.4.1 - slash: 3.0.0 - dev: false - - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - - /hanji@0.0.5: - resolution: {integrity: sha512-Abxw1Lq+TnYiL4BueXqMau222fPSPMFtya8HdpWsz/xVAhifXou71mPh/kY2+08RgFcVccjG3uZHs6K5HAe3zw==} - dependencies: - lodash.throttle: 4.1.1 - sisteransi: 1.0.5 - dev: true - - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - /heap@0.2.7: - resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} - dev: true - - /hono@3.11.3: - resolution: {integrity: sha512-MWYBcIS4dZJo9e/852Zwl+gqBiUSRknMOZ/MbW7kW8JiWixTJ58pzXVIeBq7jnvFq3AZ9uQ35QyVpzV05sdNFw==} - engines: {node: '>=16.0.0'} - dev: false - - /husky@8.0.3: - resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} - engines: {node: '>=14'} - hasBin: true - dev: true - - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: false - - /ignore@5.3.0: - resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} - engines: {node: '>= 4'} - - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: false - - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - dependencies: - binary-extensions: 2.2.0 - dev: true - - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - - /is-promise@2.2.2: - resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} - dev: true - - /is-what@4.1.16: - resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} - engines: {node: '>=12.13'} - dev: true - - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - /js-base64@3.7.5: - resolution: {integrity: sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==} - dev: false - - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - dependencies: - argparse: 2.0.1 - - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - - /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-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - dev: true - - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - dependencies: - json-buffer: 3.0.1 - - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - - /libsql@0.2.0-pre.4: - resolution: {integrity: sha512-ZAud4bIZwWJjZUKvQOgg3yVX2fVuqVuPOtjFAPuo+FpfMcsnBpGfOcIJxvfik5qKchyqHd/fpHWbFk7/X0XuHg==} - cpu: [x64, arm64] - os: [darwin, linux, win32] - dependencies: - '@neon-rs/load': 0.0.4 - detect-libc: 2.0.2 - optionalDependencies: - '@libsql/darwin-arm64': 0.2.0-pre.4 - '@libsql/darwin-x64': 0.2.0-pre.4 - '@libsql/linux-arm64-gnu': 0.2.0-pre.4 - '@libsql/linux-arm64-musl': 0.2.0-pre.4 - '@libsql/linux-x64-gnu': 0.2.0-pre.4 - '@libsql/linux-x64-musl': 0.2.0-pre.4 - '@libsql/win32-x64-msvc': 0.2.0-pre.4 - dev: false - - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - dependencies: - p-locate: 5.0.0 - - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - - /lodash.throttle@4.1.1: - resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} - dev: true - - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - 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 - - /lucia@3.0.0-beta.11: - resolution: {integrity: sha512-OXZfnM4KifDjkTTG3ruihormyOcXBz6wjAWibAAlw42zWBXDsleFR34gwKBxxXBa+TodzuKy7rcg8FGOMwwSGA==} - dependencies: - oslo: 0.23.5 - dev: false - - /magic-string@0.25.9: - resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} - dependencies: - sourcemap-codec: 1.4.8 - dev: true - - /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 - - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: false - - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - dev: false - - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - dev: false - - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - dev: false - - /mime@3.0.0: - resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} - engines: {node: '>=10.0.0'} - hasBin: true - dev: true - - /mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - dev: false - - /miniflare@3.20231030.3: - resolution: {integrity: sha512-lquHSh0XiO8uoWDujOLHtDS9mkUTJTc5C5amiQ6A++5y0f+DWiMqbDBvvwjlYf4Dvqk6ChFya9dztk7fg2ZVxA==} - engines: {node: '>=16.13'} - hasBin: true - dependencies: - acorn: 8.11.2 - acorn-walk: 8.3.1 - 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.28.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 - - /minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - dev: true - - /minimatch@7.4.6: - resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - dev: true - - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: false - - /mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - dev: false - - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - /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==} - dev: false - - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - - /next-tick@1.1.0: - resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - dev: true - - /node-abi@3.52.0: - resolution: {integrity: sha512-JJ98b02z16ILv7859irtXn4oUaFWADtvkzy2c0IAatNVX2Mc9Yoh8z6hZInn3QwvMEYhHuQloYi+TTQy67SIdQ==} - engines: {node: '>=10'} - dependencies: - semver: 7.5.4 - dev: false - - /node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} - dev: false - - /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-fetch@3.3.2: - resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - data-uri-to-buffer: 4.0.1 - fetch-blob: 3.2.0 - formdata-polyfill: 4.0.10 - dev: false - - /node-forge@1.3.1: - resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} - engines: {node: '>= 6.13.0'} - dev: true - - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: true - - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - - /openapi3-ts@4.1.2: - resolution: {integrity: sha512-B7gOkwsYMZO7BZXwJzXCuVagym2xhqsrilVvV0dnq2Di4+iLUXKVX9gOK23ZqaAHZOwABXN0QTdW8QnkUTX6DA==} - dependencies: - yaml: 2.3.4 - - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} - dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - - /oslo@0.23.5: - resolution: {integrity: sha512-G+q/MkR0IPaUA1+FpHL0pneAHJzhNpg9P4VXASy4JQy1KGFyfhi30DphVHYNKQC+C05VhDi/sTGdOX+yfcrT3g==} - dependencies: - '@node-rs/argon2': 1.5.2 - '@node-rs/bcrypt': 1.7.3 - dev: false - - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - dependencies: - yocto-queue: 0.1.0 - - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - dependencies: - p-limit: 3.1.0 - - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - dependencies: - callsites: 3.1.0 - - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - /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'} - dev: false - - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - /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.52.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 - - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - - /prettier@3.1.0: - resolution: {integrity: sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==} - engines: {node: '>=14'} - hasBin: true - dev: false - - /printable-characters@1.0.42: - resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} - dev: true - - /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'} - - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - /rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - dev: false - - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - dev: false - - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - dev: true - - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - - /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'} - dev: true - - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true - dependencies: - glob: 7.2.3 - - /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. - 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 - dev: true - - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - dependencies: - queue-microtask: 1.2.3 - - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: false - - /selfsigned@2.4.1: - resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} - engines: {node: '>=10'} - dependencies: - '@types/node-forge': 1.3.10 - node-forge: 1.3.1 - dev: true - - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - /simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - dev: false - - /simple-get@4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 - 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: false - - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - dev: true - - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - dev: true - - /sourcemap-codec@1.4.8: - resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} - deprecated: Please use @jridgewell/sourcemap-codec instead - dev: true - - /stacktracey@2.1.8: - resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==} - dependencies: - as-table: 1.0.55 - get-source: 2.0.12 - dev: true - - /stoppable@1.1.0: - resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} - engines: {node: '>=4', npm: '>=6'} - dev: true - - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - dependencies: - safe-buffer: 5.2.1 - dev: false - - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - - /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'} - - /superjson@2.2.1: - resolution: {integrity: sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==} - engines: {node: '>=16'} - dependencies: - copy-anything: 3.0.5 - dev: true - - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - - /tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.0 - tar-stream: 2.2.0 - dev: false - - /tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - 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 - - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - - /timers-ext@0.1.7: - resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==} - dependencies: - es5-ext: 0.10.62 - next-tick: 1.1.0 - dev: true - - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - dev: false - - /ts-api-utils@1.0.3(typescript@5.3.3): - resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} - engines: {node: '>=16.13.0'} - peerDependencies: - typescript: '>=4.2.0' - dependencies: - typescript: 5.3.3 - dev: false - - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - dev: true - - /tsx@4.6.2: - resolution: {integrity: sha512-QPpBdJo+ZDtqZgAnq86iY/PD2KYCUPSUGIunHdGwyII99GKH+f3z3FZ8XNFLSGQIA4I365ui8wnQpl8OKLqcsg==} - engines: {node: '>=18.0.0'} - hasBin: true - dependencies: - esbuild: 0.18.20 - get-tsconfig: 4.7.2 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - dependencies: - safe-buffer: 5.2.1 - dev: false - - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - - /type@1.2.0: - resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} - dev: true - - /type@2.7.2: - resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} - dev: true - - /typescript@5.3.3: - resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} - engines: {node: '>=14.17'} - hasBin: true - - /undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - - /undici@5.28.2: - resolution: {integrity: sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==} - engines: {node: '>=14.0'} - dependencies: - '@fastify/busboy': 2.1.0 - dev: true - - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - dependencies: - punycode: 2.3.1 - - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: false - - /uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - hasBin: true - dev: false - - /vscode-json-languageservice@4.2.1: - resolution: {integrity: sha512-xGmv9QIWs2H8obGbWg+sIPI/3/pFgj/5OWBhNzs00BkYQ9UaB2F6JJaGB/2/YOZJ3BvLXQTC4Q7muqU25QgAhA==} - dependencies: - jsonc-parser: 3.2.0 - vscode-languageserver-textdocument: 1.0.11 - vscode-languageserver-types: 3.17.5 - vscode-nls: 5.2.0 - vscode-uri: 3.0.8 - dev: true - - /vscode-languageserver-textdocument@1.0.11: - resolution: {integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==} - dev: true - - /vscode-languageserver-types@3.17.5: - resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} - dev: true - - /vscode-nls@5.2.0: - resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==} - dev: true - - /vscode-uri@3.0.8: - resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} - dev: true - - /web-streams-polyfill@3.2.1: - resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} - engines: {node: '>= 8'} - dev: false - - /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@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - - /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.19.0: - resolution: {integrity: sha512-pY7xWqkQn6DJ+1vz9YHz2pCftEmK+JCTj9sqnucp0NZnlUiILDmBWegsjjCLZycgfiA62J213N7NvjLPr2LB8w==} - engines: {node: '>=16.17.0'} - hasBin: true - 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.3 - 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 - dev: true - - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - /ws@8.14.2: - resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - /xxhash-wasm@1.0.2: - resolution: {integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==} - dev: true - - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - - /yaml@2.3.4: - resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} - engines: {node: '>= 14'} - - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - - /youch@3.3.3: - resolution: {integrity: sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==} - dependencies: - cookie: 0.5.0 - mustache: 4.2.0 - stacktracey: 2.1.8 - dev: true - - /zod@3.22.4: - resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + /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-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" } + dependencies: + is-glob: 4.0.3 + + /glob-parent@6.0.2: + resolution: + { + integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, + } + engines: { node: ">=10.13.0" } + dependencies: + is-glob: 4.0.3 + + /glob-to-regexp@0.4.1: + resolution: + { + integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==, + } + dev: true + + /glob@7.2.3: + resolution: + { + integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, + } + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /glob@8.1.0: + resolution: + { + integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==, + } + engines: { node: ">=12" } + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + dev: true + + /globals@13.23.0: + resolution: + { + integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==, + } + engines: { node: ">=8" } + dependencies: + type-fest: 0.20.2 + + /globby@11.1.0: + resolution: + { + integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, + } + engines: { node: ">=10" } + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.0 + merge2: 1.4.1 + slash: 3.0.0 + dev: false + + /graphemer@1.4.0: + resolution: + { + integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, + } + + /hanji@0.0.5: + resolution: + { + integrity: sha512-Abxw1Lq+TnYiL4BueXqMau222fPSPMFtya8HdpWsz/xVAhifXou71mPh/kY2+08RgFcVccjG3uZHs6K5HAe3zw==, + } + dependencies: + lodash.throttle: 4.1.1 + sisteransi: 1.0.5 + dev: true + + /has-flag@4.0.0: + resolution: + { + integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, + } + engines: { node: ">=8" } + + /heap@0.2.7: + resolution: + { + integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==, + } + dev: true + + /hono@3.11.3: + resolution: + { + integrity: sha512-MWYBcIS4dZJo9e/852Zwl+gqBiUSRknMOZ/MbW7kW8JiWixTJ58pzXVIeBq7jnvFq3AZ9uQ35QyVpzV05sdNFw==, + } + engines: { node: ">=16.0.0" } + dev: false + + /husky@8.0.3: + resolution: + { + integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==, + } + engines: { node: ">=14" } + hasBin: true + dev: true + + /ieee754@1.2.1: + resolution: + { + integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, + } + dev: false + + /ignore@5.3.0: + resolution: + { + integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==, + } + engines: { node: ">= 4" } + + /import-fresh@3.3.0: + resolution: + { + integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, + } + engines: { node: ">=6" } + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + /imurmurhash@0.1.4: + resolution: + { + integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, + } + engines: { node: ">=0.8.19" } + + /inflight@1.0.6: + resolution: + { + integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, + } + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits@2.0.4: + resolution: + { + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, + } + + /ini@1.3.8: + resolution: + { + integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, + } + dev: false + + /is-binary-path@2.1.0: + resolution: + { + integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, + } + engines: { node: ">=8" } + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-extglob@2.1.1: + resolution: + { + integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, + } + engines: { node: ">=0.10.0" } + + /is-glob@4.0.3: + resolution: + { + integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, + } + engines: { node: ">=0.10.0" } + dependencies: + is-extglob: 2.1.1 + + /is-number@7.0.0: + resolution: + { + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, + } + engines: { node: ">=0.12.0" } + + /is-path-inside@3.0.3: + resolution: + { + integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, + } + engines: { node: ">=8" } + + /is-promise@2.2.2: + resolution: + { + integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==, + } + dev: true + + /is-what@4.1.16: + resolution: + { + integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==, + } + engines: { node: ">=12.13" } + dev: true + + /isexe@2.0.0: + resolution: + { + integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, + } + + /js-base64@3.7.5: + resolution: + { + integrity: sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==, + } + dev: false + + /js-yaml@4.1.0: + resolution: + { + integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, + } + hasBin: true + dependencies: + argparse: 2.0.1 + + /json-buffer@3.0.1: + resolution: + { + integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, + } + + /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-schema-traverse@0.4.1: + resolution: + { + integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, + } + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: + { + integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, + } + + /jsonc-parser@3.2.0: + resolution: + { + integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==, + } + dev: true + + /keyv@4.5.4: + resolution: + { + integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, + } + dependencies: + json-buffer: 3.0.1 + + /levn@0.4.1: + resolution: + { + integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, + } + engines: { node: ">= 0.8.0" } + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + /libsql@0.2.0-pre.4: + resolution: + { + integrity: sha512-ZAud4bIZwWJjZUKvQOgg3yVX2fVuqVuPOtjFAPuo+FpfMcsnBpGfOcIJxvfik5qKchyqHd/fpHWbFk7/X0XuHg==, + } + cpu: [x64, arm64] + os: [darwin, linux, win32] + dependencies: + "@neon-rs/load": 0.0.4 + detect-libc: 2.0.2 + optionalDependencies: + "@libsql/darwin-arm64": 0.2.0-pre.4 + "@libsql/darwin-x64": 0.2.0-pre.4 + "@libsql/linux-arm64-gnu": 0.2.0-pre.4 + "@libsql/linux-arm64-musl": 0.2.0-pre.4 + "@libsql/linux-x64-gnu": 0.2.0-pre.4 + "@libsql/linux-x64-musl": 0.2.0-pre.4 + "@libsql/win32-x64-msvc": 0.2.0-pre.4 + dev: false + + /locate-path@6.0.0: + resolution: + { + integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, + } + engines: { node: ">=10" } + dependencies: + p-locate: 5.0.0 + + /lodash.merge@4.6.2: + resolution: + { + integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, + } + + /lodash.throttle@4.1.1: + resolution: + { + integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==, + } + dev: true + + /lodash@4.17.21: + resolution: + { + integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, + } + 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 + + /lucia@3.0.0-beta.11: + resolution: + { + integrity: sha512-OXZfnM4KifDjkTTG3ruihormyOcXBz6wjAWibAAlw42zWBXDsleFR34gwKBxxXBa+TodzuKy7rcg8FGOMwwSGA==, + } + dependencies: + oslo: 0.23.5 + dev: false + + /magic-string@0.25.9: + resolution: + { + integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==, + } + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /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 + + /merge2@1.4.1: + resolution: + { + integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, + } + engines: { node: ">= 8" } + dev: false + + /micromatch@4.0.5: + resolution: + { + integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, + } + engines: { node: ">=8.6" } + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: false + + /mime-db@1.52.0: + resolution: + { + integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, + } + engines: { node: ">= 0.6" } + dev: false + + /mime-types@2.1.35: + resolution: + { + integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, + } + engines: { node: ">= 0.6" } + dependencies: + mime-db: 1.52.0 + dev: false + + /mime@3.0.0: + resolution: + { + integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==, + } + engines: { node: ">=10.0.0" } + hasBin: true + dev: true + + /mimic-response@3.1.0: + resolution: + { + integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==, + } + engines: { node: ">=10" } + dev: false + + /miniflare@3.20231030.3: + resolution: + { + integrity: sha512-lquHSh0XiO8uoWDujOLHtDS9mkUTJTc5C5amiQ6A++5y0f+DWiMqbDBvvwjlYf4Dvqk6ChFya9dztk7fg2ZVxA==, + } + engines: { node: ">=16.13" } + hasBin: true + dependencies: + acorn: 8.11.2 + acorn-walk: 8.3.1 + 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.28.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 + + /minimatch@5.1.6: + resolution: + { + integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==, + } + engines: { node: ">=10" } + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimatch@7.4.6: + resolution: + { + integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==, + } + engines: { node: ">=10" } + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimist@1.2.8: + resolution: + { + integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, + } + dev: false + + /mkdirp-classic@0.5.3: + resolution: + { + integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==, + } + dev: false + + /ms@2.1.2: + resolution: + { + integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, + } + + /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==, + } + dev: false + + /natural-compare@1.4.0: + resolution: + { + integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, + } + + /next-tick@1.1.0: + resolution: + { + integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==, + } + dev: true + + /node-abi@3.52.0: + resolution: + { + integrity: sha512-JJ98b02z16ILv7859irtXn4oUaFWADtvkzy2c0IAatNVX2Mc9Yoh8z6hZInn3QwvMEYhHuQloYi+TTQy67SIdQ==, + } + engines: { node: ">=10" } + dependencies: + semver: 7.5.4 + dev: false + + /node-domexception@1.0.0: + resolution: + { + integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==, + } + engines: { node: ">=10.5.0" } + dev: false + + /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-fetch@3.3.2: + resolution: + { + integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + dev: false + + /node-forge@1.3.1: + resolution: + { + integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==, + } + engines: { node: ">= 6.13.0" } + dev: true + + /normalize-path@3.0.0: + resolution: + { + integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, + } + engines: { node: ">=0.10.0" } + dev: true + + /once@1.4.0: + resolution: + { + integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, + } + dependencies: + wrappy: 1.0.2 + + /openapi3-ts@4.1.2: + resolution: + { + integrity: sha512-B7gOkwsYMZO7BZXwJzXCuVagym2xhqsrilVvV0dnq2Di4+iLUXKVX9gOK23ZqaAHZOwABXN0QTdW8QnkUTX6DA==, + } + dependencies: + yaml: 2.3.4 + + /optionator@0.9.3: + resolution: + { + integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==, + } + engines: { node: ">= 0.8.0" } + dependencies: + "@aashutoshrathi/word-wrap": 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + + /oslo@0.23.5: + resolution: + { + integrity: sha512-G+q/MkR0IPaUA1+FpHL0pneAHJzhNpg9P4VXASy4JQy1KGFyfhi30DphVHYNKQC+C05VhDi/sTGdOX+yfcrT3g==, + } + dependencies: + "@node-rs/argon2": 1.5.2 + "@node-rs/bcrypt": 1.7.3 + dev: false + + /p-limit@3.1.0: + resolution: + { + integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, + } + engines: { node: ">=10" } + dependencies: + yocto-queue: 0.1.0 + + /p-locate@5.0.0: + resolution: + { + integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, + } + engines: { node: ">=10" } + dependencies: + p-limit: 3.1.0 + + /parent-module@1.0.1: + resolution: + { + integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, + } + engines: { node: ">=6" } + dependencies: + callsites: 3.1.0 + + /path-exists@4.0.0: + resolution: + { + integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, + } + engines: { node: ">=8" } + + /path-is-absolute@1.0.1: + resolution: + { + integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, + } + engines: { node: ">=0.10.0" } + + /path-key@3.1.1: + resolution: + { + integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, + } + engines: { node: ">=8" } + + /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" } + dev: false + + /picomatch@2.3.1: + resolution: + { + integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, + } + engines: { node: ">=8.6" } + + /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.52.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 + + /prelude-ls@1.2.1: + resolution: + { + integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, + } + engines: { node: ">= 0.8.0" } + + /prettier@3.1.0: + resolution: + { + integrity: sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==, + } + engines: { node: ">=14" } + hasBin: true + dev: false + + /printable-characters@1.0.42: + resolution: + { + integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==, + } + dev: true + + /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" } + + /queue-microtask@1.2.3: + resolution: + { + integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, + } + + /rc@1.2.8: + resolution: + { + integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==, + } + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: false + + /readable-stream@3.6.2: + resolution: + { + integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, + } + engines: { node: ">= 6" } + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + + /readdirp@3.6.0: + resolution: + { + integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, + } + engines: { node: ">=8.10.0" } + dependencies: + picomatch: 2.3.1 + dev: true + + /resolve-from@4.0.0: + resolution: + { + integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, + } + engines: { node: ">=4" } + + /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" } + dev: true + + /reusify@1.0.4: + resolution: + { + integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, + } + engines: { iojs: ">=1.0.0", node: ">=0.10.0" } + + /rimraf@3.0.2: + resolution: + { + integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, + } + hasBin: true + dependencies: + glob: 7.2.3 + + /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. + 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 + dev: true + + /run-parallel@1.2.0: + resolution: + { + integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, + } + dependencies: + queue-microtask: 1.2.3 + + /safe-buffer@5.2.1: + resolution: + { + integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, + } + dev: false + + /selfsigned@2.4.1: + resolution: + { + integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==, + } + engines: { node: ">=10" } + dependencies: + "@types/node-forge": 1.3.10 + node-forge: 1.3.1 + dev: true + + /semver@7.5.4: + resolution: + { + integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==, + } + engines: { node: ">=10" } + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /shebang-command@2.0.0: + resolution: + { + integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, + } + engines: { node: ">=8" } + dependencies: + shebang-regex: 3.0.0 + + /shebang-regex@3.0.0: + resolution: + { + integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, + } + engines: { node: ">=8" } + + /simple-concat@1.0.1: + resolution: + { + integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==, + } + dev: false + + /simple-get@4.0.1: + resolution: + { + integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==, + } + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + 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: false + + /source-map-support@0.5.21: + resolution: + { + integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, + } + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map@0.6.1: + resolution: + { + integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, + } + engines: { node: ">=0.10.0" } + dev: true + + /sourcemap-codec@1.4.8: + resolution: + { + integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==, + } + deprecated: Please use @jridgewell/sourcemap-codec instead + dev: true + + /stacktracey@2.1.8: + resolution: + { + integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==, + } + dependencies: + as-table: 1.0.55 + get-source: 2.0.12 + dev: true + + /stoppable@1.1.0: + resolution: + { + integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==, + } + engines: { node: ">=4", npm: ">=6" } + dev: true + + /string_decoder@1.3.0: + resolution: + { + integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, + } + dependencies: + safe-buffer: 5.2.1 + dev: false + + /strip-ansi@6.0.1: + resolution: + { + integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, + } + engines: { node: ">=8" } + dependencies: + ansi-regex: 5.0.1 + + /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" } + + /superjson@2.2.1: + resolution: + { + integrity: sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==, + } + engines: { node: ">=16" } + dependencies: + copy-anything: 3.0.5 + dev: true + + /supports-color@7.2.0: + resolution: + { + integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, + } + engines: { node: ">=8" } + dependencies: + has-flag: 4.0.0 + + /tar-fs@2.1.1: + resolution: + { + integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==, + } + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: false + + /tar-stream@2.2.0: + resolution: + { + integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==, + } + engines: { node: ">=6" } + 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 + + /text-table@0.2.0: + resolution: + { + integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, + } + + /timers-ext@0.1.7: + resolution: + { + integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==, + } + dependencies: + es5-ext: 0.10.62 + next-tick: 1.1.0 + dev: true + + /to-regex-range@5.0.1: + resolution: + { + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, + } + engines: { node: ">=8.0" } + dependencies: + is-number: 7.0.0 + + /tr46@0.0.3: + resolution: + { + integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, + } + dev: false + + /ts-api-utils@1.0.3(typescript@5.3.3): + resolution: + { + integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==, + } + engines: { node: ">=16.13.0" } + peerDependencies: + typescript: ">=4.2.0" + dependencies: + typescript: 5.3.3 + dev: false + + /tslib@2.6.2: + resolution: + { + integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==, + } + dev: true + + /tsx@4.6.2: + resolution: + { + integrity: sha512-QPpBdJo+ZDtqZgAnq86iY/PD2KYCUPSUGIunHdGwyII99GKH+f3z3FZ8XNFLSGQIA4I365ui8wnQpl8OKLqcsg==, + } + engines: { node: ">=18.0.0" } + hasBin: true + dependencies: + esbuild: 0.18.20 + get-tsconfig: 4.7.2 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /tunnel-agent@0.6.0: + resolution: + { + integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==, + } + dependencies: + safe-buffer: 5.2.1 + dev: false + + /type-check@0.4.0: + resolution: + { + integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, + } + engines: { node: ">= 0.8.0" } + dependencies: + prelude-ls: 1.2.1 + + /type-fest@0.20.2: + resolution: + { + integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==, + } + engines: { node: ">=10" } + + /type@1.2.0: + resolution: + { + integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==, + } + dev: true + + /type@2.7.2: + resolution: + { + integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==, + } + dev: true + + /typescript@5.3.3: + resolution: + { + integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==, + } + engines: { node: ">=14.17" } + hasBin: true + + /undici-types@5.26.5: + resolution: + { + integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==, + } + + /undici@5.28.2: + resolution: + { + integrity: sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==, + } + engines: { node: ">=14.0" } + dependencies: + "@fastify/busboy": 2.1.0 + dev: true + + /uri-js@4.4.1: + resolution: + { + integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, + } + dependencies: + punycode: 2.3.1 + + /util-deprecate@1.0.2: + resolution: + { + integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, + } + dev: false + + /uuid@9.0.1: + resolution: + { + integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==, + } + hasBin: true + dev: false + + /vscode-json-languageservice@4.2.1: + resolution: + { + integrity: sha512-xGmv9QIWs2H8obGbWg+sIPI/3/pFgj/5OWBhNzs00BkYQ9UaB2F6JJaGB/2/YOZJ3BvLXQTC4Q7muqU25QgAhA==, + } + dependencies: + jsonc-parser: 3.2.0 + vscode-languageserver-textdocument: 1.0.11 + vscode-languageserver-types: 3.17.5 + vscode-nls: 5.2.0 + vscode-uri: 3.0.8 + dev: true + + /vscode-languageserver-textdocument@1.0.11: + resolution: + { + integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==, + } + dev: true + + /vscode-languageserver-types@3.17.5: + resolution: + { + integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==, + } + dev: true + + /vscode-nls@5.2.0: + resolution: + { + integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==, + } + dev: true + + /vscode-uri@3.0.8: + resolution: + { + integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==, + } + dev: true + + /web-streams-polyfill@3.2.1: + resolution: + { + integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==, + } + engines: { node: ">= 8" } + dev: false + + /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@2.0.2: + resolution: + { + integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, + } + engines: { node: ">= 8" } + hasBin: true + dependencies: + isexe: 2.0.0 + + /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.19.0: + resolution: + { + integrity: sha512-pY7xWqkQn6DJ+1vz9YHz2pCftEmK+JCTj9sqnucp0NZnlUiILDmBWegsjjCLZycgfiA62J213N7NvjLPr2LB8w==, + } + engines: { node: ">=16.17.0" } + hasBin: true + 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.3 + 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 + dev: true + + /wrappy@1.0.2: + resolution: + { + integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, + } + + /ws@8.14.2: + resolution: + { + integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==, + } + engines: { node: ">=10.0.0" } + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + /xxhash-wasm@1.0.2: + resolution: + { + integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==, + } + dev: true + + /yallist@4.0.0: + resolution: + { + integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, + } + + /yaml@2.3.4: + resolution: + { + integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==, + } + engines: { node: ">= 14" } + + /yocto-queue@0.1.0: + resolution: + { + integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, + } + engines: { node: ">=10" } + + /youch@3.3.3: + resolution: + { + integrity: sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==, + } + dependencies: + cookie: 0.5.0 + mustache: 4.2.0 + stacktracey: 2.1.8 + dev: true + + /zod@3.22.4: + resolution: + { + integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==, + } From f4137518993bb2be46371cd767fa60df014dd1e2 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Wed, 13 Dec 2023 21:00:48 +0000 Subject: [PATCH 190/318] handle generations in schema --- src/scripts/seed/seed.ts | 5 - src/v2/db/migrations/0000_red_star_brand.sql | 309 +++ src/v2/db/migrations/meta/0000_snapshot.json | 1866 +++++++++++++++++ src/v2/db/migrations/meta/_journal.json | 13 + src/v2/db/schema/user/user.ts | 15 +- src/v2/lib/managers/auth/user-auth-manager.ts | 3 - 6 files changed, 2201 insertions(+), 10 deletions(-) create mode 100644 src/v2/db/migrations/0000_red_star_brand.sql create mode 100644 src/v2/db/migrations/meta/0000_snapshot.json create mode 100644 src/v2/db/migrations/meta/_journal.json diff --git a/src/scripts/seed/seed.ts b/src/scripts/seed/seed.ts index 7e31254..73effe4 100644 --- a/src/scripts/seed/seed.ts +++ b/src/scripts/seed/seed.ts @@ -16,7 +16,6 @@ import { userFavoriteAsset, userFollowing, } from "@/v2/db/schema" -import { generateID } from "@/v2/lib/oslo" import { Scrypt } from "lucia" const { ENVIRONMENT } = process.env @@ -47,7 +46,6 @@ async function main() { .insert(authUser) .values([ { - id: generateID(), username: "adminuser", email: "admin@wanderer.moe", emailVerified: 1, @@ -58,7 +56,6 @@ async function main() { selfAssignableRoleFlags: 0, }, { - id: generateID(), username: "testuser2", email: "testuser2@dromzeh.dev", emailVerified: 1, @@ -69,7 +66,6 @@ async function main() { selfAssignableRoleFlags: 0, }, { - id: generateID(), username: "testuser3", email: "testuser3@wanderer.moe", emailVerified: 1, @@ -91,7 +87,6 @@ async function main() { const newCredentials = await db .insert(authCredentials) .values({ - id: generateID(20), userId: newUsers[0].id, hashedPassword: await new Scrypt().hash(devAdminPassword), }) diff --git a/src/v2/db/migrations/0000_red_star_brand.sql b/src/v2/db/migrations/0000_red_star_brand.sql new file mode 100644 index 0000000..ac7f24d --- /dev/null +++ b/src/v2/db/migrations/0000_red_star_brand.sql @@ -0,0 +1,309 @@ +CREATE TABLE `asset` ( + `id` integer PRIMARY KEY NOT NULL, + `name` text NOT NULL, + `extension` text NOT NULL, + `game` text NOT NULL, + `asset_category` text NOT NULL, + `uploaded_by_id` text NOT NULL, + `uploaded_by_name` text NOT NULL, + `url` text NOT NULL, + `status` text DEFAULT 'pending' NOT NULL, + `uploaded_date` text NOT NULL, + `asset_is_optimized` integer DEFAULT false NOT NULL, + `asset_is_suggestive` integer DEFAULT false NOT NULL, + `view_count` integer DEFAULT 0 NOT NULL, + `download_count` integer DEFAULT 0 NOT NULL, + `file_size` integer DEFAULT 0 NOT NULL, + `width` integer DEFAULT 0 NOT NULL, + `height` integer DEFAULT 0 NOT NULL, + FOREIGN KEY (`game`) REFERENCES `game`(`id`) ON UPDATE cascade ON DELETE cascade, + FOREIGN KEY (`asset_category`) REFERENCES `assetCategory`(`id`) ON UPDATE cascade ON DELETE cascade, + FOREIGN KEY (`uploaded_by_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade, + FOREIGN KEY (`uploaded_by_name`) REFERENCES `authUser`(`username`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `atlas` ( + `id` text NOT NULL, + `url` text NOT NULL, + `uploaded_by` text NOT NULL, + `uploaded_by_name` text NOT NULL, + `uploaded_date` integer NOT NULL, + `file_size` integer DEFAULT 0 NOT NULL +); +--> statement-breakpoint +CREATE TABLE `atlasToAsset` ( + `id` text, + `atlas_id` text NOT NULL, + `asset_id` integer NOT NULL, + FOREIGN KEY (`atlas_id`) REFERENCES `atlas`(`id`) ON UPDATE cascade ON DELETE cascade, + FOREIGN KEY (`asset_id`) REFERENCES `asset`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `assetLikes` ( + `asset_id` text NOT NULL, + `liked_by_id` text NOT NULL, + `created_at` text NOT NULL, + FOREIGN KEY (`asset_id`) REFERENCES `asset`(`id`) ON UPDATE no action ON DELETE no action, + FOREIGN KEY (`liked_by_id`) REFERENCES `authUser`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE TABLE `assetCategory` ( + `id` text NOT NULL, + `name` text NOT NULL, + `formatted_name` text NOT NULL, + `asset_count` integer DEFAULT 0 NOT NULL, + `last_updated` text NOT NULL +); +--> statement-breakpoint +CREATE TABLE `gameAssetCategory` ( + `game_id` text NOT NULL, + `asset_category_id` text NOT NULL, + FOREIGN KEY (`game_id`) REFERENCES `game`(`id`) ON UPDATE cascade ON DELETE cascade, + FOREIGN KEY (`asset_category_id`) REFERENCES `assetCategory`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `assetCategoryLikes` ( + `asset_id` text NOT NULL, + `liked_by_id` text NOT NULL, + `created_at` text NOT NULL, + FOREIGN KEY (`asset_id`) REFERENCES `assetCategory`(`id`) ON UPDATE no action ON DELETE no action, + FOREIGN KEY (`liked_by_id`) REFERENCES `authUser`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE TABLE `game` ( + `id` text NOT NULL, + `name` text NOT NULL, + `formatted_name` text NOT NULL, + `asset_count` integer DEFAULT 0, + `possible_suggestive_content` integer DEFAULT 0 NOT NULL, + `last_updated` text NOT NULL +); +--> statement-breakpoint +CREATE TABLE `gameLikes` ( + `asset_id` text NOT NULL, + `liked_by_id` text NOT NULL, + `created_at` text NOT NULL, + FOREIGN KEY (`asset_id`) REFERENCES `game`(`id`) ON UPDATE no action ON DELETE no action, + FOREIGN KEY (`liked_by_id`) REFERENCES `authUser`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE TABLE `assetTag` ( + `id` text NOT NULL, + `name` text NOT NULL, + `formatted_name` text NOT NULL, + `asset_count` integer DEFAULT 0 NOT NULL, + `last_updated` text NOT NULL +); +--> statement-breakpoint +CREATE TABLE `assetTagAsset` ( + `asset_tag_id` text NOT NULL, + `asset_id` integer NOT NULL, + FOREIGN KEY (`asset_tag_id`) REFERENCES `assetTag`(`id`) ON UPDATE cascade ON DELETE cascade, + FOREIGN KEY (`asset_id`) REFERENCES `asset`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `assetTagLikes` ( + `asset_id` text NOT NULL, + `liked_by_id` text NOT NULL, + `created_at` text NOT NULL, + FOREIGN KEY (`asset_id`) REFERENCES `assetTag`(`id`) ON UPDATE no action ON DELETE no action, + FOREIGN KEY (`liked_by_id`) REFERENCES `authUser`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE TABLE `savedOcGenerators` ( + `id` text NOT NULL, + `user_id` text NOT NULL, + `name` text NOT NULL, + `game` text NOT NULL, + `date_created` text NOT NULL, + `is_public` integer DEFAULT false NOT NULL, + `content` text NOT NULL, + `saved_color_palette` text, + `sakura_url` text, + FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `authCredentials` ( + `id` text NOT NULL, + `user_id` text NOT NULL, + `hashed_password` text, + FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `authUser` ( + `id` text NOT NULL, + `avatar_url` text, + `banner_url` text, + `display_name` text, + `username` text NOT NULL, + `username_colour` text, + `email` text NOT NULL, + `email_verified` integer DEFAULT 0 NOT NULL, + `pronouns` text, + `verified` integer DEFAULT 0 NOT NULL, + `bio` text DEFAULT 'No bio set' NOT NULL, + `date_joined` text NOT NULL, + `is_supporter` integer DEFAULT false NOT NULL, + `supporter_expires_at` text, + `is_banned` integer DEFAULT false NOT NULL, + `is_contributor` integer DEFAULT false NOT NULL, + `role_flags` integer DEFAULT 1 NOT NULL, + `self_assignable_role_flags` integer DEFAULT 0 NOT NULL +); +--> statement-breakpoint +CREATE TABLE `authSession` ( + `id` text NOT NULL, + `user_id` text NOT NULL, + `expires_at` text NOT NULL, + `user_agent` text NOT NULL, + `country_code` text NOT NULL, + `ip_address` text NOT NULL, + FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `emailVerificationToken` ( + `id` text NOT NULL, + `user_id` text NOT NULL, + `token` text NOT NULL, + `expires_at` text NOT NULL, + FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `passwordResetToken` ( + `id` text NOT NULL, + `user_id` text NOT NULL, + `token` text NOT NULL, + `expires_at` text NOT NULL, + FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `userCollection` ( + `id` text NOT NULL, + `name` text NOT NULL, + `description` text NOT NULL, + `user_id` text NOT NULL, + `date_created` text NOT NULL, + `is_public` integer DEFAULT false NOT NULL, + FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `userCollectionAsset` ( + `collection_id` text NOT NULL, + `asset_id` integer NOT NULL, + `date_added` text NOT NULL, + FOREIGN KEY (`collection_id`) REFERENCES `userCollection`(`id`) ON UPDATE cascade ON DELETE cascade, + FOREIGN KEY (`asset_id`) REFERENCES `asset`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `socialsConnection` ( + `id` text NOT NULL, + `user_id` text NOT NULL, + `discord_id` text, + FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `userFavorite` ( + `id` text NOT NULL, + `user_id` text NOT NULL, + `is_public` integer DEFAULT false NOT NULL, + FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `userFavoriteAsset` ( + `id` text NOT NULL, + `favorited_assets_id` text NOT NULL, + `asset_id` integer NOT NULL, + FOREIGN KEY (`favorited_assets_id`) REFERENCES `userFavorite`(`id`) ON UPDATE cascade ON DELETE cascade, + FOREIGN KEY (`asset_id`) REFERENCES `asset`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `userFollowing` ( + `followerId` text NOT NULL, + `followingId` text NOT NULL, + `createdAt` text NOT NULL, + FOREIGN KEY (`followerId`) REFERENCES `authUser`(`id`) ON UPDATE no action ON DELETE no action, + FOREIGN KEY (`followingId`) REFERENCES `authUser`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE TABLE `userCollectionLikes` ( + `collection_id` text NOT NULL, + `liked_by_id` text NOT NULL, + `createdAt` text NOT NULL, + FOREIGN KEY (`collection_id`) REFERENCES `userCollection`(`id`) ON UPDATE no action ON DELETE no action, + FOREIGN KEY (`liked_by_id`) REFERENCES `authUser`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE INDEX `assets_id_idx` ON `asset` (`id`);--> statement-breakpoint +CREATE INDEX `assets_name_idx` ON `asset` (`name`);--> statement-breakpoint +CREATE INDEX `assets_game_name_idx` ON `asset` (`game`);--> statement-breakpoint +CREATE INDEX `assets_asset_category_name_idx` ON `asset` (`asset_category`);--> statement-breakpoint +CREATE INDEX `assets_uploaded_by_id_idx` ON `asset` (`uploaded_by_id`);--> statement-breakpoint +CREATE UNIQUE INDEX `atlas_id_unique` ON `atlas` (`id`);--> statement-breakpoint +CREATE INDEX `atlas_id_idx` ON `atlas` (`id`);--> statement-breakpoint +CREATE INDEX `atlas_uploaded_by_idx` ON `atlas` (`uploaded_by`);--> statement-breakpoint +CREATE INDEX `atlas_uploaded_by_name_idx` ON `atlas` (`uploaded_by_name`);--> statement-breakpoint +CREATE INDEX `atlas_to_assets_id_idx` ON `atlasToAsset` (`id`);--> statement-breakpoint +CREATE INDEX `atlas_to_assets_atlas_id_idx` ON `atlasToAsset` (`atlas_id`);--> statement-breakpoint +CREATE INDEX `atlas_to_assets_asset_id_idx` ON `atlasToAsset` (`asset_id`);--> statement-breakpoint +CREATE INDEX `assetlikes_asset_idx` ON `assetLikes` (`asset_id`);--> statement-breakpoint +CREATE INDEX `assetlikes_likedBy_idx` ON `assetLikes` (`liked_by_id`);--> statement-breakpoint +CREATE UNIQUE INDEX `assetCategory_id_unique` ON `assetCategory` (`id`);--> statement-breakpoint +CREATE UNIQUE INDEX `assetCategory_name_unique` ON `assetCategory` (`name`);--> statement-breakpoint +CREATE INDEX `asset_category_id_idx` ON `assetCategory` (`id`);--> statement-breakpoint +CREATE INDEX `asset_category_name_idx` ON `assetCategory` (`name`);--> statement-breakpoint +CREATE INDEX `game_asset_category_game_id_idx` ON `gameAssetCategory` (`game_id`);--> statement-breakpoint +CREATE INDEX `game_asset_category_asset_category_id_idx` ON `gameAssetCategory` (`asset_category_id`);--> statement-breakpoint +CREATE INDEX `assetCategoryLikes_asset_idx` ON `assetCategoryLikes` (`asset_id`);--> statement-breakpoint +CREATE INDEX `assetCategoryLikes_likedby_idx` ON `assetCategoryLikes` (`liked_by_id`);--> statement-breakpoint +CREATE UNIQUE INDEX `game_id_unique` ON `game` (`id`);--> statement-breakpoint +CREATE UNIQUE INDEX `game_name_unique` ON `game` (`name`);--> statement-breakpoint +CREATE INDEX `game_id_idx` ON `game` (`id`);--> statement-breakpoint +CREATE INDEX `game_name_idx` ON `game` (`name`);--> statement-breakpoint +CREATE INDEX `gamelikes_game_idx` ON `gameLikes` (`asset_id`);--> statement-breakpoint +CREATE INDEX `gamelikes_likedby_idx` ON `gameLikes` (`liked_by_id`);--> statement-breakpoint +CREATE UNIQUE INDEX `assetTag_id_unique` ON `assetTag` (`id`);--> statement-breakpoint +CREATE UNIQUE INDEX `assetTag_name_unique` ON `assetTag` (`name`);--> statement-breakpoint +CREATE INDEX `asset_tag_id_idx` ON `assetTag` (`id`);--> statement-breakpoint +CREATE INDEX `asset_tag_name_idx` ON `assetTag` (`name`);--> statement-breakpoint +CREATE INDEX `asset_tags_assets_asset_tag_id_idx` ON `assetTagAsset` (`asset_tag_id`);--> statement-breakpoint +CREATE INDEX `asset_tags_assets_asset_id_idx` ON `assetTagAsset` (`asset_id`);--> statement-breakpoint +CREATE INDEX `assetTagLikes_asset_idx` ON `assetTagLikes` (`asset_id`);--> statement-breakpoint +CREATE INDEX `assetTagLikes_likedby_idx` ON `assetTagLikes` (`liked_by_id`);--> statement-breakpoint +CREATE UNIQUE INDEX `savedOcGenerators_id_unique` ON `savedOcGenerators` (`id`);--> statement-breakpoint +CREATE INDEX `saved_oc_generators_id_idx` ON `savedOcGenerators` (`id`);--> statement-breakpoint +CREATE INDEX `saved_oc_generators_user_id_idx` ON `savedOcGenerators` (`user_id`);--> statement-breakpoint +CREATE UNIQUE INDEX `authCredentials_id_unique` ON `authCredentials` (`id`);--> statement-breakpoint +CREATE INDEX `key_user_id_idx` ON `authCredentials` (`user_id`);--> statement-breakpoint +CREATE UNIQUE INDEX `authUser_id_unique` ON `authUser` (`id`);--> statement-breakpoint +CREATE UNIQUE INDEX `authUser_username_unique` ON `authUser` (`username`);--> statement-breakpoint +CREATE INDEX `user_id_idx` ON `authUser` (`id`);--> statement-breakpoint +CREATE INDEX `user_username_idx` ON `authUser` (`username`);--> statement-breakpoint +CREATE INDEX `user_email_idx` ON `authUser` (`email`);--> statement-breakpoint +CREATE UNIQUE INDEX `authSession_id_unique` ON `authSession` (`id`);--> statement-breakpoint +CREATE INDEX `session_user_id_idx` ON `authSession` (`user_id`);--> statement-breakpoint +CREATE UNIQUE INDEX `emailVerificationToken_id_unique` ON `emailVerificationToken` (`id`);--> statement-breakpoint +CREATE INDEX `email_verification_token_user_id_idx` ON `emailVerificationToken` (`user_id`);--> statement-breakpoint +CREATE INDEX `email_verification_token_token_idx` ON `emailVerificationToken` (`token`);--> statement-breakpoint +CREATE UNIQUE INDEX `passwordResetToken_id_unique` ON `passwordResetToken` (`id`);--> statement-breakpoint +CREATE INDEX `password_reset_token_user_id_idx` ON `passwordResetToken` (`user_id`);--> statement-breakpoint +CREATE INDEX `password_reset_token_token_idx` ON `passwordResetToken` (`token`);--> statement-breakpoint +CREATE UNIQUE INDEX `userCollection_id_unique` ON `userCollection` (`id`);--> statement-breakpoint +CREATE INDEX `collection_id_idx` ON `userCollection` (`id`);--> statement-breakpoint +CREATE INDEX `user_collection_id_idx` ON `userCollection` (`user_id`);--> statement-breakpoint +CREATE INDEX `collection_assets_collection_id_idx` ON `userCollectionAsset` (`collection_id`);--> statement-breakpoint +CREATE INDEX `collection_assets_asset_id_idx` ON `userCollectionAsset` (`asset_id`);--> statement-breakpoint +CREATE UNIQUE INDEX `socialsConnection_id_unique` ON `socialsConnection` (`id`);--> statement-breakpoint +CREATE UNIQUE INDEX `socialsConnection_user_id_unique` ON `socialsConnection` (`user_id`);--> statement-breakpoint +CREATE INDEX `socials_connection_user_id_idx` ON `socialsConnection` (`user_id`);--> statement-breakpoint +CREATE INDEX `socials_connection_discord_id_idx` ON `socialsConnection` (`discord_id`);--> statement-breakpoint +CREATE UNIQUE INDEX `userFavorite_id_unique` ON `userFavorite` (`id`);--> statement-breakpoint +CREATE INDEX `favorited_assets_id_idx` ON `userFavorite` (`id`);--> statement-breakpoint +CREATE INDEX `favorited_assets_user_id_idx` ON `userFavorite` (`user_id`);--> statement-breakpoint +CREATE UNIQUE INDEX `userFavoriteAsset_id_unique` ON `userFavoriteAsset` (`id`);--> statement-breakpoint +CREATE INDEX `favorited_assets_assets_id_idx` ON `userFavoriteAsset` (`id`);--> statement-breakpoint +CREATE INDEX `favorited_assets_assets_user_id_idx` ON `userFavoriteAsset` (`favorited_assets_id`);--> statement-breakpoint +CREATE INDEX `favorited_assets_assets_asset_id_idx` ON `userFavoriteAsset` (`asset_id`);--> statement-breakpoint +CREATE INDEX `userfollowing_follower_idx` ON `userFollowing` (`followerId`);--> statement-breakpoint +CREATE INDEX `userfollowing_following_idx` ON `userFollowing` (`followingId`);--> statement-breakpoint +CREATE INDEX `userCollectionNetworking_collection_idx` ON `userCollectionLikes` (`collection_id`);--> statement-breakpoint +CREATE INDEX `userCollectionNetworking_likedBy_idx` ON `userCollectionLikes` (`liked_by_id`); \ No newline at end of file diff --git a/src/v2/db/migrations/meta/0000_snapshot.json b/src/v2/db/migrations/meta/0000_snapshot.json new file mode 100644 index 0000000..dd26507 --- /dev/null +++ b/src/v2/db/migrations/meta/0000_snapshot.json @@ -0,0 +1,1866 @@ +{ + "version": "5", + "dialect": "sqlite", + "id": "4e15e680-994c-46e6-9f65-96ae2c88ed95", + "prevId": "00000000-0000-0000-0000-000000000000", + "tables": { + "asset": { + "name": "asset", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "extension": { + "name": "extension", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "game": { + "name": "game", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_category": { + "name": "asset_category", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by_id": { + "name": "uploaded_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by_name": { + "name": "uploaded_by_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'pending'" + }, + "uploaded_date": { + "name": "uploaded_date", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_is_optimized": { + "name": "asset_is_optimized", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "asset_is_suggestive": { + "name": "asset_is_suggestive", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "view_count": { + "name": "view_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "download_count": { + "name": "download_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "file_size": { + "name": "file_size", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "width": { + "name": "width", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "height": { + "name": "height", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "assets_id_idx": { + "name": "assets_id_idx", + "columns": ["id"], + "isUnique": false + }, + "assets_name_idx": { + "name": "assets_name_idx", + "columns": ["name"], + "isUnique": false + }, + "assets_game_name_idx": { + "name": "assets_game_name_idx", + "columns": ["game"], + "isUnique": false + }, + "assets_asset_category_name_idx": { + "name": "assets_asset_category_name_idx", + "columns": ["asset_category"], + "isUnique": false + }, + "assets_uploaded_by_id_idx": { + "name": "assets_uploaded_by_id_idx", + "columns": ["uploaded_by_id"], + "isUnique": false + } + }, + "foreignKeys": { + "asset_game_game_id_fk": { + "name": "asset_game_game_id_fk", + "tableFrom": "asset", + "tableTo": "game", + "columnsFrom": ["game"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "asset_asset_category_assetCategory_id_fk": { + "name": "asset_asset_category_assetCategory_id_fk", + "tableFrom": "asset", + "tableTo": "assetCategory", + "columnsFrom": ["asset_category"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "asset_uploaded_by_id_authUser_id_fk": { + "name": "asset_uploaded_by_id_authUser_id_fk", + "tableFrom": "asset", + "tableTo": "authUser", + "columnsFrom": ["uploaded_by_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "asset_uploaded_by_name_authUser_username_fk": { + "name": "asset_uploaded_by_name_authUser_username_fk", + "tableFrom": "asset", + "tableTo": "authUser", + "columnsFrom": ["uploaded_by_name"], + "columnsTo": ["username"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "atlas": { + "name": "atlas", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by": { + "name": "uploaded_by", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by_name": { + "name": "uploaded_by_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_date": { + "name": "uploaded_date", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "file_size": { + "name": "file_size", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "atlas_id_unique": { + "name": "atlas_id_unique", + "columns": ["id"], + "isUnique": true + }, + "atlas_id_idx": { + "name": "atlas_id_idx", + "columns": ["id"], + "isUnique": false + }, + "atlas_uploaded_by_idx": { + "name": "atlas_uploaded_by_idx", + "columns": ["uploaded_by"], + "isUnique": false + }, + "atlas_uploaded_by_name_idx": { + "name": "atlas_uploaded_by_name_idx", + "columns": ["uploaded_by_name"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "atlasToAsset": { + "name": "atlasToAsset", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "atlas_id": { + "name": "atlas_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "atlas_to_assets_id_idx": { + "name": "atlas_to_assets_id_idx", + "columns": ["id"], + "isUnique": false + }, + "atlas_to_assets_atlas_id_idx": { + "name": "atlas_to_assets_atlas_id_idx", + "columns": ["atlas_id"], + "isUnique": false + }, + "atlas_to_assets_asset_id_idx": { + "name": "atlas_to_assets_asset_id_idx", + "columns": ["asset_id"], + "isUnique": false + } + }, + "foreignKeys": { + "atlasToAsset_atlas_id_atlas_id_fk": { + "name": "atlasToAsset_atlas_id_atlas_id_fk", + "tableFrom": "atlasToAsset", + "tableTo": "atlas", + "columnsFrom": ["atlas_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "atlasToAsset_asset_id_asset_id_fk": { + "name": "atlasToAsset_asset_id_asset_id_fk", + "tableFrom": "atlasToAsset", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetLikes": { + "name": "assetLikes", + "columns": { + "asset_id": { + "name": "asset_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetlikes_asset_idx": { + "name": "assetlikes_asset_idx", + "columns": ["asset_id"], + "isUnique": false + }, + "assetlikes_likedBy_idx": { + "name": "assetlikes_likedBy_idx", + "columns": ["liked_by_id"], + "isUnique": false + } + }, + "foreignKeys": { + "assetLikes_asset_id_asset_id_fk": { + "name": "assetLikes_asset_id_asset_id_fk", + "tableFrom": "assetLikes", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "assetLikes_liked_by_id_authUser_id_fk": { + "name": "assetLikes_liked_by_id_authUser_id_fk", + "tableFrom": "assetLikes", + "tableTo": "authUser", + "columnsFrom": ["liked_by_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetCategory": { + "name": "assetCategory", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetCategory_id_unique": { + "name": "assetCategory_id_unique", + "columns": ["id"], + "isUnique": true + }, + "assetCategory_name_unique": { + "name": "assetCategory_name_unique", + "columns": ["name"], + "isUnique": true + }, + "asset_category_id_idx": { + "name": "asset_category_id_idx", + "columns": ["id"], + "isUnique": false + }, + "asset_category_name_idx": { + "name": "asset_category_name_idx", + "columns": ["name"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "gameAssetCategory": { + "name": "gameAssetCategory", + "columns": { + "game_id": { + "name": "game_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_category_id": { + "name": "asset_category_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "game_asset_category_game_id_idx": { + "name": "game_asset_category_game_id_idx", + "columns": ["game_id"], + "isUnique": false + }, + "game_asset_category_asset_category_id_idx": { + "name": "game_asset_category_asset_category_id_idx", + "columns": ["asset_category_id"], + "isUnique": false + } + }, + "foreignKeys": { + "gameAssetCategory_game_id_game_id_fk": { + "name": "gameAssetCategory_game_id_game_id_fk", + "tableFrom": "gameAssetCategory", + "tableTo": "game", + "columnsFrom": ["game_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "gameAssetCategory_asset_category_id_assetCategory_id_fk": { + "name": "gameAssetCategory_asset_category_id_assetCategory_id_fk", + "tableFrom": "gameAssetCategory", + "tableTo": "assetCategory", + "columnsFrom": ["asset_category_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetCategoryLikes": { + "name": "assetCategoryLikes", + "columns": { + "asset_id": { + "name": "asset_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetCategoryLikes_asset_idx": { + "name": "assetCategoryLikes_asset_idx", + "columns": ["asset_id"], + "isUnique": false + }, + "assetCategoryLikes_likedby_idx": { + "name": "assetCategoryLikes_likedby_idx", + "columns": ["liked_by_id"], + "isUnique": false + } + }, + "foreignKeys": { + "assetCategoryLikes_asset_id_assetCategory_id_fk": { + "name": "assetCategoryLikes_asset_id_assetCategory_id_fk", + "tableFrom": "assetCategoryLikes", + "tableTo": "assetCategory", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "assetCategoryLikes_liked_by_id_authUser_id_fk": { + "name": "assetCategoryLikes_liked_by_id_authUser_id_fk", + "tableFrom": "assetCategoryLikes", + "tableTo": "authUser", + "columnsFrom": ["liked_by_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "game": { + "name": "game", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": 0 + }, + "possible_suggestive_content": { + "name": "possible_suggestive_content", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "game_id_unique": { + "name": "game_id_unique", + "columns": ["id"], + "isUnique": true + }, + "game_name_unique": { + "name": "game_name_unique", + "columns": ["name"], + "isUnique": true + }, + "game_id_idx": { + "name": "game_id_idx", + "columns": ["id"], + "isUnique": false + }, + "game_name_idx": { + "name": "game_name_idx", + "columns": ["name"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "gameLikes": { + "name": "gameLikes", + "columns": { + "asset_id": { + "name": "asset_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "gamelikes_game_idx": { + "name": "gamelikes_game_idx", + "columns": ["asset_id"], + "isUnique": false + }, + "gamelikes_likedby_idx": { + "name": "gamelikes_likedby_idx", + "columns": ["liked_by_id"], + "isUnique": false + } + }, + "foreignKeys": { + "gameLikes_asset_id_game_id_fk": { + "name": "gameLikes_asset_id_game_id_fk", + "tableFrom": "gameLikes", + "tableTo": "game", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "gameLikes_liked_by_id_authUser_id_fk": { + "name": "gameLikes_liked_by_id_authUser_id_fk", + "tableFrom": "gameLikes", + "tableTo": "authUser", + "columnsFrom": ["liked_by_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetTag": { + "name": "assetTag", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetTag_id_unique": { + "name": "assetTag_id_unique", + "columns": ["id"], + "isUnique": true + }, + "assetTag_name_unique": { + "name": "assetTag_name_unique", + "columns": ["name"], + "isUnique": true + }, + "asset_tag_id_idx": { + "name": "asset_tag_id_idx", + "columns": ["id"], + "isUnique": false + }, + "asset_tag_name_idx": { + "name": "asset_tag_name_idx", + "columns": ["name"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetTagAsset": { + "name": "assetTagAsset", + "columns": { + "asset_tag_id": { + "name": "asset_tag_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "asset_tags_assets_asset_tag_id_idx": { + "name": "asset_tags_assets_asset_tag_id_idx", + "columns": ["asset_tag_id"], + "isUnique": false + }, + "asset_tags_assets_asset_id_idx": { + "name": "asset_tags_assets_asset_id_idx", + "columns": ["asset_id"], + "isUnique": false + } + }, + "foreignKeys": { + "assetTagAsset_asset_tag_id_assetTag_id_fk": { + "name": "assetTagAsset_asset_tag_id_assetTag_id_fk", + "tableFrom": "assetTagAsset", + "tableTo": "assetTag", + "columnsFrom": ["asset_tag_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "assetTagAsset_asset_id_asset_id_fk": { + "name": "assetTagAsset_asset_id_asset_id_fk", + "tableFrom": "assetTagAsset", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetTagLikes": { + "name": "assetTagLikes", + "columns": { + "asset_id": { + "name": "asset_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetTagLikes_asset_idx": { + "name": "assetTagLikes_asset_idx", + "columns": ["asset_id"], + "isUnique": false + }, + "assetTagLikes_likedby_idx": { + "name": "assetTagLikes_likedby_idx", + "columns": ["liked_by_id"], + "isUnique": false + } + }, + "foreignKeys": { + "assetTagLikes_asset_id_assetTag_id_fk": { + "name": "assetTagLikes_asset_id_assetTag_id_fk", + "tableFrom": "assetTagLikes", + "tableTo": "assetTag", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "assetTagLikes_liked_by_id_authUser_id_fk": { + "name": "assetTagLikes_liked_by_id_authUser_id_fk", + "tableFrom": "assetTagLikes", + "tableTo": "authUser", + "columnsFrom": ["liked_by_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "savedOcGenerators": { + "name": "savedOcGenerators", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "game": { + "name": "game", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "date_created": { + "name": "date_created", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "saved_color_palette": { + "name": "saved_color_palette", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sakura_url": { + "name": "sakura_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "savedOcGenerators_id_unique": { + "name": "savedOcGenerators_id_unique", + "columns": ["id"], + "isUnique": true + }, + "saved_oc_generators_id_idx": { + "name": "saved_oc_generators_id_idx", + "columns": ["id"], + "isUnique": false + }, + "saved_oc_generators_user_id_idx": { + "name": "saved_oc_generators_user_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "savedOcGenerators_user_id_authUser_id_fk": { + "name": "savedOcGenerators_user_id_authUser_id_fk", + "tableFrom": "savedOcGenerators", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "authCredentials": { + "name": "authCredentials", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "hashed_password": { + "name": "hashed_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "authCredentials_id_unique": { + "name": "authCredentials_id_unique", + "columns": ["id"], + "isUnique": true + }, + "key_user_id_idx": { + "name": "key_user_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "authCredentials_user_id_authUser_id_fk": { + "name": "authCredentials_user_id_authUser_id_fk", + "tableFrom": "authCredentials", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "authUser": { + "name": "authUser", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "avatar_url": { + "name": "avatar_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "banner_url": { + "name": "banner_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "display_name": { + "name": "display_name", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "username_colour": { + "name": "username_colour", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "email_verified": { + "name": "email_verified", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "pronouns": { + "name": "pronouns", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "verified": { + "name": "verified", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "bio": { + "name": "bio", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'No bio set'" + }, + "date_joined": { + "name": "date_joined", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_supporter": { + "name": "is_supporter", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "supporter_expires_at": { + "name": "supporter_expires_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "is_banned": { + "name": "is_banned", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "is_contributor": { + "name": "is_contributor", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "role_flags": { + "name": "role_flags", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "self_assignable_role_flags": { + "name": "self_assignable_role_flags", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "authUser_id_unique": { + "name": "authUser_id_unique", + "columns": ["id"], + "isUnique": true + }, + "authUser_username_unique": { + "name": "authUser_username_unique", + "columns": ["username"], + "isUnique": true + }, + "user_id_idx": { + "name": "user_id_idx", + "columns": ["id"], + "isUnique": false + }, + "user_username_idx": { + "name": "user_username_idx", + "columns": ["username"], + "isUnique": false + }, + "user_email_idx": { + "name": "user_email_idx", + "columns": ["email"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "authSession": { + "name": "authSession", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_agent": { + "name": "user_agent", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "country_code": { + "name": "country_code", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "ip_address": { + "name": "ip_address", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "authSession_id_unique": { + "name": "authSession_id_unique", + "columns": ["id"], + "isUnique": true + }, + "session_user_id_idx": { + "name": "session_user_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "authSession_user_id_authUser_id_fk": { + "name": "authSession_user_id_authUser_id_fk", + "tableFrom": "authSession", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "emailVerificationToken": { + "name": "emailVerificationToken", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "emailVerificationToken_id_unique": { + "name": "emailVerificationToken_id_unique", + "columns": ["id"], + "isUnique": true + }, + "email_verification_token_user_id_idx": { + "name": "email_verification_token_user_id_idx", + "columns": ["user_id"], + "isUnique": false + }, + "email_verification_token_token_idx": { + "name": "email_verification_token_token_idx", + "columns": ["token"], + "isUnique": false + } + }, + "foreignKeys": { + "emailVerificationToken_user_id_authUser_id_fk": { + "name": "emailVerificationToken_user_id_authUser_id_fk", + "tableFrom": "emailVerificationToken", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "passwordResetToken": { + "name": "passwordResetToken", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "passwordResetToken_id_unique": { + "name": "passwordResetToken_id_unique", + "columns": ["id"], + "isUnique": true + }, + "password_reset_token_user_id_idx": { + "name": "password_reset_token_user_id_idx", + "columns": ["user_id"], + "isUnique": false + }, + "password_reset_token_token_idx": { + "name": "password_reset_token_token_idx", + "columns": ["token"], + "isUnique": false + } + }, + "foreignKeys": { + "passwordResetToken_user_id_authUser_id_fk": { + "name": "passwordResetToken_user_id_authUser_id_fk", + "tableFrom": "passwordResetToken", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userCollection": { + "name": "userCollection", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "date_created": { + "name": "date_created", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": { + "userCollection_id_unique": { + "name": "userCollection_id_unique", + "columns": ["id"], + "isUnique": true + }, + "collection_id_idx": { + "name": "collection_id_idx", + "columns": ["id"], + "isUnique": false + }, + "user_collection_id_idx": { + "name": "user_collection_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "userCollection_user_id_authUser_id_fk": { + "name": "userCollection_user_id_authUser_id_fk", + "tableFrom": "userCollection", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userCollectionAsset": { + "name": "userCollectionAsset", + "columns": { + "collection_id": { + "name": "collection_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "date_added": { + "name": "date_added", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "collection_assets_collection_id_idx": { + "name": "collection_assets_collection_id_idx", + "columns": ["collection_id"], + "isUnique": false + }, + "collection_assets_asset_id_idx": { + "name": "collection_assets_asset_id_idx", + "columns": ["asset_id"], + "isUnique": false + } + }, + "foreignKeys": { + "userCollectionAsset_collection_id_userCollection_id_fk": { + "name": "userCollectionAsset_collection_id_userCollection_id_fk", + "tableFrom": "userCollectionAsset", + "tableTo": "userCollection", + "columnsFrom": ["collection_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "userCollectionAsset_asset_id_asset_id_fk": { + "name": "userCollectionAsset_asset_id_asset_id_fk", + "tableFrom": "userCollectionAsset", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "socialsConnection": { + "name": "socialsConnection", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "discord_id": { + "name": "discord_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "socialsConnection_id_unique": { + "name": "socialsConnection_id_unique", + "columns": ["id"], + "isUnique": true + }, + "socialsConnection_user_id_unique": { + "name": "socialsConnection_user_id_unique", + "columns": ["user_id"], + "isUnique": true + }, + "socials_connection_user_id_idx": { + "name": "socials_connection_user_id_idx", + "columns": ["user_id"], + "isUnique": false + }, + "socials_connection_discord_id_idx": { + "name": "socials_connection_discord_id_idx", + "columns": ["discord_id"], + "isUnique": false + } + }, + "foreignKeys": { + "socialsConnection_user_id_authUser_id_fk": { + "name": "socialsConnection_user_id_authUser_id_fk", + "tableFrom": "socialsConnection", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userFavorite": { + "name": "userFavorite", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": { + "userFavorite_id_unique": { + "name": "userFavorite_id_unique", + "columns": ["id"], + "isUnique": true + }, + "favorited_assets_id_idx": { + "name": "favorited_assets_id_idx", + "columns": ["id"], + "isUnique": false + }, + "favorited_assets_user_id_idx": { + "name": "favorited_assets_user_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "userFavorite_user_id_authUser_id_fk": { + "name": "userFavorite_user_id_authUser_id_fk", + "tableFrom": "userFavorite", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userFavoriteAsset": { + "name": "userFavoriteAsset", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "favorited_assets_id": { + "name": "favorited_assets_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "userFavoriteAsset_id_unique": { + "name": "userFavoriteAsset_id_unique", + "columns": ["id"], + "isUnique": true + }, + "favorited_assets_assets_id_idx": { + "name": "favorited_assets_assets_id_idx", + "columns": ["id"], + "isUnique": false + }, + "favorited_assets_assets_user_id_idx": { + "name": "favorited_assets_assets_user_id_idx", + "columns": ["favorited_assets_id"], + "isUnique": false + }, + "favorited_assets_assets_asset_id_idx": { + "name": "favorited_assets_assets_asset_id_idx", + "columns": ["asset_id"], + "isUnique": false + } + }, + "foreignKeys": { + "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk": { + "name": "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk", + "tableFrom": "userFavoriteAsset", + "tableTo": "userFavorite", + "columnsFrom": ["favorited_assets_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "userFavoriteAsset_asset_id_asset_id_fk": { + "name": "userFavoriteAsset_asset_id_asset_id_fk", + "tableFrom": "userFavoriteAsset", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userFollowing": { + "name": "userFollowing", + "columns": { + "followerId": { + "name": "followerId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "followingId": { + "name": "followingId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "userfollowing_follower_idx": { + "name": "userfollowing_follower_idx", + "columns": ["followerId"], + "isUnique": false + }, + "userfollowing_following_idx": { + "name": "userfollowing_following_idx", + "columns": ["followingId"], + "isUnique": false + } + }, + "foreignKeys": { + "userFollowing_followerId_authUser_id_fk": { + "name": "userFollowing_followerId_authUser_id_fk", + "tableFrom": "userFollowing", + "tableTo": "authUser", + "columnsFrom": ["followerId"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "userFollowing_followingId_authUser_id_fk": { + "name": "userFollowing_followingId_authUser_id_fk", + "tableFrom": "userFollowing", + "tableTo": "authUser", + "columnsFrom": ["followingId"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userCollectionLikes": { + "name": "userCollectionLikes", + "columns": { + "collection_id": { + "name": "collection_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "userCollectionNetworking_collection_idx": { + "name": "userCollectionNetworking_collection_idx", + "columns": ["collection_id"], + "isUnique": false + }, + "userCollectionNetworking_likedBy_idx": { + "name": "userCollectionNetworking_likedBy_idx", + "columns": ["liked_by_id"], + "isUnique": false + } + }, + "foreignKeys": { + "userCollectionLikes_collection_id_userCollection_id_fk": { + "name": "userCollectionLikes_collection_id_userCollection_id_fk", + "tableFrom": "userCollectionLikes", + "tableTo": "userCollection", + "columnsFrom": ["collection_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "userCollectionLikes_liked_by_id_authUser_id_fk": { + "name": "userCollectionLikes_liked_by_id_authUser_id_fk", + "tableFrom": "userCollectionLikes", + "tableTo": "authUser", + "columnsFrom": ["liked_by_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + } + }, + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + } +} diff --git a/src/v2/db/migrations/meta/_journal.json b/src/v2/db/migrations/meta/_journal.json new file mode 100644 index 0000000..092241a --- /dev/null +++ b/src/v2/db/migrations/meta/_journal.json @@ -0,0 +1,13 @@ +{ + "version": "5", + "dialect": "sqlite", + "entries": [ + { + "idx": 0, + "version": "5", + "when": 1702501143402, + "tag": "0000_red_star_brand", + "breakpoints": true + } + ] +} diff --git a/src/v2/db/schema/user/user.ts b/src/v2/db/schema/user/user.ts index 54c3919..9ba3b67 100644 --- a/src/v2/db/schema/user/user.ts +++ b/src/v2/db/schema/user/user.ts @@ -7,6 +7,7 @@ import { // uniqueIndex, index, } from "drizzle-orm/sqlite-core" +import { generateID } from "@/v2/lib/oslo" import { userFollowing } from "./user-following" import { asset } from "../asset/asset" import { userFavorite } from "./user-favorites" @@ -31,7 +32,12 @@ NOTE: Very basic user information export const authUser = sqliteTable( tableNames.authUser, { - id: text("id").unique().notNull(), + id: text("id") + .unique() + .notNull() + .$defaultFn(() => { + return generateID() + }), avatarUrl: text("avatar_url"), bannerUrl: text("banner_url"), displayName: text("display_name"), @@ -77,7 +83,12 @@ export type NewUser = typeof authUser.$inferInsert export const authCredentials = sqliteTable( tableNames.authCredentials, { - id: text("id").unique().notNull(), + id: text("id") + .unique() + .notNull() + .$defaultFn(() => { + return generateID(20) + }), userId: text("user_id") .notNull() .references(() => authUser.id, { diff --git a/src/v2/lib/managers/auth/user-auth-manager.ts b/src/v2/lib/managers/auth/user-auth-manager.ts index 6aadfda..8fcbd91 100644 --- a/src/v2/lib/managers/auth/user-auth-manager.ts +++ b/src/v2/lib/managers/auth/user-auth-manager.ts @@ -4,7 +4,6 @@ import { getConnection } from "@/v2/db/turso" import { authCredentials, authUser } from "@/v2/db/schema" import { createInsertSchema } from "drizzle-zod" import { z } from "zod" -import { generateID } from "../../oslo" import { eq, or } from "drizzle-orm" const authUserInsertSchema = createInsertSchema(authUser).pick({ @@ -68,7 +67,6 @@ export class UserAuthenticationManager { const [newUser] = await db .insert(authUser) .values({ - id: generateID(), username: attributes.username, email: attributes.email, }) @@ -76,7 +74,6 @@ export class UserAuthenticationManager { if (password) { await db.insert(authCredentials).values({ - id: generateID(20), userId: newUser.id, hashedPassword: await new Scrypt().hash(password), }) From 6c89b399b9028713b0c5ba4fefdc811f5acbc4ee Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Sat, 16 Dec 2023 20:43:42 +0000 Subject: [PATCH 191/318] user collection collaborators schema --- README.md | 2 +- src/v2/db/drizzle.ts | 1 + src/v2/db/migrations/0000_red_star_brand.sql | 309 --- src/v2/db/migrations/meta/0000_snapshot.json | 1866 ----------------- src/v2/db/migrations/meta/_journal.json | 13 - src/v2/db/schema.ts | 1 + .../user-collections-collaborators.ts | 58 + .../db/schema/collections/user-collections.ts | 5 +- src/v2/db/schema/user/user.ts | 2 + 9 files changed, 67 insertions(+), 2190 deletions(-) delete mode 100644 src/v2/db/migrations/0000_red_star_brand.sql delete mode 100644 src/v2/db/migrations/meta/0000_snapshot.json delete mode 100644 src/v2/db/migrations/meta/_journal.json create mode 100644 src/v2/db/schema/collections/user-collections-collaborators.ts diff --git a/README.md b/README.md index d91b5bf..afcbff5 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Source code for the API powering [**wanderer.moe**](https://wanderer.moe) — us ### Turso -We use Turso as our database. You will need to install the [Turso CLI](https://docs.turso.tech/reference/turso-cli#installation) then run `turso dev` to start a local database. You can persist data by passing `--db-file `. +We use Turso (libsql, fork of SQLite) as our database. You will need to install the [Turso CLI](https://docs.turso.tech/reference/turso-cli#installation) then run `turso dev` to start a local database. You can persist data by passing `--db-file `. The Turso CLI can be ran on Windows using WSL. diff --git a/src/v2/db/drizzle.ts b/src/v2/db/drizzle.ts index 64fe401..56d13b6 100644 --- a/src/v2/db/drizzle.ts +++ b/src/v2/db/drizzle.ts @@ -8,6 +8,7 @@ export const tableNames = { gameAssetCategory: "gameAssetCategory", assetLikes: "assetLikes", userCollectionLikes: "userCollectionLikes", + userCollectionCollaborators: "userCollectionCollaborators", game: "game", gameLikes: "gameLikes", atlas: "atlas", diff --git a/src/v2/db/migrations/0000_red_star_brand.sql b/src/v2/db/migrations/0000_red_star_brand.sql deleted file mode 100644 index ac7f24d..0000000 --- a/src/v2/db/migrations/0000_red_star_brand.sql +++ /dev/null @@ -1,309 +0,0 @@ -CREATE TABLE `asset` ( - `id` integer PRIMARY KEY NOT NULL, - `name` text NOT NULL, - `extension` text NOT NULL, - `game` text NOT NULL, - `asset_category` text NOT NULL, - `uploaded_by_id` text NOT NULL, - `uploaded_by_name` text NOT NULL, - `url` text NOT NULL, - `status` text DEFAULT 'pending' NOT NULL, - `uploaded_date` text NOT NULL, - `asset_is_optimized` integer DEFAULT false NOT NULL, - `asset_is_suggestive` integer DEFAULT false NOT NULL, - `view_count` integer DEFAULT 0 NOT NULL, - `download_count` integer DEFAULT 0 NOT NULL, - `file_size` integer DEFAULT 0 NOT NULL, - `width` integer DEFAULT 0 NOT NULL, - `height` integer DEFAULT 0 NOT NULL, - FOREIGN KEY (`game`) REFERENCES `game`(`id`) ON UPDATE cascade ON DELETE cascade, - FOREIGN KEY (`asset_category`) REFERENCES `assetCategory`(`id`) ON UPDATE cascade ON DELETE cascade, - FOREIGN KEY (`uploaded_by_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade, - FOREIGN KEY (`uploaded_by_name`) REFERENCES `authUser`(`username`) ON UPDATE cascade ON DELETE cascade -); ---> statement-breakpoint -CREATE TABLE `atlas` ( - `id` text NOT NULL, - `url` text NOT NULL, - `uploaded_by` text NOT NULL, - `uploaded_by_name` text NOT NULL, - `uploaded_date` integer NOT NULL, - `file_size` integer DEFAULT 0 NOT NULL -); ---> statement-breakpoint -CREATE TABLE `atlasToAsset` ( - `id` text, - `atlas_id` text NOT NULL, - `asset_id` integer NOT NULL, - FOREIGN KEY (`atlas_id`) REFERENCES `atlas`(`id`) ON UPDATE cascade ON DELETE cascade, - FOREIGN KEY (`asset_id`) REFERENCES `asset`(`id`) ON UPDATE cascade ON DELETE cascade -); ---> statement-breakpoint -CREATE TABLE `assetLikes` ( - `asset_id` text NOT NULL, - `liked_by_id` text NOT NULL, - `created_at` text NOT NULL, - FOREIGN KEY (`asset_id`) REFERENCES `asset`(`id`) ON UPDATE no action ON DELETE no action, - FOREIGN KEY (`liked_by_id`) REFERENCES `authUser`(`id`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -CREATE TABLE `assetCategory` ( - `id` text NOT NULL, - `name` text NOT NULL, - `formatted_name` text NOT NULL, - `asset_count` integer DEFAULT 0 NOT NULL, - `last_updated` text NOT NULL -); ---> statement-breakpoint -CREATE TABLE `gameAssetCategory` ( - `game_id` text NOT NULL, - `asset_category_id` text NOT NULL, - FOREIGN KEY (`game_id`) REFERENCES `game`(`id`) ON UPDATE cascade ON DELETE cascade, - FOREIGN KEY (`asset_category_id`) REFERENCES `assetCategory`(`id`) ON UPDATE cascade ON DELETE cascade -); ---> statement-breakpoint -CREATE TABLE `assetCategoryLikes` ( - `asset_id` text NOT NULL, - `liked_by_id` text NOT NULL, - `created_at` text NOT NULL, - FOREIGN KEY (`asset_id`) REFERENCES `assetCategory`(`id`) ON UPDATE no action ON DELETE no action, - FOREIGN KEY (`liked_by_id`) REFERENCES `authUser`(`id`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -CREATE TABLE `game` ( - `id` text NOT NULL, - `name` text NOT NULL, - `formatted_name` text NOT NULL, - `asset_count` integer DEFAULT 0, - `possible_suggestive_content` integer DEFAULT 0 NOT NULL, - `last_updated` text NOT NULL -); ---> statement-breakpoint -CREATE TABLE `gameLikes` ( - `asset_id` text NOT NULL, - `liked_by_id` text NOT NULL, - `created_at` text NOT NULL, - FOREIGN KEY (`asset_id`) REFERENCES `game`(`id`) ON UPDATE no action ON DELETE no action, - FOREIGN KEY (`liked_by_id`) REFERENCES `authUser`(`id`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -CREATE TABLE `assetTag` ( - `id` text NOT NULL, - `name` text NOT NULL, - `formatted_name` text NOT NULL, - `asset_count` integer DEFAULT 0 NOT NULL, - `last_updated` text NOT NULL -); ---> statement-breakpoint -CREATE TABLE `assetTagAsset` ( - `asset_tag_id` text NOT NULL, - `asset_id` integer NOT NULL, - FOREIGN KEY (`asset_tag_id`) REFERENCES `assetTag`(`id`) ON UPDATE cascade ON DELETE cascade, - FOREIGN KEY (`asset_id`) REFERENCES `asset`(`id`) ON UPDATE cascade ON DELETE cascade -); ---> statement-breakpoint -CREATE TABLE `assetTagLikes` ( - `asset_id` text NOT NULL, - `liked_by_id` text NOT NULL, - `created_at` text NOT NULL, - FOREIGN KEY (`asset_id`) REFERENCES `assetTag`(`id`) ON UPDATE no action ON DELETE no action, - FOREIGN KEY (`liked_by_id`) REFERENCES `authUser`(`id`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -CREATE TABLE `savedOcGenerators` ( - `id` text NOT NULL, - `user_id` text NOT NULL, - `name` text NOT NULL, - `game` text NOT NULL, - `date_created` text NOT NULL, - `is_public` integer DEFAULT false NOT NULL, - `content` text NOT NULL, - `saved_color_palette` text, - `sakura_url` text, - FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade -); ---> statement-breakpoint -CREATE TABLE `authCredentials` ( - `id` text NOT NULL, - `user_id` text NOT NULL, - `hashed_password` text, - FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade -); ---> statement-breakpoint -CREATE TABLE `authUser` ( - `id` text NOT NULL, - `avatar_url` text, - `banner_url` text, - `display_name` text, - `username` text NOT NULL, - `username_colour` text, - `email` text NOT NULL, - `email_verified` integer DEFAULT 0 NOT NULL, - `pronouns` text, - `verified` integer DEFAULT 0 NOT NULL, - `bio` text DEFAULT 'No bio set' NOT NULL, - `date_joined` text NOT NULL, - `is_supporter` integer DEFAULT false NOT NULL, - `supporter_expires_at` text, - `is_banned` integer DEFAULT false NOT NULL, - `is_contributor` integer DEFAULT false NOT NULL, - `role_flags` integer DEFAULT 1 NOT NULL, - `self_assignable_role_flags` integer DEFAULT 0 NOT NULL -); ---> statement-breakpoint -CREATE TABLE `authSession` ( - `id` text NOT NULL, - `user_id` text NOT NULL, - `expires_at` text NOT NULL, - `user_agent` text NOT NULL, - `country_code` text NOT NULL, - `ip_address` text NOT NULL, - FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade -); ---> statement-breakpoint -CREATE TABLE `emailVerificationToken` ( - `id` text NOT NULL, - `user_id` text NOT NULL, - `token` text NOT NULL, - `expires_at` text NOT NULL, - FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade -); ---> statement-breakpoint -CREATE TABLE `passwordResetToken` ( - `id` text NOT NULL, - `user_id` text NOT NULL, - `token` text NOT NULL, - `expires_at` text NOT NULL, - FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade -); ---> statement-breakpoint -CREATE TABLE `userCollection` ( - `id` text NOT NULL, - `name` text NOT NULL, - `description` text NOT NULL, - `user_id` text NOT NULL, - `date_created` text NOT NULL, - `is_public` integer DEFAULT false NOT NULL, - FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade -); ---> statement-breakpoint -CREATE TABLE `userCollectionAsset` ( - `collection_id` text NOT NULL, - `asset_id` integer NOT NULL, - `date_added` text NOT NULL, - FOREIGN KEY (`collection_id`) REFERENCES `userCollection`(`id`) ON UPDATE cascade ON DELETE cascade, - FOREIGN KEY (`asset_id`) REFERENCES `asset`(`id`) ON UPDATE cascade ON DELETE cascade -); ---> statement-breakpoint -CREATE TABLE `socialsConnection` ( - `id` text NOT NULL, - `user_id` text NOT NULL, - `discord_id` text, - FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade -); ---> statement-breakpoint -CREATE TABLE `userFavorite` ( - `id` text NOT NULL, - `user_id` text NOT NULL, - `is_public` integer DEFAULT false NOT NULL, - FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade -); ---> statement-breakpoint -CREATE TABLE `userFavoriteAsset` ( - `id` text NOT NULL, - `favorited_assets_id` text NOT NULL, - `asset_id` integer NOT NULL, - FOREIGN KEY (`favorited_assets_id`) REFERENCES `userFavorite`(`id`) ON UPDATE cascade ON DELETE cascade, - FOREIGN KEY (`asset_id`) REFERENCES `asset`(`id`) ON UPDATE cascade ON DELETE cascade -); ---> statement-breakpoint -CREATE TABLE `userFollowing` ( - `followerId` text NOT NULL, - `followingId` text NOT NULL, - `createdAt` text NOT NULL, - FOREIGN KEY (`followerId`) REFERENCES `authUser`(`id`) ON UPDATE no action ON DELETE no action, - FOREIGN KEY (`followingId`) REFERENCES `authUser`(`id`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -CREATE TABLE `userCollectionLikes` ( - `collection_id` text NOT NULL, - `liked_by_id` text NOT NULL, - `createdAt` text NOT NULL, - FOREIGN KEY (`collection_id`) REFERENCES `userCollection`(`id`) ON UPDATE no action ON DELETE no action, - FOREIGN KEY (`liked_by_id`) REFERENCES `authUser`(`id`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -CREATE INDEX `assets_id_idx` ON `asset` (`id`);--> statement-breakpoint -CREATE INDEX `assets_name_idx` ON `asset` (`name`);--> statement-breakpoint -CREATE INDEX `assets_game_name_idx` ON `asset` (`game`);--> statement-breakpoint -CREATE INDEX `assets_asset_category_name_idx` ON `asset` (`asset_category`);--> statement-breakpoint -CREATE INDEX `assets_uploaded_by_id_idx` ON `asset` (`uploaded_by_id`);--> statement-breakpoint -CREATE UNIQUE INDEX `atlas_id_unique` ON `atlas` (`id`);--> statement-breakpoint -CREATE INDEX `atlas_id_idx` ON `atlas` (`id`);--> statement-breakpoint -CREATE INDEX `atlas_uploaded_by_idx` ON `atlas` (`uploaded_by`);--> statement-breakpoint -CREATE INDEX `atlas_uploaded_by_name_idx` ON `atlas` (`uploaded_by_name`);--> statement-breakpoint -CREATE INDEX `atlas_to_assets_id_idx` ON `atlasToAsset` (`id`);--> statement-breakpoint -CREATE INDEX `atlas_to_assets_atlas_id_idx` ON `atlasToAsset` (`atlas_id`);--> statement-breakpoint -CREATE INDEX `atlas_to_assets_asset_id_idx` ON `atlasToAsset` (`asset_id`);--> statement-breakpoint -CREATE INDEX `assetlikes_asset_idx` ON `assetLikes` (`asset_id`);--> statement-breakpoint -CREATE INDEX `assetlikes_likedBy_idx` ON `assetLikes` (`liked_by_id`);--> statement-breakpoint -CREATE UNIQUE INDEX `assetCategory_id_unique` ON `assetCategory` (`id`);--> statement-breakpoint -CREATE UNIQUE INDEX `assetCategory_name_unique` ON `assetCategory` (`name`);--> statement-breakpoint -CREATE INDEX `asset_category_id_idx` ON `assetCategory` (`id`);--> statement-breakpoint -CREATE INDEX `asset_category_name_idx` ON `assetCategory` (`name`);--> statement-breakpoint -CREATE INDEX `game_asset_category_game_id_idx` ON `gameAssetCategory` (`game_id`);--> statement-breakpoint -CREATE INDEX `game_asset_category_asset_category_id_idx` ON `gameAssetCategory` (`asset_category_id`);--> statement-breakpoint -CREATE INDEX `assetCategoryLikes_asset_idx` ON `assetCategoryLikes` (`asset_id`);--> statement-breakpoint -CREATE INDEX `assetCategoryLikes_likedby_idx` ON `assetCategoryLikes` (`liked_by_id`);--> statement-breakpoint -CREATE UNIQUE INDEX `game_id_unique` ON `game` (`id`);--> statement-breakpoint -CREATE UNIQUE INDEX `game_name_unique` ON `game` (`name`);--> statement-breakpoint -CREATE INDEX `game_id_idx` ON `game` (`id`);--> statement-breakpoint -CREATE INDEX `game_name_idx` ON `game` (`name`);--> statement-breakpoint -CREATE INDEX `gamelikes_game_idx` ON `gameLikes` (`asset_id`);--> statement-breakpoint -CREATE INDEX `gamelikes_likedby_idx` ON `gameLikes` (`liked_by_id`);--> statement-breakpoint -CREATE UNIQUE INDEX `assetTag_id_unique` ON `assetTag` (`id`);--> statement-breakpoint -CREATE UNIQUE INDEX `assetTag_name_unique` ON `assetTag` (`name`);--> statement-breakpoint -CREATE INDEX `asset_tag_id_idx` ON `assetTag` (`id`);--> statement-breakpoint -CREATE INDEX `asset_tag_name_idx` ON `assetTag` (`name`);--> statement-breakpoint -CREATE INDEX `asset_tags_assets_asset_tag_id_idx` ON `assetTagAsset` (`asset_tag_id`);--> statement-breakpoint -CREATE INDEX `asset_tags_assets_asset_id_idx` ON `assetTagAsset` (`asset_id`);--> statement-breakpoint -CREATE INDEX `assetTagLikes_asset_idx` ON `assetTagLikes` (`asset_id`);--> statement-breakpoint -CREATE INDEX `assetTagLikes_likedby_idx` ON `assetTagLikes` (`liked_by_id`);--> statement-breakpoint -CREATE UNIQUE INDEX `savedOcGenerators_id_unique` ON `savedOcGenerators` (`id`);--> statement-breakpoint -CREATE INDEX `saved_oc_generators_id_idx` ON `savedOcGenerators` (`id`);--> statement-breakpoint -CREATE INDEX `saved_oc_generators_user_id_idx` ON `savedOcGenerators` (`user_id`);--> statement-breakpoint -CREATE UNIQUE INDEX `authCredentials_id_unique` ON `authCredentials` (`id`);--> statement-breakpoint -CREATE INDEX `key_user_id_idx` ON `authCredentials` (`user_id`);--> statement-breakpoint -CREATE UNIQUE INDEX `authUser_id_unique` ON `authUser` (`id`);--> statement-breakpoint -CREATE UNIQUE INDEX `authUser_username_unique` ON `authUser` (`username`);--> statement-breakpoint -CREATE INDEX `user_id_idx` ON `authUser` (`id`);--> statement-breakpoint -CREATE INDEX `user_username_idx` ON `authUser` (`username`);--> statement-breakpoint -CREATE INDEX `user_email_idx` ON `authUser` (`email`);--> statement-breakpoint -CREATE UNIQUE INDEX `authSession_id_unique` ON `authSession` (`id`);--> statement-breakpoint -CREATE INDEX `session_user_id_idx` ON `authSession` (`user_id`);--> statement-breakpoint -CREATE UNIQUE INDEX `emailVerificationToken_id_unique` ON `emailVerificationToken` (`id`);--> statement-breakpoint -CREATE INDEX `email_verification_token_user_id_idx` ON `emailVerificationToken` (`user_id`);--> statement-breakpoint -CREATE INDEX `email_verification_token_token_idx` ON `emailVerificationToken` (`token`);--> statement-breakpoint -CREATE UNIQUE INDEX `passwordResetToken_id_unique` ON `passwordResetToken` (`id`);--> statement-breakpoint -CREATE INDEX `password_reset_token_user_id_idx` ON `passwordResetToken` (`user_id`);--> statement-breakpoint -CREATE INDEX `password_reset_token_token_idx` ON `passwordResetToken` (`token`);--> statement-breakpoint -CREATE UNIQUE INDEX `userCollection_id_unique` ON `userCollection` (`id`);--> statement-breakpoint -CREATE INDEX `collection_id_idx` ON `userCollection` (`id`);--> statement-breakpoint -CREATE INDEX `user_collection_id_idx` ON `userCollection` (`user_id`);--> statement-breakpoint -CREATE INDEX `collection_assets_collection_id_idx` ON `userCollectionAsset` (`collection_id`);--> statement-breakpoint -CREATE INDEX `collection_assets_asset_id_idx` ON `userCollectionAsset` (`asset_id`);--> statement-breakpoint -CREATE UNIQUE INDEX `socialsConnection_id_unique` ON `socialsConnection` (`id`);--> statement-breakpoint -CREATE UNIQUE INDEX `socialsConnection_user_id_unique` ON `socialsConnection` (`user_id`);--> statement-breakpoint -CREATE INDEX `socials_connection_user_id_idx` ON `socialsConnection` (`user_id`);--> statement-breakpoint -CREATE INDEX `socials_connection_discord_id_idx` ON `socialsConnection` (`discord_id`);--> statement-breakpoint -CREATE UNIQUE INDEX `userFavorite_id_unique` ON `userFavorite` (`id`);--> statement-breakpoint -CREATE INDEX `favorited_assets_id_idx` ON `userFavorite` (`id`);--> statement-breakpoint -CREATE INDEX `favorited_assets_user_id_idx` ON `userFavorite` (`user_id`);--> statement-breakpoint -CREATE UNIQUE INDEX `userFavoriteAsset_id_unique` ON `userFavoriteAsset` (`id`);--> statement-breakpoint -CREATE INDEX `favorited_assets_assets_id_idx` ON `userFavoriteAsset` (`id`);--> statement-breakpoint -CREATE INDEX `favorited_assets_assets_user_id_idx` ON `userFavoriteAsset` (`favorited_assets_id`);--> statement-breakpoint -CREATE INDEX `favorited_assets_assets_asset_id_idx` ON `userFavoriteAsset` (`asset_id`);--> statement-breakpoint -CREATE INDEX `userfollowing_follower_idx` ON `userFollowing` (`followerId`);--> statement-breakpoint -CREATE INDEX `userfollowing_following_idx` ON `userFollowing` (`followingId`);--> statement-breakpoint -CREATE INDEX `userCollectionNetworking_collection_idx` ON `userCollectionLikes` (`collection_id`);--> statement-breakpoint -CREATE INDEX `userCollectionNetworking_likedBy_idx` ON `userCollectionLikes` (`liked_by_id`); \ No newline at end of file diff --git a/src/v2/db/migrations/meta/0000_snapshot.json b/src/v2/db/migrations/meta/0000_snapshot.json deleted file mode 100644 index dd26507..0000000 --- a/src/v2/db/migrations/meta/0000_snapshot.json +++ /dev/null @@ -1,1866 +0,0 @@ -{ - "version": "5", - "dialect": "sqlite", - "id": "4e15e680-994c-46e6-9f65-96ae2c88ed95", - "prevId": "00000000-0000-0000-0000-000000000000", - "tables": { - "asset": { - "name": "asset", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "extension": { - "name": "extension", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "game": { - "name": "game", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_category": { - "name": "asset_category", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by_id": { - "name": "uploaded_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by_name": { - "name": "uploaded_by_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "url": { - "name": "url", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "status": { - "name": "status", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "'pending'" - }, - "uploaded_date": { - "name": "uploaded_date", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_is_optimized": { - "name": "asset_is_optimized", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "asset_is_suggestive": { - "name": "asset_is_suggestive", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "view_count": { - "name": "view_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "download_count": { - "name": "download_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "file_size": { - "name": "file_size", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "width": { - "name": "width", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "height": { - "name": "height", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "assets_id_idx": { - "name": "assets_id_idx", - "columns": ["id"], - "isUnique": false - }, - "assets_name_idx": { - "name": "assets_name_idx", - "columns": ["name"], - "isUnique": false - }, - "assets_game_name_idx": { - "name": "assets_game_name_idx", - "columns": ["game"], - "isUnique": false - }, - "assets_asset_category_name_idx": { - "name": "assets_asset_category_name_idx", - "columns": ["asset_category"], - "isUnique": false - }, - "assets_uploaded_by_id_idx": { - "name": "assets_uploaded_by_id_idx", - "columns": ["uploaded_by_id"], - "isUnique": false - } - }, - "foreignKeys": { - "asset_game_game_id_fk": { - "name": "asset_game_game_id_fk", - "tableFrom": "asset", - "tableTo": "game", - "columnsFrom": ["game"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "asset_asset_category_assetCategory_id_fk": { - "name": "asset_asset_category_assetCategory_id_fk", - "tableFrom": "asset", - "tableTo": "assetCategory", - "columnsFrom": ["asset_category"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "asset_uploaded_by_id_authUser_id_fk": { - "name": "asset_uploaded_by_id_authUser_id_fk", - "tableFrom": "asset", - "tableTo": "authUser", - "columnsFrom": ["uploaded_by_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "asset_uploaded_by_name_authUser_username_fk": { - "name": "asset_uploaded_by_name_authUser_username_fk", - "tableFrom": "asset", - "tableTo": "authUser", - "columnsFrom": ["uploaded_by_name"], - "columnsTo": ["username"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "atlas": { - "name": "atlas", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "url": { - "name": "url", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by": { - "name": "uploaded_by", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by_name": { - "name": "uploaded_by_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_date": { - "name": "uploaded_date", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "file_size": { - "name": "file_size", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "atlas_id_unique": { - "name": "atlas_id_unique", - "columns": ["id"], - "isUnique": true - }, - "atlas_id_idx": { - "name": "atlas_id_idx", - "columns": ["id"], - "isUnique": false - }, - "atlas_uploaded_by_idx": { - "name": "atlas_uploaded_by_idx", - "columns": ["uploaded_by"], - "isUnique": false - }, - "atlas_uploaded_by_name_idx": { - "name": "atlas_uploaded_by_name_idx", - "columns": ["uploaded_by_name"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "atlasToAsset": { - "name": "atlasToAsset", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "atlas_id": { - "name": "atlas_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "atlas_to_assets_id_idx": { - "name": "atlas_to_assets_id_idx", - "columns": ["id"], - "isUnique": false - }, - "atlas_to_assets_atlas_id_idx": { - "name": "atlas_to_assets_atlas_id_idx", - "columns": ["atlas_id"], - "isUnique": false - }, - "atlas_to_assets_asset_id_idx": { - "name": "atlas_to_assets_asset_id_idx", - "columns": ["asset_id"], - "isUnique": false - } - }, - "foreignKeys": { - "atlasToAsset_atlas_id_atlas_id_fk": { - "name": "atlasToAsset_atlas_id_atlas_id_fk", - "tableFrom": "atlasToAsset", - "tableTo": "atlas", - "columnsFrom": ["atlas_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "atlasToAsset_asset_id_asset_id_fk": { - "name": "atlasToAsset_asset_id_asset_id_fk", - "tableFrom": "atlasToAsset", - "tableTo": "asset", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetLikes": { - "name": "assetLikes", - "columns": { - "asset_id": { - "name": "asset_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetlikes_asset_idx": { - "name": "assetlikes_asset_idx", - "columns": ["asset_id"], - "isUnique": false - }, - "assetlikes_likedBy_idx": { - "name": "assetlikes_likedBy_idx", - "columns": ["liked_by_id"], - "isUnique": false - } - }, - "foreignKeys": { - "assetLikes_asset_id_asset_id_fk": { - "name": "assetLikes_asset_id_asset_id_fk", - "tableFrom": "assetLikes", - "tableTo": "asset", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - }, - "assetLikes_liked_by_id_authUser_id_fk": { - "name": "assetLikes_liked_by_id_authUser_id_fk", - "tableFrom": "assetLikes", - "tableTo": "authUser", - "columnsFrom": ["liked_by_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetCategory": { - "name": "assetCategory", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetCategory_id_unique": { - "name": "assetCategory_id_unique", - "columns": ["id"], - "isUnique": true - }, - "assetCategory_name_unique": { - "name": "assetCategory_name_unique", - "columns": ["name"], - "isUnique": true - }, - "asset_category_id_idx": { - "name": "asset_category_id_idx", - "columns": ["id"], - "isUnique": false - }, - "asset_category_name_idx": { - "name": "asset_category_name_idx", - "columns": ["name"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "gameAssetCategory": { - "name": "gameAssetCategory", - "columns": { - "game_id": { - "name": "game_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_category_id": { - "name": "asset_category_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "game_asset_category_game_id_idx": { - "name": "game_asset_category_game_id_idx", - "columns": ["game_id"], - "isUnique": false - }, - "game_asset_category_asset_category_id_idx": { - "name": "game_asset_category_asset_category_id_idx", - "columns": ["asset_category_id"], - "isUnique": false - } - }, - "foreignKeys": { - "gameAssetCategory_game_id_game_id_fk": { - "name": "gameAssetCategory_game_id_game_id_fk", - "tableFrom": "gameAssetCategory", - "tableTo": "game", - "columnsFrom": ["game_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "gameAssetCategory_asset_category_id_assetCategory_id_fk": { - "name": "gameAssetCategory_asset_category_id_assetCategory_id_fk", - "tableFrom": "gameAssetCategory", - "tableTo": "assetCategory", - "columnsFrom": ["asset_category_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetCategoryLikes": { - "name": "assetCategoryLikes", - "columns": { - "asset_id": { - "name": "asset_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetCategoryLikes_asset_idx": { - "name": "assetCategoryLikes_asset_idx", - "columns": ["asset_id"], - "isUnique": false - }, - "assetCategoryLikes_likedby_idx": { - "name": "assetCategoryLikes_likedby_idx", - "columns": ["liked_by_id"], - "isUnique": false - } - }, - "foreignKeys": { - "assetCategoryLikes_asset_id_assetCategory_id_fk": { - "name": "assetCategoryLikes_asset_id_assetCategory_id_fk", - "tableFrom": "assetCategoryLikes", - "tableTo": "assetCategory", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - }, - "assetCategoryLikes_liked_by_id_authUser_id_fk": { - "name": "assetCategoryLikes_liked_by_id_authUser_id_fk", - "tableFrom": "assetCategoryLikes", - "tableTo": "authUser", - "columnsFrom": ["liked_by_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "game": { - "name": "game", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - }, - "possible_suggestive_content": { - "name": "possible_suggestive_content", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "game_id_unique": { - "name": "game_id_unique", - "columns": ["id"], - "isUnique": true - }, - "game_name_unique": { - "name": "game_name_unique", - "columns": ["name"], - "isUnique": true - }, - "game_id_idx": { - "name": "game_id_idx", - "columns": ["id"], - "isUnique": false - }, - "game_name_idx": { - "name": "game_name_idx", - "columns": ["name"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "gameLikes": { - "name": "gameLikes", - "columns": { - "asset_id": { - "name": "asset_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "gamelikes_game_idx": { - "name": "gamelikes_game_idx", - "columns": ["asset_id"], - "isUnique": false - }, - "gamelikes_likedby_idx": { - "name": "gamelikes_likedby_idx", - "columns": ["liked_by_id"], - "isUnique": false - } - }, - "foreignKeys": { - "gameLikes_asset_id_game_id_fk": { - "name": "gameLikes_asset_id_game_id_fk", - "tableFrom": "gameLikes", - "tableTo": "game", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - }, - "gameLikes_liked_by_id_authUser_id_fk": { - "name": "gameLikes_liked_by_id_authUser_id_fk", - "tableFrom": "gameLikes", - "tableTo": "authUser", - "columnsFrom": ["liked_by_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetTag": { - "name": "assetTag", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetTag_id_unique": { - "name": "assetTag_id_unique", - "columns": ["id"], - "isUnique": true - }, - "assetTag_name_unique": { - "name": "assetTag_name_unique", - "columns": ["name"], - "isUnique": true - }, - "asset_tag_id_idx": { - "name": "asset_tag_id_idx", - "columns": ["id"], - "isUnique": false - }, - "asset_tag_name_idx": { - "name": "asset_tag_name_idx", - "columns": ["name"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetTagAsset": { - "name": "assetTagAsset", - "columns": { - "asset_tag_id": { - "name": "asset_tag_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "asset_tags_assets_asset_tag_id_idx": { - "name": "asset_tags_assets_asset_tag_id_idx", - "columns": ["asset_tag_id"], - "isUnique": false - }, - "asset_tags_assets_asset_id_idx": { - "name": "asset_tags_assets_asset_id_idx", - "columns": ["asset_id"], - "isUnique": false - } - }, - "foreignKeys": { - "assetTagAsset_asset_tag_id_assetTag_id_fk": { - "name": "assetTagAsset_asset_tag_id_assetTag_id_fk", - "tableFrom": "assetTagAsset", - "tableTo": "assetTag", - "columnsFrom": ["asset_tag_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "assetTagAsset_asset_id_asset_id_fk": { - "name": "assetTagAsset_asset_id_asset_id_fk", - "tableFrom": "assetTagAsset", - "tableTo": "asset", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetTagLikes": { - "name": "assetTagLikes", - "columns": { - "asset_id": { - "name": "asset_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetTagLikes_asset_idx": { - "name": "assetTagLikes_asset_idx", - "columns": ["asset_id"], - "isUnique": false - }, - "assetTagLikes_likedby_idx": { - "name": "assetTagLikes_likedby_idx", - "columns": ["liked_by_id"], - "isUnique": false - } - }, - "foreignKeys": { - "assetTagLikes_asset_id_assetTag_id_fk": { - "name": "assetTagLikes_asset_id_assetTag_id_fk", - "tableFrom": "assetTagLikes", - "tableTo": "assetTag", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - }, - "assetTagLikes_liked_by_id_authUser_id_fk": { - "name": "assetTagLikes_liked_by_id_authUser_id_fk", - "tableFrom": "assetTagLikes", - "tableTo": "authUser", - "columnsFrom": ["liked_by_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "savedOcGenerators": { - "name": "savedOcGenerators", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "game": { - "name": "game", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "date_created": { - "name": "date_created", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "content": { - "name": "content", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "saved_color_palette": { - "name": "saved_color_palette", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "sakura_url": { - "name": "sakura_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "savedOcGenerators_id_unique": { - "name": "savedOcGenerators_id_unique", - "columns": ["id"], - "isUnique": true - }, - "saved_oc_generators_id_idx": { - "name": "saved_oc_generators_id_idx", - "columns": ["id"], - "isUnique": false - }, - "saved_oc_generators_user_id_idx": { - "name": "saved_oc_generators_user_id_idx", - "columns": ["user_id"], - "isUnique": false - } - }, - "foreignKeys": { - "savedOcGenerators_user_id_authUser_id_fk": { - "name": "savedOcGenerators_user_id_authUser_id_fk", - "tableFrom": "savedOcGenerators", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "authCredentials": { - "name": "authCredentials", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "hashed_password": { - "name": "hashed_password", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "authCredentials_id_unique": { - "name": "authCredentials_id_unique", - "columns": ["id"], - "isUnique": true - }, - "key_user_id_idx": { - "name": "key_user_id_idx", - "columns": ["user_id"], - "isUnique": false - } - }, - "foreignKeys": { - "authCredentials_user_id_authUser_id_fk": { - "name": "authCredentials_user_id_authUser_id_fk", - "tableFrom": "authCredentials", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "authUser": { - "name": "authUser", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "avatar_url": { - "name": "avatar_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "banner_url": { - "name": "banner_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "display_name": { - "name": "display_name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "username": { - "name": "username", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "username_colour": { - "name": "username_colour", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "email": { - "name": "email", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "email_verified": { - "name": "email_verified", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "pronouns": { - "name": "pronouns", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "verified": { - "name": "verified", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "bio": { - "name": "bio", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "'No bio set'" - }, - "date_joined": { - "name": "date_joined", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_supporter": { - "name": "is_supporter", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "supporter_expires_at": { - "name": "supporter_expires_at", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "is_banned": { - "name": "is_banned", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "is_contributor": { - "name": "is_contributor", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "role_flags": { - "name": "role_flags", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 1 - }, - "self_assignable_role_flags": { - "name": "self_assignable_role_flags", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "authUser_id_unique": { - "name": "authUser_id_unique", - "columns": ["id"], - "isUnique": true - }, - "authUser_username_unique": { - "name": "authUser_username_unique", - "columns": ["username"], - "isUnique": true - }, - "user_id_idx": { - "name": "user_id_idx", - "columns": ["id"], - "isUnique": false - }, - "user_username_idx": { - "name": "user_username_idx", - "columns": ["username"], - "isUnique": false - }, - "user_email_idx": { - "name": "user_email_idx", - "columns": ["email"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "authSession": { - "name": "authSession", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_agent": { - "name": "user_agent", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "country_code": { - "name": "country_code", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "ip_address": { - "name": "ip_address", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "authSession_id_unique": { - "name": "authSession_id_unique", - "columns": ["id"], - "isUnique": true - }, - "session_user_id_idx": { - "name": "session_user_id_idx", - "columns": ["user_id"], - "isUnique": false - } - }, - "foreignKeys": { - "authSession_user_id_authUser_id_fk": { - "name": "authSession_user_id_authUser_id_fk", - "tableFrom": "authSession", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "emailVerificationToken": { - "name": "emailVerificationToken", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "emailVerificationToken_id_unique": { - "name": "emailVerificationToken_id_unique", - "columns": ["id"], - "isUnique": true - }, - "email_verification_token_user_id_idx": { - "name": "email_verification_token_user_id_idx", - "columns": ["user_id"], - "isUnique": false - }, - "email_verification_token_token_idx": { - "name": "email_verification_token_token_idx", - "columns": ["token"], - "isUnique": false - } - }, - "foreignKeys": { - "emailVerificationToken_user_id_authUser_id_fk": { - "name": "emailVerificationToken_user_id_authUser_id_fk", - "tableFrom": "emailVerificationToken", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "passwordResetToken": { - "name": "passwordResetToken", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "passwordResetToken_id_unique": { - "name": "passwordResetToken_id_unique", - "columns": ["id"], - "isUnique": true - }, - "password_reset_token_user_id_idx": { - "name": "password_reset_token_user_id_idx", - "columns": ["user_id"], - "isUnique": false - }, - "password_reset_token_token_idx": { - "name": "password_reset_token_token_idx", - "columns": ["token"], - "isUnique": false - } - }, - "foreignKeys": { - "passwordResetToken_user_id_authUser_id_fk": { - "name": "passwordResetToken_user_id_authUser_id_fk", - "tableFrom": "passwordResetToken", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userCollection": { - "name": "userCollection", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "date_created": { - "name": "date_created", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - } - }, - "indexes": { - "userCollection_id_unique": { - "name": "userCollection_id_unique", - "columns": ["id"], - "isUnique": true - }, - "collection_id_idx": { - "name": "collection_id_idx", - "columns": ["id"], - "isUnique": false - }, - "user_collection_id_idx": { - "name": "user_collection_id_idx", - "columns": ["user_id"], - "isUnique": false - } - }, - "foreignKeys": { - "userCollection_user_id_authUser_id_fk": { - "name": "userCollection_user_id_authUser_id_fk", - "tableFrom": "userCollection", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userCollectionAsset": { - "name": "userCollectionAsset", - "columns": { - "collection_id": { - "name": "collection_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "date_added": { - "name": "date_added", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "collection_assets_collection_id_idx": { - "name": "collection_assets_collection_id_idx", - "columns": ["collection_id"], - "isUnique": false - }, - "collection_assets_asset_id_idx": { - "name": "collection_assets_asset_id_idx", - "columns": ["asset_id"], - "isUnique": false - } - }, - "foreignKeys": { - "userCollectionAsset_collection_id_userCollection_id_fk": { - "name": "userCollectionAsset_collection_id_userCollection_id_fk", - "tableFrom": "userCollectionAsset", - "tableTo": "userCollection", - "columnsFrom": ["collection_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "userCollectionAsset_asset_id_asset_id_fk": { - "name": "userCollectionAsset_asset_id_asset_id_fk", - "tableFrom": "userCollectionAsset", - "tableTo": "asset", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "socialsConnection": { - "name": "socialsConnection", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "discord_id": { - "name": "discord_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "socialsConnection_id_unique": { - "name": "socialsConnection_id_unique", - "columns": ["id"], - "isUnique": true - }, - "socialsConnection_user_id_unique": { - "name": "socialsConnection_user_id_unique", - "columns": ["user_id"], - "isUnique": true - }, - "socials_connection_user_id_idx": { - "name": "socials_connection_user_id_idx", - "columns": ["user_id"], - "isUnique": false - }, - "socials_connection_discord_id_idx": { - "name": "socials_connection_discord_id_idx", - "columns": ["discord_id"], - "isUnique": false - } - }, - "foreignKeys": { - "socialsConnection_user_id_authUser_id_fk": { - "name": "socialsConnection_user_id_authUser_id_fk", - "tableFrom": "socialsConnection", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userFavorite": { - "name": "userFavorite", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - } - }, - "indexes": { - "userFavorite_id_unique": { - "name": "userFavorite_id_unique", - "columns": ["id"], - "isUnique": true - }, - "favorited_assets_id_idx": { - "name": "favorited_assets_id_idx", - "columns": ["id"], - "isUnique": false - }, - "favorited_assets_user_id_idx": { - "name": "favorited_assets_user_id_idx", - "columns": ["user_id"], - "isUnique": false - } - }, - "foreignKeys": { - "userFavorite_user_id_authUser_id_fk": { - "name": "userFavorite_user_id_authUser_id_fk", - "tableFrom": "userFavorite", - "tableTo": "authUser", - "columnsFrom": ["user_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userFavoriteAsset": { - "name": "userFavoriteAsset", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "favorited_assets_id": { - "name": "favorited_assets_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "userFavoriteAsset_id_unique": { - "name": "userFavoriteAsset_id_unique", - "columns": ["id"], - "isUnique": true - }, - "favorited_assets_assets_id_idx": { - "name": "favorited_assets_assets_id_idx", - "columns": ["id"], - "isUnique": false - }, - "favorited_assets_assets_user_id_idx": { - "name": "favorited_assets_assets_user_id_idx", - "columns": ["favorited_assets_id"], - "isUnique": false - }, - "favorited_assets_assets_asset_id_idx": { - "name": "favorited_assets_assets_asset_id_idx", - "columns": ["asset_id"], - "isUnique": false - } - }, - "foreignKeys": { - "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk": { - "name": "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk", - "tableFrom": "userFavoriteAsset", - "tableTo": "userFavorite", - "columnsFrom": ["favorited_assets_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "userFavoriteAsset_asset_id_asset_id_fk": { - "name": "userFavoriteAsset_asset_id_asset_id_fk", - "tableFrom": "userFavoriteAsset", - "tableTo": "asset", - "columnsFrom": ["asset_id"], - "columnsTo": ["id"], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userFollowing": { - "name": "userFollowing", - "columns": { - "followerId": { - "name": "followerId", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "followingId": { - "name": "followingId", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "userfollowing_follower_idx": { - "name": "userfollowing_follower_idx", - "columns": ["followerId"], - "isUnique": false - }, - "userfollowing_following_idx": { - "name": "userfollowing_following_idx", - "columns": ["followingId"], - "isUnique": false - } - }, - "foreignKeys": { - "userFollowing_followerId_authUser_id_fk": { - "name": "userFollowing_followerId_authUser_id_fk", - "tableFrom": "userFollowing", - "tableTo": "authUser", - "columnsFrom": ["followerId"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - }, - "userFollowing_followingId_authUser_id_fk": { - "name": "userFollowing_followingId_authUser_id_fk", - "tableFrom": "userFollowing", - "tableTo": "authUser", - "columnsFrom": ["followingId"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userCollectionLikes": { - "name": "userCollectionLikes", - "columns": { - "collection_id": { - "name": "collection_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "userCollectionNetworking_collection_idx": { - "name": "userCollectionNetworking_collection_idx", - "columns": ["collection_id"], - "isUnique": false - }, - "userCollectionNetworking_likedBy_idx": { - "name": "userCollectionNetworking_likedBy_idx", - "columns": ["liked_by_id"], - "isUnique": false - } - }, - "foreignKeys": { - "userCollectionLikes_collection_id_userCollection_id_fk": { - "name": "userCollectionLikes_collection_id_userCollection_id_fk", - "tableFrom": "userCollectionLikes", - "tableTo": "userCollection", - "columnsFrom": ["collection_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - }, - "userCollectionLikes_liked_by_id_authUser_id_fk": { - "name": "userCollectionLikes_liked_by_id_authUser_id_fk", - "tableFrom": "userCollectionLikes", - "tableTo": "authUser", - "columnsFrom": ["liked_by_id"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - } - }, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - } -} diff --git a/src/v2/db/migrations/meta/_journal.json b/src/v2/db/migrations/meta/_journal.json deleted file mode 100644 index 092241a..0000000 --- a/src/v2/db/migrations/meta/_journal.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "version": "5", - "dialect": "sqlite", - "entries": [ - { - "idx": 0, - "version": "5", - "when": 1702501143402, - "tag": "0000_red_star_brand", - "breakpoints": true - } - ] -} diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index 1dd19df..66813cb 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -20,3 +20,4 @@ export * from "./schema/user/user-connections" export * from "./schema/user/user-favorites" export * from "./schema/user/user-following" export * from "./schema/collections/user-collection-likes" +export * from "./schema/collections/user-collections-collaborators" diff --git a/src/v2/db/schema/collections/user-collections-collaborators.ts b/src/v2/db/schema/collections/user-collections-collaborators.ts new file mode 100644 index 0000000..4318a09 --- /dev/null +++ b/src/v2/db/schema/collections/user-collections-collaborators.ts @@ -0,0 +1,58 @@ +import { tableNames } from "@/v2/db/drizzle" +import { relations } from "drizzle-orm" +import { + sqliteTable, + text, + // uniqueIndex, + index, +} from "drizzle-orm/sqlite-core" +import { authUser } from "../user/user" +import { userCollection } from "./user-collections" + +export const userCollectionCollaborators = sqliteTable( + tableNames.userCollectionCollaborators, + { + collectionId: text("collection_id") + .notNull() + .references(() => userCollection.id), + collaboratorId: text("liked_by_id") + .notNull() + .references(() => authUser.id), + createdAt: text("createdAt") + .notNull() + .$defaultFn(() => { + return new Date().toISOString() + }), + }, + (userCollectionCollaborators) => { + return { + collectionIdx: index( + "userCollectionCollaborators_collectionId_idx" + ).on(userCollectionCollaborators.collectionId), + collaboratorId: index( + "userCollectionCollaborators_collaboratorId_idx" + ).on(userCollectionCollaborators.collaboratorId), + } + } +) + +export type UserCollectionCollaborators = + typeof userCollectionCollaborators.$inferSelect +export type NewUserCollectionCollaborators = + typeof userCollectionCollaborators.$inferInsert + +export const userCollectionCollaboratorsRelations = relations( + userCollectionCollaborators, + ({ one }) => ({ + collection: one(userCollection, { + fields: [userCollectionCollaborators.collectionId], + references: [userCollection.id], + relationName: "userCollectionCollaborators_collection_id", + }), + collaborator: one(authUser, { + fields: [userCollectionCollaborators.collaboratorId], + references: [authUser.id], + relationName: "userCollectionCollaborators_collaborator_id", + }), + }) +) diff --git a/src/v2/db/schema/collections/user-collections.ts b/src/v2/db/schema/collections/user-collections.ts index 8099e25..70bffa6 100644 --- a/src/v2/db/schema/collections/user-collections.ts +++ b/src/v2/db/schema/collections/user-collections.ts @@ -11,6 +11,8 @@ import { authUser } from "../user/user" import { asset } from "../asset/asset" import { generateID } from "@/v2/lib/oslo" import { userCollectionLikes } from "./user-collection-likes" +import { userCollectionCollaborators } from "./user-collections-collaborators" + /* NOTE: this file is where users store their collections of assets. - UserCollection is the collection itself, which has a name, description, and whether it's public or not. @@ -101,7 +103,8 @@ export const collectionRelations = relations( relationName: "collection_auth_user", }), assets: many(userCollectionAsset), - collectionNetworking: many(userCollectionLikes), + userCollectionLikes: many(userCollectionLikes), + userCollectionCollaborators: many(userCollectionCollaborators), }) ) diff --git a/src/v2/db/schema/user/user.ts b/src/v2/db/schema/user/user.ts index 9ba3b67..9500e0a 100644 --- a/src/v2/db/schema/user/user.ts +++ b/src/v2/db/schema/user/user.ts @@ -18,6 +18,7 @@ import { passwordResetToken } from "./user-attributes" import { emailVerificationToken } from "./user-attributes" import { atlas } from "../asset/asset-atlas" import { userCollectionLikes } from "../collections/user-collection-likes" +import { userCollectionCollaborators } from "../collections/user-collections-collaborators" import { assetLikes } from "../asset/asset-likes" import { gameLikes } from "../game/game-likes" import { assetTagLikes } from "../tags/asset-tags-likes" @@ -161,6 +162,7 @@ export const usersRelations = relations(authUser, ({ one, many }) => ({ gameLikes: many(gameLikes), assetTagLikes: many(assetTagLikes), assetCategoryLikes: many(assetCategoryLikes), + userCollectionCollaborators: many(userCollectionCollaborators), })) export const authCredentialsRelations = relations( From b2cba0deeeb1de7752c70cc3688171ad9159e1cb Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Sat, 16 Dec 2023 21:28:45 +0000 Subject: [PATCH 192/318] collection collaborators manager --- .../user-collections-collaborators.ts | 2 +- .../collection/collection-collaborators.ts | 94 +++++++++++++++++++ 2 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 src/v2/lib/managers/collection/collection-collaborators.ts diff --git a/src/v2/db/schema/collections/user-collections-collaborators.ts b/src/v2/db/schema/collections/user-collections-collaborators.ts index 4318a09..ce47532 100644 --- a/src/v2/db/schema/collections/user-collections-collaborators.ts +++ b/src/v2/db/schema/collections/user-collections-collaborators.ts @@ -15,7 +15,7 @@ export const userCollectionCollaborators = sqliteTable( collectionId: text("collection_id") .notNull() .references(() => userCollection.id), - collaboratorId: text("liked_by_id") + collaboratorId: text("collaborator_id") .notNull() .references(() => authUser.id), createdAt: text("createdAt") diff --git a/src/v2/lib/managers/collection/collection-collaborators.ts b/src/v2/lib/managers/collection/collection-collaborators.ts new file mode 100644 index 0000000..17e5e74 --- /dev/null +++ b/src/v2/lib/managers/collection/collection-collaborators.ts @@ -0,0 +1,94 @@ +import { DrizzleInstance } from "@/v2/db/turso" +import { and, eq } from "drizzle-orm" +import { userCollectionCollaborators } from "@/v2/db/schema/collections/user-collections-collaborators" +import { authUser } from "@/v2/db/schema/user/user" + +export class UserCollectionCollaboratorsManager { + constructor(private drizzle: DrizzleInstance) {} + + /** + * Adds a collaborator to a collection. + * @param collectionId - The ID of the collection to add a collaborator to. + * @param userId - The ID of the user to add as a collaborator. + */ + public async addCollaborator( + collectionId: string, + userId: string + ): Promise { + try { + await this.drizzle.insert(userCollectionCollaborators).values({ + collectionId, + collaboratorId: userId, + }) + } catch (e) { + console.error( + `Error adding collaborator ${userId} to collection ${collectionId}`, + e + ) + throw new Error( + `Error adding collaborator ${userId} to collection ${collectionId}` + ) + } + } + + /** + * Removes a collaborator from a collection. + * @param collectionId - The ID of the collection to remove a collaborator from. + * @param userId - The ID of the user to remove as a collaborator. + */ + public async removeCollaborator( + collectionId: string, + userId: string + ): Promise { + try { + await this.drizzle + .delete(userCollectionCollaborators) + .where( + and( + eq( + userCollectionCollaborators.collectionId, + collectionId + ), + eq(userCollectionCollaborators.collaboratorId, userId) + ) + ) + } catch (e) { + console.error( + `Error removing collaborator ${userId} from collection ${collectionId}`, + e + ) + throw new Error( + `Error removing collaborator ${userId} from collection ${collectionId}` + ) + } + } + + /** + * Gets the collaborators for a collection. + * @param collectionId - The ID of the collection to get collaborators for. + */ + public async getCollaborators(collectionId: string) { + try { + return await this.drizzle + .select({ + userId: authUser.id, + username: authUser.username, + avatarUrl: authUser.avatarUrl, + collectionId: userCollectionCollaborators.collectionId, + }) + .from(userCollectionCollaborators) + .fullJoin( + authUser, + eq(authUser.id, userCollectionCollaborators.collaboratorId) + ) + } catch (e) { + console.error( + `Error getting collaborators for collection ${collectionId}`, + e + ) + throw new Error( + `Error getting collaborators for collection ${collectionId}` + ) + } + } +} From f7f98ccd700fb0ac0876180bdfec6b4301789cb6 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Sat, 16 Dec 2023 21:56:36 +0000 Subject: [PATCH 193/318] session logout & return 401 --- .gitignore | 3 ++ src/v2/routes/auth/session/all/openapi.ts | 5 ++- src/v2/routes/auth/session/all/route.ts | 12 +++++++ src/v2/routes/auth/session/handler.ts | 2 ++ src/v2/routes/auth/session/logout/openapi.ts | 19 ++++++++++ src/v2/routes/auth/session/logout/route.ts | 36 +++++++++++++++++++ .../routes/auth/session/validate/openapi.ts | 5 ++- src/v2/routes/auth/session/validate/route.ts | 10 ++++++ 8 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 src/v2/routes/auth/session/logout/openapi.ts create mode 100644 src/v2/routes/auth/session/logout/route.ts diff --git a/.gitignore b/.gitignore index c729f04..cae754a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,9 @@ # webstorm .idea +# migrations (temporary) +src/v2/db/migrations + # Wrangler & env .env diff --git a/src/v2/routes/auth/session/all/openapi.ts b/src/v2/routes/auth/session/all/openapi.ts index 7b8f0b4..2620452 100644 --- a/src/v2/routes/auth/session/all/openapi.ts +++ b/src/v2/routes/auth/session/all/openapi.ts @@ -7,7 +7,10 @@ export const authAllCurrentSessions = createRoute({ tags: ["Auth"], responses: { 200: { - description: "All current sessions or null is returned.", + description: "All current sessions are returned", + }, + 401: { + description: "Unauthorized", }, 500: { description: "Internal server error.", diff --git a/src/v2/routes/auth/session/all/route.ts b/src/v2/routes/auth/session/all/route.ts index eb16eaa..b888a6b 100644 --- a/src/v2/routes/auth/session/all/route.ts +++ b/src/v2/routes/auth/session/all/route.ts @@ -7,6 +7,18 @@ const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.openapi(authAllCurrentSessions, async (ctx) => { const authSessionManager = new AuthSessionManager(ctx) + const { user } = await authSessionManager.validateSession() + + if (!user) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + const sessions = await authSessionManager.getAllSessions() return ctx.json( diff --git a/src/v2/routes/auth/session/handler.ts b/src/v2/routes/auth/session/handler.ts index a46f2f5..fa44045 100644 --- a/src/v2/routes/auth/session/handler.ts +++ b/src/v2/routes/auth/session/handler.ts @@ -1,10 +1,12 @@ import { OpenAPIHono } from "@hono/zod-openapi" import GetAllSessionsRoute from "@/v2/routes/auth/session/all/route" import ValidateSessionRoute from "@/v2/routes/auth/session/validate/route" +import LogoutCurrentSessionRoute from "@/v2/routes/auth/session/logout/route" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.route("/all", GetAllSessionsRoute) handler.route("/validate", ValidateSessionRoute) +handler.route("/logout", LogoutCurrentSessionRoute) export default handler diff --git a/src/v2/routes/auth/session/logout/openapi.ts b/src/v2/routes/auth/session/logout/openapi.ts new file mode 100644 index 0000000..9eaeff2 --- /dev/null +++ b/src/v2/routes/auth/session/logout/openapi.ts @@ -0,0 +1,19 @@ +import { createRoute } from "@hono/zod-openapi" + +export const authLogoutRoute = createRoute({ + path: "/", + method: "get", + description: "Logout current session.", + tags: ["Auth"], + responses: { + 200: { + description: "Logout successful.", + }, + 401: { + description: "Unauthorized", + }, + 500: { + description: "Internal server error.", + }, + }, +}) diff --git a/src/v2/routes/auth/session/logout/route.ts b/src/v2/routes/auth/session/logout/route.ts new file mode 100644 index 0000000..fe7e0b3 --- /dev/null +++ b/src/v2/routes/auth/session/logout/route.ts @@ -0,0 +1,36 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { authLogoutRoute } from "./openapi" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +import { deleteCookie } from "hono/cookie" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.openapi(authLogoutRoute, async (ctx) => { + const authSessionManager = new AuthSessionManager(ctx) + + const { user } = await authSessionManager.validateSession() + + if (!user) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + await authSessionManager.invalidateCurrentSession() + + deleteCookie(ctx, "user_auth_session") + + return ctx.json( + { + success: true, + message: "Logout successful.", + }, + 200 + ) +}) + +export default handler diff --git a/src/v2/routes/auth/session/validate/openapi.ts b/src/v2/routes/auth/session/validate/openapi.ts index 8b5584c..a591ba7 100644 --- a/src/v2/routes/auth/session/validate/openapi.ts +++ b/src/v2/routes/auth/session/validate/openapi.ts @@ -7,7 +7,10 @@ export const authValidationRoute = createRoute({ tags: ["Auth"], responses: { 200: { - description: "User information or null is returned.", + description: "User information is returned.", + }, + 401: { + description: "Unauthorized", }, 500: { description: "Internal server error.", diff --git a/src/v2/routes/auth/session/validate/route.ts b/src/v2/routes/auth/session/validate/route.ts index 8db2d7c..66aebb1 100644 --- a/src/v2/routes/auth/session/validate/route.ts +++ b/src/v2/routes/auth/session/validate/route.ts @@ -9,6 +9,16 @@ handler.openapi(authValidationRoute, async (ctx) => { const { user } = await authSessionManager.validateSession() + if (!user) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + return ctx.json( { success: true, From ca8bb50c69e8f5281f8466576074a8bc8f034944 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Sun, 17 Dec 2023 00:45:08 +0000 Subject: [PATCH 194/318] game create & delete routes --- src/scripts/seed/seed.ts | 7 -- .../db/schema/categories/asset-categories.ts | 2 - src/v2/db/schema/game/game.ts | 1 - src/v2/db/schema/tags/asset-tags.ts | 1 - .../asset-category/asset-category-manager.ts | 1 - src/v2/lib/managers/asset/asset-manager.ts | 24 +------ src/v2/lib/managers/game/game-manager.ts | 72 +++++++++++++++++++ src/v2/lib/managers/tag/tag-manager.ts | 1 - src/v2/routes/collection/asset/handler.ts | 0 src/v2/routes/game/create/openapi.ts | 26 +++++++ src/v2/routes/game/create/route.ts | 72 +++++++++++++++++++ src/v2/routes/game/create/schema.ts | 17 +++++ src/v2/routes/game/delete/id/[id]/openapi.ts | 23 ++++++ src/v2/routes/game/delete/id/[id]/route.ts | 36 ++++++++++ src/v2/routes/game/delete/id/[id]/schema.ts | 13 ++++ src/v2/routes/game/handler.ts | 4 ++ 16 files changed, 265 insertions(+), 35 deletions(-) create mode 100644 src/v2/routes/collection/asset/handler.ts diff --git a/src/scripts/seed/seed.ts b/src/scripts/seed/seed.ts index 73effe4..ce5dceb 100644 --- a/src/scripts/seed/seed.ts +++ b/src/scripts/seed/seed.ts @@ -126,21 +126,18 @@ async function main() { id: "official", name: "official", formattedName: "Official", - assetCount: 1, lastUpdated: new Date().toISOString(), }, { id: "1.0", name: "1.0", formattedName: "1.0", - assetCount: 1, lastUpdated: new Date().toISOString(), }, { id: "fanmade", name: "fanmade", formattedName: "Fanmade", - assetCount: 0, lastUpdated: new Date().toISOString(), }, ]) @@ -155,14 +152,12 @@ async function main() { id: "genshin-impact", name: "genshin-impact", formattedName: "Genshin Impact", - assetCount: 1, lastUpdated: new Date().toISOString(), }, { id: "honkai-impact-3rd", name: "honkai-impact-3rd", formattedName: "Honkai Impact: 3rd", - assetCount: 0, lastUpdated: new Date().toISOString(), }, ]) @@ -177,14 +172,12 @@ async function main() { id: "character-sheets", name: "character-sheets", formattedName: "Character Sheets", - assetCount: 1, lastUpdated: new Date().toISOString(), }, { id: "splash-art", name: "splash-art", formattedName: "Splash Art", - assetCount: 0, lastUpdated: new Date().toISOString(), }, ]) diff --git a/src/v2/db/schema/categories/asset-categories.ts b/src/v2/db/schema/categories/asset-categories.ts index 1bfed35..589d078 100644 --- a/src/v2/db/schema/categories/asset-categories.ts +++ b/src/v2/db/schema/categories/asset-categories.ts @@ -3,7 +3,6 @@ import { relations } from "drizzle-orm" import { sqliteTable, text, - integer, // uniqueIndex, index, } from "drizzle-orm/sqlite-core" @@ -17,7 +16,6 @@ export const assetCategory = sqliteTable( id: text("id").unique().notNull(), name: text("name").unique().notNull(), // e.g tcg-sheets, splash-art formattedName: text("formatted_name").notNull(), // e.g TCG Sheets, Splash Art - assetCount: integer("asset_count").default(0).notNull(), lastUpdated: text("last_updated").notNull(), }, (assetCategory) => { diff --git a/src/v2/db/schema/game/game.ts b/src/v2/db/schema/game/game.ts index 9e2dd59..dac783c 100644 --- a/src/v2/db/schema/game/game.ts +++ b/src/v2/db/schema/game/game.ts @@ -22,7 +22,6 @@ export const game = sqliteTable( id: text("id").unique().notNull(), name: text("name").notNull().unique(), // e.g genshin-impact, honkai-impact-3rd formattedName: text("formatted_name").notNull(), // e.g Genshin Impact, Honkai Impact 3rd - assetCount: integer("asset_count").default(0), possibleSuggestiveContent: integer("possible_suggestive_content") .default(0) .notNull(), diff --git a/src/v2/db/schema/tags/asset-tags.ts b/src/v2/db/schema/tags/asset-tags.ts index 5e315a6..f0f4c31 100644 --- a/src/v2/db/schema/tags/asset-tags.ts +++ b/src/v2/db/schema/tags/asset-tags.ts @@ -22,7 +22,6 @@ export const assetTag = sqliteTable( id: text("id").unique().notNull(), name: text("name").notNull().unique(), formattedName: text("formatted_name").notNull(), - assetCount: integer("asset_count").default(0).notNull(), lastUpdated: text("last_updated").notNull(), }, (assetTag) => { diff --git a/src/v2/lib/managers/asset-category/asset-category-manager.ts b/src/v2/lib/managers/asset-category/asset-category-manager.ts index 9519971..60413bc 100644 --- a/src/v2/lib/managers/asset-category/asset-category-manager.ts +++ b/src/v2/lib/managers/asset-category/asset-category-manager.ts @@ -97,7 +97,6 @@ export class AssetCategoryManager { id: newAssetCategory.name, name: newAssetCategory.name, formattedName: newAssetCategory.name, - assetCount: 0, lastUpdated: new Date().toISOString(), }) .returning() diff --git a/src/v2/lib/managers/asset/asset-manager.ts b/src/v2/lib/managers/asset/asset-manager.ts index 90a21f9..5d2e75b 100644 --- a/src/v2/lib/managers/asset/asset-manager.ts +++ b/src/v2/lib/managers/asset/asset-manager.ts @@ -1,12 +1,6 @@ import { DrizzleInstance } from "@/v2/db/turso" -import { - asset, - assetCategory, - assetTag, - assetTagAsset, - game, -} from "@/v2/db/schema" -import { eq, not, or, sql } from "drizzle-orm" +import { asset, assetTag, assetTagAsset } from "@/v2/db/schema" +import { eq, not, or } from "drizzle-orm" import { R2Bucket } from "@cloudflare/workers-types" import { SplitQueryByCommas } from "../../helpers/split-query-by-commas" import { z } from "zod" @@ -263,20 +257,6 @@ export class AssetManager { }) .returning() - await trx - .update(game) - .set({ - assetCount: sql`asset_count + 1`, - }) - .where(eq(game.id, newAsset.gameId)) - - await trx - .update(assetCategory) - .set({ - assetCount: sql`asset_count + 1`, - }) - .where(eq(assetCategory.id, newAsset.assetCategoryId)) - const tags = newAsset.tags ? SplitQueryByCommas(newAsset.tags) : [] diff --git a/src/v2/lib/managers/game/game-manager.ts b/src/v2/lib/managers/game/game-manager.ts index 34112e3..ef9037d 100644 --- a/src/v2/lib/managers/game/game-manager.ts +++ b/src/v2/lib/managers/game/game-manager.ts @@ -28,6 +28,20 @@ export class GameManager { } } + public async doesGameExist(gameId: string): Promise { + try { + const [foundGame] = await this.drizzle + .select({ id: game.id }) + .from(game) + .where(eq(game.id, gameId)) + + return foundGame ? true : false + } catch (e) { + console.error(`Error checking if game exists ${gameId}`, e) + throw new Error(`Error checking if game exists ${gameId}`) + } + } + /** * Retrieves a game by its name. * @param gameName - The name of the game to retrieve. @@ -82,4 +96,62 @@ export class GameManager { throw new Error("Error listing games") } } + + public async createGame( + name: string, + formattedName: string, + possibleSuggestiveContent: number + ): Promise { + try { + const [newGame] = await this.drizzle + .insert(game) + .values({ + id: name, + formattedName, + name, + possibleSuggestiveContent, + lastUpdated: new Date().toISOString(), + }) + .returning() + + return newGame + } catch (e) { + console.error("Error creating game", e) + throw new Error("Error creating game") + } + } + + public async deleteGame(gameId: string): Promise { + try { + await this.drizzle.delete(game).where(eq(game.id, gameId)) + } catch (e) { + console.error(`Error deleting game ${gameId}`, e) + throw new Error(`Error deleting game ${gameId}`) + } + } + + public async updateGame( + gameId: string, + name: string, + formattedName: string, + possibleSuggestiveContent: number + ): Promise { + try { + const [updatedGame] = await this.drizzle + .update(game) + .set({ + name, + formattedName, + possibleSuggestiveContent, + lastUpdated: new Date().toISOString(), + }) + .where(eq(game.id, gameId)) + .returning() + + return updatedGame + } catch (e) { + console.error(`Error updating game ${gameId}`, e) + throw new Error(`Error updating game ${gameId}`) + } + } } diff --git a/src/v2/lib/managers/tag/tag-manager.ts b/src/v2/lib/managers/tag/tag-manager.ts index d1edee4..0043633 100644 --- a/src/v2/lib/managers/tag/tag-manager.ts +++ b/src/v2/lib/managers/tag/tag-manager.ts @@ -84,7 +84,6 @@ export class TagManager { id: newTag.name, name: newTag.name, formattedName: newTag.name, - assetCount: 0, lastUpdated: new Date().toISOString(), }) .returning() diff --git a/src/v2/routes/collection/asset/handler.ts b/src/v2/routes/collection/asset/handler.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/game/create/openapi.ts b/src/v2/routes/game/create/openapi.ts index e69de29..4b8871e 100644 --- a/src/v2/routes/game/create/openapi.ts +++ b/src/v2/routes/game/create/openapi.ts @@ -0,0 +1,26 @@ +import { createRoute } from "@hono/zod-openapi" +import { createGameSchema } from "./schema" + +export const createGameRoute = createRoute({ + path: "/", + method: "post", + description: "Create a new game.", + tags: ["Game"], + request: { + body: { + content: { + "application/json": { + schema: createGameSchema, + }, + }, + }, + }, + responses: { + 200: { + description: "Returns the new game.", + }, + 500: { + description: "Internal server error.", + }, + }, +}) diff --git a/src/v2/routes/game/create/route.ts b/src/v2/routes/game/create/route.ts index e69de29..786fcfd 100644 --- a/src/v2/routes/game/create/route.ts +++ b/src/v2/routes/game/create/route.ts @@ -0,0 +1,72 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { createGameRoute } from "./openapi" +import { GameManager } from "@/v2/lib/managers/game/game-manager" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +import { roleFlagsToArray } from "@/v2/lib/helpers/role-flags" +import { getConnection } from "@/v2/db/turso" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.openapi(createGameRoute, async (ctx) => { + const authSessionManager = new AuthSessionManager(ctx) + + const { user } = await authSessionManager.validateSession() + + if (!user || !roleFlagsToArray(user.roleFlags).includes("DEVELOPER")) { + return ctx.json( + { + success: false, + error: "Unauthorized", + }, + 401 + ) + } + + const { name, formattedName, possibleSuggestiveContent } = + ctx.req.valid("json") + + if ( + possibleSuggestiveContent !== "1" && + possibleSuggestiveContent !== "0" + ) { + return ctx.json( + { + success: false, + error: "Invalid suggestive content value, must be 0 or 1", + }, + 400 + ) + } + + const { drizzle } = getConnection(ctx.env) + + const gameManager = new GameManager(drizzle) + + const gameExists = await gameManager.doesGameExist(name) + + if (gameExists) { + return ctx.json( + { + success: false, + error: "Game already exists", + }, + 400 + ) + } + + const game = await gameManager.createGame( + name, + formattedName, + parseInt(possibleSuggestiveContent) + ) + + return ctx.json( + { + success: true, + game, + }, + 200 + ) +}) + +export default handler diff --git a/src/v2/routes/game/create/schema.ts b/src/v2/routes/game/create/schema.ts index e69de29..eaffc8f 100644 --- a/src/v2/routes/game/create/schema.ts +++ b/src/v2/routes/game/create/schema.ts @@ -0,0 +1,17 @@ +import { z } from "@hono/zod-openapi" + +export const createGameSchema = z.object({ + name: z.string().min(3).max(32).openapi({ + description: "The name of the game.", + example: "honkai-star-rail", + }), + formattedName: z.string().min(3).max(64).openapi({ + description: "The formatted name of the game.", + example: "Honkai: Star Rail", + }), + possibleSuggestiveContent: z.string().min(1).max(1).openapi({ + description: + "If the game contains suggestive content. 1 = Yes, 0 = No.", + example: "1", + }), +}) diff --git a/src/v2/routes/game/delete/id/[id]/openapi.ts b/src/v2/routes/game/delete/id/[id]/openapi.ts index e69de29..95835f6 100644 --- a/src/v2/routes/game/delete/id/[id]/openapi.ts +++ b/src/v2/routes/game/delete/id/[id]/openapi.ts @@ -0,0 +1,23 @@ +import { createRoute } from "@hono/zod-openapi" +import { deleteGameSchema } from "./schema" + +export const deleteGameRoute = createRoute({ + path: "/", + method: "delete", + description: "Delete a game & all its related assets.", + tags: ["Game"], + request: { + params: deleteGameSchema, + }, + responses: { + 200: { + description: "Returns true or false.", + }, + 401: { + description: "Unauthorized", + }, + 500: { + description: "Internal server error.", + }, + }, +}) diff --git a/src/v2/routes/game/delete/id/[id]/route.ts b/src/v2/routes/game/delete/id/[id]/route.ts index e69de29..a7d84c6 100644 --- a/src/v2/routes/game/delete/id/[id]/route.ts +++ b/src/v2/routes/game/delete/id/[id]/route.ts @@ -0,0 +1,36 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { deleteGameRoute } from "./openapi" +import { GameManager } from "@/v2/lib/managers/game/game-manager" +import { getConnection } from "@/v2/db/turso" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.openapi(deleteGameRoute, async (ctx) => { + const id = ctx.req.valid("param").id + + const { drizzle } = await getConnection(ctx.env) + const gameManager = new GameManager(drizzle) + const gameExists = await gameManager.doesGameExist(id) + + if (!gameExists) { + return ctx.json( + { + success: false, + error: "Game not found", + }, + 200 + ) + } + + await gameManager.deleteGame(id) + await ctx.env.FILES_BUCKET.delete("/assets/" + id) + + return ctx.json( + { + success: true, + }, + 200 + ) +}) + +export default handler diff --git a/src/v2/routes/game/delete/id/[id]/schema.ts b/src/v2/routes/game/delete/id/[id]/schema.ts index e69de29..a922bbb 100644 --- a/src/v2/routes/game/delete/id/[id]/schema.ts +++ b/src/v2/routes/game/delete/id/[id]/schema.ts @@ -0,0 +1,13 @@ +import { z } from "@hono/zod-openapi" + +export const deleteGameSchema = z.object({ + id: z.string().openapi({ + param: { + name: "id", + in: "path", + description: "The ID of the game to delete.", + example: "genshin-impact", + required: true, + }, + }), +}) diff --git a/src/v2/routes/game/handler.ts b/src/v2/routes/game/handler.ts index 0bf7a49..3ead73f 100644 --- a/src/v2/routes/game/handler.ts +++ b/src/v2/routes/game/handler.ts @@ -1,8 +1,12 @@ import { OpenAPIHono } from "@hono/zod-openapi" import GameGetRoute from "./get/handler" +import GameCreateRoute from "./create/route" +import DeleteGameRoute from "./delete/id/[id]/route" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.route("/get", GameGetRoute) +handler.route("/create", GameCreateRoute) +handler.route("/delete/id/:id", DeleteGameRoute) export default handler From 67ceed151b4a5aed53de53ee7cf28f26b339fa6e Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Sun, 17 Dec 2023 00:54:28 +0000 Subject: [PATCH 195/318] modify game route --- src/v2/routes/asset/get/id/[id]/route.ts | 2 +- src/v2/routes/game/delete/id/[id]/route.ts | 2 +- src/v2/routes/game/get/id/[id]/route.ts | 2 +- src/v2/routes/game/get/name/[name]/route.ts | 2 +- src/v2/routes/game/handler.ts | 4 +- src/v2/routes/game/modify/id/[id]/openapi.ts | 32 +++++++++ src/v2/routes/game/modify/id/[id]/route.ts | 73 ++++++++++++++++++++ src/v2/routes/game/modify/id/[id]/schema.ts | 21 ++++++ 8 files changed, 133 insertions(+), 5 deletions(-) diff --git a/src/v2/routes/asset/get/id/[id]/route.ts b/src/v2/routes/asset/get/id/[id]/route.ts index fc2881d..7a2bed6 100644 --- a/src/v2/routes/asset/get/id/[id]/route.ts +++ b/src/v2/routes/asset/get/id/[id]/route.ts @@ -28,7 +28,7 @@ handler.openapi(getAssetByIdRoute, async (ctx) => { success: true, error: "Asset not found", }, - 200 + 400 ) } diff --git a/src/v2/routes/game/delete/id/[id]/route.ts b/src/v2/routes/game/delete/id/[id]/route.ts index a7d84c6..5d388c3 100644 --- a/src/v2/routes/game/delete/id/[id]/route.ts +++ b/src/v2/routes/game/delete/id/[id]/route.ts @@ -18,7 +18,7 @@ handler.openapi(deleteGameRoute, async (ctx) => { success: false, error: "Game not found", }, - 200 + 400 ) } diff --git a/src/v2/routes/game/get/id/[id]/route.ts b/src/v2/routes/game/get/id/[id]/route.ts index 810d98b..6b6b17e 100644 --- a/src/v2/routes/game/get/id/[id]/route.ts +++ b/src/v2/routes/game/get/id/[id]/route.ts @@ -18,7 +18,7 @@ handler.openapi(getGameByIdRoute, async (ctx) => { success: false, error: "Game not found", }, - 200 + 400 ) } diff --git a/src/v2/routes/game/get/name/[name]/route.ts b/src/v2/routes/game/get/name/[name]/route.ts index 77093c1..0401d29 100644 --- a/src/v2/routes/game/get/name/[name]/route.ts +++ b/src/v2/routes/game/get/name/[name]/route.ts @@ -18,7 +18,7 @@ handler.openapi(getGameByNameRoute, async (ctx) => { success: true, error: "Game not found", }, - 200 + 400 ) } diff --git a/src/v2/routes/game/handler.ts b/src/v2/routes/game/handler.ts index 3ead73f..3c32462 100644 --- a/src/v2/routes/game/handler.ts +++ b/src/v2/routes/game/handler.ts @@ -2,11 +2,13 @@ import { OpenAPIHono } from "@hono/zod-openapi" import GameGetRoute from "./get/handler" import GameCreateRoute from "./create/route" import DeleteGameRoute from "./delete/id/[id]/route" +import ModifyGameRoute from "./modify/id/[id]/route" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.route("/get", GameGetRoute) handler.route("/create", GameCreateRoute) -handler.route("/delete/id/:id", DeleteGameRoute) +handler.route("/modify/id/{id}", ModifyGameRoute) +handler.route("/delete/id/{id}", DeleteGameRoute) export default handler diff --git a/src/v2/routes/game/modify/id/[id]/openapi.ts b/src/v2/routes/game/modify/id/[id]/openapi.ts index e69de29..cf7ec05 100644 --- a/src/v2/routes/game/modify/id/[id]/openapi.ts +++ b/src/v2/routes/game/modify/id/[id]/openapi.ts @@ -0,0 +1,32 @@ +import { createRoute } from "@hono/zod-openapi" +import { modifyGameSchema } from "./schema" + +export const modifyGameRoute = createRoute({ + path: "/", + method: "post", + description: "Modify an existing game.", + tags: ["Game"], + request: { + body: { + content: { + "application/json": { + schema: modifyGameSchema, + }, + }, + }, + }, + responses: { + 200: { + description: "Returns the game's modified attributes.", + }, + 400: { + description: "Bad request.", + }, + 401: { + description: "Unauthorized", + }, + 500: { + description: "Internal server error.", + }, + }, +}) diff --git a/src/v2/routes/game/modify/id/[id]/route.ts b/src/v2/routes/game/modify/id/[id]/route.ts index e69de29..17f84fc 100644 --- a/src/v2/routes/game/modify/id/[id]/route.ts +++ b/src/v2/routes/game/modify/id/[id]/route.ts @@ -0,0 +1,73 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { modifyGameRoute } from "./openapi" +import { GameManager } from "@/v2/lib/managers/game/game-manager" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +import { roleFlagsToArray } from "@/v2/lib/helpers/role-flags" +import { getConnection } from "@/v2/db/turso" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.openapi(modifyGameRoute, async (ctx) => { + const authSessionManager = new AuthSessionManager(ctx) + + const { user } = await authSessionManager.validateSession() + + if (!user || !roleFlagsToArray(user.roleFlags).includes("DEVELOPER")) { + return ctx.json( + { + success: false, + error: "Unauthorized", + }, + 401 + ) + } + + const { id, name, formattedName, possibleSuggestiveContent } = + ctx.req.valid("json") + + if ( + possibleSuggestiveContent !== "1" && + possibleSuggestiveContent !== "0" + ) { + return ctx.json( + { + success: false, + error: "Invalid suggestive content value, must be 0 or 1", + }, + 400 + ) + } + + const { drizzle } = getConnection(ctx.env) + + const gameManager = new GameManager(drizzle) + + const gameExists = await gameManager.doesGameExist(name) + + if (!gameExists) { + return ctx.json( + { + success: false, + error: "Game with ID not found", + }, + 400 + ) + } + + const game = await gameManager.updateGame( + id, + name, + formattedName, + parseInt(possibleSuggestiveContent) + ) + + return ctx.json( + { + success: true, + game, + }, + 200 + ) +}) + +export default handler diff --git a/src/v2/routes/game/modify/id/[id]/schema.ts b/src/v2/routes/game/modify/id/[id]/schema.ts index e69de29..a1cd2d7 100644 --- a/src/v2/routes/game/modify/id/[id]/schema.ts +++ b/src/v2/routes/game/modify/id/[id]/schema.ts @@ -0,0 +1,21 @@ +import { z } from "@hono/zod-openapi" + +export const modifyGameSchema = z.object({ + id: z.string().openapi({ + description: "The id of the game to modify.", + example: "a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11", + }), + name: z.string().min(3).max(32).openapi({ + description: "The name of the game.", + example: "honkai-star-rail", + }), + formattedName: z.string().min(3).max(64).openapi({ + description: "The formatted name of the game.", + example: "Honkai: Star Rail", + }), + possibleSuggestiveContent: z.string().min(1).max(1).openapi({ + description: + "If the game contains suggestive content. 1 = Yes, 0 = No.", + example: "1", + }), +}) From 8cce32fbcff78ccc02155b36a0e5d6e44229fe1e Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Mon, 18 Dec 2023 01:04:08 +0000 Subject: [PATCH 196/318] [no ci] jesus christ --- src/v2/db/schema/game/game.ts | 8 ++- src/v2/lib/managers/asset/asset-manager.ts | 69 ++++--------------- src/v2/lib/managers/game/game-manager.ts | 1 - src/v2/routes/asset/upload/openapi.ts | 32 +++++++++ src/v2/routes/asset/upload/route.ts | 51 ++++++++++++++ src/v2/routes/asset/upload/schema.ts | 41 +++++++++++ src/v2/routes/contributors/get/all/openapi.ts | 16 +++++ src/v2/routes/contributors/get/all/route.ts | 32 +++++++++ src/v2/routes/game/modify/id/[id]/schema.ts | 6 +- 9 files changed, 194 insertions(+), 62 deletions(-) create mode 100644 src/v2/routes/asset/upload/openapi.ts create mode 100644 src/v2/routes/asset/upload/schema.ts create mode 100644 src/v2/routes/contributors/get/all/openapi.ts create mode 100644 src/v2/routes/contributors/get/all/route.ts diff --git a/src/v2/db/schema/game/game.ts b/src/v2/db/schema/game/game.ts index dac783c..93be734 100644 --- a/src/v2/db/schema/game/game.ts +++ b/src/v2/db/schema/game/game.ts @@ -10,6 +10,7 @@ import { import { asset } from "../asset/asset" import { gameAssetCategory } from "../categories/asset-categories" import { gameLikes } from "./game-likes" +import { generateID } from "@/v2/lib/oslo" /* NOTE: Game relation is easy to understand and self-explanatory. @@ -19,7 +20,12 @@ NOTE: Game relation is easy to understand and self-explanatory. export const game = sqliteTable( tableNames.game, { - id: text("id").unique().notNull(), + id: text("id") + .unique() + .notNull() + .$defaultFn(() => { + return generateID() + }), name: text("name").notNull().unique(), // e.g genshin-impact, honkai-impact-3rd formattedName: text("formatted_name").notNull(), // e.g Genshin Impact, Honkai Impact 3rd possibleSuggestiveContent: integer("possible_suggestive_content") diff --git a/src/v2/lib/managers/asset/asset-manager.ts b/src/v2/lib/managers/asset/asset-manager.ts index 5d2e75b..14a3e62 100644 --- a/src/v2/lib/managers/asset/asset-manager.ts +++ b/src/v2/lib/managers/asset/asset-manager.ts @@ -6,52 +6,7 @@ import { SplitQueryByCommas } from "../../helpers/split-query-by-commas" import { z } from "zod" import type { Asset, NewAsset } from "@/v2/db/schema" import type { assetSearchAllFilter } from "@/v2/routes/asset/search/all/schema" - -const MAX_FILE_SIZE = 5000 -const ACCEPTED_IMAGE_TYPES = ["image/png"] - -export const UploadAssetSchema = z.object({ - asset: z - .any() - .refine((files) => files?.length == 1, "Image is required.") - .refine( - (files) => files?.[0]?.size <= MAX_FILE_SIZE, - `Max file size is 5MB.` - ) - .refine( - (files) => ACCEPTED_IMAGE_TYPES.includes(files?.[0]?.type), - ".jpg, .jpeg, .png and .webp files are accepted." - ), - name: z.string({ - required_error: "Name is required", - invalid_type_error: "Name must be a string", - }), - extension: z.string({ - required_error: "Extension is required", - invalid_type_error: "Extension must be a string", - }), - tags: z.string().optional(), - assetCategoryId: z.string({ - required_error: "Category is required", - invalid_type_error: "Category must be a string", - }), - gameId: z.string({ - required_error: "Game is required", - invalid_type_error: "Game must be a string", - }), - size: z.number({ - required_error: "Size is required", - invalid_type_error: "Size must be a number", - }), - width: z.number({ - required_error: "Width is required", - invalid_type_error: "Width must be a number", - }), - height: z.number({ - required_error: "Height is required", - invalid_type_error: "Height must be a number", - }), -}) +import { uploadAssetSchema } from "@/v2/routes/asset/upload/schema" export class AssetManager { constructor(private drizzle: DrizzleInstance) {} @@ -228,13 +183,13 @@ export class AssetManager { public async createAsset( userId: string, userNickname: string, - newAsset: z.infer, + newAsset: z.infer, bucket: R2Bucket, file: File ): Promise { try { const { key } = await bucket.put( - `/assets/${newAsset.gameId}/${newAsset.assetCategoryId}/${newAsset.name}.${newAsset.extension}`, + `/assets/${newAsset.gameId}/${newAsset.assetCategoryId}/${newAsset.name}`, file ) @@ -244,32 +199,32 @@ export class AssetManager { .insert(asset) .values({ name: newAsset.name, - extension: newAsset.extension, + extension: "png", gameId: newAsset.gameId, assetCategoryId: newAsset.assetCategoryId, url: key, uploadedByName: userNickname, uploadedById: userId, status: "pending", - fileSize: newAsset.size, - width: newAsset.width, - height: newAsset.height, + fileSize: 0, + width: 0, + height: 0, }) .returning() - const tags = newAsset.tags - ? SplitQueryByCommas(newAsset.tags) - : [] + const tags = SplitQueryByCommas(newAsset.tags) ?? [] if (tags.length === 0) return createdAsset for (const tag of tags) { const foundTag = await trx - .select() + .select({ + id: assetTag.id, + }) .from(assetTag) .where(eq(assetTag.name, tag)) - if (foundTag.length === 0) { + if (foundTag) { await trx.insert(assetTagAsset).values({ assetId: createdAsset[0].assetId, assetTagId: tag, diff --git a/src/v2/lib/managers/game/game-manager.ts b/src/v2/lib/managers/game/game-manager.ts index ef9037d..fffa7c5 100644 --- a/src/v2/lib/managers/game/game-manager.ts +++ b/src/v2/lib/managers/game/game-manager.ts @@ -106,7 +106,6 @@ export class GameManager { const [newGame] = await this.drizzle .insert(game) .values({ - id: name, formattedName, name, possibleSuggestiveContent, diff --git a/src/v2/routes/asset/upload/openapi.ts b/src/v2/routes/asset/upload/openapi.ts new file mode 100644 index 0000000..d88821c --- /dev/null +++ b/src/v2/routes/asset/upload/openapi.ts @@ -0,0 +1,32 @@ +import { createRoute } from "@hono/zod-openapi" +import { uploadAssetSchema } from "./schema" + +export const uploadAssetRoute = createRoute({ + path: "/", + method: "post", + description: "Upload a new asset.", + tags: ["Asset"], + request: { + body: { + content: { + "multipart/form-data": { + schema: uploadAssetSchema, + }, + }, + }, + }, + responses: { + 200: { + description: "Returns the new asset.", + }, + 400: { + description: "Bad request.", + }, + 401: { + description: "Unauthorized.", + }, + 500: { + description: "Internal server error.", + }, + }, +}) diff --git a/src/v2/routes/asset/upload/route.ts b/src/v2/routes/asset/upload/route.ts index e69de29..8cf1b56 100644 --- a/src/v2/routes/asset/upload/route.ts +++ b/src/v2/routes/asset/upload/route.ts @@ -0,0 +1,51 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { uploadAssetRoute } from "./openapi" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +import { AssetManager } from "@/v2/lib/managers/asset/asset-manager" +import { getConnection } from "@/v2/db/turso" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.openapi(uploadAssetRoute, async (ctx) => { + const authSessionManager = new AuthSessionManager(ctx) + + const { user } = await authSessionManager.validateSession() + + if (!user) { + return ctx.json( + { + success: false, + error: "Unauthorized", + }, + 401 + ) + } + + const { asset, name, tags, assetCategoryId, gameId } = ctx.req.valid("form") + + const { drizzle } = getConnection(ctx.env) + const assetManager = new AssetManager(drizzle) + + const newAsset = await assetManager.createAsset( + user.id, + user.username, + { + name, + tags, + assetCategoryId, + gameId, + }, + ctx.env.FILES_BUCKET, + asset as File + ) + + return ctx.json( + { + success: true, + asset: newAsset, + }, + 200 + ) +}) + +export default handler diff --git a/src/v2/routes/asset/upload/schema.ts b/src/v2/routes/asset/upload/schema.ts new file mode 100644 index 0000000..0250964 --- /dev/null +++ b/src/v2/routes/asset/upload/schema.ts @@ -0,0 +1,41 @@ +import { z } from "@hono/zod-openapi" + +const ACCEPTED_IMAGE_TYPES = ["image/png"] +const MAX_FILE_SIZE = 5 * 1024 * 1024 + +export const uploadAssetSchema = z.object({ + asset: z + .any() + .openapi({ + description: "The image of the asset to upload.", + example: "asset", + }) + .refine((files) => files?.length == 1, "Image is required.") + .refine( + (files) => files?.[0]?.size <= MAX_FILE_SIZE, + `Max file size is 5MB.` + ) + .refine( + (files) => ACCEPTED_IMAGE_TYPES.includes(files?.[0]?.type), + ".jpg, .jpeg, .png and .webp files are accepted." + ), + name: z.string().min(3).max(32).openapi({ + description: "The name of the asset.", + example: "asset", + }), + tags: z + .string() + .openapi({ + description: "Comma seperated list of tags for the asset.", + example: "tag1,tag2,tag3", + }) + .optional(), + assetCategoryId: z.string().openapi({ + description: "The asset category ID for the asset.", + example: "assetCategoryId", + }), + gameId: z.string().openapi({ + description: "The game ID for the asset.", + example: "gameId", + }), +}) diff --git a/src/v2/routes/contributors/get/all/openapi.ts b/src/v2/routes/contributors/get/all/openapi.ts new file mode 100644 index 0000000..1c96d2a --- /dev/null +++ b/src/v2/routes/contributors/get/all/openapi.ts @@ -0,0 +1,16 @@ +import { createRoute } from "@hono/zod-openapi" + +export const contributorsRoute = createRoute({ + path: "/all", + method: "get", + description: "Get a list of all contributors.", + tags: ["Contributors"], + responses: { + 200: { + description: "All Contributors", + }, + 500: { + description: "Internal server error.", + }, + }, +}) diff --git a/src/v2/routes/contributors/get/all/route.ts b/src/v2/routes/contributors/get/all/route.ts new file mode 100644 index 0000000..3a49a37 --- /dev/null +++ b/src/v2/routes/contributors/get/all/route.ts @@ -0,0 +1,32 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { contributorsRoute } from "./openapi" +import { getConnection } from "@/v2/db/turso" +import { authUser } from "@/v2/db/schema" +import { eq } from "drizzle-orm" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.openapi(contributorsRoute, async (ctx) => { + const { drizzle } = await getConnection(ctx.env) + + const contributors = await drizzle + .select({ + id: authUser.id, + username: authUser.username, + avatarUrl: authUser.avatarUrl, + isSupporter: authUser.isSupporter, + roleFlags: authUser.roleFlags, + }) + .from(authUser) + .where(eq(authUser.isContributor, true)) + + return ctx.json( + { + success: true, + contributors, + }, + 200 + ) +}) + +export default handler diff --git a/src/v2/routes/game/modify/id/[id]/schema.ts b/src/v2/routes/game/modify/id/[id]/schema.ts index a1cd2d7..c6de765 100644 --- a/src/v2/routes/game/modify/id/[id]/schema.ts +++ b/src/v2/routes/game/modify/id/[id]/schema.ts @@ -3,14 +3,14 @@ import { z } from "@hono/zod-openapi" export const modifyGameSchema = z.object({ id: z.string().openapi({ description: "The id of the game to modify.", - example: "a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11", + example: "honkai-star-rail", }), name: z.string().min(3).max(32).openapi({ - description: "The name of the game.", + description: "The new name of the game.", example: "honkai-star-rail", }), formattedName: z.string().min(3).max(64).openapi({ - description: "The formatted name of the game.", + description: "The new formatted name of the game.", example: "Honkai: Star Rail", }), possibleSuggestiveContent: z.string().min(1).max(1).openapi({ From 2bf72406f3350b570dcfdf11757993d86aaa8e37 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Mon, 18 Dec 2023 01:06:04 +0000 Subject: [PATCH 197/318] revert game id oslo gen --- src/v2/db/schema/categories/asset-categories.ts | 2 +- src/v2/db/schema/game/game.ts | 8 +------- src/v2/lib/managers/game/game-manager.ts | 3 ++- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/v2/db/schema/categories/asset-categories.ts b/src/v2/db/schema/categories/asset-categories.ts index 589d078..8899c4b 100644 --- a/src/v2/db/schema/categories/asset-categories.ts +++ b/src/v2/db/schema/categories/asset-categories.ts @@ -13,7 +13,7 @@ import { assetCategoryLikes } from "./asset-categories-likes" export const assetCategory = sqliteTable( tableNames.assetCategory, { - id: text("id").unique().notNull(), + id: text("id").unique().notNull(), // e.g tcg-sheets, splash-art name: text("name").unique().notNull(), // e.g tcg-sheets, splash-art formattedName: text("formatted_name").notNull(), // e.g TCG Sheets, Splash Art lastUpdated: text("last_updated").notNull(), diff --git a/src/v2/db/schema/game/game.ts b/src/v2/db/schema/game/game.ts index 93be734..dac783c 100644 --- a/src/v2/db/schema/game/game.ts +++ b/src/v2/db/schema/game/game.ts @@ -10,7 +10,6 @@ import { import { asset } from "../asset/asset" import { gameAssetCategory } from "../categories/asset-categories" import { gameLikes } from "./game-likes" -import { generateID } from "@/v2/lib/oslo" /* NOTE: Game relation is easy to understand and self-explanatory. @@ -20,12 +19,7 @@ NOTE: Game relation is easy to understand and self-explanatory. export const game = sqliteTable( tableNames.game, { - id: text("id") - .unique() - .notNull() - .$defaultFn(() => { - return generateID() - }), + id: text("id").unique().notNull(), name: text("name").notNull().unique(), // e.g genshin-impact, honkai-impact-3rd formattedName: text("formatted_name").notNull(), // e.g Genshin Impact, Honkai Impact 3rd possibleSuggestiveContent: integer("possible_suggestive_content") diff --git a/src/v2/lib/managers/game/game-manager.ts b/src/v2/lib/managers/game/game-manager.ts index fffa7c5..ba70502 100644 --- a/src/v2/lib/managers/game/game-manager.ts +++ b/src/v2/lib/managers/game/game-manager.ts @@ -106,8 +106,9 @@ export class GameManager { const [newGame] = await this.drizzle .insert(game) .values({ - formattedName, + id: name, name, + formattedName, possibleSuggestiveContent, lastUpdated: new Date().toISOString(), }) From fe8fd0972126666baadd7f6464aba8ac17889a85 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Mon, 18 Dec 2023 01:13:49 +0000 Subject: [PATCH 198/318] link new contributor route w accounts --- src/v2/db/schema/user/user.ts | 3 +++ src/v2/routes/asset/upload/schema.ts | 8 ++++---- src/v2/routes/contributors/get/all/openapi.ts | 2 +- src/v2/routes/contributors/handler.ts | 8 ++++++++ src/v2/routes/handler.ts | 2 ++ 5 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 src/v2/routes/contributors/handler.ts diff --git a/src/v2/db/schema/user/user.ts b/src/v2/db/schema/user/user.ts index 9500e0a..a731462 100644 --- a/src/v2/db/schema/user/user.ts +++ b/src/v2/db/schema/user/user.ts @@ -74,6 +74,9 @@ export const authUser = sqliteTable( userIdx: index("user_id_idx").on(user.id), usernameIdx: index("user_username_idx").on(user.username), emailIdx: index("user_email_idx").on(user.email), + contributorIdx: index("user_contributor_idx").on( + user.isContributor + ), } } ) diff --git a/src/v2/routes/asset/upload/schema.ts b/src/v2/routes/asset/upload/schema.ts index 0250964..777840c 100644 --- a/src/v2/routes/asset/upload/schema.ts +++ b/src/v2/routes/asset/upload/schema.ts @@ -21,21 +21,21 @@ export const uploadAssetSchema = z.object({ ), name: z.string().min(3).max(32).openapi({ description: "The name of the asset.", - example: "asset", + example: "keqing-nobg.png", }), tags: z .string() .openapi({ description: "Comma seperated list of tags for the asset.", - example: "tag1,tag2,tag3", + example: "official,1.0", }) .optional(), assetCategoryId: z.string().openapi({ description: "The asset category ID for the asset.", - example: "assetCategoryId", + example: "splash-art", }), gameId: z.string().openapi({ description: "The game ID for the asset.", - example: "gameId", + example: "genshin-impact", }), }) diff --git a/src/v2/routes/contributors/get/all/openapi.ts b/src/v2/routes/contributors/get/all/openapi.ts index 1c96d2a..b69bc8b 100644 --- a/src/v2/routes/contributors/get/all/openapi.ts +++ b/src/v2/routes/contributors/get/all/openapi.ts @@ -7,7 +7,7 @@ export const contributorsRoute = createRoute({ tags: ["Contributors"], responses: { 200: { - description: "All Contributors", + description: "All Contributors.", }, 500: { description: "Internal server error.", diff --git a/src/v2/routes/contributors/handler.ts b/src/v2/routes/contributors/handler.ts new file mode 100644 index 0000000..88944d6 --- /dev/null +++ b/src/v2/routes/contributors/handler.ts @@ -0,0 +1,8 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import AllContributorsRoute from "@/v2/routes/contributors/get/all/route" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.route("/get/list", AllContributorsRoute) + +export default handler diff --git a/src/v2/routes/handler.ts b/src/v2/routes/handler.ts index be447cd..eb8a99b 100644 --- a/src/v2/routes/handler.ts +++ b/src/v2/routes/handler.ts @@ -2,6 +2,7 @@ import { OpenAPIHono } from "@hono/zod-openapi" import UserRoute from "@/v2/routes/user/handler" import GameRoute from "@/v2/routes/game/handler" import AssetRoute from "@/v2/routes/asset/handler" +import ContributorRoute from "@/v2/routes/contributors/handler" import AuthRoute from "@/v2/routes/auth/handler" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() @@ -9,6 +10,7 @@ const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.route("/game", GameRoute) handler.route("/asset", AssetRoute) handler.route("/user", UserRoute) +handler.route("/contributors", ContributorRoute) handler.route("/auth", AuthRoute) export default handler From 0edf3683205d8eed6dfe8a9f4423215d463064c4 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Thu, 21 Dec 2023 01:09:26 +0000 Subject: [PATCH 199/318] scalar is fucking awesome --- package.json | 1 + pnpm-lock.yaml | 3383 +++++++++++++++-- src/index.ts | 135 +- src/openapi/config.ts | 2 +- src/v2/lib/helpers/role-flags.ts | 2 +- .../asset-category/asset-category-likes.ts | 4 +- 6 files changed, 3270 insertions(+), 257 deletions(-) diff --git a/package.json b/package.json index 1404d2d..0caac6d 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ "@hono/zod-openapi": "^0.9.3", "@libsql/client": "0.4.0-pre.5", "@lucia-auth/adapter-sqlite": "3.0.0-beta.9", + "@scalar/hono-api-reference": "^0.3.3", "@typescript-eslint/eslint-plugin": "^6.13.2", "better-sqlite3": "^9.2.2", "drizzle-orm": "^0.29.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 113df48..db13b8a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,6 +17,9 @@ dependencies: "@lucia-auth/adapter-sqlite": specifier: 3.0.0-beta.9 version: 3.0.0-beta.9(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2)(lucia@3.0.0-beta.11) + "@scalar/hono-api-reference": + specifier: ^0.3.3 + version: 0.3.3(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.9.3)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.2)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(hono@3.11.3)(nanoid@5.0.4)(postcss@8.4.32)(typescript@5.3.3)(unified@11.0.4)(vue@3.3.13) "@typescript-eslint/eslint-plugin": specifier: ^6.13.2 version: 6.13.2(@typescript-eslint/parser@6.13.2)(eslint@8.55.0)(typescript@5.3.3) @@ -97,6 +100,50 @@ packages: } engines: { node: ">=0.10.0" } + /@apidevtools/json-schema-ref-parser@9.0.6: + resolution: + { + integrity: sha512-M3YgsLjI0lZxvrpeGVk9Ap032W6TPQkH6pRAZz81Ac3WUNF79VQooAFnp8umjvVzUmD93NkogxEwbSce7qMsUg==, + } + dependencies: + "@jsdevtools/ono": 7.1.3 + call-me-maybe: 1.0.2 + js-yaml: 3.14.1 + dev: false + + /@apidevtools/openapi-schemas@2.1.0: + resolution: + { + integrity: sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==, + } + engines: { node: ">=10" } + dev: false + + /@apidevtools/swagger-methods@3.0.2: + resolution: + { + integrity: sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==, + } + dev: false + + /@apidevtools/swagger-parser@10.1.0(openapi-types@12.1.3): + resolution: + { + integrity: sha512-9Kt7EuS/7WbMAUv2gSziqjvxwDbFSg3Xeyfuj5laUODX8o/k/CpsAKiQ8W7/R88eXFTMbJYg6+7uAmOWNKmwnw==, + } + peerDependencies: + openapi-types: ">=7" + dependencies: + "@apidevtools/json-schema-ref-parser": 9.0.6 + "@apidevtools/openapi-schemas": 2.1.0 + "@apidevtools/swagger-methods": 3.0.2 + "@jsdevtools/ono": 7.1.3 + ajv: 8.12.0 + ajv-draft-04: 1.0.0(ajv@8.12.0) + call-me-maybe: 1.0.2 + openapi-types: 12.1.3 + dev: false + /@asteasolutions/zod-to-openapi@5.5.0(zod@3.22.4): resolution: { @@ -121,6 +168,55 @@ packages: zod: 3.22.4 dev: true + /@babel/helper-string-parser@7.23.4: + resolution: + { + integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==, + } + engines: { node: ">=6.9.0" } + dev: false + + /@babel/helper-validator-identifier@7.22.20: + resolution: + { + integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==, + } + engines: { node: ">=6.9.0" } + dev: false + + /@babel/parser@7.23.6: + resolution: + { + integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==, + } + engines: { node: ">=6.0.0" } + hasBin: true + dependencies: + "@babel/types": 7.23.6 + dev: false + + /@babel/runtime@7.23.6: + resolution: + { + integrity: sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==, + } + engines: { node: ">=6.9.0" } + dependencies: + regenerator-runtime: 0.14.1 + dev: false + + /@babel/types@7.23.6: + resolution: + { + integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==, + } + engines: { node: ">=6.9.0" } + dependencies: + "@babel/helper-string-parser": 7.23.4 + "@babel/helper-validator-identifier": 7.22.20 + to-fast-properties: 2.0.0 + dev: false + /@cloudflare/kv-asset-handler@0.2.0: resolution: { @@ -196,6 +292,180 @@ packages: integrity: sha512-+kWfpCkqiepwAKXyHoE0gnkPgkLhz0/9HOBIGhHRsUvUKvhUtm3mbqqoGRWgF1qcjzrDUBbrrOq4MYHfFtc2RA==, } + /@codemirror/autocomplete@6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.2): + resolution: + { + integrity: sha512-L5UInv8Ffd6BPw0P3EF7JLYAMeEbclY7+6Q11REt8vhih8RuLreKtPy/xk8wPxs4EQgYqzI7cdgpiYwWlbS/ow==, + } + peerDependencies: + "@codemirror/language": ^6.0.0 + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.0.0 + "@lezer/common": ^1.0.0 + dependencies: + "@codemirror/language": 6.9.3 + "@codemirror/state": 6.3.3 + "@codemirror/view": 6.22.3 + "@lezer/common": 1.1.2 + dev: false + + /@codemirror/commands@6.3.2: + resolution: + { + integrity: sha512-tjoi4MCWDNxgIpoLZ7+tezdS9OEB6pkiDKhfKx9ReJ/XBcs2G2RXIu+/FxXBlWsPTsz6C9q/r4gjzrsxpcnqCQ==, + } + dependencies: + "@codemirror/language": 6.9.3 + "@codemirror/state": 6.3.3 + "@codemirror/view": 6.22.3 + "@lezer/common": 1.1.2 + dev: false + + /@codemirror/lang-css@6.2.1(@codemirror/view@6.22.3): + resolution: + { + integrity: sha512-/UNWDNV5Viwi/1lpr/dIXJNWiwDxpw13I4pTUAsNxZdg6E0mI2kTQb0P2iHczg1Tu+H4EBgJR+hYhKiHKko7qg==, + } + dependencies: + "@codemirror/autocomplete": 6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.2) + "@codemirror/language": 6.9.3 + "@codemirror/state": 6.3.3 + "@lezer/common": 1.1.2 + "@lezer/css": 1.1.4 + transitivePeerDependencies: + - "@codemirror/view" + dev: false + + /@codemirror/lang-html@6.4.7: + resolution: + { + integrity: sha512-y9hWSSO41XlcL4uYwWyk0lEgTHcelWWfRuqmvcAmxfCs0HNWZdriWo/EU43S63SxEZpc1Hd50Itw7ktfQvfkUg==, + } + dependencies: + "@codemirror/autocomplete": 6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.2) + "@codemirror/lang-css": 6.2.1(@codemirror/view@6.22.3) + "@codemirror/lang-javascript": 6.2.1 + "@codemirror/language": 6.9.3 + "@codemirror/state": 6.3.3 + "@codemirror/view": 6.22.3 + "@lezer/common": 1.1.2 + "@lezer/css": 1.1.4 + "@lezer/html": 1.3.7 + dev: false + + /@codemirror/lang-java@6.0.1: + resolution: + { + integrity: sha512-OOnmhH67h97jHzCuFaIEspbmsT98fNdhVhmA3zCxW0cn7l8rChDhZtwiwJ/JOKXgfm4J+ELxQihxaI7bj7mJRg==, + } + dependencies: + "@codemirror/language": 6.9.3 + "@lezer/java": 1.1.0 + dev: false + + /@codemirror/lang-javascript@6.2.1: + resolution: + { + integrity: sha512-jlFOXTejVyiQCW3EQwvKH0m99bUYIw40oPmFjSX2VS78yzfe0HELZ+NEo9Yfo1MkGRpGlj3Gnu4rdxV1EnAs5A==, + } + dependencies: + "@codemirror/autocomplete": 6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.2) + "@codemirror/language": 6.9.3 + "@codemirror/lint": 6.4.2 + "@codemirror/state": 6.3.3 + "@codemirror/view": 6.22.3 + "@lezer/common": 1.1.2 + "@lezer/javascript": 1.4.11 + dev: false + + /@codemirror/lang-json@6.0.1: + resolution: + { + integrity: sha512-+T1flHdgpqDDlJZ2Lkil/rLiRy684WMLc74xUnjJH48GQdfJo/pudlTRreZmKwzP8/tGdKf83wlbAdOCzlJOGQ==, + } + dependencies: + "@codemirror/language": 6.9.3 + "@lezer/json": 1.0.1 + dev: false + + /@codemirror/lang-python@6.1.3(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.2): + resolution: + { + integrity: sha512-S9w2Jl74hFlD5nqtUMIaXAq9t5WlM0acCkyuQWUUSvZclk1sV+UfnpFiZzuZSG+hfEaOmxKR5UxY/Uxswn7EhQ==, + } + dependencies: + "@codemirror/autocomplete": 6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.2) + "@codemirror/language": 6.9.3 + "@lezer/python": 1.1.9 + transitivePeerDependencies: + - "@codemirror/state" + - "@codemirror/view" + - "@lezer/common" + dev: false + + /@codemirror/language@6.9.3: + resolution: + { + integrity: sha512-qq48pYzoi6ldYWV/52+Z9Ou6QouVI+8YwvxFbUypI33NbjG2UeRHKENRyhwljTTiOqjQ33FjyZj6EREQ9apAOQ==, + } + dependencies: + "@codemirror/state": 6.3.3 + "@codemirror/view": 6.22.3 + "@lezer/common": 1.1.2 + "@lezer/highlight": 1.2.0 + "@lezer/lr": 1.3.14 + style-mod: 4.1.0 + dev: false + + /@codemirror/legacy-modes@6.3.3: + resolution: + { + integrity: sha512-X0Z48odJ0KIoh/HY8Ltz75/4tDYc9msQf1E/2trlxFaFFhgjpVHjZ/BCXe1Lk7s4Gd67LL/CeEEHNI+xHOiESg==, + } + dependencies: + "@codemirror/language": 6.9.3 + dev: false + + /@codemirror/lint@6.4.2: + resolution: + { + integrity: sha512-wzRkluWb1ptPKdzlsrbwwjYCPLgzU6N88YBAmlZi8WFyuiEduSd05MnJYNogzyc8rPK7pj6m95ptUApc8sHKVA==, + } + dependencies: + "@codemirror/state": 6.3.3 + "@codemirror/view": 6.22.3 + crelt: 1.0.6 + dev: false + + /@codemirror/search@6.5.5: + resolution: + { + integrity: sha512-PIEN3Ke1buPod2EHbJsoQwlbpkz30qGZKcnmH1eihq9+bPQx8gelauUwLYaY4vBOuBAuEhmpDLii4rj/uO0yMA==, + } + dependencies: + "@codemirror/state": 6.3.3 + "@codemirror/view": 6.22.3 + crelt: 1.0.6 + dev: false + + /@codemirror/state@6.3.3: + resolution: + { + integrity: sha512-0wufKcTw2dEwEaADajjHf6hBy1sh3M6V0e+q4JKIhLuiMSe5td5HOWpUdvKth1fT1M9VYOboajoBHpkCd7PG7A==, + } + dev: false + + /@codemirror/view@6.22.3: + resolution: + { + integrity: sha512-rqnq+Zospwoi3x1vZ8BGV1MlRsaGljX+6qiGYmIpJ++M+LCC+wjfDaPklhwpWSgv7pr/qx29KiAKQBH5+DOn4w==, + } + dependencies: + "@codemirror/state": 6.3.3 + style-mod: 4.1.0 + w3c-keyname: 2.2.8 + dev: false + /@drizzle-team/studio@0.0.35: resolution: { @@ -1094,6 +1364,57 @@ packages: engines: { node: ">=14" } dev: true + /@floating-ui/core@1.5.2: + resolution: + { + integrity: sha512-Ii3MrfY/GAIN3OhXNzpCKaLxHQfJF9qvwq/kEJYdqDxeIHa01K8sldugal6TmeeXl+WMvhv9cnVzUTaFFJF09A==, + } + dependencies: + "@floating-ui/utils": 0.1.6 + dev: false + + /@floating-ui/dom@1.5.3: + resolution: + { + integrity: sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==, + } + dependencies: + "@floating-ui/core": 1.5.2 + "@floating-ui/utils": 0.1.6 + dev: false + + /@floating-ui/utils@0.1.6: + resolution: + { + integrity: sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==, + } + dev: false + + /@floating-ui/vue@1.0.2(vue@3.3.13): + resolution: + { + integrity: sha512-sImlAl9mAoCKZLNlwWz2P2ZMJIDlOEDXrRD6aD2sIHAka1LPC+nWtB+D3lPe7IE7FGWSbwBPTnlSdlABa3Fr0A==, + } + dependencies: + "@floating-ui/dom": 1.5.3 + vue-demi: 0.14.6(vue@3.3.13) + transitivePeerDependencies: + - "@vue/composition-api" + - vue + dev: false + + /@headlessui/vue@1.7.16(vue@3.3.13): + resolution: + { + integrity: sha512-nKT+nf/q6x198SsyK54mSszaQl/z+QxtASmgMEJtpxSX2Q0OPJX0upS/9daDyiECpeAsvjkoOrm2O/6PyBQ+Qg==, + } + engines: { node: ">=10" } + peerDependencies: + vue: ^3.2.0 + dependencies: + vue: 3.3.13(typescript@5.3.3) + dev: false + /@hono/swagger-ui@0.2.0(hono@3.11.3): resolution: { @@ -1160,6 +1481,106 @@ packages: integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==, } + /@jridgewell/sourcemap-codec@1.4.15: + resolution: + { + integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==, + } + dev: false + + /@jsdevtools/ono@7.1.3: + resolution: + { + integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==, + } + dev: false + + /@lezer/common@1.1.2: + resolution: + { + integrity: sha512-V+GqBsga5+cQJMfM0GdnHmg4DgWvLzgMWjbldBg0+jC3k9Gu6nJNZDLJxXEBT1Xj8KhRN4jmbC5CY7SIL++sVw==, + } + dev: false + + /@lezer/css@1.1.4: + resolution: + { + integrity: sha512-CuUwjidrU7FOBokqASRJc72SmJ9g1PsHXDOWMoKg4md6+2u/Zxzwx5YsYrAFxRDsLrjLlsIyEF1rZHK3gFEJbw==, + } + dependencies: + "@lezer/highlight": 1.2.0 + "@lezer/lr": 1.3.14 + dev: false + + /@lezer/highlight@1.2.0: + resolution: + { + integrity: sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==, + } + dependencies: + "@lezer/common": 1.1.2 + dev: false + + /@lezer/html@1.3.7: + resolution: + { + integrity: sha512-Wo+rZ5UjLP0VqUTyXjzgmTYRW5bvTJUFn4Uw0K3HCQjX2/+f+zRo9GLN5BCAojwHQISPvaQk8BWSv2SSKx/UcQ==, + } + dependencies: + "@lezer/common": 1.1.2 + "@lezer/highlight": 1.2.0 + "@lezer/lr": 1.3.14 + dev: false + + /@lezer/java@1.1.0: + resolution: + { + integrity: sha512-RmBS+P9LJ4P9SU7ZewahMkBUNOEz1zQTMOKLq8OEa7ge8FZxz7mKjoEIGewRSn9kom1z5GKQjtxNE++m6u8SYw==, + } + dependencies: + "@lezer/highlight": 1.2.0 + "@lezer/lr": 1.3.14 + dev: false + + /@lezer/javascript@1.4.11: + resolution: + { + integrity: sha512-B5Y9EJF4BWiMgj4ufxUo2hrORnmMBDrMtR+L7dwIO5pocuSAahG6QBwXR6PbKJOjRywJczU2r2LJPg79ER91TQ==, + } + dependencies: + "@lezer/highlight": 1.2.0 + "@lezer/lr": 1.3.14 + dev: false + + /@lezer/json@1.0.1: + resolution: + { + integrity: sha512-nkVC27qiEZEjySbi6gQRuMwa2sDu2PtfjSgz0A4QF81QyRGm3kb2YRzLcOPcTEtmcwvrX/cej7mlhbwViA4WJw==, + } + dependencies: + "@lezer/highlight": 1.2.0 + "@lezer/lr": 1.3.14 + dev: false + + /@lezer/lr@1.3.14: + resolution: + { + integrity: sha512-z5mY4LStlA3yL7aHT/rqgG614cfcvklS+8oFRFBYrs4YaWLJyKKM4+nN6KopToX0o9Hj6zmH6M5kinOYuy06ug==, + } + dependencies: + "@lezer/common": 1.1.2 + dev: false + + /@lezer/python@1.1.9: + resolution: + { + integrity: sha512-8Ua3p8NdICXR6qWvRCnCx5CI1B0DklZGNtRLwOrIS/OHecHIugRHZyr0NsaaQO2H2Nn34EPlRtltXIirLsry5Q==, + } + dependencies: + "@lezer/highlight": 1.2.0 + "@lezer/lr": 1.3.14 + dev: false + /@libsql/client@0.4.0-pre.5: resolution: { @@ -1703,39 +2124,491 @@ packages: "@nodelib/fs.scandir": 2.1.5 fastq: 1.15.0 - /@types/json-schema@7.0.15: + /@popperjs/core@2.11.8: resolution: { - integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, + integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==, } dev: false - /@types/node-fetch@2.6.9: + /@scalar/api-client@0.8.3(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.9.3)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.2)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.3.13): resolution: { - integrity: sha512-bQVlnMLFJ2d35DkPNjEPmd9ueO/rh5EiaZt2bhqiSarPjZIuIV6bPQVqcrEyvNo+AfTrRGVazle1tl597w3gfA==, + integrity: sha512-PwVw0v2H1aYvsLZPaRhYZIs9dFbW8G3R7HX7HZvzR305X9xyDfdtZzBdNOnf3NFLMGZTqs3KzgfiMke6klC59Q==, } - dependencies: - "@types/node": 20.10.4 - form-data: 4.0.0 + engines: { node: ">=20" } + peerDependencies: + vue: ^3.3.0 + dependencies: + "@headlessui/vue": 1.7.16(vue@3.3.13) + "@scalar/themes": 0.5.1(vue@3.3.13) + "@scalar/use-codemirror": 0.7.16(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.9.3)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.2)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.3.13) + "@scalar/use-keyboard-event": 0.5.6(vue@3.3.13) + "@scalar/use-modal": 0.2.1(@headlessui/vue@1.7.16)(vue@3.3.13) + "@vueuse/core": 10.7.0(vue@3.3.13) + axios: 1.6.2 + content-type: 1.0.5 + javascript-time-ago: 2.5.9 + nanoid: 5.0.4 + pretty-bytes: 6.1.1 + pretty-ms: 8.0.0 + vue: 3.3.13(typescript@5.3.3) + transitivePeerDependencies: + - "@codemirror/lang-html" + - "@codemirror/lang-java" + - "@codemirror/lang-javascript" + - "@codemirror/lang-json" + - "@codemirror/lang-python" + - "@codemirror/language" + - "@codemirror/legacy-modes" + - "@codemirror/state" + - "@codemirror/view" + - "@lezer/common" + - "@lezer/highlight" + - "@lezer/lr" + - "@uiw/codemirror-themes" + - "@vue/composition-api" + - codemirror + - debug dev: false - /@types/node-forge@1.3.10: + /@scalar/api-reference@1.12.1(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.9.3)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.2)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(nanoid@5.0.4)(postcss@8.4.32)(typescript@5.3.3)(unified@11.0.4)(vue@3.3.13): resolution: { - integrity: sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw==, + integrity: sha512-ib4VaFEUYBb97o7joCB10c3wB3UU9ahbF78mMeFtNunymtXU9tBHHLP+EVICaGRDsZ2XwYU5brqeZWWteB9M2A==, } - dependencies: - "@types/node": 20.10.4 - dev: true + engines: { node: ">=20" } + peerDependencies: + unified: ^11.0.0 + vue: ^3.3.0 + dependencies: + "@floating-ui/vue": 1.0.2(vue@3.3.13) + "@headlessui/vue": 1.7.16(vue@3.3.13) + "@scalar/api-client": 0.8.3(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.9.3)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.2)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.3.13) + "@scalar/components": 0.2.0(typescript@5.3.3) + "@scalar/snippetz": 0.1.4 + "@scalar/swagger-editor": 0.9.1(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.9.3)(@codemirror/legacy-modes@6.3.3)(@codemirror/view@6.22.3)(@headlessui/vue@1.7.16)(@lezer/common@1.1.2)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(typescript@5.3.3)(unified@11.0.4)(vue@3.3.13) + "@scalar/swagger-parser": 0.5.13(openapi-types@12.1.3) + "@scalar/themes": 0.5.1(vue@3.3.13) + "@scalar/use-clipboard": 0.5.11(@scalar/use-toasts@0.5.11)(nanoid@5.0.4) + "@scalar/use-codemirror": 0.7.16(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.9.3)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.2)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.3.13) + "@scalar/use-keyboard-event": 0.5.6(vue@3.3.13) + "@scalar/use-modal": 0.2.1(@headlessui/vue@1.7.16)(vue@3.3.13) + "@scalar/use-toasts": 0.5.11(nanoid@5.0.4)(vue@3.3.13) + "@scalar/use-tooltip": 0.5.7(vue@3.3.13) + "@unhead/schema": 1.8.9 + "@vcarl/remark-headings": 0.1.0 + "@vueuse/core": 10.7.0(vue@3.3.13) + "@xmldom/xmldom": 0.8.10 + axios: 1.6.2 + fuse.js: 6.6.2 + github-slugger: 2.0.0 + httpsnippet-lite: 3.0.5 + js-yaml: 4.1.0 + openapi-types: 12.1.3 + postcss-nested: 6.0.1(postcss@8.4.32) + rehype-external-links: 3.0.0 + rehype-format: 5.0.0 + rehype-highlight: 7.0.0 + rehype-sanitize: 6.0.0 + rehype-slug-custom-id: 1.1.0 + rehype-stringify: 10.0.0 + remark-gfm: 4.0.0 + remark-parse: 11.0.0 + remark-rehype: 11.0.0 + remark-stringify: 11.0.0 + unhead: 1.8.9 + unified: 11.0.4 + vue: 3.3.13(typescript@5.3.3) + transitivePeerDependencies: + - "@codemirror/lang-html" + - "@codemirror/lang-java" + - "@codemirror/lang-javascript" + - "@codemirror/lang-json" + - "@codemirror/lang-python" + - "@codemirror/language" + - "@codemirror/legacy-modes" + - "@codemirror/state" + - "@codemirror/view" + - "@lezer/common" + - "@lezer/highlight" + - "@lezer/lr" + - "@uiw/codemirror-themes" + - "@vue/composition-api" + - codemirror + - debug + - nanoid + - postcss + - supports-color + - typescript + dev: false - /@types/node@20.10.4: + /@scalar/components@0.2.0(typescript@5.3.3): resolution: { - integrity: sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==, + integrity: sha512-jmm9C7EXDvRtuReWRtNez8d+gOy5TQhmpCh3s2QCaU9FBb/bNLl7zfTYs5wWG+0wSw9mNRKOd2YacO9lcmKcyw==, } + engines: { node: ">=20" } dependencies: - undici-types: 5.26.5 + "@headlessui/vue": 1.7.16(vue@3.3.13) + "@vueuse/core": 10.7.0(vue@3.3.13) + "@xmldom/xmldom": 0.8.10 + class-variance-authority: 0.7.0 + cva: 1.0.0-beta.1(typescript@5.3.3) + nanoid: 5.0.4 + tailwind-merge: 2.1.0 + vue: 3.3.13(typescript@5.3.3) + transitivePeerDependencies: + - "@vue/composition-api" + - typescript + dev: false + + /@scalar/hono-api-reference@0.3.3(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.9.3)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.2)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(hono@3.11.3)(nanoid@5.0.4)(postcss@8.4.32)(typescript@5.3.3)(unified@11.0.4)(vue@3.3.13): + resolution: + { + integrity: sha512-n3vntN6GyphYSarb/UjfUBiPwqVFo2slTAJ5cgkGOUH4GTctydhcK8u1hx0D2j0wWQuJv7qzIivYvnjB6v31zw==, + } + engines: { node: ">=20" } + peerDependencies: + hono: ^3.0.0 + dependencies: + "@scalar/api-reference": 1.12.1(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.9.3)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.2)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(nanoid@5.0.4)(postcss@8.4.32)(typescript@5.3.3)(unified@11.0.4)(vue@3.3.13) + hono: 3.11.3 + transitivePeerDependencies: + - "@codemirror/lang-html" + - "@codemirror/lang-java" + - "@codemirror/lang-javascript" + - "@codemirror/lang-json" + - "@codemirror/lang-python" + - "@codemirror/language" + - "@codemirror/legacy-modes" + - "@codemirror/state" + - "@codemirror/view" + - "@lezer/common" + - "@lezer/highlight" + - "@lezer/lr" + - "@uiw/codemirror-themes" + - "@vue/composition-api" + - codemirror + - debug + - nanoid + - postcss + - supports-color + - typescript + - unified + - vue + dev: false + + /@scalar/snippetz-core@0.1.2: + resolution: + { + integrity: sha512-w5uUD3iyM03iFW2Vo3n542BKt0BexQXYinu2WJPUVqqaEcxTMw0Qibix+n9KePjBXTys86OuhishlUz8AZdfgg==, + } + dependencies: + "@types/har-format": 1.2.15 + dev: false + + /@scalar/snippetz-plugin-node-fetch@0.1.0: + resolution: + { + integrity: sha512-JRjg9TVhc9NbvIT/wfox7M6rkfd8fT+BoGWKNn+i3rCM1w+oKzydQu0BhG6VVdepM4CttlNH8f0QX3RJMMIAIA==, + } + dependencies: + "@scalar/snippetz-core": 0.1.2 + dev: false + + /@scalar/snippetz-plugin-node-undici@0.1.4: + resolution: + { + integrity: sha512-eK/bnoeYfibssBZKcIV6+JIifQ7I4tbi1H7KIxkQoM/pPnTI0g+evs0e2G9lAnohAvAr3zLPYPaj77YoVbRsdA==, + } + dependencies: + "@scalar/snippetz-core": 0.1.2 + dev: false + + /@scalar/snippetz@0.1.4: + resolution: + { + integrity: sha512-Y+tLMhVfwef2IcGN+TZveApJwspV9QWLmg+6q0BMaQWpmWLs9mTL8N7ygD5rRFMG67yvbgVEOiNO6bOrtkkgfw==, + } + dependencies: + "@scalar/snippetz-core": 0.1.2 + "@scalar/snippetz-plugin-node-fetch": 0.1.0 + "@scalar/snippetz-plugin-node-undici": 0.1.4 + dev: false + + /@scalar/swagger-editor@0.9.1(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.9.3)(@codemirror/legacy-modes@6.3.3)(@codemirror/view@6.22.3)(@headlessui/vue@1.7.16)(@lezer/common@1.1.2)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(typescript@5.3.3)(unified@11.0.4)(vue@3.3.13): + resolution: + { + integrity: sha512-Kprx9x0LOA4qErky3GtNCibsVZZN4Y62Y5iHcKU3iZQrlrgQoXZw1TG6ibv45odbmrw5BwJ0pHtrhiVHeCgLng==, + } + engines: { node: ">=20" } + peerDependencies: + unified: ^11.0.0 + vue: ^3.3.0 + dependencies: + "@codemirror/state": 6.3.3 + "@scalar/components": 0.2.0(typescript@5.3.3) + "@scalar/themes": 0.5.1(vue@3.3.13) + "@scalar/use-codemirror": 0.7.16(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.9.3)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.2)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.3.13) + "@scalar/use-modal": 0.2.1(@headlessui/vue@1.7.16)(vue@3.3.13) + "@vueuse/core": 10.7.0(vue@3.3.13) + nanoid: 5.0.4 + rehype-external-links: 3.0.0 + rehype-format: 5.0.0 + rehype-highlight: 7.0.0 + rehype-sanitize: 6.0.0 + rehype-slug-custom-id: 1.1.0 + rehype-stringify: 10.0.0 + remark-gfm: 4.0.0 + remark-parse: 11.0.0 + remark-rehype: 11.0.0 + unified: 11.0.4 + vue: 3.3.13(typescript@5.3.3) + transitivePeerDependencies: + - "@codemirror/lang-html" + - "@codemirror/lang-java" + - "@codemirror/lang-javascript" + - "@codemirror/lang-json" + - "@codemirror/lang-python" + - "@codemirror/language" + - "@codemirror/legacy-modes" + - "@codemirror/view" + - "@headlessui/vue" + - "@lezer/common" + - "@lezer/highlight" + - "@lezer/lr" + - "@uiw/codemirror-themes" + - "@vue/composition-api" + - codemirror + - supports-color + - typescript + dev: false + + /@scalar/swagger-parser@0.5.13(openapi-types@12.1.3): + resolution: + { + integrity: sha512-rPb8/NxK/A3WOcFhJLvBJiqchgpAmkPukLW5waO2GSBDFFXX4YH3DZzk6OWzImqSI83pUuaM4xXEC5sIMdn01A==, + } + engines: { node: ">=20" } + dependencies: + "@apidevtools/swagger-parser": 10.1.0(openapi-types@12.1.3) + js-yaml: 4.1.0 + transitivePeerDependencies: + - openapi-types + dev: false + + /@scalar/themes@0.5.1(vue@3.3.13): + resolution: + { + integrity: sha512-iaX9H1P/KukzuzkgRlbE4QWxYRHWQajf4AGQVI9Na9KeIQ4NgpkWWsIfcDKekP6P7QrlLvFpgkLcjJf5mnnF4A==, + } + engines: { node: ">=20" } + peerDependencies: + vue: ^3.3.0 + dependencies: + vue: 3.3.13(typescript@5.3.3) + dev: false + + /@scalar/use-clipboard@0.5.11(@scalar/use-toasts@0.5.11)(nanoid@5.0.4): + resolution: + { + integrity: sha512-uo3sVezu5uD2kcRpmmwRUxIMZfMBzl8SvE+Rgv4RX/M06y1JWL5YpuVK4Q0Zz26MlzRbLcsi8vbvGcKQabZyyQ==, + } + engines: { node: ">=20" } + peerDependencies: + "@scalar/use-toasts": 0.5.11 + nanoid: ^5.0.1 + dependencies: + "@scalar/use-toasts": 0.5.11(nanoid@5.0.4)(vue@3.3.13) + nanoid: 5.0.4 + dev: false + + /@scalar/use-codemirror@0.7.16(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.9.3)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.2)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.3.13): + resolution: + { + integrity: sha512-TQXplKCVDheuR/w7q9q0HzyQ9rJmy3P0tAFw2jPLwfAq3Q6YVpltuu3UrKzAOtxV3FcKMc7lzYZLaGY0DHcTVw==, + } + engines: { node: ">=20" } + peerDependencies: + "@codemirror/lang-html": ^6.0.0 + "@codemirror/lang-java": ^6.0.0 + "@codemirror/lang-javascript": ^6.0.0 + "@codemirror/lang-json": ^6.0.0 + "@codemirror/lang-python": ^6.0.0 + "@codemirror/language": ^6.0.0 + "@codemirror/legacy-modes": ^6.0.0 + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.0.0 + "@lezer/common": ^1.1.0 + "@lezer/highlight": ^1.1.0 + "@lezer/lr": ^1.3.0 + "@uiw/codemirror-themes": ^4.21.0 + codemirror: ^6.0.0 + vue: ^3.3.0 + dependencies: + "@codemirror/lang-html": 6.4.7 + "@codemirror/lang-java": 6.0.1 + "@codemirror/lang-javascript": 6.2.1 + "@codemirror/lang-json": 6.0.1 + "@codemirror/lang-python": 6.1.3(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.2) + "@codemirror/language": 6.9.3 + "@codemirror/legacy-modes": 6.3.3 + "@codemirror/state": 6.3.3 + "@codemirror/view": 6.22.3 + "@lezer/common": 1.1.2 + "@lezer/highlight": 1.2.0 + "@lezer/lr": 1.3.14 + "@uiw/codemirror-themes": 4.21.21(@codemirror/language@6.9.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3) + codemirror: 6.0.1(@lezer/common@1.1.2) + vue: 3.3.13(typescript@5.3.3) + dev: false + + /@scalar/use-keyboard-event@0.5.6(vue@3.3.13): + resolution: + { + integrity: sha512-/sKl0LDr2RoTVuQIUaeeOkEbUtl2z+cqEHHF4CNenqOra/Sz/u/eexDHbMc7ZTaaIo9snMHSceLo2k9ThQUz3g==, + } + engines: { node: ">=20" } + peerDependencies: + vue: ^3.3.0 + dependencies: + vue: 3.3.13(typescript@5.3.3) + dev: false + + /@scalar/use-modal@0.2.1(@headlessui/vue@1.7.16)(vue@3.3.13): + resolution: + { + integrity: sha512-OAf7nIoKAbt53GGbbsDbIoAF+/RRQIjnBJhgfk4eI1ACyAOVXwVWrjJ1eYmGbv86gzEX9neb/qpwkc9kcnz1FQ==, + } + engines: { node: ">=20" } + peerDependencies: + "@headlessui/vue": ^1.7.0 + vue: ^3.3.0 + dependencies: + "@headlessui/vue": 1.7.16(vue@3.3.13) + vue: 3.3.13(typescript@5.3.3) + dev: false + + /@scalar/use-toasts@0.5.11(nanoid@5.0.4)(vue@3.3.13): + resolution: + { + integrity: sha512-5uaxV+944rkrYl3mQaQn+AruBCcDjN03jODko2K618unSf3JQixIi6ptoOcXCL6QAGM4FaHtMjRjX/7LJWOtOQ==, + } + engines: { node: ">=20" } + peerDependencies: + nanoid: 4 - 5 + vue: ^3.3.0 + dependencies: + nanoid: 5.0.4 + vue: 3.3.13(typescript@5.3.3) + dev: false + + /@scalar/use-tooltip@0.5.7(vue@3.3.13): + resolution: + { + integrity: sha512-WmTleZDjR1Yerw1GLoh9li/3d9dFDWm1Vb39xrehtXx8bGB8+IkRyg8ZCfGzEKNySbf263QAaRmZkKUMVOGdAA==, + } + engines: { node: ">=20" } + peerDependencies: + vue: ^3.3.0 + dependencies: + tippy.js: 6.3.7 + vue: 3.3.13(typescript@5.3.3) + dev: false + + /@types/debug@4.1.12: + resolution: + { + integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==, + } + dependencies: + "@types/ms": 0.7.34 + dev: false + + /@types/har-format@1.2.15: + resolution: + { + integrity: sha512-RpQH4rXLuvTXKR0zqHq3go0RVXYv/YVqv4TnPH95VbwUxZdQlK1EtcMvQvMpDngHbt13Csh9Z4qT9AbkiQH5BA==, + } + dev: false + + /@types/hast@2.3.8: + resolution: + { + integrity: sha512-aMIqAlFd2wTIDZuvLbhUT+TGvMxrNC8ECUIVtH6xxy0sQLs3iu6NO8Kp/VT5je7i5ufnebXzdV1dNDMnvaH6IQ==, + } + dependencies: + "@types/unist": 2.0.10 + dev: false + + /@types/hast@3.0.3: + resolution: + { + integrity: sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==, + } + dependencies: + "@types/unist": 3.0.2 + dev: false + + /@types/json-schema@7.0.15: + resolution: + { + integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, + } + dev: false + + /@types/mdast@3.0.15: + resolution: + { + integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==, + } + dependencies: + "@types/unist": 2.0.10 + dev: false + + /@types/mdast@4.0.3: + resolution: + { + integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==, + } + dependencies: + "@types/unist": 3.0.2 + dev: false + + /@types/ms@0.7.34: + resolution: + { + integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==, + } + dev: false + + /@types/node-fetch@2.6.9: + resolution: + { + integrity: sha512-bQVlnMLFJ2d35DkPNjEPmd9ueO/rh5EiaZt2bhqiSarPjZIuIV6bPQVqcrEyvNo+AfTrRGVazle1tl597w3gfA==, + } + dependencies: + "@types/node": 20.10.4 + form-data: 4.0.0 + dev: false + + /@types/node-forge@1.3.10: + resolution: + { + integrity: sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw==, + } + dependencies: + "@types/node": 20.10.4 + dev: true + + /@types/node@20.10.4: + resolution: + { + integrity: sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==, + } + dependencies: + undici-types: 5.26.5 /@types/semver@7.5.6: resolution: @@ -1744,6 +2617,27 @@ packages: } dev: false + /@types/unist@2.0.10: + resolution: + { + integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==, + } + dev: false + + /@types/unist@3.0.2: + resolution: + { + integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==, + } + dev: false + + /@types/web-bluetooth@0.0.20: + resolution: + { + integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==, + } + dev: false + /@types/ws@8.5.10: resolution: { @@ -1908,103 +2802,367 @@ packages: eslint-visitor-keys: 3.4.3 dev: false + /@uiw/codemirror-themes@4.21.21(@codemirror/language@6.9.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3): + resolution: + { + integrity: sha512-ljVcMGdaxo75UaH+EqxJ+jLyMVVgeSfW2AKyT1VeLy+4SDpuqNQ7wq5XVxktsG6LH+OvgSFndWXgPANf4+gQcA==, + } + peerDependencies: + "@codemirror/language": ">=6.0.0" + "@codemirror/state": ">=6.0.0" + "@codemirror/view": ">=6.0.0" + dependencies: + "@codemirror/language": 6.9.3 + "@codemirror/state": 6.3.3 + "@codemirror/view": 6.22.3 + dev: false + /@ungap/structured-clone@1.2.0: resolution: { integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==, } - /acorn-jsx@5.3.2(acorn@8.11.2): + /@unhead/dom@1.8.9: resolution: { - integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, + integrity: sha512-qY4CUVNKEM7lEAcTz5t71QYca+NXgUY5RwhSzB6sBBzZxQTiFOeTVKC6uWXU0N+3jBUdP/zdD3iN1JIjziDlng==, } - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.11.2 + "@unhead/schema": 1.8.9 + "@unhead/shared": 1.8.9 + dev: false - /acorn-walk@8.3.1: + /@unhead/schema@1.8.9: resolution: { - integrity: sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==, + integrity: sha512-Cumjt2uLfBMEXflvq7Nk8KNqa/JS4MlRGWkjXx/uUXJ1vUeQqeMV8o3hrnRvDDoTXr9LwPapTMUbtClN3TSBgw==, } - engines: { node: ">=0.4.0" } - dev: true + dependencies: + hookable: 5.5.3 + zhead: 2.2.4 + dev: false - /acorn@8.11.2: + /@unhead/shared@1.8.9: resolution: { - integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==, + integrity: sha512-0o4+CBCi9EnTKPF6cEuLacnUHUkF0u/FfiKrWnKWUiB8wTD1v3UCf5ZCrNCjuJmKHTqj6ZtZ2hIfXsqWfc+3tA==, } - engines: { node: ">=0.4.0" } - hasBin: true + dependencies: + "@unhead/schema": 1.8.9 + dev: false - /ajv@6.12.6: + /@vcarl/remark-headings@0.1.0: resolution: { - integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, + integrity: sha512-ffQxJUcapJ9Bk+fiGN49YJ9RaYMibrSTSezB1Fcrtu+0YSZxA3bsaLlIv1u/4sjPIeW/BKrs4xtMT3l3P9Ba5Q==, } dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 + mdast-util-to-string: 3.2.0 + unist-util-visit: 4.1.2 + dev: false - /ansi-regex@5.0.1: + /@vue/compiler-core@3.3.13: resolution: { - integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, + integrity: sha512-bwi9HShGu7uaZLOErZgsH2+ojsEdsjerbf2cMXPwmvcgZfVPZ2BVZzCVnwZBxTAYd6Mzbmf6izcUNDkWnBBQ6A==, } - engines: { node: ">=8" } + dependencies: + "@babel/parser": 7.23.6 + "@vue/shared": 3.3.13 + estree-walker: 2.0.2 + source-map-js: 1.0.2 + dev: false - /ansi-styles@4.3.0: + /@vue/compiler-dom@3.3.13: resolution: { - integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, + integrity: sha512-EYRDpbLadGtNL0Gph+HoKiYqXLqZ0xSSpR5Dvnu/Ep7ggaCbjRDIus1MMxTS2Qm0koXED4xSlvTZaTnI8cYAsw==, } - engines: { node: ">=8" } dependencies: - color-convert: 2.0.1 + "@vue/compiler-core": 3.3.13 + "@vue/shared": 3.3.13 + dev: false - /anymatch@3.1.3: + /@vue/compiler-sfc@3.3.13: resolution: { - integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, + integrity: sha512-DQVmHEy/EKIgggvnGRLx21hSqnr1smUS9Aq8tfxiiot8UR0/pXKHN9k78/qQ7etyQTFj5em5nruODON7dBeumw==, } - engines: { node: ">= 8" } dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true + "@babel/parser": 7.23.6 + "@vue/compiler-core": 3.3.13 + "@vue/compiler-dom": 3.3.13 + "@vue/compiler-ssr": 3.3.13 + "@vue/reactivity-transform": 3.3.13 + "@vue/shared": 3.3.13 + estree-walker: 2.0.2 + magic-string: 0.30.5 + postcss: 8.4.32 + source-map-js: 1.0.2 + dev: false - /argparse@2.0.1: + /@vue/compiler-ssr@3.3.13: resolution: { - integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, + integrity: sha512-d/P3bCeUGmkJNS1QUZSAvoCIW4fkOKK3l2deE7zrp0ypJEy+En2AcypIkqvcFQOcw3F0zt2VfMvNsA9JmExTaw==, } + dependencies: + "@vue/compiler-dom": 3.3.13 + "@vue/shared": 3.3.13 + dev: false - /array-union@2.1.0: + /@vue/reactivity-transform@3.3.13: resolution: { - integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, + integrity: sha512-oWnydGH0bBauhXvh5KXUy61xr9gKaMbtsMHk40IK9M4gMuKPJ342tKFarY0eQ6jef8906m35q37wwA8DMZOm5Q==, } - engines: { node: ">=8" } + dependencies: + "@babel/parser": 7.23.6 + "@vue/compiler-core": 3.3.13 + "@vue/shared": 3.3.13 + estree-walker: 2.0.2 + magic-string: 0.30.5 dev: false - /as-table@1.0.55: + /@vue/reactivity@3.3.13: resolution: { - integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==, + integrity: sha512-fjzCxceMahHhi4AxUBzQqqVhuA21RJ0COaWTbIBl1PruGW1CeY97louZzLi4smpYx+CHfFPPU/CS8NybbGvPKQ==, } dependencies: - printable-characters: 1.0.42 - dev: true + "@vue/shared": 3.3.13 + dev: false - /asynckit@0.4.0: + /@vue/runtime-core@3.3.13: resolution: { - integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, + integrity: sha512-1TzA5TvGuh2zUwMJgdfvrBABWZ7y8kBwBhm7BXk8rvdx2SsgcGfz2ruv2GzuGZNvL1aKnK8CQMV/jFOrxNQUMA==, + } + dependencies: + "@vue/reactivity": 3.3.13 + "@vue/shared": 3.3.13 + dev: false + + /@vue/runtime-dom@3.3.13: + resolution: + { + integrity: sha512-JJkpE8R/hJKXqVTgUoODwS5wqKtOsmJPEqmp90PDVGygtJ4C0PtOkcEYXwhiVEmef6xeXcIlrT3Yo5aQ4qkHhQ==, + } + dependencies: + "@vue/runtime-core": 3.3.13 + "@vue/shared": 3.3.13 + csstype: 3.1.3 + dev: false + + /@vue/server-renderer@3.3.13(vue@3.3.13): + resolution: + { + integrity: sha512-vSnN+nuf6iSqTL3Qgx/9A+BT+0Zf/VJOgF5uMZrKjYPs38GMYyAU1coDyBNHauehXDaP+zl73VhwWv0vBRBHcg==, + } + peerDependencies: + vue: 3.3.13 + dependencies: + "@vue/compiler-ssr": 3.3.13 + "@vue/shared": 3.3.13 + vue: 3.3.13(typescript@5.3.3) + dev: false + + /@vue/shared@3.3.13: + resolution: + { + integrity: sha512-/zYUwiHD8j7gKx2argXEMCUXVST6q/21DFU0sTfNX0URJroCe3b1UF6vLJ3lQDfLNIiiRl2ONp7Nh5UVWS6QnA==, + } + dev: false + + /@vueuse/core@10.7.0(vue@3.3.13): + resolution: + { + integrity: sha512-4EUDESCHtwu44ZWK3Gc/hZUVhVo/ysvdtwocB5vcauSV4B7NiGY5972WnsojB3vRNdxvAt7kzJWE2h9h7C9d5w==, + } + dependencies: + "@types/web-bluetooth": 0.0.20 + "@vueuse/metadata": 10.7.0 + "@vueuse/shared": 10.7.0(vue@3.3.13) + vue-demi: 0.14.6(vue@3.3.13) + transitivePeerDependencies: + - "@vue/composition-api" + - vue + dev: false + + /@vueuse/metadata@10.7.0: + resolution: + { + integrity: sha512-GlaH7tKP2iBCZ3bHNZ6b0cl9g0CJK8lttkBNUX156gWvNYhTKEtbweWLm9rxCPIiwzYcr/5xML6T8ZUEt+DkvA==, + } + dev: false + + /@vueuse/shared@10.7.0(vue@3.3.13): + resolution: + { + integrity: sha512-kc00uV6CiaTdc3i1CDC4a3lBxzaBE9AgYNtFN87B5OOscqeWElj/uza8qVDmk7/U8JbqoONLbtqiLJ5LGRuqlw==, + } + dependencies: + vue-demi: 0.14.6(vue@3.3.13) + transitivePeerDependencies: + - "@vue/composition-api" + - vue + dev: false + + /@xmldom/xmldom@0.8.10: + resolution: + { + integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==, + } + engines: { node: ">=10.0.0" } + dev: false + + /acorn-jsx@5.3.2(acorn@8.11.2): + resolution: + { + integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, + } + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.2 + + /acorn-walk@8.3.1: + resolution: + { + integrity: sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==, + } + engines: { node: ">=0.4.0" } + dev: true + + /acorn@8.11.2: + resolution: + { + integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==, + } + engines: { node: ">=0.4.0" } + hasBin: true + + /ajv-draft-04@1.0.0(ajv@8.12.0): + resolution: + { + integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==, + } + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + dependencies: + ajv: 8.12.0 + dev: false + + /ajv@6.12.6: + resolution: + { + integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, + } + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + /ajv@8.12.0: + resolution: + { + integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==, + } + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: false + + /ansi-regex@5.0.1: + resolution: + { + integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, + } + engines: { node: ">=8" } + + /ansi-styles@4.3.0: + resolution: + { + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, + } + engines: { node: ">=8" } + dependencies: + color-convert: 2.0.1 + + /anymatch@3.1.3: + resolution: + { + integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, + } + engines: { node: ">= 8" } + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /argparse@1.0.10: + resolution: + { + integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==, + } + dependencies: + sprintf-js: 1.0.3 + dev: false + + /argparse@2.0.1: + resolution: + { + integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, + } + + /array-union@2.1.0: + resolution: + { + integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, + } + engines: { node: ">=8" } + dev: false + + /as-table@1.0.55: + resolution: + { + integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==, + } + dependencies: + printable-characters: 1.0.42 + dev: true + + /asynckit@0.4.0: + resolution: + { + integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, + } + dev: false + + /axios@1.6.2: + resolution: + { + integrity: sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==, + } + dependencies: + follow-redirects: 1.15.3 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + + /bail@2.0.2: + resolution: + { + integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==, } dev: false @@ -2111,6 +3269,13 @@ packages: ieee754: 1.2.1 dev: false + /call-me-maybe@1.0.2: + resolution: + { + integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==, + } + dev: false + /callsites@3.1.0: resolution: { @@ -2138,6 +3303,13 @@ packages: - supports-color dev: true + /ccount@2.0.1: + resolution: + { + integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==, + } + dev: false + /chalk@4.1.2: resolution: { @@ -2156,6 +3328,27 @@ packages: engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } dev: true + /character-entities-html4@2.1.0: + resolution: + { + integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==, + } + dev: false + + /character-entities-legacy@3.0.0: + resolution: + { + integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==, + } + dev: false + + /character-entities@2.0.2: + resolution: + { + integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==, + } + dev: false + /chokidar@3.5.3: resolution: { @@ -2181,6 +3374,15 @@ packages: } dev: false + /class-variance-authority@0.7.0: + resolution: + { + integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==, + } + dependencies: + clsx: 2.0.0 + dev: false + /cli-color@2.0.3: resolution: { @@ -2195,6 +3397,31 @@ packages: timers-ext: 0.1.7 dev: true + /clsx@2.0.0: + resolution: + { + integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==, + } + engines: { node: ">=6" } + dev: false + + /codemirror@6.0.1(@lezer/common@1.1.2): + resolution: + { + integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==, + } + dependencies: + "@codemirror/autocomplete": 6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.2) + "@codemirror/commands": 6.3.2 + "@codemirror/language": 6.9.3 + "@codemirror/lint": 6.4.2 + "@codemirror/search": 6.5.5 + "@codemirror/state": 6.3.3 + "@codemirror/view": 6.22.3 + transitivePeerDependencies: + - "@lezer/common" + dev: false + /color-convert@2.0.1: resolution: { @@ -2220,6 +3447,13 @@ packages: delayed-stream: 1.0.0 dev: false + /comma-separated-tokens@2.0.3: + resolution: + { + integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==, + } + dev: false + /commander@9.5.0: resolution: { @@ -2234,6 +3468,14 @@ packages: integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, } + /content-type@1.0.5: + resolution: + { + integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==, + } + engines: { node: ">= 0.6" } + dev: false + /cookie@0.5.0: resolution: { @@ -2252,6 +3494,13 @@ packages: is-what: 4.1.16 dev: true + /crelt@1.0.6: + resolution: + { + integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==, + } + dev: false + /cross-spawn@7.0.3: resolution: { @@ -2263,37 +3512,68 @@ packages: shebang-command: 2.0.0 which: 2.0.2 - /d@1.0.1: - resolution: - { - integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==, - } - dependencies: - es5-ext: 0.10.62 - type: 1.2.0 - dev: true - - /data-uri-to-buffer@2.0.2: + /cssesc@3.0.0: resolution: { - integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==, + integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==, } - dev: true + engines: { node: ">=4" } + hasBin: true + dev: false - /data-uri-to-buffer@4.0.1: + /csstype@3.1.3: resolution: { - integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==, + integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==, } - engines: { node: ">= 12" } dev: false - /debug@4.3.4: + /cva@1.0.0-beta.1(typescript@5.3.3): resolution: { - integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, + integrity: sha512-gznFqTgERU9q4wg7jfgqtt34+RUt9S5t0xDAAEuDwQEAXEgjdDkKXpLLNjwSxsB4Ln/sqWJEH7yhE8Ny0mxd0w==, } - engines: { node: ">=6.0" } + peerDependencies: + typescript: ">= 4.5.5 < 6" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + clsx: 2.0.0 + typescript: 5.3.3 + dev: false + + /d@1.0.1: + resolution: + { + integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==, + } + 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 + + /data-uri-to-buffer@4.0.1: + resolution: + { + integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==, + } + engines: { node: ">= 12" } + dev: false + + /debug@4.3.4: + resolution: + { + integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, + } + engines: { node: ">=6.0" } peerDependencies: supports-color: "*" peerDependenciesMeta: @@ -2302,6 +3582,15 @@ packages: dependencies: ms: 2.1.2 + /decode-named-character-reference@1.0.2: + resolution: + { + integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==, + } + dependencies: + character-entities: 2.0.2 + dev: false + /decompress-response@6.0.0: resolution: { @@ -2334,6 +3623,14 @@ packages: engines: { node: ">=0.4.0" } dev: false + /dequal@2.0.3: + resolution: + { + integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==, + } + engines: { node: ">=6" } + dev: false + /detect-libc@2.0.2: resolution: { @@ -2342,6 +3639,15 @@ packages: engines: { node: ">=8" } dev: false + /devlop@1.1.0: + resolution: + { + integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==, + } + dependencies: + dequal: 2.0.3 + dev: false + /difflib@0.2.4: resolution: { @@ -2507,6 +3813,14 @@ packages: once: 1.4.0 dev: false + /entities@4.5.0: + resolution: + { + integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==, + } + engines: { node: ">=0.12" } + dev: false + /es5-ext@0.10.62: resolution: { @@ -2673,6 +3987,14 @@ packages: } engines: { node: ">=10" } + /escape-string-regexp@5.0.0: + resolution: + { + integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==, + } + engines: { node: ">=12" } + dev: false + /eslint-config-google@0.14.0(eslint@8.55.0): resolution: { @@ -2773,6 +4095,15 @@ packages: acorn-jsx: 5.3.2(acorn@8.11.2) eslint-visitor-keys: 3.4.3 + /esprima@4.0.1: + resolution: + { + integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==, + } + engines: { node: ">=4" } + hasBin: true + dev: false + /esquery@1.5.0: resolution: { @@ -2805,6 +4136,13 @@ packages: } dev: true + /estree-walker@2.0.2: + resolution: + { + integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==, + } + dev: false + /esutils@2.0.3: resolution: { @@ -2847,6 +4185,13 @@ packages: type: 2.7.2 dev: true + /extend@3.0.2: + resolution: + { + integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==, + } + dev: false + /fast-deep-equal@3.1.3: resolution: { @@ -2950,6 +4295,19 @@ packages: integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==, } + /follow-redirects@1.15.3: + resolution: + { + integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==, + } + engines: { node: ">=4.0" } + peerDependencies: + debug: "*" + peerDependenciesMeta: + debug: + optional: true + dev: false + /form-data@4.0.0: resolution: { @@ -2962,6 +4320,17 @@ packages: mime-types: 2.1.35 dev: false + /formdata-node@4.4.1: + resolution: + { + integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==, + } + engines: { node: ">= 12.20" } + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 4.0.0-beta.3 + dev: false + /formdata-polyfill@4.0.10: resolution: { @@ -2996,6 +4365,21 @@ packages: dev: true optional: true + /fuse.js@6.6.2: + resolution: + { + integrity: sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==, + } + engines: { node: ">=10" } + dev: false + + /get-own-enumerable-property-symbols@3.0.2: + resolution: + { + integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==, + } + dev: false + /get-source@2.0.12: resolution: { @@ -3022,6 +4406,20 @@ packages: } dev: false + /github-slugger@1.5.0: + resolution: + { + integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==, + } + dev: false + + /github-slugger@2.0.0: + resolution: + { + integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==, + } + dev: false + /glob-parent@5.1.2: resolution: { @@ -3121,322 +4519,1177 @@ packages: } engines: { node: ">=8" } - /heap@0.2.7: + /hast-util-embedded@3.0.0: resolution: { - integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==, + integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==, } - dev: true + dependencies: + "@types/hast": 3.0.3 + hast-util-is-element: 3.0.0 + dev: false - /hono@3.11.3: + /hast-util-from-parse5@8.0.1: resolution: { - integrity: sha512-MWYBcIS4dZJo9e/852Zwl+gqBiUSRknMOZ/MbW7kW8JiWixTJ58pzXVIeBq7jnvFq3AZ9uQ35QyVpzV05sdNFw==, + integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==, } - engines: { node: ">=16.0.0" } + dependencies: + "@types/hast": 3.0.3 + "@types/unist": 3.0.2 + devlop: 1.1.0 + hastscript: 8.0.0 + property-information: 6.4.0 + vfile: 6.0.1 + vfile-location: 5.0.2 + web-namespaces: 2.0.1 dev: false - /husky@8.0.3: + /hast-util-has-property@2.0.1: resolution: { - integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==, + integrity: sha512-X2+RwZIMTMKpXUzlotatPzWj8bspCymtXH3cfG3iQKV+wPF53Vgaqxi/eLqGck0wKq1kS9nvoB1wchbCPEL8sg==, } - engines: { node: ">=14" } - hasBin: true - dev: true + dev: false - /ieee754@1.2.1: + /hast-util-has-property@3.0.0: resolution: { - integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, + integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==, } + dependencies: + "@types/hast": 3.0.3 dev: false - /ignore@5.3.0: + /hast-util-heading-rank@2.1.1: resolution: { - integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==, + integrity: sha512-iAuRp+ESgJoRFJbSyaqsfvJDY6zzmFoEnL1gtz1+U8gKtGGj1p0CVlysuUAUjq95qlZESHINLThwJzNGmgGZxA==, } - engines: { node: ">= 4" } + dependencies: + "@types/hast": 2.3.8 + dev: false - /import-fresh@3.3.0: + /hast-util-is-body-ok-link@3.0.0: resolution: { - integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, + integrity: sha512-VFHY5bo2nY8HiV6nir2ynmEB1XkxzuUffhEGeVx7orbu/B1KaGyeGgMZldvMVx5xWrDlLLG/kQ6YkJAMkBEx0w==, } - engines: { node: ">=6" } dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 + "@types/hast": 3.0.3 + dev: false - /imurmurhash@0.1.4: + /hast-util-is-element@3.0.0: resolution: { - integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, + integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==, } - engines: { node: ">=0.8.19" } + dependencies: + "@types/hast": 3.0.3 + dev: false - /inflight@1.0.6: + /hast-util-parse-selector@4.0.0: resolution: { - integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, + integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==, } dependencies: - once: 1.4.0 - wrappy: 1.0.2 + "@types/hast": 3.0.3 + dev: false - /inherits@2.0.4: + /hast-util-phrasing@3.0.1: resolution: { - integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, + integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==, } + dependencies: + "@types/hast": 3.0.3 + hast-util-embedded: 3.0.0 + hast-util-has-property: 3.0.0 + hast-util-is-body-ok-link: 3.0.0 + hast-util-is-element: 3.0.0 + dev: false - /ini@1.3.8: + /hast-util-raw@9.0.1: resolution: { - integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, + integrity: sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA==, } + dependencies: + "@types/hast": 3.0.3 + "@types/unist": 3.0.2 + "@ungap/structured-clone": 1.2.0 + hast-util-from-parse5: 8.0.1 + hast-util-to-parse5: 8.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.0.2 + parse5: 7.1.2 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + web-namespaces: 2.0.1 + zwitch: 2.0.4 dev: false - /is-binary-path@2.1.0: + /hast-util-sanitize@5.0.1: resolution: { - integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, + integrity: sha512-IGrgWLuip4O2nq5CugXy4GI2V8kx4sFVy5Hd4vF7AR2gxS0N9s7nEAVUyeMtZKZvzrxVsHt73XdTsno1tClIkQ==, } - engines: { node: ">=8" } dependencies: - binary-extensions: 2.2.0 - dev: true + "@types/hast": 3.0.3 + "@ungap/structured-clone": 1.2.0 + unist-util-position: 5.0.0 + dev: false - /is-extglob@2.1.1: + /hast-util-to-html@9.0.0: resolution: { - integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, + integrity: sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw==, } - engines: { node: ">=0.10.0" } + dependencies: + "@types/hast": 3.0.3 + "@types/unist": 3.0.2 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-raw: 9.0.1 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.0.2 + property-information: 6.4.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.3 + zwitch: 2.0.4 + dev: false - /is-glob@4.0.3: + /hast-util-to-parse5@8.0.0: resolution: { - integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, + integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==, } - engines: { node: ">=0.10.0" } dependencies: - is-extglob: 2.1.1 + "@types/hast": 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 6.4.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + dev: false - /is-number@7.0.0: + /hast-util-to-string@2.0.0: resolution: { - integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, + integrity: sha512-02AQ3vLhuH3FisaMM+i/9sm4OXGSq1UhOOCpTLLQtHdL3tZt7qil69r8M8iDkZYyC0HCFylcYoP+8IO7ddta1A==, } - engines: { node: ">=0.12.0" } + dependencies: + "@types/hast": 2.3.8 + dev: false - /is-path-inside@3.0.3: + /hast-util-to-text@4.0.0: resolution: { - integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, + integrity: sha512-EWiE1FSArNBPUo1cKWtzqgnuRQwEeQbQtnFJRYV1hb1BWDgrAlBU0ExptvZMM/KSA82cDpm2sFGf3Dmc5Mza3w==, } - engines: { node: ">=8" } + dependencies: + "@types/hast": 3.0.3 + "@types/unist": 3.0.2 + hast-util-is-element: 3.0.0 + unist-util-find-after: 5.0.0 + dev: false - /is-promise@2.2.2: + /hast-util-whitespace@3.0.0: resolution: { - integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==, + integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==, } - dev: true + dependencies: + "@types/hast": 3.0.3 + dev: false - /is-what@4.1.16: + /hastscript@8.0.0: resolution: { - integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==, + integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==, } - engines: { node: ">=12.13" } - dev: true + dependencies: + "@types/hast": 3.0.3 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 6.4.0 + space-separated-tokens: 2.0.2 + dev: false - /isexe@2.0.0: + /heap@0.2.7: resolution: { - integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, + integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==, } + dev: true - /js-base64@3.7.5: + /highlight.js@11.9.0: resolution: { - integrity: sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==, + integrity: sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==, } + engines: { node: ">=12.0.0" } dev: false - /js-yaml@4.1.0: + /hono@3.11.3: resolution: { - integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, + integrity: sha512-MWYBcIS4dZJo9e/852Zwl+gqBiUSRknMOZ/MbW7kW8JiWixTJ58pzXVIeBq7jnvFq3AZ9uQ35QyVpzV05sdNFw==, } - hasBin: true - dependencies: - argparse: 2.0.1 + engines: { node: ">=16.0.0" } + dev: false - /json-buffer@3.0.1: + /hookable@5.5.3: resolution: { - integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, + integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==, } + dev: false - /json-diff@0.9.0: + /html-void-elements@3.0.0: resolution: { - integrity: sha512-cVnggDrVkAAA3OvFfHpFEhOnmcsUpleEKq4d4O8sQWWSH40MBrWstKigVB1kGrgLWzuom+7rRdaCsnBD6VyObQ==, + integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==, } - hasBin: true - dependencies: - cli-color: 2.0.3 - difflib: 0.2.4 - dreamopt: 0.8.0 - dev: true + dev: false - /json-schema-traverse@0.4.1: + /html-whitespace-sensitive-tag-names@3.0.0: resolution: { - integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, + integrity: sha512-KlClZ3/Qy5UgvpvVvDomGhnQhNWH5INE8GwvSIQ9CWt1K0zbbXrl7eN5bWaafOZgtmO3jMPwUqmrmEwinhPq1w==, } + dev: false - /json-stable-stringify-without-jsonify@1.0.1: + /httpsnippet-lite@3.0.5: resolution: { - integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, + integrity: sha512-So4qTXY5iFj5XtFDwyz2PicUu+8NWrI8e8h+ZeZoVtMNcFQp4FFIntBHUE+JPUG6QQU8o1VHCy+X4ETRDwt9CA==, } + engines: { node: ">=14.13" } + dependencies: + "@types/har-format": 1.2.15 + formdata-node: 4.4.1 + stringify-object: 3.3.0 + dev: false - /jsonc-parser@3.2.0: + /husky@8.0.3: resolution: { - integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==, + integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==, } + engines: { node: ">=14" } + hasBin: true dev: true - /keyv@4.5.4: + /ieee754@1.2.1: + resolution: + { + integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, + } + dev: false + + /ignore@5.3.0: + resolution: + { + integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==, + } + engines: { node: ">= 4" } + + /import-fresh@3.3.0: + resolution: + { + integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, + } + engines: { node: ">=6" } + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + /imurmurhash@0.1.4: + resolution: + { + integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, + } + engines: { node: ">=0.8.19" } + + /inflight@1.0.6: + resolution: + { + integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, + } + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits@2.0.4: + resolution: + { + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, + } + + /ini@1.3.8: + resolution: + { + integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, + } + dev: false + + /is-absolute-url@4.0.1: + resolution: + { + integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dev: false + + /is-binary-path@2.1.0: + resolution: + { + integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, + } + engines: { node: ">=8" } + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-buffer@2.0.5: + resolution: + { + integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==, + } + engines: { node: ">=4" } + dev: false + + /is-extglob@2.1.1: + resolution: + { + integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, + } + engines: { node: ">=0.10.0" } + + /is-glob@4.0.3: + resolution: + { + integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, + } + engines: { node: ">=0.10.0" } + dependencies: + is-extglob: 2.1.1 + + /is-number@7.0.0: + resolution: + { + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, + } + engines: { node: ">=0.12.0" } + + /is-obj@1.0.1: + resolution: + { + integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==, + } + engines: { node: ">=0.10.0" } + dev: false + + /is-path-inside@3.0.3: + resolution: + { + integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, + } + engines: { node: ">=8" } + + /is-plain-obj@4.1.0: + resolution: + { + integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==, + } + engines: { node: ">=12" } + dev: false + + /is-promise@2.2.2: + resolution: + { + integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==, + } + dev: true + + /is-regexp@1.0.0: + resolution: + { + integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==, + } + engines: { node: ">=0.10.0" } + dev: false + + /is-what@4.1.16: + resolution: + { + integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==, + } + engines: { node: ">=12.13" } + dev: true + + /isexe@2.0.0: + resolution: + { + integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, + } + + /javascript-time-ago@2.5.9: + resolution: + { + integrity: sha512-pQ8mNco/9g9TqWXWWjP0EWl6i/lAQScOyEeXy5AB+f7MfLSdgyV9BJhiOD1zrIac/lrxPYOWNbyl/IW8CW5n0A==, + } + dependencies: + relative-time-format: 1.1.6 + dev: false + + /js-base64@3.7.5: + resolution: + { + integrity: sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==, + } + dev: false + + /js-yaml@3.14.1: + resolution: + { + integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==, + } + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: false + + /js-yaml@4.1.0: + resolution: + { + integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, + } + hasBin: true + dependencies: + argparse: 2.0.1 + + /json-buffer@3.0.1: + resolution: + { + integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, + } + + /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-schema-traverse@0.4.1: + resolution: + { + integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, + } + + /json-schema-traverse@1.0.0: + resolution: + { + integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==, + } + dev: false + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: + { + integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, + } + + /jsonc-parser@3.2.0: + resolution: + { + integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==, + } + dev: true + + /keyv@4.5.4: + resolution: + { + integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, + } + dependencies: + json-buffer: 3.0.1 + + /levn@0.4.1: + resolution: + { + integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, + } + engines: { node: ">= 0.8.0" } + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + /libsql@0.2.0-pre.4: + resolution: + { + integrity: sha512-ZAud4bIZwWJjZUKvQOgg3yVX2fVuqVuPOtjFAPuo+FpfMcsnBpGfOcIJxvfik5qKchyqHd/fpHWbFk7/X0XuHg==, + } + cpu: [x64, arm64] + os: [darwin, linux, win32] + dependencies: + "@neon-rs/load": 0.0.4 + detect-libc: 2.0.2 + optionalDependencies: + "@libsql/darwin-arm64": 0.2.0-pre.4 + "@libsql/darwin-x64": 0.2.0-pre.4 + "@libsql/linux-arm64-gnu": 0.2.0-pre.4 + "@libsql/linux-arm64-musl": 0.2.0-pre.4 + "@libsql/linux-x64-gnu": 0.2.0-pre.4 + "@libsql/linux-x64-musl": 0.2.0-pre.4 + "@libsql/win32-x64-msvc": 0.2.0-pre.4 + dev: false + + /locate-path@6.0.0: + resolution: + { + integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, + } + engines: { node: ">=10" } + dependencies: + p-locate: 5.0.0 + + /lodash.merge@4.6.2: + resolution: + { + integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, + } + + /lodash.throttle@4.1.1: + resolution: + { + integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==, + } + dev: true + + /lodash@4.17.21: + resolution: + { + integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, + } + + /longest-streak@3.1.0: + resolution: + { + integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==, + } + dev: false + + /lowlight@3.1.0: + resolution: + { + integrity: sha512-CEbNVoSikAxwDMDPjXlqlFYiZLkDJHwyGu/MfOsJnF3d7f3tds5J3z8s/l9TMXhzfsJCCJEAsD78842mwmg0PQ==, + } + dependencies: + "@types/hast": 3.0.3 + devlop: 1.1.0 + highlight.js: 11.9.0 + dev: false + + /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 + + /lucia@3.0.0-beta.11: + resolution: + { + integrity: sha512-OXZfnM4KifDjkTTG3ruihormyOcXBz6wjAWibAAlw42zWBXDsleFR34gwKBxxXBa+TodzuKy7rcg8FGOMwwSGA==, + } + dependencies: + oslo: 0.23.5 + dev: false + + /magic-string@0.25.9: + resolution: + { + integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==, + } + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /magic-string@0.30.5: + resolution: + { + integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==, + } + engines: { node: ">=12" } + dependencies: + "@jridgewell/sourcemap-codec": 1.4.15 + dev: false + + /markdown-table@3.0.3: + resolution: + { + integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==, + } + dev: false + + /mdast-util-find-and-replace@3.0.1: + resolution: + { + integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==, + } + dependencies: + "@types/mdast": 4.0.3 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + dev: false + + /mdast-util-from-markdown@2.0.0: + resolution: + { + integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==, + } + dependencies: + "@types/mdast": 4.0.3 + "@types/unist": 3.0.2 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-decode-string: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-autolink-literal@2.0.0: + resolution: + { + integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==, + } + dependencies: + "@types/mdast": 4.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.1 + micromark-util-character: 2.0.1 + dev: false + + /mdast-util-gfm-footnote@2.0.0: + resolution: + { + integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==, + } + dependencies: + "@types/mdast": 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + micromark-util-normalize-identifier: 2.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-strikethrough@2.0.0: + resolution: + { + integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==, + } + dependencies: + "@types/mdast": 4.0.3 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-table@2.0.0: + resolution: + { + integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==, + } + dependencies: + "@types/mdast": 4.0.3 + devlop: 1.1.0 + markdown-table: 3.0.3 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-task-list-item@2.0.0: + resolution: + { + integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==, + } + dependencies: + "@types/mdast": 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm@3.0.0: + resolution: + { + integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==, + } + dependencies: + mdast-util-from-markdown: 2.0.0 + mdast-util-gfm-autolink-literal: 2.0.0 + mdast-util-gfm-footnote: 2.0.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-phrasing@4.0.0: + resolution: + { + integrity: sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==, + } + dependencies: + "@types/mdast": 4.0.3 + unist-util-is: 6.0.0 + dev: false + + /mdast-util-to-hast@13.0.2: + resolution: + { + integrity: sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==, + } + dependencies: + "@types/hast": 3.0.3 + "@types/mdast": 4.0.3 + "@ungap/structured-clone": 1.2.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.0 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + dev: false + + /mdast-util-to-markdown@2.1.0: + resolution: + { + integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==, + } + dependencies: + "@types/mdast": 4.0.3 + "@types/unist": 3.0.2 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.0.0 + mdast-util-to-string: 4.0.0 + micromark-util-decode-string: 2.0.0 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + dev: false + + /mdast-util-to-string@3.2.0: + resolution: + { + integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==, + } + dependencies: + "@types/mdast": 3.0.15 + dev: false + + /mdast-util-to-string@4.0.0: + resolution: + { + integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==, + } + dependencies: + "@types/mdast": 4.0.3 + 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 + + /merge2@1.4.1: + resolution: + { + integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, + } + engines: { node: ">= 8" } + dev: false + + /micromark-core-commonmark@2.0.0: + resolution: + { + integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==, + } + dependencies: + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-factory-destination: 2.0.0 + micromark-factory-label: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-factory-title: 2.0.0 + micromark-factory-whitespace: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-html-tag-name: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-subtokenize: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-autolink-literal@2.0.0: + resolution: + { + integrity: sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==, + } + dependencies: + micromark-util-character: 2.0.1 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-footnote@2.0.0: + resolution: + { + integrity: sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==, + } + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-strikethrough@2.0.0: + resolution: + { + integrity: sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==, + } + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-table@2.0.0: + resolution: + { + integrity: sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==, + } + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-tagfilter@2.0.0: + resolution: + { + integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==, + } + dependencies: + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-task-list-item@2.0.1: + resolution: + { + integrity: sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==, + } + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm@3.0.0: + resolution: + { + integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==, + } + dependencies: + micromark-extension-gfm-autolink-literal: 2.0.0 + micromark-extension-gfm-footnote: 2.0.0 + micromark-extension-gfm-strikethrough: 2.0.0 + micromark-extension-gfm-table: 2.0.0 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.0.1 + micromark-util-combine-extensions: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-destination@2.0.0: + resolution: + { + integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==, + } + dependencies: + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-label@2.0.0: + resolution: + { + integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==, + } + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-space@2.0.0: + resolution: + { + integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==, + } + dependencies: + micromark-util-character: 2.0.1 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-title@2.0.0: + resolution: + { + integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==, + } + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-whitespace@2.0.0: + resolution: + { + integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==, + } + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-character@2.0.1: + resolution: + { + integrity: sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==, + } + dependencies: + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-chunked@2.0.0: + resolution: + { + integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==, + } + dependencies: + micromark-util-symbol: 2.0.0 + dev: false + + /micromark-util-classify-character@2.0.0: resolution: { - integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, + integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==, } dependencies: - json-buffer: 3.0.1 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false - /levn@0.4.1: + /micromark-util-combine-extensions@2.0.0: resolution: { - integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, + integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==, } - engines: { node: ">= 0.8.0" } dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 + micromark-util-chunked: 2.0.0 + micromark-util-types: 2.0.0 + dev: false - /libsql@0.2.0-pre.4: + /micromark-util-decode-numeric-character-reference@2.0.1: resolution: { - integrity: sha512-ZAud4bIZwWJjZUKvQOgg3yVX2fVuqVuPOtjFAPuo+FpfMcsnBpGfOcIJxvfik5qKchyqHd/fpHWbFk7/X0XuHg==, + integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==, } - cpu: [x64, arm64] - os: [darwin, linux, win32] dependencies: - "@neon-rs/load": 0.0.4 - detect-libc: 2.0.2 - optionalDependencies: - "@libsql/darwin-arm64": 0.2.0-pre.4 - "@libsql/darwin-x64": 0.2.0-pre.4 - "@libsql/linux-arm64-gnu": 0.2.0-pre.4 - "@libsql/linux-arm64-musl": 0.2.0-pre.4 - "@libsql/linux-x64-gnu": 0.2.0-pre.4 - "@libsql/linux-x64-musl": 0.2.0-pre.4 - "@libsql/win32-x64-msvc": 0.2.0-pre.4 + micromark-util-symbol: 2.0.0 dev: false - /locate-path@6.0.0: + /micromark-util-decode-string@2.0.0: resolution: { - integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, + integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==, } - engines: { node: ">=10" } dependencies: - p-locate: 5.0.0 + decode-named-character-reference: 1.0.2 + micromark-util-character: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-symbol: 2.0.0 + dev: false - /lodash.merge@4.6.2: + /micromark-util-encode@2.0.0: resolution: { - integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, + integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==, } + dev: false - /lodash.throttle@4.1.1: + /micromark-util-html-tag-name@2.0.0: resolution: { - integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==, + integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==, } - dev: true + dev: false - /lodash@4.17.21: + /micromark-util-normalize-identifier@2.0.0: resolution: { - integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, + integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==, } - dev: true + dependencies: + micromark-util-symbol: 2.0.0 + dev: false - /lru-cache@6.0.0: + /micromark-util-resolve-all@2.0.0: resolution: { - integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, + integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==, } - engines: { node: ">=10" } dependencies: - yallist: 4.0.0 + micromark-util-types: 2.0.0 + dev: false - /lru-queue@0.1.0: + /micromark-util-sanitize-uri@2.0.0: resolution: { - integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==, + integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==, } dependencies: - es5-ext: 0.10.62 - dev: true + micromark-util-character: 2.0.1 + micromark-util-encode: 2.0.0 + micromark-util-symbol: 2.0.0 + dev: false - /lucia@3.0.0-beta.11: + /micromark-util-subtokenize@2.0.0: resolution: { - integrity: sha512-OXZfnM4KifDjkTTG3ruihormyOcXBz6wjAWibAAlw42zWBXDsleFR34gwKBxxXBa+TodzuKy7rcg8FGOMwwSGA==, + integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==, } dependencies: - oslo: 0.23.5 + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 dev: false - /magic-string@0.25.9: + /micromark-util-symbol@2.0.0: resolution: { - integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==, + integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==, } - dependencies: - sourcemap-codec: 1.4.8 - dev: true + dev: false - /memoizee@0.4.15: + /micromark-util-types@2.0.0: resolution: { - integrity: sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==, + integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==, } - 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 + dev: false - /merge2@1.4.1: + /micromark@4.0.0: resolution: { - integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, + integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==, } - engines: { node: ">= 8" } + dependencies: + "@types/debug": 4.1.12 + debug: 4.3.4 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-chunked: 2.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-encode: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-subtokenize: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + transitivePeerDependencies: + - supports-color dev: false /micromatch@4.0.5: @@ -3574,7 +5827,15 @@ packages: } engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } hasBin: true - dev: true + + /nanoid@5.0.4: + resolution: + { + integrity: sha512-vAjmBf13gsmhXSgBrtIclinISzFFy22WwCYoyilZlsrRXNIHSwgFQ1bEdjRwMT3aoadeIF6HMuDRlOxzfXV8ig==, + } + engines: { node: ^18 || >=20 } + hasBin: true + dev: false /napi-build-utils@1.0.2: resolution: @@ -3665,6 +5926,13 @@ packages: dependencies: wrappy: 1.0.2 + /openapi-types@12.1.3: + resolution: + { + integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==, + } + dev: false + /openapi3-ts@4.1.2: resolution: { @@ -3724,6 +5992,23 @@ packages: dependencies: callsites: 3.1.0 + /parse-ms@3.0.0: + resolution: + { + integrity: sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==, + } + engines: { node: ">=12" } + dev: false + + /parse5@7.1.2: + resolution: + { + integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==, + } + dependencies: + entities: 4.5.0 + dev: false + /path-exists@4.0.0: resolution: { @@ -3760,6 +6045,13 @@ packages: engines: { node: ">=8" } dev: false + /picocolors@1.0.0: + resolution: + { + integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==, + } + dev: false + /picomatch@2.3.1: resolution: { @@ -3767,6 +6059,42 @@ packages: } engines: { node: ">=8.6" } + /postcss-nested@6.0.1(postcss@8.4.32): + resolution: + { + integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==, + } + engines: { node: ">=12.0" } + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.32 + postcss-selector-parser: 6.0.13 + dev: false + + /postcss-selector-parser@6.0.13: + resolution: + { + integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==, + } + engines: { node: ">=4" } + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: false + + /postcss@8.4.32: + resolution: + { + integrity: sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==, + } + engines: { node: ^10 || ^12 || >=14 } + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: false + /prebuild-install@7.1.1: resolution: { @@ -3805,6 +6133,24 @@ packages: hasBin: true dev: false + /pretty-bytes@6.1.1: + resolution: + { + integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==, + } + engines: { node: ^14.13.1 || >=16.0.0 } + dev: false + + /pretty-ms@8.0.0: + resolution: + { + integrity: sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==, + } + engines: { node: ">=14.16" } + dependencies: + parse-ms: 3.0.0 + dev: false + /printable-characters@1.0.42: resolution: { @@ -3812,6 +6158,20 @@ packages: } dev: true + /property-information@6.4.0: + resolution: + { + integrity: sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ==, + } + dev: false + + /proxy-from-env@1.1.0: + resolution: + { + integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==, + } + dev: false + /pump@3.0.0: resolution: { @@ -3822,53 +6182,222 @@ packages: once: 1.4.0 dev: false - /punycode@2.3.1: + /punycode@2.3.1: + resolution: + { + integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, + } + engines: { node: ">=6" } + + /queue-microtask@1.2.3: + resolution: + { + integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, + } + + /rc@1.2.8: + resolution: + { + integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==, + } + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: false + + /readable-stream@3.6.2: + resolution: + { + integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, + } + engines: { node: ">= 6" } + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + + /readdirp@3.6.0: + resolution: + { + integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, + } + engines: { node: ">=8.10.0" } + dependencies: + picomatch: 2.3.1 + dev: true + + /regenerator-runtime@0.14.1: + resolution: + { + integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==, + } + dev: false + + /rehype-external-links@3.0.0: + resolution: + { + integrity: sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==, + } + dependencies: + "@types/hast": 3.0.3 + "@ungap/structured-clone": 1.2.0 + hast-util-is-element: 3.0.0 + is-absolute-url: 4.0.1 + space-separated-tokens: 2.0.2 + unist-util-visit: 5.0.0 + dev: false + + /rehype-format@5.0.0: + resolution: + { + integrity: sha512-kM4II8krCHmUhxrlvzFSptvaWh280Fr7UGNJU5DCMuvmAwGCNmGfi9CvFAQK6JDjsNoRMWQStglK3zKJH685Wg==, + } + dependencies: + "@types/hast": 3.0.3 + hast-util-embedded: 3.0.0 + hast-util-is-element: 3.0.0 + hast-util-phrasing: 3.0.1 + hast-util-whitespace: 3.0.0 + html-whitespace-sensitive-tag-names: 3.0.0 + rehype-minify-whitespace: 6.0.0 + unist-util-visit-parents: 6.0.1 + dev: false + + /rehype-highlight@7.0.0: + resolution: + { + integrity: sha512-QtobgRgYoQaK6p1eSr2SD1i61f7bjF2kZHAQHxeCHAuJf7ZUDMvQ7owDq9YTkmar5m5TSUol+2D3bp3KfJf/oA==, + } + dependencies: + "@types/hast": 3.0.3 + hast-util-to-text: 4.0.0 + lowlight: 3.1.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + dev: false + + /rehype-minify-whitespace@6.0.0: + resolution: + { + integrity: sha512-i9It4YHR0Sf3GsnlR5jFUKXRr9oayvEk9GKQUkwZv6hs70OH9q3OCZrq9PpLvIGKt3W+JxBOxCidNVpH/6rWdA==, + } + dependencies: + "@types/hast": 3.0.3 + hast-util-embedded: 3.0.0 + hast-util-is-element: 3.0.0 + hast-util-whitespace: 3.0.0 + unist-util-is: 6.0.0 + dev: false + + /rehype-sanitize@6.0.0: + resolution: + { + integrity: sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==, + } + dependencies: + "@types/hast": 3.0.3 + hast-util-sanitize: 5.0.1 + dev: false + + /rehype-slug-custom-id@1.1.0: + resolution: + { + integrity: sha512-lLdTHGd7u5bOXRDnD78/VHrVZsG63nN6lZUuQgcuupGt1+v+uDW7pCeQS0cvptRcZPYzg8B+0bf8sUiMBKsjZw==, + } + dependencies: + "@types/hast": 2.3.8 + github-slugger: 1.5.0 + hast-util-has-property: 2.0.1 + hast-util-heading-rank: 2.1.1 + hast-util-to-string: 2.0.0 + lodash: 4.17.21 + unified: 10.1.2 + unist-util-visit: 4.1.2 + dev: false + + /rehype-stringify@10.0.0: + resolution: + { + integrity: sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ==, + } + dependencies: + "@types/hast": 3.0.3 + hast-util-to-html: 9.0.0 + unified: 11.0.4 + dev: false + + /relative-time-format@1.1.6: + resolution: + { + integrity: sha512-aCv3juQw4hT1/P/OrVltKWLlp15eW1GRcwP1XdxHrPdZE9MtgqFpegjnTjLhi2m2WI9MT/hQQtE+tjEWG1hgkQ==, + } + dev: false + + /remark-gfm@4.0.0: resolution: { - integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, + integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==, } - engines: { node: ">=6" } + dependencies: + "@types/mdast": 4.0.3 + mdast-util-gfm: 3.0.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + dev: false - /queue-microtask@1.2.3: + /remark-parse@11.0.0: resolution: { - integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, + integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==, } + dependencies: + "@types/mdast": 4.0.3 + mdast-util-from-markdown: 2.0.0 + micromark-util-types: 2.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + dev: false - /rc@1.2.8: + /remark-rehype@11.0.0: resolution: { - integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==, + integrity: sha512-vx8x2MDMcxuE4lBmQ46zYUDfcFMmvg80WYX+UNLeG6ixjdCCLcw1lrgAukwBTuOFsS78eoAedHGn9sNM0w7TPw==, } - hasBin: true dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 + "@types/hast": 3.0.3 + "@types/mdast": 4.0.3 + mdast-util-to-hast: 13.0.2 + unified: 11.0.4 + vfile: 6.0.1 dev: false - /readable-stream@3.6.2: + /remark-stringify@11.0.0: resolution: { - integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, + integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==, } - engines: { node: ">= 6" } dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 + "@types/mdast": 4.0.3 + mdast-util-to-markdown: 2.1.0 + unified: 11.0.4 dev: false - /readdirp@3.6.0: + /require-from-string@2.0.2: resolution: { - integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, + integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==, } - engines: { node: ">=8.10.0" } - dependencies: - picomatch: 2.3.1 - dev: true + engines: { node: ">=0.10.0" } + dev: false /resolve-from@4.0.0: resolution: @@ -4023,6 +6552,14 @@ packages: engines: { node: ">=8" } dev: false + /source-map-js@1.0.2: + resolution: + { + integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==, + } + engines: { node: ">=0.10.0" } + dev: false + /source-map-support@0.5.21: resolution: { @@ -4049,6 +6586,20 @@ packages: deprecated: Please use @jridgewell/sourcemap-codec instead dev: true + /space-separated-tokens@2.0.2: + resolution: + { + integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==, + } + dev: false + + /sprintf-js@1.0.3: + resolution: + { + integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==, + } + dev: false + /stacktracey@2.1.8: resolution: { @@ -4076,6 +6627,28 @@ packages: safe-buffer: 5.2.1 dev: false + /stringify-entities@4.0.3: + resolution: + { + integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==, + } + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + dev: false + + /stringify-object@3.3.0: + resolution: + { + integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==, + } + engines: { node: ">=4" } + dependencies: + get-own-enumerable-property-symbols: 3.0.2 + is-obj: 1.0.1 + is-regexp: 1.0.0 + dev: false + /strip-ansi@6.0.1: resolution: { @@ -4100,6 +6673,13 @@ packages: } engines: { node: ">=8" } + /style-mod@4.1.0: + resolution: + { + integrity: sha512-Ca5ib8HrFn+f+0n4N4ScTIA9iTOQ7MaGS1ylHcoVqW9J7w2w8PzN6g9gKmTYgGEBH8e120+RCmhpje6jC5uGWA==, + } + dev: false + /superjson@2.2.1: resolution: { @@ -4119,6 +6699,15 @@ packages: dependencies: has-flag: 4.0.0 + /tailwind-merge@2.1.0: + resolution: + { + integrity: sha512-l11VvI4nSwW7MtLSLYT4ldidDEUwQAMWuSHk7l4zcXZDgnCRa0V3OdCwFfM7DCzakVXMNRwAeje9maFFXT71dQ==, + } + dependencies: + "@babel/runtime": 7.23.6 + dev: false + /tar-fs@2.1.1: resolution: { @@ -4161,6 +6750,23 @@ packages: next-tick: 1.1.0 dev: true + /tippy.js@6.3.7: + resolution: + { + integrity: sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==, + } + dependencies: + "@popperjs/core": 2.11.8 + dev: false + + /to-fast-properties@2.0.0: + resolution: + { + integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==, + } + engines: { node: ">=4" } + dev: false + /to-regex-range@5.0.1: resolution: { @@ -4177,6 +6783,20 @@ packages: } dev: false + /trim-lines@3.0.1: + resolution: + { + integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==, + } + dev: false + + /trough@2.1.0: + resolution: + { + integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==, + } + dev: false + /ts-api-utils@1.0.3(typescript@5.3.3): resolution: { @@ -4273,6 +6893,145 @@ packages: "@fastify/busboy": 2.1.0 dev: true + /unhead@1.8.9: + resolution: + { + integrity: sha512-qqCNmA4KOEDjcl+OtRZTllGehXewcQ31zbHjvhl/jqCs2MfRcZoxFW1y7A4Y4BgR/O7PI89K+GoWGcxK3gn64Q==, + } + dependencies: + "@unhead/dom": 1.8.9 + "@unhead/schema": 1.8.9 + "@unhead/shared": 1.8.9 + hookable: 5.5.3 + dev: false + + /unified@10.1.2: + resolution: + { + integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==, + } + dependencies: + "@types/unist": 2.0.10 + bail: 2.0.2 + extend: 3.0.2 + is-buffer: 2.0.5 + is-plain-obj: 4.1.0 + trough: 2.1.0 + vfile: 5.3.7 + dev: false + + /unified@11.0.4: + resolution: + { + integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==, + } + dependencies: + "@types/unist": 3.0.2 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.1.0 + vfile: 6.0.1 + dev: false + + /unist-util-find-after@5.0.0: + resolution: + { + integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==, + } + dependencies: + "@types/unist": 3.0.2 + unist-util-is: 6.0.0 + dev: false + + /unist-util-is@5.2.1: + resolution: + { + integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==, + } + dependencies: + "@types/unist": 2.0.10 + dev: false + + /unist-util-is@6.0.0: + resolution: + { + integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==, + } + dependencies: + "@types/unist": 3.0.2 + dev: false + + /unist-util-position@5.0.0: + resolution: + { + integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==, + } + dependencies: + "@types/unist": 3.0.2 + dev: false + + /unist-util-stringify-position@3.0.3: + resolution: + { + integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==, + } + dependencies: + "@types/unist": 2.0.10 + dev: false + + /unist-util-stringify-position@4.0.0: + resolution: + { + integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==, + } + dependencies: + "@types/unist": 3.0.2 + dev: false + + /unist-util-visit-parents@5.1.3: + resolution: + { + integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==, + } + dependencies: + "@types/unist": 2.0.10 + unist-util-is: 5.2.1 + dev: false + + /unist-util-visit-parents@6.0.1: + resolution: + { + integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==, + } + dependencies: + "@types/unist": 3.0.2 + unist-util-is: 6.0.0 + dev: false + + /unist-util-visit@4.1.2: + resolution: + { + integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==, + } + dependencies: + "@types/unist": 2.0.10 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + dev: false + + /unist-util-visit@5.0.0: + resolution: + { + integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==, + } + dependencies: + "@types/unist": 3.0.2 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + dev: false + /uri-js@4.4.1: resolution: { @@ -4296,6 +7055,59 @@ packages: hasBin: true dev: false + /vfile-location@5.0.2: + resolution: + { + integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==, + } + dependencies: + "@types/unist": 3.0.2 + vfile: 6.0.1 + dev: false + + /vfile-message@3.1.4: + resolution: + { + integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==, + } + dependencies: + "@types/unist": 2.0.10 + unist-util-stringify-position: 3.0.3 + dev: false + + /vfile-message@4.0.2: + resolution: + { + integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==, + } + dependencies: + "@types/unist": 3.0.2 + unist-util-stringify-position: 4.0.0 + dev: false + + /vfile@5.3.7: + resolution: + { + integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==, + } + dependencies: + "@types/unist": 2.0.10 + is-buffer: 2.0.5 + unist-util-stringify-position: 3.0.3 + vfile-message: 3.1.4 + dev: false + + /vfile@6.0.1: + resolution: + { + integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==, + } + dependencies: + "@types/unist": 3.0.2 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + dev: false + /vscode-json-languageservice@4.2.1: resolution: { @@ -4337,6 +7149,57 @@ packages: } dev: true + /vue-demi@0.14.6(vue@3.3.13): + resolution: + { + integrity: sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==, + } + engines: { node: ">=12" } + hasBin: true + requiresBuild: true + peerDependencies: + "@vue/composition-api": ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + "@vue/composition-api": + optional: true + dependencies: + vue: 3.3.13(typescript@5.3.3) + dev: false + + /vue@3.3.13(typescript@5.3.3): + resolution: + { + integrity: sha512-LDnUpQvDgsfc0u/YgtAgTMXJlJQqjkxW1PVcOnJA5cshPleULDjHi7U45pl2VJYazSSvLH8UKcid/kzH8I0a0Q==, + } + peerDependencies: + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@vue/compiler-dom": 3.3.13 + "@vue/compiler-sfc": 3.3.13 + "@vue/runtime-dom": 3.3.13 + "@vue/server-renderer": 3.3.13(vue@3.3.13) + "@vue/shared": 3.3.13 + typescript: 5.3.3 + dev: false + + /w3c-keyname@2.2.8: + resolution: + { + integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==, + } + dev: false + + /web-namespaces@2.0.1: + resolution: + { + integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==, + } + dev: false + /web-streams-polyfill@3.2.1: resolution: { @@ -4345,6 +7208,14 @@ packages: engines: { node: ">= 8" } dev: false + /web-streams-polyfill@4.0.0-beta.3: + resolution: + { + integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==, + } + engines: { node: ">= 14" } + dev: false + /webidl-conversions@3.0.1: resolution: { @@ -4484,8 +7355,22 @@ packages: stacktracey: 2.1.8 dev: true + /zhead@2.2.4: + resolution: + { + integrity: sha512-8F0OI5dpWIA5IGG5NHUg9staDwz/ZPxZtvGVf01j7vHqSyZ0raHY+78atOVxRqb73AotX22uV1pXt3gYSstGag==, + } + dev: false + /zod@3.22.4: resolution: { integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==, } + + /zwitch@2.0.4: + resolution: + { + integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==, + } + dev: false diff --git a/src/index.ts b/src/index.ts index 2f23129..9f28158 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,5 @@ import { OpenAPIHono } from "@hono/zod-openapi" -import { swaggerUI } from "@hono/swagger-ui" +import { apiReference } from "@scalar/hono-api-reference" import { prettyJSON } from "hono/pretty-json" import BaseRoutes from "@/v2/routes/handler" import { OpenAPIConfig } from "./openapi/config" @@ -12,9 +12,136 @@ const app = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() app.route("/v2", BaseRoutes) app.get( - "/docs", - swaggerUI({ - url: "/openapi", + "/", + apiReference({ + spec: { + url: "/openapi", + }, + // i should clean this up at some point icl + customCss: ` + :root { + --theme-font: 'Inter', var(--system-fonts); + } + /* basic theme */ + .light-mode { + --theme-color-1: #2a2f45; + --theme-color-2: #757575; + --theme-color-3: #8e8e8e; + --theme-color-accent: #EA8FEA; + + --theme-background-1: #fff; + --theme-background-2: #f6f6f6; + --theme-background-3: #e7e7e7; + --theme-background-accent: #8ab4f81f; + + --theme-border-color: rgba(0, 0, 0, 0.1); + } + .dark-mode { + --theme-color-1: rgba(255, 255, 255, 0.9); + --theme-color-2: rgba(255, 255, 255, 0.62); + --theme-color-3: rgba(255, 255, 255, 0.44); + --theme-color-accent: #EA8FEA; + + --theme-background-1: #09090B; + --theme-background-2: #111113; + --theme-background-3: #19191A; + --theme-background-accent: #8ab4f81f; + + --theme-border-color: rgba(255, 255, 255, 0.1); + } + /* Document header */ + .light-mode .t-doc__header { + --header-background-1: var(--theme-background-1); + --header-border-color: var(--theme-border-color); + --header-color-1: var(--theme-color-1); + --header-color-2: var(--theme-color-2); + --header-background-toggle: var(--theme-color-3); + --header-call-to-action-color: var(--theme-color-accent); + } + + .dark-mode .t-doc__header { + --header-background-1: var(--theme-background-1); + --header-border-color: var(--theme-border-color); + --header-color-1: var(--theme-color-1); + --header-color-2: var(--theme-color-2); + --header-background-toggle: var(--theme-color-3); + --header-call-to-action-color: var(--theme-color-accent); + } + /* Document Sidebar */ + .light-mode .t-doc__sidebar { + --sidebar-background-1: var(--theme-background-1); + --sidebar-item-hover-color: currentColor; + --sidebar-item-hover-background: var(--theme-background-2); + --sidebar-item-active-background: var(--theme-background-accent); + --sidebar-border-color: var(--theme-border-color); + --sidebar-color-1: var(--theme-color-1); + --sidebar-color-2: var(--theme-color-2); + --sidebar-color-active: var(--theme-color-accent); + --sidebar-search-background: transparent; + --sidebar-search-border-color: var(--theme-border-color); + --sidebar-search--color: var(--theme-color-3); + } + + .dark-mode .sidebar { + --sidebar-background-1: var(--theme-background-1); + --sidebar-item-hover-color: currentColor; + --sidebar-item-hover-background: var(--theme-background-2); + --sidebar-item-active-background: var(--theme-background-accent); + --sidebar-border-color: var(--theme-border-color); + --sidebar-color-1: var(--theme-color-1); + --sidebar-color-2: var(--theme-color-2); + --sidebar-color-active: var(--theme-color-accent); + --sidebar-search-background: transparent; + --sidebar-search-border-color: var(--theme-border-color); + --sidebar-search--color: var(--theme-color-3); + } + + .sidebar-heading-link { + font-weight: 600; + } + + .item-entry-description { + color: rgba(255, 255, 255, 0.44) !important; + } + + /* advanced */ + .light-mode { + --theme-button-1: rgb(49 53 56); + --theme-button-1-color: #fff; + --theme-button-1-hover: rgb(28 31 33); + + --theme-color-green: #C8FFD4; + --theme-color-red: #FF8080; + --theme-color-yellow: #edbe20; + --theme-color-blue: #B8E8FC; + --theme-color-orange: #FFCF96; + --theme-color-purple: #EA8FEA; + + --theme-scrollbar-color: rgba(0, 0, 0, 0.18); + --theme-scrollbar-color-active: rgba(0, 0, 0, 0.36); + } + .dark-mode { + --theme-button-1: #f6f6f6; + --theme-button-1-color: #000; + --theme-button-1-hover: #e7e7e7; + + --theme-color-green: #C8FFD4; + --theme-color-red: #FF8080; + --theme-color-yellow: #ffc90d; + --theme-color-blue: #B8E8FC; + --theme-color-orange: #FFCF96; + --theme-color-purple: #EA8FEA; + + --theme-scrollbar-color: rgba(255, 255, 255, 0.24); + --theme-scrollbar-color-active: rgba(255, 255, 255, 0.48); + } + :root { + --theme-radius: 3px; + --theme-radius-lg: 6px; + --theme-radius-xl: 8px; + + --theme-header-height: 50px; + }`, }) ) diff --git a/src/openapi/config.ts b/src/openapi/config.ts index 76edb83..f56d298 100644 --- a/src/openapi/config.ts +++ b/src/openapi/config.ts @@ -5,7 +5,7 @@ export const OpenAPIConfig: OpenAPIObjectConfig = { info: { version: "2.0.0", title: "api.wanderer.moe", - description: "Public Zod OpenAPI documentation for wanderer.moe's API.", + description: `Public Zod OpenAPI documentation for wanderer.moe's API. This API is used to power the website & all routes are documented.`, license: { name: "GNU General Public License v3.0", url: "https://www.gnu.org/licenses/gpl-3.0.en.html", diff --git a/src/v2/lib/helpers/role-flags.ts b/src/v2/lib/helpers/role-flags.ts index 5da9fa2..57bcfdd 100644 --- a/src/v2/lib/helpers/role-flags.ts +++ b/src/v2/lib/helpers/role-flags.ts @@ -33,7 +33,7 @@ export const SelfAssignableRoleFlags = { CONTENT_CREATOR: 1 << 0, ARTIST: 1 << 1, WRITER: 1 << 2, - DEVELOPER: 1 << 3, + PROGRAMMER: 1 << 3, DESIGNER: 1 << 4, } diff --git a/src/v2/lib/managers/asset-category/asset-category-likes.ts b/src/v2/lib/managers/asset-category/asset-category-likes.ts index cc5a176..9eb0a51 100644 --- a/src/v2/lib/managers/asset-category/asset-category-likes.ts +++ b/src/v2/lib/managers/asset-category/asset-category-likes.ts @@ -7,8 +7,8 @@ export class AssetCategoryLikesManager { /** * Likes a category for a user. - * @param assetCategoryId - The ID of the collection to like. - * @param userId - The ID of the user to like the collection for. + * @param assetCategoryId - The ID of the category to like. + * @param userId - The ID of the user to like the category for. */ public async likeAssetCategory( assetCategoryId: string, From 5da111e7a6539ffb94a317390a1ac9958d187815 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Thu, 21 Dec 2023 03:48:28 +0000 Subject: [PATCH 200/318] export zod schema for tables --- src/v2/db/schema/asset/asset-atlas.ts | 6 +++++- src/v2/db/schema/asset/asset-likes.ts | 4 +++- src/v2/db/schema/asset/asset.ts | 3 +++ .../categories/asset-categories-likes.ts | 5 +++++ .../db/schema/categories/asset-categories.ts | 7 +++++++ .../collections/user-collection-likes.ts | 5 +++++ .../user-collections-collaborators.ts | 7 +++++++ .../db/schema/collections/user-collections.ts | 7 +++++++ src/v2/db/schema/game/game-likes.ts | 3 +++ src/v2/db/schema/game/game.ts | 3 +++ .../db/schema/oc-generators/oc-generators.ts | 5 +++++ src/v2/db/schema/tags/asset-tags-likes.ts | 4 +++- src/v2/db/schema/tags/asset-tags.ts | 5 +++++ src/v2/db/schema/user/user-attributes.ts | 14 ++++++++++++++ src/v2/db/schema/user/user-connections.ts | 5 +++++ src/v2/db/schema/user/user-favorites.ts | 7 +++++++ src/v2/db/schema/user/user-following.ts | 3 +++ src/v2/db/schema/user/user.ts | 11 +++++++++-- src/v2/routes/auth/create/openapi.ts | 12 +++++++++++- src/v2/routes/auth/login/openapi.ts | 12 +++++++++++- src/v2/routes/auth/session/all/openapi.ts | 17 +++++++++++++++++ src/v2/routes/auth/session/logout/openapi.ts | 10 ++++++++++ src/v2/routes/auth/session/logout/route.ts | 1 - .../routes/auth/session/validate/openapi.ts | 12 ++++++++++++ src/v2/routes/auth/session/validate/route.ts | 2 +- src/v2/routes/contributors/get/all/openapi.ts | 19 +++++++++++++++++++ 26 files changed, 180 insertions(+), 9 deletions(-) diff --git a/src/v2/db/schema/asset/asset-atlas.ts b/src/v2/db/schema/asset/asset-atlas.ts index 1dc7bb2..577312b 100644 --- a/src/v2/db/schema/asset/asset-atlas.ts +++ b/src/v2/db/schema/asset/asset-atlas.ts @@ -9,7 +9,7 @@ import { } from "drizzle-orm/sqlite-core" import { asset } from "./asset" import { authUser } from "../user/user" - +import { createInsertSchema, createSelectSchema } from "drizzle-zod" /* NOTE: this allows for users down the line to link their uploaded assets to appropiate atlases for animation. */ @@ -39,6 +39,8 @@ export const atlas = sqliteTable( export type Atlas = typeof atlas.$inferSelect export type NewAtlas = typeof atlas.$inferInsert +export const insertAtlasSchema = createInsertSchema(atlas) +export const selectAtlasSchema = createSelectSchema(atlas) export const atlasToAsset = sqliteTable( tableNames.atlasToAsset, @@ -74,6 +76,8 @@ export const atlasToAsset = sqliteTable( export type AtlasToAsset = typeof atlasToAsset.$inferSelect export type NewAtlasToAsset = typeof atlasToAsset.$inferInsert +export const insertAtlasToAssetSchema = createInsertSchema(atlasToAsset) +export const selectAtlasToAssetSchema = createSelectSchema(atlasToAsset) export const atlasRelations = relations(atlas, ({ one }) => ({ atlasToAsset: one(atlasToAsset), diff --git a/src/v2/db/schema/asset/asset-likes.ts b/src/v2/db/schema/asset/asset-likes.ts index 36edba4..52dd3b5 100644 --- a/src/v2/db/schema/asset/asset-likes.ts +++ b/src/v2/db/schema/asset/asset-likes.ts @@ -8,7 +8,7 @@ import { } from "drizzle-orm/sqlite-core" import { authUser } from "../user/user" import { asset } from "./asset" - +import { createInsertSchema, createSelectSchema } from "drizzle-zod" export const assetLikes = sqliteTable( tableNames.assetLikes, { @@ -36,6 +36,8 @@ export const assetLikes = sqliteTable( export type AssetLikes = typeof assetLikes.$inferSelect export type NewAssetLikes = typeof assetLikes.$inferInsert +export const insertAssetLikesSchema = createInsertSchema(assetLikes) +export const selectAssetLikesSchema = createSelectSchema(assetLikes) export const assetNetworkingRelations = relations(assetLikes, ({ one }) => ({ asset: one(asset, { diff --git a/src/v2/db/schema/asset/asset.ts b/src/v2/db/schema/asset/asset.ts index f3962b1..2ab023a 100644 --- a/src/v2/db/schema/asset/asset.ts +++ b/src/v2/db/schema/asset/asset.ts @@ -12,6 +12,7 @@ import { assetCategory } from "../categories/asset-categories" import { game } from "../game/game" import { assetTagAsset } from "../tags/asset-tags" import { atlasToAsset } from "./asset-atlas" +import { createInsertSchema, createSelectSchema } from "drizzle-zod" import { assetLikes } from "./asset-likes" /* @@ -95,6 +96,8 @@ export const asset = sqliteTable( export type Asset = typeof asset.$inferSelect export type NewAsset = typeof asset.$inferInsert +export const insertAssetSchema = createInsertSchema(asset) +export const selectAssetSchema = createSelectSchema(asset) export const assetRelations = relations(asset, ({ one, many }) => ({ assetTagAsset: many(assetTagAsset), diff --git a/src/v2/db/schema/categories/asset-categories-likes.ts b/src/v2/db/schema/categories/asset-categories-likes.ts index bc61c31..0219cb6 100644 --- a/src/v2/db/schema/categories/asset-categories-likes.ts +++ b/src/v2/db/schema/categories/asset-categories-likes.ts @@ -2,6 +2,7 @@ import { tableNames } from "@/v2/db/drizzle" import { relations } from "drizzle-orm" import { index, sqliteTable, text } from "drizzle-orm/sqlite-core" import { authUser } from "../user/user" +import { createInsertSchema, createSelectSchema } from "drizzle-zod" import { assetCategory } from "./asset-categories" export const assetCategoryLikes = sqliteTable( @@ -33,6 +34,10 @@ export const assetCategoryLikes = sqliteTable( export type AssetCategoryLikes = typeof assetCategoryLikes.$inferSelect export type NewAssetCategoryLikes = typeof assetCategoryLikes.$inferInsert +export const insertAssetCategoryLikesSchema = + createInsertSchema(assetCategoryLikes) +export const selectAssetCategoryLikesSchema = + createSelectSchema(assetCategoryLikes) export const assetCategoryLikesRelations = relations( assetCategoryLikes, diff --git a/src/v2/db/schema/categories/asset-categories.ts b/src/v2/db/schema/categories/asset-categories.ts index 8899c4b..79ba6c8 100644 --- a/src/v2/db/schema/categories/asset-categories.ts +++ b/src/v2/db/schema/categories/asset-categories.ts @@ -8,6 +8,7 @@ import { } from "drizzle-orm/sqlite-core" import { game } from "../game/game" import { asset } from "../asset/asset" +import { createInsertSchema, createSelectSchema } from "drizzle-zod" import { assetCategoryLikes } from "./asset-categories-likes" export const assetCategory = sqliteTable( @@ -30,6 +31,8 @@ export const assetCategory = sqliteTable( export type AssetCategory = typeof assetCategory.$inferSelect export type NewAssetCategory = typeof assetCategory.$inferInsert +export const insertAssetCategorySchema = createInsertSchema(assetCategory) +export const selectAssetCategorySchema = createSelectSchema(assetCategory) /* NOTE: This setup can look kinda janky. @@ -67,6 +70,10 @@ export const gameAssetCategory = sqliteTable( export type GameAssetCategory = typeof gameAssetCategory.$inferSelect export type NewGameAssetCategory = typeof gameAssetCategory.$inferInsert +export const insertGameAssetCategorySchema = + createInsertSchema(gameAssetCategory) +export const selectGameAssetCategorySchema = + createSelectSchema(gameAssetCategory) export const assetCategoryRelations = relations(assetCategory, ({ many }) => ({ asset: many(asset), diff --git a/src/v2/db/schema/collections/user-collection-likes.ts b/src/v2/db/schema/collections/user-collection-likes.ts index 8050e03..82bea97 100644 --- a/src/v2/db/schema/collections/user-collection-likes.ts +++ b/src/v2/db/schema/collections/user-collection-likes.ts @@ -8,6 +8,7 @@ import { } from "drizzle-orm/sqlite-core" import { authUser } from "../user/user" import { userCollection } from "./user-collections" +import { createInsertSchema, createSelectSchema } from "drizzle-zod" export const userCollectionLikes = sqliteTable( tableNames.userCollectionLikes, @@ -38,6 +39,10 @@ export const userCollectionLikes = sqliteTable( export type UserCollectionLikes = typeof userCollectionLikes.$inferSelect export type NewUserCollectionLikes = typeof userCollectionLikes.$inferInsert +export const insertUserCollectionLikesSchema = + createInsertSchema(userCollectionLikes) +export const selectUserCollectionLikesSchema = + createSelectSchema(userCollectionLikes) export const userCollectionLikesRelations = relations( userCollectionLikes, diff --git a/src/v2/db/schema/collections/user-collections-collaborators.ts b/src/v2/db/schema/collections/user-collections-collaborators.ts index ce47532..0c29d24 100644 --- a/src/v2/db/schema/collections/user-collections-collaborators.ts +++ b/src/v2/db/schema/collections/user-collections-collaborators.ts @@ -8,6 +8,7 @@ import { } from "drizzle-orm/sqlite-core" import { authUser } from "../user/user" import { userCollection } from "./user-collections" +import { createInsertSchema, createSelectSchema } from "drizzle-zod" export const userCollectionCollaborators = sqliteTable( tableNames.userCollectionCollaborators, @@ -40,6 +41,12 @@ export type UserCollectionCollaborators = typeof userCollectionCollaborators.$inferSelect export type NewUserCollectionCollaborators = typeof userCollectionCollaborators.$inferInsert +export const insertUserCollectionCollaboratorsSchema = createInsertSchema( + userCollectionCollaborators +) +export const selectUserCollectionCollaboratorsSchema = createSelectSchema( + userCollectionCollaborators +) export const userCollectionCollaboratorsRelations = relations( userCollectionCollaborators, diff --git a/src/v2/db/schema/collections/user-collections.ts b/src/v2/db/schema/collections/user-collections.ts index 70bffa6..768eacd 100644 --- a/src/v2/db/schema/collections/user-collections.ts +++ b/src/v2/db/schema/collections/user-collections.ts @@ -10,6 +10,7 @@ import { import { authUser } from "../user/user" import { asset } from "../asset/asset" import { generateID } from "@/v2/lib/oslo" +import { createInsertSchema, createSelectSchema } from "drizzle-zod" import { userCollectionLikes } from "./user-collection-likes" import { userCollectionCollaborators } from "./user-collections-collaborators" @@ -57,6 +58,8 @@ export const userCollection = sqliteTable( export type UserCollection = typeof userCollection.$inferSelect export type NewUserCollection = typeof userCollection.$inferInsert +export const insertUserCollectionSchema = createInsertSchema(userCollection) +export const selectUserCollectionSchema = createSelectSchema(userCollection) export const userCollectionAsset = sqliteTable( tableNames.userCollectionAsset, @@ -93,6 +96,10 @@ export const userCollectionAsset = sqliteTable( export type UserCollectionAsset = typeof userCollectionAsset.$inferSelect export type NewUserCollectionAsset = typeof userCollectionAsset.$inferInsert +export const insertUserCollectionAssetSchema = + createInsertSchema(userCollectionAsset) +export const selectUserCollectionAssetSchema = + createSelectSchema(userCollectionAsset) export const collectionRelations = relations( userCollection, diff --git a/src/v2/db/schema/game/game-likes.ts b/src/v2/db/schema/game/game-likes.ts index 074d368..c5b21c6 100644 --- a/src/v2/db/schema/game/game-likes.ts +++ b/src/v2/db/schema/game/game-likes.ts @@ -3,6 +3,7 @@ import { relations } from "drizzle-orm" import { index, sqliteTable, text } from "drizzle-orm/sqlite-core" import { authUser } from "../user/user" import { game } from "./game" +import { createInsertSchema, createSelectSchema } from "drizzle-zod" export const gameLikes = sqliteTable( tableNames.gameLikes, @@ -29,6 +30,8 @@ export const gameLikes = sqliteTable( export type GameLikes = typeof gameLikes.$inferSelect export type NewGameLikes = typeof gameLikes.$inferInsert +export const insertGameLikesSchema = createInsertSchema(gameLikes) +export const selectGameLikesSchema = createSelectSchema(gameLikes) export const gameLikesRelations = relations(gameLikes, ({ one }) => ({ game: one(game, { diff --git a/src/v2/db/schema/game/game.ts b/src/v2/db/schema/game/game.ts index dac783c..9c5ffc3 100644 --- a/src/v2/db/schema/game/game.ts +++ b/src/v2/db/schema/game/game.ts @@ -10,6 +10,7 @@ import { import { asset } from "../asset/asset" import { gameAssetCategory } from "../categories/asset-categories" import { gameLikes } from "./game-likes" +import { createInsertSchema, createSelectSchema } from "drizzle-zod" /* NOTE: Game relation is easy to understand and self-explanatory. @@ -41,6 +42,8 @@ export const game = sqliteTable( export type Game = typeof game.$inferSelect export type NewGame = typeof game.$inferInsert +export const newGameSchema = createInsertSchema(game) +export const gameSchema = createSelectSchema(game) export const gameRelations = relations(game, ({ many }) => ({ asset: many(asset), diff --git a/src/v2/db/schema/oc-generators/oc-generators.ts b/src/v2/db/schema/oc-generators/oc-generators.ts index 57ef5c4..bf3a623 100644 --- a/src/v2/db/schema/oc-generators/oc-generators.ts +++ b/src/v2/db/schema/oc-generators/oc-generators.ts @@ -8,6 +8,7 @@ import { index, } from "drizzle-orm/sqlite-core" import { authUser } from "../user/user" +import { createInsertSchema, createSelectSchema } from "drizzle-zod" /* NOTE: OC generators are not stored in the database. @@ -53,6 +54,10 @@ export const savedOcGenerators = sqliteTable( export type SavedOcGenerators = typeof savedOcGenerators.$inferSelect export type NewSavedOcGenerators = typeof savedOcGenerators.$inferInsert +export const insertSavedOcGeneratorsSchema = + createInsertSchema(savedOcGenerators) +export const selectSavedOcGeneratorsSchema = + createSelectSchema(savedOcGenerators) export const savedOcGeneratorsRelations = relations( savedOcGenerators, diff --git a/src/v2/db/schema/tags/asset-tags-likes.ts b/src/v2/db/schema/tags/asset-tags-likes.ts index 056bcee..8c2f63c 100644 --- a/src/v2/db/schema/tags/asset-tags-likes.ts +++ b/src/v2/db/schema/tags/asset-tags-likes.ts @@ -3,7 +3,7 @@ import { relations } from "drizzle-orm" import { index, sqliteTable, text } from "drizzle-orm/sqlite-core" import { authUser } from "../user/user" import { assetTag } from "./asset-tags" - +import { createInsertSchema, createSelectSchema } from "drizzle-zod" export const assetTagLikes = sqliteTable( tableNames.assetTagLikes, { @@ -33,6 +33,8 @@ export const assetTagLikes = sqliteTable( export type AssetTagLikes = typeof assetTagLikes.$inferSelect export type NewAssetTagLikes = typeof assetTagLikes.$inferInsert +export const insertAssetTagLikesSchema = createInsertSchema(assetTagLikes) +export const selectAssetTagLikesSchema = createSelectSchema(assetTagLikes) export const assetTagLikesRelations = relations(assetTagLikes, ({ one }) => ({ assetTag: one(assetTag, { diff --git a/src/v2/db/schema/tags/asset-tags.ts b/src/v2/db/schema/tags/asset-tags.ts index f0f4c31..7149ef5 100644 --- a/src/v2/db/schema/tags/asset-tags.ts +++ b/src/v2/db/schema/tags/asset-tags.ts @@ -9,6 +9,7 @@ import { } from "drizzle-orm/sqlite-core" import { asset } from "../asset/asset" import { assetTagLikes } from "./asset-tags-likes" +import { createInsertSchema, createSelectSchema } from "drizzle-zod" /* NOTE: Asset tags are not stored as ENUMs to allow for better UX, flexibility, and extensibility. @@ -34,6 +35,8 @@ export const assetTag = sqliteTable( export type AssetTag = typeof assetTag.$inferSelect export type NewAssetTag = typeof assetTag.$inferInsert +export const insertAssetTagSchema = createInsertSchema(assetTag) +export const selectAssetTagSchema = createSelectSchema(assetTag) export const assetTagAsset = sqliteTable( tableNames.assetTagAsset, @@ -65,6 +68,8 @@ export const assetTagAsset = sqliteTable( export type AssetTagAsset = typeof assetTagAsset.$inferSelect export type NewAssetTagAsset = typeof assetTagAsset.$inferInsert +export const insertAssetTagAssetSchema = createInsertSchema(assetTagAsset) +export const selectAssetTagAssetSchema = createSelectSchema(assetTagAsset) export const assetTagRelations = relations(assetTag, ({ many }) => ({ assetTagAsset: many(assetTagAsset), diff --git a/src/v2/db/schema/user/user-attributes.ts b/src/v2/db/schema/user/user-attributes.ts index 08256ce..4f32227 100644 --- a/src/v2/db/schema/user/user-attributes.ts +++ b/src/v2/db/schema/user/user-attributes.ts @@ -7,6 +7,7 @@ import { index, } from "drizzle-orm/sqlite-core" import { authUser } from "./user" +import { createInsertSchema, createSelectSchema } from "drizzle-zod" /* NOTE: This is mostly security related. @@ -48,6 +49,12 @@ export const emailVerificationToken = sqliteTable( export type EmailVerificationToken = typeof emailVerificationToken.$inferSelect export type NewEmailVerificationToken = typeof emailVerificationToken.$inferInsert +export const insertEmailVerificationTokenSchema = createInsertSchema( + emailVerificationToken +) +export const selectEmailVerificationTokenSchema = createSelectSchema( + emailVerificationToken +) export const passwordResetToken = sqliteTable( tableNames.passwordResetToken, @@ -80,6 +87,13 @@ export const passwordResetToken = sqliteTable( } ) +export type PasswordResetToken = typeof passwordResetToken.$inferSelect +export type NewPasswordResetToken = typeof passwordResetToken.$inferInsert +export const insertPasswordResetTokenSchema = + createInsertSchema(passwordResetToken) +export const selectPasswordResetTokenSchema = + createSelectSchema(passwordResetToken) + export const emailVerificationTokenRelations = relations( emailVerificationToken, ({ one }) => ({ diff --git a/src/v2/db/schema/user/user-connections.ts b/src/v2/db/schema/user/user-connections.ts index cda63f3..10a5254 100644 --- a/src/v2/db/schema/user/user-connections.ts +++ b/src/v2/db/schema/user/user-connections.ts @@ -2,6 +2,7 @@ import { tableNames } from "@/v2/db/drizzle" import { relations } from "drizzle-orm" import { index, sqliteTable, text } from "drizzle-orm/sqlite-core" import { authUser } from "./user" +import { createInsertSchema, createSelectSchema } from "drizzle-zod" /* NOTE: This file will be expanded on in the future, but for now it's just for Discord. @@ -35,6 +36,10 @@ export const socialsConnection = sqliteTable( export type SocialsConnection = typeof socialsConnection.$inferSelect export type NewSocialsConnection = typeof socialsConnection.$inferInsert +export const insertSocialsConnectionSchema = + createInsertSchema(socialsConnection) +export const selectSocialsConnectionSchema = + createSelectSchema(socialsConnection) export const socialsConnectionRelations = relations( socialsConnection, diff --git a/src/v2/db/schema/user/user-favorites.ts b/src/v2/db/schema/user/user-favorites.ts index e77fe13..6c93885 100644 --- a/src/v2/db/schema/user/user-favorites.ts +++ b/src/v2/db/schema/user/user-favorites.ts @@ -9,6 +9,7 @@ import { } from "drizzle-orm/sqlite-core" import { authUser } from "./user" import { asset } from "../asset/asset" +import { createInsertSchema, createSelectSchema } from "drizzle-zod" import { generateID } from "@/v2/lib/oslo" /* @@ -50,6 +51,8 @@ export const userFavorite = sqliteTable( export type UserFavorite = typeof userFavorite.$inferSelect export type NewUserFavorite = typeof userFavorite.$inferInsert +export const insertUserFavoriteSchema = createInsertSchema(userFavorite) +export const selectUserFavoriteSchema = createSelectSchema(userFavorite) export const userFavoriteAsset = sqliteTable( tableNames.userFavoriteAsset, @@ -90,6 +93,10 @@ export const userFavoriteAsset = sqliteTable( export type UserFavoriteAsset = typeof userFavoriteAsset.$inferSelect export type NewUserFavoriteAsset = typeof userFavoriteAsset.$inferInsert +export const insertUserFavoriteAssetSchema = + createInsertSchema(userFavoriteAsset) +export const selectUserFavoriteAssetSchema = + createSelectSchema(userFavoriteAsset) export const userFavoriteRelations = relations(userFavorite, ({ one }) => ({ user: one(authUser, { diff --git a/src/v2/db/schema/user/user-following.ts b/src/v2/db/schema/user/user-following.ts index 8bdf7fb..c4c5621 100644 --- a/src/v2/db/schema/user/user-following.ts +++ b/src/v2/db/schema/user/user-following.ts @@ -7,6 +7,7 @@ import { index, } from "drizzle-orm/sqlite-core" import { authUser } from "./user" +import { createInsertSchema, createSelectSchema } from "drizzle-zod" /* NOTE: this file manages the "social" aspect of users. @@ -42,6 +43,8 @@ export const userFollowing = sqliteTable( export type UserFollowing = typeof userFollowing.$inferSelect export type NewUserFollowing = typeof userFollowing.$inferInsert +export const insertUserFollowingSchema = createInsertSchema(userFollowing) +export const selectUserFollowingSchema = createSelectSchema(userFollowing) export const userFollowingRelations = relations(userFollowing, ({ one }) => ({ follower: one(authUser, { diff --git a/src/v2/db/schema/user/user.ts b/src/v2/db/schema/user/user.ts index a731462..223b132 100644 --- a/src/v2/db/schema/user/user.ts +++ b/src/v2/db/schema/user/user.ts @@ -7,6 +7,7 @@ import { // uniqueIndex, index, } from "drizzle-orm/sqlite-core" +import { createInsertSchema, createSelectSchema } from "drizzle-zod" import { generateID } from "@/v2/lib/oslo" import { userFollowing } from "./user-following" import { asset } from "../asset/asset" @@ -83,6 +84,8 @@ export const authUser = sqliteTable( export type User = typeof authUser.$inferSelect export type NewUser = typeof authUser.$inferInsert +export const insertUserSchema = createInsertSchema(authUser) +export const selectUserSchema = createSelectSchema(authUser) export const authCredentials = sqliteTable( tableNames.authCredentials, @@ -108,8 +111,10 @@ export const authCredentials = sqliteTable( } ) -export type Keys = typeof authCredentials.$inferSelect -export type NewKeys = typeof authCredentials.$inferInsert +export type AuthCredentials = typeof authCredentials.$inferSelect +export type NewAuthCredentials = typeof authCredentials.$inferInsert +export const insertAuthCredentialsSchema = createInsertSchema(authCredentials) +export const selectAuthCredentialsSchema = createSelectSchema(authCredentials) // interface Session extends SessionAttributes { // id: string; @@ -142,6 +147,8 @@ export const userSession = sqliteTable( export type Session = typeof userSession.$inferSelect export type NewSession = typeof userSession.$inferInsert +export const insertSessionSchema = createInsertSchema(userSession) +export const selectSessionSchema = createSelectSchema(userSession) export const usersRelations = relations(authUser, ({ one, many }) => ({ follower: many(userFollowing, { diff --git a/src/v2/routes/auth/create/openapi.ts b/src/v2/routes/auth/create/openapi.ts index 1837056..5e47d18 100644 --- a/src/v2/routes/auth/create/openapi.ts +++ b/src/v2/routes/auth/create/openapi.ts @@ -1,5 +1,10 @@ import { createRoute } from "@hono/zod-openapi" import { createAccountSchema } from "./schema" +import { z } from "zod" + +const createAccountResponseSchema = z.object({ + success: z.literal(true), +}) export const userCreateAccountRoute = createRoute({ path: "/", @@ -17,7 +22,12 @@ export const userCreateAccountRoute = createRoute({ }, responses: { 200: { - description: "Returns the user object or null.", + description: "Returns true.", + content: { + "application/json": { + schema: createAccountResponseSchema, + }, + }, }, 500: { description: "Internal server error.", diff --git a/src/v2/routes/auth/login/openapi.ts b/src/v2/routes/auth/login/openapi.ts index 0082728..6201b9b 100644 --- a/src/v2/routes/auth/login/openapi.ts +++ b/src/v2/routes/auth/login/openapi.ts @@ -1,5 +1,10 @@ import { createRoute } from "@hono/zod-openapi" import { loginSchema } from "./schema" +import { z } from "zod" + +const loginResponseSchema = z.object({ + success: z.literal(true), +}) export const userLoginRoute = createRoute({ path: "/", @@ -17,7 +22,12 @@ export const userLoginRoute = createRoute({ }, responses: { 200: { - description: "Returns the user object or null.", + description: "Returns true.", + content: { + "application/json": { + schema: loginResponseSchema, + }, + }, }, 500: { description: "Internal server error.", diff --git a/src/v2/routes/auth/session/all/openapi.ts b/src/v2/routes/auth/session/all/openapi.ts index 2620452..64ad540 100644 --- a/src/v2/routes/auth/session/all/openapi.ts +++ b/src/v2/routes/auth/session/all/openapi.ts @@ -1,4 +1,16 @@ import { createRoute } from "@hono/zod-openapi" +import { selectSessionSchema } from "@/v2/db/schema" +import { z } from "zod" + +const sessionListSchema = z.object({ + success: z.literal(true), + currentSessions: selectSessionSchema + .pick({ + id: true, + expiresAt: true, + }) + .array(), +}) export const authAllCurrentSessions = createRoute({ path: "/", @@ -8,6 +20,11 @@ export const authAllCurrentSessions = createRoute({ responses: { 200: { description: "All current sessions are returned", + content: { + "application/json": { + schema: sessionListSchema, + }, + }, }, 401: { description: "Unauthorized", diff --git a/src/v2/routes/auth/session/logout/openapi.ts b/src/v2/routes/auth/session/logout/openapi.ts index 9eaeff2..33f0ded 100644 --- a/src/v2/routes/auth/session/logout/openapi.ts +++ b/src/v2/routes/auth/session/logout/openapi.ts @@ -1,4 +1,9 @@ import { createRoute } from "@hono/zod-openapi" +import { z } from "zod" + +const logoutResponseSchema = z.object({ + success: z.literal(true), +}) export const authLogoutRoute = createRoute({ path: "/", @@ -8,6 +13,11 @@ export const authLogoutRoute = createRoute({ responses: { 200: { description: "Logout successful.", + content: { + "application/json": { + schema: logoutResponseSchema, + }, + }, }, 401: { description: "Unauthorized", diff --git a/src/v2/routes/auth/session/logout/route.ts b/src/v2/routes/auth/session/logout/route.ts index fe7e0b3..e8e7bf5 100644 --- a/src/v2/routes/auth/session/logout/route.ts +++ b/src/v2/routes/auth/session/logout/route.ts @@ -27,7 +27,6 @@ handler.openapi(authLogoutRoute, async (ctx) => { return ctx.json( { success: true, - message: "Logout successful.", }, 200 ) diff --git a/src/v2/routes/auth/session/validate/openapi.ts b/src/v2/routes/auth/session/validate/openapi.ts index a591ba7..1a32ce6 100644 --- a/src/v2/routes/auth/session/validate/openapi.ts +++ b/src/v2/routes/auth/session/validate/openapi.ts @@ -1,4 +1,11 @@ import { createRoute } from "@hono/zod-openapi" +import { selectUserSchema } from "@/v2/db/schema" +import { z } from "zod" + +const authValidationSchema = z.object({ + success: z.literal(true), + user: selectUserSchema, +}) export const authValidationRoute = createRoute({ path: "/", @@ -8,6 +15,11 @@ export const authValidationRoute = createRoute({ responses: { 200: { description: "User information is returned.", + content: { + "application/json": { + schema: authValidationSchema, + }, + }, }, 401: { description: "Unauthorized", diff --git a/src/v2/routes/auth/session/validate/route.ts b/src/v2/routes/auth/session/validate/route.ts index 66aebb1..2ee78f7 100644 --- a/src/v2/routes/auth/session/validate/route.ts +++ b/src/v2/routes/auth/session/validate/route.ts @@ -22,7 +22,7 @@ handler.openapi(authValidationRoute, async (ctx) => { return ctx.json( { success: true, - user: user ? user : null, + user, }, 200 ) diff --git a/src/v2/routes/contributors/get/all/openapi.ts b/src/v2/routes/contributors/get/all/openapi.ts index b69bc8b..97e9e8d 100644 --- a/src/v2/routes/contributors/get/all/openapi.ts +++ b/src/v2/routes/contributors/get/all/openapi.ts @@ -1,5 +1,19 @@ import { createRoute } from "@hono/zod-openapi" +import { selectUserSchema } from "@/v2/db/schema" +import { z } from "zod" +const contributorListSchema = z.object({ + success: z.literal(true), + contributors: selectUserSchema + .pick({ + id: true, + username: true, + avatarUrl: true, + isSupporter: true, + roleFlags: true, + }) + .array(), +}) export const contributorsRoute = createRoute({ path: "/all", method: "get", @@ -8,6 +22,11 @@ export const contributorsRoute = createRoute({ responses: { 200: { description: "All Contributors.", + content: { + "application/json": { + schema: contributorListSchema, + }, + }, }, 500: { description: "Internal server error.", From 83ca6803dff68370ebf084b68bc4aa4b7189eb0a Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Thu, 21 Dec 2023 03:51:58 +0000 Subject: [PATCH 201/318] [no ci] response consistency --- src/index.ts | 2 +- src/v2/middleware/csrf.ts | 2 +- src/v2/routes/asset/get/id/[id]/route.ts | 4 ++-- src/v2/routes/asset/upload/route.ts | 2 +- src/v2/routes/auth/create/route.ts | 6 +++--- src/v2/routes/auth/login/route.ts | 4 ++-- src/v2/routes/game/create/route.ts | 6 +++--- src/v2/routes/game/delete/id/[id]/route.ts | 2 +- src/v2/routes/game/get/id/[id]/route.ts | 2 +- src/v2/routes/game/get/name/[name]/route.ts | 2 +- src/v2/routes/game/modify/id/[id]/route.ts | 6 +++--- 11 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/index.ts b/src/index.ts index 9f28158..f4c2271 100644 --- a/src/index.ts +++ b/src/index.ts @@ -158,7 +158,7 @@ app.onError((err, ctx) => { return ctx.json( { success: false, - error: "Internal Server Error", + message: "Internal Server Error", }, 500 ) diff --git a/src/v2/middleware/csrf.ts b/src/v2/middleware/csrf.ts index 29f20a1..59fc7b0 100644 --- a/src/v2/middleware/csrf.ts +++ b/src/v2/middleware/csrf.ts @@ -17,7 +17,7 @@ export async function csrfValidation(ctx: APIContext, next: Next) { return ctx.json( { success: false, - error: "Forbidden", + message: "Forbidden", }, 403 ) diff --git a/src/v2/routes/asset/get/id/[id]/route.ts b/src/v2/routes/asset/get/id/[id]/route.ts index 7a2bed6..c3d3415 100644 --- a/src/v2/routes/asset/get/id/[id]/route.ts +++ b/src/v2/routes/asset/get/id/[id]/route.ts @@ -12,7 +12,7 @@ handler.openapi(getAssetByIdRoute, async (ctx) => { return ctx.json( { success: false, - error: "Invalid asset ID", + message: "Invalid asset ID", }, 400 ) @@ -26,7 +26,7 @@ handler.openapi(getAssetByIdRoute, async (ctx) => { return ctx.json( { success: true, - error: "Asset not found", + message: "Asset not found", }, 400 ) diff --git a/src/v2/routes/asset/upload/route.ts b/src/v2/routes/asset/upload/route.ts index 8cf1b56..7dea848 100644 --- a/src/v2/routes/asset/upload/route.ts +++ b/src/v2/routes/asset/upload/route.ts @@ -15,7 +15,7 @@ handler.openapi(uploadAssetRoute, async (ctx) => { return ctx.json( { success: false, - error: "Unauthorized", + message: "Unauthorized", }, 401 ) diff --git a/src/v2/routes/auth/create/route.ts b/src/v2/routes/auth/create/route.ts index 1fe3d75..dfdaef3 100644 --- a/src/v2/routes/auth/create/route.ts +++ b/src/v2/routes/auth/create/route.ts @@ -14,7 +14,7 @@ handler.openapi(userCreateAccountRoute, async (ctx) => { return ctx.json( { success: false, - error: "Already logged in", + message: "Already logged in", }, 401 ) @@ -30,7 +30,7 @@ handler.openapi(userCreateAccountRoute, async (ctx) => { return ctx.json( { success: false, - error: "User already exists with that email", + message: "User already exists with that email", }, 400 ) @@ -48,7 +48,7 @@ handler.openapi(userCreateAccountRoute, async (ctx) => { return ctx.json( { success: false, - error: "Failed to create account", + message: "Failed to create account", }, 500 ) diff --git a/src/v2/routes/auth/login/route.ts b/src/v2/routes/auth/login/route.ts index b99ee2b..8625225 100644 --- a/src/v2/routes/auth/login/route.ts +++ b/src/v2/routes/auth/login/route.ts @@ -14,7 +14,7 @@ handler.openapi(userLoginRoute, async (ctx) => { return ctx.json( { success: false, - error: "Already logged in", + message: "Already logged in", }, 401 ) @@ -33,7 +33,7 @@ handler.openapi(userLoginRoute, async (ctx) => { return ctx.json( { success: false, - error: "Invalid credentials", + message: "Invalid credentials", }, 401 ) diff --git a/src/v2/routes/game/create/route.ts b/src/v2/routes/game/create/route.ts index 786fcfd..391121b 100644 --- a/src/v2/routes/game/create/route.ts +++ b/src/v2/routes/game/create/route.ts @@ -16,7 +16,7 @@ handler.openapi(createGameRoute, async (ctx) => { return ctx.json( { success: false, - error: "Unauthorized", + message: "Unauthorized", }, 401 ) @@ -32,7 +32,7 @@ handler.openapi(createGameRoute, async (ctx) => { return ctx.json( { success: false, - error: "Invalid suggestive content value, must be 0 or 1", + message: "Invalid suggestive content value, must be 0 or 1", }, 400 ) @@ -48,7 +48,7 @@ handler.openapi(createGameRoute, async (ctx) => { return ctx.json( { success: false, - error: "Game already exists", + message: "Game already exists", }, 400 ) diff --git a/src/v2/routes/game/delete/id/[id]/route.ts b/src/v2/routes/game/delete/id/[id]/route.ts index 5d388c3..25e8a13 100644 --- a/src/v2/routes/game/delete/id/[id]/route.ts +++ b/src/v2/routes/game/delete/id/[id]/route.ts @@ -16,7 +16,7 @@ handler.openapi(deleteGameRoute, async (ctx) => { return ctx.json( { success: false, - error: "Game not found", + message: "Game not found", }, 400 ) diff --git a/src/v2/routes/game/get/id/[id]/route.ts b/src/v2/routes/game/get/id/[id]/route.ts index 6b6b17e..fef42ba 100644 --- a/src/v2/routes/game/get/id/[id]/route.ts +++ b/src/v2/routes/game/get/id/[id]/route.ts @@ -16,7 +16,7 @@ handler.openapi(getGameByIdRoute, async (ctx) => { return ctx.json( { success: false, - error: "Game not found", + message: "Game not found", }, 400 ) diff --git a/src/v2/routes/game/get/name/[name]/route.ts b/src/v2/routes/game/get/name/[name]/route.ts index 0401d29..1a0cf7b 100644 --- a/src/v2/routes/game/get/name/[name]/route.ts +++ b/src/v2/routes/game/get/name/[name]/route.ts @@ -16,7 +16,7 @@ handler.openapi(getGameByNameRoute, async (ctx) => { return ctx.json( { success: true, - error: "Game not found", + message: "Game not found", }, 400 ) diff --git a/src/v2/routes/game/modify/id/[id]/route.ts b/src/v2/routes/game/modify/id/[id]/route.ts index 17f84fc..1c9b9ff 100644 --- a/src/v2/routes/game/modify/id/[id]/route.ts +++ b/src/v2/routes/game/modify/id/[id]/route.ts @@ -16,7 +16,7 @@ handler.openapi(modifyGameRoute, async (ctx) => { return ctx.json( { success: false, - error: "Unauthorized", + message: "Unauthorized", }, 401 ) @@ -32,7 +32,7 @@ handler.openapi(modifyGameRoute, async (ctx) => { return ctx.json( { success: false, - error: "Invalid suggestive content value, must be 0 or 1", + message: "Invalid suggestive content value, must be 0 or 1", }, 400 ) @@ -48,7 +48,7 @@ handler.openapi(modifyGameRoute, async (ctx) => { return ctx.json( { success: false, - error: "Game with ID not found", + message: "Game with ID not found", }, 400 ) From ab0c01c3f707c6c6d937968334e12800f144d146 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Thu, 21 Dec 2023 04:05:56 +0000 Subject: [PATCH 202/318] consolidate & spread repetitive responses --- src/v2/lib/response-schemas.ts | 59 +++++++++++++++++++ src/v2/routes/auth/create/openapi.ts | 5 +- src/v2/routes/auth/login/openapi.ts | 5 +- src/v2/routes/auth/session/all/openapi.ts | 8 +-- src/v2/routes/auth/session/logout/openapi.ts | 8 +-- .../routes/auth/session/validate/openapi.ts | 8 +-- 6 files changed, 69 insertions(+), 24 deletions(-) create mode 100644 src/v2/lib/response-schemas.ts diff --git a/src/v2/lib/response-schemas.ts b/src/v2/lib/response-schemas.ts new file mode 100644 index 0000000..b2bf752 --- /dev/null +++ b/src/v2/lib/response-schemas.ts @@ -0,0 +1,59 @@ +import { z } from "zod" + +// 400 +export const BadRequestSchema = z.object({ + success: z.literal(false), + message: z.string(), +}) + +// 500 +export const InternalServerErrorSchema = z.object({ + success: z.literal(false), + message: z.string(), +}) + +// 401 +export const UnauthorizedSchema = z.object({ + success: z.literal(false), + message: z.string(), +}) + +// 403 +export const ForbiddenSchema = z.object({ + success: z.literal(false), + message: z.string(), +}) + +// 404 +export const NotFoundSchema = z.object({ + success: z.literal(false), + message: z.string(), +}) + +// while not all routes will utilize every one of these responses - i consolidated them here for comprehensive error handling lol +export const GenericResponses = { + 400: { + description: "Bad request", + content: { + "application/json": { + schema: BadRequestSchema, + }, + }, + }, + 401: { + description: "Unauthorized", + content: { + "application/json": { + schema: UnauthorizedSchema, + }, + }, + }, + 500: { + description: "Internal server error", + content: { + "application/json": { + schema: InternalServerErrorSchema, + }, + }, + }, +} diff --git a/src/v2/routes/auth/create/openapi.ts b/src/v2/routes/auth/create/openapi.ts index 5e47d18..df39b1e 100644 --- a/src/v2/routes/auth/create/openapi.ts +++ b/src/v2/routes/auth/create/openapi.ts @@ -1,5 +1,6 @@ import { createRoute } from "@hono/zod-openapi" import { createAccountSchema } from "./schema" +import { GenericResponses } from "@/v2/lib/response-schemas" import { z } from "zod" const createAccountResponseSchema = z.object({ @@ -29,8 +30,6 @@ export const userCreateAccountRoute = createRoute({ }, }, }, - 500: { - description: "Internal server error.", - }, + ...GenericResponses, }, }) diff --git a/src/v2/routes/auth/login/openapi.ts b/src/v2/routes/auth/login/openapi.ts index 6201b9b..a0d10c3 100644 --- a/src/v2/routes/auth/login/openapi.ts +++ b/src/v2/routes/auth/login/openapi.ts @@ -1,6 +1,7 @@ import { createRoute } from "@hono/zod-openapi" import { loginSchema } from "./schema" import { z } from "zod" +import { GenericResponses } from "@/v2/lib/response-schemas" const loginResponseSchema = z.object({ success: z.literal(true), @@ -29,8 +30,6 @@ export const userLoginRoute = createRoute({ }, }, }, - 500: { - description: "Internal server error.", - }, + ...GenericResponses, }, }) diff --git a/src/v2/routes/auth/session/all/openapi.ts b/src/v2/routes/auth/session/all/openapi.ts index 64ad540..3530f8a 100644 --- a/src/v2/routes/auth/session/all/openapi.ts +++ b/src/v2/routes/auth/session/all/openapi.ts @@ -1,6 +1,7 @@ import { createRoute } from "@hono/zod-openapi" import { selectSessionSchema } from "@/v2/db/schema" import { z } from "zod" +import { GenericResponses } from "@/v2/lib/response-schemas" const sessionListSchema = z.object({ success: z.literal(true), @@ -26,11 +27,6 @@ export const authAllCurrentSessions = createRoute({ }, }, }, - 401: { - description: "Unauthorized", - }, - 500: { - description: "Internal server error.", - }, + ...GenericResponses, }, }) diff --git a/src/v2/routes/auth/session/logout/openapi.ts b/src/v2/routes/auth/session/logout/openapi.ts index 33f0ded..c4ba000 100644 --- a/src/v2/routes/auth/session/logout/openapi.ts +++ b/src/v2/routes/auth/session/logout/openapi.ts @@ -1,5 +1,6 @@ import { createRoute } from "@hono/zod-openapi" import { z } from "zod" +import { GenericResponses } from "@/v2/lib/response-schemas" const logoutResponseSchema = z.object({ success: z.literal(true), @@ -19,11 +20,6 @@ export const authLogoutRoute = createRoute({ }, }, }, - 401: { - description: "Unauthorized", - }, - 500: { - description: "Internal server error.", - }, + ...GenericResponses, }, }) diff --git a/src/v2/routes/auth/session/validate/openapi.ts b/src/v2/routes/auth/session/validate/openapi.ts index 1a32ce6..c4f97ee 100644 --- a/src/v2/routes/auth/session/validate/openapi.ts +++ b/src/v2/routes/auth/session/validate/openapi.ts @@ -1,6 +1,7 @@ import { createRoute } from "@hono/zod-openapi" import { selectUserSchema } from "@/v2/db/schema" import { z } from "zod" +import { GenericResponses } from "@/v2/lib/response-schemas" const authValidationSchema = z.object({ success: z.literal(true), @@ -21,11 +22,6 @@ export const authValidationRoute = createRoute({ }, }, }, - 401: { - description: "Unauthorized", - }, - 500: { - description: "Internal server error.", - }, + ...GenericResponses, }, }) From e3d70b853f2708f4fa838718ceb14fd3e8027510 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Thu, 21 Dec 2023 05:00:45 +0000 Subject: [PATCH 203/318] i dont even know what i just wrote --- src/v2/db/schema/game/game.ts | 4 +- src/v2/lib/managers/asset/asset-manager.ts | 13 +++- .../lib/managers/user/user-search-manager.ts | 73 ++++++++++++++----- src/v2/lib/response-schemas.ts | 8 ++ src/v2/routes/asset/get/id/[id]/openapi.ts | 49 ++++++++++++- src/v2/routes/asset/search/all/openapi.ts | 34 +++++++-- .../routes/auth/session/validate/openapi.ts | 2 +- src/v2/routes/user/get/id/[id]/openapi.ts | 29 +++++++- .../user/get/username/[username]/openapi.ts | 29 +++++++- .../search/username/[username]/openapi.ts | 31 +++++++- 10 files changed, 230 insertions(+), 42 deletions(-) diff --git a/src/v2/db/schema/game/game.ts b/src/v2/db/schema/game/game.ts index 9c5ffc3..d54a1e8 100644 --- a/src/v2/db/schema/game/game.ts +++ b/src/v2/db/schema/game/game.ts @@ -42,8 +42,8 @@ export const game = sqliteTable( export type Game = typeof game.$inferSelect export type NewGame = typeof game.$inferInsert -export const newGameSchema = createInsertSchema(game) -export const gameSchema = createSelectSchema(game) +export const insertGameSchema = createInsertSchema(game) +export const selectGameSchema = createSelectSchema(game) export const gameRelations = relations(game, ({ many }) => ({ asset: many(asset), diff --git a/src/v2/lib/managers/asset/asset-manager.ts b/src/v2/lib/managers/asset/asset-manager.ts index 14a3e62..b4d9f55 100644 --- a/src/v2/lib/managers/asset/asset-manager.ts +++ b/src/v2/lib/managers/asset/asset-manager.ts @@ -23,8 +23,17 @@ export class AssetManager { }, authUser: { columns: { - email: false, - emailVerified: false, + id: true, + avatarUrl: true, + displayName: true, + username: true, + usernameColour: true, + pronouns: true, + verified: true, + bio: true, + dateJoined: true, + isSupporter: true, + roleFlags: true, }, }, game: true, diff --git a/src/v2/lib/managers/user/user-search-manager.ts b/src/v2/lib/managers/user/user-search-manager.ts index 863f082..7b1e7cc 100644 --- a/src/v2/lib/managers/user/user-search-manager.ts +++ b/src/v2/lib/managers/user/user-search-manager.ts @@ -1,7 +1,6 @@ import { DrizzleInstance } from "@/v2/db/turso" import { authUser } from "@/v2/db/schema" import { eq, like, or } from "drizzle-orm" -import type { User } from "@/v2/db/schema" /** * Manages user search and retrieval operations. @@ -15,10 +14,22 @@ export class UserSearchManager { * @param userId - The ID of the user to retrieve. * @returns The user object or undefined if not found. */ - public async getUserById(userId: string): Promise { + public async getUserById(userId: string) { try { const [user] = await this.drizzle - .select() + .select({ + id: authUser.id, + avatarUrl: authUser.avatarUrl, + displayName: authUser.displayName, + username: authUser.username, + usernameColour: authUser.usernameColour, + pronouns: authUser.pronouns, + verified: authUser.verified, + bio: authUser.bio, + dateJoined: authUser.dateJoined, + isSupporter: authUser.isSupporter, + roleFlags: authUser.roleFlags, + }) .from(authUser) .where(eq(authUser.id, userId)) @@ -29,19 +40,19 @@ export class UserSearchManager { } } - public async getUserByEmail(email: string): Promise { - try { - const [user] = await this.drizzle - .select() - .from(authUser) - .where(eq(authUser.email, email)) + // public async getUserByEmail(email: string) { + // try { + // const [user] = await this.drizzle + // .select() + // .from(authUser) + // .where(eq(authUser.email, email)) - return user ?? null - } catch (e) { - console.error(`Error getting user by email ${email}`, e) - throw new Error(`Error getting user by email ${email}`) - } - } + // return user ?? null + // } catch (e) { + // console.error(`Error getting user by email ${email}`, e) + // throw new Error(`Error getting user by email ${email}`) + // } + // } /** * Retrieves a user by their username. @@ -49,10 +60,22 @@ export class UserSearchManager { * @param username - The username of the user to retrieve. * @returns The user object or undefined if not found. */ - public async getUserByUsername(username: string): Promise { + public async getUserByUsername(username: string) { try { const [user] = await this.drizzle - .select() + .select({ + id: authUser.id, + avatarUrl: authUser.avatarUrl, + displayName: authUser.displayName, + username: authUser.username, + usernameColour: authUser.usernameColour, + pronouns: authUser.pronouns, + verified: authUser.verified, + bio: authUser.bio, + dateJoined: authUser.dateJoined, + isSupporter: authUser.isSupporter, + roleFlags: authUser.roleFlags, + }) .from(authUser) .where(eq(authUser.username, username)) @@ -69,10 +92,22 @@ export class UserSearchManager { * @param username - The partial username to search for. * @returns An array of user objects matching the search criteria, limited to 25 results. */ - public async getUsersByUsername(username: string): Promise { + public async getUsersByUsername(username: string) { try { const users = await this.drizzle - .select() + .select({ + id: authUser.id, + avatarUrl: authUser.avatarUrl, + displayName: authUser.displayName, + username: authUser.username, + usernameColour: authUser.usernameColour, + pronouns: authUser.pronouns, + verified: authUser.verified, + bio: authUser.bio, + dateJoined: authUser.dateJoined, + isSupporter: authUser.isSupporter, + roleFlags: authUser.roleFlags, + }) .from(authUser) .where(or(like(authUser.username, `%${username}%`))) .limit(25) diff --git a/src/v2/lib/response-schemas.ts b/src/v2/lib/response-schemas.ts index b2bf752..5d4cdc8 100644 --- a/src/v2/lib/response-schemas.ts +++ b/src/v2/lib/response-schemas.ts @@ -48,6 +48,14 @@ export const GenericResponses = { }, }, }, + 403: { + description: "Forbidden", + content: { + "application/json": { + schema: ForbiddenSchema, + }, + }, + }, 500: { description: "Internal server error", content: { diff --git a/src/v2/routes/asset/get/id/[id]/openapi.ts b/src/v2/routes/asset/get/id/[id]/openapi.ts index 5dfb962..7cd21ef 100644 --- a/src/v2/routes/asset/get/id/[id]/openapi.ts +++ b/src/v2/routes/asset/get/id/[id]/openapi.ts @@ -1,5 +1,43 @@ import { createRoute } from "@hono/zod-openapi" import { getAssetByIdSchema } from "./schema" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "zod" +import { + selectAssetCategorySchema, + selectGameSchema, + selectAssetSchema, + selectAssetTagAssetSchema, + selectAssetTagSchema, + selectUserSchema, +} from "@/v2/db/schema" + +const getAssetByIdResponseSchema = z.object({ + success: z.literal(true), + // mmm nested schemas + asset: selectAssetSchema.extend({ + assetTagAsset: z.array( + selectAssetTagAssetSchema.extend({ + assetTag: selectAssetTagSchema, + }) + ), + }), + authUser: selectUserSchema.pick({ + id: true, + avatarUrl: true, + displayName: true, + username: true, + usernameColour: true, + pronouns: true, + verified: true, + bio: true, + dateJoined: true, + isSupporter: true, + roleFlags: true, + }), + game: selectGameSchema, + assetCategory: selectAssetCategorySchema, + similarAssets: selectAssetSchema.array(), +}) export const getAssetByIdRoute = createRoute({ path: "/{id}", @@ -11,10 +49,13 @@ export const getAssetByIdRoute = createRoute({ }, responses: { 200: { - description: "The asset was found.", - }, - 500: { - description: "Internal server error.", + description: "The found asset & similar assets are returned.", + content: { + "application/json": { + schema: getAssetByIdResponseSchema, + }, + }, }, + ...GenericResponses, }, }) diff --git a/src/v2/routes/asset/search/all/openapi.ts b/src/v2/routes/asset/search/all/openapi.ts index d806454..fc0bf6f 100644 --- a/src/v2/routes/asset/search/all/openapi.ts +++ b/src/v2/routes/asset/search/all/openapi.ts @@ -1,20 +1,44 @@ import { createRoute } from "@hono/zod-openapi" import { assetSearchAllFilterSchema } from "./schema" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "zod" +import { + selectAssetSchema, + selectAssetTagAssetSchema, + selectAssetTagSchema, +} from "@/v2/db/schema" + +const assetSearchAllFilterResponseSchema = z.object({ + success: z.literal(true), + // mmm nested schemas + assets: z.array( + selectAssetSchema.extend({ + assetTagAsset: z.array( + selectAssetTagAssetSchema.extend({ + assetTag: selectAssetTagSchema, + }) + ), + }) + ), +}) export const assetSearchAllFilterRoute = createRoute({ path: "/", method: "get", - description: "Filter all assets.", + description: "Filter all assets", tags: ["Asset"], request: { query: assetSearchAllFilterSchema, }, responses: { 200: { - description: "The asset was found.", - }, - 500: { - description: "Internal server error.", + description: "Found assets", + content: { + "application/json": { + schema: assetSearchAllFilterResponseSchema, + }, + }, }, + ...GenericResponses, }, }) diff --git a/src/v2/routes/auth/session/validate/openapi.ts b/src/v2/routes/auth/session/validate/openapi.ts index c4f97ee..a477a4b 100644 --- a/src/v2/routes/auth/session/validate/openapi.ts +++ b/src/v2/routes/auth/session/validate/openapi.ts @@ -15,7 +15,7 @@ export const authValidationRoute = createRoute({ tags: ["Auth"], responses: { 200: { - description: "User information is returned.", + description: "All user information is returned.", content: { "application/json": { schema: authValidationSchema, diff --git a/src/v2/routes/user/get/id/[id]/openapi.ts b/src/v2/routes/user/get/id/[id]/openapi.ts index 84c8c9d..6e6a87d 100644 --- a/src/v2/routes/user/get/id/[id]/openapi.ts +++ b/src/v2/routes/user/get/id/[id]/openapi.ts @@ -1,5 +1,25 @@ import { createRoute } from "@hono/zod-openapi" import { getUserByIdSchema } from "./schema" +import { z } from "zod" +import { selectUserSchema } from "@/v2/db/schema" +import { GenericResponses } from "@/v2/lib/response-schemas" + +const getUserByIdResponseSchema = z.object({ + success: z.literal(true), + user: selectUserSchema.pick({ + id: true, + avatarUrl: true, + displayName: true, + username: true, + usernameColour: true, + pronouns: true, + verified: true, + bio: true, + dateJoined: true, + isSupporter: true, + roleFlags: true, + }), +}) export const getUserByIdRoute = createRoute({ path: "/{id}", @@ -12,9 +32,12 @@ export const getUserByIdRoute = createRoute({ responses: { 200: { description: "The user was found.", + content: { + "application/json": { + schema: getUserByIdResponseSchema, + }, + }, }, - 500: { - description: "Internal server error.", - }, + ...GenericResponses, }, }) diff --git a/src/v2/routes/user/get/username/[username]/openapi.ts b/src/v2/routes/user/get/username/[username]/openapi.ts index 295ce4a..24a90d2 100644 --- a/src/v2/routes/user/get/username/[username]/openapi.ts +++ b/src/v2/routes/user/get/username/[username]/openapi.ts @@ -1,5 +1,25 @@ import { createRoute } from "@hono/zod-openapi" import { getUserByNameSchema } from "./schema" +import { z } from "zod" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { selectUserSchema } from "@/v2/db/schema" + +const getUserByNameResponseSchema = z.object({ + success: z.literal(true), + user: selectUserSchema.pick({ + id: true, + avatarUrl: true, + displayName: true, + username: true, + usernameColour: true, + pronouns: true, + verified: true, + bio: true, + dateJoined: true, + isSupporter: true, + roleFlags: true, + }), +}) export const getUserByNameRoute = createRoute({ path: "/{username}", @@ -12,9 +32,12 @@ export const getUserByNameRoute = createRoute({ responses: { 200: { description: "The user was found.", + content: { + "application/json": { + schema: getUserByNameResponseSchema, + }, + }, }, - 500: { - description: "Internal server error.", - }, + ...GenericResponses, }, }) diff --git a/src/v2/routes/user/search/username/[username]/openapi.ts b/src/v2/routes/user/search/username/[username]/openapi.ts index 69c4f73..52cc2e4 100644 --- a/src/v2/routes/user/search/username/[username]/openapi.ts +++ b/src/v2/routes/user/search/username/[username]/openapi.ts @@ -1,5 +1,27 @@ import { createRoute } from "@hono/zod-openapi" import { getUsersByNameSchema } from "./schema" +import { z } from "zod" +import { selectUserSchema } from "@/v2/db/schema" +import { GenericResponses } from "@/v2/lib/response-schemas" + +const searchUsersByUsernameSchema = z.object({ + success: z.literal(true), + users: selectUserSchema + .pick({ + id: true, + avatarUrl: true, + displayName: true, + username: true, + usernameColour: true, + pronouns: true, + verified: true, + bio: true, + dateJoined: true, + isSupporter: true, + roleFlags: true, + }) + .array(), +}) export const searchUsersByUsernameRoute = createRoute({ path: "/{username}", @@ -12,9 +34,12 @@ export const searchUsersByUsernameRoute = createRoute({ responses: { 200: { description: "User(s) were found.", + content: { + "application/json": { + schema: searchUsersByUsernameSchema, + }, + }, }, - 500: { - description: "Internal server error.", - }, + ...GenericResponses, }, }) From 2216ab592da2ce0dd74a3b84b8f9d8ece3ad9364 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Thu, 21 Dec 2023 05:17:00 +0000 Subject: [PATCH 204/318] relocate response schema into schema.ts --- src/v2/routes/asset/get/id/[id]/openapi.ts | 39 +------------------ src/v2/routes/asset/get/id/[id]/schema.ts | 36 +++++++++++++++++ src/v2/routes/asset/search/all/openapi.ts | 25 ++---------- src/v2/routes/asset/search/all/schema.ts | 19 +++++++++ src/v2/routes/auth/create/openapi.ts | 7 +--- src/v2/routes/auth/create/schema.ts | 4 ++ src/v2/routes/auth/login/openapi.ts | 6 +-- src/v2/routes/auth/login/schema.ts | 4 ++ src/v2/routes/auth/session/all/openapi.ts | 13 +------ src/v2/routes/auth/session/all/schema.ts | 12 ++++++ src/v2/routes/auth/session/logout/openapi.ts | 6 +-- src/v2/routes/auth/session/logout/schema.ts | 5 +++ .../routes/auth/session/validate/openapi.ts | 8 +--- src/v2/routes/auth/session/validate/schema.ts | 7 ++++ src/v2/routes/user/get/id/[id]/openapi.ts | 21 +--------- src/v2/routes/user/get/id/[id]/schema.ts | 18 +++++++++ .../user/get/username/[username]/openapi.ts | 20 +--------- .../user/get/username/[username]/schema.ts | 18 +++++++++ .../search/username/[username]/openapi.ts | 23 +---------- .../user/search/username/[username]/schema.ts | 20 ++++++++++ 20 files changed, 156 insertions(+), 155 deletions(-) create mode 100644 src/v2/routes/auth/session/all/schema.ts create mode 100644 src/v2/routes/auth/session/logout/schema.ts create mode 100644 src/v2/routes/auth/session/validate/schema.ts diff --git a/src/v2/routes/asset/get/id/[id]/openapi.ts b/src/v2/routes/asset/get/id/[id]/openapi.ts index 7cd21ef..cbaa48c 100644 --- a/src/v2/routes/asset/get/id/[id]/openapi.ts +++ b/src/v2/routes/asset/get/id/[id]/openapi.ts @@ -1,43 +1,6 @@ import { createRoute } from "@hono/zod-openapi" -import { getAssetByIdSchema } from "./schema" +import { getAssetByIdSchema, getAssetByIdResponseSchema } from "./schema" import { GenericResponses } from "@/v2/lib/response-schemas" -import { z } from "zod" -import { - selectAssetCategorySchema, - selectGameSchema, - selectAssetSchema, - selectAssetTagAssetSchema, - selectAssetTagSchema, - selectUserSchema, -} from "@/v2/db/schema" - -const getAssetByIdResponseSchema = z.object({ - success: z.literal(true), - // mmm nested schemas - asset: selectAssetSchema.extend({ - assetTagAsset: z.array( - selectAssetTagAssetSchema.extend({ - assetTag: selectAssetTagSchema, - }) - ), - }), - authUser: selectUserSchema.pick({ - id: true, - avatarUrl: true, - displayName: true, - username: true, - usernameColour: true, - pronouns: true, - verified: true, - bio: true, - dateJoined: true, - isSupporter: true, - roleFlags: true, - }), - game: selectGameSchema, - assetCategory: selectAssetCategorySchema, - similarAssets: selectAssetSchema.array(), -}) export const getAssetByIdRoute = createRoute({ path: "/{id}", diff --git a/src/v2/routes/asset/get/id/[id]/schema.ts b/src/v2/routes/asset/get/id/[id]/schema.ts index dcb5339..00309c7 100644 --- a/src/v2/routes/asset/get/id/[id]/schema.ts +++ b/src/v2/routes/asset/get/id/[id]/schema.ts @@ -1,4 +1,12 @@ import { z } from "@hono/zod-openapi" +import { + selectAssetCategorySchema, + selectGameSchema, + selectAssetSchema, + selectAssetTagAssetSchema, + selectAssetTagSchema, + selectUserSchema, +} from "@/v2/db/schema" export const getAssetByIdSchema = z.object({ id: z.string().openapi({ @@ -10,3 +18,31 @@ export const getAssetByIdSchema = z.object({ }, }), }) + +export const getAssetByIdResponseSchema = z.object({ + success: z.literal(true), + // mmm nested schemas + asset: selectAssetSchema.extend({ + assetTagAsset: z.array( + selectAssetTagAssetSchema.extend({ + assetTag: selectAssetTagSchema, + }) + ), + }), + authUser: selectUserSchema.pick({ + id: true, + avatarUrl: true, + displayName: true, + username: true, + usernameColour: true, + pronouns: true, + verified: true, + bio: true, + dateJoined: true, + isSupporter: true, + roleFlags: true, + }), + game: selectGameSchema, + assetCategory: selectAssetCategorySchema, + similarAssets: selectAssetSchema.array(), +}) diff --git a/src/v2/routes/asset/search/all/openapi.ts b/src/v2/routes/asset/search/all/openapi.ts index fc0bf6f..ba5cfb5 100644 --- a/src/v2/routes/asset/search/all/openapi.ts +++ b/src/v2/routes/asset/search/all/openapi.ts @@ -1,26 +1,9 @@ import { createRoute } from "@hono/zod-openapi" -import { assetSearchAllFilterSchema } from "./schema" -import { GenericResponses } from "@/v2/lib/response-schemas" -import { z } from "zod" import { - selectAssetSchema, - selectAssetTagAssetSchema, - selectAssetTagSchema, -} from "@/v2/db/schema" - -const assetSearchAllFilterResponseSchema = z.object({ - success: z.literal(true), - // mmm nested schemas - assets: z.array( - selectAssetSchema.extend({ - assetTagAsset: z.array( - selectAssetTagAssetSchema.extend({ - assetTag: selectAssetTagSchema, - }) - ), - }) - ), -}) + assetSearchAllFilterSchema, + assetSearchAllFilterResponseSchema, +} from "./schema" +import { GenericResponses } from "@/v2/lib/response-schemas" export const assetSearchAllFilterRoute = createRoute({ path: "/", diff --git a/src/v2/routes/asset/search/all/schema.ts b/src/v2/routes/asset/search/all/schema.ts index 28dfb02..e163fc3 100644 --- a/src/v2/routes/asset/search/all/schema.ts +++ b/src/v2/routes/asset/search/all/schema.ts @@ -1,4 +1,23 @@ import { z } from "@hono/zod-openapi" +import { + selectAssetSchema, + selectAssetTagAssetSchema, + selectAssetTagSchema, +} from "@/v2/db/schema" + +export const assetSearchAllFilterResponseSchema = z.object({ + success: z.literal(true), + // mmm nested schemas + assets: z.array( + selectAssetSchema.extend({ + assetTagAsset: z.array( + selectAssetTagAssetSchema.extend({ + assetTag: selectAssetTagSchema, + }) + ), + }) + ), +}) export const assetSearchAllFilterSchema = z .object({ diff --git a/src/v2/routes/auth/create/openapi.ts b/src/v2/routes/auth/create/openapi.ts index df39b1e..14e4652 100644 --- a/src/v2/routes/auth/create/openapi.ts +++ b/src/v2/routes/auth/create/openapi.ts @@ -1,11 +1,6 @@ import { createRoute } from "@hono/zod-openapi" -import { createAccountSchema } from "./schema" +import { createAccountSchema, createAccountResponseSchema } from "./schema" import { GenericResponses } from "@/v2/lib/response-schemas" -import { z } from "zod" - -const createAccountResponseSchema = z.object({ - success: z.literal(true), -}) export const userCreateAccountRoute = createRoute({ path: "/", diff --git a/src/v2/routes/auth/create/schema.ts b/src/v2/routes/auth/create/schema.ts index e4a4664..1fda7c1 100644 --- a/src/v2/routes/auth/create/schema.ts +++ b/src/v2/routes/auth/create/schema.ts @@ -18,3 +18,7 @@ export const createAccountSchema = z.object({ example: "password1234", }), }) + +export const createAccountResponseSchema = z.object({ + success: z.literal(true), +}) diff --git a/src/v2/routes/auth/login/openapi.ts b/src/v2/routes/auth/login/openapi.ts index a0d10c3..e75bc18 100644 --- a/src/v2/routes/auth/login/openapi.ts +++ b/src/v2/routes/auth/login/openapi.ts @@ -1,11 +1,7 @@ import { createRoute } from "@hono/zod-openapi" import { loginSchema } from "./schema" -import { z } from "zod" import { GenericResponses } from "@/v2/lib/response-schemas" - -const loginResponseSchema = z.object({ - success: z.literal(true), -}) +import { loginResponseSchema } from "./schema" export const userLoginRoute = createRoute({ path: "/", diff --git a/src/v2/routes/auth/login/schema.ts b/src/v2/routes/auth/login/schema.ts index 6339388..7e61833 100644 --- a/src/v2/routes/auth/login/schema.ts +++ b/src/v2/routes/auth/login/schema.ts @@ -14,3 +14,7 @@ export const loginSchema = z.object({ example: "password1234", }), }) + +export const loginResponseSchema = z.object({ + success: z.literal(true), +}) diff --git a/src/v2/routes/auth/session/all/openapi.ts b/src/v2/routes/auth/session/all/openapi.ts index 3530f8a..2443e41 100644 --- a/src/v2/routes/auth/session/all/openapi.ts +++ b/src/v2/routes/auth/session/all/openapi.ts @@ -1,18 +1,7 @@ import { createRoute } from "@hono/zod-openapi" -import { selectSessionSchema } from "@/v2/db/schema" -import { z } from "zod" +import { sessionListSchema } from "./schema" import { GenericResponses } from "@/v2/lib/response-schemas" -const sessionListSchema = z.object({ - success: z.literal(true), - currentSessions: selectSessionSchema - .pick({ - id: true, - expiresAt: true, - }) - .array(), -}) - export const authAllCurrentSessions = createRoute({ path: "/", method: "get", diff --git a/src/v2/routes/auth/session/all/schema.ts b/src/v2/routes/auth/session/all/schema.ts new file mode 100644 index 0000000..91c6a3c --- /dev/null +++ b/src/v2/routes/auth/session/all/schema.ts @@ -0,0 +1,12 @@ +import { selectSessionSchema } from "@/v2/db/schema" +import { z } from "@hono/zod-openapi" + +export const sessionListSchema = z.object({ + success: z.literal(true), + currentSessions: selectSessionSchema + .pick({ + id: true, + expiresAt: true, + }) + .array(), +}) diff --git a/src/v2/routes/auth/session/logout/openapi.ts b/src/v2/routes/auth/session/logout/openapi.ts index c4ba000..d0dd680 100644 --- a/src/v2/routes/auth/session/logout/openapi.ts +++ b/src/v2/routes/auth/session/logout/openapi.ts @@ -1,10 +1,6 @@ import { createRoute } from "@hono/zod-openapi" -import { z } from "zod" import { GenericResponses } from "@/v2/lib/response-schemas" - -const logoutResponseSchema = z.object({ - success: z.literal(true), -}) +import { logoutResponseSchema } from "./schema" export const authLogoutRoute = createRoute({ path: "/", diff --git a/src/v2/routes/auth/session/logout/schema.ts b/src/v2/routes/auth/session/logout/schema.ts new file mode 100644 index 0000000..4350c74 --- /dev/null +++ b/src/v2/routes/auth/session/logout/schema.ts @@ -0,0 +1,5 @@ +import { z } from "@hono/zod-openapi" + +export const logoutResponseSchema = z.object({ + success: z.literal(true), +}) diff --git a/src/v2/routes/auth/session/validate/openapi.ts b/src/v2/routes/auth/session/validate/openapi.ts index a477a4b..ee50239 100644 --- a/src/v2/routes/auth/session/validate/openapi.ts +++ b/src/v2/routes/auth/session/validate/openapi.ts @@ -1,13 +1,7 @@ import { createRoute } from "@hono/zod-openapi" -import { selectUserSchema } from "@/v2/db/schema" -import { z } from "zod" +import { authValidationSchema } from "./schema" import { GenericResponses } from "@/v2/lib/response-schemas" -const authValidationSchema = z.object({ - success: z.literal(true), - user: selectUserSchema, -}) - export const authValidationRoute = createRoute({ path: "/", method: "get", diff --git a/src/v2/routes/auth/session/validate/schema.ts b/src/v2/routes/auth/session/validate/schema.ts new file mode 100644 index 0000000..14d1a73 --- /dev/null +++ b/src/v2/routes/auth/session/validate/schema.ts @@ -0,0 +1,7 @@ +import { z } from "@hono/zod-openapi" +import { selectUserSchema } from "@/v2/db/schema" + +export const authValidationSchema = z.object({ + success: z.literal(true), + user: selectUserSchema, +}) diff --git a/src/v2/routes/user/get/id/[id]/openapi.ts b/src/v2/routes/user/get/id/[id]/openapi.ts index 6e6a87d..09f1bbd 100644 --- a/src/v2/routes/user/get/id/[id]/openapi.ts +++ b/src/v2/routes/user/get/id/[id]/openapi.ts @@ -1,26 +1,7 @@ import { createRoute } from "@hono/zod-openapi" -import { getUserByIdSchema } from "./schema" -import { z } from "zod" -import { selectUserSchema } from "@/v2/db/schema" +import { getUserByIdSchema, getUserByIdResponseSchema } from "./schema" import { GenericResponses } from "@/v2/lib/response-schemas" -const getUserByIdResponseSchema = z.object({ - success: z.literal(true), - user: selectUserSchema.pick({ - id: true, - avatarUrl: true, - displayName: true, - username: true, - usernameColour: true, - pronouns: true, - verified: true, - bio: true, - dateJoined: true, - isSupporter: true, - roleFlags: true, - }), -}) - export const getUserByIdRoute = createRoute({ path: "/{id}", method: "get", diff --git a/src/v2/routes/user/get/id/[id]/schema.ts b/src/v2/routes/user/get/id/[id]/schema.ts index ad1942e..58328e9 100644 --- a/src/v2/routes/user/get/id/[id]/schema.ts +++ b/src/v2/routes/user/get/id/[id]/schema.ts @@ -1,4 +1,5 @@ import { z } from "@hono/zod-openapi" +import { selectUserSchema } from "@/v2/db/schema" export const getUserByIdSchema = z.object({ id: z.string().openapi({ @@ -10,3 +11,20 @@ export const getUserByIdSchema = z.object({ }, }), }) + +export const getUserByIdResponseSchema = z.object({ + success: z.literal(true), + user: selectUserSchema.pick({ + id: true, + avatarUrl: true, + displayName: true, + username: true, + usernameColour: true, + pronouns: true, + verified: true, + bio: true, + dateJoined: true, + isSupporter: true, + roleFlags: true, + }), +}) diff --git a/src/v2/routes/user/get/username/[username]/openapi.ts b/src/v2/routes/user/get/username/[username]/openapi.ts index 24a90d2..0598439 100644 --- a/src/v2/routes/user/get/username/[username]/openapi.ts +++ b/src/v2/routes/user/get/username/[username]/openapi.ts @@ -1,25 +1,7 @@ import { createRoute } from "@hono/zod-openapi" import { getUserByNameSchema } from "./schema" -import { z } from "zod" import { GenericResponses } from "@/v2/lib/response-schemas" -import { selectUserSchema } from "@/v2/db/schema" - -const getUserByNameResponseSchema = z.object({ - success: z.literal(true), - user: selectUserSchema.pick({ - id: true, - avatarUrl: true, - displayName: true, - username: true, - usernameColour: true, - pronouns: true, - verified: true, - bio: true, - dateJoined: true, - isSupporter: true, - roleFlags: true, - }), -}) +import { getUserByNameResponseSchema } from "./schema" export const getUserByNameRoute = createRoute({ path: "/{username}", diff --git a/src/v2/routes/user/get/username/[username]/schema.ts b/src/v2/routes/user/get/username/[username]/schema.ts index f10a088..6e871c1 100644 --- a/src/v2/routes/user/get/username/[username]/schema.ts +++ b/src/v2/routes/user/get/username/[username]/schema.ts @@ -1,4 +1,5 @@ import { z } from "@hono/zod-openapi" +import { selectUserSchema } from "@/v2/db/schema" export const getUserByNameSchema = z.object({ username: z.string().openapi({ @@ -10,3 +11,20 @@ export const getUserByNameSchema = z.object({ }, }), }) + +export const getUserByNameResponseSchema = z.object({ + success: z.literal(true), + user: selectUserSchema.pick({ + id: true, + avatarUrl: true, + displayName: true, + username: true, + usernameColour: true, + pronouns: true, + verified: true, + bio: true, + dateJoined: true, + isSupporter: true, + roleFlags: true, + }), +}) diff --git a/src/v2/routes/user/search/username/[username]/openapi.ts b/src/v2/routes/user/search/username/[username]/openapi.ts index 52cc2e4..436fa11 100644 --- a/src/v2/routes/user/search/username/[username]/openapi.ts +++ b/src/v2/routes/user/search/username/[username]/openapi.ts @@ -1,28 +1,7 @@ import { createRoute } from "@hono/zod-openapi" -import { getUsersByNameSchema } from "./schema" -import { z } from "zod" -import { selectUserSchema } from "@/v2/db/schema" +import { getUsersByNameSchema, searchUsersByUsernameSchema } from "./schema" import { GenericResponses } from "@/v2/lib/response-schemas" -const searchUsersByUsernameSchema = z.object({ - success: z.literal(true), - users: selectUserSchema - .pick({ - id: true, - avatarUrl: true, - displayName: true, - username: true, - usernameColour: true, - pronouns: true, - verified: true, - bio: true, - dateJoined: true, - isSupporter: true, - roleFlags: true, - }) - .array(), -}) - export const searchUsersByUsernameRoute = createRoute({ path: "/{username}", method: "get", diff --git a/src/v2/routes/user/search/username/[username]/schema.ts b/src/v2/routes/user/search/username/[username]/schema.ts index d9bbefc..ff1ba9e 100644 --- a/src/v2/routes/user/search/username/[username]/schema.ts +++ b/src/v2/routes/user/search/username/[username]/schema.ts @@ -1,4 +1,5 @@ import { z } from "@hono/zod-openapi" +import { selectUserSchema } from "@/v2/db/schema" export const getUsersByNameSchema = z.object({ username: z.string().openapi({ @@ -10,3 +11,22 @@ export const getUsersByNameSchema = z.object({ }, }), }) + +export const searchUsersByUsernameSchema = z.object({ + success: z.literal(true), + users: selectUserSchema + .pick({ + id: true, + avatarUrl: true, + displayName: true, + username: true, + usernameColour: true, + pronouns: true, + verified: true, + bio: true, + dateJoined: true, + isSupporter: true, + roleFlags: true, + }) + .array(), +}) From b058686efb2234a63626b7f6f2ee69fe1acb42c0 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Thu, 21 Dec 2023 05:46:59 +0000 Subject: [PATCH 205/318] create response schemas for game routes --- src/v2/lib/managers/game/game-manager.ts | 2 +- src/v2/routes/game/create/openapi.ts | 12 +++++++---- src/v2/routes/game/create/schema.ts | 6 ++++++ src/v2/routes/game/delete/id/[id]/openapi.ts | 17 ++++++++-------- src/v2/routes/game/delete/id/[id]/schema.ts | 4 ++++ src/v2/routes/game/get/all/openapi.ts | 11 +++++++--- src/v2/routes/game/get/all/route.ts | 12 +++++++---- src/v2/routes/game/get/all/schema.ts | 7 +++++++ src/v2/routes/game/get/id/[id]/openapi.ts | 12 +++++++---- src/v2/routes/game/get/id/[id]/schema.ts | 6 ++++++ src/v2/routes/game/get/name/[name]/openapi.ts | 12 +++++++---- src/v2/routes/game/get/name/[name]/schema.ts | 6 ++++++ src/v2/routes/game/modify/id/[id]/openapi.ts | 20 +++++++++---------- src/v2/routes/game/modify/id/[id]/schema.ts | 6 ++++++ 14 files changed, 94 insertions(+), 39 deletions(-) create mode 100644 src/v2/routes/game/get/all/schema.ts diff --git a/src/v2/lib/managers/game/game-manager.ts b/src/v2/lib/managers/game/game-manager.ts index ba70502..d2e2e50 100644 --- a/src/v2/lib/managers/game/game-manager.ts +++ b/src/v2/lib/managers/game/game-manager.ts @@ -87,7 +87,7 @@ export class GameManager { * @returns A promise that resolves to an array of games. */ - public async listGames(): Promise { + public async listGames() { try { const games = await this.drizzle.select().from(game) return games ?? null diff --git a/src/v2/routes/game/create/openapi.ts b/src/v2/routes/game/create/openapi.ts index 4b8871e..b6d5cc4 100644 --- a/src/v2/routes/game/create/openapi.ts +++ b/src/v2/routes/game/create/openapi.ts @@ -1,5 +1,6 @@ import { createRoute } from "@hono/zod-openapi" -import { createGameSchema } from "./schema" +import { createGameSchema, createGameResponse } from "./schema" +import { GenericResponses } from "@/v2/lib/response-schemas" export const createGameRoute = createRoute({ path: "/", @@ -18,9 +19,12 @@ export const createGameRoute = createRoute({ responses: { 200: { description: "Returns the new game.", + content: { + "application/json": { + schema: createGameResponse, + }, + }, }, - 500: { - description: "Internal server error.", - }, + ...GenericResponses, }, }) diff --git a/src/v2/routes/game/create/schema.ts b/src/v2/routes/game/create/schema.ts index eaffc8f..40911df 100644 --- a/src/v2/routes/game/create/schema.ts +++ b/src/v2/routes/game/create/schema.ts @@ -1,4 +1,5 @@ import { z } from "@hono/zod-openapi" +import { selectGameSchema } from "@/v2/db/schema" export const createGameSchema = z.object({ name: z.string().min(3).max(32).openapi({ @@ -15,3 +16,8 @@ export const createGameSchema = z.object({ example: "1", }), }) + +export const createGameResponse = z.object({ + success: z.literal(true), + game: selectGameSchema, +}) diff --git a/src/v2/routes/game/delete/id/[id]/openapi.ts b/src/v2/routes/game/delete/id/[id]/openapi.ts index 95835f6..7d34062 100644 --- a/src/v2/routes/game/delete/id/[id]/openapi.ts +++ b/src/v2/routes/game/delete/id/[id]/openapi.ts @@ -1,5 +1,6 @@ import { createRoute } from "@hono/zod-openapi" -import { deleteGameSchema } from "./schema" +import { deleteGameSchema, deleteGameResponse } from "./schema" +import { GenericResponses } from "@/v2/lib/response-schemas" export const deleteGameRoute = createRoute({ path: "/", @@ -11,13 +12,13 @@ export const deleteGameRoute = createRoute({ }, responses: { 200: { - description: "Returns true or false.", - }, - 401: { - description: "Unauthorized", - }, - 500: { - description: "Internal server error.", + description: "Returns boolean indicating success.", + content: { + "application/json": { + schema: deleteGameResponse, + }, + }, }, + ...GenericResponses, }, }) diff --git a/src/v2/routes/game/delete/id/[id]/schema.ts b/src/v2/routes/game/delete/id/[id]/schema.ts index a922bbb..5c18992 100644 --- a/src/v2/routes/game/delete/id/[id]/schema.ts +++ b/src/v2/routes/game/delete/id/[id]/schema.ts @@ -11,3 +11,7 @@ export const deleteGameSchema = z.object({ }, }), }) + +export const deleteGameResponse = z.object({ + success: z.literal(true), +}) diff --git a/src/v2/routes/game/get/all/openapi.ts b/src/v2/routes/game/get/all/openapi.ts index f6e14c8..6a2d6af 100644 --- a/src/v2/routes/game/get/all/openapi.ts +++ b/src/v2/routes/game/get/all/openapi.ts @@ -1,4 +1,6 @@ +import { GenericResponses } from "@/v2/lib/response-schemas" import { createRoute } from "@hono/zod-openapi" +import { getAllGamesResponse } from "./schema" export const getAllGamesRoute = createRoute({ path: "/all", @@ -8,9 +10,12 @@ export const getAllGamesRoute = createRoute({ responses: { 200: { description: "All games.", + content: { + "application/json": { + schema: getAllGamesResponse, + }, + }, }, - 500: { - description: "Internal server error.", - }, + ...GenericResponses, }, }) diff --git a/src/v2/routes/game/get/all/route.ts b/src/v2/routes/game/get/all/route.ts index 23770f9..6625e51 100644 --- a/src/v2/routes/game/get/all/route.ts +++ b/src/v2/routes/game/get/all/route.ts @@ -8,11 +8,15 @@ const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.openapi(getAllGamesRoute, async (ctx) => { const { drizzle } = await getConnection(ctx.env) const gameManager = new GameManager(drizzle) - const games = await gameManager.listGames() + const allGames = await gameManager.listGames() - return ctx.json({ - games, - }) + return ctx.json( + { + success: true, + games: allGames, + }, + 200 + ) }) export default handler diff --git a/src/v2/routes/game/get/all/schema.ts b/src/v2/routes/game/get/all/schema.ts new file mode 100644 index 0000000..2aa3840 --- /dev/null +++ b/src/v2/routes/game/get/all/schema.ts @@ -0,0 +1,7 @@ +import { z } from "@hono/zod-openapi" +import { selectGameSchema } from "@/v2/db/schema" + +export const getAllGamesResponse = z.object({ + success: z.literal(true), + games: selectGameSchema.array(), +}) diff --git a/src/v2/routes/game/get/id/[id]/openapi.ts b/src/v2/routes/game/get/id/[id]/openapi.ts index b4208e4..1b31047 100644 --- a/src/v2/routes/game/get/id/[id]/openapi.ts +++ b/src/v2/routes/game/get/id/[id]/openapi.ts @@ -1,5 +1,6 @@ import { createRoute } from "@hono/zod-openapi" -import { getGameByIdSchema } from "./schema" +import { getGameByIdSchema, getGameByIDResponse } from "./schema" +import { GenericResponses } from "@/v2/lib/response-schemas" export const getGameByIdRoute = createRoute({ path: "/{id}", @@ -12,9 +13,12 @@ export const getGameByIdRoute = createRoute({ responses: { 200: { description: "Game was found.", + content: { + "application/json": { + schema: getGameByIDResponse, + }, + }, }, - 500: { - description: "Internal server error.", - }, + ...GenericResponses, }, }) diff --git a/src/v2/routes/game/get/id/[id]/schema.ts b/src/v2/routes/game/get/id/[id]/schema.ts index 1f3558e..507dae6 100644 --- a/src/v2/routes/game/get/id/[id]/schema.ts +++ b/src/v2/routes/game/get/id/[id]/schema.ts @@ -1,4 +1,5 @@ import { z } from "@hono/zod-openapi" +import { selectGameSchema } from "@/v2/db/schema" export const getGameByIdSchema = z.object({ id: z.string().openapi({ @@ -11,3 +12,8 @@ export const getGameByIdSchema = z.object({ }, }), }) + +export const getGameByIDResponse = z.object({ + success: z.literal(true), + game: selectGameSchema, +}) diff --git a/src/v2/routes/game/get/name/[name]/openapi.ts b/src/v2/routes/game/get/name/[name]/openapi.ts index 19d8d2e..98a2f58 100644 --- a/src/v2/routes/game/get/name/[name]/openapi.ts +++ b/src/v2/routes/game/get/name/[name]/openapi.ts @@ -1,5 +1,6 @@ import { createRoute } from "@hono/zod-openapi" -import { getGameByNameSchema } from "./schema" +import { getGameByNameSchema, getGameByNameResponse } from "./schema" +import { GenericResponses } from "@/v2/lib/response-schemas" export const getGameByNameRoute = createRoute({ path: "/{name}", @@ -12,9 +13,12 @@ export const getGameByNameRoute = createRoute({ responses: { 200: { description: "Game was found.", + content: { + "application/json": { + schema: getGameByNameResponse, + }, + }, }, - 500: { - description: "Internal server error.", - }, + ...GenericResponses, }, }) diff --git a/src/v2/routes/game/get/name/[name]/schema.ts b/src/v2/routes/game/get/name/[name]/schema.ts index 3419efc..9a9430e 100644 --- a/src/v2/routes/game/get/name/[name]/schema.ts +++ b/src/v2/routes/game/get/name/[name]/schema.ts @@ -1,4 +1,5 @@ import { z } from "@hono/zod-openapi" +import { selectGameSchema } from "@/v2/db/schema" export const getGameByNameSchema = z.object({ name: z.string().openapi({ @@ -11,3 +12,8 @@ export const getGameByNameSchema = z.object({ }, }), }) + +export const getGameByNameResponse = z.object({ + success: z.literal(true), + game: selectGameSchema, +}) diff --git a/src/v2/routes/game/modify/id/[id]/openapi.ts b/src/v2/routes/game/modify/id/[id]/openapi.ts index cf7ec05..c31bfa8 100644 --- a/src/v2/routes/game/modify/id/[id]/openapi.ts +++ b/src/v2/routes/game/modify/id/[id]/openapi.ts @@ -1,5 +1,6 @@ import { createRoute } from "@hono/zod-openapi" -import { modifyGameSchema } from "./schema" +import { modifyGameSchema, modifyGameResponseSchema } from "./schema" +import { GenericResponses } from "@/v2/lib/response-schemas" export const modifyGameRoute = createRoute({ path: "/", @@ -17,16 +18,13 @@ export const modifyGameRoute = createRoute({ }, responses: { 200: { - description: "Returns the game's modified attributes.", - }, - 400: { - description: "Bad request.", - }, - 401: { - description: "Unauthorized", - }, - 500: { - description: "Internal server error.", + description: "Returns the game's attributes", + content: { + "application/json": { + schema: modifyGameResponseSchema, + }, + }, }, + ...GenericResponses, }, }) diff --git a/src/v2/routes/game/modify/id/[id]/schema.ts b/src/v2/routes/game/modify/id/[id]/schema.ts index c6de765..154aea9 100644 --- a/src/v2/routes/game/modify/id/[id]/schema.ts +++ b/src/v2/routes/game/modify/id/[id]/schema.ts @@ -1,4 +1,5 @@ import { z } from "@hono/zod-openapi" +import { selectGameSchema } from "@/v2/db/schema" export const modifyGameSchema = z.object({ id: z.string().openapi({ @@ -19,3 +20,8 @@ export const modifyGameSchema = z.object({ example: "1", }), }) + +export const modifyGameResponseSchema = z.object({ + success: z.literal(true), + game: selectGameSchema, +}) From 215ba556eb247e4d1f2226cda940934f498b6768 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Thu, 21 Dec 2023 07:19:01 +0000 Subject: [PATCH 206/318] fix pk --- src/scripts/seed/seed.ts | 2 +- src/v2/db/schema/asset/asset-atlas.ts | 2 +- .../db/schema/categories/asset-categories.ts | 2 +- .../db/schema/collections/user-collections.ts | 2 +- src/v2/db/schema/game/game.ts | 2 +- .../db/schema/oc-generators/oc-generators.ts | 2 +- src/v2/db/schema/tags/asset-tags.ts | 2 +- src/v2/db/schema/user/user-attributes.ts | 4 +- src/v2/db/schema/user/user-connections.ts | 2 +- src/v2/db/schema/user/user-favorites.ts | 2 +- src/v2/db/schema/user/user.ts | 6 +- src/v2/lib/managers/asset/asset-manager.ts | 16 ++++ src/v2/routes/asset/handler.ts | 2 + src/v2/routes/asset/modify/id/[id]/openapi.ts | 30 +++++++ src/v2/routes/asset/modify/id/[id]/route.ts | 78 +++++++++++++++++++ src/v2/routes/asset/modify/id/[id]/schema.ts | 44 +++++++++++ 16 files changed, 184 insertions(+), 14 deletions(-) create mode 100644 src/v2/routes/asset/modify/id/[id]/openapi.ts create mode 100644 src/v2/routes/asset/modify/id/[id]/route.ts create mode 100644 src/v2/routes/asset/modify/id/[id]/schema.ts diff --git a/src/scripts/seed/seed.ts b/src/scripts/seed/seed.ts index ce5dceb..05b2696 100644 --- a/src/scripts/seed/seed.ts +++ b/src/scripts/seed/seed.ts @@ -51,7 +51,7 @@ async function main() { emailVerified: 1, usernameColour: "#84E6F8", bio: "test bio", - roleFlags: 1, + roleFlags: 127, isContributor: true, selfAssignableRoleFlags: 0, }, diff --git a/src/v2/db/schema/asset/asset-atlas.ts b/src/v2/db/schema/asset/asset-atlas.ts index 577312b..0735917 100644 --- a/src/v2/db/schema/asset/asset-atlas.ts +++ b/src/v2/db/schema/asset/asset-atlas.ts @@ -45,7 +45,7 @@ export const selectAtlasSchema = createSelectSchema(atlas) export const atlasToAsset = sqliteTable( tableNames.atlasToAsset, { - id: text("id"), + id: text("id").primaryKey().notNull(), atlasId: text("atlas_id") .notNull() .references(() => atlas.id, { diff --git a/src/v2/db/schema/categories/asset-categories.ts b/src/v2/db/schema/categories/asset-categories.ts index 79ba6c8..030a008 100644 --- a/src/v2/db/schema/categories/asset-categories.ts +++ b/src/v2/db/schema/categories/asset-categories.ts @@ -14,7 +14,7 @@ import { assetCategoryLikes } from "./asset-categories-likes" export const assetCategory = sqliteTable( tableNames.assetCategory, { - id: text("id").unique().notNull(), // e.g tcg-sheets, splash-art + id: text("id").primaryKey().notNull(), // e.g tcg-sheets, splash-art name: text("name").unique().notNull(), // e.g tcg-sheets, splash-art formattedName: text("formatted_name").notNull(), // e.g TCG Sheets, Splash Art lastUpdated: text("last_updated").notNull(), diff --git a/src/v2/db/schema/collections/user-collections.ts b/src/v2/db/schema/collections/user-collections.ts index 768eacd..c123672 100644 --- a/src/v2/db/schema/collections/user-collections.ts +++ b/src/v2/db/schema/collections/user-collections.ts @@ -24,7 +24,7 @@ export const userCollection = sqliteTable( tableNames.userCollection, { id: text("id") - .unique() + .primaryKey() .notNull() .$defaultFn(() => { return generateID() diff --git a/src/v2/db/schema/game/game.ts b/src/v2/db/schema/game/game.ts index d54a1e8..0c0fb37 100644 --- a/src/v2/db/schema/game/game.ts +++ b/src/v2/db/schema/game/game.ts @@ -20,7 +20,7 @@ NOTE: Game relation is easy to understand and self-explanatory. export const game = sqliteTable( tableNames.game, { - id: text("id").unique().notNull(), + id: text("id").primaryKey().notNull(), // e.g genshin-impact, honkai-impact-3rd name: text("name").notNull().unique(), // e.g genshin-impact, honkai-impact-3rd formattedName: text("formatted_name").notNull(), // e.g Genshin Impact, Honkai Impact 3rd possibleSuggestiveContent: integer("possible_suggestive_content") diff --git a/src/v2/db/schema/oc-generators/oc-generators.ts b/src/v2/db/schema/oc-generators/oc-generators.ts index bf3a623..d368422 100644 --- a/src/v2/db/schema/oc-generators/oc-generators.ts +++ b/src/v2/db/schema/oc-generators/oc-generators.ts @@ -19,7 +19,7 @@ NOTE: OC generators are not stored in the database. export const savedOcGenerators = sqliteTable( tableNames.savedOcGenerators, { - id: text("id").unique().notNull(), + id: text("id").primaryKey().notNull(), userId: text("user_id") .notNull() .references(() => authUser.id, { diff --git a/src/v2/db/schema/tags/asset-tags.ts b/src/v2/db/schema/tags/asset-tags.ts index 7149ef5..3ed2c3a 100644 --- a/src/v2/db/schema/tags/asset-tags.ts +++ b/src/v2/db/schema/tags/asset-tags.ts @@ -20,7 +20,7 @@ NOTE: Asset tags are not stored as ENUMs to allow for better UX, flexibility, an export const assetTag = sqliteTable( tableNames.assetTag, { - id: text("id").unique().notNull(), + id: text("id").primaryKey().notNull(), name: text("name").notNull().unique(), formattedName: text("formatted_name").notNull(), lastUpdated: text("last_updated").notNull(), diff --git a/src/v2/db/schema/user/user-attributes.ts b/src/v2/db/schema/user/user-attributes.ts index 4f32227..43038a0 100644 --- a/src/v2/db/schema/user/user-attributes.ts +++ b/src/v2/db/schema/user/user-attributes.ts @@ -18,7 +18,7 @@ NOTE: This is mostly security related. export const emailVerificationToken = sqliteTable( tableNames.emailVerificationToken, { - id: text("id").unique().notNull(), + id: text("id").primaryKey().notNull(), userId: text("user_id") .notNull() .references(() => authUser.id, { @@ -59,7 +59,7 @@ export const selectEmailVerificationTokenSchema = createSelectSchema( export const passwordResetToken = sqliteTable( tableNames.passwordResetToken, { - id: text("id").unique().notNull(), + id: text("id").primaryKey().notNull(), userId: text("user_id") .notNull() .references(() => authUser.id, { diff --git a/src/v2/db/schema/user/user-connections.ts b/src/v2/db/schema/user/user-connections.ts index 10a5254..1e6f565 100644 --- a/src/v2/db/schema/user/user-connections.ts +++ b/src/v2/db/schema/user/user-connections.ts @@ -12,7 +12,7 @@ NOTE: This file will be expanded on in the future, but for now it's just for Dis export const socialsConnection = sqliteTable( tableNames.socialsConnection, { - id: text("id").unique().notNull(), + id: text("id").primaryKey().notNull(), userId: text("user_id") .notNull() .references(() => authUser.id, { diff --git a/src/v2/db/schema/user/user-favorites.ts b/src/v2/db/schema/user/user-favorites.ts index 6c93885..23eabf8 100644 --- a/src/v2/db/schema/user/user-favorites.ts +++ b/src/v2/db/schema/user/user-favorites.ts @@ -58,7 +58,7 @@ export const userFavoriteAsset = sqliteTable( tableNames.userFavoriteAsset, { id: text("id") - .unique() + .primaryKey() .notNull() .$defaultFn(() => { return generateID() diff --git a/src/v2/db/schema/user/user.ts b/src/v2/db/schema/user/user.ts index 223b132..d1e24de 100644 --- a/src/v2/db/schema/user/user.ts +++ b/src/v2/db/schema/user/user.ts @@ -35,7 +35,7 @@ export const authUser = sqliteTable( tableNames.authUser, { id: text("id") - .unique() + .primaryKey() .notNull() .$defaultFn(() => { return generateID() @@ -91,7 +91,7 @@ export const authCredentials = sqliteTable( tableNames.authCredentials, { id: text("id") - .unique() + .primaryKey() .notNull() .$defaultFn(() => { return generateID(20) @@ -126,7 +126,7 @@ export const selectAuthCredentialsSchema = createSelectSchema(authCredentials) export const userSession = sqliteTable( tableNames.authSession, { - id: text("id").unique().notNull(), + id: text("id").primaryKey().notNull(), userId: text("user_id") .notNull() .references(() => authUser.id, { diff --git a/src/v2/lib/managers/asset/asset-manager.ts b/src/v2/lib/managers/asset/asset-manager.ts index b4d9f55..6b8b3f9 100644 --- a/src/v2/lib/managers/asset/asset-manager.ts +++ b/src/v2/lib/managers/asset/asset-manager.ts @@ -46,6 +46,22 @@ export class AssetManager { } } + public async updateAssetById( + assetId: number, + update: z.infer + ) { + try { + return await this.drizzle + .update(asset) + .set(update) + .where(eq(asset.id, assetId)) + .returning() + } catch (e) { + console.error(`Error updating asset by ID ${assetId}`, e) + throw new Error(`Error updating asset by ID ${assetId}`) + } + } + /** * Retrieves a list of assets by their IDs. * @param assetIds - An array of asset IDs to retrieve. diff --git a/src/v2/routes/asset/handler.ts b/src/v2/routes/asset/handler.ts index edff221..be7b903 100644 --- a/src/v2/routes/asset/handler.ts +++ b/src/v2/routes/asset/handler.ts @@ -1,10 +1,12 @@ import { OpenAPIHono } from "@hono/zod-openapi" import AssetGetRoute from "@/v2/routes/asset/get/handler" import AssetSearchRoute from "@/v2/routes/asset/search/handler" +import AssetModifyRoute from "@/v2/routes/asset/modify/id/[id]/route" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.route("/get", AssetGetRoute) handler.route("/search", AssetSearchRoute) +handler.route("/modify/id/{id}", AssetModifyRoute) export default handler diff --git a/src/v2/routes/asset/modify/id/[id]/openapi.ts b/src/v2/routes/asset/modify/id/[id]/openapi.ts new file mode 100644 index 0000000..1cef0a6 --- /dev/null +++ b/src/v2/routes/asset/modify/id/[id]/openapi.ts @@ -0,0 +1,30 @@ +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { modifyAssetSchema, modifyAssetResponseSchema } from "./schema" + +export const modifyAssetRoute = createRoute({ + path: "/", + method: "post", + description: "Modify an existing asset.", + tags: ["Asset"], + request: { + body: { + content: { + "application/json": { + schema: modifyAssetSchema, + }, + }, + }, + }, + responses: { + 200: { + description: "Returns the asset's new attributes", + content: { + "application/json": { + schema: modifyAssetResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) diff --git a/src/v2/routes/asset/modify/id/[id]/route.ts b/src/v2/routes/asset/modify/id/[id]/route.ts new file mode 100644 index 0000000..122d17e --- /dev/null +++ b/src/v2/routes/asset/modify/id/[id]/route.ts @@ -0,0 +1,78 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { getConnection } from "@/v2/db/turso" +import { modifyAssetRoute } from "./openapi" +import { roleFlagsToArray } from "@/v2/lib/helpers/role-flags" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +import { AssetManager } from "@/v2/lib/managers/asset/asset-manager" +import { asset } from "@/v2/db/schema" +import { eq } from "drizzle-orm" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.openapi(modifyAssetRoute, async (ctx) => { + const { id, name, tags, assetCategoryId, gameId } = ctx.req.valid("json") + + if (isNaN(parseInt(id))) { + return ctx.json( + { + success: false, + message: "Invalid asset ID", + }, + 400 + ) + } + + const authSessionManager = new AuthSessionManager(ctx) + + const { user } = await authSessionManager.validateSession() + + if (!user) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + const { drizzle } = getConnection(ctx.env) + const assetManager = new AssetManager(drizzle) + + const [assetUser] = await drizzle + .select({ + uploadedById: asset.uploadedById, + }) + .from(asset) + .where(eq(asset.id, parseInt(id))) + + if ( + assetUser.uploadedById !== user.id || + !roleFlagsToArray(user.roleFlags).includes("DEVELOPER") + ) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + const updatedAsset = await assetManager.updateAssetById(parseInt(id), { + name, + tags, + assetCategoryId, + gameId, + }) + + return ctx.json( + { + success: true, + asset: updatedAsset, + }, + 200 + ) +}) + +export default handler diff --git a/src/v2/routes/asset/modify/id/[id]/schema.ts b/src/v2/routes/asset/modify/id/[id]/schema.ts new file mode 100644 index 0000000..76c7ac5 --- /dev/null +++ b/src/v2/routes/asset/modify/id/[id]/schema.ts @@ -0,0 +1,44 @@ +import { z } from "zod" +import { selectAssetSchema } from "@/v2/db/schema" + +export const modifyAssetSchema = z.object({ + id: z.string().openapi({ + description: "The id of the asset to modify.", + example: "1", + }), + name: z + .string() + .min(3) + .max(32) + .openapi({ + description: "The name of the asset.", + example: "keqing-nobg.png", + }) + .optional(), + tags: z + .string() + .openapi({ + description: "Comma seperated list of tags for the asset.", + example: "official,1.0", + }) + .optional(), + assetCategoryId: z + .string() + .openapi({ + description: "The asset category ID for the asset.", + example: "splash-art", + }) + .optional(), + gameId: z + .string() + .openapi({ + description: "The game ID for the asset.", + example: "genshin-impact", + }) + .optional(), +}) + +export const modifyAssetResponseSchema = z.object({ + success: z.literal(true), + game: selectAssetSchema, +}) From fdefdb95796cdaa18cbdf4c4a8072936ca22b495 Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Sun, 31 Dec 2023 10:40:12 +0000 Subject: [PATCH 207/318] gm --- src/index.ts | 10 ++++++++++ src/v2/middleware/csrf.ts | 10 ++++------ src/v2/routes/auth/handler.ts | 9 --------- 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/index.ts b/src/index.ts index f4c2271..6097a3a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,6 +3,7 @@ import { apiReference } from "@scalar/hono-api-reference" import { prettyJSON } from "hono/pretty-json" import BaseRoutes from "@/v2/routes/handler" import { OpenAPIConfig } from "./openapi/config" +import { cors } from "hono/cors" import { csrfValidation } from "./v2/middleware/csrf" import { LogTime } from "./v2/middleware/time-taken" @@ -11,6 +12,15 @@ const app = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() app.route("/v2", BaseRoutes) +app.use( + "*", + cors({ + // todo(dromzeh): THIS IS TEMPORARY BTW PLEASE SET THIS DEPENDENT ON ENV + origin: "*", + credentials: true, + }) +) + app.get( "/", apiReference({ diff --git a/src/v2/middleware/csrf.ts b/src/v2/middleware/csrf.ts index 59fc7b0..26621cd 100644 --- a/src/v2/middleware/csrf.ts +++ b/src/v2/middleware/csrf.ts @@ -9,15 +9,13 @@ export async function csrfValidation(ctx: APIContext, next: Next) { const originHeader = ctx.req.header("Origin") const hostHeader = ctx.req.header("Host") - if ( - !originHeader || - !hostHeader || - !verifyRequestOrigin(originHeader, [hostHeader]) - ) { + const requestOriginValid = verifyRequestOrigin(originHeader, [hostHeader]) + + if (!originHeader || !hostHeader || !requestOriginValid) { return ctx.json( { success: false, - message: "Forbidden", + message: "Forbidden (CSRF)", }, 403 ) diff --git a/src/v2/routes/auth/handler.ts b/src/v2/routes/auth/handler.ts index e43ff6f..76019cb 100644 --- a/src/v2/routes/auth/handler.ts +++ b/src/v2/routes/auth/handler.ts @@ -2,18 +2,9 @@ import { OpenAPIHono } from "@hono/zod-openapi" import SessionHandler from "@/v2/routes/auth/session/handler" import LoginRoute from "@/v2/routes/auth/login/route" import CreateAccountRoute from "@/v2/routes/auth/create/route" -import { cors } from "hono/cors" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() -handler.use( - "*", - cors({ - origin: "*", - credentials: true, - }) -) - handler.route("/session", SessionHandler) handler.route("/login", LoginRoute) handler.route("/create", CreateAccountRoute) From f62a5b2eec98ca4236b10f8ad74d8cf5420bdfcb Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Sun, 31 Dec 2023 10:43:37 +0000 Subject: [PATCH 208/318] move customcss into openapi config --- src/index.ts | 128 +----------------------------------------- src/openapi/config.ts | 125 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 127 insertions(+), 126 deletions(-) diff --git a/src/index.ts b/src/index.ts index 6097a3a..26146bf 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,7 +2,7 @@ import { OpenAPIHono } from "@hono/zod-openapi" import { apiReference } from "@scalar/hono-api-reference" import { prettyJSON } from "hono/pretty-json" import BaseRoutes from "@/v2/routes/handler" -import { OpenAPIConfig } from "./openapi/config" +import { CustomCSS, OpenAPIConfig } from "./openapi/config" import { cors } from "hono/cors" import { csrfValidation } from "./v2/middleware/csrf" @@ -27,131 +27,7 @@ app.get( spec: { url: "/openapi", }, - // i should clean this up at some point icl - customCss: ` - :root { - --theme-font: 'Inter', var(--system-fonts); - } - /* basic theme */ - .light-mode { - --theme-color-1: #2a2f45; - --theme-color-2: #757575; - --theme-color-3: #8e8e8e; - --theme-color-accent: #EA8FEA; - - --theme-background-1: #fff; - --theme-background-2: #f6f6f6; - --theme-background-3: #e7e7e7; - --theme-background-accent: #8ab4f81f; - - --theme-border-color: rgba(0, 0, 0, 0.1); - } - .dark-mode { - --theme-color-1: rgba(255, 255, 255, 0.9); - --theme-color-2: rgba(255, 255, 255, 0.62); - --theme-color-3: rgba(255, 255, 255, 0.44); - --theme-color-accent: #EA8FEA; - - --theme-background-1: #09090B; - --theme-background-2: #111113; - --theme-background-3: #19191A; - --theme-background-accent: #8ab4f81f; - - --theme-border-color: rgba(255, 255, 255, 0.1); - } - /* Document header */ - .light-mode .t-doc__header { - --header-background-1: var(--theme-background-1); - --header-border-color: var(--theme-border-color); - --header-color-1: var(--theme-color-1); - --header-color-2: var(--theme-color-2); - --header-background-toggle: var(--theme-color-3); - --header-call-to-action-color: var(--theme-color-accent); - } - - .dark-mode .t-doc__header { - --header-background-1: var(--theme-background-1); - --header-border-color: var(--theme-border-color); - --header-color-1: var(--theme-color-1); - --header-color-2: var(--theme-color-2); - --header-background-toggle: var(--theme-color-3); - --header-call-to-action-color: var(--theme-color-accent); - } - /* Document Sidebar */ - .light-mode .t-doc__sidebar { - --sidebar-background-1: var(--theme-background-1); - --sidebar-item-hover-color: currentColor; - --sidebar-item-hover-background: var(--theme-background-2); - --sidebar-item-active-background: var(--theme-background-accent); - --sidebar-border-color: var(--theme-border-color); - --sidebar-color-1: var(--theme-color-1); - --sidebar-color-2: var(--theme-color-2); - --sidebar-color-active: var(--theme-color-accent); - --sidebar-search-background: transparent; - --sidebar-search-border-color: var(--theme-border-color); - --sidebar-search--color: var(--theme-color-3); - } - - .dark-mode .sidebar { - --sidebar-background-1: var(--theme-background-1); - --sidebar-item-hover-color: currentColor; - --sidebar-item-hover-background: var(--theme-background-2); - --sidebar-item-active-background: var(--theme-background-accent); - --sidebar-border-color: var(--theme-border-color); - --sidebar-color-1: var(--theme-color-1); - --sidebar-color-2: var(--theme-color-2); - --sidebar-color-active: var(--theme-color-accent); - --sidebar-search-background: transparent; - --sidebar-search-border-color: var(--theme-border-color); - --sidebar-search--color: var(--theme-color-3); - } - - .sidebar-heading-link { - font-weight: 600; - } - - .item-entry-description { - color: rgba(255, 255, 255, 0.44) !important; - } - - /* advanced */ - .light-mode { - --theme-button-1: rgb(49 53 56); - --theme-button-1-color: #fff; - --theme-button-1-hover: rgb(28 31 33); - - --theme-color-green: #C8FFD4; - --theme-color-red: #FF8080; - --theme-color-yellow: #edbe20; - --theme-color-blue: #B8E8FC; - --theme-color-orange: #FFCF96; - --theme-color-purple: #EA8FEA; - - --theme-scrollbar-color: rgba(0, 0, 0, 0.18); - --theme-scrollbar-color-active: rgba(0, 0, 0, 0.36); - } - .dark-mode { - --theme-button-1: #f6f6f6; - --theme-button-1-color: #000; - --theme-button-1-hover: #e7e7e7; - - --theme-color-green: #C8FFD4; - --theme-color-red: #FF8080; - --theme-color-yellow: #ffc90d; - --theme-color-blue: #B8E8FC; - --theme-color-orange: #FFCF96; - --theme-color-purple: #EA8FEA; - - --theme-scrollbar-color: rgba(255, 255, 255, 0.24); - --theme-scrollbar-color-active: rgba(255, 255, 255, 0.48); - } - :root { - --theme-radius: 3px; - --theme-radius-lg: 6px; - --theme-radius-xl: 8px; - - --theme-header-height: 50px; - }`, + customCss: CustomCSS, }) ) diff --git a/src/openapi/config.ts b/src/openapi/config.ts index f56d298..d9c0dc4 100644 --- a/src/openapi/config.ts +++ b/src/openapi/config.ts @@ -16,3 +16,128 @@ export const OpenAPIConfig: OpenAPIObjectConfig = { }, }, } + +export const CustomCSS: string = ` + :root { + --theme-font: 'Inter', var(--system-fonts); + } + /* basic theme */ + .light-mode { + --theme-color-1: #2a2f45; + --theme-color-2: #757575; + --theme-color-3: #8e8e8e; + --theme-color-accent: #EA8FEA; + + --theme-background-1: #fff; + --theme-background-2: #f6f6f6; + --theme-background-3: #e7e7e7; + --theme-background-accent: #8ab4f81f; + + --theme-border-color: rgba(0, 0, 0, 0.1); + } + .dark-mode { + --theme-color-1: rgba(255, 255, 255, 0.9); + --theme-color-2: rgba(255, 255, 255, 0.62); + --theme-color-3: rgba(255, 255, 255, 0.44); + --theme-color-accent: #EA8FEA; + + --theme-background-1: #09090B; + --theme-background-2: #111113; + --theme-background-3: #19191A; + --theme-background-accent: #8ab4f81f; + + --theme-border-color: rgba(255, 255, 255, 0.1); + } + /* Document header */ + .light-mode .t-doc__header { + --header-background-1: var(--theme-background-1); + --header-border-color: var(--theme-border-color); + --header-color-1: var(--theme-color-1); + --header-color-2: var(--theme-color-2); + --header-background-toggle: var(--theme-color-3); + --header-call-to-action-color: var(--theme-color-accent); + } + + .dark-mode .t-doc__header { + --header-background-1: var(--theme-background-1); + --header-border-color: var(--theme-border-color); + --header-color-1: var(--theme-color-1); + --header-color-2: var(--theme-color-2); + --header-background-toggle: var(--theme-color-3); + --header-call-to-action-color: var(--theme-color-accent); + } + /* Document Sidebar */ + .light-mode .t-doc__sidebar { + --sidebar-background-1: var(--theme-background-1); + --sidebar-item-hover-color: currentColor; + --sidebar-item-hover-background: var(--theme-background-2); + --sidebar-item-active-background: var(--theme-background-accent); + --sidebar-border-color: var(--theme-border-color); + --sidebar-color-1: var(--theme-color-1); + --sidebar-color-2: var(--theme-color-2); + --sidebar-color-active: var(--theme-color-accent); + --sidebar-search-background: transparent; + --sidebar-search-border-color: var(--theme-border-color); + --sidebar-search--color: var(--theme-color-3); + } + + .dark-mode .sidebar { + --sidebar-background-1: var(--theme-background-1); + --sidebar-item-hover-color: currentColor; + --sidebar-item-hover-background: var(--theme-background-2); + --sidebar-item-active-background: var(--theme-background-accent); + --sidebar-border-color: var(--theme-border-color); + --sidebar-color-1: var(--theme-color-1); + --sidebar-color-2: var(--theme-color-2); + --sidebar-color-active: var(--theme-color-accent); + --sidebar-search-background: transparent; + --sidebar-search-border-color: var(--theme-border-color); + --sidebar-search--color: var(--theme-color-3); + } + + .sidebar-heading-link { + font-weight: 600; + } + + .item-entry-description { + color: rgba(255, 255, 255, 0.44) !important; + } + + /* advanced */ + .light-mode { + --theme-button-1: rgb(49 53 56); + --theme-button-1-color: #fff; + --theme-button-1-hover: rgb(28 31 33); + + --theme-color-green: #C8FFD4; + --theme-color-red: #FF8080; + --theme-color-yellow: #edbe20; + --theme-color-blue: #B8E8FC; + --theme-color-orange: #FFCF96; + --theme-color-purple: #EA8FEA; + + --theme-scrollbar-color: rgba(0, 0, 0, 0.18); + --theme-scrollbar-color-active: rgba(0, 0, 0, 0.36); + } + .dark-mode { + --theme-button-1: #f6f6f6; + --theme-button-1-color: #000; + --theme-button-1-hover: #e7e7e7; + + --theme-color-green: #C8FFD4; + --theme-color-red: #FF8080; + --theme-color-yellow: #ffc90d; + --theme-color-blue: #B8E8FC; + --theme-color-orange: #FFCF96; + --theme-color-purple: #EA8FEA; + + --theme-scrollbar-color: rgba(255, 255, 255, 0.24); + --theme-scrollbar-color-active: rgba(255, 255, 255, 0.48); + } + :root { + --theme-radius: 3px; + --theme-radius-lg: 6px; + --theme-radius-xl: 8px; + + --theme-header-height: 50px; + }` From b98df2fc6e32565458ebcc65fe3b44ea568b529b Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Sun, 31 Dec 2023 10:51:45 +0000 Subject: [PATCH 209/318] cleanup deps --- package.json | 4 +- pnpm-lock.yaml | 106 +++++++++++-------------------------------------- 2 files changed, 25 insertions(+), 85 deletions(-) diff --git a/package.json b/package.json index 0caac6d..255b374 100644 --- a/package.json +++ b/package.json @@ -25,8 +25,6 @@ "dotenv": "^16.3.1", "drizzle-kit": "^0.20.6", "eslint": "^8.55.0", - "eslint-config-google": "^0.14.0", - "eslint-plugin-json": "^3.1.0", "husky": "^8.0.3", "openapi-generator": "link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator", "tsx": "^4.6.2", @@ -35,6 +33,7 @@ }, "private": true, "dependencies": { + "@axiomhq/js": "1.0.0-rc.1", "@hono/swagger-ui": "^0.2.0", "@hono/zod-openapi": "^0.9.3", "@libsql/client": "0.4.0-pre.5", @@ -48,7 +47,6 @@ "lucia": "3.0.0-beta.11", "oslo": "^0.23.5", "prettier": "^3.1.0", - "uuid": "^9.0.1", "zod": "^3.22.4" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index db13b8a..fcec2e1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,6 +5,9 @@ settings: excludeLinksFromLockfile: false dependencies: + "@axiomhq/js": + specifier: 1.0.0-rc.1 + version: 1.0.0-rc.1 "@hono/swagger-ui": specifier: ^0.2.0 version: 0.2.0(hono@3.11.3) @@ -44,9 +47,6 @@ dependencies: prettier: specifier: ^3.1.0 version: 3.1.0 - uuid: - specifier: ^9.0.1 - version: 9.0.1 zod: specifier: ^3.22.4 version: 3.22.4 @@ -70,12 +70,6 @@ devDependencies: eslint: specifier: ^8.55.0 version: 8.55.0 - eslint-config-google: - specifier: ^0.14.0 - version: 0.14.0(eslint@8.55.0) - eslint-plugin-json: - specifier: ^3.1.0 - version: 3.1.0 husky: specifier: ^8.0.3 version: 8.0.3 @@ -168,6 +162,17 @@ packages: zod: 3.22.4 dev: true + /@axiomhq/js@1.0.0-rc.1: + resolution: + { + integrity: sha512-B/TT5HPc3KmoEIJUwhfzAAp0SLNfcxQnr0SGEbs1lWS0OOLckgj1Q4K1Tp/l669Yje1CK68i3LcajU/9+z+v2g==, + } + engines: { node: ">=16" } + dependencies: + fetch-retry: 5.0.6 + uuid: 8.3.2 + dev: false + /@babel/helper-string-parser@7.23.4: resolution: { @@ -3995,29 +4000,6 @@ packages: engines: { node: ">=12" } dev: false - /eslint-config-google@0.14.0(eslint@8.55.0): - resolution: - { - integrity: sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==, - } - engines: { node: ">=0.10.0" } - peerDependencies: - eslint: ">=5.16.0" - dependencies: - eslint: 8.55.0 - dev: true - - /eslint-plugin-json@3.1.0: - resolution: - { - integrity: sha512-MrlG2ynFEHe7wDGwbUuFPsaT2b1uhuEFhJ+W1f1u+1C2EkXmTYJp4B1aAdQQ8M+CC3t//N/oRKiIVw14L2HR1g==, - } - engines: { node: ">=12.0" } - dependencies: - lodash: 4.17.21 - vscode-json-languageservice: 4.2.1 - dev: true - /eslint-scope@7.2.2: resolution: { @@ -4243,6 +4225,13 @@ packages: web-streams-polyfill: 3.2.1 dev: false + /fetch-retry@5.0.6: + resolution: + { + integrity: sha512-3yurQZ2hD9VISAhJJP9bpYFNQrHHBXE2JxxjY5aLEcDi46RmAzJE2OC9FAde0yis5ElW0jTTzs0zfg/Cca4XqQ==, + } + dev: false + /file-entry-cache@6.0.1: resolution: { @@ -5012,13 +5001,6 @@ packages: integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, } - /jsonc-parser@3.2.0: - resolution: - { - integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==, - } - dev: true - /keyv@4.5.4: resolution: { @@ -5084,6 +5066,7 @@ packages: { integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, } + dev: false /longest-streak@3.1.0: resolution: @@ -7047,10 +7030,10 @@ packages: } dev: false - /uuid@9.0.1: + /uuid@8.3.2: resolution: { - integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==, + integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==, } hasBin: true dev: false @@ -7108,47 +7091,6 @@ packages: vfile-message: 4.0.2 dev: false - /vscode-json-languageservice@4.2.1: - resolution: - { - integrity: sha512-xGmv9QIWs2H8obGbWg+sIPI/3/pFgj/5OWBhNzs00BkYQ9UaB2F6JJaGB/2/YOZJ3BvLXQTC4Q7muqU25QgAhA==, - } - dependencies: - jsonc-parser: 3.2.0 - vscode-languageserver-textdocument: 1.0.11 - vscode-languageserver-types: 3.17.5 - vscode-nls: 5.2.0 - vscode-uri: 3.0.8 - dev: true - - /vscode-languageserver-textdocument@1.0.11: - resolution: - { - integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==, - } - dev: true - - /vscode-languageserver-types@3.17.5: - resolution: - { - integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==, - } - dev: true - - /vscode-nls@5.2.0: - resolution: - { - integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==, - } - dev: true - - /vscode-uri@3.0.8: - resolution: - { - integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==, - } - dev: true - /vue-demi@0.14.6(vue@3.3.13): resolution: { From 4688364c0c8bcca84e37abda9ce78079140a691d Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Sun, 31 Dec 2023 11:22:26 +0000 Subject: [PATCH 210/318] update deps & rlly bad temp fix --- .eslintrc.json | 2 +- package.json | 32 +- pnpm-lock.yaml | 7598 +++++++++++++++-- .../lib/auth/definitions/auth-definitions.ts | 40 +- src/v2/routes/auth/session/validate/route.ts | 1 + src/v2/routes/auth/session/validate/schema.ts | 24 +- 6 files changed, 6874 insertions(+), 823 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 3e8583d..4bdf6cd 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -2,7 +2,7 @@ "root": true, "extends": ["plugin:@typescript-eslint/recommended"], "parser": "@typescript-eslint/parser", - "plugins": ["json"], + "plugins": [], "rules": { "no-const-assign": "error", "no-extra-semi": "error", diff --git a/package.json b/package.json index 255b374..2725faa 100644 --- a/package.json +++ b/package.json @@ -20,33 +20,33 @@ }, "devDependencies": { "@asteasolutions/zod-to-openapi": "^6.3.0", - "@cloudflare/workers-types": "^4.20231121.0", - "@types/node": "^20.10.4", + "@cloudflare/workers-types": "^4.20231218.0", + "@types/node": "^20.10.6", "dotenv": "^16.3.1", - "drizzle-kit": "^0.20.6", - "eslint": "^8.55.0", + "drizzle-kit": "^0.20.9", + "eslint": "^8.56.0", "husky": "^8.0.3", "openapi-generator": "link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator", - "tsx": "^4.6.2", + "tsx": "^4.7.0", "typescript": "^5.3.3", - "wrangler": "3.19.0" + "wrangler": "3.22.1" }, "private": true, "dependencies": { "@axiomhq/js": "1.0.0-rc.1", - "@hono/swagger-ui": "^0.2.0", - "@hono/zod-openapi": "^0.9.3", + "@hono/swagger-ui": "^0.2.1", + "@hono/zod-openapi": "^0.9.5", "@libsql/client": "0.4.0-pre.5", - "@lucia-auth/adapter-sqlite": "3.0.0-beta.9", - "@scalar/hono-api-reference": "^0.3.3", - "@typescript-eslint/eslint-plugin": "^6.13.2", + "@lucia-auth/adapter-sqlite": "3.0.0-beta.11", + "@scalar/hono-api-reference": "^0.3.9", + "@typescript-eslint/eslint-plugin": "^6.16.0", "better-sqlite3": "^9.2.2", - "drizzle-orm": "^0.29.1", + "drizzle-orm": "^0.29.2", "drizzle-zod": "^0.5.1", - "hono": "^3.11.3", - "lucia": "3.0.0-beta.11", - "oslo": "^0.23.5", - "prettier": "^3.1.0", + "hono": "^3.11.11", + "lucia": "3.0.0-beta.13", + "oslo": "^0.26.2", + "prettier": "^3.1.1", "zod": "^3.22.4" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fcec2e1..593dd5e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,44 +9,44 @@ dependencies: specifier: 1.0.0-rc.1 version: 1.0.0-rc.1 "@hono/swagger-ui": - specifier: ^0.2.0 - version: 0.2.0(hono@3.11.3) + specifier: ^0.2.1 + version: 0.2.1(hono@3.11.11) "@hono/zod-openapi": - specifier: ^0.9.3 - version: 0.9.3(hono@3.11.3)(zod@3.22.4) + specifier: ^0.9.5 + version: 0.9.5(hono@3.11.11)(zod@3.22.4) "@libsql/client": specifier: 0.4.0-pre.5 version: 0.4.0-pre.5 "@lucia-auth/adapter-sqlite": - specifier: 3.0.0-beta.9 - version: 3.0.0-beta.9(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2)(lucia@3.0.0-beta.11) + specifier: 3.0.0-beta.11 + version: 3.0.0-beta.11(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2)(lucia@3.0.0-beta.13) "@scalar/hono-api-reference": - specifier: ^0.3.3 - version: 0.3.3(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.9.3)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.2)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(hono@3.11.3)(nanoid@5.0.4)(postcss@8.4.32)(typescript@5.3.3)(unified@11.0.4)(vue@3.3.13) + specifier: ^0.3.9 + version: 0.3.9(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(hono@3.11.11)(nanoid@5.0.4)(postcss@8.4.32)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.3) "@typescript-eslint/eslint-plugin": - specifier: ^6.13.2 - version: 6.13.2(@typescript-eslint/parser@6.13.2)(eslint@8.55.0)(typescript@5.3.3) + specifier: ^6.16.0 + version: 6.16.0(@typescript-eslint/parser@6.16.0)(eslint@8.56.0)(typescript@5.3.3) better-sqlite3: specifier: ^9.2.2 version: 9.2.2 drizzle-orm: - specifier: ^0.29.1 - version: 0.29.1(@cloudflare/workers-types@4.20231121.0)(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2) + specifier: ^0.29.2 + version: 0.29.2(@cloudflare/workers-types@4.20231218.0)(@libsql/client@0.4.0-pre.5)(@types/react@18.2.46)(better-sqlite3@9.2.2)(expo-sqlite@13.2.0)(react@18.2.0) drizzle-zod: specifier: ^0.5.1 - version: 0.5.1(drizzle-orm@0.29.1)(zod@3.22.4) + version: 0.5.1(drizzle-orm@0.29.2)(zod@3.22.4) hono: - specifier: ^3.11.3 - version: 3.11.3 + specifier: ^3.11.11 + version: 3.11.11 lucia: - specifier: 3.0.0-beta.11 - version: 3.0.0-beta.11 + specifier: 3.0.0-beta.13 + version: 3.0.0-beta.13 oslo: - specifier: ^0.23.5 - version: 0.23.5 + specifier: ^0.26.2 + version: 0.26.2 prettier: - specifier: ^3.1.0 - version: 3.1.0 + specifier: ^3.1.1 + version: 3.1.1 zod: specifier: ^3.22.4 version: 3.22.4 @@ -56,20 +56,20 @@ devDependencies: specifier: ^6.3.0 version: 6.3.0(zod@3.22.4) "@cloudflare/workers-types": - specifier: ^4.20231121.0 - version: 4.20231121.0 + specifier: ^4.20231218.0 + version: 4.20231218.0 "@types/node": - specifier: ^20.10.4 - version: 20.10.4 + specifier: ^20.10.6 + version: 20.10.6 dotenv: specifier: ^16.3.1 version: 16.3.1 drizzle-kit: - specifier: ^0.20.6 - version: 0.20.6 + specifier: ^0.20.9 + version: 0.20.9 eslint: - specifier: ^8.55.0 - version: 8.55.0 + specifier: ^8.56.0 + version: 8.56.0 husky: specifier: ^8.0.3 version: 8.0.3 @@ -77,14 +77,14 @@ devDependencies: specifier: link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator version: link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator tsx: - specifier: ^4.6.2 - version: 4.6.2 + specifier: ^4.7.0 + version: 4.7.0 typescript: specifier: ^5.3.3 version: 5.3.3 wrangler: - specifier: 3.19.0 - version: 3.19.0 + specifier: 3.22.1 + version: 3.22.1 packages: /@aashutoshrathi/word-wrap@1.2.6: @@ -94,6 +94,17 @@ packages: } engines: { node: ">=0.10.0" } + /@ampproject/remapping@2.2.1: + resolution: + { + integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==, + } + engines: { node: ">=6.0.0" } + dependencies: + "@jridgewell/gen-mapping": 0.3.3 + "@jridgewell/trace-mapping": 0.3.20 + dev: false + /@apidevtools/json-schema-ref-parser@9.0.6: resolution: { @@ -146,7 +157,7 @@ packages: peerDependencies: zod: ^3.20.2 dependencies: - openapi3-ts: 4.1.2 + openapi3-ts: 4.2.1 zod: 3.22.4 dev: false @@ -158,7 +169,7 @@ packages: peerDependencies: zod: ^3.20.2 dependencies: - openapi3-ts: 4.1.2 + openapi3-ts: 4.2.1 zod: 3.22.4 dev: true @@ -173,394 +184,2189 @@ packages: uuid: 8.3.2 dev: false - /@babel/helper-string-parser@7.23.4: + /@babel/code-frame@7.10.4: resolution: { - integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==, + integrity: sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==, + } + dependencies: + "@babel/highlight": 7.23.4 + dev: false + + /@babel/code-frame@7.23.5: + resolution: + { + integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==, } engines: { node: ">=6.9.0" } + dependencies: + "@babel/highlight": 7.23.4 + chalk: 2.4.2 dev: false - /@babel/helper-validator-identifier@7.22.20: + /@babel/compat-data@7.23.5: resolution: { - integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==, + integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==, } engines: { node: ">=6.9.0" } dev: false - /@babel/parser@7.23.6: + /@babel/core@7.23.7: resolution: { - integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==, + integrity: sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==, } - engines: { node: ">=6.0.0" } - hasBin: true + engines: { node: ">=6.9.0" } dependencies: + "@ampproject/remapping": 2.2.1 + "@babel/code-frame": 7.23.5 + "@babel/generator": 7.23.6 + "@babel/helper-compilation-targets": 7.23.6 + "@babel/helper-module-transforms": 7.23.3(@babel/core@7.23.7) + "@babel/helpers": 7.23.7 + "@babel/parser": 7.23.6 + "@babel/template": 7.22.15 + "@babel/traverse": 7.23.7 "@babel/types": 7.23.6 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color dev: false - /@babel/runtime@7.23.6: + /@babel/generator@7.23.6: resolution: { - integrity: sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==, + integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==, } engines: { node: ">=6.9.0" } dependencies: - regenerator-runtime: 0.14.1 + "@babel/types": 7.23.6 + "@jridgewell/gen-mapping": 0.3.3 + "@jridgewell/trace-mapping": 0.3.20 + jsesc: 2.5.2 dev: false - /@babel/types@7.23.6: + /@babel/helper-annotate-as-pure@7.22.5: resolution: { - integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==, + integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==, } engines: { node: ">=6.9.0" } dependencies: - "@babel/helper-string-parser": 7.23.4 - "@babel/helper-validator-identifier": 7.22.20 - to-fast-properties: 2.0.0 + "@babel/types": 7.23.6 dev: false - /@cloudflare/kv-asset-handler@0.2.0: + /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: resolution: { - integrity: sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==, + integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==, } + engines: { node: ">=6.9.0" } dependencies: - mime: 3.0.0 - dev: true + "@babel/types": 7.23.6 + dev: false - /@cloudflare/workerd-darwin-64@1.20231030.0: + /@babel/helper-compilation-targets@7.23.6: resolution: { - integrity: sha512-J4PQ9utPxLya9yHdMMx3AZeC5M/6FxcoYw6jo9jbDDFTy+a4Gslqf4Im9We3aeOEdPXa3tgQHVQOSelJSZLhIw==, + integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==, } - engines: { node: ">=16" } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true + engines: { node: ">=6.9.0" } + dependencies: + "@babel/compat-data": 7.23.5 + "@babel/helper-validator-option": 7.23.5 + browserslist: 4.22.2 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: false - /@cloudflare/workerd-darwin-arm64@1.20231030.0: + /@babel/helper-create-class-features-plugin@7.23.7(@babel/core@7.23.7): resolution: { - integrity: sha512-WSJJjm11Del4hSneiNB7wTXGtBXI4QMCH9l5qf4iT5PAW8cESGcCmdHtWDWDtGAAGcvmLT04KNvmum92vRKKQQ==, + integrity: sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==, } - engines: { node: ">=16" } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-annotate-as-pure": 7.22.5 + "@babel/helper-environment-visitor": 7.22.20 + "@babel/helper-function-name": 7.23.0 + "@babel/helper-member-expression-to-functions": 7.23.0 + "@babel/helper-optimise-call-expression": 7.22.5 + "@babel/helper-replace-supers": 7.22.20(@babel/core@7.23.7) + "@babel/helper-skip-transparent-expression-wrappers": 7.22.5 + "@babel/helper-split-export-declaration": 7.22.6 + semver: 6.3.1 + dev: false - /@cloudflare/workerd-linux-64@1.20231030.0: + /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.7): resolution: { - integrity: sha512-2HUeRTvoCC17fxE0qdBeR7J9dO8j4A8ZbdcvY8pZxdk+zERU6+N03RTbk/dQMU488PwiDvcC3zZqS4gwLfVT8g==, + integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==, } - engines: { node: ">=16" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-annotate-as-pure": 7.22.5 + regexpu-core: 5.3.2 + semver: 6.3.1 + dev: false - /@cloudflare/workerd-linux-arm64@1.20231030.0: + /@babel/helper-define-polyfill-provider@0.4.4(@babel/core@7.23.7): resolution: { - integrity: sha512-4/GK5zHh+9JbUI6Z5xTCM0ZmpKKHk7vu9thmHjUxtz+o8Ne9DoD7DlDvXQWgMF6XGaTubDWyp3ttn+Qv8jDFuQ==, + integrity: sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==, } - engines: { node: ">=16" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-compilation-targets": 7.23.6 + "@babel/helper-plugin-utils": 7.22.5 + debug: 4.3.4 + lodash.debounce: 4.0.8 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + dev: false - /@cloudflare/workerd-windows-64@1.20231030.0: + /@babel/helper-environment-visitor@7.22.20: resolution: { - integrity: sha512-fb/Jgj8Yqy3PO1jLhk7mTrHMkR8jklpbQFud6rL/aMAn5d6MQbaSrYOCjzkKGp0Zng8D2LIzSl+Fc0C9Sggxjg==, + integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==, } - engines: { node: ">=16" } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true + engines: { node: ">=6.9.0" } + dev: false - /@cloudflare/workers-types@4.20231121.0: + /@babel/helper-function-name@7.23.0: resolution: { - integrity: sha512-+kWfpCkqiepwAKXyHoE0gnkPgkLhz0/9HOBIGhHRsUvUKvhUtm3mbqqoGRWgF1qcjzrDUBbrrOq4MYHfFtc2RA==, + integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==, } + engines: { node: ">=6.9.0" } + dependencies: + "@babel/template": 7.22.15 + "@babel/types": 7.23.6 + dev: false - /@codemirror/autocomplete@6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.2): + /@babel/helper-hoist-variables@7.22.5: resolution: { - integrity: sha512-L5UInv8Ffd6BPw0P3EF7JLYAMeEbclY7+6Q11REt8vhih8RuLreKtPy/xk8wPxs4EQgYqzI7cdgpiYwWlbS/ow==, + integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==, } - peerDependencies: - "@codemirror/language": ^6.0.0 - "@codemirror/state": ^6.0.0 - "@codemirror/view": ^6.0.0 - "@lezer/common": ^1.0.0 + engines: { node: ">=6.9.0" } dependencies: - "@codemirror/language": 6.9.3 - "@codemirror/state": 6.3.3 - "@codemirror/view": 6.22.3 - "@lezer/common": 1.1.2 + "@babel/types": 7.23.6 dev: false - /@codemirror/commands@6.3.2: + /@babel/helper-member-expression-to-functions@7.23.0: resolution: { - integrity: sha512-tjoi4MCWDNxgIpoLZ7+tezdS9OEB6pkiDKhfKx9ReJ/XBcs2G2RXIu+/FxXBlWsPTsz6C9q/r4gjzrsxpcnqCQ==, + integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==, } + engines: { node: ">=6.9.0" } dependencies: - "@codemirror/language": 6.9.3 - "@codemirror/state": 6.3.3 - "@codemirror/view": 6.22.3 - "@lezer/common": 1.1.2 + "@babel/types": 7.23.6 dev: false - /@codemirror/lang-css@6.2.1(@codemirror/view@6.22.3): + /@babel/helper-module-imports@7.22.15: resolution: { - integrity: sha512-/UNWDNV5Viwi/1lpr/dIXJNWiwDxpw13I4pTUAsNxZdg6E0mI2kTQb0P2iHczg1Tu+H4EBgJR+hYhKiHKko7qg==, + integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==, } + engines: { node: ">=6.9.0" } dependencies: - "@codemirror/autocomplete": 6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.2) - "@codemirror/language": 6.9.3 - "@codemirror/state": 6.3.3 - "@lezer/common": 1.1.2 - "@lezer/css": 1.1.4 - transitivePeerDependencies: - - "@codemirror/view" + "@babel/types": 7.23.6 dev: false - /@codemirror/lang-html@6.4.7: + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.7): resolution: { - integrity: sha512-y9hWSSO41XlcL4uYwWyk0lEgTHcelWWfRuqmvcAmxfCs0HNWZdriWo/EU43S63SxEZpc1Hd50Itw7ktfQvfkUg==, + integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==, } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 dependencies: - "@codemirror/autocomplete": 6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.2) - "@codemirror/lang-css": 6.2.1(@codemirror/view@6.22.3) - "@codemirror/lang-javascript": 6.2.1 - "@codemirror/language": 6.9.3 - "@codemirror/state": 6.3.3 - "@codemirror/view": 6.22.3 - "@lezer/common": 1.1.2 - "@lezer/css": 1.1.4 - "@lezer/html": 1.3.7 + "@babel/core": 7.23.7 + "@babel/helper-environment-visitor": 7.22.20 + "@babel/helper-module-imports": 7.22.15 + "@babel/helper-simple-access": 7.22.5 + "@babel/helper-split-export-declaration": 7.22.6 + "@babel/helper-validator-identifier": 7.22.20 dev: false - /@codemirror/lang-java@6.0.1: + /@babel/helper-optimise-call-expression@7.22.5: resolution: { - integrity: sha512-OOnmhH67h97jHzCuFaIEspbmsT98fNdhVhmA3zCxW0cn7l8rChDhZtwiwJ/JOKXgfm4J+ELxQihxaI7bj7mJRg==, + integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==, } + engines: { node: ">=6.9.0" } dependencies: - "@codemirror/language": 6.9.3 - "@lezer/java": 1.1.0 + "@babel/types": 7.23.6 dev: false - /@codemirror/lang-javascript@6.2.1: + /@babel/helper-plugin-utils@7.22.5: resolution: { - integrity: sha512-jlFOXTejVyiQCW3EQwvKH0m99bUYIw40oPmFjSX2VS78yzfe0HELZ+NEo9Yfo1MkGRpGlj3Gnu4rdxV1EnAs5A==, + integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==, } - dependencies: - "@codemirror/autocomplete": 6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.2) - "@codemirror/language": 6.9.3 - "@codemirror/lint": 6.4.2 - "@codemirror/state": 6.3.3 - "@codemirror/view": 6.22.3 - "@lezer/common": 1.1.2 - "@lezer/javascript": 1.4.11 + engines: { node: ">=6.9.0" } dev: false - /@codemirror/lang-json@6.0.1: + /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.7): resolution: { - integrity: sha512-+T1flHdgpqDDlJZ2Lkil/rLiRy684WMLc74xUnjJH48GQdfJo/pudlTRreZmKwzP8/tGdKf83wlbAdOCzlJOGQ==, + integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==, } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 dependencies: - "@codemirror/language": 6.9.3 - "@lezer/json": 1.0.1 + "@babel/core": 7.23.7 + "@babel/helper-annotate-as-pure": 7.22.5 + "@babel/helper-environment-visitor": 7.22.20 + "@babel/helper-wrap-function": 7.22.20 dev: false - /@codemirror/lang-python@6.1.3(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.2): + /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.7): resolution: { - integrity: sha512-S9w2Jl74hFlD5nqtUMIaXAq9t5WlM0acCkyuQWUUSvZclk1sV+UfnpFiZzuZSG+hfEaOmxKR5UxY/Uxswn7EhQ==, + integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==, } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 dependencies: - "@codemirror/autocomplete": 6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.2) - "@codemirror/language": 6.9.3 - "@lezer/python": 1.1.9 - transitivePeerDependencies: - - "@codemirror/state" - - "@codemirror/view" - - "@lezer/common" + "@babel/core": 7.23.7 + "@babel/helper-environment-visitor": 7.22.20 + "@babel/helper-member-expression-to-functions": 7.23.0 + "@babel/helper-optimise-call-expression": 7.22.5 dev: false - /@codemirror/language@6.9.3: + /@babel/helper-simple-access@7.22.5: resolution: { - integrity: sha512-qq48pYzoi6ldYWV/52+Z9Ou6QouVI+8YwvxFbUypI33NbjG2UeRHKENRyhwljTTiOqjQ33FjyZj6EREQ9apAOQ==, + integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==, } + engines: { node: ">=6.9.0" } dependencies: - "@codemirror/state": 6.3.3 - "@codemirror/view": 6.22.3 - "@lezer/common": 1.1.2 - "@lezer/highlight": 1.2.0 - "@lezer/lr": 1.3.14 - style-mod: 4.1.0 + "@babel/types": 7.23.6 dev: false - /@codemirror/legacy-modes@6.3.3: + /@babel/helper-skip-transparent-expression-wrappers@7.22.5: resolution: { - integrity: sha512-X0Z48odJ0KIoh/HY8Ltz75/4tDYc9msQf1E/2trlxFaFFhgjpVHjZ/BCXe1Lk7s4Gd67LL/CeEEHNI+xHOiESg==, + integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==, } + engines: { node: ">=6.9.0" } dependencies: - "@codemirror/language": 6.9.3 + "@babel/types": 7.23.6 dev: false - /@codemirror/lint@6.4.2: + /@babel/helper-split-export-declaration@7.22.6: resolution: { - integrity: sha512-wzRkluWb1ptPKdzlsrbwwjYCPLgzU6N88YBAmlZi8WFyuiEduSd05MnJYNogzyc8rPK7pj6m95ptUApc8sHKVA==, + integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==, } + engines: { node: ">=6.9.0" } dependencies: - "@codemirror/state": 6.3.3 - "@codemirror/view": 6.22.3 - crelt: 1.0.6 + "@babel/types": 7.23.6 dev: false - /@codemirror/search@6.5.5: + /@babel/helper-string-parser@7.23.4: resolution: { - integrity: sha512-PIEN3Ke1buPod2EHbJsoQwlbpkz30qGZKcnmH1eihq9+bPQx8gelauUwLYaY4vBOuBAuEhmpDLii4rj/uO0yMA==, + integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==, } - dependencies: - "@codemirror/state": 6.3.3 - "@codemirror/view": 6.22.3 - crelt: 1.0.6 + engines: { node: ">=6.9.0" } dev: false - /@codemirror/state@6.3.3: + /@babel/helper-validator-identifier@7.22.20: resolution: { - integrity: sha512-0wufKcTw2dEwEaADajjHf6hBy1sh3M6V0e+q4JKIhLuiMSe5td5HOWpUdvKth1fT1M9VYOboajoBHpkCd7PG7A==, + integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==, } + engines: { node: ">=6.9.0" } dev: false - /@codemirror/view@6.22.3: + /@babel/helper-validator-option@7.23.5: resolution: { - integrity: sha512-rqnq+Zospwoi3x1vZ8BGV1MlRsaGljX+6qiGYmIpJ++M+LCC+wjfDaPklhwpWSgv7pr/qx29KiAKQBH5+DOn4w==, + integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==, } - dependencies: - "@codemirror/state": 6.3.3 - style-mod: 4.1.0 - w3c-keyname: 2.2.8 + engines: { node: ">=6.9.0" } dev: false - /@drizzle-team/studio@0.0.35: + /@babel/helper-wrap-function@7.22.20: resolution: { - integrity: sha512-t5LTNOVf+L7Bb/wdssOIPx0ueNvhyaIXdrvKgoHR4wK0GD7SRmILcCTzn6N6Ltr1VnFzQZG/bzn6HMagn17Jtw==, + integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==, } + engines: { node: ">=6.9.0" } dependencies: - superjson: 2.2.1 - dev: true + "@babel/helper-function-name": 7.23.0 + "@babel/template": 7.22.15 + "@babel/types": 7.23.6 + dev: false - /@esbuild-kit/core-utils@3.3.2: + /@babel/helpers@7.23.7: resolution: { - integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==, + integrity: sha512-6AMnjCoC8wjqBzDHkuqpa7jAKwvMo4dC+lr/TFBz+ucfulO1XMpDnwWPGBNwClOKZ8h6xn5N81W/R5OrcKtCbQ==, } + engines: { node: ">=6.9.0" } dependencies: - esbuild: 0.18.20 - source-map-support: 0.5.21 - dev: true + "@babel/template": 7.22.15 + "@babel/traverse": 7.23.7 + "@babel/types": 7.23.6 + transitivePeerDependencies: + - supports-color + dev: false - /@esbuild-kit/esm-loader@2.6.5: + /@babel/highlight@7.23.4: resolution: { - integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==, + integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==, } + engines: { node: ">=6.9.0" } dependencies: - "@esbuild-kit/core-utils": 3.3.2 - get-tsconfig: 4.7.2 - dev: true + "@babel/helper-validator-identifier": 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: false - /@esbuild-plugins/node-globals-polyfill@0.2.3(esbuild@0.17.19): + /@babel/parser@7.23.6: resolution: { - integrity: sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==, + integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==, } - peerDependencies: - esbuild: "*" + engines: { node: ">=6.0.0" } + hasBin: true dependencies: - esbuild: 0.17.19 - dev: true + "@babel/types": 7.23.6 + dev: false - /@esbuild-plugins/node-modules-polyfill@0.2.2(esbuild@0.17.19): + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.23.7): resolution: { - integrity: sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA==, + integrity: sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==, } + engines: { node: ">=6.9.0" } peerDependencies: - esbuild: "*" + "@babel/core": ^7.0.0 dependencies: - esbuild: 0.17.19 - escape-string-regexp: 4.0.0 - rollup-plugin-node-polyfills: 0.2.1 - dev: true + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false - /@esbuild/android-arm64@0.17.19: + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.23.7): resolution: { - integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==, + integrity: sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==, } - engines: { node: ">=12" } - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.13.0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + "@babel/helper-skip-transparent-expression-wrappers": 7.22.5 + "@babel/plugin-transform-optional-chaining": 7.23.4(@babel/core@7.23.7) + dev: false - /@esbuild/android-arm64@0.18.20: + /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.7(@babel/core@7.23.7): resolution: { - integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==, + integrity: sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==, } - engines: { node: ">=12" } - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-environment-visitor": 7.22.20 + "@babel/helper-plugin-utils": 7.22.5 + dev: false - /@esbuild/android-arm64@0.19.8: + /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.23.7): resolution: { - integrity: sha512-B8JbS61bEunhfx8kasogFENgQfr/dIp+ggYXwTqdbMAgGDhRa3AaPpQMuQU0rNxDLECj6FhDzk1cF9WHMVwrtA==, + integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==, } - engines: { node: ">=12" } - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true + engines: { node: ">=6.9.0" } + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead. + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-environment-visitor": 7.22.20 + "@babel/helper-plugin-utils": 7.22.5 + "@babel/helper-remap-async-to-generator": 7.22.20(@babel/core@7.23.7) + "@babel/plugin-syntax-async-generators": 7.8.4(@babel/core@7.23.7) + dev: false - /@esbuild/android-arm@0.17.19: + /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.23.7): + resolution: + { + integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==, + } + engines: { node: ">=6.9.0" } + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-create-class-features-plugin": 7.23.7(@babel/core@7.23.7) + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-proposal-decorators@7.23.7(@babel/core@7.23.7): + resolution: + { + integrity: sha512-b1s5JyeMvqj7d9m9KhJNHKc18gEJiSyVzVX3bwbiPalQBQpuvfPh6lA9F7Kk/dWH0TIiXRpB9yicwijY6buPng==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-create-class-features-plugin": 7.23.7(@babel/core@7.23.7) + "@babel/helper-plugin-utils": 7.22.5 + "@babel/plugin-syntax-decorators": 7.23.3(@babel/core@7.23.7) + dev: false + + /@babel/plugin-proposal-export-default-from@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-Q23MpLZfSGZL1kU7fWqV262q65svLSCIP5kZ/JCW/rKTCm/FrLjpvEd2kfUYMVeHh4QhV/xzyoRAHWrAZJrE3Q==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + "@babel/plugin-syntax-export-default-from": 7.23.3(@babel/core@7.23.7) + dev: false + + /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.23.7): + resolution: + { + integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==, + } + engines: { node: ">=6.9.0" } + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-export-namespace-from instead. + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + "@babel/plugin-syntax-export-namespace-from": 7.8.3(@babel/core@7.23.7) + dev: false + + /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.23.7): + resolution: + { + integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==, + } + engines: { node: ">=6.9.0" } + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead. + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + "@babel/plugin-syntax-nullish-coalescing-operator": 7.8.3(@babel/core@7.23.7) + dev: false + + /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.23.7): + resolution: + { + integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==, + } + engines: { node: ">=6.9.0" } + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead. + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + "@babel/plugin-syntax-numeric-separator": 7.10.4(@babel/core@7.23.7) + dev: false + + /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.23.7): + resolution: + { + integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==, + } + engines: { node: ">=6.9.0" } + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead. + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/compat-data": 7.23.5 + "@babel/core": 7.23.7 + "@babel/helper-compilation-targets": 7.23.6 + "@babel/helper-plugin-utils": 7.22.5 + "@babel/plugin-syntax-object-rest-spread": 7.8.3(@babel/core@7.23.7) + "@babel/plugin-transform-parameters": 7.23.3(@babel/core@7.23.7) + dev: false + + /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.23.7): + resolution: + { + integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==, + } + engines: { node: ">=6.9.0" } + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead. + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + "@babel/plugin-syntax-optional-catch-binding": 7.8.3(@babel/core@7.23.7) + dev: false + + /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.23.7): + resolution: + { + integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==, + } + engines: { node: ">=6.9.0" } + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + "@babel/helper-skip-transparent-expression-wrappers": 7.22.5 + "@babel/plugin-syntax-optional-chaining": 7.8.3(@babel/core@7.23.7) + dev: false + + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.7): + resolution: + { + integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + dev: false + + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.7): + resolution: + { + integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.7): + resolution: + { + integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.7): + resolution: + { + integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-syntax-decorators@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-cf7Niq4/+/juY67E0PbgH0TDhLQ5J7zS8C/Q5FFx+DWyrRa9sUQdTXkjqKu8zGvuqr7vw1muKiukseihU+PJDA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-syntax-export-default-from@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-KeENO5ck1IeZ/l2lFZNy+mpobV3D2Zy5C1YFnWm+YuY5mQiAWc4yAp13dqgguwsBsFVLh4LPCEqCa5qW13N+hw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-syntax-flow@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-syntax-import-attributes@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.7): + resolution: + { + integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.7): + resolution: + { + integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.7): + resolution: + { + integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.7): + resolution: + { + integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.7): + resolution: + { + integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.7): + resolution: + { + integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-create-regexp-features-plugin": 7.22.15(@babel/core@7.23.7) + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-transform-async-generator-functions@7.23.7(@babel/core@7.23.7): + resolution: + { + integrity: sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-environment-visitor": 7.22.20 + "@babel/helper-plugin-utils": 7.22.5 + "@babel/helper-remap-async-to-generator": 7.22.20(@babel/core@7.23.7) + "@babel/plugin-syntax-async-generators": 7.8.4(@babel/core@7.23.7) + dev: false + + /@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-module-imports": 7.22.15 + "@babel/helper-plugin-utils": 7.22.5 + "@babel/helper-remap-async-to-generator": 7.22.20(@babel/core@7.23.7) + dev: false + + /@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.23.7): + resolution: + { + integrity: sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-create-class-features-plugin": 7.23.7(@babel/core@7.23.7) + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-transform-class-static-block@7.23.4(@babel/core@7.23.7): + resolution: + { + integrity: sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.12.0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-create-class-features-plugin": 7.23.7(@babel/core@7.23.7) + "@babel/helper-plugin-utils": 7.22.5 + "@babel/plugin-syntax-class-static-block": 7.14.5(@babel/core@7.23.7) + dev: false + + /@babel/plugin-transform-classes@7.23.5(@babel/core@7.23.7): + resolution: + { + integrity: sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-annotate-as-pure": 7.22.5 + "@babel/helper-compilation-targets": 7.23.6 + "@babel/helper-environment-visitor": 7.22.20 + "@babel/helper-function-name": 7.23.0 + "@babel/helper-optimise-call-expression": 7.22.5 + "@babel/helper-plugin-utils": 7.22.5 + "@babel/helper-replace-supers": 7.22.20(@babel/core@7.23.7) + "@babel/helper-split-export-declaration": 7.22.6 + globals: 11.12.0 + dev: false + + /@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + "@babel/template": 7.22.15 + dev: false + + /@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-create-regexp-features-plugin": 7.22.15(@babel/core@7.23.7) + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-transform-dynamic-import@7.23.4(@babel/core@7.23.7): + resolution: + { + integrity: sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + "@babel/plugin-syntax-dynamic-import": 7.8.3(@babel/core@7.23.7) + dev: false + + /@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-builder-binary-assignment-operator-visitor": 7.22.15 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-transform-export-namespace-from@7.23.4(@babel/core@7.23.7): + resolution: + { + integrity: sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + "@babel/plugin-syntax-export-namespace-from": 7.8.3(@babel/core@7.23.7) + dev: false + + /@babel/plugin-transform-flow-strip-types@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + "@babel/plugin-syntax-flow": 7.23.3(@babel/core@7.23.7) + dev: false + + /@babel/plugin-transform-for-of@7.23.6(@babel/core@7.23.7): + resolution: + { + integrity: sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + "@babel/helper-skip-transparent-expression-wrappers": 7.22.5 + dev: false + + /@babel/plugin-transform-function-name@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-compilation-targets": 7.23.6 + "@babel/helper-function-name": 7.23.0 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-transform-json-strings@7.23.4(@babel/core@7.23.7): + resolution: + { + integrity: sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + "@babel/plugin-syntax-json-strings": 7.8.3(@babel/core@7.23.7) + dev: false + + /@babel/plugin-transform-literals@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-transform-logical-assignment-operators@7.23.4(@babel/core@7.23.7): + resolution: + { + integrity: sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + "@babel/plugin-syntax-logical-assignment-operators": 7.10.4(@babel/core@7.23.7) + dev: false + + /@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-module-transforms": 7.23.3(@babel/core@7.23.7) + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-module-transforms": 7.23.3(@babel/core@7.23.7) + "@babel/helper-plugin-utils": 7.22.5 + "@babel/helper-simple-access": 7.22.5 + dev: false + + /@babel/plugin-transform-modules-systemjs@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-hoist-variables": 7.22.5 + "@babel/helper-module-transforms": 7.23.3(@babel/core@7.23.7) + "@babel/helper-plugin-utils": 7.22.5 + "@babel/helper-validator-identifier": 7.22.20 + dev: false + + /@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-module-transforms": 7.23.3(@babel/core@7.23.7) + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.7): + resolution: + { + integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-create-regexp-features-plugin": 7.22.15(@babel/core@7.23.7) + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-transform-new-target@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-transform-nullish-coalescing-operator@7.23.4(@babel/core@7.23.7): + resolution: + { + integrity: sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + "@babel/plugin-syntax-nullish-coalescing-operator": 7.8.3(@babel/core@7.23.7) + dev: false + + /@babel/plugin-transform-numeric-separator@7.23.4(@babel/core@7.23.7): + resolution: + { + integrity: sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + "@babel/plugin-syntax-numeric-separator": 7.10.4(@babel/core@7.23.7) + dev: false + + /@babel/plugin-transform-object-rest-spread@7.23.4(@babel/core@7.23.7): + resolution: + { + integrity: sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/compat-data": 7.23.5 + "@babel/core": 7.23.7 + "@babel/helper-compilation-targets": 7.23.6 + "@babel/helper-plugin-utils": 7.22.5 + "@babel/plugin-syntax-object-rest-spread": 7.8.3(@babel/core@7.23.7) + "@babel/plugin-transform-parameters": 7.23.3(@babel/core@7.23.7) + dev: false + + /@babel/plugin-transform-object-super@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + "@babel/helper-replace-supers": 7.22.20(@babel/core@7.23.7) + dev: false + + /@babel/plugin-transform-optional-catch-binding@7.23.4(@babel/core@7.23.7): + resolution: + { + integrity: sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + "@babel/plugin-syntax-optional-catch-binding": 7.8.3(@babel/core@7.23.7) + dev: false + + /@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.23.7): + resolution: + { + integrity: sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + "@babel/helper-skip-transparent-expression-wrappers": 7.22.5 + "@babel/plugin-syntax-optional-chaining": 7.8.3(@babel/core@7.23.7) + dev: false + + /@babel/plugin-transform-parameters@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-create-class-features-plugin": 7.23.7(@babel/core@7.23.7) + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-transform-private-property-in-object@7.23.4(@babel/core@7.23.7): + resolution: + { + integrity: sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-annotate-as-pure": 7.22.5 + "@babel/helper-create-class-features-plugin": 7.23.7(@babel/core@7.23.7) + "@babel/helper-plugin-utils": 7.22.5 + "@babel/plugin-syntax-private-property-in-object": 7.14.5(@babel/core@7.23.7) + dev: false + + /@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-transform-react-display-name@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-transform-react-jsx-self@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-transform-react-jsx-source@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.23.7): + resolution: + { + integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-annotate-as-pure": 7.22.5 + "@babel/helper-module-imports": 7.22.15 + "@babel/helper-plugin-utils": 7.22.5 + "@babel/plugin-syntax-jsx": 7.23.3(@babel/core@7.23.7) + "@babel/types": 7.23.6 + dev: false + + /@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + regenerator-transform: 0.15.2 + dev: false + + /@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-transform-runtime@7.23.7(@babel/core@7.23.7): + resolution: + { + integrity: sha512-fa0hnfmiXc9fq/weK34MUV0drz2pOL/vfKWvN7Qw127hiUPabFCUMgAbYWcchRzMJit4o5ARsK/s+5h0249pLw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-module-imports": 7.22.15 + "@babel/helper-plugin-utils": 7.22.5 + babel-plugin-polyfill-corejs2: 0.4.7(@babel/core@7.23.7) + babel-plugin-polyfill-corejs3: 0.8.7(@babel/core@7.23.7) + babel-plugin-polyfill-regenerator: 0.5.4(@babel/core@7.23.7) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-transform-spread@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + "@babel/helper-skip-transparent-expression-wrappers": 7.22.5 + dev: false + + /@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-transform-typescript@7.23.6(@babel/core@7.23.7): + resolution: + { + integrity: sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-annotate-as-pure": 7.22.5 + "@babel/helper-create-class-features-plugin": 7.23.7(@babel/core@7.23.7) + "@babel/helper-plugin-utils": 7.22.5 + "@babel/plugin-syntax-typescript": 7.23.3(@babel/core@7.23.7) + dev: false + + /@babel/plugin-transform-unicode-escapes@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-transform-unicode-property-regex@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-create-regexp-features-plugin": 7.22.15(@babel/core@7.23.7) + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-create-regexp-features-plugin": 7.22.15(@babel/core@7.23.7) + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/plugin-transform-unicode-sets-regex@7.23.3(@babel/core@7.23.7): + resolution: + { + integrity: sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-create-regexp-features-plugin": 7.22.15(@babel/core@7.23.7) + "@babel/helper-plugin-utils": 7.22.5 + dev: false + + /@babel/preset-env@7.23.7(@babel/core@7.23.7): + resolution: + { + integrity: sha512-SY27X/GtTz/L4UryMNJ6p4fH4nsgWbz84y9FE0bQeWJP6O5BhgVCt53CotQKHCOeXJel8VyhlhujhlltKms/CA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + dependencies: + "@babel/compat-data": 7.23.5 + "@babel/core": 7.23.7 + "@babel/helper-compilation-targets": 7.23.6 + "@babel/helper-plugin-utils": 7.22.5 + "@babel/helper-validator-option": 7.23.5 + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": 7.23.7(@babel/core@7.23.7) + "@babel/plugin-proposal-private-property-in-object": 7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.7) + "@babel/plugin-syntax-async-generators": 7.8.4(@babel/core@7.23.7) + "@babel/plugin-syntax-class-properties": 7.12.13(@babel/core@7.23.7) + "@babel/plugin-syntax-class-static-block": 7.14.5(@babel/core@7.23.7) + "@babel/plugin-syntax-dynamic-import": 7.8.3(@babel/core@7.23.7) + "@babel/plugin-syntax-export-namespace-from": 7.8.3(@babel/core@7.23.7) + "@babel/plugin-syntax-import-assertions": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-syntax-import-attributes": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-syntax-import-meta": 7.10.4(@babel/core@7.23.7) + "@babel/plugin-syntax-json-strings": 7.8.3(@babel/core@7.23.7) + "@babel/plugin-syntax-logical-assignment-operators": 7.10.4(@babel/core@7.23.7) + "@babel/plugin-syntax-nullish-coalescing-operator": 7.8.3(@babel/core@7.23.7) + "@babel/plugin-syntax-numeric-separator": 7.10.4(@babel/core@7.23.7) + "@babel/plugin-syntax-object-rest-spread": 7.8.3(@babel/core@7.23.7) + "@babel/plugin-syntax-optional-catch-binding": 7.8.3(@babel/core@7.23.7) + "@babel/plugin-syntax-optional-chaining": 7.8.3(@babel/core@7.23.7) + "@babel/plugin-syntax-private-property-in-object": 7.14.5(@babel/core@7.23.7) + "@babel/plugin-syntax-top-level-await": 7.14.5(@babel/core@7.23.7) + "@babel/plugin-syntax-unicode-sets-regex": 7.18.6(@babel/core@7.23.7) + "@babel/plugin-transform-arrow-functions": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-async-generator-functions": 7.23.7(@babel/core@7.23.7) + "@babel/plugin-transform-async-to-generator": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-block-scoped-functions": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-block-scoping": 7.23.4(@babel/core@7.23.7) + "@babel/plugin-transform-class-properties": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-class-static-block": 7.23.4(@babel/core@7.23.7) + "@babel/plugin-transform-classes": 7.23.5(@babel/core@7.23.7) + "@babel/plugin-transform-computed-properties": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-destructuring": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-dotall-regex": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-duplicate-keys": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-dynamic-import": 7.23.4(@babel/core@7.23.7) + "@babel/plugin-transform-exponentiation-operator": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-export-namespace-from": 7.23.4(@babel/core@7.23.7) + "@babel/plugin-transform-for-of": 7.23.6(@babel/core@7.23.7) + "@babel/plugin-transform-function-name": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-json-strings": 7.23.4(@babel/core@7.23.7) + "@babel/plugin-transform-literals": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-logical-assignment-operators": 7.23.4(@babel/core@7.23.7) + "@babel/plugin-transform-member-expression-literals": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-modules-amd": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-modules-commonjs": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-modules-systemjs": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-modules-umd": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-named-capturing-groups-regex": 7.22.5(@babel/core@7.23.7) + "@babel/plugin-transform-new-target": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-nullish-coalescing-operator": 7.23.4(@babel/core@7.23.7) + "@babel/plugin-transform-numeric-separator": 7.23.4(@babel/core@7.23.7) + "@babel/plugin-transform-object-rest-spread": 7.23.4(@babel/core@7.23.7) + "@babel/plugin-transform-object-super": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-optional-catch-binding": 7.23.4(@babel/core@7.23.7) + "@babel/plugin-transform-optional-chaining": 7.23.4(@babel/core@7.23.7) + "@babel/plugin-transform-parameters": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-private-methods": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-private-property-in-object": 7.23.4(@babel/core@7.23.7) + "@babel/plugin-transform-property-literals": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-regenerator": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-reserved-words": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-shorthand-properties": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-spread": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-sticky-regex": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-template-literals": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-typeof-symbol": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-unicode-escapes": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-unicode-property-regex": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-unicode-regex": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-unicode-sets-regex": 7.23.3(@babel/core@7.23.7) + "@babel/preset-modules": 0.1.6-no-external-plugins(@babel/core@7.23.7) + babel-plugin-polyfill-corejs2: 0.4.7(@babel/core@7.23.7) + babel-plugin-polyfill-corejs3: 0.8.7(@babel/core@7.23.7) + babel-plugin-polyfill-regenerator: 0.5.4(@babel/core@7.23.7) + core-js-compat: 3.35.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.7): + resolution: + { + integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 || ^8.0.0-0 <8.0.0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-plugin-utils": 7.22.5 + "@babel/types": 7.23.6 + esutils: 2.0.3 + dev: false + + /@babel/regjsgen@0.8.0: + resolution: + { + integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==, + } + dev: false + + /@babel/runtime@7.23.7: + resolution: + { + integrity: sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA==, + } + engines: { node: ">=6.9.0" } + dependencies: + regenerator-runtime: 0.14.1 + dev: false + + /@babel/template@7.22.15: + resolution: + { + integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==, + } + engines: { node: ">=6.9.0" } + dependencies: + "@babel/code-frame": 7.23.5 + "@babel/parser": 7.23.6 + "@babel/types": 7.23.6 + dev: false + + /@babel/traverse@7.23.7: + resolution: + { + integrity: sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==, + } + engines: { node: ">=6.9.0" } + dependencies: + "@babel/code-frame": 7.23.5 + "@babel/generator": 7.23.6 + "@babel/helper-environment-visitor": 7.22.20 + "@babel/helper-function-name": 7.23.0 + "@babel/helper-hoist-variables": 7.22.5 + "@babel/helper-split-export-declaration": 7.22.6 + "@babel/parser": 7.23.6 + "@babel/types": 7.23.6 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/types@7.23.6: + resolution: + { + integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==, + } + engines: { node: ">=6.9.0" } + dependencies: + "@babel/helper-string-parser": 7.23.4 + "@babel/helper-validator-identifier": 7.22.20 + to-fast-properties: 2.0.0 + dev: false + + /@cloudflare/kv-asset-handler@0.2.0: + resolution: + { + integrity: sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==, + } + dependencies: + mime: 3.0.0 + dev: true + + /@cloudflare/workerd-darwin-64@1.20231030.0: + resolution: + { + integrity: sha512-J4PQ9utPxLya9yHdMMx3AZeC5M/6FxcoYw6jo9jbDDFTy+a4Gslqf4Im9We3aeOEdPXa3tgQHVQOSelJSZLhIw==, + } + engines: { node: ">=16" } + cpu: [x64] + os: [darwin] + requiresBuild: true + 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 + + /@cloudflare/workers-types@4.20231218.0: + resolution: + { + integrity: sha512-Vs1FKjfUjXYGbCsXzkl+ITp0Iyb6QiW6+vTERTNThC+v96T0IvPVAioH4tT20rXwoxAfxh380mAaxYtTrJUNVg==, + } + + /@codemirror/autocomplete@6.11.1(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0): + resolution: + { + integrity: sha512-L5UInv8Ffd6BPw0P3EF7JLYAMeEbclY7+6Q11REt8vhih8RuLreKtPy/xk8wPxs4EQgYqzI7cdgpiYwWlbS/ow==, + } + peerDependencies: + "@codemirror/language": ^6.0.0 + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.0.0 + "@lezer/common": ^1.0.0 + dependencies: + "@codemirror/language": 6.10.0 + "@codemirror/state": 6.4.0 + "@codemirror/view": 6.23.0 + "@lezer/common": 1.2.0 + dev: false + + /@codemirror/commands@6.3.3: + resolution: + { + integrity: sha512-dO4hcF0fGT9tu1Pj1D2PvGvxjeGkbC6RGcZw6Qs74TH+Ed1gw98jmUgd2axWvIZEqTeTuFrg1lEB1KV6cK9h1A==, + } + dependencies: + "@codemirror/language": 6.10.0 + "@codemirror/state": 6.4.0 + "@codemirror/view": 6.23.0 + "@lezer/common": 1.2.0 + dev: false + + /@codemirror/lang-css@6.2.1(@codemirror/view@6.23.0): + resolution: + { + integrity: sha512-/UNWDNV5Viwi/1lpr/dIXJNWiwDxpw13I4pTUAsNxZdg6E0mI2kTQb0P2iHczg1Tu+H4EBgJR+hYhKiHKko7qg==, + } + dependencies: + "@codemirror/autocomplete": 6.11.1(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0) + "@codemirror/language": 6.10.0 + "@codemirror/state": 6.4.0 + "@lezer/common": 1.2.0 + "@lezer/css": 1.1.5 + transitivePeerDependencies: + - "@codemirror/view" + dev: false + + /@codemirror/lang-html@6.4.7: + resolution: + { + integrity: sha512-y9hWSSO41XlcL4uYwWyk0lEgTHcelWWfRuqmvcAmxfCs0HNWZdriWo/EU43S63SxEZpc1Hd50Itw7ktfQvfkUg==, + } + dependencies: + "@codemirror/autocomplete": 6.11.1(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0) + "@codemirror/lang-css": 6.2.1(@codemirror/view@6.23.0) + "@codemirror/lang-javascript": 6.2.1 + "@codemirror/language": 6.10.0 + "@codemirror/state": 6.4.0 + "@codemirror/view": 6.23.0 + "@lezer/common": 1.2.0 + "@lezer/css": 1.1.5 + "@lezer/html": 1.3.8 + dev: false + + /@codemirror/lang-java@6.0.1: + resolution: + { + integrity: sha512-OOnmhH67h97jHzCuFaIEspbmsT98fNdhVhmA3zCxW0cn7l8rChDhZtwiwJ/JOKXgfm4J+ELxQihxaI7bj7mJRg==, + } + dependencies: + "@codemirror/language": 6.10.0 + "@lezer/java": 1.1.1 + dev: false + + /@codemirror/lang-javascript@6.2.1: + resolution: + { + integrity: sha512-jlFOXTejVyiQCW3EQwvKH0m99bUYIw40oPmFjSX2VS78yzfe0HELZ+NEo9Yfo1MkGRpGlj3Gnu4rdxV1EnAs5A==, + } + dependencies: + "@codemirror/autocomplete": 6.11.1(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0) + "@codemirror/language": 6.10.0 + "@codemirror/lint": 6.4.2 + "@codemirror/state": 6.4.0 + "@codemirror/view": 6.23.0 + "@lezer/common": 1.2.0 + "@lezer/javascript": 1.4.11 + dev: false + + /@codemirror/lang-json@6.0.1: + resolution: + { + integrity: sha512-+T1flHdgpqDDlJZ2Lkil/rLiRy684WMLc74xUnjJH48GQdfJo/pudlTRreZmKwzP8/tGdKf83wlbAdOCzlJOGQ==, + } + dependencies: + "@codemirror/language": 6.10.0 + "@lezer/json": 1.0.2 + dev: false + + /@codemirror/lang-python@6.1.3(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0): + resolution: + { + integrity: sha512-S9w2Jl74hFlD5nqtUMIaXAq9t5WlM0acCkyuQWUUSvZclk1sV+UfnpFiZzuZSG+hfEaOmxKR5UxY/Uxswn7EhQ==, + } + dependencies: + "@codemirror/autocomplete": 6.11.1(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0) + "@codemirror/language": 6.10.0 + "@lezer/python": 1.1.10 + transitivePeerDependencies: + - "@codemirror/state" + - "@codemirror/view" + - "@lezer/common" + dev: false + + /@codemirror/language@6.10.0: + resolution: + { + integrity: sha512-2vaNn9aPGCRFKWcHPFksctzJ8yS5p7YoaT+jHpc0UGKzNuAIx4qy6R5wiqbP+heEEdyaABA582mNqSHzSoYdmg==, + } + dependencies: + "@codemirror/state": 6.4.0 + "@codemirror/view": 6.23.0 + "@lezer/common": 1.2.0 + "@lezer/highlight": 1.2.0 + "@lezer/lr": 1.3.14 + style-mod: 4.1.0 + dev: false + + /@codemirror/legacy-modes@6.3.3: + resolution: + { + integrity: sha512-X0Z48odJ0KIoh/HY8Ltz75/4tDYc9msQf1E/2trlxFaFFhgjpVHjZ/BCXe1Lk7s4Gd67LL/CeEEHNI+xHOiESg==, + } + dependencies: + "@codemirror/language": 6.10.0 + dev: false + + /@codemirror/lint@6.4.2: + resolution: + { + integrity: sha512-wzRkluWb1ptPKdzlsrbwwjYCPLgzU6N88YBAmlZi8WFyuiEduSd05MnJYNogzyc8rPK7pj6m95ptUApc8sHKVA==, + } + dependencies: + "@codemirror/state": 6.4.0 + "@codemirror/view": 6.23.0 + crelt: 1.0.6 + dev: false + + /@codemirror/search@6.5.5: + resolution: + { + integrity: sha512-PIEN3Ke1buPod2EHbJsoQwlbpkz30qGZKcnmH1eihq9+bPQx8gelauUwLYaY4vBOuBAuEhmpDLii4rj/uO0yMA==, + } + dependencies: + "@codemirror/state": 6.4.0 + "@codemirror/view": 6.23.0 + crelt: 1.0.6 + dev: false + + /@codemirror/state@6.4.0: + resolution: + { + integrity: sha512-hm8XshYj5Fo30Bb922QX9hXB/bxOAVH+qaqHBzw5TKa72vOeslyGwd4X8M0c1dJ9JqxlaMceOQ8RsL9tC7gU0A==, + } + dev: false + + /@codemirror/view@6.23.0: + resolution: + { + integrity: sha512-/51px9N4uW8NpuWkyUX+iam5+PM6io2fm+QmRnzwqBy5v/pwGg9T0kILFtYeum8hjuvENtgsGNKluOfqIICmeQ==, + } + dependencies: + "@codemirror/state": 6.4.0 + style-mod: 4.1.0 + w3c-keyname: 2.2.8 + 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 + + /@drizzle-team/studio@0.0.37: + resolution: + { + integrity: sha512-LZyAPGJBX43jsrVZh7+w1Jig/BC6PJx63ReHUYK+GRQYNY9UJNlPXmn1uC/LMRX+A7JwYM4Sr4Fg/hnJSqlfgA==, + } + dependencies: + superjson: 2.2.1 + 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/aix-ppc64@0.19.11: + resolution: + { + integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==, + } + engines: { node: ">=12" } + cpu: [ppc64] + os: [aix] + 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-arm64@0.19.11: + resolution: + { + integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.17.19: resolution: { integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==, @@ -584,10 +2390,10 @@ packages: dev: true optional: true - /@esbuild/android-arm@0.19.8: + /@esbuild/android-arm@0.19.11: resolution: { - integrity: sha512-31E2lxlGM1KEfivQl8Yf5aYU/mflz9g06H6S15ITUFQueMFtFjESRMoDSkvMo8thYvLBax+VKTPlpnx+sPicOA==, + integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==, } engines: { node: ">=12" } cpu: [arm] @@ -620,10 +2426,10 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.19.8: + /@esbuild/android-x64@0.19.11: resolution: { - integrity: sha512-rdqqYfRIn4jWOp+lzQttYMa2Xar3OK9Yt2fhOhzFXqg0rVWEfSclJvZq5fZslnz6ypHvVf3CT7qyf0A5pM682A==, + integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==, } engines: { node: ">=12" } cpu: [x64] @@ -656,10 +2462,10 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.19.8: + /@esbuild/darwin-arm64@0.19.11: resolution: { - integrity: sha512-RQw9DemMbIq35Bprbboyf8SmOr4UXsRVxJ97LgB55VKKeJOOdvsIPy0nFyF2l8U+h4PtBx/1kRf0BelOYCiQcw==, + integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==, } engines: { node: ">=12" } cpu: [arm64] @@ -692,10 +2498,10 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.19.8: + /@esbuild/darwin-x64@0.19.11: resolution: { - integrity: sha512-3sur80OT9YdeZwIVgERAysAbwncom7b4bCI2XKLjMfPymTud7e/oY4y+ci1XVp5TfQp/bppn7xLw1n/oSQY3/Q==, + integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==, } engines: { node: ">=12" } cpu: [x64] @@ -728,10 +2534,10 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.19.8: + /@esbuild/freebsd-arm64@0.19.11: resolution: { - integrity: sha512-WAnPJSDattvS/XtPCTj1tPoTxERjcTpH6HsMr6ujTT+X6rylVe8ggxk8pVxzf5U1wh5sPODpawNicF5ta/9Tmw==, + integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==, } engines: { node: ">=12" } cpu: [arm64] @@ -764,10 +2570,10 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.19.8: + /@esbuild/freebsd-x64@0.19.11: resolution: { - integrity: sha512-ICvZyOplIjmmhjd6mxi+zxSdpPTKFfyPPQMQTK/w+8eNK6WV01AjIztJALDtwNNfFhfZLux0tZLC+U9nSyA5Zg==, + integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==, } engines: { node: ">=12" } cpu: [x64] @@ -800,10 +2606,10 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.19.8: + /@esbuild/linux-arm64@0.19.11: resolution: { - integrity: sha512-z1zMZivxDLHWnyGOctT9JP70h0beY54xDDDJt4VpTX+iwA77IFsE1vCXWmprajJGa+ZYSqkSbRQ4eyLCpCmiCQ==, + integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==, } engines: { node: ">=12" } cpu: [arm64] @@ -836,10 +2642,10 @@ packages: dev: true optional: true - /@esbuild/linux-arm@0.19.8: + /@esbuild/linux-arm@0.19.11: resolution: { - integrity: sha512-H4vmI5PYqSvosPaTJuEppU9oz1dq2A7Mr2vyg5TF9Ga+3+MGgBdGzcyBP7qK9MrwFQZlvNyJrvz6GuCaj3OukQ==, + integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==, } engines: { node: ">=12" } cpu: [arm] @@ -872,10 +2678,10 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.19.8: + /@esbuild/linux-ia32@0.19.11: resolution: { - integrity: sha512-1a8suQiFJmZz1khm/rDglOc8lavtzEMRo0v6WhPgxkrjcU0LkHj+TwBrALwoz/OtMExvsqbbMI0ChyelKabSvQ==, + integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==, } engines: { node: ">=12" } cpu: [ia32] @@ -908,10 +2714,10 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.19.8: + /@esbuild/linux-loong64@0.19.11: resolution: { - integrity: sha512-fHZWS2JJxnXt1uYJsDv9+b60WCc2RlvVAy1F76qOLtXRO+H4mjt3Tr6MJ5l7Q78X8KgCFudnTuiQRBhULUyBKQ==, + integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==, } engines: { node: ">=12" } cpu: [loong64] @@ -944,10 +2750,10 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.19.8: + /@esbuild/linux-mips64el@0.19.11: resolution: { - integrity: sha512-Wy/z0EL5qZYLX66dVnEg9riiwls5IYnziwuju2oUiuxVc+/edvqXa04qNtbrs0Ukatg5HEzqT94Zs7J207dN5Q==, + integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==, } engines: { node: ">=12" } cpu: [mips64el] @@ -980,10 +2786,10 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.19.8: + /@esbuild/linux-ppc64@0.19.11: resolution: { - integrity: sha512-ETaW6245wK23YIEufhMQ3HSeHO7NgsLx8gygBVldRHKhOlD1oNeNy/P67mIh1zPn2Hr2HLieQrt6tWrVwuqrxg==, + integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==, } engines: { node: ">=12" } cpu: [ppc64] @@ -1016,10 +2822,10 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.19.8: + /@esbuild/linux-riscv64@0.19.11: resolution: { - integrity: sha512-T2DRQk55SgoleTP+DtPlMrxi/5r9AeFgkhkZ/B0ap99zmxtxdOixOMI570VjdRCs9pE4Wdkz7JYrsPvsl7eESg==, + integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==, } engines: { node: ">=12" } cpu: [riscv64] @@ -1052,10 +2858,10 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.19.8: + /@esbuild/linux-s390x@0.19.11: resolution: { - integrity: sha512-NPxbdmmo3Bk7mbNeHmcCd7R7fptJaczPYBaELk6NcXxy7HLNyWwCyDJ/Xx+/YcNH7Im5dHdx9gZ5xIwyliQCbg==, + integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==, } engines: { node: ">=12" } cpu: [s390x] @@ -1088,10 +2894,10 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.19.8: + /@esbuild/linux-x64@0.19.11: resolution: { - integrity: sha512-lytMAVOM3b1gPypL2TRmZ5rnXl7+6IIk8uB3eLsV1JwcizuolblXRrc5ShPrO9ls/b+RTp+E6gbsuLWHWi2zGg==, + integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==, } engines: { node: ">=12" } cpu: [x64] @@ -1124,10 +2930,10 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.19.8: + /@esbuild/netbsd-x64@0.19.11: resolution: { - integrity: sha512-hvWVo2VsXz/8NVt1UhLzxwAfo5sioj92uo0bCfLibB0xlOmimU/DeAEsQILlBQvkhrGjamP0/el5HU76HAitGw==, + integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==, } engines: { node: ">=12" } cpu: [x64] @@ -1160,10 +2966,10 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.19.8: + /@esbuild/openbsd-x64@0.19.11: resolution: { - integrity: sha512-/7Y7u77rdvmGTxR83PgaSvSBJCC2L3Kb1M/+dmSIvRvQPXXCuC97QAwMugBNG0yGcbEGfFBH7ojPzAOxfGNkwQ==, + integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==, } engines: { node: ">=12" } cpu: [x64] @@ -1196,10 +3002,10 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.19.8: + /@esbuild/sunos-x64@0.19.11: resolution: { - integrity: sha512-9Lc4s7Oi98GqFA4HzA/W2JHIYfnXbUYgekUP/Sm4BG9sfLjyv6GKKHKKVs83SMicBF2JwAX6A1PuOLMqpD001w==, + integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==, } engines: { node: ">=12" } cpu: [x64] @@ -1232,10 +3038,10 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.19.8: + /@esbuild/win32-arm64@0.19.11: resolution: { - integrity: sha512-rq6WzBGjSzihI9deW3fC2Gqiak68+b7qo5/3kmB6Gvbh/NYPA0sJhrnp7wgV4bNwjqM+R2AApXGxMO7ZoGhIJg==, + integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==, } engines: { node: ">=12" } cpu: [arm64] @@ -1268,98 +3074,503 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.19.8: + /@esbuild/win32-ia32@0.19.11: + resolution: + { + integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==, + } + 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 + + /@esbuild/win32-x64@0.19.11: + resolution: + { + integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): + resolution: + { + integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.56.0 + eslint-visitor-keys: 3.4.3 + + /@eslint-community/regexpp@4.10.0: + resolution: + { + integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==, + } + engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } + + /@eslint/eslintrc@2.1.4: + resolution: + { + integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.0 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + /@eslint/js@8.56.0: + resolution: + { + integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + + /@expo/bunyan@4.0.0: + resolution: + { + integrity: sha512-Ydf4LidRB/EBI+YrB+cVLqIseiRfjUI/AeHBgjGMtq3GroraDu81OV7zqophRgupngoL3iS3JUMDMnxO7g39qA==, + } + engines: { "0": node >=0.10.0 } + dependencies: + uuid: 8.3.2 + optionalDependencies: + mv: 2.1.1 + safe-json-stringify: 1.2.0 + dev: false + + /@expo/cli@0.10.16(expo-modules-autolinking@1.5.1): + resolution: + { + integrity: sha512-EwgnRN5AMElg0JJjFLJTPk5hYkVXxnNMLIvZBiTfGoCq+rDw6u7Mg5l2Bbm/geSHOoplaHyPZ/Wr23FAuZWehA==, + } + hasBin: true + dependencies: + "@babel/runtime": 7.23.7 + "@expo/code-signing-certificates": 0.0.5 + "@expo/config": 8.1.2 + "@expo/config-plugins": 7.2.5 + "@expo/dev-server": 0.5.5 + "@expo/devcert": 1.1.0 + "@expo/env": 0.0.5 + "@expo/json-file": 8.2.37 + "@expo/metro-config": 0.10.7 + "@expo/osascript": 2.0.33 + "@expo/package-manager": 1.1.2 + "@expo/plist": 0.0.20 + "@expo/prebuild-config": 6.2.6(expo-modules-autolinking@1.5.1) + "@expo/rudder-sdk-node": 1.1.1 + "@expo/spawn-async": 1.5.0 + "@expo/xcpretty": 4.3.0 + "@urql/core": 2.3.6(graphql@15.8.0) + "@urql/exchange-retry": 0.3.0(graphql@15.8.0) + accepts: 1.3.8 + arg: 4.1.0 + better-opn: 3.0.2 + bplist-parser: 0.3.2 + cacache: 15.3.0 + chalk: 4.1.2 + ci-info: 3.9.0 + debug: 4.3.4 + env-editor: 0.4.2 + form-data: 3.0.1 + freeport-async: 2.0.0 + fs-extra: 8.1.0 + getenv: 1.0.0 + graphql: 15.8.0 + graphql-tag: 2.12.6(graphql@15.8.0) + https-proxy-agent: 5.0.1 + internal-ip: 4.3.0 + js-yaml: 3.14.1 + json-schema-deref-sync: 0.13.0 + md5-file: 3.2.3 + md5hex: 1.0.0 + minipass: 3.1.6 + node-fetch: 2.7.0 + node-forge: 1.3.1 + npm-package-arg: 7.0.0 + ora: 3.4.0 + pretty-bytes: 5.6.0 + progress: 2.0.3 + prompts: 2.4.2 + qrcode-terminal: 0.11.0 + require-from-string: 2.0.2 + requireg: 0.2.2 + resolve-from: 5.0.0 + semver: 7.5.4 + send: 0.18.0 + slugify: 1.6.6 + structured-headers: 0.4.1 + tar: 6.2.0 + tempy: 0.7.1 + terminal-link: 2.1.1 + text-table: 0.2.0 + url-join: 4.0.0 + wrap-ansi: 7.0.0 + ws: 8.16.0 + transitivePeerDependencies: + - bluebird + - bufferutil + - encoding + - expo-modules-autolinking + - supports-color + - utf-8-validate + dev: false + + /@expo/code-signing-certificates@0.0.5: + resolution: + { + integrity: sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw==, + } + dependencies: + node-forge: 1.3.1 + nullthrows: 1.1.1 + dev: false + + /@expo/config-plugins@7.2.5: + resolution: + { + integrity: sha512-w+5ccu1IxBHgyQk9CPFKLZOk8yZQEyTjbJwOzESK1eR7QwosbcsLkN1c1WWUZYiCXwORu3UTwJYll4+X2xxJhQ==, + } + dependencies: + "@expo/config-types": 49.0.0 + "@expo/json-file": 8.2.37 + "@expo/plist": 0.0.20 + "@expo/sdk-runtime-versions": 1.0.0 + "@react-native/normalize-color": 2.1.0 + chalk: 4.1.2 + debug: 4.3.4 + find-up: 5.0.0 + getenv: 1.0.0 + glob: 7.1.6 + resolve-from: 5.0.0 + semver: 7.5.4 + slash: 3.0.0 + xcode: 3.0.1 + xml2js: 0.6.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@expo/config-types@49.0.0: + resolution: + { + integrity: sha512-8eyREVi+K2acnMBe/rTIu1dOfyR2+AMnTLHlut+YpMV9OZPdeKV0Bs9BxAewGqBA2slslbQ9N39IS2CuTKpXkA==, + } + dev: false + + /@expo/config@8.1.2: + resolution: + { + integrity: sha512-4e7hzPj50mQIlsrzOH6XZ36O094mPfPTIDIH4yv49bWNMc7GFLTofB/lcT+QyxiLaJuC0Wlk9yOLB8DIqmtwug==, + } + dependencies: + "@babel/code-frame": 7.10.4 + "@expo/config-plugins": 7.2.5 + "@expo/config-types": 49.0.0 + "@expo/json-file": 8.2.37 + getenv: 1.0.0 + glob: 7.1.6 + require-from-string: 2.0.2 + resolve-from: 5.0.0 + semver: 7.5.3 + slugify: 1.6.6 + sucrase: 3.35.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@expo/dev-server@0.5.5: + resolution: + { + integrity: sha512-t0fT8xH1exwYsH5hh7bAt85VF+gXxg24qrbny2rR/iKoPTWFCd2JNQV8pvfLg51hvrywQ3YCBuT3lU1w7aZxFA==, + } + dependencies: + "@expo/bunyan": 4.0.0 + "@expo/metro-config": 0.10.7 + "@expo/osascript": 2.0.33 + "@expo/spawn-async": 1.5.0 + body-parser: 1.20.2 + chalk: 4.1.2 + connect: 3.7.0 + fs-extra: 9.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + node-fetch: 2.7.0 + open: 8.4.2 + resolve-from: 5.0.0 + serialize-error: 6.0.0 + temp-dir: 2.0.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@expo/devcert@1.1.0: + resolution: + { + integrity: sha512-ghUVhNJQOCTdQckSGTHctNp/0jzvVoMMkVh+6SHn+TZj8sU15U/npXIDt8NtQp0HedlPaCgkVdMu8Sacne0aEA==, + } + dependencies: + application-config-path: 0.1.1 + command-exists: 1.2.9 + debug: 3.2.7 + eol: 0.9.1 + get-port: 3.2.0 + glob: 7.2.3 + lodash: 4.17.21 + mkdirp: 0.5.6 + password-prompt: 1.1.3 + rimraf: 2.7.1 + sudo-prompt: 8.2.5 + tmp: 0.0.33 + tslib: 2.6.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@expo/env@0.0.5: + resolution: + { + integrity: sha512-UXuKAqyXfhMQC3gP0OyjXmFX08Z1fkVWiGBN7bYzfoX8LHatjeHrDtI6w5nDvd8XPxPvmqaZoEDw1lW3+dz3oQ==, + } + dependencies: + chalk: 4.1.2 + debug: 4.3.4 + dotenv: 16.0.3 + dotenv-expand: 10.0.0 + getenv: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@expo/image-utils@0.3.22: + resolution: + { + integrity: sha512-uzq+RERAtkWypOFOLssFnXXqEqKjNj9eXN7e97d/EXUAojNcLDoXc0sL+F5B1I4qtlsnhX01kcpoIBBZD8wZNQ==, + } + dependencies: + "@expo/spawn-async": 1.5.0 + chalk: 4.1.2 + fs-extra: 9.0.0 + getenv: 1.0.0 + jimp-compact: 0.16.1 + mime: 2.6.0 + node-fetch: 2.7.0 + parse-png: 2.1.0 + resolve-from: 5.0.0 + semver: 7.3.2 + tempy: 0.3.0 + transitivePeerDependencies: + - encoding + dev: false + + /@expo/json-file@8.2.37: + resolution: + { + integrity: sha512-YaH6rVg11JoTS2P6LsW7ybS2CULjf40AbnAHw2F1eDPuheprNjARZMnyHFPkKv7GuxCy+B9GPcbOKgc4cgA80Q==, + } + dependencies: + "@babel/code-frame": 7.10.4 + json5: 2.2.3 + write-file-atomic: 2.4.3 + dev: false + + /@expo/metro-config@0.10.7: + resolution: + { + integrity: sha512-uACymEiyX0447hI4unt+2cemLQkTZXKvTev936NhtsgVnql45EP0V0pzmo/0H0WlHaAGXgvOBZJl8wFqcJ3CbQ==, + } + dependencies: + "@expo/config": 8.1.2 + "@expo/env": 0.0.5 + "@expo/json-file": 8.2.37 + chalk: 4.1.2 + debug: 4.3.4 + find-yarn-workspace-root: 2.0.0 + getenv: 1.0.0 + jsc-safe-url: 0.2.4 + lightningcss: 1.19.0 + postcss: 8.4.32 + resolve-from: 5.0.0 + sucrase: 3.35.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@expo/osascript@2.0.33: + resolution: + { + integrity: sha512-FQinlwHrTlJbntp8a7NAlCKedVXe06Va/0DSLXRO8lZVtgbEMrYYSUZWQNcOlNtc58c2elNph6z9dMOYwSo3JQ==, + } + engines: { node: ">=12" } + dependencies: + "@expo/spawn-async": 1.5.0 + exec-async: 2.2.0 + dev: false + + /@expo/package-manager@1.1.2: + resolution: + { + integrity: sha512-JI9XzrxB0QVXysyuJ996FPCJGDCYRkbUvgG4QmMTTMFA1T+mv8YzazC3T9C1pHQUAAveVCre1+Pqv0nZXN24Xg==, + } + dependencies: + "@expo/json-file": 8.2.37 + "@expo/spawn-async": 1.5.0 + ansi-regex: 5.0.1 + chalk: 4.1.2 + find-up: 5.0.0 + find-yarn-workspace-root: 2.0.0 + js-yaml: 3.14.1 + micromatch: 4.0.5 + npm-package-arg: 7.0.0 + split: 1.0.1 + sudo-prompt: 9.1.1 + dev: false + + /@expo/plist@0.0.20: resolution: { - integrity: sha512-AIAbverbg5jMvJznYiGhrd3sumfwWs8572mIJL5NQjJa06P8KfCPWZQ0NwZbPQnbQi9OWSZhFVSUWjjIrn4hSw==, + integrity: sha512-UXQ4LXCfTZ580LDHGJ5q62jSTwJFFJ1GqBu8duQMThiHKWbMJ+gajJh6rsB6EJ3aLUr9wcauxneL5LVRFxwBEA==, } - engines: { node: ">=12" } - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true + dependencies: + "@xmldom/xmldom": 0.7.13 + base64-js: 1.5.1 + xmlbuilder: 14.0.0 + dev: false - /@esbuild/win32-x64@0.17.19: + /@expo/prebuild-config@6.2.6(expo-modules-autolinking@1.5.1): resolution: { - integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==, + integrity: sha512-uFVvDAm9dPg9p1qpnr4CVnpo2hmkZIL5FQz+VlIdXXJpe7ySh/qTGHtKWY/lWUshQkAJ0nwbKGPztGWdABns/Q==, } - engines: { node: ">=12" } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true + peerDependencies: + expo-modules-autolinking: ">=0.8.1" + dependencies: + "@expo/config": 8.1.2 + "@expo/config-plugins": 7.2.5 + "@expo/config-types": 49.0.0 + "@expo/image-utils": 0.3.22 + "@expo/json-file": 8.2.37 + debug: 4.3.4 + expo-modules-autolinking: 1.5.1 + fs-extra: 9.1.0 + resolve-from: 5.0.0 + semver: 7.5.3 + xml2js: 0.6.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false - /@esbuild/win32-x64@0.18.20: + /@expo/rudder-sdk-node@1.1.1: resolution: { - integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==, + integrity: sha512-uy/hS/awclDJ1S88w9UGpc6Nm9XnNUjzOAAib1A3PVAnGQIwebg8DpFqOthFBTlZxeuV/BKbZ5jmTbtNZkp1WQ==, } engines: { node: ">=12" } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true + dependencies: + "@expo/bunyan": 4.0.0 + "@segment/loosely-validate-event": 2.0.0 + fetch-retry: 4.1.1 + md5: 2.3.0 + node-fetch: 2.7.0 + remove-trailing-slash: 0.1.1 + uuid: 8.3.2 + transitivePeerDependencies: + - encoding + dev: false - /@esbuild/win32-x64@0.19.8: + /@expo/sdk-runtime-versions@1.0.0: resolution: { - integrity: sha512-bfZ0cQ1uZs2PqpulNL5j/3w+GDhP36k1K5c38QdQg+Swy51jFZWWeIkteNsufkQxp986wnqRRsb/bHbY1WQ7TA==, + integrity: sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==, } - engines: { node: ">=12" } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true + dev: false - /@eslint-community/eslint-utils@4.4.0(eslint@8.55.0): + /@expo/spawn-async@1.5.0: resolution: { - integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, + integrity: sha512-LB7jWkqrHo+5fJHNrLAFdimuSXQ2MQ4lA7SQW5bf/HbsXuV2VrT/jN/M8f/KoWt0uJMGN4k/j7Opx4AvOOxSew==, } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + engines: { node: ">=4" } dependencies: - eslint: 8.55.0 - eslint-visitor-keys: 3.4.3 + cross-spawn: 6.0.5 + dev: false - /@eslint-community/regexpp@4.10.0: + /@expo/vector-icons@13.0.0: resolution: { - integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==, + integrity: sha512-TI+l71+5aSKnShYclFa14Kum+hQMZ86b95SH6tQUG3qZEmLTarvWpKwqtTwQKqvlJSJrpFiSFu3eCuZokY6zWA==, } - engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } + dev: false - /@eslint/eslintrc@2.1.4: + /@expo/websql@1.0.1: resolution: { - integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==, + integrity: sha512-H9/t1V7XXyKC343FJz/LwaVBfDhs6IqhDtSYWpt8LNSQDVjf5NvVJLc5wp+KCpRidZx8+0+YeHJN45HOXmqjFA==, } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.6.1 - globals: 13.23.0 - ignore: 5.3.0 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color + argsarray: 0.0.1 + immediate: 3.3.0 + noop-fn: 1.0.0 + pouchdb-collections: 1.0.1 + tiny-queue: 0.2.1 + dev: false - /@eslint/js@8.55.0: + /@expo/xcpretty@4.3.0: resolution: { - integrity: sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==, + integrity: sha512-whBbvHZ2Q10T5TNmN0z5NbO6C9ZDw+XUTu8h6vVMnMzQrbGexc9oaCCZfz+L3Q7TEL5vfr+9L86nY62c3Bsm+g==, } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + hasBin: true + dependencies: + "@babel/code-frame": 7.10.4 + chalk: 4.1.2 + find-up: 5.0.0 + js-yaml: 4.1.0 + dev: false /@fastify/busboy@2.1.0: resolution: @@ -1395,20 +3606,38 @@ packages: } dev: false - /@floating-ui/vue@1.0.2(vue@3.3.13): + /@floating-ui/vue@1.0.2(vue@3.4.3): resolution: { integrity: sha512-sImlAl9mAoCKZLNlwWz2P2ZMJIDlOEDXrRD6aD2sIHAka1LPC+nWtB+D3lPe7IE7FGWSbwBPTnlSdlABa3Fr0A==, } dependencies: "@floating-ui/dom": 1.5.3 - vue-demi: 0.14.6(vue@3.3.13) + vue-demi: 0.14.6(vue@3.4.3) transitivePeerDependencies: - "@vue/composition-api" - vue dev: false - /@headlessui/vue@1.7.16(vue@3.3.13): + /@gar/promisify@1.1.3: + resolution: + { + integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==, + } + dev: false + + /@graphql-typed-document-node/core@3.2.0(graphql@15.8.0): + resolution: + { + integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==, + } + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + dependencies: + graphql: 15.8.0 + dev: false + + /@headlessui/vue@1.7.16(vue@3.4.3): resolution: { integrity: sha512-nKT+nf/q6x198SsyK54mSszaQl/z+QxtASmgMEJtpxSX2Q0OPJX0upS/9daDyiECpeAsvjkoOrm2O/6PyBQ+Qg==, @@ -1417,24 +3646,24 @@ packages: peerDependencies: vue: ^3.2.0 dependencies: - vue: 3.3.13(typescript@5.3.3) + vue: 3.4.3(typescript@5.3.3) dev: false - /@hono/swagger-ui@0.2.0(hono@3.11.3): + /@hono/swagger-ui@0.2.1(hono@3.11.11): resolution: { - integrity: sha512-ulWqCI+38vTlxxBmOAi5VTOUDa5/7fKHPTwyq00kRUjUxPp3Ej5Cs+B/fvGs5gd3KraArLArkln7sHhb5vODZA==, + integrity: sha512-wBxVMRe3/v8xH4o6icmwztiIq0DG0s7+jHVMHVUAoFFCWEQNL2iskMmQtrhSDtsFmBZUeUFQUaaJ6Ir6DOmHLA==, } peerDependencies: hono: "*" dependencies: - hono: 3.11.3 + hono: 3.11.11 dev: false - /@hono/zod-openapi@0.9.3(hono@3.11.3)(zod@3.22.4): + /@hono/zod-openapi@0.9.5(hono@3.11.11)(zod@3.22.4): resolution: { - integrity: sha512-PdKWwUvMdoQ2eqJZtbo4N4qb2VRjHNnDcfWW3/IqSeJDyK4vIPHAzWfgtUOYHAXJAiooQQ87m0sw2iME2H1+zQ==, + integrity: sha512-Px8QEIr5RyDeHQn51Ihnwtl//foFvd/F6yBq6o/3pVMUpoV6X4JZ+srgUrOX2VRrInpLVEP/NaroXlfvarwIxA==, } engines: { node: ">=16.0.0" } peerDependencies: @@ -1442,12 +3671,12 @@ packages: zod: 3.* dependencies: "@asteasolutions/zod-to-openapi": 5.5.0(zod@3.22.4) - "@hono/zod-validator": 0.1.11(hono@3.11.3)(zod@3.22.4) - hono: 3.11.3 + "@hono/zod-validator": 0.1.11(hono@3.11.11)(zod@3.22.4) + hono: 3.11.11 zod: 3.22.4 dev: false - /@hono/zod-validator@0.1.11(hono@3.11.3)(zod@3.22.4): + /@hono/zod-validator@0.1.11(hono@3.11.11)(zod@3.22.4): resolution: { integrity: sha512-PQXeHUP0+36qpRt8yfeD7N2jbK3ETlGvSN6dMof/HwUC/APRokQRjpXZm4rrlG71Ft0aWE01+Bm4XejqPie5Uw==, @@ -1456,7 +3685,7 @@ packages: hono: ">=3.9.0" zod: ^3.19.1 dependencies: - hono: 3.11.3 + hono: 3.11.11 zod: 3.22.4 dev: false @@ -1486,13 +3715,88 @@ packages: integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==, } + /@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: false + + /@jest/types@26.6.2: + resolution: + { + integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==, + } + engines: { node: ">= 10.14.2" } + dependencies: + "@types/istanbul-lib-coverage": 2.0.6 + "@types/istanbul-reports": 3.0.4 + "@types/node": 20.10.6 + "@types/yargs": 15.0.19 + chalk: 4.1.2 + dev: false + + /@jridgewell/gen-mapping@0.3.3: + resolution: + { + integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==, + } + engines: { node: ">=6.0.0" } + dependencies: + "@jridgewell/set-array": 1.1.2 + "@jridgewell/sourcemap-codec": 1.4.15 + "@jridgewell/trace-mapping": 0.3.20 + dev: false + + /@jridgewell/resolve-uri@3.1.1: + resolution: + { + integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==, + } + engines: { node: ">=6.0.0" } + + /@jridgewell/set-array@1.1.2: + resolution: + { + integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==, + } + engines: { node: ">=6.0.0" } + dev: false + /@jridgewell/sourcemap-codec@1.4.15: resolution: { integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==, } + + /@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: false + /@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 + /@jsdevtools/ono@7.1.3: resolution: { @@ -1500,19 +3804,20 @@ packages: } dev: false - /@lezer/common@1.1.2: + /@lezer/common@1.2.0: resolution: { - integrity: sha512-V+GqBsga5+cQJMfM0GdnHmg4DgWvLzgMWjbldBg0+jC3k9Gu6nJNZDLJxXEBT1Xj8KhRN4jmbC5CY7SIL++sVw==, + integrity: sha512-Wmvlm4q6tRpwiy20TnB3yyLTZim38Tkc50dPY8biQRwqE+ati/wD84rm3N15hikvdT4uSg9phs9ubjvcLmkpKg==, } dev: false - /@lezer/css@1.1.4: + /@lezer/css@1.1.5: resolution: { - integrity: sha512-CuUwjidrU7FOBokqASRJc72SmJ9g1PsHXDOWMoKg4md6+2u/Zxzwx5YsYrAFxRDsLrjLlsIyEF1rZHK3gFEJbw==, + integrity: sha512-yyJ6WbSFavzpg74N/K0ZYIlk8hRA0+vdS2MOUUquoasmt64o4JXIx/fXPtX4d6FeFjtkOjJ6+JhdzijJ4ye9kg==, } dependencies: + "@lezer/common": 1.2.0 "@lezer/highlight": 1.2.0 "@lezer/lr": 1.3.14 dev: false @@ -1523,26 +3828,27 @@ packages: integrity: sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==, } dependencies: - "@lezer/common": 1.1.2 + "@lezer/common": 1.2.0 dev: false - /@lezer/html@1.3.7: + /@lezer/html@1.3.8: resolution: { - integrity: sha512-Wo+rZ5UjLP0VqUTyXjzgmTYRW5bvTJUFn4Uw0K3HCQjX2/+f+zRo9GLN5BCAojwHQISPvaQk8BWSv2SSKx/UcQ==, + integrity: sha512-EXseJ3pUzWxE6XQBQdqWHZqqlGQRSuNMBcLb6mZWS2J2v+QZhOObD+3ZIKIcm59ntTzyor4LqFTb72iJc3k23Q==, } dependencies: - "@lezer/common": 1.1.2 + "@lezer/common": 1.2.0 "@lezer/highlight": 1.2.0 "@lezer/lr": 1.3.14 dev: false - /@lezer/java@1.1.0: + /@lezer/java@1.1.1: resolution: { - integrity: sha512-RmBS+P9LJ4P9SU7ZewahMkBUNOEz1zQTMOKLq8OEa7ge8FZxz7mKjoEIGewRSn9kom1z5GKQjtxNE++m6u8SYw==, + integrity: sha512-mt3dX13fRlpY7RlWELYRakanXgmwXsLRCrhstrn+c1sZd7jR2xle46/3heoxGd+oHxnuTnpoyXTyxcLJQs9+mQ==, } dependencies: + "@lezer/common": 1.2.0 "@lezer/highlight": 1.2.0 "@lezer/lr": 1.3.14 dev: false @@ -1557,12 +3863,13 @@ packages: "@lezer/lr": 1.3.14 dev: false - /@lezer/json@1.0.1: + /@lezer/json@1.0.2: resolution: { - integrity: sha512-nkVC27qiEZEjySbi6gQRuMwa2sDu2PtfjSgz0A4QF81QyRGm3kb2YRzLcOPcTEtmcwvrX/cej7mlhbwViA4WJw==, + integrity: sha512-xHT2P4S5eeCYECyKNPhr4cbEL9tc8w83SPwRC373o9uEdrvGKTZoJVAGxpOsZckMlEh9W23Pc72ew918RWQOBQ==, } dependencies: + "@lezer/common": 1.2.0 "@lezer/highlight": 1.2.0 "@lezer/lr": 1.3.14 dev: false @@ -1573,15 +3880,16 @@ packages: integrity: sha512-z5mY4LStlA3yL7aHT/rqgG614cfcvklS+8oFRFBYrs4YaWLJyKKM4+nN6KopToX0o9Hj6zmH6M5kinOYuy06ug==, } dependencies: - "@lezer/common": 1.1.2 + "@lezer/common": 1.2.0 dev: false - /@lezer/python@1.1.9: + /@lezer/python@1.1.10: resolution: { - integrity: sha512-8Ua3p8NdICXR6qWvRCnCx5CI1B0DklZGNtRLwOrIS/OHecHIugRHZyr0NsaaQO2H2Nn34EPlRtltXIirLsry5Q==, + integrity: sha512-pvSjn+OWivmA/si/SFeGouHO50xoOZcPIFzf8dql0gRvcfCvLDpVIpnnGFFlB7wa0WDscDLo0NmH+4Tx80nBdQ==, } dependencies: + "@lezer/common": 1.2.0 "@lezer/highlight": 1.2.0 "@lezer/lr": 1.3.14 dev: false @@ -1594,17 +3902,17 @@ packages: dependencies: "@libsql/hrana-client": 0.5.5 js-base64: 3.7.5 - libsql: 0.2.0-pre.4 + libsql: 0.2.0-pre.6 transitivePeerDependencies: - bufferutil - encoding - utf-8-validate dev: false - /@libsql/darwin-arm64@0.2.0-pre.4: + /@libsql/darwin-arm64@0.2.0-pre.6: resolution: { - integrity: sha512-kb0f/FeZxzeqa+j6O7xI9toOeoTNCJnErOcNyWWzoqA5JZ4LJ9dCMrLPWe4Np22+Rg57NPmFz/Z7MFNP2y5Gow==, + integrity: sha512-VIhL4tIelxLC4NFAdD/TUgWlMZvX7q18Zf6urVfqeNRJw2lTnO0exByjOFYJL3mqhQ53gVH73CoSP3/w8TyJtA==, } cpu: [arm64] os: [darwin] @@ -1612,10 +3920,10 @@ packages: dev: false optional: true - /@libsql/darwin-x64@0.2.0-pre.4: + /@libsql/darwin-x64@0.2.0-pre.6: resolution: { - integrity: sha512-HQM9cmGP4t+ujbyhA6rjQ8K4iHw5DStq3YnL8030k5z4KHGkAOIcRbVj3m65J72Gy+tCsisUCZTrBjIFkjOFhA==, + integrity: sha512-2tHZLqtnhyP4ggZrpFiysP4oa5/9TFw0meYpBsTSxaqIThtK3mz41IA8A6mcsiMLq1OUX+Q2h8/vwVXJzeEauA==, } cpu: [x64] os: [darwin] @@ -1645,7 +3953,7 @@ packages: integrity: sha512-dH0lMk50gKSvEKD78xWMu60SY1sjp1sY//iFLO0XMmBwfVfG136P9KOk06R4maBdlb8KMXOzJ1D28FR5ZKnHTA==, } dependencies: - "@types/node-fetch": 2.6.9 + "@types/node-fetch": 2.6.10 node-fetch: 2.7.0 transitivePeerDependencies: - encoding @@ -1658,16 +3966,16 @@ packages: } dependencies: "@types/ws": 8.5.10 - ws: 8.14.2 + ws: 8.16.0 transitivePeerDependencies: - bufferutil - utf-8-validate dev: false - /@libsql/linux-arm64-gnu@0.2.0-pre.4: + /@libsql/linux-arm64-gnu@0.2.0-pre.6: resolution: { - integrity: sha512-1VVhnSx+vSDCLXxfUP9kRGbZyy+Si6tvPQZ8JqZftt9EJG1Dvzp1E1TT8zFYMeBQeVyoV4KryctW5b5uZkqVQA==, + integrity: sha512-6JXhiQpLTdbMM3GpK4BuRYCIRvEUyFirSBkap5oOfWccL0Rnja7iBxNLsmGve5hAT39AR2VNPBWPM6yBfoQYNA==, } cpu: [arm64] os: [linux] @@ -1675,10 +3983,10 @@ packages: dev: false optional: true - /@libsql/linux-arm64-musl@0.2.0-pre.4: + /@libsql/linux-arm64-musl@0.2.0-pre.6: resolution: { - integrity: sha512-lbSeR5agUDkpHTT3OOnuINWEr7OsX+XCwJ21bkceoXu/napW7A3auiOjzK7mneI+vT7fRjay0caivrdoqgeKKg==, + integrity: sha512-YlCRXkJNWww1q0kmjlg+s2NN3zMHllKfXMDTjvLaCLaXrCwURhylOIiwNXiiVNqWtCr/9Guz/WZxGMQe3pxGgg==, } cpu: [arm64] os: [linux] @@ -1686,10 +3994,10 @@ packages: dev: false optional: true - /@libsql/linux-x64-gnu@0.2.0-pre.4: + /@libsql/linux-x64-gnu@0.2.0-pre.6: resolution: { - integrity: sha512-OBiu0+tEVj2daJJrcg1uhEtHx7CsED8QesEqz8dhoK0Dad1oSn8XUpulhiMiXP1JFlcr7Zz37eKJdQxv17WTfw==, + integrity: sha512-9Hs0Hf6aBEcDgtEVBdQyqXoJZwkERSZnXary4iLvORIBT3IZg+ReNMXeeqgp7L1MA3WNRJsV5KuyeZEUxhiWqg==, } cpu: [x64] os: [linux] @@ -1697,10 +4005,10 @@ packages: dev: false optional: true - /@libsql/linux-x64-musl@0.2.0-pre.4: + /@libsql/linux-x64-musl@0.2.0-pre.6: resolution: { - integrity: sha512-iJr3XiUTsB8ic4+DTG8412o9NZ3ifCEM+FaZ0/uxh3xlERbYUMUZhAIylxJqYjovld0edd6Nns7OJfu5b8Ae2g==, + integrity: sha512-N9P10GZUdJ1JyWyzHSjaA2tebMBVohJhmxSv7opolDBW7xs5Wa82zrx20ilk+0jcZmrFwJwcSu1TO/ZvRlmT2w==, } cpu: [x64] os: [linux] @@ -1708,10 +4016,10 @@ packages: dev: false optional: true - /@libsql/win32-x64-msvc@0.2.0-pre.4: + /@libsql/win32-x64-msvc@0.2.0-pre.6: resolution: { - integrity: sha512-kV/Bl6RBMCm24LFmlowl//TvD8jhRjSmUjComXdQ4j5JrAW29MVEb5EtrA16qGzeWb06tSMII0z5yqEaYxvQbQ==, + integrity: sha512-MC7zcwewX+acYYErwN29oCBOZM1JMQYIuFBS96DKVmZ9kW6VoQe/oYpqh/iHDwh5MH5b754WCrXosXy0UyKsaw==, } cpu: [x64] os: [win32] @@ -1719,15 +4027,15 @@ packages: dev: false optional: true - /@lucia-auth/adapter-sqlite@3.0.0-beta.9(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2)(lucia@3.0.0-beta.11): + /@lucia-auth/adapter-sqlite@3.0.0-beta.11(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2)(lucia@3.0.0-beta.13): resolution: { - integrity: sha512-Z6kW5ebeEDMlUcJu3bf4USbUuPa2rcCKWJxHdK0jqiPoJfNJrUpg/yBfoUZ7CJ/mucTAKV9EjcrVZSUTHvesGA==, + integrity: sha512-Yvnu6p3hP81ldeoaKC66svzc0Kyfxtc54pYukxAMQKFdc+puCcMzCAk71/s5BJwFeyzepA+F1WdV/7jvduKw+g==, } peerDependencies: "@libsql/client": ^0.3.0 better-sqlite3: 8.x - 9.x - lucia: 3.0.0-beta.11 + lucia: 3.0.0-beta.13 peerDependenciesMeta: "@libsql/client": optional: true @@ -1736,7 +4044,7 @@ packages: dependencies: "@libsql/client": 0.4.0-pre.5 better-sqlite3: 9.2.2 - lucia: 3.0.0-beta.11 + lucia: 3.0.0-beta.13 dev: false /@neon-rs/load@0.0.4: @@ -2127,7 +4435,39 @@ packages: engines: { node: ">= 8" } dependencies: "@nodelib/fs.scandir": 2.1.5 - fastq: 1.15.0 + fastq: 1.16.0 + + /@npmcli/fs@1.1.1: + resolution: + { + integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==, + } + dependencies: + "@gar/promisify": 1.1.3 + semver: 7.5.4 + dev: false + + /@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 + + /@pkgjs/parseargs@0.11.0: + resolution: + { + integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, + } + engines: { node: ">=14" } + requiresBuild: true + dev: false + optional: true /@popperjs/core@2.11.8: resolution: @@ -2136,28 +4476,35 @@ packages: } dev: false - /@scalar/api-client@0.8.3(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.9.3)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.2)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.3.13): + /@react-native/normalize-color@2.1.0: + resolution: + { + integrity: sha512-Z1jQI2NpdFJCVgpY+8Dq/Bt3d+YUi1928Q+/CZm/oh66fzM0RUl54vvuXlPJKybH4pdCZey1eDTPaLHkMPNgWA==, + } + dev: false + + /@scalar/api-client@0.8.6(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.3): resolution: { - integrity: sha512-PwVw0v2H1aYvsLZPaRhYZIs9dFbW8G3R7HX7HZvzR305X9xyDfdtZzBdNOnf3NFLMGZTqs3KzgfiMke6klC59Q==, + integrity: sha512-qAlb0nqOnhqsrmEL8Cbjdi/TPGSyyXTmoVLMV73DqnAMe+yC4PvbEkJjIN0zQLV2jTtcG7O9LQeqo2PgRIgrDQ==, } engines: { node: ">=20" } peerDependencies: vue: ^3.3.0 dependencies: - "@headlessui/vue": 1.7.16(vue@3.3.13) - "@scalar/themes": 0.5.1(vue@3.3.13) - "@scalar/use-codemirror": 0.7.16(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.9.3)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.2)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.3.13) - "@scalar/use-keyboard-event": 0.5.6(vue@3.3.13) - "@scalar/use-modal": 0.2.1(@headlessui/vue@1.7.16)(vue@3.3.13) - "@vueuse/core": 10.7.0(vue@3.3.13) - axios: 1.6.2 + "@headlessui/vue": 1.7.16(vue@3.4.3) + "@scalar/themes": 0.5.1(vue@3.4.3) + "@scalar/use-codemirror": 0.7.16(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.3) + "@scalar/use-keyboard-event": 0.5.6(vue@3.4.3) + "@scalar/use-modal": 0.2.1(@headlessui/vue@1.7.16)(vue@3.4.3) + "@vueuse/core": 10.7.1(vue@3.4.3) + axios: 1.6.3 content-type: 1.0.5 javascript-time-ago: 2.5.9 nanoid: 5.0.4 pretty-bytes: 6.1.1 pretty-ms: 8.0.0 - vue: 3.3.13(typescript@5.3.3) + vue: 3.4.3(typescript@5.3.3) transitivePeerDependencies: - "@codemirror/lang-html" - "@codemirror/lang-java" @@ -2177,35 +4524,35 @@ packages: - debug dev: false - /@scalar/api-reference@1.12.1(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.9.3)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.2)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(nanoid@5.0.4)(postcss@8.4.32)(typescript@5.3.3)(unified@11.0.4)(vue@3.3.13): + /@scalar/api-reference@1.12.7(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(nanoid@5.0.4)(postcss@8.4.32)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.3): resolution: { - integrity: sha512-ib4VaFEUYBb97o7joCB10c3wB3UU9ahbF78mMeFtNunymtXU9tBHHLP+EVICaGRDsZ2XwYU5brqeZWWteB9M2A==, + integrity: sha512-Ok00vJx8ko9UZ0eCE2HFUtGd/GONJhYF7Nn5jp7XmxzLb+d8wywfwHm9Vkp3d/ieCkc5ORNHTf54+g/6HPwG8w==, } engines: { node: ">=20" } peerDependencies: unified: ^11.0.0 vue: ^3.3.0 dependencies: - "@floating-ui/vue": 1.0.2(vue@3.3.13) - "@headlessui/vue": 1.7.16(vue@3.3.13) - "@scalar/api-client": 0.8.3(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.9.3)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.2)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.3.13) + "@floating-ui/vue": 1.0.2(vue@3.4.3) + "@headlessui/vue": 1.7.16(vue@3.4.3) + "@scalar/api-client": 0.8.6(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.3) "@scalar/components": 0.2.0(typescript@5.3.3) "@scalar/snippetz": 0.1.4 - "@scalar/swagger-editor": 0.9.1(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.9.3)(@codemirror/legacy-modes@6.3.3)(@codemirror/view@6.22.3)(@headlessui/vue@1.7.16)(@lezer/common@1.1.2)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(typescript@5.3.3)(unified@11.0.4)(vue@3.3.13) + "@scalar/swagger-editor": 0.9.2(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/view@6.23.0)(@headlessui/vue@1.7.16)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.3) "@scalar/swagger-parser": 0.5.13(openapi-types@12.1.3) - "@scalar/themes": 0.5.1(vue@3.3.13) + "@scalar/themes": 0.5.1(vue@3.4.3) "@scalar/use-clipboard": 0.5.11(@scalar/use-toasts@0.5.11)(nanoid@5.0.4) - "@scalar/use-codemirror": 0.7.16(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.9.3)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.2)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.3.13) - "@scalar/use-keyboard-event": 0.5.6(vue@3.3.13) - "@scalar/use-modal": 0.2.1(@headlessui/vue@1.7.16)(vue@3.3.13) - "@scalar/use-toasts": 0.5.11(nanoid@5.0.4)(vue@3.3.13) - "@scalar/use-tooltip": 0.5.7(vue@3.3.13) + "@scalar/use-codemirror": 0.7.16(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.3) + "@scalar/use-keyboard-event": 0.5.6(vue@3.4.3) + "@scalar/use-modal": 0.2.1(@headlessui/vue@1.7.16)(vue@3.4.3) + "@scalar/use-toasts": 0.5.11(nanoid@5.0.4)(vue@3.4.3) + "@scalar/use-tooltip": 0.5.7(vue@3.4.3) "@unhead/schema": 1.8.9 "@vcarl/remark-headings": 0.1.0 - "@vueuse/core": 10.7.0(vue@3.3.13) + "@vueuse/core": 10.7.1(vue@3.4.3) "@xmldom/xmldom": 0.8.10 - axios: 1.6.2 + axios: 1.6.3 fuse.js: 6.6.2 github-slugger: 2.0.0 httpsnippet-lite: 3.0.5 @@ -2224,7 +4571,7 @@ packages: remark-stringify: 11.0.0 unhead: 1.8.9 unified: 11.0.4 - vue: 3.3.13(typescript@5.3.3) + vue: 3.4.3(typescript@5.3.3) transitivePeerDependencies: - "@codemirror/lang-html" - "@codemirror/lang-java" @@ -2255,30 +4602,30 @@ packages: } engines: { node: ">=20" } dependencies: - "@headlessui/vue": 1.7.16(vue@3.3.13) - "@vueuse/core": 10.7.0(vue@3.3.13) + "@headlessui/vue": 1.7.16(vue@3.4.3) + "@vueuse/core": 10.7.1(vue@3.4.3) "@xmldom/xmldom": 0.8.10 class-variance-authority: 0.7.0 cva: 1.0.0-beta.1(typescript@5.3.3) nanoid: 5.0.4 - tailwind-merge: 2.1.0 - vue: 3.3.13(typescript@5.3.3) + tailwind-merge: 2.2.0 + vue: 3.4.3(typescript@5.3.3) transitivePeerDependencies: - "@vue/composition-api" - typescript dev: false - /@scalar/hono-api-reference@0.3.3(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.9.3)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.2)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(hono@3.11.3)(nanoid@5.0.4)(postcss@8.4.32)(typescript@5.3.3)(unified@11.0.4)(vue@3.3.13): + /@scalar/hono-api-reference@0.3.9(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(hono@3.11.11)(nanoid@5.0.4)(postcss@8.4.32)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.3): resolution: { - integrity: sha512-n3vntN6GyphYSarb/UjfUBiPwqVFo2slTAJ5cgkGOUH4GTctydhcK8u1hx0D2j0wWQuJv7qzIivYvnjB6v31zw==, + integrity: sha512-F52PqTkAmdeCP84wjlcZxcYJz06Bqgk/gTmBW60wd9hP70JjlMsP31DriIHyx3R5x1SlYvpEwf2kpH3b13IxBQ==, } engines: { node: ">=20" } peerDependencies: hono: ^3.0.0 dependencies: - "@scalar/api-reference": 1.12.1(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.9.3)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.2)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(nanoid@5.0.4)(postcss@8.4.32)(typescript@5.3.3)(unified@11.0.4)(vue@3.3.13) - hono: 3.11.3 + "@scalar/api-reference": 1.12.7(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(nanoid@5.0.4)(postcss@8.4.32)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.3) + hono: 3.11.11 transitivePeerDependencies: - "@codemirror/lang-html" - "@codemirror/lang-java" @@ -2342,22 +4689,22 @@ packages: "@scalar/snippetz-plugin-node-undici": 0.1.4 dev: false - /@scalar/swagger-editor@0.9.1(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.9.3)(@codemirror/legacy-modes@6.3.3)(@codemirror/view@6.22.3)(@headlessui/vue@1.7.16)(@lezer/common@1.1.2)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(typescript@5.3.3)(unified@11.0.4)(vue@3.3.13): + /@scalar/swagger-editor@0.9.2(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/view@6.23.0)(@headlessui/vue@1.7.16)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.3): resolution: { - integrity: sha512-Kprx9x0LOA4qErky3GtNCibsVZZN4Y62Y5iHcKU3iZQrlrgQoXZw1TG6ibv45odbmrw5BwJ0pHtrhiVHeCgLng==, + integrity: sha512-h176YaLpjofDJZXG+aZM28yKweBtV/yh7lGSsK+y0FO3kKxCpXC0ONEgG0vtFBzV/tXjAXIKNBpd3mRpwDQzfA==, } engines: { node: ">=20" } peerDependencies: unified: ^11.0.0 vue: ^3.3.0 dependencies: - "@codemirror/state": 6.3.3 + "@codemirror/state": 6.4.0 "@scalar/components": 0.2.0(typescript@5.3.3) - "@scalar/themes": 0.5.1(vue@3.3.13) - "@scalar/use-codemirror": 0.7.16(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.9.3)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.2)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.3.13) - "@scalar/use-modal": 0.2.1(@headlessui/vue@1.7.16)(vue@3.3.13) - "@vueuse/core": 10.7.0(vue@3.3.13) + "@scalar/themes": 0.5.1(vue@3.4.3) + "@scalar/use-codemirror": 0.7.16(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.3) + "@scalar/use-modal": 0.2.1(@headlessui/vue@1.7.16)(vue@3.4.3) + "@vueuse/core": 10.7.1(vue@3.4.3) nanoid: 5.0.4 rehype-external-links: 3.0.0 rehype-format: 5.0.0 @@ -2369,7 +4716,7 @@ packages: remark-parse: 11.0.0 remark-rehype: 11.0.0 unified: 11.0.4 - vue: 3.3.13(typescript@5.3.3) + vue: 3.4.3(typescript@5.3.3) transitivePeerDependencies: - "@codemirror/lang-html" - "@codemirror/lang-java" @@ -2403,7 +4750,7 @@ packages: - openapi-types dev: false - /@scalar/themes@0.5.1(vue@3.3.13): + /@scalar/themes@0.5.1(vue@3.4.3): resolution: { integrity: sha512-iaX9H1P/KukzuzkgRlbE4QWxYRHWQajf4AGQVI9Na9KeIQ4NgpkWWsIfcDKekP6P7QrlLvFpgkLcjJf5mnnF4A==, @@ -2412,7 +4759,7 @@ packages: peerDependencies: vue: ^3.3.0 dependencies: - vue: 3.3.13(typescript@5.3.3) + vue: 3.4.3(typescript@5.3.3) dev: false /@scalar/use-clipboard@0.5.11(@scalar/use-toasts@0.5.11)(nanoid@5.0.4): @@ -2425,11 +4772,11 @@ packages: "@scalar/use-toasts": 0.5.11 nanoid: ^5.0.1 dependencies: - "@scalar/use-toasts": 0.5.11(nanoid@5.0.4)(vue@3.3.13) + "@scalar/use-toasts": 0.5.11(nanoid@5.0.4)(vue@3.4.3) nanoid: 5.0.4 dev: false - /@scalar/use-codemirror@0.7.16(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.9.3)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.2)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.3.13): + /@scalar/use-codemirror@0.7.16(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.3): resolution: { integrity: sha512-TQXplKCVDheuR/w7q9q0HzyQ9rJmy3P0tAFw2jPLwfAq3Q6YVpltuu3UrKzAOtxV3FcKMc7lzYZLaGY0DHcTVw==, @@ -2456,20 +4803,20 @@ packages: "@codemirror/lang-java": 6.0.1 "@codemirror/lang-javascript": 6.2.1 "@codemirror/lang-json": 6.0.1 - "@codemirror/lang-python": 6.1.3(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.2) - "@codemirror/language": 6.9.3 + "@codemirror/lang-python": 6.1.3(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0) + "@codemirror/language": 6.10.0 "@codemirror/legacy-modes": 6.3.3 - "@codemirror/state": 6.3.3 - "@codemirror/view": 6.22.3 - "@lezer/common": 1.1.2 + "@codemirror/state": 6.4.0 + "@codemirror/view": 6.23.0 + "@lezer/common": 1.2.0 "@lezer/highlight": 1.2.0 "@lezer/lr": 1.3.14 - "@uiw/codemirror-themes": 4.21.21(@codemirror/language@6.9.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3) - codemirror: 6.0.1(@lezer/common@1.1.2) - vue: 3.3.13(typescript@5.3.3) + "@uiw/codemirror-themes": 4.21.21(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0) + codemirror: 6.0.1(@lezer/common@1.2.0) + vue: 3.4.3(typescript@5.3.3) dev: false - /@scalar/use-keyboard-event@0.5.6(vue@3.3.13): + /@scalar/use-keyboard-event@0.5.6(vue@3.4.3): resolution: { integrity: sha512-/sKl0LDr2RoTVuQIUaeeOkEbUtl2z+cqEHHF4CNenqOra/Sz/u/eexDHbMc7ZTaaIo9snMHSceLo2k9ThQUz3g==, @@ -2478,10 +4825,10 @@ packages: peerDependencies: vue: ^3.3.0 dependencies: - vue: 3.3.13(typescript@5.3.3) + vue: 3.4.3(typescript@5.3.3) dev: false - /@scalar/use-modal@0.2.1(@headlessui/vue@1.7.16)(vue@3.3.13): + /@scalar/use-modal@0.2.1(@headlessui/vue@1.7.16)(vue@3.4.3): resolution: { integrity: sha512-OAf7nIoKAbt53GGbbsDbIoAF+/RRQIjnBJhgfk4eI1ACyAOVXwVWrjJ1eYmGbv86gzEX9neb/qpwkc9kcnz1FQ==, @@ -2491,11 +4838,11 @@ packages: "@headlessui/vue": ^1.7.0 vue: ^3.3.0 dependencies: - "@headlessui/vue": 1.7.16(vue@3.3.13) - vue: 3.3.13(typescript@5.3.3) + "@headlessui/vue": 1.7.16(vue@3.4.3) + vue: 3.4.3(typescript@5.3.3) dev: false - /@scalar/use-toasts@0.5.11(nanoid@5.0.4)(vue@3.3.13): + /@scalar/use-toasts@0.5.11(nanoid@5.0.4)(vue@3.4.3): resolution: { integrity: sha512-5uaxV+944rkrYl3mQaQn+AruBCcDjN03jODko2K618unSf3JQixIi6ptoOcXCL6QAGM4FaHtMjRjX/7LJWOtOQ==, @@ -2506,10 +4853,10 @@ packages: vue: ^3.3.0 dependencies: nanoid: 5.0.4 - vue: 3.3.13(typescript@5.3.3) + vue: 3.4.3(typescript@5.3.3) dev: false - /@scalar/use-tooltip@0.5.7(vue@3.3.13): + /@scalar/use-tooltip@0.5.7(vue@3.4.3): resolution: { integrity: sha512-WmTleZDjR1Yerw1GLoh9li/3d9dFDWm1Vb39xrehtXx8bGB8+IkRyg8ZCfGzEKNySbf263QAaRmZkKUMVOGdAA==, @@ -2519,7 +4866,17 @@ packages: vue: ^3.3.0 dependencies: tippy.js: 6.3.7 - vue: 3.3.13(typescript@5.3.3) + vue: 3.4.3(typescript@5.3.3) + dev: false + + /@segment/loosely-validate-event@2.0.0: + resolution: + { + integrity: sha512-ZMCSfztDBqwotkl848ODgVcAmN4OItEWDCkshcKz0/W6gGSQayuuCtWV/MlodFivAZD793d6UgANd6wCXUfrIw==, + } + dependencies: + component-type: 1.2.2 + join-component: 1.1.0 dev: false /@types/debug@4.1.12: @@ -2538,10 +4895,10 @@ packages: } dev: false - /@types/hast@2.3.8: + /@types/hast@2.3.9: resolution: { - integrity: sha512-aMIqAlFd2wTIDZuvLbhUT+TGvMxrNC8ECUIVtH6xxy0sQLs3iu6NO8Kp/VT5je7i5ufnebXzdV1dNDMnvaH6IQ==, + integrity: sha512-pTHyNlaMD/oKJmS+ZZUyFUcsZeBZpC0lmGquw98CqRVNgAdJZJeD7GoeLiT6Xbx5rU9VCjSt0RwEvDgzh4obFw==, } dependencies: "@types/unist": 2.0.10 @@ -2556,6 +4913,31 @@ packages: "@types/unist": 3.0.2 dev: false + /@types/istanbul-lib-coverage@2.0.6: + resolution: + { + integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==, + } + dev: false + + /@types/istanbul-lib-report@3.0.3: + resolution: + { + integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==, + } + dependencies: + "@types/istanbul-lib-coverage": 2.0.6 + dev: false + + /@types/istanbul-reports@3.0.4: + resolution: + { + integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==, + } + dependencies: + "@types/istanbul-lib-report": 3.0.3 + dev: false + /@types/json-schema@7.0.15: resolution: { @@ -2588,13 +4970,13 @@ packages: } dev: false - /@types/node-fetch@2.6.9: + /@types/node-fetch@2.6.10: resolution: { - integrity: sha512-bQVlnMLFJ2d35DkPNjEPmd9ueO/rh5EiaZt2bhqiSarPjZIuIV6bPQVqcrEyvNo+AfTrRGVazle1tl597w3gfA==, + integrity: sha512-PPpPK6F9ALFTn59Ka3BaL+qGuipRfxNE8qVgkp0bVixeiR2c2/L+IVOiBdu9JhhT22sWnQEp6YyHGI2b2+CMcA==, } dependencies: - "@types/node": 20.10.4 + "@types/node": 20.10.6 form-data: 4.0.0 dev: false @@ -2604,17 +4986,42 @@ packages: integrity: sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw==, } dependencies: - "@types/node": 20.10.4 + "@types/node": 20.10.6 dev: true - /@types/node@20.10.4: + /@types/node@20.10.6: resolution: { - integrity: sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==, + integrity: sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw==, } dependencies: undici-types: 5.26.5 + /@types/prop-types@15.7.11: + resolution: + { + integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==, + } + dev: false + + /@types/react@18.2.46: + resolution: + { + integrity: sha512-nNCvVBcZlvX4NU1nRRNV/mFl1nNRuTuslAJglQsq+8ldXe5Xv0Wd2f7WTE3jOxhLH2BFfiZGC6GCp+kHQbgG+w==, + } + dependencies: + "@types/prop-types": 15.7.11 + "@types/scheduler": 0.16.8 + csstype: 3.1.3 + dev: false + + /@types/scheduler@0.16.8: + resolution: + { + integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==, + } + dev: false + /@types/semver@7.5.6: resolution: { @@ -2649,13 +5056,29 @@ packages: integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==, } dependencies: - "@types/node": 20.10.4 + "@types/node": 20.10.6 + dev: false + + /@types/yargs-parser@21.0.3: + resolution: + { + integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==, + } + dev: false + + /@types/yargs@15.0.19: + resolution: + { + integrity: sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==, + } + dependencies: + "@types/yargs-parser": 21.0.3 dev: false - /@typescript-eslint/eslint-plugin@6.13.2(@typescript-eslint/parser@6.13.2)(eslint@8.55.0)(typescript@5.3.3): + /@typescript-eslint/eslint-plugin@6.16.0(@typescript-eslint/parser@6.16.0)(eslint@8.56.0)(typescript@5.3.3): resolution: { - integrity: sha512-3+9OGAWHhk4O1LlcwLBONbdXsAhLjyCFogJY/cWy2lxdVJ2JrcTF2pTGMaLl2AE7U1l31n8Py4a8bx5DLf/0dQ==, + integrity: sha512-O5f7Kv5o4dLWQtPX4ywPPa+v9G+1q1x8mz0Kr0pXUtKsevo+gIJHLkGc8RxaZWtP8RrhwhSNIWThnW42K9/0rQ==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -2667,13 +5090,13 @@ packages: optional: true dependencies: "@eslint-community/regexpp": 4.10.0 - "@typescript-eslint/parser": 6.13.2(eslint@8.55.0)(typescript@5.3.3) - "@typescript-eslint/scope-manager": 6.13.2 - "@typescript-eslint/type-utils": 6.13.2(eslint@8.55.0)(typescript@5.3.3) - "@typescript-eslint/utils": 6.13.2(eslint@8.55.0)(typescript@5.3.3) - "@typescript-eslint/visitor-keys": 6.13.2 + "@typescript-eslint/parser": 6.16.0(eslint@8.56.0)(typescript@5.3.3) + "@typescript-eslint/scope-manager": 6.16.0 + "@typescript-eslint/type-utils": 6.16.0(eslint@8.56.0)(typescript@5.3.3) + "@typescript-eslint/utils": 6.16.0(eslint@8.56.0)(typescript@5.3.3) + "@typescript-eslint/visitor-keys": 6.16.0 debug: 4.3.4 - eslint: 8.55.0 + eslint: 8.56.0 graphemer: 1.4.0 ignore: 5.3.0 natural-compare: 1.4.0 @@ -2684,10 +5107,10 @@ packages: - supports-color dev: false - /@typescript-eslint/parser@6.13.2(eslint@8.55.0)(typescript@5.3.3): + /@typescript-eslint/parser@6.16.0(eslint@8.56.0)(typescript@5.3.3): resolution: { - integrity: sha512-MUkcC+7Wt/QOGeVlM8aGGJZy1XV5YKjTpq9jK6r6/iLsGXhBVaGP5N0UYvFsu9BFlSpwY9kMretzdBH01rkRXg==, + integrity: sha512-H2GM3eUo12HpKZU9njig3DF5zJ58ja6ahj1GoHEHOgQvYxzoFJJEvC1MQ7T2l9Ha+69ZSOn7RTxOdpC/y3ikMw==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -2697,32 +5120,32 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/scope-manager": 6.13.2 - "@typescript-eslint/types": 6.13.2 - "@typescript-eslint/typescript-estree": 6.13.2(typescript@5.3.3) - "@typescript-eslint/visitor-keys": 6.13.2 + "@typescript-eslint/scope-manager": 6.16.0 + "@typescript-eslint/types": 6.16.0 + "@typescript-eslint/typescript-estree": 6.16.0(typescript@5.3.3) + "@typescript-eslint/visitor-keys": 6.16.0 debug: 4.3.4 - eslint: 8.55.0 + eslint: 8.56.0 typescript: 5.3.3 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/scope-manager@6.13.2: + /@typescript-eslint/scope-manager@6.16.0: resolution: { - integrity: sha512-CXQA0xo7z6x13FeDYCgBkjWzNqzBn8RXaE3QVQVIUm74fWJLkJkaHmHdKStrxQllGh6Q4eUGyNpMe0b1hMkXFA==, + integrity: sha512-0N7Y9DSPdaBQ3sqSCwlrm9zJwkpOuc6HYm7LpzLAPqBL7dmzAUimr4M29dMkOP/tEwvOCC/Cxo//yOfJD3HUiw==, } engines: { node: ^16.0.0 || >=18.0.0 } dependencies: - "@typescript-eslint/types": 6.13.2 - "@typescript-eslint/visitor-keys": 6.13.2 + "@typescript-eslint/types": 6.16.0 + "@typescript-eslint/visitor-keys": 6.16.0 dev: false - /@typescript-eslint/type-utils@6.13.2(eslint@8.55.0)(typescript@5.3.3): + /@typescript-eslint/type-utils@6.16.0(eslint@8.56.0)(typescript@5.3.3): resolution: { - integrity: sha512-Qr6ssS1GFongzH2qfnWKkAQmMUyZSyOr0W54nZNU1MDfo+U4Mv3XveeLZzadc/yq8iYhQZHYT+eoXJqnACM1tw==, + integrity: sha512-ThmrEOcARmOnoyQfYkHw/DX2SEYBalVECmoldVuH6qagKROp/jMnfXpAU/pAIWub9c4YTxga+XwgAkoA0pxfmg==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -2732,28 +5155,28 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/typescript-estree": 6.13.2(typescript@5.3.3) - "@typescript-eslint/utils": 6.13.2(eslint@8.55.0)(typescript@5.3.3) + "@typescript-eslint/typescript-estree": 6.16.0(typescript@5.3.3) + "@typescript-eslint/utils": 6.16.0(eslint@8.56.0)(typescript@5.3.3) debug: 4.3.4 - eslint: 8.55.0 + eslint: 8.56.0 ts-api-utils: 1.0.3(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/types@6.13.2: + /@typescript-eslint/types@6.16.0: resolution: { - integrity: sha512-7sxbQ+EMRubQc3wTfTsycgYpSujyVbI1xw+3UMRUcrhSy+pN09y/lWzeKDbvhoqcRbHdc+APLs/PWYi/cisLPg==, + integrity: sha512-hvDFpLEvTJoHutVl87+MG/c5C8I6LOgEx05zExTSJDEVU7hhR3jhV8M5zuggbdFCw98+HhZWPHZeKS97kS3JoQ==, } engines: { node: ^16.0.0 || >=18.0.0 } dev: false - /@typescript-eslint/typescript-estree@6.13.2(typescript@5.3.3): + /@typescript-eslint/typescript-estree@6.16.0(typescript@5.3.3): resolution: { - integrity: sha512-SuD8YLQv6WHnOEtKv8D6HZUzOub855cfPnPMKvdM/Bh1plv1f7Q/0iFUDLKKlxHcEstQnaUU4QZskgQq74t+3w==, + integrity: sha512-VTWZuixh/vr7nih6CfrdpmFNLEnoVBF1skfjdyGnNwXOH1SLeHItGdZDHhhAIzd3ACazyY2Fg76zuzOVTaknGA==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -2762,11 +5185,12 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/types": 6.13.2 - "@typescript-eslint/visitor-keys": 6.13.2 + "@typescript-eslint/types": 6.16.0 + "@typescript-eslint/visitor-keys": 6.16.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 + minimatch: 9.0.3 semver: 7.5.4 ts-api-utils: 1.0.3(typescript@5.3.3) typescript: 5.3.3 @@ -2774,40 +5198,40 @@ packages: - supports-color dev: false - /@typescript-eslint/utils@6.13.2(eslint@8.55.0)(typescript@5.3.3): + /@typescript-eslint/utils@6.16.0(eslint@8.56.0)(typescript@5.3.3): resolution: { - integrity: sha512-b9Ptq4eAZUym4idijCRzl61oPCwwREcfDI8xGk751Vhzig5fFZR9CyzDz4Sp/nxSLBYxUPyh4QdIDqWykFhNmQ==, + integrity: sha512-T83QPKrBm6n//q9mv7oiSvy/Xq/7Hyw9SzSEhMHJwznEmQayfBM87+oAlkNAMEO7/MjIwKyOHgBJbxB0s7gx2A==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.55.0) + "@eslint-community/eslint-utils": 4.4.0(eslint@8.56.0) "@types/json-schema": 7.0.15 "@types/semver": 7.5.6 - "@typescript-eslint/scope-manager": 6.13.2 - "@typescript-eslint/types": 6.13.2 - "@typescript-eslint/typescript-estree": 6.13.2(typescript@5.3.3) - eslint: 8.55.0 + "@typescript-eslint/scope-manager": 6.16.0 + "@typescript-eslint/types": 6.16.0 + "@typescript-eslint/typescript-estree": 6.16.0(typescript@5.3.3) + eslint: 8.56.0 semver: 7.5.4 transitivePeerDependencies: - supports-color - typescript dev: false - /@typescript-eslint/visitor-keys@6.13.2: + /@typescript-eslint/visitor-keys@6.16.0: resolution: { - integrity: sha512-OGznFs0eAQXJsp+xSd6k/O1UbFi/K/L7WjqeRoFE7vadjAF9y0uppXhYNQNEqygjou782maGClOoZwPqF0Drlw==, + integrity: sha512-QSFQLruk7fhs91a/Ep/LqRdbJCZ1Rq03rqBdKT5Ky17Sz8zRLUksqIe9DW0pKtg/Z35/ztbLQ6qpOCN6rOC11A==, } engines: { node: ^16.0.0 || >=18.0.0 } dependencies: - "@typescript-eslint/types": 6.13.2 + "@typescript-eslint/types": 6.16.0 eslint-visitor-keys: 3.4.3 dev: false - /@uiw/codemirror-themes@4.21.21(@codemirror/language@6.9.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3): + /@uiw/codemirror-themes@4.21.21(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0): resolution: { integrity: sha512-ljVcMGdaxo75UaH+EqxJ+jLyMVVgeSfW2AKyT1VeLy+4SDpuqNQ7wq5XVxktsG6LH+OvgSFndWXgPANf4+gQcA==, @@ -2817,9 +5241,9 @@ packages: "@codemirror/state": ">=6.0.0" "@codemirror/view": ">=6.0.0" dependencies: - "@codemirror/language": 6.9.3 - "@codemirror/state": 6.3.3 - "@codemirror/view": 6.22.3 + "@codemirror/language": 6.10.0 + "@codemirror/state": 6.4.0 + "@codemirror/view": 6.23.0 dev: false /@ungap/structured-clone@1.2.0: @@ -2857,163 +5281,184 @@ packages: "@unhead/schema": 1.8.9 dev: false - /@vcarl/remark-headings@0.1.0: + /@urql/core@2.3.6(graphql@15.8.0): resolution: { - integrity: sha512-ffQxJUcapJ9Bk+fiGN49YJ9RaYMibrSTSezB1Fcrtu+0YSZxA3bsaLlIv1u/4sjPIeW/BKrs4xtMT3l3P9Ba5Q==, + integrity: sha512-PUxhtBh7/8167HJK6WqBv6Z0piuiaZHQGYbhwpNL9aIQmLROPEdaUYkY4wh45wPQXcTpnd11l0q3Pw+TI11pdw==, } + peerDependencies: + graphql: ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: - mdast-util-to-string: 3.2.0 - unist-util-visit: 4.1.2 + "@graphql-typed-document-node/core": 3.2.0(graphql@15.8.0) + graphql: 15.8.0 + wonka: 4.0.15 dev: false - /@vue/compiler-core@3.3.13: + /@urql/exchange-retry@0.3.0(graphql@15.8.0): resolution: { - integrity: sha512-bwi9HShGu7uaZLOErZgsH2+ojsEdsjerbf2cMXPwmvcgZfVPZ2BVZzCVnwZBxTAYd6Mzbmf6izcUNDkWnBBQ6A==, + integrity: sha512-hHqer2mcdVC0eYnVNbWyi28AlGOPb2vjH3lP3/Bc8Lc8BjhMsDwFMm7WhoP5C1+cfbr/QJ6Er3H/L08wznXxfg==, } + peerDependencies: + graphql: ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 dependencies: - "@babel/parser": 7.23.6 - "@vue/shared": 3.3.13 - estree-walker: 2.0.2 - source-map-js: 1.0.2 + "@urql/core": 2.3.6(graphql@15.8.0) + graphql: 15.8.0 + wonka: 4.0.15 dev: false - /@vue/compiler-dom@3.3.13: + /@vcarl/remark-headings@0.1.0: resolution: { - integrity: sha512-EYRDpbLadGtNL0Gph+HoKiYqXLqZ0xSSpR5Dvnu/Ep7ggaCbjRDIus1MMxTS2Qm0koXED4xSlvTZaTnI8cYAsw==, + integrity: sha512-ffQxJUcapJ9Bk+fiGN49YJ9RaYMibrSTSezB1Fcrtu+0YSZxA3bsaLlIv1u/4sjPIeW/BKrs4xtMT3l3P9Ba5Q==, } dependencies: - "@vue/compiler-core": 3.3.13 - "@vue/shared": 3.3.13 + mdast-util-to-string: 3.2.0 + unist-util-visit: 4.1.2 dev: false - /@vue/compiler-sfc@3.3.13: + /@vue/compiler-core@3.4.3: resolution: { - integrity: sha512-DQVmHEy/EKIgggvnGRLx21hSqnr1smUS9Aq8tfxiiot8UR0/pXKHN9k78/qQ7etyQTFj5em5nruODON7dBeumw==, + integrity: sha512-u8jzgFg0EDtSrb/hG53Wwh1bAOQFtc1ZCegBpA/glyvTlgHl+tq13o1zvRfLbegYUw/E4mSTGOiCnAJ9SJ+lsg==, } dependencies: "@babel/parser": 7.23.6 - "@vue/compiler-core": 3.3.13 - "@vue/compiler-dom": 3.3.13 - "@vue/compiler-ssr": 3.3.13 - "@vue/reactivity-transform": 3.3.13 - "@vue/shared": 3.3.13 + "@vue/shared": 3.4.3 + entities: 4.5.0 estree-walker: 2.0.2 - magic-string: 0.30.5 - postcss: 8.4.32 source-map-js: 1.0.2 dev: false - /@vue/compiler-ssr@3.3.13: + /@vue/compiler-dom@3.4.3: resolution: { - integrity: sha512-d/P3bCeUGmkJNS1QUZSAvoCIW4fkOKK3l2deE7zrp0ypJEy+En2AcypIkqvcFQOcw3F0zt2VfMvNsA9JmExTaw==, + integrity: sha512-oGF1E9/htI6JWj/lTJgr6UgxNCtNHbM6xKVreBWeZL9QhRGABRVoWGAzxmtBfSOd+w0Zi5BY0Es/tlJrN6WgEg==, } dependencies: - "@vue/compiler-dom": 3.3.13 - "@vue/shared": 3.3.13 + "@vue/compiler-core": 3.4.3 + "@vue/shared": 3.4.3 dev: false - /@vue/reactivity-transform@3.3.13: + /@vue/compiler-sfc@3.4.3: resolution: { - integrity: sha512-oWnydGH0bBauhXvh5KXUy61xr9gKaMbtsMHk40IK9M4gMuKPJ342tKFarY0eQ6jef8906m35q37wwA8DMZOm5Q==, + integrity: sha512-NuJqb5is9I4uzv316VRUDYgIlPZCG8D+ARt5P4t5UDShIHKL25J3TGZAUryY/Aiy0DsY7srJnZL5ryB6DD63Zw==, } dependencies: "@babel/parser": 7.23.6 - "@vue/compiler-core": 3.3.13 - "@vue/shared": 3.3.13 + "@vue/compiler-core": 3.4.3 + "@vue/compiler-dom": 3.4.3 + "@vue/compiler-ssr": 3.4.3 + "@vue/shared": 3.4.3 estree-walker: 2.0.2 magic-string: 0.30.5 + postcss: 8.4.32 + source-map-js: 1.0.2 + dev: false + + /@vue/compiler-ssr@3.4.3: + resolution: + { + integrity: sha512-wnYQtMBkeFSxgSSQbYGQeXPhQacQiog2c6AlvMldQH6DB+gSXK/0F6DVXAJfEiuBSgBhUc8dwrrG5JQcqwalsA==, + } + dependencies: + "@vue/compiler-dom": 3.4.3 + "@vue/shared": 3.4.3 dev: false - /@vue/reactivity@3.3.13: + /@vue/reactivity@3.4.3: resolution: { - integrity: sha512-fjzCxceMahHhi4AxUBzQqqVhuA21RJ0COaWTbIBl1PruGW1CeY97louZzLi4smpYx+CHfFPPU/CS8NybbGvPKQ==, + integrity: sha512-q5f9HLDU+5aBKizXHAx0w4whkIANs1Muiq9R5YXm0HtorSlflqv9u/ohaMxuuhHWCji4xqpQ1eL04WvmAmGnFg==, } dependencies: - "@vue/shared": 3.3.13 + "@vue/shared": 3.4.3 dev: false - /@vue/runtime-core@3.3.13: + /@vue/runtime-core@3.4.3: resolution: { - integrity: sha512-1TzA5TvGuh2zUwMJgdfvrBABWZ7y8kBwBhm7BXk8rvdx2SsgcGfz2ruv2GzuGZNvL1aKnK8CQMV/jFOrxNQUMA==, + integrity: sha512-C1r6QhB1qY7D591RCSFhMULyzL9CuyrGc+3PpB0h7dU4Qqw6GNyo4BNFjHZVvsWncrUlKX3DIKg0Y7rNNr06NQ==, } dependencies: - "@vue/reactivity": 3.3.13 - "@vue/shared": 3.3.13 + "@vue/reactivity": 3.4.3 + "@vue/shared": 3.4.3 dev: false - /@vue/runtime-dom@3.3.13: + /@vue/runtime-dom@3.4.3: resolution: { - integrity: sha512-JJkpE8R/hJKXqVTgUoODwS5wqKtOsmJPEqmp90PDVGygtJ4C0PtOkcEYXwhiVEmef6xeXcIlrT3Yo5aQ4qkHhQ==, + integrity: sha512-wrsprg7An5Ec+EhPngWdPuzkp0BEUxAKaQtN9dPU/iZctPyD9aaXmVtehPJerdQxQale6gEnhpnfywNw3zOv2A==, } dependencies: - "@vue/runtime-core": 3.3.13 - "@vue/shared": 3.3.13 + "@vue/runtime-core": 3.4.3 + "@vue/shared": 3.4.3 csstype: 3.1.3 dev: false - /@vue/server-renderer@3.3.13(vue@3.3.13): + /@vue/server-renderer@3.4.3(vue@3.4.3): resolution: { - integrity: sha512-vSnN+nuf6iSqTL3Qgx/9A+BT+0Zf/VJOgF5uMZrKjYPs38GMYyAU1coDyBNHauehXDaP+zl73VhwWv0vBRBHcg==, + integrity: sha512-BUxt8oVGMKKsqSkM1uU3d3Houyfy4WAc2SpSQRebNd+XJGATVkW/rO129jkyL+kpB/2VRKzE63zwf5RtJ3XuZw==, } peerDependencies: - vue: 3.3.13 + vue: 3.4.3 dependencies: - "@vue/compiler-ssr": 3.3.13 - "@vue/shared": 3.3.13 - vue: 3.3.13(typescript@5.3.3) + "@vue/compiler-ssr": 3.4.3 + "@vue/shared": 3.4.3 + vue: 3.4.3(typescript@5.3.3) dev: false - /@vue/shared@3.3.13: + /@vue/shared@3.4.3: resolution: { - integrity: sha512-/zYUwiHD8j7gKx2argXEMCUXVST6q/21DFU0sTfNX0URJroCe3b1UF6vLJ3lQDfLNIiiRl2ONp7Nh5UVWS6QnA==, + integrity: sha512-rIwlkkP1n4uKrRzivAKPZIEkHiuwY5mmhMJ2nZKCBLz8lTUlE73rQh4n1OnnMurXt1vcUNyH4ZPfdh8QweTjpQ==, } dev: false - /@vueuse/core@10.7.0(vue@3.3.13): + /@vueuse/core@10.7.1(vue@3.4.3): resolution: { - integrity: sha512-4EUDESCHtwu44ZWK3Gc/hZUVhVo/ysvdtwocB5vcauSV4B7NiGY5972WnsojB3vRNdxvAt7kzJWE2h9h7C9d5w==, + integrity: sha512-74mWHlaesJSWGp1ihg76vAnfVq9NTv1YT0SYhAQ6zwFNdBkkP+CKKJmVOEHcdSnLXCXYiL5e7MaewblfiYLP7g==, } dependencies: "@types/web-bluetooth": 0.0.20 - "@vueuse/metadata": 10.7.0 - "@vueuse/shared": 10.7.0(vue@3.3.13) - vue-demi: 0.14.6(vue@3.3.13) + "@vueuse/metadata": 10.7.1 + "@vueuse/shared": 10.7.1(vue@3.4.3) + vue-demi: 0.14.6(vue@3.4.3) transitivePeerDependencies: - "@vue/composition-api" - vue dev: false - /@vueuse/metadata@10.7.0: + /@vueuse/metadata@10.7.1: resolution: { - integrity: sha512-GlaH7tKP2iBCZ3bHNZ6b0cl9g0CJK8lttkBNUX156gWvNYhTKEtbweWLm9rxCPIiwzYcr/5xML6T8ZUEt+DkvA==, + integrity: sha512-jX8MbX5UX067DYVsbtrmKn6eG6KMcXxLRLlurGkZku5ZYT3vxgBjui2zajvUZ18QLIjrgBkFRsu7CqTAg18QFw==, } dev: false - /@vueuse/shared@10.7.0(vue@3.3.13): + /@vueuse/shared@10.7.1(vue@3.4.3): resolution: { - integrity: sha512-kc00uV6CiaTdc3i1CDC4a3lBxzaBE9AgYNtFN87B5OOscqeWElj/uza8qVDmk7/U8JbqoONLbtqiLJ5LGRuqlw==, + integrity: sha512-v0jbRR31LSgRY/C5i5X279A/WQjD6/JsMzGa+eqt658oJ75IvQXAeONmwvEMrvJQKnRElq/frzBR7fhmWY5uLw==, } dependencies: - vue-demi: 0.14.6(vue@3.3.13) + vue-demi: 0.14.6(vue@3.4.3) transitivePeerDependencies: - "@vue/composition-api" - vue dev: false + /@xmldom/xmldom@0.7.13: + resolution: + { + integrity: sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==, + } + engines: { node: ">=10.0.0" } + dev: false + /@xmldom/xmldom@0.8.10: resolution: { @@ -3022,7 +5467,18 @@ packages: engines: { node: ">=10.0.0" } dev: false - /acorn-jsx@5.3.2(acorn@8.11.2): + /accepts@1.3.8: + resolution: + { + integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==, + } + engines: { node: ">= 0.6" } + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + dev: false + + /acorn-jsx@5.3.2(acorn@8.11.3): resolution: { integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, @@ -3030,7 +5486,7 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.11.2 + acorn: 8.11.3 /acorn-walk@8.3.1: resolution: @@ -3040,14 +5496,37 @@ packages: engines: { node: ">=0.4.0" } dev: true - /acorn@8.11.2: + /acorn@8.11.3: resolution: { - integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==, + integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==, } engines: { node: ">=0.4.0" } hasBin: 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 + + /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 + dev: false + /ajv-draft-04@1.0.0(ajv@8.12.0): resolution: { @@ -3085,6 +5564,24 @@ packages: uri-js: 4.4.1 dev: false + /ansi-escapes@4.3.2: + resolution: + { + integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==, + } + engines: { node: ">=8" } + dependencies: + type-fest: 0.21.3 + dev: false + + /ansi-regex@4.1.1: + resolution: + { + integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==, + } + engines: { node: ">=6" } + dev: false + /ansi-regex@5.0.1: resolution: { @@ -3092,6 +5589,24 @@ packages: } engines: { node: ">=8" } + /ansi-regex@6.0.1: + resolution: + { + integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==, + } + engines: { node: ">=12" } + dev: false + + /ansi-styles@3.2.1: + resolution: + { + integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==, + } + engines: { node: ">=4" } + dependencies: + color-convert: 1.9.3 + dev: false + /ansi-styles@4.3.0: resolution: { @@ -3101,6 +5616,21 @@ packages: dependencies: color-convert: 2.0.1 + /ansi-styles@6.2.1: + resolution: + { + integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==, + } + engines: { node: ">=12" } + dev: false + + /any-promise@1.3.0: + resolution: + { + integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==, + } + dev: false + /anymatch@3.1.3: resolution: { @@ -3112,6 +5642,20 @@ packages: picomatch: 2.3.1 dev: true + /application-config-path@0.1.1: + resolution: + { + integrity: sha512-zy9cHePtMP0YhwG+CfHm0bgwdnga2X3gZexpdCwEj//dpb+TKajtiC8REEUJUSq6Ab4f9cgNy2l8ObXzCXFkEw==, + } + dev: false + + /arg@4.1.0: + resolution: + { + integrity: sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==, + } + dev: false + /argparse@1.0.10: resolution: { @@ -3127,6 +5671,13 @@ packages: integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, } + /argsarray@0.0.1: + resolution: + { + integrity: sha512-u96dg2GcAKtpTrBdDoFIM7PjcBA+6rSP0OR94MOReNRyUECL6MtQt5XXmRr4qrftYaef9+l5hcpO5te7sML1Cg==, + } + dev: false + /array-union@2.1.0: resolution: { @@ -3144,6 +5695,13 @@ packages: printable-characters: 1.0.42 dev: true + /asap@2.0.6: + resolution: + { + integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==, + } + dev: false + /asynckit@0.4.0: resolution: { @@ -3151,19 +5709,123 @@ packages: } dev: false - /axios@1.6.2: + /at-least-node@1.0.0: + resolution: + { + integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==, + } + engines: { node: ">= 4.0.0" } + dev: false + + /axios@1.6.3: resolution: { - integrity: sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==, + integrity: sha512-fWyNdeawGam70jXSVlKl+SUNVcL6j6W79CuSIPfi6HnDUmSCH6gyUys/HrqHeA/wU0Az41rRgean494d0Jb+ww==, } dependencies: - follow-redirects: 1.15.3 + follow-redirects: 1.15.4 form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug dev: false + /babel-plugin-module-resolver@5.0.0: + resolution: + { + integrity: sha512-g0u+/ChLSJ5+PzYwLwP8Rp8Rcfowz58TJNCe+L/ui4rpzE/mg//JVX0EWBUYoxaextqnwuGHzfGp2hh0PPV25Q==, + } + engines: { node: ">= 16" } + dependencies: + find-babel-config: 2.0.0 + glob: 8.1.0 + pkg-up: 3.1.0 + reselect: 4.1.8 + resolve: 1.22.8 + dev: false + + /babel-plugin-polyfill-corejs2@0.4.7(@babel/core@7.23.7): + resolution: + { + integrity: sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ==, + } + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + "@babel/compat-data": 7.23.5 + "@babel/core": 7.23.7 + "@babel/helper-define-polyfill-provider": 0.4.4(@babel/core@7.23.7) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: false + + /babel-plugin-polyfill-corejs3@0.8.7(@babel/core@7.23.7): + resolution: + { + integrity: sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==, + } + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-define-polyfill-provider": 0.4.4(@babel/core@7.23.7) + core-js-compat: 3.35.0 + transitivePeerDependencies: + - supports-color + dev: false + + /babel-plugin-polyfill-regenerator@0.5.4(@babel/core@7.23.7): + resolution: + { + integrity: sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg==, + } + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + "@babel/core": 7.23.7 + "@babel/helper-define-polyfill-provider": 0.4.4(@babel/core@7.23.7) + transitivePeerDependencies: + - supports-color + dev: false + + /babel-plugin-react-native-web@0.18.12: + resolution: + { + integrity: sha512-4djr9G6fMdwQoD6LQ7hOKAm39+y12flWgovAqS1k5O8f42YQ3A1FFMyV5kKfetZuGhZO5BmNmOdRRZQ1TixtDw==, + } + dev: false + + /babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.23.7): + resolution: + { + integrity: sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==, + } + dependencies: + "@babel/plugin-syntax-flow": 7.23.3(@babel/core@7.23.7) + transitivePeerDependencies: + - "@babel/core" + dev: false + + /babel-preset-expo@9.5.2(@babel/core@7.23.7): + resolution: + { + integrity: sha512-hU1G1TDiikuXV6UDZjPnX+WdbjbtidDiYhftMEVrZQSst45pDPVBWbM41TUKrpJMwv4FypsLzK+378gnMPRVWQ==, + } + dependencies: + "@babel/plugin-proposal-decorators": 7.23.7(@babel/core@7.23.7) + "@babel/plugin-proposal-export-namespace-from": 7.18.9(@babel/core@7.23.7) + "@babel/plugin-proposal-object-rest-spread": 7.20.7(@babel/core@7.23.7) + "@babel/plugin-transform-react-jsx": 7.23.4(@babel/core@7.23.7) + "@babel/preset-env": 7.23.7(@babel/core@7.23.7) + babel-plugin-module-resolver: 5.0.0 + babel-plugin-react-native-web: 0.18.12 + metro-react-native-babel-preset: 0.76.8(@babel/core@7.23.7) + transitivePeerDependencies: + - "@babel/core" + - supports-color + dev: false + /bail@2.0.2: resolution: { @@ -3184,6 +5846,16 @@ packages: } dev: false + /better-opn@3.0.2: + resolution: + { + integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==, + } + engines: { node: ">=12.0.0" } + dependencies: + open: 8.4.2 + dev: false + /better-sqlite3@9.2.2: resolution: { @@ -3195,6 +5867,14 @@ packages: prebuild-install: 7.1.1 dev: false + /big-integer@1.6.52: + resolution: + { + integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==, + } + engines: { node: ">=0.6" } + dev: false + /binary-extensions@2.2.0: resolution: { @@ -3230,6 +5910,65 @@ packages: } dev: true + /blueimp-md5@2.19.0: + resolution: + { + integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==, + } + dev: false + + /body-parser@1.20.2: + resolution: + { + integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==, + } + engines: { node: ">= 0.8", npm: 1.2.8000 || >= 1.4.16 } + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /bplist-creator@0.1.0: + resolution: + { + integrity: sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==, + } + dependencies: + stream-buffers: 2.2.0 + dev: false + + /bplist-parser@0.3.1: + resolution: + { + integrity: sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==, + } + engines: { node: ">= 5.10.0" } + dependencies: + big-integer: 1.6.52 + dev: false + + /bplist-parser@0.3.2: + resolution: + { + integrity: sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==, + } + engines: { node: ">= 5.10.0" } + dependencies: + big-integer: 1.6.52 + dev: false + /brace-expansion@1.1.11: resolution: { @@ -3246,7 +5985,6 @@ packages: } dependencies: balanced-match: 1.0.2 - dev: true /braces@3.0.2: resolution: @@ -3257,6 +5995,44 @@ packages: dependencies: fill-range: 7.0.1 + /browserslist@4.22.2: + resolution: + { + integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==, + } + engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } + hasBin: true + dependencies: + caniuse-lite: 1.0.30001572 + electron-to-chromium: 1.4.616 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.22.2) + dev: false + + /buffer-alloc-unsafe@1.1.0: + resolution: + { + integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==, + } + dev: false + + /buffer-alloc@1.2.0: + resolution: + { + integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==, + } + dependencies: + buffer-alloc-unsafe: 1.1.0 + buffer-fill: 1.0.0 + dev: false + + /buffer-fill@1.0.0: + resolution: + { + integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==, + } + dev: false + /buffer-from@1.1.2: resolution: { @@ -3274,6 +6050,61 @@ packages: ieee754: 1.2.1 dev: false + /builtins@1.0.3: + resolution: + { + integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==, + } + dev: false + + /bytes@3.1.2: + resolution: + { + integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==, + } + engines: { node: ">= 0.8" } + dev: false + + /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.1.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 + + /call-bind@1.0.5: + resolution: + { + integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==, + } + dependencies: + function-bind: 1.1.2 + get-intrinsic: 1.2.2 + set-function-length: 1.1.1 + dev: false + /call-me-maybe@1.0.2: resolution: { @@ -3296,6 +6127,13 @@ packages: engines: { node: ">=14.16" } dev: true + /caniuse-lite@1.0.30001572: + resolution: + { + integrity: sha512-1Pbh5FLmn5y4+QhNyJE9j3/7dK44dGB83/ZMjv/qJk86TvDbjk0LosiZo0i0WB0Vx607qMX9jYrn1VLHCkN4rw==, + } + dev: false + /capnp-ts@0.7.0: resolution: { @@ -3315,6 +6153,18 @@ packages: } dev: false + /chalk@2.4.2: + resolution: + { + integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==, + } + engines: { node: ">=4" } + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: false + /chalk@4.1.2: resolution: { @@ -3354,6 +6204,13 @@ packages: } dev: false + /charenc@0.0.2: + resolution: + { + integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==, + } + dev: false + /chokidar@3.5.3: resolution: { @@ -3372,11 +6229,27 @@ packages: fsevents: 2.3.3 dev: true - /chownr@1.1.4: + /chownr@1.1.4: + resolution: + { + integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==, + } + dev: false + + /chownr@2.0.0: + resolution: + { + integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==, + } + engines: { node: ">=10" } + dev: false + + /ci-info@3.9.0: resolution: { - integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==, + integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==, } + engines: { node: ">=8" } dev: false /class-variance-authority@0.7.0: @@ -3388,6 +6261,14 @@ packages: clsx: 2.0.0 dev: false + /clean-stack@2.2.0: + resolution: + { + integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==, + } + engines: { node: ">=6" } + dev: false + /cli-color@2.0.3: resolution: { @@ -3402,6 +6283,40 @@ packages: timers-ext: 0.1.7 dev: true + /cli-cursor@2.1.0: + resolution: + { + integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==, + } + engines: { node: ">=4" } + dependencies: + restore-cursor: 2.0.0 + dev: false + + /cli-spinners@2.9.2: + resolution: + { + integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==, + } + engines: { node: ">=6" } + dev: false + + /clone@1.0.4: + resolution: + { + integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==, + } + engines: { node: ">=0.8" } + dev: false + + /clone@2.1.2: + resolution: + { + integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==, + } + engines: { node: ">=0.8" } + dev: false + /clsx@2.0.0: resolution: { @@ -3410,23 +6325,32 @@ packages: engines: { node: ">=6" } dev: false - /codemirror@6.0.1(@lezer/common@1.1.2): + /codemirror@6.0.1(@lezer/common@1.2.0): resolution: { integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==, } dependencies: - "@codemirror/autocomplete": 6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.3)(@codemirror/view@6.22.3)(@lezer/common@1.1.2) - "@codemirror/commands": 6.3.2 - "@codemirror/language": 6.9.3 + "@codemirror/autocomplete": 6.11.1(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0) + "@codemirror/commands": 6.3.3 + "@codemirror/language": 6.10.0 "@codemirror/lint": 6.4.2 "@codemirror/search": 6.5.5 - "@codemirror/state": 6.3.3 - "@codemirror/view": 6.22.3 + "@codemirror/state": 6.4.0 + "@codemirror/view": 6.23.0 transitivePeerDependencies: - "@lezer/common" dev: false + /color-convert@1.9.3: + resolution: + { + integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, + } + dependencies: + color-name: 1.1.3 + dev: false + /color-convert@2.0.1: resolution: { @@ -3436,6 +6360,13 @@ packages: dependencies: color-name: 1.1.4 + /color-name@1.1.3: + resolution: + { + integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, + } + dev: false + /color-name@1.1.4: resolution: { @@ -3459,6 +6390,29 @@ packages: } dev: false + /command-exists@1.2.9: + resolution: + { + integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==, + } + dev: false + + /commander@4.1.1: + resolution: + { + integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==, + } + engines: { node: ">= 6" } + dev: false + + /commander@7.2.0: + resolution: + { + integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==, + } + engines: { node: ">= 10" } + dev: false + /commander@9.5.0: resolution: { @@ -3467,12 +6421,41 @@ packages: engines: { node: ^12.20.0 || >=14 } dev: true + /compare-versions@3.6.0: + resolution: + { + integrity: sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==, + } + dev: false + + /component-type@1.2.2: + resolution: + { + integrity: sha512-99VUHREHiN5cLeHm3YLq312p6v+HUEcwtLCAtelvUDI6+SH5g5Cr85oNR2S1o6ywzL0ykMbuwLzM2ANocjEOIA==, + } + dev: false + /concat-map@0.0.1: resolution: { integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, } + /connect@3.7.0: + resolution: + { + integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==, + } + engines: { node: ">= 0.10.0" } + dependencies: + debug: 2.6.9 + finalhandler: 1.1.2 + parseurl: 1.3.3 + utils-merge: 1.0.1 + transitivePeerDependencies: + - supports-color + dev: false + /content-type@1.0.5: resolution: { @@ -3481,6 +6464,13 @@ packages: engines: { node: ">= 0.6" } dev: false + /convert-source-map@2.0.0: + resolution: + { + integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, + } + dev: false + /cookie@0.5.0: resolution: { @@ -3499,6 +6489,15 @@ packages: is-what: 4.1.16 dev: true + /core-js-compat@3.35.0: + resolution: + { + integrity: sha512-5blwFAddknKeNgsjBzilkdQ0+YK8L1PfqPYq40NOYMYFSS38qj+hpTcLLWwpIwA2A5bje/x5jmVn2tzUMg9IVw==, + } + dependencies: + browserslist: 4.22.2 + dev: false + /crelt@1.0.6: resolution: { @@ -3506,6 +6505,31 @@ packages: } dev: false + /cross-fetch@3.1.8: + resolution: + { + integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==, + } + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: false + + /cross-spawn@6.0.5: + resolution: + { + integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==, + } + engines: { node: ">=4.8" } + dependencies: + nice-try: 1.0.5 + path-key: 2.0.1 + semver: 5.7.2 + shebang-command: 1.2.0 + which: 1.3.1 + dev: false + /cross-spawn@7.0.3: resolution: { @@ -3517,6 +6541,29 @@ packages: shebang-command: 2.0.0 which: 2.0.2 + /crypt@0.0.2: + resolution: + { + integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==, + } + dev: false + + /crypto-random-string@1.0.0: + resolution: + { + integrity: sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==, + } + engines: { node: ">=4" } + dev: false + + /crypto-random-string@2.0.0: + resolution: + { + integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==, + } + engines: { node: ">=8" } + dev: false + /cssesc@3.0.0: resolution: { @@ -3558,6 +6605,13 @@ packages: type: 1.2.0 dev: true + /dag-map@1.0.2: + resolution: + { + integrity: sha512-+LSAiGFwQ9dRnRdOeaj7g47ZFJcOUPukAP8J3A3fuZ1g9Y44BG+P1sgApjLXTQPOzC4+7S9Wr8kXsfpINM4jpw==, + } + dev: false + /data-uri-to-buffer@2.0.2: resolution: { @@ -3573,6 +6627,34 @@ packages: engines: { node: ">= 12" } dev: false + /debug@2.6.9: + resolution: + { + integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==, + } + peerDependencies: + supports-color: "*" + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: false + + /debug@3.2.7: + resolution: + { + integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==, + } + peerDependencies: + supports-color: "*" + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: false + /debug@4.3.4: resolution: { @@ -3620,6 +6702,63 @@ packages: integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, } + /default-gateway@4.2.0: + resolution: + { + integrity: sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==, + } + engines: { node: ">=6" } + dependencies: + execa: 1.0.0 + ip-regex: 2.1.0 + dev: false + + /defaults@1.0.4: + resolution: + { + integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==, + } + dependencies: + clone: 1.0.4 + dev: false + + /define-data-property@1.1.1: + resolution: + { + integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==, + } + engines: { node: ">= 0.4" } + dependencies: + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + dev: false + + /define-lazy-prop@2.0.0: + resolution: + { + integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==, + } + engines: { node: ">=8" } + dev: false + + /del@6.1.1: + resolution: + { + integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==, + } + engines: { node: ">=10" } + dependencies: + globby: 11.1.0 + graceful-fs: 4.2.11 + is-glob: 4.0.3 + is-path-cwd: 2.2.0 + is-path-inside: 3.0.3 + p-map: 4.0.0 + rimraf: 3.0.2 + slash: 3.0.0 + dev: false + /delayed-stream@1.0.0: resolution: { @@ -3628,6 +6767,14 @@ packages: engines: { node: ">=0.4.0" } dev: false + /depd@2.0.0: + resolution: + { + integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==, + } + engines: { node: ">= 0.8" } + dev: false + /dequal@2.0.3: resolution: { @@ -3636,6 +6783,23 @@ packages: engines: { node: ">=6" } dev: false + /destroy@1.2.0: + resolution: + { + integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==, + } + engines: { node: ">= 0.8", npm: 1.2.8000 || >= 1.4.16 } + dev: false + + /detect-libc@1.0.3: + resolution: + { + integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==, + } + engines: { node: ">=0.10" } + hasBin: true + dev: false + /detect-libc@2.0.2: resolution: { @@ -3681,6 +6845,22 @@ packages: dependencies: esutils: 2.0.3 + /dotenv-expand@10.0.0: + resolution: + { + integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==, + } + engines: { node: ">=12" } + dev: false + + /dotenv@16.0.3: + resolution: + { + integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==, + } + engines: { node: ">=12" } + dev: false + /dotenv@16.3.1: resolution: { @@ -3699,37 +6879,35 @@ packages: wordwrap: 1.0.0 dev: true - /drizzle-kit@0.20.6: + /drizzle-kit@0.20.9: resolution: { - integrity: sha512-+AYQY+tJUnfMJYIeh6aEjI21mpMCekqz0LEu2QdFdc/3zSmjyfEhH5dkXlRFME8v1rtisiHfp7bP+gVVKDPiUg==, + integrity: sha512-5oIbPFdfEEfzVSOB3MWGt70VSHv6W7qMAWCJ5xc6W1BxgGASipxuAuyXD59fx9S6QYTNNnuSuQFoIdnNTRWY2A==, } hasBin: true dependencies: - "@drizzle-team/studio": 0.0.35 + "@drizzle-team/studio": 0.0.37 "@esbuild-kit/esm-loader": 2.6.5 camelcase: 7.0.1 chalk: 5.3.0 commander: 9.5.0 - esbuild: 0.19.8 - esbuild-register: 3.5.0(esbuild@0.19.8) + env-paths: 3.0.0 + esbuild: 0.19.11 + esbuild-register: 3.5.0(esbuild@0.19.11) glob: 8.1.0 hanji: 0.0.5 json-diff: 0.9.0 minimatch: 7.4.6 semver: 7.5.4 - wrangler: 3.19.0 zod: 3.22.4 transitivePeerDependencies: - - bufferutil - supports-color - - utf-8-validate dev: true - /drizzle-orm@0.29.1(@cloudflare/workers-types@4.20231121.0)(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2): + /drizzle-orm@0.29.2(@cloudflare/workers-types@4.20231218.0)(@libsql/client@0.4.0-pre.5)(@types/react@18.2.46)(better-sqlite3@9.2.2)(expo-sqlite@13.2.0)(react@18.2.0): resolution: { - integrity: sha512-yItc4unfHnk8XkDD3/bdC63vdboTY7e7I03lCF1OJYABXSIfQYU9BFTQJXMMovVeb3T1/OJWwfW/70T1XPnuUA==, + integrity: sha512-BhwCwuSQqUoLVc7wtgIkuWexY127Z9+yDbuXU7QWZbMC2XE48jecvAThW9apQaDoaxQmwQ+ObyPfPb4zL4Bgsw==, } peerDependencies: "@aws-sdk/client-rds-data": ">=3" @@ -3740,15 +6918,18 @@ packages: "@planetscale/database": ">=1" "@types/better-sqlite3": "*" "@types/pg": "*" + "@types/react": ">=18" "@types/sql.js": "*" "@vercel/postgres": "*" better-sqlite3: ">=7" bun-types: "*" + expo-sqlite: ">=13.2.0" knex: "*" kysely: "*" mysql2: ">=2" pg: ">=8" postgres: ">=3" + react: ">=18" sql.js: ">=1" sqlite3: ">=5" peerDependenciesMeta: @@ -3791,22 +6972,68 @@ packages: sqlite3: optional: true dependencies: - "@cloudflare/workers-types": 4.20231121.0 + "@cloudflare/workers-types": 4.20231218.0 "@libsql/client": 0.4.0-pre.5 + "@types/react": 18.2.46 better-sqlite3: 9.2.2 + expo-sqlite: 13.2.0(expo@49.0.21) + react: 18.2.0 dev: false - /drizzle-zod@0.5.1(drizzle-orm@0.29.1)(zod@3.22.4): + /drizzle-zod@0.5.1(drizzle-orm@0.29.2)(zod@3.22.4): resolution: { integrity: sha512-C/8bvzUH/zSnVfwdSibOgFjLhtDtbKYmkbPbUCq46QZyZCH6kODIMSOgZ8R7rVjoI+tCj3k06MRJMDqsIeoS4A==, } - peerDependencies: - drizzle-orm: ">=0.23.13" - zod: "*" - dependencies: - drizzle-orm: 0.29.1(@cloudflare/workers-types@4.20231121.0)(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2) - zod: 3.22.4 + peerDependencies: + drizzle-orm: ">=0.23.13" + zod: "*" + dependencies: + drizzle-orm: 0.29.2(@cloudflare/workers-types@4.20231218.0)(@libsql/client@0.4.0-pre.5)(@types/react@18.2.46)(better-sqlite3@9.2.2)(expo-sqlite@13.2.0)(react@18.2.0) + zod: 3.22.4 + dev: false + + /eastasianwidth@0.2.0: + resolution: + { + integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, + } + dev: false + + /ee-first@1.1.1: + resolution: + { + integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==, + } + dev: false + + /electron-to-chromium@1.4.616: + resolution: + { + integrity: sha512-1n7zWYh8eS0L9Uy+GskE0lkBUNK83cXTVJI0pU3mGprFsbfSdAc15VTFbo+A+Bq4pwstmL30AVcEU3Fo463lNg==, + } + dev: false + + /emoji-regex@8.0.0: + resolution: + { + integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, + } + dev: false + + /emoji-regex@9.2.2: + resolution: + { + integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, + } + dev: false + + /encodeurl@1.0.2: + resolution: + { + integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==, + } + engines: { node: ">= 0.8" } dev: false /end-of-stream@1.4.4: @@ -3826,6 +7053,29 @@ packages: engines: { node: ">=0.12" } dev: false + /env-editor@0.4.2: + resolution: + { + integrity: sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==, + } + engines: { node: ">=8" } + dev: false + + /env-paths@3.0.0: + resolution: + { + integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dev: true + + /eol@0.9.1: + resolution: + { + integrity: sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==, + } + dev: false + /es5-ext@0.10.62: resolution: { @@ -3872,7 +7122,7 @@ packages: es6-symbol: 3.1.3 dev: true - /esbuild-register@3.5.0(esbuild@0.19.8): + /esbuild-register@3.5.0(esbuild@0.19.11): resolution: { integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==, @@ -3881,7 +7131,7 @@ packages: esbuild: ">=0.12 <1" dependencies: debug: 4.3.4 - esbuild: 0.19.8 + esbuild: 0.19.11 transitivePeerDependencies: - supports-color dev: true @@ -3952,38 +7202,62 @@ packages: "@esbuild/win32-x64": 0.18.20 dev: true - /esbuild@0.19.8: + /esbuild@0.19.11: resolution: { - integrity: sha512-l7iffQpT2OrZfH2rXIp7/FkmaeZM0vxbxN9KfiCwGYuZqzMg/JdvX26R31Zxn/Pxvsrg3Y9N6XTcnknqDyyv4w==, + integrity: sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==, } engines: { node: ">=12" } hasBin: true requiresBuild: true optionalDependencies: - "@esbuild/android-arm": 0.19.8 - "@esbuild/android-arm64": 0.19.8 - "@esbuild/android-x64": 0.19.8 - "@esbuild/darwin-arm64": 0.19.8 - "@esbuild/darwin-x64": 0.19.8 - "@esbuild/freebsd-arm64": 0.19.8 - "@esbuild/freebsd-x64": 0.19.8 - "@esbuild/linux-arm": 0.19.8 - "@esbuild/linux-arm64": 0.19.8 - "@esbuild/linux-ia32": 0.19.8 - "@esbuild/linux-loong64": 0.19.8 - "@esbuild/linux-mips64el": 0.19.8 - "@esbuild/linux-ppc64": 0.19.8 - "@esbuild/linux-riscv64": 0.19.8 - "@esbuild/linux-s390x": 0.19.8 - "@esbuild/linux-x64": 0.19.8 - "@esbuild/netbsd-x64": 0.19.8 - "@esbuild/openbsd-x64": 0.19.8 - "@esbuild/sunos-x64": 0.19.8 - "@esbuild/win32-arm64": 0.19.8 - "@esbuild/win32-ia32": 0.19.8 - "@esbuild/win32-x64": 0.19.8 - dev: true + "@esbuild/aix-ppc64": 0.19.11 + "@esbuild/android-arm": 0.19.11 + "@esbuild/android-arm64": 0.19.11 + "@esbuild/android-x64": 0.19.11 + "@esbuild/darwin-arm64": 0.19.11 + "@esbuild/darwin-x64": 0.19.11 + "@esbuild/freebsd-arm64": 0.19.11 + "@esbuild/freebsd-x64": 0.19.11 + "@esbuild/linux-arm": 0.19.11 + "@esbuild/linux-arm64": 0.19.11 + "@esbuild/linux-ia32": 0.19.11 + "@esbuild/linux-loong64": 0.19.11 + "@esbuild/linux-mips64el": 0.19.11 + "@esbuild/linux-ppc64": 0.19.11 + "@esbuild/linux-riscv64": 0.19.11 + "@esbuild/linux-s390x": 0.19.11 + "@esbuild/linux-x64": 0.19.11 + "@esbuild/netbsd-x64": 0.19.11 + "@esbuild/openbsd-x64": 0.19.11 + "@esbuild/sunos-x64": 0.19.11 + "@esbuild/win32-arm64": 0.19.11 + "@esbuild/win32-ia32": 0.19.11 + "@esbuild/win32-x64": 0.19.11 + dev: true + + /escalade@3.1.1: + resolution: + { + integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==, + } + engines: { node: ">=6" } + dev: false + + /escape-html@1.0.3: + resolution: + { + integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==, + } + dev: false + + /escape-string-regexp@1.0.5: + resolution: + { + integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==, + } + engines: { node: ">=0.8.0" } + dev: false /escape-string-regexp@4.0.0: resolution: @@ -4017,18 +7291,18 @@ packages: } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - /eslint@8.55.0: + /eslint@8.56.0: resolution: { - integrity: sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==, + integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } hasBin: true dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.55.0) + "@eslint-community/eslint-utils": 4.4.0(eslint@8.56.0) "@eslint-community/regexpp": 4.10.0 "@eslint/eslintrc": 2.1.4 - "@eslint/js": 8.55.0 + "@eslint/js": 8.56.0 "@humanwhocodes/config-array": 0.11.13 "@humanwhocodes/module-importer": 1.0.1 "@nodelib/fs.walk": 1.2.8 @@ -4048,7 +7322,7 @@ packages: file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.23.0 + globals: 13.24.0 graphemer: 1.4.0 ignore: 5.3.0 imurmurhash: 0.1.4 @@ -4073,8 +7347,8 @@ packages: } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dependencies: - acorn: 8.11.2 - acorn-jsx: 5.3.2(acorn@8.11.2) + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) eslint-visitor-keys: 3.4.3 /esprima@4.0.1: @@ -4132,6 +7406,14 @@ packages: } engines: { node: ">=0.10.0" } + /etag@1.8.1: + resolution: + { + integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==, + } + engines: { node: ">= 0.6" } + dev: false + /event-emitter@0.3.5: resolution: { @@ -4142,6 +7424,29 @@ packages: es5-ext: 0.10.62 dev: true + /exec-async@2.2.0: + resolution: + { + integrity: sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==, + } + dev: false + + /execa@1.0.0: + resolution: + { + integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==, + } + engines: { node: ">=6" } + dependencies: + cross-spawn: 6.0.5 + get-stream: 4.1.0 + is-stream: 1.1.0 + npm-run-path: 2.0.2 + p-finally: 1.0.0 + signal-exit: 3.0.7 + strip-eof: 1.0.0 + dev: false + /exit-hook@2.2.1: resolution: { @@ -4158,6 +7463,160 @@ packages: engines: { node: ">=6" } dev: false + /expo-application@5.3.1(expo@49.0.21): + resolution: + { + integrity: sha512-HR2+K+Hm33vLw/TfbFaHrvUbRRNRco8R+3QaCKy7eJC2LFfT05kZ15ynGaKfB5DJ/oqPV3mxXVR/EfwmE++hoA==, + } + peerDependencies: + expo: "*" + dependencies: + expo: 49.0.21(@babel/core@7.23.7) + dev: false + + /expo-asset@8.10.1(expo@49.0.21): + resolution: + { + integrity: sha512-5VMTESxgY9GBsspO/esY25SKEa7RyascVkLe/OcL1WgblNFm7xCCEEUIW8VWS1nHJQGYxpMZPr3bEfjMpdWdyA==, + } + dependencies: + blueimp-md5: 2.19.0 + expo-constants: 14.4.2(expo@49.0.21) + expo-file-system: 15.4.5(expo@49.0.21) + invariant: 2.2.4 + md5-file: 3.2.3 + path-browserify: 1.0.1 + url-parse: 1.5.10 + transitivePeerDependencies: + - expo + - supports-color + dev: false + + /expo-constants@14.4.2(expo@49.0.21): + resolution: + { + integrity: sha512-nOB122DOAjk+KrJT69lFQAoYVQGQjFHSigCPVBzVdko9S1xGsfiOH9+X5dygTsZTIlVLpQJDdmZ7ONiv3i+26w==, + } + peerDependencies: + expo: "*" + dependencies: + "@expo/config": 8.1.2 + expo: 49.0.21(@babel/core@7.23.7) + uuid: 3.4.0 + transitivePeerDependencies: + - supports-color + dev: false + + /expo-file-system@15.4.5(expo@49.0.21): + resolution: + { + integrity: sha512-xy61KaTaDgXhT/dllwYDHm3ch026EyO8j4eC6wSVr/yE12MMMxAC09yGwy4f7kkOs6ztGVQF5j7ldRzNLN4l0Q==, + } + peerDependencies: + expo: "*" + dependencies: + expo: 49.0.21(@babel/core@7.23.7) + uuid: 3.4.0 + dev: false + + /expo-font@11.4.0(expo@49.0.21): + resolution: + { + integrity: sha512-nkmezCFD7gR/I6R+e3/ry18uEfF8uYrr6h+PdBJu+3dawoLOpo+wFb/RG9bHUekU1/cPanR58LR7G5MEMKHR2w==, + } + peerDependencies: + expo: "*" + dependencies: + expo: 49.0.21(@babel/core@7.23.7) + fontfaceobserver: 2.3.0 + dev: false + + /expo-keep-awake@12.3.0(expo@49.0.21): + resolution: + { + integrity: sha512-ujiJg1p9EdCOYS05jh5PtUrfiZnK0yyLy+UewzqrjUqIT8eAGMQbkfOn3C3fHE7AKd5AefSMzJnS3lYZcZYHDw==, + } + peerDependencies: + expo: "*" + dependencies: + expo: 49.0.21(@babel/core@7.23.7) + dev: false + + /expo-modules-autolinking@1.5.1: + resolution: + { + integrity: sha512-yt5a1VCp2BF9CrsO689PCD5oXKP14MMhnOanQMvDn4BDpURYfzAlDVGC5fZrNQKtwn/eq3bcrxIwZ7D9QjVVRg==, + } + hasBin: true + dependencies: + "@expo/config": 8.1.2 + chalk: 4.1.2 + commander: 7.2.0 + fast-glob: 3.3.2 + find-up: 5.0.0 + fs-extra: 9.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /expo-modules-core@1.5.12: + resolution: + { + integrity: sha512-mY4wTDU458dhwk7IVxLNkePlYXjs9BTgk4NQHBUXf0LapXsvr+i711qPZaFNO4egf5qq6fQV+Yfd/KUguHstnQ==, + } + dependencies: + compare-versions: 3.6.0 + invariant: 2.2.4 + dev: false + + /expo-sqlite@13.2.0(expo@49.0.21): + resolution: + { + integrity: sha512-TYpX+a+2oJOxzChug8+TkIob0lipl7rluCRBGXbGKG68kG4Reb6OCruRiQTJTnbGiEgnN4S+B0cT8f4ZXPUxBg==, + } + peerDependencies: + expo: "*" + dependencies: + "@expo/websql": 1.0.1 + expo: 49.0.21(@babel/core@7.23.7) + dev: false + + /expo@49.0.21(@babel/core@7.23.7): + resolution: + { + integrity: sha512-JpHL6V0yt8/fzsmkAdPdtsah+lU6Si4ac7MDklLYvzEil7HAFEsN/pf06wQ21ax4C+BL27hI6JJoD34tzXUCJA==, + } + hasBin: true + dependencies: + "@babel/runtime": 7.23.7 + "@expo/cli": 0.10.16(expo-modules-autolinking@1.5.1) + "@expo/config": 8.1.2 + "@expo/config-plugins": 7.2.5 + "@expo/vector-icons": 13.0.0 + babel-preset-expo: 9.5.2(@babel/core@7.23.7) + expo-application: 5.3.1(expo@49.0.21) + expo-asset: 8.10.1(expo@49.0.21) + expo-constants: 14.4.2(expo@49.0.21) + expo-file-system: 15.4.5(expo@49.0.21) + expo-font: 11.4.0(expo@49.0.21) + expo-keep-awake: 12.3.0(expo@49.0.21) + expo-modules-autolinking: 1.5.1 + expo-modules-core: 1.5.12 + fbemitter: 3.0.0 + invariant: 2.2.4 + md5-file: 3.2.3 + node-fetch: 2.7.0 + pretty-format: 26.6.2 + uuid: 3.4.0 + transitivePeerDependencies: + - "@babel/core" + - bluebird + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: false + /ext@1.7.0: resolution: { @@ -4206,14 +7665,49 @@ packages: integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, } - /fastq@1.15.0: + /fastq@1.16.0: resolution: { - integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==, + integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==, } dependencies: reusify: 1.0.4 + /fbemitter@3.0.0: + resolution: + { + integrity: sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==, + } + dependencies: + fbjs: 3.0.5 + transitivePeerDependencies: + - encoding + dev: false + + /fbjs-css-vars@1.0.2: + resolution: + { + integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==, + } + dev: false + + /fbjs@3.0.5: + resolution: + { + integrity: sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==, + } + dependencies: + cross-fetch: 3.1.8 + fbjs-css-vars: 1.0.2 + loose-envify: 1.4.0 + object-assign: 4.1.1 + promise: 7.3.1 + setimmediate: 1.0.5 + ua-parser-js: 1.0.37 + transitivePeerDependencies: + - encoding + dev: false + /fetch-blob@3.2.0: resolution: { @@ -4225,6 +7719,13 @@ packages: web-streams-polyfill: 3.2.1 dev: false + /fetch-retry@4.1.1: + resolution: + { + integrity: sha512-e6eB7zN6UBSwGVwrbWVH+gdLnkW9WwHhmq2YDK1Sh30pzx1onRVGBvogTlUeWxwTa+L86NYdo4hFkh7O8ZjSnA==, + } + dev: false + /fetch-retry@5.0.6: resolution: { @@ -4257,6 +7758,45 @@ packages: dependencies: to-regex-range: 5.0.1 + /finalhandler@1.1.2: + resolution: + { + integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==, + } + engines: { node: ">= 0.8" } + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.3.0 + parseurl: 1.3.3 + statuses: 1.5.0 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /find-babel-config@2.0.0: + resolution: + { + integrity: sha512-dOKT7jvF3hGzlW60Gc3ONox/0rRZ/tz7WCil0bqA1In/3I8f1BctpXahRnEKDySZqci7u+dqq93sZST9fOJpFw==, + } + engines: { node: ">=16.0.0" } + dependencies: + json5: 2.2.3 + path-exists: 4.0.0 + dev: false + + /find-up@3.0.0: + resolution: + { + integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==, + } + engines: { node: ">=6" } + dependencies: + locate-path: 3.0.0 + dev: false + /find-up@5.0.0: resolution: { @@ -4267,6 +7807,15 @@ packages: locate-path: 6.0.0 path-exists: 4.0.0 + /find-yarn-workspace-root@2.0.0: + resolution: + { + integrity: sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==, + } + dependencies: + micromatch: 4.0.5 + dev: false + /flat-cache@3.2.0: resolution: { @@ -4284,10 +7833,10 @@ packages: integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==, } - /follow-redirects@1.15.3: + /follow-redirects@1.15.4: resolution: { - integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==, + integrity: sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==, } engines: { node: ">=4.0" } peerDependencies: @@ -4297,6 +7846,36 @@ packages: optional: true dev: false + /fontfaceobserver@2.3.0: + resolution: + { + integrity: sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==, + } + dev: false + + /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: false + + /form-data@3.0.1: + resolution: + { + integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==, + } + engines: { node: ">= 6" } + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + /form-data@4.0.0: resolution: { @@ -4330,11 +7909,75 @@ packages: fetch-blob: 3.2.0 dev: false + /freeport-async@2.0.0: + resolution: + { + integrity: sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==, + } + engines: { node: ">=8" } + dev: false + + /fresh@0.5.2: + resolution: + { + integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==, + } + engines: { node: ">= 0.6" } + dev: false + /fs-constants@1.0.0: resolution: { - integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==, + integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==, + } + dev: false + + /fs-extra@8.1.0: + resolution: + { + integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==, + } + engines: { node: ">=6 <7 || >=8" } + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: false + + /fs-extra@9.0.0: + resolution: + { + integrity: sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==, + } + engines: { node: ">=10" } + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 1.0.0 + dev: false + + /fs-extra@9.1.0: + resolution: + { + integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==, + } + engines: { node: ">=10" } + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: false + + /fs-minipass@2.1.0: + resolution: + { + integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==, } + engines: { node: ">= 8" } + dependencies: + minipass: 3.1.6 dev: false /fs.realpath@1.0.0: @@ -4354,6 +7997,13 @@ packages: dev: true optional: true + /function-bind@1.1.2: + resolution: + { + integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, + } + dev: false + /fuse.js@6.6.2: resolution: { @@ -4362,6 +8012,26 @@ packages: engines: { node: ">=10" } dev: false + /gensync@1.0.0-beta.2: + resolution: + { + integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, + } + engines: { node: ">=6.9.0" } + dev: false + + /get-intrinsic@1.2.2: + resolution: + { + integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==, + } + dependencies: + function-bind: 1.1.2 + has-proto: 1.0.1 + has-symbols: 1.0.3 + hasown: 2.0.0 + dev: false + /get-own-enumerable-property-symbols@3.0.2: resolution: { @@ -4369,6 +8039,14 @@ packages: } dev: false + /get-port@3.2.0: + resolution: + { + integrity: sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==, + } + engines: { node: ">=4" } + dev: false + /get-source@2.0.12: resolution: { @@ -4379,6 +8057,16 @@ packages: source-map: 0.6.1 dev: true + /get-stream@4.1.0: + resolution: + { + integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==, + } + engines: { node: ">=6" } + dependencies: + pump: 3.0.0 + dev: false + /get-tsconfig@4.7.2: resolution: { @@ -4388,6 +8076,14 @@ packages: resolve-pkg-maps: 1.0.0 dev: true + /getenv@1.0.0: + resolution: + { + integrity: sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg==, + } + engines: { node: ">=6" } + dev: false + /github-from-package@0.0.0: resolution: { @@ -4434,6 +8130,50 @@ packages: } dev: true + /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: false + + /glob@6.0.4: + resolution: + { + integrity: sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==, + } + requiresBuild: true + dependencies: + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: false + optional: true + + /glob@7.1.6: + resolution: + { + integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==, + } + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: false + /glob@7.2.3: resolution: { @@ -4459,12 +8199,19 @@ packages: inherits: 2.0.4 minimatch: 5.1.6 once: 1.4.0 - dev: true - /globals@13.23.0: + /globals@11.12.0: + resolution: + { + integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==, + } + engines: { node: ">=4" } + dev: false + + /globals@13.24.0: resolution: { - integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==, + integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==, } engines: { node: ">=8" } dependencies: @@ -4485,12 +8232,49 @@ packages: slash: 3.0.0 dev: false + /gopd@1.0.1: + resolution: + { + integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==, + } + dependencies: + get-intrinsic: 1.2.2 + dev: false + + /graceful-fs@4.2.11: + resolution: + { + integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, + } + dev: false + /graphemer@1.4.0: resolution: { integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, } + /graphql-tag@2.12.6(graphql@15.8.0): + resolution: + { + integrity: sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==, + } + engines: { node: ">=10" } + peerDependencies: + graphql: ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + dependencies: + graphql: 15.8.0 + tslib: 2.6.2 + dev: false + + /graphql@15.8.0: + resolution: + { + integrity: sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==, + } + engines: { node: ">= 10.x" } + dev: false + /hanji@0.0.5: resolution: { @@ -4501,6 +8285,14 @@ packages: sisteransi: 1.0.5 dev: true + /has-flag@3.0.0: + resolution: + { + integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==, + } + engines: { node: ">=4" } + dev: false + /has-flag@4.0.0: resolution: { @@ -4508,6 +8300,41 @@ packages: } engines: { node: ">=8" } + /has-property-descriptors@1.0.1: + resolution: + { + integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==, + } + dependencies: + get-intrinsic: 1.2.2 + dev: false + + /has-proto@1.0.1: + resolution: + { + integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==, + } + engines: { node: ">= 0.4" } + dev: false + + /has-symbols@1.0.3: + resolution: + { + integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==, + } + engines: { node: ">= 0.4" } + dev: false + + /hasown@2.0.0: + resolution: + { + integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==, + } + engines: { node: ">= 0.4" } + dependencies: + function-bind: 1.1.2 + dev: false + /hast-util-embedded@3.0.0: resolution: { @@ -4556,7 +8383,7 @@ packages: integrity: sha512-iAuRp+ESgJoRFJbSyaqsfvJDY6zzmFoEnL1gtz1+U8gKtGGj1p0CVlysuUAUjq95qlZESHINLThwJzNGmgGZxA==, } dependencies: - "@types/hast": 2.3.8 + "@types/hast": 2.3.9 dev: false /hast-util-is-body-ok-link@3.0.0: @@ -4672,7 +8499,7 @@ packages: integrity: sha512-02AQ3vLhuH3FisaMM+i/9sm4OXGSq1UhOOCpTLLQtHdL3tZt7qil69r8M8iDkZYyC0HCFylcYoP+8IO7ddta1A==, } dependencies: - "@types/hast": 2.3.8 + "@types/hast": 2.3.9 dev: false /hast-util-to-text@4.0.0: @@ -4724,10 +8551,10 @@ packages: engines: { node: ">=12.0.0" } dev: false - /hono@3.11.3: + /hono@3.11.11: resolution: { - integrity: sha512-MWYBcIS4dZJo9e/852Zwl+gqBiUSRknMOZ/MbW7kW8JiWixTJ58pzXVIeBq7jnvFq3AZ9uQ35QyVpzV05sdNFw==, + integrity: sha512-E3Xv7LnOjg7VXiu+t+YplDEYXvkxpcTCzZ3RUFQlcNXclSME8aiQAYwWpJPT6MQRRpa4TG5RlOolqeYEDEK3wg==, } engines: { node: ">=16.0.0" } dev: false @@ -4739,6 +8566,16 @@ packages: } dev: false + /hosted-git-info@3.0.8: + resolution: + { + integrity: sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==, + } + engines: { node: ">=10" } + dependencies: + lru-cache: 6.0.0 + dev: false + /html-void-elements@3.0.0: resolution: { @@ -4753,6 +8590,33 @@ packages: } dev: false + /http-errors@2.0.0: + resolution: + { + integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==, + } + engines: { node: ">= 0.8" } + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + dev: false + + /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 + /httpsnippet-lite@3.0.5: resolution: { @@ -4774,6 +8638,16 @@ packages: hasBin: true dev: true + /iconv-lite@0.4.24: + resolution: + { + integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==, + } + engines: { node: ">=0.10.0" } + dependencies: + safer-buffer: 2.1.2 + dev: false + /ieee754@1.2.1: resolution: { @@ -4788,6 +8662,13 @@ packages: } engines: { node: ">= 4" } + /immediate@3.3.0: + resolution: + { + integrity: sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==, + } + dev: false + /import-fresh@3.3.0: resolution: { @@ -4805,6 +8686,21 @@ packages: } engines: { node: ">=0.8.19" } + /indent-string@4.0.0: + resolution: + { + integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==, + } + engines: { node: ">=8" } + dev: false + + /infer-owner@1.0.4: + resolution: + { + integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==, + } + dev: false + /inflight@1.0.6: resolution: { @@ -4827,6 +8723,42 @@ packages: } dev: false + /internal-ip@4.3.0: + resolution: + { + integrity: sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==, + } + engines: { node: ">=6" } + dependencies: + default-gateway: 4.2.0 + ipaddr.js: 1.9.1 + dev: false + + /invariant@2.2.4: + resolution: + { + integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==, + } + dependencies: + loose-envify: 1.4.0 + dev: false + + /ip-regex@2.1.0: + resolution: + { + integrity: sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==, + } + engines: { node: ">=4" } + dev: false + + /ipaddr.js@1.9.1: + resolution: + { + integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==, + } + engines: { node: ">= 0.10" } + dev: false + /is-absolute-url@4.0.1: resolution: { @@ -4845,6 +8777,13 @@ packages: binary-extensions: 2.2.0 dev: true + /is-buffer@1.1.6: + resolution: + { + integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==, + } + dev: false + /is-buffer@2.0.5: resolution: { @@ -4853,6 +8792,32 @@ packages: engines: { node: ">=4" } dev: false + /is-core-module@2.13.1: + resolution: + { + integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==, + } + dependencies: + hasown: 2.0.0 + dev: false + + /is-docker@2.2.1: + resolution: + { + integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==, + } + engines: { node: ">=8" } + hasBin: true + dev: false + + /is-extglob@1.0.0: + resolution: + { + integrity: sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==, + } + engines: { node: ">=0.10.0" } + dev: false + /is-extglob@2.1.1: resolution: { @@ -4860,6 +8825,24 @@ packages: } engines: { node: ">=0.10.0" } + /is-fullwidth-code-point@3.0.0: + resolution: + { + integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, + } + engines: { node: ">=8" } + dev: false + + /is-glob@2.0.1: + resolution: + { + integrity: sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==, + } + engines: { node: ">=0.10.0" } + dependencies: + is-extglob: 1.0.0 + dev: false + /is-glob@4.0.3: resolution: { @@ -4869,6 +8852,16 @@ packages: dependencies: is-extglob: 2.1.1 + /is-invalid-path@0.1.0: + resolution: + { + integrity: sha512-aZMG0T3F34mTg4eTdszcGXx54oiZ4NtHSft3hWNJMGJXUUqdIj3cOZuHcU0nCWWcY3jd7yRe/3AEm3vSNTpBGQ==, + } + engines: { node: ">=0.10.0" } + dependencies: + is-glob: 2.0.1 + dev: false + /is-number@7.0.0: resolution: { @@ -4879,9 +8872,17 @@ packages: /is-obj@1.0.1: resolution: { - integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==, + integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==, + } + engines: { node: ">=0.10.0" } + dev: false + + /is-path-cwd@2.2.0: + resolution: + { + integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==, } - engines: { node: ">=0.10.0" } + engines: { node: ">=6" } dev: false /is-path-inside@3.0.3: @@ -4914,6 +8915,32 @@ packages: engines: { node: ">=0.10.0" } dev: false + /is-stream@1.1.0: + resolution: + { + integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==, + } + engines: { node: ">=0.10.0" } + dev: false + + /is-stream@2.0.1: + resolution: + { + integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, + } + engines: { node: ">=8" } + dev: false + + /is-valid-path@0.1.1: + resolution: + { + integrity: sha512-+kwPrVDu9Ms03L90Qaml+79+6DZHqHyRoANI6IsZJ/g8frhnfchDOBCa0RbQ6/kdHt5CS5OeIEyrYznNuVN+8A==, + } + engines: { node: ">=0.10.0" } + dependencies: + is-invalid-path: 0.1.0 + dev: false + /is-what@4.1.16: resolution: { @@ -4922,12 +8949,34 @@ packages: engines: { node: ">=12.13" } dev: true + /is-wsl@2.2.0: + resolution: + { + integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==, + } + engines: { node: ">=8" } + dependencies: + is-docker: 2.2.1 + dev: false + /isexe@2.0.0: resolution: { integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, } + /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: false + /javascript-time-ago@2.5.9: resolution: { @@ -4937,6 +8986,20 @@ packages: relative-time-format: 1.1.6 dev: false + /jimp-compact@0.16.1: + resolution: + { + integrity: sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==, + } + dev: false + + /join-component@1.1.0: + resolution: + { + integrity: sha512-bF7vcQxbODoGK1imE2P9GS9aw4zD0Sd+Hni68IMZLj7zRnquH7dXUmMw9hDI5S/Jzt7q+IyTXN0rSg2GI0IKhQ==, + } + dev: false + /js-base64@3.7.5: resolution: { @@ -4944,6 +9007,13 @@ packages: } dev: false + /js-tokens@4.0.0: + resolution: + { + integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, + } + dev: false + /js-yaml@3.14.1: resolution: { @@ -4964,6 +9034,30 @@ packages: dependencies: argparse: 2.0.1 + /jsc-safe-url@0.2.4: + resolution: + { + integrity: sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==, + } + dev: false + + /jsesc@0.5.0: + resolution: + { + integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==, + } + hasBin: true + dev: false + + /jsesc@2.5.2: + resolution: + { + integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==, + } + engines: { node: ">=4" } + hasBin: true + dev: false + /json-buffer@3.0.1: resolution: { @@ -4982,6 +9076,23 @@ packages: dreamopt: 0.8.0 dev: true + /json-schema-deref-sync@0.13.0: + resolution: + { + integrity: sha512-YBOEogm5w9Op337yb6pAT6ZXDqlxAsQCanM3grid8lMWNxRJO/zWEJi3ZzqDL8boWfwhTFym5EFrNgWwpqcBRg==, + } + engines: { node: ">=6.0.0" } + dependencies: + clone: 2.1.2 + dag-map: 1.0.2 + is-valid-path: 0.1.1 + lodash: 4.17.21 + md5: 2.2.1 + memory-cache: 0.2.0 + traverse: 0.6.8 + valid-url: 1.0.9 + dev: false + /json-schema-traverse@0.4.1: resolution: { @@ -5001,6 +9112,35 @@ packages: integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, } + /json5@2.2.3: + resolution: + { + integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, + } + engines: { node: ">=6" } + hasBin: true + dev: false + + /jsonfile@4.0.0: + resolution: + { + integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==, + } + optionalDependencies: + graceful-fs: 4.2.11 + dev: false + + /jsonfile@6.1.0: + resolution: + { + integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==, + } + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + dev: false + /keyv@4.5.4: resolution: { @@ -5009,6 +9149,14 @@ packages: dependencies: json-buffer: 3.0.1 + /kleur@3.0.3: + resolution: + { + integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==, + } + engines: { node: ">=6" } + dev: false + /levn@0.4.1: resolution: { @@ -5019,10 +9167,10 @@ packages: prelude-ls: 1.2.1 type-check: 0.4.0 - /libsql@0.2.0-pre.4: + /libsql@0.2.0-pre.6: resolution: { - integrity: sha512-ZAud4bIZwWJjZUKvQOgg3yVX2fVuqVuPOtjFAPuo+FpfMcsnBpGfOcIJxvfik5qKchyqHd/fpHWbFk7/X0XuHg==, + integrity: sha512-yh418UB3WTnXfYPagqQhevIxaMjOSuLfCN/weSgYytYnZybto//Ww8C3+MWgehRavF2Ox85I4J0ug7KEguidyw==, } cpu: [x64, arm64] os: [darwin, linux, win32] @@ -5030,13 +9178,146 @@ packages: "@neon-rs/load": 0.0.4 detect-libc: 2.0.2 optionalDependencies: - "@libsql/darwin-arm64": 0.2.0-pre.4 - "@libsql/darwin-x64": 0.2.0-pre.4 - "@libsql/linux-arm64-gnu": 0.2.0-pre.4 - "@libsql/linux-arm64-musl": 0.2.0-pre.4 - "@libsql/linux-x64-gnu": 0.2.0-pre.4 - "@libsql/linux-x64-musl": 0.2.0-pre.4 - "@libsql/win32-x64-msvc": 0.2.0-pre.4 + "@libsql/darwin-arm64": 0.2.0-pre.6 + "@libsql/darwin-x64": 0.2.0-pre.6 + "@libsql/linux-arm64-gnu": 0.2.0-pre.6 + "@libsql/linux-arm64-musl": 0.2.0-pre.6 + "@libsql/linux-x64-gnu": 0.2.0-pre.6 + "@libsql/linux-x64-musl": 0.2.0-pre.6 + "@libsql/win32-x64-msvc": 0.2.0-pre.6 + dev: false + + /lightningcss-darwin-arm64@1.19.0: + resolution: + { + integrity: sha512-wIJmFtYX0rXHsXHSr4+sC5clwblEMji7HHQ4Ub1/CznVRxtCFha6JIt5JZaNf8vQrfdZnBxLLC6R8pC818jXqg==, + } + engines: { node: ">= 12.0.0" } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /lightningcss-darwin-x64@1.19.0: + resolution: + { + integrity: sha512-Lif1wD6P4poaw9c/4Uh2z+gmrWhw/HtXFoeZ3bEsv6Ia4tt8rOJBdkfVaUJ6VXmpKHALve+iTyP2+50xY1wKPw==, + } + engines: { node: ">= 12.0.0" } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-arm-gnueabihf@1.19.0: + resolution: + { + integrity: sha512-P15VXY5682mTXaiDtbnLYQflc8BYb774j2R84FgDLJTN6Qp0ZjWEFyN1SPqyfTj2B2TFjRHRUvQSSZ7qN4Weig==, + } + engines: { node: ">= 12.0.0" } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-arm64-gnu@1.19.0: + resolution: + { + integrity: sha512-zwXRjWqpev8wqO0sv0M1aM1PpjHz6RVIsBcxKszIG83Befuh4yNysjgHVplF9RTU7eozGe3Ts7r6we1+Qkqsww==, + } + engines: { node: ">= 12.0.0" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-arm64-musl@1.19.0: + resolution: + { + integrity: sha512-vSCKO7SDnZaFN9zEloKSZM5/kC5gbzUjoJQ43BvUpyTFUX7ACs/mDfl2Eq6fdz2+uWhUh7vf92c4EaaP4udEtA==, + } + engines: { node: ">= 12.0.0" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-x64-gnu@1.19.0: + resolution: + { + integrity: sha512-0AFQKvVzXf9byrXUq9z0anMGLdZJS+XSDqidyijI5njIwj6MdbvX2UZK/c4FfNmeRa2N/8ngTffoIuOUit5eIQ==, + } + engines: { node: ">= 12.0.0" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-x64-musl@1.19.0: + resolution: + { + integrity: sha512-SJoM8CLPt6ECCgSuWe+g0qo8dqQYVcPiW2s19dxkmSI5+Uu1GIRzyKA0b7QqmEXolA+oSJhQqCmJpzjY4CuZAg==, + } + engines: { node: ">= 12.0.0" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-win32-x64-msvc@1.19.0: + resolution: + { + integrity: sha512-C+VuUTeSUOAaBZZOPT7Etn/agx/MatzJzGRkeV+zEABmPuntv1zihncsi+AyGmjkkzq3wVedEy7h0/4S84mUtg==, + } + engines: { node: ">= 12.0.0" } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /lightningcss@1.19.0: + resolution: + { + integrity: sha512-yV5UR7og+Og7lQC+70DA7a8ta1uiOPnWPJfxa0wnxylev5qfo4P+4iMpzWAdYWOca4jdNQZii+bDL/l+4hUXIA==, + } + engines: { node: ">= 12.0.0" } + dependencies: + detect-libc: 1.0.3 + optionalDependencies: + lightningcss-darwin-arm64: 1.19.0 + lightningcss-darwin-x64: 1.19.0 + lightningcss-linux-arm-gnueabihf: 1.19.0 + lightningcss-linux-arm64-gnu: 1.19.0 + lightningcss-linux-arm64-musl: 1.19.0 + lightningcss-linux-x64-gnu: 1.19.0 + lightningcss-linux-x64-musl: 1.19.0 + lightningcss-win32-x64-msvc: 1.19.0 + dev: false + + /lines-and-columns@1.2.4: + resolution: + { + integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, + } + dev: false + + /locate-path@3.0.0: + resolution: + { + integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==, + } + engines: { node: ">=6" } + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 dev: false /locate-path@6.0.0: @@ -5048,6 +9329,13 @@ packages: dependencies: p-locate: 5.0.0 + /lodash.debounce@4.0.8: + resolution: + { + integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==, + } + dev: false + /lodash.merge@4.6.2: resolution: { @@ -5068,6 +9356,16 @@ packages: } dev: false + /log-symbols@2.2.0: + resolution: + { + integrity: sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==, + } + engines: { node: ">=4" } + dependencies: + chalk: 2.4.2 + dev: false + /longest-streak@3.1.0: resolution: { @@ -5075,6 +9373,16 @@ packages: } dev: false + /loose-envify@1.4.0: + resolution: + { + integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==, + } + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: false + /lowlight@3.1.0: resolution: { @@ -5086,6 +9394,23 @@ packages: highlight.js: 11.9.0 dev: false + /lru-cache@10.1.0: + resolution: + { + integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==, + } + engines: { node: 14 || >=16.14 } + dev: false + + /lru-cache@5.1.1: + resolution: + { + integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, + } + dependencies: + yallist: 3.1.1 + dev: false + /lru-cache@6.0.0: resolution: { @@ -5104,13 +9429,13 @@ packages: es5-ext: 0.10.62 dev: true - /lucia@3.0.0-beta.11: + /lucia@3.0.0-beta.13: resolution: { - integrity: sha512-OXZfnM4KifDjkTTG3ruihormyOcXBz6wjAWibAAlw42zWBXDsleFR34gwKBxxXBa+TodzuKy7rcg8FGOMwwSGA==, + integrity: sha512-p5qJWSFax+MSuifh1lJ37lj9l7q7hB3JgMNutRgy6PKF+3Aw4hMii+Sts5yR4t1ETodqlDmuOBE7mdarGQunwg==, } dependencies: - oslo: 0.23.5 + oslo: 0.25.1 dev: false /magic-string@0.25.9: @@ -5122,20 +9447,60 @@ packages: sourcemap-codec: 1.4.8 dev: true - /magic-string@0.30.5: + /magic-string@0.30.5: + resolution: + { + integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==, + } + engines: { node: ">=12" } + dependencies: + "@jridgewell/sourcemap-codec": 1.4.15 + dev: false + + /markdown-table@3.0.3: + resolution: + { + integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==, + } + dev: false + + /md5-file@3.2.3: + resolution: + { + integrity: sha512-3Tkp1piAHaworfcCgH0jKbTvj1jWWFgbvh2cXaNCgHwyTCBxxvD1Y04rmfpvdPm1P4oXMOpm6+2H7sr7v9v8Fw==, + } + engines: { node: ">=0.10" } + hasBin: true + dependencies: + buffer-alloc: 1.2.0 + dev: false + + /md5@2.2.1: + resolution: + { + integrity: sha512-PlGG4z5mBANDGCKsYQe0CaUYHdZYZt8ZPZLmEt+Urf0W4GlpTX4HescwHU+dc9+Z/G/vZKYZYFrwgm9VxK6QOQ==, + } + dependencies: + charenc: 0.0.2 + crypt: 0.0.2 + is-buffer: 1.1.6 + dev: false + + /md5@2.3.0: resolution: { - integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==, + integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==, } - engines: { node: ">=12" } dependencies: - "@jridgewell/sourcemap-codec": 1.4.15 + charenc: 0.0.2 + crypt: 0.0.2 + is-buffer: 1.1.6 dev: false - /markdown-table@3.0.3: + /md5hex@1.0.0: resolution: { - integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==, + integrity: sha512-c2YOUbp33+6thdCUi34xIyOU/a7bvGKj/3DB1iaPMTuPHf/Q2d5s4sn1FaCOO43XkXggnb08y5W2PU8UNYNLKQ==, } dev: false @@ -5320,6 +9685,14 @@ packages: "@types/mdast": 4.0.3 dev: false + /media-typer@0.3.0: + resolution: + { + integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==, + } + engines: { node: ">= 0.6" } + dev: false + /memoizee@0.4.15: resolution: { @@ -5336,6 +9709,13 @@ packages: timers-ext: 0.1.7 dev: true + /memory-cache@0.2.0: + resolution: + { + integrity: sha512-OcjA+jzjOYzKmKS6IQVALHLVz+rNTMPoJvCztFaZxwG14wtAW7VRZjwTQu06vKCYOxh4jVnik7ya0SXTB0W+xA==, + } + dev: false + /merge2@1.4.1: resolution: { @@ -5344,6 +9724,58 @@ packages: engines: { node: ">= 8" } dev: false + /metro-react-native-babel-preset@0.76.8(@babel/core@7.23.7): + resolution: + { + integrity: sha512-Ptza08GgqzxEdK8apYsjTx2S8WDUlS2ilBlu9DR1CUcHmg4g3kOkFylZroogVAUKtpYQNYwAvdsjmrSdDNtiAg==, + } + engines: { node: ">=16" } + peerDependencies: + "@babel/core": "*" + dependencies: + "@babel/core": 7.23.7 + "@babel/plugin-proposal-async-generator-functions": 7.20.7(@babel/core@7.23.7) + "@babel/plugin-proposal-class-properties": 7.18.6(@babel/core@7.23.7) + "@babel/plugin-proposal-export-default-from": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-proposal-nullish-coalescing-operator": 7.18.6(@babel/core@7.23.7) + "@babel/plugin-proposal-numeric-separator": 7.18.6(@babel/core@7.23.7) + "@babel/plugin-proposal-object-rest-spread": 7.20.7(@babel/core@7.23.7) + "@babel/plugin-proposal-optional-catch-binding": 7.18.6(@babel/core@7.23.7) + "@babel/plugin-proposal-optional-chaining": 7.21.0(@babel/core@7.23.7) + "@babel/plugin-syntax-dynamic-import": 7.8.3(@babel/core@7.23.7) + "@babel/plugin-syntax-export-default-from": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-syntax-flow": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-syntax-nullish-coalescing-operator": 7.8.3(@babel/core@7.23.7) + "@babel/plugin-syntax-optional-chaining": 7.8.3(@babel/core@7.23.7) + "@babel/plugin-transform-arrow-functions": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-async-to-generator": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-block-scoping": 7.23.4(@babel/core@7.23.7) + "@babel/plugin-transform-classes": 7.23.5(@babel/core@7.23.7) + "@babel/plugin-transform-computed-properties": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-destructuring": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-flow-strip-types": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-function-name": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-literals": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-modules-commonjs": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-named-capturing-groups-regex": 7.22.5(@babel/core@7.23.7) + "@babel/plugin-transform-parameters": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-react-display-name": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-react-jsx": 7.23.4(@babel/core@7.23.7) + "@babel/plugin-transform-react-jsx-self": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-react-jsx-source": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-runtime": 7.23.7(@babel/core@7.23.7) + "@babel/plugin-transform-shorthand-properties": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-spread": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-sticky-regex": 7.23.3(@babel/core@7.23.7) + "@babel/plugin-transform-typescript": 7.23.6(@babel/core@7.23.7) + "@babel/plugin-transform-unicode-regex": 7.23.3(@babel/core@7.23.7) + "@babel/template": 7.22.15 + babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.23.7) + react-refresh: 0.4.3 + transitivePeerDependencies: + - supports-color + dev: false + /micromark-core-commonmark@2.0.0: resolution: { @@ -5704,6 +10136,24 @@ packages: mime-db: 1.52.0 dev: false + /mime@1.6.0: + resolution: + { + integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==, + } + engines: { node: ">=4" } + hasBin: true + dev: false + + /mime@2.6.0: + resolution: + { + integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==, + } + engines: { node: ">=4.0.0" } + hasBin: true + dev: false + /mime@3.0.0: resolution: { @@ -5713,6 +10163,14 @@ packages: hasBin: true dev: true + /mimic-fn@1.2.0: + resolution: + { + integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==, + } + engines: { node: ">=4" } + dev: false + /mimic-response@3.1.0: resolution: { @@ -5721,15 +10179,15 @@ packages: engines: { node: ">=10" } dev: false - /miniflare@3.20231030.3: + /miniflare@3.20231030.4: resolution: { - integrity: sha512-lquHSh0XiO8uoWDujOLHtDS9mkUTJTc5C5amiQ6A++5y0f+DWiMqbDBvvwjlYf4Dvqk6ChFya9dztk7fg2ZVxA==, + integrity: sha512-7MBz0ArLuDop1WJGZC6tFgN6c5MRyDOIlxbm3yp0TRBpvDS/KsTuWCQcCjsxN4QQ5zvL3JTkuIZbQzRRw/j6ow==, } engines: { node: ">=16.13" } hasBin: true dependencies: - acorn: 8.11.2 + acorn: 8.11.3 acorn-walk: 8.3.1 capnp-ts: 0.7.0 exit-hook: 2.2.1 @@ -5738,7 +10196,7 @@ packages: stoppable: 1.1.0 undici: 5.28.2 workerd: 1.20231030.0 - ws: 8.14.2 + ws: 8.16.0 youch: 3.3.3 zod: 3.22.4 transitivePeerDependencies: @@ -5763,7 +10221,6 @@ packages: engines: { node: ">=10" } dependencies: brace-expansion: 2.0.1 - dev: true /minimatch@7.4.6: resolution: @@ -5775,6 +10232,16 @@ packages: brace-expansion: 2.0.1 dev: true + /minimatch@9.0.3: + resolution: + { + integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==, + } + engines: { node: ">=16 || 14 >=14.17" } + dependencies: + brace-expansion: 2.0.1 + dev: false + /minimist@1.2.8: resolution: { @@ -5782,6 +10249,73 @@ packages: } dev: false + /minipass-collect@1.0.2: + resolution: + { + integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==, + } + engines: { node: ">= 8" } + dependencies: + minipass: 3.1.6 + dev: false + + /minipass-flush@1.0.5: + resolution: + { + integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==, + } + engines: { node: ">= 8" } + dependencies: + minipass: 3.1.6 + dev: false + + /minipass-pipeline@1.2.4: + resolution: + { + integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==, + } + engines: { node: ">=8" } + dependencies: + minipass: 3.1.6 + dev: false + + /minipass@3.1.6: + resolution: + { + integrity: sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==, + } + engines: { node: ">=8" } + dependencies: + yallist: 4.0.0 + dev: false + + /minipass@5.0.0: + resolution: + { + integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==, + } + engines: { node: ">=8" } + dev: false + + /minipass@7.0.4: + resolution: + { + integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==, + } + engines: { node: ">=16 || 14 >=14.17" } + dev: false + + /minizlib@2.1.2: + resolution: + { + integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==, + } + engines: { node: ">= 8" } + dependencies: + minipass: 3.1.6 + yallist: 4.0.0 + dev: false + /mkdirp-classic@0.5.3: resolution: { @@ -5789,12 +10323,45 @@ packages: } dev: false + /mkdirp@0.5.6: + resolution: + { + integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==, + } + hasBin: true + dependencies: + minimist: 1.2.8 + dev: false + + /mkdirp@1.0.4: + resolution: + { + integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==, + } + engines: { node: ">=10" } + hasBin: true + dev: false + + /ms@2.0.0: + resolution: + { + integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==, + } + dev: false + /ms@2.1.2: resolution: { integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, } + /ms@2.1.3: + resolution: + { + integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, + } + dev: false + /mustache@4.2.0: resolution: { @@ -5803,6 +10370,31 @@ packages: hasBin: true dev: true + /mv@2.1.1: + resolution: + { + integrity: sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==, + } + engines: { node: ">=0.8.0" } + requiresBuild: true + dependencies: + mkdirp: 0.5.6 + ncp: 2.0.0 + rimraf: 2.4.5 + dev: false + optional: true + + /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 + /nanoid@3.3.7: resolution: { @@ -5814,100 +10406,231 @@ packages: /nanoid@5.0.4: resolution: { - integrity: sha512-vAjmBf13gsmhXSgBrtIclinISzFFy22WwCYoyilZlsrRXNIHSwgFQ1bEdjRwMT3aoadeIF6HMuDRlOxzfXV8ig==, + integrity: sha512-vAjmBf13gsmhXSgBrtIclinISzFFy22WwCYoyilZlsrRXNIHSwgFQ1bEdjRwMT3aoadeIF6HMuDRlOxzfXV8ig==, + } + engines: { node: ^18 || >=20 } + hasBin: true + dev: false + + /napi-build-utils@1.0.2: + resolution: + { + integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==, + } + dev: false + + /natural-compare@1.4.0: + resolution: + { + integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, + } + + /ncp@2.0.0: + resolution: + { + integrity: sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==, + } + hasBin: true + requiresBuild: true + dev: false + optional: true + + /negotiator@0.6.3: + resolution: + { + integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==, + } + engines: { node: ">= 0.6" } + dev: false + + /nested-error-stacks@2.0.1: + resolution: + { + integrity: sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==, + } + dev: false + + /next-tick@1.1.0: + resolution: + { + integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==, + } + dev: true + + /nice-try@1.0.5: + resolution: + { + integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==, + } + dev: false + + /node-abi@3.52.0: + resolution: + { + integrity: sha512-JJ98b02z16ILv7859irtXn4oUaFWADtvkzy2c0IAatNVX2Mc9Yoh8z6hZInn3QwvMEYhHuQloYi+TTQy67SIdQ==, + } + engines: { node: ">=10" } + dependencies: + semver: 7.5.4 + dev: false + + /node-domexception@1.0.0: + resolution: + { + integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==, + } + engines: { node: ">=10.5.0" } + dev: false + + /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-fetch@3.3.2: + resolution: + { + integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + dev: false + + /node-forge@1.3.1: + resolution: + { + integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==, + } + engines: { node: ">= 6.13.0" } + + /node-releases@2.0.14: + resolution: + { + integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==, + } + dev: false + + /noop-fn@1.0.0: + resolution: + { + integrity: sha512-pQ8vODlgXt2e7A3mIbFDlizkr46r75V+BJxVAyat8Jl7YmI513gG5cfyRL0FedKraoZ+VAouI1h4/IWpus5pcQ==, + } + dev: false + + /normalize-path@3.0.0: + resolution: + { + integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, } - engines: { node: ^18 || >=20 } - hasBin: true - dev: false + engines: { node: ">=0.10.0" } + dev: true - /napi-build-utils@1.0.2: + /npm-package-arg@7.0.0: resolution: { - integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==, + integrity: sha512-xXxr8y5U0kl8dVkz2oK7yZjPBvqM2fwaO5l3Yg13p03v8+E3qQcD0JNhHzjL1vyGgxcKkD0cco+NLR72iuPk3g==, } + dependencies: + hosted-git-info: 3.0.8 + osenv: 0.1.5 + semver: 5.7.2 + validate-npm-package-name: 3.0.0 dev: false - /natural-compare@1.4.0: + /npm-run-path@2.0.2: resolution: { - integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, + integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==, } + engines: { node: ">=4" } + dependencies: + path-key: 2.0.1 + dev: false - /next-tick@1.1.0: + /nullthrows@1.1.1: resolution: { - integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==, + integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==, } - dev: true + dev: false - /node-abi@3.52.0: + /object-assign@4.1.1: resolution: { - integrity: sha512-JJ98b02z16ILv7859irtXn4oUaFWADtvkzy2c0IAatNVX2Mc9Yoh8z6hZInn3QwvMEYhHuQloYi+TTQy67SIdQ==, + integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==, } - engines: { node: ">=10" } - dependencies: - semver: 7.5.4 + engines: { node: ">=0.10.0" } dev: false - /node-domexception@1.0.0: + /object-inspect@1.13.1: resolution: { - integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==, + integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==, } - engines: { node: ">=10.5.0" } dev: false - /node-fetch@2.7.0: + /on-finished@2.3.0: resolution: { - integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==, + integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==, } - engines: { node: 4.x || >=6.0.0 } - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true + engines: { node: ">= 0.8" } dependencies: - whatwg-url: 5.0.0 + ee-first: 1.1.1 dev: false - /node-fetch@3.3.2: + /on-finished@2.4.1: resolution: { - integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==, + integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==, } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + engines: { node: ">= 0.8" } dependencies: - data-uri-to-buffer: 4.0.1 - fetch-blob: 3.2.0 - formdata-polyfill: 4.0.10 + ee-first: 1.1.1 dev: false - /node-forge@1.3.1: + /once@1.4.0: resolution: { - integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==, + integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, } - engines: { node: ">= 6.13.0" } - dev: true + dependencies: + wrappy: 1.0.2 - /normalize-path@3.0.0: + /onetime@2.0.1: resolution: { - integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, + integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==, } - engines: { node: ">=0.10.0" } - dev: true + engines: { node: ">=4" } + dependencies: + mimic-fn: 1.2.0 + dev: false - /once@1.4.0: + /open@8.4.2: resolution: { - integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, + integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==, } + engines: { node: ">=12" } dependencies: - wrappy: 1.0.2 + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: false /openapi-types@12.1.3: resolution: @@ -5916,10 +10639,10 @@ packages: } dev: false - /openapi3-ts@4.1.2: + /openapi3-ts@4.2.1: resolution: { - integrity: sha512-B7gOkwsYMZO7BZXwJzXCuVagym2xhqsrilVvV0dnq2Di4+iLUXKVX9gOK23ZqaAHZOwABXN0QTdW8QnkUTX6DA==, + integrity: sha512-KL1mKwkZii5ce+tb24KCUmQHyWB/oanG5fzUY35UB+wenWJv4Kr/IWBntpn5R8ODiJcxx13ZDophcpHnLGeIOw==, } dependencies: yaml: 2.3.4 @@ -5938,16 +10661,85 @@ packages: prelude-ls: 1.2.1 type-check: 0.4.0 - /oslo@0.23.5: + /ora@3.4.0: + resolution: + { + integrity: sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==, + } + engines: { node: ">=6" } + dependencies: + chalk: 2.4.2 + cli-cursor: 2.1.0 + cli-spinners: 2.9.2 + log-symbols: 2.2.0 + strip-ansi: 5.2.0 + wcwidth: 1.0.1 + dev: false + + /os-homedir@1.0.2: + resolution: + { + integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==, + } + engines: { node: ">=0.10.0" } + dev: false + + /os-tmpdir@1.0.2: + resolution: + { + integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==, + } + engines: { node: ">=0.10.0" } + dev: false + + /osenv@0.1.5: + resolution: + { + integrity: sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==, + } + dependencies: + os-homedir: 1.0.2 + os-tmpdir: 1.0.2 + dev: false + + /oslo@0.25.1: + resolution: + { + integrity: sha512-XEmUNC9qeMx8UVtHsP6I2xXYSmzVsv/sZw5VsKMTJvXHd3boHAY016ZJtviXiBbE18ah/mU9Dyv4MizwOGShxw==, + } + dependencies: + "@node-rs/argon2": 1.5.2 + "@node-rs/bcrypt": 1.7.3 + dev: false + + /oslo@0.26.2: resolution: { - integrity: sha512-G+q/MkR0IPaUA1+FpHL0pneAHJzhNpg9P4VXASy4JQy1KGFyfhi30DphVHYNKQC+C05VhDi/sTGdOX+yfcrT3g==, + integrity: sha512-SY5AhyEc/Lvpq9ZeP/MuGXzI+TV6WRAIgSKtfyc0+/BSOhZr8vVTt/mfhOTATk41VsDeYcDutMKgLmFGOL4UMw==, } dependencies: "@node-rs/argon2": 1.5.2 "@node-rs/bcrypt": 1.7.3 dev: false + /p-finally@1.0.0: + resolution: + { + integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==, + } + engines: { node: ">=4" } + dev: false + + /p-limit@2.3.0: + resolution: + { + integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, + } + engines: { node: ">=6" } + dependencies: + p-try: 2.2.0 + dev: false + /p-limit@3.1.0: resolution: { @@ -5957,6 +10749,16 @@ packages: dependencies: yocto-queue: 0.1.0 + /p-locate@3.0.0: + resolution: + { + integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==, + } + engines: { node: ">=6" } + dependencies: + p-limit: 2.3.0 + dev: false + /p-locate@5.0.0: resolution: { @@ -5966,6 +10768,24 @@ packages: dependencies: p-limit: 3.1.0 + /p-map@4.0.0: + resolution: + { + integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==, + } + engines: { node: ">=10" } + dependencies: + aggregate-error: 3.1.0 + dev: false + + /p-try@2.2.0: + resolution: + { + integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, + } + engines: { node: ">=6" } + dev: false + /parent-module@1.0.1: resolution: { @@ -5983,6 +10803,16 @@ packages: engines: { node: ">=12" } dev: false + /parse-png@2.1.0: + resolution: + { + integrity: sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==, + } + engines: { node: ">=10" } + dependencies: + pngjs: 3.4.0 + dev: false + /parse5@7.1.2: resolution: { @@ -5992,6 +10822,39 @@ packages: entities: 4.5.0 dev: false + /parseurl@1.3.3: + resolution: + { + integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==, + } + engines: { node: ">= 0.8" } + dev: false + + /password-prompt@1.1.3: + resolution: + { + integrity: sha512-HkrjG2aJlvF0t2BMH0e2LB/EHf3Lcq3fNMzy4GYHcQblAvOl+QQji1Lx7WRBMqpVK8p+KR7bCg7oqAMXtdgqyw==, + } + dependencies: + ansi-escapes: 4.3.2 + cross-spawn: 7.0.3 + dev: false + + /path-browserify@1.0.1: + resolution: + { + integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==, + } + dev: false + + /path-exists@3.0.0: + resolution: + { + integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==, + } + engines: { node: ">=4" } + dev: false + /path-exists@4.0.0: resolution: { @@ -6006,6 +10869,14 @@ packages: } engines: { node: ">=0.10.0" } + /path-key@2.0.1: + resolution: + { + integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==, + } + engines: { node: ">=4" } + dev: false + /path-key@3.1.1: resolution: { @@ -6013,6 +10884,24 @@ packages: } engines: { node: ">=8" } + /path-parse@1.0.7: + resolution: + { + integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, + } + dev: false + + /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: false + /path-to-regexp@6.2.1: resolution: { @@ -6042,6 +10931,44 @@ packages: } engines: { node: ">=8.6" } + /pirates@4.0.6: + resolution: + { + integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==, + } + engines: { node: ">= 6" } + dev: false + + /pkg-up@3.1.0: + resolution: + { + integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==, + } + engines: { node: ">=8" } + dependencies: + find-up: 3.0.0 + dev: false + + /plist@3.1.0: + resolution: + { + integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==, + } + engines: { node: ">=10.4.0" } + dependencies: + "@xmldom/xmldom": 0.8.10 + base64-js: 1.5.1 + xmlbuilder: 15.1.1 + dev: false + + /pngjs@3.4.0: + resolution: + { + integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==, + } + engines: { node: ">=4.0.0" } + dev: false + /postcss-nested@6.0.1(postcss@8.4.32): resolution: { @@ -6052,13 +10979,13 @@ packages: postcss: ^8.2.14 dependencies: postcss: 8.4.32 - postcss-selector-parser: 6.0.13 + postcss-selector-parser: 6.0.15 dev: false - /postcss-selector-parser@6.0.13: + /postcss-selector-parser@6.0.15: resolution: { - integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==, + integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==, } engines: { node: ">=4" } dependencies: @@ -6078,6 +11005,13 @@ packages: source-map-js: 1.0.2 dev: false + /pouchdb-collections@1.0.1: + resolution: + { + integrity: sha512-31db6JRg4+4D5Yzc2nqsRqsA2oOkZS8DpFav3jf/qVNBxusKa2ClkEIZ2bJNpaDbMfWtnuSq59p6Bn+CipPMdg==, + } + dev: false + /prebuild-install@7.1.1: resolution: { @@ -6107,15 +11041,23 @@ packages: } engines: { node: ">= 0.8.0" } - /prettier@3.1.0: + /prettier@3.1.1: resolution: { - integrity: sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==, + integrity: sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==, } engines: { node: ">=14" } hasBin: true dev: false + /pretty-bytes@5.6.0: + resolution: + { + integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==, + } + engines: { node: ">=6" } + dev: false + /pretty-bytes@6.1.1: resolution: { @@ -6124,22 +11066,75 @@ packages: engines: { node: ^14.13.1 || >=16.0.0 } dev: false + /pretty-format@26.6.2: + resolution: + { + integrity: sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==, + } + engines: { node: ">= 10" } + dependencies: + "@jest/types": 26.6.2 + ansi-regex: 5.0.1 + ansi-styles: 4.3.0 + react-is: 17.0.2 + dev: false + /pretty-ms@8.0.0: resolution: { - integrity: sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==, + integrity: sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==, + } + engines: { node: ">=14.16" } + dependencies: + parse-ms: 3.0.0 + dev: false + + /printable-characters@1.0.42: + resolution: + { + integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==, + } + dev: true + + /progress@2.0.3: + resolution: + { + integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==, + } + engines: { node: ">=0.4.0" } + dev: false + + /promise-inflight@1.0.1: + resolution: + { + integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==, + } + peerDependencies: + bluebird: "*" + peerDependenciesMeta: + bluebird: + optional: true + dev: false + + /promise@7.3.1: + resolution: + { + integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==, } - engines: { node: ">=14.16" } dependencies: - parse-ms: 3.0.0 + asap: 2.0.6 dev: false - /printable-characters@1.0.42: + /prompts@2.4.2: resolution: { - integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==, + integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==, } - dev: true + engines: { node: ">= 6" } + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + dev: false /property-information@6.4.0: resolution: @@ -6172,12 +11167,58 @@ packages: } engines: { node: ">=6" } + /qrcode-terminal@0.11.0: + resolution: + { + integrity: sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==, + } + hasBin: true + dev: false + + /qs@6.11.0: + resolution: + { + integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==, + } + engines: { node: ">=0.6" } + dependencies: + side-channel: 1.0.4 + dev: false + + /querystringify@2.2.0: + resolution: + { + integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==, + } + dev: false + /queue-microtask@1.2.3: resolution: { integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, } + /range-parser@1.2.1: + resolution: + { + integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==, + } + engines: { node: ">= 0.6" } + dev: false + + /raw-body@2.5.2: + resolution: + { + integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==, + } + engines: { node: ">= 0.8" } + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: false + /rc@1.2.8: resolution: { @@ -6191,6 +11232,31 @@ packages: strip-json-comments: 2.0.1 dev: false + /react-is@17.0.2: + resolution: + { + integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==, + } + dev: false + + /react-refresh@0.4.3: + resolution: + { + integrity: sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA==, + } + engines: { node: ">=0.10.0" } + dev: false + + /react@18.2.0: + resolution: + { + integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==, + } + engines: { node: ">=0.10.0" } + dependencies: + loose-envify: 1.4.0 + dev: false + /readable-stream@3.6.2: resolution: { @@ -6213,6 +11279,23 @@ packages: picomatch: 2.3.1 dev: true + /regenerate-unicode-properties@10.1.1: + resolution: + { + integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==, + } + engines: { node: ">=4" } + dependencies: + regenerate: 1.4.2 + dev: false + + /regenerate@1.4.2: + resolution: + { + integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==, + } + dev: false + /regenerator-runtime@0.14.1: resolution: { @@ -6220,6 +11303,40 @@ packages: } dev: false + /regenerator-transform@0.15.2: + resolution: + { + integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==, + } + dependencies: + "@babel/runtime": 7.23.7 + dev: false + + /regexpu-core@5.3.2: + resolution: + { + integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==, + } + engines: { node: ">=4" } + dependencies: + "@babel/regjsgen": 0.8.0 + regenerate: 1.4.2 + regenerate-unicode-properties: 10.1.1 + regjsparser: 0.9.1 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.1.0 + dev: false + + /regjsparser@0.9.1: + resolution: + { + integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==, + } + hasBin: true + dependencies: + jsesc: 0.5.0 + dev: false + /rehype-external-links@3.0.0: resolution: { @@ -6292,7 +11409,7 @@ packages: integrity: sha512-lLdTHGd7u5bOXRDnD78/VHrVZsG63nN6lZUuQgcuupGt1+v+uDW7pCeQS0cvptRcZPYzg8B+0bf8sUiMBKsjZw==, } dependencies: - "@types/hast": 2.3.8 + "@types/hast": 2.3.9 github-slugger: 1.5.0 hast-util-has-property: 2.0.1 hast-util-heading-rank: 2.1.1 @@ -6374,6 +11491,13 @@ packages: unified: 11.0.4 dev: false + /remove-trailing-slash@0.1.1: + resolution: + { + integrity: sha512-o4S4Qh6L2jpnCy83ysZDau+VORNvnFw07CKSAymkd6ICNVEPisMyzlc00KlvvicsxKck94SEwhDnMNdICzO+tA==, + } + dev: false + /require-from-string@2.0.2: resolution: { @@ -6382,6 +11506,32 @@ packages: engines: { node: ">=0.10.0" } dev: false + /requireg@0.2.2: + resolution: + { + integrity: sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==, + } + engines: { node: ">= 4.0.0" } + dependencies: + nested-error-stacks: 2.0.1 + rc: 1.2.8 + resolve: 1.7.1 + dev: false + + /requires-port@1.0.0: + resolution: + { + integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==, + } + dev: false + + /reselect@4.1.8: + resolution: + { + integrity: sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==, + } + dev: false + /resolve-from@4.0.0: resolution: { @@ -6389,6 +11539,14 @@ packages: } engines: { node: ">=4" } + /resolve-from@5.0.0: + resolution: + { + integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==, + } + engines: { node: ">=8" } + dev: false + /resolve-pkg-maps@1.0.0: resolution: { @@ -6404,6 +11562,38 @@ packages: engines: { node: ">=10" } dev: true + /resolve@1.22.8: + resolution: + { + integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==, + } + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: false + + /resolve@1.7.1: + resolution: + { + integrity: sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==, + } + dependencies: + path-parse: 1.0.7 + dev: false + + /restore-cursor@2.0.0: + resolution: + { + integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==, + } + engines: { node: ">=4" } + dependencies: + onetime: 2.0.1 + signal-exit: 3.0.7 + dev: false + /reusify@1.0.4: resolution: { @@ -6411,6 +11601,28 @@ packages: } engines: { iojs: ">=1.0.0", node: ">=0.10.0" } + /rimraf@2.4.5: + resolution: + { + integrity: sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==, + } + hasBin: true + requiresBuild: true + dependencies: + glob: 6.0.4 + dev: false + optional: true + + /rimraf@2.7.1: + resolution: + { + integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==, + } + hasBin: true + dependencies: + glob: 7.2.3 + dev: false + /rimraf@3.0.2: resolution: { @@ -6425,66 +11637,196 @@ packages: { integrity: sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==, } - deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject. + deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject. + 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 + dev: true + + /run-parallel@1.2.0: + resolution: + { + integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, + } + dependencies: + queue-microtask: 1.2.3 + + /safe-buffer@5.2.1: + resolution: + { + integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, + } + dev: false + + /safe-json-stringify@1.2.0: + resolution: + { + integrity: sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==, + } + requiresBuild: true + dev: false + optional: true + + /safer-buffer@2.1.2: + resolution: + { + integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, + } + dev: false + + /sax@1.3.0: + resolution: + { + integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==, + } + dev: false + + /selfsigned@2.4.1: + resolution: + { + integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==, + } + engines: { node: ">=10" } + dependencies: + "@types/node-forge": 1.3.10 + node-forge: 1.3.1 + dev: true + + /semver@5.7.2: + resolution: + { + integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==, + } + hasBin: true + dev: false + + /semver@6.3.1: + resolution: + { + integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, + } + hasBin: true + dev: false + + /semver@7.3.2: + resolution: + { + integrity: sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==, + } + engines: { node: ">=10" } + hasBin: true + dev: false + + /semver@7.5.3: + resolution: + { + integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==, + } + engines: { node: ">=10" } + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: false + + /semver@7.5.4: + resolution: + { + integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==, + } + engines: { node: ">=10" } + hasBin: true dependencies: - estree-walker: 0.6.1 - magic-string: 0.25.9 - rollup-pluginutils: 2.8.2 - dev: true + lru-cache: 6.0.0 - /rollup-plugin-node-polyfills@0.2.1: + /send@0.18.0: resolution: { - integrity: sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==, + integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==, } + engines: { node: ">= 0.8.0" } dependencies: - rollup-plugin-inject: 3.0.2 - dev: true + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: false - /rollup-pluginutils@2.8.2: + /serialize-error@6.0.0: resolution: { - integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==, + integrity: sha512-3vmBkMZLQO+BR4RPHcyRGdE09XCF6cvxzk2N2qn8Er3F91cy8Qt7VvEbZBOpaL53qsBbe2cFOefU6tRY6WDelA==, } + engines: { node: ">=10" } dependencies: - estree-walker: 0.6.1 - dev: true + type-fest: 0.12.0 + dev: false - /run-parallel@1.2.0: + /set-function-length@1.1.1: resolution: { - integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, + integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==, } + engines: { node: ">= 0.4" } dependencies: - queue-microtask: 1.2.3 + define-data-property: 1.1.1 + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + dev: false - /safe-buffer@5.2.1: + /setimmediate@1.0.5: resolution: { - integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, + integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==, } dev: false - /selfsigned@2.4.1: + /setprototypeof@1.2.0: resolution: { - integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==, + integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==, } - engines: { node: ">=10" } - dependencies: - "@types/node-forge": 1.3.10 - node-forge: 1.3.1 - dev: true + dev: false - /semver@7.5.4: + /shebang-command@1.2.0: resolution: { - integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==, + integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==, } - engines: { node: ">=10" } - hasBin: true + engines: { node: ">=0.10.0" } dependencies: - lru-cache: 6.0.0 + shebang-regex: 1.0.0 + dev: false /shebang-command@2.0.0: resolution: @@ -6495,6 +11837,14 @@ packages: dependencies: shebang-regex: 3.0.0 + /shebang-regex@1.0.0: + resolution: + { + integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==, + } + engines: { node: ">=0.10.0" } + dev: false + /shebang-regex@3.0.0: resolution: { @@ -6502,6 +11852,32 @@ packages: } engines: { node: ">=8" } + /side-channel@1.0.4: + resolution: + { + integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==, + } + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + object-inspect: 1.13.1 + dev: false + + /signal-exit@3.0.7: + resolution: + { + integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, + } + dev: false + + /signal-exit@4.1.0: + resolution: + { + integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, + } + engines: { node: ">=14" } + dev: false + /simple-concat@1.0.1: resolution: { @@ -6520,12 +11896,22 @@ packages: simple-concat: 1.0.1 dev: false + /simple-plist@1.3.1: + resolution: + { + integrity: sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==, + } + dependencies: + bplist-creator: 0.1.0 + bplist-parser: 0.3.1 + plist: 3.1.0 + dev: false + /sisteransi@1.0.5: resolution: { integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==, } - dev: true /slash@3.0.0: resolution: @@ -6535,6 +11921,14 @@ packages: engines: { node: ">=8" } dev: false + /slugify@1.6.6: + resolution: + { + integrity: sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==, + } + engines: { node: ">=8.0.0" } + dev: false + /source-map-js@1.0.2: resolution: { @@ -6576,6 +11970,15 @@ packages: } dev: false + /split@1.0.1: + resolution: + { + integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==, + } + dependencies: + through: 2.3.8 + dev: false + /sprintf-js@1.0.3: resolution: { @@ -6583,6 +11986,16 @@ packages: } dev: false + /ssri@8.0.1: + resolution: + { + integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==, + } + engines: { node: ">= 8" } + dependencies: + minipass: 3.1.6 + dev: false + /stacktracey@2.1.8: resolution: { @@ -6593,6 +12006,22 @@ packages: get-source: 2.0.12 dev: true + /statuses@1.5.0: + resolution: + { + integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==, + } + engines: { node: ">= 0.6" } + dev: false + + /statuses@2.0.1: + resolution: + { + integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==, + } + engines: { node: ">= 0.8" } + dev: false + /stoppable@1.1.0: resolution: { @@ -6601,6 +12030,38 @@ packages: engines: { node: ">=4", npm: ">=6" } dev: true + /stream-buffers@2.2.0: + resolution: + { + integrity: sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==, + } + engines: { node: ">= 0.10.0" } + dev: false + + /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 + dev: false + + /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: false + /string_decoder@1.3.0: resolution: { @@ -6632,6 +12093,16 @@ packages: is-regexp: 1.0.0 dev: false + /strip-ansi@5.2.0: + resolution: + { + integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==, + } + engines: { node: ">=6" } + dependencies: + ansi-regex: 4.1.1 + dev: false + /strip-ansi@6.0.1: resolution: { @@ -6641,6 +12112,24 @@ packages: 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: false + + /strip-eof@1.0.0: + resolution: + { + integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==, + } + engines: { node: ">=0.10.0" } + dev: false + /strip-json-comments@2.0.1: resolution: { @@ -6656,6 +12145,13 @@ packages: } engines: { node: ">=8" } + /structured-headers@0.4.1: + resolution: + { + integrity: sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==, + } + dev: false + /style-mod@4.1.0: resolution: { @@ -6663,6 +12159,37 @@ packages: } dev: false + /sucrase@3.35.0: + resolution: + { + integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==, + } + engines: { node: ">=16 || 14 >=14.17" } + hasBin: true + dependencies: + "@jridgewell/gen-mapping": 0.3.3 + commander: 4.1.1 + glob: 10.3.10 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + dev: false + + /sudo-prompt@8.2.5: + resolution: + { + integrity: sha512-rlBo3HU/1zAJUrkY6jNxDOC9eVYliG6nS4JA8u8KAshITd07tafMc/Br7xQwCSseXwJ2iCcHCE8SNWX3q8Z+kw==, + } + dev: false + + /sudo-prompt@9.1.1: + resolution: + { + integrity: sha512-es33J1g2HjMpyAhz8lOR+ICmXXAqTuKbuXuUWLhOLew20oN9oUCgCJx615U/v7aioZg7IX5lIh9x34vwneu4pA==, + } + dev: false + /superjson@2.2.1: resolution: { @@ -6673,6 +12200,16 @@ packages: copy-anything: 3.0.5 dev: true + /supports-color@5.5.0: + resolution: + { + integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==, + } + engines: { node: ">=4" } + dependencies: + has-flag: 3.0.0 + dev: false + /supports-color@7.2.0: resolution: { @@ -6682,13 +12219,32 @@ packages: dependencies: has-flag: 4.0.0 - /tailwind-merge@2.1.0: + /supports-hyperlinks@2.3.0: + resolution: + { + integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==, + } + engines: { node: ">=8" } + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + dev: false + + /supports-preserve-symlinks-flag@1.0.0: + resolution: + { + integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, + } + engines: { node: ">= 0.4" } + dev: false + + /tailwind-merge@2.2.0: resolution: { - integrity: sha512-l11VvI4nSwW7MtLSLYT4ldidDEUwQAMWuSHk7l4zcXZDgnCRa0V3OdCwFfM7DCzakVXMNRwAeje9maFFXT71dQ==, + integrity: sha512-SqqhhaL0T06SW59+JVNfAqKdqLs0497esifRrZ7jOaefP3o64fdFNDMrAQWZFMxTLJPiHVjRLUywT8uFz1xNWQ==, } dependencies: - "@babel/runtime": 7.23.6 + "@babel/runtime": 7.23.7 dev: false /tar-fs@2.1.1: @@ -6717,12 +12273,106 @@ packages: readable-stream: 3.6.2 dev: false + /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 + dev: false + + /temp-dir@1.0.0: + resolution: + { + integrity: sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==, + } + engines: { node: ">=4" } + dev: false + + /temp-dir@2.0.0: + resolution: + { + integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==, + } + engines: { node: ">=8" } + dev: false + + /tempy@0.3.0: + resolution: + { + integrity: sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ==, + } + engines: { node: ">=8" } + dependencies: + temp-dir: 1.0.0 + type-fest: 0.3.1 + unique-string: 1.0.0 + dev: false + + /tempy@0.7.1: + resolution: + { + integrity: sha512-vXPxwOyaNVi9nyczO16mxmHGpl6ASC5/TVhRRHpqeYHvKQm58EaWNvZXxAhR0lYYnBOQFjXjhzeLsaXdjxLjRg==, + } + engines: { node: ">=10" } + dependencies: + del: 6.1.1 + is-stream: 2.0.1 + temp-dir: 2.0.0 + type-fest: 0.16.0 + unique-string: 2.0.0 + dev: false + + /terminal-link@2.1.1: + resolution: + { + integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==, + } + engines: { node: ">=8" } + dependencies: + ansi-escapes: 4.3.2 + supports-hyperlinks: 2.3.0 + dev: false + /text-table@0.2.0: resolution: { integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, } + /thenify-all@1.6.0: + resolution: + { + integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==, + } + engines: { node: ">=0.8" } + dependencies: + thenify: 3.3.1 + dev: false + + /thenify@3.3.1: + resolution: + { + integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==, + } + dependencies: + any-promise: 1.3.0 + dev: false + + /through@2.3.8: + resolution: + { + integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==, + } + dev: false + /timers-ext@0.1.7: resolution: { @@ -6733,13 +12383,30 @@ packages: next-tick: 1.1.0 dev: true + /tiny-queue@0.2.1: + resolution: + { + integrity: sha512-EijGsv7kzd9I9g0ByCl6h42BWNGUZrlCSejfrb3AKeHC33SGbASu1VDf5O3rRiiUOhAC9CHdZxFPbZu0HmR70A==, + } + dev: false + /tippy.js@6.3.7: resolution: { integrity: sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==, } dependencies: - "@popperjs/core": 2.11.8 + "@popperjs/core": 2.11.8 + dev: false + + /tmp@0.0.33: + resolution: + { + integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==, + } + engines: { node: ">=0.6.0" } + dependencies: + os-tmpdir: 1.0.2 dev: false /to-fast-properties@2.0.0: @@ -6759,6 +12426,14 @@ packages: dependencies: is-number: 7.0.0 + /toidentifier@1.0.1: + resolution: + { + integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==, + } + engines: { node: ">=0.6" } + dev: false + /tr46@0.0.3: resolution: { @@ -6766,6 +12441,14 @@ packages: } dev: false + /traverse@0.6.8: + resolution: + { + integrity: sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==, + } + engines: { node: ">= 0.4" } + dev: false + /trim-lines@3.0.1: resolution: { @@ -6792,22 +12475,28 @@ packages: typescript: 5.3.3 dev: false + /ts-interface-checker@0.1.13: + resolution: + { + integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==, + } + dev: false + /tslib@2.6.2: resolution: { integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==, } - dev: true - /tsx@4.6.2: + /tsx@4.7.0: resolution: { - integrity: sha512-QPpBdJo+ZDtqZgAnq86iY/PD2KYCUPSUGIunHdGwyII99GKH+f3z3FZ8XNFLSGQIA4I365ui8wnQpl8OKLqcsg==, + integrity: sha512-I+t79RYPlEYlHn9a+KzwrvEwhJg35h/1zHsLC2JXvhC2mdynMv6Zxzvhv5EMV6VF5qJlLlkSnMVvdZV3PSIGcg==, } engines: { node: ">=18.0.0" } hasBin: true dependencies: - esbuild: 0.18.20 + esbuild: 0.19.11 get-tsconfig: 4.7.2 optionalDependencies: fsevents: 2.3.3 @@ -6831,6 +12520,22 @@ packages: dependencies: prelude-ls: 1.2.1 + /type-fest@0.12.0: + resolution: + { + integrity: sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg==, + } + engines: { node: ">=10" } + dev: false + + /type-fest@0.16.0: + resolution: + { + integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==, + } + engines: { node: ">=10" } + dev: false + /type-fest@0.20.2: resolution: { @@ -6838,6 +12543,33 @@ packages: } engines: { node: ">=10" } + /type-fest@0.21.3: + resolution: + { + integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==, + } + engines: { node: ">=10" } + dev: false + + /type-fest@0.3.1: + resolution: + { + integrity: sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==, + } + engines: { node: ">=6" } + dev: false + + /type-is@1.6.18: + resolution: + { + integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==, + } + engines: { node: ">= 0.6" } + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + dev: false + /type@1.2.0: resolution: { @@ -6860,6 +12592,13 @@ packages: engines: { node: ">=14.17" } hasBin: true + /ua-parser-js@1.0.37: + resolution: + { + integrity: sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==, + } + dev: false + /undici-types@5.26.5: resolution: { @@ -6888,6 +12627,41 @@ packages: hookable: 5.5.3 dev: false + /unicode-canonical-property-names-ecmascript@2.0.0: + resolution: + { + integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==, + } + engines: { node: ">=4" } + dev: false + + /unicode-match-property-ecmascript@2.0.0: + resolution: + { + integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==, + } + engines: { node: ">=4" } + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.0 + unicode-property-aliases-ecmascript: 2.1.0 + dev: false + + /unicode-match-property-value-ecmascript@2.1.0: + resolution: + { + integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==, + } + engines: { node: ">=4" } + dev: false + + /unicode-property-aliases-ecmascript@2.1.0: + resolution: + { + integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==, + } + engines: { node: ">=4" } + dev: false + /unified@10.1.2: resolution: { @@ -6918,6 +12692,44 @@ packages: vfile: 6.0.1 dev: false + /unique-filename@1.1.1: + resolution: + { + integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==, + } + dependencies: + unique-slug: 2.0.2 + dev: false + + /unique-slug@2.0.2: + resolution: + { + integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==, + } + dependencies: + imurmurhash: 0.1.4 + dev: false + + /unique-string@1.0.0: + resolution: + { + integrity: sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==, + } + engines: { node: ">=4" } + dependencies: + crypto-random-string: 1.0.0 + dev: false + + /unique-string@2.0.0: + resolution: + { + integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==, + } + engines: { node: ">=8" } + dependencies: + crypto-random-string: 2.0.0 + dev: false + /unist-util-find-after@5.0.0: resolution: { @@ -7015,6 +12827,52 @@ packages: unist-util-visit-parents: 6.0.1 dev: false + /universalify@0.1.2: + resolution: + { + integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==, + } + engines: { node: ">= 4.0.0" } + dev: false + + /universalify@1.0.0: + resolution: + { + integrity: sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==, + } + engines: { node: ">= 10.0.0" } + dev: false + + /universalify@2.0.1: + resolution: + { + integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==, + } + engines: { node: ">= 10.0.0" } + dev: false + + /unpipe@1.0.0: + resolution: + { + integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==, + } + engines: { node: ">= 0.8" } + dev: false + + /update-browserslist-db@1.0.13(browserslist@4.22.2): + resolution: + { + integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==, + } + hasBin: true + peerDependencies: + browserslist: ">= 4.21.0" + dependencies: + browserslist: 4.22.2 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: false + /uri-js@4.4.1: resolution: { @@ -7023,6 +12881,23 @@ packages: dependencies: punycode: 2.3.1 + /url-join@4.0.0: + resolution: + { + integrity: sha512-EGXjXJZhIHiQMK2pQukuFcL303nskqIRzWvPvV5O8miOfwoUb9G+a/Cld60kUyeaybEI94wvVClT10DtfeAExA==, + } + dev: false + + /url-parse@1.5.10: + resolution: + { + integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==, + } + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: false + /util-deprecate@1.0.2: resolution: { @@ -7030,6 +12905,31 @@ packages: } dev: false + /utils-merge@1.0.1: + resolution: + { + integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==, + } + engines: { node: ">= 0.4.0" } + dev: false + + /uuid@3.4.0: + resolution: + { + integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==, + } + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + dev: false + + /uuid@7.0.3: + resolution: + { + integrity: sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==, + } + hasBin: true + dev: false + /uuid@8.3.2: resolution: { @@ -7038,6 +12938,22 @@ packages: hasBin: true dev: false + /valid-url@1.0.9: + resolution: + { + integrity: sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==, + } + dev: false + + /validate-npm-package-name@3.0.0: + resolution: + { + integrity: sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==, + } + dependencies: + builtins: 1.0.3 + dev: false + /vfile-location@5.0.2: resolution: { @@ -7091,7 +13007,7 @@ packages: vfile-message: 4.0.2 dev: false - /vue-demi@0.14.6(vue@3.3.13): + /vue-demi@0.14.6(vue@3.4.3): resolution: { integrity: sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==, @@ -7106,13 +13022,13 @@ packages: "@vue/composition-api": optional: true dependencies: - vue: 3.3.13(typescript@5.3.3) + vue: 3.4.3(typescript@5.3.3) dev: false - /vue@3.3.13(typescript@5.3.3): + /vue@3.4.3(typescript@5.3.3): resolution: { - integrity: sha512-LDnUpQvDgsfc0u/YgtAgTMXJlJQqjkxW1PVcOnJA5cshPleULDjHi7U45pl2VJYazSSvLH8UKcid/kzH8I0a0Q==, + integrity: sha512-GjN+culMAGv/mUbkIv8zMKItno8npcj5gWlXkSxf1SPTQf8eJ4A+YfHIvQFyL1IfuJcMl3soA7SmN1fRxbf/wA==, } peerDependencies: typescript: "*" @@ -7120,11 +13036,11 @@ packages: typescript: optional: true dependencies: - "@vue/compiler-dom": 3.3.13 - "@vue/compiler-sfc": 3.3.13 - "@vue/runtime-dom": 3.3.13 - "@vue/server-renderer": 3.3.13(vue@3.3.13) - "@vue/shared": 3.3.13 + "@vue/compiler-dom": 3.4.3 + "@vue/compiler-sfc": 3.4.3 + "@vue/runtime-dom": 3.4.3 + "@vue/server-renderer": 3.4.3(vue@3.4.3) + "@vue/shared": 3.4.3 typescript: 5.3.3 dev: false @@ -7135,6 +13051,15 @@ packages: } dev: false + /wcwidth@1.0.1: + resolution: + { + integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==, + } + dependencies: + defaults: 1.0.4 + dev: false + /web-namespaces@2.0.1: resolution: { @@ -7175,6 +13100,16 @@ packages: webidl-conversions: 3.0.1 dev: false + /which@1.3.1: + resolution: + { + integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==, + } + hasBin: true + dependencies: + isexe: 2.0.0 + dev: false + /which@2.0.2: resolution: { @@ -7185,6 +13120,13 @@ packages: dependencies: isexe: 2.0.0 + /wonka@4.0.15: + resolution: + { + integrity: sha512-U0IUQHKXXn6PFo9nqsHphVCE5m3IntqZNB9Jjn7EB1lrR7YTDY3YWgFvEvwniTzXSvOH/XMzAZaIfJF/LvHYXg==, + } + dev: false + /wordwrap@1.0.0: resolution: { @@ -7208,27 +13150,27 @@ packages: "@cloudflare/workerd-windows-64": 1.20231030.0 dev: true - /wrangler@3.19.0: + /wrangler@3.22.1: resolution: { - integrity: sha512-pY7xWqkQn6DJ+1vz9YHz2pCftEmK+JCTj9sqnucp0NZnlUiILDmBWegsjjCLZycgfiA62J213N7NvjLPr2LB8w==, + integrity: sha512-fN7WOF6Ono/TV5V90PuJQNf0azS7B+5C/N/KRjqhlAIQBz+c0yLOGkF6kC/akxjr1yIAC9AzcPk9+OuTSq0C+g==, } engines: { node: ">=16.17.0" } hasBin: true dependencies: "@cloudflare/kv-asset-handler": 0.2.0 + "@cspotcode/source-map-support": 0.8.1 "@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.3 + miniflare: 3.20231030.4 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 @@ -7238,16 +13180,51 @@ packages: - utf-8-validate dev: true + /wrap-ansi@7.0.0: + resolution: + { + integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, + } + engines: { node: ">=10" } + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: false + + /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: false + /wrappy@1.0.2: resolution: { integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, } - /ws@8.14.2: + /write-file-atomic@2.4.3: + resolution: + { + integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==, + } + dependencies: + graceful-fs: 4.2.11 + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + dev: false + + /ws@8.16.0: resolution: { - integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==, + integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==, } engines: { node: ">=10.0.0" } peerDependencies: @@ -7259,6 +13236,52 @@ packages: utf-8-validate: optional: true + /xcode@3.0.1: + resolution: + { + integrity: sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==, + } + engines: { node: ">=10.0.0" } + dependencies: + simple-plist: 1.3.1 + uuid: 7.0.3 + dev: false + + /xml2js@0.6.0: + resolution: + { + integrity: sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==, + } + engines: { node: ">=4.0.0" } + dependencies: + sax: 1.3.0 + xmlbuilder: 11.0.1 + dev: false + + /xmlbuilder@11.0.1: + resolution: + { + integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==, + } + engines: { node: ">=4.0" } + dev: false + + /xmlbuilder@14.0.0: + resolution: + { + integrity: sha512-ts+B2rSe4fIckR6iquDjsKbQFK2NlUk6iG5nf14mDEyldgoc2nEKZ3jZWMPTxGQwVgToSjt6VGIho1H8/fNFTg==, + } + engines: { node: ">=8.0" } + dev: false + + /xmlbuilder@15.1.1: + resolution: + { + integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==, + } + engines: { node: ">=8.0" } + dev: false + /xxhash-wasm@1.0.2: resolution: { @@ -7266,6 +13289,13 @@ packages: } dev: true + /yallist@3.1.1: + resolution: + { + integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, + } + dev: false + /yallist@4.0.0: resolution: { diff --git a/src/v2/lib/auth/definitions/auth-definitions.ts b/src/v2/lib/auth/definitions/auth-definitions.ts index 8e3c92b..0516c9e 100644 --- a/src/v2/lib/auth/definitions/auth-definitions.ts +++ b/src/v2/lib/auth/definitions/auth-definitions.ts @@ -3,25 +3,25 @@ import type { LuciaAuth } from "../lucia" declare module "lucia" { interface Register { Lucia: LuciaAuth - DatabaseUserAttributes: { - avatar_url: string | null - banner_url: string | null - username: string - username_colour: string | null - email: string - email_verified: boolean - pronouns: string | null - verified: boolean - bio: string | null - date_joined: string - role_flags: number - is_contributor: boolean - self_assignable_role_flags: number | null - } - DatabaseSessionAttributes: { - user_agent: string - country_code: string - ip_address: string - } + } + interface DatabaseUserAttributes { + avatar_url: string | null + banner_url: string | null + username: string + username_colour: string | null + email: string + email_verified: boolean + pronouns: string | null + verified: boolean + bio: string | null + date_joined: string + role_flags: number + is_contributor: boolean + self_assignable_role_flags: number | null + } + interface DatabaseSessionAttributes { + user_agent: string + country_code: string + ip_address: string } } diff --git a/src/v2/routes/auth/session/validate/route.ts b/src/v2/routes/auth/session/validate/route.ts index 2ee78f7..8efacaa 100644 --- a/src/v2/routes/auth/session/validate/route.ts +++ b/src/v2/routes/auth/session/validate/route.ts @@ -4,6 +4,7 @@ import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() +// @ts-expect-error: this is going to complain lmfao - hacky workaround for now; there's probably a built in method for this somewhere? - read ./schema.ts handler.openapi(authValidationRoute, async (ctx) => { const authSessionManager = new AuthSessionManager(ctx) diff --git a/src/v2/routes/auth/session/validate/schema.ts b/src/v2/routes/auth/session/validate/schema.ts index 14d1a73..eb6cd38 100644 --- a/src/v2/routes/auth/session/validate/schema.ts +++ b/src/v2/routes/auth/session/validate/schema.ts @@ -1,7 +1,27 @@ import { z } from "@hono/zod-openapi" -import { selectUserSchema } from "@/v2/db/schema" + +// this is really ugly, and we really shouldn't be doing this manually at ALL lol +// BUT the issue is that the SQLite drizzle adapter for lucia does not support LibSQL yet +// therefore, we have inconsistencies between camelCase and snake_case. + +// considering that snake_case this is ONLY for this route (where we're using Lucia) - it's honestly probably fine to keep? +export const validationUserSchema = z.object({ + avatar_url: z.string().nullable(), + banner_url: z.string().nullable(), + username: z.string(), + username_colour: z.string().nullable(), + email: z.string(), + email_verified: z.boolean(), + pronouns: z.string().nullable(), + verified: z.boolean(), + bio: z.string().nullable(), + date_joined: z.string(), + role_flags: z.number(), + is_contributor: z.boolean(), + self_assignable_role_flags: z.number().nullable(), +}) export const authValidationSchema = z.object({ success: z.literal(true), - user: selectUserSchema, + user: validationUserSchema, }) From 2048ac05471fa9d05c9245abb130ee9c5d1b263e Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Thu, 4 Jan 2024 06:21:12 +0000 Subject: [PATCH 211/318] revert type defs for db attrs --- package.json | 4 +- pnpm-lock.yaml | 803 ++++++++++++++++-- src/index.ts | 29 +- .../lib/auth/definitions/auth-definitions.ts | 40 +- src/v2/lib/auth/lucia.ts | 9 +- src/v2/middleware/csrf.ts | 2 + 6 files changed, 769 insertions(+), 118 deletions(-) diff --git a/package.json b/package.json index 2725faa..10ad8e4 100644 --- a/package.json +++ b/package.json @@ -37,14 +37,14 @@ "@hono/swagger-ui": "^0.2.1", "@hono/zod-openapi": "^0.9.5", "@libsql/client": "0.4.0-pre.5", - "@lucia-auth/adapter-sqlite": "3.0.0-beta.11", + "@lucia-auth/adapter-sqlite": "3.0.0-beta.12", "@scalar/hono-api-reference": "^0.3.9", "@typescript-eslint/eslint-plugin": "^6.16.0", "better-sqlite3": "^9.2.2", "drizzle-orm": "^0.29.2", "drizzle-zod": "^0.5.1", "hono": "^3.11.11", - "lucia": "3.0.0-beta.13", + "lucia": "3.0.0-beta.14", "oslo": "^0.26.2", "prettier": "^3.1.1", "zod": "^3.22.4" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 593dd5e..10c7905 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,14 +18,14 @@ dependencies: specifier: 0.4.0-pre.5 version: 0.4.0-pre.5 "@lucia-auth/adapter-sqlite": - specifier: 3.0.0-beta.11 - version: 3.0.0-beta.11(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2)(lucia@3.0.0-beta.13) + specifier: 3.0.0-beta.12 + version: 3.0.0-beta.12(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2)(lucia@3.0.0-beta.14) "@scalar/hono-api-reference": specifier: ^0.3.9 - version: 0.3.9(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(hono@3.11.11)(nanoid@5.0.4)(postcss@8.4.32)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.3) + version: 0.3.9(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(hono@3.11.11)(nanoid@5.0.4)(postcss@8.4.32)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.4) "@typescript-eslint/eslint-plugin": specifier: ^6.16.0 - version: 6.16.0(@typescript-eslint/parser@6.16.0)(eslint@8.56.0)(typescript@5.3.3) + version: 6.16.0(@typescript-eslint/parser@6.17.0)(eslint@8.56.0)(typescript@5.3.3) better-sqlite3: specifier: ^9.2.2 version: 9.2.2 @@ -39,8 +39,8 @@ dependencies: specifier: ^3.11.11 version: 3.11.11 lucia: - specifier: 3.0.0-beta.13 - version: 3.0.0-beta.13 + specifier: 3.0.0-beta.14 + version: 3.0.0-beta.14 oslo: specifier: ^0.26.2 version: 0.26.2 @@ -2120,7 +2120,7 @@ packages: "@codemirror/language": 6.10.0 "@codemirror/state": 6.4.0 "@lezer/common": 1.2.0 - "@lezer/css": 1.1.5 + "@lezer/css": 1.1.6 transitivePeerDependencies: - "@codemirror/view" dev: false @@ -2138,7 +2138,7 @@ packages: "@codemirror/state": 6.4.0 "@codemirror/view": 6.23.0 "@lezer/common": 1.2.0 - "@lezer/css": 1.1.5 + "@lezer/css": 1.1.6 "@lezer/html": 1.3.8 dev: false @@ -2274,6 +2274,28 @@ packages: superjson: 2.2.1 dev: true + /@emnapi/core@0.45.0: + resolution: + { + integrity: sha512-DPWjcUDQkCeEM4VnljEOEcXdAD7pp8zSZsgOujk/LGIwCXWbXJngin+MO4zbH429lzeC3WbYLGjE2MaUOwzpyw==, + } + requiresBuild: true + dependencies: + tslib: 2.6.2 + dev: false + optional: true + + /@emnapi/runtime@0.45.0: + resolution: + { + integrity: sha512-Txumi3td7J4A/xTTwlssKieHKTGl3j4A1tglBx72auZ49YK7ePY6XZricgIg9mnZT4xPfA+UPCUdnhRuEFDL+w==, + } + requiresBuild: true + dependencies: + tslib: 2.6.2 + dev: false + optional: true + /@esbuild-kit/core-utils@3.3.2: resolution: { @@ -3606,14 +3628,14 @@ packages: } dev: false - /@floating-ui/vue@1.0.2(vue@3.4.3): + /@floating-ui/vue@1.0.2(vue@3.4.4): resolution: { integrity: sha512-sImlAl9mAoCKZLNlwWz2P2ZMJIDlOEDXrRD6aD2sIHAka1LPC+nWtB+D3lPe7IE7FGWSbwBPTnlSdlABa3Fr0A==, } dependencies: "@floating-ui/dom": 1.5.3 - vue-demi: 0.14.6(vue@3.4.3) + vue-demi: 0.14.6(vue@3.4.4) transitivePeerDependencies: - "@vue/composition-api" - vue @@ -3649,6 +3671,18 @@ packages: vue: 3.4.3(typescript@5.3.3) dev: false + /@headlessui/vue@1.7.16(vue@3.4.4): + resolution: + { + integrity: sha512-nKT+nf/q6x198SsyK54mSszaQl/z+QxtASmgMEJtpxSX2Q0OPJX0upS/9daDyiECpeAsvjkoOrm2O/6PyBQ+Qg==, + } + engines: { node: ">=10" } + peerDependencies: + vue: ^3.2.0 + dependencies: + vue: 3.4.4(typescript@5.3.3) + dev: false + /@hono/swagger-ui@0.2.1(hono@3.11.11): resolution: { @@ -3811,10 +3845,10 @@ packages: } dev: false - /@lezer/css@1.1.5: + /@lezer/css@1.1.6: resolution: { - integrity: sha512-yyJ6WbSFavzpg74N/K0ZYIlk8hRA0+vdS2MOUUquoasmt64o4JXIx/fXPtX4d6FeFjtkOjJ6+JhdzijJ4ye9kg==, + integrity: sha512-/HhbnfXchRc995VdDH9TBzd1B2CO/A4uhOhELqGjd7Bymgc+tGlb0W9Vp5GA1Otq8Ef4JCXpuKmr4hH3aFny6A==, } dependencies: "@lezer/common": 1.2.0 @@ -4027,15 +4061,15 @@ packages: dev: false optional: true - /@lucia-auth/adapter-sqlite@3.0.0-beta.11(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2)(lucia@3.0.0-beta.13): + /@lucia-auth/adapter-sqlite@3.0.0-beta.12(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2)(lucia@3.0.0-beta.14): resolution: { - integrity: sha512-Yvnu6p3hP81ldeoaKC66svzc0Kyfxtc54pYukxAMQKFdc+puCcMzCAk71/s5BJwFeyzepA+F1WdV/7jvduKw+g==, + integrity: sha512-DZpBsdOjxwibUohQK+2EDr/Lwl5IJTs4yUCUoDqXziniwHOuJSsOezpv5FsI9Y9bOwWWUP5wLyzV502CCsy1Mw==, } peerDependencies: "@libsql/client": ^0.3.0 better-sqlite3: 8.x - 9.x - lucia: 3.0.0-beta.13 + lucia: 3.0.0-beta.14 peerDependenciesMeta: "@libsql/client": optional: true @@ -4044,7 +4078,7 @@ packages: dependencies: "@libsql/client": 0.4.0-pre.5 better-sqlite3: 9.2.2 - lucia: 3.0.0-beta.13 + lucia: 3.0.0-beta.14 dev: false /@neon-rs/load@0.0.4: @@ -4066,6 +4100,18 @@ packages: dev: false optional: true + /@node-rs/argon2-android-arm-eabi@1.6.1: + resolution: + { + integrity: sha512-tE6vyT7sBx0XXmvzH+1q58XB8qoy7ZeiNgGpoMunO/97ssvYKcgvIfbkVao8aHHClmjZvWb2Juy598I5AkR30w==, + } + engines: { node: ">= 10" } + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + /@node-rs/argon2-android-arm64@1.5.2: resolution: { @@ -4078,6 +4124,18 @@ packages: dev: false optional: true + /@node-rs/argon2-android-arm64@1.6.1: + resolution: + { + integrity: sha512-3HYc9lOZ63j71sSFjpVTgu1HUg2O94HvVz66j47Ia8Qq6wjpQusUebeUigMIRPq6Ewh6AgeGv5fxe0cQLGqHlw==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + /@node-rs/argon2-darwin-arm64@1.5.2: resolution: { @@ -4090,6 +4148,18 @@ packages: dev: false optional: true + /@node-rs/argon2-darwin-arm64@1.6.1: + resolution: + { + integrity: sha512-rJ0OluVhSa4xYc5yQvuzgEPctn/xT10qPyEYQmJ0bBKOA1U75nI20ZAhVdz5olWIBuIsS3vmNEQ5vjrY+DC5Yw==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + /@node-rs/argon2-darwin-x64@1.5.2: resolution: { @@ -4102,6 +4172,18 @@ packages: dev: false optional: true + /@node-rs/argon2-darwin-x64@1.6.1: + resolution: + { + integrity: sha512-7j6ZLB77XbrF0jpV2ur1cE42mfYf5L6O0coco04yH7wRbIGIKupS7CW+7ZGWR7zqi3RCV1AM2Qdq8FyXuZkZJA==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + /@node-rs/argon2-freebsd-x64@1.5.2: resolution: { @@ -4114,6 +4196,18 @@ packages: dev: false optional: true + /@node-rs/argon2-freebsd-x64@1.6.1: + resolution: + { + integrity: sha512-lycNRomwXJv/O30iP6b6kcXbVRk5vCv2aX44ZeeGrGYWAR0Wz0RWHLe884CmnUW1RoFGN2517PHIPP66TCKJbQ==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + /@node-rs/argon2-linux-arm-gnueabihf@1.5.2: resolution: { @@ -4126,6 +4220,18 @@ packages: dev: false optional: true + /@node-rs/argon2-linux-arm-gnueabihf@1.6.1: + resolution: + { + integrity: sha512-/4FdsWZT8xGiZEIz21bS0sz/3aG6+GaEgFSyr1wF6ui2xdr4nhobOUxhkaPXR1vOwIE3v9B5YB5uehtSCdNTHw==, + } + engines: { node: ">= 10" } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@node-rs/argon2-linux-arm64-gnu@1.5.2: resolution: { @@ -4138,6 +4244,18 @@ packages: dev: false optional: true + /@node-rs/argon2-linux-arm64-gnu@1.6.1: + resolution: + { + integrity: sha512-GpWZPsc8sy7aNdeV2W6pCPxvXriq+d4pbKX5JsRDzsfyF7OkN6O7ysJ2pYXe6Hvfmr4syVnZ+XVAhs74JPUEVg==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@node-rs/argon2-linux-arm64-musl@1.5.2: resolution: { @@ -4150,6 +4268,18 @@ packages: dev: false optional: true + /@node-rs/argon2-linux-arm64-musl@1.6.1: + resolution: + { + integrity: sha512-GuMNkb/BtJBXDUDlgAu31limYbRBNryo6mHV0f3/qUveQP4+LZYx5zD2WorqawNAB4SjdAxJBc4rJgmqabHJDw==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@node-rs/argon2-linux-x64-gnu@1.5.2: resolution: { @@ -4162,6 +4292,18 @@ packages: dev: false optional: true + /@node-rs/argon2-linux-x64-gnu@1.6.1: + resolution: + { + integrity: sha512-wXtK5klEHYQx99jGjpWFiKhsjenhms4tc7bZOXiKf1WPnYwQNzpmuDmGGufxDX2KrdXRbSVD+DKJZCdxp/uSkg==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@node-rs/argon2-linux-x64-musl@1.5.2: resolution: { @@ -4174,6 +4316,32 @@ packages: dev: false optional: true + /@node-rs/argon2-linux-x64-musl@1.6.1: + resolution: + { + integrity: sha512-fKJNzFe4QZ3/+C4BuYXK+Je9H2/AY2ojj4Gbr/aFYleu3B/S0pDMvLRKqb3yx5FGeyPBkrKwMrscCqPxAFKJbw==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-wasm32-wasi@1.6.1: + resolution: + { + integrity: sha512-wv1eciTy1WHP34dufxYT02lkiS2qXXeY2wPit7qA8iKlEzAOMzOxbbk9ePWFGTGaYHqgjzy+gXAbunJ/uv8NmQ==, + } + engines: { node: ">=14.0.0" } + cpu: [wasm32] + requiresBuild: true + dependencies: + "@emnapi/core": 0.45.0 + "@emnapi/runtime": 0.45.0 + dev: false + optional: true + /@node-rs/argon2-win32-arm64-msvc@1.5.2: resolution: { @@ -4186,6 +4354,18 @@ packages: dev: false optional: true + /@node-rs/argon2-win32-arm64-msvc@1.6.1: + resolution: + { + integrity: sha512-9tbGPwUGWsuWl9JGeMusaRsCDQeO39H3H7lZRVAPgPtP4UUU/jSzLgi4WA37E6XF9ZSFr+V82Gb+isXOTTm+1w==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@node-rs/argon2-win32-ia32-msvc@1.5.2: resolution: { @@ -4198,6 +4378,18 @@ packages: dev: false optional: true + /@node-rs/argon2-win32-ia32-msvc@1.6.1: + resolution: + { + integrity: sha512-mZfF/FSop7OPU1LR9j+i7n4SRBjZoAOBzcgcQGWx6DSoL3vSJItJ5qm1dZ923PpsyMm2iUTQyejGgR98tOhpnQ==, + } + engines: { node: ">= 10" } + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@node-rs/argon2-win32-x64-msvc@1.5.2: resolution: { @@ -4210,6 +4402,18 @@ packages: dev: false optional: true + /@node-rs/argon2-win32-x64-msvc@1.6.1: + resolution: + { + integrity: sha512-y2FPYGXHEaSodc/ZIjELbxXTz4x84fdbDBELcWLBoPNJEy3z4P5bJDrUn5rP8VbIFcaJ9HwUmQP54PFemF4ReQ==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@node-rs/argon2@1.5.2: resolution: { @@ -4232,6 +4436,29 @@ packages: "@node-rs/argon2-win32-x64-msvc": 1.5.2 dev: false + /@node-rs/argon2@1.6.1: + resolution: + { + integrity: sha512-5vYE6PXnwpNEdlalC+0ygvZrHS5++43QsxHM3v+SfbhZL8utoHjkiN8VugKIpi4DPtCr+PMmQ24qZX8E8UK57Q==, + } + engines: { node: ">= 10" } + optionalDependencies: + "@node-rs/argon2-android-arm-eabi": 1.6.1 + "@node-rs/argon2-android-arm64": 1.6.1 + "@node-rs/argon2-darwin-arm64": 1.6.1 + "@node-rs/argon2-darwin-x64": 1.6.1 + "@node-rs/argon2-freebsd-x64": 1.6.1 + "@node-rs/argon2-linux-arm-gnueabihf": 1.6.1 + "@node-rs/argon2-linux-arm64-gnu": 1.6.1 + "@node-rs/argon2-linux-arm64-musl": 1.6.1 + "@node-rs/argon2-linux-x64-gnu": 1.6.1 + "@node-rs/argon2-linux-x64-musl": 1.6.1 + "@node-rs/argon2-wasm32-wasi": 1.6.1 + "@node-rs/argon2-win32-arm64-msvc": 1.6.1 + "@node-rs/argon2-win32-ia32-msvc": 1.6.1 + "@node-rs/argon2-win32-x64-msvc": 1.6.1 + dev: false + /@node-rs/bcrypt-android-arm-eabi@1.7.3: resolution: { @@ -4244,6 +4471,18 @@ packages: dev: false optional: true + /@node-rs/bcrypt-android-arm-eabi@1.8.1: + resolution: + { + integrity: sha512-v+FgdokyvPAawpSVuj7x8B/lOPQj86ToqeSTCqBNMdQIQngDL6h8fxYPv8kBrY6kqAd+nFhp3rjaWav0fYB+PQ==, + } + engines: { node: ">= 10" } + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + /@node-rs/bcrypt-android-arm64@1.7.3: resolution: { @@ -4256,6 +4495,18 @@ packages: dev: false optional: true + /@node-rs/bcrypt-android-arm64@1.8.1: + resolution: + { + integrity: sha512-XT8NUEakx/SHTq/Sczd8wmLRRt3vTn1qeSpfl9ZVU4p5StcrWILn2zKAD3/G6NJMw7jov3ob4fw638SVP1zQ1g==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + /@node-rs/bcrypt-darwin-arm64@1.7.3: resolution: { @@ -4268,6 +4519,18 @@ packages: dev: false optional: true + /@node-rs/bcrypt-darwin-arm64@1.8.1: + resolution: + { + integrity: sha512-FX7C9Cd1B1mrtzDO+388cx3Pw8O2/yIYL61XcINZwKu5XE+7cEA7+F2ad9LS8FFbYE9/HOrVR5R5oLpOTzrEVA==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + /@node-rs/bcrypt-darwin-x64@1.7.3: resolution: { @@ -4280,6 +4543,18 @@ packages: dev: false optional: true + /@node-rs/bcrypt-darwin-x64@1.8.1: + resolution: + { + integrity: sha512-vgDa+6EcdjqJCXZz9IB6sZvNnKxrnUH8B4LlL2Wb6YyP/bXDzax3VI5XizTH9v0N7Q3zQ89ZjQCa7+NhfOLRxQ==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + /@node-rs/bcrypt-freebsd-x64@1.7.3: resolution: { @@ -4292,6 +4567,18 @@ packages: dev: false optional: true + /@node-rs/bcrypt-freebsd-x64@1.8.1: + resolution: + { + integrity: sha512-rNZS5aFaYJOgskKISXmc/JogmDzZIslbxXXDFehpNW29N4ABsM6WpXZutAnNLOjhW66fZ2My2m5PXjP7oE6qVQ==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + /@node-rs/bcrypt-linux-arm-gnueabihf@1.7.3: resolution: { @@ -4304,6 +4591,18 @@ packages: dev: false optional: true + /@node-rs/bcrypt-linux-arm-gnueabihf@1.8.1: + resolution: + { + integrity: sha512-l4xmlBgenRzVVrfJZko7MW/0z0oWSZ8oiuYdKs21ptGR6TzYFDgvKlHUBo4yN60bEGZxlUEYMiESi8ddng/HXA==, + } + engines: { node: ">= 10" } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@node-rs/bcrypt-linux-arm64-gnu@1.7.3: resolution: { @@ -4316,6 +4615,18 @@ packages: dev: false optional: true + /@node-rs/bcrypt-linux-arm64-gnu@1.8.1: + resolution: + { + integrity: sha512-WiZLmOSyxb1T2w8nMXciWfkYCCOzl+VG1JdhvQ0w9/MqRoTU1VasZ7nsMZfzsJW/gfG/W3ihCIoI0RZBZ1QGJA==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@node-rs/bcrypt-linux-arm64-musl@1.7.3: resolution: { @@ -4328,6 +4639,18 @@ packages: dev: false optional: true + /@node-rs/bcrypt-linux-arm64-musl@1.8.1: + resolution: + { + integrity: sha512-2QhQQCeK/7sTPvCgEDvecmgv9zOeQw7sv8VYpx/eoTp+7Nc/w8WjwCiM3PFWPriPPWVcKV0FO81kNjlCap9zHg==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@node-rs/bcrypt-linux-x64-gnu@1.7.3: resolution: { @@ -4340,6 +4663,18 @@ packages: dev: false optional: true + /@node-rs/bcrypt-linux-x64-gnu@1.8.1: + resolution: + { + integrity: sha512-DNbhjS5HxiSBLEvlPQsFlt1peO0LyDkHNI39Xw8q6ADU0pgad36PIA0bHsu7shWWzBu0l4OHck9sU9eRLvHSTA==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@node-rs/bcrypt-linux-x64-musl@1.7.3: resolution: { @@ -4352,6 +4687,32 @@ packages: dev: false optional: true + /@node-rs/bcrypt-linux-x64-musl@1.8.1: + resolution: + { + integrity: sha512-KUXmJPfe7XossL41tSDhkUma9WHFWDGINhUFBBRBHIJ+WL0MMkkO4N47LZLniAkj8EH1ZFxMugVJSZfPjAzQQQ==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-wasm32-wasi@1.8.1: + resolution: + { + integrity: sha512-6sVRrMvrHDRoFeFHALdRcUmZWVU74zTuXv7DakOD2/sTvhFlgyDyimWGjhzOp9CN+jBjLkRUGUReUKqvsAJ+Ww==, + } + engines: { node: ">=14.0.0" } + cpu: [wasm32] + requiresBuild: true + dependencies: + "@emnapi/core": 0.45.0 + "@emnapi/runtime": 0.45.0 + dev: false + optional: true + /@node-rs/bcrypt-win32-arm64-msvc@1.7.3: resolution: { @@ -4364,6 +4725,18 @@ packages: dev: false optional: true + /@node-rs/bcrypt-win32-arm64-msvc@1.8.1: + resolution: + { + integrity: sha512-nkZF5JKuADGr7/2YOTLndLw7a8thTgOT5b0ODRxlNzFeCBs1NUJ6wgjnyPldYhfTWjG6Z4KMAXfnQv4R/HJzmw==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@node-rs/bcrypt-win32-ia32-msvc@1.7.3: resolution: { @@ -4376,6 +4749,18 @@ packages: dev: false optional: true + /@node-rs/bcrypt-win32-ia32-msvc@1.8.1: + resolution: + { + integrity: sha512-HySULhQOZygQHKEP+/ThxNyzej+2zfypMzNkq/7/bXlZ5C0e5V9qjcmxgVAue3IUmWTjftR/18zKG8Y3utecDQ==, + } + engines: { node: ">= 10" } + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@node-rs/bcrypt-win32-x64-msvc@1.7.3: resolution: { @@ -4388,6 +4773,18 @@ packages: dev: false optional: true + /@node-rs/bcrypt-win32-x64-msvc@1.8.1: + resolution: + { + integrity: sha512-Ii6aiLCYRg43EjVXyNrA+QBYMRF4vhgSUe64p9aBdahtlvmNy0bw2IX4T8sYGrQj4lDTLWi5xK44izh+0HbjAQ==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@node-rs/bcrypt@1.7.3: resolution: { @@ -4410,6 +4807,29 @@ packages: "@node-rs/bcrypt-win32-x64-msvc": 1.7.3 dev: false + /@node-rs/bcrypt@1.8.1: + resolution: + { + integrity: sha512-MmVvL64XIFk/I8EcViMUiO9XzRVCGhuaHGJdek5XV3XhaWj1YuuycaF8TEUlycHs7n+NJcbS2dNt2u8r54PR8Q==, + } + engines: { node: ">= 10" } + optionalDependencies: + "@node-rs/bcrypt-android-arm-eabi": 1.8.1 + "@node-rs/bcrypt-android-arm64": 1.8.1 + "@node-rs/bcrypt-darwin-arm64": 1.8.1 + "@node-rs/bcrypt-darwin-x64": 1.8.1 + "@node-rs/bcrypt-freebsd-x64": 1.8.1 + "@node-rs/bcrypt-linux-arm-gnueabihf": 1.8.1 + "@node-rs/bcrypt-linux-arm64-gnu": 1.8.1 + "@node-rs/bcrypt-linux-arm64-musl": 1.8.1 + "@node-rs/bcrypt-linux-x64-gnu": 1.8.1 + "@node-rs/bcrypt-linux-x64-musl": 1.8.1 + "@node-rs/bcrypt-wasm32-wasi": 1.8.1 + "@node-rs/bcrypt-win32-arm64-msvc": 1.8.1 + "@node-rs/bcrypt-win32-ia32-msvc": 1.8.1 + "@node-rs/bcrypt-win32-x64-msvc": 1.8.1 + dev: false + /@nodelib/fs.scandir@2.1.5: resolution: { @@ -4483,7 +4903,7 @@ packages: } dev: false - /@scalar/api-client@0.8.6(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.3): + /@scalar/api-client@0.8.6(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.4): resolution: { integrity: sha512-qAlb0nqOnhqsrmEL8Cbjdi/TPGSyyXTmoVLMV73DqnAMe+yC4PvbEkJjIN0zQLV2jTtcG7O9LQeqo2PgRIgrDQ==, @@ -4492,19 +4912,19 @@ packages: peerDependencies: vue: ^3.3.0 dependencies: - "@headlessui/vue": 1.7.16(vue@3.4.3) - "@scalar/themes": 0.5.1(vue@3.4.3) - "@scalar/use-codemirror": 0.7.16(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.3) - "@scalar/use-keyboard-event": 0.5.6(vue@3.4.3) - "@scalar/use-modal": 0.2.1(@headlessui/vue@1.7.16)(vue@3.4.3) - "@vueuse/core": 10.7.1(vue@3.4.3) + "@headlessui/vue": 1.7.16(vue@3.4.4) + "@scalar/themes": 0.5.1(vue@3.4.4) + "@scalar/use-codemirror": 0.7.16(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.4) + "@scalar/use-keyboard-event": 0.5.6(vue@3.4.4) + "@scalar/use-modal": 0.2.1(@headlessui/vue@1.7.16)(vue@3.4.4) + "@vueuse/core": 10.7.1(vue@3.4.4) axios: 1.6.3 content-type: 1.0.5 javascript-time-ago: 2.5.9 nanoid: 5.0.4 pretty-bytes: 6.1.1 pretty-ms: 8.0.0 - vue: 3.4.3(typescript@5.3.3) + vue: 3.4.4(typescript@5.3.3) transitivePeerDependencies: - "@codemirror/lang-html" - "@codemirror/lang-java" @@ -4524,7 +4944,7 @@ packages: - debug dev: false - /@scalar/api-reference@1.12.7(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(nanoid@5.0.4)(postcss@8.4.32)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.3): + /@scalar/api-reference@1.12.7(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(nanoid@5.0.4)(postcss@8.4.32)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.4): resolution: { integrity: sha512-Ok00vJx8ko9UZ0eCE2HFUtGd/GONJhYF7Nn5jp7XmxzLb+d8wywfwHm9Vkp3d/ieCkc5ORNHTf54+g/6HPwG8w==, @@ -4534,23 +4954,23 @@ packages: unified: ^11.0.0 vue: ^3.3.0 dependencies: - "@floating-ui/vue": 1.0.2(vue@3.4.3) - "@headlessui/vue": 1.7.16(vue@3.4.3) - "@scalar/api-client": 0.8.6(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.3) + "@floating-ui/vue": 1.0.2(vue@3.4.4) + "@headlessui/vue": 1.7.16(vue@3.4.4) + "@scalar/api-client": 0.8.6(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.4) "@scalar/components": 0.2.0(typescript@5.3.3) "@scalar/snippetz": 0.1.4 - "@scalar/swagger-editor": 0.9.2(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/view@6.23.0)(@headlessui/vue@1.7.16)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.3) + "@scalar/swagger-editor": 0.9.2(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/view@6.23.0)(@headlessui/vue@1.7.16)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.4) "@scalar/swagger-parser": 0.5.13(openapi-types@12.1.3) - "@scalar/themes": 0.5.1(vue@3.4.3) + "@scalar/themes": 0.5.1(vue@3.4.4) "@scalar/use-clipboard": 0.5.11(@scalar/use-toasts@0.5.11)(nanoid@5.0.4) - "@scalar/use-codemirror": 0.7.16(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.3) - "@scalar/use-keyboard-event": 0.5.6(vue@3.4.3) - "@scalar/use-modal": 0.2.1(@headlessui/vue@1.7.16)(vue@3.4.3) - "@scalar/use-toasts": 0.5.11(nanoid@5.0.4)(vue@3.4.3) - "@scalar/use-tooltip": 0.5.7(vue@3.4.3) + "@scalar/use-codemirror": 0.7.16(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.4) + "@scalar/use-keyboard-event": 0.5.6(vue@3.4.4) + "@scalar/use-modal": 0.2.1(@headlessui/vue@1.7.16)(vue@3.4.4) + "@scalar/use-toasts": 0.5.11(nanoid@5.0.4)(vue@3.4.4) + "@scalar/use-tooltip": 0.5.7(vue@3.4.4) "@unhead/schema": 1.8.9 "@vcarl/remark-headings": 0.1.0 - "@vueuse/core": 10.7.1(vue@3.4.3) + "@vueuse/core": 10.7.1(vue@3.4.4) "@xmldom/xmldom": 0.8.10 axios: 1.6.3 fuse.js: 6.6.2 @@ -4571,7 +4991,7 @@ packages: remark-stringify: 11.0.0 unhead: 1.8.9 unified: 11.0.4 - vue: 3.4.3(typescript@5.3.3) + vue: 3.4.4(typescript@5.3.3) transitivePeerDependencies: - "@codemirror/lang-html" - "@codemirror/lang-java" @@ -4615,7 +5035,7 @@ packages: - typescript dev: false - /@scalar/hono-api-reference@0.3.9(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(hono@3.11.11)(nanoid@5.0.4)(postcss@8.4.32)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.3): + /@scalar/hono-api-reference@0.3.9(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(hono@3.11.11)(nanoid@5.0.4)(postcss@8.4.32)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.4): resolution: { integrity: sha512-F52PqTkAmdeCP84wjlcZxcYJz06Bqgk/gTmBW60wd9hP70JjlMsP31DriIHyx3R5x1SlYvpEwf2kpH3b13IxBQ==, @@ -4624,7 +5044,7 @@ packages: peerDependencies: hono: ^3.0.0 dependencies: - "@scalar/api-reference": 1.12.7(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(nanoid@5.0.4)(postcss@8.4.32)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.3) + "@scalar/api-reference": 1.12.7(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(nanoid@5.0.4)(postcss@8.4.32)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.4) hono: 3.11.11 transitivePeerDependencies: - "@codemirror/lang-html" @@ -4689,7 +5109,7 @@ packages: "@scalar/snippetz-plugin-node-undici": 0.1.4 dev: false - /@scalar/swagger-editor@0.9.2(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/view@6.23.0)(@headlessui/vue@1.7.16)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.3): + /@scalar/swagger-editor@0.9.2(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/view@6.23.0)(@headlessui/vue@1.7.16)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.4): resolution: { integrity: sha512-h176YaLpjofDJZXG+aZM28yKweBtV/yh7lGSsK+y0FO3kKxCpXC0ONEgG0vtFBzV/tXjAXIKNBpd3mRpwDQzfA==, @@ -4701,10 +5121,10 @@ packages: dependencies: "@codemirror/state": 6.4.0 "@scalar/components": 0.2.0(typescript@5.3.3) - "@scalar/themes": 0.5.1(vue@3.4.3) - "@scalar/use-codemirror": 0.7.16(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.3) - "@scalar/use-modal": 0.2.1(@headlessui/vue@1.7.16)(vue@3.4.3) - "@vueuse/core": 10.7.1(vue@3.4.3) + "@scalar/themes": 0.5.1(vue@3.4.4) + "@scalar/use-codemirror": 0.7.16(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.4) + "@scalar/use-modal": 0.2.1(@headlessui/vue@1.7.16)(vue@3.4.4) + "@vueuse/core": 10.7.1(vue@3.4.4) nanoid: 5.0.4 rehype-external-links: 3.0.0 rehype-format: 5.0.0 @@ -4716,7 +5136,7 @@ packages: remark-parse: 11.0.0 remark-rehype: 11.0.0 unified: 11.0.4 - vue: 3.4.3(typescript@5.3.3) + vue: 3.4.4(typescript@5.3.3) transitivePeerDependencies: - "@codemirror/lang-html" - "@codemirror/lang-java" @@ -4750,7 +5170,7 @@ packages: - openapi-types dev: false - /@scalar/themes@0.5.1(vue@3.4.3): + /@scalar/themes@0.5.1(vue@3.4.4): resolution: { integrity: sha512-iaX9H1P/KukzuzkgRlbE4QWxYRHWQajf4AGQVI9Na9KeIQ4NgpkWWsIfcDKekP6P7QrlLvFpgkLcjJf5mnnF4A==, @@ -4759,7 +5179,7 @@ packages: peerDependencies: vue: ^3.3.0 dependencies: - vue: 3.4.3(typescript@5.3.3) + vue: 3.4.4(typescript@5.3.3) dev: false /@scalar/use-clipboard@0.5.11(@scalar/use-toasts@0.5.11)(nanoid@5.0.4): @@ -4772,11 +5192,11 @@ packages: "@scalar/use-toasts": 0.5.11 nanoid: ^5.0.1 dependencies: - "@scalar/use-toasts": 0.5.11(nanoid@5.0.4)(vue@3.4.3) + "@scalar/use-toasts": 0.5.11(nanoid@5.0.4)(vue@3.4.4) nanoid: 5.0.4 dev: false - /@scalar/use-codemirror@0.7.16(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.3): + /@scalar/use-codemirror@0.7.16(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.4): resolution: { integrity: sha512-TQXplKCVDheuR/w7q9q0HzyQ9rJmy3P0tAFw2jPLwfAq3Q6YVpltuu3UrKzAOtxV3FcKMc7lzYZLaGY0DHcTVw==, @@ -4813,10 +5233,10 @@ packages: "@lezer/lr": 1.3.14 "@uiw/codemirror-themes": 4.21.21(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0) codemirror: 6.0.1(@lezer/common@1.2.0) - vue: 3.4.3(typescript@5.3.3) + vue: 3.4.4(typescript@5.3.3) dev: false - /@scalar/use-keyboard-event@0.5.6(vue@3.4.3): + /@scalar/use-keyboard-event@0.5.6(vue@3.4.4): resolution: { integrity: sha512-/sKl0LDr2RoTVuQIUaeeOkEbUtl2z+cqEHHF4CNenqOra/Sz/u/eexDHbMc7ZTaaIo9snMHSceLo2k9ThQUz3g==, @@ -4825,10 +5245,10 @@ packages: peerDependencies: vue: ^3.3.0 dependencies: - vue: 3.4.3(typescript@5.3.3) + vue: 3.4.4(typescript@5.3.3) dev: false - /@scalar/use-modal@0.2.1(@headlessui/vue@1.7.16)(vue@3.4.3): + /@scalar/use-modal@0.2.1(@headlessui/vue@1.7.16)(vue@3.4.4): resolution: { integrity: sha512-OAf7nIoKAbt53GGbbsDbIoAF+/RRQIjnBJhgfk4eI1ACyAOVXwVWrjJ1eYmGbv86gzEX9neb/qpwkc9kcnz1FQ==, @@ -4838,11 +5258,11 @@ packages: "@headlessui/vue": ^1.7.0 vue: ^3.3.0 dependencies: - "@headlessui/vue": 1.7.16(vue@3.4.3) - vue: 3.4.3(typescript@5.3.3) + "@headlessui/vue": 1.7.16(vue@3.4.4) + vue: 3.4.4(typescript@5.3.3) dev: false - /@scalar/use-toasts@0.5.11(nanoid@5.0.4)(vue@3.4.3): + /@scalar/use-toasts@0.5.11(nanoid@5.0.4)(vue@3.4.4): resolution: { integrity: sha512-5uaxV+944rkrYl3mQaQn+AruBCcDjN03jODko2K618unSf3JQixIi6ptoOcXCL6QAGM4FaHtMjRjX/7LJWOtOQ==, @@ -4853,10 +5273,10 @@ packages: vue: ^3.3.0 dependencies: nanoid: 5.0.4 - vue: 3.4.3(typescript@5.3.3) + vue: 3.4.4(typescript@5.3.3) dev: false - /@scalar/use-tooltip@0.5.7(vue@3.4.3): + /@scalar/use-tooltip@0.5.7(vue@3.4.4): resolution: { integrity: sha512-WmTleZDjR1Yerw1GLoh9li/3d9dFDWm1Vb39xrehtXx8bGB8+IkRyg8ZCfGzEKNySbf263QAaRmZkKUMVOGdAA==, @@ -4866,7 +5286,7 @@ packages: vue: ^3.3.0 dependencies: tippy.js: 6.3.7 - vue: 3.4.3(typescript@5.3.3) + vue: 3.4.4(typescript@5.3.3) dev: false /@segment/loosely-validate-event@2.0.0: @@ -5075,7 +5495,7 @@ packages: "@types/yargs-parser": 21.0.3 dev: false - /@typescript-eslint/eslint-plugin@6.16.0(@typescript-eslint/parser@6.16.0)(eslint@8.56.0)(typescript@5.3.3): + /@typescript-eslint/eslint-plugin@6.16.0(@typescript-eslint/parser@6.17.0)(eslint@8.56.0)(typescript@5.3.3): resolution: { integrity: sha512-O5f7Kv5o4dLWQtPX4ywPPa+v9G+1q1x8mz0Kr0pXUtKsevo+gIJHLkGc8RxaZWtP8RrhwhSNIWThnW42K9/0rQ==, @@ -5090,7 +5510,7 @@ packages: optional: true dependencies: "@eslint-community/regexpp": 4.10.0 - "@typescript-eslint/parser": 6.16.0(eslint@8.56.0)(typescript@5.3.3) + "@typescript-eslint/parser": 6.17.0(eslint@8.56.0)(typescript@5.3.3) "@typescript-eslint/scope-manager": 6.16.0 "@typescript-eslint/type-utils": 6.16.0(eslint@8.56.0)(typescript@5.3.3) "@typescript-eslint/utils": 6.16.0(eslint@8.56.0)(typescript@5.3.3) @@ -5107,10 +5527,10 @@ packages: - supports-color dev: false - /@typescript-eslint/parser@6.16.0(eslint@8.56.0)(typescript@5.3.3): + /@typescript-eslint/parser@6.17.0(eslint@8.56.0)(typescript@5.3.3): resolution: { - integrity: sha512-H2GM3eUo12HpKZU9njig3DF5zJ58ja6ahj1GoHEHOgQvYxzoFJJEvC1MQ7T2l9Ha+69ZSOn7RTxOdpC/y3ikMw==, + integrity: sha512-C4bBaX2orvhK+LlwrY8oWGmSl4WolCfYm513gEccdWZj0CwGadbIADb0FtVEcI+WzUyjyoBj2JRP8g25E6IB8A==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -5120,10 +5540,10 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/scope-manager": 6.16.0 - "@typescript-eslint/types": 6.16.0 - "@typescript-eslint/typescript-estree": 6.16.0(typescript@5.3.3) - "@typescript-eslint/visitor-keys": 6.16.0 + "@typescript-eslint/scope-manager": 6.17.0 + "@typescript-eslint/types": 6.17.0 + "@typescript-eslint/typescript-estree": 6.17.0(typescript@5.3.3) + "@typescript-eslint/visitor-keys": 6.17.0 debug: 4.3.4 eslint: 8.56.0 typescript: 5.3.3 @@ -5142,6 +5562,17 @@ packages: "@typescript-eslint/visitor-keys": 6.16.0 dev: false + /@typescript-eslint/scope-manager@6.17.0: + resolution: + { + integrity: sha512-RX7a8lwgOi7am0k17NUO0+ZmMOX4PpjLtLRgLmT1d3lBYdWH4ssBUbwdmc5pdRX8rXon8v9x8vaoOSpkHfcXGA==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + dependencies: + "@typescript-eslint/types": 6.17.0 + "@typescript-eslint/visitor-keys": 6.17.0 + dev: false + /@typescript-eslint/type-utils@6.16.0(eslint@8.56.0)(typescript@5.3.3): resolution: { @@ -5173,6 +5604,14 @@ packages: engines: { node: ^16.0.0 || >=18.0.0 } dev: false + /@typescript-eslint/types@6.17.0: + resolution: + { + integrity: sha512-qRKs9tvc3a4RBcL/9PXtKSehI/q8wuU9xYJxe97WFxnzH8NWWtcW3ffNS+EWg8uPvIerhjsEZ+rHtDqOCiH57A==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + dev: false + /@typescript-eslint/typescript-estree@6.16.0(typescript@5.3.3): resolution: { @@ -5198,6 +5637,31 @@ packages: - supports-color dev: false + /@typescript-eslint/typescript-estree@6.17.0(typescript@5.3.3): + resolution: + { + integrity: sha512-gVQe+SLdNPfjlJn5VNGhlOhrXz4cajwFd5kAgWtZ9dCZf4XJf8xmgCTLIqec7aha3JwgLI2CK6GY1043FRxZwg==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@typescript-eslint/types": 6.17.0 + "@typescript-eslint/visitor-keys": 6.17.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: false + /@typescript-eslint/utils@6.16.0(eslint@8.56.0)(typescript@5.3.3): resolution: { @@ -5231,6 +5695,17 @@ packages: eslint-visitor-keys: 3.4.3 dev: false + /@typescript-eslint/visitor-keys@6.17.0: + resolution: + { + integrity: sha512-H6VwB/k3IuIeQOyYczyyKN8wH6ed8EwliaYHLxOIhyF0dYEIsN8+Bk3GE19qafeMKyZJJHP8+O1HiFhFLUNKSg==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + dependencies: + "@typescript-eslint/types": 6.17.0 + eslint-visitor-keys: 3.4.3 + dev: false + /@uiw/codemirror-themes@4.21.21(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0): resolution: { @@ -5330,6 +5805,19 @@ packages: source-map-js: 1.0.2 dev: false + /@vue/compiler-core@3.4.4: + resolution: + { + integrity: sha512-U5AdCN+6skzh2bSJrkMj2KZsVkUpgK8/XlxjSRYQZhNPcvt9/kmgIMpFEiTyK+Dz5E1J+8o8//BEIX+bakgVSw==, + } + dependencies: + "@babel/parser": 7.23.6 + "@vue/shared": 3.4.4 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.0.2 + dev: false + /@vue/compiler-dom@3.4.3: resolution: { @@ -5340,6 +5828,16 @@ packages: "@vue/shared": 3.4.3 dev: false + /@vue/compiler-dom@3.4.4: + resolution: + { + integrity: sha512-iSwkdDULCN+Vr8z6uwdlL044GJ/nUmECxP9vu7MzEs4Qma0FwDLYvnvRcyO0ZITuu3Os4FptGUDnhi1kOLSaGw==, + } + dependencies: + "@vue/compiler-core": 3.4.4 + "@vue/shared": 3.4.4 + dev: false + /@vue/compiler-sfc@3.4.3: resolution: { @@ -5357,6 +5855,23 @@ packages: source-map-js: 1.0.2 dev: false + /@vue/compiler-sfc@3.4.4: + resolution: + { + integrity: sha512-OTFcU6vUxUNHBcarzkp4g6d25nvcmDvFDzPRvSrIsByFFPRYN+y3b+j9HxYwt6nlWvGyFCe0roeJdJlfYxbCBg==, + } + dependencies: + "@babel/parser": 7.23.6 + "@vue/compiler-core": 3.4.4 + "@vue/compiler-dom": 3.4.4 + "@vue/compiler-ssr": 3.4.4 + "@vue/shared": 3.4.4 + estree-walker: 2.0.2 + magic-string: 0.30.5 + postcss: 8.4.32 + source-map-js: 1.0.2 + dev: false + /@vue/compiler-ssr@3.4.3: resolution: { @@ -5367,6 +5882,16 @@ packages: "@vue/shared": 3.4.3 dev: false + /@vue/compiler-ssr@3.4.4: + resolution: + { + integrity: sha512-1DU9DflSSQlx/M61GEBN+NbT/anUki2ooDo9IXfTckCeKA/2IKNhY8KbG3x6zkd3KGrxzteC7de6QL88vEb41Q==, + } + dependencies: + "@vue/compiler-dom": 3.4.4 + "@vue/shared": 3.4.4 + dev: false + /@vue/reactivity@3.4.3: resolution: { @@ -5376,6 +5901,15 @@ packages: "@vue/shared": 3.4.3 dev: false + /@vue/reactivity@3.4.4: + resolution: + { + integrity: sha512-DFsuJBf6sfhd5SYzJmcBTUG9+EKqjF31Gsk1NJtnpJm9liSZ806XwGJUeNBVQIanax7ODV7Lmk/k17BgxXNuTg==, + } + dependencies: + "@vue/shared": 3.4.4 + dev: false + /@vue/runtime-core@3.4.3: resolution: { @@ -5386,6 +5920,16 @@ packages: "@vue/shared": 3.4.3 dev: false + /@vue/runtime-core@3.4.4: + resolution: + { + integrity: sha512-zWWwNQAj5JdxrmOA1xegJm+c4VtyIbDEKgQjSb4va5v7gGTCh0ZjvLI+htGFdVXaO9bs2J3C81p5p+6jrPK8Bw==, + } + dependencies: + "@vue/reactivity": 3.4.4 + "@vue/shared": 3.4.4 + dev: false + /@vue/runtime-dom@3.4.3: resolution: { @@ -5397,6 +5941,17 @@ packages: csstype: 3.1.3 dev: false + /@vue/runtime-dom@3.4.4: + resolution: + { + integrity: sha512-Nlh2ap1J/eJQ6R0g+AIRyGNwpTJQACN0dk8I8FRLH8Ev11DSvfcPOpn4+Kbg5xAMcuq0cHB8zFYxVrOgETrrvg==, + } + dependencies: + "@vue/runtime-core": 3.4.4 + "@vue/shared": 3.4.4 + csstype: 3.1.3 + dev: false + /@vue/server-renderer@3.4.3(vue@3.4.3): resolution: { @@ -5410,6 +5965,19 @@ packages: vue: 3.4.3(typescript@5.3.3) dev: false + /@vue/server-renderer@3.4.4(vue@3.4.4): + resolution: + { + integrity: sha512-+AjoiKcC41k7SMJBYkDO9xs79/Of8DiThS9mH5l2MK+EY0to3psI0k+sElvVqQvsoZTjHMEuMz0AEgvm2T+CwA==, + } + peerDependencies: + vue: 3.4.4 + dependencies: + "@vue/compiler-ssr": 3.4.4 + "@vue/shared": 3.4.4 + vue: 3.4.4(typescript@5.3.3) + dev: false + /@vue/shared@3.4.3: resolution: { @@ -5417,6 +5985,13 @@ packages: } dev: false + /@vue/shared@3.4.4: + resolution: + { + integrity: sha512-abSgiVRhfjfl3JALR/cSuBl74hGJ3SePgf1mKzodf1eMWLwHZbfEGxT2cNJSsNiw44jEgrO7bNkhchaWA7RwNw==, + } + dev: false + /@vueuse/core@10.7.1(vue@3.4.3): resolution: { @@ -5432,6 +6007,21 @@ packages: - vue dev: false + /@vueuse/core@10.7.1(vue@3.4.4): + resolution: + { + integrity: sha512-74mWHlaesJSWGp1ihg76vAnfVq9NTv1YT0SYhAQ6zwFNdBkkP+CKKJmVOEHcdSnLXCXYiL5e7MaewblfiYLP7g==, + } + dependencies: + "@types/web-bluetooth": 0.0.20 + "@vueuse/metadata": 10.7.1 + "@vueuse/shared": 10.7.1(vue@3.4.4) + vue-demi: 0.14.6(vue@3.4.4) + transitivePeerDependencies: + - "@vue/composition-api" + - vue + dev: false + /@vueuse/metadata@10.7.1: resolution: { @@ -5451,6 +6041,18 @@ packages: - vue dev: false + /@vueuse/shared@10.7.1(vue@3.4.4): + resolution: + { + integrity: sha512-v0jbRR31LSgRY/C5i5X279A/WQjD6/JsMzGa+eqt658oJ75IvQXAeONmwvEMrvJQKnRElq/frzBR7fhmWY5uLw==, + } + dependencies: + vue-demi: 0.14.6(vue@3.4.4) + transitivePeerDependencies: + - "@vue/composition-api" + - vue + dev: false + /@xmldom/xmldom@0.7.13: resolution: { @@ -6003,8 +6605,8 @@ packages: engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } hasBin: true dependencies: - caniuse-lite: 1.0.30001572 - electron-to-chromium: 1.4.616 + caniuse-lite: 1.0.30001574 + electron-to-chromium: 1.4.620 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.22.2) dev: false @@ -6127,10 +6729,10 @@ packages: engines: { node: ">=14.16" } dev: true - /caniuse-lite@1.0.30001572: + /caniuse-lite@1.0.30001574: resolution: { - integrity: sha512-1Pbh5FLmn5y4+QhNyJE9j3/7dK44dGB83/ZMjv/qJk86TvDbjk0LosiZo0i0WB0Vx607qMX9jYrn1VLHCkN4rw==, + integrity: sha512-BtYEK4r/iHt/txm81KBudCUcTy7t+s9emrIaHqjYurQ10x71zJ5VQ9x1dYPcz/b+pKSp4y/v1xSI67A+LzpNyg==, } dev: false @@ -7007,10 +7609,10 @@ packages: } dev: false - /electron-to-chromium@1.4.616: + /electron-to-chromium@1.4.620: resolution: { - integrity: sha512-1n7zWYh8eS0L9Uy+GskE0lkBUNK83cXTVJI0pU3mGprFsbfSdAc15VTFbo+A+Bq4pwstmL30AVcEU3Fo463lNg==, + integrity: sha512-a2fcSHOHrqBJsPNXtf6ZCEZpXrFCcbK1FBxfX3txoqWzNgtEDG1f3M59M98iwxhRW4iMKESnSjbJ310/rkrp0g==, } dev: false @@ -9429,13 +10031,13 @@ packages: es5-ext: 0.10.62 dev: true - /lucia@3.0.0-beta.13: + /lucia@3.0.0-beta.14: resolution: { - integrity: sha512-p5qJWSFax+MSuifh1lJ37lj9l7q7hB3JgMNutRgy6PKF+3Aw4hMii+Sts5yR4t1ETodqlDmuOBE7mdarGQunwg==, + integrity: sha512-MXJILHb4xyvf3qjO7w7mDnvVOub2LGWLSjgP1TBGPLDkBF62uXNfvPNH7QRvOwvuSLtQK+w7JoPjnjiFiIj9rg==, } dependencies: - oslo: 0.25.1 + oslo: 0.27.0 dev: false /magic-string@0.25.9: @@ -10702,24 +11304,24 @@ packages: os-tmpdir: 1.0.2 dev: false - /oslo@0.25.1: + /oslo@0.26.2: resolution: { - integrity: sha512-XEmUNC9qeMx8UVtHsP6I2xXYSmzVsv/sZw5VsKMTJvXHd3boHAY016ZJtviXiBbE18ah/mU9Dyv4MizwOGShxw==, + integrity: sha512-SY5AhyEc/Lvpq9ZeP/MuGXzI+TV6WRAIgSKtfyc0+/BSOhZr8vVTt/mfhOTATk41VsDeYcDutMKgLmFGOL4UMw==, } dependencies: "@node-rs/argon2": 1.5.2 "@node-rs/bcrypt": 1.7.3 dev: false - /oslo@0.26.2: + /oslo@0.27.0: resolution: { - integrity: sha512-SY5AhyEc/Lvpq9ZeP/MuGXzI+TV6WRAIgSKtfyc0+/BSOhZr8vVTt/mfhOTATk41VsDeYcDutMKgLmFGOL4UMw==, + integrity: sha512-93bfsAlsn2du5rUVUmdmXyTJW7nsO1dViouMc2B9sjmCUzqnTYMtvHSuqti/cmgm96XZIVJEjU+mMWfceLWyYQ==, } dependencies: - "@node-rs/argon2": 1.5.2 - "@node-rs/bcrypt": 1.7.3 + "@node-rs/argon2": 1.6.1 + "@node-rs/bcrypt": 1.8.1 dev: false /p-finally@1.0.0: @@ -13025,6 +13627,24 @@ packages: vue: 3.4.3(typescript@5.3.3) dev: false + /vue-demi@0.14.6(vue@3.4.4): + resolution: + { + integrity: sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==, + } + engines: { node: ">=12" } + hasBin: true + requiresBuild: true + peerDependencies: + "@vue/composition-api": ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + "@vue/composition-api": + optional: true + dependencies: + vue: 3.4.4(typescript@5.3.3) + dev: false + /vue@3.4.3(typescript@5.3.3): resolution: { @@ -13044,6 +13664,25 @@ packages: typescript: 5.3.3 dev: false + /vue@3.4.4(typescript@5.3.3): + resolution: + { + integrity: sha512-suZXgDVT8lRNhKmxdkwOsR0oyUi8is7mtqI18qW97JLoyorEbE9B2Sb4Ws/mR/+0AgA/JUtsv1ytlRSH3/pDIA==, + } + peerDependencies: + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@vue/compiler-dom": 3.4.4 + "@vue/compiler-sfc": 3.4.4 + "@vue/runtime-dom": 3.4.4 + "@vue/server-renderer": 3.4.4(vue@3.4.4) + "@vue/shared": 3.4.4 + typescript: 5.3.3 + dev: false + /w3c-keyname@2.2.8: resolution: { diff --git a/src/index.ts b/src/index.ts index 26146bf..f302740 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,7 +4,6 @@ import { prettyJSON } from "hono/pretty-json" import BaseRoutes from "@/v2/routes/handler" import { CustomCSS, OpenAPIConfig } from "./openapi/config" import { cors } from "hono/cors" - import { csrfValidation } from "./v2/middleware/csrf" import { LogTime } from "./v2/middleware/time-taken" @@ -12,15 +11,8 @@ const app = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() app.route("/v2", BaseRoutes) -app.use( - "*", - cors({ - // todo(dromzeh): THIS IS TEMPORARY BTW PLEASE SET THIS DEPENDENT ON ENV - origin: "*", - credentials: true, - }) -) - +// scalar API reference, very nice and lightweight +// i am putting this at root because i can app.get( "/", apiReference({ @@ -31,16 +23,27 @@ app.get( }) ) +// openapi config +app.doc("/openapi", OpenAPIConfig) + +// middleware app.use("*", csrfValidation) app.use("*", LogTime) -app.use("*", prettyJSON()) +app.use( + "*", + cors({ + // todo(dromzeh): THIS IS TEMPORARY BTW PLEASE SET THIS DEPENDENT ON ENV + origin: "*", + credentials: true, + }) +) -app.doc("/openapi", OpenAPIConfig) +app.use("*", prettyJSON()) app.onError((err, ctx) => { console.error(err) - // TODO: error logging + // TODO: error logging with Axiom (Axiom Middleware) return ctx.json( { success: false, diff --git a/src/v2/lib/auth/definitions/auth-definitions.ts b/src/v2/lib/auth/definitions/auth-definitions.ts index 0516c9e..bac0679 100644 --- a/src/v2/lib/auth/definitions/auth-definitions.ts +++ b/src/v2/lib/auth/definitions/auth-definitions.ts @@ -3,25 +3,25 @@ import type { LuciaAuth } from "../lucia" declare module "lucia" { interface Register { Lucia: LuciaAuth - } - interface DatabaseUserAttributes { - avatar_url: string | null - banner_url: string | null - username: string - username_colour: string | null - email: string - email_verified: boolean - pronouns: string | null - verified: boolean - bio: string | null - date_joined: string - role_flags: number - is_contributor: boolean - self_assignable_role_flags: number | null - } - interface DatabaseSessionAttributes { - user_agent: string - country_code: string - ip_address: string + DatabaseSessionAttributes: { + user_agent: string + country_code: string + ip_address: string + } + DatabaseUserAttributes: { + avatar_url: string | null + banner_url: string | null + username: string + username_colour: string | null + email: string + email_verified: boolean + pronouns: string | null + verified: boolean + bio: string | null + date_joined: string + role_flags: number + is_contributor: boolean + self_assignable_role_flags: number | null + } } } diff --git a/src/v2/lib/auth/lucia.ts b/src/v2/lib/auth/lucia.ts index 49111f5..8608ec8 100644 --- a/src/v2/lib/auth/lucia.ts +++ b/src/v2/lib/auth/lucia.ts @@ -6,8 +6,10 @@ import { LibSQLAdapter } from "@lucia-auth/adapter-sqlite" export function luciaAuth(env: Bindings) { const { turso } = getConnection(env) - // TODO(dromzeh): should probably utilize to the v3 drizzle adapter - it's okay for now though return new Lucia( + // i can't get the drizzle adapter working at all (works fine with SQLite3) + // and i don't really have time to write my own rn , so i'm just gonna use the sqlite adapter + // it is what it is :3 new LibSQLAdapter(turso, { user: tableNames.authUser, session: tableNames.authSession, @@ -39,6 +41,11 @@ export function luciaAuth(env: Bindings) { }, sessionCookie: { name: "user_auth_session", + // i don't really see too much of a security concern with making the session cookie indefinite. + // it's very unlikely that someone will be able to steal a session cookie, and if they do, it's + // already handled with comparing IP/UA/Country Code. it expires the session + // and it can just state that the session was logged out due to a security concern(and the user can just log back in) + // plus i feel this is better user experience in general lol expires: false, attributes: { secure: env.ENVIRONMENT === "PROD", diff --git a/src/v2/middleware/csrf.ts b/src/v2/middleware/csrf.ts index 26621cd..9201fb5 100644 --- a/src/v2/middleware/csrf.ts +++ b/src/v2/middleware/csrf.ts @@ -1,6 +1,8 @@ import type { Next } from "hono" import { verifyRequestOrigin } from "oslo/request" +// TODO(dromzeh): i will probably go back and generate a csrf token for every request +// but for now, i'm just gonna use the request origin header to verify the request export async function csrfValidation(ctx: APIContext, next: Next) { if (ctx.req.method === "GET") { return next() From e7157a8ce4ccd1a4afdf9dfcad240137a382c062 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Thu, 4 Jan 2024 16:52:50 +0000 Subject: [PATCH 212/318] use built in csrf middleware (im stupid) --- .vscode/settings.json | 1 + README.md | 4 +- package.json | 2 +- pnpm-lock.yaml | 230 +++++++++++++++++++------------------- src/index.ts | 9 +- src/v2/middleware/csrf.ts | 27 ----- tsconfig.json | 2 +- 7 files changed, 126 insertions(+), 149 deletions(-) create mode 100644 .vscode/settings.json delete mode 100644 src/v2/middleware/csrf.ts diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1 @@ +{} diff --git a/README.md b/README.md index afcbff5..e962233 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Source code for the API powering [**wanderer.moe**](https://wanderer.moe) — us We use Turso (libsql, fork of SQLite) as our database. You will need to install the [Turso CLI](https://docs.turso.tech/reference/turso-cli#installation) then run `turso dev` to start a local database. You can persist data by passing `--db-file `. -The Turso CLI can be ran on Windows using WSL. +The Turso CLI can be run on Windows using WSL. The API will connect to the local database if the environment is set to `DEV`, else - it will connect to your production database. @@ -37,7 +37,7 @@ Required environment variables are viewable in `./src/worker-configuration.d.ts` - There is a GitHub Action that automatically deploys to Cloudflare Workers on every push to `main` — you can find it in `.github/workflows/deploy.yml`. -- If you're using Github Actions, you will have to setup a secret with a Cloudflare API token. You can generate the API token [here][Cloudflare API Token] — use the `Edit Cloudflare Workers` template. +- If you're using GitHub Actions, you will have to set up a secret with a Cloudflare API token. You can generate the API token [here][Cloudflare API Token] — use the `Edit Cloudflare Workers` template. ### Database diff --git a/package.json b/package.json index 10ad8e4..a72cec3 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "better-sqlite3": "^9.2.2", "drizzle-orm": "^0.29.2", "drizzle-zod": "^0.5.1", - "hono": "^3.11.11", + "hono": "^3.12.0", "lucia": "3.0.0-beta.14", "oslo": "^0.26.2", "prettier": "^3.1.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 10c7905..cab04c1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,10 +10,10 @@ dependencies: version: 1.0.0-rc.1 "@hono/swagger-ui": specifier: ^0.2.1 - version: 0.2.1(hono@3.11.11) + version: 0.2.1(hono@3.12.0) "@hono/zod-openapi": specifier: ^0.9.5 - version: 0.9.5(hono@3.11.11)(zod@3.22.4) + version: 0.9.5(hono@3.12.0)(zod@3.22.4) "@libsql/client": specifier: 0.4.0-pre.5 version: 0.4.0-pre.5 @@ -22,7 +22,7 @@ dependencies: version: 3.0.0-beta.12(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2)(lucia@3.0.0-beta.14) "@scalar/hono-api-reference": specifier: ^0.3.9 - version: 0.3.9(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(hono@3.11.11)(nanoid@5.0.4)(postcss@8.4.32)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.4) + version: 0.3.9(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(hono@3.12.0)(nanoid@5.0.4)(postcss@8.4.32)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.5) "@typescript-eslint/eslint-plugin": specifier: ^6.16.0 version: 6.16.0(@typescript-eslint/parser@6.17.0)(eslint@8.56.0)(typescript@5.3.3) @@ -36,8 +36,8 @@ dependencies: specifier: ^0.5.1 version: 0.5.1(drizzle-orm@0.29.2)(zod@3.22.4) hono: - specifier: ^3.11.11 - version: 3.11.11 + specifier: ^3.12.0 + version: 3.12.0 lucia: specifier: 3.0.0-beta.14 version: 3.0.0-beta.14 @@ -2164,7 +2164,7 @@ packages: "@codemirror/state": 6.4.0 "@codemirror/view": 6.23.0 "@lezer/common": 1.2.0 - "@lezer/javascript": 1.4.11 + "@lezer/javascript": 1.4.12 dev: false /@codemirror/lang-json@6.0.1: @@ -3628,14 +3628,14 @@ packages: } dev: false - /@floating-ui/vue@1.0.2(vue@3.4.4): + /@floating-ui/vue@1.0.2(vue@3.4.5): resolution: { integrity: sha512-sImlAl9mAoCKZLNlwWz2P2ZMJIDlOEDXrRD6aD2sIHAka1LPC+nWtB+D3lPe7IE7FGWSbwBPTnlSdlABa3Fr0A==, } dependencies: "@floating-ui/dom": 1.5.3 - vue-demi: 0.14.6(vue@3.4.4) + vue-demi: 0.14.6(vue@3.4.5) transitivePeerDependencies: - "@vue/composition-api" - vue @@ -3671,7 +3671,7 @@ packages: vue: 3.4.3(typescript@5.3.3) dev: false - /@headlessui/vue@1.7.16(vue@3.4.4): + /@headlessui/vue@1.7.16(vue@3.4.5): resolution: { integrity: sha512-nKT+nf/q6x198SsyK54mSszaQl/z+QxtASmgMEJtpxSX2Q0OPJX0upS/9daDyiECpeAsvjkoOrm2O/6PyBQ+Qg==, @@ -3680,10 +3680,10 @@ packages: peerDependencies: vue: ^3.2.0 dependencies: - vue: 3.4.4(typescript@5.3.3) + vue: 3.4.5(typescript@5.3.3) dev: false - /@hono/swagger-ui@0.2.1(hono@3.11.11): + /@hono/swagger-ui@0.2.1(hono@3.12.0): resolution: { integrity: sha512-wBxVMRe3/v8xH4o6icmwztiIq0DG0s7+jHVMHVUAoFFCWEQNL2iskMmQtrhSDtsFmBZUeUFQUaaJ6Ir6DOmHLA==, @@ -3691,10 +3691,10 @@ packages: peerDependencies: hono: "*" dependencies: - hono: 3.11.11 + hono: 3.12.0 dev: false - /@hono/zod-openapi@0.9.5(hono@3.11.11)(zod@3.22.4): + /@hono/zod-openapi@0.9.5(hono@3.12.0)(zod@3.22.4): resolution: { integrity: sha512-Px8QEIr5RyDeHQn51Ihnwtl//foFvd/F6yBq6o/3pVMUpoV6X4JZ+srgUrOX2VRrInpLVEP/NaroXlfvarwIxA==, @@ -3705,12 +3705,12 @@ packages: zod: 3.* dependencies: "@asteasolutions/zod-to-openapi": 5.5.0(zod@3.22.4) - "@hono/zod-validator": 0.1.11(hono@3.11.11)(zod@3.22.4) - hono: 3.11.11 + "@hono/zod-validator": 0.1.11(hono@3.12.0)(zod@3.22.4) + hono: 3.12.0 zod: 3.22.4 dev: false - /@hono/zod-validator@0.1.11(hono@3.11.11)(zod@3.22.4): + /@hono/zod-validator@0.1.11(hono@3.12.0)(zod@3.22.4): resolution: { integrity: sha512-PQXeHUP0+36qpRt8yfeD7N2jbK3ETlGvSN6dMof/HwUC/APRokQRjpXZm4rrlG71Ft0aWE01+Bm4XejqPie5Uw==, @@ -3719,7 +3719,7 @@ packages: hono: ">=3.9.0" zod: ^3.19.1 dependencies: - hono: 3.11.11 + hono: 3.12.0 zod: 3.22.4 dev: false @@ -3887,10 +3887,10 @@ packages: "@lezer/lr": 1.3.14 dev: false - /@lezer/javascript@1.4.11: + /@lezer/javascript@1.4.12: resolution: { - integrity: sha512-B5Y9EJF4BWiMgj4ufxUo2hrORnmMBDrMtR+L7dwIO5pocuSAahG6QBwXR6PbKJOjRywJczU2r2LJPg79ER91TQ==, + integrity: sha512-kwO5MftUiyfKBcECMEDc4HYnc10JME9kTJNPVoCXqJj/Y+ASWF0rgstORi3BThlQI6SoPSshrK5TjuiLFnr29A==, } dependencies: "@lezer/highlight": 1.2.0 @@ -4903,7 +4903,7 @@ packages: } dev: false - /@scalar/api-client@0.8.6(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.4): + /@scalar/api-client@0.8.6(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.5): resolution: { integrity: sha512-qAlb0nqOnhqsrmEL8Cbjdi/TPGSyyXTmoVLMV73DqnAMe+yC4PvbEkJjIN0zQLV2jTtcG7O9LQeqo2PgRIgrDQ==, @@ -4912,19 +4912,19 @@ packages: peerDependencies: vue: ^3.3.0 dependencies: - "@headlessui/vue": 1.7.16(vue@3.4.4) - "@scalar/themes": 0.5.1(vue@3.4.4) - "@scalar/use-codemirror": 0.7.16(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.4) - "@scalar/use-keyboard-event": 0.5.6(vue@3.4.4) - "@scalar/use-modal": 0.2.1(@headlessui/vue@1.7.16)(vue@3.4.4) - "@vueuse/core": 10.7.1(vue@3.4.4) + "@headlessui/vue": 1.7.16(vue@3.4.5) + "@scalar/themes": 0.5.1(vue@3.4.5) + "@scalar/use-codemirror": 0.7.16(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.5) + "@scalar/use-keyboard-event": 0.5.6(vue@3.4.5) + "@scalar/use-modal": 0.2.1(@headlessui/vue@1.7.16)(vue@3.4.5) + "@vueuse/core": 10.7.1(vue@3.4.5) axios: 1.6.3 content-type: 1.0.5 javascript-time-ago: 2.5.9 nanoid: 5.0.4 pretty-bytes: 6.1.1 pretty-ms: 8.0.0 - vue: 3.4.4(typescript@5.3.3) + vue: 3.4.5(typescript@5.3.3) transitivePeerDependencies: - "@codemirror/lang-html" - "@codemirror/lang-java" @@ -4944,7 +4944,7 @@ packages: - debug dev: false - /@scalar/api-reference@1.12.7(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(nanoid@5.0.4)(postcss@8.4.32)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.4): + /@scalar/api-reference@1.12.7(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(nanoid@5.0.4)(postcss@8.4.32)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.5): resolution: { integrity: sha512-Ok00vJx8ko9UZ0eCE2HFUtGd/GONJhYF7Nn5jp7XmxzLb+d8wywfwHm9Vkp3d/ieCkc5ORNHTf54+g/6HPwG8w==, @@ -4954,23 +4954,23 @@ packages: unified: ^11.0.0 vue: ^3.3.0 dependencies: - "@floating-ui/vue": 1.0.2(vue@3.4.4) - "@headlessui/vue": 1.7.16(vue@3.4.4) - "@scalar/api-client": 0.8.6(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.4) + "@floating-ui/vue": 1.0.2(vue@3.4.5) + "@headlessui/vue": 1.7.16(vue@3.4.5) + "@scalar/api-client": 0.8.6(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.5) "@scalar/components": 0.2.0(typescript@5.3.3) "@scalar/snippetz": 0.1.4 - "@scalar/swagger-editor": 0.9.2(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/view@6.23.0)(@headlessui/vue@1.7.16)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.4) + "@scalar/swagger-editor": 0.9.2(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/view@6.23.0)(@headlessui/vue@1.7.16)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.5) "@scalar/swagger-parser": 0.5.13(openapi-types@12.1.3) - "@scalar/themes": 0.5.1(vue@3.4.4) + "@scalar/themes": 0.5.1(vue@3.4.5) "@scalar/use-clipboard": 0.5.11(@scalar/use-toasts@0.5.11)(nanoid@5.0.4) - "@scalar/use-codemirror": 0.7.16(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.4) - "@scalar/use-keyboard-event": 0.5.6(vue@3.4.4) - "@scalar/use-modal": 0.2.1(@headlessui/vue@1.7.16)(vue@3.4.4) - "@scalar/use-toasts": 0.5.11(nanoid@5.0.4)(vue@3.4.4) - "@scalar/use-tooltip": 0.5.7(vue@3.4.4) + "@scalar/use-codemirror": 0.7.16(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.5) + "@scalar/use-keyboard-event": 0.5.6(vue@3.4.5) + "@scalar/use-modal": 0.2.1(@headlessui/vue@1.7.16)(vue@3.4.5) + "@scalar/use-toasts": 0.5.11(nanoid@5.0.4)(vue@3.4.5) + "@scalar/use-tooltip": 0.5.7(vue@3.4.5) "@unhead/schema": 1.8.9 "@vcarl/remark-headings": 0.1.0 - "@vueuse/core": 10.7.1(vue@3.4.4) + "@vueuse/core": 10.7.1(vue@3.4.5) "@xmldom/xmldom": 0.8.10 axios: 1.6.3 fuse.js: 6.6.2 @@ -4991,7 +4991,7 @@ packages: remark-stringify: 11.0.0 unhead: 1.8.9 unified: 11.0.4 - vue: 3.4.4(typescript@5.3.3) + vue: 3.4.5(typescript@5.3.3) transitivePeerDependencies: - "@codemirror/lang-html" - "@codemirror/lang-java" @@ -5035,7 +5035,7 @@ packages: - typescript dev: false - /@scalar/hono-api-reference@0.3.9(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(hono@3.11.11)(nanoid@5.0.4)(postcss@8.4.32)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.4): + /@scalar/hono-api-reference@0.3.9(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(hono@3.12.0)(nanoid@5.0.4)(postcss@8.4.32)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.5): resolution: { integrity: sha512-F52PqTkAmdeCP84wjlcZxcYJz06Bqgk/gTmBW60wd9hP70JjlMsP31DriIHyx3R5x1SlYvpEwf2kpH3b13IxBQ==, @@ -5044,8 +5044,8 @@ packages: peerDependencies: hono: ^3.0.0 dependencies: - "@scalar/api-reference": 1.12.7(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(nanoid@5.0.4)(postcss@8.4.32)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.4) - hono: 3.11.11 + "@scalar/api-reference": 1.12.7(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(nanoid@5.0.4)(postcss@8.4.32)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.5) + hono: 3.12.0 transitivePeerDependencies: - "@codemirror/lang-html" - "@codemirror/lang-java" @@ -5109,7 +5109,7 @@ packages: "@scalar/snippetz-plugin-node-undici": 0.1.4 dev: false - /@scalar/swagger-editor@0.9.2(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/view@6.23.0)(@headlessui/vue@1.7.16)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.4): + /@scalar/swagger-editor@0.9.2(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/view@6.23.0)(@headlessui/vue@1.7.16)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.5): resolution: { integrity: sha512-h176YaLpjofDJZXG+aZM28yKweBtV/yh7lGSsK+y0FO3kKxCpXC0ONEgG0vtFBzV/tXjAXIKNBpd3mRpwDQzfA==, @@ -5121,10 +5121,10 @@ packages: dependencies: "@codemirror/state": 6.4.0 "@scalar/components": 0.2.0(typescript@5.3.3) - "@scalar/themes": 0.5.1(vue@3.4.4) - "@scalar/use-codemirror": 0.7.16(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.4) - "@scalar/use-modal": 0.2.1(@headlessui/vue@1.7.16)(vue@3.4.4) - "@vueuse/core": 10.7.1(vue@3.4.4) + "@scalar/themes": 0.5.1(vue@3.4.5) + "@scalar/use-codemirror": 0.7.16(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.5) + "@scalar/use-modal": 0.2.1(@headlessui/vue@1.7.16)(vue@3.4.5) + "@vueuse/core": 10.7.1(vue@3.4.5) nanoid: 5.0.4 rehype-external-links: 3.0.0 rehype-format: 5.0.0 @@ -5136,7 +5136,7 @@ packages: remark-parse: 11.0.0 remark-rehype: 11.0.0 unified: 11.0.4 - vue: 3.4.4(typescript@5.3.3) + vue: 3.4.5(typescript@5.3.3) transitivePeerDependencies: - "@codemirror/lang-html" - "@codemirror/lang-java" @@ -5170,7 +5170,7 @@ packages: - openapi-types dev: false - /@scalar/themes@0.5.1(vue@3.4.4): + /@scalar/themes@0.5.1(vue@3.4.5): resolution: { integrity: sha512-iaX9H1P/KukzuzkgRlbE4QWxYRHWQajf4AGQVI9Na9KeIQ4NgpkWWsIfcDKekP6P7QrlLvFpgkLcjJf5mnnF4A==, @@ -5179,7 +5179,7 @@ packages: peerDependencies: vue: ^3.3.0 dependencies: - vue: 3.4.4(typescript@5.3.3) + vue: 3.4.5(typescript@5.3.3) dev: false /@scalar/use-clipboard@0.5.11(@scalar/use-toasts@0.5.11)(nanoid@5.0.4): @@ -5192,11 +5192,11 @@ packages: "@scalar/use-toasts": 0.5.11 nanoid: ^5.0.1 dependencies: - "@scalar/use-toasts": 0.5.11(nanoid@5.0.4)(vue@3.4.4) + "@scalar/use-toasts": 0.5.11(nanoid@5.0.4)(vue@3.4.5) nanoid: 5.0.4 dev: false - /@scalar/use-codemirror@0.7.16(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.4): + /@scalar/use-codemirror@0.7.16(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.5): resolution: { integrity: sha512-TQXplKCVDheuR/w7q9q0HzyQ9rJmy3P0tAFw2jPLwfAq3Q6YVpltuu3UrKzAOtxV3FcKMc7lzYZLaGY0DHcTVw==, @@ -5233,10 +5233,10 @@ packages: "@lezer/lr": 1.3.14 "@uiw/codemirror-themes": 4.21.21(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0) codemirror: 6.0.1(@lezer/common@1.2.0) - vue: 3.4.4(typescript@5.3.3) + vue: 3.4.5(typescript@5.3.3) dev: false - /@scalar/use-keyboard-event@0.5.6(vue@3.4.4): + /@scalar/use-keyboard-event@0.5.6(vue@3.4.5): resolution: { integrity: sha512-/sKl0LDr2RoTVuQIUaeeOkEbUtl2z+cqEHHF4CNenqOra/Sz/u/eexDHbMc7ZTaaIo9snMHSceLo2k9ThQUz3g==, @@ -5245,10 +5245,10 @@ packages: peerDependencies: vue: ^3.3.0 dependencies: - vue: 3.4.4(typescript@5.3.3) + vue: 3.4.5(typescript@5.3.3) dev: false - /@scalar/use-modal@0.2.1(@headlessui/vue@1.7.16)(vue@3.4.4): + /@scalar/use-modal@0.2.1(@headlessui/vue@1.7.16)(vue@3.4.5): resolution: { integrity: sha512-OAf7nIoKAbt53GGbbsDbIoAF+/RRQIjnBJhgfk4eI1ACyAOVXwVWrjJ1eYmGbv86gzEX9neb/qpwkc9kcnz1FQ==, @@ -5258,11 +5258,11 @@ packages: "@headlessui/vue": ^1.7.0 vue: ^3.3.0 dependencies: - "@headlessui/vue": 1.7.16(vue@3.4.4) - vue: 3.4.4(typescript@5.3.3) + "@headlessui/vue": 1.7.16(vue@3.4.5) + vue: 3.4.5(typescript@5.3.3) dev: false - /@scalar/use-toasts@0.5.11(nanoid@5.0.4)(vue@3.4.4): + /@scalar/use-toasts@0.5.11(nanoid@5.0.4)(vue@3.4.5): resolution: { integrity: sha512-5uaxV+944rkrYl3mQaQn+AruBCcDjN03jODko2K618unSf3JQixIi6ptoOcXCL6QAGM4FaHtMjRjX/7LJWOtOQ==, @@ -5273,10 +5273,10 @@ packages: vue: ^3.3.0 dependencies: nanoid: 5.0.4 - vue: 3.4.4(typescript@5.3.3) + vue: 3.4.5(typescript@5.3.3) dev: false - /@scalar/use-tooltip@0.5.7(vue@3.4.4): + /@scalar/use-tooltip@0.5.7(vue@3.4.5): resolution: { integrity: sha512-WmTleZDjR1Yerw1GLoh9li/3d9dFDWm1Vb39xrehtXx8bGB8+IkRyg8ZCfGzEKNySbf263QAaRmZkKUMVOGdAA==, @@ -5286,7 +5286,7 @@ packages: vue: ^3.3.0 dependencies: tippy.js: 6.3.7 - vue: 3.4.4(typescript@5.3.3) + vue: 3.4.5(typescript@5.3.3) dev: false /@segment/loosely-validate-event@2.0.0: @@ -5805,14 +5805,14 @@ packages: source-map-js: 1.0.2 dev: false - /@vue/compiler-core@3.4.4: + /@vue/compiler-core@3.4.5: resolution: { - integrity: sha512-U5AdCN+6skzh2bSJrkMj2KZsVkUpgK8/XlxjSRYQZhNPcvt9/kmgIMpFEiTyK+Dz5E1J+8o8//BEIX+bakgVSw==, + integrity: sha512-Daka7P1z2AgKjzuueWXhwzIsKu0NkLB6vGbNVEV2iJ8GJTrzraZo/Sk4GWCMRtd/qVi3zwnk+Owbd/xSZbwHtQ==, } dependencies: "@babel/parser": 7.23.6 - "@vue/shared": 3.4.4 + "@vue/shared": 3.4.5 entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.0.2 @@ -5828,14 +5828,14 @@ packages: "@vue/shared": 3.4.3 dev: false - /@vue/compiler-dom@3.4.4: + /@vue/compiler-dom@3.4.5: resolution: { - integrity: sha512-iSwkdDULCN+Vr8z6uwdlL044GJ/nUmECxP9vu7MzEs4Qma0FwDLYvnvRcyO0ZITuu3Os4FptGUDnhi1kOLSaGw==, + integrity: sha512-J8YlxknJVd90SXFJ4HwGANSAXsx5I0lK30sO/zvYV7s5gXf7gZR7r/1BmZ2ju7RGH1lnc6bpBc6nL61yW+PsAQ==, } dependencies: - "@vue/compiler-core": 3.4.4 - "@vue/shared": 3.4.4 + "@vue/compiler-core": 3.4.5 + "@vue/shared": 3.4.5 dev: false /@vue/compiler-sfc@3.4.3: @@ -5855,17 +5855,17 @@ packages: source-map-js: 1.0.2 dev: false - /@vue/compiler-sfc@3.4.4: + /@vue/compiler-sfc@3.4.5: resolution: { - integrity: sha512-OTFcU6vUxUNHBcarzkp4g6d25nvcmDvFDzPRvSrIsByFFPRYN+y3b+j9HxYwt6nlWvGyFCe0roeJdJlfYxbCBg==, + integrity: sha512-jauvkDuSSUbP0ebhfNqljhShA90YEfX/0wZ+w40oZF43IjGyWYjqYaJbvMJwGOd+9+vODW6eSvnk28f0SGV7OQ==, } dependencies: "@babel/parser": 7.23.6 - "@vue/compiler-core": 3.4.4 - "@vue/compiler-dom": 3.4.4 - "@vue/compiler-ssr": 3.4.4 - "@vue/shared": 3.4.4 + "@vue/compiler-core": 3.4.5 + "@vue/compiler-dom": 3.4.5 + "@vue/compiler-ssr": 3.4.5 + "@vue/shared": 3.4.5 estree-walker: 2.0.2 magic-string: 0.30.5 postcss: 8.4.32 @@ -5882,14 +5882,14 @@ packages: "@vue/shared": 3.4.3 dev: false - /@vue/compiler-ssr@3.4.4: + /@vue/compiler-ssr@3.4.5: resolution: { - integrity: sha512-1DU9DflSSQlx/M61GEBN+NbT/anUki2ooDo9IXfTckCeKA/2IKNhY8KbG3x6zkd3KGrxzteC7de6QL88vEb41Q==, + integrity: sha512-DDdEcDzj2lWTMfUMMtEpLDhURai9LhM0zSZ219jCt7b2Vyl0/jy3keFgCPMitG0V1S1YG4Cmws3lWHWdxHQOpg==, } dependencies: - "@vue/compiler-dom": 3.4.4 - "@vue/shared": 3.4.4 + "@vue/compiler-dom": 3.4.5 + "@vue/shared": 3.4.5 dev: false /@vue/reactivity@3.4.3: @@ -5901,13 +5901,13 @@ packages: "@vue/shared": 3.4.3 dev: false - /@vue/reactivity@3.4.4: + /@vue/reactivity@3.4.5: resolution: { - integrity: sha512-DFsuJBf6sfhd5SYzJmcBTUG9+EKqjF31Gsk1NJtnpJm9liSZ806XwGJUeNBVQIanax7ODV7Lmk/k17BgxXNuTg==, + integrity: sha512-BcWkKvjdvqJwb7BhhFkXPLDCecX4d4a6GATvCduJQDLv21PkPowAE5GKuIE5p6RC07/Lp9FMkkq4AYCTVF5KlQ==, } dependencies: - "@vue/shared": 3.4.4 + "@vue/shared": 3.4.5 dev: false /@vue/runtime-core@3.4.3: @@ -5920,14 +5920,14 @@ packages: "@vue/shared": 3.4.3 dev: false - /@vue/runtime-core@3.4.4: + /@vue/runtime-core@3.4.5: resolution: { - integrity: sha512-zWWwNQAj5JdxrmOA1xegJm+c4VtyIbDEKgQjSb4va5v7gGTCh0ZjvLI+htGFdVXaO9bs2J3C81p5p+6jrPK8Bw==, + integrity: sha512-wh9ELIOQKeWT9SaUPdLrsxRkZv14jp+SJm9aiQGWio+/MWNM3Lib0wE6CoKEqQ9+SCYyGjDBhTOTtO47kCgbkg==, } dependencies: - "@vue/reactivity": 3.4.4 - "@vue/shared": 3.4.4 + "@vue/reactivity": 3.4.5 + "@vue/shared": 3.4.5 dev: false /@vue/runtime-dom@3.4.3: @@ -5941,14 +5941,14 @@ packages: csstype: 3.1.3 dev: false - /@vue/runtime-dom@3.4.4: + /@vue/runtime-dom@3.4.5: resolution: { - integrity: sha512-Nlh2ap1J/eJQ6R0g+AIRyGNwpTJQACN0dk8I8FRLH8Ev11DSvfcPOpn4+Kbg5xAMcuq0cHB8zFYxVrOgETrrvg==, + integrity: sha512-n5ewvOjyG3IEpqGBahdPXODFSpVlSz3H4LF76Sx0XAqpIOqyJ5bIb2PrdYuH2ogBMAQPh+o5tnoH4nJpBr8U0Q==, } dependencies: - "@vue/runtime-core": 3.4.4 - "@vue/shared": 3.4.4 + "@vue/runtime-core": 3.4.5 + "@vue/shared": 3.4.5 csstype: 3.1.3 dev: false @@ -5965,17 +5965,17 @@ packages: vue: 3.4.3(typescript@5.3.3) dev: false - /@vue/server-renderer@3.4.4(vue@3.4.4): + /@vue/server-renderer@3.4.5(vue@3.4.5): resolution: { - integrity: sha512-+AjoiKcC41k7SMJBYkDO9xs79/Of8DiThS9mH5l2MK+EY0to3psI0k+sElvVqQvsoZTjHMEuMz0AEgvm2T+CwA==, + integrity: sha512-jOFc/VE87yvifQpNju12VcqimH8pBLxdcT+t3xMeiED1K6DfH9SORyhFEoZlW5TG2Vwfn3Ul5KE+1aC99xnSBg==, } peerDependencies: - vue: 3.4.4 + vue: 3.4.5 dependencies: - "@vue/compiler-ssr": 3.4.4 - "@vue/shared": 3.4.4 - vue: 3.4.4(typescript@5.3.3) + "@vue/compiler-ssr": 3.4.5 + "@vue/shared": 3.4.5 + vue: 3.4.5(typescript@5.3.3) dev: false /@vue/shared@3.4.3: @@ -5985,10 +5985,10 @@ packages: } dev: false - /@vue/shared@3.4.4: + /@vue/shared@3.4.5: resolution: { - integrity: sha512-abSgiVRhfjfl3JALR/cSuBl74hGJ3SePgf1mKzodf1eMWLwHZbfEGxT2cNJSsNiw44jEgrO7bNkhchaWA7RwNw==, + integrity: sha512-6XptuzlMvN4l4cDnDw36pdGEV+9njYkQ1ZE0Q6iZLwrKefKaOJyiFmcP3/KBDHbt72cJZGtllAc1GaHe6XGAyg==, } dev: false @@ -6007,7 +6007,7 @@ packages: - vue dev: false - /@vueuse/core@10.7.1(vue@3.4.4): + /@vueuse/core@10.7.1(vue@3.4.5): resolution: { integrity: sha512-74mWHlaesJSWGp1ihg76vAnfVq9NTv1YT0SYhAQ6zwFNdBkkP+CKKJmVOEHcdSnLXCXYiL5e7MaewblfiYLP7g==, @@ -6015,8 +6015,8 @@ packages: dependencies: "@types/web-bluetooth": 0.0.20 "@vueuse/metadata": 10.7.1 - "@vueuse/shared": 10.7.1(vue@3.4.4) - vue-demi: 0.14.6(vue@3.4.4) + "@vueuse/shared": 10.7.1(vue@3.4.5) + vue-demi: 0.14.6(vue@3.4.5) transitivePeerDependencies: - "@vue/composition-api" - vue @@ -6041,13 +6041,13 @@ packages: - vue dev: false - /@vueuse/shared@10.7.1(vue@3.4.4): + /@vueuse/shared@10.7.1(vue@3.4.5): resolution: { integrity: sha512-v0jbRR31LSgRY/C5i5X279A/WQjD6/JsMzGa+eqt658oJ75IvQXAeONmwvEMrvJQKnRElq/frzBR7fhmWY5uLw==, } dependencies: - vue-demi: 0.14.6(vue@3.4.4) + vue-demi: 0.14.6(vue@3.4.5) transitivePeerDependencies: - "@vue/composition-api" - vue @@ -9153,10 +9153,10 @@ packages: engines: { node: ">=12.0.0" } dev: false - /hono@3.11.11: + /hono@3.12.0: resolution: { - integrity: sha512-E3Xv7LnOjg7VXiu+t+YplDEYXvkxpcTCzZ3RUFQlcNXclSME8aiQAYwWpJPT6MQRRpa4TG5RlOolqeYEDEK3wg==, + integrity: sha512-UPEtZuLY7Wo7g0mqKWSOjLFdT8t7wJ60IYEcxKl3AQNU4u+R2QqU2fJMPmSu24C+/ag20Z8mOTQOErZzK4DMvA==, } engines: { node: ">=16.0.0" } dev: false @@ -13627,7 +13627,7 @@ packages: vue: 3.4.3(typescript@5.3.3) dev: false - /vue-demi@0.14.6(vue@3.4.4): + /vue-demi@0.14.6(vue@3.4.5): resolution: { integrity: sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==, @@ -13642,7 +13642,7 @@ packages: "@vue/composition-api": optional: true dependencies: - vue: 3.4.4(typescript@5.3.3) + vue: 3.4.5(typescript@5.3.3) dev: false /vue@3.4.3(typescript@5.3.3): @@ -13664,10 +13664,10 @@ packages: typescript: 5.3.3 dev: false - /vue@3.4.4(typescript@5.3.3): + /vue@3.4.5(typescript@5.3.3): resolution: { - integrity: sha512-suZXgDVT8lRNhKmxdkwOsR0oyUi8is7mtqI18qW97JLoyorEbE9B2Sb4Ws/mR/+0AgA/JUtsv1ytlRSH3/pDIA==, + integrity: sha512-VH6nHFhLPjgu2oh5vEBXoNZxsGHuZNr3qf4PHClwJWw6IDqw6B3x+4J+ABdoZ0aJuT8Zi0zf3GpGlLQCrGWHrw==, } peerDependencies: typescript: "*" @@ -13675,11 +13675,11 @@ packages: typescript: optional: true dependencies: - "@vue/compiler-dom": 3.4.4 - "@vue/compiler-sfc": 3.4.4 - "@vue/runtime-dom": 3.4.4 - "@vue/server-renderer": 3.4.4(vue@3.4.4) - "@vue/shared": 3.4.4 + "@vue/compiler-dom": 3.4.5 + "@vue/compiler-sfc": 3.4.5 + "@vue/runtime-dom": 3.4.5 + "@vue/server-renderer": 3.4.5(vue@3.4.5) + "@vue/shared": 3.4.5 typescript: 5.3.3 dev: false diff --git a/src/index.ts b/src/index.ts index f302740..3558aa9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,7 +4,7 @@ import { prettyJSON } from "hono/pretty-json" import BaseRoutes from "@/v2/routes/handler" import { CustomCSS, OpenAPIConfig } from "./openapi/config" import { cors } from "hono/cors" -import { csrfValidation } from "./v2/middleware/csrf" +import { csrf } from "hono/csrf" import { LogTime } from "./v2/middleware/time-taken" const app = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() @@ -26,8 +26,11 @@ app.get( // openapi config app.doc("/openapi", OpenAPIConfig) -// middleware -app.use("*", csrfValidation) +// middleware +// interface CSRFOptions { +// origin?: string | string[] | IsAllowedOriginHandler; +// } +app.use("*", csrf()) app.use("*", LogTime) app.use( diff --git a/src/v2/middleware/csrf.ts b/src/v2/middleware/csrf.ts deleted file mode 100644 index 9201fb5..0000000 --- a/src/v2/middleware/csrf.ts +++ /dev/null @@ -1,27 +0,0 @@ -import type { Next } from "hono" -import { verifyRequestOrigin } from "oslo/request" - -// TODO(dromzeh): i will probably go back and generate a csrf token for every request -// but for now, i'm just gonna use the request origin header to verify the request -export async function csrfValidation(ctx: APIContext, next: Next) { - if (ctx.req.method === "GET") { - return next() - } - - const originHeader = ctx.req.header("Origin") - const hostHeader = ctx.req.header("Host") - - const requestOriginValid = verifyRequestOrigin(originHeader, [hostHeader]) - - if (!originHeader || !hostHeader || !requestOriginValid) { - return ctx.json( - { - success: false, - message: "Forbidden (CSRF)", - }, - 403 - ) - } - - return next() -} diff --git a/tsconfig.json b/tsconfig.json index ee2b46a..60b20e2 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,7 +9,7 @@ "paths": { "@/*": ["src/*"] }, - "types": ["@cloudflare/workers-types"] + "types": ["@cloudflare/workers-types", "node"] }, "include": ["src/**/*.ts"] } From 870e1d91b1b61532f90794bb4893a5cdd8db1683 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Fri, 5 Jan 2024 15:13:21 +0000 Subject: [PATCH 213/318] rename atlas table to support external file --- src/v2/db/drizzle.ts | 6 +- src/v2/db/schema.ts | 2 +- src/v2/db/schema/asset/asset-atlas.ts | 102 ---------------- .../db/schema/asset/asset-external-files.ts | 115 ++++++++++++++++++ src/v2/db/schema/asset/asset.ts | 4 +- src/v2/db/schema/user/user.ts | 4 +- src/v2/routes/auth/session/validate/route.ts | 1 - 7 files changed, 124 insertions(+), 110 deletions(-) delete mode 100644 src/v2/db/schema/asset/asset-atlas.ts create mode 100644 src/v2/db/schema/asset/asset-external-files.ts diff --git a/src/v2/db/drizzle.ts b/src/v2/db/drizzle.ts index 56d13b6..09644cc 100644 --- a/src/v2/db/drizzle.ts +++ b/src/v2/db/drizzle.ts @@ -11,8 +11,10 @@ export const tableNames = { userCollectionCollaborators: "userCollectionCollaborators", game: "game", gameLikes: "gameLikes", - atlas: "atlas", - atlasToAsset: "atlasToAsset", + // atlas: "atlas", + // atlasToAsset: "atlasToAsset", + assetExternalFile: "assetExternalFile", + assetExternalFileToAsset: "assetExternalFileToAsset", assetTag: "assetTag", assetTagLikes: "assetTagLikes", assetTagAsset: "assetTagAsset", diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index 66813cb..b64af48 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -1,5 +1,5 @@ export * from "./schema/asset/asset" -export * from "./schema/asset/asset-atlas" +export * from "./schema/asset/asset-external-files" export * from "./schema/asset/asset-likes" export * from "./schema/categories/asset-categories" diff --git a/src/v2/db/schema/asset/asset-atlas.ts b/src/v2/db/schema/asset/asset-atlas.ts deleted file mode 100644 index 0735917..0000000 --- a/src/v2/db/schema/asset/asset-atlas.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { tableNames } from "@/v2/db/drizzle" -import { relations } from "drizzle-orm" -import { - sqliteTable, - text, - integer, - // uniqueIndex, - index, -} from "drizzle-orm/sqlite-core" -import { asset } from "./asset" -import { authUser } from "../user/user" -import { createInsertSchema, createSelectSchema } from "drizzle-zod" -/* -NOTE: this allows for users down the line to link their uploaded assets to appropiate atlases for animation. -*/ - -export const atlas = sqliteTable( - tableNames.atlas, - { - id: text("id").unique().notNull(), - url: text("url").notNull(), - uploadedById: text("uploaded_by").notNull(), - uploadedByName: text("uploaded_by_name").notNull(), - uploadedDate: integer("uploaded_date").notNull(), - fileSize: integer("file_size").default(0).notNull(), - }, - (table) => { - return { - idIdx: index("atlas_id_idx").on(table.id), - uploadedByIdIdx: index("atlas_uploaded_by_idx").on( - table.uploadedById - ), - uploadedByNameIdx: index("atlas_uploaded_by_name_idx").on( - table.uploadedByName - ), - } - } -) - -export type Atlas = typeof atlas.$inferSelect -export type NewAtlas = typeof atlas.$inferInsert -export const insertAtlasSchema = createInsertSchema(atlas) -export const selectAtlasSchema = createSelectSchema(atlas) - -export const atlasToAsset = sqliteTable( - tableNames.atlasToAsset, - { - id: text("id").primaryKey().notNull(), - atlasId: text("atlas_id") - .notNull() - .references(() => atlas.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - assetId: integer("asset_id") - .notNull() - .references(() => asset.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - }, - (atlasToAsset) => { - return { - atlasToAssetIdx: index("atlas_to_assets_id_idx").on( - atlasToAsset.id - ), - atlasToAssetAtlasIdx: index("atlas_to_assets_atlas_id_idx").on( - atlasToAsset.atlasId - ), - atlasToAssetAssetIdx: index("atlas_to_assets_asset_id_idx").on( - atlasToAsset.assetId - ), - } - } -) - -export type AtlasToAsset = typeof atlasToAsset.$inferSelect -export type NewAtlasToAsset = typeof atlasToAsset.$inferInsert -export const insertAtlasToAssetSchema = createInsertSchema(atlasToAsset) -export const selectAtlasToAssetSchema = createSelectSchema(atlasToAsset) - -export const atlasRelations = relations(atlas, ({ one }) => ({ - atlasToAsset: one(atlasToAsset), - uploadedBy: one(authUser, { - fields: [atlas.uploadedById, atlas.uploadedByName], - references: [authUser.id, authUser.username], - relationName: "atlas_auth_user", - }), -})) - -export const atlasToAssetRelations = relations(atlasToAsset, ({ one }) => ({ - atlas: one(atlas, { - fields: [atlasToAsset.atlasId], - references: [atlas.id], - relationName: "atlastoasset_atlas", - }), - asset: one(asset, { - fields: [atlasToAsset.assetId], - references: [asset.id], - relationName: "atlastoasset_asset", - }), -})) diff --git a/src/v2/db/schema/asset/asset-external-files.ts b/src/v2/db/schema/asset/asset-external-files.ts new file mode 100644 index 0000000..96ee009 --- /dev/null +++ b/src/v2/db/schema/asset/asset-external-files.ts @@ -0,0 +1,115 @@ +import { tableNames } from "@/v2/db/drizzle" +import { relations } from "drizzle-orm" +import { + sqliteTable, + text, + integer, + // uniqueIndex, + index, +} from "drizzle-orm/sqlite-core" +import { asset } from "./asset" +import { authUser } from "../user/user" +import { createInsertSchema, createSelectSchema } from "drizzle-zod" + +/* +NOTE: this allows for users down the line to link files to assets +*/ + +export const assetExternalFile = sqliteTable( + tableNames.assetExternalFile, + { + id: text("id").primaryKey().notNull(), + url: text("url").notNull(), + uploadedById: text("uploaded_by").notNull(), + uploadedByName: text("uploaded_by_name").notNull(), + uploadedDate: integer("uploaded_date").notNull(), + fileSize: integer("file_size").default(0).notNull(), + }, + (table) => { + return { + idIdx: index("asset_external_file_id_idx").on(table.id), + uploadedByIdIdx: index("asset_external_file_uploaded_by_id_idx").on( + table.uploadedById + ), + uploadedByNameIdx: index( + "asset_external_file_uploaded_by_name_idx" + ).on(table.uploadedByName), + } + } +) + +export type AssetExtrnalFile = typeof assetExternalFile.$inferSelect +export type NewAssetExtrnalFile = typeof assetExternalFile.$inferInsert +export const insertExtrnalFileSchema = createInsertSchema(assetExternalFile) +export const selectExternalFileSchema = createSelectSchema(assetExternalFile) + +export const assetExternalFileToAsset = sqliteTable( + tableNames.assetExternalFileToAsset, + { + id: text("id").primaryKey().notNull(), + assetExternalFileId: text("asset_external_file_id") + .notNull() + .references(() => assetExternalFile.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + assetId: integer("asset_id") + .notNull() + .references(() => asset.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + }, + (assetExternalFileToAsset) => { + return { + assetExternalFileToAssetIdx: index( + "asset_external_file_to_asset_id_idx" + ).on(assetExternalFileToAsset.id), + assetExternalFileToAssetFileIdx: index( + "asset_external_file_to_asset_file_id_idx" + ).on(assetExternalFileToAsset.assetExternalFileId), + assetExternalFileToAssetAssetIdx: index( + "asset_external_file_to_asset_asset_id_idx" + ).on(assetExternalFileToAsset.assetId), + } + } +) + +export type AssetExternalFileToAsset = + typeof assetExternalFileToAsset.$inferSelect +export type NewAssetExternalFileToAsset = + typeof assetExternalFileToAsset.$inferInsert +export const insertExternalFileToAssetSchema = createInsertSchema( + assetExternalFileToAsset +) +export const selectExternalFileToAssetSchema = createSelectSchema( + assetExternalFileToAsset +) + +export const assetExternalFileRelations = relations( + assetExternalFile, + ({ one }) => ({ + assetExternalFileToAsset: one(assetExternalFileToAsset), + uploadedBy: one(authUser, { + fields: [assetExternalFile.uploadedById], + references: [authUser.id], + relationName: "asset_external_file_auth_user", + }), + }) +) + +export const assetExternalFileToAssetRelations = relations( + assetExternalFileToAsset, + ({ one }) => ({ + assetExternalFile: one(assetExternalFile, { + fields: [assetExternalFileToAsset.assetExternalFileId], + references: [assetExternalFile.id], + relationName: "asset_external_file_external_file", + }), + asset: one(asset, { + fields: [assetExternalFileToAsset.assetId], + references: [asset.id], + relationName: "asset_external_file_asset", + }), + }) +) diff --git a/src/v2/db/schema/asset/asset.ts b/src/v2/db/schema/asset/asset.ts index 2ab023a..b6f4861 100644 --- a/src/v2/db/schema/asset/asset.ts +++ b/src/v2/db/schema/asset/asset.ts @@ -11,7 +11,7 @@ import { authUser } from "../user/user" import { assetCategory } from "../categories/asset-categories" import { game } from "../game/game" import { assetTagAsset } from "../tags/asset-tags" -import { atlasToAsset } from "./asset-atlas" +import { assetExternalFileToAsset } from "./asset-external-files" import { createInsertSchema, createSelectSchema } from "drizzle-zod" import { assetLikes } from "./asset-likes" @@ -101,7 +101,7 @@ export const selectAssetSchema = createSelectSchema(asset) export const assetRelations = relations(asset, ({ one, many }) => ({ assetTagAsset: many(assetTagAsset), - atlasToAsset: many(atlasToAsset), + assetExternalFileToAsset: many(assetExternalFileToAsset), assetLikes: many(assetLikes), authUser: one(authUser, { fields: [asset.uploadedById, asset.uploadedByName], diff --git a/src/v2/db/schema/user/user.ts b/src/v2/db/schema/user/user.ts index d1e24de..cf670d6 100644 --- a/src/v2/db/schema/user/user.ts +++ b/src/v2/db/schema/user/user.ts @@ -17,7 +17,7 @@ import { socialsConnection } from "./user-connections" import { userCollection } from "../collections/user-collections" import { passwordResetToken } from "./user-attributes" import { emailVerificationToken } from "./user-attributes" -import { atlas } from "../asset/asset-atlas" +import { assetExternalFile } from "../asset/asset-external-files" import { userCollectionLikes } from "../collections/user-collection-likes" import { userCollectionCollaborators } from "../collections/user-collections-collaborators" import { assetLikes } from "../asset/asset-likes" @@ -160,7 +160,7 @@ export const usersRelations = relations(authUser, ({ one, many }) => ({ authCredentials: one(authCredentials), userSession: many(userSession), asset: many(asset), - atlas: many(atlas), + assetExternalFile: many(assetExternalFile), userFavorite: one(userFavorite), userCollectionLikes: many(userCollectionLikes), assetLikes: many(assetLikes), diff --git a/src/v2/routes/auth/session/validate/route.ts b/src/v2/routes/auth/session/validate/route.ts index 8efacaa..2ee78f7 100644 --- a/src/v2/routes/auth/session/validate/route.ts +++ b/src/v2/routes/auth/session/validate/route.ts @@ -4,7 +4,6 @@ import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() -// @ts-expect-error: this is going to complain lmfao - hacky workaround for now; there's probably a built in method for this somewhere? - read ./schema.ts handler.openapi(authValidationRoute, async (ctx) => { const authSessionManager = new AuthSessionManager(ctx) From b87ddcb18a0ba12580c540360f4085afec060a06 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Fri, 5 Jan 2024 15:23:22 +0000 Subject: [PATCH 214/318] set allowedfiletypes and filetype for external files (#71) --- README.md | 14 ++++++----- .../db/schema/asset/asset-external-files.ts | 23 ++++++++++++++++--- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index e962233..0e730de 100644 --- a/README.md +++ b/README.md @@ -14,11 +14,13 @@ Source code for the API powering [**wanderer.moe**](https://wanderer.moe) — us ### Turso -We use Turso (libsql, fork of SQLite) as our database. You will need to install the [Turso CLI](https://docs.turso.tech/reference/turso-cli#installation) then run `turso dev` to start a local database. You can persist data by passing `--db-file `. +We use Turso (libsql, very lightweight fork of SQLite) as our database. You will need to install the [Turso CLI](https://docs.turso.tech/reference/turso-cli#installation) then run `turso dev` to start a local database. You can persist data by passing `--db-file `. -The Turso CLI can be run on Windows using WSL. +The Turso CLI can be run on Windows using WSL and the `--headless` flag. -The API will connect to the local database if the environment is set to `DEV`, else - it will connect to your production database. +To install `sqld` for dev db `wget https://github.com/libsql/sqld/releases/download/v0.21.9/sqld-installer.sh` or whatever the newest version is, then `sh sqld-installer.sh`. + +The API will connect to the local database if the environment is set to `DEV` in `.env`, else - it will connect to your production database. To generate seed data, generate and migrate, you can run `pnpm drizzle:init:dev`. @@ -26,7 +28,7 @@ To generate seed data, generate and migrate, you can run `pnpm drizzle:init:dev` Configuration is in `wrangler.toml`. -You will require either a workers paid plan **or to set your worker to unbound** for authentication and password hashing to work. +You will most likely require a workers paid plan for authentication and password hashing to work. Required environment variables are viewable in `./src/worker-configuration.d.ts`. @@ -46,7 +48,7 @@ Required environment variables are viewable in `./src/worker-configuration.d.ts` ## Authors -- [@dromzeh][Dromzeh] +- [@dromzeh][dromzeh] ## License @@ -55,6 +57,6 @@ Required environment variables are viewable in `./src/worker-configuration.d.ts` [Banner]: https://files.catbox.moe/qa3eus.svg [Quality]: https://img.shields.io/codefactor/grade/github/wanderer-moe/api?label=quality&style=for-the-badge [Cloudflare API Token]: https://dash.cloudflare.com/profile/api-tokens -[Dromzeh]: https://github.com/dromzeh +[dromzeh]: https://github.com/dromzeh [api.wanderer.moe]: https://api.wanderer.moe [License]: LICENSE diff --git a/src/v2/db/schema/asset/asset-external-files.ts b/src/v2/db/schema/asset/asset-external-files.ts index 96ee009..5edb87c 100644 --- a/src/v2/db/schema/asset/asset-external-files.ts +++ b/src/v2/db/schema/asset/asset-external-files.ts @@ -15,15 +15,32 @@ import { createInsertSchema, createSelectSchema } from "drizzle-zod" NOTE: this allows for users down the line to link files to assets */ +type AllowedFileTypes = "atlas" | "skel" | "png" | "jpg" | "jpeg" // this is just temporary + export const assetExternalFile = sqliteTable( tableNames.assetExternalFile, { id: text("id").primaryKey().notNull(), url: text("url").notNull(), - uploadedById: text("uploaded_by").notNull(), - uploadedByName: text("uploaded_by_name").notNull(), - uploadedDate: integer("uploaded_date").notNull(), + uploadedById: text("uploaded_by") + .notNull() + .references(() => authUser.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + uploadedByName: text("uploaded_by_name") + .notNull() + .references(() => authUser.username, { + onUpdate: "cascade", + onDelete: "cascade", + }), + uploadedDate: text("uploaded_date") + .notNull() + .$defaultFn(() => { + return new Date().toISOString() + }), fileSize: integer("file_size").default(0).notNull(), + fileType: text("file_type").notNull().$type(), }, (table) => { return { From 9ff8e03650cb6cd96ce73dfb750c49cd3a341144 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Fri, 5 Jan 2024 15:48:32 +0000 Subject: [PATCH 215/318] fix validate schema & modify/delete game route --- src/v2/routes/auth/session/validate/schema.ts | 24 ++----------------- src/v2/routes/game/handler.ts | 4 ++-- src/v2/routes/game/modify/id/[id]/route.ts | 2 +- 3 files changed, 5 insertions(+), 25 deletions(-) diff --git a/src/v2/routes/auth/session/validate/schema.ts b/src/v2/routes/auth/session/validate/schema.ts index eb6cd38..14d1a73 100644 --- a/src/v2/routes/auth/session/validate/schema.ts +++ b/src/v2/routes/auth/session/validate/schema.ts @@ -1,27 +1,7 @@ import { z } from "@hono/zod-openapi" - -// this is really ugly, and we really shouldn't be doing this manually at ALL lol -// BUT the issue is that the SQLite drizzle adapter for lucia does not support LibSQL yet -// therefore, we have inconsistencies between camelCase and snake_case. - -// considering that snake_case this is ONLY for this route (where we're using Lucia) - it's honestly probably fine to keep? -export const validationUserSchema = z.object({ - avatar_url: z.string().nullable(), - banner_url: z.string().nullable(), - username: z.string(), - username_colour: z.string().nullable(), - email: z.string(), - email_verified: z.boolean(), - pronouns: z.string().nullable(), - verified: z.boolean(), - bio: z.string().nullable(), - date_joined: z.string(), - role_flags: z.number(), - is_contributor: z.boolean(), - self_assignable_role_flags: z.number().nullable(), -}) +import { selectUserSchema } from "@/v2/db/schema" export const authValidationSchema = z.object({ success: z.literal(true), - user: validationUserSchema, + user: selectUserSchema, }) diff --git a/src/v2/routes/game/handler.ts b/src/v2/routes/game/handler.ts index 3c32462..7f63471 100644 --- a/src/v2/routes/game/handler.ts +++ b/src/v2/routes/game/handler.ts @@ -8,7 +8,7 @@ const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.route("/get", GameGetRoute) handler.route("/create", GameCreateRoute) -handler.route("/modify/id/{id}", ModifyGameRoute) -handler.route("/delete/id/{id}", DeleteGameRoute) +handler.route("/modify", ModifyGameRoute) +handler.route("/delete", DeleteGameRoute) export default handler diff --git a/src/v2/routes/game/modify/id/[id]/route.ts b/src/v2/routes/game/modify/id/[id]/route.ts index 1c9b9ff..9e90b9d 100644 --- a/src/v2/routes/game/modify/id/[id]/route.ts +++ b/src/v2/routes/game/modify/id/[id]/route.ts @@ -42,7 +42,7 @@ handler.openapi(modifyGameRoute, async (ctx) => { const gameManager = new GameManager(drizzle) - const gameExists = await gameManager.doesGameExist(name) + const gameExists = await gameManager.doesGameExist(id) if (!gameExists) { return ctx.json( From 8e492b8a7018a3bcd477f8df5109c277244e6af7 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Fri, 5 Jan 2024 16:21:47 +0000 Subject: [PATCH 216/318] improve request schema validation --- src/v2/lib/managers/asset/asset-manager.ts | 1 + src/v2/routes/asset/upload/route.ts | 3 ++- src/v2/routes/asset/upload/schema.ts | 24 +++++++++++++++------ src/v2/routes/game/create/route.ts | 15 +------------ src/v2/routes/game/create/schema.ts | 16 +++++++++----- src/v2/routes/game/modify/id/[id]/route.ts | 15 +------------ src/v2/routes/game/modify/id/[id]/schema.ts | 16 +++++++++----- 7 files changed, 44 insertions(+), 46 deletions(-) diff --git a/src/v2/lib/managers/asset/asset-manager.ts b/src/v2/lib/managers/asset/asset-manager.ts index 6b8b3f9..1550af6 100644 --- a/src/v2/lib/managers/asset/asset-manager.ts +++ b/src/v2/lib/managers/asset/asset-manager.ts @@ -234,6 +234,7 @@ export class AssetManager { fileSize: 0, width: 0, height: 0, + assetIsSuggestive: newAsset.assetIsSuggestive == 1 ? true : false, }) .returning() diff --git a/src/v2/routes/asset/upload/route.ts b/src/v2/routes/asset/upload/route.ts index 7dea848..6c3a58d 100644 --- a/src/v2/routes/asset/upload/route.ts +++ b/src/v2/routes/asset/upload/route.ts @@ -21,7 +21,7 @@ handler.openapi(uploadAssetRoute, async (ctx) => { ) } - const { asset, name, tags, assetCategoryId, gameId } = ctx.req.valid("form") + const { asset, name, tags, assetCategoryId, gameId, assetIsSuggestive } = ctx.req.valid("form") const { drizzle } = getConnection(ctx.env) const assetManager = new AssetManager(drizzle) @@ -34,6 +34,7 @@ handler.openapi(uploadAssetRoute, async (ctx) => { tags, assetCategoryId, gameId, + assetIsSuggestive, }, ctx.env.FILES_BUCKET, asset as File diff --git a/src/v2/routes/asset/upload/schema.ts b/src/v2/routes/asset/upload/schema.ts index 777840c..6bad6a7 100644 --- a/src/v2/routes/asset/upload/schema.ts +++ b/src/v2/routes/asset/upload/schema.ts @@ -1,7 +1,7 @@ import { z } from "@hono/zod-openapi" -const ACCEPTED_IMAGE_TYPES = ["image/png"] -const MAX_FILE_SIZE = 5 * 1024 * 1024 +const AcceptedImageType = "image/png" +const MaxFileSize = 5 * 1024 * 1024 export const uploadAssetSchema = z.object({ asset: z @@ -10,14 +10,14 @@ export const uploadAssetSchema = z.object({ description: "The image of the asset to upload.", example: "asset", }) - .refine((files) => files?.length == 1, "Image is required.") + .refine((files) => files?.length == 1, "An image is required.") .refine( - (files) => files?.[0]?.size <= MAX_FILE_SIZE, - `Max file size is 5MB.` + (files) => files?.[0]?.size <= MaxFileSize, + `Max file size is 5MB)` ) .refine( - (files) => ACCEPTED_IMAGE_TYPES.includes(files?.[0]?.type), - ".jpg, .jpeg, .png and .webp files are accepted." + (files) => files?.[0]?.type === AcceptedImageType, + `Only ${AcceptedImageType} is accepted.` ), name: z.string().min(3).max(32).openapi({ description: "The name of the asset.", @@ -38,4 +38,14 @@ export const uploadAssetSchema = z.object({ description: "The game ID for the asset.", example: "genshin-impact", }), + assetIsSuggestive: z + .string() + .min(1) + .max(1) + .openapi({ + description: "If the asset contains suggestive content 0 or 1.", + example: "1", + }) + .transform((value) => parseInt(value)) + .refine((value) => value === 1 || value === 0), }) diff --git a/src/v2/routes/game/create/route.ts b/src/v2/routes/game/create/route.ts index 391121b..bf8931e 100644 --- a/src/v2/routes/game/create/route.ts +++ b/src/v2/routes/game/create/route.ts @@ -25,19 +25,6 @@ handler.openapi(createGameRoute, async (ctx) => { const { name, formattedName, possibleSuggestiveContent } = ctx.req.valid("json") - if ( - possibleSuggestiveContent !== "1" && - possibleSuggestiveContent !== "0" - ) { - return ctx.json( - { - success: false, - message: "Invalid suggestive content value, must be 0 or 1", - }, - 400 - ) - } - const { drizzle } = getConnection(ctx.env) const gameManager = new GameManager(drizzle) @@ -57,7 +44,7 @@ handler.openapi(createGameRoute, async (ctx) => { const game = await gameManager.createGame( name, formattedName, - parseInt(possibleSuggestiveContent) + possibleSuggestiveContent ) return ctx.json( diff --git a/src/v2/routes/game/create/schema.ts b/src/v2/routes/game/create/schema.ts index 40911df..8b9b69c 100644 --- a/src/v2/routes/game/create/schema.ts +++ b/src/v2/routes/game/create/schema.ts @@ -10,11 +10,17 @@ export const createGameSchema = z.object({ description: "The formatted name of the game.", example: "Honkai: Star Rail", }), - possibleSuggestiveContent: z.string().min(1).max(1).openapi({ - description: - "If the game contains suggestive content. 1 = Yes, 0 = No.", - example: "1", - }), + possibleSuggestiveContent: z + .string() + .min(1) + .max(1) + .openapi({ + description: + "If the game contains suggestive content. 1 = Yes, 0 = No.", + example: "1", + }) + .transform((value) => parseInt(value)) + .refine((value) => value === 1 || value === 0), }) export const createGameResponse = z.object({ diff --git a/src/v2/routes/game/modify/id/[id]/route.ts b/src/v2/routes/game/modify/id/[id]/route.ts index 9e90b9d..37ebfda 100644 --- a/src/v2/routes/game/modify/id/[id]/route.ts +++ b/src/v2/routes/game/modify/id/[id]/route.ts @@ -25,19 +25,6 @@ handler.openapi(modifyGameRoute, async (ctx) => { const { id, name, formattedName, possibleSuggestiveContent } = ctx.req.valid("json") - if ( - possibleSuggestiveContent !== "1" && - possibleSuggestiveContent !== "0" - ) { - return ctx.json( - { - success: false, - message: "Invalid suggestive content value, must be 0 or 1", - }, - 400 - ) - } - const { drizzle } = getConnection(ctx.env) const gameManager = new GameManager(drizzle) @@ -58,7 +45,7 @@ handler.openapi(modifyGameRoute, async (ctx) => { id, name, formattedName, - parseInt(possibleSuggestiveContent) + possibleSuggestiveContent ) return ctx.json( diff --git a/src/v2/routes/game/modify/id/[id]/schema.ts b/src/v2/routes/game/modify/id/[id]/schema.ts index 154aea9..3a05ff6 100644 --- a/src/v2/routes/game/modify/id/[id]/schema.ts +++ b/src/v2/routes/game/modify/id/[id]/schema.ts @@ -14,11 +14,17 @@ export const modifyGameSchema = z.object({ description: "The new formatted name of the game.", example: "Honkai: Star Rail", }), - possibleSuggestiveContent: z.string().min(1).max(1).openapi({ - description: - "If the game contains suggestive content. 1 = Yes, 0 = No.", - example: "1", - }), + possibleSuggestiveContent: z + .string() + .min(1) + .max(1) + .openapi({ + description: + "If the game contains suggestive content. 1 = Yes, 0 = No.", + example: "1", + }) + .transform((value) => parseInt(value)) + .refine((value) => value === 1 || value === 0), }) export const modifyGameResponseSchema = z.object({ From 16b87155aa947184b1122925383a986182aa37e4 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Fri, 5 Jan 2024 16:27:16 +0000 Subject: [PATCH 217/318] prettier & fix update asset func --- src/v2/lib/managers/asset/asset-manager.ts | 11 +++++++++-- src/v2/routes/asset/upload/route.ts | 3 ++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/v2/lib/managers/asset/asset-manager.ts b/src/v2/lib/managers/asset/asset-manager.ts index 1550af6..9f0da5a 100644 --- a/src/v2/lib/managers/asset/asset-manager.ts +++ b/src/v2/lib/managers/asset/asset-manager.ts @@ -53,7 +53,13 @@ export class AssetManager { try { return await this.drizzle .update(asset) - .set(update) + .set({ + name: update.name, + assetCategoryId: update.assetCategoryId, + gameId: update.gameId, + assetIsSuggestive: + update.assetIsSuggestive == 1 ? true : false, + }) .where(eq(asset.id, assetId)) .returning() } catch (e) { @@ -234,7 +240,8 @@ export class AssetManager { fileSize: 0, width: 0, height: 0, - assetIsSuggestive: newAsset.assetIsSuggestive == 1 ? true : false, + assetIsSuggestive: + newAsset.assetIsSuggestive == 1 ? true : false, }) .returning() diff --git a/src/v2/routes/asset/upload/route.ts b/src/v2/routes/asset/upload/route.ts index 6c3a58d..e46d1f7 100644 --- a/src/v2/routes/asset/upload/route.ts +++ b/src/v2/routes/asset/upload/route.ts @@ -21,7 +21,8 @@ handler.openapi(uploadAssetRoute, async (ctx) => { ) } - const { asset, name, tags, assetCategoryId, gameId, assetIsSuggestive } = ctx.req.valid("form") + const { asset, name, tags, assetCategoryId, gameId, assetIsSuggestive } = + ctx.req.valid("form") const { drizzle } = getConnection(ctx.env) const assetManager = new AssetManager(drizzle) From 7624f1690812e533cf36f5fb36be21e8e14688ea Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Fri, 5 Jan 2024 20:04:52 +0000 Subject: [PATCH 218/318] favourites validation --- src/v2/lib/managers/asset/asset-manager.ts | 5 +-- .../lib/managers/favorite/favorite-manager.ts | 41 +++++++++++++++++++ 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/src/v2/lib/managers/asset/asset-manager.ts b/src/v2/lib/managers/asset/asset-manager.ts index 9f0da5a..0523735 100644 --- a/src/v2/lib/managers/asset/asset-manager.ts +++ b/src/v2/lib/managers/asset/asset-manager.ts @@ -157,9 +157,6 @@ export class AssetManager { const searchQuery = name ?? null const tagList = tags ? SplitQueryByCommas(tags.toLowerCase()) : null - console.log(query) - console.log(categoryList, gameList, searchQuery) - const assets = await this.drizzle.query.asset.findMany({ where: (asset, { and, or, like, eq, sql }) => and( @@ -215,7 +212,7 @@ export class AssetManager { userId: string, userNickname: string, newAsset: z.infer, - bucket: R2Bucket, + bucket: R2Bucket, // TODO(dromzeh): come back to this later :^) file: File ): Promise { try { diff --git a/src/v2/lib/managers/favorite/favorite-manager.ts b/src/v2/lib/managers/favorite/favorite-manager.ts index 6f7da71..4a7691a 100644 --- a/src/v2/lib/managers/favorite/favorite-manager.ts +++ b/src/v2/lib/managers/favorite/favorite-manager.ts @@ -25,6 +25,12 @@ export class FavoriteManager { currentUserId?: string ): Promise { try { + const favouriteExists = this.checkIfUserFavoriteExists(userId) + + if (!favouriteExists) { + await this.createInitialFavorite(userId) + } + const [favorite] = await this.drizzle .select() .from(userFavorite) @@ -49,6 +55,27 @@ export class FavoriteManager { } } + public async checkIfUserFavoriteExists(userId: string): Promise { + try { + const [favorite] = await this.drizzle + .select({ + id: userFavorite.id, + }) + .from(userFavorite) + .where(and(eq(userFavorite.userId, userId))) + + return favorite ? true : false + } catch (e) { + console.error( + `Error in checkIfUserFavoriteExists for userId ${userId}`, + e + ) + throw new Error( + `Error in checkIfUserFavoriteExists for userId ${userId}` + ) + } + } + /** * Create initial user favorite (1 per user!) * @param userId - The ID of the user to create favorites for. @@ -83,9 +110,16 @@ export class FavoriteManager { */ public async addAssetToFavorites( assetId: number, + userId: string, userFavoriteId: string ): Promise { try { + const favouriteExists = this.checkIfUserFavoriteExists(userId) + + if (!favouriteExists) { + await this.createInitialFavorite(userId) + } + const [favorite] = await this.drizzle .insert(userFavoriteAsset) .values({ @@ -113,9 +147,16 @@ export class FavoriteManager { */ public async removeAssetFromFavorites( assetId: number, + userId: string, userFavoriteId: string ): Promise { try { + const favouriteExists = this.checkIfUserFavoriteExists(userId) + + if (!favouriteExists) { + await this.createInitialFavorite(userId) + } + const [favorite] = await this.drizzle .delete(userFavoriteAsset) .where( From 681f799675bb976f676944481b331748a3a10705 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sat, 6 Jan 2024 13:19:51 +0000 Subject: [PATCH 219/318] fix tag references --- src/v2/lib/managers/asset/asset-manager.ts | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/v2/lib/managers/asset/asset-manager.ts b/src/v2/lib/managers/asset/asset-manager.ts index 0523735..9e7b66d 100644 --- a/src/v2/lib/managers/asset/asset-manager.ts +++ b/src/v2/lib/managers/asset/asset-manager.ts @@ -157,6 +157,10 @@ export class AssetManager { const searchQuery = name ?? null const tagList = tags ? SplitQueryByCommas(tags.toLowerCase()) : null + // TODO(dromzeh): this is really ugly imo, worried about performance a little + // when writing with raw sql, it makes joins really annoying + // i've seen people seperate this into two queries (one for the tags, one for the assets) then merge them together + // but i don't really want to do that lol - fine for now but should come back to this later :^) const assets = await this.drizzle.query.asset.findMany({ where: (asset, { and, or, like, eq, sql }) => and( @@ -172,12 +176,16 @@ export class AssetManager { ? like(asset.name, `%${searchQuery}%`) : undefined, gameList - ? or(...gameList.map((g) => eq(asset.gameId, g))) + ? or( + ...gameList.map((game) => + eq(asset.gameId, game) + ) + ) : undefined, categoryList ? or( - ...categoryList.map((c) => - eq(asset.assetCategoryId, c) + ...categoryList.map((category) => + eq(asset.assetCategoryId, category) ) ) : undefined, @@ -217,9 +225,10 @@ export class AssetManager { ): Promise { try { const { key } = await bucket.put( - `/assets/${newAsset.gameId}/${newAsset.assetCategoryId}/${newAsset.name}`, + `/assets/${newAsset.gameId}/${newAsset.assetCategoryId}/${newAsset.name}.png`, file ) + // TODO(dromzeh): correct file size, width, and height const returnedNewAsset: Asset = await this.drizzle.transaction( async (trx) => { @@ -256,7 +265,7 @@ export class AssetManager { if (foundTag) { await trx.insert(assetTagAsset).values({ - assetId: createdAsset[0].assetId, + assetId: createdAsset.id, assetTagId: tag, }) } From 13a3d01b070e5cf8141d16b3ac41bac4ca915b99 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 7 Jan 2024 12:52:21 +0000 Subject: [PATCH 220/318] fix auth defs and convert in getuserattr --- src/v2/lib/auth/definitions/auth-definitions.ts | 4 ++++ src/v2/lib/auth/lucia.ts | 8 ++++++-- src/v2/lib/managers/asset/asset-manager.ts | 10 +++++----- src/v2/lib/managers/auth/user-session-manager.ts | 8 ++++---- 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/v2/lib/auth/definitions/auth-definitions.ts b/src/v2/lib/auth/definitions/auth-definitions.ts index bac0679..dbad3c8 100644 --- a/src/v2/lib/auth/definitions/auth-definitions.ts +++ b/src/v2/lib/auth/definitions/auth-definitions.ts @@ -11,6 +11,7 @@ declare module "lucia" { DatabaseUserAttributes: { avatar_url: string | null banner_url: string | null + display_name: string | null username: string username_colour: string | null email: string @@ -19,6 +20,9 @@ declare module "lucia" { verified: boolean bio: string | null date_joined: string + is_supporter: boolean + supporter_expires_at: string | null + is_banned: boolean role_flags: number is_contributor: boolean self_assignable_role_flags: number | null diff --git a/src/v2/lib/auth/lucia.ts b/src/v2/lib/auth/lucia.ts index 8608ec8..0fdd2fa 100644 --- a/src/v2/lib/auth/lucia.ts +++ b/src/v2/lib/auth/lucia.ts @@ -19,16 +19,20 @@ export function luciaAuth(env: Bindings) { return { avatarUrl: user.avatar_url, bannerUrl: user.banner_url, + displayName: user.display_name, username: user.username, usernameColour: user.username_colour, email: user.email, - emailVerified: user.email_verified, + emailVerified: Boolean(user.email_verified), pronouns: user.pronouns, verified: user.verified, bio: user.bio, dateJoined: user.date_joined, - roleFlags: user.role_flags, + isSupporter: Boolean(user.is_supporter), + supporterExpiresAt: user.supporter_expires_at, + isBanned: Boolean(user.is_banned), isContributor: user.is_contributor, + roleFlags: user.role_flags, selfAssignableRoleFlags: user.self_assignable_role_flags, } }, diff --git a/src/v2/lib/managers/asset/asset-manager.ts b/src/v2/lib/managers/asset/asset-manager.ts index 9e7b66d..45b07f8 100644 --- a/src/v2/lib/managers/asset/asset-manager.ts +++ b/src/v2/lib/managers/asset/asset-manager.ts @@ -57,8 +57,7 @@ export class AssetManager { name: update.name, assetCategoryId: update.assetCategoryId, gameId: update.gameId, - assetIsSuggestive: - update.assetIsSuggestive == 1 ? true : false, + assetIsSuggestive: Boolean(update.assetIsSuggestive), }) .where(eq(asset.id, assetId)) .returning() @@ -118,7 +117,7 @@ export class AssetManager { ) ) ), - limit: 6, + limit: 12, }) } catch (e) { console.error(`Error getting similar assets by ID ${assetId}`, e) @@ -246,8 +245,9 @@ export class AssetManager { fileSize: 0, width: 0, height: 0, - assetIsSuggestive: - newAsset.assetIsSuggestive == 1 ? true : false, + assetIsSuggestive: Boolean( + newAsset.assetIsSuggestive + ), }) .returning() diff --git a/src/v2/lib/managers/auth/user-session-manager.ts b/src/v2/lib/managers/auth/user-session-manager.ts index 1ac5920..cf34d1d 100644 --- a/src/v2/lib/managers/auth/user-session-manager.ts +++ b/src/v2/lib/managers/auth/user-session-manager.ts @@ -1,16 +1,13 @@ import { luciaAuth } from "../../auth/lucia" -import { getConnection } from "@/v2/db/turso" import type { Session, User } from "lucia" import { getCookie } from "hono/cookie" export class AuthSessionManager { private lucia: ReturnType - private drizzle: ReturnType["drizzle"] private sessionCookie: string | undefined constructor(private ctx: APIContext) { this.lucia = luciaAuth(this.ctx.env) - this.drizzle = getConnection(this.ctx.env).drizzle this.sessionCookie = getCookie(this.ctx, this.lucia.sessionCookieName) } @@ -30,7 +27,10 @@ export class AuthSessionManager { } public async validateSession() { - return this.validateAndGetSession() + return this.validateAndGetSession().then(({ user }) => { + // ignore + return { user } + }) } public async getAllSessions() { From 9761baedf01e5b9d996a95513a7b03b55381d790 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 7 Jan 2024 18:58:38 +0000 Subject: [PATCH 221/318] validate session attributes --- .../lib/managers/auth/user-session-manager.ts | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/v2/lib/managers/auth/user-session-manager.ts b/src/v2/lib/managers/auth/user-session-manager.ts index cf34d1d..428eadc 100644 --- a/src/v2/lib/managers/auth/user-session-manager.ts +++ b/src/v2/lib/managers/auth/user-session-manager.ts @@ -2,6 +2,10 @@ import { luciaAuth } from "../../auth/lucia" import type { Session, User } from "lucia" import { getCookie } from "hono/cookie" +const USER_AGENT = "user-agent" +const CONNECTING_IP = "cf-connecting-ip" +const IP_COUNTRY = "cf-ipcountry" + export class AuthSessionManager { private lucia: ReturnType private sessionCookie: string | undefined @@ -27,9 +31,21 @@ export class AuthSessionManager { } public async validateSession() { - return this.validateAndGetSession().then(({ user }) => { - // ignore - return { user } + return this.validateAndGetSession().then(({ user, session }) => { + if (!user || !session) { + return null + } + + if ( + session.userAgent !== this.ctx.req.header(USER_AGENT) || + session.ipAddress !== this.ctx.req.header(CONNECTING_IP) || + session.countryCode !== this.ctx.req.header(IP_COUNTRY) || + session.expiresAt < new Date() + ) { + return null + } + + return { user, session } }) } From 5434385cab3898c04c1225b4c990dbd9e5bfb41a Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 7 Jan 2024 21:46:11 +0000 Subject: [PATCH 222/318] invalidate session if attr dont match --- src/v2/lib/managers/auth/user-session-manager.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/v2/lib/managers/auth/user-session-manager.ts b/src/v2/lib/managers/auth/user-session-manager.ts index 428eadc..50f9fae 100644 --- a/src/v2/lib/managers/auth/user-session-manager.ts +++ b/src/v2/lib/managers/auth/user-session-manager.ts @@ -42,6 +42,7 @@ export class AuthSessionManager { session.countryCode !== this.ctx.req.header(IP_COUNTRY) || session.expiresAt < new Date() ) { + this.lucia.invalidateSession(session.id) return null } From 00d6537a40f1c3a2ffa93b8a6e4ef392f7440ba9 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Thu, 18 Jan 2024 21:07:04 +0000 Subject: [PATCH 223/318] update .env to .dev.vars (kinda)................................ --- .dev.vars.example | 3 +++ .env.example | 3 --- README.md | 2 +- drizzle.config.ts | 8 +------- src/scripts/migrate/migrate.mts | 3 +++ src/scripts/seed/seed.ts | 12 ++++++------ 6 files changed, 14 insertions(+), 17 deletions(-) create mode 100644 .dev.vars.example delete mode 100644 .env.example diff --git a/.dev.vars.example b/.dev.vars.example new file mode 100644 index 0000000..409f97c --- /dev/null +++ b/.dev.vars.example @@ -0,0 +1,3 @@ +ENVIRONMENT = DEV # DEV | PROD +TURSO_DATABASE_AUTH_TOKEN = adfasdfsdfsdfsdfsdf +TURSO_DATABASE_URL = https://127.0.0.1:8080/ \ No newline at end of file diff --git a/.env.example b/.env.example deleted file mode 100644 index bfe16ff..0000000 --- a/.env.example +++ /dev/null @@ -1,3 +0,0 @@ -ENVIRONMENT = DEV # DEV | PROD -TURSO_DATABASE_URL = dsikfjhskdlfnjklsdfnjgnfkslndfg -TURSO_DATABASE_AUTH_TOKEN = hi \ No newline at end of file diff --git a/README.md b/README.md index 0e730de..fc3ccf2 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ The Turso CLI can be run on Windows using WSL and the `--headless` flag. To install `sqld` for dev db `wget https://github.com/libsql/sqld/releases/download/v0.21.9/sqld-installer.sh` or whatever the newest version is, then `sh sqld-installer.sh`. -The API will connect to the local database if the environment is set to `DEV` in `.env`, else - it will connect to your production database. +The API will connect to the local database if the environment is set to `DEV` in `.dev.vars`, else - it will connect to your production database. To generate seed data, generate and migrate, you can run `pnpm drizzle:init:dev`. diff --git a/drizzle.config.ts b/drizzle.config.ts index 4d2f32c..7fc2a98 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -1,9 +1,4 @@ -import "dotenv/config" import type { Config } from "drizzle-kit" -const { TURSO_DATABASE_AUTH_TOKEN, TURSO_DATABASE_URL, ENVIRONMENT } = - process.env - -const isDev = ENVIRONMENT === "DEV" export default { out: "./src/v2/db/migrations", @@ -13,7 +8,6 @@ export default { strict: true, verbose: true, dbCredentials: { - url: isDev ? "http://127.0.0.1:8080" : TURSO_DATABASE_URL!, - authToken: isDev ? undefined : TURSO_DATABASE_AUTH_TOKEN!, + url: "http://127.0.0.1:8080", }, } satisfies Config diff --git a/src/scripts/migrate/migrate.mts b/src/scripts/migrate/migrate.mts index 0d73ff4..1be617d 100644 --- a/src/scripts/migrate/migrate.mts +++ b/src/scripts/migrate/migrate.mts @@ -2,6 +2,9 @@ import { drizzle as drizzleORM } from "drizzle-orm/libsql" import { migrate } from "drizzle-orm/libsql/migrator" import { createClient } from "@libsql/client" import "dotenv/config" +import dotenv from "dotenv" + +dotenv.config({ path: ".dev.vars" }) const { TURSO_DATABASE_AUTH_TOKEN, diff --git a/src/scripts/seed/seed.ts b/src/scripts/seed/seed.ts index 05b2696..06d22e3 100644 --- a/src/scripts/seed/seed.ts +++ b/src/scripts/seed/seed.ts @@ -1,6 +1,5 @@ import { drizzle as drizzleORM } from "drizzle-orm/libsql" import { createClient } from "@libsql/client" -import "dotenv/config" import { asset, assetCategory, @@ -17,15 +16,16 @@ import { userFollowing, } from "@/v2/db/schema" import { Scrypt } from "lucia" +import "dotenv/config" +import * as dotenv from "dotenv" -const { ENVIRONMENT } = process.env +dotenv.config({ path: ".dev.vars" }) -const TURSO_DEV_DATABASE_URL = - process.env.TURSO_DEV_DATABASE_URL ?? "http://127.0.0.1:8080" -const isDev = ENVIRONMENT === "DEV" +const { ENVIRONMENT, TURSO_DEV_DATABASE_URL = "http://127.0.0.1:8080" } = + process.env async function main() { - if (!isDev) { + if (ENVIRONMENT !== "DEV") { console.log("This script can only be run in development mode.") process.exit(1) } From e606ca4b65ee2e772337ab957e5c477be694a305 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Thu, 18 Jan 2024 21:18:13 +0000 Subject: [PATCH 224/318] create .dev.vars in workflow before drizzle init --- .github/workflows/test.yml | 8 +++++++- src/scripts/migrate/migrate.mts | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 20045be..53189cf 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -17,8 +17,9 @@ jobs: - 8080:8080 env: - ENVIRONMENT: "DEV" + ENVIRONMENT: DEV TURSO_DEV_DATABASE_URL: http://127.0.0.1:8080 + steps: - name: Checkout repository uses: actions/checkout@v3 @@ -37,5 +38,10 @@ jobs: - name: Install dependencies run: pnpm install + - name: Create .dev.vars file + run: | + echo ENVIRONMENT=$ENVIRONMENT >> .dev.vars + echo TURSO_DEV_DATABASE_URL=$TURSO_DEV_DATABASE_URL >> .dev.vars + - name: Initialize Drizzle run: pnpm drizzle:dev:init diff --git a/src/scripts/migrate/migrate.mts b/src/scripts/migrate/migrate.mts index 1be617d..757c6c5 100644 --- a/src/scripts/migrate/migrate.mts +++ b/src/scripts/migrate/migrate.mts @@ -34,7 +34,7 @@ async function main() { const client = createClient({ url: isDev ? TURSO_DEV_DATABASE_URL : TURSO_DATABASE_URL!, - authToken: isDev ? undefined : TURSO_DATABASE_AUTH_TOKEN!, + authToken: isDev ? undefined : TURSO_DATABASE_AUTH_TOKEN, }) const db = drizzleORM(client) From 28e2b30bcec9ffbf11bbf046f03caaada8979972 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 21 Jan 2024 21:02:22 +0000 Subject: [PATCH 225/318] delete oc related content --- src/scripts/migrate/migrate.mts | 51 +++++++------ src/v2/db/drizzle.ts | 1 - src/v2/db/schema.ts | 2 - .../db/schema/oc-generators/oc-generators.ts | 71 ------------------- src/v2/db/schema/user/user.ts | 2 - src/v2/db/turso.ts | 2 +- tsconfig.json | 2 +- 7 files changed, 31 insertions(+), 100 deletions(-) delete mode 100644 src/v2/db/schema/oc-generators/oc-generators.ts diff --git a/src/scripts/migrate/migrate.mts b/src/scripts/migrate/migrate.mts index 757c6c5..3f33827 100644 --- a/src/scripts/migrate/migrate.mts +++ b/src/scripts/migrate/migrate.mts @@ -1,7 +1,6 @@ import { drizzle as drizzleORM } from "drizzle-orm/libsql" import { migrate } from "drizzle-orm/libsql/migrator" import { createClient } from "@libsql/client" -import "dotenv/config" import dotenv from "dotenv" dotenv.config({ path: ".dev.vars" }) @@ -14,33 +13,22 @@ const { } = process.env const isDev = ENVIRONMENT === "DEV" +const DATABASE_URL = isDev ? TURSO_DEV_DATABASE_URL : TURSO_DATABASE_URL +const AUTH_TOKEN = isDev ? undefined : TURSO_DATABASE_AUTH_TOKEN async function main() { - console.log("[MIGRATION] DEV:", isDev) - - console.log( - `[MIGRATION] URL: ${ - isDev ? TURSO_DEV_DATABASE_URL : TURSO_DATABASE_URL - }` - ) - - // this is what industry standard fuck up prevention looks like - const waitTime = isDev ? 1000 : 10000 - - console.log(`[MIGRATION] Waiting ${waitTime}ms until migration...`) - await new Promise((resolve) => setTimeout(resolve, waitTime)) + logMigrationDetails() - console.log("[MIGRATION] Connecting to the database client...") + if (!DATABASE_URL) { + throw new Error("DATABASE_URL is not defined!") + } else if (!AUTH_TOKEN && !isDev) { + throw new Error("AUTH_TOKEN is not defined!") + } - const client = createClient({ - url: isDev ? TURSO_DEV_DATABASE_URL : TURSO_DATABASE_URL!, - authToken: isDev ? undefined : TURSO_DATABASE_AUTH_TOKEN, - }) + await delayBeforeMigration(isDev ? 1000 : 10000) + const client = createDatabaseClient(DATABASE_URL, AUTH_TOKEN) const db = drizzleORM(client) - console.log( - "[MIGRATION] Connected to the database client & initialized drizzle-orm instance" - ) console.log("[MIGRATION] Migrating database...") await migrate(db, { migrationsFolder: "./src/v2/db/migrations" }) @@ -49,6 +37,25 @@ async function main() { process.exit(0) } +function logMigrationDetails() { + console.log("[MIGRATION] DEV:", isDev) + console.log(`[MIGRATION] URL: ${DATABASE_URL}`) +} + +function delayBeforeMigration(waitTime: number) { + console.log(`[MIGRATION] Waiting ${waitTime}ms until migration...`) + return new Promise((resolve) => setTimeout(resolve, waitTime)) +} + +function createDatabaseClient(url: string, authToken: string | undefined) { + console.log("[MIGRATION] Connecting to the database client...") + const client = createClient({ url, authToken }) + console.log( + "[MIGRATION] Connected to the database client & initialized drizzle-orm instance" + ) + return client +} + main().catch((err) => { console.error(`[MIGRATION] Error: ${err}`) process.exit(1) diff --git a/src/v2/db/drizzle.ts b/src/v2/db/drizzle.ts index 09644cc..00c358c 100644 --- a/src/v2/db/drizzle.ts +++ b/src/v2/db/drizzle.ts @@ -22,7 +22,6 @@ export const tableNames = { passwordResetToken: "passwordResetToken", assetCategory: "assetCategory", assetCategoryLikes: "assetCategoryLikes", - savedOcGenerators: "savedOcGenerators", userFavorite: "userFavorite", userFavoriteAsset: "userFavoriteAsset", userCollection: "userCollection", diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index b64af48..79eb213 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -11,8 +11,6 @@ export * from "./schema/game/game-likes" export * from "./schema/tags/asset-tags" export * from "./schema/tags/asset-tags-likes" -export * from "./schema/oc-generators/oc-generators" - export * from "./schema/user/user" export * from "./schema/user/user-attributes" export * from "./schema/collections/user-collections" diff --git a/src/v2/db/schema/oc-generators/oc-generators.ts b/src/v2/db/schema/oc-generators/oc-generators.ts deleted file mode 100644 index d368422..0000000 --- a/src/v2/db/schema/oc-generators/oc-generators.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { tableNames } from "@/v2/db/drizzle" -import { relations } from "drizzle-orm" -import { - sqliteTable, - text, - integer, - // uniqueIndex, - index, -} from "drizzle-orm/sqlite-core" -import { authUser } from "../user/user" -import { createInsertSchema, createSelectSchema } from "drizzle-zod" - -/* -NOTE: OC generators are not stored in the database. -- Storing OC generators inside the database may be viable in the future, but for now, it's not necessary. -- OC Generators JSON data is viewable on the /oc-generators/ repository, where it's synced to Cloudflare R2. -*/ - -export const savedOcGenerators = sqliteTable( - tableNames.savedOcGenerators, - { - id: text("id").primaryKey().notNull(), - userId: text("user_id") - .notNull() - .references(() => authUser.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - name: text("name").notNull(), - game: text("game").notNull(), - dateCreated: text("date_created") - .notNull() - .$defaultFn(() => { - return new Date().toISOString() - }), - isPublic: integer("is_public", { mode: "boolean" }) - .default(false) - .notNull(), - content: text("content").notNull(), - savedColorPalette: text("saved_color_palette"), // array of 5 hex values, completely optional for the user to save - sakuraUrl: text("sakura_url"), - }, - (savedOcGenerators) => { - return { - savedOcGeneratorsIdx: index("saved_oc_generators_id_idx").on( - savedOcGenerators.id - ), - savedOcGeneratorsUserIdx: index( - "saved_oc_generators_user_id_idx" - ).on(savedOcGenerators.userId), - } - } -) - -export type SavedOcGenerators = typeof savedOcGenerators.$inferSelect -export type NewSavedOcGenerators = typeof savedOcGenerators.$inferInsert -export const insertSavedOcGeneratorsSchema = - createInsertSchema(savedOcGenerators) -export const selectSavedOcGeneratorsSchema = - createSelectSchema(savedOcGenerators) - -export const savedOcGeneratorsRelations = relations( - savedOcGenerators, - ({ one }) => ({ - user: one(authUser, { - fields: [savedOcGenerators.userId], - references: [authUser.id], - relationName: "saved_oc_generators_user", - }), - }) -) diff --git a/src/v2/db/schema/user/user.ts b/src/v2/db/schema/user/user.ts index cf670d6..7d66ed1 100644 --- a/src/v2/db/schema/user/user.ts +++ b/src/v2/db/schema/user/user.ts @@ -12,7 +12,6 @@ import { generateID } from "@/v2/lib/oslo" import { userFollowing } from "./user-following" import { asset } from "../asset/asset" import { userFavorite } from "./user-favorites" -import { savedOcGenerators } from "../oc-generators/oc-generators" import { socialsConnection } from "./user-connections" import { userCollection } from "../collections/user-collections" import { passwordResetToken } from "./user-attributes" @@ -168,7 +167,6 @@ export const usersRelations = relations(authUser, ({ one, many }) => ({ userCollection: many(userCollection), passwordResetToken: one(passwordResetToken), emailVerificationToken: one(emailVerificationToken), - savedOcGenerators: many(savedOcGenerators), gameLikes: many(gameLikes), assetTagLikes: many(assetTagLikes), assetCategoryLikes: many(assetCategoryLikes), diff --git a/src/v2/db/turso.ts b/src/v2/db/turso.ts index 67fad66..f612eab 100644 --- a/src/v2/db/turso.ts +++ b/src/v2/db/turso.ts @@ -11,7 +11,7 @@ import * as schema from "@/v2/db/schema" class LoggerWrapper implements Logger { // TODO(dromzeh): this is useful to log; should probably be logged elsewhere logQuery(query: string, params: unknown[]): void { - console.log(`DRIZZLE: Query: ${query}, Paremeters: ${params ?? "none"}`) + console.log(`DRIZZLE: Query: ${query}, Parameters: ${params ?? "none"}`) } } diff --git a/tsconfig.json b/tsconfig.json index 60b20e2..293dab4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,5 +11,5 @@ }, "types": ["@cloudflare/workers-types", "node"] }, - "include": ["src/**/*.ts"] + "include": ["src/**/*.ts", "src/scripts/seed/seed.mts"] } From e6e9d5599dda1731003936801fec1f7a62dd9008 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 21 Jan 2024 22:27:18 +0000 Subject: [PATCH 226/318] update deps to latest --- package.json | 28 +- pnpm-lock.yaml | 9755 ++++++++---------------------------------------- tsconfig.json | 6 +- 3 files changed, 1659 insertions(+), 8130 deletions(-) diff --git a/package.json b/package.json index a72cec3..6cb556d 100644 --- a/package.json +++ b/package.json @@ -19,34 +19,34 @@ "drizzle:studio": "drizzle-kit studio --port 7331 --host 127.0.0.1 --verbose" }, "devDependencies": { - "@asteasolutions/zod-to-openapi": "^6.3.0", - "@cloudflare/workers-types": "^4.20231218.0", - "@types/node": "^20.10.6", - "dotenv": "^16.3.1", - "drizzle-kit": "^0.20.9", + "@asteasolutions/zod-to-openapi": "^6.3.1", + "@cloudflare/workers-types": "^4.20240117.0", + "@types/node": "^20.11.5", + "dotenv": "^16.3.2", + "drizzle-kit": "^0.20.13", "eslint": "^8.56.0", "husky": "^8.0.3", "openapi-generator": "link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator", "tsx": "^4.7.0", "typescript": "^5.3.3", - "wrangler": "3.22.1" + "wrangler": "3.23.0" }, "private": true, "dependencies": { "@axiomhq/js": "1.0.0-rc.1", "@hono/swagger-ui": "^0.2.1", "@hono/zod-openapi": "^0.9.5", - "@libsql/client": "0.4.0-pre.5", + "@libsql/client": "0.4.0-pre.7", "@lucia-auth/adapter-sqlite": "3.0.0-beta.12", - "@scalar/hono-api-reference": "^0.3.9", - "@typescript-eslint/eslint-plugin": "^6.16.0", - "better-sqlite3": "^9.2.2", - "drizzle-orm": "^0.29.2", + "@scalar/hono-api-reference": "^0.3.23", + "@typescript-eslint/eslint-plugin": "^6.19.0", + "better-sqlite3": "^9.3.0", + "drizzle-orm": "^0.29.3", "drizzle-zod": "^0.5.1", - "hono": "^3.12.0", + "hono": "^3.12.6", "lucia": "3.0.0-beta.14", - "oslo": "^0.26.2", - "prettier": "^3.1.1", + "oslo": "^0.27.1", + "prettier": "^3.2.4", "zod": "^3.22.4" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cab04c1..e888893 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,63 +10,63 @@ dependencies: version: 1.0.0-rc.1 "@hono/swagger-ui": specifier: ^0.2.1 - version: 0.2.1(hono@3.12.0) + version: 0.2.1(hono@3.12.6) "@hono/zod-openapi": specifier: ^0.9.5 - version: 0.9.5(hono@3.12.0)(zod@3.22.4) + version: 0.9.5(hono@3.12.6)(zod@3.22.4) "@libsql/client": - specifier: 0.4.0-pre.5 - version: 0.4.0-pre.5 + specifier: 0.4.0-pre.7 + version: 0.4.0-pre.7 "@lucia-auth/adapter-sqlite": specifier: 3.0.0-beta.12 - version: 3.0.0-beta.12(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2)(lucia@3.0.0-beta.14) + version: 3.0.0-beta.12(@libsql/client@0.4.0-pre.7)(better-sqlite3@9.3.0)(lucia@3.0.0-beta.14) "@scalar/hono-api-reference": - specifier: ^0.3.9 - version: 0.3.9(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(hono@3.12.0)(nanoid@5.0.4)(postcss@8.4.32)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.5) + specifier: ^0.3.23 + version: 0.3.23(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(hono@3.12.6)(nanoid@5.0.4)(postcss@8.4.33)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15) "@typescript-eslint/eslint-plugin": - specifier: ^6.16.0 - version: 6.16.0(@typescript-eslint/parser@6.17.0)(eslint@8.56.0)(typescript@5.3.3) + specifier: ^6.19.0 + version: 6.19.0(@typescript-eslint/parser@6.19.0)(eslint@8.56.0)(typescript@5.3.3) better-sqlite3: - specifier: ^9.2.2 - version: 9.2.2 + specifier: ^9.3.0 + version: 9.3.0 drizzle-orm: - specifier: ^0.29.2 - version: 0.29.2(@cloudflare/workers-types@4.20231218.0)(@libsql/client@0.4.0-pre.5)(@types/react@18.2.46)(better-sqlite3@9.2.2)(expo-sqlite@13.2.0)(react@18.2.0) + specifier: ^0.29.3 + version: 0.29.3(@cloudflare/workers-types@4.20240117.0)(@libsql/client@0.4.0-pre.7)(better-sqlite3@9.3.0) drizzle-zod: specifier: ^0.5.1 - version: 0.5.1(drizzle-orm@0.29.2)(zod@3.22.4) + version: 0.5.1(drizzle-orm@0.29.3)(zod@3.22.4) hono: - specifier: ^3.12.0 - version: 3.12.0 + specifier: ^3.12.6 + version: 3.12.6 lucia: specifier: 3.0.0-beta.14 version: 3.0.0-beta.14 oslo: - specifier: ^0.26.2 - version: 0.26.2 + specifier: ^0.27.1 + version: 0.27.1 prettier: - specifier: ^3.1.1 - version: 3.1.1 + specifier: ^3.2.4 + version: 3.2.4 zod: specifier: ^3.22.4 version: 3.22.4 devDependencies: "@asteasolutions/zod-to-openapi": - specifier: ^6.3.0 - version: 6.3.0(zod@3.22.4) + specifier: ^6.3.1 + version: 6.3.1(zod@3.22.4) "@cloudflare/workers-types": - specifier: ^4.20231218.0 - version: 4.20231218.0 + specifier: ^4.20240117.0 + version: 4.20240117.0 "@types/node": - specifier: ^20.10.6 - version: 20.10.6 + specifier: ^20.11.5 + version: 20.11.5 dotenv: - specifier: ^16.3.1 - version: 16.3.1 + specifier: ^16.3.2 + version: 16.3.2 drizzle-kit: - specifier: ^0.20.9 - version: 0.20.9 + specifier: ^0.20.13 + version: 0.20.13 eslint: specifier: ^8.56.0 version: 8.56.0 @@ -83,8 +83,8 @@ devDependencies: specifier: ^5.3.3 version: 5.3.3 wrangler: - specifier: 3.22.1 - version: 3.22.1 + specifier: 3.23.0 + version: 3.23.0 packages: /@aashutoshrathi/word-wrap@1.2.6: @@ -94,17 +94,6 @@ packages: } engines: { node: ">=0.10.0" } - /@ampproject/remapping@2.2.1: - resolution: - { - integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==, - } - engines: { node: ">=6.0.0" } - dependencies: - "@jridgewell/gen-mapping": 0.3.3 - "@jridgewell/trace-mapping": 0.3.20 - dev: false - /@apidevtools/json-schema-ref-parser@9.0.6: resolution: { @@ -161,10 +150,10 @@ packages: zod: 3.22.4 dev: false - /@asteasolutions/zod-to-openapi@6.3.0(zod@3.22.4): + /@asteasolutions/zod-to-openapi@6.3.1(zod@3.22.4): resolution: { - integrity: sha512-ca7Svz3BWkMaIP3M1YGsyxgp7AcKXlTmy19ozhY0DslhatXbnyxdvxlmiI0TmvkIfi6RpQfm+eK1neVLsh6Riw==, + integrity: sha512-1CRWBqslgdBpZeJnxxksGirAQ39Iztxk+LzTkYwoP0mNzuaULa604s8Xc5V9yzmYccwJ89O9fPQgxCkbNN398g==, } peerDependencies: zod: ^3.20.2 @@ -184,4599 +173,2013 @@ packages: uuid: 8.3.2 dev: false - /@babel/code-frame@7.10.4: - resolution: - { - integrity: sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==, - } - dependencies: - "@babel/highlight": 7.23.4 - dev: false - - /@babel/code-frame@7.23.5: + /@babel/helper-string-parser@7.23.4: resolution: { - integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==, + integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==, } engines: { node: ">=6.9.0" } - dependencies: - "@babel/highlight": 7.23.4 - chalk: 2.4.2 dev: false - /@babel/compat-data@7.23.5: + /@babel/helper-validator-identifier@7.22.20: resolution: { - integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==, + integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==, } engines: { node: ">=6.9.0" } dev: false - /@babel/core@7.23.7: + /@babel/parser@7.23.6: resolution: { - integrity: sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==, + integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==, } - engines: { node: ">=6.9.0" } + engines: { node: ">=6.0.0" } + hasBin: true dependencies: - "@ampproject/remapping": 2.2.1 - "@babel/code-frame": 7.23.5 - "@babel/generator": 7.23.6 - "@babel/helper-compilation-targets": 7.23.6 - "@babel/helper-module-transforms": 7.23.3(@babel/core@7.23.7) - "@babel/helpers": 7.23.7 - "@babel/parser": 7.23.6 - "@babel/template": 7.22.15 - "@babel/traverse": 7.23.7 "@babel/types": 7.23.6 - convert-source-map: 2.0.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color dev: false - /@babel/generator@7.23.6: + /@babel/runtime@7.23.8: resolution: { - integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==, + integrity: sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==, } engines: { node: ">=6.9.0" } dependencies: - "@babel/types": 7.23.6 - "@jridgewell/gen-mapping": 0.3.3 - "@jridgewell/trace-mapping": 0.3.20 - jsesc: 2.5.2 + regenerator-runtime: 0.14.1 dev: false - /@babel/helper-annotate-as-pure@7.22.5: + /@babel/types@7.23.6: resolution: { - integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==, + integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==, } engines: { node: ">=6.9.0" } dependencies: - "@babel/types": 7.23.6 + "@babel/helper-string-parser": 7.23.4 + "@babel/helper-validator-identifier": 7.22.20 + to-fast-properties: 2.0.0 dev: false - /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: + /@cloudflare/kv-asset-handler@0.2.0: resolution: { - integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==, + integrity: sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==, } - engines: { node: ">=6.9.0" } dependencies: - "@babel/types": 7.23.6 - dev: false + mime: 3.0.0 + dev: true - /@babel/helper-compilation-targets@7.23.6: + /@cloudflare/workerd-darwin-64@1.20231218.0: resolution: { - integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==, + integrity: sha512-547gOmTIVmRdDy7HNAGJUPELa+fSDm2Y0OCxqAtQOz0GLTDu1vX61xYmsb2rn91+v3xW6eMttEIpbYokKjtfJA==, } - engines: { node: ">=6.9.0" } - dependencies: - "@babel/compat-data": 7.23.5 - "@babel/helper-validator-option": 7.23.5 - browserslist: 4.22.2 - lru-cache: 5.1.1 - semver: 6.3.1 - dev: false + engines: { node: ">=16" } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true - /@babel/helper-create-class-features-plugin@7.23.7(@babel/core@7.23.7): + /@cloudflare/workerd-darwin-arm64@1.20231218.0: resolution: { - integrity: sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==, + integrity: sha512-b39qrU1bKolCfmKFDAnX4vXcqzISkEUVE/V8sMBsFzxrIpNAbcUHBZAQPYmS/OHIGB94KjOVokvDi7J6UNurPw==, } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-annotate-as-pure": 7.22.5 - "@babel/helper-environment-visitor": 7.22.20 - "@babel/helper-function-name": 7.23.0 - "@babel/helper-member-expression-to-functions": 7.23.0 - "@babel/helper-optimise-call-expression": 7.22.5 - "@babel/helper-replace-supers": 7.22.20(@babel/core@7.23.7) - "@babel/helper-skip-transparent-expression-wrappers": 7.22.5 - "@babel/helper-split-export-declaration": 7.22.6 - semver: 6.3.1 - dev: false + engines: { node: ">=16" } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true - /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.7): + /@cloudflare/workerd-linux-64@1.20231218.0: resolution: { - integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==, + integrity: sha512-dMUF1wA+0mybm6hHNOCgY/WMNMwomPPs4I7vvYCgwHSkch0Q2Wb7TnxQZSt8d1PK/myibaBwadrlIxpjxmpz3w==, } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-annotate-as-pure": 7.22.5 - regexpu-core: 5.3.2 - semver: 6.3.1 - dev: false + engines: { node: ">=16" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true - /@babel/helper-define-polyfill-provider@0.4.4(@babel/core@7.23.7): + /@cloudflare/workerd-linux-arm64@1.20231218.0: resolution: { - integrity: sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==, + integrity: sha512-2s5uc8IHt0QmWyKxAr1Fy+4b8Xy0b/oUtlPnm5MrKi2gDRlZzR7JvxENPJCpCnYENydS8lzvkMiAFECPBccmyQ==, } - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-compilation-targets": 7.23.6 - "@babel/helper-plugin-utils": 7.22.5 - debug: 4.3.4 - lodash.debounce: 4.0.8 - resolve: 1.22.8 - transitivePeerDependencies: - - supports-color - dev: false + engines: { node: ">=16" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true - /@babel/helper-environment-visitor@7.22.20: + /@cloudflare/workerd-windows-64@1.20231218.0: resolution: { - integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==, + integrity: sha512-oN5hz6TXUDB5YKUN5N3QWAv6cYz9JjTZ9g16HVyoegVFEL6/zXU3tV19MBX2IvlE11ab/mRogEv9KXVIrHfKmA==, } - engines: { node: ">=6.9.0" } - dev: false + engines: { node: ">=16" } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true - /@babel/helper-function-name@7.23.0: + /@cloudflare/workers-types@4.20240117.0: resolution: { - integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==, + integrity: sha512-HQU8lJhaJVh8gQXFtVA7lZwd0hK1ckIFjRuxOXkVN2Z9t7DtzNbA2YTwBry5thKNgF5EwjN4THjHg5NUZzj05A==, } - engines: { node: ">=6.9.0" } - dependencies: - "@babel/template": 7.22.15 - "@babel/types": 7.23.6 - dev: false - /@babel/helper-hoist-variables@7.22.5: + /@codemirror/autocomplete@6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1): resolution: { - integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==, + integrity: sha512-r4IjdYFthwbCQyvqnSlx0WBHRHi8nBvU+WjJxFUij81qsBfhNudf/XKKmmC2j3m0LaOYUQTf3qiEK1J8lO1sdg==, } - engines: { node: ">=6.9.0" } + peerDependencies: + "@codemirror/language": ^6.0.0 + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.0.0 + "@lezer/common": ^1.0.0 dependencies: - "@babel/types": 7.23.6 + "@codemirror/language": 6.10.0 + "@codemirror/state": 6.4.0 + "@codemirror/view": 6.23.0 + "@lezer/common": 1.2.1 dev: false - /@babel/helper-member-expression-to-functions@7.23.0: + /@codemirror/commands@6.3.3: resolution: { - integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==, + integrity: sha512-dO4hcF0fGT9tu1Pj1D2PvGvxjeGkbC6RGcZw6Qs74TH+Ed1gw98jmUgd2axWvIZEqTeTuFrg1lEB1KV6cK9h1A==, } - engines: { node: ">=6.9.0" } dependencies: - "@babel/types": 7.23.6 + "@codemirror/language": 6.10.0 + "@codemirror/state": 6.4.0 + "@codemirror/view": 6.23.0 + "@lezer/common": 1.2.1 dev: false - /@babel/helper-module-imports@7.22.15: + /@codemirror/lang-css@6.2.1(@codemirror/view@6.23.0): resolution: { - integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==, + integrity: sha512-/UNWDNV5Viwi/1lpr/dIXJNWiwDxpw13I4pTUAsNxZdg6E0mI2kTQb0P2iHczg1Tu+H4EBgJR+hYhKiHKko7qg==, } - engines: { node: ">=6.9.0" } dependencies: - "@babel/types": 7.23.6 + "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1) + "@codemirror/language": 6.10.0 + "@codemirror/state": 6.4.0 + "@lezer/common": 1.2.1 + "@lezer/css": 1.1.7 + transitivePeerDependencies: + - "@codemirror/view" dev: false - /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.7): + /@codemirror/lang-html@6.4.7: resolution: { - integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==, + integrity: sha512-y9hWSSO41XlcL4uYwWyk0lEgTHcelWWfRuqmvcAmxfCs0HNWZdriWo/EU43S63SxEZpc1Hd50Itw7ktfQvfkUg==, } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0 dependencies: - "@babel/core": 7.23.7 - "@babel/helper-environment-visitor": 7.22.20 - "@babel/helper-module-imports": 7.22.15 - "@babel/helper-simple-access": 7.22.5 - "@babel/helper-split-export-declaration": 7.22.6 - "@babel/helper-validator-identifier": 7.22.20 + "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1) + "@codemirror/lang-css": 6.2.1(@codemirror/view@6.23.0) + "@codemirror/lang-javascript": 6.2.1 + "@codemirror/language": 6.10.0 + "@codemirror/state": 6.4.0 + "@codemirror/view": 6.23.0 + "@lezer/common": 1.2.1 + "@lezer/css": 1.1.7 + "@lezer/html": 1.3.8 dev: false - /@babel/helper-optimise-call-expression@7.22.5: + /@codemirror/lang-java@6.0.1: resolution: { - integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==, + integrity: sha512-OOnmhH67h97jHzCuFaIEspbmsT98fNdhVhmA3zCxW0cn7l8rChDhZtwiwJ/JOKXgfm4J+ELxQihxaI7bj7mJRg==, } - engines: { node: ">=6.9.0" } dependencies: - "@babel/types": 7.23.6 + "@codemirror/language": 6.10.0 + "@lezer/java": 1.1.1 dev: false - /@babel/helper-plugin-utils@7.22.5: + /@codemirror/lang-javascript@6.2.1: resolution: { - integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==, + integrity: sha512-jlFOXTejVyiQCW3EQwvKH0m99bUYIw40oPmFjSX2VS78yzfe0HELZ+NEo9Yfo1MkGRpGlj3Gnu4rdxV1EnAs5A==, } - engines: { node: ">=6.9.0" } + dependencies: + "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1) + "@codemirror/language": 6.10.0 + "@codemirror/lint": 6.4.2 + "@codemirror/state": 6.4.0 + "@codemirror/view": 6.23.0 + "@lezer/common": 1.2.1 + "@lezer/javascript": 1.4.13 dev: false - /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.7): + /@codemirror/lang-json@6.0.1: resolution: { - integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==, + integrity: sha512-+T1flHdgpqDDlJZ2Lkil/rLiRy684WMLc74xUnjJH48GQdfJo/pudlTRreZmKwzP8/tGdKf83wlbAdOCzlJOGQ==, } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0 dependencies: - "@babel/core": 7.23.7 - "@babel/helper-annotate-as-pure": 7.22.5 - "@babel/helper-environment-visitor": 7.22.20 - "@babel/helper-wrap-function": 7.22.20 + "@codemirror/language": 6.10.0 + "@lezer/json": 1.0.2 dev: false - /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.7): + /@codemirror/lang-python@6.1.3(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1): resolution: { - integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==, + integrity: sha512-S9w2Jl74hFlD5nqtUMIaXAq9t5WlM0acCkyuQWUUSvZclk1sV+UfnpFiZzuZSG+hfEaOmxKR5UxY/Uxswn7EhQ==, } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0 dependencies: - "@babel/core": 7.23.7 - "@babel/helper-environment-visitor": 7.22.20 - "@babel/helper-member-expression-to-functions": 7.23.0 - "@babel/helper-optimise-call-expression": 7.22.5 + "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1) + "@codemirror/language": 6.10.0 + "@lezer/python": 1.1.11 + transitivePeerDependencies: + - "@codemirror/state" + - "@codemirror/view" + - "@lezer/common" dev: false - /@babel/helper-simple-access@7.22.5: + /@codemirror/language@6.10.0: resolution: { - integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==, + integrity: sha512-2vaNn9aPGCRFKWcHPFksctzJ8yS5p7YoaT+jHpc0UGKzNuAIx4qy6R5wiqbP+heEEdyaABA582mNqSHzSoYdmg==, } - engines: { node: ">=6.9.0" } dependencies: - "@babel/types": 7.23.6 + "@codemirror/state": 6.4.0 + "@codemirror/view": 6.23.0 + "@lezer/common": 1.2.1 + "@lezer/highlight": 1.2.0 + "@lezer/lr": 1.3.14 + style-mod: 4.1.0 dev: false - /@babel/helper-skip-transparent-expression-wrappers@7.22.5: + /@codemirror/legacy-modes@6.3.3: resolution: { - integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==, + integrity: sha512-X0Z48odJ0KIoh/HY8Ltz75/4tDYc9msQf1E/2trlxFaFFhgjpVHjZ/BCXe1Lk7s4Gd67LL/CeEEHNI+xHOiESg==, } - engines: { node: ">=6.9.0" } dependencies: - "@babel/types": 7.23.6 + "@codemirror/language": 6.10.0 dev: false - /@babel/helper-split-export-declaration@7.22.6: + /@codemirror/lint@6.4.2: resolution: { - integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==, + integrity: sha512-wzRkluWb1ptPKdzlsrbwwjYCPLgzU6N88YBAmlZi8WFyuiEduSd05MnJYNogzyc8rPK7pj6m95ptUApc8sHKVA==, } - engines: { node: ">=6.9.0" } dependencies: - "@babel/types": 7.23.6 + "@codemirror/state": 6.4.0 + "@codemirror/view": 6.23.0 + crelt: 1.0.6 dev: false - /@babel/helper-string-parser@7.23.4: + /@codemirror/search@6.5.5: resolution: { - integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==, + integrity: sha512-PIEN3Ke1buPod2EHbJsoQwlbpkz30qGZKcnmH1eihq9+bPQx8gelauUwLYaY4vBOuBAuEhmpDLii4rj/uO0yMA==, } - engines: { node: ">=6.9.0" } + dependencies: + "@codemirror/state": 6.4.0 + "@codemirror/view": 6.23.0 + crelt: 1.0.6 dev: false - /@babel/helper-validator-identifier@7.22.20: + /@codemirror/state@6.4.0: resolution: { - integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==, + integrity: sha512-hm8XshYj5Fo30Bb922QX9hXB/bxOAVH+qaqHBzw5TKa72vOeslyGwd4X8M0c1dJ9JqxlaMceOQ8RsL9tC7gU0A==, } - engines: { node: ">=6.9.0" } dev: false - /@babel/helper-validator-option@7.23.5: + /@codemirror/view@6.23.0: resolution: { - integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==, + integrity: sha512-/51px9N4uW8NpuWkyUX+iam5+PM6io2fm+QmRnzwqBy5v/pwGg9T0kILFtYeum8hjuvENtgsGNKluOfqIICmeQ==, } - engines: { node: ">=6.9.0" } + dependencies: + "@codemirror/state": 6.4.0 + style-mod: 4.1.0 + w3c-keyname: 2.2.8 dev: false - /@babel/helper-wrap-function@7.22.20: + /@cspotcode/source-map-support@0.8.1: resolution: { - integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==, + integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==, } - engines: { node: ">=6.9.0" } + engines: { node: ">=12" } dependencies: - "@babel/helper-function-name": 7.23.0 - "@babel/template": 7.22.15 - "@babel/types": 7.23.6 - dev: false + "@jridgewell/trace-mapping": 0.3.9 + dev: true - /@babel/helpers@7.23.7: + /@drizzle-team/studio@0.0.39: resolution: { - integrity: sha512-6AMnjCoC8wjqBzDHkuqpa7jAKwvMo4dC+lr/TFBz+ucfulO1XMpDnwWPGBNwClOKZ8h6xn5N81W/R5OrcKtCbQ==, + integrity: sha512-c5Hkm7MmQC2n5qAsKShjQrHoqlfGslB8+qWzsGGZ+2dHMRTNG60UuzalF0h0rvBax5uzPXuGkYLGaQ+TUX3yMw==, } - engines: { node: ">=6.9.0" } dependencies: - "@babel/template": 7.22.15 - "@babel/traverse": 7.23.7 - "@babel/types": 7.23.6 - transitivePeerDependencies: - - supports-color - dev: false + superjson: 2.2.1 + dev: true - /@babel/highlight@7.23.4: + /@emnapi/core@0.45.0: resolution: { - integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==, + integrity: sha512-DPWjcUDQkCeEM4VnljEOEcXdAD7pp8zSZsgOujk/LGIwCXWbXJngin+MO4zbH429lzeC3WbYLGjE2MaUOwzpyw==, } - engines: { node: ">=6.9.0" } + requiresBuild: true dependencies: - "@babel/helper-validator-identifier": 7.22.20 - chalk: 2.4.2 - js-tokens: 4.0.0 + tslib: 2.6.2 dev: false + optional: true - /@babel/parser@7.23.6: + /@emnapi/runtime@0.45.0: resolution: { - integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==, + integrity: sha512-Txumi3td7J4A/xTTwlssKieHKTGl3j4A1tglBx72auZ49YK7ePY6XZricgIg9mnZT4xPfA+UPCUdnhRuEFDL+w==, } - engines: { node: ">=6.0.0" } - hasBin: true + requiresBuild: true dependencies: - "@babel/types": 7.23.6 + tslib: 2.6.2 dev: false + optional: true - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.23.7): + /@esbuild-kit/core-utils@3.3.2: resolution: { - integrity: sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==, + integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==, } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0 dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false + esbuild: 0.18.20 + source-map-support: 0.5.21 + dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.23.7): + /@esbuild-kit/esm-loader@2.6.5: resolution: { - integrity: sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==, + integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==, } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.13.0 dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - "@babel/helper-skip-transparent-expression-wrappers": 7.22.5 - "@babel/plugin-transform-optional-chaining": 7.23.4(@babel/core@7.23.7) - dev: false + "@esbuild-kit/core-utils": 3.3.2 + get-tsconfig: 4.7.2 + dev: true - /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.7(@babel/core@7.23.7): + /@esbuild-plugins/node-globals-polyfill@0.2.3(esbuild@0.17.19): resolution: { - integrity: sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==, + integrity: sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==, } - engines: { node: ">=6.9.0" } peerDependencies: - "@babel/core": ^7.0.0 + esbuild: "*" dependencies: - "@babel/core": 7.23.7 - "@babel/helper-environment-visitor": 7.22.20 - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.23.7): - resolution: - { - integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==, - } - engines: { node: ">=6.9.0" } - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead. - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-environment-visitor": 7.22.20 - "@babel/helper-plugin-utils": 7.22.5 - "@babel/helper-remap-async-to-generator": 7.22.20(@babel/core@7.23.7) - "@babel/plugin-syntax-async-generators": 7.8.4(@babel/core@7.23.7) - dev: false + esbuild: 0.17.19 + dev: true - /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.23.7): + /@esbuild-plugins/node-modules-polyfill@0.2.2(esbuild@0.17.19): resolution: { - integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==, + integrity: sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA==, } - engines: { node: ">=6.9.0" } - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. peerDependencies: - "@babel/core": ^7.0.0-0 + esbuild: "*" dependencies: - "@babel/core": 7.23.7 - "@babel/helper-create-class-features-plugin": 7.23.7(@babel/core@7.23.7) - "@babel/helper-plugin-utils": 7.22.5 - dev: false + esbuild: 0.17.19 + escape-string-regexp: 4.0.0 + rollup-plugin-node-polyfills: 0.2.1 + dev: true - /@babel/plugin-proposal-decorators@7.23.7(@babel/core@7.23.7): + /@esbuild/aix-ppc64@0.19.11: resolution: { - integrity: sha512-b1s5JyeMvqj7d9m9KhJNHKc18gEJiSyVzVX3bwbiPalQBQpuvfPh6lA9F7Kk/dWH0TIiXRpB9yicwijY6buPng==, + integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==, } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-create-class-features-plugin": 7.23.7(@babel/core@7.23.7) - "@babel/helper-plugin-utils": 7.22.5 - "@babel/plugin-syntax-decorators": 7.23.3(@babel/core@7.23.7) - dev: false + engines: { node: ">=12" } + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true - /@babel/plugin-proposal-export-default-from@7.23.3(@babel/core@7.23.7): + /@esbuild/android-arm64@0.17.19: resolution: { - integrity: sha512-Q23MpLZfSGZL1kU7fWqV262q65svLSCIP5kZ/JCW/rKTCm/FrLjpvEd2kfUYMVeHh4QhV/xzyoRAHWrAZJrE3Q==, + integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==, } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - "@babel/plugin-syntax-export-default-from": 7.23.3(@babel/core@7.23.7) - dev: false + engines: { node: ">=12" } + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true - /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.23.7): + /@esbuild/android-arm64@0.18.20: resolution: { - integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==, + integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==, } - engines: { node: ">=6.9.0" } - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-export-namespace-from instead. - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - "@babel/plugin-syntax-export-namespace-from": 7.8.3(@babel/core@7.23.7) - dev: false + engines: { node: ">=12" } + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true - /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.23.7): + /@esbuild/android-arm64@0.19.11: resolution: { - integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==, + integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==, } - engines: { node: ">=6.9.0" } - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead. - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - "@babel/plugin-syntax-nullish-coalescing-operator": 7.8.3(@babel/core@7.23.7) - dev: false + engines: { node: ">=12" } + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true - /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.23.7): + /@esbuild/android-arm@0.17.19: resolution: { - integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==, + integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==, } - engines: { node: ">=6.9.0" } - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead. - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - "@babel/plugin-syntax-numeric-separator": 7.10.4(@babel/core@7.23.7) - dev: false + engines: { node: ">=12" } + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true - /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.23.7): + /@esbuild/android-arm@0.18.20: resolution: { - integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==, + integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==, } - engines: { node: ">=6.9.0" } - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead. - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/compat-data": 7.23.5 - "@babel/core": 7.23.7 - "@babel/helper-compilation-targets": 7.23.6 - "@babel/helper-plugin-utils": 7.22.5 - "@babel/plugin-syntax-object-rest-spread": 7.8.3(@babel/core@7.23.7) - "@babel/plugin-transform-parameters": 7.23.3(@babel/core@7.23.7) - dev: false + engines: { node: ">=12" } + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true - /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.23.7): + /@esbuild/android-arm@0.19.11: resolution: { - integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==, + integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==, } - engines: { node: ">=6.9.0" } - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead. - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - "@babel/plugin-syntax-optional-catch-binding": 7.8.3(@babel/core@7.23.7) - dev: false + engines: { node: ">=12" } + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true - /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.23.7): + /@esbuild/android-x64@0.17.19: resolution: { - integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==, + integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==, } - engines: { node: ">=6.9.0" } - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - "@babel/helper-skip-transparent-expression-wrappers": 7.22.5 - "@babel/plugin-syntax-optional-chaining": 7.8.3(@babel/core@7.23.7) - dev: false + engines: { node: ">=12" } + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.7): + /@esbuild/android-x64@0.18.20: resolution: { - integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==, + integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==, } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - dev: false + engines: { node: ">=12" } + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.7): + /@esbuild/android-x64@0.19.11: resolution: { - integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==, + integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==, } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false + engines: { node: ">=12" } + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.7): + /@esbuild/darwin-arm64@0.17.19: resolution: { - integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==, + integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==, } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false + engines: { node: ">=12" } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.7): + /@esbuild/darwin-arm64@0.18.20: resolution: { - integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==, + integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==, } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false + engines: { node: ">=12" } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true - /@babel/plugin-syntax-decorators@7.23.3(@babel/core@7.23.7): + /@esbuild/darwin-arm64@0.19.11: resolution: { - integrity: sha512-cf7Niq4/+/juY67E0PbgH0TDhLQ5J7zS8C/Q5FFx+DWyrRa9sUQdTXkjqKu8zGvuqr7vw1muKiukseihU+PJDA==, + integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==, } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false + engines: { node: ">=12" } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.7): + /@esbuild/darwin-x64@0.17.19: resolution: { - integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==, + integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==, } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false + engines: { node: ">=12" } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true - /@babel/plugin-syntax-export-default-from@7.23.3(@babel/core@7.23.7): + /@esbuild/darwin-x64@0.18.20: resolution: { - integrity: sha512-KeENO5ck1IeZ/l2lFZNy+mpobV3D2Zy5C1YFnWm+YuY5mQiAWc4yAp13dqgguwsBsFVLh4LPCEqCa5qW13N+hw==, + integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==, } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false + engines: { node: ">=12" } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.7): + /@esbuild/darwin-x64@0.19.11: resolution: { - integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==, + integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==, } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false + engines: { node: ">=12" } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true - /@babel/plugin-syntax-flow@7.23.3(@babel/core@7.23.7): + /@esbuild/freebsd-arm64@0.17.19: resolution: { - integrity: sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==, + integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==, } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false + engines: { node: ">=12" } + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true - /@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.23.7): + /@esbuild/freebsd-arm64@0.18.20: resolution: { - integrity: sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==, + integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==, } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false + engines: { node: ">=12" } + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true - /@babel/plugin-syntax-import-attributes@7.23.3(@babel/core@7.23.7): + /@esbuild/freebsd-arm64@0.19.11: resolution: { - integrity: sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==, + integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==, } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false + engines: { node: ">=12" } + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.7): + /@esbuild/freebsd-x64@0.17.19: resolution: { - integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==, + integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==, } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false + engines: { node: ">=12" } + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.7): + /@esbuild/freebsd-x64@0.18.20: resolution: { - integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.7): - resolution: - { - integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.7): - resolution: - { - integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.7): - resolution: - { - integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.7): - resolution: - { - integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.7): - resolution: - { - integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-create-regexp-features-plugin": 7.22.15(@babel/core@7.23.7) - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-transform-async-generator-functions@7.23.7(@babel/core@7.23.7): - resolution: - { - integrity: sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-environment-visitor": 7.22.20 - "@babel/helper-plugin-utils": 7.22.5 - "@babel/helper-remap-async-to-generator": 7.22.20(@babel/core@7.23.7) - "@babel/plugin-syntax-async-generators": 7.8.4(@babel/core@7.23.7) - dev: false - - /@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-module-imports": 7.22.15 - "@babel/helper-plugin-utils": 7.22.5 - "@babel/helper-remap-async-to-generator": 7.22.20(@babel/core@7.23.7) - dev: false - - /@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.23.7): - resolution: - { - integrity: sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-create-class-features-plugin": 7.23.7(@babel/core@7.23.7) - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-transform-class-static-block@7.23.4(@babel/core@7.23.7): - resolution: - { - integrity: sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.12.0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-create-class-features-plugin": 7.23.7(@babel/core@7.23.7) - "@babel/helper-plugin-utils": 7.22.5 - "@babel/plugin-syntax-class-static-block": 7.14.5(@babel/core@7.23.7) - dev: false - - /@babel/plugin-transform-classes@7.23.5(@babel/core@7.23.7): - resolution: - { - integrity: sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-annotate-as-pure": 7.22.5 - "@babel/helper-compilation-targets": 7.23.6 - "@babel/helper-environment-visitor": 7.22.20 - "@babel/helper-function-name": 7.23.0 - "@babel/helper-optimise-call-expression": 7.22.5 - "@babel/helper-plugin-utils": 7.22.5 - "@babel/helper-replace-supers": 7.22.20(@babel/core@7.23.7) - "@babel/helper-split-export-declaration": 7.22.6 - globals: 11.12.0 - dev: false - - /@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - "@babel/template": 7.22.15 - dev: false - - /@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-create-regexp-features-plugin": 7.22.15(@babel/core@7.23.7) - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-transform-dynamic-import@7.23.4(@babel/core@7.23.7): - resolution: - { - integrity: sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - "@babel/plugin-syntax-dynamic-import": 7.8.3(@babel/core@7.23.7) - dev: false - - /@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-builder-binary-assignment-operator-visitor": 7.22.15 - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-transform-export-namespace-from@7.23.4(@babel/core@7.23.7): - resolution: - { - integrity: sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - "@babel/plugin-syntax-export-namespace-from": 7.8.3(@babel/core@7.23.7) - dev: false - - /@babel/plugin-transform-flow-strip-types@7.23.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - "@babel/plugin-syntax-flow": 7.23.3(@babel/core@7.23.7) - dev: false - - /@babel/plugin-transform-for-of@7.23.6(@babel/core@7.23.7): - resolution: - { - integrity: sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - "@babel/helper-skip-transparent-expression-wrappers": 7.22.5 - dev: false - - /@babel/plugin-transform-function-name@7.23.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-compilation-targets": 7.23.6 - "@babel/helper-function-name": 7.23.0 - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-transform-json-strings@7.23.4(@babel/core@7.23.7): - resolution: - { - integrity: sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - "@babel/plugin-syntax-json-strings": 7.8.3(@babel/core@7.23.7) - dev: false - - /@babel/plugin-transform-literals@7.23.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-transform-logical-assignment-operators@7.23.4(@babel/core@7.23.7): - resolution: - { - integrity: sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - "@babel/plugin-syntax-logical-assignment-operators": 7.10.4(@babel/core@7.23.7) - dev: false - - /@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-module-transforms": 7.23.3(@babel/core@7.23.7) - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-module-transforms": 7.23.3(@babel/core@7.23.7) - "@babel/helper-plugin-utils": 7.22.5 - "@babel/helper-simple-access": 7.22.5 - dev: false - - /@babel/plugin-transform-modules-systemjs@7.23.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-hoist-variables": 7.22.5 - "@babel/helper-module-transforms": 7.23.3(@babel/core@7.23.7) - "@babel/helper-plugin-utils": 7.22.5 - "@babel/helper-validator-identifier": 7.22.20 - dev: false - - /@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-module-transforms": 7.23.3(@babel/core@7.23.7) - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.7): - resolution: - { - integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-create-regexp-features-plugin": 7.22.15(@babel/core@7.23.7) - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-transform-new-target@7.23.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-transform-nullish-coalescing-operator@7.23.4(@babel/core@7.23.7): - resolution: - { - integrity: sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - "@babel/plugin-syntax-nullish-coalescing-operator": 7.8.3(@babel/core@7.23.7) - dev: false - - /@babel/plugin-transform-numeric-separator@7.23.4(@babel/core@7.23.7): - resolution: - { - integrity: sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - "@babel/plugin-syntax-numeric-separator": 7.10.4(@babel/core@7.23.7) - dev: false - - /@babel/plugin-transform-object-rest-spread@7.23.4(@babel/core@7.23.7): - resolution: - { - integrity: sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/compat-data": 7.23.5 - "@babel/core": 7.23.7 - "@babel/helper-compilation-targets": 7.23.6 - "@babel/helper-plugin-utils": 7.22.5 - "@babel/plugin-syntax-object-rest-spread": 7.8.3(@babel/core@7.23.7) - "@babel/plugin-transform-parameters": 7.23.3(@babel/core@7.23.7) - dev: false - - /@babel/plugin-transform-object-super@7.23.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - "@babel/helper-replace-supers": 7.22.20(@babel/core@7.23.7) - dev: false - - /@babel/plugin-transform-optional-catch-binding@7.23.4(@babel/core@7.23.7): - resolution: - { - integrity: sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - "@babel/plugin-syntax-optional-catch-binding": 7.8.3(@babel/core@7.23.7) - dev: false - - /@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.23.7): - resolution: - { - integrity: sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - "@babel/helper-skip-transparent-expression-wrappers": 7.22.5 - "@babel/plugin-syntax-optional-chaining": 7.8.3(@babel/core@7.23.7) - dev: false - - /@babel/plugin-transform-parameters@7.23.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-create-class-features-plugin": 7.23.7(@babel/core@7.23.7) - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-transform-private-property-in-object@7.23.4(@babel/core@7.23.7): - resolution: - { - integrity: sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-annotate-as-pure": 7.22.5 - "@babel/helper-create-class-features-plugin": 7.23.7(@babel/core@7.23.7) - "@babel/helper-plugin-utils": 7.22.5 - "@babel/plugin-syntax-private-property-in-object": 7.14.5(@babel/core@7.23.7) - dev: false - - /@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-transform-react-display-name@7.23.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-transform-react-jsx-self@7.23.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-transform-react-jsx-source@7.23.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.23.7): - resolution: - { - integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-annotate-as-pure": 7.22.5 - "@babel/helper-module-imports": 7.22.15 - "@babel/helper-plugin-utils": 7.22.5 - "@babel/plugin-syntax-jsx": 7.23.3(@babel/core@7.23.7) - "@babel/types": 7.23.6 - dev: false - - /@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - regenerator-transform: 0.15.2 - dev: false - - /@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-transform-runtime@7.23.7(@babel/core@7.23.7): - resolution: - { - integrity: sha512-fa0hnfmiXc9fq/weK34MUV0drz2pOL/vfKWvN7Qw127hiUPabFCUMgAbYWcchRzMJit4o5ARsK/s+5h0249pLw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-module-imports": 7.22.15 - "@babel/helper-plugin-utils": 7.22.5 - babel-plugin-polyfill-corejs2: 0.4.7(@babel/core@7.23.7) - babel-plugin-polyfill-corejs3: 0.8.7(@babel/core@7.23.7) - babel-plugin-polyfill-regenerator: 0.5.4(@babel/core@7.23.7) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: false - - /@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-transform-spread@7.23.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - "@babel/helper-skip-transparent-expression-wrappers": 7.22.5 - dev: false - - /@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-transform-typescript@7.23.6(@babel/core@7.23.7): - resolution: - { - integrity: sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-annotate-as-pure": 7.22.5 - "@babel/helper-create-class-features-plugin": 7.23.7(@babel/core@7.23.7) - "@babel/helper-plugin-utils": 7.22.5 - "@babel/plugin-syntax-typescript": 7.23.3(@babel/core@7.23.7) - dev: false - - /@babel/plugin-transform-unicode-escapes@7.23.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-transform-unicode-property-regex@7.23.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-create-regexp-features-plugin": 7.22.15(@babel/core@7.23.7) - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-create-regexp-features-plugin": 7.22.15(@babel/core@7.23.7) - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/plugin-transform-unicode-sets-regex@7.23.3(@babel/core@7.23.7): - resolution: - { - integrity: sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-create-regexp-features-plugin": 7.22.15(@babel/core@7.23.7) - "@babel/helper-plugin-utils": 7.22.5 - dev: false - - /@babel/preset-env@7.23.7(@babel/core@7.23.7): - resolution: - { - integrity: sha512-SY27X/GtTz/L4UryMNJ6p4fH4nsgWbz84y9FE0bQeWJP6O5BhgVCt53CotQKHCOeXJel8VyhlhujhlltKms/CA==, - } - engines: { node: ">=6.9.0" } - peerDependencies: - "@babel/core": ^7.0.0-0 - dependencies: - "@babel/compat-data": 7.23.5 - "@babel/core": 7.23.7 - "@babel/helper-compilation-targets": 7.23.6 - "@babel/helper-plugin-utils": 7.22.5 - "@babel/helper-validator-option": 7.23.5 - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": 7.23.7(@babel/core@7.23.7) - "@babel/plugin-proposal-private-property-in-object": 7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.7) - "@babel/plugin-syntax-async-generators": 7.8.4(@babel/core@7.23.7) - "@babel/plugin-syntax-class-properties": 7.12.13(@babel/core@7.23.7) - "@babel/plugin-syntax-class-static-block": 7.14.5(@babel/core@7.23.7) - "@babel/plugin-syntax-dynamic-import": 7.8.3(@babel/core@7.23.7) - "@babel/plugin-syntax-export-namespace-from": 7.8.3(@babel/core@7.23.7) - "@babel/plugin-syntax-import-assertions": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-syntax-import-attributes": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-syntax-import-meta": 7.10.4(@babel/core@7.23.7) - "@babel/plugin-syntax-json-strings": 7.8.3(@babel/core@7.23.7) - "@babel/plugin-syntax-logical-assignment-operators": 7.10.4(@babel/core@7.23.7) - "@babel/plugin-syntax-nullish-coalescing-operator": 7.8.3(@babel/core@7.23.7) - "@babel/plugin-syntax-numeric-separator": 7.10.4(@babel/core@7.23.7) - "@babel/plugin-syntax-object-rest-spread": 7.8.3(@babel/core@7.23.7) - "@babel/plugin-syntax-optional-catch-binding": 7.8.3(@babel/core@7.23.7) - "@babel/plugin-syntax-optional-chaining": 7.8.3(@babel/core@7.23.7) - "@babel/plugin-syntax-private-property-in-object": 7.14.5(@babel/core@7.23.7) - "@babel/plugin-syntax-top-level-await": 7.14.5(@babel/core@7.23.7) - "@babel/plugin-syntax-unicode-sets-regex": 7.18.6(@babel/core@7.23.7) - "@babel/plugin-transform-arrow-functions": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-async-generator-functions": 7.23.7(@babel/core@7.23.7) - "@babel/plugin-transform-async-to-generator": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-block-scoped-functions": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-block-scoping": 7.23.4(@babel/core@7.23.7) - "@babel/plugin-transform-class-properties": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-class-static-block": 7.23.4(@babel/core@7.23.7) - "@babel/plugin-transform-classes": 7.23.5(@babel/core@7.23.7) - "@babel/plugin-transform-computed-properties": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-destructuring": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-dotall-regex": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-duplicate-keys": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-dynamic-import": 7.23.4(@babel/core@7.23.7) - "@babel/plugin-transform-exponentiation-operator": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-export-namespace-from": 7.23.4(@babel/core@7.23.7) - "@babel/plugin-transform-for-of": 7.23.6(@babel/core@7.23.7) - "@babel/plugin-transform-function-name": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-json-strings": 7.23.4(@babel/core@7.23.7) - "@babel/plugin-transform-literals": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-logical-assignment-operators": 7.23.4(@babel/core@7.23.7) - "@babel/plugin-transform-member-expression-literals": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-modules-amd": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-modules-commonjs": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-modules-systemjs": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-modules-umd": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-named-capturing-groups-regex": 7.22.5(@babel/core@7.23.7) - "@babel/plugin-transform-new-target": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-nullish-coalescing-operator": 7.23.4(@babel/core@7.23.7) - "@babel/plugin-transform-numeric-separator": 7.23.4(@babel/core@7.23.7) - "@babel/plugin-transform-object-rest-spread": 7.23.4(@babel/core@7.23.7) - "@babel/plugin-transform-object-super": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-optional-catch-binding": 7.23.4(@babel/core@7.23.7) - "@babel/plugin-transform-optional-chaining": 7.23.4(@babel/core@7.23.7) - "@babel/plugin-transform-parameters": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-private-methods": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-private-property-in-object": 7.23.4(@babel/core@7.23.7) - "@babel/plugin-transform-property-literals": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-regenerator": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-reserved-words": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-shorthand-properties": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-spread": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-sticky-regex": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-template-literals": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-typeof-symbol": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-unicode-escapes": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-unicode-property-regex": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-unicode-regex": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-unicode-sets-regex": 7.23.3(@babel/core@7.23.7) - "@babel/preset-modules": 0.1.6-no-external-plugins(@babel/core@7.23.7) - babel-plugin-polyfill-corejs2: 0.4.7(@babel/core@7.23.7) - babel-plugin-polyfill-corejs3: 0.8.7(@babel/core@7.23.7) - babel-plugin-polyfill-regenerator: 0.5.4(@babel/core@7.23.7) - core-js-compat: 3.35.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: false - - /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.7): - resolution: - { - integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==, - } - peerDependencies: - "@babel/core": ^7.0.0-0 || ^8.0.0-0 <8.0.0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-plugin-utils": 7.22.5 - "@babel/types": 7.23.6 - esutils: 2.0.3 - dev: false - - /@babel/regjsgen@0.8.0: - resolution: - { - integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==, - } - dev: false - - /@babel/runtime@7.23.7: - resolution: - { - integrity: sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA==, - } - engines: { node: ">=6.9.0" } - dependencies: - regenerator-runtime: 0.14.1 - dev: false - - /@babel/template@7.22.15: - resolution: - { - integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==, - } - engines: { node: ">=6.9.0" } - dependencies: - "@babel/code-frame": 7.23.5 - "@babel/parser": 7.23.6 - "@babel/types": 7.23.6 - dev: false - - /@babel/traverse@7.23.7: - resolution: - { - integrity: sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==, - } - engines: { node: ">=6.9.0" } - dependencies: - "@babel/code-frame": 7.23.5 - "@babel/generator": 7.23.6 - "@babel/helper-environment-visitor": 7.22.20 - "@babel/helper-function-name": 7.23.0 - "@babel/helper-hoist-variables": 7.22.5 - "@babel/helper-split-export-declaration": 7.22.6 - "@babel/parser": 7.23.6 - "@babel/types": 7.23.6 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: false - - /@babel/types@7.23.6: - resolution: - { - integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==, - } - engines: { node: ">=6.9.0" } - dependencies: - "@babel/helper-string-parser": 7.23.4 - "@babel/helper-validator-identifier": 7.22.20 - to-fast-properties: 2.0.0 - dev: false - - /@cloudflare/kv-asset-handler@0.2.0: - resolution: - { - integrity: sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==, - } - dependencies: - mime: 3.0.0 - dev: true - - /@cloudflare/workerd-darwin-64@1.20231030.0: - resolution: - { - integrity: sha512-J4PQ9utPxLya9yHdMMx3AZeC5M/6FxcoYw6jo9jbDDFTy+a4Gslqf4Im9We3aeOEdPXa3tgQHVQOSelJSZLhIw==, - } - engines: { node: ">=16" } - cpu: [x64] - os: [darwin] - requiresBuild: true - 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 - - /@cloudflare/workers-types@4.20231218.0: - resolution: - { - integrity: sha512-Vs1FKjfUjXYGbCsXzkl+ITp0Iyb6QiW6+vTERTNThC+v96T0IvPVAioH4tT20rXwoxAfxh380mAaxYtTrJUNVg==, - } - - /@codemirror/autocomplete@6.11.1(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0): - resolution: - { - integrity: sha512-L5UInv8Ffd6BPw0P3EF7JLYAMeEbclY7+6Q11REt8vhih8RuLreKtPy/xk8wPxs4EQgYqzI7cdgpiYwWlbS/ow==, - } - peerDependencies: - "@codemirror/language": ^6.0.0 - "@codemirror/state": ^6.0.0 - "@codemirror/view": ^6.0.0 - "@lezer/common": ^1.0.0 - dependencies: - "@codemirror/language": 6.10.0 - "@codemirror/state": 6.4.0 - "@codemirror/view": 6.23.0 - "@lezer/common": 1.2.0 - dev: false - - /@codemirror/commands@6.3.3: - resolution: - { - integrity: sha512-dO4hcF0fGT9tu1Pj1D2PvGvxjeGkbC6RGcZw6Qs74TH+Ed1gw98jmUgd2axWvIZEqTeTuFrg1lEB1KV6cK9h1A==, - } - dependencies: - "@codemirror/language": 6.10.0 - "@codemirror/state": 6.4.0 - "@codemirror/view": 6.23.0 - "@lezer/common": 1.2.0 - dev: false - - /@codemirror/lang-css@6.2.1(@codemirror/view@6.23.0): - resolution: - { - integrity: sha512-/UNWDNV5Viwi/1lpr/dIXJNWiwDxpw13I4pTUAsNxZdg6E0mI2kTQb0P2iHczg1Tu+H4EBgJR+hYhKiHKko7qg==, - } - dependencies: - "@codemirror/autocomplete": 6.11.1(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0) - "@codemirror/language": 6.10.0 - "@codemirror/state": 6.4.0 - "@lezer/common": 1.2.0 - "@lezer/css": 1.1.6 - transitivePeerDependencies: - - "@codemirror/view" - dev: false - - /@codemirror/lang-html@6.4.7: - resolution: - { - integrity: sha512-y9hWSSO41XlcL4uYwWyk0lEgTHcelWWfRuqmvcAmxfCs0HNWZdriWo/EU43S63SxEZpc1Hd50Itw7ktfQvfkUg==, - } - dependencies: - "@codemirror/autocomplete": 6.11.1(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0) - "@codemirror/lang-css": 6.2.1(@codemirror/view@6.23.0) - "@codemirror/lang-javascript": 6.2.1 - "@codemirror/language": 6.10.0 - "@codemirror/state": 6.4.0 - "@codemirror/view": 6.23.0 - "@lezer/common": 1.2.0 - "@lezer/css": 1.1.6 - "@lezer/html": 1.3.8 - dev: false - - /@codemirror/lang-java@6.0.1: - resolution: - { - integrity: sha512-OOnmhH67h97jHzCuFaIEspbmsT98fNdhVhmA3zCxW0cn7l8rChDhZtwiwJ/JOKXgfm4J+ELxQihxaI7bj7mJRg==, - } - dependencies: - "@codemirror/language": 6.10.0 - "@lezer/java": 1.1.1 - dev: false - - /@codemirror/lang-javascript@6.2.1: - resolution: - { - integrity: sha512-jlFOXTejVyiQCW3EQwvKH0m99bUYIw40oPmFjSX2VS78yzfe0HELZ+NEo9Yfo1MkGRpGlj3Gnu4rdxV1EnAs5A==, - } - dependencies: - "@codemirror/autocomplete": 6.11.1(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0) - "@codemirror/language": 6.10.0 - "@codemirror/lint": 6.4.2 - "@codemirror/state": 6.4.0 - "@codemirror/view": 6.23.0 - "@lezer/common": 1.2.0 - "@lezer/javascript": 1.4.12 - dev: false - - /@codemirror/lang-json@6.0.1: - resolution: - { - integrity: sha512-+T1flHdgpqDDlJZ2Lkil/rLiRy684WMLc74xUnjJH48GQdfJo/pudlTRreZmKwzP8/tGdKf83wlbAdOCzlJOGQ==, - } - dependencies: - "@codemirror/language": 6.10.0 - "@lezer/json": 1.0.2 - dev: false - - /@codemirror/lang-python@6.1.3(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0): - resolution: - { - integrity: sha512-S9w2Jl74hFlD5nqtUMIaXAq9t5WlM0acCkyuQWUUSvZclk1sV+UfnpFiZzuZSG+hfEaOmxKR5UxY/Uxswn7EhQ==, - } - dependencies: - "@codemirror/autocomplete": 6.11.1(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0) - "@codemirror/language": 6.10.0 - "@lezer/python": 1.1.10 - transitivePeerDependencies: - - "@codemirror/state" - - "@codemirror/view" - - "@lezer/common" - dev: false - - /@codemirror/language@6.10.0: - resolution: - { - integrity: sha512-2vaNn9aPGCRFKWcHPFksctzJ8yS5p7YoaT+jHpc0UGKzNuAIx4qy6R5wiqbP+heEEdyaABA582mNqSHzSoYdmg==, - } - dependencies: - "@codemirror/state": 6.4.0 - "@codemirror/view": 6.23.0 - "@lezer/common": 1.2.0 - "@lezer/highlight": 1.2.0 - "@lezer/lr": 1.3.14 - style-mod: 4.1.0 - dev: false - - /@codemirror/legacy-modes@6.3.3: - resolution: - { - integrity: sha512-X0Z48odJ0KIoh/HY8Ltz75/4tDYc9msQf1E/2trlxFaFFhgjpVHjZ/BCXe1Lk7s4Gd67LL/CeEEHNI+xHOiESg==, - } - dependencies: - "@codemirror/language": 6.10.0 - dev: false - - /@codemirror/lint@6.4.2: - resolution: - { - integrity: sha512-wzRkluWb1ptPKdzlsrbwwjYCPLgzU6N88YBAmlZi8WFyuiEduSd05MnJYNogzyc8rPK7pj6m95ptUApc8sHKVA==, - } - dependencies: - "@codemirror/state": 6.4.0 - "@codemirror/view": 6.23.0 - crelt: 1.0.6 - dev: false - - /@codemirror/search@6.5.5: - resolution: - { - integrity: sha512-PIEN3Ke1buPod2EHbJsoQwlbpkz30qGZKcnmH1eihq9+bPQx8gelauUwLYaY4vBOuBAuEhmpDLii4rj/uO0yMA==, - } - dependencies: - "@codemirror/state": 6.4.0 - "@codemirror/view": 6.23.0 - crelt: 1.0.6 - dev: false - - /@codemirror/state@6.4.0: - resolution: - { - integrity: sha512-hm8XshYj5Fo30Bb922QX9hXB/bxOAVH+qaqHBzw5TKa72vOeslyGwd4X8M0c1dJ9JqxlaMceOQ8RsL9tC7gU0A==, - } - dev: false - - /@codemirror/view@6.23.0: - resolution: - { - integrity: sha512-/51px9N4uW8NpuWkyUX+iam5+PM6io2fm+QmRnzwqBy5v/pwGg9T0kILFtYeum8hjuvENtgsGNKluOfqIICmeQ==, - } - dependencies: - "@codemirror/state": 6.4.0 - style-mod: 4.1.0 - w3c-keyname: 2.2.8 - 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 - - /@drizzle-team/studio@0.0.37: - resolution: - { - integrity: sha512-LZyAPGJBX43jsrVZh7+w1Jig/BC6PJx63ReHUYK+GRQYNY9UJNlPXmn1uC/LMRX+A7JwYM4Sr4Fg/hnJSqlfgA==, - } - dependencies: - superjson: 2.2.1 - dev: true - - /@emnapi/core@0.45.0: - resolution: - { - integrity: sha512-DPWjcUDQkCeEM4VnljEOEcXdAD7pp8zSZsgOujk/LGIwCXWbXJngin+MO4zbH429lzeC3WbYLGjE2MaUOwzpyw==, - } - requiresBuild: true - dependencies: - tslib: 2.6.2 - dev: false - optional: true - - /@emnapi/runtime@0.45.0: - resolution: - { - integrity: sha512-Txumi3td7J4A/xTTwlssKieHKTGl3j4A1tglBx72auZ49YK7ePY6XZricgIg9mnZT4xPfA+UPCUdnhRuEFDL+w==, - } - requiresBuild: true - dependencies: - tslib: 2.6.2 - dev: false - optional: 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/aix-ppc64@0.19.11: - resolution: - { - integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==, - } - engines: { node: ">=12" } - cpu: [ppc64] - os: [aix] - 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-arm64@0.19.11: - resolution: - { - integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==, - } - engines: { node: ">=12" } - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: 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-arm@0.19.11: - resolution: - { - integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==, - } - engines: { node: ">=12" } - cpu: [arm] - 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/android-x64@0.19.11: - resolution: - { - integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==, - } - 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-arm64@0.19.11: - resolution: - { - integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==, - } - 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/darwin-x64@0.19.11: - resolution: - { - integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==, - } - 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-arm64@0.19.11: - resolution: - { - integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==, - } - 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/freebsd-x64@0.19.11: - resolution: - { - integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [freebsd] - 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-arm64@0.19.11: - resolution: - { - integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==, - } - engines: { node: ">=12" } - cpu: [arm64] - os: [linux] - 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-arm@0.19.11: - resolution: - { - integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==, - } - engines: { node: ">=12" } - cpu: [arm] - 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-ia32@0.19.11: - resolution: - { - integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==, - } - 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-loong64@0.19.11: - resolution: - { - integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==, - } - 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-mips64el@0.19.11: - resolution: - { - integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==, - } - 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-ppc64@0.19.11: - resolution: - { - integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==, - } - 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-riscv64@0.19.11: - resolution: - { - integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==, - } - 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-s390x@0.19.11: - resolution: - { - integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==, - } - 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/linux-x64@0.19.11: - resolution: - { - integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==, - } - 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/netbsd-x64@0.19.11: - resolution: - { - integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==, - } - 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/openbsd-x64@0.19.11: - resolution: - { - integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==, - } - 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/sunos-x64@0.19.11: - resolution: - { - integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==, - } - 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-arm64@0.19.11: - resolution: - { - integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==, - } - 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-ia32@0.19.11: - resolution: - { - integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==, - } - 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==, + integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==, } engines: { node: ">=12" } cpu: [x64] - os: [win32] + os: [freebsd] requiresBuild: true dev: true optional: true - /@esbuild/win32-x64@0.18.20: + /@esbuild/freebsd-x64@0.19.11: resolution: { - integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==, + integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==, } engines: { node: ">=12" } cpu: [x64] - os: [win32] + os: [freebsd] requiresBuild: true dev: true optional: true - /@esbuild/win32-x64@0.19.11: + /@esbuild/linux-arm64@0.17.19: resolution: { - integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==, + integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==, } engines: { node: ">=12" } - cpu: [x64] - os: [win32] + cpu: [arm64] + os: [linux] requiresBuild: true dev: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): - resolution: - { - integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.56.0 - eslint-visitor-keys: 3.4.3 - - /@eslint-community/regexpp@4.10.0: - resolution: - { - integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==, - } - engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } - - /@eslint/eslintrc@2.1.4: - resolution: - { - integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.0 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - /@eslint/js@8.56.0: - resolution: - { - integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - - /@expo/bunyan@4.0.0: - resolution: - { - integrity: sha512-Ydf4LidRB/EBI+YrB+cVLqIseiRfjUI/AeHBgjGMtq3GroraDu81OV7zqophRgupngoL3iS3JUMDMnxO7g39qA==, - } - engines: { "0": node >=0.10.0 } - dependencies: - uuid: 8.3.2 - optionalDependencies: - mv: 2.1.1 - safe-json-stringify: 1.2.0 - dev: false - - /@expo/cli@0.10.16(expo-modules-autolinking@1.5.1): - resolution: - { - integrity: sha512-EwgnRN5AMElg0JJjFLJTPk5hYkVXxnNMLIvZBiTfGoCq+rDw6u7Mg5l2Bbm/geSHOoplaHyPZ/Wr23FAuZWehA==, - } - hasBin: true - dependencies: - "@babel/runtime": 7.23.7 - "@expo/code-signing-certificates": 0.0.5 - "@expo/config": 8.1.2 - "@expo/config-plugins": 7.2.5 - "@expo/dev-server": 0.5.5 - "@expo/devcert": 1.1.0 - "@expo/env": 0.0.5 - "@expo/json-file": 8.2.37 - "@expo/metro-config": 0.10.7 - "@expo/osascript": 2.0.33 - "@expo/package-manager": 1.1.2 - "@expo/plist": 0.0.20 - "@expo/prebuild-config": 6.2.6(expo-modules-autolinking@1.5.1) - "@expo/rudder-sdk-node": 1.1.1 - "@expo/spawn-async": 1.5.0 - "@expo/xcpretty": 4.3.0 - "@urql/core": 2.3.6(graphql@15.8.0) - "@urql/exchange-retry": 0.3.0(graphql@15.8.0) - accepts: 1.3.8 - arg: 4.1.0 - better-opn: 3.0.2 - bplist-parser: 0.3.2 - cacache: 15.3.0 - chalk: 4.1.2 - ci-info: 3.9.0 - debug: 4.3.4 - env-editor: 0.4.2 - form-data: 3.0.1 - freeport-async: 2.0.0 - fs-extra: 8.1.0 - getenv: 1.0.0 - graphql: 15.8.0 - graphql-tag: 2.12.6(graphql@15.8.0) - https-proxy-agent: 5.0.1 - internal-ip: 4.3.0 - js-yaml: 3.14.1 - json-schema-deref-sync: 0.13.0 - md5-file: 3.2.3 - md5hex: 1.0.0 - minipass: 3.1.6 - node-fetch: 2.7.0 - node-forge: 1.3.1 - npm-package-arg: 7.0.0 - ora: 3.4.0 - pretty-bytes: 5.6.0 - progress: 2.0.3 - prompts: 2.4.2 - qrcode-terminal: 0.11.0 - require-from-string: 2.0.2 - requireg: 0.2.2 - resolve-from: 5.0.0 - semver: 7.5.4 - send: 0.18.0 - slugify: 1.6.6 - structured-headers: 0.4.1 - tar: 6.2.0 - tempy: 0.7.1 - terminal-link: 2.1.1 - text-table: 0.2.0 - url-join: 4.0.0 - wrap-ansi: 7.0.0 - ws: 8.16.0 - transitivePeerDependencies: - - bluebird - - bufferutil - - encoding - - expo-modules-autolinking - - supports-color - - utf-8-validate - dev: false - - /@expo/code-signing-certificates@0.0.5: - resolution: - { - integrity: sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw==, - } - dependencies: - node-forge: 1.3.1 - nullthrows: 1.1.1 - dev: false - - /@expo/config-plugins@7.2.5: - resolution: - { - integrity: sha512-w+5ccu1IxBHgyQk9CPFKLZOk8yZQEyTjbJwOzESK1eR7QwosbcsLkN1c1WWUZYiCXwORu3UTwJYll4+X2xxJhQ==, - } - dependencies: - "@expo/config-types": 49.0.0 - "@expo/json-file": 8.2.37 - "@expo/plist": 0.0.20 - "@expo/sdk-runtime-versions": 1.0.0 - "@react-native/normalize-color": 2.1.0 - chalk: 4.1.2 - debug: 4.3.4 - find-up: 5.0.0 - getenv: 1.0.0 - glob: 7.1.6 - resolve-from: 5.0.0 - semver: 7.5.4 - slash: 3.0.0 - xcode: 3.0.1 - xml2js: 0.6.0 - transitivePeerDependencies: - - supports-color - dev: false - - /@expo/config-types@49.0.0: - resolution: - { - integrity: sha512-8eyREVi+K2acnMBe/rTIu1dOfyR2+AMnTLHlut+YpMV9OZPdeKV0Bs9BxAewGqBA2slslbQ9N39IS2CuTKpXkA==, - } - dev: false - - /@expo/config@8.1.2: - resolution: - { - integrity: sha512-4e7hzPj50mQIlsrzOH6XZ36O094mPfPTIDIH4yv49bWNMc7GFLTofB/lcT+QyxiLaJuC0Wlk9yOLB8DIqmtwug==, - } - dependencies: - "@babel/code-frame": 7.10.4 - "@expo/config-plugins": 7.2.5 - "@expo/config-types": 49.0.0 - "@expo/json-file": 8.2.37 - getenv: 1.0.0 - glob: 7.1.6 - require-from-string: 2.0.2 - resolve-from: 5.0.0 - semver: 7.5.3 - slugify: 1.6.6 - sucrase: 3.35.0 - transitivePeerDependencies: - - supports-color - dev: false - - /@expo/dev-server@0.5.5: - resolution: - { - integrity: sha512-t0fT8xH1exwYsH5hh7bAt85VF+gXxg24qrbny2rR/iKoPTWFCd2JNQV8pvfLg51hvrywQ3YCBuT3lU1w7aZxFA==, - } - dependencies: - "@expo/bunyan": 4.0.0 - "@expo/metro-config": 0.10.7 - "@expo/osascript": 2.0.33 - "@expo/spawn-async": 1.5.0 - body-parser: 1.20.2 - chalk: 4.1.2 - connect: 3.7.0 - fs-extra: 9.0.0 - is-docker: 2.2.1 - is-wsl: 2.2.0 - node-fetch: 2.7.0 - open: 8.4.2 - resolve-from: 5.0.0 - serialize-error: 6.0.0 - temp-dir: 2.0.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /@expo/devcert@1.1.0: - resolution: - { - integrity: sha512-ghUVhNJQOCTdQckSGTHctNp/0jzvVoMMkVh+6SHn+TZj8sU15U/npXIDt8NtQp0HedlPaCgkVdMu8Sacne0aEA==, - } - dependencies: - application-config-path: 0.1.1 - command-exists: 1.2.9 - debug: 3.2.7 - eol: 0.9.1 - get-port: 3.2.0 - glob: 7.2.3 - lodash: 4.17.21 - mkdirp: 0.5.6 - password-prompt: 1.1.3 - rimraf: 2.7.1 - sudo-prompt: 8.2.5 - tmp: 0.0.33 - tslib: 2.6.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@expo/env@0.0.5: - resolution: - { - integrity: sha512-UXuKAqyXfhMQC3gP0OyjXmFX08Z1fkVWiGBN7bYzfoX8LHatjeHrDtI6w5nDvd8XPxPvmqaZoEDw1lW3+dz3oQ==, - } - dependencies: - chalk: 4.1.2 - debug: 4.3.4 - dotenv: 16.0.3 - dotenv-expand: 10.0.0 - getenv: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: false - - /@expo/image-utils@0.3.22: + /@esbuild/linux-arm64@0.18.20: resolution: { - integrity: sha512-uzq+RERAtkWypOFOLssFnXXqEqKjNj9eXN7e97d/EXUAojNcLDoXc0sL+F5B1I4qtlsnhX01kcpoIBBZD8wZNQ==, + integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==, } - dependencies: - "@expo/spawn-async": 1.5.0 - chalk: 4.1.2 - fs-extra: 9.0.0 - getenv: 1.0.0 - jimp-compact: 0.16.1 - mime: 2.6.0 - node-fetch: 2.7.0 - parse-png: 2.1.0 - resolve-from: 5.0.0 - semver: 7.3.2 - tempy: 0.3.0 - transitivePeerDependencies: - - encoding - dev: false + engines: { node: ">=12" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true - /@expo/json-file@8.2.37: + /@esbuild/linux-arm64@0.19.11: resolution: { - integrity: sha512-YaH6rVg11JoTS2P6LsW7ybS2CULjf40AbnAHw2F1eDPuheprNjARZMnyHFPkKv7GuxCy+B9GPcbOKgc4cgA80Q==, + integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==, } - dependencies: - "@babel/code-frame": 7.10.4 - json5: 2.2.3 - write-file-atomic: 2.4.3 - dev: false + engines: { node: ">=12" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true - /@expo/metro-config@0.10.7: + /@esbuild/linux-arm@0.17.19: resolution: { - integrity: sha512-uACymEiyX0447hI4unt+2cemLQkTZXKvTev936NhtsgVnql45EP0V0pzmo/0H0WlHaAGXgvOBZJl8wFqcJ3CbQ==, + integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==, } - dependencies: - "@expo/config": 8.1.2 - "@expo/env": 0.0.5 - "@expo/json-file": 8.2.37 - chalk: 4.1.2 - debug: 4.3.4 - find-yarn-workspace-root: 2.0.0 - getenv: 1.0.0 - jsc-safe-url: 0.2.4 - lightningcss: 1.19.0 - postcss: 8.4.32 - resolve-from: 5.0.0 - sucrase: 3.35.0 - transitivePeerDependencies: - - supports-color - dev: false + engines: { node: ">=12" } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true - /@expo/osascript@2.0.33: + /@esbuild/linux-arm@0.18.20: resolution: { - integrity: sha512-FQinlwHrTlJbntp8a7NAlCKedVXe06Va/0DSLXRO8lZVtgbEMrYYSUZWQNcOlNtc58c2elNph6z9dMOYwSo3JQ==, + integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==, } engines: { node: ">=12" } - dependencies: - "@expo/spawn-async": 1.5.0 - exec-async: 2.2.0 - dev: false + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true - /@expo/package-manager@1.1.2: + /@esbuild/linux-arm@0.19.11: resolution: { - integrity: sha512-JI9XzrxB0QVXysyuJ996FPCJGDCYRkbUvgG4QmMTTMFA1T+mv8YzazC3T9C1pHQUAAveVCre1+Pqv0nZXN24Xg==, + integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==, } - dependencies: - "@expo/json-file": 8.2.37 - "@expo/spawn-async": 1.5.0 - ansi-regex: 5.0.1 - chalk: 4.1.2 - find-up: 5.0.0 - find-yarn-workspace-root: 2.0.0 - js-yaml: 3.14.1 - micromatch: 4.0.5 - npm-package-arg: 7.0.0 - split: 1.0.1 - sudo-prompt: 9.1.1 - dev: false + engines: { node: ">=12" } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true - /@expo/plist@0.0.20: + /@esbuild/linux-ia32@0.17.19: resolution: { - integrity: sha512-UXQ4LXCfTZ580LDHGJ5q62jSTwJFFJ1GqBu8duQMThiHKWbMJ+gajJh6rsB6EJ3aLUr9wcauxneL5LVRFxwBEA==, + integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==, } - dependencies: - "@xmldom/xmldom": 0.7.13 - base64-js: 1.5.1 - xmlbuilder: 14.0.0 - dev: false + engines: { node: ">=12" } + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true - /@expo/prebuild-config@6.2.6(expo-modules-autolinking@1.5.1): + /@esbuild/linux-ia32@0.18.20: resolution: { - integrity: sha512-uFVvDAm9dPg9p1qpnr4CVnpo2hmkZIL5FQz+VlIdXXJpe7ySh/qTGHtKWY/lWUshQkAJ0nwbKGPztGWdABns/Q==, + integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==, } - peerDependencies: - expo-modules-autolinking: ">=0.8.1" - dependencies: - "@expo/config": 8.1.2 - "@expo/config-plugins": 7.2.5 - "@expo/config-types": 49.0.0 - "@expo/image-utils": 0.3.22 - "@expo/json-file": 8.2.37 - debug: 4.3.4 - expo-modules-autolinking: 1.5.1 - fs-extra: 9.1.0 - resolve-from: 5.0.0 - semver: 7.5.3 - xml2js: 0.6.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: false + engines: { node: ">=12" } + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true - /@expo/rudder-sdk-node@1.1.1: + /@esbuild/linux-ia32@0.19.11: resolution: { - integrity: sha512-uy/hS/awclDJ1S88w9UGpc6Nm9XnNUjzOAAib1A3PVAnGQIwebg8DpFqOthFBTlZxeuV/BKbZ5jmTbtNZkp1WQ==, + integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==, } engines: { node: ">=12" } - dependencies: - "@expo/bunyan": 4.0.0 - "@segment/loosely-validate-event": 2.0.0 - fetch-retry: 4.1.1 - md5: 2.3.0 - node-fetch: 2.7.0 - remove-trailing-slash: 0.1.1 - uuid: 8.3.2 - transitivePeerDependencies: - - encoding - dev: false + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true - /@expo/sdk-runtime-versions@1.0.0: + /@esbuild/linux-loong64@0.17.19: resolution: { - integrity: sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==, + integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==, } - dev: false + engines: { node: ">=12" } + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true - /@expo/spawn-async@1.5.0: + /@esbuild/linux-loong64@0.18.20: resolution: { - integrity: sha512-LB7jWkqrHo+5fJHNrLAFdimuSXQ2MQ4lA7SQW5bf/HbsXuV2VrT/jN/M8f/KoWt0uJMGN4k/j7Opx4AvOOxSew==, + integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==, } - engines: { node: ">=4" } - dependencies: - cross-spawn: 6.0.5 - dev: false + engines: { node: ">=12" } + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true - /@expo/vector-icons@13.0.0: + /@esbuild/linux-loong64@0.19.11: resolution: { - integrity: sha512-TI+l71+5aSKnShYclFa14Kum+hQMZ86b95SH6tQUG3qZEmLTarvWpKwqtTwQKqvlJSJrpFiSFu3eCuZokY6zWA==, + integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==, } - dev: false + engines: { node: ">=12" } + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true - /@expo/websql@1.0.1: + /@esbuild/linux-mips64el@0.17.19: resolution: { - integrity: sha512-H9/t1V7XXyKC343FJz/LwaVBfDhs6IqhDtSYWpt8LNSQDVjf5NvVJLc5wp+KCpRidZx8+0+YeHJN45HOXmqjFA==, + integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==, } - dependencies: - argsarray: 0.0.1 - immediate: 3.3.0 - noop-fn: 1.0.0 - pouchdb-collections: 1.0.1 - tiny-queue: 0.2.1 - dev: false + engines: { node: ">=12" } + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true - /@expo/xcpretty@4.3.0: + /@esbuild/linux-mips64el@0.18.20: resolution: { - integrity: sha512-whBbvHZ2Q10T5TNmN0z5NbO6C9ZDw+XUTu8h6vVMnMzQrbGexc9oaCCZfz+L3Q7TEL5vfr+9L86nY62c3Bsm+g==, + integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==, } - hasBin: true - dependencies: - "@babel/code-frame": 7.10.4 - chalk: 4.1.2 - find-up: 5.0.0 - js-yaml: 4.1.0 - dev: false + engines: { node: ">=12" } + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true - /@fastify/busboy@2.1.0: + /@esbuild/linux-mips64el@0.19.11: resolution: { - integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==, + integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==, } - engines: { node: ">=14" } + engines: { node: ">=12" } + cpu: [mips64el] + os: [linux] + requiresBuild: true dev: true + optional: true - /@floating-ui/core@1.5.2: + /@esbuild/linux-ppc64@0.17.19: resolution: { - integrity: sha512-Ii3MrfY/GAIN3OhXNzpCKaLxHQfJF9qvwq/kEJYdqDxeIHa01K8sldugal6TmeeXl+WMvhv9cnVzUTaFFJF09A==, + integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==, } - dependencies: - "@floating-ui/utils": 0.1.6 - dev: false + engines: { node: ">=12" } + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true - /@floating-ui/dom@1.5.3: + /@esbuild/linux-ppc64@0.18.20: resolution: { - integrity: sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==, + integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==, } - dependencies: - "@floating-ui/core": 1.5.2 - "@floating-ui/utils": 0.1.6 - dev: false + engines: { node: ">=12" } + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true - /@floating-ui/utils@0.1.6: + /@esbuild/linux-ppc64@0.19.11: resolution: { - integrity: sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==, + integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==, } - dev: false + engines: { node: ">=12" } + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true - /@floating-ui/vue@1.0.2(vue@3.4.5): + /@esbuild/linux-riscv64@0.17.19: resolution: { - integrity: sha512-sImlAl9mAoCKZLNlwWz2P2ZMJIDlOEDXrRD6aD2sIHAka1LPC+nWtB+D3lPe7IE7FGWSbwBPTnlSdlABa3Fr0A==, + integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==, } - dependencies: - "@floating-ui/dom": 1.5.3 - vue-demi: 0.14.6(vue@3.4.5) - transitivePeerDependencies: - - "@vue/composition-api" - - vue - dev: false + engines: { node: ">=12" } + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true - /@gar/promisify@1.1.3: + /@esbuild/linux-riscv64@0.18.20: resolution: { - integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==, + integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==, } - dev: false + engines: { node: ">=12" } + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true - /@graphql-typed-document-node/core@3.2.0(graphql@15.8.0): + /@esbuild/linux-riscv64@0.19.11: resolution: { - integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==, + integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==, } - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - dependencies: - graphql: 15.8.0 - dev: false + engines: { node: ">=12" } + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true - /@headlessui/vue@1.7.16(vue@3.4.3): + /@esbuild/linux-s390x@0.17.19: resolution: { - integrity: sha512-nKT+nf/q6x198SsyK54mSszaQl/z+QxtASmgMEJtpxSX2Q0OPJX0upS/9daDyiECpeAsvjkoOrm2O/6PyBQ+Qg==, + integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==, } - engines: { node: ">=10" } - peerDependencies: - vue: ^3.2.0 - dependencies: - vue: 3.4.3(typescript@5.3.3) - dev: false + engines: { node: ">=12" } + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true - /@headlessui/vue@1.7.16(vue@3.4.5): + /@esbuild/linux-s390x@0.18.20: resolution: { - integrity: sha512-nKT+nf/q6x198SsyK54mSszaQl/z+QxtASmgMEJtpxSX2Q0OPJX0upS/9daDyiECpeAsvjkoOrm2O/6PyBQ+Qg==, + integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==, } - engines: { node: ">=10" } - peerDependencies: - vue: ^3.2.0 - dependencies: - vue: 3.4.5(typescript@5.3.3) - dev: false + engines: { node: ">=12" } + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true - /@hono/swagger-ui@0.2.1(hono@3.12.0): + /@esbuild/linux-s390x@0.19.11: resolution: { - integrity: sha512-wBxVMRe3/v8xH4o6icmwztiIq0DG0s7+jHVMHVUAoFFCWEQNL2iskMmQtrhSDtsFmBZUeUFQUaaJ6Ir6DOmHLA==, + integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==, } - peerDependencies: - hono: "*" - dependencies: - hono: 3.12.0 - dev: false + engines: { node: ">=12" } + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true - /@hono/zod-openapi@0.9.5(hono@3.12.0)(zod@3.22.4): + /@esbuild/linux-x64@0.17.19: resolution: { - integrity: sha512-Px8QEIr5RyDeHQn51Ihnwtl//foFvd/F6yBq6o/3pVMUpoV6X4JZ+srgUrOX2VRrInpLVEP/NaroXlfvarwIxA==, + integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==, } - engines: { node: ">=16.0.0" } - peerDependencies: - hono: ">=3.11.3" - zod: 3.* - dependencies: - "@asteasolutions/zod-to-openapi": 5.5.0(zod@3.22.4) - "@hono/zod-validator": 0.1.11(hono@3.12.0)(zod@3.22.4) - hono: 3.12.0 - zod: 3.22.4 - dev: false + engines: { node: ">=12" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true - /@hono/zod-validator@0.1.11(hono@3.12.0)(zod@3.22.4): + /@esbuild/linux-x64@0.18.20: resolution: { - integrity: sha512-PQXeHUP0+36qpRt8yfeD7N2jbK3ETlGvSN6dMof/HwUC/APRokQRjpXZm4rrlG71Ft0aWE01+Bm4XejqPie5Uw==, + integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==, } - peerDependencies: - hono: ">=3.9.0" - zod: ^3.19.1 - dependencies: - hono: 3.12.0 - zod: 3.22.4 - dev: false + engines: { node: ">=12" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true - /@humanwhocodes/config-array@0.11.13: + /@esbuild/linux-x64@0.19.11: resolution: { - integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==, + integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==, } - engines: { node: ">=10.10.0" } - dependencies: - "@humanwhocodes/object-schema": 2.0.1 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color + engines: { node: ">=12" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true - /@humanwhocodes/module-importer@1.0.1: + /@esbuild/netbsd-x64@0.17.19: resolution: { - integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, + integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==, } - engines: { node: ">=12.22" } + engines: { node: ">=12" } + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true - /@humanwhocodes/object-schema@2.0.1: + /@esbuild/netbsd-x64@0.18.20: resolution: { - integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==, + integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==, } + engines: { node: ">=12" } + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true - /@isaacs/cliui@8.0.2: + /@esbuild/netbsd-x64@0.19.11: resolution: { - integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==, + integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==, } 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: false + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true - /@jest/types@26.6.2: + /@esbuild/openbsd-x64@0.17.19: resolution: { - integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==, + integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==, } - engines: { node: ">= 10.14.2" } - dependencies: - "@types/istanbul-lib-coverage": 2.0.6 - "@types/istanbul-reports": 3.0.4 - "@types/node": 20.10.6 - "@types/yargs": 15.0.19 - chalk: 4.1.2 - dev: false + engines: { node: ">=12" } + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true - /@jridgewell/gen-mapping@0.3.3: + /@esbuild/openbsd-x64@0.18.20: resolution: { - integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==, + integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==, } - engines: { node: ">=6.0.0" } - dependencies: - "@jridgewell/set-array": 1.1.2 - "@jridgewell/sourcemap-codec": 1.4.15 - "@jridgewell/trace-mapping": 0.3.20 - dev: false + engines: { node: ">=12" } + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true - /@jridgewell/resolve-uri@3.1.1: + /@esbuild/openbsd-x64@0.19.11: resolution: { - integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==, + integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==, } - engines: { node: ">=6.0.0" } + engines: { node: ">=12" } + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true - /@jridgewell/set-array@1.1.2: + /@esbuild/sunos-x64@0.17.19: resolution: { - integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==, + integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==, } - engines: { node: ">=6.0.0" } - dev: false + engines: { node: ">=12" } + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true - /@jridgewell/sourcemap-codec@1.4.15: + /@esbuild/sunos-x64@0.18.20: resolution: { - integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==, + integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==, } + engines: { node: ">=12" } + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true - /@jridgewell/trace-mapping@0.3.20: + /@esbuild/sunos-x64@0.19.11: resolution: { - integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==, + integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==, } - dependencies: - "@jridgewell/resolve-uri": 3.1.1 - "@jridgewell/sourcemap-codec": 1.4.15 - dev: false + engines: { node: ">=12" } + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true - /@jridgewell/trace-mapping@0.3.9: + /@esbuild/win32-arm64@0.17.19: resolution: { - integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==, + integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==, } - dependencies: - "@jridgewell/resolve-uri": 3.1.1 - "@jridgewell/sourcemap-codec": 1.4.15 + engines: { node: ">=12" } + cpu: [arm64] + os: [win32] + requiresBuild: true dev: true + optional: true - /@jsdevtools/ono@7.1.3: + /@esbuild/win32-arm64@0.18.20: resolution: { - integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==, + integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==, } - dev: false + engines: { node: ">=12" } + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true - /@lezer/common@1.2.0: + /@esbuild/win32-arm64@0.19.11: resolution: { - integrity: sha512-Wmvlm4q6tRpwiy20TnB3yyLTZim38Tkc50dPY8biQRwqE+ati/wD84rm3N15hikvdT4uSg9phs9ubjvcLmkpKg==, + integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==, } - dev: false + engines: { node: ">=12" } + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true - /@lezer/css@1.1.6: + /@esbuild/win32-ia32@0.17.19: resolution: { - integrity: sha512-/HhbnfXchRc995VdDH9TBzd1B2CO/A4uhOhELqGjd7Bymgc+tGlb0W9Vp5GA1Otq8Ef4JCXpuKmr4hH3aFny6A==, + integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==, } - dependencies: - "@lezer/common": 1.2.0 - "@lezer/highlight": 1.2.0 - "@lezer/lr": 1.3.14 - dev: false + engines: { node: ">=12" } + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true - /@lezer/highlight@1.2.0: + /@esbuild/win32-ia32@0.18.20: resolution: { - integrity: sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==, + integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==, } - dependencies: - "@lezer/common": 1.2.0 - dev: false + engines: { node: ">=12" } + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true - /@lezer/html@1.3.8: + /@esbuild/win32-ia32@0.19.11: resolution: { - integrity: sha512-EXseJ3pUzWxE6XQBQdqWHZqqlGQRSuNMBcLb6mZWS2J2v+QZhOObD+3ZIKIcm59ntTzyor4LqFTb72iJc3k23Q==, + integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==, } - dependencies: - "@lezer/common": 1.2.0 - "@lezer/highlight": 1.2.0 - "@lezer/lr": 1.3.14 - dev: false + engines: { node: ">=12" } + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true - /@lezer/java@1.1.1: + /@esbuild/win32-x64@0.17.19: resolution: { - integrity: sha512-mt3dX13fRlpY7RlWELYRakanXgmwXsLRCrhstrn+c1sZd7jR2xle46/3heoxGd+oHxnuTnpoyXTyxcLJQs9+mQ==, + integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==, } - dependencies: - "@lezer/common": 1.2.0 - "@lezer/highlight": 1.2.0 - "@lezer/lr": 1.3.14 - dev: false + engines: { node: ">=12" } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true - /@lezer/javascript@1.4.12: + /@esbuild/win32-x64@0.18.20: resolution: { - integrity: sha512-kwO5MftUiyfKBcECMEDc4HYnc10JME9kTJNPVoCXqJj/Y+ASWF0rgstORi3BThlQI6SoPSshrK5TjuiLFnr29A==, + integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==, } - dependencies: - "@lezer/highlight": 1.2.0 - "@lezer/lr": 1.3.14 - dev: false + engines: { node: ">=12" } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true - /@lezer/json@1.0.2: + /@esbuild/win32-x64@0.19.11: resolution: { - integrity: sha512-xHT2P4S5eeCYECyKNPhr4cbEL9tc8w83SPwRC373o9uEdrvGKTZoJVAGxpOsZckMlEh9W23Pc72ew918RWQOBQ==, + integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==, } - dependencies: - "@lezer/common": 1.2.0 - "@lezer/highlight": 1.2.0 - "@lezer/lr": 1.3.14 - dev: false + engines: { node: ">=12" } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true - /@lezer/lr@1.3.14: + /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): resolution: { - integrity: sha512-z5mY4LStlA3yL7aHT/rqgG614cfcvklS+8oFRFBYrs4YaWLJyKKM4+nN6KopToX0o9Hj6zmH6M5kinOYuy06ug==, + integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - "@lezer/common": 1.2.0 - dev: false + eslint: 8.56.0 + eslint-visitor-keys: 3.4.3 - /@lezer/python@1.1.10: + /@eslint-community/regexpp@4.10.0: resolution: { - integrity: sha512-pvSjn+OWivmA/si/SFeGouHO50xoOZcPIFzf8dql0gRvcfCvLDpVIpnnGFFlB7wa0WDscDLo0NmH+4Tx80nBdQ==, + integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==, } - dependencies: - "@lezer/common": 1.2.0 - "@lezer/highlight": 1.2.0 - "@lezer/lr": 1.3.14 - dev: false + engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } - /@libsql/client@0.4.0-pre.5: + /@eslint/eslintrc@2.1.4: resolution: { - integrity: sha512-GyKigCBslE5uztwT7mpvp9Zn0z3iWjnufcfeTeDSFPMyXCPjSAHUOiwSLAaHii909w6EQacA692CXmYYFo/eig==, + integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==, } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } dependencies: - "@libsql/hrana-client": 0.5.5 - js-base64: 3.7.5 - libsql: 0.2.0-pre.6 + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.0 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - dev: false + - supports-color - /@libsql/darwin-arm64@0.2.0-pre.6: + /@eslint/js@8.56.0: resolution: { - integrity: sha512-VIhL4tIelxLC4NFAdD/TUgWlMZvX7q18Zf6urVfqeNRJw2lTnO0exByjOFYJL3mqhQ53gVH73CoSP3/w8TyJtA==, + integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==, } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - /@libsql/darwin-x64@0.2.0-pre.6: + /@fastify/busboy@2.1.0: resolution: { - integrity: sha512-2tHZLqtnhyP4ggZrpFiysP4oa5/9TFw0meYpBsTSxaqIThtK3mz41IA8A6mcsiMLq1OUX+Q2h8/vwVXJzeEauA==, + integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==, } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true + engines: { node: ">=14" } + dev: true - /@libsql/hrana-client@0.5.5: + /@floating-ui/core@1.5.3: resolution: { - integrity: sha512-i+hDBpiV719poqEiHupUUZYKJ9YSbCRFe5Q2PQ0v3mHIftePH6gayLjp2u6TXbqbO/Dv6y8yyvYlBXf/kFfRZA==, + integrity: sha512-O0WKDOo0yhJuugCx6trZQj5jVJ9yR0ystG2JaNAemYUWce+pmM6WUEFIibnWyEJKdrDxhm75NoSRME35FNaM/Q==, } dependencies: - "@libsql/isomorphic-fetch": 0.1.10 - "@libsql/isomorphic-ws": 0.1.5 - js-base64: 3.7.5 - node-fetch: 3.3.2 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate + "@floating-ui/utils": 0.2.1 dev: false - /@libsql/isomorphic-fetch@0.1.10: + /@floating-ui/dom@1.5.4: resolution: { - integrity: sha512-dH0lMk50gKSvEKD78xWMu60SY1sjp1sY//iFLO0XMmBwfVfG136P9KOk06R4maBdlb8KMXOzJ1D28FR5ZKnHTA==, + integrity: sha512-jByEsHIY+eEdCjnTVu+E3ephzTOzkQ8hgUfGwos+bg7NlH33Zc5uO+QHz1mrQUOgIKKDD1RtS201P9NvAfq3XQ==, } dependencies: - "@types/node-fetch": 2.6.10 - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding + "@floating-ui/core": 1.5.3 + "@floating-ui/utils": 0.2.1 dev: false - /@libsql/isomorphic-ws@0.1.5: + /@floating-ui/utils@0.2.1: resolution: { - integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==, + integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==, } - dependencies: - "@types/ws": 8.5.10 - ws: 8.16.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate dev: false - /@libsql/linux-arm64-gnu@0.2.0-pre.6: + /@floating-ui/vue@1.0.4(vue@3.4.15): resolution: { - integrity: sha512-6JXhiQpLTdbMM3GpK4BuRYCIRvEUyFirSBkap5oOfWccL0Rnja7iBxNLsmGve5hAT39AR2VNPBWPM6yBfoQYNA==, + integrity: sha512-doHP79KFEmb41MCNR25NS8aGPR/TGBi0qIJgHmz4lIO7Nr0G9OImYnrT00obns1g3VXgG14ogVQoQDtPsfnXUQ==, } - cpu: [arm64] - os: [linux] - requiresBuild: true + dependencies: + "@floating-ui/dom": 1.5.4 + "@floating-ui/utils": 0.2.1 + vue-demi: 0.14.6(vue@3.4.15) + transitivePeerDependencies: + - "@vue/composition-api" + - vue dev: false - optional: true - /@libsql/linux-arm64-musl@0.2.0-pre.6: + /@headlessui/vue@1.7.17(vue@3.4.15): resolution: { - integrity: sha512-YlCRXkJNWww1q0kmjlg+s2NN3zMHllKfXMDTjvLaCLaXrCwURhylOIiwNXiiVNqWtCr/9Guz/WZxGMQe3pxGgg==, + integrity: sha512-hmJChv8HzKorxd9F70RGnECAwZfkvmmwOqreuKLWY/19d5qbWnSdw+DNbuA/Uo6X5rb4U5B3NrT+qBKPmjhRqw==, } - cpu: [arm64] - os: [linux] - requiresBuild: true + engines: { node: ">=10" } + peerDependencies: + vue: ^3.2.0 + dependencies: + "@tanstack/vue-virtual": 3.0.2(vue@3.4.15) + vue: 3.4.15(typescript@5.3.3) dev: false - optional: true - /@libsql/linux-x64-gnu@0.2.0-pre.6: + /@hono/swagger-ui@0.2.1(hono@3.12.6): resolution: { - integrity: sha512-9Hs0Hf6aBEcDgtEVBdQyqXoJZwkERSZnXary4iLvORIBT3IZg+ReNMXeeqgp7L1MA3WNRJsV5KuyeZEUxhiWqg==, + integrity: sha512-wBxVMRe3/v8xH4o6icmwztiIq0DG0s7+jHVMHVUAoFFCWEQNL2iskMmQtrhSDtsFmBZUeUFQUaaJ6Ir6DOmHLA==, } - cpu: [x64] - os: [linux] - requiresBuild: true + peerDependencies: + hono: "*" + dependencies: + hono: 3.12.6 dev: false - optional: true - /@libsql/linux-x64-musl@0.2.0-pre.6: + /@hono/zod-openapi@0.9.5(hono@3.12.6)(zod@3.22.4): resolution: { - integrity: sha512-N9P10GZUdJ1JyWyzHSjaA2tebMBVohJhmxSv7opolDBW7xs5Wa82zrx20ilk+0jcZmrFwJwcSu1TO/ZvRlmT2w==, + integrity: sha512-Px8QEIr5RyDeHQn51Ihnwtl//foFvd/F6yBq6o/3pVMUpoV6X4JZ+srgUrOX2VRrInpLVEP/NaroXlfvarwIxA==, } - cpu: [x64] - os: [linux] - requiresBuild: true + engines: { node: ">=16.0.0" } + peerDependencies: + hono: ">=3.11.3" + zod: 3.* + dependencies: + "@asteasolutions/zod-to-openapi": 5.5.0(zod@3.22.4) + "@hono/zod-validator": 0.1.11(hono@3.12.6)(zod@3.22.4) + hono: 3.12.6 + zod: 3.22.4 dev: false - optional: true - /@libsql/win32-x64-msvc@0.2.0-pre.6: + /@hono/zod-validator@0.1.11(hono@3.12.6)(zod@3.22.4): resolution: { - integrity: sha512-MC7zcwewX+acYYErwN29oCBOZM1JMQYIuFBS96DKVmZ9kW6VoQe/oYpqh/iHDwh5MH5b754WCrXosXy0UyKsaw==, + integrity: sha512-PQXeHUP0+36qpRt8yfeD7N2jbK3ETlGvSN6dMof/HwUC/APRokQRjpXZm4rrlG71Ft0aWE01+Bm4XejqPie5Uw==, } - cpu: [x64] - os: [win32] - requiresBuild: true + peerDependencies: + hono: ">=3.9.0" + zod: ^3.19.1 + dependencies: + hono: 3.12.6 + zod: 3.22.4 dev: false - optional: true - /@lucia-auth/adapter-sqlite@3.0.0-beta.12(@libsql/client@0.4.0-pre.5)(better-sqlite3@9.2.2)(lucia@3.0.0-beta.14): + /@humanwhocodes/config-array@0.11.14: resolution: { - integrity: sha512-DZpBsdOjxwibUohQK+2EDr/Lwl5IJTs4yUCUoDqXziniwHOuJSsOezpv5FsI9Y9bOwWWUP5wLyzV502CCsy1Mw==, + integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==, } - peerDependencies: - "@libsql/client": ^0.3.0 - better-sqlite3: 8.x - 9.x - lucia: 3.0.0-beta.14 - peerDependenciesMeta: - "@libsql/client": - optional: true - better-sqlite3: - optional: true + engines: { node: ">=10.10.0" } dependencies: - "@libsql/client": 0.4.0-pre.5 - better-sqlite3: 9.2.2 - lucia: 3.0.0-beta.14 - dev: false + "@humanwhocodes/object-schema": 2.0.2 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color - /@neon-rs/load@0.0.4: + /@humanwhocodes/module-importer@1.0.1: resolution: { - integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==, + integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, } - dev: false + engines: { node: ">=12.22" } - /@node-rs/argon2-android-arm-eabi@1.5.2: + /@humanwhocodes/object-schema@2.0.2: resolution: { - integrity: sha512-vVZec4ITr9GumAy0p8Zj8ozie362gtbZrTkLp9EqvuFZ/HrZzR09uS2IsDgm4mAstg/rc4A1gLRrHI8jDdbjkA==, + integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==, } - engines: { node: ">= 10" } - cpu: [arm] - os: [android] - requiresBuild: true - dev: false - optional: true - /@node-rs/argon2-android-arm-eabi@1.6.1: + /@jridgewell/resolve-uri@3.1.1: resolution: { - integrity: sha512-tE6vyT7sBx0XXmvzH+1q58XB8qoy7ZeiNgGpoMunO/97ssvYKcgvIfbkVao8aHHClmjZvWb2Juy598I5AkR30w==, + integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==, } - engines: { node: ">= 10" } - cpu: [arm] - os: [android] - requiresBuild: true - dev: false - optional: true + engines: { node: ">=6.0.0" } + dev: true - /@node-rs/argon2-android-arm64@1.5.2: + /@jridgewell/sourcemap-codec@1.4.15: resolution: { - integrity: sha512-SwhnsXyrpgtWDTwYds1WUnxLA/kVP8HVaImYwQ3Wemqj1lkzcSoIaNyjNWkyrYGqO1tVc1YUrqsbd5eCHh+3sg==, + integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==, } - engines: { node: ">= 10" } - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false - optional: true - /@node-rs/argon2-android-arm64@1.6.1: + /@jridgewell/trace-mapping@0.3.9: resolution: { - integrity: sha512-3HYc9lOZ63j71sSFjpVTgu1HUg2O94HvVz66j47Ia8Qq6wjpQusUebeUigMIRPq6Ewh6AgeGv5fxe0cQLGqHlw==, + integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==, } - engines: { node: ">= 10" } - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false - optional: true + dependencies: + "@jridgewell/resolve-uri": 3.1.1 + "@jridgewell/sourcemap-codec": 1.4.15 + dev: true - /@node-rs/argon2-darwin-arm64@1.5.2: + /@jsdevtools/ono@7.1.3: resolution: { - integrity: sha512-+1ZMKiCCv2pip/o1Xg09piQru2LOIBPQ1vS4is86f55N3jjZnSfP+db5mYCSRuB0gRYqui98he7su7OGXlF4gQ==, + integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==, } - engines: { node: ">= 10" } - cpu: [arm64] - os: [darwin] - requiresBuild: true dev: false - optional: true - /@node-rs/argon2-darwin-arm64@1.6.1: + /@lezer/common@1.2.1: resolution: { - integrity: sha512-rJ0OluVhSa4xYc5yQvuzgEPctn/xT10qPyEYQmJ0bBKOA1U75nI20ZAhVdz5olWIBuIsS3vmNEQ5vjrY+DC5Yw==, + integrity: sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==, } - engines: { node: ">= 10" } - cpu: [arm64] - os: [darwin] - requiresBuild: true dev: false - optional: true - /@node-rs/argon2-darwin-x64@1.5.2: + /@lezer/css@1.1.7: resolution: { - integrity: sha512-mQ57mORlsxpfjcEsVpiHyHCOp6Ljrz/rVNWk8ihnPWw0qt0EqF1zbHRxTEPemL1iBHL9UyXpXrKS4JKq6xMn5w==, + integrity: sha512-7BlFFAKNn/b39jJLrhdLSX5A2k56GIJvyLqdmm7UU+7XvequY084iuKDMAEhAmAzHnwDE8FK4OQtsIUssW91tg==, } - engines: { node: ">= 10" } - cpu: [x64] - os: [darwin] - requiresBuild: true + dependencies: + "@lezer/common": 1.2.1 + "@lezer/highlight": 1.2.0 + "@lezer/lr": 1.3.14 dev: false - optional: true - /@node-rs/argon2-darwin-x64@1.6.1: + /@lezer/highlight@1.2.0: resolution: { - integrity: sha512-7j6ZLB77XbrF0jpV2ur1cE42mfYf5L6O0coco04yH7wRbIGIKupS7CW+7ZGWR7zqi3RCV1AM2Qdq8FyXuZkZJA==, + integrity: sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==, } - engines: { node: ">= 10" } - cpu: [x64] - os: [darwin] - requiresBuild: true + dependencies: + "@lezer/common": 1.2.1 dev: false - optional: true - /@node-rs/argon2-freebsd-x64@1.5.2: + /@lezer/html@1.3.8: resolution: { - integrity: sha512-UjKbFd3viYcpiwflkU4haEdNUMk1V2fVCJImWLWQns/hVval9BrDv5xsBwgdynbPHDlPOiWj816LBQwhWLGVWA==, + integrity: sha512-EXseJ3pUzWxE6XQBQdqWHZqqlGQRSuNMBcLb6mZWS2J2v+QZhOObD+3ZIKIcm59ntTzyor4LqFTb72iJc3k23Q==, } - engines: { node: ">= 10" } - cpu: [x64] - os: [freebsd] - requiresBuild: true + dependencies: + "@lezer/common": 1.2.1 + "@lezer/highlight": 1.2.0 + "@lezer/lr": 1.3.14 dev: false - optional: true - /@node-rs/argon2-freebsd-x64@1.6.1: + /@lezer/java@1.1.1: resolution: { - integrity: sha512-lycNRomwXJv/O30iP6b6kcXbVRk5vCv2aX44ZeeGrGYWAR0Wz0RWHLe884CmnUW1RoFGN2517PHIPP66TCKJbQ==, + integrity: sha512-mt3dX13fRlpY7RlWELYRakanXgmwXsLRCrhstrn+c1sZd7jR2xle46/3heoxGd+oHxnuTnpoyXTyxcLJQs9+mQ==, } - engines: { node: ">= 10" } - cpu: [x64] - os: [freebsd] - requiresBuild: true + dependencies: + "@lezer/common": 1.2.1 + "@lezer/highlight": 1.2.0 + "@lezer/lr": 1.3.14 dev: false - optional: true - /@node-rs/argon2-linux-arm-gnueabihf@1.5.2: + /@lezer/javascript@1.4.13: resolution: { - integrity: sha512-36GJjJBnVuscV9CTn8RVDeJysnmIzr6Lp7QBCDczYHi6eKFuA8udCJb4SRyJqdvIuzycKG1RL56FbcFBJYCYIA==, + integrity: sha512-5IBr8LIO3xJdJH1e9aj/ZNLE4LSbdsx25wFmGRAZsj2zSmwAYjx26JyU/BYOCpRQlu1jcv1z3vy4NB9+UkfRow==, } - engines: { node: ">= 10" } - cpu: [arm] - os: [linux] - requiresBuild: true + dependencies: + "@lezer/common": 1.2.1 + "@lezer/highlight": 1.2.0 + "@lezer/lr": 1.3.14 dev: false - optional: true - /@node-rs/argon2-linux-arm-gnueabihf@1.6.1: + /@lezer/json@1.0.2: resolution: { - integrity: sha512-/4FdsWZT8xGiZEIz21bS0sz/3aG6+GaEgFSyr1wF6ui2xdr4nhobOUxhkaPXR1vOwIE3v9B5YB5uehtSCdNTHw==, + integrity: sha512-xHT2P4S5eeCYECyKNPhr4cbEL9tc8w83SPwRC373o9uEdrvGKTZoJVAGxpOsZckMlEh9W23Pc72ew918RWQOBQ==, } - engines: { node: ">= 10" } - cpu: [arm] - os: [linux] - requiresBuild: true + dependencies: + "@lezer/common": 1.2.1 + "@lezer/highlight": 1.2.0 + "@lezer/lr": 1.3.14 dev: false - optional: true - /@node-rs/argon2-linux-arm64-gnu@1.5.2: + /@lezer/lr@1.3.14: resolution: { - integrity: sha512-sE0ydb2gp6xC+5vbVz8l3paaiBbFQIB2Rwp5wx9MmKiYdTfcO5WkGeADuSgoFiTcSEz1RsHXqrdVy6j/LtSqtA==, + integrity: sha512-z5mY4LStlA3yL7aHT/rqgG614cfcvklS+8oFRFBYrs4YaWLJyKKM4+nN6KopToX0o9Hj6zmH6M5kinOYuy06ug==, } - engines: { node: ">= 10" } - cpu: [arm64] - os: [linux] - requiresBuild: true + dependencies: + "@lezer/common": 1.2.1 dev: false - optional: true - /@node-rs/argon2-linux-arm64-gnu@1.6.1: + /@lezer/python@1.1.11: resolution: { - integrity: sha512-GpWZPsc8sy7aNdeV2W6pCPxvXriq+d4pbKX5JsRDzsfyF7OkN6O7ysJ2pYXe6Hvfmr4syVnZ+XVAhs74JPUEVg==, + integrity: sha512-C3QeLCcdAKJDUOsYjfFP6a1wdn8jhUNX200bgFm8TpKH1eM2PlgYQS5ugw6E38qGeEx7CP21I1Q52SoybXt0OQ==, } - engines: { node: ">= 10" } - cpu: [arm64] - os: [linux] - requiresBuild: true + dependencies: + "@lezer/common": 1.2.1 + "@lezer/highlight": 1.2.0 + "@lezer/lr": 1.3.14 dev: false - optional: true - /@node-rs/argon2-linux-arm64-musl@1.5.2: + /@libsql/client@0.4.0-pre.7: resolution: { - integrity: sha512-LhE0YHB0aJCwlbsQrwePik/KFWUc9qMriJIL5KiejK3bDoTVY4ihH587QT56JyaLvl3nBJaAV8l5yMqQdHnouA==, + integrity: sha512-zqr+aHFXwpmI9Wyl3vjlRdYW8G7mHSKrSL8Qn6p50M0aBeOfgHCP2dCn/eS9RR4b4vcayASnJmPvkzaKKE3tXg==, } - engines: { node: ">= 10" } - cpu: [arm64] - os: [linux] - requiresBuild: true + dependencies: + "@libsql/hrana-client": 0.5.5 + js-base64: 3.7.6 + libsql: 0.2.0-pre.7 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate dev: false - optional: true - /@node-rs/argon2-linux-arm64-musl@1.6.1: + /@libsql/darwin-arm64@0.2.0-pre.7: resolution: { - integrity: sha512-GuMNkb/BtJBXDUDlgAu31limYbRBNryo6mHV0f3/qUveQP4+LZYx5zD2WorqawNAB4SjdAxJBc4rJgmqabHJDw==, + integrity: sha512-rtNYnXF0W3kKwZ5MxrhjzE8uWq2YI20zIeKLDFX8JzT6zfgR3qym9AUrDV8tPYGr4bF/mgdH/CZxr49zddy4ig==, } - engines: { node: ">= 10" } cpu: [arm64] - os: [linux] + os: [darwin] requiresBuild: true dev: false optional: true - /@node-rs/argon2-linux-x64-gnu@1.5.2: + /@libsql/darwin-x64@0.2.0-pre.7: resolution: { - integrity: sha512-MnKLiBlyg05pxvKXe3lNgBL9El9ThD74hvVEiWH1Xk40RRrJ507NCOWXVmQ0FDq1mjTeGFxbIvk+AcoF0NSLIQ==, + integrity: sha512-14cb9xJCHwOIl71TPpzeZhKZ4pvwEeRTkP2XmmMBvkNaDPK27lE4ibMATL+IZ/JL0S7aQNcBLwTpwu2Zt0IMuQ==, } - engines: { node: ">= 10" } cpu: [x64] - os: [linux] + os: [darwin] requiresBuild: true dev: false optional: true - /@node-rs/argon2-linux-x64-gnu@1.6.1: + /@libsql/hrana-client@0.5.5: resolution: { - integrity: sha512-wXtK5klEHYQx99jGjpWFiKhsjenhms4tc7bZOXiKf1WPnYwQNzpmuDmGGufxDX2KrdXRbSVD+DKJZCdxp/uSkg==, + integrity: sha512-i+hDBpiV719poqEiHupUUZYKJ9YSbCRFe5Q2PQ0v3mHIftePH6gayLjp2u6TXbqbO/Dv6y8yyvYlBXf/kFfRZA==, } - engines: { node: ">= 10" } - cpu: [x64] - os: [linux] - requiresBuild: true + dependencies: + "@libsql/isomorphic-fetch": 0.1.10 + "@libsql/isomorphic-ws": 0.1.5 + js-base64: 3.7.6 + node-fetch: 3.3.2 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate dev: false - optional: true - /@node-rs/argon2-linux-x64-musl@1.5.2: + /@libsql/isomorphic-fetch@0.1.10: resolution: { - integrity: sha512-tzLgASY0Ng2OTW7Awwl9UWzjbWx8/uD6gXcZ/k/nYGSZE5Xp8EOD2NUqHLbK6KZE3775A0R25ShpiSxCadYqkg==, + integrity: sha512-dH0lMk50gKSvEKD78xWMu60SY1sjp1sY//iFLO0XMmBwfVfG136P9KOk06R4maBdlb8KMXOzJ1D28FR5ZKnHTA==, } - engines: { node: ">= 10" } - cpu: [x64] - os: [linux] - requiresBuild: true + dependencies: + "@types/node-fetch": 2.6.11 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: false + + /@libsql/isomorphic-ws@0.1.5: + resolution: + { + integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==, + } + dependencies: + "@types/ws": 8.5.10 + ws: 8.16.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate dev: false - optional: true - /@node-rs/argon2-linux-x64-musl@1.6.1: + /@libsql/linux-arm64-gnu@0.2.0-pre.7: resolution: { - integrity: sha512-fKJNzFe4QZ3/+C4BuYXK+Je9H2/AY2ojj4Gbr/aFYleu3B/S0pDMvLRKqb3yx5FGeyPBkrKwMrscCqPxAFKJbw==, + integrity: sha512-fiygBotFaYmWnK0or0yEQQQ+3V2m886aaIXDuYtSMpoeykbY3JuRu/CSvriI6/ovnufoMoERo82YZUBR6EDPKA==, } - engines: { node: ">= 10" } - cpu: [x64] + cpu: [arm64] os: [linux] requiresBuild: true dev: false optional: true - /@node-rs/argon2-wasm32-wasi@1.6.1: + /@libsql/linux-arm64-musl@0.2.0-pre.7: resolution: { - integrity: sha512-wv1eciTy1WHP34dufxYT02lkiS2qXXeY2wPit7qA8iKlEzAOMzOxbbk9ePWFGTGaYHqgjzy+gXAbunJ/uv8NmQ==, + integrity: sha512-5m2OnItWBwyhGiB4kpOvGaOGwHemEY5cz/dc0gK/L6OjEP1lTPZwhXongp3EtI/cApGpHyLctkSWkgM+y2zp9w==, } - engines: { node: ">=14.0.0" } - cpu: [wasm32] + cpu: [arm64] + os: [linux] requiresBuild: true - dependencies: - "@emnapi/core": 0.45.0 - "@emnapi/runtime": 0.45.0 dev: false optional: true - /@node-rs/argon2-win32-arm64-msvc@1.5.2: + /@libsql/linux-x64-gnu@0.2.0-pre.7: resolution: { - integrity: sha512-vpTwSvv3oUXTpWZh0/HxdJ5wFMlmS7aVDwL4ATWepTZhMG4n+TO0+tVLdcPHCbg0oc6hCWBjWNPlSn9mW+YIgA==, + integrity: sha512-i72WtvZqsuoM5rnMslS2LGsOo3zvlH0nc5gAwUz45UnsXQBSiLP7ELktVW0n8soMaeQE47ayT6jsB61CMC0KSA==, } - engines: { node: ">= 10" } - cpu: [arm64] - os: [win32] + cpu: [x64] + os: [linux] requiresBuild: true dev: false optional: true - /@node-rs/argon2-win32-arm64-msvc@1.6.1: + /@libsql/linux-x64-musl@0.2.0-pre.7: resolution: { - integrity: sha512-9tbGPwUGWsuWl9JGeMusaRsCDQeO39H3H7lZRVAPgPtP4UUU/jSzLgi4WA37E6XF9ZSFr+V82Gb+isXOTTm+1w==, + integrity: sha512-9QO7xg6mExrQVQES9gW1OsExsUEJ6cBRdmt6nYfeDGShh/eoV3kiPSUeMXckNNbl77F5+m86WZqIDpi2UskgDw==, } - engines: { node: ">= 10" } - cpu: [arm64] - os: [win32] + cpu: [x64] + os: [linux] requiresBuild: true dev: false optional: true - /@node-rs/argon2-win32-ia32-msvc@1.5.2: + /@libsql/win32-x64-msvc@0.2.0-pre.7: resolution: { - integrity: sha512-KPpZR15ui7uQWQXKmtaKyUQRs4UJdXnIIfiyFLGmLWCdEKlr3MtIGFt0fdziu4BF5ZObD8Ic6QvT0VXK4OJiww==, + integrity: sha512-vNKWGHIws3qoqMV4hX0kRt54IiFaA0FuSzQnclqlygGTXetHragnuimZANIOYVWagU35wk5s23+Ir/eO158+Sg==, } - engines: { node: ">= 10" } - cpu: [ia32] + cpu: [x64] os: [win32] requiresBuild: true dev: false optional: true - /@node-rs/argon2-win32-ia32-msvc@1.6.1: + /@lucia-auth/adapter-sqlite@3.0.0-beta.12(@libsql/client@0.4.0-pre.7)(better-sqlite3@9.3.0)(lucia@3.0.0-beta.14): resolution: { - integrity: sha512-mZfF/FSop7OPU1LR9j+i7n4SRBjZoAOBzcgcQGWx6DSoL3vSJItJ5qm1dZ923PpsyMm2iUTQyejGgR98tOhpnQ==, + integrity: sha512-DZpBsdOjxwibUohQK+2EDr/Lwl5IJTs4yUCUoDqXziniwHOuJSsOezpv5FsI9Y9bOwWWUP5wLyzV502CCsy1Mw==, } - engines: { node: ">= 10" } - cpu: [ia32] - os: [win32] - requiresBuild: true + peerDependencies: + "@libsql/client": ^0.3.0 + better-sqlite3: 8.x - 9.x + lucia: 3.0.0-beta.14 + peerDependenciesMeta: + "@libsql/client": + optional: true + better-sqlite3: + optional: true + dependencies: + "@libsql/client": 0.4.0-pre.7 + better-sqlite3: 9.3.0 + lucia: 3.0.0-beta.14 dev: false - optional: true - /@node-rs/argon2-win32-x64-msvc@1.5.2: + /@napi-rs/wasm-runtime@0.1.1: resolution: { - integrity: sha512-/pGuwixJS8ZlpwhX9iM6g6JEeZYo1TtnNf8exwsOi7gxcUoTUfw5it+5GfbY/n+xRBz/DIU4bzUmXmh+7Gh0ug==, + integrity: sha512-ATj9ua659JgrkICjJscaeZdmPr44cb/KFjNWuD0N6pux0SpzaM7+iOuuK11mAnQM2N9q0DT4REu6NkL8ZEhopw==, } - engines: { node: ">= 10" } - cpu: [x64] - os: [win32] requiresBuild: true + dependencies: + "@emnapi/core": 0.45.0 + "@emnapi/runtime": 0.45.0 + "@tybys/wasm-util": 0.8.1 dev: false optional: true - /@node-rs/argon2-win32-x64-msvc@1.6.1: + /@neon-rs/load@0.0.4: resolution: { - integrity: sha512-y2FPYGXHEaSodc/ZIjELbxXTz4x84fdbDBELcWLBoPNJEy3z4P5bJDrUn5rP8VbIFcaJ9HwUmQP54PFemF4ReQ==, + integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==, } - engines: { node: ">= 10" } - cpu: [x64] - os: [win32] - requiresBuild: true dev: false - optional: true - /@node-rs/argon2@1.5.2: + /@node-rs/argon2-android-arm-eabi@1.7.2: resolution: { - integrity: sha512-qq7wOSsdP2b4rXEapWNmsCjpaTGZWtp9kZmri98GYCDZqN8UJUG5zSue4XtYWWJMWKJVE/hkaIwk+BgN1ZUn0Q==, + integrity: sha512-WhW84XOzdR4AOGc4BJvIg5lCRVBL0pXp/PPCe8QCyWw493p7VdNCdYpr2xdtjS/0zImmY85HNB/6zpzjLRTT/A==, } engines: { node: ">= 10" } - optionalDependencies: - "@node-rs/argon2-android-arm-eabi": 1.5.2 - "@node-rs/argon2-android-arm64": 1.5.2 - "@node-rs/argon2-darwin-arm64": 1.5.2 - "@node-rs/argon2-darwin-x64": 1.5.2 - "@node-rs/argon2-freebsd-x64": 1.5.2 - "@node-rs/argon2-linux-arm-gnueabihf": 1.5.2 - "@node-rs/argon2-linux-arm64-gnu": 1.5.2 - "@node-rs/argon2-linux-arm64-musl": 1.5.2 - "@node-rs/argon2-linux-x64-gnu": 1.5.2 - "@node-rs/argon2-linux-x64-musl": 1.5.2 - "@node-rs/argon2-win32-arm64-msvc": 1.5.2 - "@node-rs/argon2-win32-ia32-msvc": 1.5.2 - "@node-rs/argon2-win32-x64-msvc": 1.5.2 + cpu: [arm] + os: [android] + requiresBuild: true dev: false + optional: true - /@node-rs/argon2@1.6.1: + /@node-rs/argon2-android-arm64@1.7.2: resolution: { - integrity: sha512-5vYE6PXnwpNEdlalC+0ygvZrHS5++43QsxHM3v+SfbhZL8utoHjkiN8VugKIpi4DPtCr+PMmQ24qZX8E8UK57Q==, + integrity: sha512-CdtayHSMIyDuVhSYFirwA757c4foQuyTjpysgFJLHweP9C7uDiBf9WBYij+UyabpaCadJ0wPyK6Vakinvlk4/g==, } engines: { node: ">= 10" } - optionalDependencies: - "@node-rs/argon2-android-arm-eabi": 1.6.1 - "@node-rs/argon2-android-arm64": 1.6.1 - "@node-rs/argon2-darwin-arm64": 1.6.1 - "@node-rs/argon2-darwin-x64": 1.6.1 - "@node-rs/argon2-freebsd-x64": 1.6.1 - "@node-rs/argon2-linux-arm-gnueabihf": 1.6.1 - "@node-rs/argon2-linux-arm64-gnu": 1.6.1 - "@node-rs/argon2-linux-arm64-musl": 1.6.1 - "@node-rs/argon2-linux-x64-gnu": 1.6.1 - "@node-rs/argon2-linux-x64-musl": 1.6.1 - "@node-rs/argon2-wasm32-wasi": 1.6.1 - "@node-rs/argon2-win32-arm64-msvc": 1.6.1 - "@node-rs/argon2-win32-ia32-msvc": 1.6.1 - "@node-rs/argon2-win32-x64-msvc": 1.6.1 + cpu: [arm64] + os: [android] + requiresBuild: true dev: false + optional: true - /@node-rs/bcrypt-android-arm-eabi@1.7.3: + /@node-rs/argon2-darwin-arm64@1.7.2: resolution: { - integrity: sha512-l53RuBqnqNvBN2jx09Ws6jpLmuQdSDx10n0GeaTfwh1svxsC8bPpVmxkfBExsT2Tu7KF38gTnPZvwsxysZQyPQ==, + integrity: sha512-hUOhtgYHTEyzX5sgMZVdXunONOus2HWpWydF5D/RYJ1mZ76FXRnFpQE40DqbzisdPIraKdn40m7JqkPP7wqdyg==, } engines: { node: ">= 10" } - cpu: [arm] - os: [android] + cpu: [arm64] + os: [darwin] requiresBuild: true dev: false optional: true - /@node-rs/bcrypt-android-arm-eabi@1.8.1: + /@node-rs/argon2-darwin-x64@1.7.2: resolution: { - integrity: sha512-v+FgdokyvPAawpSVuj7x8B/lOPQj86ToqeSTCqBNMdQIQngDL6h8fxYPv8kBrY6kqAd+nFhp3rjaWav0fYB+PQ==, + integrity: sha512-lfs5HX+t542yUfcv6Aa/NeGD1nUCwyQNgnPEGcik71Ow6V13hkR1bHgmT1u3CHN4fBts0gW+DQEDsq1xlVgkvw==, } engines: { node: ">= 10" } - cpu: [arm] - os: [android] + cpu: [x64] + os: [darwin] requiresBuild: true dev: false optional: true - /@node-rs/bcrypt-android-arm64@1.7.3: + /@node-rs/argon2-freebsd-x64@1.7.2: resolution: { - integrity: sha512-TZpm4VbiViqDMvusrcYzLr1b1M5FDF0cDNiTUciLeBSsKtU5lNdEZGAU7gvCnrKoUWpGuOblHU7613zuB7SiNQ==, + integrity: sha512-ROoF+4VaCBJUjddrTN1hjuqSl89ppRcjVXJscSPJjWzTlbzFmGGovJvIzUBmCr/Oq3yM1zKHj6MP9oRD5cB+/g==, } engines: { node: ">= 10" } - cpu: [arm64] - os: [android] + cpu: [x64] + os: [freebsd] requiresBuild: true dev: false optional: true - /@node-rs/bcrypt-android-arm64@1.8.1: + /@node-rs/argon2-linux-arm-gnueabihf@1.7.2: resolution: { - integrity: sha512-XT8NUEakx/SHTq/Sczd8wmLRRt3vTn1qeSpfl9ZVU4p5StcrWILn2zKAD3/G6NJMw7jov3ob4fw638SVP1zQ1g==, + integrity: sha512-CBSB8KPI8LS74Bcz3dYaa2/khULutz4vSDvFWUERlSLX+mPdDhoZi6UPuUPPF9e01w8AbiK1YCqlLUTm3tIMfw==, } engines: { node: ">= 10" } - cpu: [arm64] - os: [android] + cpu: [arm] + os: [linux] requiresBuild: true dev: false optional: true - /@node-rs/bcrypt-darwin-arm64@1.7.3: + /@node-rs/argon2-linux-arm64-gnu@1.7.2: resolution: { - integrity: sha512-SiUuAabynVsmixZMjh5xrn8w47EnV0HzbW9st4DPoVhn/wzdUcksIXDY75aoQG2EIzKLN8IGb+CIVnPGmRyhxw==, + integrity: sha512-6LBTug6ZiWFakP3X3Nqs7ZTM03gmcSWX4YvEn20HhhQE5NDrsrw3zNqGj0cJiNzKKIMSDDuj7uGy+ITEfNo4CA==, } engines: { node: ">= 10" } cpu: [arm64] - os: [darwin] + os: [linux] requiresBuild: true dev: false optional: true - /@node-rs/bcrypt-darwin-arm64@1.8.1: + /@node-rs/argon2-linux-arm64-musl@1.7.2: resolution: { - integrity: sha512-FX7C9Cd1B1mrtzDO+388cx3Pw8O2/yIYL61XcINZwKu5XE+7cEA7+F2ad9LS8FFbYE9/HOrVR5R5oLpOTzrEVA==, + integrity: sha512-KjhQ+ZPne29t9VRVeIif7JdKwQba+tM6CBNYBoJB1iON0CUKeqSQtZcHuTj9gkf2SNRG5bsU4ABcfxd0OKsKHg==, } engines: { node: ">= 10" } cpu: [arm64] - os: [darwin] + os: [linux] requiresBuild: true dev: false optional: true - /@node-rs/bcrypt-darwin-x64@1.7.3: + /@node-rs/argon2-linux-x64-gnu@1.7.2: resolution: { - integrity: sha512-R+81Z0eX4hZPvCXY5Z6l0l+JrTU3WcSYGHP0QYV9uwdaafOz6EhrCXUzZ02AIcAbNoVR8eucYVruq9PiasXoVw==, + integrity: sha512-BQvp+iLtKqomHz4q5t1aKoni9osgvUDU5sZtHAlFm5dRTlGHnympcQVATRE5GHyH9C6MIM9W7P1kqEeCLGPolQ==, } engines: { node: ">= 10" } cpu: [x64] - os: [darwin] + os: [linux] requiresBuild: true dev: false optional: true - /@node-rs/bcrypt-darwin-x64@1.8.1: + /@node-rs/argon2-linux-x64-musl@1.7.2: resolution: { - integrity: sha512-vgDa+6EcdjqJCXZz9IB6sZvNnKxrnUH8B4LlL2Wb6YyP/bXDzax3VI5XizTH9v0N7Q3zQ89ZjQCa7+NhfOLRxQ==, + integrity: sha512-yXJudpBZQ98g+lWaHn9EzZ5KsAyqRdlpub/K+5NP7gHehb8wzBRIFAejIHAG0fvzQEEc86VOnV2koWIVZxWAvw==, } engines: { node: ">= 10" } cpu: [x64] - os: [darwin] + os: [linux] requiresBuild: true dev: false optional: true - /@node-rs/bcrypt-freebsd-x64@1.7.3: + /@node-rs/argon2-wasm32-wasi@1.7.2: resolution: { - integrity: sha512-0pItU/5K3e83JjcJj9fZv+78txUoZ3hHCT7n/UMdu9mkpUzhX/rqb4jmQpJpD+UQoR76xp3qDo5RMgQBffBVNg==, + integrity: sha512-diXlVjJZY2GIV8ZDwUqXPhacXsFR0klGSv5D9f+XidwWXK4udtzDhkM/7N/Mb7h1HAWaxZ6IN9spYFjvWH1wqg==, } - engines: { node: ">= 10" } - cpu: [x64] - os: [freebsd] + engines: { node: ">=14.0.0" } + cpu: [wasm32] requiresBuild: true + dependencies: + "@napi-rs/wasm-runtime": 0.1.1 dev: false optional: true - /@node-rs/bcrypt-freebsd-x64@1.8.1: + /@node-rs/argon2-win32-arm64-msvc@1.7.2: resolution: { - integrity: sha512-rNZS5aFaYJOgskKISXmc/JogmDzZIslbxXXDFehpNW29N4ABsM6WpXZutAnNLOjhW66fZ2My2m5PXjP7oE6qVQ==, + integrity: sha512-dhIBrY04P9nbmwzBpgERQDmmSu4YBZyeEE32t4TikMz5rQ07iaVC+JpGmtCBZoDIsLDHGC8cikENd3YEqpqIcA==, } engines: { node: ">= 10" } - cpu: [x64] - os: [freebsd] + cpu: [arm64] + os: [win32] requiresBuild: true dev: false optional: true - /@node-rs/bcrypt-linux-arm-gnueabihf@1.7.3: + /@node-rs/argon2-win32-ia32-msvc@1.7.2: resolution: { - integrity: sha512-HTSybWUjNe8rWuXkTkMeFDiQNHc6VioRcgv6AeHZphIxiT6dFbnhXNkfz4Hr0zxvyPhZ3NrYjT2AmPVFT6VW3Q==, + integrity: sha512-o1tfqr8gyALCzuxBoQfvhxkeYMaw/0H8Gmt7klTYyEIBvEFu7SD5qytXO9Px7t5420nZL/Wy5cflg3IB1s57Pg==, } engines: { node: ">= 10" } - cpu: [arm] - os: [linux] + cpu: [ia32] + os: [win32] requiresBuild: true dev: false optional: true - /@node-rs/bcrypt-linux-arm-gnueabihf@1.8.1: + /@node-rs/argon2-win32-x64-msvc@1.7.2: resolution: { - integrity: sha512-l4xmlBgenRzVVrfJZko7MW/0z0oWSZ8oiuYdKs21ptGR6TzYFDgvKlHUBo4yN60bEGZxlUEYMiESi8ddng/HXA==, + integrity: sha512-v0h53XUc7hNgWiWi0qcMcHvj9/kwuItI9NwLK4C+gtzT3UB0cedhfIL8HFMKThMXasy41ZdbpCF2Bi0kJoLNEg==, } engines: { node: ">= 10" } - cpu: [arm] - os: [linux] + cpu: [x64] + os: [win32] requiresBuild: true dev: false optional: true - /@node-rs/bcrypt-linux-arm64-gnu@1.7.3: + /@node-rs/argon2@1.7.2: resolution: { - integrity: sha512-rWep6Y+v/c4bZHaM8LmSsrMwMmDR9wG4/q+3Z9VzR8xdnt5VCbuQdYWpf3sgGRGjTRdTBAdSK8x1reOjqsJ3Jg==, + integrity: sha512-+H6pc3M1vIX9YnG59YW7prHhhpv19P8YyxlXHnnFzTimf2q+kKDF7mGWbhvN9STqIY+P70Patn0Q6qb6Ib5/4g==, } engines: { node: ">= 10" } - cpu: [arm64] - os: [linux] - requiresBuild: true + optionalDependencies: + "@node-rs/argon2-android-arm-eabi": 1.7.2 + "@node-rs/argon2-android-arm64": 1.7.2 + "@node-rs/argon2-darwin-arm64": 1.7.2 + "@node-rs/argon2-darwin-x64": 1.7.2 + "@node-rs/argon2-freebsd-x64": 1.7.2 + "@node-rs/argon2-linux-arm-gnueabihf": 1.7.2 + "@node-rs/argon2-linux-arm64-gnu": 1.7.2 + "@node-rs/argon2-linux-arm64-musl": 1.7.2 + "@node-rs/argon2-linux-x64-gnu": 1.7.2 + "@node-rs/argon2-linux-x64-musl": 1.7.2 + "@node-rs/argon2-wasm32-wasi": 1.7.2 + "@node-rs/argon2-win32-arm64-msvc": 1.7.2 + "@node-rs/argon2-win32-ia32-msvc": 1.7.2 + "@node-rs/argon2-win32-x64-msvc": 1.7.2 dev: false - optional: true - /@node-rs/bcrypt-linux-arm64-gnu@1.8.1: + /@node-rs/bcrypt-android-arm-eabi@1.9.2: resolution: { - integrity: sha512-WiZLmOSyxb1T2w8nMXciWfkYCCOzl+VG1JdhvQ0w9/MqRoTU1VasZ7nsMZfzsJW/gfG/W3ihCIoI0RZBZ1QGJA==, + integrity: sha512-er/Q2khwpan9pczvTTqY/DJE4UU65u31xd0NkZlHUTKyB7djRhWfzoGexGx2GN+k831/RR3U8kKE/8QUHeO3hQ==, } engines: { node: ">= 10" } - cpu: [arm64] - os: [linux] + cpu: [arm] + os: [android] requiresBuild: true dev: false optional: true - /@node-rs/bcrypt-linux-arm64-musl@1.7.3: + /@node-rs/bcrypt-android-arm64@1.9.2: resolution: { - integrity: sha512-TyWEKhxr+yfGcMKzVV/ARZw+Hrky2yl91bo0XYU2ZW6I6LDC0emNsXugdWjwz8ADI4OWhhrOjXD8GCilxiB2Rg==, + integrity: sha512-OUYatOEG5vbLbF73q2TC8UqrDO81zUQxnaFD/OAB1hcm6J+ur0zJ8E53c35/DIqkTp7JarPMraC4rouJ2ugN4w==, } engines: { node: ">= 10" } cpu: [arm64] - os: [linux] + os: [android] requiresBuild: true dev: false optional: true - /@node-rs/bcrypt-linux-arm64-musl@1.8.1: + /@node-rs/bcrypt-darwin-arm64@1.9.2: resolution: { - integrity: sha512-2QhQQCeK/7sTPvCgEDvecmgv9zOeQw7sv8VYpx/eoTp+7Nc/w8WjwCiM3PFWPriPPWVcKV0FO81kNjlCap9zHg==, + integrity: sha512-svJKsGbzMAxOB5oluOYneN4YkKUy26WSMgm3KOIhgoX30IeMilj+2jFN/5qrI0oDZ0Iczb3XyL5DuZFtEkdP8A==, } engines: { node: ">= 10" } cpu: [arm64] - os: [linux] + os: [darwin] requiresBuild: true dev: false optional: true - /@node-rs/bcrypt-linux-x64-gnu@1.7.3: + /@node-rs/bcrypt-darwin-x64@1.9.2: resolution: { - integrity: sha512-PofxM1Qg7tZKj1oP0I7tBTSSLr8Xc2uxx+P3pBCPmYzaBwWqGteNHJlF7n2q5xiH7YOlguH4w5CmcEjsiA3K4A==, + integrity: sha512-9OrySjBi/rWix8NZWD/TrNbNcwMY0pAiMHdL09aJnJ07uPih83GGh1pq4UHCYFCMy7iTX8swOmDlGBUImkOZbg==, } engines: { node: ">= 10" } cpu: [x64] - os: [linux] + os: [darwin] requiresBuild: true dev: false optional: true - /@node-rs/bcrypt-linux-x64-gnu@1.8.1: + /@node-rs/bcrypt-freebsd-x64@1.9.2: resolution: { - integrity: sha512-DNbhjS5HxiSBLEvlPQsFlt1peO0LyDkHNI39Xw8q6ADU0pgad36PIA0bHsu7shWWzBu0l4OHck9sU9eRLvHSTA==, + integrity: sha512-/djXV71RO6g5L1mI2pVvmp3x3pH7G4uKI3ODG1JBIXoz334oOcCMh40sB0uq0ljP8WEadker01p4T1rJE98fpg==, } engines: { node: ">= 10" } cpu: [x64] - os: [linux] + os: [freebsd] requiresBuild: true dev: false optional: true - /@node-rs/bcrypt-linux-x64-musl@1.7.3: + /@node-rs/bcrypt-linux-arm-gnueabihf@1.9.2: resolution: { - integrity: sha512-D5V6/dDVKP8S/ieDBLGhTn4oTo3upbrpWInynbhOMjJvPiIxVG1PiI3MXkWBtG9qtfleDk7gUkEKtAOxlIxDTQ==, + integrity: sha512-F7wP950OTAooxEleUN4I2hqryGZK7hi1cSgRF13Wvbc597RFux35KiSxIXUA3mNt2DE7lV2PeceEtCOScaThWQ==, } engines: { node: ">= 10" } - cpu: [x64] + cpu: [arm] os: [linux] requiresBuild: true dev: false optional: true - /@node-rs/bcrypt-linux-x64-musl@1.8.1: + /@node-rs/bcrypt-linux-arm64-gnu@1.9.2: resolution: { - integrity: sha512-KUXmJPfe7XossL41tSDhkUma9WHFWDGINhUFBBRBHIJ+WL0MMkkO4N47LZLniAkj8EH1ZFxMugVJSZfPjAzQQQ==, + integrity: sha512-MehG+yQ0TgKMgKR1rO4hdvHkVsTM91Cof8qI9EJlS5+7+QSwfFA5O0zGwCkISD7bsyauJ5uJgcByGjpEobAHOg==, } engines: { node: ">= 10" } - cpu: [x64] + cpu: [arm64] os: [linux] requiresBuild: true dev: false optional: true - /@node-rs/bcrypt-wasm32-wasi@1.8.1: + /@node-rs/bcrypt-linux-arm64-musl@1.9.2: resolution: { - integrity: sha512-6sVRrMvrHDRoFeFHALdRcUmZWVU74zTuXv7DakOD2/sTvhFlgyDyimWGjhzOp9CN+jBjLkRUGUReUKqvsAJ+Ww==, + integrity: sha512-PRZTAJjOwKEGsIhmBvfNh81So+wGl4QyCFAt23j+KwBujLStjC0N3YaqtTlWVKG9tcriPtmMYiAQtXWIyIgg/w==, } - engines: { node: ">=14.0.0" } - cpu: [wasm32] + engines: { node: ">= 10" } + cpu: [arm64] + os: [linux] requiresBuild: true - dependencies: - "@emnapi/core": 0.45.0 - "@emnapi/runtime": 0.45.0 dev: false optional: true - /@node-rs/bcrypt-win32-arm64-msvc@1.7.3: + /@node-rs/bcrypt-linux-x64-gnu@1.9.2: resolution: { - integrity: sha512-b4gH2Yj5R4TwULrfMHd1Qqr+MrnFjVRUAJujDKPqi+PppSqezW8QF6DRSOL4GjnBmz5JEd64wxgeidvy7dsbGw==, + integrity: sha512-5WfGO+O1m7nJ55WZ8XDq+ItA98Z4O7sNWsR+1nIj9YGT+Tx5zkQ2RBhpK6oCWZMluuZ0eKQ0FDmyP6K+2NDRIA==, } engines: { node: ">= 10" } - cpu: [arm64] - os: [win32] + cpu: [x64] + os: [linux] requiresBuild: true dev: false optional: true - /@node-rs/bcrypt-win32-arm64-msvc@1.8.1: + /@node-rs/bcrypt-linux-x64-musl@1.9.2: resolution: { - integrity: sha512-nkZF5JKuADGr7/2YOTLndLw7a8thTgOT5b0ODRxlNzFeCBs1NUJ6wgjnyPldYhfTWjG6Z4KMAXfnQv4R/HJzmw==, + integrity: sha512-VjCn0388p6PMCVUYHgYmHZrKNc7WwNJRr2WLJsHbQRGDOKbpNL6YolCjQxUchcSPDhzwrq1cIdy4j0fpoXEsdw==, } engines: { node: ">= 10" } - cpu: [arm64] - os: [win32] + cpu: [x64] + os: [linux] requiresBuild: true dev: false optional: true - /@node-rs/bcrypt-win32-ia32-msvc@1.7.3: + /@node-rs/bcrypt-wasm32-wasi@1.9.2: resolution: { - integrity: sha512-E91ro+ybI0RhNc89aGaZQGll0YhPoHr8JacoWrNKwhg9zwNOYeuO0tokdMZdm6nF0/8obll0Mq7wO9AXO9iffw==, + integrity: sha512-P06aHfMzm9makwU+nM7WA65yQnS1xuqJ8l/6I/LvXjnl+lfB3DtJ2B0CSLtjnUGpUgcHbWl5gEbNnTPxSAirjQ==, } - engines: { node: ">= 10" } - cpu: [ia32] - os: [win32] + engines: { node: ">=14.0.0" } + cpu: [wasm32] requiresBuild: true + dependencies: + "@napi-rs/wasm-runtime": 0.1.1 dev: false optional: true - /@node-rs/bcrypt-win32-ia32-msvc@1.8.1: + /@node-rs/bcrypt-win32-arm64-msvc@1.9.2: resolution: { - integrity: sha512-HySULhQOZygQHKEP+/ThxNyzej+2zfypMzNkq/7/bXlZ5C0e5V9qjcmxgVAue3IUmWTjftR/18zKG8Y3utecDQ==, + integrity: sha512-Iyo/Q5/eNw27VRd3mLBgh1b9b5fnT3QHTVwxv3Siv/MRAIfJXH/cTOe18qSwYQzNh0ZioW4yemFPYCWSZi7szA==, } engines: { node: ">= 10" } - cpu: [ia32] + cpu: [arm64] os: [win32] requiresBuild: true dev: false optional: true - /@node-rs/bcrypt-win32-x64-msvc@1.7.3: + /@node-rs/bcrypt-win32-ia32-msvc@1.9.2: resolution: { - integrity: sha512-LO/p9yjPODj/pQvPnowBuwpDdqiyUXQbqL1xb1RSP3NoyCFAGmjL5h0plSQrhLh8hskQiozBRXNaQurtsM7o0Q==, + integrity: sha512-6LHWMaPylyyHoS5863YpxAACVB8DWCxro5W6pQ4h8WKSgHpJp8Um9jphTdN0A2w45HZjUnfcFuiFFC+TbftjCw==, } engines: { node: ">= 10" } - cpu: [x64] + cpu: [ia32] os: [win32] requiresBuild: true dev: false optional: true - /@node-rs/bcrypt-win32-x64-msvc@1.8.1: + /@node-rs/bcrypt-win32-x64-msvc@1.9.2: resolution: { - integrity: sha512-Ii6aiLCYRg43EjVXyNrA+QBYMRF4vhgSUe64p9aBdahtlvmNy0bw2IX4T8sYGrQj4lDTLWi5xK44izh+0HbjAQ==, + integrity: sha512-vZ9T1MOaYkLO9FTyl28YX0SYJneiYTKNFgM8PUv8nas8xrD+7OzokA0fEtlNp6413T7IKSD/iG9qi8nTWsiyGg==, } engines: { node: ">= 10" } cpu: [x64] @@ -4785,49 +2188,27 @@ packages: dev: false optional: true - /@node-rs/bcrypt@1.7.3: - resolution: - { - integrity: sha512-BF6u9CBPUiyk1zU+5iwikezf+xM4MFSu5cmrrg/PLKffGgIM13ZsY6DHftcTraETB04ryasjM/5IejotH+sO5Q==, - } - engines: { node: ">= 10" } - optionalDependencies: - "@node-rs/bcrypt-android-arm-eabi": 1.7.3 - "@node-rs/bcrypt-android-arm64": 1.7.3 - "@node-rs/bcrypt-darwin-arm64": 1.7.3 - "@node-rs/bcrypt-darwin-x64": 1.7.3 - "@node-rs/bcrypt-freebsd-x64": 1.7.3 - "@node-rs/bcrypt-linux-arm-gnueabihf": 1.7.3 - "@node-rs/bcrypt-linux-arm64-gnu": 1.7.3 - "@node-rs/bcrypt-linux-arm64-musl": 1.7.3 - "@node-rs/bcrypt-linux-x64-gnu": 1.7.3 - "@node-rs/bcrypt-linux-x64-musl": 1.7.3 - "@node-rs/bcrypt-win32-arm64-msvc": 1.7.3 - "@node-rs/bcrypt-win32-ia32-msvc": 1.7.3 - "@node-rs/bcrypt-win32-x64-msvc": 1.7.3 - dev: false - - /@node-rs/bcrypt@1.8.1: + /@node-rs/bcrypt@1.9.2: resolution: { - integrity: sha512-MmVvL64XIFk/I8EcViMUiO9XzRVCGhuaHGJdek5XV3XhaWj1YuuycaF8TEUlycHs7n+NJcbS2dNt2u8r54PR8Q==, + integrity: sha512-FKUo9iCSIti+ldwoOlY1ztyIFhZxEgT7jZ/UCt/9bg1rLmNdbQQD2JKIMImDCqmTWuLPY4ZF4Q5MyOMIfDCd8Q==, } engines: { node: ">= 10" } optionalDependencies: - "@node-rs/bcrypt-android-arm-eabi": 1.8.1 - "@node-rs/bcrypt-android-arm64": 1.8.1 - "@node-rs/bcrypt-darwin-arm64": 1.8.1 - "@node-rs/bcrypt-darwin-x64": 1.8.1 - "@node-rs/bcrypt-freebsd-x64": 1.8.1 - "@node-rs/bcrypt-linux-arm-gnueabihf": 1.8.1 - "@node-rs/bcrypt-linux-arm64-gnu": 1.8.1 - "@node-rs/bcrypt-linux-arm64-musl": 1.8.1 - "@node-rs/bcrypt-linux-x64-gnu": 1.8.1 - "@node-rs/bcrypt-linux-x64-musl": 1.8.1 - "@node-rs/bcrypt-wasm32-wasi": 1.8.1 - "@node-rs/bcrypt-win32-arm64-msvc": 1.8.1 - "@node-rs/bcrypt-win32-ia32-msvc": 1.8.1 - "@node-rs/bcrypt-win32-x64-msvc": 1.8.1 + "@node-rs/bcrypt-android-arm-eabi": 1.9.2 + "@node-rs/bcrypt-android-arm64": 1.9.2 + "@node-rs/bcrypt-darwin-arm64": 1.9.2 + "@node-rs/bcrypt-darwin-x64": 1.9.2 + "@node-rs/bcrypt-freebsd-x64": 1.9.2 + "@node-rs/bcrypt-linux-arm-gnueabihf": 1.9.2 + "@node-rs/bcrypt-linux-arm64-gnu": 1.9.2 + "@node-rs/bcrypt-linux-arm64-musl": 1.9.2 + "@node-rs/bcrypt-linux-x64-gnu": 1.9.2 + "@node-rs/bcrypt-linux-x64-musl": 1.9.2 + "@node-rs/bcrypt-wasm32-wasi": 1.9.2 + "@node-rs/bcrypt-win32-arm64-msvc": 1.9.2 + "@node-rs/bcrypt-win32-ia32-msvc": 1.9.2 + "@node-rs/bcrypt-win32-x64-msvc": 1.9.2 dev: false /@nodelib/fs.scandir@2.1.5: @@ -4857,74 +2238,28 @@ packages: "@nodelib/fs.scandir": 2.1.5 fastq: 1.16.0 - /@npmcli/fs@1.1.1: - resolution: - { - integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==, - } - dependencies: - "@gar/promisify": 1.1.3 - semver: 7.5.4 - dev: false - - /@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 - - /@pkgjs/parseargs@0.11.0: - resolution: - { - integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, - } - engines: { node: ">=14" } - requiresBuild: true - dev: false - optional: true - - /@popperjs/core@2.11.8: - resolution: - { - integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==, - } - dev: false - - /@react-native/normalize-color@2.1.0: - resolution: - { - integrity: sha512-Z1jQI2NpdFJCVgpY+8Dq/Bt3d+YUi1928Q+/CZm/oh66fzM0RUl54vvuXlPJKybH4pdCZey1eDTPaLHkMPNgWA==, - } - dev: false - - /@scalar/api-client@0.8.6(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.5): + /@scalar/api-client@0.9.2(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15): resolution: { - integrity: sha512-qAlb0nqOnhqsrmEL8Cbjdi/TPGSyyXTmoVLMV73DqnAMe+yC4PvbEkJjIN0zQLV2jTtcG7O9LQeqo2PgRIgrDQ==, + integrity: sha512-yr13wcmHkyZsL264G5EMtRd7TDsF9sKTc+YA+gZndva2d0Fc0boYfWlpE6/QjJqd8gM9toysJh92zSPUlxTZTw==, } - engines: { node: ">=20" } + engines: { node: ">=18" } peerDependencies: vue: ^3.3.0 dependencies: - "@headlessui/vue": 1.7.16(vue@3.4.5) - "@scalar/themes": 0.5.1(vue@3.4.5) - "@scalar/use-codemirror": 0.7.16(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.5) - "@scalar/use-keyboard-event": 0.5.6(vue@3.4.5) - "@scalar/use-modal": 0.2.1(@headlessui/vue@1.7.16)(vue@3.4.5) - "@vueuse/core": 10.7.1(vue@3.4.5) - axios: 1.6.3 + "@headlessui/vue": 1.7.17(vue@3.4.15) + "@scalar/themes": 0.5.4(vue@3.4.15) + "@scalar/use-codemirror": 0.7.19(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15) + "@scalar/use-keyboard-event": 0.5.7(vue@3.4.15) + "@scalar/use-modal": 0.2.3(@headlessui/vue@1.7.17)(vue@3.4.15) + "@vueuse/core": 10.7.2(vue@3.4.15) + axios: 1.6.5 content-type: 1.0.5 javascript-time-ago: 2.5.9 nanoid: 5.0.4 pretty-bytes: 6.1.1 pretty-ms: 8.0.0 - vue: 3.4.5(typescript@5.3.3) + vue: 3.4.15(typescript@5.3.3) transitivePeerDependencies: - "@codemirror/lang-html" - "@codemirror/lang-java" @@ -4944,41 +2279,41 @@ packages: - debug dev: false - /@scalar/api-reference@1.12.7(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(nanoid@5.0.4)(postcss@8.4.32)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.5): + /@scalar/api-reference@1.13.12(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(nanoid@5.0.4)(postcss@8.4.33)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15): resolution: { - integrity: sha512-Ok00vJx8ko9UZ0eCE2HFUtGd/GONJhYF7Nn5jp7XmxzLb+d8wywfwHm9Vkp3d/ieCkc5ORNHTf54+g/6HPwG8w==, + integrity: sha512-oUD9iVMqIR+SFmMPjDXoAlzqouRsV3dT8nnriQz1lMteI6deSv2/b0STJhmoBO9Sddw4JUtjufNcEmTCT1UO1Q==, } - engines: { node: ">=20" } + engines: { node: ">=18" } peerDependencies: unified: ^11.0.0 vue: ^3.3.0 dependencies: - "@floating-ui/vue": 1.0.2(vue@3.4.5) - "@headlessui/vue": 1.7.16(vue@3.4.5) - "@scalar/api-client": 0.8.6(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.5) - "@scalar/components": 0.2.0(typescript@5.3.3) - "@scalar/snippetz": 0.1.4 - "@scalar/swagger-editor": 0.9.2(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/view@6.23.0)(@headlessui/vue@1.7.16)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.5) - "@scalar/swagger-parser": 0.5.13(openapi-types@12.1.3) - "@scalar/themes": 0.5.1(vue@3.4.5) - "@scalar/use-clipboard": 0.5.11(@scalar/use-toasts@0.5.11)(nanoid@5.0.4) - "@scalar/use-codemirror": 0.7.16(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.5) - "@scalar/use-keyboard-event": 0.5.6(vue@3.4.5) - "@scalar/use-modal": 0.2.1(@headlessui/vue@1.7.16)(vue@3.4.5) - "@scalar/use-toasts": 0.5.11(nanoid@5.0.4)(vue@3.4.5) - "@scalar/use-tooltip": 0.5.7(vue@3.4.5) - "@unhead/schema": 1.8.9 + "@floating-ui/vue": 1.0.4(vue@3.4.15) + "@headlessui/vue": 1.7.17(vue@3.4.15) + "@scalar/api-client": 0.9.2(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15) + "@scalar/components": 0.2.2(typescript@5.3.3) + "@scalar/snippetz": 0.1.5 + "@scalar/swagger-editor": 0.9.8(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/view@6.23.0)(@headlessui/vue@1.7.17)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15) + "@scalar/swagger-parser": 0.5.15(openapi-types@12.1.3) + "@scalar/themes": 0.5.4(vue@3.4.15) + "@scalar/use-clipboard": 0.5.13(@scalar/use-toasts@0.5.13)(nanoid@5.0.4) + "@scalar/use-codemirror": 0.7.19(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15) + "@scalar/use-keyboard-event": 0.5.7(vue@3.4.15) + "@scalar/use-modal": 0.2.3(@headlessui/vue@1.7.17)(vue@3.4.15) + "@scalar/use-toasts": 0.5.13(nanoid@5.0.4)(vue@3.4.15) + "@scalar/use-tooltip": 0.5.8(vue@3.4.15) + "@unhead/schema": 1.8.10 "@vcarl/remark-headings": 0.1.0 - "@vueuse/core": 10.7.1(vue@3.4.5) + "@vueuse/core": 10.7.2(vue@3.4.15) "@xmldom/xmldom": 0.8.10 - axios: 1.6.3 + axios: 1.6.5 fuse.js: 6.6.2 github-slugger: 2.0.0 httpsnippet-lite: 3.0.5 js-yaml: 4.1.0 openapi-types: 12.1.3 - postcss-nested: 6.0.1(postcss@8.4.32) + postcss-nested: 6.0.1(postcss@8.4.33) rehype-external-links: 3.0.0 rehype-format: 5.0.0 rehype-highlight: 7.0.0 @@ -4987,11 +2322,11 @@ packages: rehype-stringify: 10.0.0 remark-gfm: 4.0.0 remark-parse: 11.0.0 - remark-rehype: 11.0.0 + remark-rehype: 11.1.0 remark-stringify: 11.0.0 - unhead: 1.8.9 + unhead: 1.8.10 unified: 11.0.4 - vue: 3.4.5(typescript@5.3.3) + vue: 3.4.15(typescript@5.3.3) transitivePeerDependencies: - "@codemirror/lang-html" - "@codemirror/lang-java" @@ -5015,37 +2350,37 @@ packages: - typescript dev: false - /@scalar/components@0.2.0(typescript@5.3.3): + /@scalar/components@0.2.2(typescript@5.3.3): resolution: { - integrity: sha512-jmm9C7EXDvRtuReWRtNez8d+gOy5TQhmpCh3s2QCaU9FBb/bNLl7zfTYs5wWG+0wSw9mNRKOd2YacO9lcmKcyw==, + integrity: sha512-+iMVCe6aKTwQYu4hLypH48kJVkfLZ/twB8ZBRK4lhZCpv8bUOprOMxYIkdnRtlXJITCaM6lxee5pg4aSVkCrvg==, } - engines: { node: ">=20" } + engines: { node: ">=18" } dependencies: - "@headlessui/vue": 1.7.16(vue@3.4.3) - "@vueuse/core": 10.7.1(vue@3.4.3) + "@headlessui/vue": 1.7.17(vue@3.4.15) + "@vueuse/core": 10.7.2(vue@3.4.15) "@xmldom/xmldom": 0.8.10 class-variance-authority: 0.7.0 cva: 1.0.0-beta.1(typescript@5.3.3) nanoid: 5.0.4 tailwind-merge: 2.2.0 - vue: 3.4.3(typescript@5.3.3) + vue: 3.4.15(typescript@5.3.3) transitivePeerDependencies: - "@vue/composition-api" - typescript dev: false - /@scalar/hono-api-reference@0.3.9(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(hono@3.12.0)(nanoid@5.0.4)(postcss@8.4.32)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.5): + /@scalar/hono-api-reference@0.3.23(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(hono@3.12.6)(nanoid@5.0.4)(postcss@8.4.33)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15): resolution: { - integrity: sha512-F52PqTkAmdeCP84wjlcZxcYJz06Bqgk/gTmBW60wd9hP70JjlMsP31DriIHyx3R5x1SlYvpEwf2kpH3b13IxBQ==, + integrity: sha512-HxoNEyaotK0oM5g1us7U+HqlhRfcW7+bypAbOUcXbj3Uuh5cQNVpq0wZaBTJWKDJLxl9YKrLorWw8Va47AolRQ==, } - engines: { node: ">=20" } + engines: { node: ">=18" } peerDependencies: hono: ^3.0.0 dependencies: - "@scalar/api-reference": 1.12.7(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(nanoid@5.0.4)(postcss@8.4.32)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.5) - hono: 3.12.0 + "@scalar/api-reference": 1.13.12(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(nanoid@5.0.4)(postcss@8.4.33)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15) + hono: 3.12.6 transitivePeerDependencies: - "@codemirror/lang-html" - "@codemirror/lang-java" @@ -5071,60 +2406,70 @@ packages: - vue dev: false - /@scalar/snippetz-core@0.1.2: + /@scalar/snippetz-core@0.1.3: resolution: { - integrity: sha512-w5uUD3iyM03iFW2Vo3n542BKt0BexQXYinu2WJPUVqqaEcxTMw0Qibix+n9KePjBXTys86OuhishlUz8AZdfgg==, + integrity: sha512-pHRi23VhxMddKMo/2zEnaRcc1QUTEva5H2tryuq+tER7imGWf2O09IGexiV9vY/8jzYh0QVl/2dlJUmnF9Ww5w==, } dependencies: "@types/har-format": 1.2.15 dev: false - /@scalar/snippetz-plugin-node-fetch@0.1.0: + /@scalar/snippetz-plugin-js-fetch@0.1.0: + resolution: + { + integrity: sha512-lliZSIqtbZawm+XXmMXEpCcpIQprRwJXNUxLAvryB9AGm9qTu0dIfsvjJPjiTAfRew5+sgebNQ8cEF4esMnnlQ==, + } + dependencies: + "@scalar/snippetz-core": 0.1.3 + dev: false + + /@scalar/snippetz-plugin-node-fetch@0.1.1: resolution: { - integrity: sha512-JRjg9TVhc9NbvIT/wfox7M6rkfd8fT+BoGWKNn+i3rCM1w+oKzydQu0BhG6VVdepM4CttlNH8f0QX3RJMMIAIA==, + integrity: sha512-U6kqtQi1xAME8AWgJmEVAFA/uhcJ1RUNKtyVDjupd77LQu2FEOPwqI5dPSltxvnJdYrUjLhDcfIa8EO8uO43zw==, } dependencies: - "@scalar/snippetz-core": 0.1.2 + "@scalar/snippetz-core": 0.1.3 dev: false - /@scalar/snippetz-plugin-node-undici@0.1.4: + /@scalar/snippetz-plugin-node-undici@0.1.5: resolution: { - integrity: sha512-eK/bnoeYfibssBZKcIV6+JIifQ7I4tbi1H7KIxkQoM/pPnTI0g+evs0e2G9lAnohAvAr3zLPYPaj77YoVbRsdA==, + integrity: sha512-ctOvCK3/Ta7ibuZjhV85M/gBuKURpeqgkWQHDFJubTHgUhQZudn60N5MY3ZtjoLFY7z9DCC5UenNYINveCdKJw==, } dependencies: - "@scalar/snippetz-core": 0.1.2 + "@scalar/snippetz-core": 0.1.3 dev: false - /@scalar/snippetz@0.1.4: + /@scalar/snippetz@0.1.5: resolution: { - integrity: sha512-Y+tLMhVfwef2IcGN+TZveApJwspV9QWLmg+6q0BMaQWpmWLs9mTL8N7ygD5rRFMG67yvbgVEOiNO6bOrtkkgfw==, + integrity: sha512-jHU8/KOO9vKbQFhsruflKugekgAtDm5GIAKZCYN+XtzqQ3jPGAjzkEZMXXvRDS2YPtFSzH2vzfqNMLB+q2Zupw==, } dependencies: - "@scalar/snippetz-core": 0.1.2 - "@scalar/snippetz-plugin-node-fetch": 0.1.0 - "@scalar/snippetz-plugin-node-undici": 0.1.4 + "@scalar/snippetz-core": 0.1.3 + "@scalar/snippetz-plugin-js-fetch": 0.1.0 + "@scalar/snippetz-plugin-node-fetch": 0.1.1 + "@scalar/snippetz-plugin-node-undici": 0.1.5 dev: false - /@scalar/swagger-editor@0.9.2(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/view@6.23.0)(@headlessui/vue@1.7.16)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.5): + /@scalar/swagger-editor@0.9.8(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/view@6.23.0)(@headlessui/vue@1.7.17)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15): resolution: { - integrity: sha512-h176YaLpjofDJZXG+aZM28yKweBtV/yh7lGSsK+y0FO3kKxCpXC0ONEgG0vtFBzV/tXjAXIKNBpd3mRpwDQzfA==, + integrity: sha512-VxhbqaZVwEy7Od29Kxbg6a/6AM7md/ugcD2pNCw2wUv1PcV/ru+9imJkfClI3HfUXZN/IyLDaZpaNZadCB4Rrw==, } - engines: { node: ">=20" } + engines: { node: ">=18" } peerDependencies: unified: ^11.0.0 vue: ^3.3.0 dependencies: "@codemirror/state": 6.4.0 - "@scalar/components": 0.2.0(typescript@5.3.3) - "@scalar/themes": 0.5.1(vue@3.4.5) - "@scalar/use-codemirror": 0.7.16(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.5) - "@scalar/use-modal": 0.2.1(@headlessui/vue@1.7.16)(vue@3.4.5) - "@vueuse/core": 10.7.1(vue@3.4.5) + "@scalar/components": 0.2.2(typescript@5.3.3) + "@scalar/themes": 0.5.4(vue@3.4.15) + "@scalar/use-codemirror": 0.7.19(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15) + "@scalar/use-modal": 0.2.3(@headlessui/vue@1.7.17)(vue@3.4.15) + "@vueuse/core": 10.7.2(vue@3.4.15) nanoid: 5.0.4 rehype-external-links: 3.0.0 rehype-format: 5.0.0 @@ -5134,9 +2479,9 @@ packages: rehype-stringify: 10.0.0 remark-gfm: 4.0.0 remark-parse: 11.0.0 - remark-rehype: 11.0.0 + remark-rehype: 11.1.0 unified: 11.0.4 - vue: 3.4.5(typescript@5.3.3) + vue: 3.4.15(typescript@5.3.3) transitivePeerDependencies: - "@codemirror/lang-html" - "@codemirror/lang-java" @@ -5157,12 +2502,12 @@ packages: - typescript dev: false - /@scalar/swagger-parser@0.5.13(openapi-types@12.1.3): + /@scalar/swagger-parser@0.5.15(openapi-types@12.1.3): resolution: { - integrity: sha512-rPb8/NxK/A3WOcFhJLvBJiqchgpAmkPukLW5waO2GSBDFFXX4YH3DZzk6OWzImqSI83pUuaM4xXEC5sIMdn01A==, + integrity: sha512-qQY69CiS9XkdG5RuWk/ey12qXiXLUacb7b6oXU1KNB00MKJEpfj+Fjdn+ALXBoKiUVqAfIxeB76evGdZsupwMQ==, } - engines: { node: ">=20" } + engines: { node: ">=18" } dependencies: "@apidevtools/swagger-parser": 10.1.0(openapi-types@12.1.3) js-yaml: 4.1.0 @@ -5170,38 +2515,38 @@ packages: - openapi-types dev: false - /@scalar/themes@0.5.1(vue@3.4.5): + /@scalar/themes@0.5.4(vue@3.4.15): resolution: { - integrity: sha512-iaX9H1P/KukzuzkgRlbE4QWxYRHWQajf4AGQVI9Na9KeIQ4NgpkWWsIfcDKekP6P7QrlLvFpgkLcjJf5mnnF4A==, + integrity: sha512-3tmivqGFJwmxmPygWls5W5qyQAt2Ax8tUVi/eVHb8+UYs5ADTzhNKeOu/CipKeZO9z+tfO+UO+XLhy2qb5T+dA==, } - engines: { node: ">=20" } + engines: { node: ">=18" } peerDependencies: vue: ^3.3.0 dependencies: - vue: 3.4.5(typescript@5.3.3) + vue: 3.4.15(typescript@5.3.3) dev: false - /@scalar/use-clipboard@0.5.11(@scalar/use-toasts@0.5.11)(nanoid@5.0.4): + /@scalar/use-clipboard@0.5.13(@scalar/use-toasts@0.5.13)(nanoid@5.0.4): resolution: { - integrity: sha512-uo3sVezu5uD2kcRpmmwRUxIMZfMBzl8SvE+Rgv4RX/M06y1JWL5YpuVK4Q0Zz26MlzRbLcsi8vbvGcKQabZyyQ==, + integrity: sha512-UtDu+ArEfHjHUGJzNZQdbFfP4CAPhPwJxcMAwG6KbwaRTNq4UNRS3+WoFmnVOOl8dPLVQFyMs10A2ca2HgJGcA==, } - engines: { node: ">=20" } + engines: { node: ">=18" } peerDependencies: - "@scalar/use-toasts": 0.5.11 + "@scalar/use-toasts": 0.5.13 nanoid: ^5.0.1 dependencies: - "@scalar/use-toasts": 0.5.11(nanoid@5.0.4)(vue@3.4.5) + "@scalar/use-toasts": 0.5.13(nanoid@5.0.4)(vue@3.4.15) nanoid: 5.0.4 dev: false - /@scalar/use-codemirror@0.7.16(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.5): + /@scalar/use-codemirror@0.7.19(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15): resolution: { - integrity: sha512-TQXplKCVDheuR/w7q9q0HzyQ9rJmy3P0tAFw2jPLwfAq3Q6YVpltuu3UrKzAOtxV3FcKMc7lzYZLaGY0DHcTVw==, + integrity: sha512-xS6/JsVeQ983K6B/6RJMfmgl5GNst7zPbspSPxKwRCbwV5qBZaVWMhop6HQ5mnmanJTXxeh6krRG3K8tFbsuyg==, } - engines: { node: ">=20" } + engines: { node: ">=18" } peerDependencies: "@codemirror/lang-html": ^6.0.0 "@codemirror/lang-java": ^6.0.0 @@ -5210,7 +2555,7 @@ packages: "@codemirror/lang-python": ^6.0.0 "@codemirror/language": ^6.0.0 "@codemirror/legacy-modes": ^6.0.0 - "@codemirror/state": ^6.0.0 + "@codemirror/state": ^6.4.0 "@codemirror/view": ^6.0.0 "@lezer/common": ^1.1.0 "@lezer/highlight": ^1.1.0 @@ -5223,139 +2568,133 @@ packages: "@codemirror/lang-java": 6.0.1 "@codemirror/lang-javascript": 6.2.1 "@codemirror/lang-json": 6.0.1 - "@codemirror/lang-python": 6.1.3(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0) + "@codemirror/lang-python": 6.1.3(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1) "@codemirror/language": 6.10.0 "@codemirror/legacy-modes": 6.3.3 "@codemirror/state": 6.4.0 "@codemirror/view": 6.23.0 - "@lezer/common": 1.2.0 + "@lezer/common": 1.2.1 "@lezer/highlight": 1.2.0 "@lezer/lr": 1.3.14 "@uiw/codemirror-themes": 4.21.21(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0) - codemirror: 6.0.1(@lezer/common@1.2.0) - vue: 3.4.5(typescript@5.3.3) + codemirror: 6.0.1(@lezer/common@1.2.1) + vue: 3.4.15(typescript@5.3.3) dev: false - /@scalar/use-keyboard-event@0.5.6(vue@3.4.5): + /@scalar/use-keyboard-event@0.5.7(vue@3.4.15): resolution: { - integrity: sha512-/sKl0LDr2RoTVuQIUaeeOkEbUtl2z+cqEHHF4CNenqOra/Sz/u/eexDHbMc7ZTaaIo9snMHSceLo2k9ThQUz3g==, + integrity: sha512-LSwxYVIQF0BjFVFt1cIkzz5W/9m3cLrlBgR3Qxf7YkRo1DBShcXSqgrxPMP1wvjXxQoETbzcZVgo2BYkx5R5jQ==, } - engines: { node: ">=20" } + engines: { node: ">=18" } peerDependencies: vue: ^3.3.0 dependencies: - vue: 3.4.5(typescript@5.3.3) + vue: 3.4.15(typescript@5.3.3) dev: false - /@scalar/use-modal@0.2.1(@headlessui/vue@1.7.16)(vue@3.4.5): + /@scalar/use-modal@0.2.3(@headlessui/vue@1.7.17)(vue@3.4.15): resolution: { - integrity: sha512-OAf7nIoKAbt53GGbbsDbIoAF+/RRQIjnBJhgfk4eI1ACyAOVXwVWrjJ1eYmGbv86gzEX9neb/qpwkc9kcnz1FQ==, + integrity: sha512-qCn8rNCTy7jO/7DDalsMM+m1jBfEE/Fnx3Im966uBzCdxdyLbJ8f9S2ZwmW44KP6CXbsMGsuORkvY6Z8joZvMg==, } - engines: { node: ">=20" } + engines: { node: ">=18" } peerDependencies: "@headlessui/vue": ^1.7.0 vue: ^3.3.0 dependencies: - "@headlessui/vue": 1.7.16(vue@3.4.5) - vue: 3.4.5(typescript@5.3.3) + "@headlessui/vue": 1.7.17(vue@3.4.15) + vue: 3.4.15(typescript@5.3.3) dev: false - /@scalar/use-toasts@0.5.11(nanoid@5.0.4)(vue@3.4.5): + /@scalar/use-toasts@0.5.13(nanoid@5.0.4)(vue@3.4.15): resolution: { - integrity: sha512-5uaxV+944rkrYl3mQaQn+AruBCcDjN03jODko2K618unSf3JQixIi6ptoOcXCL6QAGM4FaHtMjRjX/7LJWOtOQ==, + integrity: sha512-EiFezCmWchaYfwEDTkSv/r7x6aYOlaFcu+zpTaV/y3ppCIybLvL3WRQzQS0KMaCJJBmQecZbCqMPnRLlacPwYw==, } - engines: { node: ">=20" } + engines: { node: ">=18" } peerDependencies: nanoid: 4 - 5 vue: ^3.3.0 dependencies: nanoid: 5.0.4 - vue: 3.4.5(typescript@5.3.3) + vue: 3.4.15(typescript@5.3.3) dev: false - /@scalar/use-tooltip@0.5.7(vue@3.4.5): + /@scalar/use-tooltip@0.5.8(vue@3.4.15): resolution: { - integrity: sha512-WmTleZDjR1Yerw1GLoh9li/3d9dFDWm1Vb39xrehtXx8bGB8+IkRyg8ZCfGzEKNySbf263QAaRmZkKUMVOGdAA==, + integrity: sha512-9gCa7UGlRQVrKVy3tp5WYn/vCS1Fk0mcPlpkoffPeekS/4A01K3SpddqM76gVUNnOvDOq0EPEbVvUO1deB9oGw==, } - engines: { node: ">=20" } + engines: { node: ">=18" } peerDependencies: vue: ^3.3.0 dependencies: - tippy.js: 6.3.7 - vue: 3.4.5(typescript@5.3.3) + vue: 3.4.15(typescript@5.3.3) dev: false - /@segment/loosely-validate-event@2.0.0: + /@tanstack/virtual-core@3.0.0: resolution: { - integrity: sha512-ZMCSfztDBqwotkl848ODgVcAmN4OItEWDCkshcKz0/W6gGSQayuuCtWV/MlodFivAZD793d6UgANd6wCXUfrIw==, + integrity: sha512-SYXOBTjJb05rXa2vl55TTwO40A6wKu0R5i1qQwhJYNDIqaIGF7D0HsLw+pJAyi2OvntlEIVusx3xtbbgSUi6zg==, } - dependencies: - component-type: 1.2.2 - join-component: 1.1.0 dev: false - /@types/debug@4.1.12: + /@tanstack/vue-virtual@3.0.2(vue@3.4.15): resolution: { - integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==, + integrity: sha512-1iFpX+yZswHuf4wrA6GU9yJ/YzQ/8SacABwqghwCkcwrkZbOPLlRSdOAqZ1WQ50SftmfhZpaiZl2KmpV7cgfMQ==, } + peerDependencies: + vue: ^2.7.0 || ^3.0.0 dependencies: - "@types/ms": 0.7.34 - dev: false - - /@types/har-format@1.2.15: - resolution: - { - integrity: sha512-RpQH4rXLuvTXKR0zqHq3go0RVXYv/YVqv4TnPH95VbwUxZdQlK1EtcMvQvMpDngHbt13Csh9Z4qT9AbkiQH5BA==, - } + "@tanstack/virtual-core": 3.0.0 + vue: 3.4.15(typescript@5.3.3) dev: false - /@types/hast@2.3.9: + /@tybys/wasm-util@0.8.1: resolution: { - integrity: sha512-pTHyNlaMD/oKJmS+ZZUyFUcsZeBZpC0lmGquw98CqRVNgAdJZJeD7GoeLiT6Xbx5rU9VCjSt0RwEvDgzh4obFw==, + integrity: sha512-GSsTwyBl4pIzsxAY5wroZdyQKyhXk0d8PCRZtrSZ2WEB1cBdrp2EgGBwHOGCZtIIPun/DL3+AykCv+J6fyRH4Q==, } + requiresBuild: true dependencies: - "@types/unist": 2.0.10 + tslib: 2.6.2 dev: false + optional: true - /@types/hast@3.0.3: + /@types/debug@4.1.12: resolution: { - integrity: sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==, + integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==, } dependencies: - "@types/unist": 3.0.2 + "@types/ms": 0.7.34 dev: false - /@types/istanbul-lib-coverage@2.0.6: + /@types/har-format@1.2.15: resolution: { - integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==, + integrity: sha512-RpQH4rXLuvTXKR0zqHq3go0RVXYv/YVqv4TnPH95VbwUxZdQlK1EtcMvQvMpDngHbt13Csh9Z4qT9AbkiQH5BA==, } dev: false - /@types/istanbul-lib-report@3.0.3: + /@types/hast@2.3.9: resolution: { - integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==, + integrity: sha512-pTHyNlaMD/oKJmS+ZZUyFUcsZeBZpC0lmGquw98CqRVNgAdJZJeD7GoeLiT6Xbx5rU9VCjSt0RwEvDgzh4obFw==, } dependencies: - "@types/istanbul-lib-coverage": 2.0.6 + "@types/unist": 2.0.10 dev: false - /@types/istanbul-reports@3.0.4: + /@types/hast@3.0.3: resolution: { - integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==, + integrity: sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==, } dependencies: - "@types/istanbul-lib-report": 3.0.3 + "@types/unist": 3.0.2 dev: false /@types/json-schema@7.0.15: @@ -5390,58 +2729,33 @@ packages: } dev: false - /@types/node-fetch@2.6.10: + /@types/node-fetch@2.6.11: resolution: { - integrity: sha512-PPpPK6F9ALFTn59Ka3BaL+qGuipRfxNE8qVgkp0bVixeiR2c2/L+IVOiBdu9JhhT22sWnQEp6YyHGI2b2+CMcA==, + integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==, } dependencies: - "@types/node": 20.10.6 + "@types/node": 20.11.5 form-data: 4.0.0 dev: false - /@types/node-forge@1.3.10: + /@types/node-forge@1.3.11: resolution: { - integrity: sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw==, + integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==, } dependencies: - "@types/node": 20.10.6 + "@types/node": 20.11.5 dev: true - /@types/node@20.10.6: + /@types/node@20.11.5: resolution: { - integrity: sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw==, + integrity: sha512-g557vgQjUUfN76MZAN/dt1z3dzcUsimuysco0KeluHgrPdJXkP/XdAURgyO2W9fZWHRtRBiVKzKn8vyOAwlG+w==, } dependencies: undici-types: 5.26.5 - /@types/prop-types@15.7.11: - resolution: - { - integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==, - } - dev: false - - /@types/react@18.2.46: - resolution: - { - integrity: sha512-nNCvVBcZlvX4NU1nRRNV/mFl1nNRuTuslAJglQsq+8ldXe5Xv0Wd2f7WTE3jOxhLH2BFfiZGC6GCp+kHQbgG+w==, - } - dependencies: - "@types/prop-types": 15.7.11 - "@types/scheduler": 0.16.8 - csstype: 3.1.3 - dev: false - - /@types/scheduler@0.16.8: - resolution: - { - integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==, - } - dev: false - /@types/semver@7.5.6: resolution: { @@ -5476,29 +2790,13 @@ packages: integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==, } dependencies: - "@types/node": 20.10.6 - dev: false - - /@types/yargs-parser@21.0.3: - resolution: - { - integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==, - } - dev: false - - /@types/yargs@15.0.19: - resolution: - { - integrity: sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==, - } - dependencies: - "@types/yargs-parser": 21.0.3 + "@types/node": 20.11.5 dev: false - /@typescript-eslint/eslint-plugin@6.16.0(@typescript-eslint/parser@6.17.0)(eslint@8.56.0)(typescript@5.3.3): + /@typescript-eslint/eslint-plugin@6.19.0(@typescript-eslint/parser@6.19.0)(eslint@8.56.0)(typescript@5.3.3): resolution: { - integrity: sha512-O5f7Kv5o4dLWQtPX4ywPPa+v9G+1q1x8mz0Kr0pXUtKsevo+gIJHLkGc8RxaZWtP8RrhwhSNIWThnW42K9/0rQ==, + integrity: sha512-DUCUkQNklCQYnrBSSikjVChdc84/vMPDQSgJTHBZ64G9bA9w0Crc0rd2diujKbTdp6w2J47qkeHQLoi0rpLCdg==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -5510,11 +2808,11 @@ packages: optional: true dependencies: "@eslint-community/regexpp": 4.10.0 - "@typescript-eslint/parser": 6.17.0(eslint@8.56.0)(typescript@5.3.3) - "@typescript-eslint/scope-manager": 6.16.0 - "@typescript-eslint/type-utils": 6.16.0(eslint@8.56.0)(typescript@5.3.3) - "@typescript-eslint/utils": 6.16.0(eslint@8.56.0)(typescript@5.3.3) - "@typescript-eslint/visitor-keys": 6.16.0 + "@typescript-eslint/parser": 6.19.0(eslint@8.56.0)(typescript@5.3.3) + "@typescript-eslint/scope-manager": 6.19.0 + "@typescript-eslint/type-utils": 6.19.0(eslint@8.56.0)(typescript@5.3.3) + "@typescript-eslint/utils": 6.19.0(eslint@8.56.0)(typescript@5.3.3) + "@typescript-eslint/visitor-keys": 6.19.0 debug: 4.3.4 eslint: 8.56.0 graphemer: 1.4.0 @@ -5527,10 +2825,10 @@ packages: - supports-color dev: false - /@typescript-eslint/parser@6.17.0(eslint@8.56.0)(typescript@5.3.3): + /@typescript-eslint/parser@6.19.0(eslint@8.56.0)(typescript@5.3.3): resolution: { - integrity: sha512-C4bBaX2orvhK+LlwrY8oWGmSl4WolCfYm513gEccdWZj0CwGadbIADb0FtVEcI+WzUyjyoBj2JRP8g25E6IB8A==, + integrity: sha512-1DyBLG5SH7PYCd00QlroiW60YJ4rWMuUGa/JBV0iZuqi4l4IK3twKPq5ZkEebmGqRjXWVgsUzfd3+nZveewgow==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -5540,10 +2838,10 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/scope-manager": 6.17.0 - "@typescript-eslint/types": 6.17.0 - "@typescript-eslint/typescript-estree": 6.17.0(typescript@5.3.3) - "@typescript-eslint/visitor-keys": 6.17.0 + "@typescript-eslint/scope-manager": 6.19.0 + "@typescript-eslint/types": 6.19.0 + "@typescript-eslint/typescript-estree": 6.19.0(typescript@5.3.3) + "@typescript-eslint/visitor-keys": 6.19.0 debug: 4.3.4 eslint: 8.56.0 typescript: 5.3.3 @@ -5551,32 +2849,21 @@ packages: - supports-color dev: false - /@typescript-eslint/scope-manager@6.16.0: - resolution: - { - integrity: sha512-0N7Y9DSPdaBQ3sqSCwlrm9zJwkpOuc6HYm7LpzLAPqBL7dmzAUimr4M29dMkOP/tEwvOCC/Cxo//yOfJD3HUiw==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - dependencies: - "@typescript-eslint/types": 6.16.0 - "@typescript-eslint/visitor-keys": 6.16.0 - dev: false - - /@typescript-eslint/scope-manager@6.17.0: + /@typescript-eslint/scope-manager@6.19.0: resolution: { - integrity: sha512-RX7a8lwgOi7am0k17NUO0+ZmMOX4PpjLtLRgLmT1d3lBYdWH4ssBUbwdmc5pdRX8rXon8v9x8vaoOSpkHfcXGA==, + integrity: sha512-dO1XMhV2ehBI6QN8Ufi7I10wmUovmLU0Oru3n5LVlM2JuzB4M+dVphCPLkVpKvGij2j/pHBWuJ9piuXx+BhzxQ==, } engines: { node: ^16.0.0 || >=18.0.0 } dependencies: - "@typescript-eslint/types": 6.17.0 - "@typescript-eslint/visitor-keys": 6.17.0 + "@typescript-eslint/types": 6.19.0 + "@typescript-eslint/visitor-keys": 6.19.0 dev: false - /@typescript-eslint/type-utils@6.16.0(eslint@8.56.0)(typescript@5.3.3): + /@typescript-eslint/type-utils@6.19.0(eslint@8.56.0)(typescript@5.3.3): resolution: { - integrity: sha512-ThmrEOcARmOnoyQfYkHw/DX2SEYBalVECmoldVuH6qagKROp/jMnfXpAU/pAIWub9c4YTxga+XwgAkoA0pxfmg==, + integrity: sha512-mcvS6WSWbjiSxKCwBcXtOM5pRkPQ6kcDds/juxcy/727IQr3xMEcwr/YLHW2A2+Fp5ql6khjbKBzOyjuPqGi/w==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -5586,8 +2873,8 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/typescript-estree": 6.16.0(typescript@5.3.3) - "@typescript-eslint/utils": 6.16.0(eslint@8.56.0)(typescript@5.3.3) + "@typescript-eslint/typescript-estree": 6.19.0(typescript@5.3.3) + "@typescript-eslint/utils": 6.19.0(eslint@8.56.0)(typescript@5.3.3) debug: 4.3.4 eslint: 8.56.0 ts-api-utils: 1.0.3(typescript@5.3.3) @@ -5596,51 +2883,18 @@ packages: - supports-color dev: false - /@typescript-eslint/types@6.16.0: - resolution: - { - integrity: sha512-hvDFpLEvTJoHutVl87+MG/c5C8I6LOgEx05zExTSJDEVU7hhR3jhV8M5zuggbdFCw98+HhZWPHZeKS97kS3JoQ==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - dev: false - - /@typescript-eslint/types@6.17.0: - resolution: - { - integrity: sha512-qRKs9tvc3a4RBcL/9PXtKSehI/q8wuU9xYJxe97WFxnzH8NWWtcW3ffNS+EWg8uPvIerhjsEZ+rHtDqOCiH57A==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - dev: false - - /@typescript-eslint/typescript-estree@6.16.0(typescript@5.3.3): + /@typescript-eslint/types@6.19.0: resolution: { - integrity: sha512-VTWZuixh/vr7nih6CfrdpmFNLEnoVBF1skfjdyGnNwXOH1SLeHItGdZDHhhAIzd3ACazyY2Fg76zuzOVTaknGA==, + integrity: sha512-lFviGV/vYhOy3m8BJ/nAKoAyNhInTdXpftonhWle66XHAtT1ouBlkjL496b5H5hb8dWXHwtypTqgtb/DEa+j5A==, } engines: { node: ^16.0.0 || >=18.0.0 } - peerDependencies: - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - dependencies: - "@typescript-eslint/types": 6.16.0 - "@typescript-eslint/visitor-keys": 6.16.0 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.3 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.3.3) - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color dev: false - /@typescript-eslint/typescript-estree@6.17.0(typescript@5.3.3): + /@typescript-eslint/typescript-estree@6.19.0(typescript@5.3.3): resolution: { - integrity: sha512-gVQe+SLdNPfjlJn5VNGhlOhrXz4cajwFd5kAgWtZ9dCZf4XJf8xmgCTLIqec7aha3JwgLI2CK6GY1043FRxZwg==, + integrity: sha512-o/zefXIbbLBZ8YJ51NlkSAt2BamrK6XOmuxSR3hynMIzzyMY33KuJ9vuMdFSXW+H0tVvdF9qBPTHA91HDb4BIQ==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -5649,8 +2903,8 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/types": 6.17.0 - "@typescript-eslint/visitor-keys": 6.17.0 + "@typescript-eslint/types": 6.19.0 + "@typescript-eslint/visitor-keys": 6.19.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -5662,10 +2916,10 @@ packages: - supports-color dev: false - /@typescript-eslint/utils@6.16.0(eslint@8.56.0)(typescript@5.3.3): + /@typescript-eslint/utils@6.19.0(eslint@8.56.0)(typescript@5.3.3): resolution: { - integrity: sha512-T83QPKrBm6n//q9mv7oiSvy/Xq/7Hyw9SzSEhMHJwznEmQayfBM87+oAlkNAMEO7/MjIwKyOHgBJbxB0s7gx2A==, + integrity: sha512-QR41YXySiuN++/dC9UArYOg4X86OAYP83OWTewpVx5ct1IZhjjgTLocj7QNxGhWoTqknsgpl7L+hGygCO+sdYw==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -5674,9 +2928,9 @@ packages: "@eslint-community/eslint-utils": 4.4.0(eslint@8.56.0) "@types/json-schema": 7.0.15 "@types/semver": 7.5.6 - "@typescript-eslint/scope-manager": 6.16.0 - "@typescript-eslint/types": 6.16.0 - "@typescript-eslint/typescript-estree": 6.16.0(typescript@5.3.3) + "@typescript-eslint/scope-manager": 6.19.0 + "@typescript-eslint/types": 6.19.0 + "@typescript-eslint/typescript-estree": 6.19.0(typescript@5.3.3) eslint: 8.56.0 semver: 7.5.4 transitivePeerDependencies: @@ -5684,25 +2938,14 @@ packages: - typescript dev: false - /@typescript-eslint/visitor-keys@6.16.0: + /@typescript-eslint/visitor-keys@6.19.0: resolution: { - integrity: sha512-QSFQLruk7fhs91a/Ep/LqRdbJCZ1Rq03rqBdKT5Ky17Sz8zRLUksqIe9DW0pKtg/Z35/ztbLQ6qpOCN6rOC11A==, + integrity: sha512-hZaUCORLgubBvtGpp1JEFEazcuEdfxta9j4iUwdSAr7mEsYYAp3EAUyCZk3VEEqGj6W+AV4uWyrDGtrlawAsgQ==, } engines: { node: ^16.0.0 || >=18.0.0 } dependencies: - "@typescript-eslint/types": 6.16.0 - eslint-visitor-keys: 3.4.3 - dev: false - - /@typescript-eslint/visitor-keys@6.17.0: - resolution: - { - integrity: sha512-H6VwB/k3IuIeQOyYczyyKN8wH6ed8EwliaYHLxOIhyF0dYEIsN8+Bk3GE19qafeMKyZJJHP8+O1HiFhFLUNKSg==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - dependencies: - "@typescript-eslint/types": 6.17.0 + "@typescript-eslint/types": 6.19.0 eslint-visitor-keys: 3.4.3 dev: false @@ -5727,59 +2970,33 @@ packages: integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==, } - /@unhead/dom@1.8.9: + /@unhead/dom@1.8.10: resolution: { - integrity: sha512-qY4CUVNKEM7lEAcTz5t71QYca+NXgUY5RwhSzB6sBBzZxQTiFOeTVKC6uWXU0N+3jBUdP/zdD3iN1JIjziDlng==, + integrity: sha512-dBeDbHrBjeU+eVgMsD91TGEazb1dwLrY0x/ve01CldMCmm+WcRu++SUW7s1QX84mzGH2EgFz78o1OPn6jpV3zw==, } dependencies: - "@unhead/schema": 1.8.9 - "@unhead/shared": 1.8.9 + "@unhead/schema": 1.8.10 + "@unhead/shared": 1.8.10 dev: false - /@unhead/schema@1.8.9: + /@unhead/schema@1.8.10: resolution: { - integrity: sha512-Cumjt2uLfBMEXflvq7Nk8KNqa/JS4MlRGWkjXx/uUXJ1vUeQqeMV8o3hrnRvDDoTXr9LwPapTMUbtClN3TSBgw==, + integrity: sha512-cy8RGOPkwOVY5EmRoCgGV8AqLjy/226xBVTY54kBct02Om3hBdpB9FZa9frM910pPUXMI8PNmFgABO23O7IdJA==, } dependencies: hookable: 5.5.3 zhead: 2.2.4 dev: false - /@unhead/shared@1.8.9: - resolution: - { - integrity: sha512-0o4+CBCi9EnTKPF6cEuLacnUHUkF0u/FfiKrWnKWUiB8wTD1v3UCf5ZCrNCjuJmKHTqj6ZtZ2hIfXsqWfc+3tA==, - } - dependencies: - "@unhead/schema": 1.8.9 - dev: false - - /@urql/core@2.3.6(graphql@15.8.0): - resolution: - { - integrity: sha512-PUxhtBh7/8167HJK6WqBv6Z0piuiaZHQGYbhwpNL9aIQmLROPEdaUYkY4wh45wPQXcTpnd11l0q3Pw+TI11pdw==, - } - peerDependencies: - graphql: ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - dependencies: - "@graphql-typed-document-node/core": 3.2.0(graphql@15.8.0) - graphql: 15.8.0 - wonka: 4.0.15 - dev: false - - /@urql/exchange-retry@0.3.0(graphql@15.8.0): + /@unhead/shared@1.8.10: resolution: { - integrity: sha512-hHqer2mcdVC0eYnVNbWyi28AlGOPb2vjH3lP3/Bc8Lc8BjhMsDwFMm7WhoP5C1+cfbr/QJ6Er3H/L08wznXxfg==, + integrity: sha512-pEFryAs3EmV+ShDQx2ZBwUnt5l3RrMrXSMZ50oFf+MImKZNARVvD4+3I8fEI9wZh+Zq0JYG3UAfzo51MUP+Juw==, } - peerDependencies: - graphql: ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 dependencies: - "@urql/core": 2.3.6(graphql@15.8.0) - graphql: 15.8.0 - wonka: 4.0.15 + "@unhead/schema": 1.8.10 dev: false /@vcarl/remark-headings@0.1.0: @@ -5792,275 +3009,140 @@ packages: unist-util-visit: 4.1.2 dev: false - /@vue/compiler-core@3.4.3: - resolution: - { - integrity: sha512-u8jzgFg0EDtSrb/hG53Wwh1bAOQFtc1ZCegBpA/glyvTlgHl+tq13o1zvRfLbegYUw/E4mSTGOiCnAJ9SJ+lsg==, - } - dependencies: - "@babel/parser": 7.23.6 - "@vue/shared": 3.4.3 - entities: 4.5.0 - estree-walker: 2.0.2 - source-map-js: 1.0.2 - dev: false - - /@vue/compiler-core@3.4.5: + /@vue/compiler-core@3.4.15: resolution: { - integrity: sha512-Daka7P1z2AgKjzuueWXhwzIsKu0NkLB6vGbNVEV2iJ8GJTrzraZo/Sk4GWCMRtd/qVi3zwnk+Owbd/xSZbwHtQ==, + integrity: sha512-XcJQVOaxTKCnth1vCxEChteGuwG6wqnUHxAm1DO3gCz0+uXKaJNx8/digSz4dLALCy8n2lKq24jSUs8segoqIw==, } dependencies: "@babel/parser": 7.23.6 - "@vue/shared": 3.4.5 + "@vue/shared": 3.4.15 entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.0.2 dev: false - /@vue/compiler-dom@3.4.3: + /@vue/compiler-dom@3.4.15: resolution: { - integrity: sha512-oGF1E9/htI6JWj/lTJgr6UgxNCtNHbM6xKVreBWeZL9QhRGABRVoWGAzxmtBfSOd+w0Zi5BY0Es/tlJrN6WgEg==, + integrity: sha512-wox0aasVV74zoXyblarOM3AZQz/Z+OunYcIHe1OsGclCHt8RsRm04DObjefaI82u6XDzv+qGWZ24tIsRAIi5MQ==, } dependencies: - "@vue/compiler-core": 3.4.3 - "@vue/shared": 3.4.3 + "@vue/compiler-core": 3.4.15 + "@vue/shared": 3.4.15 dev: false - /@vue/compiler-dom@3.4.5: + /@vue/compiler-sfc@3.4.15: resolution: { - integrity: sha512-J8YlxknJVd90SXFJ4HwGANSAXsx5I0lK30sO/zvYV7s5gXf7gZR7r/1BmZ2ju7RGH1lnc6bpBc6nL61yW+PsAQ==, - } - dependencies: - "@vue/compiler-core": 3.4.5 - "@vue/shared": 3.4.5 - dev: false - - /@vue/compiler-sfc@3.4.3: - resolution: - { - integrity: sha512-NuJqb5is9I4uzv316VRUDYgIlPZCG8D+ARt5P4t5UDShIHKL25J3TGZAUryY/Aiy0DsY7srJnZL5ryB6DD63Zw==, - } - dependencies: - "@babel/parser": 7.23.6 - "@vue/compiler-core": 3.4.3 - "@vue/compiler-dom": 3.4.3 - "@vue/compiler-ssr": 3.4.3 - "@vue/shared": 3.4.3 - estree-walker: 2.0.2 - magic-string: 0.30.5 - postcss: 8.4.32 - source-map-js: 1.0.2 - dev: false - - /@vue/compiler-sfc@3.4.5: - resolution: - { - integrity: sha512-jauvkDuSSUbP0ebhfNqljhShA90YEfX/0wZ+w40oZF43IjGyWYjqYaJbvMJwGOd+9+vODW6eSvnk28f0SGV7OQ==, + integrity: sha512-LCn5M6QpkpFsh3GQvs2mJUOAlBQcCco8D60Bcqmf3O3w5a+KWS5GvYbrrJBkgvL1BDnTp+e8q0lXCLgHhKguBA==, } dependencies: "@babel/parser": 7.23.6 - "@vue/compiler-core": 3.4.5 - "@vue/compiler-dom": 3.4.5 - "@vue/compiler-ssr": 3.4.5 - "@vue/shared": 3.4.5 + "@vue/compiler-core": 3.4.15 + "@vue/compiler-dom": 3.4.15 + "@vue/compiler-ssr": 3.4.15 + "@vue/shared": 3.4.15 estree-walker: 2.0.2 magic-string: 0.30.5 - postcss: 8.4.32 + postcss: 8.4.33 source-map-js: 1.0.2 dev: false - /@vue/compiler-ssr@3.4.3: - resolution: - { - integrity: sha512-wnYQtMBkeFSxgSSQbYGQeXPhQacQiog2c6AlvMldQH6DB+gSXK/0F6DVXAJfEiuBSgBhUc8dwrrG5JQcqwalsA==, - } - dependencies: - "@vue/compiler-dom": 3.4.3 - "@vue/shared": 3.4.3 - dev: false - - /@vue/compiler-ssr@3.4.5: - resolution: - { - integrity: sha512-DDdEcDzj2lWTMfUMMtEpLDhURai9LhM0zSZ219jCt7b2Vyl0/jy3keFgCPMitG0V1S1YG4Cmws3lWHWdxHQOpg==, - } - dependencies: - "@vue/compiler-dom": 3.4.5 - "@vue/shared": 3.4.5 - dev: false - - /@vue/reactivity@3.4.3: - resolution: - { - integrity: sha512-q5f9HLDU+5aBKizXHAx0w4whkIANs1Muiq9R5YXm0HtorSlflqv9u/ohaMxuuhHWCji4xqpQ1eL04WvmAmGnFg==, - } - dependencies: - "@vue/shared": 3.4.3 - dev: false - - /@vue/reactivity@3.4.5: - resolution: - { - integrity: sha512-BcWkKvjdvqJwb7BhhFkXPLDCecX4d4a6GATvCduJQDLv21PkPowAE5GKuIE5p6RC07/Lp9FMkkq4AYCTVF5KlQ==, - } - dependencies: - "@vue/shared": 3.4.5 - dev: false - - /@vue/runtime-core@3.4.3: + /@vue/compiler-ssr@3.4.15: resolution: { - integrity: sha512-C1r6QhB1qY7D591RCSFhMULyzL9CuyrGc+3PpB0h7dU4Qqw6GNyo4BNFjHZVvsWncrUlKX3DIKg0Y7rNNr06NQ==, + integrity: sha512-1jdeQyiGznr8gjFDadVmOJqZiLNSsMa5ZgqavkPZ8O2wjHv0tVuAEsw5hTdUoUW4232vpBbL/wJhzVW/JwY1Uw==, } dependencies: - "@vue/reactivity": 3.4.3 - "@vue/shared": 3.4.3 + "@vue/compiler-dom": 3.4.15 + "@vue/shared": 3.4.15 dev: false - /@vue/runtime-core@3.4.5: + /@vue/reactivity@3.4.15: resolution: { - integrity: sha512-wh9ELIOQKeWT9SaUPdLrsxRkZv14jp+SJm9aiQGWio+/MWNM3Lib0wE6CoKEqQ9+SCYyGjDBhTOTtO47kCgbkg==, + integrity: sha512-55yJh2bsff20K5O84MxSvXKPHHt17I2EomHznvFiJCAZpJTNW8IuLj1xZWMLELRhBK3kkFV/1ErZGHJfah7i7w==, } dependencies: - "@vue/reactivity": 3.4.5 - "@vue/shared": 3.4.5 + "@vue/shared": 3.4.15 dev: false - /@vue/runtime-dom@3.4.3: + /@vue/runtime-core@3.4.15: resolution: { - integrity: sha512-wrsprg7An5Ec+EhPngWdPuzkp0BEUxAKaQtN9dPU/iZctPyD9aaXmVtehPJerdQxQale6gEnhpnfywNw3zOv2A==, + integrity: sha512-6E3by5m6v1AkW0McCeAyhHTw+3y17YCOKG0U0HDKDscV4Hs0kgNT5G+GCHak16jKgcCDHpI9xe5NKb8sdLCLdw==, } dependencies: - "@vue/runtime-core": 3.4.3 - "@vue/shared": 3.4.3 - csstype: 3.1.3 + "@vue/reactivity": 3.4.15 + "@vue/shared": 3.4.15 dev: false - /@vue/runtime-dom@3.4.5: + /@vue/runtime-dom@3.4.15: resolution: { - integrity: sha512-n5ewvOjyG3IEpqGBahdPXODFSpVlSz3H4LF76Sx0XAqpIOqyJ5bIb2PrdYuH2ogBMAQPh+o5tnoH4nJpBr8U0Q==, + integrity: sha512-EVW8D6vfFVq3V/yDKNPBFkZKGMFSvZrUQmx196o/v2tHKdwWdiZjYUBS+0Ez3+ohRyF8Njwy/6FH5gYJ75liUw==, } dependencies: - "@vue/runtime-core": 3.4.5 - "@vue/shared": 3.4.5 + "@vue/runtime-core": 3.4.15 + "@vue/shared": 3.4.15 csstype: 3.1.3 dev: false - /@vue/server-renderer@3.4.3(vue@3.4.3): - resolution: - { - integrity: sha512-BUxt8oVGMKKsqSkM1uU3d3Houyfy4WAc2SpSQRebNd+XJGATVkW/rO129jkyL+kpB/2VRKzE63zwf5RtJ3XuZw==, - } - peerDependencies: - vue: 3.4.3 - dependencies: - "@vue/compiler-ssr": 3.4.3 - "@vue/shared": 3.4.3 - vue: 3.4.3(typescript@5.3.3) - dev: false - - /@vue/server-renderer@3.4.5(vue@3.4.5): + /@vue/server-renderer@3.4.15(vue@3.4.15): resolution: { - integrity: sha512-jOFc/VE87yvifQpNju12VcqimH8pBLxdcT+t3xMeiED1K6DfH9SORyhFEoZlW5TG2Vwfn3Ul5KE+1aC99xnSBg==, + integrity: sha512-3HYzaidu9cHjrT+qGUuDhFYvF/j643bHC6uUN9BgM11DVy+pM6ATsG6uPBLnkwOgs7BpJABReLmpL3ZPAsUaqw==, } peerDependencies: - vue: 3.4.5 + vue: 3.4.15 dependencies: - "@vue/compiler-ssr": 3.4.5 - "@vue/shared": 3.4.5 - vue: 3.4.5(typescript@5.3.3) + "@vue/compiler-ssr": 3.4.15 + "@vue/shared": 3.4.15 + vue: 3.4.15(typescript@5.3.3) dev: false - /@vue/shared@3.4.3: + /@vue/shared@3.4.15: resolution: { - integrity: sha512-rIwlkkP1n4uKrRzivAKPZIEkHiuwY5mmhMJ2nZKCBLz8lTUlE73rQh4n1OnnMurXt1vcUNyH4ZPfdh8QweTjpQ==, + integrity: sha512-KzfPTxVaWfB+eGcGdbSf4CWdaXcGDqckoeXUh7SB3fZdEtzPCK2Vq9B/lRRL3yutax/LWITz+SwvgyOxz5V75g==, } dev: false - /@vue/shared@3.4.5: + /@vueuse/core@10.7.2(vue@3.4.15): resolution: { - integrity: sha512-6XptuzlMvN4l4cDnDw36pdGEV+9njYkQ1ZE0Q6iZLwrKefKaOJyiFmcP3/KBDHbt72cJZGtllAc1GaHe6XGAyg==, - } - dev: false - - /@vueuse/core@10.7.1(vue@3.4.3): - resolution: - { - integrity: sha512-74mWHlaesJSWGp1ihg76vAnfVq9NTv1YT0SYhAQ6zwFNdBkkP+CKKJmVOEHcdSnLXCXYiL5e7MaewblfiYLP7g==, - } - dependencies: - "@types/web-bluetooth": 0.0.20 - "@vueuse/metadata": 10.7.1 - "@vueuse/shared": 10.7.1(vue@3.4.3) - vue-demi: 0.14.6(vue@3.4.3) - transitivePeerDependencies: - - "@vue/composition-api" - - vue - dev: false - - /@vueuse/core@10.7.1(vue@3.4.5): - resolution: - { - integrity: sha512-74mWHlaesJSWGp1ihg76vAnfVq9NTv1YT0SYhAQ6zwFNdBkkP+CKKJmVOEHcdSnLXCXYiL5e7MaewblfiYLP7g==, + integrity: sha512-AOyAL2rK0By62Hm+iqQn6Rbu8bfmbgaIMXcE3TSr7BdQ42wnSFlwIdPjInO62onYsEMK/yDMU8C6oGfDAtZ2qQ==, } dependencies: "@types/web-bluetooth": 0.0.20 - "@vueuse/metadata": 10.7.1 - "@vueuse/shared": 10.7.1(vue@3.4.5) - vue-demi: 0.14.6(vue@3.4.5) + "@vueuse/metadata": 10.7.2 + "@vueuse/shared": 10.7.2(vue@3.4.15) + vue-demi: 0.14.6(vue@3.4.15) transitivePeerDependencies: - "@vue/composition-api" - vue dev: false - /@vueuse/metadata@10.7.1: - resolution: - { - integrity: sha512-jX8MbX5UX067DYVsbtrmKn6eG6KMcXxLRLlurGkZku5ZYT3vxgBjui2zajvUZ18QLIjrgBkFRsu7CqTAg18QFw==, - } - dev: false - - /@vueuse/shared@10.7.1(vue@3.4.3): + /@vueuse/metadata@10.7.2: resolution: { - integrity: sha512-v0jbRR31LSgRY/C5i5X279A/WQjD6/JsMzGa+eqt658oJ75IvQXAeONmwvEMrvJQKnRElq/frzBR7fhmWY5uLw==, + integrity: sha512-kCWPb4J2KGrwLtn1eJwaJD742u1k5h6v/St5wFe8Quih90+k2a0JP8BS4Zp34XUuJqS2AxFYMb1wjUL8HfhWsQ==, } - dependencies: - vue-demi: 0.14.6(vue@3.4.3) - transitivePeerDependencies: - - "@vue/composition-api" - - vue dev: false - /@vueuse/shared@10.7.1(vue@3.4.5): + /@vueuse/shared@10.7.2(vue@3.4.15): resolution: { - integrity: sha512-v0jbRR31LSgRY/C5i5X279A/WQjD6/JsMzGa+eqt658oJ75IvQXAeONmwvEMrvJQKnRElq/frzBR7fhmWY5uLw==, + integrity: sha512-qFbXoxS44pi2FkgFjPvF4h7c9oMDutpyBdcJdMYIMg9XyXli2meFMuaKn+UMgsClo//Th6+beeCgqweT/79BVA==, } dependencies: - vue-demi: 0.14.6(vue@3.4.5) + vue-demi: 0.14.6(vue@3.4.15) transitivePeerDependencies: - "@vue/composition-api" - vue dev: false - /@xmldom/xmldom@0.7.13: - resolution: - { - integrity: sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==, - } - engines: { node: ">=10.0.0" } - dev: false - /@xmldom/xmldom@0.8.10: resolution: { @@ -6069,17 +3151,6 @@ packages: engines: { node: ">=10.0.0" } dev: false - /accepts@1.3.8: - resolution: - { - integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==, - } - engines: { node: ">= 0.6" } - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - dev: false - /acorn-jsx@5.3.2(acorn@8.11.3): resolution: { @@ -6090,10 +3161,10 @@ packages: dependencies: acorn: 8.11.3 - /acorn-walk@8.3.1: + /acorn-walk@8.3.2: resolution: { - integrity: sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==, + integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==, } engines: { node: ">=0.4.0" } dev: true @@ -6106,29 +3177,6 @@ packages: engines: { node: ">=0.4.0" } hasBin: 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 - - /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 - dev: false - /ajv-draft-04@1.0.0(ajv@8.12.0): resolution: { @@ -6166,24 +3214,6 @@ packages: uri-js: 4.4.1 dev: false - /ansi-escapes@4.3.2: - resolution: - { - integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==, - } - engines: { node: ">=8" } - dependencies: - type-fest: 0.21.3 - dev: false - - /ansi-regex@4.1.1: - resolution: - { - integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==, - } - engines: { node: ">=6" } - dev: false - /ansi-regex@5.0.1: resolution: { @@ -6191,24 +3221,6 @@ packages: } engines: { node: ">=8" } - /ansi-regex@6.0.1: - resolution: - { - integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==, - } - engines: { node: ">=12" } - dev: false - - /ansi-styles@3.2.1: - resolution: - { - integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==, - } - engines: { node: ">=4" } - dependencies: - color-convert: 1.9.3 - dev: false - /ansi-styles@4.3.0: resolution: { @@ -6218,21 +3230,6 @@ packages: dependencies: color-convert: 2.0.1 - /ansi-styles@6.2.1: - resolution: - { - integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==, - } - engines: { node: ">=12" } - dev: false - - /any-promise@1.3.0: - resolution: - { - integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==, - } - dev: false - /anymatch@3.1.3: resolution: { @@ -6244,20 +3241,6 @@ packages: picomatch: 2.3.1 dev: true - /application-config-path@0.1.1: - resolution: - { - integrity: sha512-zy9cHePtMP0YhwG+CfHm0bgwdnga2X3gZexpdCwEj//dpb+TKajtiC8REEUJUSq6Ab4f9cgNy2l8ObXzCXFkEw==, - } - dev: false - - /arg@4.1.0: - resolution: - { - integrity: sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==, - } - dev: false - /argparse@1.0.10: resolution: { @@ -6273,13 +3256,6 @@ packages: integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, } - /argsarray@0.0.1: - resolution: - { - integrity: sha512-u96dg2GcAKtpTrBdDoFIM7PjcBA+6rSP0OR94MOReNRyUECL6MtQt5XXmRr4qrftYaef9+l5hcpO5te7sML1Cg==, - } - dev: false - /array-union@2.1.0: resolution: { @@ -6293,139 +3269,28 @@ packages: { integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==, } - dependencies: - printable-characters: 1.0.42 - dev: true - - /asap@2.0.6: - resolution: - { - integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==, - } - dev: false - - /asynckit@0.4.0: - resolution: - { - integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, - } - dev: false - - /at-least-node@1.0.0: - resolution: - { - integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==, - } - engines: { node: ">= 4.0.0" } - dev: false - - /axios@1.6.3: - resolution: - { - integrity: sha512-fWyNdeawGam70jXSVlKl+SUNVcL6j6W79CuSIPfi6HnDUmSCH6gyUys/HrqHeA/wU0Az41rRgean494d0Jb+ww==, - } - dependencies: - follow-redirects: 1.15.4 - form-data: 4.0.0 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - dev: false - - /babel-plugin-module-resolver@5.0.0: - resolution: - { - integrity: sha512-g0u+/ChLSJ5+PzYwLwP8Rp8Rcfowz58TJNCe+L/ui4rpzE/mg//JVX0EWBUYoxaextqnwuGHzfGp2hh0PPV25Q==, - } - engines: { node: ">= 16" } - dependencies: - find-babel-config: 2.0.0 - glob: 8.1.0 - pkg-up: 3.1.0 - reselect: 4.1.8 - resolve: 1.22.8 - dev: false - - /babel-plugin-polyfill-corejs2@0.4.7(@babel/core@7.23.7): - resolution: - { - integrity: sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ==, - } - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - "@babel/compat-data": 7.23.5 - "@babel/core": 7.23.7 - "@babel/helper-define-polyfill-provider": 0.4.4(@babel/core@7.23.7) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: false - - /babel-plugin-polyfill-corejs3@0.8.7(@babel/core@7.23.7): - resolution: - { - integrity: sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==, - } - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-define-polyfill-provider": 0.4.4(@babel/core@7.23.7) - core-js-compat: 3.35.0 - transitivePeerDependencies: - - supports-color - dev: false - - /babel-plugin-polyfill-regenerator@0.5.4(@babel/core@7.23.7): - resolution: - { - integrity: sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg==, - } - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - "@babel/core": 7.23.7 - "@babel/helper-define-polyfill-provider": 0.4.4(@babel/core@7.23.7) - transitivePeerDependencies: - - supports-color - dev: false - - /babel-plugin-react-native-web@0.18.12: - resolution: - { - integrity: sha512-4djr9G6fMdwQoD6LQ7hOKAm39+y12flWgovAqS1k5O8f42YQ3A1FFMyV5kKfetZuGhZO5BmNmOdRRZQ1TixtDw==, - } - dev: false + dependencies: + printable-characters: 1.0.42 + dev: true - /babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.23.7): + /asynckit@0.4.0: resolution: { - integrity: sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==, + integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, } - dependencies: - "@babel/plugin-syntax-flow": 7.23.3(@babel/core@7.23.7) - transitivePeerDependencies: - - "@babel/core" dev: false - /babel-preset-expo@9.5.2(@babel/core@7.23.7): + /axios@1.6.5: resolution: { - integrity: sha512-hU1G1TDiikuXV6UDZjPnX+WdbjbtidDiYhftMEVrZQSst45pDPVBWbM41TUKrpJMwv4FypsLzK+378gnMPRVWQ==, + integrity: sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==, } dependencies: - "@babel/plugin-proposal-decorators": 7.23.7(@babel/core@7.23.7) - "@babel/plugin-proposal-export-namespace-from": 7.18.9(@babel/core@7.23.7) - "@babel/plugin-proposal-object-rest-spread": 7.20.7(@babel/core@7.23.7) - "@babel/plugin-transform-react-jsx": 7.23.4(@babel/core@7.23.7) - "@babel/preset-env": 7.23.7(@babel/core@7.23.7) - babel-plugin-module-resolver: 5.0.0 - babel-plugin-react-native-web: 0.18.12 - metro-react-native-babel-preset: 0.76.8(@babel/core@7.23.7) + follow-redirects: 1.15.5 + form-data: 4.0.0 + proxy-from-env: 1.1.0 transitivePeerDependencies: - - "@babel/core" - - supports-color + - debug dev: false /bail@2.0.2: @@ -6448,20 +3313,10 @@ packages: } dev: false - /better-opn@3.0.2: - resolution: - { - integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==, - } - engines: { node: ">=12.0.0" } - dependencies: - open: 8.4.2 - dev: false - - /better-sqlite3@9.2.2: + /better-sqlite3@9.3.0: resolution: { - integrity: sha512-qwjWB46il0lsDkeB4rSRI96HyDQr8sxeu1MkBVLMrwusq1KRu4Bpt1TMI+8zIJkDUtZ3umjAkaEjIlokZKWCQw==, + integrity: sha512-ww73jVpQhRRdS9uMr761ixlkl4bWoXi8hMQlBGhoN6vPNlUHpIsNmw4pKN6kjknlt/wopdvXHvLk1W75BI+n0Q==, } requiresBuild: true dependencies: @@ -6469,14 +3324,6 @@ packages: prebuild-install: 7.1.1 dev: false - /big-integer@1.6.52: - resolution: - { - integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==, - } - engines: { node: ">=0.6" } - dev: false - /binary-extensions@2.2.0: resolution: { @@ -6512,65 +3359,6 @@ packages: } dev: true - /blueimp-md5@2.19.0: - resolution: - { - integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==, - } - dev: false - - /body-parser@1.20.2: - resolution: - { - integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==, - } - engines: { node: ">= 0.8", npm: 1.2.8000 || >= 1.4.16 } - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.11.0 - raw-body: 2.5.2 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: false - - /bplist-creator@0.1.0: - resolution: - { - integrity: sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==, - } - dependencies: - stream-buffers: 2.2.0 - dev: false - - /bplist-parser@0.3.1: - resolution: - { - integrity: sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==, - } - engines: { node: ">= 5.10.0" } - dependencies: - big-integer: 1.6.52 - dev: false - - /bplist-parser@0.3.2: - resolution: - { - integrity: sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==, - } - engines: { node: ">= 5.10.0" } - dependencies: - big-integer: 1.6.52 - dev: false - /brace-expansion@1.1.11: resolution: { @@ -6597,44 +3385,6 @@ packages: dependencies: fill-range: 7.0.1 - /browserslist@4.22.2: - resolution: - { - integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==, - } - engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } - hasBin: true - dependencies: - caniuse-lite: 1.0.30001574 - electron-to-chromium: 1.4.620 - node-releases: 2.0.14 - update-browserslist-db: 1.0.13(browserslist@4.22.2) - dev: false - - /buffer-alloc-unsafe@1.1.0: - resolution: - { - integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==, - } - dev: false - - /buffer-alloc@1.2.0: - resolution: - { - integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==, - } - dependencies: - buffer-alloc-unsafe: 1.1.0 - buffer-fill: 1.0.0 - dev: false - - /buffer-fill@1.0.0: - resolution: - { - integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==, - } - dev: false - /buffer-from@1.1.2: resolution: { @@ -6652,61 +3402,6 @@ packages: ieee754: 1.2.1 dev: false - /builtins@1.0.3: - resolution: - { - integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==, - } - dev: false - - /bytes@3.1.2: - resolution: - { - integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==, - } - engines: { node: ">= 0.8" } - dev: false - - /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.1.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 - - /call-bind@1.0.5: - resolution: - { - integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==, - } - dependencies: - function-bind: 1.1.2 - get-intrinsic: 1.2.2 - set-function-length: 1.1.1 - dev: false - /call-me-maybe@1.0.2: resolution: { @@ -6729,13 +3424,6 @@ packages: engines: { node: ">=14.16" } dev: true - /caniuse-lite@1.0.30001574: - resolution: - { - integrity: sha512-BtYEK4r/iHt/txm81KBudCUcTy7t+s9emrIaHqjYurQ10x71zJ5VQ9x1dYPcz/b+pKSp4y/v1xSI67A+LzpNyg==, - } - dev: false - /capnp-ts@0.7.0: resolution: { @@ -6755,18 +3443,6 @@ packages: } dev: false - /chalk@2.4.2: - resolution: - { - integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==, - } - engines: { node: ">=4" } - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - dev: false - /chalk@4.1.2: resolution: { @@ -6806,13 +3482,6 @@ packages: } dev: false - /charenc@0.0.2: - resolution: - { - integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==, - } - dev: false - /chokidar@3.5.3: resolution: { @@ -6838,22 +3507,6 @@ packages: } dev: false - /chownr@2.0.0: - resolution: - { - integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==, - } - engines: { node: ">=10" } - dev: false - - /ci-info@3.9.0: - resolution: - { - integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==, - } - engines: { node: ">=8" } - dev: false - /class-variance-authority@0.7.0: resolution: { @@ -6863,14 +3516,6 @@ packages: clsx: 2.0.0 dev: false - /clean-stack@2.2.0: - resolution: - { - integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==, - } - engines: { node: ">=6" } - dev: false - /cli-color@2.0.3: resolution: { @@ -6885,40 +3530,6 @@ packages: timers-ext: 0.1.7 dev: true - /cli-cursor@2.1.0: - resolution: - { - integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==, - } - engines: { node: ">=4" } - dependencies: - restore-cursor: 2.0.0 - dev: false - - /cli-spinners@2.9.2: - resolution: - { - integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==, - } - engines: { node: ">=6" } - dev: false - - /clone@1.0.4: - resolution: - { - integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==, - } - engines: { node: ">=0.8" } - dev: false - - /clone@2.1.2: - resolution: - { - integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==, - } - engines: { node: ">=0.8" } - dev: false - /clsx@2.0.0: resolution: { @@ -6927,13 +3538,13 @@ packages: engines: { node: ">=6" } dev: false - /codemirror@6.0.1(@lezer/common@1.2.0): + /codemirror@6.0.1(@lezer/common@1.2.1): resolution: { integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==, } dependencies: - "@codemirror/autocomplete": 6.11.1(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.0) + "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1) "@codemirror/commands": 6.3.3 "@codemirror/language": 6.10.0 "@codemirror/lint": 6.4.2 @@ -6944,15 +3555,6 @@ packages: - "@lezer/common" dev: false - /color-convert@1.9.3: - resolution: - { - integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, - } - dependencies: - color-name: 1.1.3 - dev: false - /color-convert@2.0.1: resolution: { @@ -6962,13 +3564,6 @@ packages: dependencies: color-name: 1.1.4 - /color-name@1.1.3: - resolution: - { - integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, - } - dev: false - /color-name@1.1.4: resolution: { @@ -6992,29 +3587,6 @@ packages: } dev: false - /command-exists@1.2.9: - resolution: - { - integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==, - } - dev: false - - /commander@4.1.1: - resolution: - { - integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==, - } - engines: { node: ">= 6" } - dev: false - - /commander@7.2.0: - resolution: - { - integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==, - } - engines: { node: ">= 10" } - dev: false - /commander@9.5.0: resolution: { @@ -7023,41 +3595,12 @@ packages: engines: { node: ^12.20.0 || >=14 } dev: true - /compare-versions@3.6.0: - resolution: - { - integrity: sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==, - } - dev: false - - /component-type@1.2.2: - resolution: - { - integrity: sha512-99VUHREHiN5cLeHm3YLq312p6v+HUEcwtLCAtelvUDI6+SH5g5Cr85oNR2S1o6ywzL0ykMbuwLzM2ANocjEOIA==, - } - dev: false - /concat-map@0.0.1: resolution: { integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, } - /connect@3.7.0: - resolution: - { - integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==, - } - engines: { node: ">= 0.10.0" } - dependencies: - debug: 2.6.9 - finalhandler: 1.1.2 - parseurl: 1.3.3 - utils-merge: 1.0.1 - transitivePeerDependencies: - - supports-color - dev: false - /content-type@1.0.5: resolution: { @@ -7066,13 +3609,6 @@ packages: engines: { node: ">= 0.6" } dev: false - /convert-source-map@2.0.0: - resolution: - { - integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, - } - dev: false - /cookie@0.5.0: resolution: { @@ -7091,15 +3627,6 @@ packages: is-what: 4.1.16 dev: true - /core-js-compat@3.35.0: - resolution: - { - integrity: sha512-5blwFAddknKeNgsjBzilkdQ0+YK8L1PfqPYq40NOYMYFSS38qj+hpTcLLWwpIwA2A5bje/x5jmVn2tzUMg9IVw==, - } - dependencies: - browserslist: 4.22.2 - dev: false - /crelt@1.0.6: resolution: { @@ -7107,31 +3634,6 @@ packages: } dev: false - /cross-fetch@3.1.8: - resolution: - { - integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==, - } - dependencies: - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding - dev: false - - /cross-spawn@6.0.5: - resolution: - { - integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==, - } - engines: { node: ">=4.8" } - dependencies: - nice-try: 1.0.5 - path-key: 2.0.1 - semver: 5.7.2 - shebang-command: 1.2.0 - which: 1.3.1 - dev: false - /cross-spawn@7.0.3: resolution: { @@ -7140,31 +3642,8 @@ packages: engines: { node: ">= 8" } dependencies: path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - /crypt@0.0.2: - resolution: - { - integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==, - } - dev: false - - /crypto-random-string@1.0.0: - resolution: - { - integrity: sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==, - } - engines: { node: ">=4" } - dev: false - - /crypto-random-string@2.0.0: - resolution: - { - integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==, - } - engines: { node: ">=8" } - dev: false + shebang-command: 2.0.0 + which: 2.0.2 /cssesc@3.0.0: resolution: @@ -7207,13 +3686,6 @@ packages: type: 1.2.0 dev: true - /dag-map@1.0.2: - resolution: - { - integrity: sha512-+LSAiGFwQ9dRnRdOeaj7g47ZFJcOUPukAP8J3A3fuZ1g9Y44BG+P1sgApjLXTQPOzC4+7S9Wr8kXsfpINM4jpw==, - } - dev: false - /data-uri-to-buffer@2.0.2: resolution: { @@ -7229,34 +3701,6 @@ packages: engines: { node: ">= 12" } dev: false - /debug@2.6.9: - resolution: - { - integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==, - } - peerDependencies: - supports-color: "*" - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.0.0 - dev: false - - /debug@3.2.7: - resolution: - { - integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==, - } - peerDependencies: - supports-color: "*" - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.3 - dev: false - /debug@4.3.4: resolution: { @@ -7304,63 +3748,6 @@ packages: integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, } - /default-gateway@4.2.0: - resolution: - { - integrity: sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==, - } - engines: { node: ">=6" } - dependencies: - execa: 1.0.0 - ip-regex: 2.1.0 - dev: false - - /defaults@1.0.4: - resolution: - { - integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==, - } - dependencies: - clone: 1.0.4 - dev: false - - /define-data-property@1.1.1: - resolution: - { - integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==, - } - engines: { node: ">= 0.4" } - dependencies: - get-intrinsic: 1.2.2 - gopd: 1.0.1 - has-property-descriptors: 1.0.1 - dev: false - - /define-lazy-prop@2.0.0: - resolution: - { - integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==, - } - engines: { node: ">=8" } - dev: false - - /del@6.1.1: - resolution: - { - integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==, - } - engines: { node: ">=10" } - dependencies: - globby: 11.1.0 - graceful-fs: 4.2.11 - is-glob: 4.0.3 - is-path-cwd: 2.2.0 - is-path-inside: 3.0.3 - p-map: 4.0.0 - rimraf: 3.0.2 - slash: 3.0.0 - dev: false - /delayed-stream@1.0.0: resolution: { @@ -7369,14 +3756,6 @@ packages: engines: { node: ">=0.4.0" } dev: false - /depd@2.0.0: - resolution: - { - integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==, - } - engines: { node: ">= 0.8" } - dev: false - /dequal@2.0.3: resolution: { @@ -7385,23 +3764,6 @@ packages: engines: { node: ">=6" } dev: false - /destroy@1.2.0: - resolution: - { - integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==, - } - engines: { node: ">= 0.8", npm: 1.2.8000 || >= 1.4.16 } - dev: false - - /detect-libc@1.0.3: - resolution: - { - integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==, - } - engines: { node: ">=0.10" } - hasBin: true - dev: false - /detect-libc@2.0.2: resolution: { @@ -7447,26 +3809,10 @@ packages: dependencies: esutils: 2.0.3 - /dotenv-expand@10.0.0: - resolution: - { - integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==, - } - engines: { node: ">=12" } - dev: false - - /dotenv@16.0.3: - resolution: - { - integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==, - } - engines: { node: ">=12" } - dev: false - - /dotenv@16.3.1: + /dotenv@16.3.2: resolution: { - integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==, + integrity: sha512-HTlk5nmhkm8F6JcdXvHIzaorzCoziNQT9mGxLPVXW8wJF1TiGSL60ZGB4gHWabHOaMmWmhvk2/lPHfnBiT78AQ==, } engines: { node: ">=12" } dev: true @@ -7481,14 +3827,14 @@ packages: wordwrap: 1.0.0 dev: true - /drizzle-kit@0.20.9: + /drizzle-kit@0.20.13: resolution: { - integrity: sha512-5oIbPFdfEEfzVSOB3MWGt70VSHv6W7qMAWCJ5xc6W1BxgGASipxuAuyXD59fx9S6QYTNNnuSuQFoIdnNTRWY2A==, + integrity: sha512-j9oZSQXNWG+KBJm0Sg3S/zJpncHGKnpqNfFuM4NUxUMGTcihDHhP9SW6Jncqwb5vsP1Xm0a8JLm3PZUIspC/oA==, } hasBin: true dependencies: - "@drizzle-team/studio": 0.0.37 + "@drizzle-team/studio": 0.0.39 "@esbuild-kit/esm-loader": 2.6.5 camelcase: 7.0.1 chalk: 5.3.0 @@ -7506,10 +3852,10 @@ packages: - supports-color dev: true - /drizzle-orm@0.29.2(@cloudflare/workers-types@4.20231218.0)(@libsql/client@0.4.0-pre.5)(@types/react@18.2.46)(better-sqlite3@9.2.2)(expo-sqlite@13.2.0)(react@18.2.0): + /drizzle-orm@0.29.3(@cloudflare/workers-types@4.20240117.0)(@libsql/client@0.4.0-pre.7)(better-sqlite3@9.3.0): resolution: { - integrity: sha512-BhwCwuSQqUoLVc7wtgIkuWexY127Z9+yDbuXU7QWZbMC2XE48jecvAThW9apQaDoaxQmwQ+ObyPfPb4zL4Bgsw==, + integrity: sha512-uSE027csliGSGYD0pqtM+SAQATMREb3eSM/U8s6r+Y0RFwTKwftnwwSkqx3oS65UBgqDOM0gMTl5UGNpt6lW0A==, } peerDependencies: "@aws-sdk/client-rds-data": ">=3" @@ -7551,6 +3897,8 @@ packages: optional: true "@types/pg": optional: true + "@types/react": + optional: true "@types/sql.js": optional: true "@vercel/postgres": @@ -7559,6 +3907,8 @@ packages: optional: true bun-types: optional: true + expo-sqlite: + optional: true knex: optional: true kysely: @@ -7569,20 +3919,19 @@ packages: optional: true postgres: optional: true + react: + optional: true sql.js: optional: true sqlite3: optional: true dependencies: - "@cloudflare/workers-types": 4.20231218.0 - "@libsql/client": 0.4.0-pre.5 - "@types/react": 18.2.46 - better-sqlite3: 9.2.2 - expo-sqlite: 13.2.0(expo@49.0.21) - react: 18.2.0 + "@cloudflare/workers-types": 4.20240117.0 + "@libsql/client": 0.4.0-pre.7 + better-sqlite3: 9.3.0 dev: false - /drizzle-zod@0.5.1(drizzle-orm@0.29.2)(zod@3.22.4): + /drizzle-zod@0.5.1(drizzle-orm@0.29.3)(zod@3.22.4): resolution: { integrity: sha512-C/8bvzUH/zSnVfwdSibOgFjLhtDtbKYmkbPbUCq46QZyZCH6kODIMSOgZ8R7rVjoI+tCj3k06MRJMDqsIeoS4A==, @@ -7591,53 +3940,10 @@ packages: drizzle-orm: ">=0.23.13" zod: "*" dependencies: - drizzle-orm: 0.29.2(@cloudflare/workers-types@4.20231218.0)(@libsql/client@0.4.0-pre.5)(@types/react@18.2.46)(better-sqlite3@9.2.2)(expo-sqlite@13.2.0)(react@18.2.0) + drizzle-orm: 0.29.3(@cloudflare/workers-types@4.20240117.0)(@libsql/client@0.4.0-pre.7)(better-sqlite3@9.3.0) zod: 3.22.4 dev: false - /eastasianwidth@0.2.0: - resolution: - { - integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, - } - dev: false - - /ee-first@1.1.1: - resolution: - { - integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==, - } - dev: false - - /electron-to-chromium@1.4.620: - resolution: - { - integrity: sha512-a2fcSHOHrqBJsPNXtf6ZCEZpXrFCcbK1FBxfX3txoqWzNgtEDG1f3M59M98iwxhRW4iMKESnSjbJ310/rkrp0g==, - } - dev: false - - /emoji-regex@8.0.0: - resolution: - { - integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, - } - dev: false - - /emoji-regex@9.2.2: - resolution: - { - integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, - } - dev: false - - /encodeurl@1.0.2: - resolution: - { - integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==, - } - engines: { node: ">= 0.8" } - dev: false - /end-of-stream@1.4.4: resolution: { @@ -7655,14 +3961,6 @@ packages: engines: { node: ">=0.12" } dev: false - /env-editor@0.4.2: - resolution: - { - integrity: sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==, - } - engines: { node: ">=8" } - dev: false - /env-paths@3.0.0: resolution: { @@ -7671,13 +3969,6 @@ packages: engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } dev: true - /eol@0.9.1: - resolution: - { - integrity: sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==, - } - dev: false - /es5-ext@0.10.62: resolution: { @@ -7838,29 +4129,6 @@ packages: "@esbuild/win32-x64": 0.19.11 dev: true - /escalade@3.1.1: - resolution: - { - integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==, - } - engines: { node: ">=6" } - dev: false - - /escape-html@1.0.3: - resolution: - { - integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==, - } - dev: false - - /escape-string-regexp@1.0.5: - resolution: - { - integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==, - } - engines: { node: ">=0.8.0" } - dev: false - /escape-string-regexp@4.0.0: resolution: { @@ -7905,7 +4173,7 @@ packages: "@eslint-community/regexpp": 4.10.0 "@eslint/eslintrc": 2.1.4 "@eslint/js": 8.56.0 - "@humanwhocodes/config-array": 0.11.13 + "@humanwhocodes/config-array": 0.11.14 "@humanwhocodes/module-importer": 1.0.1 "@nodelib/fs.walk": 1.2.8 "@ungap/structured-clone": 1.2.0 @@ -7968,255 +4236,70 @@ packages: integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==, } engines: { node: ">=0.10" } - dependencies: - estraverse: 5.3.0 - - /esrecurse@4.3.0: - resolution: - { - integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, - } - engines: { node: ">=4.0" } - dependencies: - estraverse: 5.3.0 - - /estraverse@5.3.0: - resolution: - { - integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, - } - engines: { node: ">=4.0" } - - /estree-walker@0.6.1: - resolution: - { - integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==, - } - dev: true - - /estree-walker@2.0.2: - resolution: - { - integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==, - } - dev: false - - /esutils@2.0.3: - resolution: - { - integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, - } - engines: { node: ">=0.10.0" } - - /etag@1.8.1: - resolution: - { - integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==, - } - 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 - dev: true - - /exec-async@2.2.0: - resolution: - { - integrity: sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==, - } - dev: false - - /execa@1.0.0: - resolution: - { - integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==, - } - engines: { node: ">=6" } - dependencies: - cross-spawn: 6.0.5 - get-stream: 4.1.0 - is-stream: 1.1.0 - npm-run-path: 2.0.2 - p-finally: 1.0.0 - signal-exit: 3.0.7 - strip-eof: 1.0.0 - dev: false - - /exit-hook@2.2.1: - resolution: - { - integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==, - } - engines: { node: ">=6" } - dev: true - - /expand-template@2.0.3: - resolution: - { - integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==, - } - engines: { node: ">=6" } - dev: false - - /expo-application@5.3.1(expo@49.0.21): - resolution: - { - integrity: sha512-HR2+K+Hm33vLw/TfbFaHrvUbRRNRco8R+3QaCKy7eJC2LFfT05kZ15ynGaKfB5DJ/oqPV3mxXVR/EfwmE++hoA==, - } - peerDependencies: - expo: "*" - dependencies: - expo: 49.0.21(@babel/core@7.23.7) - dev: false - - /expo-asset@8.10.1(expo@49.0.21): - resolution: - { - integrity: sha512-5VMTESxgY9GBsspO/esY25SKEa7RyascVkLe/OcL1WgblNFm7xCCEEUIW8VWS1nHJQGYxpMZPr3bEfjMpdWdyA==, - } - dependencies: - blueimp-md5: 2.19.0 - expo-constants: 14.4.2(expo@49.0.21) - expo-file-system: 15.4.5(expo@49.0.21) - invariant: 2.2.4 - md5-file: 3.2.3 - path-browserify: 1.0.1 - url-parse: 1.5.10 - transitivePeerDependencies: - - expo - - supports-color - dev: false + dependencies: + estraverse: 5.3.0 - /expo-constants@14.4.2(expo@49.0.21): + /esrecurse@4.3.0: resolution: { - integrity: sha512-nOB122DOAjk+KrJT69lFQAoYVQGQjFHSigCPVBzVdko9S1xGsfiOH9+X5dygTsZTIlVLpQJDdmZ7ONiv3i+26w==, + integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, } - peerDependencies: - expo: "*" + engines: { node: ">=4.0" } dependencies: - "@expo/config": 8.1.2 - expo: 49.0.21(@babel/core@7.23.7) - uuid: 3.4.0 - transitivePeerDependencies: - - supports-color - dev: false + estraverse: 5.3.0 - /expo-file-system@15.4.5(expo@49.0.21): + /estraverse@5.3.0: resolution: { - integrity: sha512-xy61KaTaDgXhT/dllwYDHm3ch026EyO8j4eC6wSVr/yE12MMMxAC09yGwy4f7kkOs6ztGVQF5j7ldRzNLN4l0Q==, + integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, } - peerDependencies: - expo: "*" - dependencies: - expo: 49.0.21(@babel/core@7.23.7) - uuid: 3.4.0 - dev: false + engines: { node: ">=4.0" } - /expo-font@11.4.0(expo@49.0.21): + /estree-walker@0.6.1: resolution: { - integrity: sha512-nkmezCFD7gR/I6R+e3/ry18uEfF8uYrr6h+PdBJu+3dawoLOpo+wFb/RG9bHUekU1/cPanR58LR7G5MEMKHR2w==, + integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==, } - peerDependencies: - expo: "*" - dependencies: - expo: 49.0.21(@babel/core@7.23.7) - fontfaceobserver: 2.3.0 - dev: false + dev: true - /expo-keep-awake@12.3.0(expo@49.0.21): + /estree-walker@2.0.2: resolution: { - integrity: sha512-ujiJg1p9EdCOYS05jh5PtUrfiZnK0yyLy+UewzqrjUqIT8eAGMQbkfOn3C3fHE7AKd5AefSMzJnS3lYZcZYHDw==, + integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==, } - peerDependencies: - expo: "*" - dependencies: - expo: 49.0.21(@babel/core@7.23.7) dev: false - /expo-modules-autolinking@1.5.1: + /esutils@2.0.3: resolution: { - integrity: sha512-yt5a1VCp2BF9CrsO689PCD5oXKP14MMhnOanQMvDn4BDpURYfzAlDVGC5fZrNQKtwn/eq3bcrxIwZ7D9QjVVRg==, + integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, } - hasBin: true - dependencies: - "@expo/config": 8.1.2 - chalk: 4.1.2 - commander: 7.2.0 - fast-glob: 3.3.2 - find-up: 5.0.0 - fs-extra: 9.1.0 - transitivePeerDependencies: - - supports-color - dev: false + engines: { node: ">=0.10.0" } - /expo-modules-core@1.5.12: + /event-emitter@0.3.5: resolution: { - integrity: sha512-mY4wTDU458dhwk7IVxLNkePlYXjs9BTgk4NQHBUXf0LapXsvr+i711qPZaFNO4egf5qq6fQV+Yfd/KUguHstnQ==, + integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==, } dependencies: - compare-versions: 3.6.0 - invariant: 2.2.4 - dev: false + d: 1.0.1 + es5-ext: 0.10.62 + dev: true - /expo-sqlite@13.2.0(expo@49.0.21): + /exit-hook@2.2.1: resolution: { - integrity: sha512-TYpX+a+2oJOxzChug8+TkIob0lipl7rluCRBGXbGKG68kG4Reb6OCruRiQTJTnbGiEgnN4S+B0cT8f4ZXPUxBg==, + integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==, } - peerDependencies: - expo: "*" - dependencies: - "@expo/websql": 1.0.1 - expo: 49.0.21(@babel/core@7.23.7) - dev: false + engines: { node: ">=6" } + dev: true - /expo@49.0.21(@babel/core@7.23.7): + /expand-template@2.0.3: resolution: { - integrity: sha512-JpHL6V0yt8/fzsmkAdPdtsah+lU6Si4ac7MDklLYvzEil7HAFEsN/pf06wQ21ax4C+BL27hI6JJoD34tzXUCJA==, + integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==, } - hasBin: true - dependencies: - "@babel/runtime": 7.23.7 - "@expo/cli": 0.10.16(expo-modules-autolinking@1.5.1) - "@expo/config": 8.1.2 - "@expo/config-plugins": 7.2.5 - "@expo/vector-icons": 13.0.0 - babel-preset-expo: 9.5.2(@babel/core@7.23.7) - expo-application: 5.3.1(expo@49.0.21) - expo-asset: 8.10.1(expo@49.0.21) - expo-constants: 14.4.2(expo@49.0.21) - expo-file-system: 15.4.5(expo@49.0.21) - expo-font: 11.4.0(expo@49.0.21) - expo-keep-awake: 12.3.0(expo@49.0.21) - expo-modules-autolinking: 1.5.1 - expo-modules-core: 1.5.12 - fbemitter: 3.0.0 - invariant: 2.2.4 - md5-file: 3.2.3 - node-fetch: 2.7.0 - pretty-format: 26.6.2 - uuid: 3.4.0 - transitivePeerDependencies: - - "@babel/core" - - bluebird - - bufferutil - - encoding - - supports-color - - utf-8-validate + engines: { node: ">=6" } dev: false /ext@1.7.0: @@ -8275,41 +4358,6 @@ packages: dependencies: reusify: 1.0.4 - /fbemitter@3.0.0: - resolution: - { - integrity: sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==, - } - dependencies: - fbjs: 3.0.5 - transitivePeerDependencies: - - encoding - dev: false - - /fbjs-css-vars@1.0.2: - resolution: - { - integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==, - } - dev: false - - /fbjs@3.0.5: - resolution: - { - integrity: sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==, - } - dependencies: - cross-fetch: 3.1.8 - fbjs-css-vars: 1.0.2 - loose-envify: 1.4.0 - object-assign: 4.1.1 - promise: 7.3.1 - setimmediate: 1.0.5 - ua-parser-js: 1.0.37 - transitivePeerDependencies: - - encoding - dev: false - /fetch-blob@3.2.0: resolution: { @@ -8318,14 +4366,7 @@ packages: engines: { node: ^12.20 || >= 14.13 } dependencies: node-domexception: 1.0.0 - web-streams-polyfill: 3.2.1 - dev: false - - /fetch-retry@4.1.1: - resolution: - { - integrity: sha512-e6eB7zN6UBSwGVwrbWVH+gdLnkW9WwHhmq2YDK1Sh30pzx1onRVGBvogTlUeWxwTa+L86NYdo4hFkh7O8ZjSnA==, - } + web-streams-polyfill: 3.3.2 dev: false /fetch-retry@5.0.6: @@ -8360,45 +4401,6 @@ packages: dependencies: to-regex-range: 5.0.1 - /finalhandler@1.1.2: - resolution: - { - integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==, - } - engines: { node: ">= 0.8" } - dependencies: - debug: 2.6.9 - encodeurl: 1.0.2 - escape-html: 1.0.3 - on-finished: 2.3.0 - parseurl: 1.3.3 - statuses: 1.5.0 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: false - - /find-babel-config@2.0.0: - resolution: - { - integrity: sha512-dOKT7jvF3hGzlW60Gc3ONox/0rRZ/tz7WCil0bqA1In/3I8f1BctpXahRnEKDySZqci7u+dqq93sZST9fOJpFw==, - } - engines: { node: ">=16.0.0" } - dependencies: - json5: 2.2.3 - path-exists: 4.0.0 - dev: false - - /find-up@3.0.0: - resolution: - { - integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==, - } - engines: { node: ">=6" } - dependencies: - locate-path: 3.0.0 - dev: false - /find-up@5.0.0: resolution: { @@ -8409,15 +4411,6 @@ packages: locate-path: 6.0.0 path-exists: 4.0.0 - /find-yarn-workspace-root@2.0.0: - resolution: - { - integrity: sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==, - } - dependencies: - micromatch: 4.0.5 - dev: false - /flat-cache@3.2.0: resolution: { @@ -8435,10 +4428,10 @@ packages: integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==, } - /follow-redirects@1.15.4: + /follow-redirects@1.15.5: resolution: { - integrity: sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==, + integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==, } engines: { node: ">=4.0" } peerDependencies: @@ -8448,36 +4441,6 @@ packages: optional: true dev: false - /fontfaceobserver@2.3.0: - resolution: - { - integrity: sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==, - } - dev: false - - /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: false - - /form-data@3.0.1: - resolution: - { - integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==, - } - engines: { node: ">= 6" } - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: false - /form-data@4.0.0: resolution: { @@ -8511,22 +4474,6 @@ packages: fetch-blob: 3.2.0 dev: false - /freeport-async@2.0.0: - resolution: - { - integrity: sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==, - } - engines: { node: ">=8" } - dev: false - - /fresh@0.5.2: - resolution: - { - integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==, - } - engines: { node: ">= 0.6" } - dev: false - /fs-constants@1.0.0: resolution: { @@ -8534,54 +4481,6 @@ packages: } dev: false - /fs-extra@8.1.0: - resolution: - { - integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==, - } - engines: { node: ">=6 <7 || >=8" } - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - dev: false - - /fs-extra@9.0.0: - resolution: - { - integrity: sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==, - } - engines: { node: ">=10" } - dependencies: - at-least-node: 1.0.0 - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 1.0.0 - dev: false - - /fs-extra@9.1.0: - resolution: - { - integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==, - } - engines: { node: ">=10" } - dependencies: - at-least-node: 1.0.0 - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - dev: false - - /fs-minipass@2.1.0: - resolution: - { - integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==, - } - engines: { node: ">= 8" } - dependencies: - minipass: 3.1.6 - dev: false - /fs.realpath@1.0.0: resolution: { @@ -8604,7 +4503,7 @@ packages: { integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, } - dev: false + dev: true /fuse.js@6.6.2: resolution: @@ -8614,26 +4513,6 @@ packages: engines: { node: ">=10" } dev: false - /gensync@1.0.0-beta.2: - resolution: - { - integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, - } - engines: { node: ">=6.9.0" } - dev: false - - /get-intrinsic@1.2.2: - resolution: - { - integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==, - } - dependencies: - function-bind: 1.1.2 - has-proto: 1.0.1 - has-symbols: 1.0.3 - hasown: 2.0.0 - dev: false - /get-own-enumerable-property-symbols@3.0.2: resolution: { @@ -8641,14 +4520,6 @@ packages: } dev: false - /get-port@3.2.0: - resolution: - { - integrity: sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==, - } - engines: { node: ">=4" } - dev: false - /get-source@2.0.12: resolution: { @@ -8659,16 +4530,6 @@ packages: source-map: 0.6.1 dev: true - /get-stream@4.1.0: - resolution: - { - integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==, - } - engines: { node: ">=6" } - dependencies: - pump: 3.0.0 - dev: false - /get-tsconfig@4.7.2: resolution: { @@ -8678,14 +4539,6 @@ packages: resolve-pkg-maps: 1.0.0 dev: true - /getenv@1.0.0: - resolution: - { - integrity: sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg==, - } - engines: { node: ">=6" } - dev: false - /github-from-package@0.0.0: resolution: { @@ -8713,68 +4566,24 @@ packages: integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, } engines: { node: ">= 6" } - dependencies: - is-glob: 4.0.3 - - /glob-parent@6.0.2: - resolution: - { - integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, - } - engines: { node: ">=10.13.0" } - dependencies: - is-glob: 4.0.3 - - /glob-to-regexp@0.4.1: - resolution: - { - integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==, - } - dev: true - - /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: false - - /glob@6.0.4: - resolution: - { - integrity: sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==, - } - requiresBuild: true - dependencies: - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: false - optional: true + dependencies: + is-glob: 4.0.3 - /glob@7.1.6: + /glob-parent@6.0.2: resolution: { - integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==, + integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, } + engines: { node: ">=10.13.0" } dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: false + is-glob: 4.0.3 + + /glob-to-regexp@0.4.1: + resolution: + { + integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==, + } + dev: true /glob@7.2.3: resolution: @@ -8801,14 +4610,7 @@ packages: inherits: 2.0.4 minimatch: 5.1.6 once: 1.4.0 - - /globals@11.12.0: - resolution: - { - integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==, - } - engines: { node: ">=4" } - dev: false + dev: true /globals@13.24.0: resolution: @@ -8834,49 +4636,12 @@ packages: slash: 3.0.0 dev: false - /gopd@1.0.1: - resolution: - { - integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==, - } - dependencies: - get-intrinsic: 1.2.2 - dev: false - - /graceful-fs@4.2.11: - resolution: - { - integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, - } - dev: false - /graphemer@1.4.0: resolution: { integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, } - /graphql-tag@2.12.6(graphql@15.8.0): - resolution: - { - integrity: sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==, - } - engines: { node: ">=10" } - peerDependencies: - graphql: ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - dependencies: - graphql: 15.8.0 - tslib: 2.6.2 - dev: false - - /graphql@15.8.0: - resolution: - { - integrity: sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==, - } - engines: { node: ">= 10.x" } - dev: false - /hanji@0.0.5: resolution: { @@ -8887,14 +4652,6 @@ packages: sisteransi: 1.0.5 dev: true - /has-flag@3.0.0: - resolution: - { - integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==, - } - engines: { node: ">=4" } - dev: false - /has-flag@4.0.0: resolution: { @@ -8902,31 +4659,6 @@ packages: } engines: { node: ">=8" } - /has-property-descriptors@1.0.1: - resolution: - { - integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==, - } - dependencies: - get-intrinsic: 1.2.2 - dev: false - - /has-proto@1.0.1: - resolution: - { - integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==, - } - engines: { node: ">= 0.4" } - dev: false - - /has-symbols@1.0.3: - resolution: - { - integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==, - } - engines: { node: ">= 0.4" } - dev: false - /hasown@2.0.0: resolution: { @@ -8935,7 +4667,7 @@ packages: engines: { node: ">= 0.4" } dependencies: function-bind: 1.1.2 - dev: false + dev: true /hast-util-embedded@3.0.0: resolution: @@ -9028,10 +4760,10 @@ packages: hast-util-is-element: 3.0.0 dev: false - /hast-util-raw@9.0.1: + /hast-util-raw@9.0.2: resolution: { - integrity: sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA==, + integrity: sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA==, } dependencies: "@types/hast": 3.0.3 @@ -9040,7 +4772,7 @@ packages: hast-util-from-parse5: 8.0.1 hast-util-to-parse5: 8.0.0 html-void-elements: 3.0.0 - mdast-util-to-hast: 13.0.2 + mdast-util-to-hast: 13.1.0 parse5: 7.1.2 unist-util-position: 5.0.0 unist-util-visit: 5.0.0 @@ -9070,10 +4802,10 @@ packages: "@types/unist": 3.0.2 ccount: 2.0.1 comma-separated-tokens: 2.0.3 - hast-util-raw: 9.0.1 + hast-util-raw: 9.0.2 hast-util-whitespace: 3.0.0 html-void-elements: 3.0.0 - mdast-util-to-hast: 13.0.2 + mdast-util-to-hast: 13.1.0 property-information: 6.4.0 space-separated-tokens: 2.0.2 stringify-entities: 4.0.3 @@ -9153,10 +4885,10 @@ packages: engines: { node: ">=12.0.0" } dev: false - /hono@3.12.0: + /hono@3.12.6: resolution: { - integrity: sha512-UPEtZuLY7Wo7g0mqKWSOjLFdT8t7wJ60IYEcxKl3AQNU4u+R2QqU2fJMPmSu24C+/ag20Z8mOTQOErZzK4DMvA==, + integrity: sha512-nnLMJbBA8k+tW8XD1Xt0BfNmJswppYF2pSOVo5U3DdU72SPYUjFkPg7/Q9KfkNcsrXzxFdJQ00JYjPGancmOOA==, } engines: { node: ">=16.0.0" } dev: false @@ -9168,16 +4900,6 @@ packages: } dev: false - /hosted-git-info@3.0.8: - resolution: - { - integrity: sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==, - } - engines: { node: ">=10" } - dependencies: - lru-cache: 6.0.0 - dev: false - /html-void-elements@3.0.0: resolution: { @@ -9192,33 +4914,6 @@ packages: } dev: false - /http-errors@2.0.0: - resolution: - { - integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==, - } - engines: { node: ">= 0.8" } - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - dev: false - - /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 - /httpsnippet-lite@3.0.5: resolution: { @@ -9240,16 +4935,6 @@ packages: hasBin: true dev: true - /iconv-lite@0.4.24: - resolution: - { - integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==, - } - engines: { node: ">=0.10.0" } - dependencies: - safer-buffer: 2.1.2 - dev: false - /ieee754@1.2.1: resolution: { @@ -9264,13 +4949,6 @@ packages: } engines: { node: ">= 4" } - /immediate@3.3.0: - resolution: - { - integrity: sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==, - } - dev: false - /import-fresh@3.3.0: resolution: { @@ -9288,21 +4966,6 @@ packages: } engines: { node: ">=0.8.19" } - /indent-string@4.0.0: - resolution: - { - integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==, - } - engines: { node: ">=8" } - dev: false - - /infer-owner@1.0.4: - resolution: - { - integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==, - } - dev: false - /inflight@1.0.6: resolution: { @@ -9325,42 +4988,6 @@ packages: } dev: false - /internal-ip@4.3.0: - resolution: - { - integrity: sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==, - } - engines: { node: ">=6" } - dependencies: - default-gateway: 4.2.0 - ipaddr.js: 1.9.1 - dev: false - - /invariant@2.2.4: - resolution: - { - integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==, - } - dependencies: - loose-envify: 1.4.0 - dev: false - - /ip-regex@2.1.0: - resolution: - { - integrity: sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==, - } - engines: { node: ">=4" } - dev: false - - /ipaddr.js@1.9.1: - resolution: - { - integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==, - } - engines: { node: ">= 0.10" } - dev: false - /is-absolute-url@4.0.1: resolution: { @@ -9379,13 +5006,6 @@ packages: binary-extensions: 2.2.0 dev: true - /is-buffer@1.1.6: - resolution: - { - integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==, - } - dev: false - /is-buffer@2.0.5: resolution: { @@ -9401,24 +5021,7 @@ packages: } dependencies: hasown: 2.0.0 - dev: false - - /is-docker@2.2.1: - resolution: - { - integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==, - } - engines: { node: ">=8" } - hasBin: true - dev: false - - /is-extglob@1.0.0: - resolution: - { - integrity: sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==, - } - engines: { node: ">=0.10.0" } - dev: false + dev: true /is-extglob@2.1.1: resolution: @@ -9427,24 +5030,6 @@ packages: } engines: { node: ">=0.10.0" } - /is-fullwidth-code-point@3.0.0: - resolution: - { - integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, - } - engines: { node: ">=8" } - dev: false - - /is-glob@2.0.1: - resolution: - { - integrity: sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==, - } - engines: { node: ">=0.10.0" } - dependencies: - is-extglob: 1.0.0 - dev: false - /is-glob@4.0.3: resolution: { @@ -9454,16 +5039,6 @@ packages: dependencies: is-extglob: 2.1.1 - /is-invalid-path@0.1.0: - resolution: - { - integrity: sha512-aZMG0T3F34mTg4eTdszcGXx54oiZ4NtHSft3hWNJMGJXUUqdIj3cOZuHcU0nCWWcY3jd7yRe/3AEm3vSNTpBGQ==, - } - engines: { node: ">=0.10.0" } - dependencies: - is-glob: 2.0.1 - dev: false - /is-number@7.0.0: resolution: { @@ -9479,14 +5054,6 @@ packages: engines: { node: ">=0.10.0" } dev: false - /is-path-cwd@2.2.0: - resolution: - { - integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==, - } - engines: { node: ">=6" } - dev: false - /is-path-inside@3.0.3: resolution: { @@ -9505,114 +5072,45 @@ packages: /is-promise@2.2.2: resolution: { - integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==, - } - dev: true - - /is-regexp@1.0.0: - resolution: - { - integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==, - } - engines: { node: ">=0.10.0" } - dev: false - - /is-stream@1.1.0: - resolution: - { - integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==, - } - engines: { node: ">=0.10.0" } - dev: false - - /is-stream@2.0.1: - resolution: - { - integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, - } - engines: { node: ">=8" } - dev: false - - /is-valid-path@0.1.1: - resolution: - { - integrity: sha512-+kwPrVDu9Ms03L90Qaml+79+6DZHqHyRoANI6IsZJ/g8frhnfchDOBCa0RbQ6/kdHt5CS5OeIEyrYznNuVN+8A==, - } - engines: { node: ">=0.10.0" } - dependencies: - is-invalid-path: 0.1.0 - dev: false - - /is-what@4.1.16: - resolution: - { - integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==, - } - engines: { node: ">=12.13" } - dev: true - - /is-wsl@2.2.0: - resolution: - { - integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==, - } - engines: { node: ">=8" } - dependencies: - is-docker: 2.2.1 - dev: false - - /isexe@2.0.0: - resolution: - { - integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, - } - - /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: false + integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==, + } + dev: true - /javascript-time-ago@2.5.9: + /is-regexp@1.0.0: resolution: { - integrity: sha512-pQ8mNco/9g9TqWXWWjP0EWl6i/lAQScOyEeXy5AB+f7MfLSdgyV9BJhiOD1zrIac/lrxPYOWNbyl/IW8CW5n0A==, + integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==, } - dependencies: - relative-time-format: 1.1.6 + engines: { node: ">=0.10.0" } dev: false - /jimp-compact@0.16.1: + /is-what@4.1.16: resolution: { - integrity: sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==, + integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==, } - dev: false + engines: { node: ">=12.13" } + dev: true - /join-component@1.1.0: + /isexe@2.0.0: resolution: { - integrity: sha512-bF7vcQxbODoGK1imE2P9GS9aw4zD0Sd+Hni68IMZLj7zRnquH7dXUmMw9hDI5S/Jzt7q+IyTXN0rSg2GI0IKhQ==, + integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, } - dev: false - /js-base64@3.7.5: + /javascript-time-ago@2.5.9: resolution: { - integrity: sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==, + integrity: sha512-pQ8mNco/9g9TqWXWWjP0EWl6i/lAQScOyEeXy5AB+f7MfLSdgyV9BJhiOD1zrIac/lrxPYOWNbyl/IW8CW5n0A==, } + dependencies: + relative-time-format: 1.1.6 dev: false - /js-tokens@4.0.0: + /js-base64@3.7.6: resolution: { - integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, + integrity: sha512-NPrWuHFxFUknr1KqJRDgUQPexQF0uIJWjeT+2KjEePhitQxQEx5EJBG1lVn5/hc8aLycTpXrDOgPQ6Zq+EDiTA==, } dev: false @@ -9636,30 +5134,6 @@ packages: dependencies: argparse: 2.0.1 - /jsc-safe-url@0.2.4: - resolution: - { - integrity: sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==, - } - dev: false - - /jsesc@0.5.0: - resolution: - { - integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==, - } - hasBin: true - dev: false - - /jsesc@2.5.2: - resolution: - { - integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==, - } - engines: { node: ">=4" } - hasBin: true - dev: false - /json-buffer@3.0.1: resolution: { @@ -9678,23 +5152,6 @@ packages: dreamopt: 0.8.0 dev: true - /json-schema-deref-sync@0.13.0: - resolution: - { - integrity: sha512-YBOEogm5w9Op337yb6pAT6ZXDqlxAsQCanM3grid8lMWNxRJO/zWEJi3ZzqDL8boWfwhTFym5EFrNgWwpqcBRg==, - } - engines: { node: ">=6.0.0" } - dependencies: - clone: 2.1.2 - dag-map: 1.0.2 - is-valid-path: 0.1.1 - lodash: 4.17.21 - md5: 2.2.1 - memory-cache: 0.2.0 - traverse: 0.6.8 - valid-url: 1.0.9 - dev: false - /json-schema-traverse@0.4.1: resolution: { @@ -9714,35 +5171,6 @@ packages: integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, } - /json5@2.2.3: - resolution: - { - integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, - } - engines: { node: ">=6" } - hasBin: true - dev: false - - /jsonfile@4.0.0: - resolution: - { - integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==, - } - optionalDependencies: - graceful-fs: 4.2.11 - dev: false - - /jsonfile@6.1.0: - resolution: - { - integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==, - } - dependencies: - universalify: 2.0.1 - optionalDependencies: - graceful-fs: 4.2.11 - dev: false - /keyv@4.5.4: resolution: { @@ -9751,14 +5179,6 @@ packages: dependencies: json-buffer: 3.0.1 - /kleur@3.0.3: - resolution: - { - integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==, - } - engines: { node: ">=6" } - dev: false - /levn@0.4.1: resolution: { @@ -9769,10 +5189,10 @@ packages: prelude-ls: 1.2.1 type-check: 0.4.0 - /libsql@0.2.0-pre.6: + /libsql@0.2.0-pre.7: resolution: { - integrity: sha512-yh418UB3WTnXfYPagqQhevIxaMjOSuLfCN/weSgYytYnZybto//Ww8C3+MWgehRavF2Ox85I4J0ug7KEguidyw==, + integrity: sha512-f2AmB3KvTYfYJUcERjed2RXKrnqZK2KvXkhnrpU+L7SQRtSYZqtChN70Pp0bKHGDkBXWvBLklpcwLpRNtwXStA==, } cpu: [x64, arm64] os: [darwin, linux, win32] @@ -9780,146 +5200,13 @@ packages: "@neon-rs/load": 0.0.4 detect-libc: 2.0.2 optionalDependencies: - "@libsql/darwin-arm64": 0.2.0-pre.6 - "@libsql/darwin-x64": 0.2.0-pre.6 - "@libsql/linux-arm64-gnu": 0.2.0-pre.6 - "@libsql/linux-arm64-musl": 0.2.0-pre.6 - "@libsql/linux-x64-gnu": 0.2.0-pre.6 - "@libsql/linux-x64-musl": 0.2.0-pre.6 - "@libsql/win32-x64-msvc": 0.2.0-pre.6 - dev: false - - /lightningcss-darwin-arm64@1.19.0: - resolution: - { - integrity: sha512-wIJmFtYX0rXHsXHSr4+sC5clwblEMji7HHQ4Ub1/CznVRxtCFha6JIt5JZaNf8vQrfdZnBxLLC6R8pC818jXqg==, - } - engines: { node: ">= 12.0.0" } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /lightningcss-darwin-x64@1.19.0: - resolution: - { - integrity: sha512-Lif1wD6P4poaw9c/4Uh2z+gmrWhw/HtXFoeZ3bEsv6Ia4tt8rOJBdkfVaUJ6VXmpKHALve+iTyP2+50xY1wKPw==, - } - engines: { node: ">= 12.0.0" } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /lightningcss-linux-arm-gnueabihf@1.19.0: - resolution: - { - integrity: sha512-P15VXY5682mTXaiDtbnLYQflc8BYb774j2R84FgDLJTN6Qp0ZjWEFyN1SPqyfTj2B2TFjRHRUvQSSZ7qN4Weig==, - } - engines: { node: ">= 12.0.0" } - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /lightningcss-linux-arm64-gnu@1.19.0: - resolution: - { - integrity: sha512-zwXRjWqpev8wqO0sv0M1aM1PpjHz6RVIsBcxKszIG83Befuh4yNysjgHVplF9RTU7eozGe3Ts7r6we1+Qkqsww==, - } - engines: { node: ">= 12.0.0" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /lightningcss-linux-arm64-musl@1.19.0: - resolution: - { - integrity: sha512-vSCKO7SDnZaFN9zEloKSZM5/kC5gbzUjoJQ43BvUpyTFUX7ACs/mDfl2Eq6fdz2+uWhUh7vf92c4EaaP4udEtA==, - } - engines: { node: ">= 12.0.0" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /lightningcss-linux-x64-gnu@1.19.0: - resolution: - { - integrity: sha512-0AFQKvVzXf9byrXUq9z0anMGLdZJS+XSDqidyijI5njIwj6MdbvX2UZK/c4FfNmeRa2N/8ngTffoIuOUit5eIQ==, - } - engines: { node: ">= 12.0.0" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /lightningcss-linux-x64-musl@1.19.0: - resolution: - { - integrity: sha512-SJoM8CLPt6ECCgSuWe+g0qo8dqQYVcPiW2s19dxkmSI5+Uu1GIRzyKA0b7QqmEXolA+oSJhQqCmJpzjY4CuZAg==, - } - engines: { node: ">= 12.0.0" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /lightningcss-win32-x64-msvc@1.19.0: - resolution: - { - integrity: sha512-C+VuUTeSUOAaBZZOPT7Etn/agx/MatzJzGRkeV+zEABmPuntv1zihncsi+AyGmjkkzq3wVedEy7h0/4S84mUtg==, - } - engines: { node: ">= 12.0.0" } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /lightningcss@1.19.0: - resolution: - { - integrity: sha512-yV5UR7og+Og7lQC+70DA7a8ta1uiOPnWPJfxa0wnxylev5qfo4P+4iMpzWAdYWOca4jdNQZii+bDL/l+4hUXIA==, - } - engines: { node: ">= 12.0.0" } - dependencies: - detect-libc: 1.0.3 - optionalDependencies: - lightningcss-darwin-arm64: 1.19.0 - lightningcss-darwin-x64: 1.19.0 - lightningcss-linux-arm-gnueabihf: 1.19.0 - lightningcss-linux-arm64-gnu: 1.19.0 - lightningcss-linux-arm64-musl: 1.19.0 - lightningcss-linux-x64-gnu: 1.19.0 - lightningcss-linux-x64-musl: 1.19.0 - lightningcss-win32-x64-msvc: 1.19.0 - dev: false - - /lines-and-columns@1.2.4: - resolution: - { - integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, - } - dev: false - - /locate-path@3.0.0: - resolution: - { - integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==, - } - engines: { node: ">=6" } - dependencies: - p-locate: 3.0.0 - path-exists: 3.0.0 + "@libsql/darwin-arm64": 0.2.0-pre.7 + "@libsql/darwin-x64": 0.2.0-pre.7 + "@libsql/linux-arm64-gnu": 0.2.0-pre.7 + "@libsql/linux-arm64-musl": 0.2.0-pre.7 + "@libsql/linux-x64-gnu": 0.2.0-pre.7 + "@libsql/linux-x64-musl": 0.2.0-pre.7 + "@libsql/win32-x64-msvc": 0.2.0-pre.7 dev: false /locate-path@6.0.0: @@ -9931,13 +5218,6 @@ packages: dependencies: p-locate: 5.0.0 - /lodash.debounce@4.0.8: - resolution: - { - integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==, - } - dev: false - /lodash.merge@4.6.2: resolution: { @@ -9958,16 +5238,6 @@ packages: } dev: false - /log-symbols@2.2.0: - resolution: - { - integrity: sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==, - } - engines: { node: ">=4" } - dependencies: - chalk: 2.4.2 - dev: false - /longest-streak@3.1.0: resolution: { @@ -9975,16 +5245,6 @@ packages: } dev: false - /loose-envify@1.4.0: - resolution: - { - integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==, - } - hasBin: true - dependencies: - js-tokens: 4.0.0 - dev: false - /lowlight@3.1.0: resolution: { @@ -9996,23 +5256,6 @@ packages: highlight.js: 11.9.0 dev: false - /lru-cache@10.1.0: - resolution: - { - integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==, - } - engines: { node: 14 || >=16.14 } - dev: false - - /lru-cache@5.1.1: - resolution: - { - integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, - } - dependencies: - yallist: 3.1.1 - dev: false - /lru-cache@6.0.0: resolution: { @@ -10037,7 +5280,7 @@ packages: integrity: sha512-MXJILHb4xyvf3qjO7w7mDnvVOub2LGWLSjgP1TBGPLDkBF62uXNfvPNH7QRvOwvuSLtQK+w7JoPjnjiFiIj9rg==, } dependencies: - oslo: 0.27.0 + oslo: 0.27.1 dev: false /magic-string@0.25.9: @@ -10066,46 +5309,6 @@ packages: } dev: false - /md5-file@3.2.3: - resolution: - { - integrity: sha512-3Tkp1piAHaworfcCgH0jKbTvj1jWWFgbvh2cXaNCgHwyTCBxxvD1Y04rmfpvdPm1P4oXMOpm6+2H7sr7v9v8Fw==, - } - engines: { node: ">=0.10" } - hasBin: true - dependencies: - buffer-alloc: 1.2.0 - dev: false - - /md5@2.2.1: - resolution: - { - integrity: sha512-PlGG4z5mBANDGCKsYQe0CaUYHdZYZt8ZPZLmEt+Urf0W4GlpTX4HescwHU+dc9+Z/G/vZKYZYFrwgm9VxK6QOQ==, - } - dependencies: - charenc: 0.0.2 - crypt: 0.0.2 - is-buffer: 1.1.6 - dev: false - - /md5@2.3.0: - resolution: - { - integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==, - } - dependencies: - charenc: 0.0.2 - crypt: 0.0.2 - is-buffer: 1.1.6 - dev: false - - /md5hex@1.0.0: - resolution: - { - integrity: sha512-c2YOUbp33+6thdCUi34xIyOU/a7bvGKj/3DB1iaPMTuPHf/Q2d5s4sn1FaCOO43XkXggnb08y5W2PU8UNYNLKQ==, - } - dev: false - /mdast-util-find-and-replace@3.0.1: resolution: { @@ -10237,10 +5440,10 @@ packages: unist-util-is: 6.0.0 dev: false - /mdast-util-to-hast@13.0.2: + /mdast-util-to-hast@13.1.0: resolution: { - integrity: sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==, + integrity: sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==, } dependencies: "@types/hast": 3.0.3 @@ -10251,6 +5454,7 @@ packages: trim-lines: 3.0.1 unist-util-position: 5.0.0 unist-util-visit: 5.0.0 + vfile: 6.0.1 dev: false /mdast-util-to-markdown@2.1.0: @@ -10287,14 +5491,6 @@ packages: "@types/mdast": 4.0.3 dev: false - /media-typer@0.3.0: - resolution: - { - integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==, - } - engines: { node: ">= 0.6" } - dev: false - /memoizee@0.4.15: resolution: { @@ -10311,13 +5507,6 @@ packages: timers-ext: 0.1.7 dev: true - /memory-cache@0.2.0: - resolution: - { - integrity: sha512-OcjA+jzjOYzKmKS6IQVALHLVz+rNTMPoJvCztFaZxwG14wtAW7VRZjwTQu06vKCYOxh4jVnik7ya0SXTB0W+xA==, - } - dev: false - /merge2@1.4.1: resolution: { @@ -10326,58 +5515,6 @@ packages: engines: { node: ">= 8" } dev: false - /metro-react-native-babel-preset@0.76.8(@babel/core@7.23.7): - resolution: - { - integrity: sha512-Ptza08GgqzxEdK8apYsjTx2S8WDUlS2ilBlu9DR1CUcHmg4g3kOkFylZroogVAUKtpYQNYwAvdsjmrSdDNtiAg==, - } - engines: { node: ">=16" } - peerDependencies: - "@babel/core": "*" - dependencies: - "@babel/core": 7.23.7 - "@babel/plugin-proposal-async-generator-functions": 7.20.7(@babel/core@7.23.7) - "@babel/plugin-proposal-class-properties": 7.18.6(@babel/core@7.23.7) - "@babel/plugin-proposal-export-default-from": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-proposal-nullish-coalescing-operator": 7.18.6(@babel/core@7.23.7) - "@babel/plugin-proposal-numeric-separator": 7.18.6(@babel/core@7.23.7) - "@babel/plugin-proposal-object-rest-spread": 7.20.7(@babel/core@7.23.7) - "@babel/plugin-proposal-optional-catch-binding": 7.18.6(@babel/core@7.23.7) - "@babel/plugin-proposal-optional-chaining": 7.21.0(@babel/core@7.23.7) - "@babel/plugin-syntax-dynamic-import": 7.8.3(@babel/core@7.23.7) - "@babel/plugin-syntax-export-default-from": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-syntax-flow": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-syntax-nullish-coalescing-operator": 7.8.3(@babel/core@7.23.7) - "@babel/plugin-syntax-optional-chaining": 7.8.3(@babel/core@7.23.7) - "@babel/plugin-transform-arrow-functions": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-async-to-generator": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-block-scoping": 7.23.4(@babel/core@7.23.7) - "@babel/plugin-transform-classes": 7.23.5(@babel/core@7.23.7) - "@babel/plugin-transform-computed-properties": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-destructuring": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-flow-strip-types": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-function-name": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-literals": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-modules-commonjs": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-named-capturing-groups-regex": 7.22.5(@babel/core@7.23.7) - "@babel/plugin-transform-parameters": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-react-display-name": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-react-jsx": 7.23.4(@babel/core@7.23.7) - "@babel/plugin-transform-react-jsx-self": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-react-jsx-source": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-runtime": 7.23.7(@babel/core@7.23.7) - "@babel/plugin-transform-shorthand-properties": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-spread": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-sticky-regex": 7.23.3(@babel/core@7.23.7) - "@babel/plugin-transform-typescript": 7.23.6(@babel/core@7.23.7) - "@babel/plugin-transform-unicode-regex": 7.23.3(@babel/core@7.23.7) - "@babel/template": 7.22.15 - babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.23.7) - react-refresh: 0.4.3 - transitivePeerDependencies: - - supports-color - dev: false - /micromark-core-commonmark@2.0.0: resolution: { @@ -10733,27 +5870,9 @@ packages: { integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, } - engines: { node: ">= 0.6" } - dependencies: - mime-db: 1.52.0 - dev: false - - /mime@1.6.0: - resolution: - { - integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==, - } - engines: { node: ">=4" } - hasBin: true - dev: false - - /mime@2.6.0: - resolution: - { - integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==, - } - engines: { node: ">=4.0.0" } - hasBin: true + engines: { node: ">= 0.6" } + dependencies: + mime-db: 1.52.0 dev: false /mime@3.0.0: @@ -10765,14 +5884,6 @@ packages: hasBin: true dev: true - /mimic-fn@1.2.0: - resolution: - { - integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==, - } - engines: { node: ">=4" } - dev: false - /mimic-response@3.1.0: resolution: { @@ -10781,23 +5892,23 @@ packages: engines: { node: ">=10" } dev: false - /miniflare@3.20231030.4: + /miniflare@3.20231218.2: resolution: { - integrity: sha512-7MBz0ArLuDop1WJGZC6tFgN6c5MRyDOIlxbm3yp0TRBpvDS/KsTuWCQcCjsxN4QQ5zvL3JTkuIZbQzRRw/j6ow==, + integrity: sha512-rCUI2OjqCf3fZVdmSX4DOZQRzSDvHp/oL2vjER/cvJEdWSYiqRxDp2oO7A7JcEo1/Y+kPa5VQ1pFfdZpjBcpFg==, } engines: { node: ">=16.13" } hasBin: true dependencies: + "@cspotcode/source-map-support": 0.8.1 acorn: 8.11.3 - acorn-walk: 8.3.1 + acorn-walk: 8.3.2 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.28.2 - workerd: 1.20231030.0 + workerd: 1.20231218.0 ws: 8.16.0 youch: 3.3.3 zod: 3.22.4 @@ -10823,6 +5934,7 @@ packages: engines: { node: ">=10" } dependencies: brace-expansion: 2.0.1 + dev: true /minimatch@7.4.6: resolution: @@ -10851,73 +5963,6 @@ packages: } dev: false - /minipass-collect@1.0.2: - resolution: - { - integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==, - } - engines: { node: ">= 8" } - dependencies: - minipass: 3.1.6 - dev: false - - /minipass-flush@1.0.5: - resolution: - { - integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==, - } - engines: { node: ">= 8" } - dependencies: - minipass: 3.1.6 - dev: false - - /minipass-pipeline@1.2.4: - resolution: - { - integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==, - } - engines: { node: ">=8" } - dependencies: - minipass: 3.1.6 - dev: false - - /minipass@3.1.6: - resolution: - { - integrity: sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==, - } - engines: { node: ">=8" } - dependencies: - yallist: 4.0.0 - dev: false - - /minipass@5.0.0: - resolution: - { - integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==, - } - engines: { node: ">=8" } - dev: false - - /minipass@7.0.4: - resolution: - { - integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==, - } - engines: { node: ">=16 || 14 >=14.17" } - dev: false - - /minizlib@2.1.2: - resolution: - { - integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==, - } - engines: { node: ">= 8" } - dependencies: - minipass: 3.1.6 - yallist: 4.0.0 - dev: false - /mkdirp-classic@0.5.3: resolution: { @@ -10925,45 +5970,12 @@ packages: } dev: false - /mkdirp@0.5.6: - resolution: - { - integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==, - } - hasBin: true - dependencies: - minimist: 1.2.8 - dev: false - - /mkdirp@1.0.4: - resolution: - { - integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==, - } - engines: { node: ">=10" } - hasBin: true - dev: false - - /ms@2.0.0: - resolution: - { - integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==, - } - dev: false - /ms@2.1.2: resolution: { integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, } - /ms@2.1.3: - resolution: - { - integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, - } - dev: false - /mustache@4.2.0: resolution: { @@ -10972,31 +5984,6 @@ packages: hasBin: true dev: true - /mv@2.1.1: - resolution: - { - integrity: sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==, - } - engines: { node: ">=0.8.0" } - requiresBuild: true - dependencies: - mkdirp: 0.5.6 - ncp: 2.0.0 - rimraf: 2.4.5 - dev: false - optional: true - - /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 - /nanoid@3.3.7: resolution: { @@ -11027,31 +6014,6 @@ packages: integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, } - /ncp@2.0.0: - resolution: - { - integrity: sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==, - } - hasBin: true - requiresBuild: true - dev: false - optional: true - - /negotiator@0.6.3: - resolution: - { - integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==, - } - engines: { node: ">= 0.6" } - dev: false - - /nested-error-stacks@2.0.1: - resolution: - { - integrity: sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==, - } - dev: false - /next-tick@1.1.0: resolution: { @@ -11059,17 +6021,10 @@ packages: } dev: true - /nice-try@1.0.5: - resolution: - { - integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==, - } - dev: false - - /node-abi@3.52.0: + /node-abi@3.54.0: resolution: { - integrity: sha512-JJ98b02z16ILv7859irtXn4oUaFWADtvkzy2c0IAatNVX2Mc9Yoh8z6hZInn3QwvMEYhHuQloYi+TTQy67SIdQ==, + integrity: sha512-p7eGEiQil0YUV3ItH4/tBb781L5impVmmx2E9FRKF7d18XXzp4PGT2tdYMFY6wQqgxD0IwNZOiSJ0/K0fSi/OA==, } engines: { node: ">=10" } dependencies: @@ -11092,254 +6047,86 @@ packages: 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-fetch@3.3.2: - resolution: - { - integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - dependencies: - data-uri-to-buffer: 4.0.1 - fetch-blob: 3.2.0 - formdata-polyfill: 4.0.10 - dev: false - - /node-forge@1.3.1: - resolution: - { - integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==, - } - engines: { node: ">= 6.13.0" } - - /node-releases@2.0.14: - resolution: - { - integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==, - } - dev: false - - /noop-fn@1.0.0: - resolution: - { - integrity: sha512-pQ8vODlgXt2e7A3mIbFDlizkr46r75V+BJxVAyat8Jl7YmI513gG5cfyRL0FedKraoZ+VAouI1h4/IWpus5pcQ==, - } - dev: false - - /normalize-path@3.0.0: - resolution: - { - integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, - } - engines: { node: ">=0.10.0" } - dev: true - - /npm-package-arg@7.0.0: - resolution: - { - integrity: sha512-xXxr8y5U0kl8dVkz2oK7yZjPBvqM2fwaO5l3Yg13p03v8+E3qQcD0JNhHzjL1vyGgxcKkD0cco+NLR72iuPk3g==, - } - dependencies: - hosted-git-info: 3.0.8 - osenv: 0.1.5 - semver: 5.7.2 - validate-npm-package-name: 3.0.0 - dev: false - - /npm-run-path@2.0.2: - resolution: - { - integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==, - } - engines: { node: ">=4" } - dependencies: - path-key: 2.0.1 - dev: false - - /nullthrows@1.1.1: - resolution: - { - integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==, - } - dev: false - - /object-assign@4.1.1: - resolution: - { - integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==, - } - engines: { node: ">=0.10.0" } - dev: false - - /object-inspect@1.13.1: - resolution: - { - integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==, - } - dev: false - - /on-finished@2.3.0: - resolution: - { - integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==, - } - engines: { node: ">= 0.8" } - dependencies: - ee-first: 1.1.1 - dev: false - - /on-finished@2.4.1: - resolution: - { - integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==, - } - engines: { node: ">= 0.8" } - dependencies: - ee-first: 1.1.1 - dev: false - - /once@1.4.0: - resolution: - { - integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, - } - dependencies: - wrappy: 1.0.2 - - /onetime@2.0.1: - resolution: - { - integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==, - } - engines: { node: ">=4" } - dependencies: - mimic-fn: 1.2.0 - dev: false - - /open@8.4.2: - resolution: - { - integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==, - } - engines: { node: ">=12" } - dependencies: - define-lazy-prop: 2.0.0 - is-docker: 2.2.1 - is-wsl: 2.2.0 - dev: false - - /openapi-types@12.1.3: - resolution: - { - integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==, - } - dev: false - - /openapi3-ts@4.2.1: - resolution: - { - integrity: sha512-KL1mKwkZii5ce+tb24KCUmQHyWB/oanG5fzUY35UB+wenWJv4Kr/IWBntpn5R8ODiJcxx13ZDophcpHnLGeIOw==, - } - dependencies: - yaml: 2.3.4 - - /optionator@0.9.3: - resolution: - { - integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==, - } - engines: { node: ">= 0.8.0" } + peerDependenciesMeta: + encoding: + optional: true dependencies: - "@aashutoshrathi/word-wrap": 1.2.6 - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 + whatwg-url: 5.0.0 + dev: false - /ora@3.4.0: + /node-fetch@3.3.2: resolution: { - integrity: sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==, + integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==, } - engines: { node: ">=6" } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } dependencies: - chalk: 2.4.2 - cli-cursor: 2.1.0 - cli-spinners: 2.9.2 - log-symbols: 2.2.0 - strip-ansi: 5.2.0 - wcwidth: 1.0.1 + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 dev: false - /os-homedir@1.0.2: + /node-forge@1.3.1: resolution: { - integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==, + integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==, } - engines: { node: ">=0.10.0" } - dev: false + engines: { node: ">= 6.13.0" } + dev: true - /os-tmpdir@1.0.2: + /normalize-path@3.0.0: resolution: { - integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==, + integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, } engines: { node: ">=0.10.0" } - dev: false + dev: true - /osenv@0.1.5: + /once@1.4.0: resolution: { - integrity: sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==, + integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, } dependencies: - os-homedir: 1.0.2 - os-tmpdir: 1.0.2 - dev: false + wrappy: 1.0.2 - /oslo@0.26.2: + /openapi-types@12.1.3: resolution: { - integrity: sha512-SY5AhyEc/Lvpq9ZeP/MuGXzI+TV6WRAIgSKtfyc0+/BSOhZr8vVTt/mfhOTATk41VsDeYcDutMKgLmFGOL4UMw==, + integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==, } - dependencies: - "@node-rs/argon2": 1.5.2 - "@node-rs/bcrypt": 1.7.3 dev: false - /oslo@0.27.0: + /openapi3-ts@4.2.1: resolution: { - integrity: sha512-93bfsAlsn2du5rUVUmdmXyTJW7nsO1dViouMc2B9sjmCUzqnTYMtvHSuqti/cmgm96XZIVJEjU+mMWfceLWyYQ==, + integrity: sha512-KL1mKwkZii5ce+tb24KCUmQHyWB/oanG5fzUY35UB+wenWJv4Kr/IWBntpn5R8ODiJcxx13ZDophcpHnLGeIOw==, } dependencies: - "@node-rs/argon2": 1.6.1 - "@node-rs/bcrypt": 1.8.1 - dev: false + yaml: 2.3.4 - /p-finally@1.0.0: + /optionator@0.9.3: resolution: { - integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==, + integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==, } - engines: { node: ">=4" } - dev: false + engines: { node: ">= 0.8.0" } + dependencies: + "@aashutoshrathi/word-wrap": 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 - /p-limit@2.3.0: + /oslo@0.27.1: resolution: { - integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, + integrity: sha512-AYU0LpwZ50wIMD3dr4NX0tQzjwxaejSSV9reiY9jbQfgODt49al3f3tMcijyddyvPknUPArz845vpswWyJTWvA==, } - engines: { node: ">=6" } dependencies: - p-try: 2.2.0 + "@node-rs/argon2": 1.7.2 + "@node-rs/bcrypt": 1.9.2 dev: false /p-limit@3.1.0: @@ -11351,16 +6138,6 @@ packages: dependencies: yocto-queue: 0.1.0 - /p-locate@3.0.0: - resolution: - { - integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==, - } - engines: { node: ">=6" } - dependencies: - p-limit: 2.3.0 - dev: false - /p-locate@5.0.0: resolution: { @@ -11370,24 +6147,6 @@ packages: dependencies: p-limit: 3.1.0 - /p-map@4.0.0: - resolution: - { - integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==, - } - engines: { node: ">=10" } - dependencies: - aggregate-error: 3.1.0 - dev: false - - /p-try@2.2.0: - resolution: - { - integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, - } - engines: { node: ">=6" } - dev: false - /parent-module@1.0.1: resolution: { @@ -11405,16 +6164,6 @@ packages: engines: { node: ">=12" } dev: false - /parse-png@2.1.0: - resolution: - { - integrity: sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==, - } - engines: { node: ">=10" } - dependencies: - pngjs: 3.4.0 - dev: false - /parse5@7.1.2: resolution: { @@ -11424,39 +6173,6 @@ packages: entities: 4.5.0 dev: false - /parseurl@1.3.3: - resolution: - { - integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==, - } - engines: { node: ">= 0.8" } - dev: false - - /password-prompt@1.1.3: - resolution: - { - integrity: sha512-HkrjG2aJlvF0t2BMH0e2LB/EHf3Lcq3fNMzy4GYHcQblAvOl+QQji1Lx7WRBMqpVK8p+KR7bCg7oqAMXtdgqyw==, - } - dependencies: - ansi-escapes: 4.3.2 - cross-spawn: 7.0.3 - dev: false - - /path-browserify@1.0.1: - resolution: - { - integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==, - } - dev: false - - /path-exists@3.0.0: - resolution: - { - integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==, - } - engines: { node: ">=4" } - dev: false - /path-exists@4.0.0: resolution: { @@ -11471,14 +6187,6 @@ packages: } engines: { node: ">=0.10.0" } - /path-key@2.0.1: - resolution: - { - integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==, - } - engines: { node: ">=4" } - dev: false - /path-key@3.1.1: resolution: { @@ -11491,18 +6199,7 @@ packages: { integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, } - dev: false - - /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: false + dev: true /path-to-regexp@6.2.1: resolution: @@ -11533,45 +6230,7 @@ packages: } engines: { node: ">=8.6" } - /pirates@4.0.6: - resolution: - { - integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==, - } - engines: { node: ">= 6" } - dev: false - - /pkg-up@3.1.0: - resolution: - { - integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==, - } - engines: { node: ">=8" } - dependencies: - find-up: 3.0.0 - dev: false - - /plist@3.1.0: - resolution: - { - integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==, - } - engines: { node: ">=10.4.0" } - dependencies: - "@xmldom/xmldom": 0.8.10 - base64-js: 1.5.1 - xmlbuilder: 15.1.1 - dev: false - - /pngjs@3.4.0: - resolution: - { - integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==, - } - engines: { node: ">=4.0.0" } - dev: false - - /postcss-nested@6.0.1(postcss@8.4.32): + /postcss-nested@6.0.1(postcss@8.4.33): resolution: { integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==, @@ -11580,7 +6239,7 @@ packages: peerDependencies: postcss: ^8.2.14 dependencies: - postcss: 8.4.32 + postcss: 8.4.33 postcss-selector-parser: 6.0.15 dev: false @@ -11595,10 +6254,10 @@ packages: util-deprecate: 1.0.2 dev: false - /postcss@8.4.32: + /postcss@8.4.33: resolution: { - integrity: sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==, + integrity: sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==, } engines: { node: ^10 || ^12 || >=14 } dependencies: @@ -11607,13 +6266,6 @@ packages: source-map-js: 1.0.2 dev: false - /pouchdb-collections@1.0.1: - resolution: - { - integrity: sha512-31db6JRg4+4D5Yzc2nqsRqsA2oOkZS8DpFav3jf/qVNBxusKa2ClkEIZ2bJNpaDbMfWtnuSq59p6Bn+CipPMdg==, - } - dev: false - /prebuild-install@7.1.1: resolution: { @@ -11628,7 +6280,7 @@ packages: minimist: 1.2.8 mkdirp-classic: 0.5.3 napi-build-utils: 1.0.2 - node-abi: 3.52.0 + node-abi: 3.54.0 pump: 3.0.0 rc: 1.2.8 simple-get: 4.0.1 @@ -11641,222 +6293,90 @@ packages: { integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, } - engines: { node: ">= 0.8.0" } - - /prettier@3.1.1: - resolution: - { - integrity: sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==, - } - engines: { node: ">=14" } - hasBin: true - dev: false - - /pretty-bytes@5.6.0: - resolution: - { - integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==, - } - engines: { node: ">=6" } - dev: false - - /pretty-bytes@6.1.1: - resolution: - { - integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==, - } - engines: { node: ^14.13.1 || >=16.0.0 } - dev: false - - /pretty-format@26.6.2: - resolution: - { - integrity: sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==, - } - engines: { node: ">= 10" } - dependencies: - "@jest/types": 26.6.2 - ansi-regex: 5.0.1 - ansi-styles: 4.3.0 - react-is: 17.0.2 - dev: false - - /pretty-ms@8.0.0: - resolution: - { - integrity: sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==, - } - engines: { node: ">=14.16" } - dependencies: - parse-ms: 3.0.0 - dev: false - - /printable-characters@1.0.42: - resolution: - { - integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==, - } - dev: true - - /progress@2.0.3: - resolution: - { - integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==, - } - engines: { node: ">=0.4.0" } - dev: false - - /promise-inflight@1.0.1: - resolution: - { - integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==, - } - peerDependencies: - bluebird: "*" - peerDependenciesMeta: - bluebird: - optional: true - dev: false - - /promise@7.3.1: - resolution: - { - integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==, - } - dependencies: - asap: 2.0.6 - dev: false - - /prompts@2.4.2: - resolution: - { - integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==, - } - engines: { node: ">= 6" } - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - dev: false - - /property-information@6.4.0: - resolution: - { - integrity: sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ==, - } - dev: false - - /proxy-from-env@1.1.0: - resolution: - { - integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==, - } - 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" } + engines: { node: ">= 0.8.0" } - /qrcode-terminal@0.11.0: + /prettier@3.2.4: resolution: { - integrity: sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==, + integrity: sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==, } + engines: { node: ">=14" } hasBin: true dev: false - /qs@6.11.0: + /pretty-bytes@6.1.1: resolution: { - integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==, + integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==, } - engines: { node: ">=0.6" } - dependencies: - side-channel: 1.0.4 + engines: { node: ^14.13.1 || >=16.0.0 } dev: false - /querystringify@2.2.0: + /pretty-ms@8.0.0: resolution: { - integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==, + integrity: sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==, } + engines: { node: ">=14.16" } + dependencies: + parse-ms: 3.0.0 dev: false - /queue-microtask@1.2.3: + /printable-characters@1.0.42: resolution: { - integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, + integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==, } + dev: true - /range-parser@1.2.1: + /property-information@6.4.0: resolution: { - integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==, + integrity: sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ==, } - engines: { node: ">= 0.6" } dev: false - /raw-body@2.5.2: + /proxy-from-env@1.1.0: resolution: { - integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==, + integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==, } - engines: { node: ">= 0.8" } - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 dev: false - /rc@1.2.8: + /pump@3.0.0: resolution: { - integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==, + integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==, } - hasBin: true dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 + end-of-stream: 1.4.4 + once: 1.4.0 dev: false - /react-is@17.0.2: + /punycode@2.3.1: resolution: { - integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==, + integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, } - dev: false + engines: { node: ">=6" } - /react-refresh@0.4.3: + /queue-microtask@1.2.3: resolution: { - integrity: sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA==, + integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, } - engines: { node: ">=0.10.0" } - dev: false - /react@18.2.0: + /rc@1.2.8: resolution: { - integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==, + integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==, } - engines: { node: ">=0.10.0" } + hasBin: true dependencies: - loose-envify: 1.4.0 + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 dev: false /readable-stream@3.6.2: @@ -11881,23 +6401,6 @@ packages: picomatch: 2.3.1 dev: true - /regenerate-unicode-properties@10.1.1: - resolution: - { - integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==, - } - engines: { node: ">=4" } - dependencies: - regenerate: 1.4.2 - dev: false - - /regenerate@1.4.2: - resolution: - { - integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==, - } - dev: false - /regenerator-runtime@0.14.1: resolution: { @@ -11905,40 +6408,6 @@ packages: } dev: false - /regenerator-transform@0.15.2: - resolution: - { - integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==, - } - dependencies: - "@babel/runtime": 7.23.7 - dev: false - - /regexpu-core@5.3.2: - resolution: - { - integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==, - } - engines: { node: ">=4" } - dependencies: - "@babel/regjsgen": 0.8.0 - regenerate: 1.4.2 - regenerate-unicode-properties: 10.1.1 - regjsparser: 0.9.1 - unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.1.0 - dev: false - - /regjsparser@0.9.1: - resolution: - { - integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==, - } - hasBin: true - dependencies: - jsesc: 0.5.0 - dev: false - /rehype-external-links@3.0.0: resolution: { @@ -12069,15 +6538,15 @@ packages: - supports-color dev: false - /remark-rehype@11.0.0: + /remark-rehype@11.1.0: resolution: { - integrity: sha512-vx8x2MDMcxuE4lBmQ46zYUDfcFMmvg80WYX+UNLeG6ixjdCCLcw1lrgAukwBTuOFsS78eoAedHGn9sNM0w7TPw==, + integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==, } dependencies: "@types/hast": 3.0.3 "@types/mdast": 4.0.3 - mdast-util-to-hast: 13.0.2 + mdast-util-to-hast: 13.1.0 unified: 11.0.4 vfile: 6.0.1 dev: false @@ -12093,13 +6562,6 @@ packages: unified: 11.0.4 dev: false - /remove-trailing-slash@0.1.1: - resolution: - { - integrity: sha512-o4S4Qh6L2jpnCy83ysZDau+VORNvnFw07CKSAymkd6ICNVEPisMyzlc00KlvvicsxKck94SEwhDnMNdICzO+tA==, - } - dev: false - /require-from-string@2.0.2: resolution: { @@ -12108,32 +6570,6 @@ packages: engines: { node: ">=0.10.0" } dev: false - /requireg@0.2.2: - resolution: - { - integrity: sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==, - } - engines: { node: ">= 4.0.0" } - dependencies: - nested-error-stacks: 2.0.1 - rc: 1.2.8 - resolve: 1.7.1 - dev: false - - /requires-port@1.0.0: - resolution: - { - integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==, - } - dev: false - - /reselect@4.1.8: - resolution: - { - integrity: sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==, - } - dev: false - /resolve-from@4.0.0: resolution: { @@ -12141,14 +6577,6 @@ packages: } engines: { node: ">=4" } - /resolve-from@5.0.0: - resolution: - { - integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==, - } - engines: { node: ">=8" } - dev: false - /resolve-pkg-maps@1.0.0: resolution: { @@ -12174,27 +6602,7 @@ packages: is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: false - - /resolve@1.7.1: - resolution: - { - integrity: sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==, - } - dependencies: - path-parse: 1.0.7 - dev: false - - /restore-cursor@2.0.0: - resolution: - { - integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==, - } - engines: { node: ">=4" } - dependencies: - onetime: 2.0.1 - signal-exit: 3.0.7 - dev: false + dev: true /reusify@1.0.4: resolution: @@ -12203,28 +6611,6 @@ packages: } engines: { iojs: ">=1.0.0", node: ">=0.10.0" } - /rimraf@2.4.5: - resolution: - { - integrity: sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==, - } - hasBin: true - requiresBuild: true - dependencies: - glob: 6.0.4 - dev: false - optional: true - - /rimraf@2.7.1: - resolution: - { - integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==, - } - hasBin: true - dependencies: - glob: 7.2.3 - dev: false - /rimraf@3.0.2: resolution: { @@ -12279,29 +6665,6 @@ packages: } dev: false - /safe-json-stringify@1.2.0: - resolution: - { - integrity: sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==, - } - requiresBuild: true - dev: false - optional: true - - /safer-buffer@2.1.2: - resolution: - { - integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, - } - dev: false - - /sax@1.3.0: - resolution: - { - integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==, - } - dev: false - /selfsigned@2.4.1: resolution: { @@ -12309,46 +6672,10 @@ packages: } engines: { node: ">=10" } dependencies: - "@types/node-forge": 1.3.10 + "@types/node-forge": 1.3.11 node-forge: 1.3.1 dev: true - /semver@5.7.2: - resolution: - { - integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==, - } - hasBin: true - dev: false - - /semver@6.3.1: - resolution: - { - integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, - } - hasBin: true - dev: false - - /semver@7.3.2: - resolution: - { - integrity: sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==, - } - engines: { node: ">=10" } - hasBin: true - dev: false - - /semver@7.5.3: - resolution: - { - integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==, - } - engines: { node: ">=10" } - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: false - /semver@7.5.4: resolution: { @@ -12359,126 +6686,21 @@ packages: dependencies: lru-cache: 6.0.0 - /send@0.18.0: - resolution: - { - integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==, - } - engines: { node: ">= 0.8.0" } - dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - dev: false - - /serialize-error@6.0.0: - resolution: - { - integrity: sha512-3vmBkMZLQO+BR4RPHcyRGdE09XCF6cvxzk2N2qn8Er3F91cy8Qt7VvEbZBOpaL53qsBbe2cFOefU6tRY6WDelA==, - } - engines: { node: ">=10" } - dependencies: - type-fest: 0.12.0 - dev: false - - /set-function-length@1.1.1: - resolution: - { - integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==, - } - engines: { node: ">= 0.4" } - dependencies: - define-data-property: 1.1.1 - get-intrinsic: 1.2.2 - gopd: 1.0.1 - has-property-descriptors: 1.0.1 - dev: false - - /setimmediate@1.0.5: - resolution: - { - integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==, - } - dev: false - - /setprototypeof@1.2.0: - resolution: - { - integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==, - } - dev: false - - /shebang-command@1.2.0: - resolution: - { - integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==, - } - engines: { node: ">=0.10.0" } - dependencies: - shebang-regex: 1.0.0 - dev: false - /shebang-command@2.0.0: resolution: { integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, } - engines: { node: ">=8" } - dependencies: - shebang-regex: 3.0.0 - - /shebang-regex@1.0.0: - resolution: - { - integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==, - } - engines: { node: ">=0.10.0" } - dev: false - - /shebang-regex@3.0.0: - resolution: - { - integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, - } - engines: { node: ">=8" } - - /side-channel@1.0.4: - resolution: - { - integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==, - } - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - object-inspect: 1.13.1 - dev: false - - /signal-exit@3.0.7: - resolution: - { - integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, - } - dev: false + engines: { node: ">=8" } + dependencies: + shebang-regex: 3.0.0 - /signal-exit@4.1.0: + /shebang-regex@3.0.0: resolution: { - integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, + integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, } - engines: { node: ">=14" } - dev: false + engines: { node: ">=8" } /simple-concat@1.0.1: resolution: @@ -12498,22 +6720,12 @@ packages: simple-concat: 1.0.1 dev: false - /simple-plist@1.3.1: - resolution: - { - integrity: sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==, - } - dependencies: - bplist-creator: 0.1.0 - bplist-parser: 0.3.1 - plist: 3.1.0 - dev: false - /sisteransi@1.0.5: resolution: { integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==, } + dev: true /slash@3.0.0: resolution: @@ -12523,14 +6735,6 @@ packages: engines: { node: ">=8" } dev: false - /slugify@1.6.6: - resolution: - { - integrity: sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==, - } - engines: { node: ">=8.0.0" } - dev: false - /source-map-js@1.0.2: resolution: { @@ -12572,15 +6776,6 @@ packages: } dev: false - /split@1.0.1: - resolution: - { - integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==, - } - dependencies: - through: 2.3.8 - dev: false - /sprintf-js@1.0.3: resolution: { @@ -12588,16 +6783,6 @@ packages: } dev: false - /ssri@8.0.1: - resolution: - { - integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==, - } - engines: { node: ">= 8" } - dependencies: - minipass: 3.1.6 - dev: false - /stacktracey@2.1.8: resolution: { @@ -12608,22 +6793,6 @@ packages: get-source: 2.0.12 dev: true - /statuses@1.5.0: - resolution: - { - integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==, - } - engines: { node: ">= 0.6" } - dev: false - - /statuses@2.0.1: - resolution: - { - integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==, - } - engines: { node: ">= 0.8" } - dev: false - /stoppable@1.1.0: resolution: { @@ -12632,38 +6801,6 @@ packages: engines: { node: ">=4", npm: ">=6" } dev: true - /stream-buffers@2.2.0: - resolution: - { - integrity: sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==, - } - engines: { node: ">= 0.10.0" } - dev: false - - /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 - dev: false - - /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: false - /string_decoder@1.3.0: resolution: { @@ -12695,16 +6832,6 @@ packages: is-regexp: 1.0.0 dev: false - /strip-ansi@5.2.0: - resolution: - { - integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==, - } - engines: { node: ">=6" } - dependencies: - ansi-regex: 4.1.1 - dev: false - /strip-ansi@6.0.1: resolution: { @@ -12714,24 +6841,6 @@ packages: 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: false - - /strip-eof@1.0.0: - resolution: - { - integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==, - } - engines: { node: ">=0.10.0" } - dev: false - /strip-json-comments@2.0.1: resolution: { @@ -12747,13 +6856,6 @@ packages: } engines: { node: ">=8" } - /structured-headers@0.4.1: - resolution: - { - integrity: sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==, - } - dev: false - /style-mod@4.1.0: resolution: { @@ -12761,37 +6863,6 @@ packages: } dev: false - /sucrase@3.35.0: - resolution: - { - integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==, - } - engines: { node: ">=16 || 14 >=14.17" } - hasBin: true - dependencies: - "@jridgewell/gen-mapping": 0.3.3 - commander: 4.1.1 - glob: 10.3.10 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.6 - ts-interface-checker: 0.1.13 - dev: false - - /sudo-prompt@8.2.5: - resolution: - { - integrity: sha512-rlBo3HU/1zAJUrkY6jNxDOC9eVYliG6nS4JA8u8KAshITd07tafMc/Br7xQwCSseXwJ2iCcHCE8SNWX3q8Z+kw==, - } - dev: false - - /sudo-prompt@9.1.1: - resolution: - { - integrity: sha512-es33J1g2HjMpyAhz8lOR+ICmXXAqTuKbuXuUWLhOLew20oN9oUCgCJx615U/v7aioZg7IX5lIh9x34vwneu4pA==, - } - dev: false - /superjson@2.2.1: resolution: { @@ -12802,16 +6873,6 @@ packages: copy-anything: 3.0.5 dev: true - /supports-color@5.5.0: - resolution: - { - integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==, - } - engines: { node: ">=4" } - dependencies: - has-flag: 3.0.0 - dev: false - /supports-color@7.2.0: resolution: { @@ -12821,24 +6882,13 @@ packages: dependencies: has-flag: 4.0.0 - /supports-hyperlinks@2.3.0: - resolution: - { - integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==, - } - engines: { node: ">=8" } - dependencies: - has-flag: 4.0.0 - supports-color: 7.2.0 - dev: false - /supports-preserve-symlinks-flag@1.0.0: resolution: { integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, } engines: { node: ">= 0.4" } - dev: false + dev: true /tailwind-merge@2.2.0: resolution: @@ -12846,7 +6896,7 @@ packages: integrity: sha512-SqqhhaL0T06SW59+JVNfAqKdqLs0497esifRrZ7jOaefP3o64fdFNDMrAQWZFMxTLJPiHVjRLUywT8uFz1xNWQ==, } dependencies: - "@babel/runtime": 7.23.7 + "@babel/runtime": 7.23.8 dev: false /tar-fs@2.1.1: @@ -12875,106 +6925,12 @@ packages: readable-stream: 3.6.2 dev: false - /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 - dev: false - - /temp-dir@1.0.0: - resolution: - { - integrity: sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==, - } - engines: { node: ">=4" } - dev: false - - /temp-dir@2.0.0: - resolution: - { - integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==, - } - engines: { node: ">=8" } - dev: false - - /tempy@0.3.0: - resolution: - { - integrity: sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ==, - } - engines: { node: ">=8" } - dependencies: - temp-dir: 1.0.0 - type-fest: 0.3.1 - unique-string: 1.0.0 - dev: false - - /tempy@0.7.1: - resolution: - { - integrity: sha512-vXPxwOyaNVi9nyczO16mxmHGpl6ASC5/TVhRRHpqeYHvKQm58EaWNvZXxAhR0lYYnBOQFjXjhzeLsaXdjxLjRg==, - } - engines: { node: ">=10" } - dependencies: - del: 6.1.1 - is-stream: 2.0.1 - temp-dir: 2.0.0 - type-fest: 0.16.0 - unique-string: 2.0.0 - dev: false - - /terminal-link@2.1.1: - resolution: - { - integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==, - } - engines: { node: ">=8" } - dependencies: - ansi-escapes: 4.3.2 - supports-hyperlinks: 2.3.0 - dev: false - /text-table@0.2.0: resolution: { integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, } - /thenify-all@1.6.0: - resolution: - { - integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==, - } - engines: { node: ">=0.8" } - dependencies: - thenify: 3.3.1 - dev: false - - /thenify@3.3.1: - resolution: - { - integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==, - } - dependencies: - any-promise: 1.3.0 - dev: false - - /through@2.3.8: - resolution: - { - integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==, - } - dev: false - /timers-ext@0.1.7: resolution: { @@ -12985,32 +6941,6 @@ packages: next-tick: 1.1.0 dev: true - /tiny-queue@0.2.1: - resolution: - { - integrity: sha512-EijGsv7kzd9I9g0ByCl6h42BWNGUZrlCSejfrb3AKeHC33SGbASu1VDf5O3rRiiUOhAC9CHdZxFPbZu0HmR70A==, - } - dev: false - - /tippy.js@6.3.7: - resolution: - { - integrity: sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==, - } - dependencies: - "@popperjs/core": 2.11.8 - dev: false - - /tmp@0.0.33: - resolution: - { - integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==, - } - engines: { node: ">=0.6.0" } - dependencies: - os-tmpdir: 1.0.2 - dev: false - /to-fast-properties@2.0.0: resolution: { @@ -13028,14 +6958,6 @@ packages: dependencies: is-number: 7.0.0 - /toidentifier@1.0.1: - resolution: - { - integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==, - } - engines: { node: ">=0.6" } - dev: false - /tr46@0.0.3: resolution: { @@ -13043,14 +6965,6 @@ packages: } dev: false - /traverse@0.6.8: - resolution: - { - integrity: sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==, - } - engines: { node: ">= 0.4" } - dev: false - /trim-lines@3.0.1: resolution: { @@ -13077,13 +6991,6 @@ packages: typescript: 5.3.3 dev: false - /ts-interface-checker@0.1.13: - resolution: - { - integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==, - } - dev: false - /tslib@2.6.2: resolution: { @@ -13101,76 +7008,33 @@ packages: esbuild: 0.19.11 get-tsconfig: 4.7.2 optionalDependencies: - fsevents: 2.3.3 - dev: true - - /tunnel-agent@0.6.0: - resolution: - { - integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==, - } - dependencies: - safe-buffer: 5.2.1 - dev: false - - /type-check@0.4.0: - resolution: - { - integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, - } - engines: { node: ">= 0.8.0" } - dependencies: - prelude-ls: 1.2.1 - - /type-fest@0.12.0: - resolution: - { - integrity: sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg==, - } - engines: { node: ">=10" } - dev: false - - /type-fest@0.16.0: - resolution: - { - integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==, - } - engines: { node: ">=10" } - dev: false - - /type-fest@0.20.2: - resolution: - { - integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==, - } - engines: { node: ">=10" } + fsevents: 2.3.3 + dev: true - /type-fest@0.21.3: + /tunnel-agent@0.6.0: resolution: { - integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==, + integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==, } - engines: { node: ">=10" } + dependencies: + safe-buffer: 5.2.1 dev: false - /type-fest@0.3.1: + /type-check@0.4.0: resolution: { - integrity: sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==, + integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, } - engines: { node: ">=6" } - dev: false + engines: { node: ">= 0.8.0" } + dependencies: + prelude-ls: 1.2.1 - /type-is@1.6.18: + /type-fest@0.20.2: resolution: { - integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==, + integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==, } - engines: { node: ">= 0.6" } - dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 - dev: false + engines: { node: ">=10" } /type@1.2.0: resolution: @@ -13194,13 +7058,6 @@ packages: engines: { node: ">=14.17" } hasBin: true - /ua-parser-js@1.0.37: - resolution: - { - integrity: sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==, - } - dev: false - /undici-types@5.26.5: resolution: { @@ -13217,53 +7074,18 @@ packages: "@fastify/busboy": 2.1.0 dev: true - /unhead@1.8.9: + /unhead@1.8.10: resolution: { - integrity: sha512-qqCNmA4KOEDjcl+OtRZTllGehXewcQ31zbHjvhl/jqCs2MfRcZoxFW1y7A4Y4BgR/O7PI89K+GoWGcxK3gn64Q==, + integrity: sha512-dth8FvZkLriO5ZWWOBIYBNSfGiwJtKcqpPWpSOk/Z0e2jdlgwoZEWZHFyte0EKvmbZxKcsWNMqIuv7dEmS5yZQ==, } dependencies: - "@unhead/dom": 1.8.9 - "@unhead/schema": 1.8.9 - "@unhead/shared": 1.8.9 + "@unhead/dom": 1.8.10 + "@unhead/schema": 1.8.10 + "@unhead/shared": 1.8.10 hookable: 5.5.3 dev: false - /unicode-canonical-property-names-ecmascript@2.0.0: - resolution: - { - integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==, - } - engines: { node: ">=4" } - dev: false - - /unicode-match-property-ecmascript@2.0.0: - resolution: - { - integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==, - } - engines: { node: ">=4" } - dependencies: - unicode-canonical-property-names-ecmascript: 2.0.0 - unicode-property-aliases-ecmascript: 2.1.0 - dev: false - - /unicode-match-property-value-ecmascript@2.1.0: - resolution: - { - integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==, - } - engines: { node: ">=4" } - dev: false - - /unicode-property-aliases-ecmascript@2.1.0: - resolution: - { - integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==, - } - engines: { node: ">=4" } - dev: false - /unified@10.1.2: resolution: { @@ -13294,44 +7116,6 @@ packages: vfile: 6.0.1 dev: false - /unique-filename@1.1.1: - resolution: - { - integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==, - } - dependencies: - unique-slug: 2.0.2 - dev: false - - /unique-slug@2.0.2: - resolution: - { - integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==, - } - dependencies: - imurmurhash: 0.1.4 - dev: false - - /unique-string@1.0.0: - resolution: - { - integrity: sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==, - } - engines: { node: ">=4" } - dependencies: - crypto-random-string: 1.0.0 - dev: false - - /unique-string@2.0.0: - resolution: - { - integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==, - } - engines: { node: ">=8" } - dependencies: - crypto-random-string: 2.0.0 - dev: false - /unist-util-find-after@5.0.0: resolution: { @@ -13429,52 +7213,6 @@ packages: unist-util-visit-parents: 6.0.1 dev: false - /universalify@0.1.2: - resolution: - { - integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==, - } - engines: { node: ">= 4.0.0" } - dev: false - - /universalify@1.0.0: - resolution: - { - integrity: sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==, - } - engines: { node: ">= 10.0.0" } - dev: false - - /universalify@2.0.1: - resolution: - { - integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==, - } - engines: { node: ">= 10.0.0" } - dev: false - - /unpipe@1.0.0: - resolution: - { - integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==, - } - engines: { node: ">= 0.8" } - dev: false - - /update-browserslist-db@1.0.13(browserslist@4.22.2): - resolution: - { - integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==, - } - hasBin: true - peerDependencies: - browserslist: ">= 4.21.0" - dependencies: - browserslist: 4.22.2 - escalade: 3.1.1 - picocolors: 1.0.0 - dev: false - /uri-js@4.4.1: resolution: { @@ -13483,23 +7221,6 @@ packages: dependencies: punycode: 2.3.1 - /url-join@4.0.0: - resolution: - { - integrity: sha512-EGXjXJZhIHiQMK2pQukuFcL303nskqIRzWvPvV5O8miOfwoUb9G+a/Cld60kUyeaybEI94wvVClT10DtfeAExA==, - } - dev: false - - /url-parse@1.5.10: - resolution: - { - integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==, - } - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - dev: false - /util-deprecate@1.0.2: resolution: { @@ -13507,31 +7228,6 @@ packages: } dev: false - /utils-merge@1.0.1: - resolution: - { - integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==, - } - engines: { node: ">= 0.4.0" } - dev: false - - /uuid@3.4.0: - resolution: - { - integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==, - } - deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. - hasBin: true - dev: false - - /uuid@7.0.3: - resolution: - { - integrity: sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==, - } - hasBin: true - dev: false - /uuid@8.3.2: resolution: { @@ -13540,22 +7236,6 @@ packages: hasBin: true dev: false - /valid-url@1.0.9: - resolution: - { - integrity: sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==, - } - dev: false - - /validate-npm-package-name@3.0.0: - resolution: - { - integrity: sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==, - } - dependencies: - builtins: 1.0.3 - dev: false - /vfile-location@5.0.2: resolution: { @@ -13609,25 +7289,7 @@ packages: vfile-message: 4.0.2 dev: false - /vue-demi@0.14.6(vue@3.4.3): - resolution: - { - integrity: sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==, - } - engines: { node: ">=12" } - hasBin: true - requiresBuild: true - peerDependencies: - "@vue/composition-api": ^1.0.0-rc.1 - vue: ^3.0.0-0 || ^2.6.0 - peerDependenciesMeta: - "@vue/composition-api": - optional: true - dependencies: - vue: 3.4.3(typescript@5.3.3) - dev: false - - /vue-demi@0.14.6(vue@3.4.5): + /vue-demi@0.14.6(vue@3.4.15): resolution: { integrity: sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==, @@ -13642,32 +7304,13 @@ packages: "@vue/composition-api": optional: true dependencies: - vue: 3.4.5(typescript@5.3.3) - dev: false - - /vue@3.4.3(typescript@5.3.3): - resolution: - { - integrity: sha512-GjN+culMAGv/mUbkIv8zMKItno8npcj5gWlXkSxf1SPTQf8eJ4A+YfHIvQFyL1IfuJcMl3soA7SmN1fRxbf/wA==, - } - peerDependencies: - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - dependencies: - "@vue/compiler-dom": 3.4.3 - "@vue/compiler-sfc": 3.4.3 - "@vue/runtime-dom": 3.4.3 - "@vue/server-renderer": 3.4.3(vue@3.4.3) - "@vue/shared": 3.4.3 - typescript: 5.3.3 + vue: 3.4.15(typescript@5.3.3) dev: false - /vue@3.4.5(typescript@5.3.3): + /vue@3.4.15(typescript@5.3.3): resolution: { - integrity: sha512-VH6nHFhLPjgu2oh5vEBXoNZxsGHuZNr3qf4PHClwJWw6IDqw6B3x+4J+ABdoZ0aJuT8Zi0zf3GpGlLQCrGWHrw==, + integrity: sha512-jC0GH4KkWLWJOEQjOpkqU1bQsBwf4R1rsFtw5GQJbjHVKWDzO6P0nWWBTmjp1xSemAioDFj1jdaK1qa3DnMQoQ==, } peerDependencies: typescript: "*" @@ -13675,11 +7318,11 @@ packages: typescript: optional: true dependencies: - "@vue/compiler-dom": 3.4.5 - "@vue/compiler-sfc": 3.4.5 - "@vue/runtime-dom": 3.4.5 - "@vue/server-renderer": 3.4.5(vue@3.4.5) - "@vue/shared": 3.4.5 + "@vue/compiler-dom": 3.4.15 + "@vue/compiler-sfc": 3.4.15 + "@vue/runtime-dom": 3.4.15 + "@vue/server-renderer": 3.4.15(vue@3.4.15) + "@vue/shared": 3.4.15 typescript: 5.3.3 dev: false @@ -13690,15 +7333,6 @@ packages: } dev: false - /wcwidth@1.0.1: - resolution: - { - integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==, - } - dependencies: - defaults: 1.0.4 - dev: false - /web-namespaces@2.0.1: resolution: { @@ -13706,10 +7340,10 @@ packages: } dev: false - /web-streams-polyfill@3.2.1: + /web-streams-polyfill@3.3.2: resolution: { - integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==, + integrity: sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ==, } engines: { node: ">= 8" } dev: false @@ -13739,16 +7373,6 @@ packages: webidl-conversions: 3.0.1 dev: false - /which@1.3.1: - resolution: - { - integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==, - } - hasBin: true - dependencies: - isexe: 2.0.0 - dev: false - /which@2.0.2: resolution: { @@ -13759,13 +7383,6 @@ packages: dependencies: isexe: 2.0.0 - /wonka@4.0.15: - resolution: - { - integrity: sha512-U0IUQHKXXn6PFo9nqsHphVCE5m3IntqZNB9Jjn7EB1lrR7YTDY3YWgFvEvwniTzXSvOH/XMzAZaIfJF/LvHYXg==, - } - dev: false - /wordwrap@1.0.0: resolution: { @@ -13773,40 +7390,40 @@ packages: } dev: true - /workerd@1.20231030.0: + /workerd@1.20231218.0: resolution: { - integrity: sha512-+FSW+d31f8RrjHanFf/R9A+Z0csf3OtsvzdPmAKuwuZm/5HrBv83cvG9fFeTxl7/nI6irUUXIRF9xcj/NomQzQ==, + integrity: sha512-AGIsDvqCrcwhoA9kb1hxOhVAe53/xJeaGZxL4FbYI9FvO17DZwrnqGq+6eqItJ6Cfw1ZLmf3BM+QdMWaL2bFWQ==, } 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 + "@cloudflare/workerd-darwin-64": 1.20231218.0 + "@cloudflare/workerd-darwin-arm64": 1.20231218.0 + "@cloudflare/workerd-linux-64": 1.20231218.0 + "@cloudflare/workerd-linux-arm64": 1.20231218.0 + "@cloudflare/workerd-windows-64": 1.20231218.0 dev: true - /wrangler@3.22.1: + /wrangler@3.23.0: resolution: { - integrity: sha512-fN7WOF6Ono/TV5V90PuJQNf0azS7B+5C/N/KRjqhlAIQBz+c0yLOGkF6kC/akxjr1yIAC9AzcPk9+OuTSq0C+g==, + integrity: sha512-mOWPL02/popoF6jjb4TT8au4yvo8VFu6O6/IwcRN74rlgwaGS0XvlkFtbofBGAdDUHAh5DXkuoPNS871mXNuJg==, } engines: { node: ">=16.17.0" } hasBin: true dependencies: "@cloudflare/kv-asset-handler": 0.2.0 - "@cspotcode/source-map-support": 0.8.1 "@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.4 + miniflare: 3.20231218.2 nanoid: 3.3.7 path-to-regexp: 6.2.1 + resolve: 1.22.8 resolve.exports: 2.0.2 selfsigned: 2.4.1 source-map: 0.6.1 @@ -13819,47 +7436,12 @@ packages: - utf-8-validate dev: true - /wrap-ansi@7.0.0: - resolution: - { - integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, - } - engines: { node: ">=10" } - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: false - - /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: false - /wrappy@1.0.2: resolution: { integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, } - /write-file-atomic@2.4.3: - resolution: - { - integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==, - } - dependencies: - graceful-fs: 4.2.11 - imurmurhash: 0.1.4 - signal-exit: 3.0.7 - dev: false - /ws@8.16.0: resolution: { @@ -13875,52 +7457,6 @@ packages: utf-8-validate: optional: true - /xcode@3.0.1: - resolution: - { - integrity: sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==, - } - engines: { node: ">=10.0.0" } - dependencies: - simple-plist: 1.3.1 - uuid: 7.0.3 - dev: false - - /xml2js@0.6.0: - resolution: - { - integrity: sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==, - } - engines: { node: ">=4.0.0" } - dependencies: - sax: 1.3.0 - xmlbuilder: 11.0.1 - dev: false - - /xmlbuilder@11.0.1: - resolution: - { - integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==, - } - engines: { node: ">=4.0" } - dev: false - - /xmlbuilder@14.0.0: - resolution: - { - integrity: sha512-ts+B2rSe4fIckR6iquDjsKbQFK2NlUk6iG5nf14mDEyldgoc2nEKZ3jZWMPTxGQwVgToSjt6VGIho1H8/fNFTg==, - } - engines: { node: ">=8.0" } - dev: false - - /xmlbuilder@15.1.1: - resolution: - { - integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==, - } - engines: { node: ">=8.0" } - dev: false - /xxhash-wasm@1.0.2: resolution: { @@ -13928,13 +7464,6 @@ packages: } dev: true - /yallist@3.1.1: - resolution: - { - integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, - } - dev: false - /yallist@4.0.0: resolution: { diff --git a/tsconfig.json b/tsconfig.json index 293dab4..7f16d1d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,9 +7,9 @@ "lib": ["es2021"], "baseUrl": "./", "paths": { - "@/*": ["src/*"] + "@/*": ["src/*"], }, - "types": ["@cloudflare/workers-types", "node"] + "types": ["@cloudflare/workers-types", "node"], }, - "include": ["src/**/*.ts", "src/scripts/seed/seed.mts"] + "include": ["src/**/*.ts", "src/scripts/seed/seed.mts"], } From e4790dbad7689afe0a326a05e02b20b1346251f3 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Mon, 22 Jan 2024 02:57:57 +0000 Subject: [PATCH 227/318] [skip ci] really need cache middleware --- src/index.ts | 5 +- src/openapi/config.ts | 11 ++++ src/v2/lib/managers/asset/asset-manager.ts | 60 +--------------------- src/v2/routes/asset/get/id/[id]/route.ts | 3 -- src/v2/routes/asset/get/id/[id]/schema.ts | 2 +- src/v2/routes/game/create/schema.ts | 2 +- 6 files changed, 16 insertions(+), 67 deletions(-) diff --git a/src/index.ts b/src/index.ts index 3558aa9..73749c5 100644 --- a/src/index.ts +++ b/src/index.ts @@ -9,6 +9,7 @@ import { LogTime } from "./v2/middleware/time-taken" const app = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() +// v2 API routes app.route("/v2", BaseRoutes) // scalar API reference, very nice and lightweight @@ -26,11 +27,11 @@ app.get( // openapi config app.doc("/openapi", OpenAPIConfig) -// middleware // interface CSRFOptions { // origin?: string | string[] | IsAllowedOriginHandler; // } app.use("*", csrf()) + app.use("*", LogTime) app.use( @@ -45,8 +46,6 @@ app.use( app.use("*", prettyJSON()) app.onError((err, ctx) => { - console.error(err) - // TODO: error logging with Axiom (Axiom Middleware) return ctx.json( { success: false, diff --git a/src/openapi/config.ts b/src/openapi/config.ts index d9c0dc4..6ef0304 100644 --- a/src/openapi/config.ts +++ b/src/openapi/config.ts @@ -21,6 +21,17 @@ export const CustomCSS: string = ` :root { --theme-font: 'Inter', var(--system-fonts); } + + ::moz-selection { + background: var(--theme-color-accent); + color: #fff; + } + + ::selection { + background: var(--theme-color-accent); + color: #fff; + } + /* basic theme */ .light-mode { --theme-color-1: #2a2f45; diff --git a/src/v2/lib/managers/asset/asset-manager.ts b/src/v2/lib/managers/asset/asset-manager.ts index 45b07f8..3521b48 100644 --- a/src/v2/lib/managers/asset/asset-manager.ts +++ b/src/v2/lib/managers/asset/asset-manager.ts @@ -1,6 +1,6 @@ import { DrizzleInstance } from "@/v2/db/turso" import { asset, assetTag, assetTagAsset } from "@/v2/db/schema" -import { eq, not, or } from "drizzle-orm" +import { eq } from "drizzle-orm" import { R2Bucket } from "@cloudflare/workers-types" import { SplitQueryByCommas } from "../../helpers/split-query-by-commas" import { z } from "zod" @@ -67,64 +67,6 @@ export class AssetManager { } } - /** - * Retrieves a list of assets by their IDs. - * @param assetIds - An array of asset IDs to retrieve. - * @returns A promise that resolves to an array of retrieved assets. - * @throws An error if any of the asset IDs are invalid. - */ - public async getSimilarAssets(assetId: number) { - try { - const [foundAsset] = await this.drizzle - .select({ - id: asset.id, - name: asset.name, - assetCategoryId: asset.assetCategoryId, - gameId: asset.gameId, - }) - .from(asset) - .where(eq(asset.id, assetId)) - - if (!foundAsset) return null - - // this is messy: - // we check if assets exist w/ the same game and category - // if not, we check if assets exist w / the same game but different category - // this means theres a higher chance of similar assets ALWAYS being returned, even if they're not "70%" similar - // who needs machine learning when you can just do this :^) - - // TODO(dromzeh): check if there's a better way to do this, and prioritize assets with similar name, asset category, and game - return await this.drizzle.query.asset.findMany({ - where: (asset, { and, eq }) => - and( - not(eq(asset.id, foundAsset.id)), - or( - and( - eq(asset.gameId, foundAsset.gameId), - eq( - asset.assetCategoryId, - foundAsset.assetCategoryId - ) - ), - and( - eq(asset.gameId, foundAsset.gameId), - not( - eq( - asset.assetCategoryId, - foundAsset.assetCategoryId - ) - ) - ) - ) - ), - limit: 12, - }) - } catch (e) { - console.error(`Error getting similar assets by ID ${assetId}`, e) - throw new Error(`Error getting similar assets by ID ${assetId}`) - } - } - /** * Retrieves a list of all assets. * @returns A promise that resolves to an array of assets. diff --git a/src/v2/routes/asset/get/id/[id]/route.ts b/src/v2/routes/asset/get/id/[id]/route.ts index c3d3415..ae26098 100644 --- a/src/v2/routes/asset/get/id/[id]/route.ts +++ b/src/v2/routes/asset/get/id/[id]/route.ts @@ -32,13 +32,10 @@ handler.openapi(getAssetByIdRoute, async (ctx) => { ) } - const similarAssets = await assetManager.getSimilarAssets(asset.id) - return ctx.json( { success: true, asset, - similarAssets, }, 200 ) diff --git a/src/v2/routes/asset/get/id/[id]/schema.ts b/src/v2/routes/asset/get/id/[id]/schema.ts index 00309c7..dc4405f 100644 --- a/src/v2/routes/asset/get/id/[id]/schema.ts +++ b/src/v2/routes/asset/get/id/[id]/schema.ts @@ -44,5 +44,5 @@ export const getAssetByIdResponseSchema = z.object({ }), game: selectGameSchema, assetCategory: selectAssetCategorySchema, - similarAssets: selectAssetSchema.array(), + // similarAssets: selectAssetSchema.array(), }) diff --git a/src/v2/routes/game/create/schema.ts b/src/v2/routes/game/create/schema.ts index 8b9b69c..530710d 100644 --- a/src/v2/routes/game/create/schema.ts +++ b/src/v2/routes/game/create/schema.ts @@ -12,7 +12,7 @@ export const createGameSchema = z.object({ }), possibleSuggestiveContent: z .string() - .min(1) + .min(0) .max(1) .openapi({ description: From 91403c8c8a0e1002b8aa9a8d84f23342a18367da Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Mon, 22 Jan 2024 18:06:48 +0000 Subject: [PATCH 228/318] asset delete and upload route link --- src/v2/lib/managers/asset/asset-manager.ts | 12 +++++ src/v2/routes/asset/delete/id/[id]/openapi.ts | 25 ++++++++++ src/v2/routes/asset/delete/id/[id]/route.ts | 46 +++++++++++++++++++ src/v2/routes/asset/delete/id/[id]/schema.ts | 16 +++++++ src/v2/routes/asset/handler.ts | 4 ++ src/v2/routes/asset/upload/route.ts | 15 +++++- src/v2/routes/game/delete/id/[id]/route.ts | 25 ++++++++++ 7 files changed, 141 insertions(+), 2 deletions(-) create mode 100644 src/v2/routes/asset/delete/id/[id]/openapi.ts create mode 100644 src/v2/routes/asset/delete/id/[id]/route.ts create mode 100644 src/v2/routes/asset/delete/id/[id]/schema.ts diff --git a/src/v2/lib/managers/asset/asset-manager.ts b/src/v2/lib/managers/asset/asset-manager.ts index 3521b48..4cb6f67 100644 --- a/src/v2/lib/managers/asset/asset-manager.ts +++ b/src/v2/lib/managers/asset/asset-manager.ts @@ -46,6 +46,18 @@ export class AssetManager { } } + public async deleteAssetById(assetId: number) { + try { + return await this.drizzle + .delete(asset) + .where(eq(asset.id, assetId)) + .returning() + } catch (e) { + console.error(`Error deleting asset by ID ${assetId}`, e) + throw new Error(`Error deleting asset by ID ${assetId}`) + } + } + public async updateAssetById( assetId: number, update: z.infer diff --git a/src/v2/routes/asset/delete/id/[id]/openapi.ts b/src/v2/routes/asset/delete/id/[id]/openapi.ts new file mode 100644 index 0000000..34a3f25 --- /dev/null +++ b/src/v2/routes/asset/delete/id/[id]/openapi.ts @@ -0,0 +1,25 @@ +import { createRoute } from "@hono/zod-openapi" +import { deleteAssetByIdResponseSchema, deleteAssetByIdSchema } from "./schema" +import { GenericResponses } from "@/v2/lib/response-schemas" + +export const deleteAssetByIdRoute = createRoute({ + path: "/", + method: "delete", + description: + "Delete an asset from their ID. Must be the owner of the asset or an admin.", + tags: ["Asset"], + request: { + params: deleteAssetByIdSchema, + }, + responses: { + 200: { + description: "True if the asset was deleted.", + content: { + "application/json": { + schema: deleteAssetByIdResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) diff --git a/src/v2/routes/asset/delete/id/[id]/route.ts b/src/v2/routes/asset/delete/id/[id]/route.ts new file mode 100644 index 0000000..b741baf --- /dev/null +++ b/src/v2/routes/asset/delete/id/[id]/route.ts @@ -0,0 +1,46 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { deleteAssetByIdRoute } from "./openapi" +import { getConnection } from "@/v2/db/turso" +import { AssetManager } from "@/v2/lib/managers/asset/asset-manager" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.openapi(deleteAssetByIdRoute, async (ctx) => { + const assetId = ctx.req.valid("param").id + + if (isNaN(parseInt(assetId))) { + return ctx.json( + { + success: false, + message: "Invalid asset ID", + }, + 400 + ) + } + + const { drizzle } = await getConnection(ctx.env) + const assetManager = new AssetManager(drizzle) + const asset = await assetManager.getAssetById(parseInt(assetId)) + + if (!asset) { + return ctx.json( + { + success: true, + message: "Asset not found", + }, + 400 + ) + } + + await assetManager.deleteAssetById(parseInt(assetId)) + await ctx.env.FILES_BUCKET.delete(asset.url) + + return ctx.json( + { + success: true, + }, + 200 + ) +}) + +export default handler diff --git a/src/v2/routes/asset/delete/id/[id]/schema.ts b/src/v2/routes/asset/delete/id/[id]/schema.ts new file mode 100644 index 0000000..f80509c --- /dev/null +++ b/src/v2/routes/asset/delete/id/[id]/schema.ts @@ -0,0 +1,16 @@ +import { z } from "@hono/zod-openapi" + +export const deleteAssetByIdSchema = z.object({ + id: z.string().openapi({ + param: { + name: "id", + in: "path", + description: "The ID of the asset to delete.", + required: true, + }, + }), +}) + +export const deleteAssetByIdResponseSchema = z.object({ + success: z.literal(true), +}) diff --git a/src/v2/routes/asset/handler.ts b/src/v2/routes/asset/handler.ts index be7b903..77b54cd 100644 --- a/src/v2/routes/asset/handler.ts +++ b/src/v2/routes/asset/handler.ts @@ -2,11 +2,15 @@ import { OpenAPIHono } from "@hono/zod-openapi" import AssetGetRoute from "@/v2/routes/asset/get/handler" import AssetSearchRoute from "@/v2/routes/asset/search/handler" import AssetModifyRoute from "@/v2/routes/asset/modify/id/[id]/route" +import AssetUploadRoute from "@/v2/routes/asset/upload/route" +import AssetDeleteRoute from "@/v2/routes/asset/delete/id/[id]/route" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.route("/get", AssetGetRoute) handler.route("/search", AssetSearchRoute) handler.route("/modify/id/{id}", AssetModifyRoute) +handler.route("/upload", AssetUploadRoute) +handler.route("/delete/id/{id}", AssetDeleteRoute) export default handler diff --git a/src/v2/routes/asset/upload/route.ts b/src/v2/routes/asset/upload/route.ts index e46d1f7..1ea19cd 100644 --- a/src/v2/routes/asset/upload/route.ts +++ b/src/v2/routes/asset/upload/route.ts @@ -3,10 +3,14 @@ import { uploadAssetRoute } from "./openapi" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" import { AssetManager } from "@/v2/lib/managers/asset/asset-manager" import { getConnection } from "@/v2/db/turso" +import { roleFlagsToArray } from "@/v2/lib/helpers/role-flags" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.openapi(uploadAssetRoute, async (ctx) => { + const { asset, name, tags, assetCategoryId, gameId, assetIsSuggestive } = + ctx.req.valid("form") + const authSessionManager = new AuthSessionManager(ctx) const { user } = await authSessionManager.validateSession() @@ -21,8 +25,15 @@ handler.openapi(uploadAssetRoute, async (ctx) => { ) } - const { asset, name, tags, assetCategoryId, gameId, assetIsSuggestive } = - ctx.req.valid("form") + if (!roleFlagsToArray(user.roleFlags).includes("CONTRIBUTOR")) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } const { drizzle } = getConnection(ctx.env) const assetManager = new AssetManager(drizzle) diff --git a/src/v2/routes/game/delete/id/[id]/route.ts b/src/v2/routes/game/delete/id/[id]/route.ts index 25e8a13..f821206 100644 --- a/src/v2/routes/game/delete/id/[id]/route.ts +++ b/src/v2/routes/game/delete/id/[id]/route.ts @@ -2,6 +2,8 @@ import { OpenAPIHono } from "@hono/zod-openapi" import { deleteGameRoute } from "./openapi" import { GameManager } from "@/v2/lib/managers/game/game-manager" import { getConnection } from "@/v2/db/turso" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +import { roleFlagsToArray } from "@/v2/lib/helpers/role-flags" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() @@ -22,6 +24,29 @@ handler.openapi(deleteGameRoute, async (ctx) => { ) } + const authSessionManager = new AuthSessionManager(ctx) + const { user } = await authSessionManager.validateSession() + + if (!user) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + if (!roleFlagsToArray(user.roleFlags).includes("DEVELOPER")) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + await gameManager.deleteGame(id) await ctx.env.FILES_BUCKET.delete("/assets/" + id) From 856a7a56005fddc1be0b8528b0f56a4de3c865e9 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Mon, 22 Jan 2024 19:00:27 +0000 Subject: [PATCH 229/318] asset likes/all/modify - auth fix --- src/index.ts | 1 + src/v2/db/schema/asset/asset-likes.ts | 4 +- src/v2/lib/managers/asset/asset-likes.ts | 70 ++++++++++++++-- src/v2/lib/managers/asset/asset-manager.ts | 12 +++ .../lib/managers/auth/user-session-manager.ts | 24 +----- src/v2/routes/asset/handler.ts | 6 +- src/v2/routes/asset/likes/all/openapi.ts | 21 +++++ src/v2/routes/asset/likes/all/route.ts | 37 +++++++++ src/v2/routes/asset/likes/all/schema.ts | 22 +++++ src/v2/routes/asset/likes/handler.ts | 12 +++ .../asset/likes/like/id/[id]/openapi.ts | 24 ++++++ .../routes/asset/likes/like/id/[id]/route.ts | 77 ++++++++++++++++++ .../routes/asset/likes/like/id/[id]/schema.ts | 16 ++++ .../asset/likes/unlike/id/[id]/openapi.ts | 24 ++++++ .../asset/likes/unlike/id/[id]/route.ts | 81 +++++++++++++++++++ .../asset/likes/unlike/id/[id]/schema.ts | 16 ++++ .../asset/modify/{id/[id] => }/openapi.ts | 0 .../asset/modify/{id/[id] => }/route.ts | 0 .../asset/modify/{id/[id] => }/schema.ts | 0 19 files changed, 417 insertions(+), 30 deletions(-) create mode 100644 src/v2/routes/asset/likes/all/openapi.ts create mode 100644 src/v2/routes/asset/likes/all/route.ts create mode 100644 src/v2/routes/asset/likes/all/schema.ts create mode 100644 src/v2/routes/asset/likes/handler.ts create mode 100644 src/v2/routes/asset/likes/like/id/[id]/openapi.ts create mode 100644 src/v2/routes/asset/likes/like/id/[id]/route.ts create mode 100644 src/v2/routes/asset/likes/like/id/[id]/schema.ts create mode 100644 src/v2/routes/asset/likes/unlike/id/[id]/openapi.ts create mode 100644 src/v2/routes/asset/likes/unlike/id/[id]/route.ts create mode 100644 src/v2/routes/asset/likes/unlike/id/[id]/schema.ts rename src/v2/routes/asset/modify/{id/[id] => }/openapi.ts (100%) rename src/v2/routes/asset/modify/{id/[id] => }/route.ts (100%) rename src/v2/routes/asset/modify/{id/[id] => }/schema.ts (100%) diff --git a/src/index.ts b/src/index.ts index 73749c5..70118ce 100644 --- a/src/index.ts +++ b/src/index.ts @@ -46,6 +46,7 @@ app.use( app.use("*", prettyJSON()) app.onError((err, ctx) => { + console.error(err) return ctx.json( { success: false, diff --git a/src/v2/db/schema/asset/asset-likes.ts b/src/v2/db/schema/asset/asset-likes.ts index 52dd3b5..2786987 100644 --- a/src/v2/db/schema/asset/asset-likes.ts +++ b/src/v2/db/schema/asset/asset-likes.ts @@ -5,14 +5,16 @@ import { text, // uniqueIndex, index, + integer, } from "drizzle-orm/sqlite-core" import { authUser } from "../user/user" import { asset } from "./asset" import { createInsertSchema, createSelectSchema } from "drizzle-zod" + export const assetLikes = sqliteTable( tableNames.assetLikes, { - assetId: text("asset_id") + assetId: integer("asset_id") .notNull() .references(() => asset.id), likedById: text("liked_by_id") diff --git a/src/v2/lib/managers/asset/asset-likes.ts b/src/v2/lib/managers/asset/asset-likes.ts index ae446bb..e0009af 100644 --- a/src/v2/lib/managers/asset/asset-likes.ts +++ b/src/v2/lib/managers/asset/asset-likes.ts @@ -5,17 +5,72 @@ import { assetLikes } from "@/v2/db/schema/asset/asset-likes" export class AssetLikesManager { constructor(private drizzle: DrizzleInstance) {} + public async getUsersLikedAssets(userId: string, offset: number = 0) { + try { + // return await this.drizzle.select().from(assetLikes).where(eq(assetLikes.likedById, userId)).offset(offset) + return await this.drizzle.query.assetLikes.findMany({ + where: (assetLikes, { eq }) => eq(assetLikes.likedById, userId), + with: { + asset: { + with: { + assetTagAsset: { + with: { + assetTag: true, + }, + }, + }, + }, + }, + offset: offset, + }) + } catch (e) { + console.error(`Error getting assets liked by user ${userId}`, e) + throw new Error(`Error getting assets liked by user ${userId}`) + } + } + + public async checkAssetLikeStatus( + assetId: number, + userId: string + ): Promise { + try { + const [assetLike] = await this.drizzle + .select({ assetId: assetLikes.assetId }) + .from(assetLikes) + .where( + and( + eq(assetLikes.assetId, assetId), + eq(assetLikes.likedById, userId) + ) + ) + .limit(1) + + return assetLike ? true : false + } catch (e) { + console.error( + `Error checking if asset ${assetId} is liked by user ${userId}`, + e + ) + throw new Error( + `Error checking if asset ${assetId} is liked by user ${userId}` + ) + } + } + /** * Likes an asset for a user. * @param assetId - The ID of the asset to like. * @param userId - The ID of the user to like the asset for. */ - public async likeAsset(assetId: string, userId: string): Promise { + public async likeAsset(assetId: number, userId: string) { try { - await this.drizzle.insert(assetLikes).values({ - assetId, - likedById: userId, - }) + return await this.drizzle + .insert(assetLikes) + .values({ + assetId, + likedById: userId, + }) + .returning() } catch (e) { console.error(`Error liking asset ${assetId} for user ${userId}`, e) throw new Error(`Error liking asset ${assetId} for user ${userId}`) @@ -27,9 +82,9 @@ export class AssetLikesManager { * @param assetId - The ID of the asset to like. * @param userId - The ID of the user to like the asset for. */ - public async unlikeAsset(assetId: string, userId: string): Promise { + public async unlikeAsset(assetId: number, userId: string) { try { - await this.drizzle + return await this.drizzle .delete(assetLikes) .where( and( @@ -37,6 +92,7 @@ export class AssetLikesManager { eq(assetLikes.likedById, userId) ) ) + .returning() } catch (e) { console.error(`Error liking asset ${assetId} for user ${userId}`, e) throw new Error(`Error liking asset ${assetId} for user ${userId}`) diff --git a/src/v2/lib/managers/asset/asset-manager.ts b/src/v2/lib/managers/asset/asset-manager.ts index 4cb6f67..f65636f 100644 --- a/src/v2/lib/managers/asset/asset-manager.ts +++ b/src/v2/lib/managers/asset/asset-manager.ts @@ -11,6 +11,18 @@ import { uploadAssetSchema } from "@/v2/routes/asset/upload/schema" export class AssetManager { constructor(private drizzle: DrizzleInstance) {} + public async getBarebonesAssetById(assetId: number) { + try { + return await this.drizzle + .select() + .from(asset) + .where(eq(asset.id, assetId)) + } catch (e) { + console.error(`Error getting asset by ID ${assetId}`, e) + throw new Error(`Error getting asset by ID ${assetId}`) + } + } + public async getAssetById(assetId: number) { try { return await this.drizzle.query.asset.findFirst({ diff --git a/src/v2/lib/managers/auth/user-session-manager.ts b/src/v2/lib/managers/auth/user-session-manager.ts index 50f9fae..528c809 100644 --- a/src/v2/lib/managers/auth/user-session-manager.ts +++ b/src/v2/lib/managers/auth/user-session-manager.ts @@ -2,9 +2,9 @@ import { luciaAuth } from "../../auth/lucia" import type { Session, User } from "lucia" import { getCookie } from "hono/cookie" -const USER_AGENT = "user-agent" -const CONNECTING_IP = "cf-connecting-ip" -const IP_COUNTRY = "cf-ipcountry" +// const USER_AGENT = "user-agent" +// const CONNECTING_IP = "cf-connecting-ip" +// const IP_COUNTRY = "cf-ipcountry" export class AuthSessionManager { private lucia: ReturnType @@ -31,23 +31,7 @@ export class AuthSessionManager { } public async validateSession() { - return this.validateAndGetSession().then(({ user, session }) => { - if (!user || !session) { - return null - } - - if ( - session.userAgent !== this.ctx.req.header(USER_AGENT) || - session.ipAddress !== this.ctx.req.header(CONNECTING_IP) || - session.countryCode !== this.ctx.req.header(IP_COUNTRY) || - session.expiresAt < new Date() - ) { - this.lucia.invalidateSession(session.id) - return null - } - - return { user, session } - }) + return this.validateAndGetSession() } public async getAllSessions() { diff --git a/src/v2/routes/asset/handler.ts b/src/v2/routes/asset/handler.ts index 77b54cd..54f7c73 100644 --- a/src/v2/routes/asset/handler.ts +++ b/src/v2/routes/asset/handler.ts @@ -1,16 +1,18 @@ import { OpenAPIHono } from "@hono/zod-openapi" import AssetGetRoute from "@/v2/routes/asset/get/handler" import AssetSearchRoute from "@/v2/routes/asset/search/handler" -import AssetModifyRoute from "@/v2/routes/asset/modify/id/[id]/route" +import AssetModifyRoute from "@/v2/routes/asset/modify/route" import AssetUploadRoute from "@/v2/routes/asset/upload/route" import AssetDeleteRoute from "@/v2/routes/asset/delete/id/[id]/route" +import AssetLikesRoute from "@/v2/routes/asset/likes/handler" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.route("/get", AssetGetRoute) handler.route("/search", AssetSearchRoute) -handler.route("/modify/id/{id}", AssetModifyRoute) +handler.route("/modify", AssetModifyRoute) handler.route("/upload", AssetUploadRoute) handler.route("/delete/id/{id}", AssetDeleteRoute) +handler.route("/likes", AssetLikesRoute) export default handler diff --git a/src/v2/routes/asset/likes/all/openapi.ts b/src/v2/routes/asset/likes/all/openapi.ts new file mode 100644 index 0000000..f14cadc --- /dev/null +++ b/src/v2/routes/asset/likes/all/openapi.ts @@ -0,0 +1,21 @@ +import { createRoute } from "@hono/zod-openapi" +import { allAssetLikesSchema } from "./schema" +import { GenericResponses } from "@/v2/lib/response-schemas" + +export const allAssetLikesRoute = createRoute({ + path: "/", + method: "get", + description: "All liked assets.", + tags: ["Asset"], + responses: { + 200: { + description: "Array of your liked assets.", + content: { + "application/json": { + schema: allAssetLikesSchema, + }, + }, + }, + ...GenericResponses, + }, +}) diff --git a/src/v2/routes/asset/likes/all/route.ts b/src/v2/routes/asset/likes/all/route.ts new file mode 100644 index 0000000..1661ba0 --- /dev/null +++ b/src/v2/routes/asset/likes/all/route.ts @@ -0,0 +1,37 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { allAssetLikesRoute } from "./openapi" +import { getConnection } from "@/v2/db/turso" +import { AssetLikesManager } from "@/v2/lib/managers/asset/asset-likes" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.openapi(allAssetLikesRoute, async (ctx) => { + const authSessionManager = new AuthSessionManager(ctx) + const { user } = await authSessionManager.validateSession() + + if (!user) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + const { drizzle } = await getConnection(ctx.env) + const assetLikeManager = new AssetLikesManager(drizzle) + + const likes = await assetLikeManager.getUsersLikedAssets(user.id) + + return ctx.json( + { + success: true, + likes, + }, + 200 + ) +}) + +export default handler diff --git a/src/v2/routes/asset/likes/all/schema.ts b/src/v2/routes/asset/likes/all/schema.ts new file mode 100644 index 0000000..ac44a06 --- /dev/null +++ b/src/v2/routes/asset/likes/all/schema.ts @@ -0,0 +1,22 @@ +import { z } from "@hono/zod-openapi" +import { + selectAssetSchema, + selectAssetTagAssetSchema, + selectAssetTagSchema, + selectAssetLikesSchema, +} from "@/v2/db/schema" + +export const allAssetLikesSchema = z.object({ + success: z.literal(true), + likes: z.array( + selectAssetLikesSchema.extend({ + asset: selectAssetSchema.extend({ + assetTagAsset: z.array( + selectAssetTagAssetSchema.extend({ + assetTag: selectAssetTagSchema, + }) + ), + }), + }) + ), +}) diff --git a/src/v2/routes/asset/likes/handler.ts b/src/v2/routes/asset/likes/handler.ts new file mode 100644 index 0000000..27de7e6 --- /dev/null +++ b/src/v2/routes/asset/likes/handler.ts @@ -0,0 +1,12 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import UnlikeAssetByIdRoute from "@/v2/routes/asset/likes/unlike/id/[id]/route" +import LikeAssetByIdRoute from "@/v2/routes/asset/likes/like/id/[id]/route" +import AllAssetLikesRoute from "@/v2/routes/asset/likes/all/route" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.route("/unlike/id", UnlikeAssetByIdRoute) +handler.route("/like/id", LikeAssetByIdRoute) +handler.route("/all", AllAssetLikesRoute) + +export default handler diff --git a/src/v2/routes/asset/likes/like/id/[id]/openapi.ts b/src/v2/routes/asset/likes/like/id/[id]/openapi.ts new file mode 100644 index 0000000..1d975f5 --- /dev/null +++ b/src/v2/routes/asset/likes/like/id/[id]/openapi.ts @@ -0,0 +1,24 @@ +import { createRoute } from "@hono/zod-openapi" +import { likeAssetByIdSchema, likeAssetByIdResponseSchema } from "./schema" +import { GenericResponses } from "@/v2/lib/response-schemas" + +export const likeAssetByIdRoute = createRoute({ + path: "/{id}", + method: "get", + description: "Like an asset from their ID.", + tags: ["Asset"], + request: { + params: likeAssetByIdSchema, + }, + responses: { + 200: { + description: "True if the asset was liked.", + content: { + "application/json": { + schema: likeAssetByIdResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) diff --git a/src/v2/routes/asset/likes/like/id/[id]/route.ts b/src/v2/routes/asset/likes/like/id/[id]/route.ts new file mode 100644 index 0000000..ff8fead --- /dev/null +++ b/src/v2/routes/asset/likes/like/id/[id]/route.ts @@ -0,0 +1,77 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { likeAssetByIdRoute } from "./openapi" +import { getConnection } from "@/v2/db/turso" +import { AssetManager } from "@/v2/lib/managers/asset/asset-manager" +import { AssetLikesManager } from "@/v2/lib/managers/asset/asset-likes" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.openapi(likeAssetByIdRoute, async (ctx) => { + const assetId = ctx.req.valid("param").id + + if (isNaN(parseInt(assetId))) { + return ctx.json( + { + success: false, + message: "Invalid asset ID", + }, + 400 + ) + } + + const { drizzle } = await getConnection(ctx.env) + const assetManager = new AssetManager(drizzle) + const asset = await assetManager.getBarebonesAssetById(parseInt(assetId)) + + if (!asset) { + return ctx.json( + { + success: true, + message: "Asset not found", + }, + 400 + ) + } + + const authSessionManager = new AuthSessionManager(ctx) + const { user } = await authSessionManager.validateSession() + + if (!user) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + const assetLikeManager = new AssetLikesManager(drizzle) + + const likeStatus = await assetLikeManager.checkAssetLikeStatus( + parseInt(assetId), + user.id + ) + + if (likeStatus) { + return ctx.json( + { + success: false, + message: "Asset is already liked", + }, + 400 + ) + } + + await assetLikeManager.likeAsset(parseInt(assetId), user.id) + + return ctx.json( + { + success: true, + }, + 200 + ) +}) + +export default handler diff --git a/src/v2/routes/asset/likes/like/id/[id]/schema.ts b/src/v2/routes/asset/likes/like/id/[id]/schema.ts new file mode 100644 index 0000000..61b7634 --- /dev/null +++ b/src/v2/routes/asset/likes/like/id/[id]/schema.ts @@ -0,0 +1,16 @@ +import { z } from "@hono/zod-openapi" + +export const likeAssetByIdSchema = z.object({ + id: z.string().openapi({ + param: { + name: "id", + in: "path", + description: "The ID of the asset to like.", + required: true, + }, + }), +}) + +export const likeAssetByIdResponseSchema = z.object({ + success: z.literal(true), +}) diff --git a/src/v2/routes/asset/likes/unlike/id/[id]/openapi.ts b/src/v2/routes/asset/likes/unlike/id/[id]/openapi.ts new file mode 100644 index 0000000..443aa18 --- /dev/null +++ b/src/v2/routes/asset/likes/unlike/id/[id]/openapi.ts @@ -0,0 +1,24 @@ +import { createRoute } from "@hono/zod-openapi" +import { unlikeAssetByIdSchema, unlikeAssetByIdResponseSchema } from "./schema" +import { GenericResponses } from "@/v2/lib/response-schemas" + +export const unlikeAssetByIdRoute = createRoute({ + path: "/{id}", + method: "get", + description: "Unlike an asset from their ID.", + tags: ["Asset"], + request: { + params: unlikeAssetByIdSchema, + }, + responses: { + 200: { + description: "True if the asset was unliked.", + content: { + "application/json": { + schema: unlikeAssetByIdResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) diff --git a/src/v2/routes/asset/likes/unlike/id/[id]/route.ts b/src/v2/routes/asset/likes/unlike/id/[id]/route.ts new file mode 100644 index 0000000..2316ecf --- /dev/null +++ b/src/v2/routes/asset/likes/unlike/id/[id]/route.ts @@ -0,0 +1,81 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { unlikeAssetByIdRoute } from "./openapi" +import { getConnection } from "@/v2/db/turso" +import { AssetManager } from "@/v2/lib/managers/asset/asset-manager" +import { AssetLikesManager } from "@/v2/lib/managers/asset/asset-likes" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.openapi(unlikeAssetByIdRoute, async (ctx) => { + const assetId = ctx.req.valid("param").id + + console.log(assetId) + + if (isNaN(parseInt(assetId))) { + return ctx.json( + { + success: false, + message: "Invalid asset ID", + }, + 400 + ) + } + + const { drizzle } = await getConnection(ctx.env) + const assetManager = new AssetManager(drizzle) + const asset = await assetManager.getBarebonesAssetById(parseInt(assetId)) + + console.log(asset) + + if (!asset) { + return ctx.json( + { + success: true, + message: "Asset not found", + }, + 400 + ) + } + + const authSessionManager = new AuthSessionManager(ctx) + const { user } = await authSessionManager.validateSession() + + if (!user) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + const assetLikeManager = new AssetLikesManager(drizzle) + + const likeStatus = await assetLikeManager.checkAssetLikeStatus( + parseInt(assetId), + user.id + ) + + if (!likeStatus) { + return ctx.json( + { + success: false, + message: "You have not liked this asset", + }, + 400 + ) + } + + await assetLikeManager.unlikeAsset(parseInt(assetId), user.id) + + return ctx.json( + { + success: true, + }, + 200 + ) +}) + +export default handler diff --git a/src/v2/routes/asset/likes/unlike/id/[id]/schema.ts b/src/v2/routes/asset/likes/unlike/id/[id]/schema.ts new file mode 100644 index 0000000..cbf5db7 --- /dev/null +++ b/src/v2/routes/asset/likes/unlike/id/[id]/schema.ts @@ -0,0 +1,16 @@ +import { z } from "@hono/zod-openapi" + +export const unlikeAssetByIdSchema = z.object({ + id: z.string().openapi({ + param: { + name: "id", + in: "path", + description: "The ID of the asset to unlike.", + required: true, + }, + }), +}) + +export const unlikeAssetByIdResponseSchema = z.object({ + success: z.literal(true), +}) diff --git a/src/v2/routes/asset/modify/id/[id]/openapi.ts b/src/v2/routes/asset/modify/openapi.ts similarity index 100% rename from src/v2/routes/asset/modify/id/[id]/openapi.ts rename to src/v2/routes/asset/modify/openapi.ts diff --git a/src/v2/routes/asset/modify/id/[id]/route.ts b/src/v2/routes/asset/modify/route.ts similarity index 100% rename from src/v2/routes/asset/modify/id/[id]/route.ts rename to src/v2/routes/asset/modify/route.ts diff --git a/src/v2/routes/asset/modify/id/[id]/schema.ts b/src/v2/routes/asset/modify/schema.ts similarity index 100% rename from src/v2/routes/asset/modify/id/[id]/schema.ts rename to src/v2/routes/asset/modify/schema.ts From 1dc2c6dc0d1c83c9a57b5dab9e564fb7552d17a0 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Mon, 22 Jan 2024 19:07:42 +0000 Subject: [PATCH 230/318] conv like to POST json instead of GET in path --- src/v2/routes/asset/likes/handler.ts | 8 ++++---- .../routes/asset/likes/like/{id/[id] => }/openapi.ts | 12 +++++++++--- .../routes/asset/likes/like/{id/[id] => }/route.ts | 2 +- .../routes/asset/likes/like/{id/[id] => }/schema.ts | 8 ++------ .../asset/likes/unlike/{id/[id] => }/openapi.ts | 12 +++++++++--- .../routes/asset/likes/unlike/{id/[id] => }/route.ts | 4 +--- .../asset/likes/unlike/{id/[id] => }/schema.ts | 8 ++------ 7 files changed, 28 insertions(+), 26 deletions(-) rename src/v2/routes/asset/likes/like/{id/[id] => }/openapi.ts (74%) rename src/v2/routes/asset/likes/like/{id/[id] => }/route.ts (97%) rename src/v2/routes/asset/likes/like/{id/[id] => }/schema.ts (56%) rename src/v2/routes/asset/likes/unlike/{id/[id] => }/openapi.ts (75%) rename src/v2/routes/asset/likes/unlike/{id/[id] => }/route.ts (96%) rename src/v2/routes/asset/likes/unlike/{id/[id] => }/schema.ts (57%) diff --git a/src/v2/routes/asset/likes/handler.ts b/src/v2/routes/asset/likes/handler.ts index 27de7e6..243d410 100644 --- a/src/v2/routes/asset/likes/handler.ts +++ b/src/v2/routes/asset/likes/handler.ts @@ -1,12 +1,12 @@ import { OpenAPIHono } from "@hono/zod-openapi" -import UnlikeAssetByIdRoute from "@/v2/routes/asset/likes/unlike/id/[id]/route" -import LikeAssetByIdRoute from "@/v2/routes/asset/likes/like/id/[id]/route" +import UnlikeAssetByIdRoute from "@/v2/routes/asset/likes/unlike/route" +import LikeAssetByIdRoute from "@/v2/routes/asset/likes/like/route" import AllAssetLikesRoute from "@/v2/routes/asset/likes/all/route" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() -handler.route("/unlike/id", UnlikeAssetByIdRoute) -handler.route("/like/id", LikeAssetByIdRoute) +handler.route("/unlike", UnlikeAssetByIdRoute) +handler.route("/like", LikeAssetByIdRoute) handler.route("/all", AllAssetLikesRoute) export default handler diff --git a/src/v2/routes/asset/likes/like/id/[id]/openapi.ts b/src/v2/routes/asset/likes/like/openapi.ts similarity index 74% rename from src/v2/routes/asset/likes/like/id/[id]/openapi.ts rename to src/v2/routes/asset/likes/like/openapi.ts index 1d975f5..3f155c3 100644 --- a/src/v2/routes/asset/likes/like/id/[id]/openapi.ts +++ b/src/v2/routes/asset/likes/like/openapi.ts @@ -3,12 +3,18 @@ import { likeAssetByIdSchema, likeAssetByIdResponseSchema } from "./schema" import { GenericResponses } from "@/v2/lib/response-schemas" export const likeAssetByIdRoute = createRoute({ - path: "/{id}", - method: "get", + path: "/", + method: "post", description: "Like an asset from their ID.", tags: ["Asset"], request: { - params: likeAssetByIdSchema, + body: { + content: { + "application/json": { + schema: likeAssetByIdSchema, + }, + }, + }, }, responses: { 200: { diff --git a/src/v2/routes/asset/likes/like/id/[id]/route.ts b/src/v2/routes/asset/likes/like/route.ts similarity index 97% rename from src/v2/routes/asset/likes/like/id/[id]/route.ts rename to src/v2/routes/asset/likes/like/route.ts index ff8fead..4ea86d5 100644 --- a/src/v2/routes/asset/likes/like/id/[id]/route.ts +++ b/src/v2/routes/asset/likes/like/route.ts @@ -8,7 +8,7 @@ import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.openapi(likeAssetByIdRoute, async (ctx) => { - const assetId = ctx.req.valid("param").id + const assetId = ctx.req.valid("json").id if (isNaN(parseInt(assetId))) { return ctx.json( diff --git a/src/v2/routes/asset/likes/like/id/[id]/schema.ts b/src/v2/routes/asset/likes/like/schema.ts similarity index 56% rename from src/v2/routes/asset/likes/like/id/[id]/schema.ts rename to src/v2/routes/asset/likes/like/schema.ts index 61b7634..83dc83c 100644 --- a/src/v2/routes/asset/likes/like/id/[id]/schema.ts +++ b/src/v2/routes/asset/likes/like/schema.ts @@ -2,12 +2,8 @@ import { z } from "@hono/zod-openapi" export const likeAssetByIdSchema = z.object({ id: z.string().openapi({ - param: { - name: "id", - in: "path", - description: "The ID of the asset to like.", - required: true, - }, + description: "The id of the asset to like.", + example: "1", }), }) diff --git a/src/v2/routes/asset/likes/unlike/id/[id]/openapi.ts b/src/v2/routes/asset/likes/unlike/openapi.ts similarity index 75% rename from src/v2/routes/asset/likes/unlike/id/[id]/openapi.ts rename to src/v2/routes/asset/likes/unlike/openapi.ts index 443aa18..d8b1ad1 100644 --- a/src/v2/routes/asset/likes/unlike/id/[id]/openapi.ts +++ b/src/v2/routes/asset/likes/unlike/openapi.ts @@ -3,12 +3,18 @@ import { unlikeAssetByIdSchema, unlikeAssetByIdResponseSchema } from "./schema" import { GenericResponses } from "@/v2/lib/response-schemas" export const unlikeAssetByIdRoute = createRoute({ - path: "/{id}", - method: "get", + path: "/", + method: "post", description: "Unlike an asset from their ID.", tags: ["Asset"], request: { - params: unlikeAssetByIdSchema, + body: { + content: { + "application/json": { + schema: unlikeAssetByIdSchema, + }, + }, + }, }, responses: { 200: { diff --git a/src/v2/routes/asset/likes/unlike/id/[id]/route.ts b/src/v2/routes/asset/likes/unlike/route.ts similarity index 96% rename from src/v2/routes/asset/likes/unlike/id/[id]/route.ts rename to src/v2/routes/asset/likes/unlike/route.ts index 2316ecf..4228de4 100644 --- a/src/v2/routes/asset/likes/unlike/id/[id]/route.ts +++ b/src/v2/routes/asset/likes/unlike/route.ts @@ -8,9 +8,7 @@ import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.openapi(unlikeAssetByIdRoute, async (ctx) => { - const assetId = ctx.req.valid("param").id - - console.log(assetId) + const assetId = ctx.req.valid("json").id if (isNaN(parseInt(assetId))) { return ctx.json( diff --git a/src/v2/routes/asset/likes/unlike/id/[id]/schema.ts b/src/v2/routes/asset/likes/unlike/schema.ts similarity index 57% rename from src/v2/routes/asset/likes/unlike/id/[id]/schema.ts rename to src/v2/routes/asset/likes/unlike/schema.ts index cbf5db7..f46bd58 100644 --- a/src/v2/routes/asset/likes/unlike/id/[id]/schema.ts +++ b/src/v2/routes/asset/likes/unlike/schema.ts @@ -2,12 +2,8 @@ import { z } from "@hono/zod-openapi" export const unlikeAssetByIdSchema = z.object({ id: z.string().openapi({ - param: { - name: "id", - in: "path", - description: "The ID of the asset to unlike.", - required: true, - }, + description: "The id of the asset to unlike.", + example: "1", }), }) From 5a79de14eafd850ab89583dbd032eafa92d31418 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Mon, 22 Jan 2024 22:33:28 +0000 Subject: [PATCH 231/318] change modify method to patch, get id in path --- src/v2/routes/asset/delete/id/[id]/openapi.ts | 2 +- src/v2/routes/asset/delete/id/[id]/schema.ts | 1 + src/v2/routes/asset/handler.ts | 6 +++--- .../routes/asset/modify/{ => id/[id]}/openapi.ts | 7 ++++--- src/v2/routes/asset/modify/{ => id/[id]}/route.ts | 3 ++- src/v2/routes/asset/modify/{ => id/[id]}/schema.ts | 13 ++++++++++--- src/v2/routes/category/handler.ts | 6 ++++++ src/v2/routes/game/delete/id/[id]/openapi.ts | 2 +- src/v2/routes/game/handler.ts | 4 ++-- src/v2/routes/game/modify/id/[id]/openapi.ts | 11 ++++++++--- src/v2/routes/game/modify/id/[id]/route.ts | 3 ++- src/v2/routes/game/modify/id/[id]/schema.ts | 14 +++++++++++--- src/v2/routes/handler.ts | 4 +++- 13 files changed, 54 insertions(+), 22 deletions(-) rename src/v2/routes/asset/modify/{ => id/[id]}/openapi.ts (80%) rename src/v2/routes/asset/modify/{ => id/[id]}/route.ts (94%) rename src/v2/routes/asset/modify/{ => id/[id]}/schema.ts (82%) create mode 100644 src/v2/routes/category/handler.ts diff --git a/src/v2/routes/asset/delete/id/[id]/openapi.ts b/src/v2/routes/asset/delete/id/[id]/openapi.ts index 34a3f25..994956d 100644 --- a/src/v2/routes/asset/delete/id/[id]/openapi.ts +++ b/src/v2/routes/asset/delete/id/[id]/openapi.ts @@ -3,7 +3,7 @@ import { deleteAssetByIdResponseSchema, deleteAssetByIdSchema } from "./schema" import { GenericResponses } from "@/v2/lib/response-schemas" export const deleteAssetByIdRoute = createRoute({ - path: "/", + path: "/{id}", method: "delete", description: "Delete an asset from their ID. Must be the owner of the asset or an admin.", diff --git a/src/v2/routes/asset/delete/id/[id]/schema.ts b/src/v2/routes/asset/delete/id/[id]/schema.ts index f80509c..5030439 100644 --- a/src/v2/routes/asset/delete/id/[id]/schema.ts +++ b/src/v2/routes/asset/delete/id/[id]/schema.ts @@ -6,6 +6,7 @@ export const deleteAssetByIdSchema = z.object({ name: "id", in: "path", description: "The ID of the asset to delete.", + example: "1", required: true, }, }), diff --git a/src/v2/routes/asset/handler.ts b/src/v2/routes/asset/handler.ts index 54f7c73..5b37d7b 100644 --- a/src/v2/routes/asset/handler.ts +++ b/src/v2/routes/asset/handler.ts @@ -1,7 +1,7 @@ import { OpenAPIHono } from "@hono/zod-openapi" import AssetGetRoute from "@/v2/routes/asset/get/handler" import AssetSearchRoute from "@/v2/routes/asset/search/handler" -import AssetModifyRoute from "@/v2/routes/asset/modify/route" +import AssetModifyRoute from "@/v2/routes/asset/modify/id/[id]/route" import AssetUploadRoute from "@/v2/routes/asset/upload/route" import AssetDeleteRoute from "@/v2/routes/asset/delete/id/[id]/route" import AssetLikesRoute from "@/v2/routes/asset/likes/handler" @@ -10,9 +10,9 @@ const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.route("/get", AssetGetRoute) handler.route("/search", AssetSearchRoute) -handler.route("/modify", AssetModifyRoute) +handler.route("/modify/id", AssetModifyRoute) handler.route("/upload", AssetUploadRoute) -handler.route("/delete/id/{id}", AssetDeleteRoute) +handler.route("/delete/id", AssetDeleteRoute) handler.route("/likes", AssetLikesRoute) export default handler diff --git a/src/v2/routes/asset/modify/openapi.ts b/src/v2/routes/asset/modify/id/[id]/openapi.ts similarity index 80% rename from src/v2/routes/asset/modify/openapi.ts rename to src/v2/routes/asset/modify/id/[id]/openapi.ts index 1cef0a6..adecf2a 100644 --- a/src/v2/routes/asset/modify/openapi.ts +++ b/src/v2/routes/asset/modify/id/[id]/openapi.ts @@ -1,13 +1,14 @@ import { createRoute } from "@hono/zod-openapi" import { GenericResponses } from "@/v2/lib/response-schemas" -import { modifyAssetSchema, modifyAssetResponseSchema } from "./schema" +import { modifyAssetSchema, modifyAssetResponseSchema, modifyAssetPathSchema } from "./schema" export const modifyAssetRoute = createRoute({ - path: "/", - method: "post", + path: "/{id}", + method: "patch", description: "Modify an existing asset.", tags: ["Asset"], request: { + params: modifyAssetPathSchema, body: { content: { "application/json": { diff --git a/src/v2/routes/asset/modify/route.ts b/src/v2/routes/asset/modify/id/[id]/route.ts similarity index 94% rename from src/v2/routes/asset/modify/route.ts rename to src/v2/routes/asset/modify/id/[id]/route.ts index 122d17e..faea299 100644 --- a/src/v2/routes/asset/modify/route.ts +++ b/src/v2/routes/asset/modify/id/[id]/route.ts @@ -10,7 +10,8 @@ import { eq } from "drizzle-orm" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.openapi(modifyAssetRoute, async (ctx) => { - const { id, name, tags, assetCategoryId, gameId } = ctx.req.valid("json") + const { name, tags, assetCategoryId, gameId } = ctx.req.valid("json") + const { id } = ctx.req.valid("param") if (isNaN(parseInt(id))) { return ctx.json( diff --git a/src/v2/routes/asset/modify/schema.ts b/src/v2/routes/asset/modify/id/[id]/schema.ts similarity index 82% rename from src/v2/routes/asset/modify/schema.ts rename to src/v2/routes/asset/modify/id/[id]/schema.ts index 76c7ac5..824232e 100644 --- a/src/v2/routes/asset/modify/schema.ts +++ b/src/v2/routes/asset/modify/id/[id]/schema.ts @@ -1,11 +1,18 @@ import { z } from "zod" import { selectAssetSchema } from "@/v2/db/schema" -export const modifyAssetSchema = z.object({ +export const modifyAssetPathSchema = z.object({ id: z.string().openapi({ - description: "The id of the asset to modify.", - example: "1", + param: { + description: "The id of the asset to modify.", + example: "1", + in: "path", + required: true, + } }), +}) + +export const modifyAssetSchema = z.object({ name: z .string() .min(3) diff --git a/src/v2/routes/category/handler.ts b/src/v2/routes/category/handler.ts new file mode 100644 index 0000000..3e05785 --- /dev/null +++ b/src/v2/routes/category/handler.ts @@ -0,0 +1,6 @@ +import { OpenAPIHono } from "@hono/zod-openapi" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + + +export default handler diff --git a/src/v2/routes/game/delete/id/[id]/openapi.ts b/src/v2/routes/game/delete/id/[id]/openapi.ts index 7d34062..b595ac1 100644 --- a/src/v2/routes/game/delete/id/[id]/openapi.ts +++ b/src/v2/routes/game/delete/id/[id]/openapi.ts @@ -3,7 +3,7 @@ import { deleteGameSchema, deleteGameResponse } from "./schema" import { GenericResponses } from "@/v2/lib/response-schemas" export const deleteGameRoute = createRoute({ - path: "/", + path: "/{id}", method: "delete", description: "Delete a game & all its related assets.", tags: ["Game"], diff --git a/src/v2/routes/game/handler.ts b/src/v2/routes/game/handler.ts index 7f63471..9c8fc17 100644 --- a/src/v2/routes/game/handler.ts +++ b/src/v2/routes/game/handler.ts @@ -8,7 +8,7 @@ const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.route("/get", GameGetRoute) handler.route("/create", GameCreateRoute) -handler.route("/modify", ModifyGameRoute) -handler.route("/delete", DeleteGameRoute) +handler.route("/modify/id", ModifyGameRoute) +handler.route("/delete/id", DeleteGameRoute) export default handler diff --git a/src/v2/routes/game/modify/id/[id]/openapi.ts b/src/v2/routes/game/modify/id/[id]/openapi.ts index c31bfa8..cd78355 100644 --- a/src/v2/routes/game/modify/id/[id]/openapi.ts +++ b/src/v2/routes/game/modify/id/[id]/openapi.ts @@ -1,13 +1,18 @@ import { createRoute } from "@hono/zod-openapi" -import { modifyGameSchema, modifyGameResponseSchema } from "./schema" +import { + modifyGameSchema, + modifyGameResponseSchema, + modifyGamePathSchema, +} from "./schema" import { GenericResponses } from "@/v2/lib/response-schemas" export const modifyGameRoute = createRoute({ - path: "/", - method: "post", + path: "/{id}", + method: "patch", description: "Modify an existing game.", tags: ["Game"], request: { + params: modifyGamePathSchema, body: { content: { "application/json": { diff --git a/src/v2/routes/game/modify/id/[id]/route.ts b/src/v2/routes/game/modify/id/[id]/route.ts index 37ebfda..88c9a84 100644 --- a/src/v2/routes/game/modify/id/[id]/route.ts +++ b/src/v2/routes/game/modify/id/[id]/route.ts @@ -22,8 +22,9 @@ handler.openapi(modifyGameRoute, async (ctx) => { ) } - const { id, name, formattedName, possibleSuggestiveContent } = + const { name, formattedName, possibleSuggestiveContent } = ctx.req.valid("json") + const { id } = ctx.req.valid("param") const { drizzle } = getConnection(ctx.env) diff --git a/src/v2/routes/game/modify/id/[id]/schema.ts b/src/v2/routes/game/modify/id/[id]/schema.ts index 3a05ff6..0980327 100644 --- a/src/v2/routes/game/modify/id/[id]/schema.ts +++ b/src/v2/routes/game/modify/id/[id]/schema.ts @@ -1,11 +1,19 @@ import { z } from "@hono/zod-openapi" import { selectGameSchema } from "@/v2/db/schema" -export const modifyGameSchema = z.object({ +export const modifyGamePathSchema = z.object({ id: z.string().openapi({ - description: "The id of the game to modify.", - example: "honkai-star-rail", + param: { + name: "id", + description: "The id of the game to modify.", + example: "honkai-star-rail", + in: "path", + required: true, + } }), +}) + +export const modifyGameSchema = z.object({ name: z.string().min(3).max(32).openapi({ description: "The new name of the game.", example: "honkai-star-rail", diff --git a/src/v2/routes/handler.ts b/src/v2/routes/handler.ts index eb8a99b..61799bf 100644 --- a/src/v2/routes/handler.ts +++ b/src/v2/routes/handler.ts @@ -4,13 +4,15 @@ import GameRoute from "@/v2/routes/game/handler" import AssetRoute from "@/v2/routes/asset/handler" import ContributorRoute from "@/v2/routes/contributors/handler" import AuthRoute from "@/v2/routes/auth/handler" +import CategoryRoute from "@/v2/routes/category/handler" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.route("/game", GameRoute) +handler.route("/category", CategoryRoute) handler.route("/asset", AssetRoute) handler.route("/user", UserRoute) -handler.route("/contributors", ContributorRoute) +handler.route("/contributor", ContributorRoute) handler.route("/auth", AuthRoute) export default handler From c27cff2fd3add92a32416922b37722ffd6c051eb Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Mon, 22 Jan 2024 22:42:59 +0000 Subject: [PATCH 232/318] change like/unlike to POST in path --- src/v2/routes/asset/likes/handler.ts | 4 ++-- .../routes/asset/likes/like/{ => id/[id]}/openapi.ts | 10 ++-------- src/v2/routes/asset/likes/like/{ => id/[id]}/route.ts | 2 +- src/v2/routes/asset/likes/like/{ => id/[id]}/schema.ts | 9 +++++++-- .../routes/asset/likes/unlike/{ => id/[id]}/openapi.ts | 10 ++-------- .../routes/asset/likes/unlike/{ => id/[id]}/route.ts | 2 +- .../routes/asset/likes/unlike/{ => id/[id]}/schema.ts | 9 +++++++-- src/v2/routes/asset/modify/id/[id]/openapi.ts | 6 +++++- src/v2/routes/asset/modify/id/[id]/schema.ts | 2 +- src/v2/routes/category/handler.ts | 1 - src/v2/routes/game/modify/id/[id]/schema.ts | 4 ++-- 11 files changed, 30 insertions(+), 29 deletions(-) rename src/v2/routes/asset/likes/like/{ => id/[id]}/openapi.ts (77%) rename src/v2/routes/asset/likes/like/{ => id/[id]}/route.ts (97%) rename src/v2/routes/asset/likes/like/{ => id/[id]}/schema.ts (53%) rename src/v2/routes/asset/likes/unlike/{ => id/[id]}/openapi.ts (77%) rename src/v2/routes/asset/likes/unlike/{ => id/[id]}/route.ts (97%) rename src/v2/routes/asset/likes/unlike/{ => id/[id]}/schema.ts (53%) diff --git a/src/v2/routes/asset/likes/handler.ts b/src/v2/routes/asset/likes/handler.ts index 243d410..f6a2dba 100644 --- a/src/v2/routes/asset/likes/handler.ts +++ b/src/v2/routes/asset/likes/handler.ts @@ -1,6 +1,6 @@ import { OpenAPIHono } from "@hono/zod-openapi" -import UnlikeAssetByIdRoute from "@/v2/routes/asset/likes/unlike/route" -import LikeAssetByIdRoute from "@/v2/routes/asset/likes/like/route" +import UnlikeAssetByIdRoute from "@/v2/routes/asset/likes/unlike/id/[id]/route" +import LikeAssetByIdRoute from "@/v2/routes/asset/likes/like/id/[id]/route" import AllAssetLikesRoute from "@/v2/routes/asset/likes/all/route" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() diff --git a/src/v2/routes/asset/likes/like/openapi.ts b/src/v2/routes/asset/likes/like/id/[id]/openapi.ts similarity index 77% rename from src/v2/routes/asset/likes/like/openapi.ts rename to src/v2/routes/asset/likes/like/id/[id]/openapi.ts index 3f155c3..2d344e6 100644 --- a/src/v2/routes/asset/likes/like/openapi.ts +++ b/src/v2/routes/asset/likes/like/id/[id]/openapi.ts @@ -3,18 +3,12 @@ import { likeAssetByIdSchema, likeAssetByIdResponseSchema } from "./schema" import { GenericResponses } from "@/v2/lib/response-schemas" export const likeAssetByIdRoute = createRoute({ - path: "/", + path: "/{id}", method: "post", description: "Like an asset from their ID.", tags: ["Asset"], request: { - body: { - content: { - "application/json": { - schema: likeAssetByIdSchema, - }, - }, - }, + params: likeAssetByIdSchema, }, responses: { 200: { diff --git a/src/v2/routes/asset/likes/like/route.ts b/src/v2/routes/asset/likes/like/id/[id]/route.ts similarity index 97% rename from src/v2/routes/asset/likes/like/route.ts rename to src/v2/routes/asset/likes/like/id/[id]/route.ts index 4ea86d5..ff8fead 100644 --- a/src/v2/routes/asset/likes/like/route.ts +++ b/src/v2/routes/asset/likes/like/id/[id]/route.ts @@ -8,7 +8,7 @@ import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.openapi(likeAssetByIdRoute, async (ctx) => { - const assetId = ctx.req.valid("json").id + const assetId = ctx.req.valid("param").id if (isNaN(parseInt(assetId))) { return ctx.json( diff --git a/src/v2/routes/asset/likes/like/schema.ts b/src/v2/routes/asset/likes/like/id/[id]/schema.ts similarity index 53% rename from src/v2/routes/asset/likes/like/schema.ts rename to src/v2/routes/asset/likes/like/id/[id]/schema.ts index 83dc83c..20c2158 100644 --- a/src/v2/routes/asset/likes/like/schema.ts +++ b/src/v2/routes/asset/likes/like/id/[id]/schema.ts @@ -2,8 +2,13 @@ import { z } from "@hono/zod-openapi" export const likeAssetByIdSchema = z.object({ id: z.string().openapi({ - description: "The id of the asset to like.", - example: "1", + param: { + description: "The id of the asset to like.", + example: "1", + in: "path", + name: "id", + required: true, + }, }), }) diff --git a/src/v2/routes/asset/likes/unlike/openapi.ts b/src/v2/routes/asset/likes/unlike/id/[id]/openapi.ts similarity index 77% rename from src/v2/routes/asset/likes/unlike/openapi.ts rename to src/v2/routes/asset/likes/unlike/id/[id]/openapi.ts index d8b1ad1..8073a96 100644 --- a/src/v2/routes/asset/likes/unlike/openapi.ts +++ b/src/v2/routes/asset/likes/unlike/id/[id]/openapi.ts @@ -3,18 +3,12 @@ import { unlikeAssetByIdSchema, unlikeAssetByIdResponseSchema } from "./schema" import { GenericResponses } from "@/v2/lib/response-schemas" export const unlikeAssetByIdRoute = createRoute({ - path: "/", + path: "/{id}", method: "post", description: "Unlike an asset from their ID.", tags: ["Asset"], request: { - body: { - content: { - "application/json": { - schema: unlikeAssetByIdSchema, - }, - }, - }, + params: unlikeAssetByIdSchema, }, responses: { 200: { diff --git a/src/v2/routes/asset/likes/unlike/route.ts b/src/v2/routes/asset/likes/unlike/id/[id]/route.ts similarity index 97% rename from src/v2/routes/asset/likes/unlike/route.ts rename to src/v2/routes/asset/likes/unlike/id/[id]/route.ts index 4228de4..da95fc3 100644 --- a/src/v2/routes/asset/likes/unlike/route.ts +++ b/src/v2/routes/asset/likes/unlike/id/[id]/route.ts @@ -8,7 +8,7 @@ import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.openapi(unlikeAssetByIdRoute, async (ctx) => { - const assetId = ctx.req.valid("json").id + const assetId = ctx.req.valid("param").id if (isNaN(parseInt(assetId))) { return ctx.json( diff --git a/src/v2/routes/asset/likes/unlike/schema.ts b/src/v2/routes/asset/likes/unlike/id/[id]/schema.ts similarity index 53% rename from src/v2/routes/asset/likes/unlike/schema.ts rename to src/v2/routes/asset/likes/unlike/id/[id]/schema.ts index f46bd58..bbe6155 100644 --- a/src/v2/routes/asset/likes/unlike/schema.ts +++ b/src/v2/routes/asset/likes/unlike/id/[id]/schema.ts @@ -2,8 +2,13 @@ import { z } from "@hono/zod-openapi" export const unlikeAssetByIdSchema = z.object({ id: z.string().openapi({ - description: "The id of the asset to unlike.", - example: "1", + param: { + description: "The id of the asset to unlike.", + example: "1", + in: "path", + name: "id", + required: true, + }, }), }) diff --git a/src/v2/routes/asset/modify/id/[id]/openapi.ts b/src/v2/routes/asset/modify/id/[id]/openapi.ts index adecf2a..24561fa 100644 --- a/src/v2/routes/asset/modify/id/[id]/openapi.ts +++ b/src/v2/routes/asset/modify/id/[id]/openapi.ts @@ -1,6 +1,10 @@ import { createRoute } from "@hono/zod-openapi" import { GenericResponses } from "@/v2/lib/response-schemas" -import { modifyAssetSchema, modifyAssetResponseSchema, modifyAssetPathSchema } from "./schema" +import { + modifyAssetSchema, + modifyAssetResponseSchema, + modifyAssetPathSchema, +} from "./schema" export const modifyAssetRoute = createRoute({ path: "/{id}", diff --git a/src/v2/routes/asset/modify/id/[id]/schema.ts b/src/v2/routes/asset/modify/id/[id]/schema.ts index 824232e..3dc1ece 100644 --- a/src/v2/routes/asset/modify/id/[id]/schema.ts +++ b/src/v2/routes/asset/modify/id/[id]/schema.ts @@ -8,7 +8,7 @@ export const modifyAssetPathSchema = z.object({ example: "1", in: "path", required: true, - } + }, }), }) diff --git a/src/v2/routes/category/handler.ts b/src/v2/routes/category/handler.ts index 3e05785..0054339 100644 --- a/src/v2/routes/category/handler.ts +++ b/src/v2/routes/category/handler.ts @@ -2,5 +2,4 @@ import { OpenAPIHono } from "@hono/zod-openapi" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() - export default handler diff --git a/src/v2/routes/game/modify/id/[id]/schema.ts b/src/v2/routes/game/modify/id/[id]/schema.ts index 0980327..c936347 100644 --- a/src/v2/routes/game/modify/id/[id]/schema.ts +++ b/src/v2/routes/game/modify/id/[id]/schema.ts @@ -9,7 +9,7 @@ export const modifyGamePathSchema = z.object({ example: "honkai-star-rail", in: "path", required: true, - } + }, }), }) @@ -24,7 +24,7 @@ export const modifyGameSchema = z.object({ }), possibleSuggestiveContent: z .string() - .min(1) + .min(0) .max(1) .openapi({ description: From 0a5ad78faf3f81310229409158828868cad07dc7 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Tue, 23 Jan 2024 00:34:30 +0000 Subject: [PATCH 233/318] conv game suggestive content int type to bool --- .../db/schema/collections/user-collections-collaborators.ts | 5 +++++ src/v2/db/schema/game/game.ts | 6 ++++-- src/v2/lib/managers/game/game-manager.ts | 4 ++-- src/v2/routes/game/create/route.ts | 2 +- src/v2/routes/game/modify/id/[id]/route.ts | 2 +- 5 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/v2/db/schema/collections/user-collections-collaborators.ts b/src/v2/db/schema/collections/user-collections-collaborators.ts index 0c29d24..160e7de 100644 --- a/src/v2/db/schema/collections/user-collections-collaborators.ts +++ b/src/v2/db/schema/collections/user-collections-collaborators.ts @@ -10,6 +10,11 @@ import { authUser } from "../user/user" import { userCollection } from "./user-collections" import { createInsertSchema, createSelectSchema } from "drizzle-zod" +// editor: maximum permissions, can edit collection name/description +// collaborator: can add/remove assets from collection +// viewer: can view collection depending on privacy settings +export type CollaboratorsRoles = "viewer" | "collaborator" | "editor" + export const userCollectionCollaborators = sqliteTable( tableNames.userCollectionCollaborators, { diff --git a/src/v2/db/schema/game/game.ts b/src/v2/db/schema/game/game.ts index 0c0fb37..5299b61 100644 --- a/src/v2/db/schema/game/game.ts +++ b/src/v2/db/schema/game/game.ts @@ -23,8 +23,10 @@ export const game = sqliteTable( id: text("id").primaryKey().notNull(), // e.g genshin-impact, honkai-impact-3rd name: text("name").notNull().unique(), // e.g genshin-impact, honkai-impact-3rd formattedName: text("formatted_name").notNull(), // e.g Genshin Impact, Honkai Impact 3rd - possibleSuggestiveContent: integer("possible_suggestive_content") - .default(0) + possibleSuggestiveContent: integer("possible_suggestive_content", { + mode: "boolean", + }) + .default(false) .notNull(), lastUpdated: text("last_updated") .notNull() diff --git a/src/v2/lib/managers/game/game-manager.ts b/src/v2/lib/managers/game/game-manager.ts index d2e2e50..2c8a217 100644 --- a/src/v2/lib/managers/game/game-manager.ts +++ b/src/v2/lib/managers/game/game-manager.ts @@ -100,7 +100,7 @@ export class GameManager { public async createGame( name: string, formattedName: string, - possibleSuggestiveContent: number + possibleSuggestiveContent: boolean ): Promise { try { const [newGame] = await this.drizzle @@ -134,7 +134,7 @@ export class GameManager { gameId: string, name: string, formattedName: string, - possibleSuggestiveContent: number + possibleSuggestiveContent: boolean ): Promise { try { const [updatedGame] = await this.drizzle diff --git a/src/v2/routes/game/create/route.ts b/src/v2/routes/game/create/route.ts index bf8931e..bb89f0c 100644 --- a/src/v2/routes/game/create/route.ts +++ b/src/v2/routes/game/create/route.ts @@ -44,7 +44,7 @@ handler.openapi(createGameRoute, async (ctx) => { const game = await gameManager.createGame( name, formattedName, - possibleSuggestiveContent + Boolean(possibleSuggestiveContent) ) return ctx.json( diff --git a/src/v2/routes/game/modify/id/[id]/route.ts b/src/v2/routes/game/modify/id/[id]/route.ts index 88c9a84..647ba31 100644 --- a/src/v2/routes/game/modify/id/[id]/route.ts +++ b/src/v2/routes/game/modify/id/[id]/route.ts @@ -46,7 +46,7 @@ handler.openapi(modifyGameRoute, async (ctx) => { id, name, formattedName, - possibleSuggestiveContent + Boolean(possibleSuggestiveContent) ) return ctx.json( From 83f251440448f7d949da2f230cbc1b8ca788153c Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Tue, 23 Jan 2024 01:54:09 +0000 Subject: [PATCH 234/318] init collection collaborator roles --- .../user-collections-collaborators.ts | 3 ++ .../collection/collection-collaborators.ts | 38 ++++++++++++++++++- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/v2/db/schema/collections/user-collections-collaborators.ts b/src/v2/db/schema/collections/user-collections-collaborators.ts index 160e7de..44c4818 100644 --- a/src/v2/db/schema/collections/user-collections-collaborators.ts +++ b/src/v2/db/schema/collections/user-collections-collaborators.ts @@ -24,6 +24,9 @@ export const userCollectionCollaborators = sqliteTable( collaboratorId: text("collaborator_id") .notNull() .references(() => authUser.id), + role: text("role").$type() + .default('collaborator') + .notNull(), createdAt: text("createdAt") .notNull() .$defaultFn(() => { diff --git a/src/v2/lib/managers/collection/collection-collaborators.ts b/src/v2/lib/managers/collection/collection-collaborators.ts index 17e5e74..ec9062f 100644 --- a/src/v2/lib/managers/collection/collection-collaborators.ts +++ b/src/v2/lib/managers/collection/collection-collaborators.ts @@ -2,6 +2,7 @@ import { DrizzleInstance } from "@/v2/db/turso" import { and, eq } from "drizzle-orm" import { userCollectionCollaborators } from "@/v2/db/schema/collections/user-collections-collaborators" import { authUser } from "@/v2/db/schema/user/user" +import type { CollaboratorsRoles } from "@/v2/db/schema/collections/user-collections-collaborators" export class UserCollectionCollaboratorsManager { constructor(private drizzle: DrizzleInstance) {} @@ -13,12 +14,14 @@ export class UserCollectionCollaboratorsManager { */ public async addCollaborator( collectionId: string, - userId: string + userId: string, + role: CollaboratorsRoles ): Promise { try { await this.drizzle.insert(userCollectionCollaborators).values({ - collectionId, + collectionId: collectionId, collaboratorId: userId, + role: role, }) } catch (e) { console.error( @@ -31,6 +34,37 @@ export class UserCollectionCollaboratorsManager { } } + public async updateCollaboratorRole( + collectionId: string, + userId: string, + role: CollaboratorsRoles + ): Promise { + try { + await this.drizzle + .update(userCollectionCollaborators) + .set({ + role: role, + }) + .where( + and( + eq( + userCollectionCollaborators.collectionId, + collectionId + ), + eq(userCollectionCollaborators.collaboratorId, userId) + ) + ) + } catch (e) { + console.error( + `Error updating collaborator ${userId} role in collection ${collectionId}`, + e + ) + throw new Error( + `Error updating collaborator ${userId} role in collection ${collectionId}` + ) + } + } + /** * Removes a collaborator from a collection. * @param collectionId - The ID of the collection to remove a collaborator from. From 3c4dbb4079763528e83363f43962f7a81521425e Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Tue, 23 Jan 2024 01:55:14 +0000 Subject: [PATCH 235/318] prettier --- .../db/schema/collections/user-collections-collaborators.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/v2/db/schema/collections/user-collections-collaborators.ts b/src/v2/db/schema/collections/user-collections-collaborators.ts index 44c4818..4313971 100644 --- a/src/v2/db/schema/collections/user-collections-collaborators.ts +++ b/src/v2/db/schema/collections/user-collections-collaborators.ts @@ -24,8 +24,9 @@ export const userCollectionCollaborators = sqliteTable( collaboratorId: text("collaborator_id") .notNull() .references(() => authUser.id), - role: text("role").$type() - .default('collaborator') + role: text("role") + .$type() + .default("collaborator") .notNull(), createdAt: text("createdAt") .notNull() From 0387cd2a9db50a50711f111fcba25d3e1fa73e12 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Tue, 23 Jan 2024 20:18:30 +0000 Subject: [PATCH 236/318] update seeded data asset path to be unique --- src/scripts/seed/seed.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/scripts/seed/seed.ts b/src/scripts/seed/seed.ts index 06d22e3..73aa0e2 100644 --- a/src/scripts/seed/seed.ts +++ b/src/scripts/seed/seed.ts @@ -220,7 +220,7 @@ async function main() { extension: "image/png", gameId: "genshin-impact", assetCategoryId: "character-sheets", - url: "/test/image.png", + url: "/genshin-impact/character-sheets/test-asset.png", status: "approved", uploadedById: newUsers[0].id, uploadedByName: newUsers[0].username, @@ -237,7 +237,7 @@ async function main() { extension: "image/png", gameId: "honkai-impact-3rd", assetCategoryId: "character-sheets", - url: "/test/image.png", + url: "/honkai-impact-3rd/character-sheets/test-asset2.png", status: "approved", uploadedById: newUsers[1].id, uploadedByName: newUsers[1].username, @@ -253,7 +253,7 @@ async function main() { extension: "image/png", gameId: "genshin-impact", assetCategoryId: "splash-art", - url: "/test/image.png", + url: "/genshin-impact/splash-art/test-asset3.png", status: "approved", uploadedById: newUsers[1].id, uploadedByName: newUsers[1].username, @@ -270,7 +270,7 @@ async function main() { extension: "image/png", gameId: "genshin-impact", assetCategoryId: "splash-art", - url: "/test/image.png", + url: "/genshin-impact/splash-art/test-asset4.png", status: "approved", uploadedById: newUsers[1].id, uploadedByName: newUsers[1].username, @@ -287,7 +287,7 @@ async function main() { extension: "image/png", gameId: "genshin-impact", assetCategoryId: "splash-art", - url: "/test/image.png", + url: "/genshin-impact/splash-art/test-asset5.png", status: "approved", uploadedById: newUsers[2].id, uploadedByName: newUsers[2].username, @@ -301,7 +301,7 @@ async function main() { extension: "image/png", gameId: "honkai-impact-3rd", assetCategoryId: "character-sheets", - url: "/test/image.png", + url: "/honkai-impact-3rd/character-sheets/test-asset6.png", status: "approved", uploadedById: newUsers[2].id, uploadedByName: newUsers[2].username, From 7bec74da44e115c68ca8115b78fcc148daed0b1e Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Tue, 23 Jan 2024 20:36:55 +0000 Subject: [PATCH 237/318] asset modify support changing tags (badly) --- src/v2/lib/managers/asset/asset-manager.ts | 61 +++++++++++++++++++++- 1 file changed, 59 insertions(+), 2 deletions(-) diff --git a/src/v2/lib/managers/asset/asset-manager.ts b/src/v2/lib/managers/asset/asset-manager.ts index f65636f..56d7a5a 100644 --- a/src/v2/lib/managers/asset/asset-manager.ts +++ b/src/v2/lib/managers/asset/asset-manager.ts @@ -1,6 +1,6 @@ import { DrizzleInstance } from "@/v2/db/turso" import { asset, assetTag, assetTagAsset } from "@/v2/db/schema" -import { eq } from "drizzle-orm" +import { eq, and } from "drizzle-orm" import { R2Bucket } from "@cloudflare/workers-types" import { SplitQueryByCommas } from "../../helpers/split-query-by-commas" import { z } from "zod" @@ -17,6 +17,7 @@ export class AssetManager { .select() .from(asset) .where(eq(asset.id, assetId)) + .limit(1) } catch (e) { console.error(`Error getting asset by ID ${assetId}`, e) throw new Error(`Error getting asset by ID ${assetId}`) @@ -70,12 +71,13 @@ export class AssetManager { } } + // this needs to be refactored and use transactions, so we can rollback if something fails (this is ugly as hell) public async updateAssetById( assetId: number, update: z.infer ) { try { - return await this.drizzle + const [updatedAsset] = await this.drizzle .update(asset) .set({ name: update.name, @@ -85,6 +87,61 @@ export class AssetManager { }) .where(eq(asset.id, assetId)) .returning() + + const newTags = SplitQueryByCommas(update.tags) ?? [] + + if (newTags.length === 0) return updatedAsset + + const oldTags = await this.drizzle + .select({ + assetTagId: assetTag.id, + }) + .from(assetTagAsset) + .innerJoin(assetTag, eq(assetTag.id, assetTagAsset.assetTagId)) + .where(eq(assetTagAsset.assetId, assetId)) + + const oldTagIds = oldTags.map((t) => t.assetTagId) + + const tagsToRemove = oldTagIds.filter((t) => !newTags.includes(t)) + + const tagsToAdd = newTags.filter((t) => !oldTagIds.includes(t)) + + if (tagsToRemove.length > 0) { + for (const assetTagId of tagsToRemove) { + await this.drizzle + .delete(assetTagAsset) + .where( + and( + eq(assetTagAsset.assetId, assetId), + eq(assetTagAsset.assetTagId, assetTagId) + ) + ) + } + } + + if (tagsToAdd.length > 0) { + for (const tag of tagsToAdd) { + const foundTag = await this.drizzle + .select({ + id: assetTag.id, + }) + .from(assetTag) + .innerJoin( + assetTagAsset, + eq(assetTag.id, assetTagAsset.assetTagId) + ) + .where(eq(assetTag.name, tag)) + + if (foundTag) { + await this.drizzle.insert(assetTagAsset).values({ + assetId: assetId, + assetTagId: tag, + }) + } + } + } + + return updatedAsset } catch (e) { console.error(`Error updating asset by ID ${assetId}`, e) throw new Error(`Error updating asset by ID ${assetId}`) From 8649e31149dee848f709542978486ccd98076df2 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Tue, 23 Jan 2024 20:44:02 +0000 Subject: [PATCH 238/318] refactor asset tag handling, use transactions --- src/v2/lib/managers/asset/asset-manager.ts | 149 +++++++++++---------- 1 file changed, 76 insertions(+), 73 deletions(-) diff --git a/src/v2/lib/managers/asset/asset-manager.ts b/src/v2/lib/managers/asset/asset-manager.ts index 56d7a5a..37a2d2e 100644 --- a/src/v2/lib/managers/asset/asset-manager.ts +++ b/src/v2/lib/managers/asset/asset-manager.ts @@ -71,75 +71,51 @@ export class AssetManager { } } - // this needs to be refactored and use transactions, so we can rollback if something fails (this is ugly as hell) public async updateAssetById( assetId: number, update: z.infer ) { try { - const [updatedAsset] = await this.drizzle - .update(asset) - .set({ - name: update.name, - assetCategoryId: update.assetCategoryId, - gameId: update.gameId, - assetIsSuggestive: Boolean(update.assetIsSuggestive), - }) - .where(eq(asset.id, assetId)) - .returning() - - const newTags = SplitQueryByCommas(update.tags) ?? [] + const updatedAsset = await this.drizzle.transaction(async (tx) => { + const [updatedAsset] = await tx + .update(asset) + .set({ + name: update.name, + assetCategoryId: update.assetCategoryId, + gameId: update.gameId, + assetIsSuggestive: Boolean(update.assetIsSuggestive), + }) + .where(eq(asset.id, assetId)) + .returning() - if (newTags.length === 0) return updatedAsset + const newTags = SplitQueryByCommas(update.tags) ?? [] - const oldTags = await this.drizzle - .select({ - assetTagId: assetTag.id, - }) - .from(assetTagAsset) - .innerJoin(assetTag, eq(assetTag.id, assetTagAsset.assetTagId)) - .where(eq(assetTagAsset.assetId, assetId)) + if (newTags.length === 0) return updatedAsset - const oldTagIds = oldTags.map((t) => t.assetTagId) + const oldTags = await tx + .select({ + assetTagId: assetTag.id, + }) + .from(assetTagAsset) + .innerJoin( + assetTag, + eq(assetTag.id, assetTagAsset.assetTagId) + ) + .where(eq(assetTagAsset.assetId, assetId)) - const tagsToRemove = oldTagIds.filter((t) => !newTags.includes(t)) + const oldTagIds = oldTags.map((t) => t.assetTagId) - const tagsToAdd = newTags.filter((t) => !oldTagIds.includes(t)) + const tagsToRemove = oldTagIds.filter( + (t) => !newTags.includes(t) + ) - if (tagsToRemove.length > 0) { - for (const assetTagId of tagsToRemove) { - await this.drizzle - .delete(assetTagAsset) - .where( - and( - eq(assetTagAsset.assetId, assetId), - eq(assetTagAsset.assetTagId, assetTagId) - ) - ) - } - } + const tagsToAdd = newTags.filter((t) => !oldTagIds.includes(t)) - if (tagsToAdd.length > 0) { - for (const tag of tagsToAdd) { - const foundTag = await this.drizzle - .select({ - id: assetTag.id, - }) - .from(assetTag) - .innerJoin( - assetTagAsset, - eq(assetTag.id, assetTagAsset.assetTagId) - ) - .where(eq(assetTag.name, tag)) + await this.removeTags(tx, assetId, tagsToRemove) + await this.addTags(tx, assetId, tagsToAdd) - if (foundTag) { - await this.drizzle.insert(assetTagAsset).values({ - assetId: assetId, - assetTagId: tag, - }) - } - } - } + return updatedAsset + }) return updatedAsset } catch (e) { @@ -148,6 +124,47 @@ export class AssetManager { } } + // eslint-disable-next-line @typescript-eslint/no-explicit-any -- i don't know how to type this + private async removeTags(tx: any, assetId: number, tagsToRemove: string[]) { + if (tagsToRemove.length > 0) { + for (const assetTagId of tagsToRemove) { + await tx + .delete(assetTagAsset) + .where( + and( + eq(assetTagAsset.assetId, assetId), + eq(assetTagAsset.assetTagId, assetTagId) + ) + ) + } + } + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any -- i don't know how to type this + private async addTags(tx: any, assetId: number, tagsToAdd: string[]) { + if (tagsToAdd.length > 0) { + for (const tag of tagsToAdd) { + const foundTag = await tx + .select({ + id: assetTag.id, + }) + .from(assetTag) + .innerJoin( + assetTagAsset, + eq(assetTag.id, assetTagAsset.assetTagId) + ) + .where(eq(assetTag.name, tag)) + + if (foundTag) { + await tx.insert(assetTagAsset).values({ + assetId: assetId, + assetTagId: tag, + }) + } + } + } + } + /** * Retrieves a list of all assets. * @returns A promise that resolves to an array of assets. @@ -253,8 +270,8 @@ export class AssetManager { // TODO(dromzeh): correct file size, width, and height const returnedNewAsset: Asset = await this.drizzle.transaction( - async (trx) => { - const [createdAsset] = await trx + async (tx) => { + const [createdAsset] = await tx .insert(asset) .values({ name: newAsset.name, @@ -278,21 +295,7 @@ export class AssetManager { if (tags.length === 0) return createdAsset - for (const tag of tags) { - const foundTag = await trx - .select({ - id: assetTag.id, - }) - .from(assetTag) - .where(eq(assetTag.name, tag)) - - if (foundTag) { - await trx.insert(assetTagAsset).values({ - assetId: createdAsset.id, - assetTagId: tag, - }) - } - } + await this.addTags(tx, createdAsset.id, tags) return createdAsset } From 7a74e06a674e5d0cf41661b9041126558168a628 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Wed, 24 Jan 2024 00:55:12 +0000 Subject: [PATCH 239/318] improve perf with batch api --- src/v2/lib/managers/asset/asset-manager.ts | 225 +++++++++++---------- 1 file changed, 119 insertions(+), 106 deletions(-) diff --git a/src/v2/lib/managers/asset/asset-manager.ts b/src/v2/lib/managers/asset/asset-manager.ts index 37a2d2e..f0879fa 100644 --- a/src/v2/lib/managers/asset/asset-manager.ts +++ b/src/v2/lib/managers/asset/asset-manager.ts @@ -1,13 +1,13 @@ import { DrizzleInstance } from "@/v2/db/turso" import { asset, assetTag, assetTagAsset } from "@/v2/db/schema" -import { eq, and } from "drizzle-orm" +import { eq, and, sql } from "drizzle-orm" import { R2Bucket } from "@cloudflare/workers-types" import { SplitQueryByCommas } from "../../helpers/split-query-by-commas" import { z } from "zod" -import type { Asset, NewAsset } from "@/v2/db/schema" +import type { AssetStatus, NewAsset } from "@/v2/db/schema" import type { assetSearchAllFilter } from "@/v2/routes/asset/search/all/schema" import { uploadAssetSchema } from "@/v2/routes/asset/upload/schema" - +import { modifyAssetSchema } from "@/v2/routes/asset/modify/id/[id]/schema" export class AssetManager { constructor(private drizzle: DrizzleInstance) {} @@ -24,6 +24,48 @@ export class AssetManager { } } + public async updateAssetViews(assetId: number) { + try { + await this.drizzle + .update(asset) + .set({ + viewCount: sql`${asset.viewCount} + 1`, + }) + .where(eq(asset.id, assetId)) + } catch (e) { + console.error(`Error updating asset views by ID ${assetId}`, e) + throw new Error(`Error updating asset views by ID ${assetId}`) + } + } + + public async updateAssetStatus(assetId: number, status: AssetStatus) { + try { + await this.drizzle + .update(asset) + .set({ + status: status, + }) + .where(eq(asset.id, assetId)) + } catch (e) { + console.error(`Error updating asset status by ID ${assetId}`, e) + throw new Error(`Error updating asset status by ID ${assetId}`) + } + } + + public async updateAssetDownloads(assetId: number) { + try { + await this.drizzle + .update(asset) + .set({ + downloadCount: sql`${asset.downloadCount} + 1`, + }) + .where(eq(asset.id, assetId)) + } catch (e) { + console.error(`Error updating asset downloads by ID ${assetId}`, e) + throw new Error(`Error updating asset downloads by ID ${assetId}`) + } + } + public async getAssetById(assetId: number) { try { return await this.drizzle.query.asset.findFirst({ @@ -73,49 +115,59 @@ export class AssetManager { public async updateAssetById( assetId: number, - update: z.infer + update: z.infer ) { - try { - const updatedAsset = await this.drizzle.transaction(async (tx) => { - const [updatedAsset] = await tx - .update(asset) - .set({ - name: update.name, - assetCategoryId: update.assetCategoryId, - gameId: update.gameId, - assetIsSuggestive: Boolean(update.assetIsSuggestive), - }) - .where(eq(asset.id, assetId)) - .returning() + const { tags, ...rest } = update - const newTags = SplitQueryByCommas(update.tags) ?? [] - - if (newTags.length === 0) return updatedAsset + try { + const [updatedAsset] = await this.drizzle + .update(asset) + .set({ + ...rest, + }) + .where(eq(asset.id, assetId)) + .returning() - const oldTags = await tx - .select({ - assetTagId: assetTag.id, - }) - .from(assetTagAsset) - .innerJoin( - assetTag, - eq(assetTag.id, assetTagAsset.assetTagId) - ) - .where(eq(assetTagAsset.assetId, assetId)) + const newTags = SplitQueryByCommas(tags) ?? [] + if (newTags.length === 0) return updatedAsset - const oldTagIds = oldTags.map((t) => t.assetTagId) + const oldTags = await this.drizzle + .select({ + assetTagId: assetTag.id, + }) + .from(assetTagAsset) + .innerJoin(assetTag, eq(assetTag.id, assetTagAsset.assetTagId)) + .where(eq(assetTagAsset.assetId, assetId)) - const tagsToRemove = oldTagIds.filter( - (t) => !newTags.includes(t) - ) + const oldTagIds = oldTags.map((t) => t.assetTagId) + const tagsToRemove = oldTagIds.filter((t) => !newTags.includes(t)) + const tagsToAdd = newTags.filter((t) => !oldTagIds.includes(t)) - const tagsToAdd = newTags.filter((t) => !oldTagIds.includes(t)) + const tagBatchQueries = [ + ...tagsToRemove.map((tagId) => + this.drizzle + .delete(assetTagAsset) + .where( + and( + eq(assetTagAsset.assetId, assetId), + eq(assetTagAsset.assetTagId, tagId) + ) + ) + ), + ...tagsToAdd.map((tag) => + this.drizzle.insert(assetTagAsset).values({ + assetId: assetId, + assetTagId: tag, + }) + ), + ] - await this.removeTags(tx, assetId, tagsToRemove) - await this.addTags(tx, assetId, tagsToAdd) + // https://github.com/drizzle-team/drizzle-orm/issues/1301 + type TagBatchQuery = (typeof tagBatchQueries)[number] - return updatedAsset - }) + await this.drizzle.batch( + tagBatchQueries as [TagBatchQuery, ...TagBatchQuery[]] + ) return updatedAsset } catch (e) { @@ -124,47 +176,6 @@ export class AssetManager { } } - // eslint-disable-next-line @typescript-eslint/no-explicit-any -- i don't know how to type this - private async removeTags(tx: any, assetId: number, tagsToRemove: string[]) { - if (tagsToRemove.length > 0) { - for (const assetTagId of tagsToRemove) { - await tx - .delete(assetTagAsset) - .where( - and( - eq(assetTagAsset.assetId, assetId), - eq(assetTagAsset.assetTagId, assetTagId) - ) - ) - } - } - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any -- i don't know how to type this - private async addTags(tx: any, assetId: number, tagsToAdd: string[]) { - if (tagsToAdd.length > 0) { - for (const tag of tagsToAdd) { - const foundTag = await tx - .select({ - id: assetTag.id, - }) - .from(assetTag) - .innerJoin( - assetTagAsset, - eq(assetTag.id, assetTagAsset.assetTagId) - ) - .where(eq(assetTag.name, tag)) - - if (foundTag) { - await tx.insert(assetTagAsset).values({ - assetId: assetId, - assetTagId: tag, - }) - } - } - } - } - /** * Retrieves a list of all assets. * @returns A promise that resolves to an array of assets. @@ -269,39 +280,41 @@ export class AssetManager { ) // TODO(dromzeh): correct file size, width, and height - const returnedNewAsset: Asset = await this.drizzle.transaction( - async (tx) => { - const [createdAsset] = await tx - .insert(asset) - .values({ - name: newAsset.name, - extension: "png", - gameId: newAsset.gameId, - assetCategoryId: newAsset.assetCategoryId, - url: key, - uploadedByName: userNickname, - uploadedById: userId, - status: "pending", - fileSize: 0, - width: 0, - height: 0, - assetIsSuggestive: Boolean( - newAsset.assetIsSuggestive - ), - }) - .returning() + const [createdAsset] = await this.drizzle + .insert(asset) + .values({ + name: newAsset.name, + extension: "png", + gameId: newAsset.gameId, + assetCategoryId: newAsset.assetCategoryId, + url: key, + uploadedByName: userNickname, + uploadedById: userId, + status: "pending", + fileSize: 0, + width: 0, + height: 0, + assetIsSuggestive: Boolean(newAsset.assetIsSuggestive), + }) + .returning() - const tags = SplitQueryByCommas(newAsset.tags) ?? [] + const tags = SplitQueryByCommas(newAsset.tags) ?? [] - if (tags.length === 0) return createdAsset + if (tags.length === 0) return createdAsset - await this.addTags(tx, createdAsset.id, tags) + const tagBatchQueries = tags.map((tag) => + this.drizzle.insert(assetTagAsset).values({ + assetId: createdAsset.id, + assetTagId: tag, + }) + ) - return createdAsset - } + type TagBatchQuery = (typeof tagBatchQueries)[number] + await this.drizzle.batch( + tagBatchQueries as [TagBatchQuery, ...TagBatchQuery[]] ) - return returnedNewAsset + return createdAsset } catch (e) { console.error("Error creating asset", e) throw new Error("Error creating asset") From c1150fded97a9c3a2d799b3d8d415bf360ef26b5 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Wed, 24 Jan 2024 02:18:52 +0000 Subject: [PATCH 240/318] user follow/unfollow --- .../lib/managers/user/user-follow-manager.ts | 28 +++++++ src/v2/routes/asset/get/id/[id]/route.ts | 8 +- .../user/follows/follow/id/[id]/openapi.ts | 24 ++++++ .../user/follows/follow/id/[id]/route.ts | 74 +++++++++++++++++++ .../user/follows/follow/id/[id]/schema.ts | 16 ++++ src/v2/routes/user/follows/handler.ts | 10 +++ .../user/follows/unfollow/id/[id]/openapi.ts | 27 +++++++ .../user/follows/unfollow/id/[id]/route.ts | 74 +++++++++++++++++++ .../user/follows/unfollow/id/[id]/schema.ts | 16 ++++ src/v2/routes/user/handler.ts | 2 + 10 files changed, 277 insertions(+), 2 deletions(-) diff --git a/src/v2/lib/managers/user/user-follow-manager.ts b/src/v2/lib/managers/user/user-follow-manager.ts index 68a99a8..4ba32e8 100644 --- a/src/v2/lib/managers/user/user-follow-manager.ts +++ b/src/v2/lib/managers/user/user-follow-manager.ts @@ -76,6 +76,34 @@ export class UserFollowManager { } } + public async checkFollowStatus( + followerId: string, + followingId: string + ): Promise { + try { + const [follow] = await this.drizzle + .select({ id: userFollowing.followerId }) + .from(userFollowing) + .where( + and( + eq(userFollowing.followerId, followerId), + eq(userFollowing.followingId, followingId) + ) + ) + .limit(1) + + return follow ? true : false + } catch (e) { + console.error( + `Error checking follow status for user ${followingId} from user ${followerId}`, + e + ) + throw new Error( + `Error checking follow status for user ${followingId} from user ${followerId}` + ) + } + } + /** * Retrieves the followers of a user by their user ID. * diff --git a/src/v2/routes/asset/get/id/[id]/route.ts b/src/v2/routes/asset/get/id/[id]/route.ts index ae26098..8dfe22b 100644 --- a/src/v2/routes/asset/get/id/[id]/route.ts +++ b/src/v2/routes/asset/get/id/[id]/route.ts @@ -18,20 +18,24 @@ handler.openapi(getAssetByIdRoute, async (ctx) => { ) } + const parsedAssetId = parseInt(assetId) + const { drizzle } = await getConnection(ctx.env) const assetManager = new AssetManager(drizzle) - const asset = await assetManager.getAssetById(parseInt(assetId)) + const asset = await assetManager.getAssetById(parsedAssetId) if (!asset) { return ctx.json( { - success: true, + success: false, message: "Asset not found", }, 400 ) } + await assetManager.updateAssetViews(parsedAssetId) + return ctx.json( { success: true, diff --git a/src/v2/routes/user/follows/follow/id/[id]/openapi.ts b/src/v2/routes/user/follows/follow/id/[id]/openapi.ts index e69de29..f82b23f 100644 --- a/src/v2/routes/user/follows/follow/id/[id]/openapi.ts +++ b/src/v2/routes/user/follows/follow/id/[id]/openapi.ts @@ -0,0 +1,24 @@ +import { createRoute } from "@hono/zod-openapi" +import { followUserByIdResponseSchema, followUserByIdSchema } from "./schema" +import { GenericResponses } from "@/v2/lib/response-schemas" + +export const followUserByIdRoute = createRoute({ + path: "/{id}", + method: "post", + description: "Follow a user from their ID.", + tags: ["User"], + request: { + params: followUserByIdSchema, + }, + responses: { + 200: { + description: "True if the user was followed.", + content: { + "application/json": { + schema: followUserByIdResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) diff --git a/src/v2/routes/user/follows/follow/id/[id]/route.ts b/src/v2/routes/user/follows/follow/id/[id]/route.ts index e69de29..bdaca9c 100644 --- a/src/v2/routes/user/follows/follow/id/[id]/route.ts +++ b/src/v2/routes/user/follows/follow/id/[id]/route.ts @@ -0,0 +1,74 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { followUserByIdRoute } from "./openapi" +import { getConnection } from "@/v2/db/turso" +import { UserFollowManager } from "@/v2/lib/managers/user/user-follow-manager" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.openapi(followUserByIdRoute, async (ctx) => { + const userId = ctx.req.valid("param").id + + const { drizzle } = await getConnection(ctx.env) + + const authSessionManager = new AuthSessionManager(ctx) + const { user } = await authSessionManager.validateSession() + + if (!user) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + if (userId == user.id) { + return ctx.json( + { + success: false, + message: "You cannot follow yourself", + }, + 400 + ) + } + + const userFollowManager = new UserFollowManager(drizzle) + + const followStatus = await userFollowManager.checkFollowStatus( + user.id, + userId + ) + + if (followStatus) { + return ctx.json( + { + success: false, + message: "You are already following this user", + }, + 400 + ) + } + + try { + await userFollowManager.followUser(user.id, userId) + } catch (e) { + return ctx.json( + { + success: false, + message: "Failed to follow user, does the user exist?", + }, + 500 + ) + } + + return ctx.json( + { + success: true, + }, + 200 + ) +}) + +export default handler diff --git a/src/v2/routes/user/follows/follow/id/[id]/schema.ts b/src/v2/routes/user/follows/follow/id/[id]/schema.ts index e69de29..3bc0a4d 100644 --- a/src/v2/routes/user/follows/follow/id/[id]/schema.ts +++ b/src/v2/routes/user/follows/follow/id/[id]/schema.ts @@ -0,0 +1,16 @@ +import { z } from "@hono/zod-openapi" + +export const followUserByIdSchema = z.object({ + id: z.string().openapi({ + param: { + description: "The id of the user to follow.", + in: "path", + name: "id", + required: true, + }, + }), +}) + +export const followUserByIdResponseSchema = z.object({ + success: z.literal(true), +}) diff --git a/src/v2/routes/user/follows/handler.ts b/src/v2/routes/user/follows/handler.ts index e69de29..a1a9175 100644 --- a/src/v2/routes/user/follows/handler.ts +++ b/src/v2/routes/user/follows/handler.ts @@ -0,0 +1,10 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import UserFollowRoute from "@/v2/routes/user/follows/follow/id/[id]/route" +import UserUnfollowRoute from "@/v2/routes/user/follows/unfollow/id/[id]/route" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.route("/follow/id", UserFollowRoute) +handler.route("/unfollow/id", UserUnfollowRoute) + +export default handler diff --git a/src/v2/routes/user/follows/unfollow/id/[id]/openapi.ts b/src/v2/routes/user/follows/unfollow/id/[id]/openapi.ts index e69de29..33b6edb 100644 --- a/src/v2/routes/user/follows/unfollow/id/[id]/openapi.ts +++ b/src/v2/routes/user/follows/unfollow/id/[id]/openapi.ts @@ -0,0 +1,27 @@ +import { createRoute } from "@hono/zod-openapi" +import { + unfollowUserByIdResponseSchema, + unfollowUserByIdSchema, +} from "./schema" +import { GenericResponses } from "@/v2/lib/response-schemas" + +export const unFollowUserByIdRoute = createRoute({ + path: "/{id}", + method: "post", + description: "Follow a user from their ID.", + tags: ["User"], + request: { + params: unfollowUserByIdSchema, + }, + responses: { + 200: { + description: "True if the user was unfollowed.", + content: { + "application/json": { + schema: unfollowUserByIdResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) diff --git a/src/v2/routes/user/follows/unfollow/id/[id]/route.ts b/src/v2/routes/user/follows/unfollow/id/[id]/route.ts index e69de29..6f03b99 100644 --- a/src/v2/routes/user/follows/unfollow/id/[id]/route.ts +++ b/src/v2/routes/user/follows/unfollow/id/[id]/route.ts @@ -0,0 +1,74 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { unFollowUserByIdRoute } from "./openapi" +import { getConnection } from "@/v2/db/turso" +import { UserFollowManager } from "@/v2/lib/managers/user/user-follow-manager" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.openapi(unFollowUserByIdRoute, async (ctx) => { + const userId = ctx.req.valid("param").id + + const { drizzle } = await getConnection(ctx.env) + + const authSessionManager = new AuthSessionManager(ctx) + const { user } = await authSessionManager.validateSession() + + if (!user) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + if (userId == user.id) { + return ctx.json( + { + success: false, + message: "You cannot unfollow yourself", + }, + 400 + ) + } + + const userFollowManager = new UserFollowManager(drizzle) + + const followStatus = await userFollowManager.checkFollowStatus( + user.id, + userId + ) + + if (!followStatus) { + return ctx.json( + { + success: false, + message: "You are not following this user", + }, + 400 + ) + } + + try { + await userFollowManager.unfollowUser(user.id, userId) + } catch (e) { + return ctx.json( + { + success: false, + message: "Failed to unfollow user, does the user exist?", + }, + 500 + ) + } + + return ctx.json( + { + success: true, + }, + 200 + ) +}) + +export default handler diff --git a/src/v2/routes/user/follows/unfollow/id/[id]/schema.ts b/src/v2/routes/user/follows/unfollow/id/[id]/schema.ts index e69de29..8f5b7d1 100644 --- a/src/v2/routes/user/follows/unfollow/id/[id]/schema.ts +++ b/src/v2/routes/user/follows/unfollow/id/[id]/schema.ts @@ -0,0 +1,16 @@ +import { z } from "@hono/zod-openapi" + +export const unfollowUserByIdSchema = z.object({ + id: z.string().openapi({ + param: { + description: "The id of the user to unfollow.", + in: "path", + name: "id", + required: true, + }, + }), +}) + +export const unfollowUserByIdResponseSchema = z.object({ + success: z.literal(true), +}) diff --git a/src/v2/routes/user/handler.ts b/src/v2/routes/user/handler.ts index ac9167f..37ed459 100644 --- a/src/v2/routes/user/handler.ts +++ b/src/v2/routes/user/handler.ts @@ -1,10 +1,12 @@ import { OpenAPIHono } from "@hono/zod-openapi" import UserGetRoute from "@/v2/routes/user/get/handler" import UserSearchRoute from "@/v2/routes/user/search/handler" +import UserFollowRoute from "@/v2/routes/user/follows/handler" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.route("/get", UserGetRoute) handler.route("/search", UserSearchRoute) +handler.route("/follows", UserFollowRoute) export default handler From 70fcaf2ec32d3cf9ee7b8e376a9bfb234d913121 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Wed, 24 Jan 2024 03:22:48 +0000 Subject: [PATCH 241/318] view user follows/following --- .../lib/managers/user/user-follow-manager.ts | 100 +++++++++++++++--- .../user/follows/followers/id/[id]/openapi.ts | 30 ++++++ .../user/follows/followers/id/[id]/route.ts | 30 ++++++ .../user/follows/followers/id/[id]/schema.ts | 43 ++++++++ .../id/[id]/count}/openapi.ts | 0 .../[id] => following/id/[id]/count}/route.ts | 0 .../id/[id]/count}/schema.ts | 0 .../user/follows/following/id/[id]/openapi.ts | 30 ++++++ .../user/follows/following/id/[id]/route.ts | 30 ++++++ .../user/follows/following/id/[id]/schema.ts | 43 ++++++++ src/v2/routes/user/follows/handler.ts | 6 ++ 11 files changed, 299 insertions(+), 13 deletions(-) create mode 100644 src/v2/routes/user/follows/followers/id/[id]/openapi.ts create mode 100644 src/v2/routes/user/follows/followers/id/[id]/route.ts create mode 100644 src/v2/routes/user/follows/followers/id/[id]/schema.ts rename src/v2/routes/user/follows/{list/id/[id] => following/id/[id]/count}/openapi.ts (100%) rename src/v2/routes/user/follows/{list/id/[id] => following/id/[id]/count}/route.ts (100%) rename src/v2/routes/user/follows/{list/id/[id] => following/id/[id]/count}/schema.ts (100%) create mode 100644 src/v2/routes/user/follows/following/id/[id]/openapi.ts create mode 100644 src/v2/routes/user/follows/following/id/[id]/route.ts create mode 100644 src/v2/routes/user/follows/following/id/[id]/schema.ts diff --git a/src/v2/lib/managers/user/user-follow-manager.ts b/src/v2/lib/managers/user/user-follow-manager.ts index 4ba32e8..f5e8f83 100644 --- a/src/v2/lib/managers/user/user-follow-manager.ts +++ b/src/v2/lib/managers/user/user-follow-manager.ts @@ -1,5 +1,5 @@ import { DrizzleInstance } from "@/v2/db/turso" -import { and, eq } from "drizzle-orm" +import { and, eq, sql } from "drizzle-orm" import { userFollowing } from "@/v2/db/schema" import type { NewUserFollowing, UserFollowing } from "@/v2/db/schema" @@ -104,23 +104,97 @@ export class UserFollowManager { } } - /** - * Retrieves the followers of a user by their user ID. - * - * @param userId - The ID of the user for whom to retrieve followers. - * @returns An array of user networking objects representing followers. - */ - public async getFollowers(userId: string): Promise { + public async getUserFollowers(userId: string, offset: number = 0) { try { - const followers = await this.drizzle - .select() + return await this.drizzle.query.userFollowing.findMany({ + where: (userFollowing, { eq }) => + eq(userFollowing.followingId, userId), + with: { + follower: { + columns: { + id: true, + avatarUrl: true, + username: true, + isSupporter: true, + verified: true, + displayName: true, + }, + }, + }, + limit: 100, + offset: offset, + }) + } catch (e) { + console.error( + `Error getting followers for user ${userId} with offset ${offset}`, + e + ) + throw new Error( + `Error getting followers for user ${userId} with offset ${offset}` + ) + } + } + + public async getUserFollowersCount(userId: string) { + try { + return await this.drizzle + .select({ + value: sql`count(${userFollowing.followerId})`.mapWith( + Number + ), + }) .from(userFollowing) .where(eq(userFollowing.followingId, userId)) + } catch (e) { + console.error(`Error getting followers count for user ${userId}`, e) + throw new Error(`Error getting followers count for user ${userId}`) + } + } - return followers ?? null + public async getUserFollowingCount(userId: string) { + try { + return await this.drizzle + .select({ + value: sql`count(${userFollowing.followingId})`.mapWith( + Number + ), + }) + .from(userFollowing) + .where(eq(userFollowing.followerId, userId)) } catch (e) { - console.error(`Error getting followers for user ${userId}`, e) - throw new Error(`Error getting followers for user ${userId}`) + console.error(`Error getting following count for user ${userId}`, e) + throw new Error(`Error getting following count for user ${userId}`) + } + } + + public async getUserFollowing(userId: string, offset: number = 0) { + try { + return await this.drizzle.query.userFollowing.findMany({ + where: (userFollowing, { eq }) => + eq(userFollowing.followerId, userId), + with: { + following: { + columns: { + id: true, + avatarUrl: true, + username: true, + isSupporter: true, + verified: true, + displayName: true, + }, + }, + }, + limit: 100, + offset: offset, + }) + } catch (e) { + console.error( + `Error getting following for user ${userId} with offset ${offset}`, + e + ) + throw new Error( + `Error getting following for user ${userId} with offset ${offset}` + ) } } } diff --git a/src/v2/routes/user/follows/followers/id/[id]/openapi.ts b/src/v2/routes/user/follows/followers/id/[id]/openapi.ts new file mode 100644 index 0000000..211484b --- /dev/null +++ b/src/v2/routes/user/follows/followers/id/[id]/openapi.ts @@ -0,0 +1,30 @@ +import { createRoute } from "@hono/zod-openapi" +import { + viewUserFollowsbyIdSchema, + viewUserFollowsbyIdOffsetSchema, + viewUserFollowsbyIdResponseSchema, +} from "./schema" +import { GenericResponses } from "@/v2/lib/response-schemas" + +export const viewUserFollowsByIdRoute = createRoute({ + path: "/{id}", + method: "get", + description: "View a user's followers from their ID.", + tags: ["User"], + request: { + params: viewUserFollowsbyIdSchema, + query: viewUserFollowsbyIdOffsetSchema, + }, + responses: { + 200: { + description: + "List of a user's followers. Only 100 showed at a time, use pagination.", + content: { + "application/json": { + schema: viewUserFollowsbyIdResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) diff --git a/src/v2/routes/user/follows/followers/id/[id]/route.ts b/src/v2/routes/user/follows/followers/id/[id]/route.ts new file mode 100644 index 0000000..79b9eca --- /dev/null +++ b/src/v2/routes/user/follows/followers/id/[id]/route.ts @@ -0,0 +1,30 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { viewUserFollowsByIdRoute } from "./openapi" +import { getConnection } from "@/v2/db/turso" +import { UserFollowManager } from "@/v2/lib/managers/user/user-follow-manager" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.openapi(viewUserFollowsByIdRoute, async (ctx) => { + const { id } = ctx.req.valid("param") + const { offset } = ctx.req.valid("query") + + const { drizzle } = await getConnection(ctx.env) + + const userFollowManager = new UserFollowManager(drizzle) + + const followers = await userFollowManager.getUserFollowers( + id, + parseInt(offset) + ) + + return ctx.json( + { + success: true, + followers, + }, + 200 + ) +}) + +export default handler diff --git a/src/v2/routes/user/follows/followers/id/[id]/schema.ts b/src/v2/routes/user/follows/followers/id/[id]/schema.ts new file mode 100644 index 0000000..b78b511 --- /dev/null +++ b/src/v2/routes/user/follows/followers/id/[id]/schema.ts @@ -0,0 +1,43 @@ +import { z } from "@hono/zod-openapi" +import { selectUserFollowingSchema, selectUserSchema } from "@/v2/db/schema" + +export const viewUserFollowsbyIdSchema = z.object({ + id: z.string().openapi({ + param: { + description: "User ID to view who follows them", + in: "path", + name: "id", + required: true, + }, + }), +}) + +export const viewUserFollowsbyIdOffsetSchema = z.object({ + offset: z + .string() + .optional() + .openapi({ + param: { + description: "The offset to start at, optional.", + in: "query", + name: "offset", + required: false, + }, + }), +}) + +export const viewUserFollowsbyIdResponseSchema = z.object({ + success: z.literal(true), + followers: z.array( + selectUserFollowingSchema.extend({ + follower: selectUserSchema.pick({ + id: true, + avatarUrl: true, + username: true, + isSupporter: true, + verified: true, + displayName: true, + }), + }) + ), +}) diff --git a/src/v2/routes/user/follows/list/id/[id]/openapi.ts b/src/v2/routes/user/follows/following/id/[id]/count/openapi.ts similarity index 100% rename from src/v2/routes/user/follows/list/id/[id]/openapi.ts rename to src/v2/routes/user/follows/following/id/[id]/count/openapi.ts diff --git a/src/v2/routes/user/follows/list/id/[id]/route.ts b/src/v2/routes/user/follows/following/id/[id]/count/route.ts similarity index 100% rename from src/v2/routes/user/follows/list/id/[id]/route.ts rename to src/v2/routes/user/follows/following/id/[id]/count/route.ts diff --git a/src/v2/routes/user/follows/list/id/[id]/schema.ts b/src/v2/routes/user/follows/following/id/[id]/count/schema.ts similarity index 100% rename from src/v2/routes/user/follows/list/id/[id]/schema.ts rename to src/v2/routes/user/follows/following/id/[id]/count/schema.ts diff --git a/src/v2/routes/user/follows/following/id/[id]/openapi.ts b/src/v2/routes/user/follows/following/id/[id]/openapi.ts new file mode 100644 index 0000000..8f7ebf0 --- /dev/null +++ b/src/v2/routes/user/follows/following/id/[id]/openapi.ts @@ -0,0 +1,30 @@ +import { createRoute } from "@hono/zod-openapi" +import { + viewUserfollowingbyIdSchema, + viewUserfollowingbyIdResponseSchema, + viewUserFollowingOffsetSchema, +} from "./schema" +import { GenericResponses } from "@/v2/lib/response-schemas" + +export const viewUserfollowingbyIdRoute = createRoute({ + path: "/{id}", + method: "get", + description: "View who a user's following from their ID.", + tags: ["User"], + request: { + params: viewUserfollowingbyIdSchema, + query: viewUserFollowingOffsetSchema, + }, + responses: { + 200: { + description: + "List of who a user's following. Only 100 showed at a time, use pagination.", + content: { + "application/json": { + schema: viewUserfollowingbyIdResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) diff --git a/src/v2/routes/user/follows/following/id/[id]/route.ts b/src/v2/routes/user/follows/following/id/[id]/route.ts new file mode 100644 index 0000000..abf197d --- /dev/null +++ b/src/v2/routes/user/follows/following/id/[id]/route.ts @@ -0,0 +1,30 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { viewUserfollowingbyIdRoute } from "./openapi" +import { getConnection } from "@/v2/db/turso" +import { UserFollowManager } from "@/v2/lib/managers/user/user-follow-manager" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.openapi(viewUserfollowingbyIdRoute, async (ctx) => { + const { id } = ctx.req.valid("param") + const { offset } = ctx.req.valid("query") + + const { drizzle } = await getConnection(ctx.env) + + const userFollowManager = new UserFollowManager(drizzle) + + const following = await userFollowManager.getUserFollowing( + id, + parseInt(offset) + ) + + return ctx.json( + { + success: true, + following, + }, + 200 + ) +}) + +export default handler diff --git a/src/v2/routes/user/follows/following/id/[id]/schema.ts b/src/v2/routes/user/follows/following/id/[id]/schema.ts new file mode 100644 index 0000000..16af185 --- /dev/null +++ b/src/v2/routes/user/follows/following/id/[id]/schema.ts @@ -0,0 +1,43 @@ +import { z } from "@hono/zod-openapi" +import { selectUserFollowingSchema, selectUserSchema } from "@/v2/db/schema" + +export const viewUserfollowingbyIdSchema = z.object({ + id: z.string().openapi({ + param: { + description: "User ID to view who they're following", + in: "path", + name: "id", + required: true, + }, + }), +}) + +export const viewUserFollowingOffsetSchema = z.object({ + offset: z + .string() + .optional() + .openapi({ + param: { + description: "The offset to start at, optional.", + in: "query", + name: "offset", + required: false, + }, + }), +}) + +export const viewUserfollowingbyIdResponseSchema = z.object({ + success: z.literal(true), + following: z.array( + selectUserFollowingSchema.extend({ + following: selectUserSchema.pick({ + id: true, + avatarUrl: true, + username: true, + isSupporter: true, + verified: true, + displayName: true, + }), + }) + ), +}) diff --git a/src/v2/routes/user/follows/handler.ts b/src/v2/routes/user/follows/handler.ts index a1a9175..e490831 100644 --- a/src/v2/routes/user/follows/handler.ts +++ b/src/v2/routes/user/follows/handler.ts @@ -2,9 +2,15 @@ import { OpenAPIHono } from "@hono/zod-openapi" import UserFollowRoute from "@/v2/routes/user/follows/follow/id/[id]/route" import UserUnfollowRoute from "@/v2/routes/user/follows/unfollow/id/[id]/route" +import GetUsersFollowingRoute from "@/v2/routes/user/follows/following/id/[id]/route" +import GetUsersFollowersRoute from "@/v2/routes/user/follows/followers/id/[id]/route" + const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.route("/follow/id", UserFollowRoute) handler.route("/unfollow/id", UserUnfollowRoute) +handler.route("/following/id", GetUsersFollowingRoute) +handler.route("/followers/id", GetUsersFollowersRoute) + export default handler From 674bae3cf8b859aac7a5739481f59f0bb3afcce8 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Fri, 26 Jan 2024 20:49:02 +0000 Subject: [PATCH 242/318] remove assetIsOptimized in favour of transform --- src/scripts/seed/seed.ts | 5 ----- src/v2/db/schema/asset/asset.ts | 3 --- 2 files changed, 8 deletions(-) diff --git a/src/scripts/seed/seed.ts b/src/scripts/seed/seed.ts index 73aa0e2..734f0a6 100644 --- a/src/scripts/seed/seed.ts +++ b/src/scripts/seed/seed.ts @@ -224,7 +224,6 @@ async function main() { status: "approved", uploadedById: newUsers[0].id, uploadedByName: newUsers[0].username, - assetIsOptimized: true, viewCount: 1337, downloadCount: 1337, fileSize: 40213, @@ -257,7 +256,6 @@ async function main() { status: "approved", uploadedById: newUsers[1].id, uploadedByName: newUsers[1].username, - assetIsOptimized: true, viewCount: 1337, downloadCount: 1337, fileSize: 40213, @@ -274,7 +272,6 @@ async function main() { status: "approved", uploadedById: newUsers[1].id, uploadedByName: newUsers[1].username, - assetIsOptimized: true, viewCount: 1337, downloadCount: 1337, fileSize: 40213, @@ -291,7 +288,6 @@ async function main() { status: "approved", uploadedById: newUsers[2].id, uploadedByName: newUsers[2].username, - assetIsOptimized: true, viewCount: 1337, downloadCount: 1337, }, @@ -305,7 +301,6 @@ async function main() { status: "approved", uploadedById: newUsers[2].id, uploadedByName: newUsers[2].username, - assetIsOptimized: true, viewCount: 1337, downloadCount: 1337, }, diff --git a/src/v2/db/schema/asset/asset.ts b/src/v2/db/schema/asset/asset.ts index b6f4861..7164719 100644 --- a/src/v2/db/schema/asset/asset.ts +++ b/src/v2/db/schema/asset/asset.ts @@ -67,9 +67,6 @@ export const asset = sqliteTable( .$defaultFn(() => { return new Date().toISOString() }), - assetIsOptimized: integer("asset_is_optimized", { mode: "boolean" }) - .default(false) - .notNull(), assetIsSuggestive: integer("asset_is_suggestive", { mode: "boolean" }) .default(false) .notNull(), From ab889a1ac3138d146817e5766344cc899305b6a2 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 28 Jan 2024 02:24:51 +0000 Subject: [PATCH 243/318] update deps --- package.json | 24 +- pnpm-lock.yaml | 616 +++++++++++++++++++++++---------------------- src/v2/lib/oslo.ts | 2 +- 3 files changed, 331 insertions(+), 311 deletions(-) diff --git a/package.json b/package.json index 6cb556d..14c464f 100644 --- a/package.json +++ b/package.json @@ -21,31 +21,31 @@ "devDependencies": { "@asteasolutions/zod-to-openapi": "^6.3.1", "@cloudflare/workers-types": "^4.20240117.0", - "@types/node": "^20.11.5", - "dotenv": "^16.3.2", + "@types/node": "^20.11.8", + "dotenv": "^16.4.1", "drizzle-kit": "^0.20.13", "eslint": "^8.56.0", - "husky": "^8.0.3", + "husky": "^9.0.6", "openapi-generator": "link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator", "tsx": "^4.7.0", "typescript": "^5.3.3", - "wrangler": "3.23.0" + "wrangler": "3.25.0" }, "private": true, "dependencies": { "@axiomhq/js": "1.0.0-rc.1", "@hono/swagger-ui": "^0.2.1", - "@hono/zod-openapi": "^0.9.5", - "@libsql/client": "0.4.0-pre.7", - "@lucia-auth/adapter-sqlite": "3.0.0-beta.12", - "@scalar/hono-api-reference": "^0.3.23", - "@typescript-eslint/eslint-plugin": "^6.19.0", + "@hono/zod-openapi": "^0.9.6", + "@libsql/client": "0.4.0", + "@lucia-auth/adapter-sqlite": "3.0.0", + "@scalar/hono-api-reference": "^0.3.29", + "@typescript-eslint/eslint-plugin": "^6.19.1", "better-sqlite3": "^9.3.0", "drizzle-orm": "^0.29.3", "drizzle-zod": "^0.5.1", - "hono": "^3.12.6", - "lucia": "3.0.0-beta.14", - "oslo": "^0.27.1", + "hono": "^3.12.8", + "lucia": "3.0.0", + "oslo": "^1.0.2", "prettier": "^3.2.4", "zod": "^3.22.4" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e888893..d5609e8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,40 +10,40 @@ dependencies: version: 1.0.0-rc.1 "@hono/swagger-ui": specifier: ^0.2.1 - version: 0.2.1(hono@3.12.6) + version: 0.2.1(hono@3.12.8) "@hono/zod-openapi": - specifier: ^0.9.5 - version: 0.9.5(hono@3.12.6)(zod@3.22.4) + specifier: ^0.9.6 + version: 0.9.6(hono@3.12.8)(zod@3.22.4) "@libsql/client": - specifier: 0.4.0-pre.7 - version: 0.4.0-pre.7 + specifier: 0.4.0 + version: 0.4.0 "@lucia-auth/adapter-sqlite": - specifier: 3.0.0-beta.12 - version: 3.0.0-beta.12(@libsql/client@0.4.0-pre.7)(better-sqlite3@9.3.0)(lucia@3.0.0-beta.14) + specifier: 3.0.0 + version: 3.0.0(@libsql/client@0.4.0)(better-sqlite3@9.3.0)(lucia@3.0.0) "@scalar/hono-api-reference": - specifier: ^0.3.23 - version: 0.3.23(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(hono@3.12.6)(nanoid@5.0.4)(postcss@8.4.33)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15) + specifier: ^0.3.29 + version: 0.3.29(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(hono@3.12.8)(nanoid@5.0.4)(postcss@8.4.33)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15) "@typescript-eslint/eslint-plugin": - specifier: ^6.19.0 - version: 6.19.0(@typescript-eslint/parser@6.19.0)(eslint@8.56.0)(typescript@5.3.3) + specifier: ^6.19.1 + version: 6.19.1(@typescript-eslint/parser@6.19.1)(eslint@8.56.0)(typescript@5.3.3) better-sqlite3: specifier: ^9.3.0 version: 9.3.0 drizzle-orm: specifier: ^0.29.3 - version: 0.29.3(@cloudflare/workers-types@4.20240117.0)(@libsql/client@0.4.0-pre.7)(better-sqlite3@9.3.0) + version: 0.29.3(@cloudflare/workers-types@4.20240117.0)(@libsql/client@0.4.0)(better-sqlite3@9.3.0) drizzle-zod: specifier: ^0.5.1 version: 0.5.1(drizzle-orm@0.29.3)(zod@3.22.4) hono: - specifier: ^3.12.6 - version: 3.12.6 + specifier: ^3.12.8 + version: 3.12.8 lucia: - specifier: 3.0.0-beta.14 - version: 3.0.0-beta.14 + specifier: 3.0.0 + version: 3.0.0 oslo: - specifier: ^0.27.1 - version: 0.27.1 + specifier: ^1.0.2 + version: 1.0.2 prettier: specifier: ^3.2.4 version: 3.2.4 @@ -59,11 +59,11 @@ devDependencies: specifier: ^4.20240117.0 version: 4.20240117.0 "@types/node": - specifier: ^20.11.5 - version: 20.11.5 + specifier: ^20.11.8 + version: 20.11.8 dotenv: - specifier: ^16.3.2 - version: 16.3.2 + specifier: ^16.4.1 + version: 16.4.1 drizzle-kit: specifier: ^0.20.13 version: 0.20.13 @@ -71,8 +71,8 @@ devDependencies: specifier: ^8.56.0 version: 8.56.0 husky: - specifier: ^8.0.3 - version: 8.0.3 + specifier: ^9.0.6 + version: 9.0.6 openapi-generator: specifier: link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator version: link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator @@ -83,8 +83,8 @@ devDependencies: specifier: ^5.3.3 version: 5.3.3 wrangler: - specifier: 3.23.0 - version: 3.23.0 + specifier: 3.25.0 + version: 3.25.0 packages: /@aashutoshrathi/word-wrap@1.2.6: @@ -189,31 +189,31 @@ packages: engines: { node: ">=6.9.0" } dev: false - /@babel/parser@7.23.6: + /@babel/parser@7.23.9: resolution: { - integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==, + integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==, } engines: { node: ">=6.0.0" } hasBin: true dependencies: - "@babel/types": 7.23.6 + "@babel/types": 7.23.9 dev: false - /@babel/runtime@7.23.8: + /@babel/runtime@7.23.9: resolution: { - integrity: sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==, + integrity: sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==, } engines: { node: ">=6.9.0" } dependencies: regenerator-runtime: 0.14.1 dev: false - /@babel/types@7.23.6: + /@babel/types@7.23.9: resolution: { - integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==, + integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==, } engines: { node: ">=6.9.0" } dependencies: @@ -297,7 +297,7 @@ packages: integrity: sha512-HQU8lJhaJVh8gQXFtVA7lZwd0hK1ckIFjRuxOXkVN2Z9t7DtzNbA2YTwBry5thKNgF5EwjN4THjHg5NUZzj05A==, } - /@codemirror/autocomplete@6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1): + /@codemirror/autocomplete@6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1): resolution: { integrity: sha512-r4IjdYFthwbCQyvqnSlx0WBHRHi8nBvU+WjJxFUij81qsBfhNudf/XKKmmC2j3m0LaOYUQTf3qiEK1J8lO1sdg==, @@ -310,7 +310,7 @@ packages: dependencies: "@codemirror/language": 6.10.0 "@codemirror/state": 6.4.0 - "@codemirror/view": 6.23.0 + "@codemirror/view": 6.23.1 "@lezer/common": 1.2.1 dev: false @@ -322,17 +322,17 @@ packages: dependencies: "@codemirror/language": 6.10.0 "@codemirror/state": 6.4.0 - "@codemirror/view": 6.23.0 + "@codemirror/view": 6.23.1 "@lezer/common": 1.2.1 dev: false - /@codemirror/lang-css@6.2.1(@codemirror/view@6.23.0): + /@codemirror/lang-css@6.2.1(@codemirror/view@6.23.1): resolution: { integrity: sha512-/UNWDNV5Viwi/1lpr/dIXJNWiwDxpw13I4pTUAsNxZdg6E0mI2kTQb0P2iHczg1Tu+H4EBgJR+hYhKiHKko7qg==, } dependencies: - "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1) + "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) "@codemirror/language": 6.10.0 "@codemirror/state": 6.4.0 "@lezer/common": 1.2.1 @@ -341,18 +341,18 @@ packages: - "@codemirror/view" dev: false - /@codemirror/lang-html@6.4.7: + /@codemirror/lang-html@6.4.8: resolution: { - integrity: sha512-y9hWSSO41XlcL4uYwWyk0lEgTHcelWWfRuqmvcAmxfCs0HNWZdriWo/EU43S63SxEZpc1Hd50Itw7ktfQvfkUg==, + integrity: sha512-tE2YK7wDlb9ZpAH6mpTPiYm6rhfdQKVDa5r9IwIFlwwgvVaKsCfuKKZoJGWsmMZIf3FQAuJ5CHMPLymOtg1hXw==, } dependencies: - "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1) - "@codemirror/lang-css": 6.2.1(@codemirror/view@6.23.0) + "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) + "@codemirror/lang-css": 6.2.1(@codemirror/view@6.23.1) "@codemirror/lang-javascript": 6.2.1 "@codemirror/language": 6.10.0 "@codemirror/state": 6.4.0 - "@codemirror/view": 6.23.0 + "@codemirror/view": 6.23.1 "@lezer/common": 1.2.1 "@lezer/css": 1.1.7 "@lezer/html": 1.3.8 @@ -374,11 +374,11 @@ packages: integrity: sha512-jlFOXTejVyiQCW3EQwvKH0m99bUYIw40oPmFjSX2VS78yzfe0HELZ+NEo9Yfo1MkGRpGlj3Gnu4rdxV1EnAs5A==, } dependencies: - "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1) + "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) "@codemirror/language": 6.10.0 "@codemirror/lint": 6.4.2 "@codemirror/state": 6.4.0 - "@codemirror/view": 6.23.0 + "@codemirror/view": 6.23.1 "@lezer/common": 1.2.1 "@lezer/javascript": 1.4.13 dev: false @@ -393,13 +393,13 @@ packages: "@lezer/json": 1.0.2 dev: false - /@codemirror/lang-python@6.1.3(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1): + /@codemirror/lang-python@6.1.3(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1): resolution: { integrity: sha512-S9w2Jl74hFlD5nqtUMIaXAq9t5WlM0acCkyuQWUUSvZclk1sV+UfnpFiZzuZSG+hfEaOmxKR5UxY/Uxswn7EhQ==, } dependencies: - "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1) + "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) "@codemirror/language": 6.10.0 "@lezer/python": 1.1.11 transitivePeerDependencies: @@ -415,10 +415,10 @@ packages: } dependencies: "@codemirror/state": 6.4.0 - "@codemirror/view": 6.23.0 + "@codemirror/view": 6.23.1 "@lezer/common": 1.2.1 "@lezer/highlight": 1.2.0 - "@lezer/lr": 1.3.14 + "@lezer/lr": 1.4.0 style-mod: 4.1.0 dev: false @@ -438,7 +438,7 @@ packages: } dependencies: "@codemirror/state": 6.4.0 - "@codemirror/view": 6.23.0 + "@codemirror/view": 6.23.1 crelt: 1.0.6 dev: false @@ -449,7 +449,7 @@ packages: } dependencies: "@codemirror/state": 6.4.0 - "@codemirror/view": 6.23.0 + "@codemirror/view": 6.23.1 crelt: 1.0.6 dev: false @@ -460,10 +460,10 @@ packages: } dev: false - /@codemirror/view@6.23.0: + /@codemirror/view@6.23.1: resolution: { - integrity: sha512-/51px9N4uW8NpuWkyUX+iam5+PM6io2fm+QmRnzwqBy5v/pwGg9T0kILFtYeum8hjuvENtgsGNKluOfqIICmeQ==, + integrity: sha512-J2Xnn5lFYT1ZN/5ewEoMBCmLlL71lZ3mBdb7cUEuHhX2ESoSrNEucpsDXpX22EuTGm9LOgC9v4Z0wx+Ez8QmGA==, } dependencies: "@codemirror/state": 6.4.0 @@ -556,10 +556,10 @@ packages: rollup-plugin-node-polyfills: 0.2.1 dev: true - /@esbuild/aix-ppc64@0.19.11: + /@esbuild/aix-ppc64@0.19.12: resolution: { - integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==, + integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==, } engines: { node: ">=12" } cpu: [ppc64] @@ -592,10 +592,10 @@ packages: dev: true optional: true - /@esbuild/android-arm64@0.19.11: + /@esbuild/android-arm64@0.19.12: resolution: { - integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==, + integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==, } engines: { node: ">=12" } cpu: [arm64] @@ -628,10 +628,10 @@ packages: dev: true optional: true - /@esbuild/android-arm@0.19.11: + /@esbuild/android-arm@0.19.12: resolution: { - integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==, + integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==, } engines: { node: ">=12" } cpu: [arm] @@ -664,10 +664,10 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.19.11: + /@esbuild/android-x64@0.19.12: resolution: { - integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==, + integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==, } engines: { node: ">=12" } cpu: [x64] @@ -700,10 +700,10 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.19.11: + /@esbuild/darwin-arm64@0.19.12: resolution: { - integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==, + integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==, } engines: { node: ">=12" } cpu: [arm64] @@ -736,10 +736,10 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.19.11: + /@esbuild/darwin-x64@0.19.12: resolution: { - integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==, + integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==, } engines: { node: ">=12" } cpu: [x64] @@ -772,10 +772,10 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.19.11: + /@esbuild/freebsd-arm64@0.19.12: resolution: { - integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==, + integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==, } engines: { node: ">=12" } cpu: [arm64] @@ -808,10 +808,10 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.19.11: + /@esbuild/freebsd-x64@0.19.12: resolution: { - integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==, + integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==, } engines: { node: ">=12" } cpu: [x64] @@ -844,10 +844,10 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.19.11: + /@esbuild/linux-arm64@0.19.12: resolution: { - integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==, + integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==, } engines: { node: ">=12" } cpu: [arm64] @@ -880,10 +880,10 @@ packages: dev: true optional: true - /@esbuild/linux-arm@0.19.11: + /@esbuild/linux-arm@0.19.12: resolution: { - integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==, + integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==, } engines: { node: ">=12" } cpu: [arm] @@ -916,10 +916,10 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.19.11: + /@esbuild/linux-ia32@0.19.12: resolution: { - integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==, + integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==, } engines: { node: ">=12" } cpu: [ia32] @@ -952,10 +952,10 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.19.11: + /@esbuild/linux-loong64@0.19.12: resolution: { - integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==, + integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==, } engines: { node: ">=12" } cpu: [loong64] @@ -988,10 +988,10 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.19.11: + /@esbuild/linux-mips64el@0.19.12: resolution: { - integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==, + integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==, } engines: { node: ">=12" } cpu: [mips64el] @@ -1024,10 +1024,10 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.19.11: + /@esbuild/linux-ppc64@0.19.12: resolution: { - integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==, + integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==, } engines: { node: ">=12" } cpu: [ppc64] @@ -1060,10 +1060,10 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.19.11: + /@esbuild/linux-riscv64@0.19.12: resolution: { - integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==, + integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==, } engines: { node: ">=12" } cpu: [riscv64] @@ -1096,10 +1096,10 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.19.11: + /@esbuild/linux-s390x@0.19.12: resolution: { - integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==, + integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==, } engines: { node: ">=12" } cpu: [s390x] @@ -1132,10 +1132,10 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.19.11: + /@esbuild/linux-x64@0.19.12: resolution: { - integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==, + integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==, } engines: { node: ">=12" } cpu: [x64] @@ -1168,10 +1168,10 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.19.11: + /@esbuild/netbsd-x64@0.19.12: resolution: { - integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==, + integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==, } engines: { node: ">=12" } cpu: [x64] @@ -1204,10 +1204,10 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.19.11: + /@esbuild/openbsd-x64@0.19.12: resolution: { - integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==, + integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==, } engines: { node: ">=12" } cpu: [x64] @@ -1240,10 +1240,10 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.19.11: + /@esbuild/sunos-x64@0.19.12: resolution: { - integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==, + integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==, } engines: { node: ">=12" } cpu: [x64] @@ -1276,10 +1276,10 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.19.11: + /@esbuild/win32-arm64@0.19.12: resolution: { - integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==, + integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==, } engines: { node: ">=12" } cpu: [arm64] @@ -1312,10 +1312,10 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.19.11: + /@esbuild/win32-ia32@0.19.12: resolution: { - integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==, + integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==, } engines: { node: ">=12" } cpu: [ia32] @@ -1348,10 +1348,10 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.19.11: + /@esbuild/win32-x64@0.19.12: resolution: { - integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==, + integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==, } engines: { node: ">=12" } cpu: [x64] @@ -1413,22 +1413,22 @@ packages: engines: { node: ">=14" } dev: true - /@floating-ui/core@1.5.3: + /@floating-ui/core@1.6.0: resolution: { - integrity: sha512-O0WKDOo0yhJuugCx6trZQj5jVJ9yR0ystG2JaNAemYUWce+pmM6WUEFIibnWyEJKdrDxhm75NoSRME35FNaM/Q==, + integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==, } dependencies: "@floating-ui/utils": 0.2.1 dev: false - /@floating-ui/dom@1.5.4: + /@floating-ui/dom@1.6.0: resolution: { - integrity: sha512-jByEsHIY+eEdCjnTVu+E3ephzTOzkQ8hgUfGwos+bg7NlH33Zc5uO+QHz1mrQUOgIKKDD1RtS201P9NvAfq3XQ==, + integrity: sha512-SZ0BEXzsaaS6THZfZJUcAobbZTD+MvfGM42bxgeg0Tnkp4/an/avqwAXiVLsFtIBZtfsx3Ymvwx0+KnnhdA/9g==, } dependencies: - "@floating-ui/core": 1.5.3 + "@floating-ui/core": 1.6.0 "@floating-ui/utils": 0.2.1 dev: false @@ -1439,13 +1439,13 @@ packages: } dev: false - /@floating-ui/vue@1.0.4(vue@3.4.15): + /@floating-ui/vue@1.0.5(vue@3.4.15): resolution: { - integrity: sha512-doHP79KFEmb41MCNR25NS8aGPR/TGBi0qIJgHmz4lIO7Nr0G9OImYnrT00obns1g3VXgG14ogVQoQDtPsfnXUQ==, + integrity: sha512-rXYI0JHLnAw5nTGNKTmH9tMxFWmZPEfkyexXzG/HchGsoL4f8lE7+bX43pVRXRBbmCWg0/j4d62Ui7acZBmUew==, } dependencies: - "@floating-ui/dom": 1.5.4 + "@floating-ui/dom": 1.6.0 "@floating-ui/utils": 0.2.1 vue-demi: 0.14.6(vue@3.4.15) transitivePeerDependencies: @@ -1466,7 +1466,7 @@ packages: vue: 3.4.15(typescript@5.3.3) dev: false - /@hono/swagger-ui@0.2.1(hono@3.12.6): + /@hono/swagger-ui@0.2.1(hono@3.12.8): resolution: { integrity: sha512-wBxVMRe3/v8xH4o6icmwztiIq0DG0s7+jHVMHVUAoFFCWEQNL2iskMmQtrhSDtsFmBZUeUFQUaaJ6Ir6DOmHLA==, @@ -1474,13 +1474,13 @@ packages: peerDependencies: hono: "*" dependencies: - hono: 3.12.6 + hono: 3.12.8 dev: false - /@hono/zod-openapi@0.9.5(hono@3.12.6)(zod@3.22.4): + /@hono/zod-openapi@0.9.6(hono@3.12.8)(zod@3.22.4): resolution: { - integrity: sha512-Px8QEIr5RyDeHQn51Ihnwtl//foFvd/F6yBq6o/3pVMUpoV6X4JZ+srgUrOX2VRrInpLVEP/NaroXlfvarwIxA==, + integrity: sha512-MLF8xpd4fEwbEaylFqAt1qci4wOTXu3oq3BKb01trccapYfodP50VCO0YDNBQTyMT/Iapq6GMO4+RAIFBgG5WQ==, } engines: { node: ">=16.0.0" } peerDependencies: @@ -1488,12 +1488,12 @@ packages: zod: 3.* dependencies: "@asteasolutions/zod-to-openapi": 5.5.0(zod@3.22.4) - "@hono/zod-validator": 0.1.11(hono@3.12.6)(zod@3.22.4) - hono: 3.12.6 + "@hono/zod-validator": 0.1.11(hono@3.12.8)(zod@3.22.4) + hono: 3.12.8 zod: 3.22.4 dev: false - /@hono/zod-validator@0.1.11(hono@3.12.6)(zod@3.22.4): + /@hono/zod-validator@0.1.11(hono@3.12.8)(zod@3.22.4): resolution: { integrity: sha512-PQXeHUP0+36qpRt8yfeD7N2jbK3ETlGvSN6dMof/HwUC/APRokQRjpXZm4rrlG71Ft0aWE01+Bm4XejqPie5Uw==, @@ -1502,7 +1502,7 @@ packages: hono: ">=3.9.0" zod: ^3.19.1 dependencies: - hono: 3.12.6 + hono: 3.12.8 zod: 3.22.4 dev: false @@ -1578,7 +1578,7 @@ packages: dependencies: "@lezer/common": 1.2.1 "@lezer/highlight": 1.2.0 - "@lezer/lr": 1.3.14 + "@lezer/lr": 1.4.0 dev: false /@lezer/highlight@1.2.0: @@ -1598,7 +1598,7 @@ packages: dependencies: "@lezer/common": 1.2.1 "@lezer/highlight": 1.2.0 - "@lezer/lr": 1.3.14 + "@lezer/lr": 1.4.0 dev: false /@lezer/java@1.1.1: @@ -1609,7 +1609,7 @@ packages: dependencies: "@lezer/common": 1.2.1 "@lezer/highlight": 1.2.0 - "@lezer/lr": 1.3.14 + "@lezer/lr": 1.4.0 dev: false /@lezer/javascript@1.4.13: @@ -1620,7 +1620,7 @@ packages: dependencies: "@lezer/common": 1.2.1 "@lezer/highlight": 1.2.0 - "@lezer/lr": 1.3.14 + "@lezer/lr": 1.4.0 dev: false /@lezer/json@1.0.2: @@ -1631,13 +1631,13 @@ packages: dependencies: "@lezer/common": 1.2.1 "@lezer/highlight": 1.2.0 - "@lezer/lr": 1.3.14 + "@lezer/lr": 1.4.0 dev: false - /@lezer/lr@1.3.14: + /@lezer/lr@1.4.0: resolution: { - integrity: sha512-z5mY4LStlA3yL7aHT/rqgG614cfcvklS+8oFRFBYrs4YaWLJyKKM4+nN6KopToX0o9Hj6zmH6M5kinOYuy06ug==, + integrity: sha512-Wst46p51km8gH0ZUmeNrtpRYmdlRHUpN1DQd3GFAyKANi8WVz8c2jHYTf1CVScFaCjQw1iO3ZZdqGDxQPRErTg==, } dependencies: "@lezer/common": 1.2.1 @@ -1651,28 +1651,38 @@ packages: dependencies: "@lezer/common": 1.2.1 "@lezer/highlight": 1.2.0 - "@lezer/lr": 1.3.14 + "@lezer/lr": 1.4.0 dev: false - /@libsql/client@0.4.0-pre.7: + /@libsql/client@0.4.0: resolution: { - integrity: sha512-zqr+aHFXwpmI9Wyl3vjlRdYW8G7mHSKrSL8Qn6p50M0aBeOfgHCP2dCn/eS9RR4b4vcayASnJmPvkzaKKE3tXg==, + integrity: sha512-GjBHHxRMKomG2rLx6K8BYsDhk9jNcKXpkEOO7luPTCje4z41ogD0sCaBRcGbJw9h3HMVysCW5v70WmjQ4/FWpg==, } dependencies: - "@libsql/hrana-client": 0.5.5 + "@libsql/core": 0.4.0 + "@libsql/hrana-client": 0.5.6 js-base64: 3.7.6 - libsql: 0.2.0-pre.7 + libsql: 0.2.0 transitivePeerDependencies: - bufferutil - encoding - utf-8-validate dev: false - /@libsql/darwin-arm64@0.2.0-pre.7: + /@libsql/core@0.4.0: resolution: { - integrity: sha512-rtNYnXF0W3kKwZ5MxrhjzE8uWq2YI20zIeKLDFX8JzT6zfgR3qym9AUrDV8tPYGr4bF/mgdH/CZxr49zddy4ig==, + integrity: sha512-pQHyZI0aTBlBm08dpB+/SEqLDe5wlgiUY+VNXbCD8yZhXo30AGinyrDlKrtGW7luo0As4Y9v1befurJdLKbC0Q==, + } + dependencies: + js-base64: 3.7.6 + dev: false + + /@libsql/darwin-arm64@0.2.0: + resolution: + { + integrity: sha512-+qyT2W/n5CFH1YZWv2mxW4Fsoo4dX9Z9M/nvbQqZ7H84J8hVegvVAsIGYzcK8xAeMEcpU5yGKB1Y9NoDY4hOSQ==, } cpu: [arm64] os: [darwin] @@ -1680,10 +1690,10 @@ packages: dev: false optional: true - /@libsql/darwin-x64@0.2.0-pre.7: + /@libsql/darwin-x64@0.2.0: resolution: { - integrity: sha512-14cb9xJCHwOIl71TPpzeZhKZ4pvwEeRTkP2XmmMBvkNaDPK27lE4ibMATL+IZ/JL0S7aQNcBLwTpwu2Zt0IMuQ==, + integrity: sha512-hwmO2mF1n8oDHKFrUju6Jv+n9iFtTf5JUK+xlnIE3Td0ZwGC/O1R/Z/btZTd9nD+vsvakC8SJT7/Q6YlWIkhEw==, } cpu: [x64] os: [darwin] @@ -1691,13 +1701,13 @@ packages: dev: false optional: true - /@libsql/hrana-client@0.5.5: + /@libsql/hrana-client@0.5.6: resolution: { - integrity: sha512-i+hDBpiV719poqEiHupUUZYKJ9YSbCRFe5Q2PQ0v3mHIftePH6gayLjp2u6TXbqbO/Dv6y8yyvYlBXf/kFfRZA==, + integrity: sha512-mjQoAmejZ1atG+M3YR2ZW+rg6ceBByH/S/h17ZoYZkqbWrvohFhXyz2LFxj++ARMoY9m6w3RJJIRdJdmnEUlFg==, } dependencies: - "@libsql/isomorphic-fetch": 0.1.10 + "@libsql/isomorphic-fetch": 0.1.12 "@libsql/isomorphic-ws": 0.1.5 js-base64: 3.7.6 node-fetch: 3.3.2 @@ -1707,10 +1717,10 @@ packages: - utf-8-validate dev: false - /@libsql/isomorphic-fetch@0.1.10: + /@libsql/isomorphic-fetch@0.1.12: resolution: { - integrity: sha512-dH0lMk50gKSvEKD78xWMu60SY1sjp1sY//iFLO0XMmBwfVfG136P9KOk06R4maBdlb8KMXOzJ1D28FR5ZKnHTA==, + integrity: sha512-MRo4UcmjAGAa3ac56LoD5OE13m2p0lu0VEtZC2NZMcogM/jc5fU9YtMQ3qbPjFJ+u2BBjFZgMPkQaLS1dlMhpg==, } dependencies: "@types/node-fetch": 2.6.11 @@ -1732,10 +1742,10 @@ packages: - utf-8-validate dev: false - /@libsql/linux-arm64-gnu@0.2.0-pre.7: + /@libsql/linux-arm64-gnu@0.2.0: resolution: { - integrity: sha512-fiygBotFaYmWnK0or0yEQQQ+3V2m886aaIXDuYtSMpoeykbY3JuRu/CSvriI6/ovnufoMoERo82YZUBR6EDPKA==, + integrity: sha512-1w2lPXIYtnBaK5t/Ej5E8x7lPiE+jP3KATI/W4yei5Z/ONJh7jQW5PJ7sYU95vTME3hWEM1FXN6kvzcpFAte7w==, } cpu: [arm64] os: [linux] @@ -1743,10 +1753,10 @@ packages: dev: false optional: true - /@libsql/linux-arm64-musl@0.2.0-pre.7: + /@libsql/linux-arm64-musl@0.2.0: resolution: { - integrity: sha512-5m2OnItWBwyhGiB4kpOvGaOGwHemEY5cz/dc0gK/L6OjEP1lTPZwhXongp3EtI/cApGpHyLctkSWkgM+y2zp9w==, + integrity: sha512-lkblBEJ7xuNiWNjP8DDq0rqoWccszfkUS7Efh5EjJ+GDWdCBVfh08mPofIZg0fZVLWQCY3j+VZCG1qZfATBizg==, } cpu: [arm64] os: [linux] @@ -1754,10 +1764,10 @@ packages: dev: false optional: true - /@libsql/linux-x64-gnu@0.2.0-pre.7: + /@libsql/linux-x64-gnu@0.2.0: resolution: { - integrity: sha512-i72WtvZqsuoM5rnMslS2LGsOo3zvlH0nc5gAwUz45UnsXQBSiLP7ELktVW0n8soMaeQE47ayT6jsB61CMC0KSA==, + integrity: sha512-+x/d289KeJydwOhhqSxKT+6MSQTCfLltzOpTzPccsvdt5fxg8CBi+gfvEJ4/XW23Sa+9bc7zodFP0i6MOlxX7w==, } cpu: [x64] os: [linux] @@ -1765,10 +1775,10 @@ packages: dev: false optional: true - /@libsql/linux-x64-musl@0.2.0-pre.7: + /@libsql/linux-x64-musl@0.2.0: resolution: { - integrity: sha512-9QO7xg6mExrQVQES9gW1OsExsUEJ6cBRdmt6nYfeDGShh/eoV3kiPSUeMXckNNbl77F5+m86WZqIDpi2UskgDw==, + integrity: sha512-5Xn0c5A6vKf9D1ASpgk7mef//FuY7t5Lktj/eiU4n3ryxG+6WTpqstTittJUgepVjcleLPYxIhQAYeYwTYH1IQ==, } cpu: [x64] os: [linux] @@ -1776,10 +1786,10 @@ packages: dev: false optional: true - /@libsql/win32-x64-msvc@0.2.0-pre.7: + /@libsql/win32-x64-msvc@0.2.0: resolution: { - integrity: sha512-vNKWGHIws3qoqMV4hX0kRt54IiFaA0FuSzQnclqlygGTXetHragnuimZANIOYVWagU35wk5s23+Ir/eO158+Sg==, + integrity: sha512-rpK+trBIpRST15m3cMYg5aPaX7kvCIottxY7jZPINkKAaScvfbn9yulU/iZUM9YtuK96Y1ZmvwyVIK/Y5DzoMQ==, } cpu: [x64] os: [win32] @@ -1787,24 +1797,24 @@ packages: dev: false optional: true - /@lucia-auth/adapter-sqlite@3.0.0-beta.12(@libsql/client@0.4.0-pre.7)(better-sqlite3@9.3.0)(lucia@3.0.0-beta.14): + /@lucia-auth/adapter-sqlite@3.0.0(@libsql/client@0.4.0)(better-sqlite3@9.3.0)(lucia@3.0.0): resolution: { - integrity: sha512-DZpBsdOjxwibUohQK+2EDr/Lwl5IJTs4yUCUoDqXziniwHOuJSsOezpv5FsI9Y9bOwWWUP5wLyzV502CCsy1Mw==, + integrity: sha512-7XMfMMNziFOoqIq2u9W5Z+wo7G7lzNQfUh7wDlkIqKxJMSLtP6GKH+QpK+21X4ZY9dIDmiuiwqZmS3Q3CgpATw==, } peerDependencies: "@libsql/client": ^0.3.0 better-sqlite3: 8.x - 9.x - lucia: 3.0.0-beta.14 + lucia: 3.x peerDependenciesMeta: "@libsql/client": optional: true better-sqlite3: optional: true dependencies: - "@libsql/client": 0.4.0-pre.7 + "@libsql/client": 0.4.0 better-sqlite3: 9.3.0 - lucia: 3.0.0-beta.14 + lucia: 3.0.0 dev: false /@napi-rs/wasm-runtime@0.1.1: @@ -2236,12 +2246,12 @@ packages: engines: { node: ">= 8" } dependencies: "@nodelib/fs.scandir": 2.1.5 - fastq: 1.16.0 + fastq: 1.17.0 - /@scalar/api-client@0.9.2(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15): + /@scalar/api-client@0.9.3(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15): resolution: { - integrity: sha512-yr13wcmHkyZsL264G5EMtRd7TDsF9sKTc+YA+gZndva2d0Fc0boYfWlpE6/QjJqd8gM9toysJh92zSPUlxTZTw==, + integrity: sha512-mfTlCAy2cA2kMoDIZWC6PEW7NdCIHJ7DxKcc+YqRdmM1wJHFRQ8RqPB7kqHSaoRFMk0atJtQnzgjdIU63T9fZQ==, } engines: { node: ">=18" } peerDependencies: @@ -2249,11 +2259,11 @@ packages: dependencies: "@headlessui/vue": 1.7.17(vue@3.4.15) "@scalar/themes": 0.5.4(vue@3.4.15) - "@scalar/use-codemirror": 0.7.19(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15) - "@scalar/use-keyboard-event": 0.5.7(vue@3.4.15) + "@scalar/use-codemirror": 0.7.19(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15) + "@scalar/use-keyboard-event": 0.5.8(vue@3.4.15) "@scalar/use-modal": 0.2.3(@headlessui/vue@1.7.17)(vue@3.4.15) "@vueuse/core": 10.7.2(vue@3.4.15) - axios: 1.6.5 + axios: 1.6.7 content-type: 1.0.5 javascript-time-ago: 2.5.9 nanoid: 5.0.4 @@ -2279,27 +2289,27 @@ packages: - debug dev: false - /@scalar/api-reference@1.13.12(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(nanoid@5.0.4)(postcss@8.4.33)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15): + /@scalar/api-reference@1.13.18(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(nanoid@5.0.4)(postcss@8.4.33)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15): resolution: { - integrity: sha512-oUD9iVMqIR+SFmMPjDXoAlzqouRsV3dT8nnriQz1lMteI6deSv2/b0STJhmoBO9Sddw4JUtjufNcEmTCT1UO1Q==, + integrity: sha512-K9p/cxH1mwwyiQf5q38Y+lBofxesleUsMJBT/ZxAHLaiO+1urXDnaEeyIAonXoEaprltvfhICWLvG8W+J6CmyA==, } engines: { node: ">=18" } peerDependencies: unified: ^11.0.0 vue: ^3.3.0 dependencies: - "@floating-ui/vue": 1.0.4(vue@3.4.15) + "@floating-ui/vue": 1.0.5(vue@3.4.15) "@headlessui/vue": 1.7.17(vue@3.4.15) - "@scalar/api-client": 0.9.2(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15) + "@scalar/api-client": 0.9.3(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15) "@scalar/components": 0.2.2(typescript@5.3.3) "@scalar/snippetz": 0.1.5 - "@scalar/swagger-editor": 0.9.8(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/view@6.23.0)(@headlessui/vue@1.7.17)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15) + "@scalar/swagger-editor": 0.9.8(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/view@6.23.1)(@headlessui/vue@1.7.17)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15) "@scalar/swagger-parser": 0.5.15(openapi-types@12.1.3) "@scalar/themes": 0.5.4(vue@3.4.15) "@scalar/use-clipboard": 0.5.13(@scalar/use-toasts@0.5.13)(nanoid@5.0.4) - "@scalar/use-codemirror": 0.7.19(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15) - "@scalar/use-keyboard-event": 0.5.7(vue@3.4.15) + "@scalar/use-codemirror": 0.7.19(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15) + "@scalar/use-keyboard-event": 0.5.8(vue@3.4.15) "@scalar/use-modal": 0.2.3(@headlessui/vue@1.7.17)(vue@3.4.15) "@scalar/use-toasts": 0.5.13(nanoid@5.0.4)(vue@3.4.15) "@scalar/use-tooltip": 0.5.8(vue@3.4.15) @@ -2307,7 +2317,7 @@ packages: "@vcarl/remark-headings": 0.1.0 "@vueuse/core": 10.7.2(vue@3.4.15) "@xmldom/xmldom": 0.8.10 - axios: 1.6.5 + axios: 1.6.7 fuse.js: 6.6.2 github-slugger: 2.0.0 httpsnippet-lite: 3.0.5 @@ -2363,24 +2373,24 @@ packages: class-variance-authority: 0.7.0 cva: 1.0.0-beta.1(typescript@5.3.3) nanoid: 5.0.4 - tailwind-merge: 2.2.0 + tailwind-merge: 2.2.1 vue: 3.4.15(typescript@5.3.3) transitivePeerDependencies: - "@vue/composition-api" - typescript dev: false - /@scalar/hono-api-reference@0.3.23(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(hono@3.12.6)(nanoid@5.0.4)(postcss@8.4.33)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15): + /@scalar/hono-api-reference@0.3.29(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(hono@3.12.8)(nanoid@5.0.4)(postcss@8.4.33)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15): resolution: { - integrity: sha512-HxoNEyaotK0oM5g1us7U+HqlhRfcW7+bypAbOUcXbj3Uuh5cQNVpq0wZaBTJWKDJLxl9YKrLorWw8Va47AolRQ==, + integrity: sha512-JKGwToiBBaLr2kuxPzoP+rDbceT2ILDBKACTK1c/LTvnLKJL/CcB6BiRfRjAKuVoIecPC7nVFoka/GXQkbUd7Q==, } engines: { node: ">=18" } peerDependencies: hono: ^3.0.0 dependencies: - "@scalar/api-reference": 1.13.12(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(nanoid@5.0.4)(postcss@8.4.33)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15) - hono: 3.12.6 + "@scalar/api-reference": 1.13.18(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(nanoid@5.0.4)(postcss@8.4.33)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15) + hono: 3.12.8 transitivePeerDependencies: - "@codemirror/lang-html" - "@codemirror/lang-java" @@ -2454,7 +2464,7 @@ packages: "@scalar/snippetz-plugin-node-undici": 0.1.5 dev: false - /@scalar/swagger-editor@0.9.8(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/view@6.23.0)(@headlessui/vue@1.7.17)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15): + /@scalar/swagger-editor@0.9.8(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/view@6.23.1)(@headlessui/vue@1.7.17)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15): resolution: { integrity: sha512-VxhbqaZVwEy7Od29Kxbg6a/6AM7md/ugcD2pNCw2wUv1PcV/ru+9imJkfClI3HfUXZN/IyLDaZpaNZadCB4Rrw==, @@ -2467,7 +2477,7 @@ packages: "@codemirror/state": 6.4.0 "@scalar/components": 0.2.2(typescript@5.3.3) "@scalar/themes": 0.5.4(vue@3.4.15) - "@scalar/use-codemirror": 0.7.19(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15) + "@scalar/use-codemirror": 0.7.19(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15) "@scalar/use-modal": 0.2.3(@headlessui/vue@1.7.17)(vue@3.4.15) "@vueuse/core": 10.7.2(vue@3.4.15) nanoid: 5.0.4 @@ -2541,7 +2551,7 @@ packages: nanoid: 5.0.4 dev: false - /@scalar/use-codemirror@0.7.19(@codemirror/lang-html@6.4.7)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.3.14)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15): + /@scalar/use-codemirror@0.7.19(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15): resolution: { integrity: sha512-xS6/JsVeQ983K6B/6RJMfmgl5GNst7zPbspSPxKwRCbwV5qBZaVWMhop6HQ5mnmanJTXxeh6krRG3K8tFbsuyg==, @@ -2564,27 +2574,27 @@ packages: codemirror: ^6.0.0 vue: ^3.3.0 dependencies: - "@codemirror/lang-html": 6.4.7 + "@codemirror/lang-html": 6.4.8 "@codemirror/lang-java": 6.0.1 "@codemirror/lang-javascript": 6.2.1 "@codemirror/lang-json": 6.0.1 - "@codemirror/lang-python": 6.1.3(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1) + "@codemirror/lang-python": 6.1.3(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) "@codemirror/language": 6.10.0 "@codemirror/legacy-modes": 6.3.3 "@codemirror/state": 6.4.0 - "@codemirror/view": 6.23.0 + "@codemirror/view": 6.23.1 "@lezer/common": 1.2.1 "@lezer/highlight": 1.2.0 - "@lezer/lr": 1.3.14 - "@uiw/codemirror-themes": 4.21.21(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0) + "@lezer/lr": 1.4.0 + "@uiw/codemirror-themes": 4.21.21(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1) codemirror: 6.0.1(@lezer/common@1.2.1) vue: 3.4.15(typescript@5.3.3) dev: false - /@scalar/use-keyboard-event@0.5.7(vue@3.4.15): + /@scalar/use-keyboard-event@0.5.8(vue@3.4.15): resolution: { - integrity: sha512-LSwxYVIQF0BjFVFt1cIkzz5W/9m3cLrlBgR3Qxf7YkRo1DBShcXSqgrxPMP1wvjXxQoETbzcZVgo2BYkx5R5jQ==, + integrity: sha512-LcqgZOZWOKIDCftfR4+qOXEtbvXtTtHSObRF2egpctsXgGHlyKY5KjPOoffbvwdh21rLa5ITBy+emwAm2i6Xww==, } engines: { node: ">=18" } peerDependencies: @@ -2735,7 +2745,7 @@ packages: integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==, } dependencies: - "@types/node": 20.11.5 + "@types/node": 20.11.8 form-data: 4.0.0 dev: false @@ -2745,13 +2755,13 @@ packages: integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==, } dependencies: - "@types/node": 20.11.5 + "@types/node": 20.11.8 dev: true - /@types/node@20.11.5: + /@types/node@20.11.8: resolution: { - integrity: sha512-g557vgQjUUfN76MZAN/dt1z3dzcUsimuysco0KeluHgrPdJXkP/XdAURgyO2W9fZWHRtRBiVKzKn8vyOAwlG+w==, + integrity: sha512-i7omyekpPTNdv4Jb/Rgqg0RU8YqLcNsI12quKSDkRXNfx7Wxdm6HhK1awT3xTgEkgxPn3bvnSpiEAc7a7Lpyow==, } dependencies: undici-types: 5.26.5 @@ -2790,13 +2800,13 @@ packages: integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==, } dependencies: - "@types/node": 20.11.5 + "@types/node": 20.11.8 dev: false - /@typescript-eslint/eslint-plugin@6.19.0(@typescript-eslint/parser@6.19.0)(eslint@8.56.0)(typescript@5.3.3): + /@typescript-eslint/eslint-plugin@6.19.1(@typescript-eslint/parser@6.19.1)(eslint@8.56.0)(typescript@5.3.3): resolution: { - integrity: sha512-DUCUkQNklCQYnrBSSikjVChdc84/vMPDQSgJTHBZ64G9bA9w0Crc0rd2diujKbTdp6w2J47qkeHQLoi0rpLCdg==, + integrity: sha512-roQScUGFruWod9CEyoV5KlCYrubC/fvG8/1zXuT0WTcxX87GnMMmnksMwSg99lo1xiKrBzw2icsJPMAw1OtKxg==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -2808,11 +2818,11 @@ packages: optional: true dependencies: "@eslint-community/regexpp": 4.10.0 - "@typescript-eslint/parser": 6.19.0(eslint@8.56.0)(typescript@5.3.3) - "@typescript-eslint/scope-manager": 6.19.0 - "@typescript-eslint/type-utils": 6.19.0(eslint@8.56.0)(typescript@5.3.3) - "@typescript-eslint/utils": 6.19.0(eslint@8.56.0)(typescript@5.3.3) - "@typescript-eslint/visitor-keys": 6.19.0 + "@typescript-eslint/parser": 6.19.1(eslint@8.56.0)(typescript@5.3.3) + "@typescript-eslint/scope-manager": 6.19.1 + "@typescript-eslint/type-utils": 6.19.1(eslint@8.56.0)(typescript@5.3.3) + "@typescript-eslint/utils": 6.19.1(eslint@8.56.0)(typescript@5.3.3) + "@typescript-eslint/visitor-keys": 6.19.1 debug: 4.3.4 eslint: 8.56.0 graphemer: 1.4.0 @@ -2825,10 +2835,10 @@ packages: - supports-color dev: false - /@typescript-eslint/parser@6.19.0(eslint@8.56.0)(typescript@5.3.3): + /@typescript-eslint/parser@6.19.1(eslint@8.56.0)(typescript@5.3.3): resolution: { - integrity: sha512-1DyBLG5SH7PYCd00QlroiW60YJ4rWMuUGa/JBV0iZuqi4l4IK3twKPq5ZkEebmGqRjXWVgsUzfd3+nZveewgow==, + integrity: sha512-WEfX22ziAh6pRE9jnbkkLGp/4RhTpffr2ZK5bJ18M8mIfA8A+k97U9ZyaXCEJRlmMHh7R9MJZWXp/r73DzINVQ==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -2838,10 +2848,10 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/scope-manager": 6.19.0 - "@typescript-eslint/types": 6.19.0 - "@typescript-eslint/typescript-estree": 6.19.0(typescript@5.3.3) - "@typescript-eslint/visitor-keys": 6.19.0 + "@typescript-eslint/scope-manager": 6.19.1 + "@typescript-eslint/types": 6.19.1 + "@typescript-eslint/typescript-estree": 6.19.1(typescript@5.3.3) + "@typescript-eslint/visitor-keys": 6.19.1 debug: 4.3.4 eslint: 8.56.0 typescript: 5.3.3 @@ -2849,21 +2859,21 @@ packages: - supports-color dev: false - /@typescript-eslint/scope-manager@6.19.0: + /@typescript-eslint/scope-manager@6.19.1: resolution: { - integrity: sha512-dO1XMhV2ehBI6QN8Ufi7I10wmUovmLU0Oru3n5LVlM2JuzB4M+dVphCPLkVpKvGij2j/pHBWuJ9piuXx+BhzxQ==, + integrity: sha512-4CdXYjKf6/6aKNMSly/BP4iCSOpvMmqtDzRtqFyyAae3z5kkqEjKndR5vDHL8rSuMIIWP8u4Mw4VxLyxZW6D5w==, } engines: { node: ^16.0.0 || >=18.0.0 } dependencies: - "@typescript-eslint/types": 6.19.0 - "@typescript-eslint/visitor-keys": 6.19.0 + "@typescript-eslint/types": 6.19.1 + "@typescript-eslint/visitor-keys": 6.19.1 dev: false - /@typescript-eslint/type-utils@6.19.0(eslint@8.56.0)(typescript@5.3.3): + /@typescript-eslint/type-utils@6.19.1(eslint@8.56.0)(typescript@5.3.3): resolution: { - integrity: sha512-mcvS6WSWbjiSxKCwBcXtOM5pRkPQ6kcDds/juxcy/727IQr3xMEcwr/YLHW2A2+Fp5ql6khjbKBzOyjuPqGi/w==, + integrity: sha512-0vdyld3ecfxJuddDjACUvlAeYNrHP/pDeQk2pWBR2ESeEzQhg52DF53AbI9QCBkYE23lgkhLCZNkHn2hEXXYIg==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -2873,8 +2883,8 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/typescript-estree": 6.19.0(typescript@5.3.3) - "@typescript-eslint/utils": 6.19.0(eslint@8.56.0)(typescript@5.3.3) + "@typescript-eslint/typescript-estree": 6.19.1(typescript@5.3.3) + "@typescript-eslint/utils": 6.19.1(eslint@8.56.0)(typescript@5.3.3) debug: 4.3.4 eslint: 8.56.0 ts-api-utils: 1.0.3(typescript@5.3.3) @@ -2883,18 +2893,18 @@ packages: - supports-color dev: false - /@typescript-eslint/types@6.19.0: + /@typescript-eslint/types@6.19.1: resolution: { - integrity: sha512-lFviGV/vYhOy3m8BJ/nAKoAyNhInTdXpftonhWle66XHAtT1ouBlkjL496b5H5hb8dWXHwtypTqgtb/DEa+j5A==, + integrity: sha512-6+bk6FEtBhvfYvpHsDgAL3uo4BfvnTnoge5LrrCj2eJN8g3IJdLTD4B/jK3Q6vo4Ql/Hoip9I8aB6fF+6RfDqg==, } engines: { node: ^16.0.0 || >=18.0.0 } dev: false - /@typescript-eslint/typescript-estree@6.19.0(typescript@5.3.3): + /@typescript-eslint/typescript-estree@6.19.1(typescript@5.3.3): resolution: { - integrity: sha512-o/zefXIbbLBZ8YJ51NlkSAt2BamrK6XOmuxSR3hynMIzzyMY33KuJ9vuMdFSXW+H0tVvdF9qBPTHA91HDb4BIQ==, + integrity: sha512-aFdAxuhzBFRWhy+H20nYu19+Km+gFfwNO4TEqyszkMcgBDYQjmPJ61erHxuT2ESJXhlhrO7I5EFIlZ+qGR8oVA==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -2903,8 +2913,8 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/types": 6.19.0 - "@typescript-eslint/visitor-keys": 6.19.0 + "@typescript-eslint/types": 6.19.1 + "@typescript-eslint/visitor-keys": 6.19.1 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -2916,10 +2926,10 @@ packages: - supports-color dev: false - /@typescript-eslint/utils@6.19.0(eslint@8.56.0)(typescript@5.3.3): + /@typescript-eslint/utils@6.19.1(eslint@8.56.0)(typescript@5.3.3): resolution: { - integrity: sha512-QR41YXySiuN++/dC9UArYOg4X86OAYP83OWTewpVx5ct1IZhjjgTLocj7QNxGhWoTqknsgpl7L+hGygCO+sdYw==, + integrity: sha512-JvjfEZuP5WoMqwh9SPAPDSHSg9FBHHGhjPugSRxu5jMfjvBpq5/sGTD+9M9aQ5sh6iJ8AY/Kk/oUYVEMAPwi7w==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -2928,9 +2938,9 @@ packages: "@eslint-community/eslint-utils": 4.4.0(eslint@8.56.0) "@types/json-schema": 7.0.15 "@types/semver": 7.5.6 - "@typescript-eslint/scope-manager": 6.19.0 - "@typescript-eslint/types": 6.19.0 - "@typescript-eslint/typescript-estree": 6.19.0(typescript@5.3.3) + "@typescript-eslint/scope-manager": 6.19.1 + "@typescript-eslint/types": 6.19.1 + "@typescript-eslint/typescript-estree": 6.19.1(typescript@5.3.3) eslint: 8.56.0 semver: 7.5.4 transitivePeerDependencies: @@ -2938,18 +2948,18 @@ packages: - typescript dev: false - /@typescript-eslint/visitor-keys@6.19.0: + /@typescript-eslint/visitor-keys@6.19.1: resolution: { - integrity: sha512-hZaUCORLgubBvtGpp1JEFEazcuEdfxta9j4iUwdSAr7mEsYYAp3EAUyCZk3VEEqGj6W+AV4uWyrDGtrlawAsgQ==, + integrity: sha512-gkdtIO+xSO/SmI0W68DBg4u1KElmIUo3vXzgHyGPs6cxgB0sa3TlptRAAE0hUY1hM6FcDKEv7aIwiTGm76cXfQ==, } engines: { node: ^16.0.0 || >=18.0.0 } dependencies: - "@typescript-eslint/types": 6.19.0 + "@typescript-eslint/types": 6.19.1 eslint-visitor-keys: 3.4.3 dev: false - /@uiw/codemirror-themes@4.21.21(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0): + /@uiw/codemirror-themes@4.21.21(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1): resolution: { integrity: sha512-ljVcMGdaxo75UaH+EqxJ+jLyMVVgeSfW2AKyT1VeLy+4SDpuqNQ7wq5XVxktsG6LH+OvgSFndWXgPANf4+gQcA==, @@ -2961,7 +2971,7 @@ packages: dependencies: "@codemirror/language": 6.10.0 "@codemirror/state": 6.4.0 - "@codemirror/view": 6.23.0 + "@codemirror/view": 6.23.1 dev: false /@ungap/structured-clone@1.2.0: @@ -3015,7 +3025,7 @@ packages: integrity: sha512-XcJQVOaxTKCnth1vCxEChteGuwG6wqnUHxAm1DO3gCz0+uXKaJNx8/digSz4dLALCy8n2lKq24jSUs8segoqIw==, } dependencies: - "@babel/parser": 7.23.6 + "@babel/parser": 7.23.9 "@vue/shared": 3.4.15 entities: 4.5.0 estree-walker: 2.0.2 @@ -3038,7 +3048,7 @@ packages: integrity: sha512-LCn5M6QpkpFsh3GQvs2mJUOAlBQcCco8D60Bcqmf3O3w5a+KWS5GvYbrrJBkgvL1BDnTp+e8q0lXCLgHhKguBA==, } dependencies: - "@babel/parser": 7.23.6 + "@babel/parser": 7.23.9 "@vue/compiler-core": 3.4.15 "@vue/compiler-dom": 3.4.15 "@vue/compiler-ssr": 3.4.15 @@ -3280,10 +3290,10 @@ packages: } dev: false - /axios@1.6.5: + /axios@1.6.7: resolution: { - integrity: sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==, + integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==, } dependencies: follow-redirects: 1.15.5 @@ -3544,13 +3554,13 @@ packages: integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==, } dependencies: - "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.0)(@lezer/common@1.2.1) + "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) "@codemirror/commands": 6.3.3 "@codemirror/language": 6.10.0 "@codemirror/lint": 6.4.2 "@codemirror/search": 6.5.5 "@codemirror/state": 6.4.0 - "@codemirror/view": 6.23.0 + "@codemirror/view": 6.23.1 transitivePeerDependencies: - "@lezer/common" dev: false @@ -3809,10 +3819,10 @@ packages: dependencies: esutils: 2.0.3 - /dotenv@16.3.2: + /dotenv@16.4.1: resolution: { - integrity: sha512-HTlk5nmhkm8F6JcdXvHIzaorzCoziNQT9mGxLPVXW8wJF1TiGSL60ZGB4gHWabHOaMmWmhvk2/lPHfnBiT78AQ==, + integrity: sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ==, } engines: { node: ">=12" } dev: true @@ -3840,8 +3850,8 @@ packages: chalk: 5.3.0 commander: 9.5.0 env-paths: 3.0.0 - esbuild: 0.19.11 - esbuild-register: 3.5.0(esbuild@0.19.11) + esbuild: 0.19.12 + esbuild-register: 3.5.0(esbuild@0.19.12) glob: 8.1.0 hanji: 0.0.5 json-diff: 0.9.0 @@ -3852,7 +3862,7 @@ packages: - supports-color dev: true - /drizzle-orm@0.29.3(@cloudflare/workers-types@4.20240117.0)(@libsql/client@0.4.0-pre.7)(better-sqlite3@9.3.0): + /drizzle-orm@0.29.3(@cloudflare/workers-types@4.20240117.0)(@libsql/client@0.4.0)(better-sqlite3@9.3.0): resolution: { integrity: sha512-uSE027csliGSGYD0pqtM+SAQATMREb3eSM/U8s6r+Y0RFwTKwftnwwSkqx3oS65UBgqDOM0gMTl5UGNpt6lW0A==, @@ -3927,7 +3937,7 @@ packages: optional: true dependencies: "@cloudflare/workers-types": 4.20240117.0 - "@libsql/client": 0.4.0-pre.7 + "@libsql/client": 0.4.0 better-sqlite3: 9.3.0 dev: false @@ -3940,7 +3950,7 @@ packages: drizzle-orm: ">=0.23.13" zod: "*" dependencies: - drizzle-orm: 0.29.3(@cloudflare/workers-types@4.20240117.0)(@libsql/client@0.4.0-pre.7)(better-sqlite3@9.3.0) + drizzle-orm: 0.29.3(@cloudflare/workers-types@4.20240117.0)(@libsql/client@0.4.0)(better-sqlite3@9.3.0) zod: 3.22.4 dev: false @@ -4015,7 +4025,7 @@ packages: es6-symbol: 3.1.3 dev: true - /esbuild-register@3.5.0(esbuild@0.19.11): + /esbuild-register@3.5.0(esbuild@0.19.12): resolution: { integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==, @@ -4024,7 +4034,7 @@ packages: esbuild: ">=0.12 <1" dependencies: debug: 4.3.4 - esbuild: 0.19.11 + esbuild: 0.19.12 transitivePeerDependencies: - supports-color dev: true @@ -4095,38 +4105,38 @@ packages: "@esbuild/win32-x64": 0.18.20 dev: true - /esbuild@0.19.11: + /esbuild@0.19.12: resolution: { - integrity: sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==, + integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==, } engines: { node: ">=12" } hasBin: true requiresBuild: true optionalDependencies: - "@esbuild/aix-ppc64": 0.19.11 - "@esbuild/android-arm": 0.19.11 - "@esbuild/android-arm64": 0.19.11 - "@esbuild/android-x64": 0.19.11 - "@esbuild/darwin-arm64": 0.19.11 - "@esbuild/darwin-x64": 0.19.11 - "@esbuild/freebsd-arm64": 0.19.11 - "@esbuild/freebsd-x64": 0.19.11 - "@esbuild/linux-arm": 0.19.11 - "@esbuild/linux-arm64": 0.19.11 - "@esbuild/linux-ia32": 0.19.11 - "@esbuild/linux-loong64": 0.19.11 - "@esbuild/linux-mips64el": 0.19.11 - "@esbuild/linux-ppc64": 0.19.11 - "@esbuild/linux-riscv64": 0.19.11 - "@esbuild/linux-s390x": 0.19.11 - "@esbuild/linux-x64": 0.19.11 - "@esbuild/netbsd-x64": 0.19.11 - "@esbuild/openbsd-x64": 0.19.11 - "@esbuild/sunos-x64": 0.19.11 - "@esbuild/win32-arm64": 0.19.11 - "@esbuild/win32-ia32": 0.19.11 - "@esbuild/win32-x64": 0.19.11 + "@esbuild/aix-ppc64": 0.19.12 + "@esbuild/android-arm": 0.19.12 + "@esbuild/android-arm64": 0.19.12 + "@esbuild/android-x64": 0.19.12 + "@esbuild/darwin-arm64": 0.19.12 + "@esbuild/darwin-x64": 0.19.12 + "@esbuild/freebsd-arm64": 0.19.12 + "@esbuild/freebsd-x64": 0.19.12 + "@esbuild/linux-arm": 0.19.12 + "@esbuild/linux-arm64": 0.19.12 + "@esbuild/linux-ia32": 0.19.12 + "@esbuild/linux-loong64": 0.19.12 + "@esbuild/linux-mips64el": 0.19.12 + "@esbuild/linux-ppc64": 0.19.12 + "@esbuild/linux-riscv64": 0.19.12 + "@esbuild/linux-s390x": 0.19.12 + "@esbuild/linux-x64": 0.19.12 + "@esbuild/netbsd-x64": 0.19.12 + "@esbuild/openbsd-x64": 0.19.12 + "@esbuild/sunos-x64": 0.19.12 + "@esbuild/win32-arm64": 0.19.12 + "@esbuild/win32-ia32": 0.19.12 + "@esbuild/win32-x64": 0.19.12 dev: true /escape-string-regexp@4.0.0: @@ -4350,10 +4360,10 @@ packages: integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, } - /fastq@1.16.0: + /fastq@1.17.0: resolution: { - integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==, + integrity: sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==, } dependencies: reusify: 1.0.4 @@ -4689,7 +4699,7 @@ packages: "@types/unist": 3.0.2 devlop: 1.1.0 hastscript: 8.0.0 - property-information: 6.4.0 + property-information: 6.4.1 vfile: 6.0.1 vfile-location: 5.0.2 web-namespaces: 2.0.1 @@ -4806,7 +4816,7 @@ packages: hast-util-whitespace: 3.0.0 html-void-elements: 3.0.0 mdast-util-to-hast: 13.1.0 - property-information: 6.4.0 + property-information: 6.4.1 space-separated-tokens: 2.0.2 stringify-entities: 4.0.3 zwitch: 2.0.4 @@ -4821,7 +4831,7 @@ packages: "@types/hast": 3.0.3 comma-separated-tokens: 2.0.3 devlop: 1.1.0 - property-information: 6.4.0 + property-information: 6.4.1 space-separated-tokens: 2.0.2 web-namespaces: 2.0.1 zwitch: 2.0.4 @@ -4866,7 +4876,7 @@ packages: "@types/hast": 3.0.3 comma-separated-tokens: 2.0.3 hast-util-parse-selector: 4.0.0 - property-information: 6.4.0 + property-information: 6.4.1 space-separated-tokens: 2.0.2 dev: false @@ -4885,10 +4895,10 @@ packages: engines: { node: ">=12.0.0" } dev: false - /hono@3.12.6: + /hono@3.12.8: resolution: { - integrity: sha512-nnLMJbBA8k+tW8XD1Xt0BfNmJswppYF2pSOVo5U3DdU72SPYUjFkPg7/Q9KfkNcsrXzxFdJQ00JYjPGancmOOA==, + integrity: sha512-vnOEIRdqsp4uHE/dkOBr9EYmTsR86sD/FyG2xhfAQzR9udDRglN1nuO7SGc/7U3HfSorc6PSCNGN6upnVtCmfg==, } engines: { node: ">=16.0.0" } dev: false @@ -4926,12 +4936,12 @@ packages: stringify-object: 3.3.0 dev: false - /husky@8.0.3: + /husky@9.0.6: resolution: { - integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==, + integrity: sha512-EEuw/rfTiMjOfuL7pGO/i9otg1u36TXxqjIA6D9qxVjd/UXoDOsLor/BSFf5hTK50shwzCU3aVVwdXDp/lp7RA==, } - engines: { node: ">=14" } + engines: { node: ">=18" } hasBin: true dev: true @@ -5189,10 +5199,10 @@ packages: prelude-ls: 1.2.1 type-check: 0.4.0 - /libsql@0.2.0-pre.7: + /libsql@0.2.0: resolution: { - integrity: sha512-f2AmB3KvTYfYJUcERjed2RXKrnqZK2KvXkhnrpU+L7SQRtSYZqtChN70Pp0bKHGDkBXWvBLklpcwLpRNtwXStA==, + integrity: sha512-ELBRqhpJx5Dap0187zKQnntZyk4EjlDHSrjIVL8t+fQ5e8IxbQTeYgZgigMjB1EvrETdkm0Y0VxBGhzPQ+t0Jg==, } cpu: [x64, arm64] os: [darwin, linux, win32] @@ -5200,13 +5210,13 @@ packages: "@neon-rs/load": 0.0.4 detect-libc: 2.0.2 optionalDependencies: - "@libsql/darwin-arm64": 0.2.0-pre.7 - "@libsql/darwin-x64": 0.2.0-pre.7 - "@libsql/linux-arm64-gnu": 0.2.0-pre.7 - "@libsql/linux-arm64-musl": 0.2.0-pre.7 - "@libsql/linux-x64-gnu": 0.2.0-pre.7 - "@libsql/linux-x64-musl": 0.2.0-pre.7 - "@libsql/win32-x64-msvc": 0.2.0-pre.7 + "@libsql/darwin-arm64": 0.2.0 + "@libsql/darwin-x64": 0.2.0 + "@libsql/linux-arm64-gnu": 0.2.0 + "@libsql/linux-arm64-musl": 0.2.0 + "@libsql/linux-x64-gnu": 0.2.0 + "@libsql/linux-x64-musl": 0.2.0 + "@libsql/win32-x64-msvc": 0.2.0 dev: false /locate-path@6.0.0: @@ -5274,13 +5284,13 @@ packages: es5-ext: 0.10.62 dev: true - /lucia@3.0.0-beta.14: + /lucia@3.0.0: resolution: { - integrity: sha512-MXJILHb4xyvf3qjO7w7mDnvVOub2LGWLSjgP1TBGPLDkBF62uXNfvPNH7QRvOwvuSLtQK+w7JoPjnjiFiIj9rg==, + integrity: sha512-60NQqjKuaqPrjHL10CQ1j3rQy8qwKd3XpSNNnNcZyZI+4w1QFJdtNcR4l0dZJ4kJ0DdwI/943yplL47V7IZbGQ==, } dependencies: - oslo: 0.27.1 + oslo: 1.0.1 dev: false /magic-string@0.25.9: @@ -5892,10 +5902,10 @@ packages: engines: { node: ">=10" } dev: false - /miniflare@3.20231218.2: + /miniflare@3.20231218.4: resolution: { - integrity: sha512-rCUI2OjqCf3fZVdmSX4DOZQRzSDvHp/oL2vjER/cvJEdWSYiqRxDp2oO7A7JcEo1/Y+kPa5VQ1pFfdZpjBcpFg==, + integrity: sha512-2mpxvDiRBxGGGVnTKC0SZy0FtTXxFs3tM1ol67EoIJABGzvWFf33GThwh+/dRmaHSjKKId/FI8rEl5JxXXXZgQ==, } engines: { node: ">=16.13" } hasBin: true @@ -6119,10 +6129,20 @@ packages: prelude-ls: 1.2.1 type-check: 0.4.0 - /oslo@0.27.1: + /oslo@1.0.1: + resolution: + { + integrity: sha512-esfzZry+HfGgK/GCYkg7BRlLd3RH5aHa08wgLJPYjENXybi0BvXxGk0LbUj+lXfz2TkjPDHe4rB/o6JxRLHxBg==, + } + dependencies: + "@node-rs/argon2": 1.7.2 + "@node-rs/bcrypt": 1.9.2 + dev: false + + /oslo@1.0.2: resolution: { - integrity: sha512-AYU0LpwZ50wIMD3dr4NX0tQzjwxaejSSV9reiY9jbQfgODt49al3f3tMcijyddyvPknUPArz845vpswWyJTWvA==, + integrity: sha512-yBoZN0sOL5eEngLR2tFMTk2YFBF7czq/3ASCTM0WizAnUTllVRetCAsmV2CMMfu699VIe7f6vhNgJ0bQ2ejedg==, } dependencies: "@node-rs/argon2": 1.7.2 @@ -6329,10 +6349,10 @@ packages: } dev: true - /property-information@6.4.0: + /property-information@6.4.1: resolution: { - integrity: sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ==, + integrity: sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==, } dev: false @@ -6890,13 +6910,13 @@ packages: engines: { node: ">= 0.4" } dev: true - /tailwind-merge@2.2.0: + /tailwind-merge@2.2.1: resolution: { - integrity: sha512-SqqhhaL0T06SW59+JVNfAqKdqLs0497esifRrZ7jOaefP3o64fdFNDMrAQWZFMxTLJPiHVjRLUywT8uFz1xNWQ==, + integrity: sha512-o+2GTLkthfa5YUt4JxPfzMIpQzZ3adD1vLVkvKE1Twl9UAhGsEbIZhHHZVRttyW177S8PDJI3bTQNaebyofK3Q==, } dependencies: - "@babel/runtime": 7.23.8 + "@babel/runtime": 7.23.9 dev: false /tar-fs@2.1.1: @@ -7005,7 +7025,7 @@ packages: engines: { node: ">=18.0.0" } hasBin: true dependencies: - esbuild: 0.19.11 + esbuild: 0.19.12 get-tsconfig: 4.7.2 optionalDependencies: fsevents: 2.3.3 @@ -7406,10 +7426,10 @@ packages: "@cloudflare/workerd-windows-64": 1.20231218.0 dev: true - /wrangler@3.23.0: + /wrangler@3.25.0: resolution: { - integrity: sha512-mOWPL02/popoF6jjb4TT8au4yvo8VFu6O6/IwcRN74rlgwaGS0XvlkFtbofBGAdDUHAh5DXkuoPNS871mXNuJg==, + integrity: sha512-eU47Ez1QLu1B/wutm5ow+VwZnY4OqA+D/iy6BORAu5tABujoDr9p1yBxY/1DS/DxxDWqqY3sBBS6TzcC4NSLUQ==, } engines: { node: ">=16.17.0" } hasBin: true @@ -7420,7 +7440,7 @@ packages: blake3-wasm: 2.1.5 chokidar: 3.5.3 esbuild: 0.17.19 - miniflare: 3.20231218.2 + miniflare: 3.20231218.4 nanoid: 3.3.7 path-to-regexp: 6.2.1 resolve: 1.22.8 diff --git a/src/v2/lib/oslo.ts b/src/v2/lib/oslo.ts index 749fb24..2a2fc1b 100644 --- a/src/v2/lib/oslo.ts +++ b/src/v2/lib/oslo.ts @@ -1,4 +1,4 @@ -import { alphabet, generateRandomString } from "oslo/random" +import { alphabet, generateRandomString } from "oslo/crypto" export function generateID(length: number = 15) { return generateRandomString(length, alphabet("a-z", "0-9")).toLowerCase() From 18b841ca55e6f60d955dd59c13fc66dc0dbd05fb Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 28 Jan 2024 03:13:24 +0000 Subject: [PATCH 244/318] oh my days --- package.json | 4 +- pnpm-lock.yaml | 22 +++ src/index.ts | 24 ++- src/v2/middleware/ratelimit/limiter.ts | 103 +++++++++++ src/v2/middleware/ratelimit/ratelimit.do.ts | 180 ++++++++++++++++++++ src/worker-configuration.d.ts | 1 + tsconfig.json | 1 + wrangler.toml | 13 ++ 8 files changed, 338 insertions(+), 10 deletions(-) create mode 100644 src/v2/middleware/ratelimit/limiter.ts create mode 100644 src/v2/middleware/ratelimit/ratelimit.do.ts diff --git a/package.json b/package.json index 14c464f..3bb0726 100644 --- a/package.json +++ b/package.json @@ -41,12 +41,14 @@ "@scalar/hono-api-reference": "^0.3.29", "@typescript-eslint/eslint-plugin": "^6.19.1", "better-sqlite3": "^9.3.0", + "dayjs": "^1.11.10", "drizzle-orm": "^0.29.3", "drizzle-zod": "^0.5.1", "hono": "^3.12.8", "lucia": "3.0.0", "oslo": "^1.0.2", "prettier": "^3.2.4", - "zod": "^3.22.4" + "zod": "^3.22.4", + "zod-error": "^1.5.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d5609e8..27357cc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -29,6 +29,9 @@ dependencies: better-sqlite3: specifier: ^9.3.0 version: 9.3.0 + dayjs: + specifier: ^1.11.10 + version: 1.11.10 drizzle-orm: specifier: ^0.29.3 version: 0.29.3(@cloudflare/workers-types@4.20240117.0)(@libsql/client@0.4.0)(better-sqlite3@9.3.0) @@ -50,6 +53,9 @@ dependencies: zod: specifier: ^3.22.4 version: 3.22.4 + zod-error: + specifier: ^1.5.0 + version: 1.5.0 devDependencies: "@asteasolutions/zod-to-openapi": @@ -3711,6 +3717,13 @@ packages: engines: { node: ">= 12" } dev: false + /dayjs@1.11.10: + resolution: + { + integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==, + } + dev: false + /debug@4.3.4: resolution: { @@ -7522,6 +7535,15 @@ packages: } dev: false + /zod-error@1.5.0: + resolution: + { + integrity: sha512-zzopKZ/skI9iXpqCEPj+iLCKl9b88E43ehcU+sbRoHuwGd9F1IDVGQ70TyO6kmfiRL1g4IXkjsXK+g1gLYl4WQ==, + } + dependencies: + zod: 3.22.4 + dev: false + /zod@3.22.4: resolution: { diff --git a/src/index.ts b/src/index.ts index 70118ce..a578f7e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,15 +5,16 @@ import BaseRoutes from "@/v2/routes/handler" import { CustomCSS, OpenAPIConfig } from "./openapi/config" import { cors } from "hono/cors" import { csrf } from "hono/csrf" -import { LogTime } from "./v2/middleware/time-taken" +import { rateLimit } from "./v2/middleware/ratelimit/limiter" + +// this is required for the rate limiter to work +export { RateLimiter } from "@/v2/middleware/ratelimit/ratelimit.do" const app = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() // v2 API routes -app.route("/v2", BaseRoutes) +app.route("/v2", BaseRoutes).use("*", rateLimit(60, 100)) -// scalar API reference, very nice and lightweight -// i am putting this at root because i can app.get( "/", apiReference({ @@ -27,13 +28,8 @@ app.get( // openapi config app.doc("/openapi", OpenAPIConfig) -// interface CSRFOptions { -// origin?: string | string[] | IsAllowedOriginHandler; -// } app.use("*", csrf()) -app.use("*", LogTime) - app.use( "*", cors({ @@ -45,6 +41,16 @@ app.use( app.use("*", prettyJSON()) +app.notFound((ctx) => { + return ctx.json( + { + success: false, + message: "Not Found", + }, + 404 + ) +}) + app.onError((err, ctx) => { console.error(err) return ctx.json( diff --git a/src/v2/middleware/ratelimit/limiter.ts b/src/v2/middleware/ratelimit/limiter.ts new file mode 100644 index 0000000..7ccdd2e --- /dev/null +++ b/src/v2/middleware/ratelimit/limiter.ts @@ -0,0 +1,103 @@ +import dayjs from "dayjs" +import { Context, MiddlewareHandler } from "hono" + +const fakeDomain = "http://rate-limiter.com/" + +const getRateLimitKey = (ctx: Context) => { + const ip = ctx.req.header("cf-connecting-ip") + // TODO(dromzeh): look into setting current user w/ ctx.get/set, then we can use that OVER user ip? idk + const uniqueKey = ip || "" + return uniqueKey +} + +const getCacheKey = ( + endpoint: string, + key: number | string, + limit: number, + interval: number +) => { + return `${fakeDomain}${endpoint}/${key}/${limit}/${interval}` +} + +const setRateLimitHeaders = ( + ctx: Context, + secondsExpires: number, + limit: number, + remaining: number, + interval: number +) => { + ctx.header("X-RateLimit-Limit", limit.toString()) + ctx.header("X-RateLimit-Remaining", remaining.toString()) + ctx.header("X-RateLimit-Reset", secondsExpires.toString()) + ctx.header("X-RateLimit-Policy", `rate-limit-${limit}-${interval}`) +} + +export const rateLimit = ( + interval: number, + limit: number +): MiddlewareHandler<{ Bindings: Bindings; Variables: Variables }> => { + return async (ctx, next) => { + const key = getRateLimitKey(ctx) + + const endpoint = new URL(ctx.req.url).pathname + + const id = ctx.env.RATE_LIMITER.idFromName(key) + const rateLimiter = ctx.env.RATE_LIMITER.get(id) + + const cache = await caches.open("rate-limiter") + const cacheKey = getCacheKey(endpoint, key, limit, interval) + const cached = await cache.match(cacheKey) + + let res: Response + + if (!cached) { + res = await rateLimiter.fetch( + new Request(fakeDomain, { + method: "POST", + body: JSON.stringify({ + scope: endpoint, + key, + limit, + interval, + }), + }) + ) + } else { + res = cached + } + + const clonedRes = res.clone() + + const body = await clonedRes.json<{ + blocked: boolean + remaining: number + expires: string + }>() + + const secondsExpires = dayjs(body.expires).unix() - dayjs().unix() + + setRateLimitHeaders( + ctx, + secondsExpires, + limit, + body.remaining, + interval + ) + + if (body.blocked) { + if (!cached) { + ctx.executionCtx.waitUntil(cache.put(cacheKey, res)) + } + + return ctx.json( + { + success: false, + message: + "Rate limit exceeded, contact marcel@dromzeh.dev if you're using this API in production and need a higher rate limit.", + }, + 429 + ) + } + await next() + } +} diff --git a/src/v2/middleware/ratelimit/ratelimit.do.ts b/src/v2/middleware/ratelimit/ratelimit.do.ts new file mode 100644 index 0000000..6e73bdd --- /dev/null +++ b/src/v2/middleware/ratelimit/ratelimit.do.ts @@ -0,0 +1,180 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import dayjs from "dayjs" +import { Context } from "hono" +import { z, ZodError } from "zod" +import { generateErrorMessage, ErrorMessageOptions } from "zod-error" + +interface Config { + scope: string + key: string + limit: number + interval: number +} + +const configValidation = z.object({ + scope: z.string(), + key: z.string(), + limit: z.number().int().positive(), + interval: z.number().int().positive(), +}) + +const zodErrorOptions: ErrorMessageOptions = { + transform: ({ errorMessage, index }) => + `Error #${index + 1}: ${errorMessage}`, +} + +export class RateLimiter { + state: DurableObjectState + env: Bindings + app: OpenAPIHono = new OpenAPIHono() + + constructor(state: DurableObjectState, env: Bindings) { + this.state = state + this.env = env + + this.app.post("/", async (ctx) => { + await this.setAlarm() + + let config + + try { + config = await this.getConfig(ctx) + } catch (err: unknown) { + let errorMessage + if (err instanceof ZodError) { + errorMessage = generateErrorMessage( + err.issues, + zodErrorOptions + ) + } + return ctx.json( + { + statusCode: 400, + error: errorMessage, + }, + 400 + ) + } + const rate = await this.calculateRate(config) + const blocked = this.isRateLimited(rate, config.limit) + const headers = this.getHeaders(blocked, config) + const remaining = blocked ? 0 : Math.floor(config.limit - rate - 1) + + const remainingHeader = remaining >= 0 ? remaining : 0 + return ctx.json( + { + blocked, + remaining: remainingHeader, + expires: headers.expires, + }, + 200, + headers + ) + }) + } + + async alarm() { + const values = await this.state.storage.list() + // eslint-disable-next-line @typescript-eslint/no-unused-vars + for await (const [key, _value] of values) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const [_scope, _key, _limit, interval, timestamp] = key.split("|") + const currentWindow = Math.floor( + this.nowUnix() / parseInt(interval) + ) + + const timestampLessThan = currentWindow - 2 + + if (parseInt(timestamp) < timestampLessThan) { + await this.state.storage.delete(key) + } + } + } + + async setAlarm() { + const alarm = await this.state.storage.getAlarm() + if (!alarm) { + this.state.storage.setAlarm(dayjs().add(6, "hours").toDate()) + } + } + + async getConfig(c: Context) { + const body = await c.req.json() + const config = configValidation.parse(body) + return config + } + + async incrementRequestCount(key: string) { + const currentRequestCount = await this.getRequestCount(key) + await this.state.storage.put(key, currentRequestCount + 1) + } + + async getRequestCount(key: string): Promise { + return parseInt((await this.state.storage.get(key)) as string) || 0 + } + + nowUnix() { + return dayjs().unix() + } + + async calculateRate(config: Config) { + const keyPrefix = `${config.scope}|${config.key}|${config.limit}|${config.interval}` + + const currentWindow = Math.floor(this.nowUnix() / config.interval) + const distanceFromLastWindow = this.nowUnix() % config.interval + + const currentKey = `${keyPrefix}|${currentWindow}` + const previousKey = `${keyPrefix}|${currentWindow - 1}` + + const currentCount = await this.getRequestCount(currentKey) + const previousCount = (await this.getRequestCount(previousKey)) || 0 + + const rate = + (previousCount * (config.interval - distanceFromLastWindow)) / + config.interval + + currentCount + + if (!this.isRateLimited(rate, config.limit)) { + await this.incrementRequestCount(currentKey) + } + + return rate + } + + isRateLimited(rate: number, limit: number) { + return rate >= limit + } + + getHeaders(blocked: boolean, config: Config) { + const expires = this.expirySeconds(config) + const retryAfter = this.retryAfter(expires) + + const headers: { expires: string; "cache-control"?: string } = { + expires: retryAfter.toString(), + } + + if (!blocked) { + return headers + } + + headers["cache-control"] = + `public, max-age=${expires}, s-maxage=${expires}, must-revalidate` + return headers + } + + expirySeconds(config: Config) { + const currentWindowStart = Math.floor(this.nowUnix() / config.interval) + const currentWindowEnd = currentWindowStart + 1 + const secondsRemaining = + currentWindowEnd * config.interval - this.nowUnix() + return secondsRemaining + } + + retryAfter(expires: number) { + return dayjs().add(expires, "seconds").toString() + } + + async fetch(request: Request): Promise { + return this.app.fetch(request) + } +} diff --git a/src/worker-configuration.d.ts b/src/worker-configuration.d.ts index 3a123ae..a40d351 100644 --- a/src/worker-configuration.d.ts +++ b/src/worker-configuration.d.ts @@ -15,6 +15,7 @@ declare global { DISCORD_CLIENT_SECRET: string DISCORD_REDIRECT_URI: string RESEND_API_KEY: string + RATE_LIMITER: DurableObjectNamespace } type Variables = { diff --git a/tsconfig.json b/tsconfig.json index 7f16d1d..4f55605 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,6 +4,7 @@ "target": "es2021", "module": "es2022", "moduleResolution": "node", + "esModuleInterop": true, "lib": ["es2021"], "baseUrl": "./", "paths": { diff --git a/wrangler.toml b/wrangler.toml index da8fbf5..3056f29 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -10,4 +10,17 @@ binding = 'FILES_BUCKET' bucket_name = 'files' preview_bucket_name = 'files' +[durable_objects] +bindings = [ + {name = "RATE_LIMITER", class_name = "RateLimiter" }, +] + +[[migrations]] +tag = "v1" +new_classes = ["RateLimiter"] + [vars] +ENVIRONMENT = "DEV" + +[env.production.vars] +ENVIRONMENT = "PROD" \ No newline at end of file From 6f39ac4ea899def81f655492aa242d9442176e56 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Tue, 6 Feb 2024 11:51:41 +0000 Subject: [PATCH 245/318] fix #73 and response cloning --- pnpm-lock.yaml | 12962 ++++++++++------------- src/index.ts | 16 +- src/v2/lib/response-schemas.ts | 50 + src/v2/middleware/ratelimit/limiter.ts | 11 +- src/v2/middleware/time-taken.ts | 7 - 5 files changed, 5514 insertions(+), 7532 deletions(-) delete mode 100644 src/v2/middleware/time-taken.ts diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 27357cc..586406f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,7558 +1,5498 @@ -lockfileVersion: "6.0" +lockfileVersion: '6.0' settings: - autoInstallPeers: true - excludeLinksFromLockfile: false + autoInstallPeers: true + excludeLinksFromLockfile: false dependencies: - "@axiomhq/js": - specifier: 1.0.0-rc.1 - version: 1.0.0-rc.1 - "@hono/swagger-ui": - specifier: ^0.2.1 - version: 0.2.1(hono@3.12.8) - "@hono/zod-openapi": - specifier: ^0.9.6 - version: 0.9.6(hono@3.12.8)(zod@3.22.4) - "@libsql/client": - specifier: 0.4.0 - version: 0.4.0 - "@lucia-auth/adapter-sqlite": - specifier: 3.0.0 - version: 3.0.0(@libsql/client@0.4.0)(better-sqlite3@9.3.0)(lucia@3.0.0) - "@scalar/hono-api-reference": - specifier: ^0.3.29 - version: 0.3.29(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(hono@3.12.8)(nanoid@5.0.4)(postcss@8.4.33)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15) - "@typescript-eslint/eslint-plugin": - specifier: ^6.19.1 - version: 6.19.1(@typescript-eslint/parser@6.19.1)(eslint@8.56.0)(typescript@5.3.3) - better-sqlite3: - specifier: ^9.3.0 - version: 9.3.0 - dayjs: - specifier: ^1.11.10 - version: 1.11.10 - drizzle-orm: - specifier: ^0.29.3 - version: 0.29.3(@cloudflare/workers-types@4.20240117.0)(@libsql/client@0.4.0)(better-sqlite3@9.3.0) - drizzle-zod: - specifier: ^0.5.1 - version: 0.5.1(drizzle-orm@0.29.3)(zod@3.22.4) - hono: - specifier: ^3.12.8 - version: 3.12.8 - lucia: - specifier: 3.0.0 - version: 3.0.0 - oslo: - specifier: ^1.0.2 - version: 1.0.2 - prettier: - specifier: ^3.2.4 - version: 3.2.4 - zod: - specifier: ^3.22.4 - version: 3.22.4 - zod-error: - specifier: ^1.5.0 - version: 1.5.0 + '@axiomhq/js': + specifier: 1.0.0-rc.1 + version: 1.0.0-rc.1 + '@hono/swagger-ui': + specifier: ^0.2.1 + version: 0.2.1(hono@3.12.8) + '@hono/zod-openapi': + specifier: ^0.9.6 + version: 0.9.6(hono@3.12.8)(zod@3.22.4) + '@libsql/client': + specifier: 0.4.0 + version: 0.4.0 + '@lucia-auth/adapter-sqlite': + specifier: 3.0.0 + version: 3.0.0(@libsql/client@0.4.0)(better-sqlite3@9.3.0)(lucia@3.0.0) + '@scalar/hono-api-reference': + specifier: ^0.3.29 + version: 0.3.29(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(hono@3.12.8)(nanoid@5.0.4)(postcss@8.4.33)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15) + '@typescript-eslint/eslint-plugin': + specifier: ^6.19.1 + version: 6.19.1(@typescript-eslint/parser@6.19.1)(eslint@8.56.0)(typescript@5.3.3) + better-sqlite3: + specifier: ^9.3.0 + version: 9.3.0 + dayjs: + specifier: ^1.11.10 + version: 1.11.10 + drizzle-orm: + specifier: ^0.29.3 + version: 0.29.3(@cloudflare/workers-types@4.20240117.0)(@libsql/client@0.4.0)(better-sqlite3@9.3.0) + drizzle-zod: + specifier: ^0.5.1 + version: 0.5.1(drizzle-orm@0.29.3)(zod@3.22.4) + hono: + specifier: ^3.12.8 + version: 3.12.8 + lucia: + specifier: 3.0.0 + version: 3.0.0 + oslo: + specifier: ^1.0.2 + version: 1.0.2 + prettier: + specifier: ^3.2.4 + version: 3.2.4 + zod: + specifier: ^3.22.4 + version: 3.22.4 + zod-error: + specifier: ^1.5.0 + version: 1.5.0 devDependencies: - "@asteasolutions/zod-to-openapi": - specifier: ^6.3.1 - version: 6.3.1(zod@3.22.4) - "@cloudflare/workers-types": - specifier: ^4.20240117.0 - version: 4.20240117.0 - "@types/node": - specifier: ^20.11.8 - version: 20.11.8 - dotenv: - specifier: ^16.4.1 - version: 16.4.1 - drizzle-kit: - specifier: ^0.20.13 - version: 0.20.13 - eslint: - specifier: ^8.56.0 - version: 8.56.0 - husky: - specifier: ^9.0.6 - version: 9.0.6 - openapi-generator: - specifier: link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator - version: link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator - tsx: - specifier: ^4.7.0 - version: 4.7.0 - typescript: - specifier: ^5.3.3 - version: 5.3.3 - wrangler: - specifier: 3.25.0 - version: 3.25.0 + '@asteasolutions/zod-to-openapi': + specifier: ^6.3.1 + version: 6.3.1(zod@3.22.4) + '@cloudflare/workers-types': + specifier: ^4.20240117.0 + version: 4.20240117.0 + '@types/node': + specifier: ^20.11.8 + version: 20.11.8 + dotenv: + specifier: ^16.4.1 + version: 16.4.1 + drizzle-kit: + specifier: ^0.20.13 + version: 0.20.13 + eslint: + specifier: ^8.56.0 + version: 8.56.0 + husky: + specifier: ^9.0.6 + version: 9.0.6 + openapi-generator: + specifier: link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator + version: link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator + tsx: + specifier: ^4.7.0 + version: 4.7.0 + typescript: + specifier: ^5.3.3 + version: 5.3.3 + wrangler: + specifier: 3.25.0 + version: 3.25.0 packages: - /@aashutoshrathi/word-wrap@1.2.6: - resolution: - { - integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==, - } - engines: { node: ">=0.10.0" } - - /@apidevtools/json-schema-ref-parser@9.0.6: - resolution: - { - integrity: sha512-M3YgsLjI0lZxvrpeGVk9Ap032W6TPQkH6pRAZz81Ac3WUNF79VQooAFnp8umjvVzUmD93NkogxEwbSce7qMsUg==, - } - dependencies: - "@jsdevtools/ono": 7.1.3 - call-me-maybe: 1.0.2 - js-yaml: 3.14.1 - dev: false - - /@apidevtools/openapi-schemas@2.1.0: - resolution: - { - integrity: sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==, - } - engines: { node: ">=10" } - dev: false - - /@apidevtools/swagger-methods@3.0.2: - resolution: - { - integrity: sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==, - } - dev: false - - /@apidevtools/swagger-parser@10.1.0(openapi-types@12.1.3): - resolution: - { - integrity: sha512-9Kt7EuS/7WbMAUv2gSziqjvxwDbFSg3Xeyfuj5laUODX8o/k/CpsAKiQ8W7/R88eXFTMbJYg6+7uAmOWNKmwnw==, - } - peerDependencies: - openapi-types: ">=7" - dependencies: - "@apidevtools/json-schema-ref-parser": 9.0.6 - "@apidevtools/openapi-schemas": 2.1.0 - "@apidevtools/swagger-methods": 3.0.2 - "@jsdevtools/ono": 7.1.3 - ajv: 8.12.0 - ajv-draft-04: 1.0.0(ajv@8.12.0) - call-me-maybe: 1.0.2 - openapi-types: 12.1.3 - dev: false - - /@asteasolutions/zod-to-openapi@5.5.0(zod@3.22.4): - resolution: - { - integrity: sha512-d5HwrvM6dOKr3XdeF+DmashGvfEc+1oiEfbscugsiwSTrFtuMa7ETpW9sTNnVgn+hJaz+PRxPQUYD7q9/5dUig==, - } - peerDependencies: - zod: ^3.20.2 - dependencies: - openapi3-ts: 4.2.1 - zod: 3.22.4 - dev: false - - /@asteasolutions/zod-to-openapi@6.3.1(zod@3.22.4): - resolution: - { - integrity: sha512-1CRWBqslgdBpZeJnxxksGirAQ39Iztxk+LzTkYwoP0mNzuaULa604s8Xc5V9yzmYccwJ89O9fPQgxCkbNN398g==, - } - peerDependencies: - zod: ^3.20.2 - dependencies: - openapi3-ts: 4.2.1 - zod: 3.22.4 - dev: true - - /@axiomhq/js@1.0.0-rc.1: - resolution: - { - integrity: sha512-B/TT5HPc3KmoEIJUwhfzAAp0SLNfcxQnr0SGEbs1lWS0OOLckgj1Q4K1Tp/l669Yje1CK68i3LcajU/9+z+v2g==, - } - engines: { node: ">=16" } - dependencies: - fetch-retry: 5.0.6 - uuid: 8.3.2 - dev: false - - /@babel/helper-string-parser@7.23.4: - resolution: - { - integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==, - } - engines: { node: ">=6.9.0" } - dev: false - - /@babel/helper-validator-identifier@7.22.20: - resolution: - { - integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==, - } - engines: { node: ">=6.9.0" } - dev: false - - /@babel/parser@7.23.9: - resolution: - { - integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==, - } - engines: { node: ">=6.0.0" } - hasBin: true - dependencies: - "@babel/types": 7.23.9 - dev: false - - /@babel/runtime@7.23.9: - resolution: - { - integrity: sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==, - } - engines: { node: ">=6.9.0" } - dependencies: - regenerator-runtime: 0.14.1 - dev: false - - /@babel/types@7.23.9: - resolution: - { - integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==, - } - engines: { node: ">=6.9.0" } - dependencies: - "@babel/helper-string-parser": 7.23.4 - "@babel/helper-validator-identifier": 7.22.20 - to-fast-properties: 2.0.0 - dev: false - - /@cloudflare/kv-asset-handler@0.2.0: - resolution: - { - integrity: sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==, - } - dependencies: - mime: 3.0.0 - dev: true - - /@cloudflare/workerd-darwin-64@1.20231218.0: - resolution: - { - integrity: sha512-547gOmTIVmRdDy7HNAGJUPELa+fSDm2Y0OCxqAtQOz0GLTDu1vX61xYmsb2rn91+v3xW6eMttEIpbYokKjtfJA==, - } - engines: { node: ">=16" } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - /@cloudflare/workerd-darwin-arm64@1.20231218.0: - resolution: - { - integrity: sha512-b39qrU1bKolCfmKFDAnX4vXcqzISkEUVE/V8sMBsFzxrIpNAbcUHBZAQPYmS/OHIGB94KjOVokvDi7J6UNurPw==, - } - engines: { node: ">=16" } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + + /@apidevtools/json-schema-ref-parser@9.0.6: + resolution: {integrity: sha512-M3YgsLjI0lZxvrpeGVk9Ap032W6TPQkH6pRAZz81Ac3WUNF79VQooAFnp8umjvVzUmD93NkogxEwbSce7qMsUg==} + dependencies: + '@jsdevtools/ono': 7.1.3 + call-me-maybe: 1.0.2 + js-yaml: 3.14.1 + dev: false + + /@apidevtools/openapi-schemas@2.1.0: + resolution: {integrity: sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==} + engines: {node: '>=10'} + dev: false + + /@apidevtools/swagger-methods@3.0.2: + resolution: {integrity: sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==} + dev: false + + /@apidevtools/swagger-parser@10.1.0(openapi-types@12.1.3): + resolution: {integrity: sha512-9Kt7EuS/7WbMAUv2gSziqjvxwDbFSg3Xeyfuj5laUODX8o/k/CpsAKiQ8W7/R88eXFTMbJYg6+7uAmOWNKmwnw==} + peerDependencies: + openapi-types: '>=7' + dependencies: + '@apidevtools/json-schema-ref-parser': 9.0.6 + '@apidevtools/openapi-schemas': 2.1.0 + '@apidevtools/swagger-methods': 3.0.2 + '@jsdevtools/ono': 7.1.3 + ajv: 8.12.0 + ajv-draft-04: 1.0.0(ajv@8.12.0) + call-me-maybe: 1.0.2 + openapi-types: 12.1.3 + dev: false + + /@asteasolutions/zod-to-openapi@5.5.0(zod@3.22.4): + resolution: {integrity: sha512-d5HwrvM6dOKr3XdeF+DmashGvfEc+1oiEfbscugsiwSTrFtuMa7ETpW9sTNnVgn+hJaz+PRxPQUYD7q9/5dUig==} + peerDependencies: + zod: ^3.20.2 + dependencies: + openapi3-ts: 4.2.1 + zod: 3.22.4 + dev: false + + /@asteasolutions/zod-to-openapi@6.3.1(zod@3.22.4): + resolution: {integrity: sha512-1CRWBqslgdBpZeJnxxksGirAQ39Iztxk+LzTkYwoP0mNzuaULa604s8Xc5V9yzmYccwJ89O9fPQgxCkbNN398g==} + peerDependencies: + zod: ^3.20.2 + dependencies: + openapi3-ts: 4.2.1 + zod: 3.22.4 + dev: true + + /@axiomhq/js@1.0.0-rc.1: + resolution: {integrity: sha512-B/TT5HPc3KmoEIJUwhfzAAp0SLNfcxQnr0SGEbs1lWS0OOLckgj1Q4K1Tp/l669Yje1CK68i3LcajU/9+z+v2g==} + engines: {node: '>=16'} + dependencies: + fetch-retry: 5.0.6 + uuid: 8.3.2 + dev: false + + /@babel/helper-string-parser@7.23.4: + resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/parser@7.23.9: + resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.23.9 + dev: false + + /@babel/runtime@7.23.9: + resolution: {integrity: sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.1 + dev: false + + /@babel/types@7.23.9: + resolution: {integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + dev: false + + /@cloudflare/kv-asset-handler@0.2.0: + resolution: {integrity: sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==} + dependencies: + mime: 3.0.0 + dev: true + + /@cloudflare/workerd-darwin-64@1.20231218.0: + resolution: {integrity: sha512-547gOmTIVmRdDy7HNAGJUPELa+fSDm2Y0OCxqAtQOz0GLTDu1vX61xYmsb2rn91+v3xW6eMttEIpbYokKjtfJA==} + engines: {node: '>=16'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@cloudflare/workerd-darwin-arm64@1.20231218.0: + resolution: {integrity: sha512-b39qrU1bKolCfmKFDAnX4vXcqzISkEUVE/V8sMBsFzxrIpNAbcUHBZAQPYmS/OHIGB94KjOVokvDi7J6UNurPw==} + engines: {node: '>=16'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@cloudflare/workerd-linux-64@1.20231218.0: + resolution: {integrity: sha512-dMUF1wA+0mybm6hHNOCgY/WMNMwomPPs4I7vvYCgwHSkch0Q2Wb7TnxQZSt8d1PK/myibaBwadrlIxpjxmpz3w==} + engines: {node: '>=16'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@cloudflare/workerd-linux-arm64@1.20231218.0: + resolution: {integrity: sha512-2s5uc8IHt0QmWyKxAr1Fy+4b8Xy0b/oUtlPnm5MrKi2gDRlZzR7JvxENPJCpCnYENydS8lzvkMiAFECPBccmyQ==} + engines: {node: '>=16'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@cloudflare/workerd-windows-64@1.20231218.0: + resolution: {integrity: sha512-oN5hz6TXUDB5YKUN5N3QWAv6cYz9JjTZ9g16HVyoegVFEL6/zXU3tV19MBX2IvlE11ab/mRogEv9KXVIrHfKmA==} + engines: {node: '>=16'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@cloudflare/workers-types@4.20240117.0: + resolution: {integrity: sha512-HQU8lJhaJVh8gQXFtVA7lZwd0hK1ckIFjRuxOXkVN2Z9t7DtzNbA2YTwBry5thKNgF5EwjN4THjHg5NUZzj05A==} + + /@codemirror/autocomplete@6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1): + resolution: {integrity: sha512-r4IjdYFthwbCQyvqnSlx0WBHRHi8nBvU+WjJxFUij81qsBfhNudf/XKKmmC2j3m0LaOYUQTf3qiEK1J8lO1sdg==} + peerDependencies: + '@codemirror/language': ^6.0.0 + '@codemirror/state': ^6.0.0 + '@codemirror/view': ^6.0.0 + '@lezer/common': ^1.0.0 + dependencies: + '@codemirror/language': 6.10.0 + '@codemirror/state': 6.4.0 + '@codemirror/view': 6.23.1 + '@lezer/common': 1.2.1 + dev: false + + /@codemirror/commands@6.3.3: + resolution: {integrity: sha512-dO4hcF0fGT9tu1Pj1D2PvGvxjeGkbC6RGcZw6Qs74TH+Ed1gw98jmUgd2axWvIZEqTeTuFrg1lEB1KV6cK9h1A==} + dependencies: + '@codemirror/language': 6.10.0 + '@codemirror/state': 6.4.0 + '@codemirror/view': 6.23.1 + '@lezer/common': 1.2.1 + dev: false + + /@codemirror/lang-css@6.2.1(@codemirror/view@6.23.1): + resolution: {integrity: sha512-/UNWDNV5Viwi/1lpr/dIXJNWiwDxpw13I4pTUAsNxZdg6E0mI2kTQb0P2iHczg1Tu+H4EBgJR+hYhKiHKko7qg==} + dependencies: + '@codemirror/autocomplete': 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) + '@codemirror/language': 6.10.0 + '@codemirror/state': 6.4.0 + '@lezer/common': 1.2.1 + '@lezer/css': 1.1.7 + transitivePeerDependencies: + - '@codemirror/view' + dev: false + + /@codemirror/lang-html@6.4.8: + resolution: {integrity: sha512-tE2YK7wDlb9ZpAH6mpTPiYm6rhfdQKVDa5r9IwIFlwwgvVaKsCfuKKZoJGWsmMZIf3FQAuJ5CHMPLymOtg1hXw==} + dependencies: + '@codemirror/autocomplete': 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) + '@codemirror/lang-css': 6.2.1(@codemirror/view@6.23.1) + '@codemirror/lang-javascript': 6.2.1 + '@codemirror/language': 6.10.0 + '@codemirror/state': 6.4.0 + '@codemirror/view': 6.23.1 + '@lezer/common': 1.2.1 + '@lezer/css': 1.1.7 + '@lezer/html': 1.3.8 + dev: false + + /@codemirror/lang-java@6.0.1: + resolution: {integrity: sha512-OOnmhH67h97jHzCuFaIEspbmsT98fNdhVhmA3zCxW0cn7l8rChDhZtwiwJ/JOKXgfm4J+ELxQihxaI7bj7mJRg==} + dependencies: + '@codemirror/language': 6.10.0 + '@lezer/java': 1.1.1 + dev: false + + /@codemirror/lang-javascript@6.2.1: + resolution: {integrity: sha512-jlFOXTejVyiQCW3EQwvKH0m99bUYIw40oPmFjSX2VS78yzfe0HELZ+NEo9Yfo1MkGRpGlj3Gnu4rdxV1EnAs5A==} + dependencies: + '@codemirror/autocomplete': 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) + '@codemirror/language': 6.10.0 + '@codemirror/lint': 6.4.2 + '@codemirror/state': 6.4.0 + '@codemirror/view': 6.23.1 + '@lezer/common': 1.2.1 + '@lezer/javascript': 1.4.13 + dev: false + + /@codemirror/lang-json@6.0.1: + resolution: {integrity: sha512-+T1flHdgpqDDlJZ2Lkil/rLiRy684WMLc74xUnjJH48GQdfJo/pudlTRreZmKwzP8/tGdKf83wlbAdOCzlJOGQ==} + dependencies: + '@codemirror/language': 6.10.0 + '@lezer/json': 1.0.2 + dev: false + + /@codemirror/lang-python@6.1.3(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1): + resolution: {integrity: sha512-S9w2Jl74hFlD5nqtUMIaXAq9t5WlM0acCkyuQWUUSvZclk1sV+UfnpFiZzuZSG+hfEaOmxKR5UxY/Uxswn7EhQ==} + dependencies: + '@codemirror/autocomplete': 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) + '@codemirror/language': 6.10.0 + '@lezer/python': 1.1.11 + transitivePeerDependencies: + - '@codemirror/state' + - '@codemirror/view' + - '@lezer/common' + dev: false + + /@codemirror/language@6.10.0: + resolution: {integrity: sha512-2vaNn9aPGCRFKWcHPFksctzJ8yS5p7YoaT+jHpc0UGKzNuAIx4qy6R5wiqbP+heEEdyaABA582mNqSHzSoYdmg==} + dependencies: + '@codemirror/state': 6.4.0 + '@codemirror/view': 6.23.1 + '@lezer/common': 1.2.1 + '@lezer/highlight': 1.2.0 + '@lezer/lr': 1.4.0 + style-mod: 4.1.0 + dev: false + + /@codemirror/legacy-modes@6.3.3: + resolution: {integrity: sha512-X0Z48odJ0KIoh/HY8Ltz75/4tDYc9msQf1E/2trlxFaFFhgjpVHjZ/BCXe1Lk7s4Gd67LL/CeEEHNI+xHOiESg==} + dependencies: + '@codemirror/language': 6.10.0 + dev: false + + /@codemirror/lint@6.4.2: + resolution: {integrity: sha512-wzRkluWb1ptPKdzlsrbwwjYCPLgzU6N88YBAmlZi8WFyuiEduSd05MnJYNogzyc8rPK7pj6m95ptUApc8sHKVA==} + dependencies: + '@codemirror/state': 6.4.0 + '@codemirror/view': 6.23.1 + crelt: 1.0.6 + dev: false + + /@codemirror/search@6.5.5: + resolution: {integrity: sha512-PIEN3Ke1buPod2EHbJsoQwlbpkz30qGZKcnmH1eihq9+bPQx8gelauUwLYaY4vBOuBAuEhmpDLii4rj/uO0yMA==} + dependencies: + '@codemirror/state': 6.4.0 + '@codemirror/view': 6.23.1 + crelt: 1.0.6 + dev: false + + /@codemirror/state@6.4.0: + resolution: {integrity: sha512-hm8XshYj5Fo30Bb922QX9hXB/bxOAVH+qaqHBzw5TKa72vOeslyGwd4X8M0c1dJ9JqxlaMceOQ8RsL9tC7gU0A==} + dev: false + + /@codemirror/view@6.23.1: + resolution: {integrity: sha512-J2Xnn5lFYT1ZN/5ewEoMBCmLlL71lZ3mBdb7cUEuHhX2ESoSrNEucpsDXpX22EuTGm9LOgC9v4Z0wx+Ez8QmGA==} + dependencies: + '@codemirror/state': 6.4.0 + style-mod: 4.1.0 + w3c-keyname: 2.2.8 + 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 + + /@drizzle-team/studio@0.0.39: + resolution: {integrity: sha512-c5Hkm7MmQC2n5qAsKShjQrHoqlfGslB8+qWzsGGZ+2dHMRTNG60UuzalF0h0rvBax5uzPXuGkYLGaQ+TUX3yMw==} + dependencies: + superjson: 2.2.1 + dev: true + + /@emnapi/core@0.45.0: + resolution: {integrity: sha512-DPWjcUDQkCeEM4VnljEOEcXdAD7pp8zSZsgOujk/LGIwCXWbXJngin+MO4zbH429lzeC3WbYLGjE2MaUOwzpyw==} + requiresBuild: true + dependencies: + tslib: 2.6.2 + dev: false + optional: true + + /@emnapi/runtime@0.45.0: + resolution: {integrity: sha512-Txumi3td7J4A/xTTwlssKieHKTGl3j4A1tglBx72auZ49YK7ePY6XZricgIg9mnZT4xPfA+UPCUdnhRuEFDL+w==} + requiresBuild: true + dependencies: + tslib: 2.6.2 + dev: false + optional: 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/aix-ppc64@0.19.12: + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + 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-arm64@0.19.12: + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: 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-arm@0.19.12: + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + engines: {node: '>=12'} + cpu: [arm] + 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/android-x64@0.19.12: + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + 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-arm64@0.19.12: + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + 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/darwin-x64@0.19.12: + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + 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-arm64@0.19.12: + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + 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/freebsd-x64@0.19.12: + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + 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-arm64@0.19.12: + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + 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-arm@0.19.12: + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + engines: {node: '>=12'} + cpu: [arm] + 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-ia32@0.19.12: + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + 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-loong64@0.19.12: + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + 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-mips64el@0.19.12: + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + 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-ppc64@0.19.12: + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + 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-riscv64@0.19.12: + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + 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-s390x@0.19.12: + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + 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/linux-x64@0.19.12: + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + 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/netbsd-x64@0.19.12: + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + 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/openbsd-x64@0.19.12: + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + 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/sunos-x64@0.19.12: + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + 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-arm64@0.19.12: + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + 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-ia32@0.19.12: + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + 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 + + /@esbuild/win32-x64@0.19.12: + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.56.0 + eslint-visitor-keys: 3.4.3 + + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + /@eslint/eslintrc@2.1.4: + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.0 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + /@eslint/js@8.56.0: + resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + /@fastify/busboy@2.1.0: + resolution: {integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==} + engines: {node: '>=14'} + dev: true + + /@floating-ui/core@1.6.0: + resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} + dependencies: + '@floating-ui/utils': 0.2.1 + dev: false + + /@floating-ui/dom@1.6.0: + resolution: {integrity: sha512-SZ0BEXzsaaS6THZfZJUcAobbZTD+MvfGM42bxgeg0Tnkp4/an/avqwAXiVLsFtIBZtfsx3Ymvwx0+KnnhdA/9g==} + dependencies: + '@floating-ui/core': 1.6.0 + '@floating-ui/utils': 0.2.1 + dev: false + + /@floating-ui/utils@0.2.1: + resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} + dev: false + + /@floating-ui/vue@1.0.5(vue@3.4.15): + resolution: {integrity: sha512-rXYI0JHLnAw5nTGNKTmH9tMxFWmZPEfkyexXzG/HchGsoL4f8lE7+bX43pVRXRBbmCWg0/j4d62Ui7acZBmUew==} + dependencies: + '@floating-ui/dom': 1.6.0 + '@floating-ui/utils': 0.2.1 + vue-demi: 0.14.6(vue@3.4.15) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + dev: false + + /@headlessui/vue@1.7.17(vue@3.4.15): + resolution: {integrity: sha512-hmJChv8HzKorxd9F70RGnECAwZfkvmmwOqreuKLWY/19d5qbWnSdw+DNbuA/Uo6X5rb4U5B3NrT+qBKPmjhRqw==} + engines: {node: '>=10'} + peerDependencies: + vue: ^3.2.0 + dependencies: + '@tanstack/vue-virtual': 3.0.2(vue@3.4.15) + vue: 3.4.15(typescript@5.3.3) + dev: false + + /@hono/swagger-ui@0.2.1(hono@3.12.8): + resolution: {integrity: sha512-wBxVMRe3/v8xH4o6icmwztiIq0DG0s7+jHVMHVUAoFFCWEQNL2iskMmQtrhSDtsFmBZUeUFQUaaJ6Ir6DOmHLA==} + peerDependencies: + hono: '*' + dependencies: + hono: 3.12.8 + dev: false + + /@hono/zod-openapi@0.9.6(hono@3.12.8)(zod@3.22.4): + resolution: {integrity: sha512-MLF8xpd4fEwbEaylFqAt1qci4wOTXu3oq3BKb01trccapYfodP50VCO0YDNBQTyMT/Iapq6GMO4+RAIFBgG5WQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + hono: '>=3.11.3' + zod: 3.* + dependencies: + '@asteasolutions/zod-to-openapi': 5.5.0(zod@3.22.4) + '@hono/zod-validator': 0.1.11(hono@3.12.8)(zod@3.22.4) + hono: 3.12.8 + zod: 3.22.4 + dev: false + + /@hono/zod-validator@0.1.11(hono@3.12.8)(zod@3.22.4): + resolution: {integrity: sha512-PQXeHUP0+36qpRt8yfeD7N2jbK3ETlGvSN6dMof/HwUC/APRokQRjpXZm4rrlG71Ft0aWE01+Bm4XejqPie5Uw==} + peerDependencies: + hono: '>=3.9.0' + zod: ^3.19.1 + dependencies: + hono: 3.12.8 + zod: 3.22.4 + dev: false + + /@humanwhocodes/config-array@0.11.14: + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 2.0.2 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + /@humanwhocodes/object-schema@2.0.2: + resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} + + /@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==} + + /@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 + + /@jsdevtools/ono@7.1.3: + resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + dev: false + + /@lezer/common@1.2.1: + resolution: {integrity: sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==} + dev: false + + /@lezer/css@1.1.7: + resolution: {integrity: sha512-7BlFFAKNn/b39jJLrhdLSX5A2k56GIJvyLqdmm7UU+7XvequY084iuKDMAEhAmAzHnwDE8FK4OQtsIUssW91tg==} + dependencies: + '@lezer/common': 1.2.1 + '@lezer/highlight': 1.2.0 + '@lezer/lr': 1.4.0 + dev: false + + /@lezer/highlight@1.2.0: + resolution: {integrity: sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==} + dependencies: + '@lezer/common': 1.2.1 + dev: false + + /@lezer/html@1.3.8: + resolution: {integrity: sha512-EXseJ3pUzWxE6XQBQdqWHZqqlGQRSuNMBcLb6mZWS2J2v+QZhOObD+3ZIKIcm59ntTzyor4LqFTb72iJc3k23Q==} + dependencies: + '@lezer/common': 1.2.1 + '@lezer/highlight': 1.2.0 + '@lezer/lr': 1.4.0 + dev: false + + /@lezer/java@1.1.1: + resolution: {integrity: sha512-mt3dX13fRlpY7RlWELYRakanXgmwXsLRCrhstrn+c1sZd7jR2xle46/3heoxGd+oHxnuTnpoyXTyxcLJQs9+mQ==} + dependencies: + '@lezer/common': 1.2.1 + '@lezer/highlight': 1.2.0 + '@lezer/lr': 1.4.0 + dev: false + + /@lezer/javascript@1.4.13: + resolution: {integrity: sha512-5IBr8LIO3xJdJH1e9aj/ZNLE4LSbdsx25wFmGRAZsj2zSmwAYjx26JyU/BYOCpRQlu1jcv1z3vy4NB9+UkfRow==} + dependencies: + '@lezer/common': 1.2.1 + '@lezer/highlight': 1.2.0 + '@lezer/lr': 1.4.0 + dev: false + + /@lezer/json@1.0.2: + resolution: {integrity: sha512-xHT2P4S5eeCYECyKNPhr4cbEL9tc8w83SPwRC373o9uEdrvGKTZoJVAGxpOsZckMlEh9W23Pc72ew918RWQOBQ==} + dependencies: + '@lezer/common': 1.2.1 + '@lezer/highlight': 1.2.0 + '@lezer/lr': 1.4.0 + dev: false + + /@lezer/lr@1.4.0: + resolution: {integrity: sha512-Wst46p51km8gH0ZUmeNrtpRYmdlRHUpN1DQd3GFAyKANi8WVz8c2jHYTf1CVScFaCjQw1iO3ZZdqGDxQPRErTg==} + dependencies: + '@lezer/common': 1.2.1 + dev: false + + /@lezer/python@1.1.11: + resolution: {integrity: sha512-C3QeLCcdAKJDUOsYjfFP6a1wdn8jhUNX200bgFm8TpKH1eM2PlgYQS5ugw6E38qGeEx7CP21I1Q52SoybXt0OQ==} + dependencies: + '@lezer/common': 1.2.1 + '@lezer/highlight': 1.2.0 + '@lezer/lr': 1.4.0 + dev: false + + /@libsql/client@0.4.0: + resolution: {integrity: sha512-GjBHHxRMKomG2rLx6K8BYsDhk9jNcKXpkEOO7luPTCje4z41ogD0sCaBRcGbJw9h3HMVysCW5v70WmjQ4/FWpg==} + dependencies: + '@libsql/core': 0.4.0 + '@libsql/hrana-client': 0.5.6 + js-base64: 3.7.6 + libsql: 0.2.0 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: false + + /@libsql/core@0.4.0: + resolution: {integrity: sha512-pQHyZI0aTBlBm08dpB+/SEqLDe5wlgiUY+VNXbCD8yZhXo30AGinyrDlKrtGW7luo0As4Y9v1befurJdLKbC0Q==} + dependencies: + js-base64: 3.7.6 + dev: false + + /@libsql/darwin-arm64@0.2.0: + resolution: {integrity: sha512-+qyT2W/n5CFH1YZWv2mxW4Fsoo4dX9Z9M/nvbQqZ7H84J8hVegvVAsIGYzcK8xAeMEcpU5yGKB1Y9NoDY4hOSQ==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@libsql/darwin-x64@0.2.0: + resolution: {integrity: sha512-hwmO2mF1n8oDHKFrUju6Jv+n9iFtTf5JUK+xlnIE3Td0ZwGC/O1R/Z/btZTd9nD+vsvakC8SJT7/Q6YlWIkhEw==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@libsql/hrana-client@0.5.6: + resolution: {integrity: sha512-mjQoAmejZ1atG+M3YR2ZW+rg6ceBByH/S/h17ZoYZkqbWrvohFhXyz2LFxj++ARMoY9m6w3RJJIRdJdmnEUlFg==} + dependencies: + '@libsql/isomorphic-fetch': 0.1.12 + '@libsql/isomorphic-ws': 0.1.5 + js-base64: 3.7.6 + node-fetch: 3.3.2 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: false + + /@libsql/isomorphic-fetch@0.1.12: + resolution: {integrity: sha512-MRo4UcmjAGAa3ac56LoD5OE13m2p0lu0VEtZC2NZMcogM/jc5fU9YtMQ3qbPjFJ+u2BBjFZgMPkQaLS1dlMhpg==} + dependencies: + '@types/node-fetch': 2.6.11 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: false + + /@libsql/isomorphic-ws@0.1.5: + resolution: {integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==} + dependencies: + '@types/ws': 8.5.10 + ws: 8.16.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /@libsql/linux-arm64-gnu@0.2.0: + resolution: {integrity: sha512-1w2lPXIYtnBaK5t/Ej5E8x7lPiE+jP3KATI/W4yei5Z/ONJh7jQW5PJ7sYU95vTME3hWEM1FXN6kvzcpFAte7w==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@libsql/linux-arm64-musl@0.2.0: + resolution: {integrity: sha512-lkblBEJ7xuNiWNjP8DDq0rqoWccszfkUS7Efh5EjJ+GDWdCBVfh08mPofIZg0fZVLWQCY3j+VZCG1qZfATBizg==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@libsql/linux-x64-gnu@0.2.0: + resolution: {integrity: sha512-+x/d289KeJydwOhhqSxKT+6MSQTCfLltzOpTzPccsvdt5fxg8CBi+gfvEJ4/XW23Sa+9bc7zodFP0i6MOlxX7w==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@libsql/linux-x64-musl@0.2.0: + resolution: {integrity: sha512-5Xn0c5A6vKf9D1ASpgk7mef//FuY7t5Lktj/eiU4n3ryxG+6WTpqstTittJUgepVjcleLPYxIhQAYeYwTYH1IQ==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@libsql/win32-x64-msvc@0.2.0: + resolution: {integrity: sha512-rpK+trBIpRST15m3cMYg5aPaX7kvCIottxY7jZPINkKAaScvfbn9yulU/iZUM9YtuK96Y1ZmvwyVIK/Y5DzoMQ==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@lucia-auth/adapter-sqlite@3.0.0(@libsql/client@0.4.0)(better-sqlite3@9.3.0)(lucia@3.0.0): + resolution: {integrity: sha512-7XMfMMNziFOoqIq2u9W5Z+wo7G7lzNQfUh7wDlkIqKxJMSLtP6GKH+QpK+21X4ZY9dIDmiuiwqZmS3Q3CgpATw==} + peerDependencies: + '@libsql/client': ^0.3.0 + better-sqlite3: 8.x - 9.x + lucia: 3.x + peerDependenciesMeta: + '@libsql/client': optional: true - - /@cloudflare/workerd-linux-64@1.20231218.0: - resolution: - { - integrity: sha512-dMUF1wA+0mybm6hHNOCgY/WMNMwomPPs4I7vvYCgwHSkch0Q2Wb7TnxQZSt8d1PK/myibaBwadrlIxpjxmpz3w==, - } - engines: { node: ">=16" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + better-sqlite3: optional: true - - /@cloudflare/workerd-linux-arm64@1.20231218.0: - resolution: - { - integrity: sha512-2s5uc8IHt0QmWyKxAr1Fy+4b8Xy0b/oUtlPnm5MrKi2gDRlZzR7JvxENPJCpCnYENydS8lzvkMiAFECPBccmyQ==, - } - engines: { node: ">=16" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + dependencies: + '@libsql/client': 0.4.0 + better-sqlite3: 9.3.0 + lucia: 3.0.0 + dev: false + + /@napi-rs/wasm-runtime@0.1.1: + resolution: {integrity: sha512-ATj9ua659JgrkICjJscaeZdmPr44cb/KFjNWuD0N6pux0SpzaM7+iOuuK11mAnQM2N9q0DT4REu6NkL8ZEhopw==} + requiresBuild: true + dependencies: + '@emnapi/core': 0.45.0 + '@emnapi/runtime': 0.45.0 + '@tybys/wasm-util': 0.8.1 + dev: false + optional: true + + /@neon-rs/load@0.0.4: + resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==} + dev: false + + /@node-rs/argon2-android-arm-eabi@1.7.2: + resolution: {integrity: sha512-WhW84XOzdR4AOGc4BJvIg5lCRVBL0pXp/PPCe8QCyWw493p7VdNCdYpr2xdtjS/0zImmY85HNB/6zpzjLRTT/A==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-android-arm64@1.7.2: + resolution: {integrity: sha512-CdtayHSMIyDuVhSYFirwA757c4foQuyTjpysgFJLHweP9C7uDiBf9WBYij+UyabpaCadJ0wPyK6Vakinvlk4/g==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-darwin-arm64@1.7.2: + resolution: {integrity: sha512-hUOhtgYHTEyzX5sgMZVdXunONOus2HWpWydF5D/RYJ1mZ76FXRnFpQE40DqbzisdPIraKdn40m7JqkPP7wqdyg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-darwin-x64@1.7.2: + resolution: {integrity: sha512-lfs5HX+t542yUfcv6Aa/NeGD1nUCwyQNgnPEGcik71Ow6V13hkR1bHgmT1u3CHN4fBts0gW+DQEDsq1xlVgkvw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-freebsd-x64@1.7.2: + resolution: {integrity: sha512-ROoF+4VaCBJUjddrTN1hjuqSl89ppRcjVXJscSPJjWzTlbzFmGGovJvIzUBmCr/Oq3yM1zKHj6MP9oRD5cB+/g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-arm-gnueabihf@1.7.2: + resolution: {integrity: sha512-CBSB8KPI8LS74Bcz3dYaa2/khULutz4vSDvFWUERlSLX+mPdDhoZi6UPuUPPF9e01w8AbiK1YCqlLUTm3tIMfw==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-arm64-gnu@1.7.2: + resolution: {integrity: sha512-6LBTug6ZiWFakP3X3Nqs7ZTM03gmcSWX4YvEn20HhhQE5NDrsrw3zNqGj0cJiNzKKIMSDDuj7uGy+ITEfNo4CA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-arm64-musl@1.7.2: + resolution: {integrity: sha512-KjhQ+ZPne29t9VRVeIif7JdKwQba+tM6CBNYBoJB1iON0CUKeqSQtZcHuTj9gkf2SNRG5bsU4ABcfxd0OKsKHg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-x64-gnu@1.7.2: + resolution: {integrity: sha512-BQvp+iLtKqomHz4q5t1aKoni9osgvUDU5sZtHAlFm5dRTlGHnympcQVATRE5GHyH9C6MIM9W7P1kqEeCLGPolQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-x64-musl@1.7.2: + resolution: {integrity: sha512-yXJudpBZQ98g+lWaHn9EzZ5KsAyqRdlpub/K+5NP7gHehb8wzBRIFAejIHAG0fvzQEEc86VOnV2koWIVZxWAvw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-wasm32-wasi@1.7.2: + resolution: {integrity: sha512-diXlVjJZY2GIV8ZDwUqXPhacXsFR0klGSv5D9f+XidwWXK4udtzDhkM/7N/Mb7h1HAWaxZ6IN9spYFjvWH1wqg==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + requiresBuild: true + dependencies: + '@napi-rs/wasm-runtime': 0.1.1 + dev: false + optional: true + + /@node-rs/argon2-win32-arm64-msvc@1.7.2: + resolution: {integrity: sha512-dhIBrY04P9nbmwzBpgERQDmmSu4YBZyeEE32t4TikMz5rQ07iaVC+JpGmtCBZoDIsLDHGC8cikENd3YEqpqIcA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-win32-ia32-msvc@1.7.2: + resolution: {integrity: sha512-o1tfqr8gyALCzuxBoQfvhxkeYMaw/0H8Gmt7klTYyEIBvEFu7SD5qytXO9Px7t5420nZL/Wy5cflg3IB1s57Pg==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-win32-x64-msvc@1.7.2: + resolution: {integrity: sha512-v0h53XUc7hNgWiWi0qcMcHvj9/kwuItI9NwLK4C+gtzT3UB0cedhfIL8HFMKThMXasy41ZdbpCF2Bi0kJoLNEg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2@1.7.2: + resolution: {integrity: sha512-+H6pc3M1vIX9YnG59YW7prHhhpv19P8YyxlXHnnFzTimf2q+kKDF7mGWbhvN9STqIY+P70Patn0Q6qb6Ib5/4g==} + engines: {node: '>= 10'} + optionalDependencies: + '@node-rs/argon2-android-arm-eabi': 1.7.2 + '@node-rs/argon2-android-arm64': 1.7.2 + '@node-rs/argon2-darwin-arm64': 1.7.2 + '@node-rs/argon2-darwin-x64': 1.7.2 + '@node-rs/argon2-freebsd-x64': 1.7.2 + '@node-rs/argon2-linux-arm-gnueabihf': 1.7.2 + '@node-rs/argon2-linux-arm64-gnu': 1.7.2 + '@node-rs/argon2-linux-arm64-musl': 1.7.2 + '@node-rs/argon2-linux-x64-gnu': 1.7.2 + '@node-rs/argon2-linux-x64-musl': 1.7.2 + '@node-rs/argon2-wasm32-wasi': 1.7.2 + '@node-rs/argon2-win32-arm64-msvc': 1.7.2 + '@node-rs/argon2-win32-ia32-msvc': 1.7.2 + '@node-rs/argon2-win32-x64-msvc': 1.7.2 + dev: false + + /@node-rs/bcrypt-android-arm-eabi@1.9.2: + resolution: {integrity: sha512-er/Q2khwpan9pczvTTqY/DJE4UU65u31xd0NkZlHUTKyB7djRhWfzoGexGx2GN+k831/RR3U8kKE/8QUHeO3hQ==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-android-arm64@1.9.2: + resolution: {integrity: sha512-OUYatOEG5vbLbF73q2TC8UqrDO81zUQxnaFD/OAB1hcm6J+ur0zJ8E53c35/DIqkTp7JarPMraC4rouJ2ugN4w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-darwin-arm64@1.9.2: + resolution: {integrity: sha512-svJKsGbzMAxOB5oluOYneN4YkKUy26WSMgm3KOIhgoX30IeMilj+2jFN/5qrI0oDZ0Iczb3XyL5DuZFtEkdP8A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-darwin-x64@1.9.2: + resolution: {integrity: sha512-9OrySjBi/rWix8NZWD/TrNbNcwMY0pAiMHdL09aJnJ07uPih83GGh1pq4UHCYFCMy7iTX8swOmDlGBUImkOZbg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-freebsd-x64@1.9.2: + resolution: {integrity: sha512-/djXV71RO6g5L1mI2pVvmp3x3pH7G4uKI3ODG1JBIXoz334oOcCMh40sB0uq0ljP8WEadker01p4T1rJE98fpg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-arm-gnueabihf@1.9.2: + resolution: {integrity: sha512-F7wP950OTAooxEleUN4I2hqryGZK7hi1cSgRF13Wvbc597RFux35KiSxIXUA3mNt2DE7lV2PeceEtCOScaThWQ==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-arm64-gnu@1.9.2: + resolution: {integrity: sha512-MehG+yQ0TgKMgKR1rO4hdvHkVsTM91Cof8qI9EJlS5+7+QSwfFA5O0zGwCkISD7bsyauJ5uJgcByGjpEobAHOg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-arm64-musl@1.9.2: + resolution: {integrity: sha512-PRZTAJjOwKEGsIhmBvfNh81So+wGl4QyCFAt23j+KwBujLStjC0N3YaqtTlWVKG9tcriPtmMYiAQtXWIyIgg/w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-x64-gnu@1.9.2: + resolution: {integrity: sha512-5WfGO+O1m7nJ55WZ8XDq+ItA98Z4O7sNWsR+1nIj9YGT+Tx5zkQ2RBhpK6oCWZMluuZ0eKQ0FDmyP6K+2NDRIA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-x64-musl@1.9.2: + resolution: {integrity: sha512-VjCn0388p6PMCVUYHgYmHZrKNc7WwNJRr2WLJsHbQRGDOKbpNL6YolCjQxUchcSPDhzwrq1cIdy4j0fpoXEsdw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-wasm32-wasi@1.9.2: + resolution: {integrity: sha512-P06aHfMzm9makwU+nM7WA65yQnS1xuqJ8l/6I/LvXjnl+lfB3DtJ2B0CSLtjnUGpUgcHbWl5gEbNnTPxSAirjQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + requiresBuild: true + dependencies: + '@napi-rs/wasm-runtime': 0.1.1 + dev: false + optional: true + + /@node-rs/bcrypt-win32-arm64-msvc@1.9.2: + resolution: {integrity: sha512-Iyo/Q5/eNw27VRd3mLBgh1b9b5fnT3QHTVwxv3Siv/MRAIfJXH/cTOe18qSwYQzNh0ZioW4yemFPYCWSZi7szA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-win32-ia32-msvc@1.9.2: + resolution: {integrity: sha512-6LHWMaPylyyHoS5863YpxAACVB8DWCxro5W6pQ4h8WKSgHpJp8Um9jphTdN0A2w45HZjUnfcFuiFFC+TbftjCw==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-win32-x64-msvc@1.9.2: + resolution: {integrity: sha512-vZ9T1MOaYkLO9FTyl28YX0SYJneiYTKNFgM8PUv8nas8xrD+7OzokA0fEtlNp6413T7IKSD/iG9qi8nTWsiyGg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt@1.9.2: + resolution: {integrity: sha512-FKUo9iCSIti+ldwoOlY1ztyIFhZxEgT7jZ/UCt/9bg1rLmNdbQQD2JKIMImDCqmTWuLPY4ZF4Q5MyOMIfDCd8Q==} + engines: {node: '>= 10'} + optionalDependencies: + '@node-rs/bcrypt-android-arm-eabi': 1.9.2 + '@node-rs/bcrypt-android-arm64': 1.9.2 + '@node-rs/bcrypt-darwin-arm64': 1.9.2 + '@node-rs/bcrypt-darwin-x64': 1.9.2 + '@node-rs/bcrypt-freebsd-x64': 1.9.2 + '@node-rs/bcrypt-linux-arm-gnueabihf': 1.9.2 + '@node-rs/bcrypt-linux-arm64-gnu': 1.9.2 + '@node-rs/bcrypt-linux-arm64-musl': 1.9.2 + '@node-rs/bcrypt-linux-x64-gnu': 1.9.2 + '@node-rs/bcrypt-linux-x64-musl': 1.9.2 + '@node-rs/bcrypt-wasm32-wasi': 1.9.2 + '@node-rs/bcrypt-win32-arm64-msvc': 1.9.2 + '@node-rs/bcrypt-win32-ia32-msvc': 1.9.2 + '@node-rs/bcrypt-win32-x64-msvc': 1.9.2 + dev: false + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.0 + + /@scalar/api-client@0.9.3(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15): + resolution: {integrity: sha512-mfTlCAy2cA2kMoDIZWC6PEW7NdCIHJ7DxKcc+YqRdmM1wJHFRQ8RqPB7kqHSaoRFMk0atJtQnzgjdIU63T9fZQ==} + engines: {node: '>=18'} + peerDependencies: + vue: ^3.3.0 + dependencies: + '@headlessui/vue': 1.7.17(vue@3.4.15) + '@scalar/themes': 0.5.4(vue@3.4.15) + '@scalar/use-codemirror': 0.7.19(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15) + '@scalar/use-keyboard-event': 0.5.8(vue@3.4.15) + '@scalar/use-modal': 0.2.3(@headlessui/vue@1.7.17)(vue@3.4.15) + '@vueuse/core': 10.7.2(vue@3.4.15) + axios: 1.6.7 + content-type: 1.0.5 + javascript-time-ago: 2.5.9 + nanoid: 5.0.4 + pretty-bytes: 6.1.1 + pretty-ms: 8.0.0 + vue: 3.4.15(typescript@5.3.3) + transitivePeerDependencies: + - '@codemirror/lang-html' + - '@codemirror/lang-java' + - '@codemirror/lang-javascript' + - '@codemirror/lang-json' + - '@codemirror/lang-python' + - '@codemirror/language' + - '@codemirror/legacy-modes' + - '@codemirror/state' + - '@codemirror/view' + - '@lezer/common' + - '@lezer/highlight' + - '@lezer/lr' + - '@uiw/codemirror-themes' + - '@vue/composition-api' + - codemirror + - debug + dev: false + + /@scalar/api-reference@1.13.18(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(nanoid@5.0.4)(postcss@8.4.33)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15): + resolution: {integrity: sha512-K9p/cxH1mwwyiQf5q38Y+lBofxesleUsMJBT/ZxAHLaiO+1urXDnaEeyIAonXoEaprltvfhICWLvG8W+J6CmyA==} + engines: {node: '>=18'} + peerDependencies: + unified: ^11.0.0 + vue: ^3.3.0 + dependencies: + '@floating-ui/vue': 1.0.5(vue@3.4.15) + '@headlessui/vue': 1.7.17(vue@3.4.15) + '@scalar/api-client': 0.9.3(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15) + '@scalar/components': 0.2.2(typescript@5.3.3) + '@scalar/snippetz': 0.1.5 + '@scalar/swagger-editor': 0.9.8(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/view@6.23.1)(@headlessui/vue@1.7.17)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15) + '@scalar/swagger-parser': 0.5.15(openapi-types@12.1.3) + '@scalar/themes': 0.5.4(vue@3.4.15) + '@scalar/use-clipboard': 0.5.13(@scalar/use-toasts@0.5.13)(nanoid@5.0.4) + '@scalar/use-codemirror': 0.7.19(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15) + '@scalar/use-keyboard-event': 0.5.8(vue@3.4.15) + '@scalar/use-modal': 0.2.3(@headlessui/vue@1.7.17)(vue@3.4.15) + '@scalar/use-toasts': 0.5.13(nanoid@5.0.4)(vue@3.4.15) + '@scalar/use-tooltip': 0.5.8(vue@3.4.15) + '@unhead/schema': 1.8.10 + '@vcarl/remark-headings': 0.1.0 + '@vueuse/core': 10.7.2(vue@3.4.15) + '@xmldom/xmldom': 0.8.10 + axios: 1.6.7 + fuse.js: 6.6.2 + github-slugger: 2.0.0 + httpsnippet-lite: 3.0.5 + js-yaml: 4.1.0 + openapi-types: 12.1.3 + postcss-nested: 6.0.1(postcss@8.4.33) + rehype-external-links: 3.0.0 + rehype-format: 5.0.0 + rehype-highlight: 7.0.0 + rehype-sanitize: 6.0.0 + rehype-slug-custom-id: 1.1.0 + rehype-stringify: 10.0.0 + remark-gfm: 4.0.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.0 + remark-stringify: 11.0.0 + unhead: 1.8.10 + unified: 11.0.4 + vue: 3.4.15(typescript@5.3.3) + transitivePeerDependencies: + - '@codemirror/lang-html' + - '@codemirror/lang-java' + - '@codemirror/lang-javascript' + - '@codemirror/lang-json' + - '@codemirror/lang-python' + - '@codemirror/language' + - '@codemirror/legacy-modes' + - '@codemirror/state' + - '@codemirror/view' + - '@lezer/common' + - '@lezer/highlight' + - '@lezer/lr' + - '@uiw/codemirror-themes' + - '@vue/composition-api' + - codemirror + - debug + - nanoid + - postcss + - supports-color + - typescript + dev: false + + /@scalar/components@0.2.2(typescript@5.3.3): + resolution: {integrity: sha512-+iMVCe6aKTwQYu4hLypH48kJVkfLZ/twB8ZBRK4lhZCpv8bUOprOMxYIkdnRtlXJITCaM6lxee5pg4aSVkCrvg==} + engines: {node: '>=18'} + dependencies: + '@headlessui/vue': 1.7.17(vue@3.4.15) + '@vueuse/core': 10.7.2(vue@3.4.15) + '@xmldom/xmldom': 0.8.10 + class-variance-authority: 0.7.0 + cva: 1.0.0-beta.1(typescript@5.3.3) + nanoid: 5.0.4 + tailwind-merge: 2.2.1 + vue: 3.4.15(typescript@5.3.3) + transitivePeerDependencies: + - '@vue/composition-api' + - typescript + dev: false + + /@scalar/hono-api-reference@0.3.29(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(hono@3.12.8)(nanoid@5.0.4)(postcss@8.4.33)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15): + resolution: {integrity: sha512-JKGwToiBBaLr2kuxPzoP+rDbceT2ILDBKACTK1c/LTvnLKJL/CcB6BiRfRjAKuVoIecPC7nVFoka/GXQkbUd7Q==} + engines: {node: '>=18'} + peerDependencies: + hono: ^3.0.0 + dependencies: + '@scalar/api-reference': 1.13.18(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(nanoid@5.0.4)(postcss@8.4.33)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15) + hono: 3.12.8 + transitivePeerDependencies: + - '@codemirror/lang-html' + - '@codemirror/lang-java' + - '@codemirror/lang-javascript' + - '@codemirror/lang-json' + - '@codemirror/lang-python' + - '@codemirror/language' + - '@codemirror/legacy-modes' + - '@codemirror/state' + - '@codemirror/view' + - '@lezer/common' + - '@lezer/highlight' + - '@lezer/lr' + - '@uiw/codemirror-themes' + - '@vue/composition-api' + - codemirror + - debug + - nanoid + - postcss + - supports-color + - typescript + - unified + - vue + dev: false + + /@scalar/snippetz-core@0.1.3: + resolution: {integrity: sha512-pHRi23VhxMddKMo/2zEnaRcc1QUTEva5H2tryuq+tER7imGWf2O09IGexiV9vY/8jzYh0QVl/2dlJUmnF9Ww5w==} + dependencies: + '@types/har-format': 1.2.15 + dev: false + + /@scalar/snippetz-plugin-js-fetch@0.1.0: + resolution: {integrity: sha512-lliZSIqtbZawm+XXmMXEpCcpIQprRwJXNUxLAvryB9AGm9qTu0dIfsvjJPjiTAfRew5+sgebNQ8cEF4esMnnlQ==} + dependencies: + '@scalar/snippetz-core': 0.1.3 + dev: false + + /@scalar/snippetz-plugin-node-fetch@0.1.1: + resolution: {integrity: sha512-U6kqtQi1xAME8AWgJmEVAFA/uhcJ1RUNKtyVDjupd77LQu2FEOPwqI5dPSltxvnJdYrUjLhDcfIa8EO8uO43zw==} + dependencies: + '@scalar/snippetz-core': 0.1.3 + dev: false + + /@scalar/snippetz-plugin-node-undici@0.1.5: + resolution: {integrity: sha512-ctOvCK3/Ta7ibuZjhV85M/gBuKURpeqgkWQHDFJubTHgUhQZudn60N5MY3ZtjoLFY7z9DCC5UenNYINveCdKJw==} + dependencies: + '@scalar/snippetz-core': 0.1.3 + dev: false + + /@scalar/snippetz@0.1.5: + resolution: {integrity: sha512-jHU8/KOO9vKbQFhsruflKugekgAtDm5GIAKZCYN+XtzqQ3jPGAjzkEZMXXvRDS2YPtFSzH2vzfqNMLB+q2Zupw==} + dependencies: + '@scalar/snippetz-core': 0.1.3 + '@scalar/snippetz-plugin-js-fetch': 0.1.0 + '@scalar/snippetz-plugin-node-fetch': 0.1.1 + '@scalar/snippetz-plugin-node-undici': 0.1.5 + dev: false + + /@scalar/swagger-editor@0.9.8(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/view@6.23.1)(@headlessui/vue@1.7.17)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15): + resolution: {integrity: sha512-VxhbqaZVwEy7Od29Kxbg6a/6AM7md/ugcD2pNCw2wUv1PcV/ru+9imJkfClI3HfUXZN/IyLDaZpaNZadCB4Rrw==} + engines: {node: '>=18'} + peerDependencies: + unified: ^11.0.0 + vue: ^3.3.0 + dependencies: + '@codemirror/state': 6.4.0 + '@scalar/components': 0.2.2(typescript@5.3.3) + '@scalar/themes': 0.5.4(vue@3.4.15) + '@scalar/use-codemirror': 0.7.19(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15) + '@scalar/use-modal': 0.2.3(@headlessui/vue@1.7.17)(vue@3.4.15) + '@vueuse/core': 10.7.2(vue@3.4.15) + nanoid: 5.0.4 + rehype-external-links: 3.0.0 + rehype-format: 5.0.0 + rehype-highlight: 7.0.0 + rehype-sanitize: 6.0.0 + rehype-slug-custom-id: 1.1.0 + rehype-stringify: 10.0.0 + remark-gfm: 4.0.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.0 + unified: 11.0.4 + vue: 3.4.15(typescript@5.3.3) + transitivePeerDependencies: + - '@codemirror/lang-html' + - '@codemirror/lang-java' + - '@codemirror/lang-javascript' + - '@codemirror/lang-json' + - '@codemirror/lang-python' + - '@codemirror/language' + - '@codemirror/legacy-modes' + - '@codemirror/view' + - '@headlessui/vue' + - '@lezer/common' + - '@lezer/highlight' + - '@lezer/lr' + - '@uiw/codemirror-themes' + - '@vue/composition-api' + - codemirror + - supports-color + - typescript + dev: false + + /@scalar/swagger-parser@0.5.15(openapi-types@12.1.3): + resolution: {integrity: sha512-qQY69CiS9XkdG5RuWk/ey12qXiXLUacb7b6oXU1KNB00MKJEpfj+Fjdn+ALXBoKiUVqAfIxeB76evGdZsupwMQ==} + engines: {node: '>=18'} + dependencies: + '@apidevtools/swagger-parser': 10.1.0(openapi-types@12.1.3) + js-yaml: 4.1.0 + transitivePeerDependencies: + - openapi-types + dev: false + + /@scalar/themes@0.5.4(vue@3.4.15): + resolution: {integrity: sha512-3tmivqGFJwmxmPygWls5W5qyQAt2Ax8tUVi/eVHb8+UYs5ADTzhNKeOu/CipKeZO9z+tfO+UO+XLhy2qb5T+dA==} + engines: {node: '>=18'} + peerDependencies: + vue: ^3.3.0 + dependencies: + vue: 3.4.15(typescript@5.3.3) + dev: false + + /@scalar/use-clipboard@0.5.13(@scalar/use-toasts@0.5.13)(nanoid@5.0.4): + resolution: {integrity: sha512-UtDu+ArEfHjHUGJzNZQdbFfP4CAPhPwJxcMAwG6KbwaRTNq4UNRS3+WoFmnVOOl8dPLVQFyMs10A2ca2HgJGcA==} + engines: {node: '>=18'} + peerDependencies: + '@scalar/use-toasts': 0.5.13 + nanoid: ^5.0.1 + dependencies: + '@scalar/use-toasts': 0.5.13(nanoid@5.0.4)(vue@3.4.15) + nanoid: 5.0.4 + dev: false + + /@scalar/use-codemirror@0.7.19(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15): + resolution: {integrity: sha512-xS6/JsVeQ983K6B/6RJMfmgl5GNst7zPbspSPxKwRCbwV5qBZaVWMhop6HQ5mnmanJTXxeh6krRG3K8tFbsuyg==} + engines: {node: '>=18'} + peerDependencies: + '@codemirror/lang-html': ^6.0.0 + '@codemirror/lang-java': ^6.0.0 + '@codemirror/lang-javascript': ^6.0.0 + '@codemirror/lang-json': ^6.0.0 + '@codemirror/lang-python': ^6.0.0 + '@codemirror/language': ^6.0.0 + '@codemirror/legacy-modes': ^6.0.0 + '@codemirror/state': ^6.4.0 + '@codemirror/view': ^6.0.0 + '@lezer/common': ^1.1.0 + '@lezer/highlight': ^1.1.0 + '@lezer/lr': ^1.3.0 + '@uiw/codemirror-themes': ^4.21.0 + codemirror: ^6.0.0 + vue: ^3.3.0 + dependencies: + '@codemirror/lang-html': 6.4.8 + '@codemirror/lang-java': 6.0.1 + '@codemirror/lang-javascript': 6.2.1 + '@codemirror/lang-json': 6.0.1 + '@codemirror/lang-python': 6.1.3(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) + '@codemirror/language': 6.10.0 + '@codemirror/legacy-modes': 6.3.3 + '@codemirror/state': 6.4.0 + '@codemirror/view': 6.23.1 + '@lezer/common': 1.2.1 + '@lezer/highlight': 1.2.0 + '@lezer/lr': 1.4.0 + '@uiw/codemirror-themes': 4.21.21(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1) + codemirror: 6.0.1(@lezer/common@1.2.1) + vue: 3.4.15(typescript@5.3.3) + dev: false + + /@scalar/use-keyboard-event@0.5.8(vue@3.4.15): + resolution: {integrity: sha512-LcqgZOZWOKIDCftfR4+qOXEtbvXtTtHSObRF2egpctsXgGHlyKY5KjPOoffbvwdh21rLa5ITBy+emwAm2i6Xww==} + engines: {node: '>=18'} + peerDependencies: + vue: ^3.3.0 + dependencies: + vue: 3.4.15(typescript@5.3.3) + dev: false + + /@scalar/use-modal@0.2.3(@headlessui/vue@1.7.17)(vue@3.4.15): + resolution: {integrity: sha512-qCn8rNCTy7jO/7DDalsMM+m1jBfEE/Fnx3Im966uBzCdxdyLbJ8f9S2ZwmW44KP6CXbsMGsuORkvY6Z8joZvMg==} + engines: {node: '>=18'} + peerDependencies: + '@headlessui/vue': ^1.7.0 + vue: ^3.3.0 + dependencies: + '@headlessui/vue': 1.7.17(vue@3.4.15) + vue: 3.4.15(typescript@5.3.3) + dev: false + + /@scalar/use-toasts@0.5.13(nanoid@5.0.4)(vue@3.4.15): + resolution: {integrity: sha512-EiFezCmWchaYfwEDTkSv/r7x6aYOlaFcu+zpTaV/y3ppCIybLvL3WRQzQS0KMaCJJBmQecZbCqMPnRLlacPwYw==} + engines: {node: '>=18'} + peerDependencies: + nanoid: 4 - 5 + vue: ^3.3.0 + dependencies: + nanoid: 5.0.4 + vue: 3.4.15(typescript@5.3.3) + dev: false + + /@scalar/use-tooltip@0.5.8(vue@3.4.15): + resolution: {integrity: sha512-9gCa7UGlRQVrKVy3tp5WYn/vCS1Fk0mcPlpkoffPeekS/4A01K3SpddqM76gVUNnOvDOq0EPEbVvUO1deB9oGw==} + engines: {node: '>=18'} + peerDependencies: + vue: ^3.3.0 + dependencies: + vue: 3.4.15(typescript@5.3.3) + dev: false + + /@tanstack/virtual-core@3.0.0: + resolution: {integrity: sha512-SYXOBTjJb05rXa2vl55TTwO40A6wKu0R5i1qQwhJYNDIqaIGF7D0HsLw+pJAyi2OvntlEIVusx3xtbbgSUi6zg==} + dev: false + + /@tanstack/vue-virtual@3.0.2(vue@3.4.15): + resolution: {integrity: sha512-1iFpX+yZswHuf4wrA6GU9yJ/YzQ/8SacABwqghwCkcwrkZbOPLlRSdOAqZ1WQ50SftmfhZpaiZl2KmpV7cgfMQ==} + peerDependencies: + vue: ^2.7.0 || ^3.0.0 + dependencies: + '@tanstack/virtual-core': 3.0.0 + vue: 3.4.15(typescript@5.3.3) + dev: false + + /@tybys/wasm-util@0.8.1: + resolution: {integrity: sha512-GSsTwyBl4pIzsxAY5wroZdyQKyhXk0d8PCRZtrSZ2WEB1cBdrp2EgGBwHOGCZtIIPun/DL3+AykCv+J6fyRH4Q==} + requiresBuild: true + dependencies: + tslib: 2.6.2 + dev: false + optional: true + + /@types/debug@4.1.12: + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + dependencies: + '@types/ms': 0.7.34 + dev: false + + /@types/har-format@1.2.15: + resolution: {integrity: sha512-RpQH4rXLuvTXKR0zqHq3go0RVXYv/YVqv4TnPH95VbwUxZdQlK1EtcMvQvMpDngHbt13Csh9Z4qT9AbkiQH5BA==} + dev: false + + /@types/hast@2.3.9: + resolution: {integrity: sha512-pTHyNlaMD/oKJmS+ZZUyFUcsZeBZpC0lmGquw98CqRVNgAdJZJeD7GoeLiT6Xbx5rU9VCjSt0RwEvDgzh4obFw==} + dependencies: + '@types/unist': 2.0.10 + dev: false + + /@types/hast@3.0.3: + resolution: {integrity: sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==} + dependencies: + '@types/unist': 3.0.2 + dev: false + + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + dev: false + + /@types/mdast@3.0.15: + resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} + dependencies: + '@types/unist': 2.0.10 + dev: false + + /@types/mdast@4.0.3: + resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} + dependencies: + '@types/unist': 3.0.2 + dev: false + + /@types/ms@0.7.34: + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + dev: false + + /@types/node-fetch@2.6.11: + resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} + dependencies: + '@types/node': 20.11.8 + form-data: 4.0.0 + dev: false + + /@types/node-forge@1.3.11: + resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} + dependencies: + '@types/node': 20.11.8 + dev: true + + /@types/node@20.11.8: + resolution: {integrity: sha512-i7omyekpPTNdv4Jb/Rgqg0RU8YqLcNsI12quKSDkRXNfx7Wxdm6HhK1awT3xTgEkgxPn3bvnSpiEAc7a7Lpyow==} + dependencies: + undici-types: 5.26.5 + + /@types/semver@7.5.6: + resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} + dev: false + + /@types/unist@2.0.10: + resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} + dev: false + + /@types/unist@3.0.2: + resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + dev: false + + /@types/web-bluetooth@0.0.20: + resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} + dev: false + + /@types/ws@8.5.10: + resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} + dependencies: + '@types/node': 20.11.8 + dev: false + + /@typescript-eslint/eslint-plugin@6.19.1(@typescript-eslint/parser@6.19.1)(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-roQScUGFruWod9CEyoV5KlCYrubC/fvG8/1zXuT0WTcxX87GnMMmnksMwSg99lo1xiKrBzw2icsJPMAw1OtKxg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: optional: true - - /@cloudflare/workerd-windows-64@1.20231218.0: - resolution: - { - integrity: sha512-oN5hz6TXUDB5YKUN5N3QWAv6cYz9JjTZ9g16HVyoegVFEL6/zXU3tV19MBX2IvlE11ab/mRogEv9KXVIrHfKmA==, - } - engines: { node: ">=16" } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 6.19.1(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/scope-manager': 6.19.1 + '@typescript-eslint/type-utils': 6.19.1(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/utils': 6.19.1(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 6.19.1 + debug: 4.3.4 + eslint: 8.56.0 + graphemer: 1.4.0 + ignore: 5.3.0 + natural-compare: 1.4.0 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/parser@6.19.1(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-WEfX22ziAh6pRE9jnbkkLGp/4RhTpffr2ZK5bJ18M8mIfA8A+k97U9ZyaXCEJRlmMHh7R9MJZWXp/r73DzINVQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: optional: true - - /@cloudflare/workers-types@4.20240117.0: - resolution: - { - integrity: sha512-HQU8lJhaJVh8gQXFtVA7lZwd0hK1ckIFjRuxOXkVN2Z9t7DtzNbA2YTwBry5thKNgF5EwjN4THjHg5NUZzj05A==, - } - - /@codemirror/autocomplete@6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1): - resolution: - { - integrity: sha512-r4IjdYFthwbCQyvqnSlx0WBHRHi8nBvU+WjJxFUij81qsBfhNudf/XKKmmC2j3m0LaOYUQTf3qiEK1J8lO1sdg==, - } - peerDependencies: - "@codemirror/language": ^6.0.0 - "@codemirror/state": ^6.0.0 - "@codemirror/view": ^6.0.0 - "@lezer/common": ^1.0.0 - dependencies: - "@codemirror/language": 6.10.0 - "@codemirror/state": 6.4.0 - "@codemirror/view": 6.23.1 - "@lezer/common": 1.2.1 - dev: false - - /@codemirror/commands@6.3.3: - resolution: - { - integrity: sha512-dO4hcF0fGT9tu1Pj1D2PvGvxjeGkbC6RGcZw6Qs74TH+Ed1gw98jmUgd2axWvIZEqTeTuFrg1lEB1KV6cK9h1A==, - } - dependencies: - "@codemirror/language": 6.10.0 - "@codemirror/state": 6.4.0 - "@codemirror/view": 6.23.1 - "@lezer/common": 1.2.1 - dev: false - - /@codemirror/lang-css@6.2.1(@codemirror/view@6.23.1): - resolution: - { - integrity: sha512-/UNWDNV5Viwi/1lpr/dIXJNWiwDxpw13I4pTUAsNxZdg6E0mI2kTQb0P2iHczg1Tu+H4EBgJR+hYhKiHKko7qg==, - } - dependencies: - "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) - "@codemirror/language": 6.10.0 - "@codemirror/state": 6.4.0 - "@lezer/common": 1.2.1 - "@lezer/css": 1.1.7 - transitivePeerDependencies: - - "@codemirror/view" - dev: false - - /@codemirror/lang-html@6.4.8: - resolution: - { - integrity: sha512-tE2YK7wDlb9ZpAH6mpTPiYm6rhfdQKVDa5r9IwIFlwwgvVaKsCfuKKZoJGWsmMZIf3FQAuJ5CHMPLymOtg1hXw==, - } - dependencies: - "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) - "@codemirror/lang-css": 6.2.1(@codemirror/view@6.23.1) - "@codemirror/lang-javascript": 6.2.1 - "@codemirror/language": 6.10.0 - "@codemirror/state": 6.4.0 - "@codemirror/view": 6.23.1 - "@lezer/common": 1.2.1 - "@lezer/css": 1.1.7 - "@lezer/html": 1.3.8 - dev: false - - /@codemirror/lang-java@6.0.1: - resolution: - { - integrity: sha512-OOnmhH67h97jHzCuFaIEspbmsT98fNdhVhmA3zCxW0cn7l8rChDhZtwiwJ/JOKXgfm4J+ELxQihxaI7bj7mJRg==, - } - dependencies: - "@codemirror/language": 6.10.0 - "@lezer/java": 1.1.1 - dev: false - - /@codemirror/lang-javascript@6.2.1: - resolution: - { - integrity: sha512-jlFOXTejVyiQCW3EQwvKH0m99bUYIw40oPmFjSX2VS78yzfe0HELZ+NEo9Yfo1MkGRpGlj3Gnu4rdxV1EnAs5A==, - } - dependencies: - "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) - "@codemirror/language": 6.10.0 - "@codemirror/lint": 6.4.2 - "@codemirror/state": 6.4.0 - "@codemirror/view": 6.23.1 - "@lezer/common": 1.2.1 - "@lezer/javascript": 1.4.13 - dev: false - - /@codemirror/lang-json@6.0.1: - resolution: - { - integrity: sha512-+T1flHdgpqDDlJZ2Lkil/rLiRy684WMLc74xUnjJH48GQdfJo/pudlTRreZmKwzP8/tGdKf83wlbAdOCzlJOGQ==, - } - dependencies: - "@codemirror/language": 6.10.0 - "@lezer/json": 1.0.2 - dev: false - - /@codemirror/lang-python@6.1.3(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1): - resolution: - { - integrity: sha512-S9w2Jl74hFlD5nqtUMIaXAq9t5WlM0acCkyuQWUUSvZclk1sV+UfnpFiZzuZSG+hfEaOmxKR5UxY/Uxswn7EhQ==, - } - dependencies: - "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) - "@codemirror/language": 6.10.0 - "@lezer/python": 1.1.11 - transitivePeerDependencies: - - "@codemirror/state" - - "@codemirror/view" - - "@lezer/common" - dev: false - - /@codemirror/language@6.10.0: - resolution: - { - integrity: sha512-2vaNn9aPGCRFKWcHPFksctzJ8yS5p7YoaT+jHpc0UGKzNuAIx4qy6R5wiqbP+heEEdyaABA582mNqSHzSoYdmg==, - } - dependencies: - "@codemirror/state": 6.4.0 - "@codemirror/view": 6.23.1 - "@lezer/common": 1.2.1 - "@lezer/highlight": 1.2.0 - "@lezer/lr": 1.4.0 - style-mod: 4.1.0 - dev: false - - /@codemirror/legacy-modes@6.3.3: - resolution: - { - integrity: sha512-X0Z48odJ0KIoh/HY8Ltz75/4tDYc9msQf1E/2trlxFaFFhgjpVHjZ/BCXe1Lk7s4Gd67LL/CeEEHNI+xHOiESg==, - } - dependencies: - "@codemirror/language": 6.10.0 - dev: false - - /@codemirror/lint@6.4.2: - resolution: - { - integrity: sha512-wzRkluWb1ptPKdzlsrbwwjYCPLgzU6N88YBAmlZi8WFyuiEduSd05MnJYNogzyc8rPK7pj6m95ptUApc8sHKVA==, - } - dependencies: - "@codemirror/state": 6.4.0 - "@codemirror/view": 6.23.1 - crelt: 1.0.6 - dev: false - - /@codemirror/search@6.5.5: - resolution: - { - integrity: sha512-PIEN3Ke1buPod2EHbJsoQwlbpkz30qGZKcnmH1eihq9+bPQx8gelauUwLYaY4vBOuBAuEhmpDLii4rj/uO0yMA==, - } - dependencies: - "@codemirror/state": 6.4.0 - "@codemirror/view": 6.23.1 - crelt: 1.0.6 - dev: false - - /@codemirror/state@6.4.0: - resolution: - { - integrity: sha512-hm8XshYj5Fo30Bb922QX9hXB/bxOAVH+qaqHBzw5TKa72vOeslyGwd4X8M0c1dJ9JqxlaMceOQ8RsL9tC7gU0A==, - } - dev: false - - /@codemirror/view@6.23.1: - resolution: - { - integrity: sha512-J2Xnn5lFYT1ZN/5ewEoMBCmLlL71lZ3mBdb7cUEuHhX2ESoSrNEucpsDXpX22EuTGm9LOgC9v4Z0wx+Ez8QmGA==, - } - dependencies: - "@codemirror/state": 6.4.0 - style-mod: 4.1.0 - w3c-keyname: 2.2.8 - 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 - - /@drizzle-team/studio@0.0.39: - resolution: - { - integrity: sha512-c5Hkm7MmQC2n5qAsKShjQrHoqlfGslB8+qWzsGGZ+2dHMRTNG60UuzalF0h0rvBax5uzPXuGkYLGaQ+TUX3yMw==, - } - dependencies: - superjson: 2.2.1 - dev: true - - /@emnapi/core@0.45.0: - resolution: - { - integrity: sha512-DPWjcUDQkCeEM4VnljEOEcXdAD7pp8zSZsgOujk/LGIwCXWbXJngin+MO4zbH429lzeC3WbYLGjE2MaUOwzpyw==, - } - requiresBuild: true - dependencies: - tslib: 2.6.2 - dev: false + dependencies: + '@typescript-eslint/scope-manager': 6.19.1 + '@typescript-eslint/types': 6.19.1 + '@typescript-eslint/typescript-estree': 6.19.1(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 6.19.1 + debug: 4.3.4 + eslint: 8.56.0 + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/scope-manager@6.19.1: + resolution: {integrity: sha512-4CdXYjKf6/6aKNMSly/BP4iCSOpvMmqtDzRtqFyyAae3z5kkqEjKndR5vDHL8rSuMIIWP8u4Mw4VxLyxZW6D5w==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.19.1 + '@typescript-eslint/visitor-keys': 6.19.1 + dev: false + + /@typescript-eslint/type-utils@6.19.1(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-0vdyld3ecfxJuddDjACUvlAeYNrHP/pDeQk2pWBR2ESeEzQhg52DF53AbI9QCBkYE23lgkhLCZNkHn2hEXXYIg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: optional: true - - /@emnapi/runtime@0.45.0: - resolution: - { - integrity: sha512-Txumi3td7J4A/xTTwlssKieHKTGl3j4A1tglBx72auZ49YK7ePY6XZricgIg9mnZT4xPfA+UPCUdnhRuEFDL+w==, - } - requiresBuild: true - dependencies: - tslib: 2.6.2 - dev: false + dependencies: + '@typescript-eslint/typescript-estree': 6.19.1(typescript@5.3.3) + '@typescript-eslint/utils': 6.19.1(eslint@8.56.0)(typescript@5.3.3) + debug: 4.3.4 + eslint: 8.56.0 + ts-api-utils: 1.0.3(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/types@6.19.1: + resolution: {integrity: sha512-6+bk6FEtBhvfYvpHsDgAL3uo4BfvnTnoge5LrrCj2eJN8g3IJdLTD4B/jK3Q6vo4Ql/Hoip9I8aB6fF+6RfDqg==} + engines: {node: ^16.0.0 || >=18.0.0} + dev: false + + /@typescript-eslint/typescript-estree@6.19.1(typescript@5.3.3): + resolution: {integrity: sha512-aFdAxuhzBFRWhy+H20nYu19+Km+gFfwNO4TEqyszkMcgBDYQjmPJ61erHxuT2ESJXhlhrO7I5EFIlZ+qGR8oVA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: optional: 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/aix-ppc64@0.19.12: - resolution: - { - integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==, - } - engines: { node: ">=12" } - cpu: [ppc64] - os: [aix] - requiresBuild: true - dev: true + dependencies: + '@typescript-eslint/types': 6.19.1 + '@typescript-eslint/visitor-keys': 6.19.1 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/utils@6.19.1(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-JvjfEZuP5WoMqwh9SPAPDSHSg9FBHHGhjPugSRxu5jMfjvBpq5/sGTD+9M9aQ5sh6iJ8AY/Kk/oUYVEMAPwi7w==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.6 + '@typescript-eslint/scope-manager': 6.19.1 + '@typescript-eslint/types': 6.19.1 + '@typescript-eslint/typescript-estree': 6.19.1(typescript@5.3.3) + eslint: 8.56.0 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: false + + /@typescript-eslint/visitor-keys@6.19.1: + resolution: {integrity: sha512-gkdtIO+xSO/SmI0W68DBg4u1KElmIUo3vXzgHyGPs6cxgB0sa3TlptRAAE0hUY1hM6FcDKEv7aIwiTGm76cXfQ==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.19.1 + eslint-visitor-keys: 3.4.3 + dev: false + + /@uiw/codemirror-themes@4.21.21(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1): + resolution: {integrity: sha512-ljVcMGdaxo75UaH+EqxJ+jLyMVVgeSfW2AKyT1VeLy+4SDpuqNQ7wq5XVxktsG6LH+OvgSFndWXgPANf4+gQcA==} + peerDependencies: + '@codemirror/language': '>=6.0.0' + '@codemirror/state': '>=6.0.0' + '@codemirror/view': '>=6.0.0' + dependencies: + '@codemirror/language': 6.10.0 + '@codemirror/state': 6.4.0 + '@codemirror/view': 6.23.1 + dev: false + + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + /@unhead/dom@1.8.10: + resolution: {integrity: sha512-dBeDbHrBjeU+eVgMsD91TGEazb1dwLrY0x/ve01CldMCmm+WcRu++SUW7s1QX84mzGH2EgFz78o1OPn6jpV3zw==} + dependencies: + '@unhead/schema': 1.8.10 + '@unhead/shared': 1.8.10 + dev: false + + /@unhead/schema@1.8.10: + resolution: {integrity: sha512-cy8RGOPkwOVY5EmRoCgGV8AqLjy/226xBVTY54kBct02Om3hBdpB9FZa9frM910pPUXMI8PNmFgABO23O7IdJA==} + dependencies: + hookable: 5.5.3 + zhead: 2.2.4 + dev: false + + /@unhead/shared@1.8.10: + resolution: {integrity: sha512-pEFryAs3EmV+ShDQx2ZBwUnt5l3RrMrXSMZ50oFf+MImKZNARVvD4+3I8fEI9wZh+Zq0JYG3UAfzo51MUP+Juw==} + dependencies: + '@unhead/schema': 1.8.10 + dev: false + + /@vcarl/remark-headings@0.1.0: + resolution: {integrity: sha512-ffQxJUcapJ9Bk+fiGN49YJ9RaYMibrSTSezB1Fcrtu+0YSZxA3bsaLlIv1u/4sjPIeW/BKrs4xtMT3l3P9Ba5Q==} + dependencies: + mdast-util-to-string: 3.2.0 + unist-util-visit: 4.1.2 + dev: false + + /@vue/compiler-core@3.4.15: + resolution: {integrity: sha512-XcJQVOaxTKCnth1vCxEChteGuwG6wqnUHxAm1DO3gCz0+uXKaJNx8/digSz4dLALCy8n2lKq24jSUs8segoqIw==} + dependencies: + '@babel/parser': 7.23.9 + '@vue/shared': 3.4.15 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.0.2 + dev: false + + /@vue/compiler-dom@3.4.15: + resolution: {integrity: sha512-wox0aasVV74zoXyblarOM3AZQz/Z+OunYcIHe1OsGclCHt8RsRm04DObjefaI82u6XDzv+qGWZ24tIsRAIi5MQ==} + dependencies: + '@vue/compiler-core': 3.4.15 + '@vue/shared': 3.4.15 + dev: false + + /@vue/compiler-sfc@3.4.15: + resolution: {integrity: sha512-LCn5M6QpkpFsh3GQvs2mJUOAlBQcCco8D60Bcqmf3O3w5a+KWS5GvYbrrJBkgvL1BDnTp+e8q0lXCLgHhKguBA==} + dependencies: + '@babel/parser': 7.23.9 + '@vue/compiler-core': 3.4.15 + '@vue/compiler-dom': 3.4.15 + '@vue/compiler-ssr': 3.4.15 + '@vue/shared': 3.4.15 + estree-walker: 2.0.2 + magic-string: 0.30.5 + postcss: 8.4.33 + source-map-js: 1.0.2 + dev: false + + /@vue/compiler-ssr@3.4.15: + resolution: {integrity: sha512-1jdeQyiGznr8gjFDadVmOJqZiLNSsMa5ZgqavkPZ8O2wjHv0tVuAEsw5hTdUoUW4232vpBbL/wJhzVW/JwY1Uw==} + dependencies: + '@vue/compiler-dom': 3.4.15 + '@vue/shared': 3.4.15 + dev: false + + /@vue/reactivity@3.4.15: + resolution: {integrity: sha512-55yJh2bsff20K5O84MxSvXKPHHt17I2EomHznvFiJCAZpJTNW8IuLj1xZWMLELRhBK3kkFV/1ErZGHJfah7i7w==} + dependencies: + '@vue/shared': 3.4.15 + dev: false + + /@vue/runtime-core@3.4.15: + resolution: {integrity: sha512-6E3by5m6v1AkW0McCeAyhHTw+3y17YCOKG0U0HDKDscV4Hs0kgNT5G+GCHak16jKgcCDHpI9xe5NKb8sdLCLdw==} + dependencies: + '@vue/reactivity': 3.4.15 + '@vue/shared': 3.4.15 + dev: false + + /@vue/runtime-dom@3.4.15: + resolution: {integrity: sha512-EVW8D6vfFVq3V/yDKNPBFkZKGMFSvZrUQmx196o/v2tHKdwWdiZjYUBS+0Ez3+ohRyF8Njwy/6FH5gYJ75liUw==} + dependencies: + '@vue/runtime-core': 3.4.15 + '@vue/shared': 3.4.15 + csstype: 3.1.3 + dev: false + + /@vue/server-renderer@3.4.15(vue@3.4.15): + resolution: {integrity: sha512-3HYzaidu9cHjrT+qGUuDhFYvF/j643bHC6uUN9BgM11DVy+pM6ATsG6uPBLnkwOgs7BpJABReLmpL3ZPAsUaqw==} + peerDependencies: + vue: 3.4.15 + dependencies: + '@vue/compiler-ssr': 3.4.15 + '@vue/shared': 3.4.15 + vue: 3.4.15(typescript@5.3.3) + dev: false + + /@vue/shared@3.4.15: + resolution: {integrity: sha512-KzfPTxVaWfB+eGcGdbSf4CWdaXcGDqckoeXUh7SB3fZdEtzPCK2Vq9B/lRRL3yutax/LWITz+SwvgyOxz5V75g==} + dev: false + + /@vueuse/core@10.7.2(vue@3.4.15): + resolution: {integrity: sha512-AOyAL2rK0By62Hm+iqQn6Rbu8bfmbgaIMXcE3TSr7BdQ42wnSFlwIdPjInO62onYsEMK/yDMU8C6oGfDAtZ2qQ==} + dependencies: + '@types/web-bluetooth': 0.0.20 + '@vueuse/metadata': 10.7.2 + '@vueuse/shared': 10.7.2(vue@3.4.15) + vue-demi: 0.14.6(vue@3.4.15) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + dev: false + + /@vueuse/metadata@10.7.2: + resolution: {integrity: sha512-kCWPb4J2KGrwLtn1eJwaJD742u1k5h6v/St5wFe8Quih90+k2a0JP8BS4Zp34XUuJqS2AxFYMb1wjUL8HfhWsQ==} + dev: false + + /@vueuse/shared@10.7.2(vue@3.4.15): + resolution: {integrity: sha512-qFbXoxS44pi2FkgFjPvF4h7c9oMDutpyBdcJdMYIMg9XyXli2meFMuaKn+UMgsClo//Th6+beeCgqweT/79BVA==} + dependencies: + vue-demi: 0.14.6(vue@3.4.15) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + dev: false + + /@xmldom/xmldom@0.8.10: + resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==} + engines: {node: '>=10.0.0'} + dev: false + + /acorn-jsx@5.3.2(acorn@8.11.3): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.3 + + /acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + + /ajv-draft-04@1.0.0(ajv@8.12.0): + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: 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 + dependencies: + ajv: 8.12.0 + dev: false + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: false + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: false + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: false + + /as-table@1.0.55: + resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} + dependencies: + printable-characters: 1.0.42 + dev: true + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false + + /axios@1.6.7: + resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} + dependencies: + follow-redirects: 1.15.5 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + + /bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: false + + /better-sqlite3@9.3.0: + resolution: {integrity: sha512-ww73jVpQhRRdS9uMr761ixlkl4bWoXi8hMQlBGhoN6vPNlUHpIsNmw4pKN6kjknlt/wopdvXHvLk1W75BI+n0Q==} + 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 + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /call-me-maybe@1.0.2: + resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} + dev: false + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + /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 + + /ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + dev: false + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + + /character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + dev: false + + /character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + dev: false + + /character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + dev: false + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: false + + /class-variance-authority@0.7.0: + resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==} + dependencies: + clsx: 2.0.0 + dev: false + + /cli-color@2.0.3: + resolution: {integrity: sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==} + engines: {node: '>=0.10'} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-iterator: 2.0.3 + memoizee: 0.4.15 + timers-ext: 0.1.7 + dev: true + + /clsx@2.0.0: + resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} + engines: {node: '>=6'} + dev: false + + /codemirror@6.0.1(@lezer/common@1.2.1): + resolution: {integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==} + dependencies: + '@codemirror/autocomplete': 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) + '@codemirror/commands': 6.3.3 + '@codemirror/language': 6.10.0 + '@codemirror/lint': 6.4.2 + '@codemirror/search': 6.5.5 + '@codemirror/state': 6.4.0 + '@codemirror/view': 6.23.1 + transitivePeerDependencies: + - '@lezer/common' + dev: false + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: false + + /comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + dev: false + + /commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + /content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + dev: false + + /cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + dev: true + + /copy-anything@3.0.5: + resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} + engines: {node: '>=12.13'} + dependencies: + is-what: 4.1.16 + dev: true + + /crelt@1.0.6: + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + dev: false + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: false + + /csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + dev: false + + /cva@1.0.0-beta.1(typescript@5.3.3): + resolution: {integrity: sha512-gznFqTgERU9q4wg7jfgqtt34+RUt9S5t0xDAAEuDwQEAXEgjdDkKXpLLNjwSxsB4Ln/sqWJEH7yhE8Ny0mxd0w==} + peerDependencies: + typescript: '>= 4.5.5 < 6' + peerDependenciesMeta: + typescript: optional: true - - /@esbuild/android-arm64@0.18.20: - resolution: - { - integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==, - } - engines: { node: ">=12" } - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true + dependencies: + clsx: 2.0.0 + typescript: 5.3.3 + dev: false + + /d@1.0.1: + resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} + 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 + + /data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + dev: false + + /dayjs@1.11.10: + resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} + dev: false + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: optional: true - - /@esbuild/android-arm64@0.19.12: - resolution: - { - integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==, - } - engines: { node: ">=12" } - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true + dependencies: + ms: 2.1.2 + + /decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + dependencies: + character-entities: 2.0.2 + dev: false + + /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==} + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: false + + /dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + dev: false + + /detect-libc@2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + engines: {node: '>=8'} + dev: false + + /devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + dependencies: + dequal: 2.0.3 + dev: false + + /difflib@0.2.4: + resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} + dependencies: + heap: 0.2.7 + dev: true + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: false + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + + /dotenv@16.4.1: + resolution: {integrity: sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ==} + engines: {node: '>=12'} + dev: true + + /dreamopt@0.8.0: + resolution: {integrity: sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==} + engines: {node: '>=0.4.0'} + dependencies: + wordwrap: 1.0.0 + dev: true + + /drizzle-kit@0.20.13: + resolution: {integrity: sha512-j9oZSQXNWG+KBJm0Sg3S/zJpncHGKnpqNfFuM4NUxUMGTcihDHhP9SW6Jncqwb5vsP1Xm0a8JLm3PZUIspC/oA==} + hasBin: true + dependencies: + '@drizzle-team/studio': 0.0.39 + '@esbuild-kit/esm-loader': 2.6.5 + camelcase: 7.0.1 + chalk: 5.3.0 + commander: 9.5.0 + env-paths: 3.0.0 + esbuild: 0.19.12 + esbuild-register: 3.5.0(esbuild@0.19.12) + glob: 8.1.0 + hanji: 0.0.5 + json-diff: 0.9.0 + minimatch: 7.4.6 + semver: 7.5.4 + zod: 3.22.4 + transitivePeerDependencies: + - supports-color + dev: true + + /drizzle-orm@0.29.3(@cloudflare/workers-types@4.20240117.0)(@libsql/client@0.4.0)(better-sqlite3@9.3.0): + resolution: {integrity: sha512-uSE027csliGSGYD0pqtM+SAQATMREb3eSM/U8s6r+Y0RFwTKwftnwwSkqx3oS65UBgqDOM0gMTl5UGNpt6lW0A==} + 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/react': '>=18' + '@types/sql.js': '*' + '@vercel/postgres': '*' + better-sqlite3: '>=7' + bun-types: '*' + expo-sqlite: '>=13.2.0' + knex: '*' + kysely: '*' + mysql2: '>=2' + pg: '>=8' + postgres: '>=3' + react: '>=18' + sql.js: '>=1' + sqlite3: '>=5' + peerDependenciesMeta: + '@aws-sdk/client-rds-data': optional: true - - /@esbuild/android-arm@0.17.19: - resolution: - { - integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==, - } - engines: { node: ">=12" } - cpu: [arm] - os: [android] - requiresBuild: true - dev: true + '@cloudflare/workers-types': 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 + '@libsql/client': optional: true - - /@esbuild/android-arm@0.19.12: - resolution: - { - integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==, - } - engines: { node: ">=12" } - cpu: [arm] - os: [android] - requiresBuild: true - dev: true + '@neondatabase/serverless': 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 + '@opentelemetry/api': 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 + '@planetscale/database': optional: true - - /@esbuild/android-x64@0.19.12: - resolution: - { - integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [android] - requiresBuild: true - dev: true + '@types/better-sqlite3': optional: true - - /@esbuild/darwin-arm64@0.17.19: - resolution: - { - integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==, - } - engines: { node: ">=12" } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true + '@types/pg': 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 + '@types/react': optional: true - - /@esbuild/darwin-arm64@0.19.12: - resolution: - { - integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==, - } - engines: { node: ">=12" } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true + '@types/sql.js': 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 + '@vercel/postgres': optional: true - - /@esbuild/darwin-x64@0.18.20: - resolution: - { - integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true + better-sqlite3: optional: true - - /@esbuild/darwin-x64@0.19.12: - resolution: - { - integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true + bun-types: 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 + expo-sqlite: 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 + knex: optional: true - - /@esbuild/freebsd-arm64@0.19.12: - resolution: - { - integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==, - } - engines: { node: ">=12" } - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true + kysely: 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 + mysql2: optional: true - - /@esbuild/freebsd-x64@0.18.20: - resolution: - { - integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true + pg: optional: true - - /@esbuild/freebsd-x64@0.19.12: - resolution: - { - integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true + postgres: 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 + react: 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 + sql.js: optional: true - - /@esbuild/linux-arm64@0.19.12: - resolution: - { - integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==, - } - engines: { node: ">=12" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + sqlite3: 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 + dependencies: + '@cloudflare/workers-types': 4.20240117.0 + '@libsql/client': 0.4.0 + better-sqlite3: 9.3.0 + dev: false + + /drizzle-zod@0.5.1(drizzle-orm@0.29.3)(zod@3.22.4): + resolution: {integrity: sha512-C/8bvzUH/zSnVfwdSibOgFjLhtDtbKYmkbPbUCq46QZyZCH6kODIMSOgZ8R7rVjoI+tCj3k06MRJMDqsIeoS4A==} + peerDependencies: + drizzle-orm: '>=0.23.13' + zod: '*' + dependencies: + drizzle-orm: 0.29.3(@cloudflare/workers-types@4.20240117.0)(@libsql/client@0.4.0)(better-sqlite3@9.3.0) + zod: 3.22.4 + dev: false + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: false + + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: false + + /env-paths@3.0.0: + resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + 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.19.12): + resolution: {integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==} + peerDependencies: + esbuild: '>=0.12 <1' + dependencies: + debug: 4.3.4 + esbuild: 0.19.12 + 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 + + /esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 + dev: true + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + /escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + dev: false + + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + /eslint@8.56.0: + resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.56.0 + '@humanwhocodes/config-array': 0.11.14 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + eslint-visitor-keys: 3.4.3 + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: false + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + /estree-walker@0.6.1: + resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} + dev: true + + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: false + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + /event-emitter@0.3.5: + resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + dev: true + + /exit-hook@2.2.1: + resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} + engines: {node: '>=6'} + dev: true + + /expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + dev: false + + /ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + dependencies: + type: 2.7.2 + dev: true + + /extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + dev: false + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: false + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + /fastq@1.17.0: + resolution: {integrity: sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==} + dependencies: + reusify: 1.0.4 + + /fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.2 + dev: false + + /fetch-retry@5.0.6: + resolution: {integrity: sha512-3yurQZ2hD9VISAhJJP9bpYFNQrHHBXE2JxxjY5aLEcDi46RmAzJE2OC9FAde0yis5ElW0jTTzs0zfg/Cca4XqQ==} + dev: false + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.2.0 + + /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'} + dependencies: + to-regex-range: 5.0.1 + + /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 + + /flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.9 + keyv: 4.5.4 + rimraf: 3.0.2 + + /flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + + /follow-redirects@1.15.5: + resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: 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 + dev: false + + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + + /formdata-node@4.4.1: + resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} + engines: {node: '>= 12.20'} + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 4.0.0-beta.3 + dev: false + + /formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + dependencies: + fetch-blob: 3.2.0 + dev: false + + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: false + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: true + + /fuse.js@6.6.2: + resolution: {integrity: sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==} + engines: {node: '>=10'} + dev: false + + /get-own-enumerable-property-symbols@3.0.2: + resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} + dev: false + + /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-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 + + /github-slugger@1.5.0: + resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} + dev: false + + /github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + dev: false + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + + /glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + dev: true + + /globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.0 + merge2: 1.4.1 + slash: 3.0.0 + dev: false + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + /hanji@0.0.5: + resolution: {integrity: sha512-Abxw1Lq+TnYiL4BueXqMau222fPSPMFtya8HdpWsz/xVAhifXou71mPh/kY2+08RgFcVccjG3uZHs6K5HAe3zw==} + dependencies: + lodash.throttle: 4.1.1 + sisteransi: 1.0.5 + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: true + + /hast-util-embedded@3.0.0: + resolution: {integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==} + dependencies: + '@types/hast': 3.0.3 + hast-util-is-element: 3.0.0 + dev: false + + /hast-util-from-parse5@8.0.1: + resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} + dependencies: + '@types/hast': 3.0.3 + '@types/unist': 3.0.2 + devlop: 1.1.0 + hastscript: 8.0.0 + property-information: 6.4.1 + vfile: 6.0.1 + vfile-location: 5.0.2 + web-namespaces: 2.0.1 + dev: false + + /hast-util-has-property@2.0.1: + resolution: {integrity: sha512-X2+RwZIMTMKpXUzlotatPzWj8bspCymtXH3cfG3iQKV+wPF53Vgaqxi/eLqGck0wKq1kS9nvoB1wchbCPEL8sg==} + dev: false + + /hast-util-has-property@3.0.0: + resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} + dependencies: + '@types/hast': 3.0.3 + dev: false + + /hast-util-heading-rank@2.1.1: + resolution: {integrity: sha512-iAuRp+ESgJoRFJbSyaqsfvJDY6zzmFoEnL1gtz1+U8gKtGGj1p0CVlysuUAUjq95qlZESHINLThwJzNGmgGZxA==} + dependencies: + '@types/hast': 2.3.9 + dev: false + + /hast-util-is-body-ok-link@3.0.0: + resolution: {integrity: sha512-VFHY5bo2nY8HiV6nir2ynmEB1XkxzuUffhEGeVx7orbu/B1KaGyeGgMZldvMVx5xWrDlLLG/kQ6YkJAMkBEx0w==} + dependencies: + '@types/hast': 3.0.3 + dev: false + + /hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + dependencies: + '@types/hast': 3.0.3 + dev: false + + /hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + dependencies: + '@types/hast': 3.0.3 + dev: false + + /hast-util-phrasing@3.0.1: + resolution: {integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==} + dependencies: + '@types/hast': 3.0.3 + hast-util-embedded: 3.0.0 + hast-util-has-property: 3.0.0 + hast-util-is-body-ok-link: 3.0.0 + hast-util-is-element: 3.0.0 + dev: false + + /hast-util-raw@9.0.2: + resolution: {integrity: sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA==} + dependencies: + '@types/hast': 3.0.3 + '@types/unist': 3.0.2 + '@ungap/structured-clone': 1.2.0 + hast-util-from-parse5: 8.0.1 + hast-util-to-parse5: 8.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.1.0 + parse5: 7.1.2 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + dev: false + + /hast-util-sanitize@5.0.1: + resolution: {integrity: sha512-IGrgWLuip4O2nq5CugXy4GI2V8kx4sFVy5Hd4vF7AR2gxS0N9s7nEAVUyeMtZKZvzrxVsHt73XdTsno1tClIkQ==} + dependencies: + '@types/hast': 3.0.3 + '@ungap/structured-clone': 1.2.0 + unist-util-position: 5.0.0 + dev: false + + /hast-util-to-html@9.0.0: + resolution: {integrity: sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw==} + dependencies: + '@types/hast': 3.0.3 + '@types/unist': 3.0.2 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-raw: 9.0.2 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.1.0 + property-information: 6.4.1 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.3 + zwitch: 2.0.4 + dev: false + + /hast-util-to-parse5@8.0.0: + resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + dependencies: + '@types/hast': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 6.4.1 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + dev: false + + /hast-util-to-string@2.0.0: + resolution: {integrity: sha512-02AQ3vLhuH3FisaMM+i/9sm4OXGSq1UhOOCpTLLQtHdL3tZt7qil69r8M8iDkZYyC0HCFylcYoP+8IO7ddta1A==} + dependencies: + '@types/hast': 2.3.9 + dev: false + + /hast-util-to-text@4.0.0: + resolution: {integrity: sha512-EWiE1FSArNBPUo1cKWtzqgnuRQwEeQbQtnFJRYV1hb1BWDgrAlBU0ExptvZMM/KSA82cDpm2sFGf3Dmc5Mza3w==} + dependencies: + '@types/hast': 3.0.3 + '@types/unist': 3.0.2 + hast-util-is-element: 3.0.0 + unist-util-find-after: 5.0.0 + dev: false + + /hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + dependencies: + '@types/hast': 3.0.3 + dev: false + + /hastscript@8.0.0: + resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} + dependencies: + '@types/hast': 3.0.3 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 6.4.1 + space-separated-tokens: 2.0.2 + dev: false + + /heap@0.2.7: + resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} + dev: true + + /highlight.js@11.9.0: + resolution: {integrity: sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==} + engines: {node: '>=12.0.0'} + dev: false + + /hono@3.12.8: + resolution: {integrity: sha512-vnOEIRdqsp4uHE/dkOBr9EYmTsR86sD/FyG2xhfAQzR9udDRglN1nuO7SGc/7U3HfSorc6PSCNGN6upnVtCmfg==} + engines: {node: '>=16.0.0'} + dev: false + + /hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + dev: false + + /html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + dev: false + + /html-whitespace-sensitive-tag-names@3.0.0: + resolution: {integrity: sha512-KlClZ3/Qy5UgvpvVvDomGhnQhNWH5INE8GwvSIQ9CWt1K0zbbXrl7eN5bWaafOZgtmO3jMPwUqmrmEwinhPq1w==} + dev: false + + /httpsnippet-lite@3.0.5: + resolution: {integrity: sha512-So4qTXY5iFj5XtFDwyz2PicUu+8NWrI8e8h+ZeZoVtMNcFQp4FFIntBHUE+JPUG6QQU8o1VHCy+X4ETRDwt9CA==} + engines: {node: '>=14.13'} + dependencies: + '@types/har-format': 1.2.15 + formdata-node: 4.4.1 + stringify-object: 3.3.0 + dev: false + + /husky@9.0.6: + resolution: {integrity: sha512-EEuw/rfTiMjOfuL7pGO/i9otg1u36TXxqjIA6D9qxVjd/UXoDOsLor/BSFf5hTK50shwzCU3aVVwdXDp/lp7RA==} + engines: {node: '>=18'} + hasBin: true + dev: true + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: false + + /ignore@5.3.0: + resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} + engines: {node: '>= 4'} + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: false + + /is-absolute-url@4.0.1: + resolution: {integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + dev: false + + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + dependencies: + hasown: 2.0.0 + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + /is-obj@1.0.1: + resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} + engines: {node: '>=0.10.0'} + dev: false + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + /is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + dev: false + + /is-promise@2.2.2: + resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + dev: true + + /is-regexp@1.0.0: + resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} + engines: {node: '>=0.10.0'} + dev: false + + /is-what@4.1.16: + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} + engines: {node: '>=12.13'} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + /javascript-time-ago@2.5.9: + resolution: {integrity: sha512-pQ8mNco/9g9TqWXWWjP0EWl6i/lAQScOyEeXy5AB+f7MfLSdgyV9BJhiOD1zrIac/lrxPYOWNbyl/IW8CW5n0A==} + dependencies: + relative-time-format: 1.1.6 + dev: false + + /js-base64@3.7.6: + resolution: {integrity: sha512-NPrWuHFxFUknr1KqJRDgUQPexQF0uIJWjeT+2KjEePhitQxQEx5EJBG1lVn5/hc8aLycTpXrDOgPQ6Zq+EDiTA==} + dev: false + + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: false + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + /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-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: false + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + /libsql@0.2.0: + resolution: {integrity: sha512-ELBRqhpJx5Dap0187zKQnntZyk4EjlDHSrjIVL8t+fQ5e8IxbQTeYgZgigMjB1EvrETdkm0Y0VxBGhzPQ+t0Jg==} + cpu: [x64, arm64] + os: [darwin, linux, win32] + dependencies: + '@neon-rs/load': 0.0.4 + detect-libc: 2.0.2 + optionalDependencies: + '@libsql/darwin-arm64': 0.2.0 + '@libsql/darwin-x64': 0.2.0 + '@libsql/linux-arm64-gnu': 0.2.0 + '@libsql/linux-arm64-musl': 0.2.0 + '@libsql/linux-x64-gnu': 0.2.0 + '@libsql/linux-x64-musl': 0.2.0 + '@libsql/win32-x64-msvc': 0.2.0 + dev: false + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + /lodash.throttle@4.1.1: + resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + dev: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: false + + /longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + dev: false + + /lowlight@3.1.0: + resolution: {integrity: sha512-CEbNVoSikAxwDMDPjXlqlFYiZLkDJHwyGu/MfOsJnF3d7f3tds5J3z8s/l9TMXhzfsJCCJEAsD78842mwmg0PQ==} + dependencies: + '@types/hast': 3.0.3 + devlop: 1.1.0 + highlight.js: 11.9.0 + dev: false + + /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 + + /lucia@3.0.0: + resolution: {integrity: sha512-60NQqjKuaqPrjHL10CQ1j3rQy8qwKd3XpSNNnNcZyZI+4w1QFJdtNcR4l0dZJ4kJ0DdwI/943yplL47V7IZbGQ==} + dependencies: + oslo: 1.0.1 + dev: false + + /magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /magic-string@0.30.5: + resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: false + + /markdown-table@3.0.3: + resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + dev: false + + /mdast-util-find-and-replace@3.0.1: + resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} + dependencies: + '@types/mdast': 4.0.3 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + dev: false + + /mdast-util-from-markdown@2.0.0: + resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} + dependencies: + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-decode-string: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-autolink-literal@2.0.0: + resolution: {integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==} + dependencies: + '@types/mdast': 4.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.1 + micromark-util-character: 2.0.1 + dev: false + + /mdast-util-gfm-footnote@2.0.0: + resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} + dependencies: + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + micromark-util-normalize-identifier: 2.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + dependencies: + '@types/mdast': 4.0.3 + devlop: 1.1.0 + markdown-table: 3.0.3 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + dependencies: + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm@3.0.0: + resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} + dependencies: + mdast-util-from-markdown: 2.0.0 + mdast-util-gfm-autolink-literal: 2.0.0 + mdast-util-gfm-footnote: 2.0.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-phrasing@4.0.0: + resolution: {integrity: sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==} + dependencies: + '@types/mdast': 4.0.3 + unist-util-is: 6.0.0 + dev: false + + /mdast-util-to-hast@13.1.0: + resolution: {integrity: sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==} + dependencies: + '@types/hast': 3.0.3 + '@types/mdast': 4.0.3 + '@ungap/structured-clone': 1.2.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.0 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + dev: false + + /mdast-util-to-markdown@2.1.0: + resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + dependencies: + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.0.0 + mdast-util-to-string: 4.0.0 + micromark-util-decode-string: 2.0.0 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + dev: false + + /mdast-util-to-string@3.2.0: + resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} + dependencies: + '@types/mdast': 3.0.15 + dev: false + + /mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + dependencies: + '@types/mdast': 4.0.3 + 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 + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: false + + /micromark-core-commonmark@2.0.0: + resolution: {integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==} + dependencies: + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-factory-destination: 2.0.0 + micromark-factory-label: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-factory-title: 2.0.0 + micromark-factory-whitespace: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-html-tag-name: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-subtokenize: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-autolink-literal@2.0.0: + resolution: {integrity: sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==} + dependencies: + micromark-util-character: 2.0.1 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-footnote@2.0.0: + resolution: {integrity: sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==} + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==} + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-table@2.0.0: + resolution: {integrity: sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==} + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + dependencies: + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-task-list-item@2.0.1: + resolution: {integrity: sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==} + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + dependencies: + micromark-extension-gfm-autolink-literal: 2.0.0 + micromark-extension-gfm-footnote: 2.0.0 + micromark-extension-gfm-strikethrough: 2.0.0 + micromark-extension-gfm-table: 2.0.0 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.0.1 + micromark-util-combine-extensions: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-destination@2.0.0: + resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + dependencies: + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-label@2.0.0: + resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-space@2.0.0: + resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + dependencies: + micromark-util-character: 2.0.1 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-title@2.0.0: + resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-whitespace@2.0.0: + resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-character@2.0.1: + resolution: {integrity: sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==} + dependencies: + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-chunked@2.0.0: + resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + dependencies: + micromark-util-symbol: 2.0.0 + dev: false + + /micromark-util-classify-character@2.0.0: + resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + dependencies: + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-combine-extensions@2.0.0: + resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + dependencies: + micromark-util-chunked: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-decode-numeric-character-reference@2.0.1: + resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + dependencies: + micromark-util-symbol: 2.0.0 + dev: false + + /micromark-util-decode-string@2.0.0: + resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-symbol: 2.0.0 + dev: false + + /micromark-util-encode@2.0.0: + resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + dev: false + + /micromark-util-html-tag-name@2.0.0: + resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} + dev: false + + /micromark-util-normalize-identifier@2.0.0: + resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + dependencies: + micromark-util-symbol: 2.0.0 + dev: false + + /micromark-util-resolve-all@2.0.0: + resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + dependencies: + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-sanitize-uri@2.0.0: + resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + dependencies: + micromark-util-character: 2.0.1 + micromark-util-encode: 2.0.0 + micromark-util-symbol: 2.0.0 + dev: false + + /micromark-util-subtokenize@2.0.0: + resolution: {integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==} + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-symbol@2.0.0: + resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + dev: false + + /micromark-util-types@2.0.0: + resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + dev: false + + /micromark@4.0.0: + resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + dependencies: + '@types/debug': 4.1.12 + debug: 4.3.4 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-chunked: 2.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-encode: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-subtokenize: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: false + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: false + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: false + + /mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + dev: true + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: false + + /miniflare@3.20231218.4: + resolution: {integrity: sha512-2mpxvDiRBxGGGVnTKC0SZy0FtTXxFs3tM1ol67EoIJABGzvWFf33GThwh+/dRmaHSjKKId/FI8rEl5JxXXXZgQ==} + engines: {node: '>=16.13'} + hasBin: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + acorn: 8.11.3 + acorn-walk: 8.3.2 + capnp-ts: 0.7.0 + exit-hook: 2.2.1 + glob-to-regexp: 0.4.1 + stoppable: 1.1.0 + undici: 5.28.2 + workerd: 1.20231218.0 + ws: 8.16.0 + 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 + + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimatch@7.4.6: + resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: false + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: false + + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: false + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /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 + + /nanoid@5.0.4: + resolution: {integrity: sha512-vAjmBf13gsmhXSgBrtIclinISzFFy22WwCYoyilZlsrRXNIHSwgFQ1bEdjRwMT3aoadeIF6HMuDRlOxzfXV8ig==} + engines: {node: ^18 || >=20} + hasBin: true + dev: false + + /napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + dev: false + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + /next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + dev: true + + /node-abi@3.54.0: + resolution: {integrity: sha512-p7eGEiQil0YUV3ItH4/tBb781L5impVmmx2E9FRKF7d18XXzp4PGT2tdYMFY6wQqgxD0IwNZOiSJ0/K0fSi/OA==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 + dev: false + + /node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + dev: false + + /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 - - /@esbuild/linux-arm@0.19.12: - resolution: - { - integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==, - } - engines: { node: ">=12" } - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true + dependencies: + whatwg-url: 5.0.0 + dev: false + + /node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + dev: false + + /node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + + /openapi-types@12.1.3: + resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} + dev: false + + /openapi3-ts@4.2.1: + resolution: {integrity: sha512-KL1mKwkZii5ce+tb24KCUmQHyWB/oanG5fzUY35UB+wenWJv4Kr/IWBntpn5R8ODiJcxx13ZDophcpHnLGeIOw==} + dependencies: + yaml: 2.3.4 + + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + + /oslo@1.0.1: + resolution: {integrity: sha512-esfzZry+HfGgK/GCYkg7BRlLd3RH5aHa08wgLJPYjENXybi0BvXxGk0LbUj+lXfz2TkjPDHe4rB/o6JxRLHxBg==} + dependencies: + '@node-rs/argon2': 1.7.2 + '@node-rs/bcrypt': 1.9.2 + dev: false + + /oslo@1.0.2: + resolution: {integrity: sha512-yBoZN0sOL5eEngLR2tFMTk2YFBF7czq/3ASCTM0WizAnUTllVRetCAsmV2CMMfu699VIe7f6vhNgJ0bQ2ejedg==} + dependencies: + '@node-rs/argon2': 1.7.2 + '@node-rs/bcrypt': 1.9.2 + dev: false + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + + /parse-ms@3.0.0: + resolution: {integrity: sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==} + engines: {node: '>=12'} + dev: false + + /parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + dependencies: + entities: 4.5.0 + dev: false + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /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'} + dev: false + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: false + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + /postcss-nested@6.0.1(postcss@8.4.33): + resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.33 + postcss-selector-parser: 6.0.15 + dev: false + + /postcss-selector-parser@6.0.15: + resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: false + + /postcss@8.4.33: + resolution: {integrity: sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: false + + /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.54.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 + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + /prettier@3.2.4: + resolution: {integrity: sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==} + engines: {node: '>=14'} + hasBin: true + dev: false + + /pretty-bytes@6.1.1: + resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} + engines: {node: ^14.13.1 || >=16.0.0} + dev: false + + /pretty-ms@8.0.0: + resolution: {integrity: sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==} + engines: {node: '>=14.16'} + dependencies: + parse-ms: 3.0.0 + dev: false + + /printable-characters@1.0.42: + resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} + dev: true + + /property-information@6.4.1: + resolution: {integrity: sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==} + dev: false + + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + 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'} + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: false + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + dev: false + + /rehype-external-links@3.0.0: + resolution: {integrity: sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==} + dependencies: + '@types/hast': 3.0.3 + '@ungap/structured-clone': 1.2.0 + hast-util-is-element: 3.0.0 + is-absolute-url: 4.0.1 + space-separated-tokens: 2.0.2 + unist-util-visit: 5.0.0 + dev: false + + /rehype-format@5.0.0: + resolution: {integrity: sha512-kM4II8krCHmUhxrlvzFSptvaWh280Fr7UGNJU5DCMuvmAwGCNmGfi9CvFAQK6JDjsNoRMWQStglK3zKJH685Wg==} + dependencies: + '@types/hast': 3.0.3 + hast-util-embedded: 3.0.0 + hast-util-is-element: 3.0.0 + hast-util-phrasing: 3.0.1 + hast-util-whitespace: 3.0.0 + html-whitespace-sensitive-tag-names: 3.0.0 + rehype-minify-whitespace: 6.0.0 + unist-util-visit-parents: 6.0.1 + dev: false + + /rehype-highlight@7.0.0: + resolution: {integrity: sha512-QtobgRgYoQaK6p1eSr2SD1i61f7bjF2kZHAQHxeCHAuJf7ZUDMvQ7owDq9YTkmar5m5TSUol+2D3bp3KfJf/oA==} + dependencies: + '@types/hast': 3.0.3 + hast-util-to-text: 4.0.0 + lowlight: 3.1.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + dev: false + + /rehype-minify-whitespace@6.0.0: + resolution: {integrity: sha512-i9It4YHR0Sf3GsnlR5jFUKXRr9oayvEk9GKQUkwZv6hs70OH9q3OCZrq9PpLvIGKt3W+JxBOxCidNVpH/6rWdA==} + dependencies: + '@types/hast': 3.0.3 + hast-util-embedded: 3.0.0 + hast-util-is-element: 3.0.0 + hast-util-whitespace: 3.0.0 + unist-util-is: 6.0.0 + dev: false + + /rehype-sanitize@6.0.0: + resolution: {integrity: sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==} + dependencies: + '@types/hast': 3.0.3 + hast-util-sanitize: 5.0.1 + dev: false + + /rehype-slug-custom-id@1.1.0: + resolution: {integrity: sha512-lLdTHGd7u5bOXRDnD78/VHrVZsG63nN6lZUuQgcuupGt1+v+uDW7pCeQS0cvptRcZPYzg8B+0bf8sUiMBKsjZw==} + dependencies: + '@types/hast': 2.3.9 + github-slugger: 1.5.0 + hast-util-has-property: 2.0.1 + hast-util-heading-rank: 2.1.1 + hast-util-to-string: 2.0.0 + lodash: 4.17.21 + unified: 10.1.2 + unist-util-visit: 4.1.2 + dev: false + + /rehype-stringify@10.0.0: + resolution: {integrity: sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ==} + dependencies: + '@types/hast': 3.0.3 + hast-util-to-html: 9.0.0 + unified: 11.0.4 + dev: false + + /relative-time-format@1.1.6: + resolution: {integrity: sha512-aCv3juQw4hT1/P/OrVltKWLlp15eW1GRcwP1XdxHrPdZE9MtgqFpegjnTjLhi2m2WI9MT/hQQtE+tjEWG1hgkQ==} + dev: false + + /remark-gfm@4.0.0: + resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-gfm: 3.0.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-from-markdown: 2.0.0 + micromark-util-types: 2.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-rehype@11.1.0: + resolution: {integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==} + dependencies: + '@types/hast': 3.0.3 + '@types/mdast': 4.0.3 + mdast-util-to-hast: 13.1.0 + unified: 11.0.4 + vfile: 6.0.1 + dev: false + + /remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-to-markdown: 2.1.0 + unified: 11.0.4 + dev: false + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: false + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + /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'} + dev: true + + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + + /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. + 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 + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: false + + /selfsigned@2.4.1: + resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} + engines: {node: '>=10'} + dependencies: + '@types/node-forge': 1.3.11 + node-forge: 1.3.1 + dev: true + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: false + + /simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + 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: false + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: false + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + dev: true + + /space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + dev: false + + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: false + + /stacktracey@2.1.8: + resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==} + dependencies: + as-table: 1.0.55 + get-source: 2.0.12 + dev: true + + /stoppable@1.1.0: + resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} + engines: {node: '>=4', npm: '>=6'} + dev: true + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /stringify-entities@4.0.3: + resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + dev: false + + /stringify-object@3.3.0: + resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} + engines: {node: '>=4'} + dependencies: + get-own-enumerable-property-symbols: 3.0.2 + is-obj: 1.0.1 + is-regexp: 1.0.0 + dev: false + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /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'} + + /style-mod@4.1.0: + resolution: {integrity: sha512-Ca5ib8HrFn+f+0n4N4ScTIA9iTOQ7MaGS1ylHcoVqW9J7w2w8PzN6g9gKmTYgGEBH8e120+RCmhpje6jC5uGWA==} + dev: false + + /superjson@2.2.1: + resolution: {integrity: sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==} + engines: {node: '>=16'} + dependencies: + copy-anything: 3.0.5 + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /tailwind-merge@2.2.1: + resolution: {integrity: sha512-o+2GTLkthfa5YUt4JxPfzMIpQzZ3adD1vLVkvKE1Twl9UAhGsEbIZhHHZVRttyW177S8PDJI3bTQNaebyofK3Q==} + dependencies: + '@babel/runtime': 7.23.9 + dev: false + + /tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: false + + /tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + 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 + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + /timers-ext@0.1.7: + resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==} + dependencies: + es5-ext: 0.10.62 + next-tick: 1.1.0 + dev: true + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + dev: false + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: false + + /trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + dev: false + + /trough@2.1.0: + resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} + dev: false + + /ts-api-utils@1.0.3(typescript@5.3.3): + resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} + engines: {node: '>=16.13.0'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.3.3 + dev: false + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + /tsx@4.7.0: + resolution: {integrity: sha512-I+t79RYPlEYlHn9a+KzwrvEwhJg35h/1zHsLC2JXvhC2mdynMv6Zxzvhv5EMV6VF5qJlLlkSnMVvdZV3PSIGcg==} + engines: {node: '>=18.0.0'} + hasBin: true + dependencies: + esbuild: 0.19.12 + get-tsconfig: 4.7.2 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + /type@1.2.0: + resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} + dev: true + + /type@2.7.2: + resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} + dev: true + + /typescript@5.3.3: + resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + engines: {node: '>=14.17'} + hasBin: true + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + /undici@5.28.2: + resolution: {integrity: sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==} + engines: {node: '>=14.0'} + dependencies: + '@fastify/busboy': 2.1.0 + dev: true + + /unhead@1.8.10: + resolution: {integrity: sha512-dth8FvZkLriO5ZWWOBIYBNSfGiwJtKcqpPWpSOk/Z0e2jdlgwoZEWZHFyte0EKvmbZxKcsWNMqIuv7dEmS5yZQ==} + dependencies: + '@unhead/dom': 1.8.10 + '@unhead/schema': 1.8.10 + '@unhead/shared': 1.8.10 + hookable: 5.5.3 + dev: false + + /unified@10.1.2: + resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} + dependencies: + '@types/unist': 2.0.10 + bail: 2.0.2 + extend: 3.0.2 + is-buffer: 2.0.5 + is-plain-obj: 4.1.0 + trough: 2.1.0 + vfile: 5.3.7 + dev: false + + /unified@11.0.4: + resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} + dependencies: + '@types/unist': 3.0.2 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.1.0 + vfile: 6.0.1 + dev: false + + /unist-util-find-after@5.0.0: + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + dev: false + + /unist-util-is@5.2.1: + resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + dependencies: + '@types/unist': 2.0.10 + dev: false + + /unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + dependencies: + '@types/unist': 3.0.2 + dev: false + + /unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + dependencies: + '@types/unist': 3.0.2 + dev: false + + /unist-util-stringify-position@3.0.3: + resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + dependencies: + '@types/unist': 2.0.10 + dev: false + + /unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + dependencies: + '@types/unist': 3.0.2 + dev: false + + /unist-util-visit-parents@5.1.3: + resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + dependencies: + '@types/unist': 2.0.10 + unist-util-is: 5.2.1 + dev: false + + /unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + dev: false + + /unist-util-visit@4.1.2: + resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + dependencies: + '@types/unist': 2.0.10 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + dev: false + + /unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + dev: false + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: false + + /uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + dev: false + + /vfile-location@5.0.2: + resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} + dependencies: + '@types/unist': 3.0.2 + vfile: 6.0.1 + dev: false + + /vfile-message@3.1.4: + resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} + dependencies: + '@types/unist': 2.0.10 + unist-util-stringify-position: 3.0.3 + dev: false + + /vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + dependencies: + '@types/unist': 3.0.2 + unist-util-stringify-position: 4.0.0 + dev: false + + /vfile@5.3.7: + resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} + dependencies: + '@types/unist': 2.0.10 + is-buffer: 2.0.5 + unist-util-stringify-position: 3.0.3 + vfile-message: 3.1.4 + dev: false + + /vfile@6.0.1: + resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} + dependencies: + '@types/unist': 3.0.2 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + dev: false + + /vue-demi@0.14.6(vue@3.4.15): + resolution: {integrity: sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': optional: true - - /@esbuild/linux-ia32@0.17.19: - resolution: - { - integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==, - } - engines: { node: ">=12" } - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true + dependencies: + vue: 3.4.15(typescript@5.3.3) + dev: false + + /vue@3.4.15(typescript@5.3.3): + resolution: {integrity: sha512-jC0GH4KkWLWJOEQjOpkqU1bQsBwf4R1rsFtw5GQJbjHVKWDzO6P0nWWBTmjp1xSemAioDFj1jdaK1qa3DnMQoQ==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: optional: true - - /@esbuild/linux-ia32@0.18.20: - resolution: - { - integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==, - } - engines: { node: ">=12" } - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true + dependencies: + '@vue/compiler-dom': 3.4.15 + '@vue/compiler-sfc': 3.4.15 + '@vue/runtime-dom': 3.4.15 + '@vue/server-renderer': 3.4.15(vue@3.4.15) + '@vue/shared': 3.4.15 + typescript: 5.3.3 + dev: false + + /w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + dev: false + + /web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + dev: false + + /web-streams-polyfill@3.3.2: + resolution: {integrity: sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ==} + engines: {node: '>= 8'} + dev: false + + /web-streams-polyfill@4.0.0-beta.3: + resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} + engines: {node: '>= 14'} + dev: false + + /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@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + + /wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + dev: true + + /workerd@1.20231218.0: + resolution: {integrity: sha512-AGIsDvqCrcwhoA9kb1hxOhVAe53/xJeaGZxL4FbYI9FvO17DZwrnqGq+6eqItJ6Cfw1ZLmf3BM+QdMWaL2bFWQ==} + engines: {node: '>=16'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@cloudflare/workerd-darwin-64': 1.20231218.0 + '@cloudflare/workerd-darwin-arm64': 1.20231218.0 + '@cloudflare/workerd-linux-64': 1.20231218.0 + '@cloudflare/workerd-linux-arm64': 1.20231218.0 + '@cloudflare/workerd-windows-64': 1.20231218.0 + dev: true + + /wrangler@3.25.0: + resolution: {integrity: sha512-eU47Ez1QLu1B/wutm5ow+VwZnY4OqA+D/iy6BORAu5tABujoDr9p1yBxY/1DS/DxxDWqqY3sBBS6TzcC4NSLUQ==} + engines: {node: '>=16.17.0'} + hasBin: true + 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.20231218.4 + nanoid: 3.3.7 + path-to-regexp: 6.2.1 + resolve: 1.22.8 + resolve.exports: 2.0.2 + selfsigned: 2.4.1 + source-map: 0.6.1 + xxhash-wasm: 1.0.2 + optionalDependencies: + fsevents: 2.3.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /ws@8.16.0: + resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: optional: true - - /@esbuild/linux-ia32@0.19.12: - resolution: - { - integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==, - } - 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-loong64@0.19.12: - resolution: - { - integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==, - } - 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-mips64el@0.19.12: - resolution: - { - integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==, - } - 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-ppc64@0.19.12: - resolution: - { - integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==, - } - 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-riscv64@0.19.12: - resolution: - { - integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==, - } - 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-s390x@0.19.12: - resolution: - { - integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==, - } - 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/linux-x64@0.19.12: - resolution: - { - integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==, - } - 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/netbsd-x64@0.19.12: - resolution: - { - integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==, - } - 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/openbsd-x64@0.19.12: - resolution: - { - integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==, - } - 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/sunos-x64@0.19.12: - resolution: - { - integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==, - } - 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-arm64@0.19.12: - resolution: - { - integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==, - } - 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-ia32@0.19.12: - resolution: - { - integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==, - } - 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 - - /@esbuild/win32-x64@0.19.12: - resolution: - { - integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): - resolution: - { - integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.56.0 - eslint-visitor-keys: 3.4.3 - - /@eslint-community/regexpp@4.10.0: - resolution: - { - integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==, - } - engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } - - /@eslint/eslintrc@2.1.4: - resolution: - { - integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.0 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - /@eslint/js@8.56.0: - resolution: - { - integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - - /@fastify/busboy@2.1.0: - resolution: - { - integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==, - } - engines: { node: ">=14" } - dev: true - - /@floating-ui/core@1.6.0: - resolution: - { - integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==, - } - dependencies: - "@floating-ui/utils": 0.2.1 - dev: false - - /@floating-ui/dom@1.6.0: - resolution: - { - integrity: sha512-SZ0BEXzsaaS6THZfZJUcAobbZTD+MvfGM42bxgeg0Tnkp4/an/avqwAXiVLsFtIBZtfsx3Ymvwx0+KnnhdA/9g==, - } - dependencies: - "@floating-ui/core": 1.6.0 - "@floating-ui/utils": 0.2.1 - dev: false - - /@floating-ui/utils@0.2.1: - resolution: - { - integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==, - } - dev: false - - /@floating-ui/vue@1.0.5(vue@3.4.15): - resolution: - { - integrity: sha512-rXYI0JHLnAw5nTGNKTmH9tMxFWmZPEfkyexXzG/HchGsoL4f8lE7+bX43pVRXRBbmCWg0/j4d62Ui7acZBmUew==, - } - dependencies: - "@floating-ui/dom": 1.6.0 - "@floating-ui/utils": 0.2.1 - vue-demi: 0.14.6(vue@3.4.15) - transitivePeerDependencies: - - "@vue/composition-api" - - vue - dev: false - - /@headlessui/vue@1.7.17(vue@3.4.15): - resolution: - { - integrity: sha512-hmJChv8HzKorxd9F70RGnECAwZfkvmmwOqreuKLWY/19d5qbWnSdw+DNbuA/Uo6X5rb4U5B3NrT+qBKPmjhRqw==, - } - engines: { node: ">=10" } - peerDependencies: - vue: ^3.2.0 - dependencies: - "@tanstack/vue-virtual": 3.0.2(vue@3.4.15) - vue: 3.4.15(typescript@5.3.3) - dev: false - - /@hono/swagger-ui@0.2.1(hono@3.12.8): - resolution: - { - integrity: sha512-wBxVMRe3/v8xH4o6icmwztiIq0DG0s7+jHVMHVUAoFFCWEQNL2iskMmQtrhSDtsFmBZUeUFQUaaJ6Ir6DOmHLA==, - } - peerDependencies: - hono: "*" - dependencies: - hono: 3.12.8 - dev: false - - /@hono/zod-openapi@0.9.6(hono@3.12.8)(zod@3.22.4): - resolution: - { - integrity: sha512-MLF8xpd4fEwbEaylFqAt1qci4wOTXu3oq3BKb01trccapYfodP50VCO0YDNBQTyMT/Iapq6GMO4+RAIFBgG5WQ==, - } - engines: { node: ">=16.0.0" } - peerDependencies: - hono: ">=3.11.3" - zod: 3.* - dependencies: - "@asteasolutions/zod-to-openapi": 5.5.0(zod@3.22.4) - "@hono/zod-validator": 0.1.11(hono@3.12.8)(zod@3.22.4) - hono: 3.12.8 - zod: 3.22.4 - dev: false - - /@hono/zod-validator@0.1.11(hono@3.12.8)(zod@3.22.4): - resolution: - { - integrity: sha512-PQXeHUP0+36qpRt8yfeD7N2jbK3ETlGvSN6dMof/HwUC/APRokQRjpXZm4rrlG71Ft0aWE01+Bm4XejqPie5Uw==, - } - peerDependencies: - hono: ">=3.9.0" - zod: ^3.19.1 - dependencies: - hono: 3.12.8 - zod: 3.22.4 - dev: false - - /@humanwhocodes/config-array@0.11.14: - resolution: - { - integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==, - } - engines: { node: ">=10.10.0" } - dependencies: - "@humanwhocodes/object-schema": 2.0.2 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - /@humanwhocodes/module-importer@1.0.1: - resolution: - { - integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, - } - engines: { node: ">=12.22" } - - /@humanwhocodes/object-schema@2.0.2: - resolution: - { - integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==, - } - - /@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==, - } - - /@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 - - /@jsdevtools/ono@7.1.3: - resolution: - { - integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==, - } - dev: false - - /@lezer/common@1.2.1: - resolution: - { - integrity: sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==, - } - dev: false - - /@lezer/css@1.1.7: - resolution: - { - integrity: sha512-7BlFFAKNn/b39jJLrhdLSX5A2k56GIJvyLqdmm7UU+7XvequY084iuKDMAEhAmAzHnwDE8FK4OQtsIUssW91tg==, - } - dependencies: - "@lezer/common": 1.2.1 - "@lezer/highlight": 1.2.0 - "@lezer/lr": 1.4.0 - dev: false - - /@lezer/highlight@1.2.0: - resolution: - { - integrity: sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==, - } - dependencies: - "@lezer/common": 1.2.1 - dev: false - - /@lezer/html@1.3.8: - resolution: - { - integrity: sha512-EXseJ3pUzWxE6XQBQdqWHZqqlGQRSuNMBcLb6mZWS2J2v+QZhOObD+3ZIKIcm59ntTzyor4LqFTb72iJc3k23Q==, - } - dependencies: - "@lezer/common": 1.2.1 - "@lezer/highlight": 1.2.0 - "@lezer/lr": 1.4.0 - dev: false - - /@lezer/java@1.1.1: - resolution: - { - integrity: sha512-mt3dX13fRlpY7RlWELYRakanXgmwXsLRCrhstrn+c1sZd7jR2xle46/3heoxGd+oHxnuTnpoyXTyxcLJQs9+mQ==, - } - dependencies: - "@lezer/common": 1.2.1 - "@lezer/highlight": 1.2.0 - "@lezer/lr": 1.4.0 - dev: false - - /@lezer/javascript@1.4.13: - resolution: - { - integrity: sha512-5IBr8LIO3xJdJH1e9aj/ZNLE4LSbdsx25wFmGRAZsj2zSmwAYjx26JyU/BYOCpRQlu1jcv1z3vy4NB9+UkfRow==, - } - dependencies: - "@lezer/common": 1.2.1 - "@lezer/highlight": 1.2.0 - "@lezer/lr": 1.4.0 - dev: false - - /@lezer/json@1.0.2: - resolution: - { - integrity: sha512-xHT2P4S5eeCYECyKNPhr4cbEL9tc8w83SPwRC373o9uEdrvGKTZoJVAGxpOsZckMlEh9W23Pc72ew918RWQOBQ==, - } - dependencies: - "@lezer/common": 1.2.1 - "@lezer/highlight": 1.2.0 - "@lezer/lr": 1.4.0 - dev: false - - /@lezer/lr@1.4.0: - resolution: - { - integrity: sha512-Wst46p51km8gH0ZUmeNrtpRYmdlRHUpN1DQd3GFAyKANi8WVz8c2jHYTf1CVScFaCjQw1iO3ZZdqGDxQPRErTg==, - } - dependencies: - "@lezer/common": 1.2.1 - dev: false - - /@lezer/python@1.1.11: - resolution: - { - integrity: sha512-C3QeLCcdAKJDUOsYjfFP6a1wdn8jhUNX200bgFm8TpKH1eM2PlgYQS5ugw6E38qGeEx7CP21I1Q52SoybXt0OQ==, - } - dependencies: - "@lezer/common": 1.2.1 - "@lezer/highlight": 1.2.0 - "@lezer/lr": 1.4.0 - dev: false - - /@libsql/client@0.4.0: - resolution: - { - integrity: sha512-GjBHHxRMKomG2rLx6K8BYsDhk9jNcKXpkEOO7luPTCje4z41ogD0sCaBRcGbJw9h3HMVysCW5v70WmjQ4/FWpg==, - } - dependencies: - "@libsql/core": 0.4.0 - "@libsql/hrana-client": 0.5.6 - js-base64: 3.7.6 - libsql: 0.2.0 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - dev: false - - /@libsql/core@0.4.0: - resolution: - { - integrity: sha512-pQHyZI0aTBlBm08dpB+/SEqLDe5wlgiUY+VNXbCD8yZhXo30AGinyrDlKrtGW7luo0As4Y9v1befurJdLKbC0Q==, - } - dependencies: - js-base64: 3.7.6 - dev: false - - /@libsql/darwin-arm64@0.2.0: - resolution: - { - integrity: sha512-+qyT2W/n5CFH1YZWv2mxW4Fsoo4dX9Z9M/nvbQqZ7H84J8hVegvVAsIGYzcK8xAeMEcpU5yGKB1Y9NoDY4hOSQ==, - } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@libsql/darwin-x64@0.2.0: - resolution: - { - integrity: sha512-hwmO2mF1n8oDHKFrUju6Jv+n9iFtTf5JUK+xlnIE3Td0ZwGC/O1R/Z/btZTd9nD+vsvakC8SJT7/Q6YlWIkhEw==, - } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@libsql/hrana-client@0.5.6: - resolution: - { - integrity: sha512-mjQoAmejZ1atG+M3YR2ZW+rg6ceBByH/S/h17ZoYZkqbWrvohFhXyz2LFxj++ARMoY9m6w3RJJIRdJdmnEUlFg==, - } - dependencies: - "@libsql/isomorphic-fetch": 0.1.12 - "@libsql/isomorphic-ws": 0.1.5 - js-base64: 3.7.6 - node-fetch: 3.3.2 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - dev: false - - /@libsql/isomorphic-fetch@0.1.12: - resolution: - { - integrity: sha512-MRo4UcmjAGAa3ac56LoD5OE13m2p0lu0VEtZC2NZMcogM/jc5fU9YtMQ3qbPjFJ+u2BBjFZgMPkQaLS1dlMhpg==, - } - dependencies: - "@types/node-fetch": 2.6.11 - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding - dev: false - - /@libsql/isomorphic-ws@0.1.5: - resolution: - { - integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==, - } - dependencies: - "@types/ws": 8.5.10 - ws: 8.16.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: false - - /@libsql/linux-arm64-gnu@0.2.0: - resolution: - { - integrity: sha512-1w2lPXIYtnBaK5t/Ej5E8x7lPiE+jP3KATI/W4yei5Z/ONJh7jQW5PJ7sYU95vTME3hWEM1FXN6kvzcpFAte7w==, - } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@libsql/linux-arm64-musl@0.2.0: - resolution: - { - integrity: sha512-lkblBEJ7xuNiWNjP8DDq0rqoWccszfkUS7Efh5EjJ+GDWdCBVfh08mPofIZg0fZVLWQCY3j+VZCG1qZfATBizg==, - } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@libsql/linux-x64-gnu@0.2.0: - resolution: - { - integrity: sha512-+x/d289KeJydwOhhqSxKT+6MSQTCfLltzOpTzPccsvdt5fxg8CBi+gfvEJ4/XW23Sa+9bc7zodFP0i6MOlxX7w==, - } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@libsql/linux-x64-musl@0.2.0: - resolution: - { - integrity: sha512-5Xn0c5A6vKf9D1ASpgk7mef//FuY7t5Lktj/eiU4n3ryxG+6WTpqstTittJUgepVjcleLPYxIhQAYeYwTYH1IQ==, - } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@libsql/win32-x64-msvc@0.2.0: - resolution: - { - integrity: sha512-rpK+trBIpRST15m3cMYg5aPaX7kvCIottxY7jZPINkKAaScvfbn9yulU/iZUM9YtuK96Y1ZmvwyVIK/Y5DzoMQ==, - } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@lucia-auth/adapter-sqlite@3.0.0(@libsql/client@0.4.0)(better-sqlite3@9.3.0)(lucia@3.0.0): - resolution: - { - integrity: sha512-7XMfMMNziFOoqIq2u9W5Z+wo7G7lzNQfUh7wDlkIqKxJMSLtP6GKH+QpK+21X4ZY9dIDmiuiwqZmS3Q3CgpATw==, - } - peerDependencies: - "@libsql/client": ^0.3.0 - better-sqlite3: 8.x - 9.x - lucia: 3.x - peerDependenciesMeta: - "@libsql/client": - optional: true - better-sqlite3: - optional: true - dependencies: - "@libsql/client": 0.4.0 - better-sqlite3: 9.3.0 - lucia: 3.0.0 - dev: false - - /@napi-rs/wasm-runtime@0.1.1: - resolution: - { - integrity: sha512-ATj9ua659JgrkICjJscaeZdmPr44cb/KFjNWuD0N6pux0SpzaM7+iOuuK11mAnQM2N9q0DT4REu6NkL8ZEhopw==, - } - requiresBuild: true - dependencies: - "@emnapi/core": 0.45.0 - "@emnapi/runtime": 0.45.0 - "@tybys/wasm-util": 0.8.1 - dev: false - optional: true - - /@neon-rs/load@0.0.4: - resolution: - { - integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==, - } - dev: false - - /@node-rs/argon2-android-arm-eabi@1.7.2: - resolution: - { - integrity: sha512-WhW84XOzdR4AOGc4BJvIg5lCRVBL0pXp/PPCe8QCyWw493p7VdNCdYpr2xdtjS/0zImmY85HNB/6zpzjLRTT/A==, - } - engines: { node: ">= 10" } - cpu: [arm] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-android-arm64@1.7.2: - resolution: - { - integrity: sha512-CdtayHSMIyDuVhSYFirwA757c4foQuyTjpysgFJLHweP9C7uDiBf9WBYij+UyabpaCadJ0wPyK6Vakinvlk4/g==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-darwin-arm64@1.7.2: - resolution: - { - integrity: sha512-hUOhtgYHTEyzX5sgMZVdXunONOus2HWpWydF5D/RYJ1mZ76FXRnFpQE40DqbzisdPIraKdn40m7JqkPP7wqdyg==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-darwin-x64@1.7.2: - resolution: - { - integrity: sha512-lfs5HX+t542yUfcv6Aa/NeGD1nUCwyQNgnPEGcik71Ow6V13hkR1bHgmT1u3CHN4fBts0gW+DQEDsq1xlVgkvw==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-freebsd-x64@1.7.2: - resolution: - { - integrity: sha512-ROoF+4VaCBJUjddrTN1hjuqSl89ppRcjVXJscSPJjWzTlbzFmGGovJvIzUBmCr/Oq3yM1zKHj6MP9oRD5cB+/g==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-arm-gnueabihf@1.7.2: - resolution: - { - integrity: sha512-CBSB8KPI8LS74Bcz3dYaa2/khULutz4vSDvFWUERlSLX+mPdDhoZi6UPuUPPF9e01w8AbiK1YCqlLUTm3tIMfw==, - } - engines: { node: ">= 10" } - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-arm64-gnu@1.7.2: - resolution: - { - integrity: sha512-6LBTug6ZiWFakP3X3Nqs7ZTM03gmcSWX4YvEn20HhhQE5NDrsrw3zNqGj0cJiNzKKIMSDDuj7uGy+ITEfNo4CA==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-arm64-musl@1.7.2: - resolution: - { - integrity: sha512-KjhQ+ZPne29t9VRVeIif7JdKwQba+tM6CBNYBoJB1iON0CUKeqSQtZcHuTj9gkf2SNRG5bsU4ABcfxd0OKsKHg==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-x64-gnu@1.7.2: - resolution: - { - integrity: sha512-BQvp+iLtKqomHz4q5t1aKoni9osgvUDU5sZtHAlFm5dRTlGHnympcQVATRE5GHyH9C6MIM9W7P1kqEeCLGPolQ==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-x64-musl@1.7.2: - resolution: - { - integrity: sha512-yXJudpBZQ98g+lWaHn9EzZ5KsAyqRdlpub/K+5NP7gHehb8wzBRIFAejIHAG0fvzQEEc86VOnV2koWIVZxWAvw==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-wasm32-wasi@1.7.2: - resolution: - { - integrity: sha512-diXlVjJZY2GIV8ZDwUqXPhacXsFR0klGSv5D9f+XidwWXK4udtzDhkM/7N/Mb7h1HAWaxZ6IN9spYFjvWH1wqg==, - } - engines: { node: ">=14.0.0" } - cpu: [wasm32] - requiresBuild: true - dependencies: - "@napi-rs/wasm-runtime": 0.1.1 - dev: false - optional: true - - /@node-rs/argon2-win32-arm64-msvc@1.7.2: - resolution: - { - integrity: sha512-dhIBrY04P9nbmwzBpgERQDmmSu4YBZyeEE32t4TikMz5rQ07iaVC+JpGmtCBZoDIsLDHGC8cikENd3YEqpqIcA==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-win32-ia32-msvc@1.7.2: - resolution: - { - integrity: sha512-o1tfqr8gyALCzuxBoQfvhxkeYMaw/0H8Gmt7klTYyEIBvEFu7SD5qytXO9Px7t5420nZL/Wy5cflg3IB1s57Pg==, - } - engines: { node: ">= 10" } - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-win32-x64-msvc@1.7.2: - resolution: - { - integrity: sha512-v0h53XUc7hNgWiWi0qcMcHvj9/kwuItI9NwLK4C+gtzT3UB0cedhfIL8HFMKThMXasy41ZdbpCF2Bi0kJoLNEg==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2@1.7.2: - resolution: - { - integrity: sha512-+H6pc3M1vIX9YnG59YW7prHhhpv19P8YyxlXHnnFzTimf2q+kKDF7mGWbhvN9STqIY+P70Patn0Q6qb6Ib5/4g==, - } - engines: { node: ">= 10" } - optionalDependencies: - "@node-rs/argon2-android-arm-eabi": 1.7.2 - "@node-rs/argon2-android-arm64": 1.7.2 - "@node-rs/argon2-darwin-arm64": 1.7.2 - "@node-rs/argon2-darwin-x64": 1.7.2 - "@node-rs/argon2-freebsd-x64": 1.7.2 - "@node-rs/argon2-linux-arm-gnueabihf": 1.7.2 - "@node-rs/argon2-linux-arm64-gnu": 1.7.2 - "@node-rs/argon2-linux-arm64-musl": 1.7.2 - "@node-rs/argon2-linux-x64-gnu": 1.7.2 - "@node-rs/argon2-linux-x64-musl": 1.7.2 - "@node-rs/argon2-wasm32-wasi": 1.7.2 - "@node-rs/argon2-win32-arm64-msvc": 1.7.2 - "@node-rs/argon2-win32-ia32-msvc": 1.7.2 - "@node-rs/argon2-win32-x64-msvc": 1.7.2 - dev: false - - /@node-rs/bcrypt-android-arm-eabi@1.9.2: - resolution: - { - integrity: sha512-er/Q2khwpan9pczvTTqY/DJE4UU65u31xd0NkZlHUTKyB7djRhWfzoGexGx2GN+k831/RR3U8kKE/8QUHeO3hQ==, - } - engines: { node: ">= 10" } - cpu: [arm] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-android-arm64@1.9.2: - resolution: - { - integrity: sha512-OUYatOEG5vbLbF73q2TC8UqrDO81zUQxnaFD/OAB1hcm6J+ur0zJ8E53c35/DIqkTp7JarPMraC4rouJ2ugN4w==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-darwin-arm64@1.9.2: - resolution: - { - integrity: sha512-svJKsGbzMAxOB5oluOYneN4YkKUy26WSMgm3KOIhgoX30IeMilj+2jFN/5qrI0oDZ0Iczb3XyL5DuZFtEkdP8A==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-darwin-x64@1.9.2: - resolution: - { - integrity: sha512-9OrySjBi/rWix8NZWD/TrNbNcwMY0pAiMHdL09aJnJ07uPih83GGh1pq4UHCYFCMy7iTX8swOmDlGBUImkOZbg==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-freebsd-x64@1.9.2: - resolution: - { - integrity: sha512-/djXV71RO6g5L1mI2pVvmp3x3pH7G4uKI3ODG1JBIXoz334oOcCMh40sB0uq0ljP8WEadker01p4T1rJE98fpg==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-arm-gnueabihf@1.9.2: - resolution: - { - integrity: sha512-F7wP950OTAooxEleUN4I2hqryGZK7hi1cSgRF13Wvbc597RFux35KiSxIXUA3mNt2DE7lV2PeceEtCOScaThWQ==, - } - engines: { node: ">= 10" } - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-arm64-gnu@1.9.2: - resolution: - { - integrity: sha512-MehG+yQ0TgKMgKR1rO4hdvHkVsTM91Cof8qI9EJlS5+7+QSwfFA5O0zGwCkISD7bsyauJ5uJgcByGjpEobAHOg==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-arm64-musl@1.9.2: - resolution: - { - integrity: sha512-PRZTAJjOwKEGsIhmBvfNh81So+wGl4QyCFAt23j+KwBujLStjC0N3YaqtTlWVKG9tcriPtmMYiAQtXWIyIgg/w==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-x64-gnu@1.9.2: - resolution: - { - integrity: sha512-5WfGO+O1m7nJ55WZ8XDq+ItA98Z4O7sNWsR+1nIj9YGT+Tx5zkQ2RBhpK6oCWZMluuZ0eKQ0FDmyP6K+2NDRIA==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-x64-musl@1.9.2: - resolution: - { - integrity: sha512-VjCn0388p6PMCVUYHgYmHZrKNc7WwNJRr2WLJsHbQRGDOKbpNL6YolCjQxUchcSPDhzwrq1cIdy4j0fpoXEsdw==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-wasm32-wasi@1.9.2: - resolution: - { - integrity: sha512-P06aHfMzm9makwU+nM7WA65yQnS1xuqJ8l/6I/LvXjnl+lfB3DtJ2B0CSLtjnUGpUgcHbWl5gEbNnTPxSAirjQ==, - } - engines: { node: ">=14.0.0" } - cpu: [wasm32] - requiresBuild: true - dependencies: - "@napi-rs/wasm-runtime": 0.1.1 - dev: false - optional: true - - /@node-rs/bcrypt-win32-arm64-msvc@1.9.2: - resolution: - { - integrity: sha512-Iyo/Q5/eNw27VRd3mLBgh1b9b5fnT3QHTVwxv3Siv/MRAIfJXH/cTOe18qSwYQzNh0ZioW4yemFPYCWSZi7szA==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-win32-ia32-msvc@1.9.2: - resolution: - { - integrity: sha512-6LHWMaPylyyHoS5863YpxAACVB8DWCxro5W6pQ4h8WKSgHpJp8Um9jphTdN0A2w45HZjUnfcFuiFFC+TbftjCw==, - } - engines: { node: ">= 10" } - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-win32-x64-msvc@1.9.2: - resolution: - { - integrity: sha512-vZ9T1MOaYkLO9FTyl28YX0SYJneiYTKNFgM8PUv8nas8xrD+7OzokA0fEtlNp6413T7IKSD/iG9qi8nTWsiyGg==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt@1.9.2: - resolution: - { - integrity: sha512-FKUo9iCSIti+ldwoOlY1ztyIFhZxEgT7jZ/UCt/9bg1rLmNdbQQD2JKIMImDCqmTWuLPY4ZF4Q5MyOMIfDCd8Q==, - } - engines: { node: ">= 10" } - optionalDependencies: - "@node-rs/bcrypt-android-arm-eabi": 1.9.2 - "@node-rs/bcrypt-android-arm64": 1.9.2 - "@node-rs/bcrypt-darwin-arm64": 1.9.2 - "@node-rs/bcrypt-darwin-x64": 1.9.2 - "@node-rs/bcrypt-freebsd-x64": 1.9.2 - "@node-rs/bcrypt-linux-arm-gnueabihf": 1.9.2 - "@node-rs/bcrypt-linux-arm64-gnu": 1.9.2 - "@node-rs/bcrypt-linux-arm64-musl": 1.9.2 - "@node-rs/bcrypt-linux-x64-gnu": 1.9.2 - "@node-rs/bcrypt-linux-x64-musl": 1.9.2 - "@node-rs/bcrypt-wasm32-wasi": 1.9.2 - "@node-rs/bcrypt-win32-arm64-msvc": 1.9.2 - "@node-rs/bcrypt-win32-ia32-msvc": 1.9.2 - "@node-rs/bcrypt-win32-x64-msvc": 1.9.2 - dev: false - - /@nodelib/fs.scandir@2.1.5: - resolution: - { - integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, - } - engines: { node: ">= 8" } - dependencies: - "@nodelib/fs.stat": 2.0.5 - run-parallel: 1.2.0 - - /@nodelib/fs.stat@2.0.5: - resolution: - { - integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, - } - engines: { node: ">= 8" } - - /@nodelib/fs.walk@1.2.8: - resolution: - { - integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, - } - engines: { node: ">= 8" } - dependencies: - "@nodelib/fs.scandir": 2.1.5 - fastq: 1.17.0 - - /@scalar/api-client@0.9.3(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15): - resolution: - { - integrity: sha512-mfTlCAy2cA2kMoDIZWC6PEW7NdCIHJ7DxKcc+YqRdmM1wJHFRQ8RqPB7kqHSaoRFMk0atJtQnzgjdIU63T9fZQ==, - } - engines: { node: ">=18" } - peerDependencies: - vue: ^3.3.0 - dependencies: - "@headlessui/vue": 1.7.17(vue@3.4.15) - "@scalar/themes": 0.5.4(vue@3.4.15) - "@scalar/use-codemirror": 0.7.19(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15) - "@scalar/use-keyboard-event": 0.5.8(vue@3.4.15) - "@scalar/use-modal": 0.2.3(@headlessui/vue@1.7.17)(vue@3.4.15) - "@vueuse/core": 10.7.2(vue@3.4.15) - axios: 1.6.7 - content-type: 1.0.5 - javascript-time-ago: 2.5.9 - nanoid: 5.0.4 - pretty-bytes: 6.1.1 - pretty-ms: 8.0.0 - vue: 3.4.15(typescript@5.3.3) - transitivePeerDependencies: - - "@codemirror/lang-html" - - "@codemirror/lang-java" - - "@codemirror/lang-javascript" - - "@codemirror/lang-json" - - "@codemirror/lang-python" - - "@codemirror/language" - - "@codemirror/legacy-modes" - - "@codemirror/state" - - "@codemirror/view" - - "@lezer/common" - - "@lezer/highlight" - - "@lezer/lr" - - "@uiw/codemirror-themes" - - "@vue/composition-api" - - codemirror - - debug - dev: false - - /@scalar/api-reference@1.13.18(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(nanoid@5.0.4)(postcss@8.4.33)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15): - resolution: - { - integrity: sha512-K9p/cxH1mwwyiQf5q38Y+lBofxesleUsMJBT/ZxAHLaiO+1urXDnaEeyIAonXoEaprltvfhICWLvG8W+J6CmyA==, - } - engines: { node: ">=18" } - peerDependencies: - unified: ^11.0.0 - vue: ^3.3.0 - dependencies: - "@floating-ui/vue": 1.0.5(vue@3.4.15) - "@headlessui/vue": 1.7.17(vue@3.4.15) - "@scalar/api-client": 0.9.3(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15) - "@scalar/components": 0.2.2(typescript@5.3.3) - "@scalar/snippetz": 0.1.5 - "@scalar/swagger-editor": 0.9.8(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/view@6.23.1)(@headlessui/vue@1.7.17)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15) - "@scalar/swagger-parser": 0.5.15(openapi-types@12.1.3) - "@scalar/themes": 0.5.4(vue@3.4.15) - "@scalar/use-clipboard": 0.5.13(@scalar/use-toasts@0.5.13)(nanoid@5.0.4) - "@scalar/use-codemirror": 0.7.19(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15) - "@scalar/use-keyboard-event": 0.5.8(vue@3.4.15) - "@scalar/use-modal": 0.2.3(@headlessui/vue@1.7.17)(vue@3.4.15) - "@scalar/use-toasts": 0.5.13(nanoid@5.0.4)(vue@3.4.15) - "@scalar/use-tooltip": 0.5.8(vue@3.4.15) - "@unhead/schema": 1.8.10 - "@vcarl/remark-headings": 0.1.0 - "@vueuse/core": 10.7.2(vue@3.4.15) - "@xmldom/xmldom": 0.8.10 - axios: 1.6.7 - fuse.js: 6.6.2 - github-slugger: 2.0.0 - httpsnippet-lite: 3.0.5 - js-yaml: 4.1.0 - openapi-types: 12.1.3 - postcss-nested: 6.0.1(postcss@8.4.33) - rehype-external-links: 3.0.0 - rehype-format: 5.0.0 - rehype-highlight: 7.0.0 - rehype-sanitize: 6.0.0 - rehype-slug-custom-id: 1.1.0 - rehype-stringify: 10.0.0 - remark-gfm: 4.0.0 - remark-parse: 11.0.0 - remark-rehype: 11.1.0 - remark-stringify: 11.0.0 - unhead: 1.8.10 - unified: 11.0.4 - vue: 3.4.15(typescript@5.3.3) - transitivePeerDependencies: - - "@codemirror/lang-html" - - "@codemirror/lang-java" - - "@codemirror/lang-javascript" - - "@codemirror/lang-json" - - "@codemirror/lang-python" - - "@codemirror/language" - - "@codemirror/legacy-modes" - - "@codemirror/state" - - "@codemirror/view" - - "@lezer/common" - - "@lezer/highlight" - - "@lezer/lr" - - "@uiw/codemirror-themes" - - "@vue/composition-api" - - codemirror - - debug - - nanoid - - postcss - - supports-color - - typescript - dev: false - - /@scalar/components@0.2.2(typescript@5.3.3): - resolution: - { - integrity: sha512-+iMVCe6aKTwQYu4hLypH48kJVkfLZ/twB8ZBRK4lhZCpv8bUOprOMxYIkdnRtlXJITCaM6lxee5pg4aSVkCrvg==, - } - engines: { node: ">=18" } - dependencies: - "@headlessui/vue": 1.7.17(vue@3.4.15) - "@vueuse/core": 10.7.2(vue@3.4.15) - "@xmldom/xmldom": 0.8.10 - class-variance-authority: 0.7.0 - cva: 1.0.0-beta.1(typescript@5.3.3) - nanoid: 5.0.4 - tailwind-merge: 2.2.1 - vue: 3.4.15(typescript@5.3.3) - transitivePeerDependencies: - - "@vue/composition-api" - - typescript - dev: false - - /@scalar/hono-api-reference@0.3.29(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(hono@3.12.8)(nanoid@5.0.4)(postcss@8.4.33)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15): - resolution: - { - integrity: sha512-JKGwToiBBaLr2kuxPzoP+rDbceT2ILDBKACTK1c/LTvnLKJL/CcB6BiRfRjAKuVoIecPC7nVFoka/GXQkbUd7Q==, - } - engines: { node: ">=18" } - peerDependencies: - hono: ^3.0.0 - dependencies: - "@scalar/api-reference": 1.13.18(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(nanoid@5.0.4)(postcss@8.4.33)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15) - hono: 3.12.8 - transitivePeerDependencies: - - "@codemirror/lang-html" - - "@codemirror/lang-java" - - "@codemirror/lang-javascript" - - "@codemirror/lang-json" - - "@codemirror/lang-python" - - "@codemirror/language" - - "@codemirror/legacy-modes" - - "@codemirror/state" - - "@codemirror/view" - - "@lezer/common" - - "@lezer/highlight" - - "@lezer/lr" - - "@uiw/codemirror-themes" - - "@vue/composition-api" - - codemirror - - debug - - nanoid - - postcss - - supports-color - - typescript - - unified - - vue - dev: false - - /@scalar/snippetz-core@0.1.3: - resolution: - { - integrity: sha512-pHRi23VhxMddKMo/2zEnaRcc1QUTEva5H2tryuq+tER7imGWf2O09IGexiV9vY/8jzYh0QVl/2dlJUmnF9Ww5w==, - } - dependencies: - "@types/har-format": 1.2.15 - dev: false - - /@scalar/snippetz-plugin-js-fetch@0.1.0: - resolution: - { - integrity: sha512-lliZSIqtbZawm+XXmMXEpCcpIQprRwJXNUxLAvryB9AGm9qTu0dIfsvjJPjiTAfRew5+sgebNQ8cEF4esMnnlQ==, - } - dependencies: - "@scalar/snippetz-core": 0.1.3 - dev: false - - /@scalar/snippetz-plugin-node-fetch@0.1.1: - resolution: - { - integrity: sha512-U6kqtQi1xAME8AWgJmEVAFA/uhcJ1RUNKtyVDjupd77LQu2FEOPwqI5dPSltxvnJdYrUjLhDcfIa8EO8uO43zw==, - } - dependencies: - "@scalar/snippetz-core": 0.1.3 - dev: false - - /@scalar/snippetz-plugin-node-undici@0.1.5: - resolution: - { - integrity: sha512-ctOvCK3/Ta7ibuZjhV85M/gBuKURpeqgkWQHDFJubTHgUhQZudn60N5MY3ZtjoLFY7z9DCC5UenNYINveCdKJw==, - } - dependencies: - "@scalar/snippetz-core": 0.1.3 - dev: false - - /@scalar/snippetz@0.1.5: - resolution: - { - integrity: sha512-jHU8/KOO9vKbQFhsruflKugekgAtDm5GIAKZCYN+XtzqQ3jPGAjzkEZMXXvRDS2YPtFSzH2vzfqNMLB+q2Zupw==, - } - dependencies: - "@scalar/snippetz-core": 0.1.3 - "@scalar/snippetz-plugin-js-fetch": 0.1.0 - "@scalar/snippetz-plugin-node-fetch": 0.1.1 - "@scalar/snippetz-plugin-node-undici": 0.1.5 - dev: false - - /@scalar/swagger-editor@0.9.8(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/view@6.23.1)(@headlessui/vue@1.7.17)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15): - resolution: - { - integrity: sha512-VxhbqaZVwEy7Od29Kxbg6a/6AM7md/ugcD2pNCw2wUv1PcV/ru+9imJkfClI3HfUXZN/IyLDaZpaNZadCB4Rrw==, - } - engines: { node: ">=18" } - peerDependencies: - unified: ^11.0.0 - vue: ^3.3.0 - dependencies: - "@codemirror/state": 6.4.0 - "@scalar/components": 0.2.2(typescript@5.3.3) - "@scalar/themes": 0.5.4(vue@3.4.15) - "@scalar/use-codemirror": 0.7.19(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15) - "@scalar/use-modal": 0.2.3(@headlessui/vue@1.7.17)(vue@3.4.15) - "@vueuse/core": 10.7.2(vue@3.4.15) - nanoid: 5.0.4 - rehype-external-links: 3.0.0 - rehype-format: 5.0.0 - rehype-highlight: 7.0.0 - rehype-sanitize: 6.0.0 - rehype-slug-custom-id: 1.1.0 - rehype-stringify: 10.0.0 - remark-gfm: 4.0.0 - remark-parse: 11.0.0 - remark-rehype: 11.1.0 - unified: 11.0.4 - vue: 3.4.15(typescript@5.3.3) - transitivePeerDependencies: - - "@codemirror/lang-html" - - "@codemirror/lang-java" - - "@codemirror/lang-javascript" - - "@codemirror/lang-json" - - "@codemirror/lang-python" - - "@codemirror/language" - - "@codemirror/legacy-modes" - - "@codemirror/view" - - "@headlessui/vue" - - "@lezer/common" - - "@lezer/highlight" - - "@lezer/lr" - - "@uiw/codemirror-themes" - - "@vue/composition-api" - - codemirror - - supports-color - - typescript - dev: false - - /@scalar/swagger-parser@0.5.15(openapi-types@12.1.3): - resolution: - { - integrity: sha512-qQY69CiS9XkdG5RuWk/ey12qXiXLUacb7b6oXU1KNB00MKJEpfj+Fjdn+ALXBoKiUVqAfIxeB76evGdZsupwMQ==, - } - engines: { node: ">=18" } - dependencies: - "@apidevtools/swagger-parser": 10.1.0(openapi-types@12.1.3) - js-yaml: 4.1.0 - transitivePeerDependencies: - - openapi-types - dev: false - - /@scalar/themes@0.5.4(vue@3.4.15): - resolution: - { - integrity: sha512-3tmivqGFJwmxmPygWls5W5qyQAt2Ax8tUVi/eVHb8+UYs5ADTzhNKeOu/CipKeZO9z+tfO+UO+XLhy2qb5T+dA==, - } - engines: { node: ">=18" } - peerDependencies: - vue: ^3.3.0 - dependencies: - vue: 3.4.15(typescript@5.3.3) - dev: false - - /@scalar/use-clipboard@0.5.13(@scalar/use-toasts@0.5.13)(nanoid@5.0.4): - resolution: - { - integrity: sha512-UtDu+ArEfHjHUGJzNZQdbFfP4CAPhPwJxcMAwG6KbwaRTNq4UNRS3+WoFmnVOOl8dPLVQFyMs10A2ca2HgJGcA==, - } - engines: { node: ">=18" } - peerDependencies: - "@scalar/use-toasts": 0.5.13 - nanoid: ^5.0.1 - dependencies: - "@scalar/use-toasts": 0.5.13(nanoid@5.0.4)(vue@3.4.15) - nanoid: 5.0.4 - dev: false - - /@scalar/use-codemirror@0.7.19(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15): - resolution: - { - integrity: sha512-xS6/JsVeQ983K6B/6RJMfmgl5GNst7zPbspSPxKwRCbwV5qBZaVWMhop6HQ5mnmanJTXxeh6krRG3K8tFbsuyg==, - } - engines: { node: ">=18" } - peerDependencies: - "@codemirror/lang-html": ^6.0.0 - "@codemirror/lang-java": ^6.0.0 - "@codemirror/lang-javascript": ^6.0.0 - "@codemirror/lang-json": ^6.0.0 - "@codemirror/lang-python": ^6.0.0 - "@codemirror/language": ^6.0.0 - "@codemirror/legacy-modes": ^6.0.0 - "@codemirror/state": ^6.4.0 - "@codemirror/view": ^6.0.0 - "@lezer/common": ^1.1.0 - "@lezer/highlight": ^1.1.0 - "@lezer/lr": ^1.3.0 - "@uiw/codemirror-themes": ^4.21.0 - codemirror: ^6.0.0 - vue: ^3.3.0 - dependencies: - "@codemirror/lang-html": 6.4.8 - "@codemirror/lang-java": 6.0.1 - "@codemirror/lang-javascript": 6.2.1 - "@codemirror/lang-json": 6.0.1 - "@codemirror/lang-python": 6.1.3(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) - "@codemirror/language": 6.10.0 - "@codemirror/legacy-modes": 6.3.3 - "@codemirror/state": 6.4.0 - "@codemirror/view": 6.23.1 - "@lezer/common": 1.2.1 - "@lezer/highlight": 1.2.0 - "@lezer/lr": 1.4.0 - "@uiw/codemirror-themes": 4.21.21(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1) - codemirror: 6.0.1(@lezer/common@1.2.1) - vue: 3.4.15(typescript@5.3.3) - dev: false - - /@scalar/use-keyboard-event@0.5.8(vue@3.4.15): - resolution: - { - integrity: sha512-LcqgZOZWOKIDCftfR4+qOXEtbvXtTtHSObRF2egpctsXgGHlyKY5KjPOoffbvwdh21rLa5ITBy+emwAm2i6Xww==, - } - engines: { node: ">=18" } - peerDependencies: - vue: ^3.3.0 - dependencies: - vue: 3.4.15(typescript@5.3.3) - dev: false - - /@scalar/use-modal@0.2.3(@headlessui/vue@1.7.17)(vue@3.4.15): - resolution: - { - integrity: sha512-qCn8rNCTy7jO/7DDalsMM+m1jBfEE/Fnx3Im966uBzCdxdyLbJ8f9S2ZwmW44KP6CXbsMGsuORkvY6Z8joZvMg==, - } - engines: { node: ">=18" } - peerDependencies: - "@headlessui/vue": ^1.7.0 - vue: ^3.3.0 - dependencies: - "@headlessui/vue": 1.7.17(vue@3.4.15) - vue: 3.4.15(typescript@5.3.3) - dev: false - - /@scalar/use-toasts@0.5.13(nanoid@5.0.4)(vue@3.4.15): - resolution: - { - integrity: sha512-EiFezCmWchaYfwEDTkSv/r7x6aYOlaFcu+zpTaV/y3ppCIybLvL3WRQzQS0KMaCJJBmQecZbCqMPnRLlacPwYw==, - } - engines: { node: ">=18" } - peerDependencies: - nanoid: 4 - 5 - vue: ^3.3.0 - dependencies: - nanoid: 5.0.4 - vue: 3.4.15(typescript@5.3.3) - dev: false - - /@scalar/use-tooltip@0.5.8(vue@3.4.15): - resolution: - { - integrity: sha512-9gCa7UGlRQVrKVy3tp5WYn/vCS1Fk0mcPlpkoffPeekS/4A01K3SpddqM76gVUNnOvDOq0EPEbVvUO1deB9oGw==, - } - engines: { node: ">=18" } - peerDependencies: - vue: ^3.3.0 - dependencies: - vue: 3.4.15(typescript@5.3.3) - dev: false - - /@tanstack/virtual-core@3.0.0: - resolution: - { - integrity: sha512-SYXOBTjJb05rXa2vl55TTwO40A6wKu0R5i1qQwhJYNDIqaIGF7D0HsLw+pJAyi2OvntlEIVusx3xtbbgSUi6zg==, - } - dev: false - - /@tanstack/vue-virtual@3.0.2(vue@3.4.15): - resolution: - { - integrity: sha512-1iFpX+yZswHuf4wrA6GU9yJ/YzQ/8SacABwqghwCkcwrkZbOPLlRSdOAqZ1WQ50SftmfhZpaiZl2KmpV7cgfMQ==, - } - peerDependencies: - vue: ^2.7.0 || ^3.0.0 - dependencies: - "@tanstack/virtual-core": 3.0.0 - vue: 3.4.15(typescript@5.3.3) - dev: false - - /@tybys/wasm-util@0.8.1: - resolution: - { - integrity: sha512-GSsTwyBl4pIzsxAY5wroZdyQKyhXk0d8PCRZtrSZ2WEB1cBdrp2EgGBwHOGCZtIIPun/DL3+AykCv+J6fyRH4Q==, - } - requiresBuild: true - dependencies: - tslib: 2.6.2 - dev: false - optional: true - - /@types/debug@4.1.12: - resolution: - { - integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==, - } - dependencies: - "@types/ms": 0.7.34 - dev: false - - /@types/har-format@1.2.15: - resolution: - { - integrity: sha512-RpQH4rXLuvTXKR0zqHq3go0RVXYv/YVqv4TnPH95VbwUxZdQlK1EtcMvQvMpDngHbt13Csh9Z4qT9AbkiQH5BA==, - } - dev: false - - /@types/hast@2.3.9: - resolution: - { - integrity: sha512-pTHyNlaMD/oKJmS+ZZUyFUcsZeBZpC0lmGquw98CqRVNgAdJZJeD7GoeLiT6Xbx5rU9VCjSt0RwEvDgzh4obFw==, - } - dependencies: - "@types/unist": 2.0.10 - dev: false - - /@types/hast@3.0.3: - resolution: - { - integrity: sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==, - } - dependencies: - "@types/unist": 3.0.2 - dev: false - - /@types/json-schema@7.0.15: - resolution: - { - integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, - } - dev: false - - /@types/mdast@3.0.15: - resolution: - { - integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==, - } - dependencies: - "@types/unist": 2.0.10 - dev: false - - /@types/mdast@4.0.3: - resolution: - { - integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==, - } - dependencies: - "@types/unist": 3.0.2 - dev: false - - /@types/ms@0.7.34: - resolution: - { - integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==, - } - dev: false - - /@types/node-fetch@2.6.11: - resolution: - { - integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==, - } - dependencies: - "@types/node": 20.11.8 - form-data: 4.0.0 - dev: false - - /@types/node-forge@1.3.11: - resolution: - { - integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==, - } - dependencies: - "@types/node": 20.11.8 - dev: true - - /@types/node@20.11.8: - resolution: - { - integrity: sha512-i7omyekpPTNdv4Jb/Rgqg0RU8YqLcNsI12quKSDkRXNfx7Wxdm6HhK1awT3xTgEkgxPn3bvnSpiEAc7a7Lpyow==, - } - dependencies: - undici-types: 5.26.5 - - /@types/semver@7.5.6: - resolution: - { - integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==, - } - dev: false - - /@types/unist@2.0.10: - resolution: - { - integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==, - } - dev: false - - /@types/unist@3.0.2: - resolution: - { - integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==, - } - dev: false - - /@types/web-bluetooth@0.0.20: - resolution: - { - integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==, - } - dev: false - - /@types/ws@8.5.10: - resolution: - { - integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==, - } - dependencies: - "@types/node": 20.11.8 - dev: false - - /@typescript-eslint/eslint-plugin@6.19.1(@typescript-eslint/parser@6.19.1)(eslint@8.56.0)(typescript@5.3.3): - resolution: - { - integrity: sha512-roQScUGFruWod9CEyoV5KlCYrubC/fvG8/1zXuT0WTcxX87GnMMmnksMwSg99lo1xiKrBzw2icsJPMAw1OtKxg==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - peerDependencies: - "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - dependencies: - "@eslint-community/regexpp": 4.10.0 - "@typescript-eslint/parser": 6.19.1(eslint@8.56.0)(typescript@5.3.3) - "@typescript-eslint/scope-manager": 6.19.1 - "@typescript-eslint/type-utils": 6.19.1(eslint@8.56.0)(typescript@5.3.3) - "@typescript-eslint/utils": 6.19.1(eslint@8.56.0)(typescript@5.3.3) - "@typescript-eslint/visitor-keys": 6.19.1 - debug: 4.3.4 - eslint: 8.56.0 - graphemer: 1.4.0 - ignore: 5.3.0 - natural-compare: 1.4.0 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.3.3) - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/parser@6.19.1(eslint@8.56.0)(typescript@5.3.3): - resolution: - { - integrity: sha512-WEfX22ziAh6pRE9jnbkkLGp/4RhTpffr2ZK5bJ18M8mIfA8A+k97U9ZyaXCEJRlmMHh7R9MJZWXp/r73DzINVQ==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - dependencies: - "@typescript-eslint/scope-manager": 6.19.1 - "@typescript-eslint/types": 6.19.1 - "@typescript-eslint/typescript-estree": 6.19.1(typescript@5.3.3) - "@typescript-eslint/visitor-keys": 6.19.1 - debug: 4.3.4 - eslint: 8.56.0 - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/scope-manager@6.19.1: - resolution: - { - integrity: sha512-4CdXYjKf6/6aKNMSly/BP4iCSOpvMmqtDzRtqFyyAae3z5kkqEjKndR5vDHL8rSuMIIWP8u4Mw4VxLyxZW6D5w==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - dependencies: - "@typescript-eslint/types": 6.19.1 - "@typescript-eslint/visitor-keys": 6.19.1 - dev: false - - /@typescript-eslint/type-utils@6.19.1(eslint@8.56.0)(typescript@5.3.3): - resolution: - { - integrity: sha512-0vdyld3ecfxJuddDjACUvlAeYNrHP/pDeQk2pWBR2ESeEzQhg52DF53AbI9QCBkYE23lgkhLCZNkHn2hEXXYIg==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - dependencies: - "@typescript-eslint/typescript-estree": 6.19.1(typescript@5.3.3) - "@typescript-eslint/utils": 6.19.1(eslint@8.56.0)(typescript@5.3.3) - debug: 4.3.4 - eslint: 8.56.0 - ts-api-utils: 1.0.3(typescript@5.3.3) - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/types@6.19.1: - resolution: - { - integrity: sha512-6+bk6FEtBhvfYvpHsDgAL3uo4BfvnTnoge5LrrCj2eJN8g3IJdLTD4B/jK3Q6vo4Ql/Hoip9I8aB6fF+6RfDqg==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - dev: false - - /@typescript-eslint/typescript-estree@6.19.1(typescript@5.3.3): - resolution: - { - integrity: sha512-aFdAxuhzBFRWhy+H20nYu19+Km+gFfwNO4TEqyszkMcgBDYQjmPJ61erHxuT2ESJXhlhrO7I5EFIlZ+qGR8oVA==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - peerDependencies: - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - dependencies: - "@typescript-eslint/types": 6.19.1 - "@typescript-eslint/visitor-keys": 6.19.1 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.3 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.3.3) - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/utils@6.19.1(eslint@8.56.0)(typescript@5.3.3): - resolution: - { - integrity: sha512-JvjfEZuP5WoMqwh9SPAPDSHSg9FBHHGhjPugSRxu5jMfjvBpq5/sGTD+9M9aQ5sh6iJ8AY/Kk/oUYVEMAPwi7w==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.56.0) - "@types/json-schema": 7.0.15 - "@types/semver": 7.5.6 - "@typescript-eslint/scope-manager": 6.19.1 - "@typescript-eslint/types": 6.19.1 - "@typescript-eslint/typescript-estree": 6.19.1(typescript@5.3.3) - eslint: 8.56.0 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - - typescript - dev: false - - /@typescript-eslint/visitor-keys@6.19.1: - resolution: - { - integrity: sha512-gkdtIO+xSO/SmI0W68DBg4u1KElmIUo3vXzgHyGPs6cxgB0sa3TlptRAAE0hUY1hM6FcDKEv7aIwiTGm76cXfQ==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - dependencies: - "@typescript-eslint/types": 6.19.1 - eslint-visitor-keys: 3.4.3 - dev: false - - /@uiw/codemirror-themes@4.21.21(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1): - resolution: - { - integrity: sha512-ljVcMGdaxo75UaH+EqxJ+jLyMVVgeSfW2AKyT1VeLy+4SDpuqNQ7wq5XVxktsG6LH+OvgSFndWXgPANf4+gQcA==, - } - peerDependencies: - "@codemirror/language": ">=6.0.0" - "@codemirror/state": ">=6.0.0" - "@codemirror/view": ">=6.0.0" - dependencies: - "@codemirror/language": 6.10.0 - "@codemirror/state": 6.4.0 - "@codemirror/view": 6.23.1 - dev: false - - /@ungap/structured-clone@1.2.0: - resolution: - { - integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==, - } - - /@unhead/dom@1.8.10: - resolution: - { - integrity: sha512-dBeDbHrBjeU+eVgMsD91TGEazb1dwLrY0x/ve01CldMCmm+WcRu++SUW7s1QX84mzGH2EgFz78o1OPn6jpV3zw==, - } - dependencies: - "@unhead/schema": 1.8.10 - "@unhead/shared": 1.8.10 - dev: false - - /@unhead/schema@1.8.10: - resolution: - { - integrity: sha512-cy8RGOPkwOVY5EmRoCgGV8AqLjy/226xBVTY54kBct02Om3hBdpB9FZa9frM910pPUXMI8PNmFgABO23O7IdJA==, - } - dependencies: - hookable: 5.5.3 - zhead: 2.2.4 - dev: false - - /@unhead/shared@1.8.10: - resolution: - { - integrity: sha512-pEFryAs3EmV+ShDQx2ZBwUnt5l3RrMrXSMZ50oFf+MImKZNARVvD4+3I8fEI9wZh+Zq0JYG3UAfzo51MUP+Juw==, - } - dependencies: - "@unhead/schema": 1.8.10 - dev: false - - /@vcarl/remark-headings@0.1.0: - resolution: - { - integrity: sha512-ffQxJUcapJ9Bk+fiGN49YJ9RaYMibrSTSezB1Fcrtu+0YSZxA3bsaLlIv1u/4sjPIeW/BKrs4xtMT3l3P9Ba5Q==, - } - dependencies: - mdast-util-to-string: 3.2.0 - unist-util-visit: 4.1.2 - dev: false - - /@vue/compiler-core@3.4.15: - resolution: - { - integrity: sha512-XcJQVOaxTKCnth1vCxEChteGuwG6wqnUHxAm1DO3gCz0+uXKaJNx8/digSz4dLALCy8n2lKq24jSUs8segoqIw==, - } - dependencies: - "@babel/parser": 7.23.9 - "@vue/shared": 3.4.15 - entities: 4.5.0 - estree-walker: 2.0.2 - source-map-js: 1.0.2 - dev: false - - /@vue/compiler-dom@3.4.15: - resolution: - { - integrity: sha512-wox0aasVV74zoXyblarOM3AZQz/Z+OunYcIHe1OsGclCHt8RsRm04DObjefaI82u6XDzv+qGWZ24tIsRAIi5MQ==, - } - dependencies: - "@vue/compiler-core": 3.4.15 - "@vue/shared": 3.4.15 - dev: false - - /@vue/compiler-sfc@3.4.15: - resolution: - { - integrity: sha512-LCn5M6QpkpFsh3GQvs2mJUOAlBQcCco8D60Bcqmf3O3w5a+KWS5GvYbrrJBkgvL1BDnTp+e8q0lXCLgHhKguBA==, - } - dependencies: - "@babel/parser": 7.23.9 - "@vue/compiler-core": 3.4.15 - "@vue/compiler-dom": 3.4.15 - "@vue/compiler-ssr": 3.4.15 - "@vue/shared": 3.4.15 - estree-walker: 2.0.2 - magic-string: 0.30.5 - postcss: 8.4.33 - source-map-js: 1.0.2 - dev: false - - /@vue/compiler-ssr@3.4.15: - resolution: - { - integrity: sha512-1jdeQyiGznr8gjFDadVmOJqZiLNSsMa5ZgqavkPZ8O2wjHv0tVuAEsw5hTdUoUW4232vpBbL/wJhzVW/JwY1Uw==, - } - dependencies: - "@vue/compiler-dom": 3.4.15 - "@vue/shared": 3.4.15 - dev: false - - /@vue/reactivity@3.4.15: - resolution: - { - integrity: sha512-55yJh2bsff20K5O84MxSvXKPHHt17I2EomHznvFiJCAZpJTNW8IuLj1xZWMLELRhBK3kkFV/1ErZGHJfah7i7w==, - } - dependencies: - "@vue/shared": 3.4.15 - dev: false - - /@vue/runtime-core@3.4.15: - resolution: - { - integrity: sha512-6E3by5m6v1AkW0McCeAyhHTw+3y17YCOKG0U0HDKDscV4Hs0kgNT5G+GCHak16jKgcCDHpI9xe5NKb8sdLCLdw==, - } - dependencies: - "@vue/reactivity": 3.4.15 - "@vue/shared": 3.4.15 - dev: false - - /@vue/runtime-dom@3.4.15: - resolution: - { - integrity: sha512-EVW8D6vfFVq3V/yDKNPBFkZKGMFSvZrUQmx196o/v2tHKdwWdiZjYUBS+0Ez3+ohRyF8Njwy/6FH5gYJ75liUw==, - } - dependencies: - "@vue/runtime-core": 3.4.15 - "@vue/shared": 3.4.15 - csstype: 3.1.3 - dev: false - - /@vue/server-renderer@3.4.15(vue@3.4.15): - resolution: - { - integrity: sha512-3HYzaidu9cHjrT+qGUuDhFYvF/j643bHC6uUN9BgM11DVy+pM6ATsG6uPBLnkwOgs7BpJABReLmpL3ZPAsUaqw==, - } - peerDependencies: - vue: 3.4.15 - dependencies: - "@vue/compiler-ssr": 3.4.15 - "@vue/shared": 3.4.15 - vue: 3.4.15(typescript@5.3.3) - dev: false - - /@vue/shared@3.4.15: - resolution: - { - integrity: sha512-KzfPTxVaWfB+eGcGdbSf4CWdaXcGDqckoeXUh7SB3fZdEtzPCK2Vq9B/lRRL3yutax/LWITz+SwvgyOxz5V75g==, - } - dev: false - - /@vueuse/core@10.7.2(vue@3.4.15): - resolution: - { - integrity: sha512-AOyAL2rK0By62Hm+iqQn6Rbu8bfmbgaIMXcE3TSr7BdQ42wnSFlwIdPjInO62onYsEMK/yDMU8C6oGfDAtZ2qQ==, - } - dependencies: - "@types/web-bluetooth": 0.0.20 - "@vueuse/metadata": 10.7.2 - "@vueuse/shared": 10.7.2(vue@3.4.15) - vue-demi: 0.14.6(vue@3.4.15) - transitivePeerDependencies: - - "@vue/composition-api" - - vue - dev: false - - /@vueuse/metadata@10.7.2: - resolution: - { - integrity: sha512-kCWPb4J2KGrwLtn1eJwaJD742u1k5h6v/St5wFe8Quih90+k2a0JP8BS4Zp34XUuJqS2AxFYMb1wjUL8HfhWsQ==, - } - dev: false - - /@vueuse/shared@10.7.2(vue@3.4.15): - resolution: - { - integrity: sha512-qFbXoxS44pi2FkgFjPvF4h7c9oMDutpyBdcJdMYIMg9XyXli2meFMuaKn+UMgsClo//Th6+beeCgqweT/79BVA==, - } - dependencies: - vue-demi: 0.14.6(vue@3.4.15) - transitivePeerDependencies: - - "@vue/composition-api" - - vue - dev: false - - /@xmldom/xmldom@0.8.10: - resolution: - { - integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==, - } - engines: { node: ">=10.0.0" } - dev: false - - /acorn-jsx@5.3.2(acorn@8.11.3): - resolution: - { - integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, - } - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.11.3 - - /acorn-walk@8.3.2: - resolution: - { - integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==, - } - engines: { node: ">=0.4.0" } - dev: true - - /acorn@8.11.3: - resolution: - { - integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==, - } - engines: { node: ">=0.4.0" } - hasBin: true - - /ajv-draft-04@1.0.0(ajv@8.12.0): - resolution: - { - integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==, - } - peerDependencies: - ajv: ^8.5.0 - peerDependenciesMeta: - ajv: - optional: true - dependencies: - ajv: 8.12.0 - dev: false - - /ajv@6.12.6: - resolution: - { - integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, - } - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - - /ajv@8.12.0: - resolution: - { - integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==, - } - dependencies: - fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - uri-js: 4.4.1 - dev: false - - /ansi-regex@5.0.1: - resolution: - { - integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, - } - engines: { node: ">=8" } - - /ansi-styles@4.3.0: - resolution: - { - integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, - } - engines: { node: ">=8" } - dependencies: - color-convert: 2.0.1 - - /anymatch@3.1.3: - resolution: - { - integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, - } - engines: { node: ">= 8" } - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - - /argparse@1.0.10: - resolution: - { - integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==, - } - dependencies: - sprintf-js: 1.0.3 - dev: false - - /argparse@2.0.1: - resolution: - { - integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, - } - - /array-union@2.1.0: - resolution: - { - integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, - } - engines: { node: ">=8" } - dev: false - - /as-table@1.0.55: - resolution: - { - integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==, - } - dependencies: - printable-characters: 1.0.42 - dev: true - - /asynckit@0.4.0: - resolution: - { - integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, - } - dev: false - - /axios@1.6.7: - resolution: - { - integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==, - } - dependencies: - follow-redirects: 1.15.5 - form-data: 4.0.0 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - dev: false - - /bail@2.0.2: - resolution: - { - integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==, - } - dev: false - - /balanced-match@1.0.2: - resolution: - { - integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, - } - - /base64-js@1.5.1: - resolution: - { - integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, - } - dev: false - - /better-sqlite3@9.3.0: - resolution: - { - integrity: sha512-ww73jVpQhRRdS9uMr761ixlkl4bWoXi8hMQlBGhoN6vPNlUHpIsNmw4pKN6kjknlt/wopdvXHvLk1W75BI+n0Q==, - } - 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 - - /brace-expansion@1.1.11: - resolution: - { - integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, - } - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - /brace-expansion@2.0.1: - resolution: - { - integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, - } - dependencies: - balanced-match: 1.0.2 - - /braces@3.0.2: - resolution: - { - integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==, - } - engines: { node: ">=8" } - dependencies: - fill-range: 7.0.1 - - /buffer-from@1.1.2: - resolution: - { - integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, - } - dev: true - - /buffer@5.7.1: - resolution: - { - integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, - } - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: false - - /call-me-maybe@1.0.2: - resolution: - { - integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==, - } - dev: false - - /callsites@3.1.0: - resolution: - { - integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, - } - engines: { node: ">=6" } - - /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 - - /ccount@2.0.1: - resolution: - { - integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==, - } - dev: false - - /chalk@4.1.2: - resolution: - { - integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, - } - engines: { node: ">=10" } - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - /chalk@5.3.0: - resolution: - { - integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==, - } - engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } - dev: true - - /character-entities-html4@2.1.0: - resolution: - { - integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==, - } - dev: false - - /character-entities-legacy@3.0.0: - resolution: - { - integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==, - } - dev: false - - /character-entities@2.0.2: - resolution: - { - integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==, - } - dev: false - - /chokidar@3.5.3: - resolution: - { - integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, - } - engines: { node: ">= 8.10.0" } - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /chownr@1.1.4: - resolution: - { - integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==, - } - dev: false - - /class-variance-authority@0.7.0: - resolution: - { - integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==, - } - dependencies: - clsx: 2.0.0 - dev: false - - /cli-color@2.0.3: - resolution: - { - integrity: sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==, - } - engines: { node: ">=0.10" } - dependencies: - d: 1.0.1 - es5-ext: 0.10.62 - es6-iterator: 2.0.3 - memoizee: 0.4.15 - timers-ext: 0.1.7 - dev: true - - /clsx@2.0.0: - resolution: - { - integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==, - } - engines: { node: ">=6" } - dev: false - - /codemirror@6.0.1(@lezer/common@1.2.1): - resolution: - { - integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==, - } - dependencies: - "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) - "@codemirror/commands": 6.3.3 - "@codemirror/language": 6.10.0 - "@codemirror/lint": 6.4.2 - "@codemirror/search": 6.5.5 - "@codemirror/state": 6.4.0 - "@codemirror/view": 6.23.1 - transitivePeerDependencies: - - "@lezer/common" - dev: false - - /color-convert@2.0.1: - resolution: - { - integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, - } - engines: { node: ">=7.0.0" } - dependencies: - color-name: 1.1.4 - - /color-name@1.1.4: - resolution: - { - integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, - } - - /combined-stream@1.0.8: - resolution: - { - integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, - } - engines: { node: ">= 0.8" } - dependencies: - delayed-stream: 1.0.0 - dev: false - - /comma-separated-tokens@2.0.3: - resolution: - { - integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==, - } - dev: false - - /commander@9.5.0: - resolution: - { - integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==, - } - engines: { node: ^12.20.0 || >=14 } - dev: true - - /concat-map@0.0.1: - resolution: - { - integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, - } - - /content-type@1.0.5: - resolution: - { - integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==, - } - engines: { node: ">= 0.6" } - dev: false - - /cookie@0.5.0: - resolution: - { - integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==, - } - engines: { node: ">= 0.6" } - dev: true - - /copy-anything@3.0.5: - resolution: - { - integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==, - } - engines: { node: ">=12.13" } - dependencies: - is-what: 4.1.16 - dev: true - - /crelt@1.0.6: - resolution: - { - integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==, - } - dev: false - - /cross-spawn@7.0.3: - resolution: - { - integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, - } - engines: { node: ">= 8" } - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - /cssesc@3.0.0: - resolution: - { - integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==, - } - engines: { node: ">=4" } - hasBin: true - dev: false - - /csstype@3.1.3: - resolution: - { - integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==, - } - dev: false - - /cva@1.0.0-beta.1(typescript@5.3.3): - resolution: - { - integrity: sha512-gznFqTgERU9q4wg7jfgqtt34+RUt9S5t0xDAAEuDwQEAXEgjdDkKXpLLNjwSxsB4Ln/sqWJEH7yhE8Ny0mxd0w==, - } - peerDependencies: - typescript: ">= 4.5.5 < 6" - peerDependenciesMeta: - typescript: - optional: true - dependencies: - clsx: 2.0.0 - typescript: 5.3.3 - dev: false - - /d@1.0.1: - resolution: - { - integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==, - } - 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 - - /data-uri-to-buffer@4.0.1: - resolution: - { - integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==, - } - engines: { node: ">= 12" } - dev: false - - /dayjs@1.11.10: - resolution: - { - integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==, - } - dev: false - - /debug@4.3.4: - resolution: - { - integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, - } - engines: { node: ">=6.0" } - peerDependencies: - supports-color: "*" - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - - /decode-named-character-reference@1.0.2: - resolution: - { - integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==, - } - dependencies: - character-entities: 2.0.2 - dev: false - - /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==, - } - - /delayed-stream@1.0.0: - resolution: - { - integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, - } - engines: { node: ">=0.4.0" } - dev: false - - /dequal@2.0.3: - resolution: - { - integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==, - } - engines: { node: ">=6" } - dev: false - - /detect-libc@2.0.2: - resolution: - { - integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==, - } - engines: { node: ">=8" } - dev: false - - /devlop@1.1.0: - resolution: - { - integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==, - } - dependencies: - dequal: 2.0.3 - dev: false - - /difflib@0.2.4: - resolution: - { - integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==, - } - dependencies: - heap: 0.2.7 - dev: true - - /dir-glob@3.0.1: - resolution: - { - integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, - } - engines: { node: ">=8" } - dependencies: - path-type: 4.0.0 - dev: false - - /doctrine@3.0.0: - resolution: - { - integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==, - } - engines: { node: ">=6.0.0" } - dependencies: - esutils: 2.0.3 - - /dotenv@16.4.1: - resolution: - { - integrity: sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ==, - } - engines: { node: ">=12" } - dev: true - - /dreamopt@0.8.0: - resolution: - { - integrity: sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==, - } - engines: { node: ">=0.4.0" } - dependencies: - wordwrap: 1.0.0 - dev: true - - /drizzle-kit@0.20.13: - resolution: - { - integrity: sha512-j9oZSQXNWG+KBJm0Sg3S/zJpncHGKnpqNfFuM4NUxUMGTcihDHhP9SW6Jncqwb5vsP1Xm0a8JLm3PZUIspC/oA==, - } - hasBin: true - dependencies: - "@drizzle-team/studio": 0.0.39 - "@esbuild-kit/esm-loader": 2.6.5 - camelcase: 7.0.1 - chalk: 5.3.0 - commander: 9.5.0 - env-paths: 3.0.0 - esbuild: 0.19.12 - esbuild-register: 3.5.0(esbuild@0.19.12) - glob: 8.1.0 - hanji: 0.0.5 - json-diff: 0.9.0 - minimatch: 7.4.6 - semver: 7.5.4 - zod: 3.22.4 - transitivePeerDependencies: - - supports-color - dev: true - - /drizzle-orm@0.29.3(@cloudflare/workers-types@4.20240117.0)(@libsql/client@0.4.0)(better-sqlite3@9.3.0): - resolution: - { - integrity: sha512-uSE027csliGSGYD0pqtM+SAQATMREb3eSM/U8s6r+Y0RFwTKwftnwwSkqx3oS65UBgqDOM0gMTl5UGNpt6lW0A==, - } - 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/react": ">=18" - "@types/sql.js": "*" - "@vercel/postgres": "*" - better-sqlite3: ">=7" - bun-types: "*" - expo-sqlite: ">=13.2.0" - knex: "*" - kysely: "*" - mysql2: ">=2" - pg: ">=8" - postgres: ">=3" - react: ">=18" - 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/react": - optional: true - "@types/sql.js": - optional: true - "@vercel/postgres": - optional: true - better-sqlite3: - optional: true - bun-types: - optional: true - expo-sqlite: - optional: true - knex: - optional: true - kysely: - optional: true - mysql2: - optional: true - pg: - optional: true - postgres: - optional: true - react: - optional: true - sql.js: - optional: true - sqlite3: - optional: true - dependencies: - "@cloudflare/workers-types": 4.20240117.0 - "@libsql/client": 0.4.0 - better-sqlite3: 9.3.0 - dev: false - - /drizzle-zod@0.5.1(drizzle-orm@0.29.3)(zod@3.22.4): - resolution: - { - integrity: sha512-C/8bvzUH/zSnVfwdSibOgFjLhtDtbKYmkbPbUCq46QZyZCH6kODIMSOgZ8R7rVjoI+tCj3k06MRJMDqsIeoS4A==, - } - peerDependencies: - drizzle-orm: ">=0.23.13" - zod: "*" - dependencies: - drizzle-orm: 0.29.3(@cloudflare/workers-types@4.20240117.0)(@libsql/client@0.4.0)(better-sqlite3@9.3.0) - zod: 3.22.4 - dev: false - - /end-of-stream@1.4.4: - resolution: - { - integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, - } - dependencies: - once: 1.4.0 - dev: false - - /entities@4.5.0: - resolution: - { - integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==, - } - engines: { node: ">=0.12" } - dev: false - - /env-paths@3.0.0: - resolution: - { - integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - 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.19.12): - resolution: - { - integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==, - } - peerDependencies: - esbuild: ">=0.12 <1" - dependencies: - debug: 4.3.4 - esbuild: 0.19.12 - 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 - - /esbuild@0.19.12: - resolution: - { - integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==, - } - engines: { node: ">=12" } - hasBin: true - requiresBuild: true - optionalDependencies: - "@esbuild/aix-ppc64": 0.19.12 - "@esbuild/android-arm": 0.19.12 - "@esbuild/android-arm64": 0.19.12 - "@esbuild/android-x64": 0.19.12 - "@esbuild/darwin-arm64": 0.19.12 - "@esbuild/darwin-x64": 0.19.12 - "@esbuild/freebsd-arm64": 0.19.12 - "@esbuild/freebsd-x64": 0.19.12 - "@esbuild/linux-arm": 0.19.12 - "@esbuild/linux-arm64": 0.19.12 - "@esbuild/linux-ia32": 0.19.12 - "@esbuild/linux-loong64": 0.19.12 - "@esbuild/linux-mips64el": 0.19.12 - "@esbuild/linux-ppc64": 0.19.12 - "@esbuild/linux-riscv64": 0.19.12 - "@esbuild/linux-s390x": 0.19.12 - "@esbuild/linux-x64": 0.19.12 - "@esbuild/netbsd-x64": 0.19.12 - "@esbuild/openbsd-x64": 0.19.12 - "@esbuild/sunos-x64": 0.19.12 - "@esbuild/win32-arm64": 0.19.12 - "@esbuild/win32-ia32": 0.19.12 - "@esbuild/win32-x64": 0.19.12 - dev: true - - /escape-string-regexp@4.0.0: - resolution: - { - integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, - } - engines: { node: ">=10" } - - /escape-string-regexp@5.0.0: - resolution: - { - integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==, - } - engines: { node: ">=12" } - dev: false - - /eslint-scope@7.2.2: - resolution: - { - integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - /eslint-visitor-keys@3.4.3: - resolution: - { - integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - - /eslint@8.56.0: - resolution: - { - integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - hasBin: true - dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.56.0) - "@eslint-community/regexpp": 4.10.0 - "@eslint/eslintrc": 2.1.4 - "@eslint/js": 8.56.0 - "@humanwhocodes/config-array": 0.11.14 - "@humanwhocodes/module-importer": 1.0.1 - "@nodelib/fs.walk": 1.2.8 - "@ungap/structured-clone": 1.2.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 - ignore: 5.3.0 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.3 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - - /espree@9.6.1: - resolution: - { - integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) - eslint-visitor-keys: 3.4.3 - - /esprima@4.0.1: - resolution: - { - integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==, - } - engines: { node: ">=4" } - hasBin: true - dev: false - - /esquery@1.5.0: - resolution: - { - integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==, - } - engines: { node: ">=0.10" } - dependencies: - estraverse: 5.3.0 - - /esrecurse@4.3.0: - resolution: - { - integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, - } - engines: { node: ">=4.0" } - dependencies: - estraverse: 5.3.0 - - /estraverse@5.3.0: - resolution: - { - integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, - } - engines: { node: ">=4.0" } - - /estree-walker@0.6.1: - resolution: - { - integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==, - } - dev: true - - /estree-walker@2.0.2: - resolution: - { - integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==, - } - dev: false - - /esutils@2.0.3: - resolution: - { - integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, - } - engines: { node: ">=0.10.0" } - - /event-emitter@0.3.5: - resolution: - { - integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==, - } - dependencies: - d: 1.0.1 - es5-ext: 0.10.62 - dev: true - - /exit-hook@2.2.1: - resolution: - { - integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==, - } - engines: { node: ">=6" } - dev: true - - /expand-template@2.0.3: - resolution: - { - integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==, - } - engines: { node: ">=6" } - dev: false - - /ext@1.7.0: - resolution: - { - integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==, - } - dependencies: - type: 2.7.2 - dev: true - - /extend@3.0.2: - resolution: - { - integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==, - } - dev: false - - /fast-deep-equal@3.1.3: - resolution: - { - integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, - } - - /fast-glob@3.3.2: - resolution: - { - integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==, - } - engines: { node: ">=8.6.0" } - dependencies: - "@nodelib/fs.stat": 2.0.5 - "@nodelib/fs.walk": 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: false - - /fast-json-stable-stringify@2.1.0: - resolution: - { - integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, - } - - /fast-levenshtein@2.0.6: - resolution: - { - integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, - } - - /fastq@1.17.0: - resolution: - { - integrity: sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==, - } - dependencies: - reusify: 1.0.4 - - /fetch-blob@3.2.0: - resolution: - { - integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==, - } - engines: { node: ^12.20 || >= 14.13 } - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 3.3.2 - dev: false - - /fetch-retry@5.0.6: - resolution: - { - integrity: sha512-3yurQZ2hD9VISAhJJP9bpYFNQrHHBXE2JxxjY5aLEcDi46RmAzJE2OC9FAde0yis5ElW0jTTzs0zfg/Cca4XqQ==, - } - dev: false - - /file-entry-cache@6.0.1: - resolution: - { - integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==, - } - engines: { node: ^10.12.0 || >=12.0.0 } - dependencies: - flat-cache: 3.2.0 - - /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" } - dependencies: - to-regex-range: 5.0.1 - - /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 - - /flat-cache@3.2.0: - resolution: - { - integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==, - } - engines: { node: ^10.12.0 || >=12.0.0 } - dependencies: - flatted: 3.2.9 - keyv: 4.5.4 - rimraf: 3.0.2 - - /flatted@3.2.9: - resolution: - { - integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==, - } - - /follow-redirects@1.15.5: - resolution: - { - integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==, - } - engines: { node: ">=4.0" } - peerDependencies: - debug: "*" - peerDependenciesMeta: - debug: - optional: true - dev: false - - /form-data@4.0.0: - resolution: - { - integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==, - } - engines: { node: ">= 6" } - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: false - - /formdata-node@4.4.1: - resolution: - { - integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==, - } - engines: { node: ">= 12.20" } - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 4.0.0-beta.3 - dev: false - - /formdata-polyfill@4.0.10: - resolution: - { - integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==, - } - engines: { node: ">=12.20.0" } - dependencies: - fetch-blob: 3.2.0 - dev: false - - /fs-constants@1.0.0: - resolution: - { - integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==, - } - dev: false - - /fs.realpath@1.0.0: - resolution: - { - integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, - } - - /fsevents@2.3.3: - resolution: - { - integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, - } - engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } - os: [darwin] - requiresBuild: true - dev: true + utf-8-validate: optional: true - /function-bind@1.1.2: - resolution: - { - integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, - } - dev: true - - /fuse.js@6.6.2: - resolution: - { - integrity: sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==, - } - engines: { node: ">=10" } - dev: false - - /get-own-enumerable-property-symbols@3.0.2: - resolution: - { - integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==, - } - dev: false - - /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-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 - - /github-slugger@1.5.0: - resolution: - { - integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==, - } - dev: false - - /github-slugger@2.0.0: - resolution: - { - integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==, - } - dev: false - - /glob-parent@5.1.2: - resolution: - { - integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, - } - engines: { node: ">= 6" } - dependencies: - is-glob: 4.0.3 - - /glob-parent@6.0.2: - resolution: - { - integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, - } - engines: { node: ">=10.13.0" } - dependencies: - is-glob: 4.0.3 - - /glob-to-regexp@0.4.1: - resolution: - { - integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==, - } - dev: true - - /glob@7.2.3: - resolution: - { - integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, - } - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - /glob@8.1.0: - resolution: - { - integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==, - } - engines: { node: ">=12" } - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - dev: true - - /globals@13.24.0: - resolution: - { - integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==, - } - engines: { node: ">=8" } - dependencies: - type-fest: 0.20.2 - - /globby@11.1.0: - resolution: - { - integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, - } - engines: { node: ">=10" } - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.0 - merge2: 1.4.1 - slash: 3.0.0 - dev: false - - /graphemer@1.4.0: - resolution: - { - integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, - } - - /hanji@0.0.5: - resolution: - { - integrity: sha512-Abxw1Lq+TnYiL4BueXqMau222fPSPMFtya8HdpWsz/xVAhifXou71mPh/kY2+08RgFcVccjG3uZHs6K5HAe3zw==, - } - dependencies: - lodash.throttle: 4.1.1 - sisteransi: 1.0.5 - dev: true - - /has-flag@4.0.0: - resolution: - { - integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, - } - engines: { node: ">=8" } - - /hasown@2.0.0: - resolution: - { - integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==, - } - engines: { node: ">= 0.4" } - dependencies: - function-bind: 1.1.2 - dev: true - - /hast-util-embedded@3.0.0: - resolution: - { - integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==, - } - dependencies: - "@types/hast": 3.0.3 - hast-util-is-element: 3.0.0 - dev: false - - /hast-util-from-parse5@8.0.1: - resolution: - { - integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==, - } - dependencies: - "@types/hast": 3.0.3 - "@types/unist": 3.0.2 - devlop: 1.1.0 - hastscript: 8.0.0 - property-information: 6.4.1 - vfile: 6.0.1 - vfile-location: 5.0.2 - web-namespaces: 2.0.1 - dev: false - - /hast-util-has-property@2.0.1: - resolution: - { - integrity: sha512-X2+RwZIMTMKpXUzlotatPzWj8bspCymtXH3cfG3iQKV+wPF53Vgaqxi/eLqGck0wKq1kS9nvoB1wchbCPEL8sg==, - } - dev: false - - /hast-util-has-property@3.0.0: - resolution: - { - integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==, - } - dependencies: - "@types/hast": 3.0.3 - dev: false - - /hast-util-heading-rank@2.1.1: - resolution: - { - integrity: sha512-iAuRp+ESgJoRFJbSyaqsfvJDY6zzmFoEnL1gtz1+U8gKtGGj1p0CVlysuUAUjq95qlZESHINLThwJzNGmgGZxA==, - } - dependencies: - "@types/hast": 2.3.9 - dev: false - - /hast-util-is-body-ok-link@3.0.0: - resolution: - { - integrity: sha512-VFHY5bo2nY8HiV6nir2ynmEB1XkxzuUffhEGeVx7orbu/B1KaGyeGgMZldvMVx5xWrDlLLG/kQ6YkJAMkBEx0w==, - } - dependencies: - "@types/hast": 3.0.3 - dev: false - - /hast-util-is-element@3.0.0: - resolution: - { - integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==, - } - dependencies: - "@types/hast": 3.0.3 - dev: false - - /hast-util-parse-selector@4.0.0: - resolution: - { - integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==, - } - dependencies: - "@types/hast": 3.0.3 - dev: false - - /hast-util-phrasing@3.0.1: - resolution: - { - integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==, - } - dependencies: - "@types/hast": 3.0.3 - hast-util-embedded: 3.0.0 - hast-util-has-property: 3.0.0 - hast-util-is-body-ok-link: 3.0.0 - hast-util-is-element: 3.0.0 - dev: false - - /hast-util-raw@9.0.2: - resolution: - { - integrity: sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA==, - } - dependencies: - "@types/hast": 3.0.3 - "@types/unist": 3.0.2 - "@ungap/structured-clone": 1.2.0 - hast-util-from-parse5: 8.0.1 - hast-util-to-parse5: 8.0.0 - html-void-elements: 3.0.0 - mdast-util-to-hast: 13.1.0 - parse5: 7.1.2 - unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.1 - web-namespaces: 2.0.1 - zwitch: 2.0.4 - dev: false - - /hast-util-sanitize@5.0.1: - resolution: - { - integrity: sha512-IGrgWLuip4O2nq5CugXy4GI2V8kx4sFVy5Hd4vF7AR2gxS0N9s7nEAVUyeMtZKZvzrxVsHt73XdTsno1tClIkQ==, - } - dependencies: - "@types/hast": 3.0.3 - "@ungap/structured-clone": 1.2.0 - unist-util-position: 5.0.0 - dev: false - - /hast-util-to-html@9.0.0: - resolution: - { - integrity: sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw==, - } - dependencies: - "@types/hast": 3.0.3 - "@types/unist": 3.0.2 - ccount: 2.0.1 - comma-separated-tokens: 2.0.3 - hast-util-raw: 9.0.2 - hast-util-whitespace: 3.0.0 - html-void-elements: 3.0.0 - mdast-util-to-hast: 13.1.0 - property-information: 6.4.1 - space-separated-tokens: 2.0.2 - stringify-entities: 4.0.3 - zwitch: 2.0.4 - dev: false - - /hast-util-to-parse5@8.0.0: - resolution: - { - integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==, - } - dependencies: - "@types/hast": 3.0.3 - comma-separated-tokens: 2.0.3 - devlop: 1.1.0 - property-information: 6.4.1 - space-separated-tokens: 2.0.2 - web-namespaces: 2.0.1 - zwitch: 2.0.4 - dev: false - - /hast-util-to-string@2.0.0: - resolution: - { - integrity: sha512-02AQ3vLhuH3FisaMM+i/9sm4OXGSq1UhOOCpTLLQtHdL3tZt7qil69r8M8iDkZYyC0HCFylcYoP+8IO7ddta1A==, - } - dependencies: - "@types/hast": 2.3.9 - dev: false - - /hast-util-to-text@4.0.0: - resolution: - { - integrity: sha512-EWiE1FSArNBPUo1cKWtzqgnuRQwEeQbQtnFJRYV1hb1BWDgrAlBU0ExptvZMM/KSA82cDpm2sFGf3Dmc5Mza3w==, - } - dependencies: - "@types/hast": 3.0.3 - "@types/unist": 3.0.2 - hast-util-is-element: 3.0.0 - unist-util-find-after: 5.0.0 - dev: false - - /hast-util-whitespace@3.0.0: - resolution: - { - integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==, - } - dependencies: - "@types/hast": 3.0.3 - dev: false - - /hastscript@8.0.0: - resolution: - { - integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==, - } - dependencies: - "@types/hast": 3.0.3 - comma-separated-tokens: 2.0.3 - hast-util-parse-selector: 4.0.0 - property-information: 6.4.1 - space-separated-tokens: 2.0.2 - dev: false - - /heap@0.2.7: - resolution: - { - integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==, - } - dev: true - - /highlight.js@11.9.0: - resolution: - { - integrity: sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==, - } - engines: { node: ">=12.0.0" } - dev: false - - /hono@3.12.8: - resolution: - { - integrity: sha512-vnOEIRdqsp4uHE/dkOBr9EYmTsR86sD/FyG2xhfAQzR9udDRglN1nuO7SGc/7U3HfSorc6PSCNGN6upnVtCmfg==, - } - engines: { node: ">=16.0.0" } - dev: false - - /hookable@5.5.3: - resolution: - { - integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==, - } - dev: false - - /html-void-elements@3.0.0: - resolution: - { - integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==, - } - dev: false - - /html-whitespace-sensitive-tag-names@3.0.0: - resolution: - { - integrity: sha512-KlClZ3/Qy5UgvpvVvDomGhnQhNWH5INE8GwvSIQ9CWt1K0zbbXrl7eN5bWaafOZgtmO3jMPwUqmrmEwinhPq1w==, - } - dev: false - - /httpsnippet-lite@3.0.5: - resolution: - { - integrity: sha512-So4qTXY5iFj5XtFDwyz2PicUu+8NWrI8e8h+ZeZoVtMNcFQp4FFIntBHUE+JPUG6QQU8o1VHCy+X4ETRDwt9CA==, - } - engines: { node: ">=14.13" } - dependencies: - "@types/har-format": 1.2.15 - formdata-node: 4.4.1 - stringify-object: 3.3.0 - dev: false - - /husky@9.0.6: - resolution: - { - integrity: sha512-EEuw/rfTiMjOfuL7pGO/i9otg1u36TXxqjIA6D9qxVjd/UXoDOsLor/BSFf5hTK50shwzCU3aVVwdXDp/lp7RA==, - } - engines: { node: ">=18" } - hasBin: true - dev: true - - /ieee754@1.2.1: - resolution: - { - integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, - } - dev: false - - /ignore@5.3.0: - resolution: - { - integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==, - } - engines: { node: ">= 4" } - - /import-fresh@3.3.0: - resolution: - { - integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, - } - engines: { node: ">=6" } - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - /imurmurhash@0.1.4: - resolution: - { - integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, - } - engines: { node: ">=0.8.19" } - - /inflight@1.0.6: - resolution: - { - integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, - } - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - /inherits@2.0.4: - resolution: - { - integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, - } - - /ini@1.3.8: - resolution: - { - integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, - } - dev: false - - /is-absolute-url@4.0.1: - resolution: - { - integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - dev: false - - /is-binary-path@2.1.0: - resolution: - { - integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, - } - engines: { node: ">=8" } - dependencies: - binary-extensions: 2.2.0 - dev: true - - /is-buffer@2.0.5: - resolution: - { - integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==, - } - engines: { node: ">=4" } - dev: false - - /is-core-module@2.13.1: - resolution: - { - integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==, - } - dependencies: - hasown: 2.0.0 - dev: true - - /is-extglob@2.1.1: - resolution: - { - integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, - } - engines: { node: ">=0.10.0" } - - /is-glob@4.0.3: - resolution: - { - integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, - } - engines: { node: ">=0.10.0" } - dependencies: - is-extglob: 2.1.1 - - /is-number@7.0.0: - resolution: - { - integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, - } - engines: { node: ">=0.12.0" } - - /is-obj@1.0.1: - resolution: - { - integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==, - } - engines: { node: ">=0.10.0" } - dev: false - - /is-path-inside@3.0.3: - resolution: - { - integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, - } - engines: { node: ">=8" } - - /is-plain-obj@4.1.0: - resolution: - { - integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==, - } - engines: { node: ">=12" } - dev: false - - /is-promise@2.2.2: - resolution: - { - integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==, - } - dev: true - - /is-regexp@1.0.0: - resolution: - { - integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==, - } - engines: { node: ">=0.10.0" } - dev: false - - /is-what@4.1.16: - resolution: - { - integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==, - } - engines: { node: ">=12.13" } - dev: true - - /isexe@2.0.0: - resolution: - { - integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, - } - - /javascript-time-ago@2.5.9: - resolution: - { - integrity: sha512-pQ8mNco/9g9TqWXWWjP0EWl6i/lAQScOyEeXy5AB+f7MfLSdgyV9BJhiOD1zrIac/lrxPYOWNbyl/IW8CW5n0A==, - } - dependencies: - relative-time-format: 1.1.6 - dev: false - - /js-base64@3.7.6: - resolution: - { - integrity: sha512-NPrWuHFxFUknr1KqJRDgUQPexQF0uIJWjeT+2KjEePhitQxQEx5EJBG1lVn5/hc8aLycTpXrDOgPQ6Zq+EDiTA==, - } - dev: false - - /js-yaml@3.14.1: - resolution: - { - integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==, - } - hasBin: true - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - dev: false - - /js-yaml@4.1.0: - resolution: - { - integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, - } - hasBin: true - dependencies: - argparse: 2.0.1 - - /json-buffer@3.0.1: - resolution: - { - integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, - } - - /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-schema-traverse@0.4.1: - resolution: - { - integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, - } - - /json-schema-traverse@1.0.0: - resolution: - { - integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==, - } - dev: false - - /json-stable-stringify-without-jsonify@1.0.1: - resolution: - { - integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, - } - - /keyv@4.5.4: - resolution: - { - integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, - } - dependencies: - json-buffer: 3.0.1 - - /levn@0.4.1: - resolution: - { - integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, - } - engines: { node: ">= 0.8.0" } - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - - /libsql@0.2.0: - resolution: - { - integrity: sha512-ELBRqhpJx5Dap0187zKQnntZyk4EjlDHSrjIVL8t+fQ5e8IxbQTeYgZgigMjB1EvrETdkm0Y0VxBGhzPQ+t0Jg==, - } - cpu: [x64, arm64] - os: [darwin, linux, win32] - dependencies: - "@neon-rs/load": 0.0.4 - detect-libc: 2.0.2 - optionalDependencies: - "@libsql/darwin-arm64": 0.2.0 - "@libsql/darwin-x64": 0.2.0 - "@libsql/linux-arm64-gnu": 0.2.0 - "@libsql/linux-arm64-musl": 0.2.0 - "@libsql/linux-x64-gnu": 0.2.0 - "@libsql/linux-x64-musl": 0.2.0 - "@libsql/win32-x64-msvc": 0.2.0 - dev: false - - /locate-path@6.0.0: - resolution: - { - integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, - } - engines: { node: ">=10" } - dependencies: - p-locate: 5.0.0 - - /lodash.merge@4.6.2: - resolution: - { - integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, - } - - /lodash.throttle@4.1.1: - resolution: - { - integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==, - } - dev: true - - /lodash@4.17.21: - resolution: - { - integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, - } - dev: false - - /longest-streak@3.1.0: - resolution: - { - integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==, - } - dev: false - - /lowlight@3.1.0: - resolution: - { - integrity: sha512-CEbNVoSikAxwDMDPjXlqlFYiZLkDJHwyGu/MfOsJnF3d7f3tds5J3z8s/l9TMXhzfsJCCJEAsD78842mwmg0PQ==, - } - dependencies: - "@types/hast": 3.0.3 - devlop: 1.1.0 - highlight.js: 11.9.0 - dev: false - - /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 - - /lucia@3.0.0: - resolution: - { - integrity: sha512-60NQqjKuaqPrjHL10CQ1j3rQy8qwKd3XpSNNnNcZyZI+4w1QFJdtNcR4l0dZJ4kJ0DdwI/943yplL47V7IZbGQ==, - } - dependencies: - oslo: 1.0.1 - dev: false - - /magic-string@0.25.9: - resolution: - { - integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==, - } - dependencies: - sourcemap-codec: 1.4.8 - dev: true - - /magic-string@0.30.5: - resolution: - { - integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==, - } - engines: { node: ">=12" } - dependencies: - "@jridgewell/sourcemap-codec": 1.4.15 - dev: false - - /markdown-table@3.0.3: - resolution: - { - integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==, - } - dev: false - - /mdast-util-find-and-replace@3.0.1: - resolution: - { - integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==, - } - dependencies: - "@types/mdast": 4.0.3 - escape-string-regexp: 5.0.0 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 - dev: false - - /mdast-util-from-markdown@2.0.0: - resolution: - { - integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==, - } - dependencies: - "@types/mdast": 4.0.3 - "@types/unist": 3.0.2 - decode-named-character-reference: 1.0.2 - devlop: 1.1.0 - mdast-util-to-string: 4.0.0 - micromark: 4.0.0 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-decode-string: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - unist-util-stringify-position: 4.0.0 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-gfm-autolink-literal@2.0.0: - resolution: - { - integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==, - } - dependencies: - "@types/mdast": 4.0.3 - ccount: 2.0.1 - devlop: 1.1.0 - mdast-util-find-and-replace: 3.0.1 - micromark-util-character: 2.0.1 - dev: false - - /mdast-util-gfm-footnote@2.0.0: - resolution: - { - integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==, - } - dependencies: - "@types/mdast": 4.0.3 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 - micromark-util-normalize-identifier: 2.0.0 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-gfm-strikethrough@2.0.0: - resolution: - { - integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==, - } - dependencies: - "@types/mdast": 4.0.3 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-gfm-table@2.0.0: - resolution: - { - integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==, - } - dependencies: - "@types/mdast": 4.0.3 - devlop: 1.1.0 - markdown-table: 3.0.3 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-gfm-task-list-item@2.0.0: - resolution: - { - integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==, - } - dependencies: - "@types/mdast": 4.0.3 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-gfm@3.0.0: - resolution: - { - integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==, - } - dependencies: - mdast-util-from-markdown: 2.0.0 - mdast-util-gfm-autolink-literal: 2.0.0 - mdast-util-gfm-footnote: 2.0.0 - mdast-util-gfm-strikethrough: 2.0.0 - mdast-util-gfm-table: 2.0.0 - mdast-util-gfm-task-list-item: 2.0.0 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-phrasing@4.0.0: - resolution: - { - integrity: sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==, - } - dependencies: - "@types/mdast": 4.0.3 - unist-util-is: 6.0.0 - dev: false - - /mdast-util-to-hast@13.1.0: - resolution: - { - integrity: sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==, - } - dependencies: - "@types/hast": 3.0.3 - "@types/mdast": 4.0.3 - "@ungap/structured-clone": 1.2.0 - devlop: 1.1.0 - micromark-util-sanitize-uri: 2.0.0 - trim-lines: 3.0.1 - unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.1 - dev: false - - /mdast-util-to-markdown@2.1.0: - resolution: - { - integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==, - } - dependencies: - "@types/mdast": 4.0.3 - "@types/unist": 3.0.2 - longest-streak: 3.1.0 - mdast-util-phrasing: 4.0.0 - mdast-util-to-string: 4.0.0 - micromark-util-decode-string: 2.0.0 - unist-util-visit: 5.0.0 - zwitch: 2.0.4 - dev: false - - /mdast-util-to-string@3.2.0: - resolution: - { - integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==, - } - dependencies: - "@types/mdast": 3.0.15 - dev: false - - /mdast-util-to-string@4.0.0: - resolution: - { - integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==, - } - dependencies: - "@types/mdast": 4.0.3 - 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 - - /merge2@1.4.1: - resolution: - { - integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, - } - engines: { node: ">= 8" } - dev: false - - /micromark-core-commonmark@2.0.0: - resolution: - { - integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==, - } - dependencies: - decode-named-character-reference: 1.0.2 - devlop: 1.1.0 - micromark-factory-destination: 2.0.0 - micromark-factory-label: 2.0.0 - micromark-factory-space: 2.0.0 - micromark-factory-title: 2.0.0 - micromark-factory-whitespace: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-chunked: 2.0.0 - micromark-util-classify-character: 2.0.0 - micromark-util-html-tag-name: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-subtokenize: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-extension-gfm-autolink-literal@2.0.0: - resolution: - { - integrity: sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==, - } - dependencies: - micromark-util-character: 2.0.1 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-extension-gfm-footnote@2.0.0: - resolution: - { - integrity: sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==, - } - dependencies: - devlop: 1.1.0 - micromark-core-commonmark: 2.0.0 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-extension-gfm-strikethrough@2.0.0: - resolution: - { - integrity: sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==, - } - dependencies: - devlop: 1.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-classify-character: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-extension-gfm-table@2.0.0: - resolution: - { - integrity: sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==, - } - dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-extension-gfm-tagfilter@2.0.0: - resolution: - { - integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==, - } - dependencies: - micromark-util-types: 2.0.0 - dev: false - - /micromark-extension-gfm-task-list-item@2.0.1: - resolution: - { - integrity: sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==, - } - dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-extension-gfm@3.0.0: - resolution: - { - integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==, - } - dependencies: - micromark-extension-gfm-autolink-literal: 2.0.0 - micromark-extension-gfm-footnote: 2.0.0 - micromark-extension-gfm-strikethrough: 2.0.0 - micromark-extension-gfm-table: 2.0.0 - micromark-extension-gfm-tagfilter: 2.0.0 - micromark-extension-gfm-task-list-item: 2.0.1 - micromark-util-combine-extensions: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-factory-destination@2.0.0: - resolution: - { - integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==, - } - dependencies: - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-factory-label@2.0.0: - resolution: - { - integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==, - } - dependencies: - devlop: 1.1.0 - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-factory-space@2.0.0: - resolution: - { - integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==, - } - dependencies: - micromark-util-character: 2.0.1 - micromark-util-types: 2.0.0 - dev: false - - /micromark-factory-title@2.0.0: - resolution: - { - integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==, - } - dependencies: - micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-factory-whitespace@2.0.0: - resolution: - { - integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==, - } - dependencies: - micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-util-character@2.0.1: - resolution: - { - integrity: sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==, - } - dependencies: - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-util-chunked@2.0.0: - resolution: - { - integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==, - } - dependencies: - micromark-util-symbol: 2.0.0 - dev: false - - /micromark-util-classify-character@2.0.0: - resolution: - { - integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==, - } - dependencies: - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-util-combine-extensions@2.0.0: - resolution: - { - integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==, - } - dependencies: - micromark-util-chunked: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-util-decode-numeric-character-reference@2.0.1: - resolution: - { - integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==, - } - dependencies: - micromark-util-symbol: 2.0.0 - dev: false - - /micromark-util-decode-string@2.0.0: - resolution: - { - integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==, - } - dependencies: - decode-named-character-reference: 1.0.2 - micromark-util-character: 2.0.1 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-symbol: 2.0.0 - dev: false - - /micromark-util-encode@2.0.0: - resolution: - { - integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==, - } - dev: false - - /micromark-util-html-tag-name@2.0.0: - resolution: - { - integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==, - } - dev: false - - /micromark-util-normalize-identifier@2.0.0: - resolution: - { - integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==, - } - dependencies: - micromark-util-symbol: 2.0.0 - dev: false - - /micromark-util-resolve-all@2.0.0: - resolution: - { - integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==, - } - dependencies: - micromark-util-types: 2.0.0 - dev: false - - /micromark-util-sanitize-uri@2.0.0: - resolution: - { - integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==, - } - dependencies: - micromark-util-character: 2.0.1 - micromark-util-encode: 2.0.0 - micromark-util-symbol: 2.0.0 - dev: false - - /micromark-util-subtokenize@2.0.0: - resolution: - { - integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==, - } - dependencies: - devlop: 1.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-util-symbol@2.0.0: - resolution: - { - integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==, - } - dev: false - - /micromark-util-types@2.0.0: - resolution: - { - integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==, - } - dev: false - - /micromark@4.0.0: - resolution: - { - integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==, - } - dependencies: - "@types/debug": 4.1.12 - debug: 4.3.4 - decode-named-character-reference: 1.0.2 - devlop: 1.1.0 - micromark-core-commonmark: 2.0.0 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-chunked: 2.0.0 - micromark-util-combine-extensions: 2.0.0 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-encode: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-subtokenize: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - transitivePeerDependencies: - - supports-color - dev: false - - /micromatch@4.0.5: - resolution: - { - integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, - } - engines: { node: ">=8.6" } - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - dev: false - - /mime-db@1.52.0: - resolution: - { - integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, - } - engines: { node: ">= 0.6" } - dev: false - - /mime-types@2.1.35: - resolution: - { - integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, - } - engines: { node: ">= 0.6" } - dependencies: - mime-db: 1.52.0 - dev: false - - /mime@3.0.0: - resolution: - { - integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==, - } - engines: { node: ">=10.0.0" } - hasBin: true - dev: true - - /mimic-response@3.1.0: - resolution: - { - integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==, - } - engines: { node: ">=10" } - dev: false - - /miniflare@3.20231218.4: - resolution: - { - integrity: sha512-2mpxvDiRBxGGGVnTKC0SZy0FtTXxFs3tM1ol67EoIJABGzvWFf33GThwh+/dRmaHSjKKId/FI8rEl5JxXXXZgQ==, - } - engines: { node: ">=16.13" } - hasBin: true - dependencies: - "@cspotcode/source-map-support": 0.8.1 - acorn: 8.11.3 - acorn-walk: 8.3.2 - capnp-ts: 0.7.0 - exit-hook: 2.2.1 - glob-to-regexp: 0.4.1 - stoppable: 1.1.0 - undici: 5.28.2 - workerd: 1.20231218.0 - ws: 8.16.0 - 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 - - /minimatch@5.1.6: - resolution: - { - integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==, - } - engines: { node: ">=10" } - dependencies: - brace-expansion: 2.0.1 - dev: true - - /minimatch@7.4.6: - resolution: - { - integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==, - } - engines: { node: ">=10" } - dependencies: - brace-expansion: 2.0.1 - dev: true - - /minimatch@9.0.3: - resolution: - { - integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==, - } - engines: { node: ">=16 || 14 >=14.17" } - dependencies: - brace-expansion: 2.0.1 - dev: false - - /minimist@1.2.8: - resolution: - { - integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, - } - dev: false - - /mkdirp-classic@0.5.3: - resolution: - { - integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==, - } - dev: false - - /ms@2.1.2: - resolution: - { - integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, - } - - /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 - - /nanoid@5.0.4: - resolution: - { - integrity: sha512-vAjmBf13gsmhXSgBrtIclinISzFFy22WwCYoyilZlsrRXNIHSwgFQ1bEdjRwMT3aoadeIF6HMuDRlOxzfXV8ig==, - } - engines: { node: ^18 || >=20 } - hasBin: true - dev: false - - /napi-build-utils@1.0.2: - resolution: - { - integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==, - } - dev: false - - /natural-compare@1.4.0: - resolution: - { - integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, - } - - /next-tick@1.1.0: - resolution: - { - integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==, - } - dev: true - - /node-abi@3.54.0: - resolution: - { - integrity: sha512-p7eGEiQil0YUV3ItH4/tBb781L5impVmmx2E9FRKF7d18XXzp4PGT2tdYMFY6wQqgxD0IwNZOiSJ0/K0fSi/OA==, - } - engines: { node: ">=10" } - dependencies: - semver: 7.5.4 - dev: false - - /node-domexception@1.0.0: - resolution: - { - integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==, - } - engines: { node: ">=10.5.0" } - dev: false - - /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-fetch@3.3.2: - resolution: - { - integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - dependencies: - data-uri-to-buffer: 4.0.1 - fetch-blob: 3.2.0 - formdata-polyfill: 4.0.10 - dev: false - - /node-forge@1.3.1: - resolution: - { - integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==, - } - engines: { node: ">= 6.13.0" } - dev: true - - /normalize-path@3.0.0: - resolution: - { - integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, - } - engines: { node: ">=0.10.0" } - dev: true - - /once@1.4.0: - resolution: - { - integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, - } - dependencies: - wrappy: 1.0.2 - - /openapi-types@12.1.3: - resolution: - { - integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==, - } - dev: false - - /openapi3-ts@4.2.1: - resolution: - { - integrity: sha512-KL1mKwkZii5ce+tb24KCUmQHyWB/oanG5fzUY35UB+wenWJv4Kr/IWBntpn5R8ODiJcxx13ZDophcpHnLGeIOw==, - } - dependencies: - yaml: 2.3.4 - - /optionator@0.9.3: - resolution: - { - integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==, - } - engines: { node: ">= 0.8.0" } - dependencies: - "@aashutoshrathi/word-wrap": 1.2.6 - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - - /oslo@1.0.1: - resolution: - { - integrity: sha512-esfzZry+HfGgK/GCYkg7BRlLd3RH5aHa08wgLJPYjENXybi0BvXxGk0LbUj+lXfz2TkjPDHe4rB/o6JxRLHxBg==, - } - dependencies: - "@node-rs/argon2": 1.7.2 - "@node-rs/bcrypt": 1.9.2 - dev: false - - /oslo@1.0.2: - resolution: - { - integrity: sha512-yBoZN0sOL5eEngLR2tFMTk2YFBF7czq/3ASCTM0WizAnUTllVRetCAsmV2CMMfu699VIe7f6vhNgJ0bQ2ejedg==, - } - dependencies: - "@node-rs/argon2": 1.7.2 - "@node-rs/bcrypt": 1.9.2 - dev: false - - /p-limit@3.1.0: - resolution: - { - integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, - } - engines: { node: ">=10" } - dependencies: - yocto-queue: 0.1.0 - - /p-locate@5.0.0: - resolution: - { - integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, - } - engines: { node: ">=10" } - dependencies: - p-limit: 3.1.0 - - /parent-module@1.0.1: - resolution: - { - integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, - } - engines: { node: ">=6" } - dependencies: - callsites: 3.1.0 - - /parse-ms@3.0.0: - resolution: - { - integrity: sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==, - } - engines: { node: ">=12" } - dev: false - - /parse5@7.1.2: - resolution: - { - integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==, - } - dependencies: - entities: 4.5.0 - dev: false - - /path-exists@4.0.0: - resolution: - { - integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, - } - engines: { node: ">=8" } - - /path-is-absolute@1.0.1: - resolution: - { - integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, - } - engines: { node: ">=0.10.0" } - - /path-key@3.1.1: - resolution: - { - integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, - } - engines: { node: ">=8" } - - /path-parse@1.0.7: - resolution: - { - integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, - } - dev: true - - /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" } - dev: false - - /picocolors@1.0.0: - resolution: - { - integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==, - } - dev: false - - /picomatch@2.3.1: - resolution: - { - integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, - } - engines: { node: ">=8.6" } - - /postcss-nested@6.0.1(postcss@8.4.33): - resolution: - { - integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==, - } - engines: { node: ">=12.0" } - peerDependencies: - postcss: ^8.2.14 - dependencies: - postcss: 8.4.33 - postcss-selector-parser: 6.0.15 - dev: false - - /postcss-selector-parser@6.0.15: - resolution: - { - integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==, - } - engines: { node: ">=4" } - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - dev: false - - /postcss@8.4.33: - resolution: - { - integrity: sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==, - } - engines: { node: ^10 || ^12 || >=14 } - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.0.2 - dev: false - - /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.54.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 - - /prelude-ls@1.2.1: - resolution: - { - integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, - } - engines: { node: ">= 0.8.0" } - - /prettier@3.2.4: - resolution: - { - integrity: sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==, - } - engines: { node: ">=14" } - hasBin: true - dev: false - - /pretty-bytes@6.1.1: - resolution: - { - integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==, - } - engines: { node: ^14.13.1 || >=16.0.0 } - dev: false - - /pretty-ms@8.0.0: - resolution: - { - integrity: sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==, - } - engines: { node: ">=14.16" } - dependencies: - parse-ms: 3.0.0 - dev: false - - /printable-characters@1.0.42: - resolution: - { - integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==, - } - dev: true - - /property-information@6.4.1: - resolution: - { - integrity: sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==, - } - dev: false - - /proxy-from-env@1.1.0: - resolution: - { - integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==, - } - 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" } - - /queue-microtask@1.2.3: - resolution: - { - integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, - } - - /rc@1.2.8: - resolution: - { - integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==, - } - hasBin: true - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - dev: false - - /readable-stream@3.6.2: - resolution: - { - integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, - } - engines: { node: ">= 6" } - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - dev: false - - /readdirp@3.6.0: - resolution: - { - integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, - } - engines: { node: ">=8.10.0" } - dependencies: - picomatch: 2.3.1 - dev: true - - /regenerator-runtime@0.14.1: - resolution: - { - integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==, - } - dev: false - - /rehype-external-links@3.0.0: - resolution: - { - integrity: sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==, - } - dependencies: - "@types/hast": 3.0.3 - "@ungap/structured-clone": 1.2.0 - hast-util-is-element: 3.0.0 - is-absolute-url: 4.0.1 - space-separated-tokens: 2.0.2 - unist-util-visit: 5.0.0 - dev: false - - /rehype-format@5.0.0: - resolution: - { - integrity: sha512-kM4II8krCHmUhxrlvzFSptvaWh280Fr7UGNJU5DCMuvmAwGCNmGfi9CvFAQK6JDjsNoRMWQStglK3zKJH685Wg==, - } - dependencies: - "@types/hast": 3.0.3 - hast-util-embedded: 3.0.0 - hast-util-is-element: 3.0.0 - hast-util-phrasing: 3.0.1 - hast-util-whitespace: 3.0.0 - html-whitespace-sensitive-tag-names: 3.0.0 - rehype-minify-whitespace: 6.0.0 - unist-util-visit-parents: 6.0.1 - dev: false - - /rehype-highlight@7.0.0: - resolution: - { - integrity: sha512-QtobgRgYoQaK6p1eSr2SD1i61f7bjF2kZHAQHxeCHAuJf7ZUDMvQ7owDq9YTkmar5m5TSUol+2D3bp3KfJf/oA==, - } - dependencies: - "@types/hast": 3.0.3 - hast-util-to-text: 4.0.0 - lowlight: 3.1.0 - unist-util-visit: 5.0.0 - vfile: 6.0.1 - dev: false - - /rehype-minify-whitespace@6.0.0: - resolution: - { - integrity: sha512-i9It4YHR0Sf3GsnlR5jFUKXRr9oayvEk9GKQUkwZv6hs70OH9q3OCZrq9PpLvIGKt3W+JxBOxCidNVpH/6rWdA==, - } - dependencies: - "@types/hast": 3.0.3 - hast-util-embedded: 3.0.0 - hast-util-is-element: 3.0.0 - hast-util-whitespace: 3.0.0 - unist-util-is: 6.0.0 - dev: false - - /rehype-sanitize@6.0.0: - resolution: - { - integrity: sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==, - } - dependencies: - "@types/hast": 3.0.3 - hast-util-sanitize: 5.0.1 - dev: false - - /rehype-slug-custom-id@1.1.0: - resolution: - { - integrity: sha512-lLdTHGd7u5bOXRDnD78/VHrVZsG63nN6lZUuQgcuupGt1+v+uDW7pCeQS0cvptRcZPYzg8B+0bf8sUiMBKsjZw==, - } - dependencies: - "@types/hast": 2.3.9 - github-slugger: 1.5.0 - hast-util-has-property: 2.0.1 - hast-util-heading-rank: 2.1.1 - hast-util-to-string: 2.0.0 - lodash: 4.17.21 - unified: 10.1.2 - unist-util-visit: 4.1.2 - dev: false - - /rehype-stringify@10.0.0: - resolution: - { - integrity: sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ==, - } - dependencies: - "@types/hast": 3.0.3 - hast-util-to-html: 9.0.0 - unified: 11.0.4 - dev: false - - /relative-time-format@1.1.6: - resolution: - { - integrity: sha512-aCv3juQw4hT1/P/OrVltKWLlp15eW1GRcwP1XdxHrPdZE9MtgqFpegjnTjLhi2m2WI9MT/hQQtE+tjEWG1hgkQ==, - } - dev: false - - /remark-gfm@4.0.0: - resolution: - { - integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==, - } - dependencies: - "@types/mdast": 4.0.3 - mdast-util-gfm: 3.0.0 - micromark-extension-gfm: 3.0.0 - remark-parse: 11.0.0 - remark-stringify: 11.0.0 - unified: 11.0.4 - transitivePeerDependencies: - - supports-color - dev: false - - /remark-parse@11.0.0: - resolution: - { - integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==, - } - dependencies: - "@types/mdast": 4.0.3 - mdast-util-from-markdown: 2.0.0 - micromark-util-types: 2.0.0 - unified: 11.0.4 - transitivePeerDependencies: - - supports-color - dev: false - - /remark-rehype@11.1.0: - resolution: - { - integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==, - } - dependencies: - "@types/hast": 3.0.3 - "@types/mdast": 4.0.3 - mdast-util-to-hast: 13.1.0 - unified: 11.0.4 - vfile: 6.0.1 - dev: false - - /remark-stringify@11.0.0: - resolution: - { - integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==, - } - dependencies: - "@types/mdast": 4.0.3 - mdast-util-to-markdown: 2.1.0 - unified: 11.0.4 - dev: false - - /require-from-string@2.0.2: - resolution: - { - integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==, - } - engines: { node: ">=0.10.0" } - dev: false - - /resolve-from@4.0.0: - resolution: - { - integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, - } - engines: { node: ">=4" } - - /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" } - dev: true - - /resolve@1.22.8: - resolution: - { - integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==, - } - hasBin: true - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - - /reusify@1.0.4: - resolution: - { - integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, - } - engines: { iojs: ">=1.0.0", node: ">=0.10.0" } - - /rimraf@3.0.2: - resolution: - { - integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, - } - hasBin: true - dependencies: - glob: 7.2.3 - - /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. - 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 - dev: true - - /run-parallel@1.2.0: - resolution: - { - integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, - } - dependencies: - queue-microtask: 1.2.3 - - /safe-buffer@5.2.1: - resolution: - { - integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, - } - dev: false - - /selfsigned@2.4.1: - resolution: - { - integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==, - } - engines: { node: ">=10" } - dependencies: - "@types/node-forge": 1.3.11 - node-forge: 1.3.1 - dev: true - - /semver@7.5.4: - resolution: - { - integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==, - } - engines: { node: ">=10" } - hasBin: true - dependencies: - lru-cache: 6.0.0 - - /shebang-command@2.0.0: - resolution: - { - integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, - } - engines: { node: ">=8" } - dependencies: - shebang-regex: 3.0.0 - - /shebang-regex@3.0.0: - resolution: - { - integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, - } - engines: { node: ">=8" } - - /simple-concat@1.0.1: - resolution: - { - integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==, - } - dev: false - - /simple-get@4.0.1: - resolution: - { - integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==, - } - dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 - 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: false - - /source-map-js@1.0.2: - resolution: - { - integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==, - } - engines: { node: ">=0.10.0" } - dev: false - - /source-map-support@0.5.21: - resolution: - { - integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, - } - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - dev: true - - /source-map@0.6.1: - resolution: - { - integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, - } - engines: { node: ">=0.10.0" } - dev: true - - /sourcemap-codec@1.4.8: - resolution: - { - integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==, - } - deprecated: Please use @jridgewell/sourcemap-codec instead - dev: true - - /space-separated-tokens@2.0.2: - resolution: - { - integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==, - } - dev: false - - /sprintf-js@1.0.3: - resolution: - { - integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==, - } - dev: false - - /stacktracey@2.1.8: - resolution: - { - integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==, - } - dependencies: - as-table: 1.0.55 - get-source: 2.0.12 - dev: true - - /stoppable@1.1.0: - resolution: - { - integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==, - } - engines: { node: ">=4", npm: ">=6" } - dev: true - - /string_decoder@1.3.0: - resolution: - { - integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, - } - dependencies: - safe-buffer: 5.2.1 - dev: false - - /stringify-entities@4.0.3: - resolution: - { - integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==, - } - dependencies: - character-entities-html4: 2.1.0 - character-entities-legacy: 3.0.0 - dev: false - - /stringify-object@3.3.0: - resolution: - { - integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==, - } - engines: { node: ">=4" } - dependencies: - get-own-enumerable-property-symbols: 3.0.2 - is-obj: 1.0.1 - is-regexp: 1.0.0 - dev: false - - /strip-ansi@6.0.1: - resolution: - { - integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, - } - engines: { node: ">=8" } - dependencies: - ansi-regex: 5.0.1 - - /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" } - - /style-mod@4.1.0: - resolution: - { - integrity: sha512-Ca5ib8HrFn+f+0n4N4ScTIA9iTOQ7MaGS1ylHcoVqW9J7w2w8PzN6g9gKmTYgGEBH8e120+RCmhpje6jC5uGWA==, - } - dev: false - - /superjson@2.2.1: - resolution: - { - integrity: sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==, - } - engines: { node: ">=16" } - dependencies: - copy-anything: 3.0.5 - dev: true - - /supports-color@7.2.0: - resolution: - { - integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, - } - engines: { node: ">=8" } - dependencies: - has-flag: 4.0.0 - - /supports-preserve-symlinks-flag@1.0.0: - resolution: - { - integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, - } - engines: { node: ">= 0.4" } - dev: true - - /tailwind-merge@2.2.1: - resolution: - { - integrity: sha512-o+2GTLkthfa5YUt4JxPfzMIpQzZ3adD1vLVkvKE1Twl9UAhGsEbIZhHHZVRttyW177S8PDJI3bTQNaebyofK3Q==, - } - dependencies: - "@babel/runtime": 7.23.9 - dev: false - - /tar-fs@2.1.1: - resolution: - { - integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==, - } - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.0 - tar-stream: 2.2.0 - dev: false - - /tar-stream@2.2.0: - resolution: - { - integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==, - } - engines: { node: ">=6" } - 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 - - /text-table@0.2.0: - resolution: - { - integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, - } - - /timers-ext@0.1.7: - resolution: - { - integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==, - } - dependencies: - es5-ext: 0.10.62 - next-tick: 1.1.0 - dev: true - - /to-fast-properties@2.0.0: - resolution: - { - integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==, - } - engines: { node: ">=4" } - dev: false - - /to-regex-range@5.0.1: - resolution: - { - integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, - } - engines: { node: ">=8.0" } - dependencies: - is-number: 7.0.0 - - /tr46@0.0.3: - resolution: - { - integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, - } - dev: false - - /trim-lines@3.0.1: - resolution: - { - integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==, - } - dev: false - - /trough@2.1.0: - resolution: - { - integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==, - } - dev: false - - /ts-api-utils@1.0.3(typescript@5.3.3): - resolution: - { - integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==, - } - engines: { node: ">=16.13.0" } - peerDependencies: - typescript: ">=4.2.0" - dependencies: - typescript: 5.3.3 - dev: false - - /tslib@2.6.2: - resolution: - { - integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==, - } - - /tsx@4.7.0: - resolution: - { - integrity: sha512-I+t79RYPlEYlHn9a+KzwrvEwhJg35h/1zHsLC2JXvhC2mdynMv6Zxzvhv5EMV6VF5qJlLlkSnMVvdZV3PSIGcg==, - } - engines: { node: ">=18.0.0" } - hasBin: true - dependencies: - esbuild: 0.19.12 - get-tsconfig: 4.7.2 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /tunnel-agent@0.6.0: - resolution: - { - integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==, - } - dependencies: - safe-buffer: 5.2.1 - dev: false - - /type-check@0.4.0: - resolution: - { - integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, - } - engines: { node: ">= 0.8.0" } - dependencies: - prelude-ls: 1.2.1 - - /type-fest@0.20.2: - resolution: - { - integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==, - } - engines: { node: ">=10" } - - /type@1.2.0: - resolution: - { - integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==, - } - dev: true - - /type@2.7.2: - resolution: - { - integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==, - } - dev: true - - /typescript@5.3.3: - resolution: - { - integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==, - } - engines: { node: ">=14.17" } - hasBin: true - - /undici-types@5.26.5: - resolution: - { - integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==, - } - - /undici@5.28.2: - resolution: - { - integrity: sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==, - } - engines: { node: ">=14.0" } - dependencies: - "@fastify/busboy": 2.1.0 - dev: true - - /unhead@1.8.10: - resolution: - { - integrity: sha512-dth8FvZkLriO5ZWWOBIYBNSfGiwJtKcqpPWpSOk/Z0e2jdlgwoZEWZHFyte0EKvmbZxKcsWNMqIuv7dEmS5yZQ==, - } - dependencies: - "@unhead/dom": 1.8.10 - "@unhead/schema": 1.8.10 - "@unhead/shared": 1.8.10 - hookable: 5.5.3 - dev: false - - /unified@10.1.2: - resolution: - { - integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==, - } - dependencies: - "@types/unist": 2.0.10 - bail: 2.0.2 - extend: 3.0.2 - is-buffer: 2.0.5 - is-plain-obj: 4.1.0 - trough: 2.1.0 - vfile: 5.3.7 - dev: false - - /unified@11.0.4: - resolution: - { - integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==, - } - dependencies: - "@types/unist": 3.0.2 - bail: 2.0.2 - devlop: 1.1.0 - extend: 3.0.2 - is-plain-obj: 4.1.0 - trough: 2.1.0 - vfile: 6.0.1 - dev: false - - /unist-util-find-after@5.0.0: - resolution: - { - integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==, - } - dependencies: - "@types/unist": 3.0.2 - unist-util-is: 6.0.0 - dev: false - - /unist-util-is@5.2.1: - resolution: - { - integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==, - } - dependencies: - "@types/unist": 2.0.10 - dev: false - - /unist-util-is@6.0.0: - resolution: - { - integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==, - } - dependencies: - "@types/unist": 3.0.2 - dev: false - - /unist-util-position@5.0.0: - resolution: - { - integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==, - } - dependencies: - "@types/unist": 3.0.2 - dev: false - - /unist-util-stringify-position@3.0.3: - resolution: - { - integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==, - } - dependencies: - "@types/unist": 2.0.10 - dev: false - - /unist-util-stringify-position@4.0.0: - resolution: - { - integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==, - } - dependencies: - "@types/unist": 3.0.2 - dev: false - - /unist-util-visit-parents@5.1.3: - resolution: - { - integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==, - } - dependencies: - "@types/unist": 2.0.10 - unist-util-is: 5.2.1 - dev: false - - /unist-util-visit-parents@6.0.1: - resolution: - { - integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==, - } - dependencies: - "@types/unist": 3.0.2 - unist-util-is: 6.0.0 - dev: false - - /unist-util-visit@4.1.2: - resolution: - { - integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==, - } - dependencies: - "@types/unist": 2.0.10 - unist-util-is: 5.2.1 - unist-util-visit-parents: 5.1.3 - dev: false - - /unist-util-visit@5.0.0: - resolution: - { - integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==, - } - dependencies: - "@types/unist": 3.0.2 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 - dev: false - - /uri-js@4.4.1: - resolution: - { - integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, - } - dependencies: - punycode: 2.3.1 - - /util-deprecate@1.0.2: - resolution: - { - integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, - } - dev: false - - /uuid@8.3.2: - resolution: - { - integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==, - } - hasBin: true - dev: false - - /vfile-location@5.0.2: - resolution: - { - integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==, - } - dependencies: - "@types/unist": 3.0.2 - vfile: 6.0.1 - dev: false - - /vfile-message@3.1.4: - resolution: - { - integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==, - } - dependencies: - "@types/unist": 2.0.10 - unist-util-stringify-position: 3.0.3 - dev: false - - /vfile-message@4.0.2: - resolution: - { - integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==, - } - dependencies: - "@types/unist": 3.0.2 - unist-util-stringify-position: 4.0.0 - dev: false - - /vfile@5.3.7: - resolution: - { - integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==, - } - dependencies: - "@types/unist": 2.0.10 - is-buffer: 2.0.5 - unist-util-stringify-position: 3.0.3 - vfile-message: 3.1.4 - dev: false - - /vfile@6.0.1: - resolution: - { - integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==, - } - dependencies: - "@types/unist": 3.0.2 - unist-util-stringify-position: 4.0.0 - vfile-message: 4.0.2 - dev: false - - /vue-demi@0.14.6(vue@3.4.15): - resolution: - { - integrity: sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==, - } - engines: { node: ">=12" } - hasBin: true - requiresBuild: true - peerDependencies: - "@vue/composition-api": ^1.0.0-rc.1 - vue: ^3.0.0-0 || ^2.6.0 - peerDependenciesMeta: - "@vue/composition-api": - optional: true - dependencies: - vue: 3.4.15(typescript@5.3.3) - dev: false - - /vue@3.4.15(typescript@5.3.3): - resolution: - { - integrity: sha512-jC0GH4KkWLWJOEQjOpkqU1bQsBwf4R1rsFtw5GQJbjHVKWDzO6P0nWWBTmjp1xSemAioDFj1jdaK1qa3DnMQoQ==, - } - peerDependencies: - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - dependencies: - "@vue/compiler-dom": 3.4.15 - "@vue/compiler-sfc": 3.4.15 - "@vue/runtime-dom": 3.4.15 - "@vue/server-renderer": 3.4.15(vue@3.4.15) - "@vue/shared": 3.4.15 - typescript: 5.3.3 - dev: false - - /w3c-keyname@2.2.8: - resolution: - { - integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==, - } - dev: false - - /web-namespaces@2.0.1: - resolution: - { - integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==, - } - dev: false - - /web-streams-polyfill@3.3.2: - resolution: - { - integrity: sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ==, - } - engines: { node: ">= 8" } - dev: false - - /web-streams-polyfill@4.0.0-beta.3: - resolution: - { - integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==, - } - engines: { node: ">= 14" } - dev: false - - /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@2.0.2: - resolution: - { - integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, - } - engines: { node: ">= 8" } - hasBin: true - dependencies: - isexe: 2.0.0 - - /wordwrap@1.0.0: - resolution: - { - integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==, - } - dev: true - - /workerd@1.20231218.0: - resolution: - { - integrity: sha512-AGIsDvqCrcwhoA9kb1hxOhVAe53/xJeaGZxL4FbYI9FvO17DZwrnqGq+6eqItJ6Cfw1ZLmf3BM+QdMWaL2bFWQ==, - } - engines: { node: ">=16" } - hasBin: true - requiresBuild: true - optionalDependencies: - "@cloudflare/workerd-darwin-64": 1.20231218.0 - "@cloudflare/workerd-darwin-arm64": 1.20231218.0 - "@cloudflare/workerd-linux-64": 1.20231218.0 - "@cloudflare/workerd-linux-arm64": 1.20231218.0 - "@cloudflare/workerd-windows-64": 1.20231218.0 - dev: true - - /wrangler@3.25.0: - resolution: - { - integrity: sha512-eU47Ez1QLu1B/wutm5ow+VwZnY4OqA+D/iy6BORAu5tABujoDr9p1yBxY/1DS/DxxDWqqY3sBBS6TzcC4NSLUQ==, - } - engines: { node: ">=16.17.0" } - hasBin: true - 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.20231218.4 - nanoid: 3.3.7 - path-to-regexp: 6.2.1 - resolve: 1.22.8 - resolve.exports: 2.0.2 - selfsigned: 2.4.1 - source-map: 0.6.1 - xxhash-wasm: 1.0.2 - optionalDependencies: - fsevents: 2.3.3 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - /wrappy@1.0.2: - resolution: - { - integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, - } - - /ws@8.16.0: - resolution: - { - integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==, - } - engines: { node: ">=10.0.0" } - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - /xxhash-wasm@1.0.2: - resolution: - { - integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==, - } - dev: true - - /yallist@4.0.0: - resolution: - { - integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, - } - - /yaml@2.3.4: - resolution: - { - integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==, - } - engines: { node: ">= 14" } - - /yocto-queue@0.1.0: - resolution: - { - integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, - } - engines: { node: ">=10" } - - /youch@3.3.3: - resolution: - { - integrity: sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==, - } - dependencies: - cookie: 0.5.0 - mustache: 4.2.0 - stacktracey: 2.1.8 - dev: true - - /zhead@2.2.4: - resolution: - { - integrity: sha512-8F0OI5dpWIA5IGG5NHUg9staDwz/ZPxZtvGVf01j7vHqSyZ0raHY+78atOVxRqb73AotX22uV1pXt3gYSstGag==, - } - dev: false - - /zod-error@1.5.0: - resolution: - { - integrity: sha512-zzopKZ/skI9iXpqCEPj+iLCKl9b88E43ehcU+sbRoHuwGd9F1IDVGQ70TyO6kmfiRL1g4IXkjsXK+g1gLYl4WQ==, - } - dependencies: - zod: 3.22.4 - dev: false - - /zod@3.22.4: - resolution: - { - integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==, - } - - /zwitch@2.0.4: - resolution: - { - integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==, - } - dev: false + /xxhash-wasm@1.0.2: + resolution: {integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==} + dev: true + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + /yaml@2.3.4: + resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} + engines: {node: '>= 14'} + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + /youch@3.3.3: + resolution: {integrity: sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==} + dependencies: + cookie: 0.5.0 + mustache: 4.2.0 + stacktracey: 2.1.8 + dev: true + + /zhead@2.2.4: + resolution: {integrity: sha512-8F0OI5dpWIA5IGG5NHUg9staDwz/ZPxZtvGVf01j7vHqSyZ0raHY+78atOVxRqb73AotX22uV1pXt3gYSstGag==} + dev: false + + /zod-error@1.5.0: + resolution: {integrity: sha512-zzopKZ/skI9iXpqCEPj+iLCKl9b88E43ehcU+sbRoHuwGd9F1IDVGQ70TyO6kmfiRL1g4IXkjsXK+g1gLYl4WQ==} + dependencies: + zod: 3.22.4 + dev: false + + /zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + + /zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + dev: false diff --git a/src/index.ts b/src/index.ts index a578f7e..ada8853 100644 --- a/src/index.ts +++ b/src/index.ts @@ -12,11 +12,11 @@ export { RateLimiter } from "@/v2/middleware/ratelimit/ratelimit.do" const app = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() -// v2 API routes -app.route("/v2", BaseRoutes).use("*", rateLimit(60, 100)) +// openapi config +app.doc("/openapi", OpenAPIConfig) app.get( - "/", + "/docs", apiReference({ spec: { url: "/openapi", @@ -25,10 +25,12 @@ app.get( }) ) -// openapi config -app.doc("/openapi", OpenAPIConfig) +app.use("*", csrf({ origin: "*" })) +app.use("*", rateLimit(60, 100)) +app.use("*", prettyJSON({ space: 4 })) -app.use("*", csrf()) +// v2 API routes +app.route("/v2", BaseRoutes) app.use( "*", @@ -39,8 +41,6 @@ app.use( }) ) -app.use("*", prettyJSON()) - app.notFound((ctx) => { return ctx.json( { diff --git a/src/v2/lib/response-schemas.ts b/src/v2/lib/response-schemas.ts index 5d4cdc8..b5aa05c 100644 --- a/src/v2/lib/response-schemas.ts +++ b/src/v2/lib/response-schemas.ts @@ -1,4 +1,5 @@ import { z } from "zod" +import type { createRoute } from "@hono/zod-openapi" // 400 export const BadRequestSchema = z.object({ @@ -30,6 +31,42 @@ export const NotFoundSchema = z.object({ message: z.string(), }) +type MockRoute = + ReturnType extends { responses: infer R } ? R : never + +export type GenericResponsesType = { + [K in keyof MockRoute]: MockRoute[K] +} + +export const openAPIResponseHeaders = z.object({ + "Access-Control-Allow-Origin": z.string().openapi({ + example: "*", + description: "The origin of the request", + }), + "Access-Control-Allow-Credentials": z.string().openapi({ + example: "true", + description: "Whether or not the request can include credentials", + }), + "X-Ratelimit-Limit": z.string().openapi({ + example: "100", + description: + "The maximum number of requests that the consumer is permitted to make", + }), + "X-Ratelimit-Remaining": z.string().openapi({ + example: "99", + description: + "The number of requests remaining in the current rate limit window", + }), + "X-Ratelimit-Reset": z.string().openapi({ + example: "59", + description: "The time at which the current rate limit window resets", + }), + "X-Ratelimit-Policy": z.string().openapi({ + example: "rate-limit-100-60", + description: "The policy used to rate limit the request", + }), +}) + // while not all routes will utilize every one of these responses - i consolidated them here for comprehensive error handling lol export const GenericResponses = { 400: { @@ -39,6 +76,7 @@ export const GenericResponses = { schema: BadRequestSchema, }, }, + headers: openAPIResponseHeaders, }, 401: { description: "Unauthorized", @@ -47,6 +85,7 @@ export const GenericResponses = { schema: UnauthorizedSchema, }, }, + headers: openAPIResponseHeaders, }, 403: { description: "Forbidden", @@ -55,6 +94,16 @@ export const GenericResponses = { schema: ForbiddenSchema, }, }, + headers: openAPIResponseHeaders, + }, + 429: { + description: "Rate limited", + content: { + "application/json": { + schema: BadRequestSchema, + }, + }, + headers: openAPIResponseHeaders, }, 500: { description: "Internal server error", @@ -63,5 +112,6 @@ export const GenericResponses = { schema: InternalServerErrorSchema, }, }, + headers: openAPIResponseHeaders, }, } diff --git a/src/v2/middleware/ratelimit/limiter.ts b/src/v2/middleware/ratelimit/limiter.ts index 7ccdd2e..52ad341 100644 --- a/src/v2/middleware/ratelimit/limiter.ts +++ b/src/v2/middleware/ratelimit/limiter.ts @@ -6,7 +6,7 @@ const fakeDomain = "http://rate-limiter.com/" const getRateLimitKey = (ctx: Context) => { const ip = ctx.req.header("cf-connecting-ip") // TODO(dromzeh): look into setting current user w/ ctx.get/set, then we can use that OVER user ip? idk - const uniqueKey = ip || "" + const uniqueKey = ip ?? "unknown" return uniqueKey } @@ -35,7 +35,7 @@ const setRateLimitHeaders = ( export const rateLimit = ( interval: number, limit: number -): MiddlewareHandler<{ Bindings: Bindings; Variables: Variables }> => { +): MiddlewareHandler<{ Bindings: Bindings }> => { return async (ctx, next) => { const key = getRateLimitKey(ctx) @@ -46,6 +46,7 @@ export const rateLimit = ( const cache = await caches.open("rate-limiter") const cacheKey = getCacheKey(endpoint, key, limit, interval) + const cached = await cache.match(cacheKey) let res: Response @@ -66,9 +67,7 @@ export const rateLimit = ( res = cached } - const clonedRes = res.clone() - - const body = await clonedRes.json<{ + const body = await res.json<{ blocked: boolean remaining: number expires: string @@ -86,7 +85,7 @@ export const rateLimit = ( if (body.blocked) { if (!cached) { - ctx.executionCtx.waitUntil(cache.put(cacheKey, res)) + ctx.executionCtx.waitUntil(cache.put(cacheKey, res.clone())) } return ctx.json( diff --git a/src/v2/middleware/time-taken.ts b/src/v2/middleware/time-taken.ts deleted file mode 100644 index aefdfae..0000000 --- a/src/v2/middleware/time-taken.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type { Next } from "hono" - -export async function LogTime(ctx: APIContext, next: Next): Promise { - const start = Date.now() - await next() - ctx.res.headers.set("x-response-time", `${Date.now() - start}ms`) -} From 76d35bd711aee51035da96dcbe68b430d6ff4d2c Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Tue, 6 Feb 2024 11:59:35 +0000 Subject: [PATCH 246/318] update middleware execution order --- pnpm-lock.yaml | 12962 +++++++++++++++++++++++++++-------------------- src/index.ts | 12 +- 2 files changed, 7517 insertions(+), 5457 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 586406f..27357cc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,5498 +1,7558 @@ -lockfileVersion: '6.0' +lockfileVersion: "6.0" settings: - autoInstallPeers: true - excludeLinksFromLockfile: false + autoInstallPeers: true + excludeLinksFromLockfile: false dependencies: - '@axiomhq/js': - specifier: 1.0.0-rc.1 - version: 1.0.0-rc.1 - '@hono/swagger-ui': - specifier: ^0.2.1 - version: 0.2.1(hono@3.12.8) - '@hono/zod-openapi': - specifier: ^0.9.6 - version: 0.9.6(hono@3.12.8)(zod@3.22.4) - '@libsql/client': - specifier: 0.4.0 - version: 0.4.0 - '@lucia-auth/adapter-sqlite': - specifier: 3.0.0 - version: 3.0.0(@libsql/client@0.4.0)(better-sqlite3@9.3.0)(lucia@3.0.0) - '@scalar/hono-api-reference': - specifier: ^0.3.29 - version: 0.3.29(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(hono@3.12.8)(nanoid@5.0.4)(postcss@8.4.33)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15) - '@typescript-eslint/eslint-plugin': - specifier: ^6.19.1 - version: 6.19.1(@typescript-eslint/parser@6.19.1)(eslint@8.56.0)(typescript@5.3.3) - better-sqlite3: - specifier: ^9.3.0 - version: 9.3.0 - dayjs: - specifier: ^1.11.10 - version: 1.11.10 - drizzle-orm: - specifier: ^0.29.3 - version: 0.29.3(@cloudflare/workers-types@4.20240117.0)(@libsql/client@0.4.0)(better-sqlite3@9.3.0) - drizzle-zod: - specifier: ^0.5.1 - version: 0.5.1(drizzle-orm@0.29.3)(zod@3.22.4) - hono: - specifier: ^3.12.8 - version: 3.12.8 - lucia: - specifier: 3.0.0 - version: 3.0.0 - oslo: - specifier: ^1.0.2 - version: 1.0.2 - prettier: - specifier: ^3.2.4 - version: 3.2.4 - zod: - specifier: ^3.22.4 - version: 3.22.4 - zod-error: - specifier: ^1.5.0 - version: 1.5.0 + "@axiomhq/js": + specifier: 1.0.0-rc.1 + version: 1.0.0-rc.1 + "@hono/swagger-ui": + specifier: ^0.2.1 + version: 0.2.1(hono@3.12.8) + "@hono/zod-openapi": + specifier: ^0.9.6 + version: 0.9.6(hono@3.12.8)(zod@3.22.4) + "@libsql/client": + specifier: 0.4.0 + version: 0.4.0 + "@lucia-auth/adapter-sqlite": + specifier: 3.0.0 + version: 3.0.0(@libsql/client@0.4.0)(better-sqlite3@9.3.0)(lucia@3.0.0) + "@scalar/hono-api-reference": + specifier: ^0.3.29 + version: 0.3.29(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(hono@3.12.8)(nanoid@5.0.4)(postcss@8.4.33)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15) + "@typescript-eslint/eslint-plugin": + specifier: ^6.19.1 + version: 6.19.1(@typescript-eslint/parser@6.19.1)(eslint@8.56.0)(typescript@5.3.3) + better-sqlite3: + specifier: ^9.3.0 + version: 9.3.0 + dayjs: + specifier: ^1.11.10 + version: 1.11.10 + drizzle-orm: + specifier: ^0.29.3 + version: 0.29.3(@cloudflare/workers-types@4.20240117.0)(@libsql/client@0.4.0)(better-sqlite3@9.3.0) + drizzle-zod: + specifier: ^0.5.1 + version: 0.5.1(drizzle-orm@0.29.3)(zod@3.22.4) + hono: + specifier: ^3.12.8 + version: 3.12.8 + lucia: + specifier: 3.0.0 + version: 3.0.0 + oslo: + specifier: ^1.0.2 + version: 1.0.2 + prettier: + specifier: ^3.2.4 + version: 3.2.4 + zod: + specifier: ^3.22.4 + version: 3.22.4 + zod-error: + specifier: ^1.5.0 + version: 1.5.0 devDependencies: - '@asteasolutions/zod-to-openapi': - specifier: ^6.3.1 - version: 6.3.1(zod@3.22.4) - '@cloudflare/workers-types': - specifier: ^4.20240117.0 - version: 4.20240117.0 - '@types/node': - specifier: ^20.11.8 - version: 20.11.8 - dotenv: - specifier: ^16.4.1 - version: 16.4.1 - drizzle-kit: - specifier: ^0.20.13 - version: 0.20.13 - eslint: - specifier: ^8.56.0 - version: 8.56.0 - husky: - specifier: ^9.0.6 - version: 9.0.6 - openapi-generator: - specifier: link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator - version: link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator - tsx: - specifier: ^4.7.0 - version: 4.7.0 - typescript: - specifier: ^5.3.3 - version: 5.3.3 - wrangler: - specifier: 3.25.0 - version: 3.25.0 + "@asteasolutions/zod-to-openapi": + specifier: ^6.3.1 + version: 6.3.1(zod@3.22.4) + "@cloudflare/workers-types": + specifier: ^4.20240117.0 + version: 4.20240117.0 + "@types/node": + specifier: ^20.11.8 + version: 20.11.8 + dotenv: + specifier: ^16.4.1 + version: 16.4.1 + drizzle-kit: + specifier: ^0.20.13 + version: 0.20.13 + eslint: + specifier: ^8.56.0 + version: 8.56.0 + husky: + specifier: ^9.0.6 + version: 9.0.6 + openapi-generator: + specifier: link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator + version: link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator + tsx: + specifier: ^4.7.0 + version: 4.7.0 + typescript: + specifier: ^5.3.3 + version: 5.3.3 + wrangler: + specifier: 3.25.0 + version: 3.25.0 packages: + /@aashutoshrathi/word-wrap@1.2.6: + resolution: + { + integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==, + } + engines: { node: ">=0.10.0" } + + /@apidevtools/json-schema-ref-parser@9.0.6: + resolution: + { + integrity: sha512-M3YgsLjI0lZxvrpeGVk9Ap032W6TPQkH6pRAZz81Ac3WUNF79VQooAFnp8umjvVzUmD93NkogxEwbSce7qMsUg==, + } + dependencies: + "@jsdevtools/ono": 7.1.3 + call-me-maybe: 1.0.2 + js-yaml: 3.14.1 + dev: false + + /@apidevtools/openapi-schemas@2.1.0: + resolution: + { + integrity: sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==, + } + engines: { node: ">=10" } + dev: false + + /@apidevtools/swagger-methods@3.0.2: + resolution: + { + integrity: sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==, + } + dev: false + + /@apidevtools/swagger-parser@10.1.0(openapi-types@12.1.3): + resolution: + { + integrity: sha512-9Kt7EuS/7WbMAUv2gSziqjvxwDbFSg3Xeyfuj5laUODX8o/k/CpsAKiQ8W7/R88eXFTMbJYg6+7uAmOWNKmwnw==, + } + peerDependencies: + openapi-types: ">=7" + dependencies: + "@apidevtools/json-schema-ref-parser": 9.0.6 + "@apidevtools/openapi-schemas": 2.1.0 + "@apidevtools/swagger-methods": 3.0.2 + "@jsdevtools/ono": 7.1.3 + ajv: 8.12.0 + ajv-draft-04: 1.0.0(ajv@8.12.0) + call-me-maybe: 1.0.2 + openapi-types: 12.1.3 + dev: false + + /@asteasolutions/zod-to-openapi@5.5.0(zod@3.22.4): + resolution: + { + integrity: sha512-d5HwrvM6dOKr3XdeF+DmashGvfEc+1oiEfbscugsiwSTrFtuMa7ETpW9sTNnVgn+hJaz+PRxPQUYD7q9/5dUig==, + } + peerDependencies: + zod: ^3.20.2 + dependencies: + openapi3-ts: 4.2.1 + zod: 3.22.4 + dev: false + + /@asteasolutions/zod-to-openapi@6.3.1(zod@3.22.4): + resolution: + { + integrity: sha512-1CRWBqslgdBpZeJnxxksGirAQ39Iztxk+LzTkYwoP0mNzuaULa604s8Xc5V9yzmYccwJ89O9fPQgxCkbNN398g==, + } + peerDependencies: + zod: ^3.20.2 + dependencies: + openapi3-ts: 4.2.1 + zod: 3.22.4 + dev: true + + /@axiomhq/js@1.0.0-rc.1: + resolution: + { + integrity: sha512-B/TT5HPc3KmoEIJUwhfzAAp0SLNfcxQnr0SGEbs1lWS0OOLckgj1Q4K1Tp/l669Yje1CK68i3LcajU/9+z+v2g==, + } + engines: { node: ">=16" } + dependencies: + fetch-retry: 5.0.6 + uuid: 8.3.2 + dev: false + + /@babel/helper-string-parser@7.23.4: + resolution: + { + integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==, + } + engines: { node: ">=6.9.0" } + dev: false + + /@babel/helper-validator-identifier@7.22.20: + resolution: + { + integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==, + } + engines: { node: ">=6.9.0" } + dev: false + + /@babel/parser@7.23.9: + resolution: + { + integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==, + } + engines: { node: ">=6.0.0" } + hasBin: true + dependencies: + "@babel/types": 7.23.9 + dev: false + + /@babel/runtime@7.23.9: + resolution: + { + integrity: sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==, + } + engines: { node: ">=6.9.0" } + dependencies: + regenerator-runtime: 0.14.1 + dev: false + + /@babel/types@7.23.9: + resolution: + { + integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==, + } + engines: { node: ">=6.9.0" } + dependencies: + "@babel/helper-string-parser": 7.23.4 + "@babel/helper-validator-identifier": 7.22.20 + to-fast-properties: 2.0.0 + dev: false + + /@cloudflare/kv-asset-handler@0.2.0: + resolution: + { + integrity: sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==, + } + dependencies: + mime: 3.0.0 + dev: true + + /@cloudflare/workerd-darwin-64@1.20231218.0: + resolution: + { + integrity: sha512-547gOmTIVmRdDy7HNAGJUPELa+fSDm2Y0OCxqAtQOz0GLTDu1vX61xYmsb2rn91+v3xW6eMttEIpbYokKjtfJA==, + } + engines: { node: ">=16" } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true - /@aashutoshrathi/word-wrap@1.2.6: - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - - /@apidevtools/json-schema-ref-parser@9.0.6: - resolution: {integrity: sha512-M3YgsLjI0lZxvrpeGVk9Ap032W6TPQkH6pRAZz81Ac3WUNF79VQooAFnp8umjvVzUmD93NkogxEwbSce7qMsUg==} - dependencies: - '@jsdevtools/ono': 7.1.3 - call-me-maybe: 1.0.2 - js-yaml: 3.14.1 - dev: false - - /@apidevtools/openapi-schemas@2.1.0: - resolution: {integrity: sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==} - engines: {node: '>=10'} - dev: false - - /@apidevtools/swagger-methods@3.0.2: - resolution: {integrity: sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==} - dev: false - - /@apidevtools/swagger-parser@10.1.0(openapi-types@12.1.3): - resolution: {integrity: sha512-9Kt7EuS/7WbMAUv2gSziqjvxwDbFSg3Xeyfuj5laUODX8o/k/CpsAKiQ8W7/R88eXFTMbJYg6+7uAmOWNKmwnw==} - peerDependencies: - openapi-types: '>=7' - dependencies: - '@apidevtools/json-schema-ref-parser': 9.0.6 - '@apidevtools/openapi-schemas': 2.1.0 - '@apidevtools/swagger-methods': 3.0.2 - '@jsdevtools/ono': 7.1.3 - ajv: 8.12.0 - ajv-draft-04: 1.0.0(ajv@8.12.0) - call-me-maybe: 1.0.2 - openapi-types: 12.1.3 - dev: false - - /@asteasolutions/zod-to-openapi@5.5.0(zod@3.22.4): - resolution: {integrity: sha512-d5HwrvM6dOKr3XdeF+DmashGvfEc+1oiEfbscugsiwSTrFtuMa7ETpW9sTNnVgn+hJaz+PRxPQUYD7q9/5dUig==} - peerDependencies: - zod: ^3.20.2 - dependencies: - openapi3-ts: 4.2.1 - zod: 3.22.4 - dev: false - - /@asteasolutions/zod-to-openapi@6.3.1(zod@3.22.4): - resolution: {integrity: sha512-1CRWBqslgdBpZeJnxxksGirAQ39Iztxk+LzTkYwoP0mNzuaULa604s8Xc5V9yzmYccwJ89O9fPQgxCkbNN398g==} - peerDependencies: - zod: ^3.20.2 - dependencies: - openapi3-ts: 4.2.1 - zod: 3.22.4 - dev: true - - /@axiomhq/js@1.0.0-rc.1: - resolution: {integrity: sha512-B/TT5HPc3KmoEIJUwhfzAAp0SLNfcxQnr0SGEbs1lWS0OOLckgj1Q4K1Tp/l669Yje1CK68i3LcajU/9+z+v2g==} - engines: {node: '>=16'} - dependencies: - fetch-retry: 5.0.6 - uuid: 8.3.2 - dev: false - - /@babel/helper-string-parser@7.23.4: - resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} - engines: {node: '>=6.9.0'} - dev: false - - /@babel/helper-validator-identifier@7.22.20: - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} - engines: {node: '>=6.9.0'} - dev: false - - /@babel/parser@7.23.9: - resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.23.9 - dev: false - - /@babel/runtime@7.23.9: - resolution: {integrity: sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==} - engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.14.1 - dev: false - - /@babel/types@7.23.9: - resolution: {integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.23.4 - '@babel/helper-validator-identifier': 7.22.20 - to-fast-properties: 2.0.0 - dev: false - - /@cloudflare/kv-asset-handler@0.2.0: - resolution: {integrity: sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==} - dependencies: - mime: 3.0.0 - dev: true - - /@cloudflare/workerd-darwin-64@1.20231218.0: - resolution: {integrity: sha512-547gOmTIVmRdDy7HNAGJUPELa+fSDm2Y0OCxqAtQOz0GLTDu1vX61xYmsb2rn91+v3xW6eMttEIpbYokKjtfJA==} - engines: {node: '>=16'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workerd-darwin-arm64@1.20231218.0: - resolution: {integrity: sha512-b39qrU1bKolCfmKFDAnX4vXcqzISkEUVE/V8sMBsFzxrIpNAbcUHBZAQPYmS/OHIGB94KjOVokvDi7J6UNurPw==} - engines: {node: '>=16'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workerd-linux-64@1.20231218.0: - resolution: {integrity: sha512-dMUF1wA+0mybm6hHNOCgY/WMNMwomPPs4I7vvYCgwHSkch0Q2Wb7TnxQZSt8d1PK/myibaBwadrlIxpjxmpz3w==} - engines: {node: '>=16'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workerd-linux-arm64@1.20231218.0: - resolution: {integrity: sha512-2s5uc8IHt0QmWyKxAr1Fy+4b8Xy0b/oUtlPnm5MrKi2gDRlZzR7JvxENPJCpCnYENydS8lzvkMiAFECPBccmyQ==} - engines: {node: '>=16'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workerd-windows-64@1.20231218.0: - resolution: {integrity: sha512-oN5hz6TXUDB5YKUN5N3QWAv6cYz9JjTZ9g16HVyoegVFEL6/zXU3tV19MBX2IvlE11ab/mRogEv9KXVIrHfKmA==} - engines: {node: '>=16'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workers-types@4.20240117.0: - resolution: {integrity: sha512-HQU8lJhaJVh8gQXFtVA7lZwd0hK1ckIFjRuxOXkVN2Z9t7DtzNbA2YTwBry5thKNgF5EwjN4THjHg5NUZzj05A==} - - /@codemirror/autocomplete@6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1): - resolution: {integrity: sha512-r4IjdYFthwbCQyvqnSlx0WBHRHi8nBvU+WjJxFUij81qsBfhNudf/XKKmmC2j3m0LaOYUQTf3qiEK1J8lO1sdg==} - peerDependencies: - '@codemirror/language': ^6.0.0 - '@codemirror/state': ^6.0.0 - '@codemirror/view': ^6.0.0 - '@lezer/common': ^1.0.0 - dependencies: - '@codemirror/language': 6.10.0 - '@codemirror/state': 6.4.0 - '@codemirror/view': 6.23.1 - '@lezer/common': 1.2.1 - dev: false - - /@codemirror/commands@6.3.3: - resolution: {integrity: sha512-dO4hcF0fGT9tu1Pj1D2PvGvxjeGkbC6RGcZw6Qs74TH+Ed1gw98jmUgd2axWvIZEqTeTuFrg1lEB1KV6cK9h1A==} - dependencies: - '@codemirror/language': 6.10.0 - '@codemirror/state': 6.4.0 - '@codemirror/view': 6.23.1 - '@lezer/common': 1.2.1 - dev: false - - /@codemirror/lang-css@6.2.1(@codemirror/view@6.23.1): - resolution: {integrity: sha512-/UNWDNV5Viwi/1lpr/dIXJNWiwDxpw13I4pTUAsNxZdg6E0mI2kTQb0P2iHczg1Tu+H4EBgJR+hYhKiHKko7qg==} - dependencies: - '@codemirror/autocomplete': 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) - '@codemirror/language': 6.10.0 - '@codemirror/state': 6.4.0 - '@lezer/common': 1.2.1 - '@lezer/css': 1.1.7 - transitivePeerDependencies: - - '@codemirror/view' - dev: false - - /@codemirror/lang-html@6.4.8: - resolution: {integrity: sha512-tE2YK7wDlb9ZpAH6mpTPiYm6rhfdQKVDa5r9IwIFlwwgvVaKsCfuKKZoJGWsmMZIf3FQAuJ5CHMPLymOtg1hXw==} - dependencies: - '@codemirror/autocomplete': 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) - '@codemirror/lang-css': 6.2.1(@codemirror/view@6.23.1) - '@codemirror/lang-javascript': 6.2.1 - '@codemirror/language': 6.10.0 - '@codemirror/state': 6.4.0 - '@codemirror/view': 6.23.1 - '@lezer/common': 1.2.1 - '@lezer/css': 1.1.7 - '@lezer/html': 1.3.8 - dev: false - - /@codemirror/lang-java@6.0.1: - resolution: {integrity: sha512-OOnmhH67h97jHzCuFaIEspbmsT98fNdhVhmA3zCxW0cn7l8rChDhZtwiwJ/JOKXgfm4J+ELxQihxaI7bj7mJRg==} - dependencies: - '@codemirror/language': 6.10.0 - '@lezer/java': 1.1.1 - dev: false - - /@codemirror/lang-javascript@6.2.1: - resolution: {integrity: sha512-jlFOXTejVyiQCW3EQwvKH0m99bUYIw40oPmFjSX2VS78yzfe0HELZ+NEo9Yfo1MkGRpGlj3Gnu4rdxV1EnAs5A==} - dependencies: - '@codemirror/autocomplete': 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) - '@codemirror/language': 6.10.0 - '@codemirror/lint': 6.4.2 - '@codemirror/state': 6.4.0 - '@codemirror/view': 6.23.1 - '@lezer/common': 1.2.1 - '@lezer/javascript': 1.4.13 - dev: false - - /@codemirror/lang-json@6.0.1: - resolution: {integrity: sha512-+T1flHdgpqDDlJZ2Lkil/rLiRy684WMLc74xUnjJH48GQdfJo/pudlTRreZmKwzP8/tGdKf83wlbAdOCzlJOGQ==} - dependencies: - '@codemirror/language': 6.10.0 - '@lezer/json': 1.0.2 - dev: false - - /@codemirror/lang-python@6.1.3(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1): - resolution: {integrity: sha512-S9w2Jl74hFlD5nqtUMIaXAq9t5WlM0acCkyuQWUUSvZclk1sV+UfnpFiZzuZSG+hfEaOmxKR5UxY/Uxswn7EhQ==} - dependencies: - '@codemirror/autocomplete': 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) - '@codemirror/language': 6.10.0 - '@lezer/python': 1.1.11 - transitivePeerDependencies: - - '@codemirror/state' - - '@codemirror/view' - - '@lezer/common' - dev: false - - /@codemirror/language@6.10.0: - resolution: {integrity: sha512-2vaNn9aPGCRFKWcHPFksctzJ8yS5p7YoaT+jHpc0UGKzNuAIx4qy6R5wiqbP+heEEdyaABA582mNqSHzSoYdmg==} - dependencies: - '@codemirror/state': 6.4.0 - '@codemirror/view': 6.23.1 - '@lezer/common': 1.2.1 - '@lezer/highlight': 1.2.0 - '@lezer/lr': 1.4.0 - style-mod: 4.1.0 - dev: false - - /@codemirror/legacy-modes@6.3.3: - resolution: {integrity: sha512-X0Z48odJ0KIoh/HY8Ltz75/4tDYc9msQf1E/2trlxFaFFhgjpVHjZ/BCXe1Lk7s4Gd67LL/CeEEHNI+xHOiESg==} - dependencies: - '@codemirror/language': 6.10.0 - dev: false - - /@codemirror/lint@6.4.2: - resolution: {integrity: sha512-wzRkluWb1ptPKdzlsrbwwjYCPLgzU6N88YBAmlZi8WFyuiEduSd05MnJYNogzyc8rPK7pj6m95ptUApc8sHKVA==} - dependencies: - '@codemirror/state': 6.4.0 - '@codemirror/view': 6.23.1 - crelt: 1.0.6 - dev: false - - /@codemirror/search@6.5.5: - resolution: {integrity: sha512-PIEN3Ke1buPod2EHbJsoQwlbpkz30qGZKcnmH1eihq9+bPQx8gelauUwLYaY4vBOuBAuEhmpDLii4rj/uO0yMA==} - dependencies: - '@codemirror/state': 6.4.0 - '@codemirror/view': 6.23.1 - crelt: 1.0.6 - dev: false - - /@codemirror/state@6.4.0: - resolution: {integrity: sha512-hm8XshYj5Fo30Bb922QX9hXB/bxOAVH+qaqHBzw5TKa72vOeslyGwd4X8M0c1dJ9JqxlaMceOQ8RsL9tC7gU0A==} - dev: false - - /@codemirror/view@6.23.1: - resolution: {integrity: sha512-J2Xnn5lFYT1ZN/5ewEoMBCmLlL71lZ3mBdb7cUEuHhX2ESoSrNEucpsDXpX22EuTGm9LOgC9v4Z0wx+Ez8QmGA==} - dependencies: - '@codemirror/state': 6.4.0 - style-mod: 4.1.0 - w3c-keyname: 2.2.8 - 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 - - /@drizzle-team/studio@0.0.39: - resolution: {integrity: sha512-c5Hkm7MmQC2n5qAsKShjQrHoqlfGslB8+qWzsGGZ+2dHMRTNG60UuzalF0h0rvBax5uzPXuGkYLGaQ+TUX3yMw==} - dependencies: - superjson: 2.2.1 - dev: true - - /@emnapi/core@0.45.0: - resolution: {integrity: sha512-DPWjcUDQkCeEM4VnljEOEcXdAD7pp8zSZsgOujk/LGIwCXWbXJngin+MO4zbH429lzeC3WbYLGjE2MaUOwzpyw==} - requiresBuild: true - dependencies: - tslib: 2.6.2 - dev: false - optional: true - - /@emnapi/runtime@0.45.0: - resolution: {integrity: sha512-Txumi3td7J4A/xTTwlssKieHKTGl3j4A1tglBx72auZ49YK7ePY6XZricgIg9mnZT4xPfA+UPCUdnhRuEFDL+w==} - requiresBuild: true - dependencies: - tslib: 2.6.2 - dev: false - optional: 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/aix-ppc64@0.19.12: - resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - 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-arm64@0.19.12: - resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: 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-arm@0.19.12: - resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} - engines: {node: '>=12'} - cpu: [arm] - 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/android-x64@0.19.12: - resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} - 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-arm64@0.19.12: - resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} - 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/darwin-x64@0.19.12: - resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} - 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-arm64@0.19.12: - resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} - 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/freebsd-x64@0.19.12: - resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - 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-arm64@0.19.12: - resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - 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-arm@0.19.12: - resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} - engines: {node: '>=12'} - cpu: [arm] - 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-ia32@0.19.12: - resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} - 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-loong64@0.19.12: - resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} - 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-mips64el@0.19.12: - resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} - 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-ppc64@0.19.12: - resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} - 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-riscv64@0.19.12: - resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} - 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-s390x@0.19.12: - resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} - 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/linux-x64@0.19.12: - resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} - 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/netbsd-x64@0.19.12: - resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} - 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/openbsd-x64@0.19.12: - resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} - 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/sunos-x64@0.19.12: - resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} - 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-arm64@0.19.12: - resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} - 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-ia32@0.19.12: - resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} - 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 - - /@esbuild/win32-x64@0.19.12: - resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.56.0 - eslint-visitor-keys: 3.4.3 - - /@eslint-community/regexpp@4.10.0: - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - /@eslint/eslintrc@2.1.4: - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.0 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - /@eslint/js@8.56.0: - resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - /@fastify/busboy@2.1.0: - resolution: {integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==} - engines: {node: '>=14'} - dev: true - - /@floating-ui/core@1.6.0: - resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} - dependencies: - '@floating-ui/utils': 0.2.1 - dev: false - - /@floating-ui/dom@1.6.0: - resolution: {integrity: sha512-SZ0BEXzsaaS6THZfZJUcAobbZTD+MvfGM42bxgeg0Tnkp4/an/avqwAXiVLsFtIBZtfsx3Ymvwx0+KnnhdA/9g==} - dependencies: - '@floating-ui/core': 1.6.0 - '@floating-ui/utils': 0.2.1 - dev: false - - /@floating-ui/utils@0.2.1: - resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} - dev: false - - /@floating-ui/vue@1.0.5(vue@3.4.15): - resolution: {integrity: sha512-rXYI0JHLnAw5nTGNKTmH9tMxFWmZPEfkyexXzG/HchGsoL4f8lE7+bX43pVRXRBbmCWg0/j4d62Ui7acZBmUew==} - dependencies: - '@floating-ui/dom': 1.6.0 - '@floating-ui/utils': 0.2.1 - vue-demi: 0.14.6(vue@3.4.15) - transitivePeerDependencies: - - '@vue/composition-api' - - vue - dev: false - - /@headlessui/vue@1.7.17(vue@3.4.15): - resolution: {integrity: sha512-hmJChv8HzKorxd9F70RGnECAwZfkvmmwOqreuKLWY/19d5qbWnSdw+DNbuA/Uo6X5rb4U5B3NrT+qBKPmjhRqw==} - engines: {node: '>=10'} - peerDependencies: - vue: ^3.2.0 - dependencies: - '@tanstack/vue-virtual': 3.0.2(vue@3.4.15) - vue: 3.4.15(typescript@5.3.3) - dev: false - - /@hono/swagger-ui@0.2.1(hono@3.12.8): - resolution: {integrity: sha512-wBxVMRe3/v8xH4o6icmwztiIq0DG0s7+jHVMHVUAoFFCWEQNL2iskMmQtrhSDtsFmBZUeUFQUaaJ6Ir6DOmHLA==} - peerDependencies: - hono: '*' - dependencies: - hono: 3.12.8 - dev: false - - /@hono/zod-openapi@0.9.6(hono@3.12.8)(zod@3.22.4): - resolution: {integrity: sha512-MLF8xpd4fEwbEaylFqAt1qci4wOTXu3oq3BKb01trccapYfodP50VCO0YDNBQTyMT/Iapq6GMO4+RAIFBgG5WQ==} - engines: {node: '>=16.0.0'} - peerDependencies: - hono: '>=3.11.3' - zod: 3.* - dependencies: - '@asteasolutions/zod-to-openapi': 5.5.0(zod@3.22.4) - '@hono/zod-validator': 0.1.11(hono@3.12.8)(zod@3.22.4) - hono: 3.12.8 - zod: 3.22.4 - dev: false - - /@hono/zod-validator@0.1.11(hono@3.12.8)(zod@3.22.4): - resolution: {integrity: sha512-PQXeHUP0+36qpRt8yfeD7N2jbK3ETlGvSN6dMof/HwUC/APRokQRjpXZm4rrlG71Ft0aWE01+Bm4XejqPie5Uw==} - peerDependencies: - hono: '>=3.9.0' - zod: ^3.19.1 - dependencies: - hono: 3.12.8 - zod: 3.22.4 - dev: false - - /@humanwhocodes/config-array@0.11.14: - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} - engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 2.0.2 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - /@humanwhocodes/object-schema@2.0.2: - resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} - - /@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==} - - /@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 - - /@jsdevtools/ono@7.1.3: - resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} - dev: false - - /@lezer/common@1.2.1: - resolution: {integrity: sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==} - dev: false - - /@lezer/css@1.1.7: - resolution: {integrity: sha512-7BlFFAKNn/b39jJLrhdLSX5A2k56GIJvyLqdmm7UU+7XvequY084iuKDMAEhAmAzHnwDE8FK4OQtsIUssW91tg==} - dependencies: - '@lezer/common': 1.2.1 - '@lezer/highlight': 1.2.0 - '@lezer/lr': 1.4.0 - dev: false - - /@lezer/highlight@1.2.0: - resolution: {integrity: sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==} - dependencies: - '@lezer/common': 1.2.1 - dev: false - - /@lezer/html@1.3.8: - resolution: {integrity: sha512-EXseJ3pUzWxE6XQBQdqWHZqqlGQRSuNMBcLb6mZWS2J2v+QZhOObD+3ZIKIcm59ntTzyor4LqFTb72iJc3k23Q==} - dependencies: - '@lezer/common': 1.2.1 - '@lezer/highlight': 1.2.0 - '@lezer/lr': 1.4.0 - dev: false - - /@lezer/java@1.1.1: - resolution: {integrity: sha512-mt3dX13fRlpY7RlWELYRakanXgmwXsLRCrhstrn+c1sZd7jR2xle46/3heoxGd+oHxnuTnpoyXTyxcLJQs9+mQ==} - dependencies: - '@lezer/common': 1.2.1 - '@lezer/highlight': 1.2.0 - '@lezer/lr': 1.4.0 - dev: false - - /@lezer/javascript@1.4.13: - resolution: {integrity: sha512-5IBr8LIO3xJdJH1e9aj/ZNLE4LSbdsx25wFmGRAZsj2zSmwAYjx26JyU/BYOCpRQlu1jcv1z3vy4NB9+UkfRow==} - dependencies: - '@lezer/common': 1.2.1 - '@lezer/highlight': 1.2.0 - '@lezer/lr': 1.4.0 - dev: false - - /@lezer/json@1.0.2: - resolution: {integrity: sha512-xHT2P4S5eeCYECyKNPhr4cbEL9tc8w83SPwRC373o9uEdrvGKTZoJVAGxpOsZckMlEh9W23Pc72ew918RWQOBQ==} - dependencies: - '@lezer/common': 1.2.1 - '@lezer/highlight': 1.2.0 - '@lezer/lr': 1.4.0 - dev: false - - /@lezer/lr@1.4.0: - resolution: {integrity: sha512-Wst46p51km8gH0ZUmeNrtpRYmdlRHUpN1DQd3GFAyKANi8WVz8c2jHYTf1CVScFaCjQw1iO3ZZdqGDxQPRErTg==} - dependencies: - '@lezer/common': 1.2.1 - dev: false - - /@lezer/python@1.1.11: - resolution: {integrity: sha512-C3QeLCcdAKJDUOsYjfFP6a1wdn8jhUNX200bgFm8TpKH1eM2PlgYQS5ugw6E38qGeEx7CP21I1Q52SoybXt0OQ==} - dependencies: - '@lezer/common': 1.2.1 - '@lezer/highlight': 1.2.0 - '@lezer/lr': 1.4.0 - dev: false - - /@libsql/client@0.4.0: - resolution: {integrity: sha512-GjBHHxRMKomG2rLx6K8BYsDhk9jNcKXpkEOO7luPTCje4z41ogD0sCaBRcGbJw9h3HMVysCW5v70WmjQ4/FWpg==} - dependencies: - '@libsql/core': 0.4.0 - '@libsql/hrana-client': 0.5.6 - js-base64: 3.7.6 - libsql: 0.2.0 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - dev: false - - /@libsql/core@0.4.0: - resolution: {integrity: sha512-pQHyZI0aTBlBm08dpB+/SEqLDe5wlgiUY+VNXbCD8yZhXo30AGinyrDlKrtGW7luo0As4Y9v1befurJdLKbC0Q==} - dependencies: - js-base64: 3.7.6 - dev: false - - /@libsql/darwin-arm64@0.2.0: - resolution: {integrity: sha512-+qyT2W/n5CFH1YZWv2mxW4Fsoo4dX9Z9M/nvbQqZ7H84J8hVegvVAsIGYzcK8xAeMEcpU5yGKB1Y9NoDY4hOSQ==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@libsql/darwin-x64@0.2.0: - resolution: {integrity: sha512-hwmO2mF1n8oDHKFrUju6Jv+n9iFtTf5JUK+xlnIE3Td0ZwGC/O1R/Z/btZTd9nD+vsvakC8SJT7/Q6YlWIkhEw==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@libsql/hrana-client@0.5.6: - resolution: {integrity: sha512-mjQoAmejZ1atG+M3YR2ZW+rg6ceBByH/S/h17ZoYZkqbWrvohFhXyz2LFxj++ARMoY9m6w3RJJIRdJdmnEUlFg==} - dependencies: - '@libsql/isomorphic-fetch': 0.1.12 - '@libsql/isomorphic-ws': 0.1.5 - js-base64: 3.7.6 - node-fetch: 3.3.2 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - dev: false - - /@libsql/isomorphic-fetch@0.1.12: - resolution: {integrity: sha512-MRo4UcmjAGAa3ac56LoD5OE13m2p0lu0VEtZC2NZMcogM/jc5fU9YtMQ3qbPjFJ+u2BBjFZgMPkQaLS1dlMhpg==} - dependencies: - '@types/node-fetch': 2.6.11 - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding - dev: false - - /@libsql/isomorphic-ws@0.1.5: - resolution: {integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==} - dependencies: - '@types/ws': 8.5.10 - ws: 8.16.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: false - - /@libsql/linux-arm64-gnu@0.2.0: - resolution: {integrity: sha512-1w2lPXIYtnBaK5t/Ej5E8x7lPiE+jP3KATI/W4yei5Z/ONJh7jQW5PJ7sYU95vTME3hWEM1FXN6kvzcpFAte7w==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@libsql/linux-arm64-musl@0.2.0: - resolution: {integrity: sha512-lkblBEJ7xuNiWNjP8DDq0rqoWccszfkUS7Efh5EjJ+GDWdCBVfh08mPofIZg0fZVLWQCY3j+VZCG1qZfATBizg==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@libsql/linux-x64-gnu@0.2.0: - resolution: {integrity: sha512-+x/d289KeJydwOhhqSxKT+6MSQTCfLltzOpTzPccsvdt5fxg8CBi+gfvEJ4/XW23Sa+9bc7zodFP0i6MOlxX7w==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@libsql/linux-x64-musl@0.2.0: - resolution: {integrity: sha512-5Xn0c5A6vKf9D1ASpgk7mef//FuY7t5Lktj/eiU4n3ryxG+6WTpqstTittJUgepVjcleLPYxIhQAYeYwTYH1IQ==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@libsql/win32-x64-msvc@0.2.0: - resolution: {integrity: sha512-rpK+trBIpRST15m3cMYg5aPaX7kvCIottxY7jZPINkKAaScvfbn9yulU/iZUM9YtuK96Y1ZmvwyVIK/Y5DzoMQ==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@lucia-auth/adapter-sqlite@3.0.0(@libsql/client@0.4.0)(better-sqlite3@9.3.0)(lucia@3.0.0): - resolution: {integrity: sha512-7XMfMMNziFOoqIq2u9W5Z+wo7G7lzNQfUh7wDlkIqKxJMSLtP6GKH+QpK+21X4ZY9dIDmiuiwqZmS3Q3CgpATw==} - peerDependencies: - '@libsql/client': ^0.3.0 - better-sqlite3: 8.x - 9.x - lucia: 3.x - peerDependenciesMeta: - '@libsql/client': + /@cloudflare/workerd-darwin-arm64@1.20231218.0: + resolution: + { + integrity: sha512-b39qrU1bKolCfmKFDAnX4vXcqzISkEUVE/V8sMBsFzxrIpNAbcUHBZAQPYmS/OHIGB94KjOVokvDi7J6UNurPw==, + } + engines: { node: ">=16" } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true optional: true - better-sqlite3: + + /@cloudflare/workerd-linux-64@1.20231218.0: + resolution: + { + integrity: sha512-dMUF1wA+0mybm6hHNOCgY/WMNMwomPPs4I7vvYCgwHSkch0Q2Wb7TnxQZSt8d1PK/myibaBwadrlIxpjxmpz3w==, + } + engines: { node: ">=16" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true optional: true - dependencies: - '@libsql/client': 0.4.0 - better-sqlite3: 9.3.0 - lucia: 3.0.0 - dev: false - - /@napi-rs/wasm-runtime@0.1.1: - resolution: {integrity: sha512-ATj9ua659JgrkICjJscaeZdmPr44cb/KFjNWuD0N6pux0SpzaM7+iOuuK11mAnQM2N9q0DT4REu6NkL8ZEhopw==} - requiresBuild: true - dependencies: - '@emnapi/core': 0.45.0 - '@emnapi/runtime': 0.45.0 - '@tybys/wasm-util': 0.8.1 - dev: false - optional: true - - /@neon-rs/load@0.0.4: - resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==} - dev: false - - /@node-rs/argon2-android-arm-eabi@1.7.2: - resolution: {integrity: sha512-WhW84XOzdR4AOGc4BJvIg5lCRVBL0pXp/PPCe8QCyWw493p7VdNCdYpr2xdtjS/0zImmY85HNB/6zpzjLRTT/A==} - engines: {node: '>= 10'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-android-arm64@1.7.2: - resolution: {integrity: sha512-CdtayHSMIyDuVhSYFirwA757c4foQuyTjpysgFJLHweP9C7uDiBf9WBYij+UyabpaCadJ0wPyK6Vakinvlk4/g==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-darwin-arm64@1.7.2: - resolution: {integrity: sha512-hUOhtgYHTEyzX5sgMZVdXunONOus2HWpWydF5D/RYJ1mZ76FXRnFpQE40DqbzisdPIraKdn40m7JqkPP7wqdyg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-darwin-x64@1.7.2: - resolution: {integrity: sha512-lfs5HX+t542yUfcv6Aa/NeGD1nUCwyQNgnPEGcik71Ow6V13hkR1bHgmT1u3CHN4fBts0gW+DQEDsq1xlVgkvw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-freebsd-x64@1.7.2: - resolution: {integrity: sha512-ROoF+4VaCBJUjddrTN1hjuqSl89ppRcjVXJscSPJjWzTlbzFmGGovJvIzUBmCr/Oq3yM1zKHj6MP9oRD5cB+/g==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-arm-gnueabihf@1.7.2: - resolution: {integrity: sha512-CBSB8KPI8LS74Bcz3dYaa2/khULutz4vSDvFWUERlSLX+mPdDhoZi6UPuUPPF9e01w8AbiK1YCqlLUTm3tIMfw==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-arm64-gnu@1.7.2: - resolution: {integrity: sha512-6LBTug6ZiWFakP3X3Nqs7ZTM03gmcSWX4YvEn20HhhQE5NDrsrw3zNqGj0cJiNzKKIMSDDuj7uGy+ITEfNo4CA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-arm64-musl@1.7.2: - resolution: {integrity: sha512-KjhQ+ZPne29t9VRVeIif7JdKwQba+tM6CBNYBoJB1iON0CUKeqSQtZcHuTj9gkf2SNRG5bsU4ABcfxd0OKsKHg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-x64-gnu@1.7.2: - resolution: {integrity: sha512-BQvp+iLtKqomHz4q5t1aKoni9osgvUDU5sZtHAlFm5dRTlGHnympcQVATRE5GHyH9C6MIM9W7P1kqEeCLGPolQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-x64-musl@1.7.2: - resolution: {integrity: sha512-yXJudpBZQ98g+lWaHn9EzZ5KsAyqRdlpub/K+5NP7gHehb8wzBRIFAejIHAG0fvzQEEc86VOnV2koWIVZxWAvw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-wasm32-wasi@1.7.2: - resolution: {integrity: sha512-diXlVjJZY2GIV8ZDwUqXPhacXsFR0klGSv5D9f+XidwWXK4udtzDhkM/7N/Mb7h1HAWaxZ6IN9spYFjvWH1wqg==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - requiresBuild: true - dependencies: - '@napi-rs/wasm-runtime': 0.1.1 - dev: false - optional: true - - /@node-rs/argon2-win32-arm64-msvc@1.7.2: - resolution: {integrity: sha512-dhIBrY04P9nbmwzBpgERQDmmSu4YBZyeEE32t4TikMz5rQ07iaVC+JpGmtCBZoDIsLDHGC8cikENd3YEqpqIcA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-win32-ia32-msvc@1.7.2: - resolution: {integrity: sha512-o1tfqr8gyALCzuxBoQfvhxkeYMaw/0H8Gmt7klTYyEIBvEFu7SD5qytXO9Px7t5420nZL/Wy5cflg3IB1s57Pg==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-win32-x64-msvc@1.7.2: - resolution: {integrity: sha512-v0h53XUc7hNgWiWi0qcMcHvj9/kwuItI9NwLK4C+gtzT3UB0cedhfIL8HFMKThMXasy41ZdbpCF2Bi0kJoLNEg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2@1.7.2: - resolution: {integrity: sha512-+H6pc3M1vIX9YnG59YW7prHhhpv19P8YyxlXHnnFzTimf2q+kKDF7mGWbhvN9STqIY+P70Patn0Q6qb6Ib5/4g==} - engines: {node: '>= 10'} - optionalDependencies: - '@node-rs/argon2-android-arm-eabi': 1.7.2 - '@node-rs/argon2-android-arm64': 1.7.2 - '@node-rs/argon2-darwin-arm64': 1.7.2 - '@node-rs/argon2-darwin-x64': 1.7.2 - '@node-rs/argon2-freebsd-x64': 1.7.2 - '@node-rs/argon2-linux-arm-gnueabihf': 1.7.2 - '@node-rs/argon2-linux-arm64-gnu': 1.7.2 - '@node-rs/argon2-linux-arm64-musl': 1.7.2 - '@node-rs/argon2-linux-x64-gnu': 1.7.2 - '@node-rs/argon2-linux-x64-musl': 1.7.2 - '@node-rs/argon2-wasm32-wasi': 1.7.2 - '@node-rs/argon2-win32-arm64-msvc': 1.7.2 - '@node-rs/argon2-win32-ia32-msvc': 1.7.2 - '@node-rs/argon2-win32-x64-msvc': 1.7.2 - dev: false - - /@node-rs/bcrypt-android-arm-eabi@1.9.2: - resolution: {integrity: sha512-er/Q2khwpan9pczvTTqY/DJE4UU65u31xd0NkZlHUTKyB7djRhWfzoGexGx2GN+k831/RR3U8kKE/8QUHeO3hQ==} - engines: {node: '>= 10'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-android-arm64@1.9.2: - resolution: {integrity: sha512-OUYatOEG5vbLbF73q2TC8UqrDO81zUQxnaFD/OAB1hcm6J+ur0zJ8E53c35/DIqkTp7JarPMraC4rouJ2ugN4w==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-darwin-arm64@1.9.2: - resolution: {integrity: sha512-svJKsGbzMAxOB5oluOYneN4YkKUy26WSMgm3KOIhgoX30IeMilj+2jFN/5qrI0oDZ0Iczb3XyL5DuZFtEkdP8A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-darwin-x64@1.9.2: - resolution: {integrity: sha512-9OrySjBi/rWix8NZWD/TrNbNcwMY0pAiMHdL09aJnJ07uPih83GGh1pq4UHCYFCMy7iTX8swOmDlGBUImkOZbg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-freebsd-x64@1.9.2: - resolution: {integrity: sha512-/djXV71RO6g5L1mI2pVvmp3x3pH7G4uKI3ODG1JBIXoz334oOcCMh40sB0uq0ljP8WEadker01p4T1rJE98fpg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-arm-gnueabihf@1.9.2: - resolution: {integrity: sha512-F7wP950OTAooxEleUN4I2hqryGZK7hi1cSgRF13Wvbc597RFux35KiSxIXUA3mNt2DE7lV2PeceEtCOScaThWQ==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-arm64-gnu@1.9.2: - resolution: {integrity: sha512-MehG+yQ0TgKMgKR1rO4hdvHkVsTM91Cof8qI9EJlS5+7+QSwfFA5O0zGwCkISD7bsyauJ5uJgcByGjpEobAHOg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-arm64-musl@1.9.2: - resolution: {integrity: sha512-PRZTAJjOwKEGsIhmBvfNh81So+wGl4QyCFAt23j+KwBujLStjC0N3YaqtTlWVKG9tcriPtmMYiAQtXWIyIgg/w==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-x64-gnu@1.9.2: - resolution: {integrity: sha512-5WfGO+O1m7nJ55WZ8XDq+ItA98Z4O7sNWsR+1nIj9YGT+Tx5zkQ2RBhpK6oCWZMluuZ0eKQ0FDmyP6K+2NDRIA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-x64-musl@1.9.2: - resolution: {integrity: sha512-VjCn0388p6PMCVUYHgYmHZrKNc7WwNJRr2WLJsHbQRGDOKbpNL6YolCjQxUchcSPDhzwrq1cIdy4j0fpoXEsdw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-wasm32-wasi@1.9.2: - resolution: {integrity: sha512-P06aHfMzm9makwU+nM7WA65yQnS1xuqJ8l/6I/LvXjnl+lfB3DtJ2B0CSLtjnUGpUgcHbWl5gEbNnTPxSAirjQ==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - requiresBuild: true - dependencies: - '@napi-rs/wasm-runtime': 0.1.1 - dev: false - optional: true - - /@node-rs/bcrypt-win32-arm64-msvc@1.9.2: - resolution: {integrity: sha512-Iyo/Q5/eNw27VRd3mLBgh1b9b5fnT3QHTVwxv3Siv/MRAIfJXH/cTOe18qSwYQzNh0ZioW4yemFPYCWSZi7szA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-win32-ia32-msvc@1.9.2: - resolution: {integrity: sha512-6LHWMaPylyyHoS5863YpxAACVB8DWCxro5W6pQ4h8WKSgHpJp8Um9jphTdN0A2w45HZjUnfcFuiFFC+TbftjCw==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-win32-x64-msvc@1.9.2: - resolution: {integrity: sha512-vZ9T1MOaYkLO9FTyl28YX0SYJneiYTKNFgM8PUv8nas8xrD+7OzokA0fEtlNp6413T7IKSD/iG9qi8nTWsiyGg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt@1.9.2: - resolution: {integrity: sha512-FKUo9iCSIti+ldwoOlY1ztyIFhZxEgT7jZ/UCt/9bg1rLmNdbQQD2JKIMImDCqmTWuLPY4ZF4Q5MyOMIfDCd8Q==} - engines: {node: '>= 10'} - optionalDependencies: - '@node-rs/bcrypt-android-arm-eabi': 1.9.2 - '@node-rs/bcrypt-android-arm64': 1.9.2 - '@node-rs/bcrypt-darwin-arm64': 1.9.2 - '@node-rs/bcrypt-darwin-x64': 1.9.2 - '@node-rs/bcrypt-freebsd-x64': 1.9.2 - '@node-rs/bcrypt-linux-arm-gnueabihf': 1.9.2 - '@node-rs/bcrypt-linux-arm64-gnu': 1.9.2 - '@node-rs/bcrypt-linux-arm64-musl': 1.9.2 - '@node-rs/bcrypt-linux-x64-gnu': 1.9.2 - '@node-rs/bcrypt-linux-x64-musl': 1.9.2 - '@node-rs/bcrypt-wasm32-wasi': 1.9.2 - '@node-rs/bcrypt-win32-arm64-msvc': 1.9.2 - '@node-rs/bcrypt-win32-ia32-msvc': 1.9.2 - '@node-rs/bcrypt-win32-x64-msvc': 1.9.2 - dev: false - - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.0 - - /@scalar/api-client@0.9.3(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15): - resolution: {integrity: sha512-mfTlCAy2cA2kMoDIZWC6PEW7NdCIHJ7DxKcc+YqRdmM1wJHFRQ8RqPB7kqHSaoRFMk0atJtQnzgjdIU63T9fZQ==} - engines: {node: '>=18'} - peerDependencies: - vue: ^3.3.0 - dependencies: - '@headlessui/vue': 1.7.17(vue@3.4.15) - '@scalar/themes': 0.5.4(vue@3.4.15) - '@scalar/use-codemirror': 0.7.19(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15) - '@scalar/use-keyboard-event': 0.5.8(vue@3.4.15) - '@scalar/use-modal': 0.2.3(@headlessui/vue@1.7.17)(vue@3.4.15) - '@vueuse/core': 10.7.2(vue@3.4.15) - axios: 1.6.7 - content-type: 1.0.5 - javascript-time-ago: 2.5.9 - nanoid: 5.0.4 - pretty-bytes: 6.1.1 - pretty-ms: 8.0.0 - vue: 3.4.15(typescript@5.3.3) - transitivePeerDependencies: - - '@codemirror/lang-html' - - '@codemirror/lang-java' - - '@codemirror/lang-javascript' - - '@codemirror/lang-json' - - '@codemirror/lang-python' - - '@codemirror/language' - - '@codemirror/legacy-modes' - - '@codemirror/state' - - '@codemirror/view' - - '@lezer/common' - - '@lezer/highlight' - - '@lezer/lr' - - '@uiw/codemirror-themes' - - '@vue/composition-api' - - codemirror - - debug - dev: false - - /@scalar/api-reference@1.13.18(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(nanoid@5.0.4)(postcss@8.4.33)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15): - resolution: {integrity: sha512-K9p/cxH1mwwyiQf5q38Y+lBofxesleUsMJBT/ZxAHLaiO+1urXDnaEeyIAonXoEaprltvfhICWLvG8W+J6CmyA==} - engines: {node: '>=18'} - peerDependencies: - unified: ^11.0.0 - vue: ^3.3.0 - dependencies: - '@floating-ui/vue': 1.0.5(vue@3.4.15) - '@headlessui/vue': 1.7.17(vue@3.4.15) - '@scalar/api-client': 0.9.3(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15) - '@scalar/components': 0.2.2(typescript@5.3.3) - '@scalar/snippetz': 0.1.5 - '@scalar/swagger-editor': 0.9.8(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/view@6.23.1)(@headlessui/vue@1.7.17)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15) - '@scalar/swagger-parser': 0.5.15(openapi-types@12.1.3) - '@scalar/themes': 0.5.4(vue@3.4.15) - '@scalar/use-clipboard': 0.5.13(@scalar/use-toasts@0.5.13)(nanoid@5.0.4) - '@scalar/use-codemirror': 0.7.19(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15) - '@scalar/use-keyboard-event': 0.5.8(vue@3.4.15) - '@scalar/use-modal': 0.2.3(@headlessui/vue@1.7.17)(vue@3.4.15) - '@scalar/use-toasts': 0.5.13(nanoid@5.0.4)(vue@3.4.15) - '@scalar/use-tooltip': 0.5.8(vue@3.4.15) - '@unhead/schema': 1.8.10 - '@vcarl/remark-headings': 0.1.0 - '@vueuse/core': 10.7.2(vue@3.4.15) - '@xmldom/xmldom': 0.8.10 - axios: 1.6.7 - fuse.js: 6.6.2 - github-slugger: 2.0.0 - httpsnippet-lite: 3.0.5 - js-yaml: 4.1.0 - openapi-types: 12.1.3 - postcss-nested: 6.0.1(postcss@8.4.33) - rehype-external-links: 3.0.0 - rehype-format: 5.0.0 - rehype-highlight: 7.0.0 - rehype-sanitize: 6.0.0 - rehype-slug-custom-id: 1.1.0 - rehype-stringify: 10.0.0 - remark-gfm: 4.0.0 - remark-parse: 11.0.0 - remark-rehype: 11.1.0 - remark-stringify: 11.0.0 - unhead: 1.8.10 - unified: 11.0.4 - vue: 3.4.15(typescript@5.3.3) - transitivePeerDependencies: - - '@codemirror/lang-html' - - '@codemirror/lang-java' - - '@codemirror/lang-javascript' - - '@codemirror/lang-json' - - '@codemirror/lang-python' - - '@codemirror/language' - - '@codemirror/legacy-modes' - - '@codemirror/state' - - '@codemirror/view' - - '@lezer/common' - - '@lezer/highlight' - - '@lezer/lr' - - '@uiw/codemirror-themes' - - '@vue/composition-api' - - codemirror - - debug - - nanoid - - postcss - - supports-color - - typescript - dev: false - - /@scalar/components@0.2.2(typescript@5.3.3): - resolution: {integrity: sha512-+iMVCe6aKTwQYu4hLypH48kJVkfLZ/twB8ZBRK4lhZCpv8bUOprOMxYIkdnRtlXJITCaM6lxee5pg4aSVkCrvg==} - engines: {node: '>=18'} - dependencies: - '@headlessui/vue': 1.7.17(vue@3.4.15) - '@vueuse/core': 10.7.2(vue@3.4.15) - '@xmldom/xmldom': 0.8.10 - class-variance-authority: 0.7.0 - cva: 1.0.0-beta.1(typescript@5.3.3) - nanoid: 5.0.4 - tailwind-merge: 2.2.1 - vue: 3.4.15(typescript@5.3.3) - transitivePeerDependencies: - - '@vue/composition-api' - - typescript - dev: false - - /@scalar/hono-api-reference@0.3.29(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(hono@3.12.8)(nanoid@5.0.4)(postcss@8.4.33)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15): - resolution: {integrity: sha512-JKGwToiBBaLr2kuxPzoP+rDbceT2ILDBKACTK1c/LTvnLKJL/CcB6BiRfRjAKuVoIecPC7nVFoka/GXQkbUd7Q==} - engines: {node: '>=18'} - peerDependencies: - hono: ^3.0.0 - dependencies: - '@scalar/api-reference': 1.13.18(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(nanoid@5.0.4)(postcss@8.4.33)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15) - hono: 3.12.8 - transitivePeerDependencies: - - '@codemirror/lang-html' - - '@codemirror/lang-java' - - '@codemirror/lang-javascript' - - '@codemirror/lang-json' - - '@codemirror/lang-python' - - '@codemirror/language' - - '@codemirror/legacy-modes' - - '@codemirror/state' - - '@codemirror/view' - - '@lezer/common' - - '@lezer/highlight' - - '@lezer/lr' - - '@uiw/codemirror-themes' - - '@vue/composition-api' - - codemirror - - debug - - nanoid - - postcss - - supports-color - - typescript - - unified - - vue - dev: false - - /@scalar/snippetz-core@0.1.3: - resolution: {integrity: sha512-pHRi23VhxMddKMo/2zEnaRcc1QUTEva5H2tryuq+tER7imGWf2O09IGexiV9vY/8jzYh0QVl/2dlJUmnF9Ww5w==} - dependencies: - '@types/har-format': 1.2.15 - dev: false - - /@scalar/snippetz-plugin-js-fetch@0.1.0: - resolution: {integrity: sha512-lliZSIqtbZawm+XXmMXEpCcpIQprRwJXNUxLAvryB9AGm9qTu0dIfsvjJPjiTAfRew5+sgebNQ8cEF4esMnnlQ==} - dependencies: - '@scalar/snippetz-core': 0.1.3 - dev: false - - /@scalar/snippetz-plugin-node-fetch@0.1.1: - resolution: {integrity: sha512-U6kqtQi1xAME8AWgJmEVAFA/uhcJ1RUNKtyVDjupd77LQu2FEOPwqI5dPSltxvnJdYrUjLhDcfIa8EO8uO43zw==} - dependencies: - '@scalar/snippetz-core': 0.1.3 - dev: false - - /@scalar/snippetz-plugin-node-undici@0.1.5: - resolution: {integrity: sha512-ctOvCK3/Ta7ibuZjhV85M/gBuKURpeqgkWQHDFJubTHgUhQZudn60N5MY3ZtjoLFY7z9DCC5UenNYINveCdKJw==} - dependencies: - '@scalar/snippetz-core': 0.1.3 - dev: false - - /@scalar/snippetz@0.1.5: - resolution: {integrity: sha512-jHU8/KOO9vKbQFhsruflKugekgAtDm5GIAKZCYN+XtzqQ3jPGAjzkEZMXXvRDS2YPtFSzH2vzfqNMLB+q2Zupw==} - dependencies: - '@scalar/snippetz-core': 0.1.3 - '@scalar/snippetz-plugin-js-fetch': 0.1.0 - '@scalar/snippetz-plugin-node-fetch': 0.1.1 - '@scalar/snippetz-plugin-node-undici': 0.1.5 - dev: false - - /@scalar/swagger-editor@0.9.8(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/view@6.23.1)(@headlessui/vue@1.7.17)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15): - resolution: {integrity: sha512-VxhbqaZVwEy7Od29Kxbg6a/6AM7md/ugcD2pNCw2wUv1PcV/ru+9imJkfClI3HfUXZN/IyLDaZpaNZadCB4Rrw==} - engines: {node: '>=18'} - peerDependencies: - unified: ^11.0.0 - vue: ^3.3.0 - dependencies: - '@codemirror/state': 6.4.0 - '@scalar/components': 0.2.2(typescript@5.3.3) - '@scalar/themes': 0.5.4(vue@3.4.15) - '@scalar/use-codemirror': 0.7.19(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15) - '@scalar/use-modal': 0.2.3(@headlessui/vue@1.7.17)(vue@3.4.15) - '@vueuse/core': 10.7.2(vue@3.4.15) - nanoid: 5.0.4 - rehype-external-links: 3.0.0 - rehype-format: 5.0.0 - rehype-highlight: 7.0.0 - rehype-sanitize: 6.0.0 - rehype-slug-custom-id: 1.1.0 - rehype-stringify: 10.0.0 - remark-gfm: 4.0.0 - remark-parse: 11.0.0 - remark-rehype: 11.1.0 - unified: 11.0.4 - vue: 3.4.15(typescript@5.3.3) - transitivePeerDependencies: - - '@codemirror/lang-html' - - '@codemirror/lang-java' - - '@codemirror/lang-javascript' - - '@codemirror/lang-json' - - '@codemirror/lang-python' - - '@codemirror/language' - - '@codemirror/legacy-modes' - - '@codemirror/view' - - '@headlessui/vue' - - '@lezer/common' - - '@lezer/highlight' - - '@lezer/lr' - - '@uiw/codemirror-themes' - - '@vue/composition-api' - - codemirror - - supports-color - - typescript - dev: false - - /@scalar/swagger-parser@0.5.15(openapi-types@12.1.3): - resolution: {integrity: sha512-qQY69CiS9XkdG5RuWk/ey12qXiXLUacb7b6oXU1KNB00MKJEpfj+Fjdn+ALXBoKiUVqAfIxeB76evGdZsupwMQ==} - engines: {node: '>=18'} - dependencies: - '@apidevtools/swagger-parser': 10.1.0(openapi-types@12.1.3) - js-yaml: 4.1.0 - transitivePeerDependencies: - - openapi-types - dev: false - - /@scalar/themes@0.5.4(vue@3.4.15): - resolution: {integrity: sha512-3tmivqGFJwmxmPygWls5W5qyQAt2Ax8tUVi/eVHb8+UYs5ADTzhNKeOu/CipKeZO9z+tfO+UO+XLhy2qb5T+dA==} - engines: {node: '>=18'} - peerDependencies: - vue: ^3.3.0 - dependencies: - vue: 3.4.15(typescript@5.3.3) - dev: false - - /@scalar/use-clipboard@0.5.13(@scalar/use-toasts@0.5.13)(nanoid@5.0.4): - resolution: {integrity: sha512-UtDu+ArEfHjHUGJzNZQdbFfP4CAPhPwJxcMAwG6KbwaRTNq4UNRS3+WoFmnVOOl8dPLVQFyMs10A2ca2HgJGcA==} - engines: {node: '>=18'} - peerDependencies: - '@scalar/use-toasts': 0.5.13 - nanoid: ^5.0.1 - dependencies: - '@scalar/use-toasts': 0.5.13(nanoid@5.0.4)(vue@3.4.15) - nanoid: 5.0.4 - dev: false - - /@scalar/use-codemirror@0.7.19(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15): - resolution: {integrity: sha512-xS6/JsVeQ983K6B/6RJMfmgl5GNst7zPbspSPxKwRCbwV5qBZaVWMhop6HQ5mnmanJTXxeh6krRG3K8tFbsuyg==} - engines: {node: '>=18'} - peerDependencies: - '@codemirror/lang-html': ^6.0.0 - '@codemirror/lang-java': ^6.0.0 - '@codemirror/lang-javascript': ^6.0.0 - '@codemirror/lang-json': ^6.0.0 - '@codemirror/lang-python': ^6.0.0 - '@codemirror/language': ^6.0.0 - '@codemirror/legacy-modes': ^6.0.0 - '@codemirror/state': ^6.4.0 - '@codemirror/view': ^6.0.0 - '@lezer/common': ^1.1.0 - '@lezer/highlight': ^1.1.0 - '@lezer/lr': ^1.3.0 - '@uiw/codemirror-themes': ^4.21.0 - codemirror: ^6.0.0 - vue: ^3.3.0 - dependencies: - '@codemirror/lang-html': 6.4.8 - '@codemirror/lang-java': 6.0.1 - '@codemirror/lang-javascript': 6.2.1 - '@codemirror/lang-json': 6.0.1 - '@codemirror/lang-python': 6.1.3(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) - '@codemirror/language': 6.10.0 - '@codemirror/legacy-modes': 6.3.3 - '@codemirror/state': 6.4.0 - '@codemirror/view': 6.23.1 - '@lezer/common': 1.2.1 - '@lezer/highlight': 1.2.0 - '@lezer/lr': 1.4.0 - '@uiw/codemirror-themes': 4.21.21(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1) - codemirror: 6.0.1(@lezer/common@1.2.1) - vue: 3.4.15(typescript@5.3.3) - dev: false - - /@scalar/use-keyboard-event@0.5.8(vue@3.4.15): - resolution: {integrity: sha512-LcqgZOZWOKIDCftfR4+qOXEtbvXtTtHSObRF2egpctsXgGHlyKY5KjPOoffbvwdh21rLa5ITBy+emwAm2i6Xww==} - engines: {node: '>=18'} - peerDependencies: - vue: ^3.3.0 - dependencies: - vue: 3.4.15(typescript@5.3.3) - dev: false - - /@scalar/use-modal@0.2.3(@headlessui/vue@1.7.17)(vue@3.4.15): - resolution: {integrity: sha512-qCn8rNCTy7jO/7DDalsMM+m1jBfEE/Fnx3Im966uBzCdxdyLbJ8f9S2ZwmW44KP6CXbsMGsuORkvY6Z8joZvMg==} - engines: {node: '>=18'} - peerDependencies: - '@headlessui/vue': ^1.7.0 - vue: ^3.3.0 - dependencies: - '@headlessui/vue': 1.7.17(vue@3.4.15) - vue: 3.4.15(typescript@5.3.3) - dev: false - - /@scalar/use-toasts@0.5.13(nanoid@5.0.4)(vue@3.4.15): - resolution: {integrity: sha512-EiFezCmWchaYfwEDTkSv/r7x6aYOlaFcu+zpTaV/y3ppCIybLvL3WRQzQS0KMaCJJBmQecZbCqMPnRLlacPwYw==} - engines: {node: '>=18'} - peerDependencies: - nanoid: 4 - 5 - vue: ^3.3.0 - dependencies: - nanoid: 5.0.4 - vue: 3.4.15(typescript@5.3.3) - dev: false - - /@scalar/use-tooltip@0.5.8(vue@3.4.15): - resolution: {integrity: sha512-9gCa7UGlRQVrKVy3tp5WYn/vCS1Fk0mcPlpkoffPeekS/4A01K3SpddqM76gVUNnOvDOq0EPEbVvUO1deB9oGw==} - engines: {node: '>=18'} - peerDependencies: - vue: ^3.3.0 - dependencies: - vue: 3.4.15(typescript@5.3.3) - dev: false - - /@tanstack/virtual-core@3.0.0: - resolution: {integrity: sha512-SYXOBTjJb05rXa2vl55TTwO40A6wKu0R5i1qQwhJYNDIqaIGF7D0HsLw+pJAyi2OvntlEIVusx3xtbbgSUi6zg==} - dev: false - - /@tanstack/vue-virtual@3.0.2(vue@3.4.15): - resolution: {integrity: sha512-1iFpX+yZswHuf4wrA6GU9yJ/YzQ/8SacABwqghwCkcwrkZbOPLlRSdOAqZ1WQ50SftmfhZpaiZl2KmpV7cgfMQ==} - peerDependencies: - vue: ^2.7.0 || ^3.0.0 - dependencies: - '@tanstack/virtual-core': 3.0.0 - vue: 3.4.15(typescript@5.3.3) - dev: false - - /@tybys/wasm-util@0.8.1: - resolution: {integrity: sha512-GSsTwyBl4pIzsxAY5wroZdyQKyhXk0d8PCRZtrSZ2WEB1cBdrp2EgGBwHOGCZtIIPun/DL3+AykCv+J6fyRH4Q==} - requiresBuild: true - dependencies: - tslib: 2.6.2 - dev: false - optional: true - - /@types/debug@4.1.12: - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - dependencies: - '@types/ms': 0.7.34 - dev: false - - /@types/har-format@1.2.15: - resolution: {integrity: sha512-RpQH4rXLuvTXKR0zqHq3go0RVXYv/YVqv4TnPH95VbwUxZdQlK1EtcMvQvMpDngHbt13Csh9Z4qT9AbkiQH5BA==} - dev: false - - /@types/hast@2.3.9: - resolution: {integrity: sha512-pTHyNlaMD/oKJmS+ZZUyFUcsZeBZpC0lmGquw98CqRVNgAdJZJeD7GoeLiT6Xbx5rU9VCjSt0RwEvDgzh4obFw==} - dependencies: - '@types/unist': 2.0.10 - dev: false - - /@types/hast@3.0.3: - resolution: {integrity: sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==} - dependencies: - '@types/unist': 3.0.2 - dev: false - - /@types/json-schema@7.0.15: - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - dev: false - - /@types/mdast@3.0.15: - resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} - dependencies: - '@types/unist': 2.0.10 - dev: false - - /@types/mdast@4.0.3: - resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} - dependencies: - '@types/unist': 3.0.2 - dev: false - - /@types/ms@0.7.34: - resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - dev: false - - /@types/node-fetch@2.6.11: - resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} - dependencies: - '@types/node': 20.11.8 - form-data: 4.0.0 - dev: false - - /@types/node-forge@1.3.11: - resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} - dependencies: - '@types/node': 20.11.8 - dev: true - - /@types/node@20.11.8: - resolution: {integrity: sha512-i7omyekpPTNdv4Jb/Rgqg0RU8YqLcNsI12quKSDkRXNfx7Wxdm6HhK1awT3xTgEkgxPn3bvnSpiEAc7a7Lpyow==} - dependencies: - undici-types: 5.26.5 - - /@types/semver@7.5.6: - resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} - dev: false - - /@types/unist@2.0.10: - resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} - dev: false - - /@types/unist@3.0.2: - resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} - dev: false - - /@types/web-bluetooth@0.0.20: - resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} - dev: false - - /@types/ws@8.5.10: - resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} - dependencies: - '@types/node': 20.11.8 - dev: false - - /@typescript-eslint/eslint-plugin@6.19.1(@typescript-eslint/parser@6.19.1)(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-roQScUGFruWod9CEyoV5KlCYrubC/fvG8/1zXuT0WTcxX87GnMMmnksMwSg99lo1xiKrBzw2icsJPMAw1OtKxg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: + + /@cloudflare/workerd-linux-arm64@1.20231218.0: + resolution: + { + integrity: sha512-2s5uc8IHt0QmWyKxAr1Fy+4b8Xy0b/oUtlPnm5MrKi2gDRlZzR7JvxENPJCpCnYENydS8lzvkMiAFECPBccmyQ==, + } + engines: { node: ">=16" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true optional: true - dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 6.19.1(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/scope-manager': 6.19.1 - '@typescript-eslint/type-utils': 6.19.1(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/utils': 6.19.1(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 6.19.1 - debug: 4.3.4 - eslint: 8.56.0 - graphemer: 1.4.0 - ignore: 5.3.0 - natural-compare: 1.4.0 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.3.3) - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/parser@6.19.1(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-WEfX22ziAh6pRE9jnbkkLGp/4RhTpffr2ZK5bJ18M8mIfA8A+k97U9ZyaXCEJRlmMHh7R9MJZWXp/r73DzINVQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: + + /@cloudflare/workerd-windows-64@1.20231218.0: + resolution: + { + integrity: sha512-oN5hz6TXUDB5YKUN5N3QWAv6cYz9JjTZ9g16HVyoegVFEL6/zXU3tV19MBX2IvlE11ab/mRogEv9KXVIrHfKmA==, + } + engines: { node: ">=16" } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true optional: true - dependencies: - '@typescript-eslint/scope-manager': 6.19.1 - '@typescript-eslint/types': 6.19.1 - '@typescript-eslint/typescript-estree': 6.19.1(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 6.19.1 - debug: 4.3.4 - eslint: 8.56.0 - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/scope-manager@6.19.1: - resolution: {integrity: sha512-4CdXYjKf6/6aKNMSly/BP4iCSOpvMmqtDzRtqFyyAae3z5kkqEjKndR5vDHL8rSuMIIWP8u4Mw4VxLyxZW6D5w==} - engines: {node: ^16.0.0 || >=18.0.0} - dependencies: - '@typescript-eslint/types': 6.19.1 - '@typescript-eslint/visitor-keys': 6.19.1 - dev: false - - /@typescript-eslint/type-utils@6.19.1(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-0vdyld3ecfxJuddDjACUvlAeYNrHP/pDeQk2pWBR2ESeEzQhg52DF53AbI9QCBkYE23lgkhLCZNkHn2hEXXYIg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: + + /@cloudflare/workers-types@4.20240117.0: + resolution: + { + integrity: sha512-HQU8lJhaJVh8gQXFtVA7lZwd0hK1ckIFjRuxOXkVN2Z9t7DtzNbA2YTwBry5thKNgF5EwjN4THjHg5NUZzj05A==, + } + + /@codemirror/autocomplete@6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1): + resolution: + { + integrity: sha512-r4IjdYFthwbCQyvqnSlx0WBHRHi8nBvU+WjJxFUij81qsBfhNudf/XKKmmC2j3m0LaOYUQTf3qiEK1J8lO1sdg==, + } + peerDependencies: + "@codemirror/language": ^6.0.0 + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.0.0 + "@lezer/common": ^1.0.0 + dependencies: + "@codemirror/language": 6.10.0 + "@codemirror/state": 6.4.0 + "@codemirror/view": 6.23.1 + "@lezer/common": 1.2.1 + dev: false + + /@codemirror/commands@6.3.3: + resolution: + { + integrity: sha512-dO4hcF0fGT9tu1Pj1D2PvGvxjeGkbC6RGcZw6Qs74TH+Ed1gw98jmUgd2axWvIZEqTeTuFrg1lEB1KV6cK9h1A==, + } + dependencies: + "@codemirror/language": 6.10.0 + "@codemirror/state": 6.4.0 + "@codemirror/view": 6.23.1 + "@lezer/common": 1.2.1 + dev: false + + /@codemirror/lang-css@6.2.1(@codemirror/view@6.23.1): + resolution: + { + integrity: sha512-/UNWDNV5Viwi/1lpr/dIXJNWiwDxpw13I4pTUAsNxZdg6E0mI2kTQb0P2iHczg1Tu+H4EBgJR+hYhKiHKko7qg==, + } + dependencies: + "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) + "@codemirror/language": 6.10.0 + "@codemirror/state": 6.4.0 + "@lezer/common": 1.2.1 + "@lezer/css": 1.1.7 + transitivePeerDependencies: + - "@codemirror/view" + dev: false + + /@codemirror/lang-html@6.4.8: + resolution: + { + integrity: sha512-tE2YK7wDlb9ZpAH6mpTPiYm6rhfdQKVDa5r9IwIFlwwgvVaKsCfuKKZoJGWsmMZIf3FQAuJ5CHMPLymOtg1hXw==, + } + dependencies: + "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) + "@codemirror/lang-css": 6.2.1(@codemirror/view@6.23.1) + "@codemirror/lang-javascript": 6.2.1 + "@codemirror/language": 6.10.0 + "@codemirror/state": 6.4.0 + "@codemirror/view": 6.23.1 + "@lezer/common": 1.2.1 + "@lezer/css": 1.1.7 + "@lezer/html": 1.3.8 + dev: false + + /@codemirror/lang-java@6.0.1: + resolution: + { + integrity: sha512-OOnmhH67h97jHzCuFaIEspbmsT98fNdhVhmA3zCxW0cn7l8rChDhZtwiwJ/JOKXgfm4J+ELxQihxaI7bj7mJRg==, + } + dependencies: + "@codemirror/language": 6.10.0 + "@lezer/java": 1.1.1 + dev: false + + /@codemirror/lang-javascript@6.2.1: + resolution: + { + integrity: sha512-jlFOXTejVyiQCW3EQwvKH0m99bUYIw40oPmFjSX2VS78yzfe0HELZ+NEo9Yfo1MkGRpGlj3Gnu4rdxV1EnAs5A==, + } + dependencies: + "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) + "@codemirror/language": 6.10.0 + "@codemirror/lint": 6.4.2 + "@codemirror/state": 6.4.0 + "@codemirror/view": 6.23.1 + "@lezer/common": 1.2.1 + "@lezer/javascript": 1.4.13 + dev: false + + /@codemirror/lang-json@6.0.1: + resolution: + { + integrity: sha512-+T1flHdgpqDDlJZ2Lkil/rLiRy684WMLc74xUnjJH48GQdfJo/pudlTRreZmKwzP8/tGdKf83wlbAdOCzlJOGQ==, + } + dependencies: + "@codemirror/language": 6.10.0 + "@lezer/json": 1.0.2 + dev: false + + /@codemirror/lang-python@6.1.3(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1): + resolution: + { + integrity: sha512-S9w2Jl74hFlD5nqtUMIaXAq9t5WlM0acCkyuQWUUSvZclk1sV+UfnpFiZzuZSG+hfEaOmxKR5UxY/Uxswn7EhQ==, + } + dependencies: + "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) + "@codemirror/language": 6.10.0 + "@lezer/python": 1.1.11 + transitivePeerDependencies: + - "@codemirror/state" + - "@codemirror/view" + - "@lezer/common" + dev: false + + /@codemirror/language@6.10.0: + resolution: + { + integrity: sha512-2vaNn9aPGCRFKWcHPFksctzJ8yS5p7YoaT+jHpc0UGKzNuAIx4qy6R5wiqbP+heEEdyaABA582mNqSHzSoYdmg==, + } + dependencies: + "@codemirror/state": 6.4.0 + "@codemirror/view": 6.23.1 + "@lezer/common": 1.2.1 + "@lezer/highlight": 1.2.0 + "@lezer/lr": 1.4.0 + style-mod: 4.1.0 + dev: false + + /@codemirror/legacy-modes@6.3.3: + resolution: + { + integrity: sha512-X0Z48odJ0KIoh/HY8Ltz75/4tDYc9msQf1E/2trlxFaFFhgjpVHjZ/BCXe1Lk7s4Gd67LL/CeEEHNI+xHOiESg==, + } + dependencies: + "@codemirror/language": 6.10.0 + dev: false + + /@codemirror/lint@6.4.2: + resolution: + { + integrity: sha512-wzRkluWb1ptPKdzlsrbwwjYCPLgzU6N88YBAmlZi8WFyuiEduSd05MnJYNogzyc8rPK7pj6m95ptUApc8sHKVA==, + } + dependencies: + "@codemirror/state": 6.4.0 + "@codemirror/view": 6.23.1 + crelt: 1.0.6 + dev: false + + /@codemirror/search@6.5.5: + resolution: + { + integrity: sha512-PIEN3Ke1buPod2EHbJsoQwlbpkz30qGZKcnmH1eihq9+bPQx8gelauUwLYaY4vBOuBAuEhmpDLii4rj/uO0yMA==, + } + dependencies: + "@codemirror/state": 6.4.0 + "@codemirror/view": 6.23.1 + crelt: 1.0.6 + dev: false + + /@codemirror/state@6.4.0: + resolution: + { + integrity: sha512-hm8XshYj5Fo30Bb922QX9hXB/bxOAVH+qaqHBzw5TKa72vOeslyGwd4X8M0c1dJ9JqxlaMceOQ8RsL9tC7gU0A==, + } + dev: false + + /@codemirror/view@6.23.1: + resolution: + { + integrity: sha512-J2Xnn5lFYT1ZN/5ewEoMBCmLlL71lZ3mBdb7cUEuHhX2ESoSrNEucpsDXpX22EuTGm9LOgC9v4Z0wx+Ez8QmGA==, + } + dependencies: + "@codemirror/state": 6.4.0 + style-mod: 4.1.0 + w3c-keyname: 2.2.8 + 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 + + /@drizzle-team/studio@0.0.39: + resolution: + { + integrity: sha512-c5Hkm7MmQC2n5qAsKShjQrHoqlfGslB8+qWzsGGZ+2dHMRTNG60UuzalF0h0rvBax5uzPXuGkYLGaQ+TUX3yMw==, + } + dependencies: + superjson: 2.2.1 + dev: true + + /@emnapi/core@0.45.0: + resolution: + { + integrity: sha512-DPWjcUDQkCeEM4VnljEOEcXdAD7pp8zSZsgOujk/LGIwCXWbXJngin+MO4zbH429lzeC3WbYLGjE2MaUOwzpyw==, + } + requiresBuild: true + dependencies: + tslib: 2.6.2 + dev: false optional: true - dependencies: - '@typescript-eslint/typescript-estree': 6.19.1(typescript@5.3.3) - '@typescript-eslint/utils': 6.19.1(eslint@8.56.0)(typescript@5.3.3) - debug: 4.3.4 - eslint: 8.56.0 - ts-api-utils: 1.0.3(typescript@5.3.3) - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/types@6.19.1: - resolution: {integrity: sha512-6+bk6FEtBhvfYvpHsDgAL3uo4BfvnTnoge5LrrCj2eJN8g3IJdLTD4B/jK3Q6vo4Ql/Hoip9I8aB6fF+6RfDqg==} - engines: {node: ^16.0.0 || >=18.0.0} - dev: false - - /@typescript-eslint/typescript-estree@6.19.1(typescript@5.3.3): - resolution: {integrity: sha512-aFdAxuhzBFRWhy+H20nYu19+Km+gFfwNO4TEqyszkMcgBDYQjmPJ61erHxuT2ESJXhlhrO7I5EFIlZ+qGR8oVA==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: + + /@emnapi/runtime@0.45.0: + resolution: + { + integrity: sha512-Txumi3td7J4A/xTTwlssKieHKTGl3j4A1tglBx72auZ49YK7ePY6XZricgIg9mnZT4xPfA+UPCUdnhRuEFDL+w==, + } + requiresBuild: true + dependencies: + tslib: 2.6.2 + dev: false optional: true - dependencies: - '@typescript-eslint/types': 6.19.1 - '@typescript-eslint/visitor-keys': 6.19.1 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.3 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.3.3) - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/utils@6.19.1(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-JvjfEZuP5WoMqwh9SPAPDSHSg9FBHHGhjPugSRxu5jMfjvBpq5/sGTD+9M9aQ5sh6iJ8AY/Kk/oUYVEMAPwi7w==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.6 - '@typescript-eslint/scope-manager': 6.19.1 - '@typescript-eslint/types': 6.19.1 - '@typescript-eslint/typescript-estree': 6.19.1(typescript@5.3.3) - eslint: 8.56.0 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - - typescript - dev: false - - /@typescript-eslint/visitor-keys@6.19.1: - resolution: {integrity: sha512-gkdtIO+xSO/SmI0W68DBg4u1KElmIUo3vXzgHyGPs6cxgB0sa3TlptRAAE0hUY1hM6FcDKEv7aIwiTGm76cXfQ==} - engines: {node: ^16.0.0 || >=18.0.0} - dependencies: - '@typescript-eslint/types': 6.19.1 - eslint-visitor-keys: 3.4.3 - dev: false - - /@uiw/codemirror-themes@4.21.21(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1): - resolution: {integrity: sha512-ljVcMGdaxo75UaH+EqxJ+jLyMVVgeSfW2AKyT1VeLy+4SDpuqNQ7wq5XVxktsG6LH+OvgSFndWXgPANf4+gQcA==} - peerDependencies: - '@codemirror/language': '>=6.0.0' - '@codemirror/state': '>=6.0.0' - '@codemirror/view': '>=6.0.0' - dependencies: - '@codemirror/language': 6.10.0 - '@codemirror/state': 6.4.0 - '@codemirror/view': 6.23.1 - dev: false - - /@ungap/structured-clone@1.2.0: - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - - /@unhead/dom@1.8.10: - resolution: {integrity: sha512-dBeDbHrBjeU+eVgMsD91TGEazb1dwLrY0x/ve01CldMCmm+WcRu++SUW7s1QX84mzGH2EgFz78o1OPn6jpV3zw==} - dependencies: - '@unhead/schema': 1.8.10 - '@unhead/shared': 1.8.10 - dev: false - - /@unhead/schema@1.8.10: - resolution: {integrity: sha512-cy8RGOPkwOVY5EmRoCgGV8AqLjy/226xBVTY54kBct02Om3hBdpB9FZa9frM910pPUXMI8PNmFgABO23O7IdJA==} - dependencies: - hookable: 5.5.3 - zhead: 2.2.4 - dev: false - - /@unhead/shared@1.8.10: - resolution: {integrity: sha512-pEFryAs3EmV+ShDQx2ZBwUnt5l3RrMrXSMZ50oFf+MImKZNARVvD4+3I8fEI9wZh+Zq0JYG3UAfzo51MUP+Juw==} - dependencies: - '@unhead/schema': 1.8.10 - dev: false - - /@vcarl/remark-headings@0.1.0: - resolution: {integrity: sha512-ffQxJUcapJ9Bk+fiGN49YJ9RaYMibrSTSezB1Fcrtu+0YSZxA3bsaLlIv1u/4sjPIeW/BKrs4xtMT3l3P9Ba5Q==} - dependencies: - mdast-util-to-string: 3.2.0 - unist-util-visit: 4.1.2 - dev: false - - /@vue/compiler-core@3.4.15: - resolution: {integrity: sha512-XcJQVOaxTKCnth1vCxEChteGuwG6wqnUHxAm1DO3gCz0+uXKaJNx8/digSz4dLALCy8n2lKq24jSUs8segoqIw==} - dependencies: - '@babel/parser': 7.23.9 - '@vue/shared': 3.4.15 - entities: 4.5.0 - estree-walker: 2.0.2 - source-map-js: 1.0.2 - dev: false - - /@vue/compiler-dom@3.4.15: - resolution: {integrity: sha512-wox0aasVV74zoXyblarOM3AZQz/Z+OunYcIHe1OsGclCHt8RsRm04DObjefaI82u6XDzv+qGWZ24tIsRAIi5MQ==} - dependencies: - '@vue/compiler-core': 3.4.15 - '@vue/shared': 3.4.15 - dev: false - - /@vue/compiler-sfc@3.4.15: - resolution: {integrity: sha512-LCn5M6QpkpFsh3GQvs2mJUOAlBQcCco8D60Bcqmf3O3w5a+KWS5GvYbrrJBkgvL1BDnTp+e8q0lXCLgHhKguBA==} - dependencies: - '@babel/parser': 7.23.9 - '@vue/compiler-core': 3.4.15 - '@vue/compiler-dom': 3.4.15 - '@vue/compiler-ssr': 3.4.15 - '@vue/shared': 3.4.15 - estree-walker: 2.0.2 - magic-string: 0.30.5 - postcss: 8.4.33 - source-map-js: 1.0.2 - dev: false - - /@vue/compiler-ssr@3.4.15: - resolution: {integrity: sha512-1jdeQyiGznr8gjFDadVmOJqZiLNSsMa5ZgqavkPZ8O2wjHv0tVuAEsw5hTdUoUW4232vpBbL/wJhzVW/JwY1Uw==} - dependencies: - '@vue/compiler-dom': 3.4.15 - '@vue/shared': 3.4.15 - dev: false - - /@vue/reactivity@3.4.15: - resolution: {integrity: sha512-55yJh2bsff20K5O84MxSvXKPHHt17I2EomHznvFiJCAZpJTNW8IuLj1xZWMLELRhBK3kkFV/1ErZGHJfah7i7w==} - dependencies: - '@vue/shared': 3.4.15 - dev: false - - /@vue/runtime-core@3.4.15: - resolution: {integrity: sha512-6E3by5m6v1AkW0McCeAyhHTw+3y17YCOKG0U0HDKDscV4Hs0kgNT5G+GCHak16jKgcCDHpI9xe5NKb8sdLCLdw==} - dependencies: - '@vue/reactivity': 3.4.15 - '@vue/shared': 3.4.15 - dev: false - - /@vue/runtime-dom@3.4.15: - resolution: {integrity: sha512-EVW8D6vfFVq3V/yDKNPBFkZKGMFSvZrUQmx196o/v2tHKdwWdiZjYUBS+0Ez3+ohRyF8Njwy/6FH5gYJ75liUw==} - dependencies: - '@vue/runtime-core': 3.4.15 - '@vue/shared': 3.4.15 - csstype: 3.1.3 - dev: false - - /@vue/server-renderer@3.4.15(vue@3.4.15): - resolution: {integrity: sha512-3HYzaidu9cHjrT+qGUuDhFYvF/j643bHC6uUN9BgM11DVy+pM6ATsG6uPBLnkwOgs7BpJABReLmpL3ZPAsUaqw==} - peerDependencies: - vue: 3.4.15 - dependencies: - '@vue/compiler-ssr': 3.4.15 - '@vue/shared': 3.4.15 - vue: 3.4.15(typescript@5.3.3) - dev: false - - /@vue/shared@3.4.15: - resolution: {integrity: sha512-KzfPTxVaWfB+eGcGdbSf4CWdaXcGDqckoeXUh7SB3fZdEtzPCK2Vq9B/lRRL3yutax/LWITz+SwvgyOxz5V75g==} - dev: false - - /@vueuse/core@10.7.2(vue@3.4.15): - resolution: {integrity: sha512-AOyAL2rK0By62Hm+iqQn6Rbu8bfmbgaIMXcE3TSr7BdQ42wnSFlwIdPjInO62onYsEMK/yDMU8C6oGfDAtZ2qQ==} - dependencies: - '@types/web-bluetooth': 0.0.20 - '@vueuse/metadata': 10.7.2 - '@vueuse/shared': 10.7.2(vue@3.4.15) - vue-demi: 0.14.6(vue@3.4.15) - transitivePeerDependencies: - - '@vue/composition-api' - - vue - dev: false - - /@vueuse/metadata@10.7.2: - resolution: {integrity: sha512-kCWPb4J2KGrwLtn1eJwaJD742u1k5h6v/St5wFe8Quih90+k2a0JP8BS4Zp34XUuJqS2AxFYMb1wjUL8HfhWsQ==} - dev: false - - /@vueuse/shared@10.7.2(vue@3.4.15): - resolution: {integrity: sha512-qFbXoxS44pi2FkgFjPvF4h7c9oMDutpyBdcJdMYIMg9XyXli2meFMuaKn+UMgsClo//Th6+beeCgqweT/79BVA==} - dependencies: - vue-demi: 0.14.6(vue@3.4.15) - transitivePeerDependencies: - - '@vue/composition-api' - - vue - dev: false - - /@xmldom/xmldom@0.8.10: - resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==} - engines: {node: '>=10.0.0'} - dev: false - - /acorn-jsx@5.3.2(acorn@8.11.3): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.11.3 - - /acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} - engines: {node: '>=0.4.0'} - dev: true - - /acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} - engines: {node: '>=0.4.0'} - hasBin: true - - /ajv-draft-04@1.0.0(ajv@8.12.0): - resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} - peerDependencies: - ajv: ^8.5.0 - peerDependenciesMeta: - ajv: + + /@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/aix-ppc64@0.19.12: + resolution: + { + integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==, + } + engines: { node: ">=12" } + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true optional: true - dependencies: - ajv: 8.12.0 - dev: false - - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - - /ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} - dependencies: - fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - uri-js: 4.4.1 - dev: false - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - dependencies: - sprintf-js: 1.0.3 - dev: false - - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: false - - /as-table@1.0.55: - resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} - dependencies: - printable-characters: 1.0.42 - dev: true - - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: false - - /axios@1.6.7: - resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} - dependencies: - follow-redirects: 1.15.5 - form-data: 4.0.0 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - dev: false - - /bail@2.0.2: - resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - dev: false - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: false - - /better-sqlite3@9.3.0: - resolution: {integrity: sha512-ww73jVpQhRRdS9uMr761ixlkl4bWoXi8hMQlBGhoN6vPNlUHpIsNmw4pKN6kjknlt/wopdvXHvLk1W75BI+n0Q==} - 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 - - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - dependencies: - balanced-match: 1.0.2 - - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: true - - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: false - - /call-me-maybe@1.0.2: - resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} - dev: false - - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - - /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 - - /ccount@2.0.1: - resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - dev: false - - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true - - /character-entities-html4@2.1.0: - resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} - dev: false - - /character-entities-legacy@3.0.0: - resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - dev: false - - /character-entities@2.0.2: - resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - dev: false - - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - dev: false - - /class-variance-authority@0.7.0: - resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==} - dependencies: - clsx: 2.0.0 - dev: false - - /cli-color@2.0.3: - resolution: {integrity: sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==} - engines: {node: '>=0.10'} - dependencies: - d: 1.0.1 - es5-ext: 0.10.62 - es6-iterator: 2.0.3 - memoizee: 0.4.15 - timers-ext: 0.1.7 - dev: true - - /clsx@2.0.0: - resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} - engines: {node: '>=6'} - dev: false - - /codemirror@6.0.1(@lezer/common@1.2.1): - resolution: {integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==} - dependencies: - '@codemirror/autocomplete': 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) - '@codemirror/commands': 6.3.3 - '@codemirror/language': 6.10.0 - '@codemirror/lint': 6.4.2 - '@codemirror/search': 6.5.5 - '@codemirror/state': 6.4.0 - '@codemirror/view': 6.23.1 - transitivePeerDependencies: - - '@lezer/common' - dev: false - - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - dependencies: - delayed-stream: 1.0.0 - dev: false - - /comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - dev: false - - /commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} - dev: true - - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - /content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - dev: false - - /cookie@0.5.0: - resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} - engines: {node: '>= 0.6'} - dev: true - - /copy-anything@3.0.5: - resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} - engines: {node: '>=12.13'} - dependencies: - is-what: 4.1.16 - dev: true - - /crelt@1.0.6: - resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} - dev: false - - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - /cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - dev: false - - /csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - dev: false - - /cva@1.0.0-beta.1(typescript@5.3.3): - resolution: {integrity: sha512-gznFqTgERU9q4wg7jfgqtt34+RUt9S5t0xDAAEuDwQEAXEgjdDkKXpLLNjwSxsB4Ln/sqWJEH7yhE8Ny0mxd0w==} - peerDependencies: - typescript: '>= 4.5.5 < 6' - peerDependenciesMeta: - typescript: + + /@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 - dependencies: - clsx: 2.0.0 - typescript: 5.3.3 - dev: false - - /d@1.0.1: - resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} - 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 - - /data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} - dev: false - - /dayjs@1.11.10: - resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} - dev: false - - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: + + /@esbuild/android-arm64@0.18.20: + resolution: + { + integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true optional: true - dependencies: - ms: 2.1.2 - - /decode-named-character-reference@1.0.2: - resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} - dependencies: - character-entities: 2.0.2 - dev: false - - /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==} - - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dev: false - - /dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - dev: false - - /detect-libc@2.0.2: - resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} - engines: {node: '>=8'} - dev: false - - /devlop@1.1.0: - resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - dependencies: - dequal: 2.0.3 - dev: false - - /difflib@0.2.4: - resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} - dependencies: - heap: 0.2.7 - dev: true - - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - dev: false - - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dependencies: - esutils: 2.0.3 - - /dotenv@16.4.1: - resolution: {integrity: sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ==} - engines: {node: '>=12'} - dev: true - - /dreamopt@0.8.0: - resolution: {integrity: sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==} - engines: {node: '>=0.4.0'} - dependencies: - wordwrap: 1.0.0 - dev: true - - /drizzle-kit@0.20.13: - resolution: {integrity: sha512-j9oZSQXNWG+KBJm0Sg3S/zJpncHGKnpqNfFuM4NUxUMGTcihDHhP9SW6Jncqwb5vsP1Xm0a8JLm3PZUIspC/oA==} - hasBin: true - dependencies: - '@drizzle-team/studio': 0.0.39 - '@esbuild-kit/esm-loader': 2.6.5 - camelcase: 7.0.1 - chalk: 5.3.0 - commander: 9.5.0 - env-paths: 3.0.0 - esbuild: 0.19.12 - esbuild-register: 3.5.0(esbuild@0.19.12) - glob: 8.1.0 - hanji: 0.0.5 - json-diff: 0.9.0 - minimatch: 7.4.6 - semver: 7.5.4 - zod: 3.22.4 - transitivePeerDependencies: - - supports-color - dev: true - - /drizzle-orm@0.29.3(@cloudflare/workers-types@4.20240117.0)(@libsql/client@0.4.0)(better-sqlite3@9.3.0): - resolution: {integrity: sha512-uSE027csliGSGYD0pqtM+SAQATMREb3eSM/U8s6r+Y0RFwTKwftnwwSkqx3oS65UBgqDOM0gMTl5UGNpt6lW0A==} - 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/react': '>=18' - '@types/sql.js': '*' - '@vercel/postgres': '*' - better-sqlite3: '>=7' - bun-types: '*' - expo-sqlite: '>=13.2.0' - knex: '*' - kysely: '*' - mysql2: '>=2' - pg: '>=8' - postgres: '>=3' - react: '>=18' - sql.js: '>=1' - sqlite3: '>=5' - peerDependenciesMeta: - '@aws-sdk/client-rds-data': + + /@esbuild/android-arm64@0.19.12: + resolution: + { + integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true optional: true - '@cloudflare/workers-types': + + /@esbuild/android-arm@0.17.19: + resolution: + { + integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==, + } + engines: { node: ">=12" } + cpu: [arm] + os: [android] + requiresBuild: true + dev: true optional: true - '@libsql/client': + + /@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 - '@neondatabase/serverless': + + /@esbuild/android-arm@0.19.12: + resolution: + { + integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==, + } + engines: { node: ">=12" } + cpu: [arm] + os: [android] + requiresBuild: true + dev: true optional: true - '@opentelemetry/api': + + /@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 - '@planetscale/database': + + /@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 - '@types/better-sqlite3': + + /@esbuild/android-x64@0.19.12: + resolution: + { + integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [android] + requiresBuild: true + dev: true optional: true - '@types/pg': + + /@esbuild/darwin-arm64@0.17.19: + resolution: + { + integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true optional: true - '@types/react': + + /@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 - '@types/sql.js': + + /@esbuild/darwin-arm64@0.19.12: + resolution: + { + integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true optional: true - '@vercel/postgres': + + /@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 - better-sqlite3: + + /@esbuild/darwin-x64@0.18.20: + resolution: + { + integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true optional: true - bun-types: + + /@esbuild/darwin-x64@0.19.12: + resolution: + { + integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true optional: true - expo-sqlite: + + /@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 - knex: + + /@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 - kysely: + + /@esbuild/freebsd-arm64@0.19.12: + resolution: + { + integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true optional: true - mysql2: + + /@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 - pg: + + /@esbuild/freebsd-x64@0.18.20: + resolution: + { + integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true optional: true - postgres: + + /@esbuild/freebsd-x64@0.19.12: + resolution: + { + integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true optional: true - react: + + /@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 - sql.js: + + /@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 - sqlite3: + + /@esbuild/linux-arm64@0.19.12: + resolution: + { + integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true optional: true - dependencies: - '@cloudflare/workers-types': 4.20240117.0 - '@libsql/client': 0.4.0 - better-sqlite3: 9.3.0 - dev: false - - /drizzle-zod@0.5.1(drizzle-orm@0.29.3)(zod@3.22.4): - resolution: {integrity: sha512-C/8bvzUH/zSnVfwdSibOgFjLhtDtbKYmkbPbUCq46QZyZCH6kODIMSOgZ8R7rVjoI+tCj3k06MRJMDqsIeoS4A==} - peerDependencies: - drizzle-orm: '>=0.23.13' - zod: '*' - dependencies: - drizzle-orm: 0.29.3(@cloudflare/workers-types@4.20240117.0)(@libsql/client@0.4.0)(better-sqlite3@9.3.0) - zod: 3.22.4 - dev: false - - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - dependencies: - once: 1.4.0 - dev: false - - /entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - dev: false - - /env-paths@3.0.0: - resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - 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.19.12): - resolution: {integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==} - peerDependencies: - esbuild: '>=0.12 <1' - dependencies: - debug: 4.3.4 - esbuild: 0.19.12 - 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 - - /esbuild@0.19.12: - resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/aix-ppc64': 0.19.12 - '@esbuild/android-arm': 0.19.12 - '@esbuild/android-arm64': 0.19.12 - '@esbuild/android-x64': 0.19.12 - '@esbuild/darwin-arm64': 0.19.12 - '@esbuild/darwin-x64': 0.19.12 - '@esbuild/freebsd-arm64': 0.19.12 - '@esbuild/freebsd-x64': 0.19.12 - '@esbuild/linux-arm': 0.19.12 - '@esbuild/linux-arm64': 0.19.12 - '@esbuild/linux-ia32': 0.19.12 - '@esbuild/linux-loong64': 0.19.12 - '@esbuild/linux-mips64el': 0.19.12 - '@esbuild/linux-ppc64': 0.19.12 - '@esbuild/linux-riscv64': 0.19.12 - '@esbuild/linux-s390x': 0.19.12 - '@esbuild/linux-x64': 0.19.12 - '@esbuild/netbsd-x64': 0.19.12 - '@esbuild/openbsd-x64': 0.19.12 - '@esbuild/sunos-x64': 0.19.12 - '@esbuild/win32-arm64': 0.19.12 - '@esbuild/win32-ia32': 0.19.12 - '@esbuild/win32-x64': 0.19.12 - dev: true - - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - /escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} - dev: false - - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - /eslint@8.56.0: - resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) - '@eslint-community/regexpp': 4.10.0 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.56.0 - '@humanwhocodes/config-array': 0.11.14 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 - ignore: 5.3.0 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.3 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) - eslint-visitor-keys: 3.4.3 - - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - dev: false - - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} - dependencies: - estraverse: 5.3.0 - - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - dependencies: - estraverse: 5.3.0 - - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - /estree-walker@0.6.1: - resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} - dev: true - - /estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - dev: false - - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - - /event-emitter@0.3.5: - resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} - dependencies: - d: 1.0.1 - es5-ext: 0.10.62 - dev: true - - /exit-hook@2.2.1: - resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} - engines: {node: '>=6'} - dev: true - - /expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} - dev: false - - /ext@1.7.0: - resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} - dependencies: - type: 2.7.2 - dev: true - - /extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - dev: false - - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - /fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: false - - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - - /fastq@1.17.0: - resolution: {integrity: sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==} - dependencies: - reusify: 1.0.4 - - /fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 3.3.2 - dev: false - - /fetch-retry@5.0.6: - resolution: {integrity: sha512-3yurQZ2hD9VISAhJJP9bpYFNQrHHBXE2JxxjY5aLEcDi46RmAzJE2OC9FAde0yis5ElW0jTTzs0zfg/Cca4XqQ==} - dev: false - - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flat-cache: 3.2.0 - - /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'} - dependencies: - to-regex-range: 5.0.1 - - /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 - - /flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flatted: 3.2.9 - keyv: 4.5.4 - rimraf: 3.0.2 - - /flatted@3.2.9: - resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} - - /follow-redirects@1.15.5: - resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: + + /@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 - dev: false - - /form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: false - - /formdata-node@4.4.1: - resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} - engines: {node: '>= 12.20'} - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 4.0.0-beta.3 - dev: false - - /formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} - dependencies: - fetch-blob: 3.2.0 - dev: false - - /fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - dev: false - - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - dev: true - - /fuse.js@6.6.2: - resolution: {integrity: sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==} - engines: {node: '>=10'} - dev: false - - /get-own-enumerable-property-symbols@3.0.2: - resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} - dev: false - - /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-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 - - /github-slugger@1.5.0: - resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} - dev: false - - /github-slugger@2.0.0: - resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} - dev: false - - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - dependencies: - is-glob: 4.0.3 - - /glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - dev: true - - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - /glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - dev: true - - /globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.20.2 - - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.0 - merge2: 1.4.1 - slash: 3.0.0 - dev: false - - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - - /hanji@0.0.5: - resolution: {integrity: sha512-Abxw1Lq+TnYiL4BueXqMau222fPSPMFtya8HdpWsz/xVAhifXou71mPh/kY2+08RgFcVccjG3uZHs6K5HAe3zw==} - dependencies: - lodash.throttle: 4.1.1 - sisteransi: 1.0.5 - dev: true - - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - /hasown@2.0.0: - resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} - engines: {node: '>= 0.4'} - dependencies: - function-bind: 1.1.2 - dev: true - - /hast-util-embedded@3.0.0: - resolution: {integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==} - dependencies: - '@types/hast': 3.0.3 - hast-util-is-element: 3.0.0 - dev: false - - /hast-util-from-parse5@8.0.1: - resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} - dependencies: - '@types/hast': 3.0.3 - '@types/unist': 3.0.2 - devlop: 1.1.0 - hastscript: 8.0.0 - property-information: 6.4.1 - vfile: 6.0.1 - vfile-location: 5.0.2 - web-namespaces: 2.0.1 - dev: false - - /hast-util-has-property@2.0.1: - resolution: {integrity: sha512-X2+RwZIMTMKpXUzlotatPzWj8bspCymtXH3cfG3iQKV+wPF53Vgaqxi/eLqGck0wKq1kS9nvoB1wchbCPEL8sg==} - dev: false - - /hast-util-has-property@3.0.0: - resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} - dependencies: - '@types/hast': 3.0.3 - dev: false - - /hast-util-heading-rank@2.1.1: - resolution: {integrity: sha512-iAuRp+ESgJoRFJbSyaqsfvJDY6zzmFoEnL1gtz1+U8gKtGGj1p0CVlysuUAUjq95qlZESHINLThwJzNGmgGZxA==} - dependencies: - '@types/hast': 2.3.9 - dev: false - - /hast-util-is-body-ok-link@3.0.0: - resolution: {integrity: sha512-VFHY5bo2nY8HiV6nir2ynmEB1XkxzuUffhEGeVx7orbu/B1KaGyeGgMZldvMVx5xWrDlLLG/kQ6YkJAMkBEx0w==} - dependencies: - '@types/hast': 3.0.3 - dev: false - - /hast-util-is-element@3.0.0: - resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} - dependencies: - '@types/hast': 3.0.3 - dev: false - - /hast-util-parse-selector@4.0.0: - resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} - dependencies: - '@types/hast': 3.0.3 - dev: false - - /hast-util-phrasing@3.0.1: - resolution: {integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==} - dependencies: - '@types/hast': 3.0.3 - hast-util-embedded: 3.0.0 - hast-util-has-property: 3.0.0 - hast-util-is-body-ok-link: 3.0.0 - hast-util-is-element: 3.0.0 - dev: false - - /hast-util-raw@9.0.2: - resolution: {integrity: sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA==} - dependencies: - '@types/hast': 3.0.3 - '@types/unist': 3.0.2 - '@ungap/structured-clone': 1.2.0 - hast-util-from-parse5: 8.0.1 - hast-util-to-parse5: 8.0.0 - html-void-elements: 3.0.0 - mdast-util-to-hast: 13.1.0 - parse5: 7.1.2 - unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.1 - web-namespaces: 2.0.1 - zwitch: 2.0.4 - dev: false - - /hast-util-sanitize@5.0.1: - resolution: {integrity: sha512-IGrgWLuip4O2nq5CugXy4GI2V8kx4sFVy5Hd4vF7AR2gxS0N9s7nEAVUyeMtZKZvzrxVsHt73XdTsno1tClIkQ==} - dependencies: - '@types/hast': 3.0.3 - '@ungap/structured-clone': 1.2.0 - unist-util-position: 5.0.0 - dev: false - - /hast-util-to-html@9.0.0: - resolution: {integrity: sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw==} - dependencies: - '@types/hast': 3.0.3 - '@types/unist': 3.0.2 - ccount: 2.0.1 - comma-separated-tokens: 2.0.3 - hast-util-raw: 9.0.2 - hast-util-whitespace: 3.0.0 - html-void-elements: 3.0.0 - mdast-util-to-hast: 13.1.0 - property-information: 6.4.1 - space-separated-tokens: 2.0.2 - stringify-entities: 4.0.3 - zwitch: 2.0.4 - dev: false - - /hast-util-to-parse5@8.0.0: - resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} - dependencies: - '@types/hast': 3.0.3 - comma-separated-tokens: 2.0.3 - devlop: 1.1.0 - property-information: 6.4.1 - space-separated-tokens: 2.0.2 - web-namespaces: 2.0.1 - zwitch: 2.0.4 - dev: false - - /hast-util-to-string@2.0.0: - resolution: {integrity: sha512-02AQ3vLhuH3FisaMM+i/9sm4OXGSq1UhOOCpTLLQtHdL3tZt7qil69r8M8iDkZYyC0HCFylcYoP+8IO7ddta1A==} - dependencies: - '@types/hast': 2.3.9 - dev: false - - /hast-util-to-text@4.0.0: - resolution: {integrity: sha512-EWiE1FSArNBPUo1cKWtzqgnuRQwEeQbQtnFJRYV1hb1BWDgrAlBU0ExptvZMM/KSA82cDpm2sFGf3Dmc5Mza3w==} - dependencies: - '@types/hast': 3.0.3 - '@types/unist': 3.0.2 - hast-util-is-element: 3.0.0 - unist-util-find-after: 5.0.0 - dev: false - - /hast-util-whitespace@3.0.0: - resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} - dependencies: - '@types/hast': 3.0.3 - dev: false - - /hastscript@8.0.0: - resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} - dependencies: - '@types/hast': 3.0.3 - comma-separated-tokens: 2.0.3 - hast-util-parse-selector: 4.0.0 - property-information: 6.4.1 - space-separated-tokens: 2.0.2 - dev: false - - /heap@0.2.7: - resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} - dev: true - - /highlight.js@11.9.0: - resolution: {integrity: sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==} - engines: {node: '>=12.0.0'} - dev: false - - /hono@3.12.8: - resolution: {integrity: sha512-vnOEIRdqsp4uHE/dkOBr9EYmTsR86sD/FyG2xhfAQzR9udDRglN1nuO7SGc/7U3HfSorc6PSCNGN6upnVtCmfg==} - engines: {node: '>=16.0.0'} - dev: false - - /hookable@5.5.3: - resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} - dev: false - - /html-void-elements@3.0.0: - resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - dev: false - - /html-whitespace-sensitive-tag-names@3.0.0: - resolution: {integrity: sha512-KlClZ3/Qy5UgvpvVvDomGhnQhNWH5INE8GwvSIQ9CWt1K0zbbXrl7eN5bWaafOZgtmO3jMPwUqmrmEwinhPq1w==} - dev: false - - /httpsnippet-lite@3.0.5: - resolution: {integrity: sha512-So4qTXY5iFj5XtFDwyz2PicUu+8NWrI8e8h+ZeZoVtMNcFQp4FFIntBHUE+JPUG6QQU8o1VHCy+X4ETRDwt9CA==} - engines: {node: '>=14.13'} - dependencies: - '@types/har-format': 1.2.15 - formdata-node: 4.4.1 - stringify-object: 3.3.0 - dev: false - - /husky@9.0.6: - resolution: {integrity: sha512-EEuw/rfTiMjOfuL7pGO/i9otg1u36TXxqjIA6D9qxVjd/UXoDOsLor/BSFf5hTK50shwzCU3aVVwdXDp/lp7RA==} - engines: {node: '>=18'} - hasBin: true - dev: true - - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: false - - /ignore@5.3.0: - resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} - engines: {node: '>= 4'} - - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: false - - /is-absolute-url@4.0.1: - resolution: {integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: false - - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - dependencies: - binary-extensions: 2.2.0 - dev: true - - /is-buffer@2.0.5: - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} - engines: {node: '>=4'} - dev: false - - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} - dependencies: - hasown: 2.0.0 - dev: true - - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - /is-obj@1.0.1: - resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} - engines: {node: '>=0.10.0'} - dev: false - - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - - /is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} - dev: false - - /is-promise@2.2.2: - resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} - dev: true - - /is-regexp@1.0.0: - resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} - engines: {node: '>=0.10.0'} - dev: false - - /is-what@4.1.16: - resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} - engines: {node: '>=12.13'} - dev: true - - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - /javascript-time-ago@2.5.9: - resolution: {integrity: sha512-pQ8mNco/9g9TqWXWWjP0EWl6i/lAQScOyEeXy5AB+f7MfLSdgyV9BJhiOD1zrIac/lrxPYOWNbyl/IW8CW5n0A==} - dependencies: - relative-time-format: 1.1.6 - dev: false - - /js-base64@3.7.6: - resolution: {integrity: sha512-NPrWuHFxFUknr1KqJRDgUQPexQF0uIJWjeT+2KjEePhitQxQEx5EJBG1lVn5/hc8aLycTpXrDOgPQ6Zq+EDiTA==} - dev: false - - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - dev: false - - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - dependencies: - argparse: 2.0.1 - - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - - /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-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - /json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - dev: false - - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - dependencies: - json-buffer: 3.0.1 - - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - - /libsql@0.2.0: - resolution: {integrity: sha512-ELBRqhpJx5Dap0187zKQnntZyk4EjlDHSrjIVL8t+fQ5e8IxbQTeYgZgigMjB1EvrETdkm0Y0VxBGhzPQ+t0Jg==} - cpu: [x64, arm64] - os: [darwin, linux, win32] - dependencies: - '@neon-rs/load': 0.0.4 - detect-libc: 2.0.2 - optionalDependencies: - '@libsql/darwin-arm64': 0.2.0 - '@libsql/darwin-x64': 0.2.0 - '@libsql/linux-arm64-gnu': 0.2.0 - '@libsql/linux-arm64-musl': 0.2.0 - '@libsql/linux-x64-gnu': 0.2.0 - '@libsql/linux-x64-musl': 0.2.0 - '@libsql/win32-x64-msvc': 0.2.0 - dev: false - - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - dependencies: - p-locate: 5.0.0 - - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - - /lodash.throttle@4.1.1: - resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} - dev: true - - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: false - - /longest-streak@3.1.0: - resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - dev: false - - /lowlight@3.1.0: - resolution: {integrity: sha512-CEbNVoSikAxwDMDPjXlqlFYiZLkDJHwyGu/MfOsJnF3d7f3tds5J3z8s/l9TMXhzfsJCCJEAsD78842mwmg0PQ==} - dependencies: - '@types/hast': 3.0.3 - devlop: 1.1.0 - highlight.js: 11.9.0 - dev: false - - /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 - - /lucia@3.0.0: - resolution: {integrity: sha512-60NQqjKuaqPrjHL10CQ1j3rQy8qwKd3XpSNNnNcZyZI+4w1QFJdtNcR4l0dZJ4kJ0DdwI/943yplL47V7IZbGQ==} - dependencies: - oslo: 1.0.1 - dev: false - - /magic-string@0.25.9: - resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} - dependencies: - sourcemap-codec: 1.4.8 - dev: true - - /magic-string@0.30.5: - resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} - engines: {node: '>=12'} - dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - dev: false - - /markdown-table@3.0.3: - resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} - dev: false - - /mdast-util-find-and-replace@3.0.1: - resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} - dependencies: - '@types/mdast': 4.0.3 - escape-string-regexp: 5.0.0 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 - dev: false - - /mdast-util-from-markdown@2.0.0: - resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} - dependencies: - '@types/mdast': 4.0.3 - '@types/unist': 3.0.2 - decode-named-character-reference: 1.0.2 - devlop: 1.1.0 - mdast-util-to-string: 4.0.0 - micromark: 4.0.0 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-decode-string: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - unist-util-stringify-position: 4.0.0 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-gfm-autolink-literal@2.0.0: - resolution: {integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==} - dependencies: - '@types/mdast': 4.0.3 - ccount: 2.0.1 - devlop: 1.1.0 - mdast-util-find-and-replace: 3.0.1 - micromark-util-character: 2.0.1 - dev: false - - /mdast-util-gfm-footnote@2.0.0: - resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} - dependencies: - '@types/mdast': 4.0.3 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 - micromark-util-normalize-identifier: 2.0.0 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-gfm-strikethrough@2.0.0: - resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} - dependencies: - '@types/mdast': 4.0.3 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-gfm-table@2.0.0: - resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} - dependencies: - '@types/mdast': 4.0.3 - devlop: 1.1.0 - markdown-table: 3.0.3 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-gfm-task-list-item@2.0.0: - resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} - dependencies: - '@types/mdast': 4.0.3 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-gfm@3.0.0: - resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} - dependencies: - mdast-util-from-markdown: 2.0.0 - mdast-util-gfm-autolink-literal: 2.0.0 - mdast-util-gfm-footnote: 2.0.0 - mdast-util-gfm-strikethrough: 2.0.0 - mdast-util-gfm-table: 2.0.0 - mdast-util-gfm-task-list-item: 2.0.0 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-phrasing@4.0.0: - resolution: {integrity: sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==} - dependencies: - '@types/mdast': 4.0.3 - unist-util-is: 6.0.0 - dev: false - - /mdast-util-to-hast@13.1.0: - resolution: {integrity: sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==} - dependencies: - '@types/hast': 3.0.3 - '@types/mdast': 4.0.3 - '@ungap/structured-clone': 1.2.0 - devlop: 1.1.0 - micromark-util-sanitize-uri: 2.0.0 - trim-lines: 3.0.1 - unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.1 - dev: false - - /mdast-util-to-markdown@2.1.0: - resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} - dependencies: - '@types/mdast': 4.0.3 - '@types/unist': 3.0.2 - longest-streak: 3.1.0 - mdast-util-phrasing: 4.0.0 - mdast-util-to-string: 4.0.0 - micromark-util-decode-string: 2.0.0 - unist-util-visit: 5.0.0 - zwitch: 2.0.4 - dev: false - - /mdast-util-to-string@3.2.0: - resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} - dependencies: - '@types/mdast': 3.0.15 - dev: false - - /mdast-util-to-string@4.0.0: - resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} - dependencies: - '@types/mdast': 4.0.3 - 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 - - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: false - - /micromark-core-commonmark@2.0.0: - resolution: {integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==} - dependencies: - decode-named-character-reference: 1.0.2 - devlop: 1.1.0 - micromark-factory-destination: 2.0.0 - micromark-factory-label: 2.0.0 - micromark-factory-space: 2.0.0 - micromark-factory-title: 2.0.0 - micromark-factory-whitespace: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-chunked: 2.0.0 - micromark-util-classify-character: 2.0.0 - micromark-util-html-tag-name: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-subtokenize: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-extension-gfm-autolink-literal@2.0.0: - resolution: {integrity: sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==} - dependencies: - micromark-util-character: 2.0.1 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-extension-gfm-footnote@2.0.0: - resolution: {integrity: sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==} - dependencies: - devlop: 1.1.0 - micromark-core-commonmark: 2.0.0 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-extension-gfm-strikethrough@2.0.0: - resolution: {integrity: sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==} - dependencies: - devlop: 1.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-classify-character: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-extension-gfm-table@2.0.0: - resolution: {integrity: sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==} - dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-extension-gfm-tagfilter@2.0.0: - resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} - dependencies: - micromark-util-types: 2.0.0 - dev: false - - /micromark-extension-gfm-task-list-item@2.0.1: - resolution: {integrity: sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==} - dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-extension-gfm@3.0.0: - resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} - dependencies: - micromark-extension-gfm-autolink-literal: 2.0.0 - micromark-extension-gfm-footnote: 2.0.0 - micromark-extension-gfm-strikethrough: 2.0.0 - micromark-extension-gfm-table: 2.0.0 - micromark-extension-gfm-tagfilter: 2.0.0 - micromark-extension-gfm-task-list-item: 2.0.1 - micromark-util-combine-extensions: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-factory-destination@2.0.0: - resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} - dependencies: - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-factory-label@2.0.0: - resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} - dependencies: - devlop: 1.1.0 - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-factory-space@2.0.0: - resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} - dependencies: - micromark-util-character: 2.0.1 - micromark-util-types: 2.0.0 - dev: false - - /micromark-factory-title@2.0.0: - resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} - dependencies: - micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-factory-whitespace@2.0.0: - resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} - dependencies: - micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-util-character@2.0.1: - resolution: {integrity: sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==} - dependencies: - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-util-chunked@2.0.0: - resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} - dependencies: - micromark-util-symbol: 2.0.0 - dev: false - - /micromark-util-classify-character@2.0.0: - resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} - dependencies: - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-util-combine-extensions@2.0.0: - resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} - dependencies: - micromark-util-chunked: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-util-decode-numeric-character-reference@2.0.1: - resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} - dependencies: - micromark-util-symbol: 2.0.0 - dev: false - - /micromark-util-decode-string@2.0.0: - resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} - dependencies: - decode-named-character-reference: 1.0.2 - micromark-util-character: 2.0.1 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-symbol: 2.0.0 - dev: false - - /micromark-util-encode@2.0.0: - resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} - dev: false - - /micromark-util-html-tag-name@2.0.0: - resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} - dev: false - - /micromark-util-normalize-identifier@2.0.0: - resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} - dependencies: - micromark-util-symbol: 2.0.0 - dev: false - - /micromark-util-resolve-all@2.0.0: - resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} - dependencies: - micromark-util-types: 2.0.0 - dev: false - - /micromark-util-sanitize-uri@2.0.0: - resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} - dependencies: - micromark-util-character: 2.0.1 - micromark-util-encode: 2.0.0 - micromark-util-symbol: 2.0.0 - dev: false - - /micromark-util-subtokenize@2.0.0: - resolution: {integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==} - dependencies: - devlop: 1.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-util-symbol@2.0.0: - resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} - dev: false - - /micromark-util-types@2.0.0: - resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} - dev: false - - /micromark@4.0.0: - resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} - dependencies: - '@types/debug': 4.1.12 - debug: 4.3.4 - decode-named-character-reference: 1.0.2 - devlop: 1.1.0 - micromark-core-commonmark: 2.0.0 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-chunked: 2.0.0 - micromark-util-combine-extensions: 2.0.0 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-encode: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-subtokenize: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - transitivePeerDependencies: - - supports-color - dev: false - - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - dev: false - - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - dev: false - - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - dev: false - - /mime@3.0.0: - resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} - engines: {node: '>=10.0.0'} - hasBin: true - dev: true - - /mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - dev: false - - /miniflare@3.20231218.4: - resolution: {integrity: sha512-2mpxvDiRBxGGGVnTKC0SZy0FtTXxFs3tM1ol67EoIJABGzvWFf33GThwh+/dRmaHSjKKId/FI8rEl5JxXXXZgQ==} - engines: {node: '>=16.13'} - hasBin: true - dependencies: - '@cspotcode/source-map-support': 0.8.1 - acorn: 8.11.3 - acorn-walk: 8.3.2 - capnp-ts: 0.7.0 - exit-hook: 2.2.1 - glob-to-regexp: 0.4.1 - stoppable: 1.1.0 - undici: 5.28.2 - workerd: 1.20231218.0 - ws: 8.16.0 - 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 - - /minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - dev: true - - /minimatch@7.4.6: - resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - dev: true - - /minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - brace-expansion: 2.0.1 - dev: false - - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: false - - /mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - dev: false - - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - /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 - - /nanoid@5.0.4: - resolution: {integrity: sha512-vAjmBf13gsmhXSgBrtIclinISzFFy22WwCYoyilZlsrRXNIHSwgFQ1bEdjRwMT3aoadeIF6HMuDRlOxzfXV8ig==} - engines: {node: ^18 || >=20} - hasBin: true - dev: false - - /napi-build-utils@1.0.2: - resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} - dev: false - - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - - /next-tick@1.1.0: - resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - dev: true - - /node-abi@3.54.0: - resolution: {integrity: sha512-p7eGEiQil0YUV3ItH4/tBb781L5impVmmx2E9FRKF7d18XXzp4PGT2tdYMFY6wQqgxD0IwNZOiSJ0/K0fSi/OA==} - engines: {node: '>=10'} - dependencies: - semver: 7.5.4 - dev: false - - /node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} - dev: false - - /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: + + /@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 - dependencies: - whatwg-url: 5.0.0 - dev: false - - /node-fetch@3.3.2: - resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - data-uri-to-buffer: 4.0.1 - fetch-blob: 3.2.0 - formdata-polyfill: 4.0.10 - dev: false - - /node-forge@1.3.1: - resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} - engines: {node: '>= 6.13.0'} - dev: true - - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: true - - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - - /openapi-types@12.1.3: - resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} - dev: false - - /openapi3-ts@4.2.1: - resolution: {integrity: sha512-KL1mKwkZii5ce+tb24KCUmQHyWB/oanG5fzUY35UB+wenWJv4Kr/IWBntpn5R8ODiJcxx13ZDophcpHnLGeIOw==} - dependencies: - yaml: 2.3.4 - - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} - dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - - /oslo@1.0.1: - resolution: {integrity: sha512-esfzZry+HfGgK/GCYkg7BRlLd3RH5aHa08wgLJPYjENXybi0BvXxGk0LbUj+lXfz2TkjPDHe4rB/o6JxRLHxBg==} - dependencies: - '@node-rs/argon2': 1.7.2 - '@node-rs/bcrypt': 1.9.2 - dev: false - - /oslo@1.0.2: - resolution: {integrity: sha512-yBoZN0sOL5eEngLR2tFMTk2YFBF7czq/3ASCTM0WizAnUTllVRetCAsmV2CMMfu699VIe7f6vhNgJ0bQ2ejedg==} - dependencies: - '@node-rs/argon2': 1.7.2 - '@node-rs/bcrypt': 1.9.2 - dev: false - - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - dependencies: - yocto-queue: 0.1.0 - - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - dependencies: - p-limit: 3.1.0 - - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - dependencies: - callsites: 3.1.0 - - /parse-ms@3.0.0: - resolution: {integrity: sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==} - engines: {node: '>=12'} - dev: false - - /parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} - dependencies: - entities: 4.5.0 - dev: false - - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true - - /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'} - dev: false - - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: false - - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - /postcss-nested@6.0.1(postcss@8.4.33): - resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.2.14 - dependencies: - postcss: 8.4.33 - postcss-selector-parser: 6.0.15 - dev: false - - /postcss-selector-parser@6.0.15: - resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==} - engines: {node: '>=4'} - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - dev: false - - /postcss@8.4.33: - resolution: {integrity: sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.0.2 - dev: false - - /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.54.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 - - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - - /prettier@3.2.4: - resolution: {integrity: sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==} - engines: {node: '>=14'} - hasBin: true - dev: false - - /pretty-bytes@6.1.1: - resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} - engines: {node: ^14.13.1 || >=16.0.0} - dev: false - - /pretty-ms@8.0.0: - resolution: {integrity: sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==} - engines: {node: '>=14.16'} - dependencies: - parse-ms: 3.0.0 - dev: false - - /printable-characters@1.0.42: - resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} - dev: true - - /property-information@6.4.1: - resolution: {integrity: sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==} - dev: false - - /proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - 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'} - - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - /rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - dev: false - - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - dev: false - - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - dev: true - - /regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - dev: false - - /rehype-external-links@3.0.0: - resolution: {integrity: sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==} - dependencies: - '@types/hast': 3.0.3 - '@ungap/structured-clone': 1.2.0 - hast-util-is-element: 3.0.0 - is-absolute-url: 4.0.1 - space-separated-tokens: 2.0.2 - unist-util-visit: 5.0.0 - dev: false - - /rehype-format@5.0.0: - resolution: {integrity: sha512-kM4II8krCHmUhxrlvzFSptvaWh280Fr7UGNJU5DCMuvmAwGCNmGfi9CvFAQK6JDjsNoRMWQStglK3zKJH685Wg==} - dependencies: - '@types/hast': 3.0.3 - hast-util-embedded: 3.0.0 - hast-util-is-element: 3.0.0 - hast-util-phrasing: 3.0.1 - hast-util-whitespace: 3.0.0 - html-whitespace-sensitive-tag-names: 3.0.0 - rehype-minify-whitespace: 6.0.0 - unist-util-visit-parents: 6.0.1 - dev: false - - /rehype-highlight@7.0.0: - resolution: {integrity: sha512-QtobgRgYoQaK6p1eSr2SD1i61f7bjF2kZHAQHxeCHAuJf7ZUDMvQ7owDq9YTkmar5m5TSUol+2D3bp3KfJf/oA==} - dependencies: - '@types/hast': 3.0.3 - hast-util-to-text: 4.0.0 - lowlight: 3.1.0 - unist-util-visit: 5.0.0 - vfile: 6.0.1 - dev: false - - /rehype-minify-whitespace@6.0.0: - resolution: {integrity: sha512-i9It4YHR0Sf3GsnlR5jFUKXRr9oayvEk9GKQUkwZv6hs70OH9q3OCZrq9PpLvIGKt3W+JxBOxCidNVpH/6rWdA==} - dependencies: - '@types/hast': 3.0.3 - hast-util-embedded: 3.0.0 - hast-util-is-element: 3.0.0 - hast-util-whitespace: 3.0.0 - unist-util-is: 6.0.0 - dev: false - - /rehype-sanitize@6.0.0: - resolution: {integrity: sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==} - dependencies: - '@types/hast': 3.0.3 - hast-util-sanitize: 5.0.1 - dev: false - - /rehype-slug-custom-id@1.1.0: - resolution: {integrity: sha512-lLdTHGd7u5bOXRDnD78/VHrVZsG63nN6lZUuQgcuupGt1+v+uDW7pCeQS0cvptRcZPYzg8B+0bf8sUiMBKsjZw==} - dependencies: - '@types/hast': 2.3.9 - github-slugger: 1.5.0 - hast-util-has-property: 2.0.1 - hast-util-heading-rank: 2.1.1 - hast-util-to-string: 2.0.0 - lodash: 4.17.21 - unified: 10.1.2 - unist-util-visit: 4.1.2 - dev: false - - /rehype-stringify@10.0.0: - resolution: {integrity: sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ==} - dependencies: - '@types/hast': 3.0.3 - hast-util-to-html: 9.0.0 - unified: 11.0.4 - dev: false - - /relative-time-format@1.1.6: - resolution: {integrity: sha512-aCv3juQw4hT1/P/OrVltKWLlp15eW1GRcwP1XdxHrPdZE9MtgqFpegjnTjLhi2m2WI9MT/hQQtE+tjEWG1hgkQ==} - dev: false - - /remark-gfm@4.0.0: - resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} - dependencies: - '@types/mdast': 4.0.3 - mdast-util-gfm: 3.0.0 - micromark-extension-gfm: 3.0.0 - remark-parse: 11.0.0 - remark-stringify: 11.0.0 - unified: 11.0.4 - transitivePeerDependencies: - - supports-color - dev: false - - /remark-parse@11.0.0: - resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} - dependencies: - '@types/mdast': 4.0.3 - mdast-util-from-markdown: 2.0.0 - micromark-util-types: 2.0.0 - unified: 11.0.4 - transitivePeerDependencies: - - supports-color - dev: false - - /remark-rehype@11.1.0: - resolution: {integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==} - dependencies: - '@types/hast': 3.0.3 - '@types/mdast': 4.0.3 - mdast-util-to-hast: 13.1.0 - unified: 11.0.4 - vfile: 6.0.1 - dev: false - - /remark-stringify@11.0.0: - resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} - dependencies: - '@types/mdast': 4.0.3 - mdast-util-to-markdown: 2.1.0 - unified: 11.0.4 - dev: false - - /require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - dev: false - - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - - /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'} - dev: true - - /resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true - dependencies: - glob: 7.2.3 - - /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. - 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 - dev: true - - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - dependencies: - queue-microtask: 1.2.3 - - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: false - - /selfsigned@2.4.1: - resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} - engines: {node: '>=10'} - dependencies: - '@types/node-forge': 1.3.11 - node-forge: 1.3.1 - dev: true - - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - /simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - dev: false - - /simple-get@4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 - 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: false - - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} - dev: false - - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - dev: true - - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - dev: true - - /sourcemap-codec@1.4.8: - resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} - deprecated: Please use @jridgewell/sourcemap-codec instead - dev: true - - /space-separated-tokens@2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - dev: false - - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - dev: false - - /stacktracey@2.1.8: - resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==} - dependencies: - as-table: 1.0.55 - get-source: 2.0.12 - dev: true - - /stoppable@1.1.0: - resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} - engines: {node: '>=4', npm: '>=6'} - dev: true - - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - dependencies: - safe-buffer: 5.2.1 - dev: false - - /stringify-entities@4.0.3: - resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} - dependencies: - character-entities-html4: 2.1.0 - character-entities-legacy: 3.0.0 - dev: false - - /stringify-object@3.3.0: - resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} - engines: {node: '>=4'} - dependencies: - get-own-enumerable-property-symbols: 3.0.2 - is-obj: 1.0.1 - is-regexp: 1.0.0 - dev: false - - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - - /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'} - - /style-mod@4.1.0: - resolution: {integrity: sha512-Ca5ib8HrFn+f+0n4N4ScTIA9iTOQ7MaGS1ylHcoVqW9J7w2w8PzN6g9gKmTYgGEBH8e120+RCmhpje6jC5uGWA==} - dev: false - - /superjson@2.2.1: - resolution: {integrity: sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==} - engines: {node: '>=16'} - dependencies: - copy-anything: 3.0.5 - dev: true - - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: true - - /tailwind-merge@2.2.1: - resolution: {integrity: sha512-o+2GTLkthfa5YUt4JxPfzMIpQzZ3adD1vLVkvKE1Twl9UAhGsEbIZhHHZVRttyW177S8PDJI3bTQNaebyofK3Q==} - dependencies: - '@babel/runtime': 7.23.9 - dev: false - - /tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.0 - tar-stream: 2.2.0 - dev: false - - /tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - 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 - - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - - /timers-ext@0.1.7: - resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==} - dependencies: - es5-ext: 0.10.62 - next-tick: 1.1.0 - dev: true - - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - dev: false - - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - dev: false - - /trim-lines@3.0.1: - resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - dev: false - - /trough@2.1.0: - resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} - dev: false - - /ts-api-utils@1.0.3(typescript@5.3.3): - resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} - engines: {node: '>=16.13.0'} - peerDependencies: - typescript: '>=4.2.0' - dependencies: - typescript: 5.3.3 - dev: false - - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - - /tsx@4.7.0: - resolution: {integrity: sha512-I+t79RYPlEYlHn9a+KzwrvEwhJg35h/1zHsLC2JXvhC2mdynMv6Zxzvhv5EMV6VF5qJlLlkSnMVvdZV3PSIGcg==} - engines: {node: '>=18.0.0'} - hasBin: true - dependencies: - esbuild: 0.19.12 - get-tsconfig: 4.7.2 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - dependencies: - safe-buffer: 5.2.1 - dev: false - - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - - /type@1.2.0: - resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} - dev: true - - /type@2.7.2: - resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} - dev: true - - /typescript@5.3.3: - resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} - engines: {node: '>=14.17'} - hasBin: true - - /undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - - /undici@5.28.2: - resolution: {integrity: sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==} - engines: {node: '>=14.0'} - dependencies: - '@fastify/busboy': 2.1.0 - dev: true - - /unhead@1.8.10: - resolution: {integrity: sha512-dth8FvZkLriO5ZWWOBIYBNSfGiwJtKcqpPWpSOk/Z0e2jdlgwoZEWZHFyte0EKvmbZxKcsWNMqIuv7dEmS5yZQ==} - dependencies: - '@unhead/dom': 1.8.10 - '@unhead/schema': 1.8.10 - '@unhead/shared': 1.8.10 - hookable: 5.5.3 - dev: false - - /unified@10.1.2: - resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} - dependencies: - '@types/unist': 2.0.10 - bail: 2.0.2 - extend: 3.0.2 - is-buffer: 2.0.5 - is-plain-obj: 4.1.0 - trough: 2.1.0 - vfile: 5.3.7 - dev: false - - /unified@11.0.4: - resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} - dependencies: - '@types/unist': 3.0.2 - bail: 2.0.2 - devlop: 1.1.0 - extend: 3.0.2 - is-plain-obj: 4.1.0 - trough: 2.1.0 - vfile: 6.0.1 - dev: false - - /unist-util-find-after@5.0.0: - resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} - dependencies: - '@types/unist': 3.0.2 - unist-util-is: 6.0.0 - dev: false - - /unist-util-is@5.2.1: - resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} - dependencies: - '@types/unist': 2.0.10 - dev: false - - /unist-util-is@6.0.0: - resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} - dependencies: - '@types/unist': 3.0.2 - dev: false - - /unist-util-position@5.0.0: - resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} - dependencies: - '@types/unist': 3.0.2 - dev: false - - /unist-util-stringify-position@3.0.3: - resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} - dependencies: - '@types/unist': 2.0.10 - dev: false - - /unist-util-stringify-position@4.0.0: - resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} - dependencies: - '@types/unist': 3.0.2 - dev: false - - /unist-util-visit-parents@5.1.3: - resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} - dependencies: - '@types/unist': 2.0.10 - unist-util-is: 5.2.1 - dev: false - - /unist-util-visit-parents@6.0.1: - resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} - dependencies: - '@types/unist': 3.0.2 - unist-util-is: 6.0.0 - dev: false - - /unist-util-visit@4.1.2: - resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} - dependencies: - '@types/unist': 2.0.10 - unist-util-is: 5.2.1 - unist-util-visit-parents: 5.1.3 - dev: false - - /unist-util-visit@5.0.0: - resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} - dependencies: - '@types/unist': 3.0.2 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 - dev: false - - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - dependencies: - punycode: 2.3.1 - - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: false - - /uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - dev: false - - /vfile-location@5.0.2: - resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} - dependencies: - '@types/unist': 3.0.2 - vfile: 6.0.1 - dev: false - - /vfile-message@3.1.4: - resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} - dependencies: - '@types/unist': 2.0.10 - unist-util-stringify-position: 3.0.3 - dev: false - - /vfile-message@4.0.2: - resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} - dependencies: - '@types/unist': 3.0.2 - unist-util-stringify-position: 4.0.0 - dev: false - - /vfile@5.3.7: - resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} - dependencies: - '@types/unist': 2.0.10 - is-buffer: 2.0.5 - unist-util-stringify-position: 3.0.3 - vfile-message: 3.1.4 - dev: false - - /vfile@6.0.1: - resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} - dependencies: - '@types/unist': 3.0.2 - unist-util-stringify-position: 4.0.0 - vfile-message: 4.0.2 - dev: false - - /vue-demi@0.14.6(vue@3.4.15): - resolution: {integrity: sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - peerDependencies: - '@vue/composition-api': ^1.0.0-rc.1 - vue: ^3.0.0-0 || ^2.6.0 - peerDependenciesMeta: - '@vue/composition-api': + + /@esbuild/linux-arm@0.19.12: + resolution: + { + integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==, + } + engines: { node: ">=12" } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true optional: true - dependencies: - vue: 3.4.15(typescript@5.3.3) - dev: false - - /vue@3.4.15(typescript@5.3.3): - resolution: {integrity: sha512-jC0GH4KkWLWJOEQjOpkqU1bQsBwf4R1rsFtw5GQJbjHVKWDzO6P0nWWBTmjp1xSemAioDFj1jdaK1qa3DnMQoQ==} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: + + /@esbuild/linux-ia32@0.17.19: + resolution: + { + integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==, + } + engines: { node: ">=12" } + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true optional: true - dependencies: - '@vue/compiler-dom': 3.4.15 - '@vue/compiler-sfc': 3.4.15 - '@vue/runtime-dom': 3.4.15 - '@vue/server-renderer': 3.4.15(vue@3.4.15) - '@vue/shared': 3.4.15 - typescript: 5.3.3 - dev: false - - /w3c-keyname@2.2.8: - resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} - dev: false - - /web-namespaces@2.0.1: - resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} - dev: false - - /web-streams-polyfill@3.3.2: - resolution: {integrity: sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ==} - engines: {node: '>= 8'} - dev: false - - /web-streams-polyfill@4.0.0-beta.3: - resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} - engines: {node: '>= 14'} - dev: false - - /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@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - - /wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - dev: true - - /workerd@1.20231218.0: - resolution: {integrity: sha512-AGIsDvqCrcwhoA9kb1hxOhVAe53/xJeaGZxL4FbYI9FvO17DZwrnqGq+6eqItJ6Cfw1ZLmf3BM+QdMWaL2bFWQ==} - engines: {node: '>=16'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20231218.0 - '@cloudflare/workerd-darwin-arm64': 1.20231218.0 - '@cloudflare/workerd-linux-64': 1.20231218.0 - '@cloudflare/workerd-linux-arm64': 1.20231218.0 - '@cloudflare/workerd-windows-64': 1.20231218.0 - dev: true - - /wrangler@3.25.0: - resolution: {integrity: sha512-eU47Ez1QLu1B/wutm5ow+VwZnY4OqA+D/iy6BORAu5tABujoDr9p1yBxY/1DS/DxxDWqqY3sBBS6TzcC4NSLUQ==} - engines: {node: '>=16.17.0'} - hasBin: true - 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.20231218.4 - nanoid: 3.3.7 - path-to-regexp: 6.2.1 - resolve: 1.22.8 - resolve.exports: 2.0.2 - selfsigned: 2.4.1 - source-map: 0.6.1 - xxhash-wasm: 1.0.2 - optionalDependencies: - fsevents: 2.3.3 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - /ws@8.16.0: - resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: + + /@esbuild/linux-ia32@0.18.20: + resolution: + { + integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==, + } + engines: { node: ">=12" } + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true optional: true - utf-8-validate: + + /@esbuild/linux-ia32@0.19.12: + resolution: + { + integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==, + } + 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-loong64@0.19.12: + resolution: + { + integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==, + } + 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-mips64el@0.19.12: + resolution: + { + integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==, + } + 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-ppc64@0.19.12: + resolution: + { + integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==, + } + 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-riscv64@0.19.12: + resolution: + { + integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==, + } + 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-s390x@0.19.12: + resolution: + { + integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==, + } + 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/linux-x64@0.19.12: + resolution: + { + integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==, + } + 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/netbsd-x64@0.19.12: + resolution: + { + integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==, + } + 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/openbsd-x64@0.19.12: + resolution: + { + integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==, + } + 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/sunos-x64@0.19.12: + resolution: + { + integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==, + } + 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-arm64@0.19.12: + resolution: + { + integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==, + } + 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-ia32@0.19.12: + resolution: + { + integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==, + } + 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 + + /@esbuild/win32-x64@0.19.12: + resolution: + { + integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): + resolution: + { + integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.56.0 + eslint-visitor-keys: 3.4.3 + + /@eslint-community/regexpp@4.10.0: + resolution: + { + integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==, + } + engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } + + /@eslint/eslintrc@2.1.4: + resolution: + { + integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.0 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + /@eslint/js@8.56.0: + resolution: + { + integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + + /@fastify/busboy@2.1.0: + resolution: + { + integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==, + } + engines: { node: ">=14" } + dev: true + + /@floating-ui/core@1.6.0: + resolution: + { + integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==, + } + dependencies: + "@floating-ui/utils": 0.2.1 + dev: false + + /@floating-ui/dom@1.6.0: + resolution: + { + integrity: sha512-SZ0BEXzsaaS6THZfZJUcAobbZTD+MvfGM42bxgeg0Tnkp4/an/avqwAXiVLsFtIBZtfsx3Ymvwx0+KnnhdA/9g==, + } + dependencies: + "@floating-ui/core": 1.6.0 + "@floating-ui/utils": 0.2.1 + dev: false + + /@floating-ui/utils@0.2.1: + resolution: + { + integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==, + } + dev: false + + /@floating-ui/vue@1.0.5(vue@3.4.15): + resolution: + { + integrity: sha512-rXYI0JHLnAw5nTGNKTmH9tMxFWmZPEfkyexXzG/HchGsoL4f8lE7+bX43pVRXRBbmCWg0/j4d62Ui7acZBmUew==, + } + dependencies: + "@floating-ui/dom": 1.6.0 + "@floating-ui/utils": 0.2.1 + vue-demi: 0.14.6(vue@3.4.15) + transitivePeerDependencies: + - "@vue/composition-api" + - vue + dev: false + + /@headlessui/vue@1.7.17(vue@3.4.15): + resolution: + { + integrity: sha512-hmJChv8HzKorxd9F70RGnECAwZfkvmmwOqreuKLWY/19d5qbWnSdw+DNbuA/Uo6X5rb4U5B3NrT+qBKPmjhRqw==, + } + engines: { node: ">=10" } + peerDependencies: + vue: ^3.2.0 + dependencies: + "@tanstack/vue-virtual": 3.0.2(vue@3.4.15) + vue: 3.4.15(typescript@5.3.3) + dev: false + + /@hono/swagger-ui@0.2.1(hono@3.12.8): + resolution: + { + integrity: sha512-wBxVMRe3/v8xH4o6icmwztiIq0DG0s7+jHVMHVUAoFFCWEQNL2iskMmQtrhSDtsFmBZUeUFQUaaJ6Ir6DOmHLA==, + } + peerDependencies: + hono: "*" + dependencies: + hono: 3.12.8 + dev: false + + /@hono/zod-openapi@0.9.6(hono@3.12.8)(zod@3.22.4): + resolution: + { + integrity: sha512-MLF8xpd4fEwbEaylFqAt1qci4wOTXu3oq3BKb01trccapYfodP50VCO0YDNBQTyMT/Iapq6GMO4+RAIFBgG5WQ==, + } + engines: { node: ">=16.0.0" } + peerDependencies: + hono: ">=3.11.3" + zod: 3.* + dependencies: + "@asteasolutions/zod-to-openapi": 5.5.0(zod@3.22.4) + "@hono/zod-validator": 0.1.11(hono@3.12.8)(zod@3.22.4) + hono: 3.12.8 + zod: 3.22.4 + dev: false + + /@hono/zod-validator@0.1.11(hono@3.12.8)(zod@3.22.4): + resolution: + { + integrity: sha512-PQXeHUP0+36qpRt8yfeD7N2jbK3ETlGvSN6dMof/HwUC/APRokQRjpXZm4rrlG71Ft0aWE01+Bm4XejqPie5Uw==, + } + peerDependencies: + hono: ">=3.9.0" + zod: ^3.19.1 + dependencies: + hono: 3.12.8 + zod: 3.22.4 + dev: false + + /@humanwhocodes/config-array@0.11.14: + resolution: + { + integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==, + } + engines: { node: ">=10.10.0" } + dependencies: + "@humanwhocodes/object-schema": 2.0.2 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + /@humanwhocodes/module-importer@1.0.1: + resolution: + { + integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, + } + engines: { node: ">=12.22" } + + /@humanwhocodes/object-schema@2.0.2: + resolution: + { + integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==, + } + + /@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==, + } + + /@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 + + /@jsdevtools/ono@7.1.3: + resolution: + { + integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==, + } + dev: false + + /@lezer/common@1.2.1: + resolution: + { + integrity: sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==, + } + dev: false + + /@lezer/css@1.1.7: + resolution: + { + integrity: sha512-7BlFFAKNn/b39jJLrhdLSX5A2k56GIJvyLqdmm7UU+7XvequY084iuKDMAEhAmAzHnwDE8FK4OQtsIUssW91tg==, + } + dependencies: + "@lezer/common": 1.2.1 + "@lezer/highlight": 1.2.0 + "@lezer/lr": 1.4.0 + dev: false + + /@lezer/highlight@1.2.0: + resolution: + { + integrity: sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==, + } + dependencies: + "@lezer/common": 1.2.1 + dev: false + + /@lezer/html@1.3.8: + resolution: + { + integrity: sha512-EXseJ3pUzWxE6XQBQdqWHZqqlGQRSuNMBcLb6mZWS2J2v+QZhOObD+3ZIKIcm59ntTzyor4LqFTb72iJc3k23Q==, + } + dependencies: + "@lezer/common": 1.2.1 + "@lezer/highlight": 1.2.0 + "@lezer/lr": 1.4.0 + dev: false + + /@lezer/java@1.1.1: + resolution: + { + integrity: sha512-mt3dX13fRlpY7RlWELYRakanXgmwXsLRCrhstrn+c1sZd7jR2xle46/3heoxGd+oHxnuTnpoyXTyxcLJQs9+mQ==, + } + dependencies: + "@lezer/common": 1.2.1 + "@lezer/highlight": 1.2.0 + "@lezer/lr": 1.4.0 + dev: false + + /@lezer/javascript@1.4.13: + resolution: + { + integrity: sha512-5IBr8LIO3xJdJH1e9aj/ZNLE4LSbdsx25wFmGRAZsj2zSmwAYjx26JyU/BYOCpRQlu1jcv1z3vy4NB9+UkfRow==, + } + dependencies: + "@lezer/common": 1.2.1 + "@lezer/highlight": 1.2.0 + "@lezer/lr": 1.4.0 + dev: false + + /@lezer/json@1.0.2: + resolution: + { + integrity: sha512-xHT2P4S5eeCYECyKNPhr4cbEL9tc8w83SPwRC373o9uEdrvGKTZoJVAGxpOsZckMlEh9W23Pc72ew918RWQOBQ==, + } + dependencies: + "@lezer/common": 1.2.1 + "@lezer/highlight": 1.2.0 + "@lezer/lr": 1.4.0 + dev: false + + /@lezer/lr@1.4.0: + resolution: + { + integrity: sha512-Wst46p51km8gH0ZUmeNrtpRYmdlRHUpN1DQd3GFAyKANi8WVz8c2jHYTf1CVScFaCjQw1iO3ZZdqGDxQPRErTg==, + } + dependencies: + "@lezer/common": 1.2.1 + dev: false + + /@lezer/python@1.1.11: + resolution: + { + integrity: sha512-C3QeLCcdAKJDUOsYjfFP6a1wdn8jhUNX200bgFm8TpKH1eM2PlgYQS5ugw6E38qGeEx7CP21I1Q52SoybXt0OQ==, + } + dependencies: + "@lezer/common": 1.2.1 + "@lezer/highlight": 1.2.0 + "@lezer/lr": 1.4.0 + dev: false + + /@libsql/client@0.4.0: + resolution: + { + integrity: sha512-GjBHHxRMKomG2rLx6K8BYsDhk9jNcKXpkEOO7luPTCje4z41ogD0sCaBRcGbJw9h3HMVysCW5v70WmjQ4/FWpg==, + } + dependencies: + "@libsql/core": 0.4.0 + "@libsql/hrana-client": 0.5.6 + js-base64: 3.7.6 + libsql: 0.2.0 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: false + + /@libsql/core@0.4.0: + resolution: + { + integrity: sha512-pQHyZI0aTBlBm08dpB+/SEqLDe5wlgiUY+VNXbCD8yZhXo30AGinyrDlKrtGW7luo0As4Y9v1befurJdLKbC0Q==, + } + dependencies: + js-base64: 3.7.6 + dev: false + + /@libsql/darwin-arm64@0.2.0: + resolution: + { + integrity: sha512-+qyT2W/n5CFH1YZWv2mxW4Fsoo4dX9Z9M/nvbQqZ7H84J8hVegvVAsIGYzcK8xAeMEcpU5yGKB1Y9NoDY4hOSQ==, + } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@libsql/darwin-x64@0.2.0: + resolution: + { + integrity: sha512-hwmO2mF1n8oDHKFrUju6Jv+n9iFtTf5JUK+xlnIE3Td0ZwGC/O1R/Z/btZTd9nD+vsvakC8SJT7/Q6YlWIkhEw==, + } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@libsql/hrana-client@0.5.6: + resolution: + { + integrity: sha512-mjQoAmejZ1atG+M3YR2ZW+rg6ceBByH/S/h17ZoYZkqbWrvohFhXyz2LFxj++ARMoY9m6w3RJJIRdJdmnEUlFg==, + } + dependencies: + "@libsql/isomorphic-fetch": 0.1.12 + "@libsql/isomorphic-ws": 0.1.5 + js-base64: 3.7.6 + node-fetch: 3.3.2 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: false + + /@libsql/isomorphic-fetch@0.1.12: + resolution: + { + integrity: sha512-MRo4UcmjAGAa3ac56LoD5OE13m2p0lu0VEtZC2NZMcogM/jc5fU9YtMQ3qbPjFJ+u2BBjFZgMPkQaLS1dlMhpg==, + } + dependencies: + "@types/node-fetch": 2.6.11 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: false + + /@libsql/isomorphic-ws@0.1.5: + resolution: + { + integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==, + } + dependencies: + "@types/ws": 8.5.10 + ws: 8.16.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /@libsql/linux-arm64-gnu@0.2.0: + resolution: + { + integrity: sha512-1w2lPXIYtnBaK5t/Ej5E8x7lPiE+jP3KATI/W4yei5Z/ONJh7jQW5PJ7sYU95vTME3hWEM1FXN6kvzcpFAte7w==, + } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@libsql/linux-arm64-musl@0.2.0: + resolution: + { + integrity: sha512-lkblBEJ7xuNiWNjP8DDq0rqoWccszfkUS7Efh5EjJ+GDWdCBVfh08mPofIZg0fZVLWQCY3j+VZCG1qZfATBizg==, + } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@libsql/linux-x64-gnu@0.2.0: + resolution: + { + integrity: sha512-+x/d289KeJydwOhhqSxKT+6MSQTCfLltzOpTzPccsvdt5fxg8CBi+gfvEJ4/XW23Sa+9bc7zodFP0i6MOlxX7w==, + } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@libsql/linux-x64-musl@0.2.0: + resolution: + { + integrity: sha512-5Xn0c5A6vKf9D1ASpgk7mef//FuY7t5Lktj/eiU4n3ryxG+6WTpqstTittJUgepVjcleLPYxIhQAYeYwTYH1IQ==, + } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@libsql/win32-x64-msvc@0.2.0: + resolution: + { + integrity: sha512-rpK+trBIpRST15m3cMYg5aPaX7kvCIottxY7jZPINkKAaScvfbn9yulU/iZUM9YtuK96Y1ZmvwyVIK/Y5DzoMQ==, + } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@lucia-auth/adapter-sqlite@3.0.0(@libsql/client@0.4.0)(better-sqlite3@9.3.0)(lucia@3.0.0): + resolution: + { + integrity: sha512-7XMfMMNziFOoqIq2u9W5Z+wo7G7lzNQfUh7wDlkIqKxJMSLtP6GKH+QpK+21X4ZY9dIDmiuiwqZmS3Q3CgpATw==, + } + peerDependencies: + "@libsql/client": ^0.3.0 + better-sqlite3: 8.x - 9.x + lucia: 3.x + peerDependenciesMeta: + "@libsql/client": + optional: true + better-sqlite3: + optional: true + dependencies: + "@libsql/client": 0.4.0 + better-sqlite3: 9.3.0 + lucia: 3.0.0 + dev: false + + /@napi-rs/wasm-runtime@0.1.1: + resolution: + { + integrity: sha512-ATj9ua659JgrkICjJscaeZdmPr44cb/KFjNWuD0N6pux0SpzaM7+iOuuK11mAnQM2N9q0DT4REu6NkL8ZEhopw==, + } + requiresBuild: true + dependencies: + "@emnapi/core": 0.45.0 + "@emnapi/runtime": 0.45.0 + "@tybys/wasm-util": 0.8.1 + dev: false + optional: true + + /@neon-rs/load@0.0.4: + resolution: + { + integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==, + } + dev: false + + /@node-rs/argon2-android-arm-eabi@1.7.2: + resolution: + { + integrity: sha512-WhW84XOzdR4AOGc4BJvIg5lCRVBL0pXp/PPCe8QCyWw493p7VdNCdYpr2xdtjS/0zImmY85HNB/6zpzjLRTT/A==, + } + engines: { node: ">= 10" } + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-android-arm64@1.7.2: + resolution: + { + integrity: sha512-CdtayHSMIyDuVhSYFirwA757c4foQuyTjpysgFJLHweP9C7uDiBf9WBYij+UyabpaCadJ0wPyK6Vakinvlk4/g==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-darwin-arm64@1.7.2: + resolution: + { + integrity: sha512-hUOhtgYHTEyzX5sgMZVdXunONOus2HWpWydF5D/RYJ1mZ76FXRnFpQE40DqbzisdPIraKdn40m7JqkPP7wqdyg==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-darwin-x64@1.7.2: + resolution: + { + integrity: sha512-lfs5HX+t542yUfcv6Aa/NeGD1nUCwyQNgnPEGcik71Ow6V13hkR1bHgmT1u3CHN4fBts0gW+DQEDsq1xlVgkvw==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-freebsd-x64@1.7.2: + resolution: + { + integrity: sha512-ROoF+4VaCBJUjddrTN1hjuqSl89ppRcjVXJscSPJjWzTlbzFmGGovJvIzUBmCr/Oq3yM1zKHj6MP9oRD5cB+/g==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-arm-gnueabihf@1.7.2: + resolution: + { + integrity: sha512-CBSB8KPI8LS74Bcz3dYaa2/khULutz4vSDvFWUERlSLX+mPdDhoZi6UPuUPPF9e01w8AbiK1YCqlLUTm3tIMfw==, + } + engines: { node: ">= 10" } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-arm64-gnu@1.7.2: + resolution: + { + integrity: sha512-6LBTug6ZiWFakP3X3Nqs7ZTM03gmcSWX4YvEn20HhhQE5NDrsrw3zNqGj0cJiNzKKIMSDDuj7uGy+ITEfNo4CA==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-arm64-musl@1.7.2: + resolution: + { + integrity: sha512-KjhQ+ZPne29t9VRVeIif7JdKwQba+tM6CBNYBoJB1iON0CUKeqSQtZcHuTj9gkf2SNRG5bsU4ABcfxd0OKsKHg==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-x64-gnu@1.7.2: + resolution: + { + integrity: sha512-BQvp+iLtKqomHz4q5t1aKoni9osgvUDU5sZtHAlFm5dRTlGHnympcQVATRE5GHyH9C6MIM9W7P1kqEeCLGPolQ==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-linux-x64-musl@1.7.2: + resolution: + { + integrity: sha512-yXJudpBZQ98g+lWaHn9EzZ5KsAyqRdlpub/K+5NP7gHehb8wzBRIFAejIHAG0fvzQEEc86VOnV2koWIVZxWAvw==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-wasm32-wasi@1.7.2: + resolution: + { + integrity: sha512-diXlVjJZY2GIV8ZDwUqXPhacXsFR0klGSv5D9f+XidwWXK4udtzDhkM/7N/Mb7h1HAWaxZ6IN9spYFjvWH1wqg==, + } + engines: { node: ">=14.0.0" } + cpu: [wasm32] + requiresBuild: true + dependencies: + "@napi-rs/wasm-runtime": 0.1.1 + dev: false + optional: true + + /@node-rs/argon2-win32-arm64-msvc@1.7.2: + resolution: + { + integrity: sha512-dhIBrY04P9nbmwzBpgERQDmmSu4YBZyeEE32t4TikMz5rQ07iaVC+JpGmtCBZoDIsLDHGC8cikENd3YEqpqIcA==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-win32-ia32-msvc@1.7.2: + resolution: + { + integrity: sha512-o1tfqr8gyALCzuxBoQfvhxkeYMaw/0H8Gmt7klTYyEIBvEFu7SD5qytXO9Px7t5420nZL/Wy5cflg3IB1s57Pg==, + } + engines: { node: ">= 10" } + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2-win32-x64-msvc@1.7.2: + resolution: + { + integrity: sha512-v0h53XUc7hNgWiWi0qcMcHvj9/kwuItI9NwLK4C+gtzT3UB0cedhfIL8HFMKThMXasy41ZdbpCF2Bi0kJoLNEg==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/argon2@1.7.2: + resolution: + { + integrity: sha512-+H6pc3M1vIX9YnG59YW7prHhhpv19P8YyxlXHnnFzTimf2q+kKDF7mGWbhvN9STqIY+P70Patn0Q6qb6Ib5/4g==, + } + engines: { node: ">= 10" } + optionalDependencies: + "@node-rs/argon2-android-arm-eabi": 1.7.2 + "@node-rs/argon2-android-arm64": 1.7.2 + "@node-rs/argon2-darwin-arm64": 1.7.2 + "@node-rs/argon2-darwin-x64": 1.7.2 + "@node-rs/argon2-freebsd-x64": 1.7.2 + "@node-rs/argon2-linux-arm-gnueabihf": 1.7.2 + "@node-rs/argon2-linux-arm64-gnu": 1.7.2 + "@node-rs/argon2-linux-arm64-musl": 1.7.2 + "@node-rs/argon2-linux-x64-gnu": 1.7.2 + "@node-rs/argon2-linux-x64-musl": 1.7.2 + "@node-rs/argon2-wasm32-wasi": 1.7.2 + "@node-rs/argon2-win32-arm64-msvc": 1.7.2 + "@node-rs/argon2-win32-ia32-msvc": 1.7.2 + "@node-rs/argon2-win32-x64-msvc": 1.7.2 + dev: false + + /@node-rs/bcrypt-android-arm-eabi@1.9.2: + resolution: + { + integrity: sha512-er/Q2khwpan9pczvTTqY/DJE4UU65u31xd0NkZlHUTKyB7djRhWfzoGexGx2GN+k831/RR3U8kKE/8QUHeO3hQ==, + } + engines: { node: ">= 10" } + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-android-arm64@1.9.2: + resolution: + { + integrity: sha512-OUYatOEG5vbLbF73q2TC8UqrDO81zUQxnaFD/OAB1hcm6J+ur0zJ8E53c35/DIqkTp7JarPMraC4rouJ2ugN4w==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-darwin-arm64@1.9.2: + resolution: + { + integrity: sha512-svJKsGbzMAxOB5oluOYneN4YkKUy26WSMgm3KOIhgoX30IeMilj+2jFN/5qrI0oDZ0Iczb3XyL5DuZFtEkdP8A==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-darwin-x64@1.9.2: + resolution: + { + integrity: sha512-9OrySjBi/rWix8NZWD/TrNbNcwMY0pAiMHdL09aJnJ07uPih83GGh1pq4UHCYFCMy7iTX8swOmDlGBUImkOZbg==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-freebsd-x64@1.9.2: + resolution: + { + integrity: sha512-/djXV71RO6g5L1mI2pVvmp3x3pH7G4uKI3ODG1JBIXoz334oOcCMh40sB0uq0ljP8WEadker01p4T1rJE98fpg==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-arm-gnueabihf@1.9.2: + resolution: + { + integrity: sha512-F7wP950OTAooxEleUN4I2hqryGZK7hi1cSgRF13Wvbc597RFux35KiSxIXUA3mNt2DE7lV2PeceEtCOScaThWQ==, + } + engines: { node: ">= 10" } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-arm64-gnu@1.9.2: + resolution: + { + integrity: sha512-MehG+yQ0TgKMgKR1rO4hdvHkVsTM91Cof8qI9EJlS5+7+QSwfFA5O0zGwCkISD7bsyauJ5uJgcByGjpEobAHOg==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-arm64-musl@1.9.2: + resolution: + { + integrity: sha512-PRZTAJjOwKEGsIhmBvfNh81So+wGl4QyCFAt23j+KwBujLStjC0N3YaqtTlWVKG9tcriPtmMYiAQtXWIyIgg/w==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-x64-gnu@1.9.2: + resolution: + { + integrity: sha512-5WfGO+O1m7nJ55WZ8XDq+ItA98Z4O7sNWsR+1nIj9YGT+Tx5zkQ2RBhpK6oCWZMluuZ0eKQ0FDmyP6K+2NDRIA==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-linux-x64-musl@1.9.2: + resolution: + { + integrity: sha512-VjCn0388p6PMCVUYHgYmHZrKNc7WwNJRr2WLJsHbQRGDOKbpNL6YolCjQxUchcSPDhzwrq1cIdy4j0fpoXEsdw==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-wasm32-wasi@1.9.2: + resolution: + { + integrity: sha512-P06aHfMzm9makwU+nM7WA65yQnS1xuqJ8l/6I/LvXjnl+lfB3DtJ2B0CSLtjnUGpUgcHbWl5gEbNnTPxSAirjQ==, + } + engines: { node: ">=14.0.0" } + cpu: [wasm32] + requiresBuild: true + dependencies: + "@napi-rs/wasm-runtime": 0.1.1 + dev: false + optional: true + + /@node-rs/bcrypt-win32-arm64-msvc@1.9.2: + resolution: + { + integrity: sha512-Iyo/Q5/eNw27VRd3mLBgh1b9b5fnT3QHTVwxv3Siv/MRAIfJXH/cTOe18qSwYQzNh0ZioW4yemFPYCWSZi7szA==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-win32-ia32-msvc@1.9.2: + resolution: + { + integrity: sha512-6LHWMaPylyyHoS5863YpxAACVB8DWCxro5W6pQ4h8WKSgHpJp8Um9jphTdN0A2w45HZjUnfcFuiFFC+TbftjCw==, + } + engines: { node: ">= 10" } + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt-win32-x64-msvc@1.9.2: + resolution: + { + integrity: sha512-vZ9T1MOaYkLO9FTyl28YX0SYJneiYTKNFgM8PUv8nas8xrD+7OzokA0fEtlNp6413T7IKSD/iG9qi8nTWsiyGg==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@node-rs/bcrypt@1.9.2: + resolution: + { + integrity: sha512-FKUo9iCSIti+ldwoOlY1ztyIFhZxEgT7jZ/UCt/9bg1rLmNdbQQD2JKIMImDCqmTWuLPY4ZF4Q5MyOMIfDCd8Q==, + } + engines: { node: ">= 10" } + optionalDependencies: + "@node-rs/bcrypt-android-arm-eabi": 1.9.2 + "@node-rs/bcrypt-android-arm64": 1.9.2 + "@node-rs/bcrypt-darwin-arm64": 1.9.2 + "@node-rs/bcrypt-darwin-x64": 1.9.2 + "@node-rs/bcrypt-freebsd-x64": 1.9.2 + "@node-rs/bcrypt-linux-arm-gnueabihf": 1.9.2 + "@node-rs/bcrypt-linux-arm64-gnu": 1.9.2 + "@node-rs/bcrypt-linux-arm64-musl": 1.9.2 + "@node-rs/bcrypt-linux-x64-gnu": 1.9.2 + "@node-rs/bcrypt-linux-x64-musl": 1.9.2 + "@node-rs/bcrypt-wasm32-wasi": 1.9.2 + "@node-rs/bcrypt-win32-arm64-msvc": 1.9.2 + "@node-rs/bcrypt-win32-ia32-msvc": 1.9.2 + "@node-rs/bcrypt-win32-x64-msvc": 1.9.2 + dev: false + + /@nodelib/fs.scandir@2.1.5: + resolution: + { + integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, + } + engines: { node: ">= 8" } + dependencies: + "@nodelib/fs.stat": 2.0.5 + run-parallel: 1.2.0 + + /@nodelib/fs.stat@2.0.5: + resolution: + { + integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, + } + engines: { node: ">= 8" } + + /@nodelib/fs.walk@1.2.8: + resolution: + { + integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, + } + engines: { node: ">= 8" } + dependencies: + "@nodelib/fs.scandir": 2.1.5 + fastq: 1.17.0 + + /@scalar/api-client@0.9.3(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15): + resolution: + { + integrity: sha512-mfTlCAy2cA2kMoDIZWC6PEW7NdCIHJ7DxKcc+YqRdmM1wJHFRQ8RqPB7kqHSaoRFMk0atJtQnzgjdIU63T9fZQ==, + } + engines: { node: ">=18" } + peerDependencies: + vue: ^3.3.0 + dependencies: + "@headlessui/vue": 1.7.17(vue@3.4.15) + "@scalar/themes": 0.5.4(vue@3.4.15) + "@scalar/use-codemirror": 0.7.19(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15) + "@scalar/use-keyboard-event": 0.5.8(vue@3.4.15) + "@scalar/use-modal": 0.2.3(@headlessui/vue@1.7.17)(vue@3.4.15) + "@vueuse/core": 10.7.2(vue@3.4.15) + axios: 1.6.7 + content-type: 1.0.5 + javascript-time-ago: 2.5.9 + nanoid: 5.0.4 + pretty-bytes: 6.1.1 + pretty-ms: 8.0.0 + vue: 3.4.15(typescript@5.3.3) + transitivePeerDependencies: + - "@codemirror/lang-html" + - "@codemirror/lang-java" + - "@codemirror/lang-javascript" + - "@codemirror/lang-json" + - "@codemirror/lang-python" + - "@codemirror/language" + - "@codemirror/legacy-modes" + - "@codemirror/state" + - "@codemirror/view" + - "@lezer/common" + - "@lezer/highlight" + - "@lezer/lr" + - "@uiw/codemirror-themes" + - "@vue/composition-api" + - codemirror + - debug + dev: false + + /@scalar/api-reference@1.13.18(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(nanoid@5.0.4)(postcss@8.4.33)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15): + resolution: + { + integrity: sha512-K9p/cxH1mwwyiQf5q38Y+lBofxesleUsMJBT/ZxAHLaiO+1urXDnaEeyIAonXoEaprltvfhICWLvG8W+J6CmyA==, + } + engines: { node: ">=18" } + peerDependencies: + unified: ^11.0.0 + vue: ^3.3.0 + dependencies: + "@floating-ui/vue": 1.0.5(vue@3.4.15) + "@headlessui/vue": 1.7.17(vue@3.4.15) + "@scalar/api-client": 0.9.3(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15) + "@scalar/components": 0.2.2(typescript@5.3.3) + "@scalar/snippetz": 0.1.5 + "@scalar/swagger-editor": 0.9.8(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/view@6.23.1)(@headlessui/vue@1.7.17)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15) + "@scalar/swagger-parser": 0.5.15(openapi-types@12.1.3) + "@scalar/themes": 0.5.4(vue@3.4.15) + "@scalar/use-clipboard": 0.5.13(@scalar/use-toasts@0.5.13)(nanoid@5.0.4) + "@scalar/use-codemirror": 0.7.19(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15) + "@scalar/use-keyboard-event": 0.5.8(vue@3.4.15) + "@scalar/use-modal": 0.2.3(@headlessui/vue@1.7.17)(vue@3.4.15) + "@scalar/use-toasts": 0.5.13(nanoid@5.0.4)(vue@3.4.15) + "@scalar/use-tooltip": 0.5.8(vue@3.4.15) + "@unhead/schema": 1.8.10 + "@vcarl/remark-headings": 0.1.0 + "@vueuse/core": 10.7.2(vue@3.4.15) + "@xmldom/xmldom": 0.8.10 + axios: 1.6.7 + fuse.js: 6.6.2 + github-slugger: 2.0.0 + httpsnippet-lite: 3.0.5 + js-yaml: 4.1.0 + openapi-types: 12.1.3 + postcss-nested: 6.0.1(postcss@8.4.33) + rehype-external-links: 3.0.0 + rehype-format: 5.0.0 + rehype-highlight: 7.0.0 + rehype-sanitize: 6.0.0 + rehype-slug-custom-id: 1.1.0 + rehype-stringify: 10.0.0 + remark-gfm: 4.0.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.0 + remark-stringify: 11.0.0 + unhead: 1.8.10 + unified: 11.0.4 + vue: 3.4.15(typescript@5.3.3) + transitivePeerDependencies: + - "@codemirror/lang-html" + - "@codemirror/lang-java" + - "@codemirror/lang-javascript" + - "@codemirror/lang-json" + - "@codemirror/lang-python" + - "@codemirror/language" + - "@codemirror/legacy-modes" + - "@codemirror/state" + - "@codemirror/view" + - "@lezer/common" + - "@lezer/highlight" + - "@lezer/lr" + - "@uiw/codemirror-themes" + - "@vue/composition-api" + - codemirror + - debug + - nanoid + - postcss + - supports-color + - typescript + dev: false + + /@scalar/components@0.2.2(typescript@5.3.3): + resolution: + { + integrity: sha512-+iMVCe6aKTwQYu4hLypH48kJVkfLZ/twB8ZBRK4lhZCpv8bUOprOMxYIkdnRtlXJITCaM6lxee5pg4aSVkCrvg==, + } + engines: { node: ">=18" } + dependencies: + "@headlessui/vue": 1.7.17(vue@3.4.15) + "@vueuse/core": 10.7.2(vue@3.4.15) + "@xmldom/xmldom": 0.8.10 + class-variance-authority: 0.7.0 + cva: 1.0.0-beta.1(typescript@5.3.3) + nanoid: 5.0.4 + tailwind-merge: 2.2.1 + vue: 3.4.15(typescript@5.3.3) + transitivePeerDependencies: + - "@vue/composition-api" + - typescript + dev: false + + /@scalar/hono-api-reference@0.3.29(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(hono@3.12.8)(nanoid@5.0.4)(postcss@8.4.33)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15): + resolution: + { + integrity: sha512-JKGwToiBBaLr2kuxPzoP+rDbceT2ILDBKACTK1c/LTvnLKJL/CcB6BiRfRjAKuVoIecPC7nVFoka/GXQkbUd7Q==, + } + engines: { node: ">=18" } + peerDependencies: + hono: ^3.0.0 + dependencies: + "@scalar/api-reference": 1.13.18(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(nanoid@5.0.4)(postcss@8.4.33)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15) + hono: 3.12.8 + transitivePeerDependencies: + - "@codemirror/lang-html" + - "@codemirror/lang-java" + - "@codemirror/lang-javascript" + - "@codemirror/lang-json" + - "@codemirror/lang-python" + - "@codemirror/language" + - "@codemirror/legacy-modes" + - "@codemirror/state" + - "@codemirror/view" + - "@lezer/common" + - "@lezer/highlight" + - "@lezer/lr" + - "@uiw/codemirror-themes" + - "@vue/composition-api" + - codemirror + - debug + - nanoid + - postcss + - supports-color + - typescript + - unified + - vue + dev: false + + /@scalar/snippetz-core@0.1.3: + resolution: + { + integrity: sha512-pHRi23VhxMddKMo/2zEnaRcc1QUTEva5H2tryuq+tER7imGWf2O09IGexiV9vY/8jzYh0QVl/2dlJUmnF9Ww5w==, + } + dependencies: + "@types/har-format": 1.2.15 + dev: false + + /@scalar/snippetz-plugin-js-fetch@0.1.0: + resolution: + { + integrity: sha512-lliZSIqtbZawm+XXmMXEpCcpIQprRwJXNUxLAvryB9AGm9qTu0dIfsvjJPjiTAfRew5+sgebNQ8cEF4esMnnlQ==, + } + dependencies: + "@scalar/snippetz-core": 0.1.3 + dev: false + + /@scalar/snippetz-plugin-node-fetch@0.1.1: + resolution: + { + integrity: sha512-U6kqtQi1xAME8AWgJmEVAFA/uhcJ1RUNKtyVDjupd77LQu2FEOPwqI5dPSltxvnJdYrUjLhDcfIa8EO8uO43zw==, + } + dependencies: + "@scalar/snippetz-core": 0.1.3 + dev: false + + /@scalar/snippetz-plugin-node-undici@0.1.5: + resolution: + { + integrity: sha512-ctOvCK3/Ta7ibuZjhV85M/gBuKURpeqgkWQHDFJubTHgUhQZudn60N5MY3ZtjoLFY7z9DCC5UenNYINveCdKJw==, + } + dependencies: + "@scalar/snippetz-core": 0.1.3 + dev: false + + /@scalar/snippetz@0.1.5: + resolution: + { + integrity: sha512-jHU8/KOO9vKbQFhsruflKugekgAtDm5GIAKZCYN+XtzqQ3jPGAjzkEZMXXvRDS2YPtFSzH2vzfqNMLB+q2Zupw==, + } + dependencies: + "@scalar/snippetz-core": 0.1.3 + "@scalar/snippetz-plugin-js-fetch": 0.1.0 + "@scalar/snippetz-plugin-node-fetch": 0.1.1 + "@scalar/snippetz-plugin-node-undici": 0.1.5 + dev: false + + /@scalar/swagger-editor@0.9.8(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/view@6.23.1)(@headlessui/vue@1.7.17)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15): + resolution: + { + integrity: sha512-VxhbqaZVwEy7Od29Kxbg6a/6AM7md/ugcD2pNCw2wUv1PcV/ru+9imJkfClI3HfUXZN/IyLDaZpaNZadCB4Rrw==, + } + engines: { node: ">=18" } + peerDependencies: + unified: ^11.0.0 + vue: ^3.3.0 + dependencies: + "@codemirror/state": 6.4.0 + "@scalar/components": 0.2.2(typescript@5.3.3) + "@scalar/themes": 0.5.4(vue@3.4.15) + "@scalar/use-codemirror": 0.7.19(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15) + "@scalar/use-modal": 0.2.3(@headlessui/vue@1.7.17)(vue@3.4.15) + "@vueuse/core": 10.7.2(vue@3.4.15) + nanoid: 5.0.4 + rehype-external-links: 3.0.0 + rehype-format: 5.0.0 + rehype-highlight: 7.0.0 + rehype-sanitize: 6.0.0 + rehype-slug-custom-id: 1.1.0 + rehype-stringify: 10.0.0 + remark-gfm: 4.0.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.0 + unified: 11.0.4 + vue: 3.4.15(typescript@5.3.3) + transitivePeerDependencies: + - "@codemirror/lang-html" + - "@codemirror/lang-java" + - "@codemirror/lang-javascript" + - "@codemirror/lang-json" + - "@codemirror/lang-python" + - "@codemirror/language" + - "@codemirror/legacy-modes" + - "@codemirror/view" + - "@headlessui/vue" + - "@lezer/common" + - "@lezer/highlight" + - "@lezer/lr" + - "@uiw/codemirror-themes" + - "@vue/composition-api" + - codemirror + - supports-color + - typescript + dev: false + + /@scalar/swagger-parser@0.5.15(openapi-types@12.1.3): + resolution: + { + integrity: sha512-qQY69CiS9XkdG5RuWk/ey12qXiXLUacb7b6oXU1KNB00MKJEpfj+Fjdn+ALXBoKiUVqAfIxeB76evGdZsupwMQ==, + } + engines: { node: ">=18" } + dependencies: + "@apidevtools/swagger-parser": 10.1.0(openapi-types@12.1.3) + js-yaml: 4.1.0 + transitivePeerDependencies: + - openapi-types + dev: false + + /@scalar/themes@0.5.4(vue@3.4.15): + resolution: + { + integrity: sha512-3tmivqGFJwmxmPygWls5W5qyQAt2Ax8tUVi/eVHb8+UYs5ADTzhNKeOu/CipKeZO9z+tfO+UO+XLhy2qb5T+dA==, + } + engines: { node: ">=18" } + peerDependencies: + vue: ^3.3.0 + dependencies: + vue: 3.4.15(typescript@5.3.3) + dev: false + + /@scalar/use-clipboard@0.5.13(@scalar/use-toasts@0.5.13)(nanoid@5.0.4): + resolution: + { + integrity: sha512-UtDu+ArEfHjHUGJzNZQdbFfP4CAPhPwJxcMAwG6KbwaRTNq4UNRS3+WoFmnVOOl8dPLVQFyMs10A2ca2HgJGcA==, + } + engines: { node: ">=18" } + peerDependencies: + "@scalar/use-toasts": 0.5.13 + nanoid: ^5.0.1 + dependencies: + "@scalar/use-toasts": 0.5.13(nanoid@5.0.4)(vue@3.4.15) + nanoid: 5.0.4 + dev: false + + /@scalar/use-codemirror@0.7.19(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15): + resolution: + { + integrity: sha512-xS6/JsVeQ983K6B/6RJMfmgl5GNst7zPbspSPxKwRCbwV5qBZaVWMhop6HQ5mnmanJTXxeh6krRG3K8tFbsuyg==, + } + engines: { node: ">=18" } + peerDependencies: + "@codemirror/lang-html": ^6.0.0 + "@codemirror/lang-java": ^6.0.0 + "@codemirror/lang-javascript": ^6.0.0 + "@codemirror/lang-json": ^6.0.0 + "@codemirror/lang-python": ^6.0.0 + "@codemirror/language": ^6.0.0 + "@codemirror/legacy-modes": ^6.0.0 + "@codemirror/state": ^6.4.0 + "@codemirror/view": ^6.0.0 + "@lezer/common": ^1.1.0 + "@lezer/highlight": ^1.1.0 + "@lezer/lr": ^1.3.0 + "@uiw/codemirror-themes": ^4.21.0 + codemirror: ^6.0.0 + vue: ^3.3.0 + dependencies: + "@codemirror/lang-html": 6.4.8 + "@codemirror/lang-java": 6.0.1 + "@codemirror/lang-javascript": 6.2.1 + "@codemirror/lang-json": 6.0.1 + "@codemirror/lang-python": 6.1.3(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) + "@codemirror/language": 6.10.0 + "@codemirror/legacy-modes": 6.3.3 + "@codemirror/state": 6.4.0 + "@codemirror/view": 6.23.1 + "@lezer/common": 1.2.1 + "@lezer/highlight": 1.2.0 + "@lezer/lr": 1.4.0 + "@uiw/codemirror-themes": 4.21.21(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1) + codemirror: 6.0.1(@lezer/common@1.2.1) + vue: 3.4.15(typescript@5.3.3) + dev: false + + /@scalar/use-keyboard-event@0.5.8(vue@3.4.15): + resolution: + { + integrity: sha512-LcqgZOZWOKIDCftfR4+qOXEtbvXtTtHSObRF2egpctsXgGHlyKY5KjPOoffbvwdh21rLa5ITBy+emwAm2i6Xww==, + } + engines: { node: ">=18" } + peerDependencies: + vue: ^3.3.0 + dependencies: + vue: 3.4.15(typescript@5.3.3) + dev: false + + /@scalar/use-modal@0.2.3(@headlessui/vue@1.7.17)(vue@3.4.15): + resolution: + { + integrity: sha512-qCn8rNCTy7jO/7DDalsMM+m1jBfEE/Fnx3Im966uBzCdxdyLbJ8f9S2ZwmW44KP6CXbsMGsuORkvY6Z8joZvMg==, + } + engines: { node: ">=18" } + peerDependencies: + "@headlessui/vue": ^1.7.0 + vue: ^3.3.0 + dependencies: + "@headlessui/vue": 1.7.17(vue@3.4.15) + vue: 3.4.15(typescript@5.3.3) + dev: false + + /@scalar/use-toasts@0.5.13(nanoid@5.0.4)(vue@3.4.15): + resolution: + { + integrity: sha512-EiFezCmWchaYfwEDTkSv/r7x6aYOlaFcu+zpTaV/y3ppCIybLvL3WRQzQS0KMaCJJBmQecZbCqMPnRLlacPwYw==, + } + engines: { node: ">=18" } + peerDependencies: + nanoid: 4 - 5 + vue: ^3.3.0 + dependencies: + nanoid: 5.0.4 + vue: 3.4.15(typescript@5.3.3) + dev: false + + /@scalar/use-tooltip@0.5.8(vue@3.4.15): + resolution: + { + integrity: sha512-9gCa7UGlRQVrKVy3tp5WYn/vCS1Fk0mcPlpkoffPeekS/4A01K3SpddqM76gVUNnOvDOq0EPEbVvUO1deB9oGw==, + } + engines: { node: ">=18" } + peerDependencies: + vue: ^3.3.0 + dependencies: + vue: 3.4.15(typescript@5.3.3) + dev: false + + /@tanstack/virtual-core@3.0.0: + resolution: + { + integrity: sha512-SYXOBTjJb05rXa2vl55TTwO40A6wKu0R5i1qQwhJYNDIqaIGF7D0HsLw+pJAyi2OvntlEIVusx3xtbbgSUi6zg==, + } + dev: false + + /@tanstack/vue-virtual@3.0.2(vue@3.4.15): + resolution: + { + integrity: sha512-1iFpX+yZswHuf4wrA6GU9yJ/YzQ/8SacABwqghwCkcwrkZbOPLlRSdOAqZ1WQ50SftmfhZpaiZl2KmpV7cgfMQ==, + } + peerDependencies: + vue: ^2.7.0 || ^3.0.0 + dependencies: + "@tanstack/virtual-core": 3.0.0 + vue: 3.4.15(typescript@5.3.3) + dev: false + + /@tybys/wasm-util@0.8.1: + resolution: + { + integrity: sha512-GSsTwyBl4pIzsxAY5wroZdyQKyhXk0d8PCRZtrSZ2WEB1cBdrp2EgGBwHOGCZtIIPun/DL3+AykCv+J6fyRH4Q==, + } + requiresBuild: true + dependencies: + tslib: 2.6.2 + dev: false + optional: true + + /@types/debug@4.1.12: + resolution: + { + integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==, + } + dependencies: + "@types/ms": 0.7.34 + dev: false + + /@types/har-format@1.2.15: + resolution: + { + integrity: sha512-RpQH4rXLuvTXKR0zqHq3go0RVXYv/YVqv4TnPH95VbwUxZdQlK1EtcMvQvMpDngHbt13Csh9Z4qT9AbkiQH5BA==, + } + dev: false + + /@types/hast@2.3.9: + resolution: + { + integrity: sha512-pTHyNlaMD/oKJmS+ZZUyFUcsZeBZpC0lmGquw98CqRVNgAdJZJeD7GoeLiT6Xbx5rU9VCjSt0RwEvDgzh4obFw==, + } + dependencies: + "@types/unist": 2.0.10 + dev: false + + /@types/hast@3.0.3: + resolution: + { + integrity: sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==, + } + dependencies: + "@types/unist": 3.0.2 + dev: false + + /@types/json-schema@7.0.15: + resolution: + { + integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, + } + dev: false + + /@types/mdast@3.0.15: + resolution: + { + integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==, + } + dependencies: + "@types/unist": 2.0.10 + dev: false + + /@types/mdast@4.0.3: + resolution: + { + integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==, + } + dependencies: + "@types/unist": 3.0.2 + dev: false + + /@types/ms@0.7.34: + resolution: + { + integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==, + } + dev: false + + /@types/node-fetch@2.6.11: + resolution: + { + integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==, + } + dependencies: + "@types/node": 20.11.8 + form-data: 4.0.0 + dev: false + + /@types/node-forge@1.3.11: + resolution: + { + integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==, + } + dependencies: + "@types/node": 20.11.8 + dev: true + + /@types/node@20.11.8: + resolution: + { + integrity: sha512-i7omyekpPTNdv4Jb/Rgqg0RU8YqLcNsI12quKSDkRXNfx7Wxdm6HhK1awT3xTgEkgxPn3bvnSpiEAc7a7Lpyow==, + } + dependencies: + undici-types: 5.26.5 + + /@types/semver@7.5.6: + resolution: + { + integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==, + } + dev: false + + /@types/unist@2.0.10: + resolution: + { + integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==, + } + dev: false + + /@types/unist@3.0.2: + resolution: + { + integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==, + } + dev: false + + /@types/web-bluetooth@0.0.20: + resolution: + { + integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==, + } + dev: false + + /@types/ws@8.5.10: + resolution: + { + integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==, + } + dependencies: + "@types/node": 20.11.8 + dev: false + + /@typescript-eslint/eslint-plugin@6.19.1(@typescript-eslint/parser@6.19.1)(eslint@8.56.0)(typescript@5.3.3): + resolution: + { + integrity: sha512-roQScUGFruWod9CEyoV5KlCYrubC/fvG8/1zXuT0WTcxX87GnMMmnksMwSg99lo1xiKrBzw2icsJPMAw1OtKxg==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@eslint-community/regexpp": 4.10.0 + "@typescript-eslint/parser": 6.19.1(eslint@8.56.0)(typescript@5.3.3) + "@typescript-eslint/scope-manager": 6.19.1 + "@typescript-eslint/type-utils": 6.19.1(eslint@8.56.0)(typescript@5.3.3) + "@typescript-eslint/utils": 6.19.1(eslint@8.56.0)(typescript@5.3.3) + "@typescript-eslint/visitor-keys": 6.19.1 + debug: 4.3.4 + eslint: 8.56.0 + graphemer: 1.4.0 + ignore: 5.3.0 + natural-compare: 1.4.0 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/parser@6.19.1(eslint@8.56.0)(typescript@5.3.3): + resolution: + { + integrity: sha512-WEfX22ziAh6pRE9jnbkkLGp/4RhTpffr2ZK5bJ18M8mIfA8A+k97U9ZyaXCEJRlmMHh7R9MJZWXp/r73DzINVQ==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@typescript-eslint/scope-manager": 6.19.1 + "@typescript-eslint/types": 6.19.1 + "@typescript-eslint/typescript-estree": 6.19.1(typescript@5.3.3) + "@typescript-eslint/visitor-keys": 6.19.1 + debug: 4.3.4 + eslint: 8.56.0 + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/scope-manager@6.19.1: + resolution: + { + integrity: sha512-4CdXYjKf6/6aKNMSly/BP4iCSOpvMmqtDzRtqFyyAae3z5kkqEjKndR5vDHL8rSuMIIWP8u4Mw4VxLyxZW6D5w==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + dependencies: + "@typescript-eslint/types": 6.19.1 + "@typescript-eslint/visitor-keys": 6.19.1 + dev: false + + /@typescript-eslint/type-utils@6.19.1(eslint@8.56.0)(typescript@5.3.3): + resolution: + { + integrity: sha512-0vdyld3ecfxJuddDjACUvlAeYNrHP/pDeQk2pWBR2ESeEzQhg52DF53AbI9QCBkYE23lgkhLCZNkHn2hEXXYIg==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@typescript-eslint/typescript-estree": 6.19.1(typescript@5.3.3) + "@typescript-eslint/utils": 6.19.1(eslint@8.56.0)(typescript@5.3.3) + debug: 4.3.4 + eslint: 8.56.0 + ts-api-utils: 1.0.3(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/types@6.19.1: + resolution: + { + integrity: sha512-6+bk6FEtBhvfYvpHsDgAL3uo4BfvnTnoge5LrrCj2eJN8g3IJdLTD4B/jK3Q6vo4Ql/Hoip9I8aB6fF+6RfDqg==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + dev: false + + /@typescript-eslint/typescript-estree@6.19.1(typescript@5.3.3): + resolution: + { + integrity: sha512-aFdAxuhzBFRWhy+H20nYu19+Km+gFfwNO4TEqyszkMcgBDYQjmPJ61erHxuT2ESJXhlhrO7I5EFIlZ+qGR8oVA==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@typescript-eslint/types": 6.19.1 + "@typescript-eslint/visitor-keys": 6.19.1 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/utils@6.19.1(eslint@8.56.0)(typescript@5.3.3): + resolution: + { + integrity: sha512-JvjfEZuP5WoMqwh9SPAPDSHSg9FBHHGhjPugSRxu5jMfjvBpq5/sGTD+9M9aQ5sh6iJ8AY/Kk/oUYVEMAPwi7w==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + "@eslint-community/eslint-utils": 4.4.0(eslint@8.56.0) + "@types/json-schema": 7.0.15 + "@types/semver": 7.5.6 + "@typescript-eslint/scope-manager": 6.19.1 + "@typescript-eslint/types": 6.19.1 + "@typescript-eslint/typescript-estree": 6.19.1(typescript@5.3.3) + eslint: 8.56.0 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: false + + /@typescript-eslint/visitor-keys@6.19.1: + resolution: + { + integrity: sha512-gkdtIO+xSO/SmI0W68DBg4u1KElmIUo3vXzgHyGPs6cxgB0sa3TlptRAAE0hUY1hM6FcDKEv7aIwiTGm76cXfQ==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + dependencies: + "@typescript-eslint/types": 6.19.1 + eslint-visitor-keys: 3.4.3 + dev: false + + /@uiw/codemirror-themes@4.21.21(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1): + resolution: + { + integrity: sha512-ljVcMGdaxo75UaH+EqxJ+jLyMVVgeSfW2AKyT1VeLy+4SDpuqNQ7wq5XVxktsG6LH+OvgSFndWXgPANf4+gQcA==, + } + peerDependencies: + "@codemirror/language": ">=6.0.0" + "@codemirror/state": ">=6.0.0" + "@codemirror/view": ">=6.0.0" + dependencies: + "@codemirror/language": 6.10.0 + "@codemirror/state": 6.4.0 + "@codemirror/view": 6.23.1 + dev: false + + /@ungap/structured-clone@1.2.0: + resolution: + { + integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==, + } + + /@unhead/dom@1.8.10: + resolution: + { + integrity: sha512-dBeDbHrBjeU+eVgMsD91TGEazb1dwLrY0x/ve01CldMCmm+WcRu++SUW7s1QX84mzGH2EgFz78o1OPn6jpV3zw==, + } + dependencies: + "@unhead/schema": 1.8.10 + "@unhead/shared": 1.8.10 + dev: false + + /@unhead/schema@1.8.10: + resolution: + { + integrity: sha512-cy8RGOPkwOVY5EmRoCgGV8AqLjy/226xBVTY54kBct02Om3hBdpB9FZa9frM910pPUXMI8PNmFgABO23O7IdJA==, + } + dependencies: + hookable: 5.5.3 + zhead: 2.2.4 + dev: false + + /@unhead/shared@1.8.10: + resolution: + { + integrity: sha512-pEFryAs3EmV+ShDQx2ZBwUnt5l3RrMrXSMZ50oFf+MImKZNARVvD4+3I8fEI9wZh+Zq0JYG3UAfzo51MUP+Juw==, + } + dependencies: + "@unhead/schema": 1.8.10 + dev: false + + /@vcarl/remark-headings@0.1.0: + resolution: + { + integrity: sha512-ffQxJUcapJ9Bk+fiGN49YJ9RaYMibrSTSezB1Fcrtu+0YSZxA3bsaLlIv1u/4sjPIeW/BKrs4xtMT3l3P9Ba5Q==, + } + dependencies: + mdast-util-to-string: 3.2.0 + unist-util-visit: 4.1.2 + dev: false + + /@vue/compiler-core@3.4.15: + resolution: + { + integrity: sha512-XcJQVOaxTKCnth1vCxEChteGuwG6wqnUHxAm1DO3gCz0+uXKaJNx8/digSz4dLALCy8n2lKq24jSUs8segoqIw==, + } + dependencies: + "@babel/parser": 7.23.9 + "@vue/shared": 3.4.15 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.0.2 + dev: false + + /@vue/compiler-dom@3.4.15: + resolution: + { + integrity: sha512-wox0aasVV74zoXyblarOM3AZQz/Z+OunYcIHe1OsGclCHt8RsRm04DObjefaI82u6XDzv+qGWZ24tIsRAIi5MQ==, + } + dependencies: + "@vue/compiler-core": 3.4.15 + "@vue/shared": 3.4.15 + dev: false + + /@vue/compiler-sfc@3.4.15: + resolution: + { + integrity: sha512-LCn5M6QpkpFsh3GQvs2mJUOAlBQcCco8D60Bcqmf3O3w5a+KWS5GvYbrrJBkgvL1BDnTp+e8q0lXCLgHhKguBA==, + } + dependencies: + "@babel/parser": 7.23.9 + "@vue/compiler-core": 3.4.15 + "@vue/compiler-dom": 3.4.15 + "@vue/compiler-ssr": 3.4.15 + "@vue/shared": 3.4.15 + estree-walker: 2.0.2 + magic-string: 0.30.5 + postcss: 8.4.33 + source-map-js: 1.0.2 + dev: false + + /@vue/compiler-ssr@3.4.15: + resolution: + { + integrity: sha512-1jdeQyiGznr8gjFDadVmOJqZiLNSsMa5ZgqavkPZ8O2wjHv0tVuAEsw5hTdUoUW4232vpBbL/wJhzVW/JwY1Uw==, + } + dependencies: + "@vue/compiler-dom": 3.4.15 + "@vue/shared": 3.4.15 + dev: false + + /@vue/reactivity@3.4.15: + resolution: + { + integrity: sha512-55yJh2bsff20K5O84MxSvXKPHHt17I2EomHznvFiJCAZpJTNW8IuLj1xZWMLELRhBK3kkFV/1ErZGHJfah7i7w==, + } + dependencies: + "@vue/shared": 3.4.15 + dev: false + + /@vue/runtime-core@3.4.15: + resolution: + { + integrity: sha512-6E3by5m6v1AkW0McCeAyhHTw+3y17YCOKG0U0HDKDscV4Hs0kgNT5G+GCHak16jKgcCDHpI9xe5NKb8sdLCLdw==, + } + dependencies: + "@vue/reactivity": 3.4.15 + "@vue/shared": 3.4.15 + dev: false + + /@vue/runtime-dom@3.4.15: + resolution: + { + integrity: sha512-EVW8D6vfFVq3V/yDKNPBFkZKGMFSvZrUQmx196o/v2tHKdwWdiZjYUBS+0Ez3+ohRyF8Njwy/6FH5gYJ75liUw==, + } + dependencies: + "@vue/runtime-core": 3.4.15 + "@vue/shared": 3.4.15 + csstype: 3.1.3 + dev: false + + /@vue/server-renderer@3.4.15(vue@3.4.15): + resolution: + { + integrity: sha512-3HYzaidu9cHjrT+qGUuDhFYvF/j643bHC6uUN9BgM11DVy+pM6ATsG6uPBLnkwOgs7BpJABReLmpL3ZPAsUaqw==, + } + peerDependencies: + vue: 3.4.15 + dependencies: + "@vue/compiler-ssr": 3.4.15 + "@vue/shared": 3.4.15 + vue: 3.4.15(typescript@5.3.3) + dev: false + + /@vue/shared@3.4.15: + resolution: + { + integrity: sha512-KzfPTxVaWfB+eGcGdbSf4CWdaXcGDqckoeXUh7SB3fZdEtzPCK2Vq9B/lRRL3yutax/LWITz+SwvgyOxz5V75g==, + } + dev: false + + /@vueuse/core@10.7.2(vue@3.4.15): + resolution: + { + integrity: sha512-AOyAL2rK0By62Hm+iqQn6Rbu8bfmbgaIMXcE3TSr7BdQ42wnSFlwIdPjInO62onYsEMK/yDMU8C6oGfDAtZ2qQ==, + } + dependencies: + "@types/web-bluetooth": 0.0.20 + "@vueuse/metadata": 10.7.2 + "@vueuse/shared": 10.7.2(vue@3.4.15) + vue-demi: 0.14.6(vue@3.4.15) + transitivePeerDependencies: + - "@vue/composition-api" + - vue + dev: false + + /@vueuse/metadata@10.7.2: + resolution: + { + integrity: sha512-kCWPb4J2KGrwLtn1eJwaJD742u1k5h6v/St5wFe8Quih90+k2a0JP8BS4Zp34XUuJqS2AxFYMb1wjUL8HfhWsQ==, + } + dev: false + + /@vueuse/shared@10.7.2(vue@3.4.15): + resolution: + { + integrity: sha512-qFbXoxS44pi2FkgFjPvF4h7c9oMDutpyBdcJdMYIMg9XyXli2meFMuaKn+UMgsClo//Th6+beeCgqweT/79BVA==, + } + dependencies: + vue-demi: 0.14.6(vue@3.4.15) + transitivePeerDependencies: + - "@vue/composition-api" + - vue + dev: false + + /@xmldom/xmldom@0.8.10: + resolution: + { + integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==, + } + engines: { node: ">=10.0.0" } + dev: false + + /acorn-jsx@5.3.2(acorn@8.11.3): + resolution: + { + integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, + } + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.3 + + /acorn-walk@8.3.2: + resolution: + { + integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==, + } + engines: { node: ">=0.4.0" } + dev: true + + /acorn@8.11.3: + resolution: + { + integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==, + } + engines: { node: ">=0.4.0" } + hasBin: true + + /ajv-draft-04@1.0.0(ajv@8.12.0): + resolution: + { + integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==, + } + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + dependencies: + ajv: 8.12.0 + dev: false + + /ajv@6.12.6: + resolution: + { + integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, + } + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + /ajv@8.12.0: + resolution: + { + integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==, + } + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: false + + /ansi-regex@5.0.1: + resolution: + { + integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, + } + engines: { node: ">=8" } + + /ansi-styles@4.3.0: + resolution: + { + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, + } + engines: { node: ">=8" } + dependencies: + color-convert: 2.0.1 + + /anymatch@3.1.3: + resolution: + { + integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, + } + engines: { node: ">= 8" } + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /argparse@1.0.10: + resolution: + { + integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==, + } + dependencies: + sprintf-js: 1.0.3 + dev: false + + /argparse@2.0.1: + resolution: + { + integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, + } + + /array-union@2.1.0: + resolution: + { + integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, + } + engines: { node: ">=8" } + dev: false + + /as-table@1.0.55: + resolution: + { + integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==, + } + dependencies: + printable-characters: 1.0.42 + dev: true + + /asynckit@0.4.0: + resolution: + { + integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, + } + dev: false + + /axios@1.6.7: + resolution: + { + integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==, + } + dependencies: + follow-redirects: 1.15.5 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + + /bail@2.0.2: + resolution: + { + integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==, + } + dev: false + + /balanced-match@1.0.2: + resolution: + { + integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, + } + + /base64-js@1.5.1: + resolution: + { + integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, + } + dev: false + + /better-sqlite3@9.3.0: + resolution: + { + integrity: sha512-ww73jVpQhRRdS9uMr761ixlkl4bWoXi8hMQlBGhoN6vPNlUHpIsNmw4pKN6kjknlt/wopdvXHvLk1W75BI+n0Q==, + } + 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 + + /brace-expansion@1.1.11: + resolution: + { + integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, + } + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /brace-expansion@2.0.1: + resolution: + { + integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, + } + dependencies: + balanced-match: 1.0.2 + + /braces@3.0.2: + resolution: + { + integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==, + } + engines: { node: ">=8" } + dependencies: + fill-range: 7.0.1 + + /buffer-from@1.1.2: + resolution: + { + integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, + } + dev: true + + /buffer@5.7.1: + resolution: + { + integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, + } + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /call-me-maybe@1.0.2: + resolution: + { + integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==, + } + dev: false + + /callsites@3.1.0: + resolution: + { + integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, + } + engines: { node: ">=6" } + + /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 + + /ccount@2.0.1: + resolution: + { + integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==, + } + dev: false + + /chalk@4.1.2: + resolution: + { + integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, + } + engines: { node: ">=10" } + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /chalk@5.3.0: + resolution: + { + integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==, + } + engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } + dev: true + + /character-entities-html4@2.1.0: + resolution: + { + integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==, + } + dev: false + + /character-entities-legacy@3.0.0: + resolution: + { + integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==, + } + dev: false + + /character-entities@2.0.2: + resolution: + { + integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==, + } + dev: false + + /chokidar@3.5.3: + resolution: + { + integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, + } + engines: { node: ">= 8.10.0" } + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /chownr@1.1.4: + resolution: + { + integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==, + } + dev: false + + /class-variance-authority@0.7.0: + resolution: + { + integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==, + } + dependencies: + clsx: 2.0.0 + dev: false + + /cli-color@2.0.3: + resolution: + { + integrity: sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==, + } + engines: { node: ">=0.10" } + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-iterator: 2.0.3 + memoizee: 0.4.15 + timers-ext: 0.1.7 + dev: true + + /clsx@2.0.0: + resolution: + { + integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==, + } + engines: { node: ">=6" } + dev: false + + /codemirror@6.0.1(@lezer/common@1.2.1): + resolution: + { + integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==, + } + dependencies: + "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) + "@codemirror/commands": 6.3.3 + "@codemirror/language": 6.10.0 + "@codemirror/lint": 6.4.2 + "@codemirror/search": 6.5.5 + "@codemirror/state": 6.4.0 + "@codemirror/view": 6.23.1 + transitivePeerDependencies: + - "@lezer/common" + dev: false + + /color-convert@2.0.1: + resolution: + { + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, + } + engines: { node: ">=7.0.0" } + dependencies: + color-name: 1.1.4 + + /color-name@1.1.4: + resolution: + { + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, + } + + /combined-stream@1.0.8: + resolution: + { + integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, + } + engines: { node: ">= 0.8" } + dependencies: + delayed-stream: 1.0.0 + dev: false + + /comma-separated-tokens@2.0.3: + resolution: + { + integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==, + } + dev: false + + /commander@9.5.0: + resolution: + { + integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==, + } + engines: { node: ^12.20.0 || >=14 } + dev: true + + /concat-map@0.0.1: + resolution: + { + integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, + } + + /content-type@1.0.5: + resolution: + { + integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==, + } + engines: { node: ">= 0.6" } + dev: false + + /cookie@0.5.0: + resolution: + { + integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==, + } + engines: { node: ">= 0.6" } + dev: true + + /copy-anything@3.0.5: + resolution: + { + integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==, + } + engines: { node: ">=12.13" } + dependencies: + is-what: 4.1.16 + dev: true + + /crelt@1.0.6: + resolution: + { + integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==, + } + dev: false + + /cross-spawn@7.0.3: + resolution: + { + integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, + } + engines: { node: ">= 8" } + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + /cssesc@3.0.0: + resolution: + { + integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==, + } + engines: { node: ">=4" } + hasBin: true + dev: false + + /csstype@3.1.3: + resolution: + { + integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==, + } + dev: false + + /cva@1.0.0-beta.1(typescript@5.3.3): + resolution: + { + integrity: sha512-gznFqTgERU9q4wg7jfgqtt34+RUt9S5t0xDAAEuDwQEAXEgjdDkKXpLLNjwSxsB4Ln/sqWJEH7yhE8Ny0mxd0w==, + } + peerDependencies: + typescript: ">= 4.5.5 < 6" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + clsx: 2.0.0 + typescript: 5.3.3 + dev: false + + /d@1.0.1: + resolution: + { + integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==, + } + 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 + + /data-uri-to-buffer@4.0.1: + resolution: + { + integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==, + } + engines: { node: ">= 12" } + dev: false + + /dayjs@1.11.10: + resolution: + { + integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==, + } + dev: false + + /debug@4.3.4: + resolution: + { + integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, + } + engines: { node: ">=6.0" } + peerDependencies: + supports-color: "*" + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /decode-named-character-reference@1.0.2: + resolution: + { + integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==, + } + dependencies: + character-entities: 2.0.2 + dev: false + + /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==, + } + + /delayed-stream@1.0.0: + resolution: + { + integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, + } + engines: { node: ">=0.4.0" } + dev: false + + /dequal@2.0.3: + resolution: + { + integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==, + } + engines: { node: ">=6" } + dev: false + + /detect-libc@2.0.2: + resolution: + { + integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==, + } + engines: { node: ">=8" } + dev: false + + /devlop@1.1.0: + resolution: + { + integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==, + } + dependencies: + dequal: 2.0.3 + dev: false + + /difflib@0.2.4: + resolution: + { + integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==, + } + dependencies: + heap: 0.2.7 + dev: true + + /dir-glob@3.0.1: + resolution: + { + integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, + } + engines: { node: ">=8" } + dependencies: + path-type: 4.0.0 + dev: false + + /doctrine@3.0.0: + resolution: + { + integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==, + } + engines: { node: ">=6.0.0" } + dependencies: + esutils: 2.0.3 + + /dotenv@16.4.1: + resolution: + { + integrity: sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ==, + } + engines: { node: ">=12" } + dev: true + + /dreamopt@0.8.0: + resolution: + { + integrity: sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==, + } + engines: { node: ">=0.4.0" } + dependencies: + wordwrap: 1.0.0 + dev: true + + /drizzle-kit@0.20.13: + resolution: + { + integrity: sha512-j9oZSQXNWG+KBJm0Sg3S/zJpncHGKnpqNfFuM4NUxUMGTcihDHhP9SW6Jncqwb5vsP1Xm0a8JLm3PZUIspC/oA==, + } + hasBin: true + dependencies: + "@drizzle-team/studio": 0.0.39 + "@esbuild-kit/esm-loader": 2.6.5 + camelcase: 7.0.1 + chalk: 5.3.0 + commander: 9.5.0 + env-paths: 3.0.0 + esbuild: 0.19.12 + esbuild-register: 3.5.0(esbuild@0.19.12) + glob: 8.1.0 + hanji: 0.0.5 + json-diff: 0.9.0 + minimatch: 7.4.6 + semver: 7.5.4 + zod: 3.22.4 + transitivePeerDependencies: + - supports-color + dev: true + + /drizzle-orm@0.29.3(@cloudflare/workers-types@4.20240117.0)(@libsql/client@0.4.0)(better-sqlite3@9.3.0): + resolution: + { + integrity: sha512-uSE027csliGSGYD0pqtM+SAQATMREb3eSM/U8s6r+Y0RFwTKwftnwwSkqx3oS65UBgqDOM0gMTl5UGNpt6lW0A==, + } + 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/react": ">=18" + "@types/sql.js": "*" + "@vercel/postgres": "*" + better-sqlite3: ">=7" + bun-types: "*" + expo-sqlite: ">=13.2.0" + knex: "*" + kysely: "*" + mysql2: ">=2" + pg: ">=8" + postgres: ">=3" + react: ">=18" + 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/react": + optional: true + "@types/sql.js": + optional: true + "@vercel/postgres": + optional: true + better-sqlite3: + optional: true + bun-types: + optional: true + expo-sqlite: + optional: true + knex: + optional: true + kysely: + optional: true + mysql2: + optional: true + pg: + optional: true + postgres: + optional: true + react: + optional: true + sql.js: + optional: true + sqlite3: + optional: true + dependencies: + "@cloudflare/workers-types": 4.20240117.0 + "@libsql/client": 0.4.0 + better-sqlite3: 9.3.0 + dev: false + + /drizzle-zod@0.5.1(drizzle-orm@0.29.3)(zod@3.22.4): + resolution: + { + integrity: sha512-C/8bvzUH/zSnVfwdSibOgFjLhtDtbKYmkbPbUCq46QZyZCH6kODIMSOgZ8R7rVjoI+tCj3k06MRJMDqsIeoS4A==, + } + peerDependencies: + drizzle-orm: ">=0.23.13" + zod: "*" + dependencies: + drizzle-orm: 0.29.3(@cloudflare/workers-types@4.20240117.0)(@libsql/client@0.4.0)(better-sqlite3@9.3.0) + zod: 3.22.4 + dev: false + + /end-of-stream@1.4.4: + resolution: + { + integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, + } + dependencies: + once: 1.4.0 + dev: false + + /entities@4.5.0: + resolution: + { + integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==, + } + engines: { node: ">=0.12" } + dev: false + + /env-paths@3.0.0: + resolution: + { + integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + 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.19.12): + resolution: + { + integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==, + } + peerDependencies: + esbuild: ">=0.12 <1" + dependencies: + debug: 4.3.4 + esbuild: 0.19.12 + 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 + + /esbuild@0.19.12: + resolution: + { + integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==, + } + engines: { node: ">=12" } + hasBin: true + requiresBuild: true + optionalDependencies: + "@esbuild/aix-ppc64": 0.19.12 + "@esbuild/android-arm": 0.19.12 + "@esbuild/android-arm64": 0.19.12 + "@esbuild/android-x64": 0.19.12 + "@esbuild/darwin-arm64": 0.19.12 + "@esbuild/darwin-x64": 0.19.12 + "@esbuild/freebsd-arm64": 0.19.12 + "@esbuild/freebsd-x64": 0.19.12 + "@esbuild/linux-arm": 0.19.12 + "@esbuild/linux-arm64": 0.19.12 + "@esbuild/linux-ia32": 0.19.12 + "@esbuild/linux-loong64": 0.19.12 + "@esbuild/linux-mips64el": 0.19.12 + "@esbuild/linux-ppc64": 0.19.12 + "@esbuild/linux-riscv64": 0.19.12 + "@esbuild/linux-s390x": 0.19.12 + "@esbuild/linux-x64": 0.19.12 + "@esbuild/netbsd-x64": 0.19.12 + "@esbuild/openbsd-x64": 0.19.12 + "@esbuild/sunos-x64": 0.19.12 + "@esbuild/win32-arm64": 0.19.12 + "@esbuild/win32-ia32": 0.19.12 + "@esbuild/win32-x64": 0.19.12 + dev: true + + /escape-string-regexp@4.0.0: + resolution: + { + integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, + } + engines: { node: ">=10" } + + /escape-string-regexp@5.0.0: + resolution: + { + integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==, + } + engines: { node: ">=12" } + dev: false + + /eslint-scope@7.2.2: + resolution: + { + integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + /eslint-visitor-keys@3.4.3: + resolution: + { + integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + + /eslint@8.56.0: + resolution: + { + integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + hasBin: true + dependencies: + "@eslint-community/eslint-utils": 4.4.0(eslint@8.56.0) + "@eslint-community/regexpp": 4.10.0 + "@eslint/eslintrc": 2.1.4 + "@eslint/js": 8.56.0 + "@humanwhocodes/config-array": 0.11.14 + "@humanwhocodes/module-importer": 1.0.1 + "@nodelib/fs.walk": 1.2.8 + "@ungap/structured-clone": 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + /espree@9.6.1: + resolution: + { + integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + eslint-visitor-keys: 3.4.3 + + /esprima@4.0.1: + resolution: + { + integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==, + } + engines: { node: ">=4" } + hasBin: true + dev: false + + /esquery@1.5.0: + resolution: + { + integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==, + } + engines: { node: ">=0.10" } + dependencies: + estraverse: 5.3.0 + + /esrecurse@4.3.0: + resolution: + { + integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, + } + engines: { node: ">=4.0" } + dependencies: + estraverse: 5.3.0 + + /estraverse@5.3.0: + resolution: + { + integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, + } + engines: { node: ">=4.0" } + + /estree-walker@0.6.1: + resolution: + { + integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==, + } + dev: true + + /estree-walker@2.0.2: + resolution: + { + integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==, + } + dev: false + + /esutils@2.0.3: + resolution: + { + integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, + } + engines: { node: ">=0.10.0" } + + /event-emitter@0.3.5: + resolution: + { + integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==, + } + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + dev: true + + /exit-hook@2.2.1: + resolution: + { + integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==, + } + engines: { node: ">=6" } + dev: true + + /expand-template@2.0.3: + resolution: + { + integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==, + } + engines: { node: ">=6" } + dev: false + + /ext@1.7.0: + resolution: + { + integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==, + } + dependencies: + type: 2.7.2 + dev: true + + /extend@3.0.2: + resolution: + { + integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==, + } + dev: false + + /fast-deep-equal@3.1.3: + resolution: + { + integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, + } + + /fast-glob@3.3.2: + resolution: + { + integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==, + } + engines: { node: ">=8.6.0" } + dependencies: + "@nodelib/fs.stat": 2.0.5 + "@nodelib/fs.walk": 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: false + + /fast-json-stable-stringify@2.1.0: + resolution: + { + integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, + } + + /fast-levenshtein@2.0.6: + resolution: + { + integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, + } + + /fastq@1.17.0: + resolution: + { + integrity: sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==, + } + dependencies: + reusify: 1.0.4 + + /fetch-blob@3.2.0: + resolution: + { + integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==, + } + engines: { node: ^12.20 || >= 14.13 } + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.2 + dev: false + + /fetch-retry@5.0.6: + resolution: + { + integrity: sha512-3yurQZ2hD9VISAhJJP9bpYFNQrHHBXE2JxxjY5aLEcDi46RmAzJE2OC9FAde0yis5ElW0jTTzs0zfg/Cca4XqQ==, + } + dev: false + + /file-entry-cache@6.0.1: + resolution: + { + integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==, + } + engines: { node: ^10.12.0 || >=12.0.0 } + dependencies: + flat-cache: 3.2.0 + + /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" } + dependencies: + to-regex-range: 5.0.1 + + /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 + + /flat-cache@3.2.0: + resolution: + { + integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==, + } + engines: { node: ^10.12.0 || >=12.0.0 } + dependencies: + flatted: 3.2.9 + keyv: 4.5.4 + rimraf: 3.0.2 + + /flatted@3.2.9: + resolution: + { + integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==, + } + + /follow-redirects@1.15.5: + resolution: + { + integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==, + } + engines: { node: ">=4.0" } + peerDependencies: + debug: "*" + peerDependenciesMeta: + debug: + optional: true + dev: false + + /form-data@4.0.0: + resolution: + { + integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==, + } + engines: { node: ">= 6" } + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + + /formdata-node@4.4.1: + resolution: + { + integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==, + } + engines: { node: ">= 12.20" } + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 4.0.0-beta.3 + dev: false + + /formdata-polyfill@4.0.10: + resolution: + { + integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==, + } + engines: { node: ">=12.20.0" } + dependencies: + fetch-blob: 3.2.0 + dev: false + + /fs-constants@1.0.0: + resolution: + { + integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==, + } + dev: false + + /fs.realpath@1.0.0: + resolution: + { + integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, + } + + /fsevents@2.3.3: + resolution: + { + integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, + } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + os: [darwin] + requiresBuild: true + dev: true optional: true - /xxhash-wasm@1.0.2: - resolution: {integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==} - dev: true - - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - - /yaml@2.3.4: - resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} - engines: {node: '>= 14'} - - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - - /youch@3.3.3: - resolution: {integrity: sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==} - dependencies: - cookie: 0.5.0 - mustache: 4.2.0 - stacktracey: 2.1.8 - dev: true - - /zhead@2.2.4: - resolution: {integrity: sha512-8F0OI5dpWIA5IGG5NHUg9staDwz/ZPxZtvGVf01j7vHqSyZ0raHY+78atOVxRqb73AotX22uV1pXt3gYSstGag==} - dev: false - - /zod-error@1.5.0: - resolution: {integrity: sha512-zzopKZ/skI9iXpqCEPj+iLCKl9b88E43ehcU+sbRoHuwGd9F1IDVGQ70TyO6kmfiRL1g4IXkjsXK+g1gLYl4WQ==} - dependencies: - zod: 3.22.4 - dev: false - - /zod@3.22.4: - resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} - - /zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} - dev: false + /function-bind@1.1.2: + resolution: + { + integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, + } + dev: true + + /fuse.js@6.6.2: + resolution: + { + integrity: sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==, + } + engines: { node: ">=10" } + dev: false + + /get-own-enumerable-property-symbols@3.0.2: + resolution: + { + integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==, + } + dev: false + + /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-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 + + /github-slugger@1.5.0: + resolution: + { + integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==, + } + dev: false + + /github-slugger@2.0.0: + resolution: + { + integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==, + } + dev: false + + /glob-parent@5.1.2: + resolution: + { + integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, + } + engines: { node: ">= 6" } + dependencies: + is-glob: 4.0.3 + + /glob-parent@6.0.2: + resolution: + { + integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, + } + engines: { node: ">=10.13.0" } + dependencies: + is-glob: 4.0.3 + + /glob-to-regexp@0.4.1: + resolution: + { + integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==, + } + dev: true + + /glob@7.2.3: + resolution: + { + integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, + } + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /glob@8.1.0: + resolution: + { + integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==, + } + engines: { node: ">=12" } + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + dev: true + + /globals@13.24.0: + resolution: + { + integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==, + } + engines: { node: ">=8" } + dependencies: + type-fest: 0.20.2 + + /globby@11.1.0: + resolution: + { + integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, + } + engines: { node: ">=10" } + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.0 + merge2: 1.4.1 + slash: 3.0.0 + dev: false + + /graphemer@1.4.0: + resolution: + { + integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, + } + + /hanji@0.0.5: + resolution: + { + integrity: sha512-Abxw1Lq+TnYiL4BueXqMau222fPSPMFtya8HdpWsz/xVAhifXou71mPh/kY2+08RgFcVccjG3uZHs6K5HAe3zw==, + } + dependencies: + lodash.throttle: 4.1.1 + sisteransi: 1.0.5 + dev: true + + /has-flag@4.0.0: + resolution: + { + integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, + } + engines: { node: ">=8" } + + /hasown@2.0.0: + resolution: + { + integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==, + } + engines: { node: ">= 0.4" } + dependencies: + function-bind: 1.1.2 + dev: true + + /hast-util-embedded@3.0.0: + resolution: + { + integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==, + } + dependencies: + "@types/hast": 3.0.3 + hast-util-is-element: 3.0.0 + dev: false + + /hast-util-from-parse5@8.0.1: + resolution: + { + integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==, + } + dependencies: + "@types/hast": 3.0.3 + "@types/unist": 3.0.2 + devlop: 1.1.0 + hastscript: 8.0.0 + property-information: 6.4.1 + vfile: 6.0.1 + vfile-location: 5.0.2 + web-namespaces: 2.0.1 + dev: false + + /hast-util-has-property@2.0.1: + resolution: + { + integrity: sha512-X2+RwZIMTMKpXUzlotatPzWj8bspCymtXH3cfG3iQKV+wPF53Vgaqxi/eLqGck0wKq1kS9nvoB1wchbCPEL8sg==, + } + dev: false + + /hast-util-has-property@3.0.0: + resolution: + { + integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==, + } + dependencies: + "@types/hast": 3.0.3 + dev: false + + /hast-util-heading-rank@2.1.1: + resolution: + { + integrity: sha512-iAuRp+ESgJoRFJbSyaqsfvJDY6zzmFoEnL1gtz1+U8gKtGGj1p0CVlysuUAUjq95qlZESHINLThwJzNGmgGZxA==, + } + dependencies: + "@types/hast": 2.3.9 + dev: false + + /hast-util-is-body-ok-link@3.0.0: + resolution: + { + integrity: sha512-VFHY5bo2nY8HiV6nir2ynmEB1XkxzuUffhEGeVx7orbu/B1KaGyeGgMZldvMVx5xWrDlLLG/kQ6YkJAMkBEx0w==, + } + dependencies: + "@types/hast": 3.0.3 + dev: false + + /hast-util-is-element@3.0.0: + resolution: + { + integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==, + } + dependencies: + "@types/hast": 3.0.3 + dev: false + + /hast-util-parse-selector@4.0.0: + resolution: + { + integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==, + } + dependencies: + "@types/hast": 3.0.3 + dev: false + + /hast-util-phrasing@3.0.1: + resolution: + { + integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==, + } + dependencies: + "@types/hast": 3.0.3 + hast-util-embedded: 3.0.0 + hast-util-has-property: 3.0.0 + hast-util-is-body-ok-link: 3.0.0 + hast-util-is-element: 3.0.0 + dev: false + + /hast-util-raw@9.0.2: + resolution: + { + integrity: sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA==, + } + dependencies: + "@types/hast": 3.0.3 + "@types/unist": 3.0.2 + "@ungap/structured-clone": 1.2.0 + hast-util-from-parse5: 8.0.1 + hast-util-to-parse5: 8.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.1.0 + parse5: 7.1.2 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + dev: false + + /hast-util-sanitize@5.0.1: + resolution: + { + integrity: sha512-IGrgWLuip4O2nq5CugXy4GI2V8kx4sFVy5Hd4vF7AR2gxS0N9s7nEAVUyeMtZKZvzrxVsHt73XdTsno1tClIkQ==, + } + dependencies: + "@types/hast": 3.0.3 + "@ungap/structured-clone": 1.2.0 + unist-util-position: 5.0.0 + dev: false + + /hast-util-to-html@9.0.0: + resolution: + { + integrity: sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw==, + } + dependencies: + "@types/hast": 3.0.3 + "@types/unist": 3.0.2 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-raw: 9.0.2 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.1.0 + property-information: 6.4.1 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.3 + zwitch: 2.0.4 + dev: false + + /hast-util-to-parse5@8.0.0: + resolution: + { + integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==, + } + dependencies: + "@types/hast": 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 6.4.1 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + dev: false + + /hast-util-to-string@2.0.0: + resolution: + { + integrity: sha512-02AQ3vLhuH3FisaMM+i/9sm4OXGSq1UhOOCpTLLQtHdL3tZt7qil69r8M8iDkZYyC0HCFylcYoP+8IO7ddta1A==, + } + dependencies: + "@types/hast": 2.3.9 + dev: false + + /hast-util-to-text@4.0.0: + resolution: + { + integrity: sha512-EWiE1FSArNBPUo1cKWtzqgnuRQwEeQbQtnFJRYV1hb1BWDgrAlBU0ExptvZMM/KSA82cDpm2sFGf3Dmc5Mza3w==, + } + dependencies: + "@types/hast": 3.0.3 + "@types/unist": 3.0.2 + hast-util-is-element: 3.0.0 + unist-util-find-after: 5.0.0 + dev: false + + /hast-util-whitespace@3.0.0: + resolution: + { + integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==, + } + dependencies: + "@types/hast": 3.0.3 + dev: false + + /hastscript@8.0.0: + resolution: + { + integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==, + } + dependencies: + "@types/hast": 3.0.3 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 6.4.1 + space-separated-tokens: 2.0.2 + dev: false + + /heap@0.2.7: + resolution: + { + integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==, + } + dev: true + + /highlight.js@11.9.0: + resolution: + { + integrity: sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==, + } + engines: { node: ">=12.0.0" } + dev: false + + /hono@3.12.8: + resolution: + { + integrity: sha512-vnOEIRdqsp4uHE/dkOBr9EYmTsR86sD/FyG2xhfAQzR9udDRglN1nuO7SGc/7U3HfSorc6PSCNGN6upnVtCmfg==, + } + engines: { node: ">=16.0.0" } + dev: false + + /hookable@5.5.3: + resolution: + { + integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==, + } + dev: false + + /html-void-elements@3.0.0: + resolution: + { + integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==, + } + dev: false + + /html-whitespace-sensitive-tag-names@3.0.0: + resolution: + { + integrity: sha512-KlClZ3/Qy5UgvpvVvDomGhnQhNWH5INE8GwvSIQ9CWt1K0zbbXrl7eN5bWaafOZgtmO3jMPwUqmrmEwinhPq1w==, + } + dev: false + + /httpsnippet-lite@3.0.5: + resolution: + { + integrity: sha512-So4qTXY5iFj5XtFDwyz2PicUu+8NWrI8e8h+ZeZoVtMNcFQp4FFIntBHUE+JPUG6QQU8o1VHCy+X4ETRDwt9CA==, + } + engines: { node: ">=14.13" } + dependencies: + "@types/har-format": 1.2.15 + formdata-node: 4.4.1 + stringify-object: 3.3.0 + dev: false + + /husky@9.0.6: + resolution: + { + integrity: sha512-EEuw/rfTiMjOfuL7pGO/i9otg1u36TXxqjIA6D9qxVjd/UXoDOsLor/BSFf5hTK50shwzCU3aVVwdXDp/lp7RA==, + } + engines: { node: ">=18" } + hasBin: true + dev: true + + /ieee754@1.2.1: + resolution: + { + integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, + } + dev: false + + /ignore@5.3.0: + resolution: + { + integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==, + } + engines: { node: ">= 4" } + + /import-fresh@3.3.0: + resolution: + { + integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, + } + engines: { node: ">=6" } + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + /imurmurhash@0.1.4: + resolution: + { + integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, + } + engines: { node: ">=0.8.19" } + + /inflight@1.0.6: + resolution: + { + integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, + } + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits@2.0.4: + resolution: + { + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, + } + + /ini@1.3.8: + resolution: + { + integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, + } + dev: false + + /is-absolute-url@4.0.1: + resolution: + { + integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dev: false + + /is-binary-path@2.1.0: + resolution: + { + integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, + } + engines: { node: ">=8" } + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-buffer@2.0.5: + resolution: + { + integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==, + } + engines: { node: ">=4" } + dev: false + + /is-core-module@2.13.1: + resolution: + { + integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==, + } + dependencies: + hasown: 2.0.0 + dev: true + + /is-extglob@2.1.1: + resolution: + { + integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, + } + engines: { node: ">=0.10.0" } + + /is-glob@4.0.3: + resolution: + { + integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, + } + engines: { node: ">=0.10.0" } + dependencies: + is-extglob: 2.1.1 + + /is-number@7.0.0: + resolution: + { + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, + } + engines: { node: ">=0.12.0" } + + /is-obj@1.0.1: + resolution: + { + integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==, + } + engines: { node: ">=0.10.0" } + dev: false + + /is-path-inside@3.0.3: + resolution: + { + integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, + } + engines: { node: ">=8" } + + /is-plain-obj@4.1.0: + resolution: + { + integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==, + } + engines: { node: ">=12" } + dev: false + + /is-promise@2.2.2: + resolution: + { + integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==, + } + dev: true + + /is-regexp@1.0.0: + resolution: + { + integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==, + } + engines: { node: ">=0.10.0" } + dev: false + + /is-what@4.1.16: + resolution: + { + integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==, + } + engines: { node: ">=12.13" } + dev: true + + /isexe@2.0.0: + resolution: + { + integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, + } + + /javascript-time-ago@2.5.9: + resolution: + { + integrity: sha512-pQ8mNco/9g9TqWXWWjP0EWl6i/lAQScOyEeXy5AB+f7MfLSdgyV9BJhiOD1zrIac/lrxPYOWNbyl/IW8CW5n0A==, + } + dependencies: + relative-time-format: 1.1.6 + dev: false + + /js-base64@3.7.6: + resolution: + { + integrity: sha512-NPrWuHFxFUknr1KqJRDgUQPexQF0uIJWjeT+2KjEePhitQxQEx5EJBG1lVn5/hc8aLycTpXrDOgPQ6Zq+EDiTA==, + } + dev: false + + /js-yaml@3.14.1: + resolution: + { + integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==, + } + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: false + + /js-yaml@4.1.0: + resolution: + { + integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, + } + hasBin: true + dependencies: + argparse: 2.0.1 + + /json-buffer@3.0.1: + resolution: + { + integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, + } + + /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-schema-traverse@0.4.1: + resolution: + { + integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, + } + + /json-schema-traverse@1.0.0: + resolution: + { + integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==, + } + dev: false + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: + { + integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, + } + + /keyv@4.5.4: + resolution: + { + integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, + } + dependencies: + json-buffer: 3.0.1 + + /levn@0.4.1: + resolution: + { + integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, + } + engines: { node: ">= 0.8.0" } + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + /libsql@0.2.0: + resolution: + { + integrity: sha512-ELBRqhpJx5Dap0187zKQnntZyk4EjlDHSrjIVL8t+fQ5e8IxbQTeYgZgigMjB1EvrETdkm0Y0VxBGhzPQ+t0Jg==, + } + cpu: [x64, arm64] + os: [darwin, linux, win32] + dependencies: + "@neon-rs/load": 0.0.4 + detect-libc: 2.0.2 + optionalDependencies: + "@libsql/darwin-arm64": 0.2.0 + "@libsql/darwin-x64": 0.2.0 + "@libsql/linux-arm64-gnu": 0.2.0 + "@libsql/linux-arm64-musl": 0.2.0 + "@libsql/linux-x64-gnu": 0.2.0 + "@libsql/linux-x64-musl": 0.2.0 + "@libsql/win32-x64-msvc": 0.2.0 + dev: false + + /locate-path@6.0.0: + resolution: + { + integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, + } + engines: { node: ">=10" } + dependencies: + p-locate: 5.0.0 + + /lodash.merge@4.6.2: + resolution: + { + integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, + } + + /lodash.throttle@4.1.1: + resolution: + { + integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==, + } + dev: true + + /lodash@4.17.21: + resolution: + { + integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, + } + dev: false + + /longest-streak@3.1.0: + resolution: + { + integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==, + } + dev: false + + /lowlight@3.1.0: + resolution: + { + integrity: sha512-CEbNVoSikAxwDMDPjXlqlFYiZLkDJHwyGu/MfOsJnF3d7f3tds5J3z8s/l9TMXhzfsJCCJEAsD78842mwmg0PQ==, + } + dependencies: + "@types/hast": 3.0.3 + devlop: 1.1.0 + highlight.js: 11.9.0 + dev: false + + /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 + + /lucia@3.0.0: + resolution: + { + integrity: sha512-60NQqjKuaqPrjHL10CQ1j3rQy8qwKd3XpSNNnNcZyZI+4w1QFJdtNcR4l0dZJ4kJ0DdwI/943yplL47V7IZbGQ==, + } + dependencies: + oslo: 1.0.1 + dev: false + + /magic-string@0.25.9: + resolution: + { + integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==, + } + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /magic-string@0.30.5: + resolution: + { + integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==, + } + engines: { node: ">=12" } + dependencies: + "@jridgewell/sourcemap-codec": 1.4.15 + dev: false + + /markdown-table@3.0.3: + resolution: + { + integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==, + } + dev: false + + /mdast-util-find-and-replace@3.0.1: + resolution: + { + integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==, + } + dependencies: + "@types/mdast": 4.0.3 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + dev: false + + /mdast-util-from-markdown@2.0.0: + resolution: + { + integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==, + } + dependencies: + "@types/mdast": 4.0.3 + "@types/unist": 3.0.2 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-decode-string: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-autolink-literal@2.0.0: + resolution: + { + integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==, + } + dependencies: + "@types/mdast": 4.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.1 + micromark-util-character: 2.0.1 + dev: false + + /mdast-util-gfm-footnote@2.0.0: + resolution: + { + integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==, + } + dependencies: + "@types/mdast": 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + micromark-util-normalize-identifier: 2.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-strikethrough@2.0.0: + resolution: + { + integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==, + } + dependencies: + "@types/mdast": 4.0.3 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-table@2.0.0: + resolution: + { + integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==, + } + dependencies: + "@types/mdast": 4.0.3 + devlop: 1.1.0 + markdown-table: 3.0.3 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-task-list-item@2.0.0: + resolution: + { + integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==, + } + dependencies: + "@types/mdast": 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm@3.0.0: + resolution: + { + integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==, + } + dependencies: + mdast-util-from-markdown: 2.0.0 + mdast-util-gfm-autolink-literal: 2.0.0 + mdast-util-gfm-footnote: 2.0.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-phrasing@4.0.0: + resolution: + { + integrity: sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==, + } + dependencies: + "@types/mdast": 4.0.3 + unist-util-is: 6.0.0 + dev: false + + /mdast-util-to-hast@13.1.0: + resolution: + { + integrity: sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==, + } + dependencies: + "@types/hast": 3.0.3 + "@types/mdast": 4.0.3 + "@ungap/structured-clone": 1.2.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.0 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + dev: false + + /mdast-util-to-markdown@2.1.0: + resolution: + { + integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==, + } + dependencies: + "@types/mdast": 4.0.3 + "@types/unist": 3.0.2 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.0.0 + mdast-util-to-string: 4.0.0 + micromark-util-decode-string: 2.0.0 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + dev: false + + /mdast-util-to-string@3.2.0: + resolution: + { + integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==, + } + dependencies: + "@types/mdast": 3.0.15 + dev: false + + /mdast-util-to-string@4.0.0: + resolution: + { + integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==, + } + dependencies: + "@types/mdast": 4.0.3 + 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 + + /merge2@1.4.1: + resolution: + { + integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, + } + engines: { node: ">= 8" } + dev: false + + /micromark-core-commonmark@2.0.0: + resolution: + { + integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==, + } + dependencies: + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-factory-destination: 2.0.0 + micromark-factory-label: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-factory-title: 2.0.0 + micromark-factory-whitespace: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-html-tag-name: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-subtokenize: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-autolink-literal@2.0.0: + resolution: + { + integrity: sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==, + } + dependencies: + micromark-util-character: 2.0.1 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-footnote@2.0.0: + resolution: + { + integrity: sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==, + } + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-strikethrough@2.0.0: + resolution: + { + integrity: sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==, + } + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-table@2.0.0: + resolution: + { + integrity: sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==, + } + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-tagfilter@2.0.0: + resolution: + { + integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==, + } + dependencies: + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-task-list-item@2.0.1: + resolution: + { + integrity: sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==, + } + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm@3.0.0: + resolution: + { + integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==, + } + dependencies: + micromark-extension-gfm-autolink-literal: 2.0.0 + micromark-extension-gfm-footnote: 2.0.0 + micromark-extension-gfm-strikethrough: 2.0.0 + micromark-extension-gfm-table: 2.0.0 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.0.1 + micromark-util-combine-extensions: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-destination@2.0.0: + resolution: + { + integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==, + } + dependencies: + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-label@2.0.0: + resolution: + { + integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==, + } + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-space@2.0.0: + resolution: + { + integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==, + } + dependencies: + micromark-util-character: 2.0.1 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-title@2.0.0: + resolution: + { + integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==, + } + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-whitespace@2.0.0: + resolution: + { + integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==, + } + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-character@2.0.1: + resolution: + { + integrity: sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==, + } + dependencies: + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-chunked@2.0.0: + resolution: + { + integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==, + } + dependencies: + micromark-util-symbol: 2.0.0 + dev: false + + /micromark-util-classify-character@2.0.0: + resolution: + { + integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==, + } + dependencies: + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-combine-extensions@2.0.0: + resolution: + { + integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==, + } + dependencies: + micromark-util-chunked: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-decode-numeric-character-reference@2.0.1: + resolution: + { + integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==, + } + dependencies: + micromark-util-symbol: 2.0.0 + dev: false + + /micromark-util-decode-string@2.0.0: + resolution: + { + integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==, + } + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-symbol: 2.0.0 + dev: false + + /micromark-util-encode@2.0.0: + resolution: + { + integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==, + } + dev: false + + /micromark-util-html-tag-name@2.0.0: + resolution: + { + integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==, + } + dev: false + + /micromark-util-normalize-identifier@2.0.0: + resolution: + { + integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==, + } + dependencies: + micromark-util-symbol: 2.0.0 + dev: false + + /micromark-util-resolve-all@2.0.0: + resolution: + { + integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==, + } + dependencies: + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-sanitize-uri@2.0.0: + resolution: + { + integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==, + } + dependencies: + micromark-util-character: 2.0.1 + micromark-util-encode: 2.0.0 + micromark-util-symbol: 2.0.0 + dev: false + + /micromark-util-subtokenize@2.0.0: + resolution: + { + integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==, + } + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-symbol@2.0.0: + resolution: + { + integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==, + } + dev: false + + /micromark-util-types@2.0.0: + resolution: + { + integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==, + } + dev: false + + /micromark@4.0.0: + resolution: + { + integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==, + } + dependencies: + "@types/debug": 4.1.12 + debug: 4.3.4 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-chunked: 2.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-encode: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-subtokenize: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /micromatch@4.0.5: + resolution: + { + integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, + } + engines: { node: ">=8.6" } + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: false + + /mime-db@1.52.0: + resolution: + { + integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, + } + engines: { node: ">= 0.6" } + dev: false + + /mime-types@2.1.35: + resolution: + { + integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, + } + engines: { node: ">= 0.6" } + dependencies: + mime-db: 1.52.0 + dev: false + + /mime@3.0.0: + resolution: + { + integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==, + } + engines: { node: ">=10.0.0" } + hasBin: true + dev: true + + /mimic-response@3.1.0: + resolution: + { + integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==, + } + engines: { node: ">=10" } + dev: false + + /miniflare@3.20231218.4: + resolution: + { + integrity: sha512-2mpxvDiRBxGGGVnTKC0SZy0FtTXxFs3tM1ol67EoIJABGzvWFf33GThwh+/dRmaHSjKKId/FI8rEl5JxXXXZgQ==, + } + engines: { node: ">=16.13" } + hasBin: true + dependencies: + "@cspotcode/source-map-support": 0.8.1 + acorn: 8.11.3 + acorn-walk: 8.3.2 + capnp-ts: 0.7.0 + exit-hook: 2.2.1 + glob-to-regexp: 0.4.1 + stoppable: 1.1.0 + undici: 5.28.2 + workerd: 1.20231218.0 + ws: 8.16.0 + 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 + + /minimatch@5.1.6: + resolution: + { + integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==, + } + engines: { node: ">=10" } + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimatch@7.4.6: + resolution: + { + integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==, + } + engines: { node: ">=10" } + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimatch@9.0.3: + resolution: + { + integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==, + } + engines: { node: ">=16 || 14 >=14.17" } + dependencies: + brace-expansion: 2.0.1 + dev: false + + /minimist@1.2.8: + resolution: + { + integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, + } + dev: false + + /mkdirp-classic@0.5.3: + resolution: + { + integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==, + } + dev: false + + /ms@2.1.2: + resolution: + { + integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, + } + + /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 + + /nanoid@5.0.4: + resolution: + { + integrity: sha512-vAjmBf13gsmhXSgBrtIclinISzFFy22WwCYoyilZlsrRXNIHSwgFQ1bEdjRwMT3aoadeIF6HMuDRlOxzfXV8ig==, + } + engines: { node: ^18 || >=20 } + hasBin: true + dev: false + + /napi-build-utils@1.0.2: + resolution: + { + integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==, + } + dev: false + + /natural-compare@1.4.0: + resolution: + { + integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, + } + + /next-tick@1.1.0: + resolution: + { + integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==, + } + dev: true + + /node-abi@3.54.0: + resolution: + { + integrity: sha512-p7eGEiQil0YUV3ItH4/tBb781L5impVmmx2E9FRKF7d18XXzp4PGT2tdYMFY6wQqgxD0IwNZOiSJ0/K0fSi/OA==, + } + engines: { node: ">=10" } + dependencies: + semver: 7.5.4 + dev: false + + /node-domexception@1.0.0: + resolution: + { + integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==, + } + engines: { node: ">=10.5.0" } + dev: false + + /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-fetch@3.3.2: + resolution: + { + integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + dev: false + + /node-forge@1.3.1: + resolution: + { + integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==, + } + engines: { node: ">= 6.13.0" } + dev: true + + /normalize-path@3.0.0: + resolution: + { + integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, + } + engines: { node: ">=0.10.0" } + dev: true + + /once@1.4.0: + resolution: + { + integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, + } + dependencies: + wrappy: 1.0.2 + + /openapi-types@12.1.3: + resolution: + { + integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==, + } + dev: false + + /openapi3-ts@4.2.1: + resolution: + { + integrity: sha512-KL1mKwkZii5ce+tb24KCUmQHyWB/oanG5fzUY35UB+wenWJv4Kr/IWBntpn5R8ODiJcxx13ZDophcpHnLGeIOw==, + } + dependencies: + yaml: 2.3.4 + + /optionator@0.9.3: + resolution: + { + integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==, + } + engines: { node: ">= 0.8.0" } + dependencies: + "@aashutoshrathi/word-wrap": 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + + /oslo@1.0.1: + resolution: + { + integrity: sha512-esfzZry+HfGgK/GCYkg7BRlLd3RH5aHa08wgLJPYjENXybi0BvXxGk0LbUj+lXfz2TkjPDHe4rB/o6JxRLHxBg==, + } + dependencies: + "@node-rs/argon2": 1.7.2 + "@node-rs/bcrypt": 1.9.2 + dev: false + + /oslo@1.0.2: + resolution: + { + integrity: sha512-yBoZN0sOL5eEngLR2tFMTk2YFBF7czq/3ASCTM0WizAnUTllVRetCAsmV2CMMfu699VIe7f6vhNgJ0bQ2ejedg==, + } + dependencies: + "@node-rs/argon2": 1.7.2 + "@node-rs/bcrypt": 1.9.2 + dev: false + + /p-limit@3.1.0: + resolution: + { + integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, + } + engines: { node: ">=10" } + dependencies: + yocto-queue: 0.1.0 + + /p-locate@5.0.0: + resolution: + { + integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, + } + engines: { node: ">=10" } + dependencies: + p-limit: 3.1.0 + + /parent-module@1.0.1: + resolution: + { + integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, + } + engines: { node: ">=6" } + dependencies: + callsites: 3.1.0 + + /parse-ms@3.0.0: + resolution: + { + integrity: sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==, + } + engines: { node: ">=12" } + dev: false + + /parse5@7.1.2: + resolution: + { + integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==, + } + dependencies: + entities: 4.5.0 + dev: false + + /path-exists@4.0.0: + resolution: + { + integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, + } + engines: { node: ">=8" } + + /path-is-absolute@1.0.1: + resolution: + { + integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, + } + engines: { node: ">=0.10.0" } + + /path-key@3.1.1: + resolution: + { + integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, + } + engines: { node: ">=8" } + + /path-parse@1.0.7: + resolution: + { + integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, + } + dev: true + + /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" } + dev: false + + /picocolors@1.0.0: + resolution: + { + integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==, + } + dev: false + + /picomatch@2.3.1: + resolution: + { + integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, + } + engines: { node: ">=8.6" } + + /postcss-nested@6.0.1(postcss@8.4.33): + resolution: + { + integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==, + } + engines: { node: ">=12.0" } + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.33 + postcss-selector-parser: 6.0.15 + dev: false + + /postcss-selector-parser@6.0.15: + resolution: + { + integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==, + } + engines: { node: ">=4" } + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: false + + /postcss@8.4.33: + resolution: + { + integrity: sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==, + } + engines: { node: ^10 || ^12 || >=14 } + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: false + + /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.54.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 + + /prelude-ls@1.2.1: + resolution: + { + integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, + } + engines: { node: ">= 0.8.0" } + + /prettier@3.2.4: + resolution: + { + integrity: sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==, + } + engines: { node: ">=14" } + hasBin: true + dev: false + + /pretty-bytes@6.1.1: + resolution: + { + integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==, + } + engines: { node: ^14.13.1 || >=16.0.0 } + dev: false + + /pretty-ms@8.0.0: + resolution: + { + integrity: sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==, + } + engines: { node: ">=14.16" } + dependencies: + parse-ms: 3.0.0 + dev: false + + /printable-characters@1.0.42: + resolution: + { + integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==, + } + dev: true + + /property-information@6.4.1: + resolution: + { + integrity: sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==, + } + dev: false + + /proxy-from-env@1.1.0: + resolution: + { + integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==, + } + 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" } + + /queue-microtask@1.2.3: + resolution: + { + integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, + } + + /rc@1.2.8: + resolution: + { + integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==, + } + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: false + + /readable-stream@3.6.2: + resolution: + { + integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, + } + engines: { node: ">= 6" } + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + + /readdirp@3.6.0: + resolution: + { + integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, + } + engines: { node: ">=8.10.0" } + dependencies: + picomatch: 2.3.1 + dev: true + + /regenerator-runtime@0.14.1: + resolution: + { + integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==, + } + dev: false + + /rehype-external-links@3.0.0: + resolution: + { + integrity: sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==, + } + dependencies: + "@types/hast": 3.0.3 + "@ungap/structured-clone": 1.2.0 + hast-util-is-element: 3.0.0 + is-absolute-url: 4.0.1 + space-separated-tokens: 2.0.2 + unist-util-visit: 5.0.0 + dev: false + + /rehype-format@5.0.0: + resolution: + { + integrity: sha512-kM4II8krCHmUhxrlvzFSptvaWh280Fr7UGNJU5DCMuvmAwGCNmGfi9CvFAQK6JDjsNoRMWQStglK3zKJH685Wg==, + } + dependencies: + "@types/hast": 3.0.3 + hast-util-embedded: 3.0.0 + hast-util-is-element: 3.0.0 + hast-util-phrasing: 3.0.1 + hast-util-whitespace: 3.0.0 + html-whitespace-sensitive-tag-names: 3.0.0 + rehype-minify-whitespace: 6.0.0 + unist-util-visit-parents: 6.0.1 + dev: false + + /rehype-highlight@7.0.0: + resolution: + { + integrity: sha512-QtobgRgYoQaK6p1eSr2SD1i61f7bjF2kZHAQHxeCHAuJf7ZUDMvQ7owDq9YTkmar5m5TSUol+2D3bp3KfJf/oA==, + } + dependencies: + "@types/hast": 3.0.3 + hast-util-to-text: 4.0.0 + lowlight: 3.1.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + dev: false + + /rehype-minify-whitespace@6.0.0: + resolution: + { + integrity: sha512-i9It4YHR0Sf3GsnlR5jFUKXRr9oayvEk9GKQUkwZv6hs70OH9q3OCZrq9PpLvIGKt3W+JxBOxCidNVpH/6rWdA==, + } + dependencies: + "@types/hast": 3.0.3 + hast-util-embedded: 3.0.0 + hast-util-is-element: 3.0.0 + hast-util-whitespace: 3.0.0 + unist-util-is: 6.0.0 + dev: false + + /rehype-sanitize@6.0.0: + resolution: + { + integrity: sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==, + } + dependencies: + "@types/hast": 3.0.3 + hast-util-sanitize: 5.0.1 + dev: false + + /rehype-slug-custom-id@1.1.0: + resolution: + { + integrity: sha512-lLdTHGd7u5bOXRDnD78/VHrVZsG63nN6lZUuQgcuupGt1+v+uDW7pCeQS0cvptRcZPYzg8B+0bf8sUiMBKsjZw==, + } + dependencies: + "@types/hast": 2.3.9 + github-slugger: 1.5.0 + hast-util-has-property: 2.0.1 + hast-util-heading-rank: 2.1.1 + hast-util-to-string: 2.0.0 + lodash: 4.17.21 + unified: 10.1.2 + unist-util-visit: 4.1.2 + dev: false + + /rehype-stringify@10.0.0: + resolution: + { + integrity: sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ==, + } + dependencies: + "@types/hast": 3.0.3 + hast-util-to-html: 9.0.0 + unified: 11.0.4 + dev: false + + /relative-time-format@1.1.6: + resolution: + { + integrity: sha512-aCv3juQw4hT1/P/OrVltKWLlp15eW1GRcwP1XdxHrPdZE9MtgqFpegjnTjLhi2m2WI9MT/hQQtE+tjEWG1hgkQ==, + } + dev: false + + /remark-gfm@4.0.0: + resolution: + { + integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==, + } + dependencies: + "@types/mdast": 4.0.3 + mdast-util-gfm: 3.0.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-parse@11.0.0: + resolution: + { + integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==, + } + dependencies: + "@types/mdast": 4.0.3 + mdast-util-from-markdown: 2.0.0 + micromark-util-types: 2.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-rehype@11.1.0: + resolution: + { + integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==, + } + dependencies: + "@types/hast": 3.0.3 + "@types/mdast": 4.0.3 + mdast-util-to-hast: 13.1.0 + unified: 11.0.4 + vfile: 6.0.1 + dev: false + + /remark-stringify@11.0.0: + resolution: + { + integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==, + } + dependencies: + "@types/mdast": 4.0.3 + mdast-util-to-markdown: 2.1.0 + unified: 11.0.4 + dev: false + + /require-from-string@2.0.2: + resolution: + { + integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==, + } + engines: { node: ">=0.10.0" } + dev: false + + /resolve-from@4.0.0: + resolution: + { + integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, + } + engines: { node: ">=4" } + + /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" } + dev: true + + /resolve@1.22.8: + resolution: + { + integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==, + } + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /reusify@1.0.4: + resolution: + { + integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, + } + engines: { iojs: ">=1.0.0", node: ">=0.10.0" } + + /rimraf@3.0.2: + resolution: + { + integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, + } + hasBin: true + dependencies: + glob: 7.2.3 + + /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. + 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 + dev: true + + /run-parallel@1.2.0: + resolution: + { + integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, + } + dependencies: + queue-microtask: 1.2.3 + + /safe-buffer@5.2.1: + resolution: + { + integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, + } + dev: false + + /selfsigned@2.4.1: + resolution: + { + integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==, + } + engines: { node: ">=10" } + dependencies: + "@types/node-forge": 1.3.11 + node-forge: 1.3.1 + dev: true + + /semver@7.5.4: + resolution: + { + integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==, + } + engines: { node: ">=10" } + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /shebang-command@2.0.0: + resolution: + { + integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, + } + engines: { node: ">=8" } + dependencies: + shebang-regex: 3.0.0 + + /shebang-regex@3.0.0: + resolution: + { + integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, + } + engines: { node: ">=8" } + + /simple-concat@1.0.1: + resolution: + { + integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==, + } + dev: false + + /simple-get@4.0.1: + resolution: + { + integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==, + } + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + 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: false + + /source-map-js@1.0.2: + resolution: + { + integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==, + } + engines: { node: ">=0.10.0" } + dev: false + + /source-map-support@0.5.21: + resolution: + { + integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, + } + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map@0.6.1: + resolution: + { + integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, + } + engines: { node: ">=0.10.0" } + dev: true + + /sourcemap-codec@1.4.8: + resolution: + { + integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==, + } + deprecated: Please use @jridgewell/sourcemap-codec instead + dev: true + + /space-separated-tokens@2.0.2: + resolution: + { + integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==, + } + dev: false + + /sprintf-js@1.0.3: + resolution: + { + integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==, + } + dev: false + + /stacktracey@2.1.8: + resolution: + { + integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==, + } + dependencies: + as-table: 1.0.55 + get-source: 2.0.12 + dev: true + + /stoppable@1.1.0: + resolution: + { + integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==, + } + engines: { node: ">=4", npm: ">=6" } + dev: true + + /string_decoder@1.3.0: + resolution: + { + integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, + } + dependencies: + safe-buffer: 5.2.1 + dev: false + + /stringify-entities@4.0.3: + resolution: + { + integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==, + } + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + dev: false + + /stringify-object@3.3.0: + resolution: + { + integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==, + } + engines: { node: ">=4" } + dependencies: + get-own-enumerable-property-symbols: 3.0.2 + is-obj: 1.0.1 + is-regexp: 1.0.0 + dev: false + + /strip-ansi@6.0.1: + resolution: + { + integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, + } + engines: { node: ">=8" } + dependencies: + ansi-regex: 5.0.1 + + /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" } + + /style-mod@4.1.0: + resolution: + { + integrity: sha512-Ca5ib8HrFn+f+0n4N4ScTIA9iTOQ7MaGS1ylHcoVqW9J7w2w8PzN6g9gKmTYgGEBH8e120+RCmhpje6jC5uGWA==, + } + dev: false + + /superjson@2.2.1: + resolution: + { + integrity: sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==, + } + engines: { node: ">=16" } + dependencies: + copy-anything: 3.0.5 + dev: true + + /supports-color@7.2.0: + resolution: + { + integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, + } + engines: { node: ">=8" } + dependencies: + has-flag: 4.0.0 + + /supports-preserve-symlinks-flag@1.0.0: + resolution: + { + integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, + } + engines: { node: ">= 0.4" } + dev: true + + /tailwind-merge@2.2.1: + resolution: + { + integrity: sha512-o+2GTLkthfa5YUt4JxPfzMIpQzZ3adD1vLVkvKE1Twl9UAhGsEbIZhHHZVRttyW177S8PDJI3bTQNaebyofK3Q==, + } + dependencies: + "@babel/runtime": 7.23.9 + dev: false + + /tar-fs@2.1.1: + resolution: + { + integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==, + } + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: false + + /tar-stream@2.2.0: + resolution: + { + integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==, + } + engines: { node: ">=6" } + 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 + + /text-table@0.2.0: + resolution: + { + integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, + } + + /timers-ext@0.1.7: + resolution: + { + integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==, + } + dependencies: + es5-ext: 0.10.62 + next-tick: 1.1.0 + dev: true + + /to-fast-properties@2.0.0: + resolution: + { + integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==, + } + engines: { node: ">=4" } + dev: false + + /to-regex-range@5.0.1: + resolution: + { + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, + } + engines: { node: ">=8.0" } + dependencies: + is-number: 7.0.0 + + /tr46@0.0.3: + resolution: + { + integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, + } + dev: false + + /trim-lines@3.0.1: + resolution: + { + integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==, + } + dev: false + + /trough@2.1.0: + resolution: + { + integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==, + } + dev: false + + /ts-api-utils@1.0.3(typescript@5.3.3): + resolution: + { + integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==, + } + engines: { node: ">=16.13.0" } + peerDependencies: + typescript: ">=4.2.0" + dependencies: + typescript: 5.3.3 + dev: false + + /tslib@2.6.2: + resolution: + { + integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==, + } + + /tsx@4.7.0: + resolution: + { + integrity: sha512-I+t79RYPlEYlHn9a+KzwrvEwhJg35h/1zHsLC2JXvhC2mdynMv6Zxzvhv5EMV6VF5qJlLlkSnMVvdZV3PSIGcg==, + } + engines: { node: ">=18.0.0" } + hasBin: true + dependencies: + esbuild: 0.19.12 + get-tsconfig: 4.7.2 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /tunnel-agent@0.6.0: + resolution: + { + integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==, + } + dependencies: + safe-buffer: 5.2.1 + dev: false + + /type-check@0.4.0: + resolution: + { + integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, + } + engines: { node: ">= 0.8.0" } + dependencies: + prelude-ls: 1.2.1 + + /type-fest@0.20.2: + resolution: + { + integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==, + } + engines: { node: ">=10" } + + /type@1.2.0: + resolution: + { + integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==, + } + dev: true + + /type@2.7.2: + resolution: + { + integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==, + } + dev: true + + /typescript@5.3.3: + resolution: + { + integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==, + } + engines: { node: ">=14.17" } + hasBin: true + + /undici-types@5.26.5: + resolution: + { + integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==, + } + + /undici@5.28.2: + resolution: + { + integrity: sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==, + } + engines: { node: ">=14.0" } + dependencies: + "@fastify/busboy": 2.1.0 + dev: true + + /unhead@1.8.10: + resolution: + { + integrity: sha512-dth8FvZkLriO5ZWWOBIYBNSfGiwJtKcqpPWpSOk/Z0e2jdlgwoZEWZHFyte0EKvmbZxKcsWNMqIuv7dEmS5yZQ==, + } + dependencies: + "@unhead/dom": 1.8.10 + "@unhead/schema": 1.8.10 + "@unhead/shared": 1.8.10 + hookable: 5.5.3 + dev: false + + /unified@10.1.2: + resolution: + { + integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==, + } + dependencies: + "@types/unist": 2.0.10 + bail: 2.0.2 + extend: 3.0.2 + is-buffer: 2.0.5 + is-plain-obj: 4.1.0 + trough: 2.1.0 + vfile: 5.3.7 + dev: false + + /unified@11.0.4: + resolution: + { + integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==, + } + dependencies: + "@types/unist": 3.0.2 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.1.0 + vfile: 6.0.1 + dev: false + + /unist-util-find-after@5.0.0: + resolution: + { + integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==, + } + dependencies: + "@types/unist": 3.0.2 + unist-util-is: 6.0.0 + dev: false + + /unist-util-is@5.2.1: + resolution: + { + integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==, + } + dependencies: + "@types/unist": 2.0.10 + dev: false + + /unist-util-is@6.0.0: + resolution: + { + integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==, + } + dependencies: + "@types/unist": 3.0.2 + dev: false + + /unist-util-position@5.0.0: + resolution: + { + integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==, + } + dependencies: + "@types/unist": 3.0.2 + dev: false + + /unist-util-stringify-position@3.0.3: + resolution: + { + integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==, + } + dependencies: + "@types/unist": 2.0.10 + dev: false + + /unist-util-stringify-position@4.0.0: + resolution: + { + integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==, + } + dependencies: + "@types/unist": 3.0.2 + dev: false + + /unist-util-visit-parents@5.1.3: + resolution: + { + integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==, + } + dependencies: + "@types/unist": 2.0.10 + unist-util-is: 5.2.1 + dev: false + + /unist-util-visit-parents@6.0.1: + resolution: + { + integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==, + } + dependencies: + "@types/unist": 3.0.2 + unist-util-is: 6.0.0 + dev: false + + /unist-util-visit@4.1.2: + resolution: + { + integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==, + } + dependencies: + "@types/unist": 2.0.10 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + dev: false + + /unist-util-visit@5.0.0: + resolution: + { + integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==, + } + dependencies: + "@types/unist": 3.0.2 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + dev: false + + /uri-js@4.4.1: + resolution: + { + integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, + } + dependencies: + punycode: 2.3.1 + + /util-deprecate@1.0.2: + resolution: + { + integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, + } + dev: false + + /uuid@8.3.2: + resolution: + { + integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==, + } + hasBin: true + dev: false + + /vfile-location@5.0.2: + resolution: + { + integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==, + } + dependencies: + "@types/unist": 3.0.2 + vfile: 6.0.1 + dev: false + + /vfile-message@3.1.4: + resolution: + { + integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==, + } + dependencies: + "@types/unist": 2.0.10 + unist-util-stringify-position: 3.0.3 + dev: false + + /vfile-message@4.0.2: + resolution: + { + integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==, + } + dependencies: + "@types/unist": 3.0.2 + unist-util-stringify-position: 4.0.0 + dev: false + + /vfile@5.3.7: + resolution: + { + integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==, + } + dependencies: + "@types/unist": 2.0.10 + is-buffer: 2.0.5 + unist-util-stringify-position: 3.0.3 + vfile-message: 3.1.4 + dev: false + + /vfile@6.0.1: + resolution: + { + integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==, + } + dependencies: + "@types/unist": 3.0.2 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + dev: false + + /vue-demi@0.14.6(vue@3.4.15): + resolution: + { + integrity: sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==, + } + engines: { node: ">=12" } + hasBin: true + requiresBuild: true + peerDependencies: + "@vue/composition-api": ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + "@vue/composition-api": + optional: true + dependencies: + vue: 3.4.15(typescript@5.3.3) + dev: false + + /vue@3.4.15(typescript@5.3.3): + resolution: + { + integrity: sha512-jC0GH4KkWLWJOEQjOpkqU1bQsBwf4R1rsFtw5GQJbjHVKWDzO6P0nWWBTmjp1xSemAioDFj1jdaK1qa3DnMQoQ==, + } + peerDependencies: + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@vue/compiler-dom": 3.4.15 + "@vue/compiler-sfc": 3.4.15 + "@vue/runtime-dom": 3.4.15 + "@vue/server-renderer": 3.4.15(vue@3.4.15) + "@vue/shared": 3.4.15 + typescript: 5.3.3 + dev: false + + /w3c-keyname@2.2.8: + resolution: + { + integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==, + } + dev: false + + /web-namespaces@2.0.1: + resolution: + { + integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==, + } + dev: false + + /web-streams-polyfill@3.3.2: + resolution: + { + integrity: sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ==, + } + engines: { node: ">= 8" } + dev: false + + /web-streams-polyfill@4.0.0-beta.3: + resolution: + { + integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==, + } + engines: { node: ">= 14" } + dev: false + + /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@2.0.2: + resolution: + { + integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, + } + engines: { node: ">= 8" } + hasBin: true + dependencies: + isexe: 2.0.0 + + /wordwrap@1.0.0: + resolution: + { + integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==, + } + dev: true + + /workerd@1.20231218.0: + resolution: + { + integrity: sha512-AGIsDvqCrcwhoA9kb1hxOhVAe53/xJeaGZxL4FbYI9FvO17DZwrnqGq+6eqItJ6Cfw1ZLmf3BM+QdMWaL2bFWQ==, + } + engines: { node: ">=16" } + hasBin: true + requiresBuild: true + optionalDependencies: + "@cloudflare/workerd-darwin-64": 1.20231218.0 + "@cloudflare/workerd-darwin-arm64": 1.20231218.0 + "@cloudflare/workerd-linux-64": 1.20231218.0 + "@cloudflare/workerd-linux-arm64": 1.20231218.0 + "@cloudflare/workerd-windows-64": 1.20231218.0 + dev: true + + /wrangler@3.25.0: + resolution: + { + integrity: sha512-eU47Ez1QLu1B/wutm5ow+VwZnY4OqA+D/iy6BORAu5tABujoDr9p1yBxY/1DS/DxxDWqqY3sBBS6TzcC4NSLUQ==, + } + engines: { node: ">=16.17.0" } + hasBin: true + 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.20231218.4 + nanoid: 3.3.7 + path-to-regexp: 6.2.1 + resolve: 1.22.8 + resolve.exports: 2.0.2 + selfsigned: 2.4.1 + source-map: 0.6.1 + xxhash-wasm: 1.0.2 + optionalDependencies: + fsevents: 2.3.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /wrappy@1.0.2: + resolution: + { + integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, + } + + /ws@8.16.0: + resolution: + { + integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==, + } + engines: { node: ">=10.0.0" } + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + /xxhash-wasm@1.0.2: + resolution: + { + integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==, + } + dev: true + + /yallist@4.0.0: + resolution: + { + integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, + } + + /yaml@2.3.4: + resolution: + { + integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==, + } + engines: { node: ">= 14" } + + /yocto-queue@0.1.0: + resolution: + { + integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, + } + engines: { node: ">=10" } + + /youch@3.3.3: + resolution: + { + integrity: sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==, + } + dependencies: + cookie: 0.5.0 + mustache: 4.2.0 + stacktracey: 2.1.8 + dev: true + + /zhead@2.2.4: + resolution: + { + integrity: sha512-8F0OI5dpWIA5IGG5NHUg9staDwz/ZPxZtvGVf01j7vHqSyZ0raHY+78atOVxRqb73AotX22uV1pXt3gYSstGag==, + } + dev: false + + /zod-error@1.5.0: + resolution: + { + integrity: sha512-zzopKZ/skI9iXpqCEPj+iLCKl9b88E43ehcU+sbRoHuwGd9F1IDVGQ70TyO6kmfiRL1g4IXkjsXK+g1gLYl4WQ==, + } + dependencies: + zod: 3.22.4 + dev: false + + /zod@3.22.4: + resolution: + { + integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==, + } + + /zwitch@2.0.4: + resolution: + { + integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==, + } + dev: false diff --git a/src/index.ts b/src/index.ts index ada8853..821e6ff 100644 --- a/src/index.ts +++ b/src/index.ts @@ -25,22 +25,22 @@ app.get( }) ) -app.use("*", csrf({ origin: "*" })) app.use("*", rateLimit(60, 100)) +app.use("*", csrf({ origin: "*" })) app.use("*", prettyJSON({ space: 4 })) - -// v2 API routes -app.route("/v2", BaseRoutes) - app.use( "*", cors({ - // todo(dromzeh): THIS IS TEMPORARY BTW PLEASE SET THIS DEPENDENT ON ENV + // todo(dromzeh): this should be set dependant on ENV, PROD or DEV w/ next() for context origin: "*", credentials: true, }) ) + +// v2 API routes +app.route("/v2", BaseRoutes) + app.notFound((ctx) => { return ctx.json( { From 24f5666085c33e0c4d95159022633ac551eb0411 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Tue, 6 Feb 2024 12:16:16 +0000 Subject: [PATCH 247/318] remove roleflags in favour of role type --- package.json | 1 - pnpm-lock.yaml | 17 +----- src/index.ts | 1 - src/scripts/seed/seed.ts | 9 +-- src/v2/db/schema/user/user.ts | 13 +++-- .../lib/auth/definitions/auth-definitions.ts | 5 +- src/v2/lib/auth/lucia.ts | 5 +- src/v2/lib/helpers/role-flags.ts | 55 ------------------- src/v2/lib/managers/asset/asset-manager.ts | 2 +- .../lib/managers/user/user-search-manager.ts | 6 +- src/v2/routes/asset/get/id/[id]/schema.ts | 2 +- src/v2/routes/asset/modify/id/[id]/route.ts | 6 +- src/v2/routes/asset/upload/route.ts | 8 ++- src/v2/routes/contributors/get/all/openapi.ts | 2 +- src/v2/routes/contributors/get/all/route.ts | 2 +- src/v2/routes/game/create/route.ts | 3 +- src/v2/routes/game/delete/id/[id]/route.ts | 3 +- src/v2/routes/game/modify/id/[id]/route.ts | 3 +- src/v2/routes/user/get/id/[id]/schema.ts | 2 +- .../user/get/username/[username]/schema.ts | 2 +- .../user/search/username/[username]/schema.ts | 2 +- 21 files changed, 36 insertions(+), 113 deletions(-) delete mode 100644 src/v2/lib/helpers/role-flags.ts diff --git a/package.json b/package.json index 3bb0726..76065ae 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,6 @@ "drizzle:studio": "drizzle-kit studio --port 7331 --host 127.0.0.1 --verbose" }, "devDependencies": { - "@asteasolutions/zod-to-openapi": "^6.3.1", "@cloudflare/workers-types": "^4.20240117.0", "@types/node": "^20.11.8", "dotenv": "^16.4.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 27357cc..42ae166 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -58,9 +58,6 @@ dependencies: version: 1.5.0 devDependencies: - "@asteasolutions/zod-to-openapi": - specifier: ^6.3.1 - version: 6.3.1(zod@3.22.4) "@cloudflare/workers-types": specifier: ^4.20240117.0 version: 4.20240117.0 @@ -156,18 +153,6 @@ packages: zod: 3.22.4 dev: false - /@asteasolutions/zod-to-openapi@6.3.1(zod@3.22.4): - resolution: - { - integrity: sha512-1CRWBqslgdBpZeJnxxksGirAQ39Iztxk+LzTkYwoP0mNzuaULa604s8Xc5V9yzmYccwJ89O9fPQgxCkbNN398g==, - } - peerDependencies: - zod: ^3.20.2 - dependencies: - openapi3-ts: 4.2.1 - zod: 3.22.4 - dev: true - /@axiomhq/js@1.0.0-rc.1: resolution: { @@ -6127,6 +6112,7 @@ packages: } dependencies: yaml: 2.3.4 + dev: false /optionator@0.9.3: resolution: @@ -7509,6 +7495,7 @@ packages: integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==, } engines: { node: ">= 14" } + dev: false /yocto-queue@0.1.0: resolution: diff --git a/src/index.ts b/src/index.ts index 821e6ff..14f09e6 100644 --- a/src/index.ts +++ b/src/index.ts @@ -37,7 +37,6 @@ app.use( }) ) - // v2 API routes app.route("/v2", BaseRoutes) diff --git a/src/scripts/seed/seed.ts b/src/scripts/seed/seed.ts index 734f0a6..a0d9cf3 100644 --- a/src/scripts/seed/seed.ts +++ b/src/scripts/seed/seed.ts @@ -51,9 +51,8 @@ async function main() { emailVerified: 1, usernameColour: "#84E6F8", bio: "test bio", - roleFlags: 127, + role: "creator", isContributor: true, - selfAssignableRoleFlags: 0, }, { username: "testuser2", @@ -61,18 +60,16 @@ async function main() { emailVerified: 1, bio: "test bio 2", pronouns: "he/him/his", - roleFlags: 1, + role: "uploader", isContributor: false, - selfAssignableRoleFlags: 0, }, { username: "testuser3", email: "testuser3@wanderer.moe", emailVerified: 1, bio: "test bio 3", - roleFlags: 1, + role: "uploader", isContributor: false, - selfAssignableRoleFlags: 0, }, ]) .returning() diff --git a/src/v2/db/schema/user/user.ts b/src/v2/db/schema/user/user.ts index 7d66ed1..71f3f8f 100644 --- a/src/v2/db/schema/user/user.ts +++ b/src/v2/db/schema/user/user.ts @@ -30,6 +30,13 @@ NOTE: Very basic user information - Keys table is login methods (i.e Credentials, OAuth, etc.) */ +export type UserRoles = + | "creator" + | "staff" + | "contributor" + | "uploader" + | "user" + export const authUser = sqliteTable( tableNames.authUser, { @@ -57,17 +64,13 @@ export const authUser = sqliteTable( isSupporter: integer("is_supporter", { mode: "boolean" }) .default(false) .notNull(), - supporterExpiresAt: text("supporter_expires_at"), isBanned: integer("is_banned", { mode: "boolean" }) .default(false) .notNull(), isContributor: integer("is_contributor", { mode: "boolean" }) .default(false) .notNull(), - roleFlags: integer("role_flags").default(1).notNull(), - selfAssignableRoleFlags: integer("self_assignable_role_flags") - .default(0) - .notNull(), + role: text("role").notNull().default("user").$type(), }, (user) => { return { diff --git a/src/v2/lib/auth/definitions/auth-definitions.ts b/src/v2/lib/auth/definitions/auth-definitions.ts index dbad3c8..2dcd0d6 100644 --- a/src/v2/lib/auth/definitions/auth-definitions.ts +++ b/src/v2/lib/auth/definitions/auth-definitions.ts @@ -1,3 +1,4 @@ +import { UserRoles } from "@/v2/db/schema" import type { LuciaAuth } from "../lucia" declare module "lucia" { @@ -21,11 +22,9 @@ declare module "lucia" { bio: string | null date_joined: string is_supporter: boolean - supporter_expires_at: string | null is_banned: boolean - role_flags: number + role: UserRoles is_contributor: boolean - self_assignable_role_flags: number | null } } } diff --git a/src/v2/lib/auth/lucia.ts b/src/v2/lib/auth/lucia.ts index 0fdd2fa..32cb28d 100644 --- a/src/v2/lib/auth/lucia.ts +++ b/src/v2/lib/auth/lucia.ts @@ -2,6 +2,7 @@ import { Lucia } from "lucia" import { getConnection } from "@/v2/db/turso" import { tableNames } from "@/v2/db/drizzle" import { LibSQLAdapter } from "@lucia-auth/adapter-sqlite" +import { UserRoles } from "@/v2/db/schema" export function luciaAuth(env: Bindings) { const { turso } = getConnection(env) @@ -29,11 +30,9 @@ export function luciaAuth(env: Bindings) { bio: user.bio, dateJoined: user.date_joined, isSupporter: Boolean(user.is_supporter), - supporterExpiresAt: user.supporter_expires_at, isBanned: Boolean(user.is_banned), isContributor: user.is_contributor, - roleFlags: user.role_flags, - selfAssignableRoleFlags: user.self_assignable_role_flags, + role: user.role as UserRoles, } }, getSessionAttributes: (session) => { diff --git a/src/v2/lib/helpers/role-flags.ts b/src/v2/lib/helpers/role-flags.ts deleted file mode 100644 index 57bcfdd..0000000 --- a/src/v2/lib/helpers/role-flags.ts +++ /dev/null @@ -1,55 +0,0 @@ -/** - * An object containing the bitwise values for permission-based roles. - */ -export const roleFlags = { - USER: 1 << 0, - UPLOADER: 1 << 1, - CONTRIBUTOR: 1 << 2, - TRANSLATOR: 1 << 3, - STAFF: 1 << 4, - DEVELOPER: 1 << 5, - CREATOR: 1 << 6, -} - -/** - * Converts a role flags integer to an array of role names. - * @param roleFlagsInt - The role flags integer to convert. - * @returns An array of role names. - */ -export const roleFlagsToArray = (roleFlagsInt: number): string[] => { - const roles: string[] = [] - - for (const [role, flag] of Object.entries(roleFlags)) { - if (roleFlagsInt & flag) roles.push(role) - } - - return roles -} - -/** - * An object containing the bitwise values for self-assignable roles. - */ -export const SelfAssignableRoleFlags = { - CONTENT_CREATOR: 1 << 0, - ARTIST: 1 << 1, - WRITER: 1 << 2, - PROGRAMMER: 1 << 3, - DESIGNER: 1 << 4, -} - -/** - * Converts a self-assignable role flags integer to an array of role names. - * @param roleFlagsInt - The self-assignable role flags integer to convert. - * @returns An array of role names. - */ -export const SelfAssignableRoleFlagsToArray = ( - roleFlagsInt: number -): string[] => { - const roles: string[] = [] - - for (const [role, flag] of Object.entries(SelfAssignableRoleFlags)) { - if (roleFlagsInt & flag) roles.push(role) - } - - return roles -} diff --git a/src/v2/lib/managers/asset/asset-manager.ts b/src/v2/lib/managers/asset/asset-manager.ts index f0879fa..2a088d7 100644 --- a/src/v2/lib/managers/asset/asset-manager.ts +++ b/src/v2/lib/managers/asset/asset-manager.ts @@ -88,7 +88,7 @@ export class AssetManager { bio: true, dateJoined: true, isSupporter: true, - roleFlags: true, + role: true, }, }, game: true, diff --git a/src/v2/lib/managers/user/user-search-manager.ts b/src/v2/lib/managers/user/user-search-manager.ts index 7b1e7cc..30b0df1 100644 --- a/src/v2/lib/managers/user/user-search-manager.ts +++ b/src/v2/lib/managers/user/user-search-manager.ts @@ -28,7 +28,7 @@ export class UserSearchManager { bio: authUser.bio, dateJoined: authUser.dateJoined, isSupporter: authUser.isSupporter, - roleFlags: authUser.roleFlags, + role: authUser.role, }) .from(authUser) .where(eq(authUser.id, userId)) @@ -74,7 +74,7 @@ export class UserSearchManager { bio: authUser.bio, dateJoined: authUser.dateJoined, isSupporter: authUser.isSupporter, - roleFlags: authUser.roleFlags, + role: authUser.role, }) .from(authUser) .where(eq(authUser.username, username)) @@ -106,7 +106,7 @@ export class UserSearchManager { bio: authUser.bio, dateJoined: authUser.dateJoined, isSupporter: authUser.isSupporter, - roleFlags: authUser.roleFlags, + role: authUser.role, }) .from(authUser) .where(or(like(authUser.username, `%${username}%`))) diff --git a/src/v2/routes/asset/get/id/[id]/schema.ts b/src/v2/routes/asset/get/id/[id]/schema.ts index dc4405f..39fc678 100644 --- a/src/v2/routes/asset/get/id/[id]/schema.ts +++ b/src/v2/routes/asset/get/id/[id]/schema.ts @@ -40,7 +40,7 @@ export const getAssetByIdResponseSchema = z.object({ bio: true, dateJoined: true, isSupporter: true, - roleFlags: true, + role: true, }), game: selectGameSchema, assetCategory: selectAssetCategorySchema, diff --git a/src/v2/routes/asset/modify/id/[id]/route.ts b/src/v2/routes/asset/modify/id/[id]/route.ts index faea299..558cb16 100644 --- a/src/v2/routes/asset/modify/id/[id]/route.ts +++ b/src/v2/routes/asset/modify/id/[id]/route.ts @@ -1,7 +1,6 @@ import { OpenAPIHono } from "@hono/zod-openapi" import { getConnection } from "@/v2/db/turso" import { modifyAssetRoute } from "./openapi" -import { roleFlagsToArray } from "@/v2/lib/helpers/role-flags" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" import { AssetManager } from "@/v2/lib/managers/asset/asset-manager" import { asset } from "@/v2/db/schema" @@ -47,10 +46,7 @@ handler.openapi(modifyAssetRoute, async (ctx) => { .from(asset) .where(eq(asset.id, parseInt(id))) - if ( - assetUser.uploadedById !== user.id || - !roleFlagsToArray(user.roleFlags).includes("DEVELOPER") - ) { + if (assetUser.uploadedById !== user.id || user.role != "creator") { return ctx.json( { success: false, diff --git a/src/v2/routes/asset/upload/route.ts b/src/v2/routes/asset/upload/route.ts index 1ea19cd..4e7b540 100644 --- a/src/v2/routes/asset/upload/route.ts +++ b/src/v2/routes/asset/upload/route.ts @@ -3,8 +3,6 @@ import { uploadAssetRoute } from "./openapi" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" import { AssetManager } from "@/v2/lib/managers/asset/asset-manager" import { getConnection } from "@/v2/db/turso" -import { roleFlagsToArray } from "@/v2/lib/helpers/role-flags" - const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.openapi(uploadAssetRoute, async (ctx) => { @@ -25,7 +23,11 @@ handler.openapi(uploadAssetRoute, async (ctx) => { ) } - if (!roleFlagsToArray(user.roleFlags).includes("CONTRIBUTOR")) { + if ( + user.role != "creator" && + user.role != "contributor" && + user.role != "staff" + ) { return ctx.json( { success: false, diff --git a/src/v2/routes/contributors/get/all/openapi.ts b/src/v2/routes/contributors/get/all/openapi.ts index 97e9e8d..ef684ae 100644 --- a/src/v2/routes/contributors/get/all/openapi.ts +++ b/src/v2/routes/contributors/get/all/openapi.ts @@ -10,7 +10,7 @@ const contributorListSchema = z.object({ username: true, avatarUrl: true, isSupporter: true, - roleFlags: true, + role: true, }) .array(), }) diff --git a/src/v2/routes/contributors/get/all/route.ts b/src/v2/routes/contributors/get/all/route.ts index 3a49a37..60b1a10 100644 --- a/src/v2/routes/contributors/get/all/route.ts +++ b/src/v2/routes/contributors/get/all/route.ts @@ -15,7 +15,7 @@ handler.openapi(contributorsRoute, async (ctx) => { username: authUser.username, avatarUrl: authUser.avatarUrl, isSupporter: authUser.isSupporter, - roleFlags: authUser.roleFlags, + role: authUser.role, }) .from(authUser) .where(eq(authUser.isContributor, true)) diff --git a/src/v2/routes/game/create/route.ts b/src/v2/routes/game/create/route.ts index bb89f0c..3708e9c 100644 --- a/src/v2/routes/game/create/route.ts +++ b/src/v2/routes/game/create/route.ts @@ -2,7 +2,6 @@ import { OpenAPIHono } from "@hono/zod-openapi" import { createGameRoute } from "./openapi" import { GameManager } from "@/v2/lib/managers/game/game-manager" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" -import { roleFlagsToArray } from "@/v2/lib/helpers/role-flags" import { getConnection } from "@/v2/db/turso" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() @@ -12,7 +11,7 @@ handler.openapi(createGameRoute, async (ctx) => { const { user } = await authSessionManager.validateSession() - if (!user || !roleFlagsToArray(user.roleFlags).includes("DEVELOPER")) { + if (!user || user.role != "creator") { return ctx.json( { success: false, diff --git a/src/v2/routes/game/delete/id/[id]/route.ts b/src/v2/routes/game/delete/id/[id]/route.ts index f821206..83baec5 100644 --- a/src/v2/routes/game/delete/id/[id]/route.ts +++ b/src/v2/routes/game/delete/id/[id]/route.ts @@ -3,7 +3,6 @@ import { deleteGameRoute } from "./openapi" import { GameManager } from "@/v2/lib/managers/game/game-manager" import { getConnection } from "@/v2/db/turso" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" -import { roleFlagsToArray } from "@/v2/lib/helpers/role-flags" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() @@ -37,7 +36,7 @@ handler.openapi(deleteGameRoute, async (ctx) => { ) } - if (!roleFlagsToArray(user.roleFlags).includes("DEVELOPER")) { + if (user.role != "creator") { return ctx.json( { success: false, diff --git a/src/v2/routes/game/modify/id/[id]/route.ts b/src/v2/routes/game/modify/id/[id]/route.ts index 647ba31..13a26e0 100644 --- a/src/v2/routes/game/modify/id/[id]/route.ts +++ b/src/v2/routes/game/modify/id/[id]/route.ts @@ -2,7 +2,6 @@ import { OpenAPIHono } from "@hono/zod-openapi" import { modifyGameRoute } from "./openapi" import { GameManager } from "@/v2/lib/managers/game/game-manager" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" -import { roleFlagsToArray } from "@/v2/lib/helpers/role-flags" import { getConnection } from "@/v2/db/turso" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() @@ -12,7 +11,7 @@ handler.openapi(modifyGameRoute, async (ctx) => { const { user } = await authSessionManager.validateSession() - if (!user || !roleFlagsToArray(user.roleFlags).includes("DEVELOPER")) { + if (!user || user.role != "creator") { return ctx.json( { success: false, diff --git a/src/v2/routes/user/get/id/[id]/schema.ts b/src/v2/routes/user/get/id/[id]/schema.ts index 58328e9..50a9d1c 100644 --- a/src/v2/routes/user/get/id/[id]/schema.ts +++ b/src/v2/routes/user/get/id/[id]/schema.ts @@ -25,6 +25,6 @@ export const getUserByIdResponseSchema = z.object({ bio: true, dateJoined: true, isSupporter: true, - roleFlags: true, + role: true, }), }) diff --git a/src/v2/routes/user/get/username/[username]/schema.ts b/src/v2/routes/user/get/username/[username]/schema.ts index 6e871c1..d7def62 100644 --- a/src/v2/routes/user/get/username/[username]/schema.ts +++ b/src/v2/routes/user/get/username/[username]/schema.ts @@ -25,6 +25,6 @@ export const getUserByNameResponseSchema = z.object({ bio: true, dateJoined: true, isSupporter: true, - roleFlags: true, + role: true, }), }) diff --git a/src/v2/routes/user/search/username/[username]/schema.ts b/src/v2/routes/user/search/username/[username]/schema.ts index ff1ba9e..3ff8bbc 100644 --- a/src/v2/routes/user/search/username/[username]/schema.ts +++ b/src/v2/routes/user/search/username/[username]/schema.ts @@ -26,7 +26,7 @@ export const searchUsersByUsernameSchema = z.object({ bio: true, dateJoined: true, isSupporter: true, - roleFlags: true, + role: true, }) .array(), }) From 83dbe28021cdab77db61554f4e692e316251ef28 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Tue, 6 Feb 2024 12:40:02 +0000 Subject: [PATCH 248/318] request form schema --- README.md | 2 +- package.json | 1 + pnpm-lock.yaml | 17 +++- src/v2/db/drizzle.ts | 2 + src/v2/db/schema.ts | 2 + src/v2/db/schema/supporter/request-form.ts | 110 +++++++++++++++++++++ src/v2/db/schema/user/user.ts | 3 + src/v2/middleware/ratelimit/limiter.ts | 4 +- 8 files changed, 136 insertions(+), 5 deletions(-) create mode 100644 src/v2/db/schema/supporter/request-form.ts diff --git a/README.md b/README.md index fc3ccf2..823bf55 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ ![Quality] -Source code for the API powering [**wanderer.moe**](https://wanderer.moe) — using **Cloudflare Workers** and **Hono** with **R2 Storage** for the CDN, **Turso** and **Drizzle**. +Source code for the API powering [**wanderer.moe**](https://wanderer.moe) — using **Cloudflare Workers** and **Hono** with **R2 Storage** for the CDN, **Turso** and **Drizzle**. Durable Objects are used for rate limiting requests. diff --git a/package.json b/package.json index 76065ae..3bb0726 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "drizzle:studio": "drizzle-kit studio --port 7331 --host 127.0.0.1 --verbose" }, "devDependencies": { + "@asteasolutions/zod-to-openapi": "^6.3.1", "@cloudflare/workers-types": "^4.20240117.0", "@types/node": "^20.11.8", "dotenv": "^16.4.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 42ae166..27357cc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -58,6 +58,9 @@ dependencies: version: 1.5.0 devDependencies: + "@asteasolutions/zod-to-openapi": + specifier: ^6.3.1 + version: 6.3.1(zod@3.22.4) "@cloudflare/workers-types": specifier: ^4.20240117.0 version: 4.20240117.0 @@ -153,6 +156,18 @@ packages: zod: 3.22.4 dev: false + /@asteasolutions/zod-to-openapi@6.3.1(zod@3.22.4): + resolution: + { + integrity: sha512-1CRWBqslgdBpZeJnxxksGirAQ39Iztxk+LzTkYwoP0mNzuaULa604s8Xc5V9yzmYccwJ89O9fPQgxCkbNN398g==, + } + peerDependencies: + zod: ^3.20.2 + dependencies: + openapi3-ts: 4.2.1 + zod: 3.22.4 + dev: true + /@axiomhq/js@1.0.0-rc.1: resolution: { @@ -6112,7 +6127,6 @@ packages: } dependencies: yaml: 2.3.4 - dev: false /optionator@0.9.3: resolution: @@ -7495,7 +7509,6 @@ packages: integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==, } engines: { node: ">= 14" } - dev: false /yocto-queue@0.1.0: resolution: diff --git a/src/v2/db/drizzle.ts b/src/v2/db/drizzle.ts index 00c358c..ea92129 100644 --- a/src/v2/db/drizzle.ts +++ b/src/v2/db/drizzle.ts @@ -27,4 +27,6 @@ export const tableNames = { userCollection: "userCollection", userCollectionAsset: "userCollectionAsset", socialsConnection: "socialsConnection", + requestForm: "requestForm", + requestFormUpvotes: "requestFormUpvotes", } diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index 79eb213..06d7e17 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -19,3 +19,5 @@ export * from "./schema/user/user-favorites" export * from "./schema/user/user-following" export * from "./schema/collections/user-collection-likes" export * from "./schema/collections/user-collections-collaborators" + +export * from "./schema/supporter/request-form" diff --git a/src/v2/db/schema/supporter/request-form.ts b/src/v2/db/schema/supporter/request-form.ts new file mode 100644 index 0000000..0ea407d --- /dev/null +++ b/src/v2/db/schema/supporter/request-form.ts @@ -0,0 +1,110 @@ +import { tableNames } from "@/v2/db/drizzle" +import { relations } from "drizzle-orm" +import { + sqliteTable, + text, + // uniqueIndex, + index, +} from "drizzle-orm/sqlite-core" +import { createInsertSchema, createSelectSchema } from "drizzle-zod" +import { generateID } from "@/v2/lib/oslo" +import { authUser } from "../user/user" + +type requestArea = "asset" | "game" | "site" + +export const requestForm = sqliteTable( + tableNames.requestForm, + { + id: text("id") + .unique() + .notNull() + .$defaultFn(() => { + return generateID() + }), + userId: text("user_id") + .notNull() + .references(() => authUser.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + area: text("type").notNull().$type(), + title: text("title").notNull(), + description: text("description").notNull(), + }, + (requestForm) => { + return { + requestFormUserIdx: index("request_form_user_id_idx").on( + requestForm.userId + ), + } + } +) + +export type RequestForm = typeof requestForm.$inferSelect +export type NewRequestForm = typeof requestForm.$inferInsert +export const insertRequestFormSchema = createInsertSchema(requestForm) +export const selectRequestFormSchema = createSelectSchema(requestForm) + +export const requestFormRelations = relations(requestForm, ({ one, many }) => ({ + user: one(authUser, { + fields: [requestForm.userId], + references: [authUser.id], + relationName: "request_form_user", + }), + upvotes: many(requestFormUpvotes), +})) + +export const requestFormUpvotes = sqliteTable( + tableNames.requestFormUpvotes, + { + id: text("id") + .unique() + .notNull() + .$defaultFn(() => { + return generateID() + }), + requestFormId: text("request_form_id") + .notNull() + .references(() => requestForm.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + userId: text("user_id") + .notNull() + .references(() => authUser.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + }, + (requestFormUpvotes) => { + return { + requestFormUpvotesIdx: index("request_form_upvotes_idx").on( + requestFormUpvotes.requestFormId, + requestFormUpvotes.userId + ), + } + } +) + +export type RequestFormUpvotes = typeof requestFormUpvotes.$inferSelect +export type NewRequestFormUpvotes = typeof requestFormUpvotes.$inferInsert +export const insertRequestFormUpvotesSchema = + createInsertSchema(requestFormUpvotes) +export const selectRequestFormUpvotesSchema = + createSelectSchema(requestFormUpvotes) + +export const requestFormUpvotesRelations = relations( + requestFormUpvotes, + ({ one }) => ({ + user: one(authUser, { + fields: [requestFormUpvotes.userId], + references: [authUser.id], + relationName: "request_form_upvotes_user", + }), + requestForm: one(requestForm, { + fields: [requestFormUpvotes.requestFormId], + references: [requestForm.id], + relationName: "request_form_upvotes_request_form", + }), + }) +) diff --git a/src/v2/db/schema/user/user.ts b/src/v2/db/schema/user/user.ts index 71f3f8f..fd58acc 100644 --- a/src/v2/db/schema/user/user.ts +++ b/src/v2/db/schema/user/user.ts @@ -23,6 +23,7 @@ import { assetLikes } from "../asset/asset-likes" import { gameLikes } from "../game/game-likes" import { assetTagLikes } from "../tags/asset-tags-likes" import { assetCategoryLikes } from "../categories/asset-categories-likes" +import { requestForm, requestFormUpvotes } from "../supporter/request-form" /* NOTE: Very basic user information @@ -174,6 +175,8 @@ export const usersRelations = relations(authUser, ({ one, many }) => ({ assetTagLikes: many(assetTagLikes), assetCategoryLikes: many(assetCategoryLikes), userCollectionCollaborators: many(userCollectionCollaborators), + requestForm: many(requestForm), + requestFormUpvotes: many(requestFormUpvotes), })) export const authCredentialsRelations = relations( diff --git a/src/v2/middleware/ratelimit/limiter.ts b/src/v2/middleware/ratelimit/limiter.ts index 52ad341..db51467 100644 --- a/src/v2/middleware/ratelimit/limiter.ts +++ b/src/v2/middleware/ratelimit/limiter.ts @@ -1,7 +1,7 @@ import dayjs from "dayjs" import { Context, MiddlewareHandler } from "hono" -const fakeDomain = "http://rate-limiter.com/" +const fakeDomain = "http://fake.wanderer.moe/" const getRateLimitKey = (ctx: Context) => { const ip = ctx.req.header("cf-connecting-ip") @@ -92,7 +92,7 @@ export const rateLimit = ( { success: false, message: - "Rate limit exceeded, contact marcel@dromzeh.dev if you're using this API in production and need a higher rate limit.", + "Rate limit exceeded, contact marcel@dromzeh.dev or reach out to @dromzeh on discord if you're using this API in production and need a higher rate limit.", }, 429 ) From 4adadd30f8a7f5fe21ae8477dd999a6fb2b19fbe Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Tue, 6 Feb 2024 12:46:38 +0000 Subject: [PATCH 249/318] collection accent colour --- src/v2/db/schema/collections/user-collections.ts | 2 ++ src/v2/lib/colour.ts | 5 +++++ 2 files changed, 7 insertions(+) create mode 100644 src/v2/lib/colour.ts diff --git a/src/v2/db/schema/collections/user-collections.ts b/src/v2/db/schema/collections/user-collections.ts index c123672..09fe3be 100644 --- a/src/v2/db/schema/collections/user-collections.ts +++ b/src/v2/db/schema/collections/user-collections.ts @@ -13,6 +13,7 @@ import { generateID } from "@/v2/lib/oslo" import { createInsertSchema, createSelectSchema } from "drizzle-zod" import { userCollectionLikes } from "./user-collection-likes" import { userCollectionCollaborators } from "./user-collections-collaborators" +import type { ColourType } from "@/v2/lib/colour" /* NOTE: this file is where users store their collections of assets. @@ -42,6 +43,7 @@ export const userCollection = sqliteTable( .$defaultFn(() => { return new Date().toISOString() }), + accentColour: text("accent_colour").$type(), isPublic: integer("is_public", { mode: "boolean" }) .default(false) .notNull(), diff --git a/src/v2/lib/colour.ts b/src/v2/lib/colour.ts new file mode 100644 index 0000000..e49f208 --- /dev/null +++ b/src/v2/lib/colour.ts @@ -0,0 +1,5 @@ +export type ColourType = `#${string}` + +export function isValidColour(colour: string): colour is ColourType { + return /^#[0-9A-F]{6}$/i.test(colour) +} From 64f03f6713b24c982600939fd210645ddc6e841d Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Tue, 6 Feb 2024 14:14:00 +0000 Subject: [PATCH 250/318] request form create/delete route --- src/index.ts | 24 ++-- src/v2/db/schema/supporter/request-form.ts | 2 +- .../request-form/request-form-manager.ts | 128 ++++++++++++++++++ src/v2/lib/response-schemas.ts | 5 - src/v2/routes/handler.ts | 2 + src/v2/routes/requests/form/create/openapi.ts | 33 +++++ src/v2/routes/requests/form/create/route.ts | 47 +++++++ src/v2/routes/requests/form/create/schema.ts | 29 ++++ .../requests/form/delete/[id]/openapi.ts | 28 ++++ .../routes/requests/form/delete/[id]/route.ts | 63 +++++++++ .../requests/form/delete/[id]/schema.ts | 17 +++ .../requests/form/upvote/[id]/openapi.ts | 0 .../routes/requests/form/upvote/[id]/route.ts | 0 .../requests/form/upvote/[id]/schema.ts | 0 src/v2/routes/requests/handler.ts | 10 ++ 15 files changed, 370 insertions(+), 18 deletions(-) create mode 100644 src/v2/lib/managers/request-form/request-form-manager.ts create mode 100644 src/v2/routes/requests/form/create/openapi.ts create mode 100644 src/v2/routes/requests/form/create/route.ts create mode 100644 src/v2/routes/requests/form/create/schema.ts create mode 100644 src/v2/routes/requests/form/delete/[id]/openapi.ts create mode 100644 src/v2/routes/requests/form/delete/[id]/route.ts create mode 100644 src/v2/routes/requests/form/delete/[id]/schema.ts create mode 100644 src/v2/routes/requests/form/upvote/[id]/openapi.ts create mode 100644 src/v2/routes/requests/form/upvote/[id]/route.ts create mode 100644 src/v2/routes/requests/form/upvote/[id]/schema.ts create mode 100644 src/v2/routes/requests/handler.ts diff --git a/src/index.ts b/src/index.ts index 14f09e6..e287f47 100644 --- a/src/index.ts +++ b/src/index.ts @@ -12,6 +12,18 @@ export { RateLimiter } from "@/v2/middleware/ratelimit/ratelimit.do" const app = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() +app.use("*", rateLimit(60, 100)) +app.use("*", csrf({ origin: "*" })) +app.use("*", prettyJSON({ space: 4 })) +app.use( + "*", + cors({ + // todo(dromzeh): this should be set dependant on ENV, PROD or DEV w/ next() for context + origin: "*", + credentials: true, + }) +) + // openapi config app.doc("/openapi", OpenAPIConfig) @@ -25,18 +37,6 @@ app.get( }) ) -app.use("*", rateLimit(60, 100)) -app.use("*", csrf({ origin: "*" })) -app.use("*", prettyJSON({ space: 4 })) -app.use( - "*", - cors({ - // todo(dromzeh): this should be set dependant on ENV, PROD or DEV w/ next() for context - origin: "*", - credentials: true, - }) -) - // v2 API routes app.route("/v2", BaseRoutes) diff --git a/src/v2/db/schema/supporter/request-form.ts b/src/v2/db/schema/supporter/request-form.ts index 0ea407d..8efc20e 100644 --- a/src/v2/db/schema/supporter/request-form.ts +++ b/src/v2/db/schema/supporter/request-form.ts @@ -10,7 +10,7 @@ import { createInsertSchema, createSelectSchema } from "drizzle-zod" import { generateID } from "@/v2/lib/oslo" import { authUser } from "../user/user" -type requestArea = "asset" | "game" | "site" +export type requestArea = "asset" | "game" | "site" export const requestForm = sqliteTable( tableNames.requestForm, diff --git a/src/v2/lib/managers/request-form/request-form-manager.ts b/src/v2/lib/managers/request-form/request-form-manager.ts new file mode 100644 index 0000000..5ed54d1 --- /dev/null +++ b/src/v2/lib/managers/request-form/request-form-manager.ts @@ -0,0 +1,128 @@ +import { DrizzleInstance } from "@/v2/db/turso" +import { and, eq, sql } from "drizzle-orm" +import { requestArea, requestForm, requestFormUpvotes } from "@/v2/db/schema" + +export class RequestFormManager { + constructor(private drizzle: DrizzleInstance) {} + + public async getRequestFormEntries(offset: number = 0, limit: number = 50) { + try { + return await this.drizzle.query.requestForm.findMany({ + offset: offset, + limit: limit, + with: { + requestFormUpvotes, + }, + extras: { + upvoteCount: + sql`SELECT COUNT(*) FROM ${requestFormUpvotes} WHERE ${requestForm.id} = ${requestFormUpvotes.requestFormId}`.as( + "upvoteCount" + ), + }, + }) + } catch (e) { + console.error(`Error getting request form entries`, e) + throw new Error(`Error getting request form entries`) + } + } + + public async doesRequestFormEntryExist(id: string) { + try { + const [response] = await this.drizzle + .select({ id: requestForm.id, userId: requestForm.userId }) + .from(requestForm) + .where(eq(requestForm.id, id)) + .limit(1) + + return response + } catch (e) { + console.error(`Error checking if request form entry exists`, e) + throw new Error(`Error checking if request form entry exists`) + } + } + + public async createRequestFormEntry( + userId: string, + title: string, + area: requestArea, + description: string + ) { + try { + return await this.drizzle + .insert(requestForm) + .values({ + userId, + title, + area, + description, + }) + .returning() + } catch (e) { + console.error(`Error creating request form entry`, e) + throw new Error(`Error creating request form entry`) + } + } + + public async checkIfUserUpvotedRequestFormEntry( + requestFormId: string, + userId: string + ): Promise { + try { + const response = + await this.drizzle.query.requestFormUpvotes.findFirst({ + where: and( + eq(requestFormUpvotes.requestFormId, requestFormId), + eq(requestFormUpvotes.userId, userId) + ), + }) + + return response !== null + } catch (e) { + console.error( + `Error checking if user upvoted request form entry`, + e + ) + throw new Error(`Error checking if user upvoted request form entry`) + } + } + + public async deleteRequestFormEntry(id: string) { + try { + await this.drizzle.delete(requestForm).where(eq(requestForm.id, id)) + } catch (e) { + console.error(`Error deleting request form entry`, e) + throw new Error(`Error deleting request form entry`) + } + } + + public async upvoteRequestFormEntry(requestFormId: string, userId: string) { + try { + await this.drizzle.insert(requestFormUpvotes).values({ + requestFormId, + userId, + }) + } catch (e) { + console.error(`Error upvoting request form entry`, e) + throw new Error(`Error upvoting request form entry`) + } + } + + public async removeUpvoteRequestFormEntry( + requestFormId: string, + userId: string + ) { + try { + await this.drizzle + .delete(requestFormUpvotes) + .where( + and( + eq(requestFormUpvotes.requestFormId, requestFormId), + eq(requestFormUpvotes.userId, userId) + ) + ) + } catch (e) { + console.error(`Error removing upvote from request form entry`, e) + throw new Error(`Error removing upvote from request form entry`) + } + } +} diff --git a/src/v2/lib/response-schemas.ts b/src/v2/lib/response-schemas.ts index b5aa05c..0ba4d27 100644 --- a/src/v2/lib/response-schemas.ts +++ b/src/v2/lib/response-schemas.ts @@ -76,7 +76,6 @@ export const GenericResponses = { schema: BadRequestSchema, }, }, - headers: openAPIResponseHeaders, }, 401: { description: "Unauthorized", @@ -85,7 +84,6 @@ export const GenericResponses = { schema: UnauthorizedSchema, }, }, - headers: openAPIResponseHeaders, }, 403: { description: "Forbidden", @@ -94,7 +92,6 @@ export const GenericResponses = { schema: ForbiddenSchema, }, }, - headers: openAPIResponseHeaders, }, 429: { description: "Rate limited", @@ -103,7 +100,6 @@ export const GenericResponses = { schema: BadRequestSchema, }, }, - headers: openAPIResponseHeaders, }, 500: { description: "Internal server error", @@ -112,6 +108,5 @@ export const GenericResponses = { schema: InternalServerErrorSchema, }, }, - headers: openAPIResponseHeaders, }, } diff --git a/src/v2/routes/handler.ts b/src/v2/routes/handler.ts index 61799bf..8d6fe44 100644 --- a/src/v2/routes/handler.ts +++ b/src/v2/routes/handler.ts @@ -5,6 +5,7 @@ import AssetRoute from "@/v2/routes/asset/handler" import ContributorRoute from "@/v2/routes/contributors/handler" import AuthRoute from "@/v2/routes/auth/handler" import CategoryRoute from "@/v2/routes/category/handler" +import RequestFormRoute from "@/v2/routes/requests/handler" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() @@ -14,5 +15,6 @@ handler.route("/asset", AssetRoute) handler.route("/user", UserRoute) handler.route("/contributor", ContributorRoute) handler.route("/auth", AuthRoute) +handler.route("/request", RequestFormRoute) export default handler diff --git a/src/v2/routes/requests/form/create/openapi.ts b/src/v2/routes/requests/form/create/openapi.ts new file mode 100644 index 0000000..711bdcb --- /dev/null +++ b/src/v2/routes/requests/form/create/openapi.ts @@ -0,0 +1,33 @@ +import { createRoute } from "@hono/zod-openapi" +import { + createRequestFormEntryResponse, + createRequestFormEntrySchema, +} from "./schema" +import { GenericResponses } from "@/v2/lib/response-schemas" + +export const createRequestFormEntryRoute = createRoute({ + path: "/", + method: "post", + description: "Create a new entry into the request form.", + tags: ["Requests"], + request: { + body: { + content: { + "application/json": { + schema: createRequestFormEntrySchema, + }, + }, + }, + }, + responses: { + 200: { + description: "Returns the new request form entry.", + content: { + "application/json": { + schema: createRequestFormEntryResponse, + }, + }, + }, + ...GenericResponses, + }, +}) diff --git a/src/v2/routes/requests/form/create/route.ts b/src/v2/routes/requests/form/create/route.ts new file mode 100644 index 0000000..92ad32a --- /dev/null +++ b/src/v2/routes/requests/form/create/route.ts @@ -0,0 +1,47 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { createRequestFormEntryRoute } from "./openapi" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +import { RequestFormManager } from "@/v2/lib/managers/request-form/request-form-manager" +import { getConnection } from "@/v2/db/turso" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.openapi(createRequestFormEntryRoute, async (ctx) => { + const { area, title, description } = ctx.req.valid("json") + + const authSessionManager = new AuthSessionManager(ctx) + + const { user } = await authSessionManager.validateSession() + + if (!user || user.role != "creator" || !user.isSupporter) { + return ctx.json( + { + success: false, + message: + "Unauthorized. Only supporters can create request entries.", + }, + 401 + ) + } + + const { drizzle } = await getConnection(ctx.env) + + const requestFormManager = new RequestFormManager(drizzle) + + const [newRequestEntry] = await requestFormManager.createRequestFormEntry( + user.id, + title, + area, + description + ) + + return ctx.json( + { + success: true, + response: newRequestEntry, + }, + 200 + ) +}) + +export default handler diff --git a/src/v2/routes/requests/form/create/schema.ts b/src/v2/routes/requests/form/create/schema.ts new file mode 100644 index 0000000..37d72d4 --- /dev/null +++ b/src/v2/routes/requests/form/create/schema.ts @@ -0,0 +1,29 @@ +import { z } from "@hono/zod-openapi" +import { selectRequestFormSchema } from "@/v2/db/schema" +import type { requestArea } from "@/v2/db/schema" + +export const createRequestFormEntrySchema = z.object({ + title: z.string().min(3).max(32).openapi({ + description: "The title of the request.", + example: "Add HSR UI assets", + }), + area: z + .string() + .min(3) + .max(32) + .openapi({ + description: "The area of the request.", + example: "asset", + }) + .transform((value) => value as requestArea), + description: z.string().min(3).max(256).openapi({ + description: "The description of the request.", + example: + "Add the UI assets for Honkai: Star Rail, including the logo and other UI elements.", + }), +}) + +export const createRequestFormEntryResponse = z.object({ + success: z.literal(true), + response: selectRequestFormSchema, +}) diff --git a/src/v2/routes/requests/form/delete/[id]/openapi.ts b/src/v2/routes/requests/form/delete/[id]/openapi.ts new file mode 100644 index 0000000..3bfc1a7 --- /dev/null +++ b/src/v2/routes/requests/form/delete/[id]/openapi.ts @@ -0,0 +1,28 @@ +import { createRoute } from "@hono/zod-openapi" +import { + deleteRequestByIdResponseSchema, + deleteRequestByIdSchema, +} from "./schema" +import { GenericResponses } from "@/v2/lib/response-schemas" + +export const deleteRequestByIdRoute = createRoute({ + path: "/{id}", + method: "delete", + description: + "Delete a request by its ID. This will also delete all associated upvotes.", + tags: ["Requests"], + request: { + params: deleteRequestByIdSchema, + }, + responses: { + 200: { + description: "True if the request was deleted successfully.", + content: { + "application/json": { + schema: deleteRequestByIdResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) diff --git a/src/v2/routes/requests/form/delete/[id]/route.ts b/src/v2/routes/requests/form/delete/[id]/route.ts new file mode 100644 index 0000000..6554468 --- /dev/null +++ b/src/v2/routes/requests/form/delete/[id]/route.ts @@ -0,0 +1,63 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { deleteRequestByIdRoute } from "./openapi" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +import { RequestFormManager } from "@/v2/lib/managers/request-form/request-form-manager" +import { getConnection } from "@/v2/db/turso" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.openapi(deleteRequestByIdRoute, async (ctx) => { + const requestId = ctx.req.valid("param").id + + const authSessionManager = new AuthSessionManager(ctx) + + const { user } = await authSessionManager.validateSession() + + if (!user || user.role != "creator" || !user.isSupporter) { + return ctx.json( + { + success: false, + message: "Unauthorized. Only supporters can delete requests.", + }, + 401 + ) + } + + const { drizzle } = await getConnection(ctx.env) + + const requestFormManager = new RequestFormManager(drizzle) + + const request = + await requestFormManager.doesRequestFormEntryExist(requestId) + + if (!request) { + return ctx.json( + { + success: false, + message: "Request by ID not found", + }, + 404 + ) + } + + if (request.userId != user.id) { + return ctx.json( + { + success: false, + message: "Unauthorized. You can only delete your own requests.", + }, + 401 + ) + } + + await requestFormManager.deleteRequestFormEntry(requestId) + + return ctx.json( + { + success: true, + }, + 200 + ) +}) + +export default handler diff --git a/src/v2/routes/requests/form/delete/[id]/schema.ts b/src/v2/routes/requests/form/delete/[id]/schema.ts new file mode 100644 index 0000000..3bbd859 --- /dev/null +++ b/src/v2/routes/requests/form/delete/[id]/schema.ts @@ -0,0 +1,17 @@ +import { z } from "@hono/zod-openapi" + +export const deleteRequestByIdSchema = z.object({ + id: z.string().openapi({ + param: { + name: "id", + in: "path", + description: "The ID of the request to delete.", + example: "1", + required: true, + }, + }), +}) + +export const deleteRequestByIdResponseSchema = z.object({ + success: z.literal(true), +}) diff --git a/src/v2/routes/requests/form/upvote/[id]/openapi.ts b/src/v2/routes/requests/form/upvote/[id]/openapi.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/requests/form/upvote/[id]/route.ts b/src/v2/routes/requests/form/upvote/[id]/route.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/requests/form/upvote/[id]/schema.ts b/src/v2/routes/requests/form/upvote/[id]/schema.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/requests/handler.ts b/src/v2/routes/requests/handler.ts new file mode 100644 index 0000000..7132a7d --- /dev/null +++ b/src/v2/routes/requests/handler.ts @@ -0,0 +1,10 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import RequestFormCreateRoute from "@/v2/routes/requests/form/create/route" +import RequestFormDeleteRoute from "@/v2/routes/requests/form/delete/[id]/route" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.route("/create/form", RequestFormCreateRoute) +handler.route("/delete/form", RequestFormDeleteRoute) + +export default handler From 077198a685223bea649a7f112f3f29658a14abaf Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Fri, 9 Feb 2024 05:32:54 +0000 Subject: [PATCH 251/318] update deps --- package.json | 26 +- pnpm-lock.yaml | 1483 +++++++++++++++++++++++++++++++++--------------- tsconfig.json | 6 +- 3 files changed, 1031 insertions(+), 484 deletions(-) diff --git a/package.json b/package.json index 3bb0726..8286c48 100644 --- a/package.json +++ b/package.json @@ -20,34 +20,34 @@ }, "devDependencies": { "@asteasolutions/zod-to-openapi": "^6.3.1", - "@cloudflare/workers-types": "^4.20240117.0", - "@types/node": "^20.11.8", + "@cloudflare/workers-types": "^4.20240208.0", + "@types/node": "^20.11.17", "dotenv": "^16.4.1", - "drizzle-kit": "^0.20.13", + "drizzle-kit": "^0.20.14", "eslint": "^8.56.0", - "husky": "^9.0.6", + "husky": "^9.0.10", "openapi-generator": "link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator", "tsx": "^4.7.0", "typescript": "^5.3.3", - "wrangler": "3.25.0" + "wrangler": "3.28.0" }, "private": true, "dependencies": { "@axiomhq/js": "1.0.0-rc.1", "@hono/swagger-ui": "^0.2.1", "@hono/zod-openapi": "^0.9.6", - "@libsql/client": "0.4.0", + "@libsql/client": "0.4.3", "@lucia-auth/adapter-sqlite": "3.0.0", - "@scalar/hono-api-reference": "^0.3.29", - "@typescript-eslint/eslint-plugin": "^6.19.1", - "better-sqlite3": "^9.3.0", + "@scalar/hono-api-reference": "^0.3.46", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "better-sqlite3": "^9.4.0", "dayjs": "^1.11.10", "drizzle-orm": "^0.29.3", "drizzle-zod": "^0.5.1", - "hono": "^3.12.8", - "lucia": "3.0.0", - "oslo": "^1.0.2", - "prettier": "^3.2.4", + "hono": "^3.12.12", + "lucia": "3.0.1", + "oslo": "^1.1.0", + "prettier": "^3.2.5", "zod": "^3.22.4", "zod-error": "^1.5.0" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 27357cc..32f4a47 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,46 +10,46 @@ dependencies: version: 1.0.0-rc.1 "@hono/swagger-ui": specifier: ^0.2.1 - version: 0.2.1(hono@3.12.8) + version: 0.2.1(hono@3.12.12) "@hono/zod-openapi": specifier: ^0.9.6 - version: 0.9.6(hono@3.12.8)(zod@3.22.4) + version: 0.9.6(hono@3.12.12)(zod@3.22.4) "@libsql/client": - specifier: 0.4.0 - version: 0.4.0 + specifier: 0.4.3 + version: 0.4.3 "@lucia-auth/adapter-sqlite": specifier: 3.0.0 - version: 3.0.0(@libsql/client@0.4.0)(better-sqlite3@9.3.0)(lucia@3.0.0) + version: 3.0.0(@libsql/client@0.4.3)(better-sqlite3@9.4.0)(lucia@3.0.1) "@scalar/hono-api-reference": - specifier: ^0.3.29 - version: 0.3.29(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(hono@3.12.8)(nanoid@5.0.4)(postcss@8.4.33)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15) + specifier: ^0.3.46 + version: 0.3.46(hono@3.12.12)(nanoid@5.0.5)(postcss@8.4.35)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.18)(yjs@13.6.11) "@typescript-eslint/eslint-plugin": - specifier: ^6.19.1 - version: 6.19.1(@typescript-eslint/parser@6.19.1)(eslint@8.56.0)(typescript@5.3.3) + specifier: ^6.21.0 + version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.3.3) better-sqlite3: - specifier: ^9.3.0 - version: 9.3.0 + specifier: ^9.4.0 + version: 9.4.0 dayjs: specifier: ^1.11.10 version: 1.11.10 drizzle-orm: specifier: ^0.29.3 - version: 0.29.3(@cloudflare/workers-types@4.20240117.0)(@libsql/client@0.4.0)(better-sqlite3@9.3.0) + version: 0.29.3(@cloudflare/workers-types@4.20240208.0)(@libsql/client@0.4.3)(better-sqlite3@9.4.0) drizzle-zod: specifier: ^0.5.1 version: 0.5.1(drizzle-orm@0.29.3)(zod@3.22.4) hono: - specifier: ^3.12.8 - version: 3.12.8 + specifier: ^3.12.12 + version: 3.12.12 lucia: - specifier: 3.0.0 - version: 3.0.0 + specifier: 3.0.1 + version: 3.0.1 oslo: - specifier: ^1.0.2 - version: 1.0.2 + specifier: ^1.1.0 + version: 1.1.0 prettier: - specifier: ^3.2.4 - version: 3.2.4 + specifier: ^3.2.5 + version: 3.2.5 zod: specifier: ^3.22.4 version: 3.22.4 @@ -62,23 +62,23 @@ devDependencies: specifier: ^6.3.1 version: 6.3.1(zod@3.22.4) "@cloudflare/workers-types": - specifier: ^4.20240117.0 - version: 4.20240117.0 + specifier: ^4.20240208.0 + version: 4.20240208.0 "@types/node": - specifier: ^20.11.8 - version: 20.11.8 + specifier: ^20.11.17 + version: 20.11.17 dotenv: specifier: ^16.4.1 version: 16.4.1 drizzle-kit: - specifier: ^0.20.13 - version: 0.20.13 + specifier: ^0.20.14 + version: 0.20.14 eslint: specifier: ^8.56.0 version: 8.56.0 husky: - specifier: ^9.0.6 - version: 9.0.6 + specifier: ^9.0.10 + version: 9.0.10 openapi-generator: specifier: link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator version: link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator @@ -89,8 +89,8 @@ devDependencies: specifier: ^5.3.3 version: 5.3.3 wrangler: - specifier: 3.25.0 - version: 3.25.0 + specifier: 3.28.0 + version: 3.28.0(@cloudflare/workers-types@4.20240208.0) packages: /@aashutoshrathi/word-wrap@1.2.6: @@ -100,6 +100,26 @@ packages: } engines: { node: ">=0.10.0" } + /@actions/core@1.10.1: + resolution: + { + integrity: sha512-3lBR9EDAY+iYIpTnTIXmWcNbX3T2kCkAEQGIQx4NVQ0575nk2k3GRZDTPQG+vVtS2izSLmINlxXf0uLtnrTP+g==, + } + dependencies: + "@actions/http-client": 2.2.0 + uuid: 8.3.2 + dev: false + + /@actions/http-client@2.2.0: + resolution: + { + integrity: sha512-q+epW0trjVUUHboliPb4UF9g2msf+w61b32tAkFEwL/IwP0DQWgbCMM0Hbe3e3WXSKz5VcUXbzJQgy8Hkra/Lg==, + } + dependencies: + tunnel: 0.0.6 + undici: 5.28.3 + dev: false + /@apidevtools/json-schema-ref-parser@9.0.6: resolution: { @@ -237,10 +257,10 @@ packages: mime: 3.0.0 dev: true - /@cloudflare/workerd-darwin-64@1.20231218.0: + /@cloudflare/workerd-darwin-64@1.20240129.0: resolution: { - integrity: sha512-547gOmTIVmRdDy7HNAGJUPELa+fSDm2Y0OCxqAtQOz0GLTDu1vX61xYmsb2rn91+v3xW6eMttEIpbYokKjtfJA==, + integrity: sha512-DfVVB5IsQLVcWPJwV019vY3nEtU88c2Qu2ST5SQxqcGivZ52imagLRK0RHCIP8PK4piSiq90qUC6ybppUsw8eg==, } engines: { node: ">=16" } cpu: [x64] @@ -249,10 +269,10 @@ packages: dev: true optional: true - /@cloudflare/workerd-darwin-arm64@1.20231218.0: + /@cloudflare/workerd-darwin-arm64@1.20240129.0: resolution: { - integrity: sha512-b39qrU1bKolCfmKFDAnX4vXcqzISkEUVE/V8sMBsFzxrIpNAbcUHBZAQPYmS/OHIGB94KjOVokvDi7J6UNurPw==, + integrity: sha512-t0q8ABkmumG1zRM/MZ/vIv/Ysx0vTAXnQAPy/JW5aeQi/tqrypXkO9/NhPc0jbF/g/hIPrWEqpDgEp3CB7Da7Q==, } engines: { node: ">=16" } cpu: [arm64] @@ -261,10 +281,10 @@ packages: dev: true optional: true - /@cloudflare/workerd-linux-64@1.20231218.0: + /@cloudflare/workerd-linux-64@1.20240129.0: resolution: { - integrity: sha512-dMUF1wA+0mybm6hHNOCgY/WMNMwomPPs4I7vvYCgwHSkch0Q2Wb7TnxQZSt8d1PK/myibaBwadrlIxpjxmpz3w==, + integrity: sha512-sFV1uobHgDI+6CKBS/ZshQvOvajgwl6BtiYaH4PSFSpvXTmRx+A9bcug+6BnD+V4WgwxTiEO2iR97E1XuwDAVw==, } engines: { node: ">=16" } cpu: [x64] @@ -273,10 +293,10 @@ packages: dev: true optional: true - /@cloudflare/workerd-linux-arm64@1.20231218.0: + /@cloudflare/workerd-linux-arm64@1.20240129.0: resolution: { - integrity: sha512-2s5uc8IHt0QmWyKxAr1Fy+4b8Xy0b/oUtlPnm5MrKi2gDRlZzR7JvxENPJCpCnYENydS8lzvkMiAFECPBccmyQ==, + integrity: sha512-O7q7htHaFRp8PgTqNJx1/fYc3+LnvAo6kWWB9a14C5OWak6AAZk42PNpKPx+DXTmGvI+8S1+futBGUeJ8NPDXg==, } engines: { node: ">=16" } cpu: [arm64] @@ -285,10 +305,10 @@ packages: dev: true optional: true - /@cloudflare/workerd-windows-64@1.20231218.0: + /@cloudflare/workerd-windows-64@1.20240129.0: resolution: { - integrity: sha512-oN5hz6TXUDB5YKUN5N3QWAv6cYz9JjTZ9g16HVyoegVFEL6/zXU3tV19MBX2IvlE11ab/mRogEv9KXVIrHfKmA==, + integrity: sha512-YqGno0XSqqqkDmNoGEX6M8kJlI2lEfWntbTPVtHaZlaXVR9sWfoD7TEno0NKC95cXFz+ioyFLbgbOdnfWwmVAA==, } engines: { node: ">=16" } cpu: [x64] @@ -297,13 +317,13 @@ packages: dev: true optional: true - /@cloudflare/workers-types@4.20240117.0: + /@cloudflare/workers-types@4.20240208.0: resolution: { - integrity: sha512-HQU8lJhaJVh8gQXFtVA7lZwd0hK1ckIFjRuxOXkVN2Z9t7DtzNbA2YTwBry5thKNgF5EwjN4THjHg5NUZzj05A==, + integrity: sha512-MVGTTjZpJu4kJONvai5SdJzWIhOJbuweVZ3goI7FNyG+JdoQH41OoB+nMhLsX626vPLZVWGPIWsiSo/WZHzgQw==, } - /@codemirror/autocomplete@6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1): + /@codemirror/autocomplete@6.12.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1): resolution: { integrity: sha512-r4IjdYFthwbCQyvqnSlx0WBHRHi8nBvU+WjJxFUij81qsBfhNudf/XKKmmC2j3m0LaOYUQTf3qiEK1J8lO1sdg==, @@ -314,7 +334,7 @@ packages: "@codemirror/view": ^6.0.0 "@lezer/common": ^1.0.0 dependencies: - "@codemirror/language": 6.10.0 + "@codemirror/language": 6.10.1 "@codemirror/state": 6.4.0 "@codemirror/view": 6.23.1 "@lezer/common": 1.2.1 @@ -326,7 +346,7 @@ packages: integrity: sha512-dO4hcF0fGT9tu1Pj1D2PvGvxjeGkbC6RGcZw6Qs74TH+Ed1gw98jmUgd2axWvIZEqTeTuFrg1lEB1KV6cK9h1A==, } dependencies: - "@codemirror/language": 6.10.0 + "@codemirror/language": 6.10.1 "@codemirror/state": 6.4.0 "@codemirror/view": 6.23.1 "@lezer/common": 1.2.1 @@ -338,8 +358,8 @@ packages: integrity: sha512-/UNWDNV5Viwi/1lpr/dIXJNWiwDxpw13I4pTUAsNxZdg6E0mI2kTQb0P2iHczg1Tu+H4EBgJR+hYhKiHKko7qg==, } dependencies: - "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) - "@codemirror/language": 6.10.0 + "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) + "@codemirror/language": 6.10.1 "@codemirror/state": 6.4.0 "@lezer/common": 1.2.1 "@lezer/css": 1.1.7 @@ -353,10 +373,10 @@ packages: integrity: sha512-tE2YK7wDlb9ZpAH6mpTPiYm6rhfdQKVDa5r9IwIFlwwgvVaKsCfuKKZoJGWsmMZIf3FQAuJ5CHMPLymOtg1hXw==, } dependencies: - "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) + "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) "@codemirror/lang-css": 6.2.1(@codemirror/view@6.23.1) "@codemirror/lang-javascript": 6.2.1 - "@codemirror/language": 6.10.0 + "@codemirror/language": 6.10.1 "@codemirror/state": 6.4.0 "@codemirror/view": 6.23.1 "@lezer/common": 1.2.1 @@ -370,7 +390,7 @@ packages: integrity: sha512-OOnmhH67h97jHzCuFaIEspbmsT98fNdhVhmA3zCxW0cn7l8rChDhZtwiwJ/JOKXgfm4J+ELxQihxaI7bj7mJRg==, } dependencies: - "@codemirror/language": 6.10.0 + "@codemirror/language": 6.10.1 "@lezer/java": 1.1.1 dev: false @@ -380,9 +400,9 @@ packages: integrity: sha512-jlFOXTejVyiQCW3EQwvKH0m99bUYIw40oPmFjSX2VS78yzfe0HELZ+NEo9Yfo1MkGRpGlj3Gnu4rdxV1EnAs5A==, } dependencies: - "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) - "@codemirror/language": 6.10.0 - "@codemirror/lint": 6.4.2 + "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) + "@codemirror/language": 6.10.1 + "@codemirror/lint": 6.5.0 "@codemirror/state": 6.4.0 "@codemirror/view": 6.23.1 "@lezer/common": 1.2.1 @@ -395,29 +415,52 @@ packages: integrity: sha512-+T1flHdgpqDDlJZ2Lkil/rLiRy684WMLc74xUnjJH48GQdfJo/pudlTRreZmKwzP8/tGdKf83wlbAdOCzlJOGQ==, } dependencies: - "@codemirror/language": 6.10.0 + "@codemirror/language": 6.10.1 "@lezer/json": 1.0.2 dev: false - /@codemirror/lang-python@6.1.3(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1): + /@codemirror/lang-php@6.0.1: + resolution: + { + integrity: sha512-ublojMdw/PNWa7qdN5TMsjmqkNuTBD3k6ndZ4Z0S25SBAiweFGyY68AS3xNcIOlb6DDFDvKlinLQ40vSLqf8xA==, + } + dependencies: + "@codemirror/lang-html": 6.4.8 + "@codemirror/language": 6.10.1 + "@codemirror/state": 6.4.0 + "@lezer/common": 1.2.1 + "@lezer/php": 1.0.2 + dev: false + + /@codemirror/lang-python@6.1.4(@codemirror/view@6.23.1): resolution: { - integrity: sha512-S9w2Jl74hFlD5nqtUMIaXAq9t5WlM0acCkyuQWUUSvZclk1sV+UfnpFiZzuZSG+hfEaOmxKR5UxY/Uxswn7EhQ==, + integrity: sha512-b6d1TDqrkCjFNvMO01SWldFiDoZ39yl3tDMC1Y5f8glA2eZpynPxJhwYVTlGFr0stizcJgrp6ojLEGH2myoZAw==, } dependencies: - "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) - "@codemirror/language": 6.10.0 + "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) + "@codemirror/language": 6.10.1 + "@codemirror/state": 6.4.0 + "@lezer/common": 1.2.1 "@lezer/python": 1.1.11 transitivePeerDependencies: - - "@codemirror/state" - "@codemirror/view" - - "@lezer/common" dev: false - /@codemirror/language@6.10.0: + /@codemirror/lang-rust@6.0.1: + resolution: + { + integrity: sha512-344EMWFBzWArHWdZn/NcgkwMvZIWUR1GEBdwG8FEp++6o6vT6KL9V7vGs2ONsKxxFUPXKI0SPcWhyYyl2zPYxQ==, + } + dependencies: + "@codemirror/language": 6.10.1 + "@lezer/rust": 1.0.2 + dev: false + + /@codemirror/language@6.10.1: resolution: { - integrity: sha512-2vaNn9aPGCRFKWcHPFksctzJ8yS5p7YoaT+jHpc0UGKzNuAIx4qy6R5wiqbP+heEEdyaABA582mNqSHzSoYdmg==, + integrity: sha512-5GrXzrhq6k+gL5fjkAwt90nYDmjlzTIJV8THnxNFtNKWotMIlzzN+CpqxqwXOECnUdOndmSeWntVrVcv5axWRQ==, } dependencies: "@codemirror/state": 6.4.0 @@ -434,13 +477,13 @@ packages: integrity: sha512-X0Z48odJ0KIoh/HY8Ltz75/4tDYc9msQf1E/2trlxFaFFhgjpVHjZ/BCXe1Lk7s4Gd67LL/CeEEHNI+xHOiESg==, } dependencies: - "@codemirror/language": 6.10.0 + "@codemirror/language": 6.10.1 dev: false - /@codemirror/lint@6.4.2: + /@codemirror/lint@6.5.0: resolution: { - integrity: sha512-wzRkluWb1ptPKdzlsrbwwjYCPLgzU6N88YBAmlZi8WFyuiEduSd05MnJYNogzyc8rPK7pj6m95ptUApc8sHKVA==, + integrity: sha512-+5YyicIaaAZKU8K43IQi8TBy6mF6giGeWAH7N96Z5LC30Wm5JMjqxOYIE9mxwMG1NbhT2mA3l9hA4uuKUM3E5g==, } dependencies: "@codemirror/state": 6.4.0 @@ -448,10 +491,10 @@ packages: crelt: 1.0.6 dev: false - /@codemirror/search@6.5.5: + /@codemirror/search@6.5.6: resolution: { - integrity: sha512-PIEN3Ke1buPod2EHbJsoQwlbpkz30qGZKcnmH1eihq9+bPQx8gelauUwLYaY4vBOuBAuEhmpDLii4rj/uO0yMA==, + integrity: sha512-rpMgcsh7o0GuCDUXKPvww+muLA1pDJaFrpq/CCHtpQJYz8xopu4D1hPcKRoDD0YlF8gZaqTNIRa4VRBWyhyy7Q==, } dependencies: "@codemirror/state": 6.4.0 @@ -1396,7 +1439,7 @@ packages: debug: 4.3.4 espree: 9.6.1 globals: 13.24.0 - ignore: 5.3.0 + ignore: 5.3.1 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -1417,7 +1460,6 @@ packages: integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==, } engines: { node: ">=14" } - dev: true /@floating-ui/core@1.6.0: resolution: @@ -1428,10 +1470,10 @@ packages: "@floating-ui/utils": 0.2.1 dev: false - /@floating-ui/dom@1.6.0: + /@floating-ui/dom@1.6.1: resolution: { - integrity: sha512-SZ0BEXzsaaS6THZfZJUcAobbZTD+MvfGM42bxgeg0Tnkp4/an/avqwAXiVLsFtIBZtfsx3Ymvwx0+KnnhdA/9g==, + integrity: sha512-iA8qE43/H5iGozC3W0YSnVSW42Vh522yyM1gj+BqRwVsTNOyr231PsXDaV04yT39PsO0QL2QpbI/M0ZaLUQgRQ==, } dependencies: "@floating-ui/core": 1.6.0 @@ -1445,34 +1487,34 @@ packages: } dev: false - /@floating-ui/vue@1.0.5(vue@3.4.15): + /@floating-ui/vue@1.0.6(vue@3.4.18): resolution: { - integrity: sha512-rXYI0JHLnAw5nTGNKTmH9tMxFWmZPEfkyexXzG/HchGsoL4f8lE7+bX43pVRXRBbmCWg0/j4d62Ui7acZBmUew==, + integrity: sha512-EdrOljjkpkkqZnrpqUcPoz9NvHxuTjUtSInh6GMv3+Mcy+giY2cE2pHh9rpacRcZ2eMSCxel9jWkWXTjLmY55w==, } dependencies: - "@floating-ui/dom": 1.6.0 + "@floating-ui/dom": 1.6.1 "@floating-ui/utils": 0.2.1 - vue-demi: 0.14.6(vue@3.4.15) + vue-demi: 0.14.7(vue@3.4.18) transitivePeerDependencies: - "@vue/composition-api" - vue dev: false - /@headlessui/vue@1.7.17(vue@3.4.15): + /@headlessui/vue@1.7.19(vue@3.4.18): resolution: { - integrity: sha512-hmJChv8HzKorxd9F70RGnECAwZfkvmmwOqreuKLWY/19d5qbWnSdw+DNbuA/Uo6X5rb4U5B3NrT+qBKPmjhRqw==, + integrity: sha512-VFjKPybogux/5/QYGSq4zgG/x3RcxId15W8uguAJAjPBxelI23dwjOjTx/mIiMkM/Hd3rzFxcf2aIp56eEWRcA==, } engines: { node: ">=10" } peerDependencies: vue: ^3.2.0 dependencies: - "@tanstack/vue-virtual": 3.0.2(vue@3.4.15) - vue: 3.4.15(typescript@5.3.3) + "@tanstack/vue-virtual": 3.0.4(vue@3.4.18) + vue: 3.4.18(typescript@5.3.3) dev: false - /@hono/swagger-ui@0.2.1(hono@3.12.8): + /@hono/swagger-ui@0.2.1(hono@3.12.12): resolution: { integrity: sha512-wBxVMRe3/v8xH4o6icmwztiIq0DG0s7+jHVMHVUAoFFCWEQNL2iskMmQtrhSDtsFmBZUeUFQUaaJ6Ir6DOmHLA==, @@ -1480,10 +1522,10 @@ packages: peerDependencies: hono: "*" dependencies: - hono: 3.12.8 + hono: 3.12.12 dev: false - /@hono/zod-openapi@0.9.6(hono@3.12.8)(zod@3.22.4): + /@hono/zod-openapi@0.9.6(hono@3.12.12)(zod@3.22.4): resolution: { integrity: sha512-MLF8xpd4fEwbEaylFqAt1qci4wOTXu3oq3BKb01trccapYfodP50VCO0YDNBQTyMT/Iapq6GMO4+RAIFBgG5WQ==, @@ -1494,12 +1536,12 @@ packages: zod: 3.* dependencies: "@asteasolutions/zod-to-openapi": 5.5.0(zod@3.22.4) - "@hono/zod-validator": 0.1.11(hono@3.12.8)(zod@3.22.4) - hono: 3.12.8 + "@hono/zod-validator": 0.1.11(hono@3.12.12)(zod@3.22.4) + hono: 3.12.12 zod: 3.22.4 dev: false - /@hono/zod-validator@0.1.11(hono@3.12.8)(zod@3.22.4): + /@hono/zod-validator@0.1.11(hono@3.12.12)(zod@3.22.4): resolution: { integrity: sha512-PQXeHUP0+36qpRt8yfeD7N2jbK3ETlGvSN6dMof/HwUC/APRokQRjpXZm4rrlG71Ft0aWE01+Bm4XejqPie5Uw==, @@ -1508,7 +1550,7 @@ packages: hono: ">=3.9.0" zod: ^3.19.1 dependencies: - hono: 3.12.8 + hono: 3.12.12 zod: 3.22.4 dev: false @@ -1649,6 +1691,17 @@ packages: "@lezer/common": 1.2.1 dev: false + /@lezer/php@1.0.2: + resolution: + { + integrity: sha512-GN7BnqtGRpFyeoKSEqxvGvhJQiI4zkgmYnDk/JIyc7H7Ifc1tkPnUn/R2R8meH3h/aBf5rzjvU8ZQoyiNDtDrA==, + } + dependencies: + "@lezer/common": 1.2.1 + "@lezer/highlight": 1.2.0 + "@lezer/lr": 1.4.0 + dev: false + /@lezer/python@1.1.11: resolution: { @@ -1660,15 +1713,27 @@ packages: "@lezer/lr": 1.4.0 dev: false - /@libsql/client@0.4.0: + /@lezer/rust@1.0.2: resolution: { - integrity: sha512-GjBHHxRMKomG2rLx6K8BYsDhk9jNcKXpkEOO7luPTCje4z41ogD0sCaBRcGbJw9h3HMVysCW5v70WmjQ4/FWpg==, + integrity: sha512-Lz5sIPBdF2FUXcWeCu1//ojFAZqzTQNRga0aYv6dYXqJqPfMdCAI0NzajWUd4Xijj1IKJLtjoXRPMvTKWBcqKg==, } dependencies: - "@libsql/core": 0.4.0 + "@lezer/common": 1.2.1 + "@lezer/highlight": 1.2.0 + "@lezer/lr": 1.4.0 + dev: false + + /@libsql/client@0.4.3: + resolution: + { + integrity: sha512-AUYKnSPqAsFBVWBvmtrb4dG3pQlvTKT92eztAest9wQU2iJkabH8WzHLDb3dKFWKql7/kiCqvBQUVpozDwhekQ==, + } + dependencies: + "@libsql/core": 0.4.3 "@libsql/hrana-client": 0.5.6 js-base64: 3.7.6 + optionalDependencies: libsql: 0.2.0 transitivePeerDependencies: - bufferutil @@ -1676,10 +1741,10 @@ packages: - utf-8-validate dev: false - /@libsql/core@0.4.0: + /@libsql/core@0.4.3: resolution: { - integrity: sha512-pQHyZI0aTBlBm08dpB+/SEqLDe5wlgiUY+VNXbCD8yZhXo30AGinyrDlKrtGW7luo0As4Y9v1befurJdLKbC0Q==, + integrity: sha512-r28iYBtaLBW9RRgXPFh6cGCsVI/rwRlOzSOpAu/1PVTm6EJ3t233pUf97jETVHU0vjdr1d8VvV6fKAvJkokqCw==, } dependencies: js-base64: 3.7.6 @@ -1803,7 +1868,7 @@ packages: dev: false optional: true - /@lucia-auth/adapter-sqlite@3.0.0(@libsql/client@0.4.0)(better-sqlite3@9.3.0)(lucia@3.0.0): + /@lucia-auth/adapter-sqlite@3.0.0(@libsql/client@0.4.3)(better-sqlite3@9.4.0)(lucia@3.0.1): resolution: { integrity: sha512-7XMfMMNziFOoqIq2u9W5Z+wo7G7lzNQfUh7wDlkIqKxJMSLtP6GKH+QpK+21X4ZY9dIDmiuiwqZmS3Q3CgpATw==, @@ -1818,9 +1883,9 @@ packages: better-sqlite3: optional: true dependencies: - "@libsql/client": 0.4.0 - better-sqlite3: 9.3.0 - lucia: 3.0.0 + "@libsql/client": 0.4.3 + better-sqlite3: 9.4.0 + lucia: 3.0.1 dev: false /@napi-rs/wasm-runtime@0.1.1: @@ -1841,7 +1906,21 @@ packages: { integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==, } + requiresBuild: true dev: false + optional: true + + /@node-rs/argon2-android-arm-eabi@1.7.0: + resolution: + { + integrity: sha512-udDqkr5P9E+wYX1SZwAVPdyfYvaF4ry9Tm+R9LkfSHbzWH0uhU6zjIwNRp7m+n4gx691rk+lqqDAIP8RLKwbhg==, + } + engines: { node: ">= 10" } + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true /@node-rs/argon2-android-arm-eabi@1.7.2: resolution: @@ -1855,6 +1934,18 @@ packages: dev: false optional: true + /@node-rs/argon2-android-arm64@1.7.0: + resolution: + { + integrity: sha512-s9j/G30xKUx8WU50WIhF0fIl1EdhBGq0RQ06lEhZ0Gi0ap8lhqbE2Bn5h3/G2D1k0Dx+yjeVVNmt/xOQIRG38A==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + /@node-rs/argon2-android-arm64@1.7.2: resolution: { @@ -1867,6 +1958,18 @@ packages: dev: false optional: true + /@node-rs/argon2-darwin-arm64@1.7.0: + resolution: + { + integrity: sha512-ZIz4L6HGOB9U1kW23g+m7anGNuTZ0RuTw0vNp3o+2DWpb8u8rODq6A8tH4JRL79S+Co/Nq608m9uackN2pe0Rw==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + /@node-rs/argon2-darwin-arm64@1.7.2: resolution: { @@ -1879,6 +1982,18 @@ packages: dev: false optional: true + /@node-rs/argon2-darwin-x64@1.7.0: + resolution: + { + integrity: sha512-5oi/pxqVhODW/pj1+3zElMTn/YukQeywPHHYDbcAW3KsojFjKySfhcJMd1DjKTc+CHQI+4lOxZzSUzK7mI14Hw==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + /@node-rs/argon2-darwin-x64@1.7.2: resolution: { @@ -1891,6 +2006,18 @@ packages: dev: false optional: true + /@node-rs/argon2-freebsd-x64@1.7.0: + resolution: + { + integrity: sha512-Ify08683hA4QVXYoIm5SUWOY5DPIT/CMB0CQT+IdxQAg/F+qp342+lUkeAtD5bvStQuCx/dFO3bnnzoe2clMhA==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + /@node-rs/argon2-freebsd-x64@1.7.2: resolution: { @@ -1903,6 +2030,18 @@ packages: dev: false optional: true + /@node-rs/argon2-linux-arm-gnueabihf@1.7.0: + resolution: + { + integrity: sha512-7DjDZ1h5AUHAtRNjD19RnQatbhL+uuxBASuuXIBu4/w6Dx8n7YPxwTP4MXfsvuRgKuMWiOb/Ub/HJ3kXVCXRkg==, + } + engines: { node: ">= 10" } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@node-rs/argon2-linux-arm-gnueabihf@1.7.2: resolution: { @@ -1915,6 +2054,18 @@ packages: dev: false optional: true + /@node-rs/argon2-linux-arm64-gnu@1.7.0: + resolution: + { + integrity: sha512-nJDoMP4Y3YcqGswE4DvP080w6O24RmnFEDnL0emdI8Nou17kNYBzP2546Nasx9GCyLzRcYQwZOUjrtUuQ+od2g==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@node-rs/argon2-linux-arm64-gnu@1.7.2: resolution: { @@ -1927,6 +2078,18 @@ packages: dev: false optional: true + /@node-rs/argon2-linux-arm64-musl@1.7.0: + resolution: + { + integrity: sha512-BKWS8iVconhE3jrb9mj6t1J9vwUqQPpzCbUKxfTGJfc+kNL58F1SXHBoe2cDYGnHrFEHTY0YochzXoAfm4Dm/A==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@node-rs/argon2-linux-arm64-musl@1.7.2: resolution: { @@ -1939,6 +2102,18 @@ packages: dev: false optional: true + /@node-rs/argon2-linux-x64-gnu@1.7.0: + resolution: + { + integrity: sha512-EmgqZOlf4Jurk/szW1iTsVISx25bKksVC5uttJDUloTgsAgIGReCpUUO1R24pBhu9ESJa47iv8NSf3yAfGv6jQ==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@node-rs/argon2-linux-x64-gnu@1.7.2: resolution: { @@ -1951,6 +2126,18 @@ packages: dev: false optional: true + /@node-rs/argon2-linux-x64-musl@1.7.0: + resolution: + { + integrity: sha512-/o1efYCYIxjfuoRYyBTi2Iy+1iFfhqHCvvVsnjNSgO1xWiWrX0Rrt/xXW5Zsl7vS2Y+yu8PL8KFWRzZhaVxfKA==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@node-rs/argon2-linux-x64-musl@1.7.2: resolution: { @@ -1963,6 +2150,22 @@ packages: dev: false optional: true + /@node-rs/argon2-wasm32-wasi@1.7.0: + resolution: + { + integrity: sha512-Evmk9VcxqnuwQftfAfYEr6YZYSPLzmKUsbFIMep5nTt9PT4XYRFAERj7wNYp+rOcBenF3X4xoB+LhwcOMTNE5w==, + } + engines: { node: ">=14.0.0" } + cpu: [wasm32] + requiresBuild: true + dependencies: + "@emnapi/core": 0.45.0 + "@emnapi/runtime": 0.45.0 + "@tybys/wasm-util": 0.8.1 + memfs-browser: 3.5.10302 + dev: false + optional: true + /@node-rs/argon2-wasm32-wasi@1.7.2: resolution: { @@ -1976,6 +2179,18 @@ packages: dev: false optional: true + /@node-rs/argon2-win32-arm64-msvc@1.7.0: + resolution: + { + integrity: sha512-qgsU7T004COWWpSA0tppDqDxbPLgg8FaU09krIJ7FBl71Sz8SFO40h7fDIjfbTT5w7u6mcaINMQ5bSHu75PCaA==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@node-rs/argon2-win32-arm64-msvc@1.7.2: resolution: { @@ -1988,6 +2203,18 @@ packages: dev: false optional: true + /@node-rs/argon2-win32-ia32-msvc@1.7.0: + resolution: + { + integrity: sha512-JGafwWYQ/HpZ3XSwP4adQ6W41pRvhcdXvpzIWtKvX+17+xEXAe2nmGWM6s27pVkg1iV2ZtoYLRDkOUoGqZkCcg==, + } + engines: { node: ">= 10" } + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@node-rs/argon2-win32-ia32-msvc@1.7.2: resolution: { @@ -2000,6 +2227,18 @@ packages: dev: false optional: true + /@node-rs/argon2-win32-x64-msvc@1.7.0: + resolution: + { + integrity: sha512-9oq4ShyFakw8AG3mRls0AoCpxBFcimYx7+jvXeAf2OqKNO+mSA6eZ9z7KQeVCi0+SOEUYxMGf5UiGiDb9R6+9Q==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@node-rs/argon2-win32-x64-msvc@1.7.2: resolution: { @@ -2012,6 +2251,29 @@ packages: dev: false optional: true + /@node-rs/argon2@1.7.0: + resolution: + { + integrity: sha512-zfULc+/tmcWcxn+nHkbyY8vP3+MpEqKORbszt4UkpqZgBgDAAIYvuDN/zukfTgdmo6tmJKKVfzigZOPk4LlIog==, + } + engines: { node: ">= 10" } + optionalDependencies: + "@node-rs/argon2-android-arm-eabi": 1.7.0 + "@node-rs/argon2-android-arm64": 1.7.0 + "@node-rs/argon2-darwin-arm64": 1.7.0 + "@node-rs/argon2-darwin-x64": 1.7.0 + "@node-rs/argon2-freebsd-x64": 1.7.0 + "@node-rs/argon2-linux-arm-gnueabihf": 1.7.0 + "@node-rs/argon2-linux-arm64-gnu": 1.7.0 + "@node-rs/argon2-linux-arm64-musl": 1.7.0 + "@node-rs/argon2-linux-x64-gnu": 1.7.0 + "@node-rs/argon2-linux-x64-musl": 1.7.0 + "@node-rs/argon2-wasm32-wasi": 1.7.0 + "@node-rs/argon2-win32-arm64-msvc": 1.7.0 + "@node-rs/argon2-win32-ia32-msvc": 1.7.0 + "@node-rs/argon2-win32-x64-msvc": 1.7.0 + dev: false + /@node-rs/argon2@1.7.2: resolution: { @@ -2035,6 +2297,18 @@ packages: "@node-rs/argon2-win32-x64-msvc": 1.7.2 dev: false + /@node-rs/bcrypt-android-arm-eabi@1.9.0: + resolution: + { + integrity: sha512-nOCFISGtnodGHNiLrG0WYLWr81qQzZKYfmwHc7muUeq+KY0sQXyHOwZk9OuNQAWv/lnntmtbwkwT0QNEmOyLvA==, + } + engines: { node: ">= 10" } + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + /@node-rs/bcrypt-android-arm-eabi@1.9.2: resolution: { @@ -2047,6 +2321,18 @@ packages: dev: false optional: true + /@node-rs/bcrypt-android-arm64@1.9.0: + resolution: + { + integrity: sha512-+ZrIAtigVmjYkqZQTThHVlz0+TG6D+GDHWhVKvR2DifjtqJ0i+mb9gjo++hN+fWEQdWNGxKCiBBjwgT4EcXd6A==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + /@node-rs/bcrypt-android-arm64@1.9.2: resolution: { @@ -2059,6 +2345,18 @@ packages: dev: false optional: true + /@node-rs/bcrypt-darwin-arm64@1.9.0: + resolution: + { + integrity: sha512-CQiS+F9Pa0XozvkXR1g7uXE9QvBOPOplDg0iCCPRYTN9PqA5qYxhwe48G3o+v2UeQceNRrbnEtWuANm7JRqIhw==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + /@node-rs/bcrypt-darwin-arm64@1.9.2: resolution: { @@ -2071,6 +2369,18 @@ packages: dev: false optional: true + /@node-rs/bcrypt-darwin-x64@1.9.0: + resolution: + { + integrity: sha512-4pTKGawYd7sNEjdJ7R/R67uwQH1VvwPZ0SSUMmeNHbxD5QlwAPXdDH11q22uzVXsvNFZ6nGQBg8No5OUGpx6Ug==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + /@node-rs/bcrypt-darwin-x64@1.9.2: resolution: { @@ -2083,6 +2393,18 @@ packages: dev: false optional: true + /@node-rs/bcrypt-freebsd-x64@1.9.0: + resolution: + { + integrity: sha512-UmWzySX4BJhT/B8xmTru6iFif3h0Rpx3TqxRLCcbgmH43r7k5/9QuhpiyzpvKGpKHJCFNm4F3rC2wghvw5FCIg==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + /@node-rs/bcrypt-freebsd-x64@1.9.2: resolution: { @@ -2095,6 +2417,18 @@ packages: dev: false optional: true + /@node-rs/bcrypt-linux-arm-gnueabihf@1.9.0: + resolution: + { + integrity: sha512-8qoX4PgBND2cVwsbajoAWo3NwdfJPEXgpCsZQZURz42oMjbGyhhSYbovBCskGU3EBLoC8RA2B1jFWooeYVn5BA==, + } + engines: { node: ">= 10" } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@node-rs/bcrypt-linux-arm-gnueabihf@1.9.2: resolution: { @@ -2107,6 +2441,18 @@ packages: dev: false optional: true + /@node-rs/bcrypt-linux-arm64-gnu@1.9.0: + resolution: + { + integrity: sha512-TuAC6kx0SbcIA4mSEWPi+OCcDjTQUMl213v5gMNlttF+D4ieIZx6pPDGTaMO6M2PDHTeCG0CBzZl0Lu+9b0c7Q==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@node-rs/bcrypt-linux-arm64-gnu@1.9.2: resolution: { @@ -2119,6 +2465,18 @@ packages: dev: false optional: true + /@node-rs/bcrypt-linux-arm64-musl@1.9.0: + resolution: + { + integrity: sha512-/sIvKDABOI8QOEnLD7hIj02BVaNOuCIWBKvxcJOt8+TuwJ6zmY1UI5kSv9d99WbiHjTp97wtAUbZQwauU4b9ew==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@node-rs/bcrypt-linux-arm64-musl@1.9.2: resolution: { @@ -2131,6 +2489,18 @@ packages: dev: false optional: true + /@node-rs/bcrypt-linux-x64-gnu@1.9.0: + resolution: + { + integrity: sha512-DyyhDHDsLBsCKz1tZ1hLvUZSc1DK0FU0v52jK6IBQxrj24WscSU9zZe7ie/V9kdmA4Ep57BfpWX8Dsa2JxGdgQ==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@node-rs/bcrypt-linux-x64-gnu@1.9.2: resolution: { @@ -2143,6 +2513,18 @@ packages: dev: false optional: true + /@node-rs/bcrypt-linux-x64-musl@1.9.0: + resolution: + { + integrity: sha512-duIiuqQ+Lew8ASSAYm6ZRqcmfBGWwsi81XLUwz86a2HR7Qv6V4yc3ZAUQovAikhjCsIqe8C11JlAZSK6+PlXYg==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@node-rs/bcrypt-linux-x64-musl@1.9.2: resolution: { @@ -2155,6 +2537,22 @@ packages: dev: false optional: true + /@node-rs/bcrypt-wasm32-wasi@1.9.0: + resolution: + { + integrity: sha512-ylaGmn9Wjwv/D5lxtawttx3H6Uu2WTTR7lWlRHGT6Ga/MB1Vj4OjSGUW8G8zIVnKuXpGbZ92pgHlt4HUpSLctw==, + } + engines: { node: ">=14.0.0" } + cpu: [wasm32] + requiresBuild: true + dependencies: + "@emnapi/core": 0.45.0 + "@emnapi/runtime": 0.45.0 + "@tybys/wasm-util": 0.8.1 + memfs-browser: 3.5.10302 + dev: false + optional: true + /@node-rs/bcrypt-wasm32-wasi@1.9.2: resolution: { @@ -2168,6 +2566,18 @@ packages: dev: false optional: true + /@node-rs/bcrypt-win32-arm64-msvc@1.9.0: + resolution: + { + integrity: sha512-2h86gF7QFyEzODuDFml/Dp1MSJoZjxJ4yyT2Erf4NkwsiA5MqowUhUsorRwZhX6+2CtlGa7orbwi13AKMsYndw==, + } + engines: { node: ">= 10" } + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@node-rs/bcrypt-win32-arm64-msvc@1.9.2: resolution: { @@ -2180,6 +2590,18 @@ packages: dev: false optional: true + /@node-rs/bcrypt-win32-ia32-msvc@1.9.0: + resolution: + { + integrity: sha512-kqxalCvhs4FkN0+gWWfa4Bdy2NQAkfiqq/CEf6mNXC13RSV673Ev9V8sRlQyNpCHCNkeXfOT9pgoBdJmMs9muA==, + } + engines: { node: ">= 10" } + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@node-rs/bcrypt-win32-ia32-msvc@1.9.2: resolution: { @@ -2192,6 +2614,18 @@ packages: dev: false optional: true + /@node-rs/bcrypt-win32-x64-msvc@1.9.0: + resolution: + { + integrity: sha512-2y0Tuo6ZAT2Cz8V7DHulSlv1Bip3zbzeXyeur+uR25IRNYXKvI/P99Zl85Fbuu/zzYAZRLLlGTRe6/9IHofe/w==, + } + engines: { node: ">= 10" } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@node-rs/bcrypt-win32-x64-msvc@1.9.2: resolution: { @@ -2204,6 +2638,29 @@ packages: dev: false optional: true + /@node-rs/bcrypt@1.9.0: + resolution: + { + integrity: sha512-u2OlIxW264bFUfvbFqDz9HZKFjwe8FHFtn7T/U8mYjPZ7DWYpbUB+/dkW/QgYfMSfR0ejkyuWaBBe0coW7/7ig==, + } + engines: { node: ">= 10" } + optionalDependencies: + "@node-rs/bcrypt-android-arm-eabi": 1.9.0 + "@node-rs/bcrypt-android-arm64": 1.9.0 + "@node-rs/bcrypt-darwin-arm64": 1.9.0 + "@node-rs/bcrypt-darwin-x64": 1.9.0 + "@node-rs/bcrypt-freebsd-x64": 1.9.0 + "@node-rs/bcrypt-linux-arm-gnueabihf": 1.9.0 + "@node-rs/bcrypt-linux-arm64-gnu": 1.9.0 + "@node-rs/bcrypt-linux-arm64-musl": 1.9.0 + "@node-rs/bcrypt-linux-x64-gnu": 1.9.0 + "@node-rs/bcrypt-linux-x64-musl": 1.9.0 + "@node-rs/bcrypt-wasm32-wasi": 1.9.0 + "@node-rs/bcrypt-win32-arm64-msvc": 1.9.0 + "@node-rs/bcrypt-win32-ia32-msvc": 1.9.0 + "@node-rs/bcrypt-win32-x64-msvc": 1.9.0 + dev: false + /@node-rs/bcrypt@1.9.2: resolution: { @@ -2252,76 +2709,78 @@ packages: engines: { node: ">= 8" } dependencies: "@nodelib/fs.scandir": 2.1.5 - fastq: 1.17.0 + fastq: 1.17.1 - /@scalar/api-client@0.9.3(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15): + /@replit/codemirror-css-color-picker@6.1.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1): resolution: { - integrity: sha512-mfTlCAy2cA2kMoDIZWC6PEW7NdCIHJ7DxKcc+YqRdmM1wJHFRQ8RqPB7kqHSaoRFMk0atJtQnzgjdIU63T9fZQ==, + integrity: sha512-lkjtzOy8+C4VhuHegUfaqxsIsLVVW+FCRpKE+IOU4bX3Fp6Yo3sHS1PCHy1QlOtmL+Y+08Yb+giKuMXLyYzjew==, + } + peerDependencies: + "@codemirror/language": ^6.0.0 + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.0.0 + dependencies: + "@codemirror/language": 6.10.1 + "@codemirror/state": 6.4.0 + "@codemirror/view": 6.23.1 + dev: false + + /@scalar/api-client@0.11.4(vue@3.4.18)(yjs@13.6.11): + resolution: + { + integrity: sha512-Yygj7J6CpbX17nP9ZohCwLUSwy6T/etZyh6bm0J/Yje0MJHkJjGkQjco+8sA12EmtFcvtkP/0ZT4+HT+WYVWsA==, } engines: { node: ">=18" } peerDependencies: vue: ^3.3.0 dependencies: - "@headlessui/vue": 1.7.17(vue@3.4.15) - "@scalar/themes": 0.5.4(vue@3.4.15) - "@scalar/use-codemirror": 0.7.19(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15) - "@scalar/use-keyboard-event": 0.5.8(vue@3.4.15) - "@scalar/use-modal": 0.2.3(@headlessui/vue@1.7.17)(vue@3.4.15) - "@vueuse/core": 10.7.2(vue@3.4.15) + "@headlessui/vue": 1.7.19(vue@3.4.18) + "@scalar/themes": 0.5.4(vue@3.4.18) + "@scalar/use-codemirror": 0.8.3(vue@3.4.18)(yjs@13.6.11) + "@scalar/use-keyboard-event": 0.5.8(vue@3.4.18) + "@scalar/use-modal": 0.2.3(@headlessui/vue@1.7.19)(vue@3.4.18) + "@vueuse/core": 10.7.2(vue@3.4.18) axios: 1.6.7 content-type: 1.0.5 javascript-time-ago: 2.5.9 - nanoid: 5.0.4 + nanoid: 5.0.5 pretty-bytes: 6.1.1 pretty-ms: 8.0.0 - vue: 3.4.15(typescript@5.3.3) + vue: 3.4.18(typescript@5.3.3) transitivePeerDependencies: - - "@codemirror/lang-html" - - "@codemirror/lang-java" - - "@codemirror/lang-javascript" - - "@codemirror/lang-json" - - "@codemirror/lang-python" - - "@codemirror/language" - - "@codemirror/legacy-modes" - - "@codemirror/state" - - "@codemirror/view" - - "@lezer/common" - - "@lezer/highlight" - - "@lezer/lr" - - "@uiw/codemirror-themes" - "@vue/composition-api" - - codemirror - debug + - yjs dev: false - /@scalar/api-reference@1.13.18(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(nanoid@5.0.4)(postcss@8.4.33)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15): + /@scalar/api-reference@1.15.4(nanoid@5.0.5)(postcss@8.4.35)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.18)(yjs@13.6.11): resolution: { - integrity: sha512-K9p/cxH1mwwyiQf5q38Y+lBofxesleUsMJBT/ZxAHLaiO+1urXDnaEeyIAonXoEaprltvfhICWLvG8W+J6CmyA==, + integrity: sha512-+CYprpFAogbWBR/EtMrJrvkpmmfCH0eSMVPq8JZafiuZnXc0BbKG1zihepL/QCTAVo8oUmutfll9foYz0P0/lQ==, } engines: { node: ">=18" } peerDependencies: unified: ^11.0.0 vue: ^3.3.0 dependencies: - "@floating-ui/vue": 1.0.5(vue@3.4.15) - "@headlessui/vue": 1.7.17(vue@3.4.15) - "@scalar/api-client": 0.9.3(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15) + "@floating-ui/vue": 1.0.6(vue@3.4.18) + "@headlessui/vue": 1.7.19(vue@3.4.18) + "@scalar/api-client": 0.11.4(vue@3.4.18)(yjs@13.6.11) "@scalar/components": 0.2.2(typescript@5.3.3) "@scalar/snippetz": 0.1.5 - "@scalar/swagger-editor": 0.9.8(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/view@6.23.1)(@headlessui/vue@1.7.17)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15) + "@scalar/swagger-editor": 0.10.3(typescript@5.3.3)(vue@3.4.18)(yjs@13.6.11) "@scalar/swagger-parser": 0.5.15(openapi-types@12.1.3) - "@scalar/themes": 0.5.4(vue@3.4.15) - "@scalar/use-clipboard": 0.5.13(@scalar/use-toasts@0.5.13)(nanoid@5.0.4) - "@scalar/use-codemirror": 0.7.19(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15) - "@scalar/use-keyboard-event": 0.5.8(vue@3.4.15) - "@scalar/use-modal": 0.2.3(@headlessui/vue@1.7.17)(vue@3.4.15) - "@scalar/use-toasts": 0.5.13(nanoid@5.0.4)(vue@3.4.15) - "@scalar/use-tooltip": 0.5.8(vue@3.4.15) + "@scalar/themes": 0.5.4(vue@3.4.18) + "@scalar/use-clipboard": 0.5.13(@scalar/use-toasts@0.5.13)(nanoid@5.0.5) + "@scalar/use-codemirror": 0.8.3(vue@3.4.18)(yjs@13.6.11) + "@scalar/use-keyboard-event": 0.5.8(vue@3.4.18) + "@scalar/use-modal": 0.2.3(@headlessui/vue@1.7.19)(vue@3.4.18) + "@scalar/use-toasts": 0.5.13(nanoid@5.0.5)(vue@3.4.18) + "@scalar/use-tooltip": 0.5.8(vue@3.4.18) "@unhead/schema": 1.8.10 "@vcarl/remark-headings": 0.1.0 - "@vueuse/core": 10.7.2(vue@3.4.15) + "@vueuse/core": 10.7.2(vue@3.4.18) "@xmldom/xmldom": 0.8.10 axios: 1.6.7 fuse.js: 6.6.2 @@ -2329,41 +2788,30 @@ packages: httpsnippet-lite: 3.0.5 js-yaml: 4.1.0 openapi-types: 12.1.3 - postcss-nested: 6.0.1(postcss@8.4.33) + postcss-nested: 6.0.1(postcss@8.4.35) rehype-external-links: 3.0.0 rehype-format: 5.0.0 rehype-highlight: 7.0.0 + rehype-raw: 7.0.0 rehype-sanitize: 6.0.0 rehype-slug-custom-id: 1.1.0 rehype-stringify: 10.0.0 remark-gfm: 4.0.0 + remark-html: 16.0.1 remark-parse: 11.0.0 remark-rehype: 11.1.0 remark-stringify: 11.0.0 unhead: 1.8.10 unified: 11.0.4 - vue: 3.4.15(typescript@5.3.3) + vue: 3.4.18(typescript@5.3.3) transitivePeerDependencies: - - "@codemirror/lang-html" - - "@codemirror/lang-java" - - "@codemirror/lang-javascript" - - "@codemirror/lang-json" - - "@codemirror/lang-python" - - "@codemirror/language" - - "@codemirror/legacy-modes" - - "@codemirror/state" - - "@codemirror/view" - - "@lezer/common" - - "@lezer/highlight" - - "@lezer/lr" - - "@uiw/codemirror-themes" - "@vue/composition-api" - - codemirror - debug - nanoid - postcss - supports-color - typescript + - yjs dev: false /@scalar/components@0.2.2(typescript@5.3.3): @@ -2373,46 +2821,32 @@ packages: } engines: { node: ">=18" } dependencies: - "@headlessui/vue": 1.7.17(vue@3.4.15) - "@vueuse/core": 10.7.2(vue@3.4.15) + "@headlessui/vue": 1.7.19(vue@3.4.18) + "@vueuse/core": 10.7.2(vue@3.4.18) "@xmldom/xmldom": 0.8.10 class-variance-authority: 0.7.0 cva: 1.0.0-beta.1(typescript@5.3.3) - nanoid: 5.0.4 + nanoid: 5.0.5 tailwind-merge: 2.2.1 - vue: 3.4.15(typescript@5.3.3) + vue: 3.4.18(typescript@5.3.3) transitivePeerDependencies: - "@vue/composition-api" - typescript dev: false - /@scalar/hono-api-reference@0.3.29(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(hono@3.12.8)(nanoid@5.0.4)(postcss@8.4.33)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15): + /@scalar/hono-api-reference@0.3.46(hono@3.12.12)(nanoid@5.0.5)(postcss@8.4.35)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.18)(yjs@13.6.11): resolution: { - integrity: sha512-JKGwToiBBaLr2kuxPzoP+rDbceT2ILDBKACTK1c/LTvnLKJL/CcB6BiRfRjAKuVoIecPC7nVFoka/GXQkbUd7Q==, + integrity: sha512-CblNLk8Ihmt0GK85y13mdZrj/bMTvULthEoGXaHqJdzJq+p2q4qRSSDSLgOusiFSz21w+Qp0R92I6hMLdsgkPQ==, } engines: { node: ">=18" } peerDependencies: hono: ^3.0.0 dependencies: - "@scalar/api-reference": 1.13.18(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(nanoid@5.0.4)(postcss@8.4.33)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15) - hono: 3.12.8 + "@scalar/api-reference": 1.15.4(nanoid@5.0.5)(postcss@8.4.35)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.18)(yjs@13.6.11) + hono: 3.12.12 transitivePeerDependencies: - - "@codemirror/lang-html" - - "@codemirror/lang-java" - - "@codemirror/lang-javascript" - - "@codemirror/lang-json" - - "@codemirror/lang-python" - - "@codemirror/language" - - "@codemirror/legacy-modes" - - "@codemirror/state" - - "@codemirror/view" - - "@lezer/common" - - "@lezer/highlight" - - "@lezer/lr" - - "@uiw/codemirror-themes" - "@vue/composition-api" - - codemirror - debug - nanoid - postcss @@ -2420,6 +2854,7 @@ packages: - typescript - unified - vue + - yjs dev: false /@scalar/snippetz-core@0.1.3: @@ -2470,52 +2905,24 @@ packages: "@scalar/snippetz-plugin-node-undici": 0.1.5 dev: false - /@scalar/swagger-editor@0.9.8(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/view@6.23.1)(@headlessui/vue@1.7.17)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.15): + /@scalar/swagger-editor@0.10.3(typescript@5.3.3)(vue@3.4.18)(yjs@13.6.11): resolution: { - integrity: sha512-VxhbqaZVwEy7Od29Kxbg6a/6AM7md/ugcD2pNCw2wUv1PcV/ru+9imJkfClI3HfUXZN/IyLDaZpaNZadCB4Rrw==, + integrity: sha512-QVVjgdheflq+n8ZZoTzyCDkVYEculiVri1VSONCFXho/xzsluqsFQiMq98YBZYL9fQnA3cRoC+R/xD83/Cg+Vg==, } engines: { node: ">=18" } peerDependencies: - unified: ^11.0.0 vue: ^3.3.0 dependencies: - "@codemirror/state": 6.4.0 "@scalar/components": 0.2.2(typescript@5.3.3) - "@scalar/themes": 0.5.4(vue@3.4.15) - "@scalar/use-codemirror": 0.7.19(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15) - "@scalar/use-modal": 0.2.3(@headlessui/vue@1.7.17)(vue@3.4.15) - "@vueuse/core": 10.7.2(vue@3.4.15) - nanoid: 5.0.4 - rehype-external-links: 3.0.0 - rehype-format: 5.0.0 - rehype-highlight: 7.0.0 - rehype-sanitize: 6.0.0 - rehype-slug-custom-id: 1.1.0 - rehype-stringify: 10.0.0 - remark-gfm: 4.0.0 - remark-parse: 11.0.0 - remark-rehype: 11.1.0 - unified: 11.0.4 - vue: 3.4.15(typescript@5.3.3) + "@scalar/themes": 0.5.4(vue@3.4.18) + "@scalar/use-codemirror": 0.8.3(vue@3.4.18)(yjs@13.6.11) + "@vueuse/core": 10.7.2(vue@3.4.18) + vue: 3.4.18(typescript@5.3.3) transitivePeerDependencies: - - "@codemirror/lang-html" - - "@codemirror/lang-java" - - "@codemirror/lang-javascript" - - "@codemirror/lang-json" - - "@codemirror/lang-python" - - "@codemirror/language" - - "@codemirror/legacy-modes" - - "@codemirror/view" - - "@headlessui/vue" - - "@lezer/common" - - "@lezer/highlight" - - "@lezer/lr" - - "@uiw/codemirror-themes" - "@vue/composition-api" - - codemirror - - supports-color - typescript + - yjs dev: false /@scalar/swagger-parser@0.5.15(openapi-types@12.1.3): @@ -2531,7 +2938,7 @@ packages: - openapi-types dev: false - /@scalar/themes@0.5.4(vue@3.4.15): + /@scalar/themes@0.5.4(vue@3.4.18): resolution: { integrity: sha512-3tmivqGFJwmxmPygWls5W5qyQAt2Ax8tUVi/eVHb8+UYs5ADTzhNKeOu/CipKeZO9z+tfO+UO+XLhy2qb5T+dA==, @@ -2540,10 +2947,10 @@ packages: peerDependencies: vue: ^3.3.0 dependencies: - vue: 3.4.15(typescript@5.3.3) + vue: 3.4.18(typescript@5.3.3) dev: false - /@scalar/use-clipboard@0.5.13(@scalar/use-toasts@0.5.13)(nanoid@5.0.4): + /@scalar/use-clipboard@0.5.13(@scalar/use-toasts@0.5.13)(nanoid@5.0.5): resolution: { integrity: sha512-UtDu+ArEfHjHUGJzNZQdbFfP4CAPhPwJxcMAwG6KbwaRTNq4UNRS3+WoFmnVOOl8dPLVQFyMs10A2ca2HgJGcA==, @@ -2553,51 +2960,44 @@ packages: "@scalar/use-toasts": 0.5.13 nanoid: ^5.0.1 dependencies: - "@scalar/use-toasts": 0.5.13(nanoid@5.0.4)(vue@3.4.15) - nanoid: 5.0.4 + "@scalar/use-toasts": 0.5.13(nanoid@5.0.5)(vue@3.4.18) + nanoid: 5.0.5 dev: false - /@scalar/use-codemirror@0.7.19(@codemirror/lang-html@6.4.8)(@codemirror/lang-java@6.0.1)(@codemirror/lang-javascript@6.2.1)(@codemirror/lang-json@6.0.1)(@codemirror/lang-python@6.1.3)(@codemirror/language@6.10.0)(@codemirror/legacy-modes@6.3.3)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1)(@lezer/highlight@1.2.0)(@lezer/lr@1.4.0)(@uiw/codemirror-themes@4.21.21)(codemirror@6.0.1)(vue@3.4.15): + /@scalar/use-codemirror@0.8.3(vue@3.4.18)(yjs@13.6.11): resolution: { - integrity: sha512-xS6/JsVeQ983K6B/6RJMfmgl5GNst7zPbspSPxKwRCbwV5qBZaVWMhop6HQ5mnmanJTXxeh6krRG3K8tFbsuyg==, + integrity: sha512-f0Zuj3A9qgIquD0Wkq5Q4MI/fVwmbasDfUiDkUDfpgIdCrKRlFEmKmYHhRmb415GMUoiJrx/7kuwcpq2Iwn71A==, } engines: { node: ">=18" } peerDependencies: - "@codemirror/lang-html": ^6.0.0 - "@codemirror/lang-java": ^6.0.0 - "@codemirror/lang-javascript": ^6.0.0 - "@codemirror/lang-json": ^6.0.0 - "@codemirror/lang-python": ^6.0.0 - "@codemirror/language": ^6.0.0 - "@codemirror/legacy-modes": ^6.0.0 - "@codemirror/state": ^6.4.0 - "@codemirror/view": ^6.0.0 - "@lezer/common": ^1.1.0 - "@lezer/highlight": ^1.1.0 - "@lezer/lr": ^1.3.0 - "@uiw/codemirror-themes": ^4.21.0 - codemirror: ^6.0.0 vue: ^3.3.0 + yjs: ^13.6.0 dependencies: + "@codemirror/lang-css": 6.2.1(@codemirror/view@6.23.1) "@codemirror/lang-html": 6.4.8 "@codemirror/lang-java": 6.0.1 "@codemirror/lang-javascript": 6.2.1 "@codemirror/lang-json": 6.0.1 - "@codemirror/lang-python": 6.1.3(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) - "@codemirror/language": 6.10.0 + "@codemirror/lang-php": 6.0.1 + "@codemirror/lang-python": 6.1.4(@codemirror/view@6.23.1) + "@codemirror/lang-rust": 6.0.1 + "@codemirror/language": 6.10.1 "@codemirror/legacy-modes": 6.3.3 "@codemirror/state": 6.4.0 "@codemirror/view": 6.23.1 "@lezer/common": 1.2.1 "@lezer/highlight": 1.2.0 "@lezer/lr": 1.4.0 - "@uiw/codemirror-themes": 4.21.21(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1) + "@replit/codemirror-css-color-picker": 6.1.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1) + "@uiw/codemirror-themes": 4.21.21(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1) codemirror: 6.0.1(@lezer/common@1.2.1) - vue: 3.4.15(typescript@5.3.3) + vue: 3.4.18(typescript@5.3.3) + y-codemirror.next: 0.3.2(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(yjs@13.6.11) + yjs: 13.6.11 dev: false - /@scalar/use-keyboard-event@0.5.8(vue@3.4.15): + /@scalar/use-keyboard-event@0.5.8(vue@3.4.18): resolution: { integrity: sha512-LcqgZOZWOKIDCftfR4+qOXEtbvXtTtHSObRF2egpctsXgGHlyKY5KjPOoffbvwdh21rLa5ITBy+emwAm2i6Xww==, @@ -2606,10 +3006,10 @@ packages: peerDependencies: vue: ^3.3.0 dependencies: - vue: 3.4.15(typescript@5.3.3) + vue: 3.4.18(typescript@5.3.3) dev: false - /@scalar/use-modal@0.2.3(@headlessui/vue@1.7.17)(vue@3.4.15): + /@scalar/use-modal@0.2.3(@headlessui/vue@1.7.19)(vue@3.4.18): resolution: { integrity: sha512-qCn8rNCTy7jO/7DDalsMM+m1jBfEE/Fnx3Im966uBzCdxdyLbJ8f9S2ZwmW44KP6CXbsMGsuORkvY6Z8joZvMg==, @@ -2619,11 +3019,11 @@ packages: "@headlessui/vue": ^1.7.0 vue: ^3.3.0 dependencies: - "@headlessui/vue": 1.7.17(vue@3.4.15) - vue: 3.4.15(typescript@5.3.3) + "@headlessui/vue": 1.7.19(vue@3.4.18) + vue: 3.4.18(typescript@5.3.3) dev: false - /@scalar/use-toasts@0.5.13(nanoid@5.0.4)(vue@3.4.15): + /@scalar/use-toasts@0.5.13(nanoid@5.0.5)(vue@3.4.18): resolution: { integrity: sha512-EiFezCmWchaYfwEDTkSv/r7x6aYOlaFcu+zpTaV/y3ppCIybLvL3WRQzQS0KMaCJJBmQecZbCqMPnRLlacPwYw==, @@ -2633,11 +3033,11 @@ packages: nanoid: 4 - 5 vue: ^3.3.0 dependencies: - nanoid: 5.0.4 - vue: 3.4.15(typescript@5.3.3) + nanoid: 5.0.5 + vue: 3.4.18(typescript@5.3.3) dev: false - /@scalar/use-tooltip@0.5.8(vue@3.4.15): + /@scalar/use-tooltip@0.5.8(vue@3.4.18): resolution: { integrity: sha512-9gCa7UGlRQVrKVy3tp5WYn/vCS1Fk0mcPlpkoffPeekS/4A01K3SpddqM76gVUNnOvDOq0EPEbVvUO1deB9oGw==, @@ -2646,7 +3046,7 @@ packages: peerDependencies: vue: ^3.3.0 dependencies: - vue: 3.4.15(typescript@5.3.3) + vue: 3.4.18(typescript@5.3.3) dev: false /@tanstack/virtual-core@3.0.0: @@ -2656,16 +3056,16 @@ packages: } dev: false - /@tanstack/vue-virtual@3.0.2(vue@3.4.15): + /@tanstack/vue-virtual@3.0.4(vue@3.4.18): resolution: { - integrity: sha512-1iFpX+yZswHuf4wrA6GU9yJ/YzQ/8SacABwqghwCkcwrkZbOPLlRSdOAqZ1WQ50SftmfhZpaiZl2KmpV7cgfMQ==, + integrity: sha512-SDk3n+dMZnAXEAx+HZ0wQwBN00Ne7Qk4z29QnawJy6jzOOpoajt7Mm6gIEERin1D4ALxW5WpuDqhlnV2TNFQ+A==, } peerDependencies: vue: ^2.7.0 || ^3.0.0 dependencies: "@tanstack/virtual-core": 3.0.0 - vue: 3.4.15(typescript@5.3.3) + vue: 3.4.18(typescript@5.3.3) dev: false /@tybys/wasm-util@0.8.1: @@ -2695,19 +3095,19 @@ packages: } dev: false - /@types/hast@2.3.9: + /@types/hast@2.3.10: resolution: { - integrity: sha512-pTHyNlaMD/oKJmS+ZZUyFUcsZeBZpC0lmGquw98CqRVNgAdJZJeD7GoeLiT6Xbx5rU9VCjSt0RwEvDgzh4obFw==, + integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==, } dependencies: "@types/unist": 2.0.10 dev: false - /@types/hast@3.0.3: + /@types/hast@3.0.4: resolution: { - integrity: sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==, + integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==, } dependencies: "@types/unist": 3.0.2 @@ -2751,7 +3151,7 @@ packages: integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==, } dependencies: - "@types/node": 20.11.8 + "@types/node": 20.11.17 form-data: 4.0.0 dev: false @@ -2761,13 +3161,13 @@ packages: integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==, } dependencies: - "@types/node": 20.11.8 + "@types/node": 20.11.17 dev: true - /@types/node@20.11.8: + /@types/node@20.11.17: resolution: { - integrity: sha512-i7omyekpPTNdv4Jb/Rgqg0RU8YqLcNsI12quKSDkRXNfx7Wxdm6HhK1awT3xTgEkgxPn3bvnSpiEAc7a7Lpyow==, + integrity: sha512-QmgQZGWu1Yw9TDyAP9ZzpFJKynYNeOvwMJmaxABfieQoVoiVOS6MN1WSpqpRcbeA5+RW82kraAVxCCJg+780Qw==, } dependencies: undici-types: 5.26.5 @@ -2806,13 +3206,13 @@ packages: integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==, } dependencies: - "@types/node": 20.11.8 + "@types/node": 20.11.17 dev: false - /@typescript-eslint/eslint-plugin@6.19.1(@typescript-eslint/parser@6.19.1)(eslint@8.56.0)(typescript@5.3.3): + /@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.3.3): resolution: { - integrity: sha512-roQScUGFruWod9CEyoV5KlCYrubC/fvG8/1zXuT0WTcxX87GnMMmnksMwSg99lo1xiKrBzw2icsJPMAw1OtKxg==, + integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -2824,27 +3224,27 @@ packages: optional: true dependencies: "@eslint-community/regexpp": 4.10.0 - "@typescript-eslint/parser": 6.19.1(eslint@8.56.0)(typescript@5.3.3) - "@typescript-eslint/scope-manager": 6.19.1 - "@typescript-eslint/type-utils": 6.19.1(eslint@8.56.0)(typescript@5.3.3) - "@typescript-eslint/utils": 6.19.1(eslint@8.56.0)(typescript@5.3.3) - "@typescript-eslint/visitor-keys": 6.19.1 + "@typescript-eslint/parser": 6.21.0(eslint@8.56.0)(typescript@5.3.3) + "@typescript-eslint/scope-manager": 6.21.0 + "@typescript-eslint/type-utils": 6.21.0(eslint@8.56.0)(typescript@5.3.3) + "@typescript-eslint/utils": 6.21.0(eslint@8.56.0)(typescript@5.3.3) + "@typescript-eslint/visitor-keys": 6.21.0 debug: 4.3.4 eslint: 8.56.0 graphemer: 1.4.0 - ignore: 5.3.0 + ignore: 5.3.1 natural-compare: 1.4.0 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.3.3) + semver: 7.6.0 + ts-api-utils: 1.2.1(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/parser@6.19.1(eslint@8.56.0)(typescript@5.3.3): + /@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3): resolution: { - integrity: sha512-WEfX22ziAh6pRE9jnbkkLGp/4RhTpffr2ZK5bJ18M8mIfA8A+k97U9ZyaXCEJRlmMHh7R9MJZWXp/r73DzINVQ==, + integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -2854,10 +3254,10 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/scope-manager": 6.19.1 - "@typescript-eslint/types": 6.19.1 - "@typescript-eslint/typescript-estree": 6.19.1(typescript@5.3.3) - "@typescript-eslint/visitor-keys": 6.19.1 + "@typescript-eslint/scope-manager": 6.21.0 + "@typescript-eslint/types": 6.21.0 + "@typescript-eslint/typescript-estree": 6.21.0(typescript@5.3.3) + "@typescript-eslint/visitor-keys": 6.21.0 debug: 4.3.4 eslint: 8.56.0 typescript: 5.3.3 @@ -2865,21 +3265,21 @@ packages: - supports-color dev: false - /@typescript-eslint/scope-manager@6.19.1: + /@typescript-eslint/scope-manager@6.21.0: resolution: { - integrity: sha512-4CdXYjKf6/6aKNMSly/BP4iCSOpvMmqtDzRtqFyyAae3z5kkqEjKndR5vDHL8rSuMIIWP8u4Mw4VxLyxZW6D5w==, + integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==, } engines: { node: ^16.0.0 || >=18.0.0 } dependencies: - "@typescript-eslint/types": 6.19.1 - "@typescript-eslint/visitor-keys": 6.19.1 + "@typescript-eslint/types": 6.21.0 + "@typescript-eslint/visitor-keys": 6.21.0 dev: false - /@typescript-eslint/type-utils@6.19.1(eslint@8.56.0)(typescript@5.3.3): + /@typescript-eslint/type-utils@6.21.0(eslint@8.56.0)(typescript@5.3.3): resolution: { - integrity: sha512-0vdyld3ecfxJuddDjACUvlAeYNrHP/pDeQk2pWBR2ESeEzQhg52DF53AbI9QCBkYE23lgkhLCZNkHn2hEXXYIg==, + integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -2889,28 +3289,28 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/typescript-estree": 6.19.1(typescript@5.3.3) - "@typescript-eslint/utils": 6.19.1(eslint@8.56.0)(typescript@5.3.3) + "@typescript-eslint/typescript-estree": 6.21.0(typescript@5.3.3) + "@typescript-eslint/utils": 6.21.0(eslint@8.56.0)(typescript@5.3.3) debug: 4.3.4 eslint: 8.56.0 - ts-api-utils: 1.0.3(typescript@5.3.3) + ts-api-utils: 1.2.1(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/types@6.19.1: + /@typescript-eslint/types@6.21.0: resolution: { - integrity: sha512-6+bk6FEtBhvfYvpHsDgAL3uo4BfvnTnoge5LrrCj2eJN8g3IJdLTD4B/jK3Q6vo4Ql/Hoip9I8aB6fF+6RfDqg==, + integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==, } engines: { node: ^16.0.0 || >=18.0.0 } dev: false - /@typescript-eslint/typescript-estree@6.19.1(typescript@5.3.3): + /@typescript-eslint/typescript-estree@6.21.0(typescript@5.3.3): resolution: { - integrity: sha512-aFdAxuhzBFRWhy+H20nYu19+Km+gFfwNO4TEqyszkMcgBDYQjmPJ61erHxuT2ESJXhlhrO7I5EFIlZ+qGR8oVA==, + integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -2919,23 +3319,23 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/types": 6.19.1 - "@typescript-eslint/visitor-keys": 6.19.1 + "@typescript-eslint/types": 6.21.0 + "@typescript-eslint/visitor-keys": 6.21.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.3.3) + semver: 7.6.0 + ts-api-utils: 1.2.1(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/utils@6.19.1(eslint@8.56.0)(typescript@5.3.3): + /@typescript-eslint/utils@6.21.0(eslint@8.56.0)(typescript@5.3.3): resolution: { - integrity: sha512-JvjfEZuP5WoMqwh9SPAPDSHSg9FBHHGhjPugSRxu5jMfjvBpq5/sGTD+9M9aQ5sh6iJ8AY/Kk/oUYVEMAPwi7w==, + integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -2944,28 +3344,28 @@ packages: "@eslint-community/eslint-utils": 4.4.0(eslint@8.56.0) "@types/json-schema": 7.0.15 "@types/semver": 7.5.6 - "@typescript-eslint/scope-manager": 6.19.1 - "@typescript-eslint/types": 6.19.1 - "@typescript-eslint/typescript-estree": 6.19.1(typescript@5.3.3) + "@typescript-eslint/scope-manager": 6.21.0 + "@typescript-eslint/types": 6.21.0 + "@typescript-eslint/typescript-estree": 6.21.0(typescript@5.3.3) eslint: 8.56.0 - semver: 7.5.4 + semver: 7.6.0 transitivePeerDependencies: - supports-color - typescript dev: false - /@typescript-eslint/visitor-keys@6.19.1: + /@typescript-eslint/visitor-keys@6.21.0: resolution: { - integrity: sha512-gkdtIO+xSO/SmI0W68DBg4u1KElmIUo3vXzgHyGPs6cxgB0sa3TlptRAAE0hUY1hM6FcDKEv7aIwiTGm76cXfQ==, + integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==, } engines: { node: ^16.0.0 || >=18.0.0 } dependencies: - "@typescript-eslint/types": 6.19.1 + "@typescript-eslint/types": 6.21.0 eslint-visitor-keys: 3.4.3 dev: false - /@uiw/codemirror-themes@4.21.21(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1): + /@uiw/codemirror-themes@4.21.21(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1): resolution: { integrity: sha512-ljVcMGdaxo75UaH+EqxJ+jLyMVVgeSfW2AKyT1VeLy+4SDpuqNQ7wq5XVxktsG6LH+OvgSFndWXgPANf4+gQcA==, @@ -2975,7 +3375,7 @@ packages: "@codemirror/state": ">=6.0.0" "@codemirror/view": ">=6.0.0" dependencies: - "@codemirror/language": 6.10.0 + "@codemirror/language": 6.10.1 "@codemirror/state": 6.4.0 "@codemirror/view": 6.23.1 dev: false @@ -3025,107 +3425,107 @@ packages: unist-util-visit: 4.1.2 dev: false - /@vue/compiler-core@3.4.15: + /@vue/compiler-core@3.4.18: resolution: { - integrity: sha512-XcJQVOaxTKCnth1vCxEChteGuwG6wqnUHxAm1DO3gCz0+uXKaJNx8/digSz4dLALCy8n2lKq24jSUs8segoqIw==, + integrity: sha512-F7YK8lMK0iv6b9/Gdk15A67wM0KKZvxDxed0RR60C1z9tIJTKta+urs4j0RTN5XqHISzI3etN3mX0uHhjmoqjQ==, } dependencies: "@babel/parser": 7.23.9 - "@vue/shared": 3.4.15 + "@vue/shared": 3.4.18 entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.0.2 dev: false - /@vue/compiler-dom@3.4.15: + /@vue/compiler-dom@3.4.18: resolution: { - integrity: sha512-wox0aasVV74zoXyblarOM3AZQz/Z+OunYcIHe1OsGclCHt8RsRm04DObjefaI82u6XDzv+qGWZ24tIsRAIi5MQ==, + integrity: sha512-24Eb8lcMfInefvQ6YlEVS18w5Q66f4+uXWVA+yb7praKbyjHRNuKVWGuinfSSjM0ZIiPi++QWukhkgznBaqpEA==, } dependencies: - "@vue/compiler-core": 3.4.15 - "@vue/shared": 3.4.15 + "@vue/compiler-core": 3.4.18 + "@vue/shared": 3.4.18 dev: false - /@vue/compiler-sfc@3.4.15: + /@vue/compiler-sfc@3.4.18: resolution: { - integrity: sha512-LCn5M6QpkpFsh3GQvs2mJUOAlBQcCco8D60Bcqmf3O3w5a+KWS5GvYbrrJBkgvL1BDnTp+e8q0lXCLgHhKguBA==, + integrity: sha512-rG5tqtnzwrVpMqAQ7FHtvHaV70G6LLfJIWLYZB/jZ9m/hrnZmIQh+H3ewnC5onwe/ibljm9+ZupxeElzqCkTAw==, } dependencies: "@babel/parser": 7.23.9 - "@vue/compiler-core": 3.4.15 - "@vue/compiler-dom": 3.4.15 - "@vue/compiler-ssr": 3.4.15 - "@vue/shared": 3.4.15 + "@vue/compiler-core": 3.4.18 + "@vue/compiler-dom": 3.4.18 + "@vue/compiler-ssr": 3.4.18 + "@vue/shared": 3.4.18 estree-walker: 2.0.2 - magic-string: 0.30.5 - postcss: 8.4.33 + magic-string: 0.30.7 + postcss: 8.4.35 source-map-js: 1.0.2 dev: false - /@vue/compiler-ssr@3.4.15: + /@vue/compiler-ssr@3.4.18: resolution: { - integrity: sha512-1jdeQyiGznr8gjFDadVmOJqZiLNSsMa5ZgqavkPZ8O2wjHv0tVuAEsw5hTdUoUW4232vpBbL/wJhzVW/JwY1Uw==, + integrity: sha512-hSlv20oUhPxo2UYUacHgGaxtqP0tvFo6ixxxD6JlXIkwzwoZ9eKK6PFQN4hNK/R13JlNyldwWt/fqGBKgWJ6nQ==, } dependencies: - "@vue/compiler-dom": 3.4.15 - "@vue/shared": 3.4.15 + "@vue/compiler-dom": 3.4.18 + "@vue/shared": 3.4.18 dev: false - /@vue/reactivity@3.4.15: + /@vue/reactivity@3.4.18: resolution: { - integrity: sha512-55yJh2bsff20K5O84MxSvXKPHHt17I2EomHznvFiJCAZpJTNW8IuLj1xZWMLELRhBK3kkFV/1ErZGHJfah7i7w==, + integrity: sha512-7uda2/I0jpLiRygprDo5Jxs2HJkOVXcOMlyVlY54yRLxoycBpwGJRwJT9EdGB4adnoqJDXVT2BilUAYwI7qvmg==, } dependencies: - "@vue/shared": 3.4.15 + "@vue/shared": 3.4.18 dev: false - /@vue/runtime-core@3.4.15: + /@vue/runtime-core@3.4.18: resolution: { - integrity: sha512-6E3by5m6v1AkW0McCeAyhHTw+3y17YCOKG0U0HDKDscV4Hs0kgNT5G+GCHak16jKgcCDHpI9xe5NKb8sdLCLdw==, + integrity: sha512-7mU9diCa+4e+8/wZ7Udw5pwTH10A11sZ1nldmHOUKJnzCwvZxfJqAtw31mIf4T5H2FsLCSBQT3xgioA9vIjyDQ==, } dependencies: - "@vue/reactivity": 3.4.15 - "@vue/shared": 3.4.15 + "@vue/reactivity": 3.4.18 + "@vue/shared": 3.4.18 dev: false - /@vue/runtime-dom@3.4.15: + /@vue/runtime-dom@3.4.18: resolution: { - integrity: sha512-EVW8D6vfFVq3V/yDKNPBFkZKGMFSvZrUQmx196o/v2tHKdwWdiZjYUBS+0Ez3+ohRyF8Njwy/6FH5gYJ75liUw==, + integrity: sha512-2y1Mkzcw1niSfG7z3Qx+2ir9Gb4hdTkZe5p/I8x1aTIKQE0vY0tPAEUPhZm5tx6183gG3D/KwHG728UR0sIufA==, } dependencies: - "@vue/runtime-core": 3.4.15 - "@vue/shared": 3.4.15 + "@vue/runtime-core": 3.4.18 + "@vue/shared": 3.4.18 csstype: 3.1.3 dev: false - /@vue/server-renderer@3.4.15(vue@3.4.15): + /@vue/server-renderer@3.4.18(vue@3.4.18): resolution: { - integrity: sha512-3HYzaidu9cHjrT+qGUuDhFYvF/j643bHC6uUN9BgM11DVy+pM6ATsG6uPBLnkwOgs7BpJABReLmpL3ZPAsUaqw==, + integrity: sha512-YJd1wa7mzUN3NRqLEsrwEYWyO+PUBSROIGlCc3J/cvn7Zu6CxhNLgXa8Z4zZ5ja5/nviYO79J1InoPeXgwBTZA==, } peerDependencies: - vue: 3.4.15 + vue: 3.4.18 dependencies: - "@vue/compiler-ssr": 3.4.15 - "@vue/shared": 3.4.15 - vue: 3.4.15(typescript@5.3.3) + "@vue/compiler-ssr": 3.4.18 + "@vue/shared": 3.4.18 + vue: 3.4.18(typescript@5.3.3) dev: false - /@vue/shared@3.4.15: + /@vue/shared@3.4.18: resolution: { - integrity: sha512-KzfPTxVaWfB+eGcGdbSf4CWdaXcGDqckoeXUh7SB3fZdEtzPCK2Vq9B/lRRL3yutax/LWITz+SwvgyOxz5V75g==, + integrity: sha512-CxouGFxxaW5r1WbrSmWwck3No58rApXgRSBxrqgnY1K+jk20F6DrXJkHdH9n4HVT+/B6G2CAn213Uq3npWiy8Q==, } dev: false - /@vueuse/core@10.7.2(vue@3.4.15): + /@vueuse/core@10.7.2(vue@3.4.18): resolution: { integrity: sha512-AOyAL2rK0By62Hm+iqQn6Rbu8bfmbgaIMXcE3TSr7BdQ42wnSFlwIdPjInO62onYsEMK/yDMU8C6oGfDAtZ2qQ==, @@ -3133,8 +3533,8 @@ packages: dependencies: "@types/web-bluetooth": 0.0.20 "@vueuse/metadata": 10.7.2 - "@vueuse/shared": 10.7.2(vue@3.4.15) - vue-demi: 0.14.6(vue@3.4.15) + "@vueuse/shared": 10.7.2(vue@3.4.18) + vue-demi: 0.14.7(vue@3.4.18) transitivePeerDependencies: - "@vue/composition-api" - vue @@ -3147,13 +3547,13 @@ packages: } dev: false - /@vueuse/shared@10.7.2(vue@3.4.15): + /@vueuse/shared@10.7.2(vue@3.4.18): resolution: { integrity: sha512-qFbXoxS44pi2FkgFjPvF4h7c9oMDutpyBdcJdMYIMg9XyXli2meFMuaKn+UMgsClo//Th6+beeCgqweT/79BVA==, } dependencies: - vue-demi: 0.14.6(vue@3.4.15) + vue-demi: 0.14.7(vue@3.4.18) transitivePeerDependencies: - "@vue/composition-api" - vue @@ -3296,6 +3696,20 @@ packages: } dev: false + /auri@1.0.2: + resolution: + { + integrity: sha512-OC54Bv+hAPvYlo98ZwK3cTo2ijg0CBylaAO5dZ/xZQ7e897k0o4qtxkUPQHruJrFUnL5BebCXz+bUAeXQHp9dg==, + } + hasBin: true + dependencies: + "@actions/core": 1.10.1 + dotenv: 16.4.1 + front-matter: 4.0.2 + nanoid: 4.0.2 + oslo: 1.1.0 + dev: false + /axios@1.6.7: resolution: { @@ -3329,10 +3743,10 @@ packages: } dev: false - /better-sqlite3@9.3.0: + /better-sqlite3@9.4.0: resolution: { - integrity: sha512-ww73jVpQhRRdS9uMr761ixlkl4bWoXi8hMQlBGhoN6vPNlUHpIsNmw4pKN6kjknlt/wopdvXHvLk1W75BI+n0Q==, + integrity: sha512-5kynxekMxSjCMiFyUBLHggFcJkCmiZi6fUkiGz/B5GZOvdRWQJD0klqCx5/Y+bm2AKP7I/DHbSFx26AxjruWNg==, } requiresBuild: true dependencies: @@ -3498,10 +3912,10 @@ packages: } dev: false - /chokidar@3.5.3: + /chokidar@3.6.0: resolution: { - integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, + integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==, } engines: { node: ">= 8.10.0" } dependencies: @@ -3560,11 +3974,11 @@ packages: integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==, } dependencies: - "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.0)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) + "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) "@codemirror/commands": 6.3.3 - "@codemirror/language": 6.10.0 - "@codemirror/lint": 6.4.2 - "@codemirror/search": 6.5.5 + "@codemirror/language": 6.10.1 + "@codemirror/lint": 6.5.0 + "@codemirror/search": 6.5.6 "@codemirror/state": 6.4.0 "@codemirror/view": 6.23.1 transitivePeerDependencies: @@ -3838,7 +4252,6 @@ packages: integrity: sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ==, } engines: { node: ">=12" } - dev: true /dreamopt@0.8.0: resolution: @@ -3850,10 +4263,10 @@ packages: wordwrap: 1.0.0 dev: true - /drizzle-kit@0.20.13: + /drizzle-kit@0.20.14: resolution: { - integrity: sha512-j9oZSQXNWG+KBJm0Sg3S/zJpncHGKnpqNfFuM4NUxUMGTcihDHhP9SW6Jncqwb5vsP1Xm0a8JLm3PZUIspC/oA==, + integrity: sha512-0fHv3YIEaUcSVPSGyaaBfOi9bmpajjhbJNdPsRMIUvYdLVxBu9eGjH8mRc3Qk7HVmEidFc/lhG1YyJhoXrn5yA==, } hasBin: true dependencies: @@ -3869,13 +4282,13 @@ packages: hanji: 0.0.5 json-diff: 0.9.0 minimatch: 7.4.6 - semver: 7.5.4 + semver: 7.6.0 zod: 3.22.4 transitivePeerDependencies: - supports-color dev: true - /drizzle-orm@0.29.3(@cloudflare/workers-types@4.20240117.0)(@libsql/client@0.4.0)(better-sqlite3@9.3.0): + /drizzle-orm@0.29.3(@cloudflare/workers-types@4.20240208.0)(@libsql/client@0.4.3)(better-sqlite3@9.4.0): resolution: { integrity: sha512-uSE027csliGSGYD0pqtM+SAQATMREb3eSM/U8s6r+Y0RFwTKwftnwwSkqx3oS65UBgqDOM0gMTl5UGNpt6lW0A==, @@ -3949,9 +4362,9 @@ packages: sqlite3: optional: true dependencies: - "@cloudflare/workers-types": 4.20240117.0 - "@libsql/client": 0.4.0 - better-sqlite3: 9.3.0 + "@cloudflare/workers-types": 4.20240208.0 + "@libsql/client": 0.4.3 + better-sqlite3: 9.4.0 dev: false /drizzle-zod@0.5.1(drizzle-orm@0.29.3)(zod@3.22.4): @@ -3963,7 +4376,7 @@ packages: drizzle-orm: ">=0.23.13" zod: "*" dependencies: - drizzle-orm: 0.29.3(@cloudflare/workers-types@4.20240117.0)(@libsql/client@0.4.0)(better-sqlite3@9.3.0) + drizzle-orm: 0.29.3(@cloudflare/workers-types@4.20240208.0)(@libsql/client@0.4.3)(better-sqlite3@9.4.0) zod: 3.22.4 dev: false @@ -4217,7 +4630,7 @@ packages: glob-parent: 6.0.2 globals: 13.24.0 graphemer: 1.4.0 - ignore: 5.3.0 + ignore: 5.3.1 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 @@ -4373,10 +4786,10 @@ packages: integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, } - /fastq@1.17.0: + /fastq@1.17.1: resolution: { - integrity: sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==, + integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==, } dependencies: reusify: 1.0.4 @@ -4497,6 +4910,15 @@ packages: fetch-blob: 3.2.0 dev: false + /front-matter@4.0.2: + resolution: + { + integrity: sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==, + } + dependencies: + js-yaml: 3.14.1 + dev: false + /fs-constants@1.0.0: resolution: { @@ -4504,6 +4926,15 @@ packages: } dev: false + /fs-monkey@1.0.5: + resolution: + { + integrity: sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==, + } + requiresBuild: true + dev: false + optional: true + /fs.realpath@1.0.0: resolution: { @@ -4654,7 +5085,7 @@ packages: array-union: 2.1.0 dir-glob: 3.0.1 fast-glob: 3.3.2 - ignore: 5.3.0 + ignore: 5.3.1 merge2: 1.4.1 slash: 3.0.0 dev: false @@ -4698,7 +5129,7 @@ packages: integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==, } dependencies: - "@types/hast": 3.0.3 + "@types/hast": 3.0.4 hast-util-is-element: 3.0.0 dev: false @@ -4708,7 +5139,7 @@ packages: integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==, } dependencies: - "@types/hast": 3.0.3 + "@types/hast": 3.0.4 "@types/unist": 3.0.2 devlop: 1.1.0 hastscript: 8.0.0 @@ -4731,7 +5162,7 @@ packages: integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==, } dependencies: - "@types/hast": 3.0.3 + "@types/hast": 3.0.4 dev: false /hast-util-heading-rank@2.1.1: @@ -4740,7 +5171,7 @@ packages: integrity: sha512-iAuRp+ESgJoRFJbSyaqsfvJDY6zzmFoEnL1gtz1+U8gKtGGj1p0CVlysuUAUjq95qlZESHINLThwJzNGmgGZxA==, } dependencies: - "@types/hast": 2.3.9 + "@types/hast": 2.3.10 dev: false /hast-util-is-body-ok-link@3.0.0: @@ -4749,7 +5180,7 @@ packages: integrity: sha512-VFHY5bo2nY8HiV6nir2ynmEB1XkxzuUffhEGeVx7orbu/B1KaGyeGgMZldvMVx5xWrDlLLG/kQ6YkJAMkBEx0w==, } dependencies: - "@types/hast": 3.0.3 + "@types/hast": 3.0.4 dev: false /hast-util-is-element@3.0.0: @@ -4758,7 +5189,7 @@ packages: integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==, } dependencies: - "@types/hast": 3.0.3 + "@types/hast": 3.0.4 dev: false /hast-util-parse-selector@4.0.0: @@ -4767,7 +5198,7 @@ packages: integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==, } dependencies: - "@types/hast": 3.0.3 + "@types/hast": 3.0.4 dev: false /hast-util-phrasing@3.0.1: @@ -4776,7 +5207,7 @@ packages: integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==, } dependencies: - "@types/hast": 3.0.3 + "@types/hast": 3.0.4 hast-util-embedded: 3.0.0 hast-util-has-property: 3.0.0 hast-util-is-body-ok-link: 3.0.0 @@ -4789,7 +5220,7 @@ packages: integrity: sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA==, } dependencies: - "@types/hast": 3.0.3 + "@types/hast": 3.0.4 "@types/unist": 3.0.2 "@ungap/structured-clone": 1.2.0 hast-util-from-parse5: 8.0.1 @@ -4810,7 +5241,7 @@ packages: integrity: sha512-IGrgWLuip4O2nq5CugXy4GI2V8kx4sFVy5Hd4vF7AR2gxS0N9s7nEAVUyeMtZKZvzrxVsHt73XdTsno1tClIkQ==, } dependencies: - "@types/hast": 3.0.3 + "@types/hast": 3.0.4 "@ungap/structured-clone": 1.2.0 unist-util-position: 5.0.0 dev: false @@ -4821,7 +5252,7 @@ packages: integrity: sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw==, } dependencies: - "@types/hast": 3.0.3 + "@types/hast": 3.0.4 "@types/unist": 3.0.2 ccount: 2.0.1 comma-separated-tokens: 2.0.3 @@ -4841,7 +5272,7 @@ packages: integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==, } dependencies: - "@types/hast": 3.0.3 + "@types/hast": 3.0.4 comma-separated-tokens: 2.0.3 devlop: 1.1.0 property-information: 6.4.1 @@ -4856,7 +5287,7 @@ packages: integrity: sha512-02AQ3vLhuH3FisaMM+i/9sm4OXGSq1UhOOCpTLLQtHdL3tZt7qil69r8M8iDkZYyC0HCFylcYoP+8IO7ddta1A==, } dependencies: - "@types/hast": 2.3.9 + "@types/hast": 2.3.10 dev: false /hast-util-to-text@4.0.0: @@ -4865,7 +5296,7 @@ packages: integrity: sha512-EWiE1FSArNBPUo1cKWtzqgnuRQwEeQbQtnFJRYV1hb1BWDgrAlBU0ExptvZMM/KSA82cDpm2sFGf3Dmc5Mza3w==, } dependencies: - "@types/hast": 3.0.3 + "@types/hast": 3.0.4 "@types/unist": 3.0.2 hast-util-is-element: 3.0.0 unist-util-find-after: 5.0.0 @@ -4877,7 +5308,7 @@ packages: integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==, } dependencies: - "@types/hast": 3.0.3 + "@types/hast": 3.0.4 dev: false /hastscript@8.0.0: @@ -4886,7 +5317,7 @@ packages: integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==, } dependencies: - "@types/hast": 3.0.3 + "@types/hast": 3.0.4 comma-separated-tokens: 2.0.3 hast-util-parse-selector: 4.0.0 property-information: 6.4.1 @@ -4908,10 +5339,10 @@ packages: engines: { node: ">=12.0.0" } dev: false - /hono@3.12.8: + /hono@3.12.12: resolution: { - integrity: sha512-vnOEIRdqsp4uHE/dkOBr9EYmTsR86sD/FyG2xhfAQzR9udDRglN1nuO7SGc/7U3HfSorc6PSCNGN6upnVtCmfg==, + integrity: sha512-5IAMJOXfpA5nT+K0MNjClchzz0IhBHs2Szl7WFAhrFOsbtQsYmNynFyJRg/a3IPsmCfxcrf8txUGiNShXpK5Rg==, } engines: { node: ">=16.0.0" } dev: false @@ -4949,10 +5380,10 @@ packages: stringify-object: 3.3.0 dev: false - /husky@9.0.6: + /husky@9.0.10: resolution: { - integrity: sha512-EEuw/rfTiMjOfuL7pGO/i9otg1u36TXxqjIA6D9qxVjd/UXoDOsLor/BSFf5hTK50shwzCU3aVVwdXDp/lp7RA==, + integrity: sha512-TQGNknoiy6bURzIO77pPRu+XHi6zI7T93rX+QnJsoYFf3xdjKOur+IlfqzJGMHIK/wXrLg+GsvMs8Op7vI2jVA==, } engines: { node: ">=18" } hasBin: true @@ -4965,10 +5396,10 @@ packages: } dev: false - /ignore@5.3.0: + /ignore@5.3.1: resolution: { - integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==, + integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==, } engines: { node: ">= 4" } @@ -5121,6 +5552,13 @@ packages: integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, } + /isomorphic.js@0.2.5: + resolution: + { + integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==, + } + dev: false + /javascript-time-ago@2.5.9: resolution: { @@ -5212,6 +5650,17 @@ packages: prelude-ls: 1.2.1 type-check: 0.4.0 + /lib0@0.2.88: + resolution: + { + integrity: sha512-KyroiEvCeZcZEMx5Ys+b4u4eEBbA1ch7XUaBhYpwa/nPMrzTjUhI4RfcytmQfYoTBPcdyx+FX6WFNIoNuJzJfQ==, + } + engines: { node: ">=16" } + hasBin: true + dependencies: + isomorphic.js: 0.2.5 + dev: false + /libsql@0.2.0: resolution: { @@ -5219,6 +5668,7 @@ packages: } cpu: [x64, arm64] os: [darwin, linux, win32] + requiresBuild: true dependencies: "@neon-rs/load": 0.0.4 detect-libc: 2.0.2 @@ -5231,6 +5681,7 @@ packages: "@libsql/linux-x64-musl": 0.2.0 "@libsql/win32-x64-msvc": 0.2.0 dev: false + optional: true /locate-path@6.0.0: resolution: @@ -5274,7 +5725,7 @@ packages: integrity: sha512-CEbNVoSikAxwDMDPjXlqlFYiZLkDJHwyGu/MfOsJnF3d7f3tds5J3z8s/l9TMXhzfsJCCJEAsD78842mwmg0PQ==, } dependencies: - "@types/hast": 3.0.3 + "@types/hast": 3.0.4 devlop: 1.1.0 highlight.js: 11.9.0 dev: false @@ -5297,10 +5748,10 @@ packages: es5-ext: 0.10.62 dev: true - /lucia@3.0.0: + /lucia@3.0.1: resolution: { - integrity: sha512-60NQqjKuaqPrjHL10CQ1j3rQy8qwKd3XpSNNnNcZyZI+4w1QFJdtNcR4l0dZJ4kJ0DdwI/943yplL47V7IZbGQ==, + integrity: sha512-srwUkTCGgr6N4mFpaKZVZy5kwiRZdsrbIDv9Wrjar+xyw1MjojYQQ7oRbegjRWOZ3yI8xOOclK3sz/rga2J7/w==, } dependencies: oslo: 1.0.1 @@ -5315,10 +5766,10 @@ packages: sourcemap-codec: 1.4.8 dev: true - /magic-string@0.30.5: + /magic-string@0.30.7: resolution: { - integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==, + integrity: sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==, } engines: { node: ">=12" } dependencies: @@ -5376,7 +5827,7 @@ packages: ccount: 2.0.1 devlop: 1.1.0 mdast-util-find-and-replace: 3.0.1 - micromark-util-character: 2.0.1 + micromark-util-character: 2.1.0 dev: false /mdast-util-gfm-footnote@2.0.0: @@ -5453,10 +5904,10 @@ packages: - supports-color dev: false - /mdast-util-phrasing@4.0.0: + /mdast-util-phrasing@4.1.0: resolution: { - integrity: sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==, + integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==, } dependencies: "@types/mdast": 4.0.3 @@ -5469,7 +5920,7 @@ packages: integrity: sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==, } dependencies: - "@types/hast": 3.0.3 + "@types/hast": 3.0.4 "@types/mdast": 4.0.3 "@ungap/structured-clone": 1.2.0 devlop: 1.1.0 @@ -5489,7 +5940,7 @@ packages: "@types/mdast": 4.0.3 "@types/unist": 3.0.2 longest-streak: 3.1.0 - mdast-util-phrasing: 4.0.0 + mdast-util-phrasing: 4.1.0 mdast-util-to-string: 4.0.0 micromark-util-decode-string: 2.0.0 unist-util-visit: 5.0.0 @@ -5514,6 +5965,29 @@ packages: "@types/mdast": 4.0.3 dev: false + /memfs-browser@3.5.10302: + resolution: + { + integrity: sha512-JJTc/nh3ig05O0gBBGZjTCPOyydaTxNF0uHYBrcc1gHNnO+KIHIvo0Y1FKCJsaei6FCl8C6xfQomXqu+cuzkIw==, + } + requiresBuild: true + dependencies: + memfs: 3.5.3 + dev: false + optional: true + + /memfs@3.5.3: + resolution: + { + integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==, + } + engines: { node: ">= 4.0.0" } + requiresBuild: true + dependencies: + fs-monkey: 1.0.5 + dev: false + optional: true + /memoizee@0.4.15: resolution: { @@ -5551,7 +6025,7 @@ packages: micromark-factory-space: 2.0.0 micromark-factory-title: 2.0.0 micromark-factory-whitespace: 2.0.0 - micromark-util-character: 2.0.1 + micromark-util-character: 2.1.0 micromark-util-chunked: 2.0.0 micromark-util-classify-character: 2.0.0 micromark-util-html-tag-name: 2.0.0 @@ -5568,7 +6042,7 @@ packages: integrity: sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==, } dependencies: - micromark-util-character: 2.0.1 + micromark-util-character: 2.1.0 micromark-util-sanitize-uri: 2.0.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 @@ -5583,7 +6057,7 @@ packages: devlop: 1.1.0 micromark-core-commonmark: 2.0.0 micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 + micromark-util-character: 2.1.0 micromark-util-normalize-identifier: 2.0.0 micromark-util-sanitize-uri: 2.0.0 micromark-util-symbol: 2.0.0 @@ -5612,7 +6086,7 @@ packages: dependencies: devlop: 1.1.0 micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 + micromark-util-character: 2.1.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 dev: false @@ -5634,7 +6108,7 @@ packages: dependencies: devlop: 1.1.0 micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 + micromark-util-character: 2.1.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 dev: false @@ -5661,7 +6135,7 @@ packages: integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==, } dependencies: - micromark-util-character: 2.0.1 + micromark-util-character: 2.1.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 dev: false @@ -5673,7 +6147,7 @@ packages: } dependencies: devlop: 1.1.0 - micromark-util-character: 2.0.1 + micromark-util-character: 2.1.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 dev: false @@ -5684,7 +6158,7 @@ packages: integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==, } dependencies: - micromark-util-character: 2.0.1 + micromark-util-character: 2.1.0 micromark-util-types: 2.0.0 dev: false @@ -5695,7 +6169,7 @@ packages: } dependencies: micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 + micromark-util-character: 2.1.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 dev: false @@ -5707,15 +6181,15 @@ packages: } dependencies: micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 + micromark-util-character: 2.1.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 dev: false - /micromark-util-character@2.0.1: + /micromark-util-character@2.1.0: resolution: { - integrity: sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==, + integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==, } dependencies: micromark-util-symbol: 2.0.0 @@ -5737,7 +6211,7 @@ packages: integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==, } dependencies: - micromark-util-character: 2.0.1 + micromark-util-character: 2.1.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 dev: false @@ -5768,7 +6242,7 @@ packages: } dependencies: decode-named-character-reference: 1.0.2 - micromark-util-character: 2.0.1 + micromark-util-character: 2.1.0 micromark-util-decode-numeric-character-reference: 2.0.1 micromark-util-symbol: 2.0.0 dev: false @@ -5811,7 +6285,7 @@ packages: integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==, } dependencies: - micromark-util-character: 2.0.1 + micromark-util-character: 2.1.0 micromark-util-encode: 2.0.0 micromark-util-symbol: 2.0.0 dev: false @@ -5854,7 +6328,7 @@ packages: devlop: 1.1.0 micromark-core-commonmark: 2.0.0 micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 + micromark-util-character: 2.1.0 micromark-util-chunked: 2.0.0 micromark-util-combine-extensions: 2.0.0 micromark-util-decode-numeric-character-reference: 2.0.1 @@ -5915,10 +6389,10 @@ packages: engines: { node: ">=10" } dev: false - /miniflare@3.20231218.4: + /miniflare@3.20240129.1: resolution: { - integrity: sha512-2mpxvDiRBxGGGVnTKC0SZy0FtTXxFs3tM1ol67EoIJABGzvWFf33GThwh+/dRmaHSjKKId/FI8rEl5JxXXXZgQ==, + integrity: sha512-GfqclPxbTnam4S8GKHRkFyr+s+szELK/ORtQ3ZFUiGBO4HNJsaeA6RhBMKBH7iHqn5ng035cyPsLZvH35lwtsA==, } engines: { node: ">=16.13" } hasBin: true @@ -5930,8 +6404,8 @@ packages: exit-hook: 2.2.1 glob-to-regexp: 0.4.1 stoppable: 1.1.0 - undici: 5.28.2 - workerd: 1.20231218.0 + undici: 5.28.3 + workerd: 1.20240129.0 ws: 8.16.0 youch: 3.3.3 zod: 3.22.4 @@ -6015,10 +6489,19 @@ packages: engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } hasBin: true - /nanoid@5.0.4: + /nanoid@4.0.2: + resolution: + { + integrity: sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==, + } + engines: { node: ^14 || ^16 || >=18 } + hasBin: true + dev: false + + /nanoid@5.0.5: resolution: { - integrity: sha512-vAjmBf13gsmhXSgBrtIclinISzFFy22WwCYoyilZlsrRXNIHSwgFQ1bEdjRwMT3aoadeIF6HMuDRlOxzfXV8ig==, + integrity: sha512-/Veqm+QKsyMY3kqi4faWplnY1u+VuKO3dD2binyPIybP31DRO29bPF+1mszgLnrR2KqSLceFLBNw0zmvDzN1QQ==, } engines: { node: ^18 || >=20 } hasBin: true @@ -6051,7 +6534,7 @@ packages: } engines: { node: ">=10" } dependencies: - semver: 7.5.4 + semver: 7.6.0 dev: false /node-domexception@1.0.0: @@ -6152,14 +6635,15 @@ packages: "@node-rs/bcrypt": 1.9.2 dev: false - /oslo@1.0.2: + /oslo@1.1.0: resolution: { - integrity: sha512-yBoZN0sOL5eEngLR2tFMTk2YFBF7czq/3ASCTM0WizAnUTllVRetCAsmV2CMMfu699VIe7f6vhNgJ0bQ2ejedg==, + integrity: sha512-uUvVt1boGt1aO0oMjzyzxIiDGAkfOdh6jPOzfJZBXsOsHuHfvTnrW7ealrBb27sgg5pHnTjmen6xPz4so+gQEQ==, } dependencies: - "@node-rs/argon2": 1.7.2 - "@node-rs/bcrypt": 1.9.2 + "@node-rs/argon2": 1.7.0 + "@node-rs/bcrypt": 1.9.0 + auri: 1.0.2 dev: false /p-limit@3.1.0: @@ -6263,7 +6747,7 @@ packages: } engines: { node: ">=8.6" } - /postcss-nested@6.0.1(postcss@8.4.33): + /postcss-nested@6.0.1(postcss@8.4.35): resolution: { integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==, @@ -6272,7 +6756,7 @@ packages: peerDependencies: postcss: ^8.2.14 dependencies: - postcss: 8.4.33 + postcss: 8.4.35 postcss-selector-parser: 6.0.15 dev: false @@ -6287,10 +6771,10 @@ packages: util-deprecate: 1.0.2 dev: false - /postcss@8.4.33: + /postcss@8.4.35: resolution: { - integrity: sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==, + integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==, } engines: { node: ^10 || ^12 || >=14 } dependencies: @@ -6328,10 +6812,10 @@ packages: } engines: { node: ">= 0.8.0" } - /prettier@3.2.4: + /prettier@3.2.5: resolution: { - integrity: sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==, + integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==, } engines: { node: ">=14" } hasBin: true @@ -6447,7 +6931,7 @@ packages: integrity: sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==, } dependencies: - "@types/hast": 3.0.3 + "@types/hast": 3.0.4 "@ungap/structured-clone": 1.2.0 hast-util-is-element: 3.0.0 is-absolute-url: 4.0.1 @@ -6461,7 +6945,7 @@ packages: integrity: sha512-kM4II8krCHmUhxrlvzFSptvaWh280Fr7UGNJU5DCMuvmAwGCNmGfi9CvFAQK6JDjsNoRMWQStglK3zKJH685Wg==, } dependencies: - "@types/hast": 3.0.3 + "@types/hast": 3.0.4 hast-util-embedded: 3.0.0 hast-util-is-element: 3.0.0 hast-util-phrasing: 3.0.1 @@ -6477,7 +6961,7 @@ packages: integrity: sha512-QtobgRgYoQaK6p1eSr2SD1i61f7bjF2kZHAQHxeCHAuJf7ZUDMvQ7owDq9YTkmar5m5TSUol+2D3bp3KfJf/oA==, } dependencies: - "@types/hast": 3.0.3 + "@types/hast": 3.0.4 hast-util-to-text: 4.0.0 lowlight: 3.1.0 unist-util-visit: 5.0.0 @@ -6490,20 +6974,31 @@ packages: integrity: sha512-i9It4YHR0Sf3GsnlR5jFUKXRr9oayvEk9GKQUkwZv6hs70OH9q3OCZrq9PpLvIGKt3W+JxBOxCidNVpH/6rWdA==, } dependencies: - "@types/hast": 3.0.3 + "@types/hast": 3.0.4 hast-util-embedded: 3.0.0 hast-util-is-element: 3.0.0 hast-util-whitespace: 3.0.0 unist-util-is: 6.0.0 dev: false + /rehype-raw@7.0.0: + resolution: + { + integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==, + } + dependencies: + "@types/hast": 3.0.4 + hast-util-raw: 9.0.2 + vfile: 6.0.1 + dev: false + /rehype-sanitize@6.0.0: resolution: { integrity: sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==, } dependencies: - "@types/hast": 3.0.3 + "@types/hast": 3.0.4 hast-util-sanitize: 5.0.1 dev: false @@ -6513,7 +7008,7 @@ packages: integrity: sha512-lLdTHGd7u5bOXRDnD78/VHrVZsG63nN6lZUuQgcuupGt1+v+uDW7pCeQS0cvptRcZPYzg8B+0bf8sUiMBKsjZw==, } dependencies: - "@types/hast": 2.3.9 + "@types/hast": 2.3.10 github-slugger: 1.5.0 hast-util-has-property: 2.0.1 hast-util-heading-rank: 2.1.1 @@ -6529,7 +7024,7 @@ packages: integrity: sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ==, } dependencies: - "@types/hast": 3.0.3 + "@types/hast": 3.0.4 hast-util-to-html: 9.0.0 unified: 11.0.4 dev: false @@ -6557,6 +7052,19 @@ packages: - supports-color dev: false + /remark-html@16.0.1: + resolution: + { + integrity: sha512-B9JqA5i0qZe0Nsf49q3OXyGvyXuZFDzAP2iOFLEumymuYJITVpiH1IgsTEwTpdptDmZlMDMWeDmSawdaJIGCXQ==, + } + dependencies: + "@types/mdast": 4.0.3 + hast-util-sanitize: 5.0.1 + hast-util-to-html: 9.0.0 + mdast-util-to-hast: 13.1.0 + unified: 11.0.4 + dev: false + /remark-parse@11.0.0: resolution: { @@ -6577,7 +7085,7 @@ packages: integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==, } dependencies: - "@types/hast": 3.0.3 + "@types/hast": 3.0.4 "@types/mdast": 4.0.3 mdast-util-to-hast: 13.1.0 unified: 11.0.4 @@ -6709,10 +7217,10 @@ packages: node-forge: 1.3.1 dev: true - /semver@7.5.4: + /semver@7.6.0: resolution: { - integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==, + integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==, } engines: { node: ">=10" } hasBin: true @@ -7005,19 +7513,19 @@ packages: } dev: false - /trough@2.1.0: + /trough@2.2.0: resolution: { - integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==, + integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==, } dev: false - /ts-api-utils@1.0.3(typescript@5.3.3): + /ts-api-utils@1.2.1(typescript@5.3.3): resolution: { - integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==, + integrity: sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==, } - engines: { node: ">=16.13.0" } + engines: { node: ">=16" } peerDependencies: typescript: ">=4.2.0" dependencies: @@ -7053,6 +7561,14 @@ packages: safe-buffer: 5.2.1 dev: false + /tunnel@0.0.6: + resolution: + { + integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==, + } + engines: { node: ">=0.6.11 <=0.7.0 || >=0.7.3" } + dev: false + /type-check@0.4.0: resolution: { @@ -7097,15 +7613,14 @@ packages: integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==, } - /undici@5.28.2: + /undici@5.28.3: resolution: { - integrity: sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==, + integrity: sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==, } engines: { node: ">=14.0" } dependencies: "@fastify/busboy": 2.1.0 - dev: true /unhead@1.8.10: resolution: @@ -7130,7 +7645,7 @@ packages: extend: 3.0.2 is-buffer: 2.0.5 is-plain-obj: 4.1.0 - trough: 2.1.0 + trough: 2.2.0 vfile: 5.3.7 dev: false @@ -7145,7 +7660,7 @@ packages: devlop: 1.1.0 extend: 3.0.2 is-plain-obj: 4.1.0 - trough: 2.1.0 + trough: 2.2.0 vfile: 6.0.1 dev: false @@ -7322,10 +7837,10 @@ packages: vfile-message: 4.0.2 dev: false - /vue-demi@0.14.6(vue@3.4.15): + /vue-demi@0.14.7(vue@3.4.18): resolution: { - integrity: sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==, + integrity: sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==, } engines: { node: ">=12" } hasBin: true @@ -7337,13 +7852,13 @@ packages: "@vue/composition-api": optional: true dependencies: - vue: 3.4.15(typescript@5.3.3) + vue: 3.4.18(typescript@5.3.3) dev: false - /vue@3.4.15(typescript@5.3.3): + /vue@3.4.18(typescript@5.3.3): resolution: { - integrity: sha512-jC0GH4KkWLWJOEQjOpkqU1bQsBwf4R1rsFtw5GQJbjHVKWDzO6P0nWWBTmjp1xSemAioDFj1jdaK1qa3DnMQoQ==, + integrity: sha512-0zLRYamFRe0wF4q2L3O24KQzLyLpL64ye1RUToOgOxuWZsb/FhaNRdGmeozdtVYLz6tl94OXLaK7/WQIrVCw1A==, } peerDependencies: typescript: "*" @@ -7351,11 +7866,11 @@ packages: typescript: optional: true dependencies: - "@vue/compiler-dom": 3.4.15 - "@vue/compiler-sfc": 3.4.15 - "@vue/runtime-dom": 3.4.15 - "@vue/server-renderer": 3.4.15(vue@3.4.15) - "@vue/shared": 3.4.15 + "@vue/compiler-dom": 3.4.18 + "@vue/compiler-sfc": 3.4.18 + "@vue/runtime-dom": 3.4.18 + "@vue/server-renderer": 3.4.18(vue@3.4.18) + "@vue/shared": 3.4.18 typescript: 5.3.3 dev: false @@ -7423,37 +7938,43 @@ packages: } dev: true - /workerd@1.20231218.0: + /workerd@1.20240129.0: resolution: { - integrity: sha512-AGIsDvqCrcwhoA9kb1hxOhVAe53/xJeaGZxL4FbYI9FvO17DZwrnqGq+6eqItJ6Cfw1ZLmf3BM+QdMWaL2bFWQ==, + integrity: sha512-t4pnsmjjk/u+GdVDgH2M1AFmJaBUABshYK/vT/HNrAXsHSwN6VR8Yqw0JQ845OokO34VLkuUtYQYyxHHKpdtsw==, } engines: { node: ">=16" } hasBin: true requiresBuild: true optionalDependencies: - "@cloudflare/workerd-darwin-64": 1.20231218.0 - "@cloudflare/workerd-darwin-arm64": 1.20231218.0 - "@cloudflare/workerd-linux-64": 1.20231218.0 - "@cloudflare/workerd-linux-arm64": 1.20231218.0 - "@cloudflare/workerd-windows-64": 1.20231218.0 + "@cloudflare/workerd-darwin-64": 1.20240129.0 + "@cloudflare/workerd-darwin-arm64": 1.20240129.0 + "@cloudflare/workerd-linux-64": 1.20240129.0 + "@cloudflare/workerd-linux-arm64": 1.20240129.0 + "@cloudflare/workerd-windows-64": 1.20240129.0 dev: true - /wrangler@3.25.0: + /wrangler@3.28.0(@cloudflare/workers-types@4.20240208.0): resolution: { - integrity: sha512-eU47Ez1QLu1B/wutm5ow+VwZnY4OqA+D/iy6BORAu5tABujoDr9p1yBxY/1DS/DxxDWqqY3sBBS6TzcC4NSLUQ==, + integrity: sha512-28lqaO4THoGyvnRtrC5+GvyFthn8E9brRSiz4sMJU8Wf5UT8JRq31Pp4leHuQ3sCzSI2yqzB4+NTo6YZaoXMfw==, } engines: { node: ">=16.17.0" } hasBin: true + peerDependencies: + "@cloudflare/workers-types": ^4.20230914.0 + peerDependenciesMeta: + "@cloudflare/workers-types": + optional: true dependencies: "@cloudflare/kv-asset-handler": 0.2.0 + "@cloudflare/workers-types": 4.20240208.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 + chokidar: 3.6.0 esbuild: 0.17.19 - miniflare: 3.20231218.4 + miniflare: 3.20240129.1 nanoid: 3.3.7 path-to-regexp: 6.2.1 resolve: 1.22.8 @@ -7497,6 +8018,22 @@ packages: } dev: true + /y-codemirror.next@0.3.2(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(yjs@13.6.11): + resolution: + { + integrity: sha512-3ksMXoietzNkrgluG9ut+5q4PNHCS6sQ+mHd44hNX1s7TBe4iDgOOIswfY3oLsdamZLAUPr+TnRdYgYuNDs7Qg==, + } + peerDependencies: + "@codemirror/state": ^6.0.0 + "@codemirror/view": ^6.0.0 + yjs: ^13.5.6 + dependencies: + "@codemirror/state": 6.4.0 + "@codemirror/view": 6.23.1 + lib0: 0.2.88 + yjs: 13.6.11 + dev: false + /yallist@4.0.0: resolution: { @@ -7510,6 +8047,16 @@ packages: } engines: { node: ">= 14" } + /yjs@13.6.11: + resolution: + { + integrity: sha512-FvRRJKX9u270dOLkllGF/UDCWwmIv2Z+ucM4v1QO1TuxdmoiMnSUXH1HAcOKOrkBEhQtPTkxep7tD2DrQB+l0g==, + } + engines: { node: ">=16.0.0", npm: ">=8.0.0" } + dependencies: + lib0: 0.2.88 + dev: false + /yocto-queue@0.1.0: resolution: { diff --git a/tsconfig.json b/tsconfig.json index 4f55605..dcb79d9 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,9 +8,9 @@ "lib": ["es2021"], "baseUrl": "./", "paths": { - "@/*": ["src/*"], + "@/*": ["src/*"] }, - "types": ["@cloudflare/workers-types", "node"], + "types": ["@cloudflare/workers-types", "node"] }, - "include": ["src/**/*.ts", "src/scripts/seed/seed.mts"], + "include": ["src/**/*.ts", "src/scripts/seed/seed.mts"] } From f8dc2adc983cf3443a5bd082d51e04d9254b7156 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 11 Feb 2024 12:08:45 +0000 Subject: [PATCH 252/318] update deps --- package.json | 14 +- pnpm-lock.yaml | 194 +++++++++--------- .../db/schema/collections/user-collections.ts | 12 ++ 3 files changed, 116 insertions(+), 104 deletions(-) diff --git a/package.json b/package.json index 8286c48..b8b3292 100644 --- a/package.json +++ b/package.json @@ -22,29 +22,29 @@ "@asteasolutions/zod-to-openapi": "^6.3.1", "@cloudflare/workers-types": "^4.20240208.0", "@types/node": "^20.11.17", - "dotenv": "^16.4.1", + "dotenv": "^16.4.2", "drizzle-kit": "^0.20.14", "eslint": "^8.56.0", "husky": "^9.0.10", "openapi-generator": "link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator", - "tsx": "^4.7.0", + "tsx": "^4.7.1", "typescript": "^5.3.3", - "wrangler": "3.28.0" + "wrangler": "3.28.1" }, "private": true, "dependencies": { - "@axiomhq/js": "1.0.0-rc.1", + "@axiomhq/js": "1.0.0-rc.2", "@hono/swagger-ui": "^0.2.1", "@hono/zod-openapi": "^0.9.6", "@libsql/client": "0.4.3", "@lucia-auth/adapter-sqlite": "3.0.0", - "@scalar/hono-api-reference": "^0.3.46", + "@scalar/hono-api-reference": "^0.3.47", "@typescript-eslint/eslint-plugin": "^6.21.0", - "better-sqlite3": "^9.4.0", + "better-sqlite3": "^9.4.1", "dayjs": "^1.11.10", "drizzle-orm": "^0.29.3", "drizzle-zod": "^0.5.1", - "hono": "^3.12.12", + "hono": "^4.0.1", "lucia": "3.0.1", "oslo": "^1.1.0", "prettier": "^3.2.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 32f4a47..3bab488 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,41 +6,41 @@ settings: dependencies: "@axiomhq/js": - specifier: 1.0.0-rc.1 - version: 1.0.0-rc.1 + specifier: 1.0.0-rc.2 + version: 1.0.0-rc.2 "@hono/swagger-ui": specifier: ^0.2.1 - version: 0.2.1(hono@3.12.12) + version: 0.2.1(hono@4.0.1) "@hono/zod-openapi": specifier: ^0.9.6 - version: 0.9.6(hono@3.12.12)(zod@3.22.4) + version: 0.9.6(hono@4.0.1)(zod@3.22.4) "@libsql/client": specifier: 0.4.3 version: 0.4.3 "@lucia-auth/adapter-sqlite": specifier: 3.0.0 - version: 3.0.0(@libsql/client@0.4.3)(better-sqlite3@9.4.0)(lucia@3.0.1) + version: 3.0.0(@libsql/client@0.4.3)(better-sqlite3@9.4.1)(lucia@3.0.1) "@scalar/hono-api-reference": - specifier: ^0.3.46 - version: 0.3.46(hono@3.12.12)(nanoid@5.0.5)(postcss@8.4.35)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.18)(yjs@13.6.11) + specifier: ^0.3.47 + version: 0.3.47(hono@4.0.1)(nanoid@5.0.5)(postcss@8.4.35)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.18)(yjs@13.6.12) "@typescript-eslint/eslint-plugin": specifier: ^6.21.0 version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.3.3) better-sqlite3: - specifier: ^9.4.0 - version: 9.4.0 + specifier: ^9.4.1 + version: 9.4.1 dayjs: specifier: ^1.11.10 version: 1.11.10 drizzle-orm: specifier: ^0.29.3 - version: 0.29.3(@cloudflare/workers-types@4.20240208.0)(@libsql/client@0.4.3)(better-sqlite3@9.4.0) + version: 0.29.3(@cloudflare/workers-types@4.20240208.0)(@libsql/client@0.4.3)(better-sqlite3@9.4.1) drizzle-zod: specifier: ^0.5.1 version: 0.5.1(drizzle-orm@0.29.3)(zod@3.22.4) hono: - specifier: ^3.12.12 - version: 3.12.12 + specifier: ^4.0.1 + version: 4.0.1 lucia: specifier: 3.0.1 version: 3.0.1 @@ -68,8 +68,8 @@ devDependencies: specifier: ^20.11.17 version: 20.11.17 dotenv: - specifier: ^16.4.1 - version: 16.4.1 + specifier: ^16.4.2 + version: 16.4.2 drizzle-kit: specifier: ^0.20.14 version: 0.20.14 @@ -83,14 +83,14 @@ devDependencies: specifier: link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator version: link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator tsx: - specifier: ^4.7.0 - version: 4.7.0 + specifier: ^4.7.1 + version: 4.7.1 typescript: specifier: ^5.3.3 version: 5.3.3 wrangler: - specifier: 3.28.0 - version: 3.28.0(@cloudflare/workers-types@4.20240208.0) + specifier: 3.28.1 + version: 3.28.1(@cloudflare/workers-types@4.20240208.0) packages: /@aashutoshrathi/word-wrap@1.2.6: @@ -188,10 +188,10 @@ packages: zod: 3.22.4 dev: true - /@axiomhq/js@1.0.0-rc.1: + /@axiomhq/js@1.0.0-rc.2: resolution: { - integrity: sha512-B/TT5HPc3KmoEIJUwhfzAAp0SLNfcxQnr0SGEbs1lWS0OOLckgj1Q4K1Tp/l669Yje1CK68i3LcajU/9+z+v2g==, + integrity: sha512-BQJQNkumdKZgbLGhf3DZb6A8w/31jtX3hWtdv0mMiSE3O5PioeIZNxRTMoWRChxt8TylZrJoVezqrw/ooWPoyQ==, } engines: { node: ">=16" } dependencies: @@ -323,7 +323,7 @@ packages: integrity: sha512-MVGTTjZpJu4kJONvai5SdJzWIhOJbuweVZ3goI7FNyG+JdoQH41OoB+nMhLsX626vPLZVWGPIWsiSo/WZHzgQw==, } - /@codemirror/autocomplete@6.12.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1): + /@codemirror/autocomplete@6.12.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.24.0)(@lezer/common@1.2.1): resolution: { integrity: sha512-r4IjdYFthwbCQyvqnSlx0WBHRHi8nBvU+WjJxFUij81qsBfhNudf/XKKmmC2j3m0LaOYUQTf3qiEK1J8lO1sdg==, @@ -336,7 +336,7 @@ packages: dependencies: "@codemirror/language": 6.10.1 "@codemirror/state": 6.4.0 - "@codemirror/view": 6.23.1 + "@codemirror/view": 6.24.0 "@lezer/common": 1.2.1 dev: false @@ -348,17 +348,17 @@ packages: dependencies: "@codemirror/language": 6.10.1 "@codemirror/state": 6.4.0 - "@codemirror/view": 6.23.1 + "@codemirror/view": 6.24.0 "@lezer/common": 1.2.1 dev: false - /@codemirror/lang-css@6.2.1(@codemirror/view@6.23.1): + /@codemirror/lang-css@6.2.1(@codemirror/view@6.24.0): resolution: { integrity: sha512-/UNWDNV5Viwi/1lpr/dIXJNWiwDxpw13I4pTUAsNxZdg6E0mI2kTQb0P2iHczg1Tu+H4EBgJR+hYhKiHKko7qg==, } dependencies: - "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) + "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.24.0)(@lezer/common@1.2.1) "@codemirror/language": 6.10.1 "@codemirror/state": 6.4.0 "@lezer/common": 1.2.1 @@ -373,12 +373,12 @@ packages: integrity: sha512-tE2YK7wDlb9ZpAH6mpTPiYm6rhfdQKVDa5r9IwIFlwwgvVaKsCfuKKZoJGWsmMZIf3FQAuJ5CHMPLymOtg1hXw==, } dependencies: - "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) - "@codemirror/lang-css": 6.2.1(@codemirror/view@6.23.1) + "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.24.0)(@lezer/common@1.2.1) + "@codemirror/lang-css": 6.2.1(@codemirror/view@6.24.0) "@codemirror/lang-javascript": 6.2.1 "@codemirror/language": 6.10.1 "@codemirror/state": 6.4.0 - "@codemirror/view": 6.23.1 + "@codemirror/view": 6.24.0 "@lezer/common": 1.2.1 "@lezer/css": 1.1.7 "@lezer/html": 1.3.8 @@ -400,11 +400,11 @@ packages: integrity: sha512-jlFOXTejVyiQCW3EQwvKH0m99bUYIw40oPmFjSX2VS78yzfe0HELZ+NEo9Yfo1MkGRpGlj3Gnu4rdxV1EnAs5A==, } dependencies: - "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) + "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.24.0)(@lezer/common@1.2.1) "@codemirror/language": 6.10.1 "@codemirror/lint": 6.5.0 "@codemirror/state": 6.4.0 - "@codemirror/view": 6.23.1 + "@codemirror/view": 6.24.0 "@lezer/common": 1.2.1 "@lezer/javascript": 1.4.13 dev: false @@ -432,13 +432,13 @@ packages: "@lezer/php": 1.0.2 dev: false - /@codemirror/lang-python@6.1.4(@codemirror/view@6.23.1): + /@codemirror/lang-python@6.1.4(@codemirror/view@6.24.0): resolution: { integrity: sha512-b6d1TDqrkCjFNvMO01SWldFiDoZ39yl3tDMC1Y5f8glA2eZpynPxJhwYVTlGFr0stizcJgrp6ojLEGH2myoZAw==, } dependencies: - "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) + "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.24.0)(@lezer/common@1.2.1) "@codemirror/language": 6.10.1 "@codemirror/state": 6.4.0 "@lezer/common": 1.2.1 @@ -464,7 +464,7 @@ packages: } dependencies: "@codemirror/state": 6.4.0 - "@codemirror/view": 6.23.1 + "@codemirror/view": 6.24.0 "@lezer/common": 1.2.1 "@lezer/highlight": 1.2.0 "@lezer/lr": 1.4.0 @@ -487,7 +487,7 @@ packages: } dependencies: "@codemirror/state": 6.4.0 - "@codemirror/view": 6.23.1 + "@codemirror/view": 6.24.0 crelt: 1.0.6 dev: false @@ -498,7 +498,7 @@ packages: } dependencies: "@codemirror/state": 6.4.0 - "@codemirror/view": 6.23.1 + "@codemirror/view": 6.24.0 crelt: 1.0.6 dev: false @@ -509,10 +509,10 @@ packages: } dev: false - /@codemirror/view@6.23.1: + /@codemirror/view@6.24.0: resolution: { - integrity: sha512-J2Xnn5lFYT1ZN/5ewEoMBCmLlL71lZ3mBdb7cUEuHhX2ESoSrNEucpsDXpX22EuTGm9LOgC9v4Z0wx+Ez8QmGA==, + integrity: sha512-zK6m5pNkdhdJl8idPP1gA4N8JKTiSsOz8U/Iw+C1ChMwyLG7+MLiNXnH/wFuAk6KeGEe33/adOiAh5jMqee03w==, } dependencies: "@codemirror/state": 6.4.0 @@ -1514,7 +1514,7 @@ packages: vue: 3.4.18(typescript@5.3.3) dev: false - /@hono/swagger-ui@0.2.1(hono@3.12.12): + /@hono/swagger-ui@0.2.1(hono@4.0.1): resolution: { integrity: sha512-wBxVMRe3/v8xH4o6icmwztiIq0DG0s7+jHVMHVUAoFFCWEQNL2iskMmQtrhSDtsFmBZUeUFQUaaJ6Ir6DOmHLA==, @@ -1522,10 +1522,10 @@ packages: peerDependencies: hono: "*" dependencies: - hono: 3.12.12 + hono: 4.0.1 dev: false - /@hono/zod-openapi@0.9.6(hono@3.12.12)(zod@3.22.4): + /@hono/zod-openapi@0.9.6(hono@4.0.1)(zod@3.22.4): resolution: { integrity: sha512-MLF8xpd4fEwbEaylFqAt1qci4wOTXu3oq3BKb01trccapYfodP50VCO0YDNBQTyMT/Iapq6GMO4+RAIFBgG5WQ==, @@ -1536,12 +1536,12 @@ packages: zod: 3.* dependencies: "@asteasolutions/zod-to-openapi": 5.5.0(zod@3.22.4) - "@hono/zod-validator": 0.1.11(hono@3.12.12)(zod@3.22.4) - hono: 3.12.12 + "@hono/zod-validator": 0.1.11(hono@4.0.1)(zod@3.22.4) + hono: 4.0.1 zod: 3.22.4 dev: false - /@hono/zod-validator@0.1.11(hono@3.12.12)(zod@3.22.4): + /@hono/zod-validator@0.1.11(hono@4.0.1)(zod@3.22.4): resolution: { integrity: sha512-PQXeHUP0+36qpRt8yfeD7N2jbK3ETlGvSN6dMof/HwUC/APRokQRjpXZm4rrlG71Ft0aWE01+Bm4XejqPie5Uw==, @@ -1550,7 +1550,7 @@ packages: hono: ">=3.9.0" zod: ^3.19.1 dependencies: - hono: 3.12.12 + hono: 4.0.1 zod: 3.22.4 dev: false @@ -1868,7 +1868,7 @@ packages: dev: false optional: true - /@lucia-auth/adapter-sqlite@3.0.0(@libsql/client@0.4.3)(better-sqlite3@9.4.0)(lucia@3.0.1): + /@lucia-auth/adapter-sqlite@3.0.0(@libsql/client@0.4.3)(better-sqlite3@9.4.1)(lucia@3.0.1): resolution: { integrity: sha512-7XMfMMNziFOoqIq2u9W5Z+wo7G7lzNQfUh7wDlkIqKxJMSLtP6GKH+QpK+21X4ZY9dIDmiuiwqZmS3Q3CgpATw==, @@ -1884,7 +1884,7 @@ packages: optional: true dependencies: "@libsql/client": 0.4.3 - better-sqlite3: 9.4.0 + better-sqlite3: 9.4.1 lucia: 3.0.1 dev: false @@ -2711,7 +2711,7 @@ packages: "@nodelib/fs.scandir": 2.1.5 fastq: 1.17.1 - /@replit/codemirror-css-color-picker@6.1.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1): + /@replit/codemirror-css-color-picker@6.1.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.24.0): resolution: { integrity: sha512-lkjtzOy8+C4VhuHegUfaqxsIsLVVW+FCRpKE+IOU4bX3Fp6Yo3sHS1PCHy1QlOtmL+Y+08Yb+giKuMXLyYzjew==, @@ -2723,13 +2723,13 @@ packages: dependencies: "@codemirror/language": 6.10.1 "@codemirror/state": 6.4.0 - "@codemirror/view": 6.23.1 + "@codemirror/view": 6.24.0 dev: false - /@scalar/api-client@0.11.4(vue@3.4.18)(yjs@13.6.11): + /@scalar/api-client@0.11.5(vue@3.4.18)(yjs@13.6.12): resolution: { - integrity: sha512-Yygj7J6CpbX17nP9ZohCwLUSwy6T/etZyh6bm0J/Yje0MJHkJjGkQjco+8sA12EmtFcvtkP/0ZT4+HT+WYVWsA==, + integrity: sha512-H80OZkxFvU9UaHsp5gHI8rYoNAUBlESVQIHr90OUTmpSWOIfMFMKd/kA7bkp4l8KCqxk47vvTGvnSQF2YWCCTg==, } engines: { node: ">=18" } peerDependencies: @@ -2737,7 +2737,7 @@ packages: dependencies: "@headlessui/vue": 1.7.19(vue@3.4.18) "@scalar/themes": 0.5.4(vue@3.4.18) - "@scalar/use-codemirror": 0.8.3(vue@3.4.18)(yjs@13.6.11) + "@scalar/use-codemirror": 0.8.3(vue@3.4.18)(yjs@13.6.12) "@scalar/use-keyboard-event": 0.5.8(vue@3.4.18) "@scalar/use-modal": 0.2.3(@headlessui/vue@1.7.19)(vue@3.4.18) "@vueuse/core": 10.7.2(vue@3.4.18) @@ -2754,10 +2754,10 @@ packages: - yjs dev: false - /@scalar/api-reference@1.15.4(nanoid@5.0.5)(postcss@8.4.35)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.18)(yjs@13.6.11): + /@scalar/api-reference@1.15.5(nanoid@5.0.5)(postcss@8.4.35)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.18)(yjs@13.6.12): resolution: { - integrity: sha512-+CYprpFAogbWBR/EtMrJrvkpmmfCH0eSMVPq8JZafiuZnXc0BbKG1zihepL/QCTAVo8oUmutfll9foYz0P0/lQ==, + integrity: sha512-lOEhiW164ANhCQumjo45oCE+MVEDaBpAYxCNwJnRhYDdhKVPkLEd43HhzxUJSu4fZyFuNoCkbKkxLnh/2Mohpg==, } engines: { node: ">=18" } peerDependencies: @@ -2766,14 +2766,14 @@ packages: dependencies: "@floating-ui/vue": 1.0.6(vue@3.4.18) "@headlessui/vue": 1.7.19(vue@3.4.18) - "@scalar/api-client": 0.11.4(vue@3.4.18)(yjs@13.6.11) + "@scalar/api-client": 0.11.5(vue@3.4.18)(yjs@13.6.12) "@scalar/components": 0.2.2(typescript@5.3.3) "@scalar/snippetz": 0.1.5 - "@scalar/swagger-editor": 0.10.3(typescript@5.3.3)(vue@3.4.18)(yjs@13.6.11) + "@scalar/swagger-editor": 0.10.4(typescript@5.3.3)(vue@3.4.18)(yjs@13.6.12) "@scalar/swagger-parser": 0.5.15(openapi-types@12.1.3) "@scalar/themes": 0.5.4(vue@3.4.18) "@scalar/use-clipboard": 0.5.13(@scalar/use-toasts@0.5.13)(nanoid@5.0.5) - "@scalar/use-codemirror": 0.8.3(vue@3.4.18)(yjs@13.6.11) + "@scalar/use-codemirror": 0.8.3(vue@3.4.18)(yjs@13.6.12) "@scalar/use-keyboard-event": 0.5.8(vue@3.4.18) "@scalar/use-modal": 0.2.3(@headlessui/vue@1.7.19)(vue@3.4.18) "@scalar/use-toasts": 0.5.13(nanoid@5.0.5)(vue@3.4.18) @@ -2834,17 +2834,17 @@ packages: - typescript dev: false - /@scalar/hono-api-reference@0.3.46(hono@3.12.12)(nanoid@5.0.5)(postcss@8.4.35)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.18)(yjs@13.6.11): + /@scalar/hono-api-reference@0.3.47(hono@4.0.1)(nanoid@5.0.5)(postcss@8.4.35)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.18)(yjs@13.6.12): resolution: { - integrity: sha512-CblNLk8Ihmt0GK85y13mdZrj/bMTvULthEoGXaHqJdzJq+p2q4qRSSDSLgOusiFSz21w+Qp0R92I6hMLdsgkPQ==, + integrity: sha512-8jrjuZrF1MH6JMyw8MUsXpf++4pl0syQ6MnHa8EpnxMi/w6pWLqYpOnrlkdjkS0sru8G9sGXHxMwysBC3Uowjw==, } engines: { node: ">=18" } peerDependencies: hono: ^3.0.0 dependencies: - "@scalar/api-reference": 1.15.4(nanoid@5.0.5)(postcss@8.4.35)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.18)(yjs@13.6.11) - hono: 3.12.12 + "@scalar/api-reference": 1.15.5(nanoid@5.0.5)(postcss@8.4.35)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.18)(yjs@13.6.12) + hono: 4.0.1 transitivePeerDependencies: - "@vue/composition-api" - debug @@ -2905,10 +2905,10 @@ packages: "@scalar/snippetz-plugin-node-undici": 0.1.5 dev: false - /@scalar/swagger-editor@0.10.3(typescript@5.3.3)(vue@3.4.18)(yjs@13.6.11): + /@scalar/swagger-editor@0.10.4(typescript@5.3.3)(vue@3.4.18)(yjs@13.6.12): resolution: { - integrity: sha512-QVVjgdheflq+n8ZZoTzyCDkVYEculiVri1VSONCFXho/xzsluqsFQiMq98YBZYL9fQnA3cRoC+R/xD83/Cg+Vg==, + integrity: sha512-JHzDgmc5zug3cC/PR754Qy3e1ENdc/Q66JTr3gBSoQSorLvIeThgwFlIdUugDArRB2avdEKthsrw/YoYpSoTNw==, } engines: { node: ">=18" } peerDependencies: @@ -2916,7 +2916,7 @@ packages: dependencies: "@scalar/components": 0.2.2(typescript@5.3.3) "@scalar/themes": 0.5.4(vue@3.4.18) - "@scalar/use-codemirror": 0.8.3(vue@3.4.18)(yjs@13.6.11) + "@scalar/use-codemirror": 0.8.3(vue@3.4.18)(yjs@13.6.12) "@vueuse/core": 10.7.2(vue@3.4.18) vue: 3.4.18(typescript@5.3.3) transitivePeerDependencies: @@ -2964,7 +2964,7 @@ packages: nanoid: 5.0.5 dev: false - /@scalar/use-codemirror@0.8.3(vue@3.4.18)(yjs@13.6.11): + /@scalar/use-codemirror@0.8.3(vue@3.4.18)(yjs@13.6.12): resolution: { integrity: sha512-f0Zuj3A9qgIquD0Wkq5Q4MI/fVwmbasDfUiDkUDfpgIdCrKRlFEmKmYHhRmb415GMUoiJrx/7kuwcpq2Iwn71A==, @@ -2974,27 +2974,27 @@ packages: vue: ^3.3.0 yjs: ^13.6.0 dependencies: - "@codemirror/lang-css": 6.2.1(@codemirror/view@6.23.1) + "@codemirror/lang-css": 6.2.1(@codemirror/view@6.24.0) "@codemirror/lang-html": 6.4.8 "@codemirror/lang-java": 6.0.1 "@codemirror/lang-javascript": 6.2.1 "@codemirror/lang-json": 6.0.1 "@codemirror/lang-php": 6.0.1 - "@codemirror/lang-python": 6.1.4(@codemirror/view@6.23.1) + "@codemirror/lang-python": 6.1.4(@codemirror/view@6.24.0) "@codemirror/lang-rust": 6.0.1 "@codemirror/language": 6.10.1 "@codemirror/legacy-modes": 6.3.3 "@codemirror/state": 6.4.0 - "@codemirror/view": 6.23.1 + "@codemirror/view": 6.24.0 "@lezer/common": 1.2.1 "@lezer/highlight": 1.2.0 "@lezer/lr": 1.4.0 - "@replit/codemirror-css-color-picker": 6.1.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1) - "@uiw/codemirror-themes": 4.21.21(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1) + "@replit/codemirror-css-color-picker": 6.1.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.24.0) + "@uiw/codemirror-themes": 4.21.21(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.24.0) codemirror: 6.0.1(@lezer/common@1.2.1) vue: 3.4.18(typescript@5.3.3) - y-codemirror.next: 0.3.2(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(yjs@13.6.11) - yjs: 13.6.11 + y-codemirror.next: 0.3.2(@codemirror/state@6.4.0)(@codemirror/view@6.24.0)(yjs@13.6.12) + yjs: 13.6.12 dev: false /@scalar/use-keyboard-event@0.5.8(vue@3.4.18): @@ -3365,7 +3365,7 @@ packages: eslint-visitor-keys: 3.4.3 dev: false - /@uiw/codemirror-themes@4.21.21(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1): + /@uiw/codemirror-themes@4.21.21(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.24.0): resolution: { integrity: sha512-ljVcMGdaxo75UaH+EqxJ+jLyMVVgeSfW2AKyT1VeLy+4SDpuqNQ7wq5XVxktsG6LH+OvgSFndWXgPANf4+gQcA==, @@ -3377,7 +3377,7 @@ packages: dependencies: "@codemirror/language": 6.10.1 "@codemirror/state": 6.4.0 - "@codemirror/view": 6.23.1 + "@codemirror/view": 6.24.0 dev: false /@ungap/structured-clone@1.2.0: @@ -3704,7 +3704,7 @@ packages: hasBin: true dependencies: "@actions/core": 1.10.1 - dotenv: 16.4.1 + dotenv: 16.4.2 front-matter: 4.0.2 nanoid: 4.0.2 oslo: 1.1.0 @@ -3743,10 +3743,10 @@ packages: } dev: false - /better-sqlite3@9.4.0: + /better-sqlite3@9.4.1: resolution: { - integrity: sha512-5kynxekMxSjCMiFyUBLHggFcJkCmiZi6fUkiGz/B5GZOvdRWQJD0klqCx5/Y+bm2AKP7I/DHbSFx26AxjruWNg==, + integrity: sha512-QpqiQeMI4WkE+dQ68zTMX5OzlPGc7lXIDP1iKUt4Omt9PdaVgzKYxHIJRIzt1E+RUBQoFmkip/IbvzyrxehAIg==, } requiresBuild: true dependencies: @@ -3974,13 +3974,13 @@ packages: integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==, } dependencies: - "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(@lezer/common@1.2.1) + "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.24.0)(@lezer/common@1.2.1) "@codemirror/commands": 6.3.3 "@codemirror/language": 6.10.1 "@codemirror/lint": 6.5.0 "@codemirror/search": 6.5.6 "@codemirror/state": 6.4.0 - "@codemirror/view": 6.23.1 + "@codemirror/view": 6.24.0 transitivePeerDependencies: - "@lezer/common" dev: false @@ -4246,10 +4246,10 @@ packages: dependencies: esutils: 2.0.3 - /dotenv@16.4.1: + /dotenv@16.4.2: resolution: { - integrity: sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ==, + integrity: sha512-rZSSFxke7d9nYQ5NeMIwp5PP+f8wXgKNljpOb7KtH6SKW1cEqcXAz9VSJYVLKe7Jhup/gUYOkaeSVyK8GJ+nBg==, } engines: { node: ">=12" } @@ -4288,7 +4288,7 @@ packages: - supports-color dev: true - /drizzle-orm@0.29.3(@cloudflare/workers-types@4.20240208.0)(@libsql/client@0.4.3)(better-sqlite3@9.4.0): + /drizzle-orm@0.29.3(@cloudflare/workers-types@4.20240208.0)(@libsql/client@0.4.3)(better-sqlite3@9.4.1): resolution: { integrity: sha512-uSE027csliGSGYD0pqtM+SAQATMREb3eSM/U8s6r+Y0RFwTKwftnwwSkqx3oS65UBgqDOM0gMTl5UGNpt6lW0A==, @@ -4364,7 +4364,7 @@ packages: dependencies: "@cloudflare/workers-types": 4.20240208.0 "@libsql/client": 0.4.3 - better-sqlite3: 9.4.0 + better-sqlite3: 9.4.1 dev: false /drizzle-zod@0.5.1(drizzle-orm@0.29.3)(zod@3.22.4): @@ -4376,7 +4376,7 @@ packages: drizzle-orm: ">=0.23.13" zod: "*" dependencies: - drizzle-orm: 0.29.3(@cloudflare/workers-types@4.20240208.0)(@libsql/client@0.4.3)(better-sqlite3@9.4.0) + drizzle-orm: 0.29.3(@cloudflare/workers-types@4.20240208.0)(@libsql/client@0.4.3)(better-sqlite3@9.4.1) zod: 3.22.4 dev: false @@ -5113,10 +5113,10 @@ packages: } engines: { node: ">=8" } - /hasown@2.0.0: + /hasown@2.0.1: resolution: { - integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==, + integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==, } engines: { node: ">= 0.4" } dependencies: @@ -5339,10 +5339,10 @@ packages: engines: { node: ">=12.0.0" } dev: false - /hono@3.12.12: + /hono@4.0.1: resolution: { - integrity: sha512-5IAMJOXfpA5nT+K0MNjClchzz0IhBHs2Szl7WFAhrFOsbtQsYmNynFyJRg/a3IPsmCfxcrf8txUGiNShXpK5Rg==, + integrity: sha512-S9cREGPJIAK437RhroOf1PGlJPIlt5itl69OmQ6onPLo5pdCbSHGL8v4uAKxrdHjcTyuoyvKPqWm5jv0dGkdFA==, } engines: { node: ">=16.0.0" } dev: false @@ -5474,7 +5474,7 @@ packages: integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==, } dependencies: - hasown: 2.0.0 + hasown: 2.0.1 dev: true /is-extglob@2.1.1: @@ -7538,10 +7538,10 @@ packages: integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==, } - /tsx@4.7.0: + /tsx@4.7.1: resolution: { - integrity: sha512-I+t79RYPlEYlHn9a+KzwrvEwhJg35h/1zHsLC2JXvhC2mdynMv6Zxzvhv5EMV6VF5qJlLlkSnMVvdZV3PSIGcg==, + integrity: sha512-8d6VuibXHtlN5E3zFkgY8u4DX7Y3Z27zvvPKVmLon/D4AjuKzarkUBTLDBgj9iTQ0hg5xM7c/mYiRVM+HETf0g==, } engines: { node: ">=18.0.0" } hasBin: true @@ -7954,10 +7954,10 @@ packages: "@cloudflare/workerd-windows-64": 1.20240129.0 dev: true - /wrangler@3.28.0(@cloudflare/workers-types@4.20240208.0): + /wrangler@3.28.1(@cloudflare/workers-types@4.20240208.0): resolution: { - integrity: sha512-28lqaO4THoGyvnRtrC5+GvyFthn8E9brRSiz4sMJU8Wf5UT8JRq31Pp4leHuQ3sCzSI2yqzB4+NTo6YZaoXMfw==, + integrity: sha512-3O8vCzd7IC71Kciu/+oDVO0VZ83ujlUuKwmCkv6/zzt4WAoYu0vk7PyEo4WvlsSbZL8aHuv3bS917rd6TM1/9Q==, } engines: { node: ">=16.17.0" } hasBin: true @@ -8018,7 +8018,7 @@ packages: } dev: true - /y-codemirror.next@0.3.2(@codemirror/state@6.4.0)(@codemirror/view@6.23.1)(yjs@13.6.11): + /y-codemirror.next@0.3.2(@codemirror/state@6.4.0)(@codemirror/view@6.24.0)(yjs@13.6.12): resolution: { integrity: sha512-3ksMXoietzNkrgluG9ut+5q4PNHCS6sQ+mHd44hNX1s7TBe4iDgOOIswfY3oLsdamZLAUPr+TnRdYgYuNDs7Qg==, @@ -8029,9 +8029,9 @@ packages: yjs: ^13.5.6 dependencies: "@codemirror/state": 6.4.0 - "@codemirror/view": 6.23.1 + "@codemirror/view": 6.24.0 lib0: 0.2.88 - yjs: 13.6.11 + yjs: 13.6.12 dev: false /yallist@4.0.0: @@ -8047,10 +8047,10 @@ packages: } engines: { node: ">= 14" } - /yjs@13.6.11: + /yjs@13.6.12: resolution: { - integrity: sha512-FvRRJKX9u270dOLkllGF/UDCWwmIv2Z+ucM4v1QO1TuxdmoiMnSUXH1HAcOKOrkBEhQtPTkxep7tD2DrQB+l0g==, + integrity: sha512-KOT8ILoyVH2f/PxPadeu5kVVS055D1r3x1iFfJVJzFdnN98pVGM8H07NcKsO+fG3F7/0tf30Vnokf5YIqhU/iw==, } engines: { node: ">=16.0.0", npm: ">=8.0.0" } dependencies: diff --git a/src/v2/db/schema/collections/user-collections.ts b/src/v2/db/schema/collections/user-collections.ts index 09fe3be..db7d2b6 100644 --- a/src/v2/db/schema/collections/user-collections.ts +++ b/src/v2/db/schema/collections/user-collections.ts @@ -30,6 +30,13 @@ export const userCollection = sqliteTable( .$defaultFn(() => { return generateID() }), + // parentCollectionId: text("parent_collection_id").references( + // () => userCollection.id, + // { + // onUpdate: "cascade", + // onDelete: "cascade", + // } + // ), name: text("name").notNull(), description: text("description").notNull(), userId: text("user_id") @@ -114,6 +121,11 @@ export const collectionRelations = relations( assets: many(userCollectionAsset), userCollectionLikes: many(userCollectionLikes), userCollectionCollaborators: many(userCollectionCollaborators), + // parentCollection: one(userCollection, { + // fields: [userCollection.parentCollectionId], + // references: [userCollection.id], + // relationName: "collection_parent_collection", + // }), }) ) From 816cee509806797d96029ebb6380ea364d8331c0 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 11 Feb 2024 12:37:01 +0000 Subject: [PATCH 253/318] request form seeding & view all route --- src/scripts/seed/seed.ts | 46 +++++++++++++++++++ .../request-form/request-form-manager.ts | 24 ++++++---- .../routes/requests/form/view/all/openapi.ts | 25 ++++++++++ src/v2/routes/requests/form/view/all/route.ts | 28 +++++++++++ .../routes/requests/form/view/all/schema.ts | 27 +++++++++++ src/v2/routes/requests/handler.ts | 2 + 6 files changed, 142 insertions(+), 10 deletions(-) create mode 100644 src/v2/routes/requests/form/view/all/openapi.ts create mode 100644 src/v2/routes/requests/form/view/all/route.ts create mode 100644 src/v2/routes/requests/form/view/all/schema.ts diff --git a/src/scripts/seed/seed.ts b/src/scripts/seed/seed.ts index a0d9cf3..dcffe9a 100644 --- a/src/scripts/seed/seed.ts +++ b/src/scripts/seed/seed.ts @@ -14,6 +14,8 @@ import { userFavorite, userFavoriteAsset, userFollowing, + requestFormUpvotes, + requestForm, } from "@/v2/db/schema" import { Scrypt } from "lucia" import "dotenv/config" @@ -53,6 +55,7 @@ async function main() { bio: "test bio", role: "creator", isContributor: true, + isSupporter: true, }, { username: "testuser2", @@ -70,6 +73,7 @@ async function main() { bio: "test bio 3", role: "uploader", isContributor: false, + isSupporter: true, }, ]) .returning() @@ -115,6 +119,48 @@ async function main() { `[SEED] [userFollowing] inserted ${newuserFollowing.length} rows\n` ) + console.log("[SEED] [requestForm] Seeding request forms...") + const newRequestForms = await db + .insert(requestForm) + .values([ + { + userId: newUsers[0].id, + title: "test request", + area: "game", + description: "test description", + }, + { + userId: newUsers[1].id, + title: "test request 2", + area: "game", + description: "test description 2", + }, + ]) + .returning() + + console.log( + `[SEED] [requestForm] inserted ${newRequestForms.length} rows\n` + ) + + console.log("[SEED] [requestFormUpvotes] Seeding request form upvotes...") + const newRequestFormUpvotes = await db + .insert(requestFormUpvotes) + .values([ + { + requestFormId: newRequestForms[0].id, + userId: newUsers[1].id, + }, + { + requestFormId: newRequestForms[1].id, + userId: newUsers[0].id, + }, + ]) + .returning() + + console.log( + `[SEED] [requestFormUpvotes] inserted ${newRequestFormUpvotes.length} rows\n` + ) + console.log("[SEED] [assetTag] Seeding asset tags...") const newAssetTags = await db .insert(assetTag) diff --git a/src/v2/lib/managers/request-form/request-form-manager.ts b/src/v2/lib/managers/request-form/request-form-manager.ts index 5ed54d1..7cb3889 100644 --- a/src/v2/lib/managers/request-form/request-form-manager.ts +++ b/src/v2/lib/managers/request-form/request-form-manager.ts @@ -1,5 +1,5 @@ import { DrizzleInstance } from "@/v2/db/turso" -import { and, eq, sql } from "drizzle-orm" +import { and, eq } from "drizzle-orm" import { requestArea, requestForm, requestFormUpvotes } from "@/v2/db/schema" export class RequestFormManager { @@ -10,15 +10,19 @@ export class RequestFormManager { return await this.drizzle.query.requestForm.findMany({ offset: offset, limit: limit, - with: { - requestFormUpvotes, - }, - extras: { - upvoteCount: - sql`SELECT COUNT(*) FROM ${requestFormUpvotes} WHERE ${requestForm.id} = ${requestFormUpvotes.requestFormId}`.as( - "upvoteCount" - ), - }, + // with: { + // requestFormUpvotes: { + // columns: { + // userId: true, + // }, + // }, + // }, + // extras: { + // upvoteCount: + // sql`SELECT COUNT(*) FROM ${requestFormUpvotes} WHERE ${requestFormUpvotes.requestFormId} = ${requestForm.id}`.as( + // "upvoteCount" + // ), + // }, }) } catch (e) { console.error(`Error getting request form entries`, e) diff --git a/src/v2/routes/requests/form/view/all/openapi.ts b/src/v2/routes/requests/form/view/all/openapi.ts new file mode 100644 index 0000000..5af4de4 --- /dev/null +++ b/src/v2/routes/requests/form/view/all/openapi.ts @@ -0,0 +1,25 @@ +import { createRoute } from "@hono/zod-openapi" +import { viewAllRequestsResponseSchema, viewAllRequestsSchema } from "./schema" +import { GenericResponses } from "@/v2/lib/response-schemas" + +export const getAllRequestsRoute = createRoute({ + path: "/", + method: "get", + description: + "Get all requests. This will also return all associated upvotes count.", + tags: ["Requests"], + request: { + query: viewAllRequestsSchema, + }, + responses: { + 200: { + description: "List of all submitted requests.", + content: { + "application/json": { + schema: viewAllRequestsResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) diff --git a/src/v2/routes/requests/form/view/all/route.ts b/src/v2/routes/requests/form/view/all/route.ts new file mode 100644 index 0000000..fefba53 --- /dev/null +++ b/src/v2/routes/requests/form/view/all/route.ts @@ -0,0 +1,28 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { getAllRequestsRoute } from "./openapi" +import { RequestFormManager } from "@/v2/lib/managers/request-form/request-form-manager" +import { getConnection } from "@/v2/db/turso" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.openapi(getAllRequestsRoute, async (ctx) => { + const { offset } = ctx.req.valid("query") ?? { offset: "0" } + + const { drizzle } = await getConnection(ctx.env) + + const requestFormManager = new RequestFormManager(drizzle) + + const allRequests = await requestFormManager.getRequestFormEntries( + parseInt(offset) + ) + + return ctx.json( + { + success: true, + requests: allRequests, + }, + 200 + ) +}) + +export default handler diff --git a/src/v2/routes/requests/form/view/all/schema.ts b/src/v2/routes/requests/form/view/all/schema.ts new file mode 100644 index 0000000..bf29a84 --- /dev/null +++ b/src/v2/routes/requests/form/view/all/schema.ts @@ -0,0 +1,27 @@ +import { z } from "@hono/zod-openapi" +import { selectRequestFormSchema } from "@/v2/db/schema" + +export const viewAllRequestsSchema = z + .object({ + offset: z.string().openapi({ + param: { + description: + "The offset of requests to return. This is used for pagination.", + name: "offset", + example: "0", + in: "query", + required: false, + }, + }), + }) + .partial() + +const requestFormSchema = z.object({ + ...selectRequestFormSchema.shape, + upvotesCount: z.number().optional(), +}) + +export const viewAllRequestsResponseSchema = z.object({ + success: z.literal(true), + requests: z.array(requestFormSchema), +}) diff --git a/src/v2/routes/requests/handler.ts b/src/v2/routes/requests/handler.ts index 7132a7d..11ca9d6 100644 --- a/src/v2/routes/requests/handler.ts +++ b/src/v2/routes/requests/handler.ts @@ -1,10 +1,12 @@ import { OpenAPIHono } from "@hono/zod-openapi" import RequestFormCreateRoute from "@/v2/routes/requests/form/create/route" import RequestFormDeleteRoute from "@/v2/routes/requests/form/delete/[id]/route" +import ViewAllRequestsRoute from "@/v2/routes/requests/form/view/all/route" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.route("/create/form", RequestFormCreateRoute) handler.route("/delete/form", RequestFormDeleteRoute) +handler.route("/view/all", ViewAllRequestsRoute) export default handler From 01977ae8bca37ef6908271f651c1664d685c0393 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Tue, 12 Mar 2024 20:59:15 +0000 Subject: [PATCH 254/318] rm game manager --- src/v2/lib/managers/game/game-manager.ts | 157 -------------------- src/v2/routes/category/handler.ts | 5 - src/v2/routes/game/create/route.ts | 29 ++-- src/v2/routes/game/delete/id/[id]/route.ts | 16 +- src/v2/routes/game/get/all/route.ts | 8 +- src/v2/routes/game/get/id/[id]/route.ts | 11 +- src/v2/routes/game/get/name/[name]/route.ts | 14 +- src/v2/routes/game/modify/id/[id]/route.ts | 30 ++-- src/v2/routes/handler.ts | 8 +- 9 files changed, 69 insertions(+), 209 deletions(-) delete mode 100644 src/v2/lib/managers/game/game-manager.ts delete mode 100644 src/v2/routes/category/handler.ts diff --git a/src/v2/lib/managers/game/game-manager.ts b/src/v2/lib/managers/game/game-manager.ts deleted file mode 100644 index 2c8a217..0000000 --- a/src/v2/lib/managers/game/game-manager.ts +++ /dev/null @@ -1,157 +0,0 @@ -import { DrizzleInstance } from "@/v2/db/turso" -import { game } from "@/v2/db/schema" -import { eq, like, or } from "drizzle-orm" -import type { Game } from "@/v2/db/schema" - -/** - * Manages operations related to games. - */ -export class GameManager { - constructor(private drizzle: DrizzleInstance) {} - - /** - * Retrieves a game by its ID. - * @param gameId - The unique ID of the game to retrieve. - * @returns A promise that resolves to the retrieved game and its asset categories. - */ - public async getGameById(gameId: string): Promise { - try { - const [foundGame] = await this.drizzle - .select() - .from(game) - .where(eq(game.id, gameId)) - - return foundGame ?? null - } catch (e) { - console.error(`Error getting game by ID ${gameId}`, e) - throw new Error(`Error getting game by ID ${gameId}`) - } - } - - public async doesGameExist(gameId: string): Promise { - try { - const [foundGame] = await this.drizzle - .select({ id: game.id }) - .from(game) - .where(eq(game.id, gameId)) - - return foundGame ? true : false - } catch (e) { - console.error(`Error checking if game exists ${gameId}`, e) - throw new Error(`Error checking if game exists ${gameId}`) - } - } - - /** - * Retrieves a game by its name. - * @param gameName - The name of the game to retrieve. - * @returns A promise that resolves to the retrieved game and its asset categories. - */ - public async getGameByName(gameName: string): Promise { - try { - const [foundGame] = await this.drizzle - .select() - .from(game) - .where(eq(game.name, gameName)) - - return foundGame ?? null - } catch (e) { - console.error(`Error getting game by name ${gameName}`, e) - throw new Error(`Error getting game by name ${gameName}`) - } - } - - /** - * Retrieves games with partial name matching. - * @param gameName - The partial name to search for within game names. - * @returns A promise that resolves to an array of matching games. - */ - public async getGamesByPartialName( - gameName: string - ): Promise { - try { - const games = await this.drizzle - .select() - .from(game) - .where(or(like(game.name, `%${gameName}%`))) - - return games ?? null - } catch (e) { - console.error("Error getting games by partial name", e) - throw new Error("Error getting games by partial name") - } - } - - /** - * Retrieves a list of all games. - * @returns A promise that resolves to an array of games. - */ - - public async listGames() { - try { - const games = await this.drizzle.select().from(game) - return games ?? null - } catch (e) { - console.error("Error listing games", e) - throw new Error("Error listing games") - } - } - - public async createGame( - name: string, - formattedName: string, - possibleSuggestiveContent: boolean - ): Promise { - try { - const [newGame] = await this.drizzle - .insert(game) - .values({ - id: name, - name, - formattedName, - possibleSuggestiveContent, - lastUpdated: new Date().toISOString(), - }) - .returning() - - return newGame - } catch (e) { - console.error("Error creating game", e) - throw new Error("Error creating game") - } - } - - public async deleteGame(gameId: string): Promise { - try { - await this.drizzle.delete(game).where(eq(game.id, gameId)) - } catch (e) { - console.error(`Error deleting game ${gameId}`, e) - throw new Error(`Error deleting game ${gameId}`) - } - } - - public async updateGame( - gameId: string, - name: string, - formattedName: string, - possibleSuggestiveContent: boolean - ): Promise { - try { - const [updatedGame] = await this.drizzle - .update(game) - .set({ - name, - formattedName, - possibleSuggestiveContent, - lastUpdated: new Date().toISOString(), - }) - .where(eq(game.id, gameId)) - .returning() - - return updatedGame - } catch (e) { - console.error(`Error updating game ${gameId}`, e) - throw new Error(`Error updating game ${gameId}`) - } - } -} diff --git a/src/v2/routes/category/handler.ts b/src/v2/routes/category/handler.ts deleted file mode 100644 index 0054339..0000000 --- a/src/v2/routes/category/handler.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { OpenAPIHono } from "@hono/zod-openapi" - -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() - -export default handler diff --git a/src/v2/routes/game/create/route.ts b/src/v2/routes/game/create/route.ts index 3708e9c..4f4671d 100644 --- a/src/v2/routes/game/create/route.ts +++ b/src/v2/routes/game/create/route.ts @@ -1,6 +1,7 @@ import { OpenAPIHono } from "@hono/zod-openapi" import { createGameRoute } from "./openapi" -import { GameManager } from "@/v2/lib/managers/game/game-manager" +import { game } from "@/v2/db/schema" +import { eq } from "drizzle-orm" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" import { getConnection } from "@/v2/db/turso" @@ -26,11 +27,12 @@ handler.openapi(createGameRoute, async (ctx) => { const { drizzle } = getConnection(ctx.env) - const gameManager = new GameManager(drizzle) + const [gameExists] = await drizzle + .select({ name: game.name }) + .from(game) + .where(eq(game.name, name)) - const gameExists = await gameManager.doesGameExist(name) - - if (gameExists) { + if (gameExists.name) { return ctx.json( { success: false, @@ -40,16 +42,21 @@ handler.openapi(createGameRoute, async (ctx) => { ) } - const game = await gameManager.createGame( - name, - formattedName, - Boolean(possibleSuggestiveContent) - ) + const [newGame] = await drizzle + .insert(game) + .values({ + id: name, + name, + formattedName, + possibleSuggestiveContent: Boolean(possibleSuggestiveContent), + lastUpdated: new Date().toISOString(), + }) + .returning() return ctx.json( { success: true, - game, + game: newGame, }, 200 ) diff --git a/src/v2/routes/game/delete/id/[id]/route.ts b/src/v2/routes/game/delete/id/[id]/route.ts index 83baec5..47f9667 100644 --- a/src/v2/routes/game/delete/id/[id]/route.ts +++ b/src/v2/routes/game/delete/id/[id]/route.ts @@ -1,8 +1,9 @@ import { OpenAPIHono } from "@hono/zod-openapi" import { deleteGameRoute } from "./openapi" -import { GameManager } from "@/v2/lib/managers/game/game-manager" import { getConnection } from "@/v2/db/turso" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +import { game } from "@/v2/db/schema" +import { eq } from "drizzle-orm" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() @@ -10,10 +11,13 @@ handler.openapi(deleteGameRoute, async (ctx) => { const id = ctx.req.valid("param").id const { drizzle } = await getConnection(ctx.env) - const gameManager = new GameManager(drizzle) - const gameExists = await gameManager.doesGameExist(id) - if (!gameExists) { + const [foundGame] = await drizzle + .select({ id: game.id }) + .from(game) + .where(eq(game.id, id)) + + if (!foundGame) { return ctx.json( { success: false, @@ -46,8 +50,8 @@ handler.openapi(deleteGameRoute, async (ctx) => { ) } - await gameManager.deleteGame(id) - await ctx.env.FILES_BUCKET.delete("/assets/" + id) + await drizzle.delete(game).where(eq(game.id, id)) + // await ctx.env.FILES_BUCKET.delete("/assets/" + id) return ctx.json( { diff --git a/src/v2/routes/game/get/all/route.ts b/src/v2/routes/game/get/all/route.ts index 6625e51..88fbeed 100644 --- a/src/v2/routes/game/get/all/route.ts +++ b/src/v2/routes/game/get/all/route.ts @@ -1,19 +1,19 @@ import { OpenAPIHono } from "@hono/zod-openapi" import { getAllGamesRoute } from "./openapi" -import { GameManager } from "@/v2/lib/managers/game/game-manager" import { getConnection } from "@/v2/db/turso" +import { game } from "@/v2/db/schema" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.openapi(getAllGamesRoute, async (ctx) => { const { drizzle } = await getConnection(ctx.env) - const gameManager = new GameManager(drizzle) - const allGames = await gameManager.listGames() + + const games = (await drizzle.select().from(game)) ?? [] return ctx.json( { success: true, - games: allGames, + games, }, 200 ) diff --git a/src/v2/routes/game/get/id/[id]/route.ts b/src/v2/routes/game/get/id/[id]/route.ts index fef42ba..0bacc6d 100644 --- a/src/v2/routes/game/get/id/[id]/route.ts +++ b/src/v2/routes/game/get/id/[id]/route.ts @@ -1,7 +1,8 @@ import { OpenAPIHono } from "@hono/zod-openapi" import { getGameByIdRoute } from "./openapi" -import { GameManager } from "@/v2/lib/managers/game/game-manager" +import { game } from "@/v2/db/schema" import { getConnection } from "@/v2/db/turso" +import { eq } from "drizzle-orm" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() @@ -9,10 +10,10 @@ handler.openapi(getGameByIdRoute, async (ctx) => { const id = ctx.req.valid("param").id const { drizzle } = await getConnection(ctx.env) - const gameManager = new GameManager(drizzle) - const game = await gameManager.getGameById(id) - if (!game) { + const [foundGame] = await drizzle.select().from(game).where(eq(game.id, id)) + + if (!foundGame) { return ctx.json( { success: false, @@ -25,7 +26,7 @@ handler.openapi(getGameByIdRoute, async (ctx) => { return ctx.json( { success: true, - game, + game: foundGame, }, 200 ) diff --git a/src/v2/routes/game/get/name/[name]/route.ts b/src/v2/routes/game/get/name/[name]/route.ts index 1a0cf7b..b8681fb 100644 --- a/src/v2/routes/game/get/name/[name]/route.ts +++ b/src/v2/routes/game/get/name/[name]/route.ts @@ -1,6 +1,7 @@ import { OpenAPIHono } from "@hono/zod-openapi" import { getGameByNameRoute } from "./openapi" -import { GameManager } from "@/v2/lib/managers/game/game-manager" +import { game } from "@/v2/db/schema" +import { eq } from "drizzle-orm" import { getConnection } from "@/v2/db/turso" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() @@ -9,10 +10,13 @@ handler.openapi(getGameByNameRoute, async (ctx) => { const name = ctx.req.valid("param").name const { drizzle } = await getConnection(ctx.env) - const gameManager = new GameManager(drizzle) - const game = await gameManager.getGameByName(name) - if (!game) { + const [foundGame] = await drizzle + .select() + .from(game) + .where(eq(game.name, name)) + + if (!foundGame) { return ctx.json( { success: true, @@ -25,7 +29,7 @@ handler.openapi(getGameByNameRoute, async (ctx) => { return ctx.json( { success: true, - game, + game: foundGame, }, 200 ) diff --git a/src/v2/routes/game/modify/id/[id]/route.ts b/src/v2/routes/game/modify/id/[id]/route.ts index 13a26e0..aaf7904 100644 --- a/src/v2/routes/game/modify/id/[id]/route.ts +++ b/src/v2/routes/game/modify/id/[id]/route.ts @@ -1,8 +1,9 @@ import { OpenAPIHono } from "@hono/zod-openapi" import { modifyGameRoute } from "./openapi" -import { GameManager } from "@/v2/lib/managers/game/game-manager" +import { eq } from "drizzle-orm" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" import { getConnection } from "@/v2/db/turso" +import { game } from "@/v2/db/schema" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() @@ -27,11 +28,12 @@ handler.openapi(modifyGameRoute, async (ctx) => { const { drizzle } = getConnection(ctx.env) - const gameManager = new GameManager(drizzle) + const [existingGame] = await drizzle + .select({ id: game.id }) + .from(game) + .where(eq(game.id, id)) - const gameExists = await gameManager.doesGameExist(id) - - if (!gameExists) { + if (!existingGame.id) { return ctx.json( { success: false, @@ -41,17 +43,21 @@ handler.openapi(modifyGameRoute, async (ctx) => { ) } - const game = await gameManager.updateGame( - id, - name, - formattedName, - Boolean(possibleSuggestiveContent) - ) + const [updatedGame] = await drizzle + .update(game) + .set({ + name, + formattedName, + possibleSuggestiveContent: Boolean(possibleSuggestiveContent), + lastUpdated: new Date().toISOString(), + }) + .where(eq(game.id, id)) + .returning() return ctx.json( { success: true, - game, + game: updatedGame, }, 200 ) diff --git a/src/v2/routes/handler.ts b/src/v2/routes/handler.ts index 8d6fe44..6c594eb 100644 --- a/src/v2/routes/handler.ts +++ b/src/v2/routes/handler.ts @@ -4,17 +4,17 @@ import GameRoute from "@/v2/routes/game/handler" import AssetRoute from "@/v2/routes/asset/handler" import ContributorRoute from "@/v2/routes/contributors/handler" import AuthRoute from "@/v2/routes/auth/handler" -import CategoryRoute from "@/v2/routes/category/handler" -import RequestFormRoute from "@/v2/routes/requests/handler" +// import CategoryRoute from "@/v2/routes/category/handler" +// import RequestFormRoute from "@/v2/routes/requests/handler" dromzeh: need to figure out financial/supporter side of things before I can implement this const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.route("/game", GameRoute) -handler.route("/category", CategoryRoute) +// handler.route("/category", CategoryRoute) handler.route("/asset", AssetRoute) handler.route("/user", UserRoute) handler.route("/contributor", ContributorRoute) handler.route("/auth", AuthRoute) -handler.route("/request", RequestFormRoute) +// handler.route("/request", RequestFormRoute) export default handler From 8a927058d4cf70ee6c814ddbb2478d895ead5581 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Tue, 12 Mar 2024 21:19:30 +0000 Subject: [PATCH 255/318] update deps, remove user/follow manager --- package.json | 36 +- pnpm-lock.yaml | 1869 ++++++++--------- .../lib/managers/user/user-follow-manager.ts | 200 -- .../lib/managers/user/user-profile-manager.ts | 164 -- .../lib/managers/user/user-search-manager.ts | 121 -- .../user/follows/follow/id/[id]/route.ts | 28 +- .../user/follows/followers/id/[id]/route.ts | 24 +- .../user/follows/following/id/[id]/route.ts | 24 +- .../user/follows/unfollow/id/[id]/route.ts | 28 +- src/v2/routes/user/get/id/[id]/route.ts | 22 +- .../user/get/username/[username]/route.ts | 24 +- .../user/search/username/[username]/route.ts | 23 +- 12 files changed, 1019 insertions(+), 1544 deletions(-) delete mode 100644 src/v2/lib/managers/user/user-follow-manager.ts delete mode 100644 src/v2/lib/managers/user/user-profile-manager.ts delete mode 100644 src/v2/lib/managers/user/user-search-manager.ts diff --git a/package.json b/package.json index b8b3292..7e7ef6f 100644 --- a/package.json +++ b/package.json @@ -19,34 +19,34 @@ "drizzle:studio": "drizzle-kit studio --port 7331 --host 127.0.0.1 --verbose" }, "devDependencies": { - "@asteasolutions/zod-to-openapi": "^6.3.1", - "@cloudflare/workers-types": "^4.20240208.0", - "@types/node": "^20.11.17", - "dotenv": "^16.4.2", + "@asteasolutions/zod-to-openapi": "^6.4.0", + "@cloudflare/workers-types": "^4.20240312.0", + "@types/node": "^20.11.26", + "dotenv": "^16.4.5", "drizzle-kit": "^0.20.14", - "eslint": "^8.56.0", - "husky": "^9.0.10", + "eslint": "^8.57.0", + "husky": "^9.0.11", "openapi-generator": "link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator", "tsx": "^4.7.1", - "typescript": "^5.3.3", - "wrangler": "3.28.1" + "typescript": "^5.4.2", + "wrangler": "3.33.0" }, "private": true, "dependencies": { "@axiomhq/js": "1.0.0-rc.2", "@hono/swagger-ui": "^0.2.1", - "@hono/zod-openapi": "^0.9.6", - "@libsql/client": "0.4.3", - "@lucia-auth/adapter-sqlite": "3.0.0", - "@scalar/hono-api-reference": "^0.3.47", - "@typescript-eslint/eslint-plugin": "^6.21.0", - "better-sqlite3": "^9.4.1", + "@hono/zod-openapi": "^0.9.8", + "@libsql/client": "0.5.6", + "@lucia-auth/adapter-sqlite": "3.0.1", + "@scalar/hono-api-reference": "^0.4.1", + "@typescript-eslint/eslint-plugin": "^7.2.0", + "better-sqlite3": "^9.4.3", "dayjs": "^1.11.10", - "drizzle-orm": "^0.29.3", + "drizzle-orm": "^0.30.1", "drizzle-zod": "^0.5.1", - "hono": "^4.0.1", - "lucia": "3.0.1", - "oslo": "^1.1.0", + "hono": "^4.1.0", + "lucia": "3.1.1", + "oslo": "^1.1.3", "prettier": "^3.2.5", "zod": "^3.22.4", "zod-error": "^1.5.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3bab488..220a7ef 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,43 +10,43 @@ dependencies: version: 1.0.0-rc.2 "@hono/swagger-ui": specifier: ^0.2.1 - version: 0.2.1(hono@4.0.1) + version: 0.2.1(hono@4.1.0) "@hono/zod-openapi": - specifier: ^0.9.6 - version: 0.9.6(hono@4.0.1)(zod@3.22.4) + specifier: ^0.9.8 + version: 0.9.8(hono@4.1.0)(zod@3.22.4) "@libsql/client": - specifier: 0.4.3 - version: 0.4.3 + specifier: 0.5.6 + version: 0.5.6 "@lucia-auth/adapter-sqlite": - specifier: 3.0.0 - version: 3.0.0(@libsql/client@0.4.3)(better-sqlite3@9.4.1)(lucia@3.0.1) + specifier: 3.0.1 + version: 3.0.1(@libsql/client@0.5.6)(better-sqlite3@9.4.3)(lucia@3.1.1) "@scalar/hono-api-reference": - specifier: ^0.3.47 - version: 0.3.47(hono@4.0.1)(nanoid@5.0.5)(postcss@8.4.35)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.18)(yjs@13.6.12) + specifier: ^0.4.1 + version: 0.4.1(@scalar/use-codemirror@0.9.0)(hono@4.1.0)(postcss@8.4.35)(typescript@5.4.2)(unified@11.0.4)(vue@3.4.21)(yjs@13.6.14) "@typescript-eslint/eslint-plugin": - specifier: ^6.21.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.3.3) + specifier: ^7.2.0 + version: 7.2.0(@typescript-eslint/parser@7.2.0)(eslint@8.57.0)(typescript@5.4.2) better-sqlite3: - specifier: ^9.4.1 - version: 9.4.1 + specifier: ^9.4.3 + version: 9.4.3 dayjs: specifier: ^1.11.10 version: 1.11.10 drizzle-orm: - specifier: ^0.29.3 - version: 0.29.3(@cloudflare/workers-types@4.20240208.0)(@libsql/client@0.4.3)(better-sqlite3@9.4.1) + specifier: ^0.30.1 + version: 0.30.1(@cloudflare/workers-types@4.20240312.0)(@libsql/client@0.5.6)(better-sqlite3@9.4.3) drizzle-zod: specifier: ^0.5.1 - version: 0.5.1(drizzle-orm@0.29.3)(zod@3.22.4) + version: 0.5.1(drizzle-orm@0.30.1)(zod@3.22.4) hono: - specifier: ^4.0.1 - version: 4.0.1 + specifier: ^4.1.0 + version: 4.1.0 lucia: - specifier: 3.0.1 - version: 3.0.1 + specifier: 3.1.1 + version: 3.1.1 oslo: - specifier: ^1.1.0 - version: 1.1.0 + specifier: ^1.1.3 + version: 1.1.3 prettier: specifier: ^3.2.5 version: 3.2.5 @@ -59,26 +59,26 @@ dependencies: devDependencies: "@asteasolutions/zod-to-openapi": - specifier: ^6.3.1 - version: 6.3.1(zod@3.22.4) + specifier: ^6.4.0 + version: 6.4.0(zod@3.22.4) "@cloudflare/workers-types": - specifier: ^4.20240208.0 - version: 4.20240208.0 + specifier: ^4.20240312.0 + version: 4.20240312.0 "@types/node": - specifier: ^20.11.17 - version: 20.11.17 + specifier: ^20.11.26 + version: 20.11.26 dotenv: - specifier: ^16.4.2 - version: 16.4.2 + specifier: ^16.4.5 + version: 16.4.5 drizzle-kit: specifier: ^0.20.14 version: 0.20.14 eslint: - specifier: ^8.56.0 - version: 8.56.0 + specifier: ^8.57.0 + version: 8.57.0 husky: - specifier: ^9.0.10 - version: 9.0.10 + specifier: ^9.0.11 + version: 9.0.11 openapi-generator: specifier: link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator version: link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator @@ -86,11 +86,11 @@ devDependencies: specifier: ^4.7.1 version: 4.7.1 typescript: - specifier: ^5.3.3 - version: 5.3.3 + specifier: ^5.4.2 + version: 5.4.2 wrangler: - specifier: 3.28.1 - version: 3.28.1(@cloudflare/workers-types@4.20240208.0) + specifier: 3.33.0 + version: 3.33.0(@cloudflare/workers-types@4.20240312.0) packages: /@aashutoshrathi/word-wrap@1.2.6: @@ -100,70 +100,6 @@ packages: } engines: { node: ">=0.10.0" } - /@actions/core@1.10.1: - resolution: - { - integrity: sha512-3lBR9EDAY+iYIpTnTIXmWcNbX3T2kCkAEQGIQx4NVQ0575nk2k3GRZDTPQG+vVtS2izSLmINlxXf0uLtnrTP+g==, - } - dependencies: - "@actions/http-client": 2.2.0 - uuid: 8.3.2 - dev: false - - /@actions/http-client@2.2.0: - resolution: - { - integrity: sha512-q+epW0trjVUUHboliPb4UF9g2msf+w61b32tAkFEwL/IwP0DQWgbCMM0Hbe3e3WXSKz5VcUXbzJQgy8Hkra/Lg==, - } - dependencies: - tunnel: 0.0.6 - undici: 5.28.3 - dev: false - - /@apidevtools/json-schema-ref-parser@9.0.6: - resolution: - { - integrity: sha512-M3YgsLjI0lZxvrpeGVk9Ap032W6TPQkH6pRAZz81Ac3WUNF79VQooAFnp8umjvVzUmD93NkogxEwbSce7qMsUg==, - } - dependencies: - "@jsdevtools/ono": 7.1.3 - call-me-maybe: 1.0.2 - js-yaml: 3.14.1 - dev: false - - /@apidevtools/openapi-schemas@2.1.0: - resolution: - { - integrity: sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==, - } - engines: { node: ">=10" } - dev: false - - /@apidevtools/swagger-methods@3.0.2: - resolution: - { - integrity: sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==, - } - dev: false - - /@apidevtools/swagger-parser@10.1.0(openapi-types@12.1.3): - resolution: - { - integrity: sha512-9Kt7EuS/7WbMAUv2gSziqjvxwDbFSg3Xeyfuj5laUODX8o/k/CpsAKiQ8W7/R88eXFTMbJYg6+7uAmOWNKmwnw==, - } - peerDependencies: - openapi-types: ">=7" - dependencies: - "@apidevtools/json-schema-ref-parser": 9.0.6 - "@apidevtools/openapi-schemas": 2.1.0 - "@apidevtools/swagger-methods": 3.0.2 - "@jsdevtools/ono": 7.1.3 - ajv: 8.12.0 - ajv-draft-04: 1.0.0(ajv@8.12.0) - call-me-maybe: 1.0.2 - openapi-types: 12.1.3 - dev: false - /@asteasolutions/zod-to-openapi@5.5.0(zod@3.22.4): resolution: { @@ -172,19 +108,19 @@ packages: peerDependencies: zod: ^3.20.2 dependencies: - openapi3-ts: 4.2.1 + openapi3-ts: 4.2.2 zod: 3.22.4 dev: false - /@asteasolutions/zod-to-openapi@6.3.1(zod@3.22.4): + /@asteasolutions/zod-to-openapi@6.4.0(zod@3.22.4): resolution: { - integrity: sha512-1CRWBqslgdBpZeJnxxksGirAQ39Iztxk+LzTkYwoP0mNzuaULa604s8Xc5V9yzmYccwJ89O9fPQgxCkbNN398g==, + integrity: sha512-8cxfF7AHHx2PqnN4Cd8/O8CBu/nVYJP9DpnfVLW3BFb66VJDnqI/CczZnkqMc3SNh6J9GiX7JbJ5T4BSP4HZ2Q==, } peerDependencies: zod: ^3.20.2 dependencies: - openapi3-ts: 4.2.1 + openapi3-ts: 4.2.2 zod: 3.22.4 dev: true @@ -215,31 +151,31 @@ packages: engines: { node: ">=6.9.0" } dev: false - /@babel/parser@7.23.9: + /@babel/parser@7.24.0: resolution: { - integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==, + integrity: sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==, } engines: { node: ">=6.0.0" } hasBin: true dependencies: - "@babel/types": 7.23.9 + "@babel/types": 7.24.0 dev: false - /@babel/runtime@7.23.9: + /@babel/runtime@7.24.0: resolution: { - integrity: sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==, + integrity: sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==, } engines: { node: ">=6.9.0" } dependencies: regenerator-runtime: 0.14.1 dev: false - /@babel/types@7.23.9: + /@babel/types@7.24.0: resolution: { - integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==, + integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==, } engines: { node: ">=6.9.0" } dependencies: @@ -248,19 +184,19 @@ packages: to-fast-properties: 2.0.0 dev: false - /@cloudflare/kv-asset-handler@0.2.0: + /@cloudflare/kv-asset-handler@0.3.1: resolution: { - integrity: sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==, + integrity: sha512-lKN2XCfKCmpKb86a1tl4GIwsJYDy9TGuwjhDELLmpKygQhw8X2xR4dusgpC5Tg7q1pB96Eb0rBo81kxSILQMwA==, } dependencies: mime: 3.0.0 dev: true - /@cloudflare/workerd-darwin-64@1.20240129.0: + /@cloudflare/workerd-darwin-64@1.20240304.0: resolution: { - integrity: sha512-DfVVB5IsQLVcWPJwV019vY3nEtU88c2Qu2ST5SQxqcGivZ52imagLRK0RHCIP8PK4piSiq90qUC6ybppUsw8eg==, + integrity: sha512-rfHlvsWzkqEEQNvm14AOE/BYHYzB9wxQHCaZZEgwOuTl5KpDcs9La0N0LaDTR78ESumIWOcifVmko2VTrZb7TQ==, } engines: { node: ">=16" } cpu: [x64] @@ -269,10 +205,10 @@ packages: dev: true optional: true - /@cloudflare/workerd-darwin-arm64@1.20240129.0: + /@cloudflare/workerd-darwin-arm64@1.20240304.0: resolution: { - integrity: sha512-t0q8ABkmumG1zRM/MZ/vIv/Ysx0vTAXnQAPy/JW5aeQi/tqrypXkO9/NhPc0jbF/g/hIPrWEqpDgEp3CB7Da7Q==, + integrity: sha512-IXGOxHsPdRYfAzcY6IroI1PDvx3hhXf18qFCloHp8Iw5bzLgq/PTjcp10Z/2xedZ2hVlfpHy1eEptsTmi9YeNw==, } engines: { node: ">=16" } cpu: [arm64] @@ -281,10 +217,10 @@ packages: dev: true optional: true - /@cloudflare/workerd-linux-64@1.20240129.0: + /@cloudflare/workerd-linux-64@1.20240304.0: resolution: { - integrity: sha512-sFV1uobHgDI+6CKBS/ZshQvOvajgwl6BtiYaH4PSFSpvXTmRx+A9bcug+6BnD+V4WgwxTiEO2iR97E1XuwDAVw==, + integrity: sha512-G1BEzbw9TFIeMvc425F145IetC7fuH4KOkGhseLq9y/mt5PfDWkghwmXSK+q0BiMwm0XAobtzVlHcEr2u4WlRQ==, } engines: { node: ">=16" } cpu: [x64] @@ -293,10 +229,10 @@ packages: dev: true optional: true - /@cloudflare/workerd-linux-arm64@1.20240129.0: + /@cloudflare/workerd-linux-arm64@1.20240304.0: resolution: { - integrity: sha512-O7q7htHaFRp8PgTqNJx1/fYc3+LnvAo6kWWB9a14C5OWak6AAZk42PNpKPx+DXTmGvI+8S1+futBGUeJ8NPDXg==, + integrity: sha512-LLk/d/y77TRu6QOG3CJUI2cD3Ff2lSg0ts6G83bsm9ZK+WKObWFFSPBy9l81m3EnlKFh7RZCzxN4J10kuDaO8w==, } engines: { node: ">=16" } cpu: [arm64] @@ -305,10 +241,10 @@ packages: dev: true optional: true - /@cloudflare/workerd-windows-64@1.20240129.0: + /@cloudflare/workerd-windows-64@1.20240304.0: resolution: { - integrity: sha512-YqGno0XSqqqkDmNoGEX6M8kJlI2lEfWntbTPVtHaZlaXVR9sWfoD7TEno0NKC95cXFz+ioyFLbgbOdnfWwmVAA==, + integrity: sha512-I/j6nVpM+WDPg+bYUAiKLkwQsjrXFjpOGHvwYmcM44hnDjgODzk7AbVssEIXnhEO3oupBeuKvffr0lvX0Ngmpw==, } engines: { node: ">=16" } cpu: [x64] @@ -317,16 +253,16 @@ packages: dev: true optional: true - /@cloudflare/workers-types@4.20240208.0: + /@cloudflare/workers-types@4.20240312.0: resolution: { - integrity: sha512-MVGTTjZpJu4kJONvai5SdJzWIhOJbuweVZ3goI7FNyG+JdoQH41OoB+nMhLsX626vPLZVWGPIWsiSo/WZHzgQw==, + integrity: sha512-tpBNfijiXR/DSZkcUZHxP+80nIvKUWbGO2u4FBLudmJLGPhzgfoQ3tql+FeIhxYslSituMcVQNnJmWTF7FjURg==, } - /@codemirror/autocomplete@6.12.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.24.0)(@lezer/common@1.2.1): + /@codemirror/autocomplete@6.14.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.25.1)(@lezer/common@1.2.1): resolution: { - integrity: sha512-r4IjdYFthwbCQyvqnSlx0WBHRHi8nBvU+WjJxFUij81qsBfhNudf/XKKmmC2j3m0LaOYUQTf3qiEK1J8lO1sdg==, + integrity: sha512-Kx9BCSOLKmqNXEvmViuzsBQJ2VEa/wWwOATNpixOa+suttTV3rDnAUtAIt5ObAUFjXvZakWfFfF/EbxELnGLzQ==, } peerDependencies: "@codemirror/language": ^6.0.0 @@ -335,8 +271,8 @@ packages: "@lezer/common": ^1.0.0 dependencies: "@codemirror/language": 6.10.1 - "@codemirror/state": 6.4.0 - "@codemirror/view": 6.24.0 + "@codemirror/state": 6.4.1 + "@codemirror/view": 6.25.1 "@lezer/common": 1.2.1 dev: false @@ -347,22 +283,22 @@ packages: } dependencies: "@codemirror/language": 6.10.1 - "@codemirror/state": 6.4.0 - "@codemirror/view": 6.24.0 + "@codemirror/state": 6.4.1 + "@codemirror/view": 6.25.1 "@lezer/common": 1.2.1 dev: false - /@codemirror/lang-css@6.2.1(@codemirror/view@6.24.0): + /@codemirror/lang-css@6.2.1(@codemirror/view@6.25.1): resolution: { integrity: sha512-/UNWDNV5Viwi/1lpr/dIXJNWiwDxpw13I4pTUAsNxZdg6E0mI2kTQb0P2iHczg1Tu+H4EBgJR+hYhKiHKko7qg==, } dependencies: - "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.24.0)(@lezer/common@1.2.1) + "@codemirror/autocomplete": 6.14.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.25.1)(@lezer/common@1.2.1) "@codemirror/language": 6.10.1 - "@codemirror/state": 6.4.0 + "@codemirror/state": 6.4.1 "@lezer/common": 1.2.1 - "@lezer/css": 1.1.7 + "@lezer/css": 1.1.8 transitivePeerDependencies: - "@codemirror/view" dev: false @@ -373,38 +309,28 @@ packages: integrity: sha512-tE2YK7wDlb9ZpAH6mpTPiYm6rhfdQKVDa5r9IwIFlwwgvVaKsCfuKKZoJGWsmMZIf3FQAuJ5CHMPLymOtg1hXw==, } dependencies: - "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.24.0)(@lezer/common@1.2.1) - "@codemirror/lang-css": 6.2.1(@codemirror/view@6.24.0) - "@codemirror/lang-javascript": 6.2.1 + "@codemirror/autocomplete": 6.14.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.25.1)(@lezer/common@1.2.1) + "@codemirror/lang-css": 6.2.1(@codemirror/view@6.25.1) + "@codemirror/lang-javascript": 6.2.2 "@codemirror/language": 6.10.1 - "@codemirror/state": 6.4.0 - "@codemirror/view": 6.24.0 + "@codemirror/state": 6.4.1 + "@codemirror/view": 6.25.1 "@lezer/common": 1.2.1 - "@lezer/css": 1.1.7 - "@lezer/html": 1.3.8 + "@lezer/css": 1.1.8 + "@lezer/html": 1.3.9 dev: false - /@codemirror/lang-java@6.0.1: + /@codemirror/lang-javascript@6.2.2: resolution: { - integrity: sha512-OOnmhH67h97jHzCuFaIEspbmsT98fNdhVhmA3zCxW0cn7l8rChDhZtwiwJ/JOKXgfm4J+ELxQihxaI7bj7mJRg==, + integrity: sha512-VGQfY+FCc285AhWuwjYxQyUQcYurWlxdKYT4bqwr3Twnd5wP5WSeu52t4tvvuWmljT4EmgEgZCqSieokhtY8hg==, } dependencies: - "@codemirror/language": 6.10.1 - "@lezer/java": 1.1.1 - dev: false - - /@codemirror/lang-javascript@6.2.1: - resolution: - { - integrity: sha512-jlFOXTejVyiQCW3EQwvKH0m99bUYIw40oPmFjSX2VS78yzfe0HELZ+NEo9Yfo1MkGRpGlj3Gnu4rdxV1EnAs5A==, - } - dependencies: - "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.24.0)(@lezer/common@1.2.1) + "@codemirror/autocomplete": 6.14.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.25.1)(@lezer/common@1.2.1) "@codemirror/language": 6.10.1 "@codemirror/lint": 6.5.0 - "@codemirror/state": 6.4.0 - "@codemirror/view": 6.24.0 + "@codemirror/state": 6.4.1 + "@codemirror/view": 6.25.1 "@lezer/common": 1.2.1 "@lezer/javascript": 1.4.13 dev: false @@ -419,65 +345,33 @@ packages: "@lezer/json": 1.0.2 dev: false - /@codemirror/lang-php@6.0.1: + /@codemirror/lang-yaml@6.0.0(@codemirror/view@6.25.1): resolution: { - integrity: sha512-ublojMdw/PNWa7qdN5TMsjmqkNuTBD3k6ndZ4Z0S25SBAiweFGyY68AS3xNcIOlb6DDFDvKlinLQ40vSLqf8xA==, + integrity: sha512-fVPapdX1oYr5HMC5bou1MHscGnNCvOHuhUW6C+V2gfIeIRcughvVfznV0OuUyHy0AdXoBCjOehjzFcmLRumu2Q==, } dependencies: - "@codemirror/lang-html": 6.4.8 + "@codemirror/autocomplete": 6.14.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.25.1)(@lezer/common@1.2.1) "@codemirror/language": 6.10.1 - "@codemirror/state": 6.4.0 + "@codemirror/state": 6.4.1 "@lezer/common": 1.2.1 - "@lezer/php": 1.0.2 - dev: false - - /@codemirror/lang-python@6.1.4(@codemirror/view@6.24.0): - resolution: - { - integrity: sha512-b6d1TDqrkCjFNvMO01SWldFiDoZ39yl3tDMC1Y5f8glA2eZpynPxJhwYVTlGFr0stizcJgrp6ojLEGH2myoZAw==, - } - dependencies: - "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.24.0)(@lezer/common@1.2.1) - "@codemirror/language": 6.10.1 - "@codemirror/state": 6.4.0 - "@lezer/common": 1.2.1 - "@lezer/python": 1.1.11 + "@lezer/yaml": 1.0.2 transitivePeerDependencies: - "@codemirror/view" dev: false - /@codemirror/lang-rust@6.0.1: - resolution: - { - integrity: sha512-344EMWFBzWArHWdZn/NcgkwMvZIWUR1GEBdwG8FEp++6o6vT6KL9V7vGs2ONsKxxFUPXKI0SPcWhyYyl2zPYxQ==, - } - dependencies: - "@codemirror/language": 6.10.1 - "@lezer/rust": 1.0.2 - dev: false - /@codemirror/language@6.10.1: resolution: { integrity: sha512-5GrXzrhq6k+gL5fjkAwt90nYDmjlzTIJV8THnxNFtNKWotMIlzzN+CpqxqwXOECnUdOndmSeWntVrVcv5axWRQ==, } dependencies: - "@codemirror/state": 6.4.0 - "@codemirror/view": 6.24.0 + "@codemirror/state": 6.4.1 + "@codemirror/view": 6.25.1 "@lezer/common": 1.2.1 "@lezer/highlight": 1.2.0 "@lezer/lr": 1.4.0 - style-mod: 4.1.0 - dev: false - - /@codemirror/legacy-modes@6.3.3: - resolution: - { - integrity: sha512-X0Z48odJ0KIoh/HY8Ltz75/4tDYc9msQf1E/2trlxFaFFhgjpVHjZ/BCXe1Lk7s4Gd67LL/CeEEHNI+xHOiESg==, - } - dependencies: - "@codemirror/language": 6.10.1 + style-mod: 4.1.2 dev: false /@codemirror/lint@6.5.0: @@ -486,8 +380,8 @@ packages: integrity: sha512-+5YyicIaaAZKU8K43IQi8TBy6mF6giGeWAH7N96Z5LC30Wm5JMjqxOYIE9mxwMG1NbhT2mA3l9hA4uuKUM3E5g==, } dependencies: - "@codemirror/state": 6.4.0 - "@codemirror/view": 6.24.0 + "@codemirror/state": 6.4.1 + "@codemirror/view": 6.25.1 crelt: 1.0.6 dev: false @@ -497,26 +391,26 @@ packages: integrity: sha512-rpMgcsh7o0GuCDUXKPvww+muLA1pDJaFrpq/CCHtpQJYz8xopu4D1hPcKRoDD0YlF8gZaqTNIRa4VRBWyhyy7Q==, } dependencies: - "@codemirror/state": 6.4.0 - "@codemirror/view": 6.24.0 + "@codemirror/state": 6.4.1 + "@codemirror/view": 6.25.1 crelt: 1.0.6 dev: false - /@codemirror/state@6.4.0: + /@codemirror/state@6.4.1: resolution: { - integrity: sha512-hm8XshYj5Fo30Bb922QX9hXB/bxOAVH+qaqHBzw5TKa72vOeslyGwd4X8M0c1dJ9JqxlaMceOQ8RsL9tC7gU0A==, + integrity: sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==, } dev: false - /@codemirror/view@6.24.0: + /@codemirror/view@6.25.1: resolution: { - integrity: sha512-zK6m5pNkdhdJl8idPP1gA4N8JKTiSsOz8U/Iw+C1ChMwyLG7+MLiNXnH/wFuAk6KeGEe33/adOiAh5jMqee03w==, + integrity: sha512-2LXLxsQnHDdfGzDvjzAwZh2ZviNJm7im6tGpa0IONIDnFd8RZ80D2SNi8PDi6YjKcMoMRK20v6OmKIdsrwsyoQ==, } dependencies: - "@codemirror/state": 6.4.0 - style-mod: 4.1.0 + "@codemirror/state": 6.4.1 + style-mod: 4.1.2 w3c-keyname: 2.2.8 dev: false @@ -578,7 +472,7 @@ packages: } dependencies: "@esbuild-kit/core-utils": 3.3.2 - get-tsconfig: 4.7.2 + get-tsconfig: 4.7.3 dev: true /@esbuild-plugins/node-globals-polyfill@0.2.3(esbuild@0.17.19): @@ -614,7 +508,6 @@ packages: cpu: [ppc64] os: [aix] requiresBuild: true - dev: true optional: true /@esbuild/android-arm64@0.17.19: @@ -650,7 +543,6 @@ packages: cpu: [arm64] os: [android] requiresBuild: true - dev: true optional: true /@esbuild/android-arm@0.17.19: @@ -686,7 +578,6 @@ packages: cpu: [arm] os: [android] requiresBuild: true - dev: true optional: true /@esbuild/android-x64@0.17.19: @@ -722,7 +613,6 @@ packages: cpu: [x64] os: [android] requiresBuild: true - dev: true optional: true /@esbuild/darwin-arm64@0.17.19: @@ -758,7 +648,6 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true - dev: true optional: true /@esbuild/darwin-x64@0.17.19: @@ -794,7 +683,6 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true - dev: true optional: true /@esbuild/freebsd-arm64@0.17.19: @@ -830,7 +718,6 @@ packages: cpu: [arm64] os: [freebsd] requiresBuild: true - dev: true optional: true /@esbuild/freebsd-x64@0.17.19: @@ -866,7 +753,6 @@ packages: cpu: [x64] os: [freebsd] requiresBuild: true - dev: true optional: true /@esbuild/linux-arm64@0.17.19: @@ -902,7 +788,6 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-arm@0.17.19: @@ -938,7 +823,6 @@ packages: cpu: [arm] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-ia32@0.17.19: @@ -974,7 +858,6 @@ packages: cpu: [ia32] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-loong64@0.17.19: @@ -1010,7 +893,6 @@ packages: cpu: [loong64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-mips64el@0.17.19: @@ -1046,7 +928,6 @@ packages: cpu: [mips64el] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-ppc64@0.17.19: @@ -1082,7 +963,6 @@ packages: cpu: [ppc64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-riscv64@0.17.19: @@ -1118,7 +998,6 @@ packages: cpu: [riscv64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-s390x@0.17.19: @@ -1154,7 +1033,6 @@ packages: cpu: [s390x] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-x64@0.17.19: @@ -1190,7 +1068,6 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/netbsd-x64@0.17.19: @@ -1226,7 +1103,6 @@ packages: cpu: [x64] os: [netbsd] requiresBuild: true - dev: true optional: true /@esbuild/openbsd-x64@0.17.19: @@ -1262,7 +1138,6 @@ packages: cpu: [x64] os: [openbsd] requiresBuild: true - dev: true optional: true /@esbuild/sunos-x64@0.17.19: @@ -1298,7 +1173,6 @@ packages: cpu: [x64] os: [sunos] requiresBuild: true - dev: true optional: true /@esbuild/win32-arm64@0.17.19: @@ -1334,7 +1208,6 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true - dev: true optional: true /@esbuild/win32-ia32@0.17.19: @@ -1370,7 +1243,6 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true - dev: true optional: true /@esbuild/win32-x64@0.17.19: @@ -1406,10 +1278,9 @@ packages: cpu: [x64] os: [win32] requiresBuild: true - dev: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): resolution: { integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, @@ -1418,7 +1289,7 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.56.0 + eslint: 8.57.0 eslint-visitor-keys: 3.4.3 /@eslint-community/regexpp@4.10.0: @@ -1447,19 +1318,20 @@ packages: transitivePeerDependencies: - supports-color - /@eslint/js@8.56.0: + /@eslint/js@8.57.0: resolution: { - integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==, + integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - /@fastify/busboy@2.1.0: + /@fastify/busboy@2.1.1: resolution: { - integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==, + integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==, } engines: { node: ">=14" } + dev: true /@floating-ui/core@1.6.0: resolution: @@ -1470,10 +1342,10 @@ packages: "@floating-ui/utils": 0.2.1 dev: false - /@floating-ui/dom@1.6.1: + /@floating-ui/dom@1.6.3: resolution: { - integrity: sha512-iA8qE43/H5iGozC3W0YSnVSW42Vh522yyM1gj+BqRwVsTNOyr231PsXDaV04yT39PsO0QL2QpbI/M0ZaLUQgRQ==, + integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==, } dependencies: "@floating-ui/core": 1.6.0 @@ -1487,21 +1359,21 @@ packages: } dev: false - /@floating-ui/vue@1.0.6(vue@3.4.18): + /@floating-ui/vue@1.0.6(vue@3.4.21): resolution: { integrity: sha512-EdrOljjkpkkqZnrpqUcPoz9NvHxuTjUtSInh6GMv3+Mcy+giY2cE2pHh9rpacRcZ2eMSCxel9jWkWXTjLmY55w==, } dependencies: - "@floating-ui/dom": 1.6.1 + "@floating-ui/dom": 1.6.3 "@floating-ui/utils": 0.2.1 - vue-demi: 0.14.7(vue@3.4.18) + vue-demi: 0.14.7(vue@3.4.21) transitivePeerDependencies: - "@vue/composition-api" - vue dev: false - /@headlessui/vue@1.7.19(vue@3.4.18): + /@headlessui/vue@1.7.19(vue@3.4.21): resolution: { integrity: sha512-VFjKPybogux/5/QYGSq4zgG/x3RcxId15W8uguAJAjPBxelI23dwjOjTx/mIiMkM/Hd3rzFxcf2aIp56eEWRcA==, @@ -1510,11 +1382,11 @@ packages: peerDependencies: vue: ^3.2.0 dependencies: - "@tanstack/vue-virtual": 3.0.4(vue@3.4.18) - vue: 3.4.18(typescript@5.3.3) + "@tanstack/vue-virtual": 3.1.3(vue@3.4.21) + vue: 3.4.21(typescript@5.4.2) dev: false - /@hono/swagger-ui@0.2.1(hono@4.0.1): + /@hono/swagger-ui@0.2.1(hono@4.1.0): resolution: { integrity: sha512-wBxVMRe3/v8xH4o6icmwztiIq0DG0s7+jHVMHVUAoFFCWEQNL2iskMmQtrhSDtsFmBZUeUFQUaaJ6Ir6DOmHLA==, @@ -1522,13 +1394,13 @@ packages: peerDependencies: hono: "*" dependencies: - hono: 4.0.1 + hono: 4.1.0 dev: false - /@hono/zod-openapi@0.9.6(hono@4.0.1)(zod@3.22.4): + /@hono/zod-openapi@0.9.8(hono@4.1.0)(zod@3.22.4): resolution: { - integrity: sha512-MLF8xpd4fEwbEaylFqAt1qci4wOTXu3oq3BKb01trccapYfodP50VCO0YDNBQTyMT/Iapq6GMO4+RAIFBgG5WQ==, + integrity: sha512-NS6lvQEGnsjyQkp+aQjMARREz3WGf19y0+RiiJMVrihWlmKbGaJkPuOWpfFQG6FU9q+FVUyUCryXK+3J07GPAw==, } engines: { node: ">=16.0.0" } peerDependencies: @@ -1536,12 +1408,12 @@ packages: zod: 3.* dependencies: "@asteasolutions/zod-to-openapi": 5.5.0(zod@3.22.4) - "@hono/zod-validator": 0.1.11(hono@4.0.1)(zod@3.22.4) - hono: 4.0.1 + "@hono/zod-validator": 0.1.11(hono@4.1.0)(zod@3.22.4) + hono: 4.1.0 zod: 3.22.4 dev: false - /@hono/zod-validator@0.1.11(hono@4.0.1)(zod@3.22.4): + /@hono/zod-validator@0.1.11(hono@4.1.0)(zod@3.22.4): resolution: { integrity: sha512-PQXeHUP0+36qpRt8yfeD7N2jbK3ETlGvSN6dMof/HwUC/APRokQRjpXZm4rrlG71Ft0aWE01+Bm4XejqPie5Uw==, @@ -1550,7 +1422,7 @@ packages: hono: ">=3.9.0" zod: ^3.19.1 dependencies: - hono: 4.0.1 + hono: 4.1.0 zod: 3.22.4 dev: false @@ -1574,16 +1446,24 @@ packages: } engines: { node: ">=12.22" } + /@humanwhocodes/momoa@3.0.1: + resolution: + { + integrity: sha512-Yj2GOwIDb77+A5p4oV2x27edQ7NX86+vKBGWySnfwjKesxn8JCa90Q0Z0eyBBy2G1FulTDrRtfIdmPpIOGhCmQ==, + } + engines: { node: ">=18" } + dev: false + /@humanwhocodes/object-schema@2.0.2: resolution: { integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==, } - /@jridgewell/resolve-uri@3.1.1: + /@jridgewell/resolve-uri@3.1.2: resolution: { - integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==, + integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==, } engines: { node: ">=6.0.0" } dev: true @@ -1600,17 +1480,10 @@ packages: integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==, } dependencies: - "@jridgewell/resolve-uri": 3.1.1 + "@jridgewell/resolve-uri": 3.1.2 "@jridgewell/sourcemap-codec": 1.4.15 dev: true - /@jsdevtools/ono@7.1.3: - resolution: - { - integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==, - } - dev: false - /@lezer/common@1.2.1: resolution: { @@ -1618,10 +1491,10 @@ packages: } dev: false - /@lezer/css@1.1.7: + /@lezer/css@1.1.8: resolution: { - integrity: sha512-7BlFFAKNn/b39jJLrhdLSX5A2k56GIJvyLqdmm7UU+7XvequY084iuKDMAEhAmAzHnwDE8FK4OQtsIUssW91tg==, + integrity: sha512-7JhxupKuMBaWQKjQoLtzhGj83DdnZY9MckEOG5+/iLKNK2ZJqKc6hf6uc0HjwCX7Qlok44jBNqZhHKDhEhZYLA==, } dependencies: "@lezer/common": 1.2.1 @@ -1638,21 +1511,10 @@ packages: "@lezer/common": 1.2.1 dev: false - /@lezer/html@1.3.8: + /@lezer/html@1.3.9: resolution: { - integrity: sha512-EXseJ3pUzWxE6XQBQdqWHZqqlGQRSuNMBcLb6mZWS2J2v+QZhOObD+3ZIKIcm59ntTzyor4LqFTb72iJc3k23Q==, - } - dependencies: - "@lezer/common": 1.2.1 - "@lezer/highlight": 1.2.0 - "@lezer/lr": 1.4.0 - dev: false - - /@lezer/java@1.1.1: - resolution: - { - integrity: sha512-mt3dX13fRlpY7RlWELYRakanXgmwXsLRCrhstrn+c1sZd7jR2xle46/3heoxGd+oHxnuTnpoyXTyxcLJQs9+mQ==, + integrity: sha512-MXxeCMPyrcemSLGaTQEZx0dBUH0i+RPl8RN5GwMAzo53nTsd/Unc/t5ZxACeQoyPUM5/GkPLRUs2WliOImzkRA==, } dependencies: "@lezer/common": 1.2.1 @@ -1691,10 +1553,10 @@ packages: "@lezer/common": 1.2.1 dev: false - /@lezer/php@1.0.2: + /@lezer/yaml@1.0.2: resolution: { - integrity: sha512-GN7BnqtGRpFyeoKSEqxvGvhJQiI4zkgmYnDk/JIyc7H7Ifc1tkPnUn/R2R8meH3h/aBf5rzjvU8ZQoyiNDtDrA==, + integrity: sha512-XCkwuxe+eumJ28nA9e1S6XKsXz9W7V/AG+WBiWOtiIuUpKcZ/bHuvN8bLxSDREIcybSRpEd/jvphh4vgm6Ed2g==, } dependencies: "@lezer/common": 1.2.1 @@ -1702,58 +1564,35 @@ packages: "@lezer/lr": 1.4.0 dev: false - /@lezer/python@1.1.11: + /@libsql/client@0.5.6: resolution: { - integrity: sha512-C3QeLCcdAKJDUOsYjfFP6a1wdn8jhUNX200bgFm8TpKH1eM2PlgYQS5ugw6E38qGeEx7CP21I1Q52SoybXt0OQ==, + integrity: sha512-UBjmDoxz75Z2sHdP+ETCROpeLA/77VMesiff8R4UWK1rnaWbh6/YoCLDILMJL3Rh0udQeKxjL8MjXthqohax+g==, } dependencies: - "@lezer/common": 1.2.1 - "@lezer/highlight": 1.2.0 - "@lezer/lr": 1.4.0 - dev: false - - /@lezer/rust@1.0.2: - resolution: - { - integrity: sha512-Lz5sIPBdF2FUXcWeCu1//ojFAZqzTQNRga0aYv6dYXqJqPfMdCAI0NzajWUd4Xijj1IKJLtjoXRPMvTKWBcqKg==, - } - dependencies: - "@lezer/common": 1.2.1 - "@lezer/highlight": 1.2.0 - "@lezer/lr": 1.4.0 - dev: false - - /@libsql/client@0.4.3: - resolution: - { - integrity: sha512-AUYKnSPqAsFBVWBvmtrb4dG3pQlvTKT92eztAest9wQU2iJkabH8WzHLDb3dKFWKql7/kiCqvBQUVpozDwhekQ==, - } - dependencies: - "@libsql/core": 0.4.3 + "@libsql/core": 0.5.6 "@libsql/hrana-client": 0.5.6 - js-base64: 3.7.6 - optionalDependencies: - libsql: 0.2.0 + js-base64: 3.7.7 + libsql: 0.3.10 transitivePeerDependencies: - bufferutil - encoding - utf-8-validate dev: false - /@libsql/core@0.4.3: + /@libsql/core@0.5.6: resolution: { - integrity: sha512-r28iYBtaLBW9RRgXPFh6cGCsVI/rwRlOzSOpAu/1PVTm6EJ3t233pUf97jETVHU0vjdr1d8VvV6fKAvJkokqCw==, + integrity: sha512-3vicUAydq6jPth410n4AsHHm1n2psTwvkSf94nfJlSXutGSZsl0updn2N/mJBgqUHkbuFoWZtlMifF0SwBj1xQ==, } dependencies: - js-base64: 3.7.6 + js-base64: 3.7.7 dev: false - /@libsql/darwin-arm64@0.2.0: + /@libsql/darwin-arm64@0.3.10: resolution: { - integrity: sha512-+qyT2W/n5CFH1YZWv2mxW4Fsoo4dX9Z9M/nvbQqZ7H84J8hVegvVAsIGYzcK8xAeMEcpU5yGKB1Y9NoDY4hOSQ==, + integrity: sha512-RaexEFfPAFogd6dJlqkpCkTxdr6K14Z0286lodIJ8Ny77mWuWyBkWKxf70OYWXXAMxMJFUW+6al1F3/Osf/pTg==, } cpu: [arm64] os: [darwin] @@ -1761,10 +1600,10 @@ packages: dev: false optional: true - /@libsql/darwin-x64@0.2.0: + /@libsql/darwin-x64@0.3.10: resolution: { - integrity: sha512-hwmO2mF1n8oDHKFrUju6Jv+n9iFtTf5JUK+xlnIE3Td0ZwGC/O1R/Z/btZTd9nD+vsvakC8SJT7/Q6YlWIkhEw==, + integrity: sha512-SNVN6n4qNUdMW1fJMFmx4qn4n5RnXsxjFbczpkzG/V7m/5VeTFt1chhGcrahTHCr3+K6eRJWJUEQHRGqjBwPkw==, } cpu: [x64] os: [darwin] @@ -1780,7 +1619,7 @@ packages: dependencies: "@libsql/isomorphic-fetch": 0.1.12 "@libsql/isomorphic-ws": 0.1.5 - js-base64: 3.7.6 + js-base64: 3.7.7 node-fetch: 3.3.2 transitivePeerDependencies: - bufferutil @@ -1813,10 +1652,10 @@ packages: - utf-8-validate dev: false - /@libsql/linux-arm64-gnu@0.2.0: + /@libsql/linux-arm64-gnu@0.3.10: resolution: { - integrity: sha512-1w2lPXIYtnBaK5t/Ej5E8x7lPiE+jP3KATI/W4yei5Z/ONJh7jQW5PJ7sYU95vTME3hWEM1FXN6kvzcpFAte7w==, + integrity: sha512-2uXpi9d8qtyIOr7pyG4a88j6YXgemyIHEs2Wbp+PPletlCIPsFS+E7IQHbz8VwTohchOzcokGUm1Bc5QC+A7wg==, } cpu: [arm64] os: [linux] @@ -1824,10 +1663,10 @@ packages: dev: false optional: true - /@libsql/linux-arm64-musl@0.2.0: + /@libsql/linux-arm64-musl@0.3.10: resolution: { - integrity: sha512-lkblBEJ7xuNiWNjP8DDq0rqoWccszfkUS7Efh5EjJ+GDWdCBVfh08mPofIZg0fZVLWQCY3j+VZCG1qZfATBizg==, + integrity: sha512-72SN1FUavLvzHddCS861ynSpQndcW5oLGKA3U8CyMfgIZIwJAPc7+48Uj1plW00htXBx4GBpcntFp68KKIx3YQ==, } cpu: [arm64] os: [linux] @@ -1835,10 +1674,10 @@ packages: dev: false optional: true - /@libsql/linux-x64-gnu@0.2.0: + /@libsql/linux-x64-gnu@0.3.10: resolution: { - integrity: sha512-+x/d289KeJydwOhhqSxKT+6MSQTCfLltzOpTzPccsvdt5fxg8CBi+gfvEJ4/XW23Sa+9bc7zodFP0i6MOlxX7w==, + integrity: sha512-hXyNqVRi7ONuyWZ1SX6setxL0QaQ7InyS3bHLupsi9s7NpOGD5vcpTaYicJOqmIIm+6kt8vJfmo7ZxlarIHy7Q==, } cpu: [x64] os: [linux] @@ -1846,10 +1685,10 @@ packages: dev: false optional: true - /@libsql/linux-x64-musl@0.2.0: + /@libsql/linux-x64-musl@0.3.10: resolution: { - integrity: sha512-5Xn0c5A6vKf9D1ASpgk7mef//FuY7t5Lktj/eiU4n3ryxG+6WTpqstTittJUgepVjcleLPYxIhQAYeYwTYH1IQ==, + integrity: sha512-kNmIRxomVwt9S+cLyYS497F/3gXFF4r8wW12YSBQgxG75JYft07AHVd8J7HINg+oqRkLzT0s+mVX5dM6nk68EQ==, } cpu: [x64] os: [linux] @@ -1857,10 +1696,10 @@ packages: dev: false optional: true - /@libsql/win32-x64-msvc@0.2.0: + /@libsql/win32-x64-msvc@0.3.10: resolution: { - integrity: sha512-rpK+trBIpRST15m3cMYg5aPaX7kvCIottxY7jZPINkKAaScvfbn9yulU/iZUM9YtuK96Y1ZmvwyVIK/Y5DzoMQ==, + integrity: sha512-c/6rjdtGULKrJkLgfLobFefObfOtxjXGmCfPxv6pr0epPCeUEssfDbDIeEH9fQUgzogIMWEHwT8so52UJ/iT1Q==, } cpu: [x64] os: [win32] @@ -1868,10 +1707,10 @@ packages: dev: false optional: true - /@lucia-auth/adapter-sqlite@3.0.0(@libsql/client@0.4.3)(better-sqlite3@9.4.1)(lucia@3.0.1): + /@lucia-auth/adapter-sqlite@3.0.1(@libsql/client@0.5.6)(better-sqlite3@9.4.3)(lucia@3.1.1): resolution: { - integrity: sha512-7XMfMMNziFOoqIq2u9W5Z+wo7G7lzNQfUh7wDlkIqKxJMSLtP6GKH+QpK+21X4ZY9dIDmiuiwqZmS3Q3CgpATw==, + integrity: sha512-bzr8+HALrbiYMb/+oL1SAnjbgFqlPs/Kj4lO57t/VvbXzmbpQEKk5Nv6hMpvWSkGAR9LbxYeQAtecikpKZVB0w==, } peerDependencies: "@libsql/client": ^0.3.0 @@ -1883,9 +1722,9 @@ packages: better-sqlite3: optional: true dependencies: - "@libsql/client": 0.4.3 - better-sqlite3: 9.4.1 - lucia: 3.0.1 + "@libsql/client": 0.5.6 + better-sqlite3: 9.4.3 + lucia: 3.1.1 dev: false /@napi-rs/wasm-runtime@0.1.1: @@ -1908,7 +1747,6 @@ packages: } requiresBuild: true dev: false - optional: true /@node-rs/argon2-android-arm-eabi@1.7.0: resolution: @@ -2711,7 +2549,7 @@ packages: "@nodelib/fs.scandir": 2.1.5 fastq: 1.17.1 - /@replit/codemirror-css-color-picker@6.1.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.24.0): + /@replit/codemirror-css-color-picker@6.1.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.25.1): resolution: { integrity: sha512-lkjtzOy8+C4VhuHegUfaqxsIsLVVW+FCRpKE+IOU4bX3Fp6Yo3sHS1PCHy1QlOtmL+Y+08Yb+giKuMXLyYzjew==, @@ -2722,141 +2560,332 @@ packages: "@codemirror/view": ^6.0.0 dependencies: "@codemirror/language": 6.10.1 - "@codemirror/state": 6.4.0 - "@codemirror/view": 6.24.0 + "@codemirror/state": 6.4.1 + "@codemirror/view": 6.25.1 + dev: false + + /@rollup/rollup-android-arm-eabi@4.13.0: + resolution: + { + integrity: sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==, + } + cpu: [arm] + os: [android] + requiresBuild: true dev: false + optional: true - /@scalar/api-client@0.11.5(vue@3.4.18)(yjs@13.6.12): + /@rollup/rollup-android-arm64@4.13.0: resolution: { - integrity: sha512-H80OZkxFvU9UaHsp5gHI8rYoNAUBlESVQIHr90OUTmpSWOIfMFMKd/kA7bkp4l8KCqxk47vvTGvnSQF2YWCCTg==, + integrity: sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==, + } + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-darwin-arm64@4.13.0: + resolution: + { + integrity: sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==, + } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-darwin-x64@4.13.0: + resolution: + { + integrity: sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==, + } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.13.0: + resolution: + { + integrity: sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==, + } + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.13.0: + resolution: + { + integrity: sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==, + } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-arm64-musl@4.13.0: + resolution: + { + integrity: sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==, + } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.13.0: + resolution: + { + integrity: sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==, + } + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-x64-gnu@4.13.0: + resolution: + { + integrity: sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==, + } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-x64-musl@4.13.0: + resolution: + { + integrity: sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==, + } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.13.0: + resolution: + { + integrity: sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==, + } + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.13.0: + resolution: + { + integrity: sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==, + } + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-win32-x64-msvc@4.13.0: + resolution: + { + integrity: sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==, + } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@scalar/api-client@1.0.0(@scalar/oas-utils@0.1.0)(typescript@5.4.2)(vue@3.4.21)(yjs@13.6.14): + resolution: + { + integrity: sha512-ZD1TP1k3AKuJQ15RAsWR7EKzKKqjAmyw+Ky/SUyr+GpJAg637IC0CGlALMg49NHKVcjPQA926Zo96T+18uVaTA==, } engines: { node: ">=18" } peerDependencies: + "@scalar/oas-utils": 0.1.0 vue: ^3.3.0 dependencies: - "@headlessui/vue": 1.7.19(vue@3.4.18) - "@scalar/themes": 0.5.4(vue@3.4.18) - "@scalar/use-codemirror": 0.8.3(vue@3.4.18)(yjs@13.6.12) - "@scalar/use-keyboard-event": 0.5.8(vue@3.4.18) - "@scalar/use-modal": 0.2.3(@headlessui/vue@1.7.19)(vue@3.4.18) - "@vueuse/core": 10.7.2(vue@3.4.18) + "@headlessui/vue": 1.7.19(vue@3.4.21) + "@scalar/components": 0.4.3(typescript@5.4.2)(vue@3.4.21) + "@scalar/oas-utils": 0.1.0 + "@scalar/themes": 0.6.2(vue@3.4.21) + "@scalar/use-codemirror": 0.9.0(vue@3.4.21)(yjs@13.6.14) + "@scalar/use-modal": 0.2.9(@headlessui/vue@1.7.19)(vue@3.4.21) + "@vueuse/core": 10.9.0(vue@3.4.21) axios: 1.6.7 content-type: 1.0.5 - javascript-time-ago: 2.5.9 - nanoid: 5.0.5 + nanoid: 5.0.6 pretty-bytes: 6.1.1 pretty-ms: 8.0.0 - vue: 3.4.18(typescript@5.3.3) + vue: 3.4.21(typescript@5.4.2) transitivePeerDependencies: - "@vue/composition-api" - debug + - typescript - yjs dev: false - /@scalar/api-reference@1.15.5(nanoid@5.0.5)(postcss@8.4.35)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.18)(yjs@13.6.12): + /@scalar/api-reference@1.19.1(@scalar/use-codemirror@0.9.0)(postcss@8.4.35)(typescript@5.4.2)(unified@11.0.4)(vue@3.4.21)(yjs@13.6.14): resolution: { - integrity: sha512-lOEhiW164ANhCQumjo45oCE+MVEDaBpAYxCNwJnRhYDdhKVPkLEd43HhzxUJSu4fZyFuNoCkbKkxLnh/2Mohpg==, + integrity: sha512-zbb2Xf+AovbB6VJgbnPLdhhXvPbxQCeVDNPXd7w3fe4CovVz7zncpiFaDr71aqG587p5Q5QkIZoIOnJwzMQRvg==, } engines: { node: ">=18" } peerDependencies: unified: ^11.0.0 vue: ^3.3.0 dependencies: - "@floating-ui/vue": 1.0.6(vue@3.4.18) - "@headlessui/vue": 1.7.19(vue@3.4.18) - "@scalar/api-client": 0.11.5(vue@3.4.18)(yjs@13.6.12) - "@scalar/components": 0.2.2(typescript@5.3.3) + "@floating-ui/vue": 1.0.6(vue@3.4.21) + "@headlessui/vue": 1.7.19(vue@3.4.21) + "@scalar/api-client": 1.0.0(@scalar/oas-utils@0.1.0)(typescript@5.4.2)(vue@3.4.21)(yjs@13.6.14) + "@scalar/components": 0.4.3(typescript@5.4.2)(vue@3.4.21) + "@scalar/oas-utils": 0.1.0 + "@scalar/openapi-parser": 0.3.2 "@scalar/snippetz": 0.1.5 - "@scalar/swagger-editor": 0.10.4(typescript@5.3.3)(vue@3.4.18)(yjs@13.6.12) - "@scalar/swagger-parser": 0.5.15(openapi-types@12.1.3) - "@scalar/themes": 0.5.4(vue@3.4.18) - "@scalar/use-clipboard": 0.5.13(@scalar/use-toasts@0.5.13)(nanoid@5.0.5) - "@scalar/use-codemirror": 0.8.3(vue@3.4.18)(yjs@13.6.12) - "@scalar/use-keyboard-event": 0.5.8(vue@3.4.18) - "@scalar/use-modal": 0.2.3(@headlessui/vue@1.7.19)(vue@3.4.18) - "@scalar/use-toasts": 0.5.13(nanoid@5.0.5)(vue@3.4.18) - "@scalar/use-tooltip": 0.5.8(vue@3.4.18) - "@unhead/schema": 1.8.10 + "@scalar/swagger-editor": 1.0.0(@scalar/components@0.4.3)(@scalar/oas-utils@0.1.0)(@scalar/themes@0.6.2)(@scalar/use-codemirror@0.9.0)(@vueuse/core@10.9.0)(vue@3.4.21) + "@scalar/themes": 0.6.2(vue@3.4.21) + "@scalar/use-modal": 0.2.9(@headlessui/vue@1.7.19)(vue@3.4.21) + "@scalar/use-tooltip": 0.5.12(vue@3.4.21) + "@unhead/schema": 1.8.14 "@vcarl/remark-headings": 0.1.0 - "@vueuse/core": 10.7.2(vue@3.4.18) + "@vueuse/core": 10.9.0(vue@3.4.21) "@xmldom/xmldom": 0.8.10 axios: 1.6.7 fuse.js: 6.6.2 github-slugger: 2.0.0 httpsnippet-lite: 3.0.5 - js-yaml: 4.1.0 - openapi-types: 12.1.3 postcss-nested: 6.0.1(postcss@8.4.35) rehype-external-links: 3.0.0 rehype-format: 5.0.0 rehype-highlight: 7.0.0 rehype-raw: 7.0.0 rehype-sanitize: 6.0.0 - rehype-slug-custom-id: 1.1.0 rehype-stringify: 10.0.0 remark-gfm: 4.0.0 - remark-html: 16.0.1 remark-parse: 11.0.0 remark-rehype: 11.1.0 remark-stringify: 11.0.0 - unhead: 1.8.10 + unhead: 1.8.14 unified: 11.0.4 - vue: 3.4.18(typescript@5.3.3) + vue: 3.4.21(typescript@5.4.2) + vue-sonner: 1.1.2 transitivePeerDependencies: + - "@scalar/use-codemirror" - "@vue/composition-api" - debug - - nanoid + - less + - lightningcss - postcss + - sass + - stylus + - sugarss - supports-color + - terser - typescript - yjs dev: false - /@scalar/components@0.2.2(typescript@5.3.3): + /@scalar/components@0.4.3(typescript@5.4.2)(vue@3.4.21): resolution: { - integrity: sha512-+iMVCe6aKTwQYu4hLypH48kJVkfLZ/twB8ZBRK4lhZCpv8bUOprOMxYIkdnRtlXJITCaM6lxee5pg4aSVkCrvg==, + integrity: sha512-NnZQyXyKiJoL+KvdBcvon28ROqi/lLHmZaJlNNTK4zFKB37H+00FVPJduibhYHrzVmsrn+VjI35Llc34dyKoBQ==, } engines: { node: ">=18" } + peerDependencies: + vue: ^3.3.0 dependencies: - "@headlessui/vue": 1.7.19(vue@3.4.18) - "@vueuse/core": 10.7.2(vue@3.4.18) + "@headlessui/vue": 1.7.19(vue@3.4.21) + "@vueuse/core": 10.9.0(vue@3.4.21) "@xmldom/xmldom": 0.8.10 class-variance-authority: 0.7.0 - cva: 1.0.0-beta.1(typescript@5.3.3) - nanoid: 5.0.5 + cva: 1.0.0-beta.1(typescript@5.4.2) + nanoid: 5.0.6 + prismjs: 1.29.0 tailwind-merge: 2.2.1 - vue: 3.4.18(typescript@5.3.3) + vue: 3.4.21(typescript@5.4.2) transitivePeerDependencies: - "@vue/composition-api" - typescript dev: false - /@scalar/hono-api-reference@0.3.47(hono@4.0.1)(nanoid@5.0.5)(postcss@8.4.35)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.18)(yjs@13.6.12): + /@scalar/hono-api-reference@0.4.1(@scalar/use-codemirror@0.9.0)(hono@4.1.0)(postcss@8.4.35)(typescript@5.4.2)(unified@11.0.4)(vue@3.4.21)(yjs@13.6.14): resolution: { - integrity: sha512-8jrjuZrF1MH6JMyw8MUsXpf++4pl0syQ6MnHa8EpnxMi/w6pWLqYpOnrlkdjkS0sru8G9sGXHxMwysBC3Uowjw==, + integrity: sha512-Bk6/uH830rsIWASh2o0Wi3TfsX6Sdr083pE0Wv1Cyh7YnRW8RgUihFR4UXwV/GhjCPplGpj9VAKMCeCgvEnicQ==, } engines: { node: ">=18" } peerDependencies: - hono: ^3.0.0 + hono: ^3.0.0 || ^4.0.0 dependencies: - "@scalar/api-reference": 1.15.5(nanoid@5.0.5)(postcss@8.4.35)(typescript@5.3.3)(unified@11.0.4)(vue@3.4.18)(yjs@13.6.12) - hono: 4.0.1 + "@scalar/api-reference": 1.19.1(@scalar/use-codemirror@0.9.0)(postcss@8.4.35)(typescript@5.4.2)(unified@11.0.4)(vue@3.4.21)(yjs@13.6.14) + hono: 4.1.0 transitivePeerDependencies: + - "@scalar/use-codemirror" - "@vue/composition-api" - debug - - nanoid + - less + - lightningcss - postcss + - sass + - stylus + - sugarss - supports-color + - terser - typescript - unified - vue - yjs dev: false + /@scalar/oas-utils@0.1.0: + resolution: + { + integrity: sha512-IVL1OYGK+qXHo0DURGqoiY6J88HBP9tE1GpUfs5nT9bcNr5A/b1qDlzXz4Xuxctl4gdn1GmIWzVXFhj1Cq8ydA==, + } + engines: { node: ">=18" } + dependencies: + yaml: 2.4.1 + dev: false + + /@scalar/openapi-parser@0.3.2: + resolution: + { + integrity: sha512-o38wF1rKqCc7R0zFMta5rPTiY4cWwVcZPJkV1OCcnPsF2eE79uPkhYU2j/kdocJXVwMqqAe9a6+0o4R8YjgPVw==, + } + engines: { node: ">=18" } + dependencies: + "@humanwhocodes/momoa": 3.0.1 + "@types/node": 20.11.26 + ajv: 8.12.0 + ajv-draft-04: 1.0.0(ajv@8.12.0) + ajv-formats: 2.1.1(ajv@8.12.0) + js-yaml: 4.1.0 + jsonpointer: 5.0.1 + leven: 4.0.0 + openapi-types: 12.1.3 + vite: 5.1.6(@types/node@20.11.26) + yaml: 2.4.1 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - terser + dev: false + /@scalar/snippetz-core@0.1.3: resolution: { @@ -2905,167 +2934,112 @@ packages: "@scalar/snippetz-plugin-node-undici": 0.1.5 dev: false - /@scalar/swagger-editor@0.10.4(typescript@5.3.3)(vue@3.4.18)(yjs@13.6.12): - resolution: - { - integrity: sha512-JHzDgmc5zug3cC/PR754Qy3e1ENdc/Q66JTr3gBSoQSorLvIeThgwFlIdUugDArRB2avdEKthsrw/YoYpSoTNw==, - } - engines: { node: ">=18" } - peerDependencies: - vue: ^3.3.0 - dependencies: - "@scalar/components": 0.2.2(typescript@5.3.3) - "@scalar/themes": 0.5.4(vue@3.4.18) - "@scalar/use-codemirror": 0.8.3(vue@3.4.18)(yjs@13.6.12) - "@vueuse/core": 10.7.2(vue@3.4.18) - vue: 3.4.18(typescript@5.3.3) - transitivePeerDependencies: - - "@vue/composition-api" - - typescript - - yjs - dev: false - - /@scalar/swagger-parser@0.5.15(openapi-types@12.1.3): + /@scalar/swagger-editor@1.0.0(@scalar/components@0.4.3)(@scalar/oas-utils@0.1.0)(@scalar/themes@0.6.2)(@scalar/use-codemirror@0.9.0)(@vueuse/core@10.9.0)(vue@3.4.21): resolution: - { - integrity: sha512-qQY69CiS9XkdG5RuWk/ey12qXiXLUacb7b6oXU1KNB00MKJEpfj+Fjdn+ALXBoKiUVqAfIxeB76evGdZsupwMQ==, - } - engines: { node: ">=18" } - dependencies: - "@apidevtools/swagger-parser": 10.1.0(openapi-types@12.1.3) - js-yaml: 4.1.0 - transitivePeerDependencies: - - openapi-types - dev: false - - /@scalar/themes@0.5.4(vue@3.4.18): - resolution: - { - integrity: sha512-3tmivqGFJwmxmPygWls5W5qyQAt2Ax8tUVi/eVHb8+UYs5ADTzhNKeOu/CipKeZO9z+tfO+UO+XLhy2qb5T+dA==, - } - engines: { node: ">=18" } - peerDependencies: - vue: ^3.3.0 - dependencies: - vue: 3.4.18(typescript@5.3.3) - dev: false - - /@scalar/use-clipboard@0.5.13(@scalar/use-toasts@0.5.13)(nanoid@5.0.5): - resolution: - { - integrity: sha512-UtDu+ArEfHjHUGJzNZQdbFfP4CAPhPwJxcMAwG6KbwaRTNq4UNRS3+WoFmnVOOl8dPLVQFyMs10A2ca2HgJGcA==, - } - engines: { node: ">=18" } - peerDependencies: - "@scalar/use-toasts": 0.5.13 - nanoid: ^5.0.1 - dependencies: - "@scalar/use-toasts": 0.5.13(nanoid@5.0.5)(vue@3.4.18) - nanoid: 5.0.5 - dev: false - - /@scalar/use-codemirror@0.8.3(vue@3.4.18)(yjs@13.6.12): - resolution: - { - integrity: sha512-f0Zuj3A9qgIquD0Wkq5Q4MI/fVwmbasDfUiDkUDfpgIdCrKRlFEmKmYHhRmb415GMUoiJrx/7kuwcpq2Iwn71A==, - } - engines: { node: ">=18" } - peerDependencies: - vue: ^3.3.0 - yjs: ^13.6.0 - dependencies: - "@codemirror/lang-css": 6.2.1(@codemirror/view@6.24.0) - "@codemirror/lang-html": 6.4.8 - "@codemirror/lang-java": 6.0.1 - "@codemirror/lang-javascript": 6.2.1 - "@codemirror/lang-json": 6.0.1 - "@codemirror/lang-php": 6.0.1 - "@codemirror/lang-python": 6.1.4(@codemirror/view@6.24.0) - "@codemirror/lang-rust": 6.0.1 - "@codemirror/language": 6.10.1 - "@codemirror/legacy-modes": 6.3.3 - "@codemirror/state": 6.4.0 - "@codemirror/view": 6.24.0 - "@lezer/common": 1.2.1 - "@lezer/highlight": 1.2.0 - "@lezer/lr": 1.4.0 - "@replit/codemirror-css-color-picker": 6.1.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.24.0) - "@uiw/codemirror-themes": 4.21.21(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.24.0) - codemirror: 6.0.1(@lezer/common@1.2.1) - vue: 3.4.18(typescript@5.3.3) - y-codemirror.next: 0.3.2(@codemirror/state@6.4.0)(@codemirror/view@6.24.0)(yjs@13.6.12) - yjs: 13.6.12 + { + integrity: sha512-d2jfBrUlCfq5UQ/NzZaar23lKtJDubvJ9aDbulymYF0sTinGjI6Py5FiBhmoRXdobaerWbmVIoLCLwhY3rvOYQ==, + } + engines: { node: ">=18" } + peerDependencies: + "@scalar/components": 0.4.3 + "@scalar/oas-utils": 0.1.0 + "@scalar/themes": 0.6.2 + "@scalar/use-codemirror": 0.9.0 + "@vueuse/core": ^10.4.1 + vue: ^3.3.0 + dependencies: + "@scalar/components": 0.4.3(typescript@5.4.2)(vue@3.4.21) + "@scalar/oas-utils": 0.1.0 + "@scalar/themes": 0.6.2(vue@3.4.21) + "@scalar/use-codemirror": 0.9.0(vue@3.4.21)(yjs@13.6.14) + "@vueuse/core": 10.9.0(vue@3.4.21) + vue: 3.4.21(typescript@5.4.2) dev: false - /@scalar/use-keyboard-event@0.5.8(vue@3.4.18): + /@scalar/themes@0.6.2(vue@3.4.21): resolution: { - integrity: sha512-LcqgZOZWOKIDCftfR4+qOXEtbvXtTtHSObRF2egpctsXgGHlyKY5KjPOoffbvwdh21rLa5ITBy+emwAm2i6Xww==, + integrity: sha512-ZczOuImSC7pF/uiy7idiaweWrCsBt15DZS/FRXlA62mQiUXcgOV9ZuS/ifT4YI6vngSqdETVSJvjr/WKjQRbew==, } engines: { node: ">=18" } peerDependencies: vue: ^3.3.0 dependencies: - vue: 3.4.18(typescript@5.3.3) + vue: 3.4.21(typescript@5.4.2) dev: false - /@scalar/use-modal@0.2.3(@headlessui/vue@1.7.19)(vue@3.4.18): + /@scalar/use-codemirror@0.9.0(vue@3.4.21)(yjs@13.6.14): resolution: { - integrity: sha512-qCn8rNCTy7jO/7DDalsMM+m1jBfEE/Fnx3Im966uBzCdxdyLbJ8f9S2ZwmW44KP6CXbsMGsuORkvY6Z8joZvMg==, + integrity: sha512-1qtov9NeLcEKEc4XFXBmo4FsZkuDFxr/qlxBkVYsJlpnujeWBZ+MnfUJQUskwD095kza5GQdjPt6oIEA3r7oxg==, } engines: { node: ">=18" } peerDependencies: - "@headlessui/vue": ^1.7.0 vue: ^3.3.0 + yjs: ^13.6.0 dependencies: - "@headlessui/vue": 1.7.19(vue@3.4.18) - vue: 3.4.18(typescript@5.3.3) + "@codemirror/autocomplete": 6.14.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.25.1)(@lezer/common@1.2.1) + "@codemirror/lang-css": 6.2.1(@codemirror/view@6.25.1) + "@codemirror/lang-html": 6.4.8 + "@codemirror/lang-json": 6.0.1 + "@codemirror/lang-yaml": 6.0.0(@codemirror/view@6.25.1) + "@codemirror/language": 6.10.1 + "@codemirror/state": 6.4.1 + "@codemirror/view": 6.25.1 + "@lezer/common": 1.2.1 + "@lezer/highlight": 1.2.0 + "@lezer/lr": 1.4.0 + "@replit/codemirror-css-color-picker": 6.1.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.25.1) + "@uiw/codemirror-themes": 4.21.24(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.25.1) + codemirror: 6.0.1(@lezer/common@1.2.1) + vue: 3.4.21(typescript@5.4.2) + y-codemirror.next: 0.3.2(@codemirror/state@6.4.1)(@codemirror/view@6.25.1)(yjs@13.6.14) + yjs: 13.6.14 dev: false - /@scalar/use-toasts@0.5.13(nanoid@5.0.5)(vue@3.4.18): + /@scalar/use-modal@0.2.9(@headlessui/vue@1.7.19)(vue@3.4.21): resolution: { - integrity: sha512-EiFezCmWchaYfwEDTkSv/r7x6aYOlaFcu+zpTaV/y3ppCIybLvL3WRQzQS0KMaCJJBmQecZbCqMPnRLlacPwYw==, + integrity: sha512-h+Je4bjtF38kQsgfvAZ4TanhJaqHxL3nk7jM8tBYQmKYHCMyFo7oELglu830f0wNrO0TmhDrrQem745Z5uyb2Q==, } engines: { node: ">=18" } peerDependencies: - nanoid: 4 - 5 + "@headlessui/vue": ^1.7.0 vue: ^3.3.0 dependencies: - nanoid: 5.0.5 - vue: 3.4.18(typescript@5.3.3) + "@headlessui/vue": 1.7.19(vue@3.4.21) + vue: 3.4.21(typescript@5.4.2) dev: false - /@scalar/use-tooltip@0.5.8(vue@3.4.18): + /@scalar/use-tooltip@0.5.12(vue@3.4.21): resolution: { - integrity: sha512-9gCa7UGlRQVrKVy3tp5WYn/vCS1Fk0mcPlpkoffPeekS/4A01K3SpddqM76gVUNnOvDOq0EPEbVvUO1deB9oGw==, + integrity: sha512-pDKyGtysxxOcyWE/D5FyRODE1Nqb3LO5cc2X9m7JwjClTqeD3VuKnA3sC4UTcGNKUIDTqVXGyjnHeXoC10t6OA==, } engines: { node: ">=18" } peerDependencies: vue: ^3.3.0 dependencies: - vue: 3.4.18(typescript@5.3.3) + vue: 3.4.21(typescript@5.4.2) dev: false - /@tanstack/virtual-core@3.0.0: + /@tanstack/virtual-core@3.1.3: resolution: { - integrity: sha512-SYXOBTjJb05rXa2vl55TTwO40A6wKu0R5i1qQwhJYNDIqaIGF7D0HsLw+pJAyi2OvntlEIVusx3xtbbgSUi6zg==, + integrity: sha512-Y5B4EYyv1j9V8LzeAoOVeTg0LI7Fo5InYKgAjkY1Pu9GjtUwX/EKxNcU7ng3sKr99WEf+bPTcktAeybyMOYo+g==, } dev: false - /@tanstack/vue-virtual@3.0.4(vue@3.4.18): + /@tanstack/vue-virtual@3.1.3(vue@3.4.21): resolution: { - integrity: sha512-SDk3n+dMZnAXEAx+HZ0wQwBN00Ne7Qk4z29QnawJy6jzOOpoajt7Mm6gIEERin1D4ALxW5WpuDqhlnV2TNFQ+A==, + integrity: sha512-OoRCSgp8Bc85Te3pg4OHFUukbWZeB25/O5rNd7MgMtrYIfJjNOaicZeJcvwqK6lDVTMpzohWUMVK/loqR1H8ig==, } peerDependencies: vue: ^2.7.0 || ^3.0.0 dependencies: - "@tanstack/virtual-core": 3.0.0 - vue: 3.4.18(typescript@5.3.3) + "@tanstack/virtual-core": 3.1.3 + vue: 3.4.21(typescript@5.4.2) dev: false /@tybys/wasm-util@0.8.1: @@ -3088,20 +3062,18 @@ packages: "@types/ms": 0.7.34 dev: false - /@types/har-format@1.2.15: + /@types/estree@1.0.5: resolution: { - integrity: sha512-RpQH4rXLuvTXKR0zqHq3go0RVXYv/YVqv4TnPH95VbwUxZdQlK1EtcMvQvMpDngHbt13Csh9Z4qT9AbkiQH5BA==, + integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==, } dev: false - /@types/hast@2.3.10: + /@types/har-format@1.2.15: resolution: { - integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==, + integrity: sha512-RpQH4rXLuvTXKR0zqHq3go0RVXYv/YVqv4TnPH95VbwUxZdQlK1EtcMvQvMpDngHbt13Csh9Z4qT9AbkiQH5BA==, } - dependencies: - "@types/unist": 2.0.10 dev: false /@types/hast@3.0.4: @@ -3151,7 +3123,7 @@ packages: integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==, } dependencies: - "@types/node": 20.11.17 + "@types/node": 20.11.26 form-data: 4.0.0 dev: false @@ -3161,21 +3133,21 @@ packages: integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==, } dependencies: - "@types/node": 20.11.17 + "@types/node": 20.11.26 dev: true - /@types/node@20.11.17: + /@types/node@20.11.26: resolution: { - integrity: sha512-QmgQZGWu1Yw9TDyAP9ZzpFJKynYNeOvwMJmaxABfieQoVoiVOS6MN1WSpqpRcbeA5+RW82kraAVxCCJg+780Qw==, + integrity: sha512-YwOMmyhNnAWijOBQweOJnQPl068Oqd4K3OFbTc6AHJwzweUwwWG3GIFY74OKks2PJUDkQPeddOQES9mLn1CTEQ==, } dependencies: undici-types: 5.26.5 - /@types/semver@7.5.6: + /@types/semver@7.5.8: resolution: { - integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==, + integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==, } dev: false @@ -3206,111 +3178,111 @@ packages: integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==, } dependencies: - "@types/node": 20.11.17 + "@types/node": 20.11.26 dev: false - /@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.3.3): + /@typescript-eslint/eslint-plugin@7.2.0(@typescript-eslint/parser@7.2.0)(eslint@8.57.0)(typescript@5.4.2): resolution: { - integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==, + integrity: sha512-mdekAHOqS9UjlmyF/LSs6AIEvfceV749GFxoBAjwAv0nkevfKHWQFDMcBZWUiIC5ft6ePWivXoS36aKQ0Cy3sw==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: - "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 + "@typescript-eslint/parser": ^7.0.0 + eslint: ^8.56.0 typescript: "*" peerDependenciesMeta: typescript: optional: true dependencies: "@eslint-community/regexpp": 4.10.0 - "@typescript-eslint/parser": 6.21.0(eslint@8.56.0)(typescript@5.3.3) - "@typescript-eslint/scope-manager": 6.21.0 - "@typescript-eslint/type-utils": 6.21.0(eslint@8.56.0)(typescript@5.3.3) - "@typescript-eslint/utils": 6.21.0(eslint@8.56.0)(typescript@5.3.3) - "@typescript-eslint/visitor-keys": 6.21.0 + "@typescript-eslint/parser": 7.2.0(eslint@8.57.0)(typescript@5.4.2) + "@typescript-eslint/scope-manager": 7.2.0 + "@typescript-eslint/type-utils": 7.2.0(eslint@8.57.0)(typescript@5.4.2) + "@typescript-eslint/utils": 7.2.0(eslint@8.57.0)(typescript@5.4.2) + "@typescript-eslint/visitor-keys": 7.2.0 debug: 4.3.4 - eslint: 8.56.0 + eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 semver: 7.6.0 - ts-api-utils: 1.2.1(typescript@5.3.3) - typescript: 5.3.3 + ts-api-utils: 1.3.0(typescript@5.4.2) + typescript: 5.4.2 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3): + /@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2): resolution: { - integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==, + integrity: sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + eslint: ^8.56.0 typescript: "*" peerDependenciesMeta: typescript: optional: true dependencies: - "@typescript-eslint/scope-manager": 6.21.0 - "@typescript-eslint/types": 6.21.0 - "@typescript-eslint/typescript-estree": 6.21.0(typescript@5.3.3) - "@typescript-eslint/visitor-keys": 6.21.0 + "@typescript-eslint/scope-manager": 7.2.0 + "@typescript-eslint/types": 7.2.0 + "@typescript-eslint/typescript-estree": 7.2.0(typescript@5.4.2) + "@typescript-eslint/visitor-keys": 7.2.0 debug: 4.3.4 - eslint: 8.56.0 - typescript: 5.3.3 + eslint: 8.57.0 + typescript: 5.4.2 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/scope-manager@6.21.0: + /@typescript-eslint/scope-manager@7.2.0: resolution: { - integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==, + integrity: sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==, } engines: { node: ^16.0.0 || >=18.0.0 } dependencies: - "@typescript-eslint/types": 6.21.0 - "@typescript-eslint/visitor-keys": 6.21.0 + "@typescript-eslint/types": 7.2.0 + "@typescript-eslint/visitor-keys": 7.2.0 dev: false - /@typescript-eslint/type-utils@6.21.0(eslint@8.56.0)(typescript@5.3.3): + /@typescript-eslint/type-utils@7.2.0(eslint@8.57.0)(typescript@5.4.2): resolution: { - integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==, + integrity: sha512-xHi51adBHo9O9330J8GQYQwrKBqbIPJGZZVQTHHmy200hvkLZFWJIFtAG/7IYTWUyun6DE6w5InDReePJYJlJA==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + eslint: ^8.56.0 typescript: "*" peerDependenciesMeta: typescript: optional: true dependencies: - "@typescript-eslint/typescript-estree": 6.21.0(typescript@5.3.3) - "@typescript-eslint/utils": 6.21.0(eslint@8.56.0)(typescript@5.3.3) + "@typescript-eslint/typescript-estree": 7.2.0(typescript@5.4.2) + "@typescript-eslint/utils": 7.2.0(eslint@8.57.0)(typescript@5.4.2) debug: 4.3.4 - eslint: 8.56.0 - ts-api-utils: 1.2.1(typescript@5.3.3) - typescript: 5.3.3 + eslint: 8.57.0 + ts-api-utils: 1.3.0(typescript@5.4.2) + typescript: 5.4.2 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/types@6.21.0: + /@typescript-eslint/types@7.2.0: resolution: { - integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==, + integrity: sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==, } engines: { node: ^16.0.0 || >=18.0.0 } dev: false - /@typescript-eslint/typescript-estree@6.21.0(typescript@5.3.3): + /@typescript-eslint/typescript-estree@7.2.0(typescript@5.4.2): resolution: { - integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==, + integrity: sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: @@ -3319,56 +3291,56 @@ packages: typescript: optional: true dependencies: - "@typescript-eslint/types": 6.21.0 - "@typescript-eslint/visitor-keys": 6.21.0 + "@typescript-eslint/types": 7.2.0 + "@typescript-eslint/visitor-keys": 7.2.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 semver: 7.6.0 - ts-api-utils: 1.2.1(typescript@5.3.3) - typescript: 5.3.3 + ts-api-utils: 1.3.0(typescript@5.4.2) + typescript: 5.4.2 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/utils@6.21.0(eslint@8.56.0)(typescript@5.3.3): + /@typescript-eslint/utils@7.2.0(eslint@8.57.0)(typescript@5.4.2): resolution: { - integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==, + integrity: sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA==, } engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + eslint: ^8.56.0 dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.56.0) + "@eslint-community/eslint-utils": 4.4.0(eslint@8.57.0) "@types/json-schema": 7.0.15 - "@types/semver": 7.5.6 - "@typescript-eslint/scope-manager": 6.21.0 - "@typescript-eslint/types": 6.21.0 - "@typescript-eslint/typescript-estree": 6.21.0(typescript@5.3.3) - eslint: 8.56.0 + "@types/semver": 7.5.8 + "@typescript-eslint/scope-manager": 7.2.0 + "@typescript-eslint/types": 7.2.0 + "@typescript-eslint/typescript-estree": 7.2.0(typescript@5.4.2) + eslint: 8.57.0 semver: 7.6.0 transitivePeerDependencies: - supports-color - typescript dev: false - /@typescript-eslint/visitor-keys@6.21.0: + /@typescript-eslint/visitor-keys@7.2.0: resolution: { - integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==, + integrity: sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==, } engines: { node: ^16.0.0 || >=18.0.0 } dependencies: - "@typescript-eslint/types": 6.21.0 + "@typescript-eslint/types": 7.2.0 eslint-visitor-keys: 3.4.3 dev: false - /@uiw/codemirror-themes@4.21.21(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.24.0): + /@uiw/codemirror-themes@4.21.24(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.25.1): resolution: { - integrity: sha512-ljVcMGdaxo75UaH+EqxJ+jLyMVVgeSfW2AKyT1VeLy+4SDpuqNQ7wq5XVxktsG6LH+OvgSFndWXgPANf4+gQcA==, + integrity: sha512-InY24KWP8YArDBACWHKFZ6ZU+WCvRHf3ZB2cCVxMVN35P1ANUmRzpAP2ernZQ5OIriL1/A/kXgD0Zg3Y65PNgg==, } peerDependencies: "@codemirror/language": ">=6.0.0" @@ -3376,8 +3348,8 @@ packages: "@codemirror/view": ">=6.0.0" dependencies: "@codemirror/language": 6.10.1 - "@codemirror/state": 6.4.0 - "@codemirror/view": 6.24.0 + "@codemirror/state": 6.4.1 + "@codemirror/view": 6.25.1 dev: false /@ungap/structured-clone@1.2.0: @@ -3386,33 +3358,33 @@ packages: integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==, } - /@unhead/dom@1.8.10: + /@unhead/dom@1.8.14: resolution: { - integrity: sha512-dBeDbHrBjeU+eVgMsD91TGEazb1dwLrY0x/ve01CldMCmm+WcRu++SUW7s1QX84mzGH2EgFz78o1OPn6jpV3zw==, + integrity: sha512-snh16hAT9spt9JW2ZSD3ar8V7k2EgiVIZ/iuZcbBCr9WfZosRRHROZHqo1l5hOaw8LH0jwbbhihHoYccF+qTJg==, } dependencies: - "@unhead/schema": 1.8.10 - "@unhead/shared": 1.8.10 + "@unhead/schema": 1.8.14 + "@unhead/shared": 1.8.14 dev: false - /@unhead/schema@1.8.10: + /@unhead/schema@1.8.14: resolution: { - integrity: sha512-cy8RGOPkwOVY5EmRoCgGV8AqLjy/226xBVTY54kBct02Om3hBdpB9FZa9frM910pPUXMI8PNmFgABO23O7IdJA==, + integrity: sha512-aM+syNezIXxCPJ99eG1WeONedfGXLAEGua3j+3+4GTjtH2T06E3SH6fcaHdfgjihnvMvo+C/lj2/rI6ShTVGLw==, } dependencies: hookable: 5.5.3 zhead: 2.2.4 dev: false - /@unhead/shared@1.8.10: + /@unhead/shared@1.8.14: resolution: { - integrity: sha512-pEFryAs3EmV+ShDQx2ZBwUnt5l3RrMrXSMZ50oFf+MImKZNARVvD4+3I8fEI9wZh+Zq0JYG3UAfzo51MUP+Juw==, + integrity: sha512-ZuPfT7UKBIhb/E6+aVKPHwmAZUgja3YE4jc2p5K+eNTAGJD3MrNWmjRAA76ZUbKabdiYDr9/6mYWMdMWK0O87Q==, } dependencies: - "@unhead/schema": 1.8.10 + "@unhead/schema": 1.8.14 dev: false /@vcarl/remark-headings@0.1.0: @@ -3425,135 +3397,135 @@ packages: unist-util-visit: 4.1.2 dev: false - /@vue/compiler-core@3.4.18: + /@vue/compiler-core@3.4.21: resolution: { - integrity: sha512-F7YK8lMK0iv6b9/Gdk15A67wM0KKZvxDxed0RR60C1z9tIJTKta+urs4j0RTN5XqHISzI3etN3mX0uHhjmoqjQ==, + integrity: sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==, } dependencies: - "@babel/parser": 7.23.9 - "@vue/shared": 3.4.18 + "@babel/parser": 7.24.0 + "@vue/shared": 3.4.21 entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.0.2 dev: false - /@vue/compiler-dom@3.4.18: + /@vue/compiler-dom@3.4.21: resolution: { - integrity: sha512-24Eb8lcMfInefvQ6YlEVS18w5Q66f4+uXWVA+yb7praKbyjHRNuKVWGuinfSSjM0ZIiPi++QWukhkgznBaqpEA==, + integrity: sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==, } dependencies: - "@vue/compiler-core": 3.4.18 - "@vue/shared": 3.4.18 + "@vue/compiler-core": 3.4.21 + "@vue/shared": 3.4.21 dev: false - /@vue/compiler-sfc@3.4.18: + /@vue/compiler-sfc@3.4.21: resolution: { - integrity: sha512-rG5tqtnzwrVpMqAQ7FHtvHaV70G6LLfJIWLYZB/jZ9m/hrnZmIQh+H3ewnC5onwe/ibljm9+ZupxeElzqCkTAw==, + integrity: sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==, } dependencies: - "@babel/parser": 7.23.9 - "@vue/compiler-core": 3.4.18 - "@vue/compiler-dom": 3.4.18 - "@vue/compiler-ssr": 3.4.18 - "@vue/shared": 3.4.18 + "@babel/parser": 7.24.0 + "@vue/compiler-core": 3.4.21 + "@vue/compiler-dom": 3.4.21 + "@vue/compiler-ssr": 3.4.21 + "@vue/shared": 3.4.21 estree-walker: 2.0.2 - magic-string: 0.30.7 + magic-string: 0.30.8 postcss: 8.4.35 source-map-js: 1.0.2 dev: false - /@vue/compiler-ssr@3.4.18: + /@vue/compiler-ssr@3.4.21: resolution: { - integrity: sha512-hSlv20oUhPxo2UYUacHgGaxtqP0tvFo6ixxxD6JlXIkwzwoZ9eKK6PFQN4hNK/R13JlNyldwWt/fqGBKgWJ6nQ==, + integrity: sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==, } dependencies: - "@vue/compiler-dom": 3.4.18 - "@vue/shared": 3.4.18 + "@vue/compiler-dom": 3.4.21 + "@vue/shared": 3.4.21 dev: false - /@vue/reactivity@3.4.18: + /@vue/reactivity@3.4.21: resolution: { - integrity: sha512-7uda2/I0jpLiRygprDo5Jxs2HJkOVXcOMlyVlY54yRLxoycBpwGJRwJT9EdGB4adnoqJDXVT2BilUAYwI7qvmg==, + integrity: sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==, } dependencies: - "@vue/shared": 3.4.18 + "@vue/shared": 3.4.21 dev: false - /@vue/runtime-core@3.4.18: + /@vue/runtime-core@3.4.21: resolution: { - integrity: sha512-7mU9diCa+4e+8/wZ7Udw5pwTH10A11sZ1nldmHOUKJnzCwvZxfJqAtw31mIf4T5H2FsLCSBQT3xgioA9vIjyDQ==, + integrity: sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==, } dependencies: - "@vue/reactivity": 3.4.18 - "@vue/shared": 3.4.18 + "@vue/reactivity": 3.4.21 + "@vue/shared": 3.4.21 dev: false - /@vue/runtime-dom@3.4.18: + /@vue/runtime-dom@3.4.21: resolution: { - integrity: sha512-2y1Mkzcw1niSfG7z3Qx+2ir9Gb4hdTkZe5p/I8x1aTIKQE0vY0tPAEUPhZm5tx6183gG3D/KwHG728UR0sIufA==, + integrity: sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==, } dependencies: - "@vue/runtime-core": 3.4.18 - "@vue/shared": 3.4.18 + "@vue/runtime-core": 3.4.21 + "@vue/shared": 3.4.21 csstype: 3.1.3 dev: false - /@vue/server-renderer@3.4.18(vue@3.4.18): + /@vue/server-renderer@3.4.21(vue@3.4.21): resolution: { - integrity: sha512-YJd1wa7mzUN3NRqLEsrwEYWyO+PUBSROIGlCc3J/cvn7Zu6CxhNLgXa8Z4zZ5ja5/nviYO79J1InoPeXgwBTZA==, + integrity: sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==, } peerDependencies: - vue: 3.4.18 + vue: 3.4.21 dependencies: - "@vue/compiler-ssr": 3.4.18 - "@vue/shared": 3.4.18 - vue: 3.4.18(typescript@5.3.3) + "@vue/compiler-ssr": 3.4.21 + "@vue/shared": 3.4.21 + vue: 3.4.21(typescript@5.4.2) dev: false - /@vue/shared@3.4.18: + /@vue/shared@3.4.21: resolution: { - integrity: sha512-CxouGFxxaW5r1WbrSmWwck3No58rApXgRSBxrqgnY1K+jk20F6DrXJkHdH9n4HVT+/B6G2CAn213Uq3npWiy8Q==, + integrity: sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==, } dev: false - /@vueuse/core@10.7.2(vue@3.4.18): + /@vueuse/core@10.9.0(vue@3.4.21): resolution: { - integrity: sha512-AOyAL2rK0By62Hm+iqQn6Rbu8bfmbgaIMXcE3TSr7BdQ42wnSFlwIdPjInO62onYsEMK/yDMU8C6oGfDAtZ2qQ==, + integrity: sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==, } dependencies: "@types/web-bluetooth": 0.0.20 - "@vueuse/metadata": 10.7.2 - "@vueuse/shared": 10.7.2(vue@3.4.18) - vue-demi: 0.14.7(vue@3.4.18) + "@vueuse/metadata": 10.9.0 + "@vueuse/shared": 10.9.0(vue@3.4.21) + vue-demi: 0.14.7(vue@3.4.21) transitivePeerDependencies: - "@vue/composition-api" - vue dev: false - /@vueuse/metadata@10.7.2: + /@vueuse/metadata@10.9.0: resolution: { - integrity: sha512-kCWPb4J2KGrwLtn1eJwaJD742u1k5h6v/St5wFe8Quih90+k2a0JP8BS4Zp34XUuJqS2AxFYMb1wjUL8HfhWsQ==, + integrity: sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA==, } dev: false - /@vueuse/shared@10.7.2(vue@3.4.18): + /@vueuse/shared@10.9.0(vue@3.4.21): resolution: { - integrity: sha512-qFbXoxS44pi2FkgFjPvF4h7c9oMDutpyBdcJdMYIMg9XyXli2meFMuaKn+UMgsClo//Th6+beeCgqweT/79BVA==, + integrity: sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw==, } dependencies: - vue-demi: 0.14.7(vue@3.4.18) + vue-demi: 0.14.7(vue@3.4.21) transitivePeerDependencies: - "@vue/composition-api" - vue @@ -3607,6 +3579,20 @@ packages: ajv: 8.12.0 dev: false + /ajv-formats@2.1.1(ajv@8.12.0): + resolution: + { + integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==, + } + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + dependencies: + ajv: 8.12.0 + dev: false + /ajv@6.12.6: resolution: { @@ -3657,15 +3643,6 @@ packages: picomatch: 2.3.1 dev: true - /argparse@1.0.10: - resolution: - { - integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==, - } - dependencies: - sprintf-js: 1.0.3 - dev: false - /argparse@2.0.1: resolution: { @@ -3696,20 +3673,6 @@ packages: } dev: false - /auri@1.0.2: - resolution: - { - integrity: sha512-OC54Bv+hAPvYlo98ZwK3cTo2ijg0CBylaAO5dZ/xZQ7e897k0o4qtxkUPQHruJrFUnL5BebCXz+bUAeXQHp9dg==, - } - hasBin: true - dependencies: - "@actions/core": 1.10.1 - dotenv: 16.4.2 - front-matter: 4.0.2 - nanoid: 4.0.2 - oslo: 1.1.0 - dev: false - /axios@1.6.7: resolution: { @@ -3743,15 +3706,15 @@ packages: } dev: false - /better-sqlite3@9.4.1: + /better-sqlite3@9.4.3: resolution: { - integrity: sha512-QpqiQeMI4WkE+dQ68zTMX5OzlPGc7lXIDP1iKUt4Omt9PdaVgzKYxHIJRIzt1E+RUBQoFmkip/IbvzyrxehAIg==, + integrity: sha512-ud0bTmD9O3uWJGuXDltyj3R47Nz0OHX8iqPOT5PMspGqlu/qQFn+5S2eFBUCrySpavTjFXbi4EgrfVvPAHlImw==, } requiresBuild: true dependencies: bindings: 1.5.0 - prebuild-install: 7.1.1 + prebuild-install: 7.1.2 dev: false /binary-extensions@2.2.0: @@ -3832,13 +3795,6 @@ packages: ieee754: 1.2.1 dev: false - /call-me-maybe@1.0.2: - resolution: - { - integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==, - } - dev: false - /callsites@3.1.0: resolution: { @@ -3946,15 +3902,15 @@ packages: clsx: 2.0.0 dev: false - /cli-color@2.0.3: + /cli-color@2.0.4: resolution: { - integrity: sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==, + integrity: sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==, } engines: { node: ">=0.10" } dependencies: - d: 1.0.1 - es5-ext: 0.10.62 + d: 1.0.2 + es5-ext: 0.10.64 es6-iterator: 2.0.3 memoizee: 0.4.15 timers-ext: 0.1.7 @@ -3974,13 +3930,13 @@ packages: integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==, } dependencies: - "@codemirror/autocomplete": 6.12.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.0)(@codemirror/view@6.24.0)(@lezer/common@1.2.1) + "@codemirror/autocomplete": 6.14.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.25.1)(@lezer/common@1.2.1) "@codemirror/commands": 6.3.3 "@codemirror/language": 6.10.1 "@codemirror/lint": 6.5.0 "@codemirror/search": 6.5.6 - "@codemirror/state": 6.4.0 - "@codemirror/view": 6.24.0 + "@codemirror/state": 6.4.1 + "@codemirror/view": 6.25.1 transitivePeerDependencies: - "@lezer/common" dev: false @@ -4091,7 +4047,7 @@ packages: } dev: false - /cva@1.0.0-beta.1(typescript@5.3.3): + /cva@1.0.0-beta.1(typescript@5.4.2): resolution: { integrity: sha512-gznFqTgERU9q4wg7jfgqtt34+RUt9S5t0xDAAEuDwQEAXEgjdDkKXpLLNjwSxsB4Ln/sqWJEH7yhE8Ny0mxd0w==, @@ -4103,17 +4059,18 @@ packages: optional: true dependencies: clsx: 2.0.0 - typescript: 5.3.3 + typescript: 5.4.2 dev: false - /d@1.0.1: + /d@1.0.2: resolution: { - integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==, + integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==, } + engines: { node: ">=0.12" } dependencies: - es5-ext: 0.10.62 - type: 1.2.0 + es5-ext: 0.10.64 + type: 2.7.2 dev: true /data-uri-to-buffer@2.0.2: @@ -4246,12 +4203,13 @@ packages: dependencies: esutils: 2.0.3 - /dotenv@16.4.2: + /dotenv@16.4.5: resolution: { - integrity: sha512-rZSSFxke7d9nYQ5NeMIwp5PP+f8wXgKNljpOb7KtH6SKW1cEqcXAz9VSJYVLKe7Jhup/gUYOkaeSVyK8GJ+nBg==, + integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==, } engines: { node: ">=12" } + dev: true /dreamopt@0.8.0: resolution: @@ -4288,16 +4246,17 @@ packages: - supports-color dev: true - /drizzle-orm@0.29.3(@cloudflare/workers-types@4.20240208.0)(@libsql/client@0.4.3)(better-sqlite3@9.4.1): + /drizzle-orm@0.30.1(@cloudflare/workers-types@4.20240312.0)(@libsql/client@0.5.6)(better-sqlite3@9.4.3): resolution: { - integrity: sha512-uSE027csliGSGYD0pqtM+SAQATMREb3eSM/U8s6r+Y0RFwTKwftnwwSkqx3oS65UBgqDOM0gMTl5UGNpt6lW0A==, + integrity: sha512-5P6CXl4XyWtDDiYOX/jYOJp1HTUmBlXRAwaq+muUOgaSykMEy5sJesCxceMT0oCGvxeWkKfSXo5owLnfKwCIdw==, } peerDependencies: "@aws-sdk/client-rds-data": ">=3" "@cloudflare/workers-types": ">=3" "@libsql/client": "*" "@neondatabase/serverless": ">=0.1" + "@op-engineering/op-sqlite": ">=2" "@opentelemetry/api": ^1.4.1 "@planetscale/database": ">=1" "@types/better-sqlite3": "*" @@ -4325,6 +4284,8 @@ packages: optional: true "@neondatabase/serverless": optional: true + "@op-engineering/op-sqlite": + optional: true "@opentelemetry/api": optional: true "@planetscale/database": @@ -4362,12 +4323,12 @@ packages: sqlite3: optional: true dependencies: - "@cloudflare/workers-types": 4.20240208.0 - "@libsql/client": 0.4.3 - better-sqlite3: 9.4.1 + "@cloudflare/workers-types": 4.20240312.0 + "@libsql/client": 0.5.6 + better-sqlite3: 9.4.3 dev: false - /drizzle-zod@0.5.1(drizzle-orm@0.29.3)(zod@3.22.4): + /drizzle-zod@0.5.1(drizzle-orm@0.30.1)(zod@3.22.4): resolution: { integrity: sha512-C/8bvzUH/zSnVfwdSibOgFjLhtDtbKYmkbPbUCq46QZyZCH6kODIMSOgZ8R7rVjoI+tCj3k06MRJMDqsIeoS4A==, @@ -4376,7 +4337,7 @@ packages: drizzle-orm: ">=0.23.13" zod: "*" dependencies: - drizzle-orm: 0.29.3(@cloudflare/workers-types@4.20240208.0)(@libsql/client@0.4.3)(better-sqlite3@9.4.1) + drizzle-orm: 0.30.1(@cloudflare/workers-types@4.20240312.0)(@libsql/client@0.5.6)(better-sqlite3@9.4.3) zod: 3.22.4 dev: false @@ -4405,16 +4366,17 @@ packages: engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } dev: true - /es5-ext@0.10.62: + /es5-ext@0.10.64: resolution: { - integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==, + integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==, } engines: { node: ">=0.10" } requiresBuild: true dependencies: es6-iterator: 2.0.3 - es6-symbol: 3.1.3 + es6-symbol: 3.1.4 + esniff: 2.0.1 next-tick: 1.1.0 dev: true @@ -4424,18 +4386,19 @@ packages: integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==, } dependencies: - d: 1.0.1 - es5-ext: 0.10.62 - es6-symbol: 3.1.3 + d: 1.0.2 + es5-ext: 0.10.64 + es6-symbol: 3.1.4 dev: true - /es6-symbol@3.1.3: + /es6-symbol@3.1.4: resolution: { - integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==, + integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==, } + engines: { node: ">=0.12" } dependencies: - d: 1.0.1 + d: 1.0.2 ext: 1.7.0 dev: true @@ -4445,10 +4408,10 @@ packages: integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==, } dependencies: - d: 1.0.1 - es5-ext: 0.10.62 + d: 1.0.2 + es5-ext: 0.10.64 es6-iterator: 2.0.3 - es6-symbol: 3.1.3 + es6-symbol: 3.1.4 dev: true /esbuild-register@3.5.0(esbuild@0.19.12): @@ -4563,7 +4526,6 @@ packages: "@esbuild/win32-arm64": 0.19.12 "@esbuild/win32-ia32": 0.19.12 "@esbuild/win32-x64": 0.19.12 - dev: true /escape-string-regexp@4.0.0: resolution: @@ -4597,18 +4559,18 @@ packages: } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - /eslint@8.56.0: + /eslint@8.57.0: resolution: { - integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==, + integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==, } engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } hasBin: true dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.56.0) + "@eslint-community/eslint-utils": 4.4.0(eslint@8.57.0) "@eslint-community/regexpp": 4.10.0 "@eslint/eslintrc": 2.1.4 - "@eslint/js": 8.56.0 + "@eslint/js": 8.57.0 "@humanwhocodes/config-array": 0.11.14 "@humanwhocodes/module-importer": 1.0.1 "@nodelib/fs.walk": 1.2.8 @@ -4646,6 +4608,19 @@ packages: transitivePeerDependencies: - supports-color + /esniff@2.0.1: + resolution: + { + integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==, + } + engines: { node: ">=0.10" } + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + event-emitter: 0.3.5 + type: 2.7.2 + dev: true + /espree@9.6.1: resolution: { @@ -4657,15 +4632,6 @@ packages: acorn-jsx: 5.3.2(acorn@8.11.3) eslint-visitor-keys: 3.4.3 - /esprima@4.0.1: - resolution: - { - integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==, - } - engines: { node: ">=4" } - hasBin: true - dev: false - /esquery@1.5.0: resolution: { @@ -4718,8 +4684,8 @@ packages: integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==, } dependencies: - d: 1.0.1 - es5-ext: 0.10.62 + d: 1.0.2 + es5-ext: 0.10.64 dev: true /exit-hook@2.2.1: @@ -4802,7 +4768,7 @@ packages: engines: { node: ^12.20 || >= 14.13 } dependencies: node-domexception: 1.0.0 - web-streams-polyfill: 3.3.2 + web-streams-polyfill: 3.3.3 dev: false /fetch-retry@5.0.6: @@ -4854,14 +4820,14 @@ packages: } engines: { node: ^10.12.0 || >=12.0.0 } dependencies: - flatted: 3.2.9 + flatted: 3.3.1 keyv: 4.5.4 rimraf: 3.0.2 - /flatted@3.2.9: + /flatted@3.3.1: resolution: { - integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==, + integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==, } /follow-redirects@1.15.5: @@ -4910,15 +4876,6 @@ packages: fetch-blob: 3.2.0 dev: false - /front-matter@4.0.2: - resolution: - { - integrity: sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==, - } - dependencies: - js-yaml: 3.14.1 - dev: false - /fs-constants@1.0.0: resolution: { @@ -4949,7 +4906,6 @@ packages: engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } os: [darwin] requiresBuild: true - dev: true optional: true /function-bind@1.1.2: @@ -4984,10 +4940,10 @@ packages: source-map: 0.6.1 dev: true - /get-tsconfig@4.7.2: + /get-tsconfig@4.7.3: resolution: { - integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==, + integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==, } dependencies: resolve-pkg-maps: 1.0.0 @@ -5000,13 +4956,6 @@ packages: } dev: false - /github-slugger@1.5.0: - resolution: - { - integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==, - } - dev: false - /github-slugger@2.0.0: resolution: { @@ -5113,10 +5062,10 @@ packages: } engines: { node: ">=8" } - /hasown@2.0.1: + /hasown@2.0.2: resolution: { - integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==, + integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==, } engines: { node: ">= 0.4" } dependencies: @@ -5149,13 +5098,6 @@ packages: web-namespaces: 2.0.1 dev: false - /hast-util-has-property@2.0.1: - resolution: - { - integrity: sha512-X2+RwZIMTMKpXUzlotatPzWj8bspCymtXH3cfG3iQKV+wPF53Vgaqxi/eLqGck0wKq1kS9nvoB1wchbCPEL8sg==, - } - dev: false - /hast-util-has-property@3.0.0: resolution: { @@ -5165,15 +5107,6 @@ packages: "@types/hast": 3.0.4 dev: false - /hast-util-heading-rank@2.1.1: - resolution: - { - integrity: sha512-iAuRp+ESgJoRFJbSyaqsfvJDY6zzmFoEnL1gtz1+U8gKtGGj1p0CVlysuUAUjq95qlZESHINLThwJzNGmgGZxA==, - } - dependencies: - "@types/hast": 2.3.10 - dev: false - /hast-util-is-body-ok-link@3.0.0: resolution: { @@ -5281,15 +5214,6 @@ packages: zwitch: 2.0.4 dev: false - /hast-util-to-string@2.0.0: - resolution: - { - integrity: sha512-02AQ3vLhuH3FisaMM+i/9sm4OXGSq1UhOOCpTLLQtHdL3tZt7qil69r8M8iDkZYyC0HCFylcYoP+8IO7ddta1A==, - } - dependencies: - "@types/hast": 2.3.10 - dev: false - /hast-util-to-text@4.0.0: resolution: { @@ -5339,10 +5263,10 @@ packages: engines: { node: ">=12.0.0" } dev: false - /hono@4.0.1: + /hono@4.1.0: resolution: { - integrity: sha512-S9cREGPJIAK437RhroOf1PGlJPIlt5itl69OmQ6onPLo5pdCbSHGL8v4uAKxrdHjcTyuoyvKPqWm5jv0dGkdFA==, + integrity: sha512-9no6DCHb4ijB1tWdFXU6JnrnFgzwVZ1cnIcS1BjAFnMcjbtBTOMsQrDrPH3GXbkNEEEkj8kWqcYBy8Qc0bBkJQ==, } engines: { node: ">=16.0.0" } dev: false @@ -5380,10 +5304,10 @@ packages: stringify-object: 3.3.0 dev: false - /husky@9.0.10: + /husky@9.0.11: resolution: { - integrity: sha512-TQGNknoiy6bURzIO77pPRu+XHi6zI7T93rX+QnJsoYFf3xdjKOur+IlfqzJGMHIK/wXrLg+GsvMs8Op7vI2jVA==, + integrity: sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==, } engines: { node: ">=18" } hasBin: true @@ -5460,21 +5384,13 @@ packages: binary-extensions: 2.2.0 dev: true - /is-buffer@2.0.5: - resolution: - { - integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==, - } - engines: { node: ">=4" } - dev: false - /is-core-module@2.13.1: resolution: { integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==, } dependencies: - hasown: 2.0.1 + hasown: 2.0.2 dev: true /is-extglob@2.1.1: @@ -5559,31 +5475,11 @@ packages: } dev: false - /javascript-time-ago@2.5.9: - resolution: - { - integrity: sha512-pQ8mNco/9g9TqWXWWjP0EWl6i/lAQScOyEeXy5AB+f7MfLSdgyV9BJhiOD1zrIac/lrxPYOWNbyl/IW8CW5n0A==, - } - dependencies: - relative-time-format: 1.1.6 - dev: false - - /js-base64@3.7.6: - resolution: - { - integrity: sha512-NPrWuHFxFUknr1KqJRDgUQPexQF0uIJWjeT+2KjEePhitQxQEx5EJBG1lVn5/hc8aLycTpXrDOgPQ6Zq+EDiTA==, - } - dev: false - - /js-yaml@3.14.1: + /js-base64@3.7.7: resolution: { - integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==, + integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==, } - hasBin: true - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 dev: false /js-yaml@4.1.0: @@ -5608,7 +5504,7 @@ packages: } hasBin: true dependencies: - cli-color: 2.0.3 + cli-color: 2.0.4 difflib: 0.2.4 dreamopt: 0.8.0 dev: true @@ -5632,6 +5528,14 @@ packages: integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, } + /jsonpointer@5.0.1: + resolution: + { + integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==, + } + engines: { node: ">=0.10.0" } + dev: false + /keyv@4.5.4: resolution: { @@ -5640,6 +5544,14 @@ packages: dependencies: json-buffer: 3.0.1 + /leven@4.0.0: + resolution: + { + integrity: sha512-puehA3YKku3osqPlNuzGDUHq8WpwXupUg1V6NXdV38G+gr+gkBwFC8g1b/+YcIvp8gnqVIus+eJCH/eGsRmJNw==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dev: false + /levn@0.4.1: resolution: { @@ -5650,10 +5562,10 @@ packages: prelude-ls: 1.2.1 type-check: 0.4.0 - /lib0@0.2.88: + /lib0@0.2.91: resolution: { - integrity: sha512-KyroiEvCeZcZEMx5Ys+b4u4eEBbA1ch7XUaBhYpwa/nPMrzTjUhI4RfcytmQfYoTBPcdyx+FX6WFNIoNuJzJfQ==, + integrity: sha512-LRcTp8RmdHexL8olb7qErdROnJ2L6Js5Am99WQo0hiTRDWtk6vyUJJjTB6I/RcW8jwNQshM3NqH598DdhSOajA==, } engines: { node: ">=16" } hasBin: true @@ -5661,27 +5573,25 @@ packages: isomorphic.js: 0.2.5 dev: false - /libsql@0.2.0: + /libsql@0.3.10: resolution: { - integrity: sha512-ELBRqhpJx5Dap0187zKQnntZyk4EjlDHSrjIVL8t+fQ5e8IxbQTeYgZgigMjB1EvrETdkm0Y0VxBGhzPQ+t0Jg==, + integrity: sha512-/8YMTbwWFPmrDWY+YFK3kYqVPFkMgQre0DGmBaOmjogMdSe+7GHm1/q9AZ61AWkEub/vHmi+bA4tqIzVhKnqzg==, } - cpu: [x64, arm64] + cpu: [x64, arm64, wasm32] os: [darwin, linux, win32] - requiresBuild: true dependencies: "@neon-rs/load": 0.0.4 detect-libc: 2.0.2 optionalDependencies: - "@libsql/darwin-arm64": 0.2.0 - "@libsql/darwin-x64": 0.2.0 - "@libsql/linux-arm64-gnu": 0.2.0 - "@libsql/linux-arm64-musl": 0.2.0 - "@libsql/linux-x64-gnu": 0.2.0 - "@libsql/linux-x64-musl": 0.2.0 - "@libsql/win32-x64-msvc": 0.2.0 + "@libsql/darwin-arm64": 0.3.10 + "@libsql/darwin-x64": 0.3.10 + "@libsql/linux-arm64-gnu": 0.3.10 + "@libsql/linux-arm64-musl": 0.3.10 + "@libsql/linux-x64-gnu": 0.3.10 + "@libsql/linux-x64-musl": 0.3.10 + "@libsql/win32-x64-msvc": 0.3.10 dev: false - optional: true /locate-path@6.0.0: resolution: @@ -5705,13 +5615,6 @@ packages: } dev: true - /lodash@4.17.21: - resolution: - { - integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, - } - dev: false - /longest-streak@3.1.0: resolution: { @@ -5745,13 +5648,13 @@ packages: integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==, } dependencies: - es5-ext: 0.10.62 + es5-ext: 0.10.64 dev: true - /lucia@3.0.1: + /lucia@3.1.1: resolution: { - integrity: sha512-srwUkTCGgr6N4mFpaKZVZy5kwiRZdsrbIDv9Wrjar+xyw1MjojYQQ7oRbegjRWOZ3yI8xOOclK3sz/rga2J7/w==, + integrity: sha512-Ygvgnqq7Ha7lYVaZATPwkPD2s2Qlsm71Z2o0byx/abNBfFldCRow5sNii6RqMsuMpK957RAI3Gw4/aWoagkc7A==, } dependencies: oslo: 1.0.1 @@ -5766,10 +5669,10 @@ packages: sourcemap-codec: 1.4.8 dev: true - /magic-string@0.30.7: + /magic-string@0.30.8: resolution: { - integrity: sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==, + integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==, } engines: { node: ">=12" } dependencies: @@ -5994,8 +5897,8 @@ packages: integrity: sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==, } dependencies: - d: 1.0.1 - es5-ext: 0.10.62 + d: 1.0.2 + es5-ext: 0.10.64 es6-weak-map: 2.0.3 event-emitter: 0.3.5 is-promise: 2.2.2 @@ -6389,10 +6292,10 @@ packages: engines: { node: ">=10" } dev: false - /miniflare@3.20240129.1: + /miniflare@3.20240304.1: resolution: { - integrity: sha512-GfqclPxbTnam4S8GKHRkFyr+s+szELK/ORtQ3ZFUiGBO4HNJsaeA6RhBMKBH7iHqn5ng035cyPsLZvH35lwtsA==, + integrity: sha512-U9Br62mV//dI5IiNxGX3qOf6/3tVGsWe94TF+Hy23F5w41AwF+cIgbGW4/JAQQI1rY5uNNmMoS9jqIyoSdw06Q==, } engines: { node: ">=16.13" } hasBin: true @@ -6405,7 +6308,7 @@ packages: glob-to-regexp: 0.4.1 stoppable: 1.1.0 undici: 5.28.3 - workerd: 1.20240129.0 + workerd: 1.20240304.0 ws: 8.16.0 youch: 3.3.3 zod: 3.22.4 @@ -6489,19 +6392,10 @@ packages: engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } hasBin: true - /nanoid@4.0.2: - resolution: - { - integrity: sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==, - } - engines: { node: ^14 || ^16 || >=18 } - hasBin: true - dev: false - - /nanoid@5.0.5: + /nanoid@5.0.6: resolution: { - integrity: sha512-/Veqm+QKsyMY3kqi4faWplnY1u+VuKO3dD2binyPIybP31DRO29bPF+1mszgLnrR2KqSLceFLBNw0zmvDzN1QQ==, + integrity: sha512-rRq0eMHoGZxlvaFOUdK1Ev83Bd1IgzzR+WJ3IbDJ7QOSdAxYjlurSPqFs9s4lJg29RT6nPwizFtJhQS6V5xgiA==, } engines: { node: ^18 || >=20 } hasBin: true @@ -6527,10 +6421,10 @@ packages: } dev: true - /node-abi@3.54.0: + /node-abi@3.56.0: resolution: { - integrity: sha512-p7eGEiQil0YUV3ItH4/tBb781L5impVmmx2E9FRKF7d18XXzp4PGT2tdYMFY6wQqgxD0IwNZOiSJ0/K0fSi/OA==, + integrity: sha512-fZjdhDOeRcaS+rcpve7XuwHBmktS1nS1gzgghwKUQQ8nTy2FdSDr6ZT8k6YhvlJeHmmQMYiT/IH9hfco5zeW2Q==, } engines: { node: ">=10" } dependencies: @@ -6603,13 +6497,13 @@ packages: } dev: false - /openapi3-ts@4.2.1: + /openapi3-ts@4.2.2: resolution: { - integrity: sha512-KL1mKwkZii5ce+tb24KCUmQHyWB/oanG5fzUY35UB+wenWJv4Kr/IWBntpn5R8ODiJcxx13ZDophcpHnLGeIOw==, + integrity: sha512-+9g4actZKeb3czfi9gVQ4Br2Ju3KwhCAQJBNaKgye5KggqcBLIhFHH+nIkcm0BUX00TrAJl6dH4JWgM4G4JWrw==, } dependencies: - yaml: 2.3.4 + yaml: 2.4.1 /optionator@0.9.3: resolution: @@ -6635,15 +6529,14 @@ packages: "@node-rs/bcrypt": 1.9.2 dev: false - /oslo@1.1.0: + /oslo@1.1.3: resolution: { - integrity: sha512-uUvVt1boGt1aO0oMjzyzxIiDGAkfOdh6jPOzfJZBXsOsHuHfvTnrW7ealrBb27sgg5pHnTjmen6xPz4so+gQEQ==, + integrity: sha512-hCz528UlNTiegplcyBg6AvG0HLNrnq06EJMp88Ze308GX1hszkb8u3puhNC4aqLMbYQ0hXpl+wQGnwxMtt5+5w==, } dependencies: "@node-rs/argon2": 1.7.0 "@node-rs/bcrypt": 1.9.0 - auri: 1.0.2 dev: false /p-limit@3.1.0: @@ -6783,10 +6676,10 @@ packages: source-map-js: 1.0.2 dev: false - /prebuild-install@7.1.1: + /prebuild-install@7.1.2: resolution: { - integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==, + integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==, } engines: { node: ">=10" } hasBin: true @@ -6797,7 +6690,7 @@ packages: minimist: 1.2.8 mkdirp-classic: 0.5.3 napi-build-utils: 1.0.2 - node-abi: 3.54.0 + node-abi: 3.56.0 pump: 3.0.0 rc: 1.2.8 simple-get: 4.0.1 @@ -6846,6 +6739,14 @@ packages: } dev: true + /prismjs@1.29.0: + resolution: + { + integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==, + } + engines: { node: ">=6" } + dev: false + /property-information@6.4.1: resolution: { @@ -7002,22 +6903,6 @@ packages: hast-util-sanitize: 5.0.1 dev: false - /rehype-slug-custom-id@1.1.0: - resolution: - { - integrity: sha512-lLdTHGd7u5bOXRDnD78/VHrVZsG63nN6lZUuQgcuupGt1+v+uDW7pCeQS0cvptRcZPYzg8B+0bf8sUiMBKsjZw==, - } - dependencies: - "@types/hast": 2.3.10 - github-slugger: 1.5.0 - hast-util-has-property: 2.0.1 - hast-util-heading-rank: 2.1.1 - hast-util-to-string: 2.0.0 - lodash: 4.17.21 - unified: 10.1.2 - unist-util-visit: 4.1.2 - dev: false - /rehype-stringify@10.0.0: resolution: { @@ -7029,13 +6914,6 @@ packages: unified: 11.0.4 dev: false - /relative-time-format@1.1.6: - resolution: - { - integrity: sha512-aCv3juQw4hT1/P/OrVltKWLlp15eW1GRcwP1XdxHrPdZE9MtgqFpegjnTjLhi2m2WI9MT/hQQtE+tjEWG1hgkQ==, - } - dev: false - /remark-gfm@4.0.0: resolution: { @@ -7052,19 +6930,6 @@ packages: - supports-color dev: false - /remark-html@16.0.1: - resolution: - { - integrity: sha512-B9JqA5i0qZe0Nsf49q3OXyGvyXuZFDzAP2iOFLEumymuYJITVpiH1IgsTEwTpdptDmZlMDMWeDmSawdaJIGCXQ==, - } - dependencies: - "@types/mdast": 4.0.3 - hast-util-sanitize: 5.0.1 - hast-util-to-html: 9.0.0 - mdast-util-to-hast: 13.1.0 - unified: 11.0.4 - dev: false - /remark-parse@11.0.0: resolution: { @@ -7191,6 +7056,32 @@ packages: estree-walker: 0.6.1 dev: true + /rollup@4.13.0: + resolution: + { + integrity: sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==, + } + engines: { node: ">=18.0.0", npm: ">=8.0.0" } + hasBin: true + dependencies: + "@types/estree": 1.0.5 + optionalDependencies: + "@rollup/rollup-android-arm-eabi": 4.13.0 + "@rollup/rollup-android-arm64": 4.13.0 + "@rollup/rollup-darwin-arm64": 4.13.0 + "@rollup/rollup-darwin-x64": 4.13.0 + "@rollup/rollup-linux-arm-gnueabihf": 4.13.0 + "@rollup/rollup-linux-arm64-gnu": 4.13.0 + "@rollup/rollup-linux-arm64-musl": 4.13.0 + "@rollup/rollup-linux-riscv64-gnu": 4.13.0 + "@rollup/rollup-linux-x64-gnu": 4.13.0 + "@rollup/rollup-linux-x64-musl": 4.13.0 + "@rollup/rollup-win32-arm64-msvc": 4.13.0 + "@rollup/rollup-win32-ia32-msvc": 4.13.0 + "@rollup/rollup-win32-x64-msvc": 4.13.0 + fsevents: 2.3.3 + dev: false + /run-parallel@1.2.0: resolution: { @@ -7317,13 +7208,6 @@ packages: } dev: false - /sprintf-js@1.0.3: - resolution: - { - integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==, - } - dev: false - /stacktracey@2.1.8: resolution: { @@ -7397,10 +7281,10 @@ packages: } engines: { node: ">=8" } - /style-mod@4.1.0: + /style-mod@4.1.2: resolution: { - integrity: sha512-Ca5ib8HrFn+f+0n4N4ScTIA9iTOQ7MaGS1ylHcoVqW9J7w2w8PzN6g9gKmTYgGEBH8e120+RCmhpje6jC5uGWA==, + integrity: sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==, } dev: false @@ -7437,7 +7321,7 @@ packages: integrity: sha512-o+2GTLkthfa5YUt4JxPfzMIpQzZ3adD1vLVkvKE1Twl9UAhGsEbIZhHHZVRttyW177S8PDJI3bTQNaebyofK3Q==, } dependencies: - "@babel/runtime": 7.23.9 + "@babel/runtime": 7.24.0 dev: false /tar-fs@2.1.1: @@ -7478,7 +7362,7 @@ packages: integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==, } dependencies: - es5-ext: 0.10.62 + es5-ext: 0.10.64 next-tick: 1.1.0 dev: true @@ -7520,16 +7404,16 @@ packages: } dev: false - /ts-api-utils@1.2.1(typescript@5.3.3): + /ts-api-utils@1.3.0(typescript@5.4.2): resolution: { - integrity: sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==, + integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==, } engines: { node: ">=16" } peerDependencies: typescript: ">=4.2.0" dependencies: - typescript: 5.3.3 + typescript: 5.4.2 dev: false /tslib@2.6.2: @@ -7547,7 +7431,7 @@ packages: hasBin: true dependencies: esbuild: 0.19.12 - get-tsconfig: 4.7.2 + get-tsconfig: 4.7.3 optionalDependencies: fsevents: 2.3.3 dev: true @@ -7561,14 +7445,6 @@ packages: safe-buffer: 5.2.1 dev: false - /tunnel@0.0.6: - resolution: - { - integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==, - } - engines: { node: ">=0.6.11 <=0.7.0 || >=0.7.3" } - dev: false - /type-check@0.4.0: resolution: { @@ -7585,13 +7461,6 @@ packages: } engines: { node: ">=10" } - /type@1.2.0: - resolution: - { - integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==, - } - dev: true - /type@2.7.2: resolution: { @@ -7599,10 +7468,10 @@ packages: } dev: true - /typescript@5.3.3: + /typescript@5.4.2: resolution: { - integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==, + integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==, } engines: { node: ">=14.17" } hasBin: true @@ -7620,35 +7489,21 @@ packages: } engines: { node: ">=14.0" } dependencies: - "@fastify/busboy": 2.1.0 + "@fastify/busboy": 2.1.1 + dev: true - /unhead@1.8.10: + /unhead@1.8.14: resolution: { - integrity: sha512-dth8FvZkLriO5ZWWOBIYBNSfGiwJtKcqpPWpSOk/Z0e2jdlgwoZEWZHFyte0EKvmbZxKcsWNMqIuv7dEmS5yZQ==, + integrity: sha512-yw2E89ORS0pjXk14ZXWfnCEuntGIR+dxQjLWLUBn7p1T7RuGJVdWFy4KJiIjQYzGfhjBexVscSG2s+Bt1BYTWA==, } dependencies: - "@unhead/dom": 1.8.10 - "@unhead/schema": 1.8.10 - "@unhead/shared": 1.8.10 + "@unhead/dom": 1.8.14 + "@unhead/schema": 1.8.14 + "@unhead/shared": 1.8.14 hookable: 5.5.3 dev: false - /unified@10.1.2: - resolution: - { - integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==, - } - dependencies: - "@types/unist": 2.0.10 - bail: 2.0.2 - extend: 3.0.2 - is-buffer: 2.0.5 - is-plain-obj: 4.1.0 - trough: 2.2.0 - vfile: 5.3.7 - dev: false - /unified@11.0.4: resolution: { @@ -7701,15 +7556,6 @@ packages: "@types/unist": 3.0.2 dev: false - /unist-util-stringify-position@3.0.3: - resolution: - { - integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==, - } - dependencies: - "@types/unist": 2.0.10 - dev: false - /unist-util-stringify-position@4.0.0: resolution: { @@ -7794,16 +7640,6 @@ packages: vfile: 6.0.1 dev: false - /vfile-message@3.1.4: - resolution: - { - integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==, - } - dependencies: - "@types/unist": 2.0.10 - unist-util-stringify-position: 3.0.3 - dev: false - /vfile-message@4.0.2: resolution: { @@ -7814,30 +7650,57 @@ packages: unist-util-stringify-position: 4.0.0 dev: false - /vfile@5.3.7: + /vfile@6.0.1: resolution: { - integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==, + integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==, } dependencies: - "@types/unist": 2.0.10 - is-buffer: 2.0.5 - unist-util-stringify-position: 3.0.3 - vfile-message: 3.1.4 + "@types/unist": 3.0.2 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 dev: false - /vfile@6.0.1: + /vite@5.1.6(@types/node@20.11.26): resolution: { - integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==, + integrity: sha512-yYIAZs9nVfRJ/AiOLCA91zzhjsHUgMjB+EigzFb6W2XTLO8JixBCKCjvhKZaye+NKYHCrkv3Oh50dH9EdLU2RA==, } + engines: { node: ^18.0.0 || >=20.0.0 } + hasBin: true + peerDependencies: + "@types/node": ^18.0.0 || >=20.0.0 + less: "*" + lightningcss: ^1.21.0 + sass: "*" + stylus: "*" + sugarss: "*" + terser: ^5.4.0 + peerDependenciesMeta: + "@types/node": + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true dependencies: - "@types/unist": 3.0.2 - unist-util-stringify-position: 4.0.0 - vfile-message: 4.0.2 + "@types/node": 20.11.26 + esbuild: 0.19.12 + postcss: 8.4.35 + rollup: 4.13.0 + optionalDependencies: + fsevents: 2.3.3 dev: false - /vue-demi@0.14.7(vue@3.4.18): + /vue-demi@0.14.7(vue@3.4.21): resolution: { integrity: sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==, @@ -7852,13 +7715,20 @@ packages: "@vue/composition-api": optional: true dependencies: - vue: 3.4.18(typescript@5.3.3) + vue: 3.4.21(typescript@5.4.2) + dev: false + + /vue-sonner@1.1.2: + resolution: + { + integrity: sha512-yg4f5s0a3oiiI7cNvO0Dajux1Y7s04lxww3vnQtnwQawJ3KqaKA9RIRMdI9wGTosRGIOwgYFniFRGl4+IuKPZw==, + } dev: false - /vue@3.4.18(typescript@5.3.3): + /vue@3.4.21(typescript@5.4.2): resolution: { - integrity: sha512-0zLRYamFRe0wF4q2L3O24KQzLyLpL64ye1RUToOgOxuWZsb/FhaNRdGmeozdtVYLz6tl94OXLaK7/WQIrVCw1A==, + integrity: sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==, } peerDependencies: typescript: "*" @@ -7866,12 +7736,12 @@ packages: typescript: optional: true dependencies: - "@vue/compiler-dom": 3.4.18 - "@vue/compiler-sfc": 3.4.18 - "@vue/runtime-dom": 3.4.18 - "@vue/server-renderer": 3.4.18(vue@3.4.18) - "@vue/shared": 3.4.18 - typescript: 5.3.3 + "@vue/compiler-dom": 3.4.21 + "@vue/compiler-sfc": 3.4.21 + "@vue/runtime-dom": 3.4.21 + "@vue/server-renderer": 3.4.21(vue@3.4.21) + "@vue/shared": 3.4.21 + typescript: 5.4.2 dev: false /w3c-keyname@2.2.8: @@ -7888,10 +7758,10 @@ packages: } dev: false - /web-streams-polyfill@3.3.2: + /web-streams-polyfill@3.3.3: resolution: { - integrity: sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ==, + integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==, } engines: { node: ">= 8" } dev: false @@ -7938,26 +7808,26 @@ packages: } dev: true - /workerd@1.20240129.0: + /workerd@1.20240304.0: resolution: { - integrity: sha512-t4pnsmjjk/u+GdVDgH2M1AFmJaBUABshYK/vT/HNrAXsHSwN6VR8Yqw0JQ845OokO34VLkuUtYQYyxHHKpdtsw==, + integrity: sha512-/tYxdypPh9NKQje9r7bgBB73vAQfCQZbEPjNlxE/ml7jNKMHnRZv/D+By4xO0IPAifa37D0sJFokvYOahz1Lqw==, } engines: { node: ">=16" } hasBin: true requiresBuild: true optionalDependencies: - "@cloudflare/workerd-darwin-64": 1.20240129.0 - "@cloudflare/workerd-darwin-arm64": 1.20240129.0 - "@cloudflare/workerd-linux-64": 1.20240129.0 - "@cloudflare/workerd-linux-arm64": 1.20240129.0 - "@cloudflare/workerd-windows-64": 1.20240129.0 + "@cloudflare/workerd-darwin-64": 1.20240304.0 + "@cloudflare/workerd-darwin-arm64": 1.20240304.0 + "@cloudflare/workerd-linux-64": 1.20240304.0 + "@cloudflare/workerd-linux-arm64": 1.20240304.0 + "@cloudflare/workerd-windows-64": 1.20240304.0 dev: true - /wrangler@3.28.1(@cloudflare/workers-types@4.20240208.0): + /wrangler@3.33.0(@cloudflare/workers-types@4.20240312.0): resolution: { - integrity: sha512-3O8vCzd7IC71Kciu/+oDVO0VZ83ujlUuKwmCkv6/zzt4WAoYu0vk7PyEo4WvlsSbZL8aHuv3bS917rd6TM1/9Q==, + integrity: sha512-1A8frPJSUQjkWAN4XhbykpEtqmfDYdTWPKlc4rTchNrERLwqHF87aCYblP4m5Wm43w4eVL+H4hGUgE2TySk9MA==, } engines: { node: ">=16.17.0" } hasBin: true @@ -7967,14 +7837,14 @@ packages: "@cloudflare/workers-types": optional: true dependencies: - "@cloudflare/kv-asset-handler": 0.2.0 - "@cloudflare/workers-types": 4.20240208.0 + "@cloudflare/kv-asset-handler": 0.3.1 + "@cloudflare/workers-types": 4.20240312.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.6.0 esbuild: 0.17.19 - miniflare: 3.20240129.1 + miniflare: 3.20240304.1 nanoid: 3.3.7 path-to-regexp: 6.2.1 resolve: 1.22.8 @@ -8018,7 +7888,7 @@ packages: } dev: true - /y-codemirror.next@0.3.2(@codemirror/state@6.4.0)(@codemirror/view@6.24.0)(yjs@13.6.12): + /y-codemirror.next@0.3.2(@codemirror/state@6.4.1)(@codemirror/view@6.25.1)(yjs@13.6.14): resolution: { integrity: sha512-3ksMXoietzNkrgluG9ut+5q4PNHCS6sQ+mHd44hNX1s7TBe4iDgOOIswfY3oLsdamZLAUPr+TnRdYgYuNDs7Qg==, @@ -8028,10 +7898,10 @@ packages: "@codemirror/view": ^6.0.0 yjs: ^13.5.6 dependencies: - "@codemirror/state": 6.4.0 - "@codemirror/view": 6.24.0 - lib0: 0.2.88 - yjs: 13.6.12 + "@codemirror/state": 6.4.1 + "@codemirror/view": 6.25.1 + lib0: 0.2.91 + yjs: 13.6.14 dev: false /yallist@4.0.0: @@ -8040,21 +7910,22 @@ packages: integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, } - /yaml@2.3.4: + /yaml@2.4.1: resolution: { - integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==, + integrity: sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==, } engines: { node: ">= 14" } + hasBin: true - /yjs@13.6.12: + /yjs@13.6.14: resolution: { - integrity: sha512-KOT8ILoyVH2f/PxPadeu5kVVS055D1r3x1iFfJVJzFdnN98pVGM8H07NcKsO+fG3F7/0tf30Vnokf5YIqhU/iw==, + integrity: sha512-D+7KcUr0j+vBCUSKXXEWfA+bG4UQBviAwP3gYBhkstkgwy5+8diOPMx0iqLIOxNo/HxaREUimZRxqHGAHCL2BQ==, } engines: { node: ">=16.0.0", npm: ">=8.0.0" } dependencies: - lib0: 0.2.88 + lib0: 0.2.91 dev: false /yocto-queue@0.1.0: diff --git a/src/v2/lib/managers/user/user-follow-manager.ts b/src/v2/lib/managers/user/user-follow-manager.ts deleted file mode 100644 index f5e8f83..0000000 --- a/src/v2/lib/managers/user/user-follow-manager.ts +++ /dev/null @@ -1,200 +0,0 @@ -import { DrizzleInstance } from "@/v2/db/turso" -import { and, eq, sql } from "drizzle-orm" -import { userFollowing } from "@/v2/db/schema" -import type { NewUserFollowing, UserFollowing } from "@/v2/db/schema" - -/** - * Manages user follow and unfollow operations. - */ -export class UserFollowManager { - constructor(private drizzle: DrizzleInstance) {} - - /** - * Follows a user by creating a following relationship between two users. - * - * @param followerId - The ID of the user who is following. - * @param followingId - The ID of the user being followed. - * @returns The user follow object representing the follow relationship. - */ - public async followUser( - followerId: string, - followingId: string - ): Promise { - try { - const [follow] = await this.drizzle - .insert(userFollowing) - .values({ - followerId, - followingId, - createdAt: new Date().toISOString(), - }) - .returning() - - return follow - } catch (e) { - console.error( - `Error following user ${followingId} from user ${followerId}`, - e - ) - throw new Error( - `Error following user ${followingId} from user ${followerId}` - ) - } - } - - /** - * Unfollows a user by removing the following relationship between two users. - * - * @param followerId - The ID of the user who is unfollowing. - * @param followingId - The ID of the user being unfollowed. - * @returns The user networking object representing the removed follow relationship. - */ - public async unfollowUser( - followerId: string, - followingId: string - ): Promise { - try { - const [unfollow] = await this.drizzle - .delete(userFollowing) - .where( - and( - eq(userFollowing.followerId, followerId), - eq(userFollowing.followingId, followingId) - ) - ) - .returning() - - return unfollow - } catch (e) { - console.error( - `Error unfollowing user ${followingId} from user ${followerId}`, - e - ) - throw new Error( - `Error unfollowing user ${followingId} from user ${followerId}` - ) - } - } - - public async checkFollowStatus( - followerId: string, - followingId: string - ): Promise { - try { - const [follow] = await this.drizzle - .select({ id: userFollowing.followerId }) - .from(userFollowing) - .where( - and( - eq(userFollowing.followerId, followerId), - eq(userFollowing.followingId, followingId) - ) - ) - .limit(1) - - return follow ? true : false - } catch (e) { - console.error( - `Error checking follow status for user ${followingId} from user ${followerId}`, - e - ) - throw new Error( - `Error checking follow status for user ${followingId} from user ${followerId}` - ) - } - } - - public async getUserFollowers(userId: string, offset: number = 0) { - try { - return await this.drizzle.query.userFollowing.findMany({ - where: (userFollowing, { eq }) => - eq(userFollowing.followingId, userId), - with: { - follower: { - columns: { - id: true, - avatarUrl: true, - username: true, - isSupporter: true, - verified: true, - displayName: true, - }, - }, - }, - limit: 100, - offset: offset, - }) - } catch (e) { - console.error( - `Error getting followers for user ${userId} with offset ${offset}`, - e - ) - throw new Error( - `Error getting followers for user ${userId} with offset ${offset}` - ) - } - } - - public async getUserFollowersCount(userId: string) { - try { - return await this.drizzle - .select({ - value: sql`count(${userFollowing.followerId})`.mapWith( - Number - ), - }) - .from(userFollowing) - .where(eq(userFollowing.followingId, userId)) - } catch (e) { - console.error(`Error getting followers count for user ${userId}`, e) - throw new Error(`Error getting followers count for user ${userId}`) - } - } - - public async getUserFollowingCount(userId: string) { - try { - return await this.drizzle - .select({ - value: sql`count(${userFollowing.followingId})`.mapWith( - Number - ), - }) - .from(userFollowing) - .where(eq(userFollowing.followerId, userId)) - } catch (e) { - console.error(`Error getting following count for user ${userId}`, e) - throw new Error(`Error getting following count for user ${userId}`) - } - } - - public async getUserFollowing(userId: string, offset: number = 0) { - try { - return await this.drizzle.query.userFollowing.findMany({ - where: (userFollowing, { eq }) => - eq(userFollowing.followerId, userId), - with: { - following: { - columns: { - id: true, - avatarUrl: true, - username: true, - isSupporter: true, - verified: true, - displayName: true, - }, - }, - }, - limit: 100, - offset: offset, - }) - } catch (e) { - console.error( - `Error getting following for user ${userId} with offset ${offset}`, - e - ) - throw new Error( - `Error getting following for user ${userId} with offset ${offset}` - ) - } - } -} diff --git a/src/v2/lib/managers/user/user-profile-manager.ts b/src/v2/lib/managers/user/user-profile-manager.ts deleted file mode 100644 index 4ee4442..0000000 --- a/src/v2/lib/managers/user/user-profile-manager.ts +++ /dev/null @@ -1,164 +0,0 @@ -import { DrizzleInstance } from "@/v2/db/turso" -import { authUser } from "@/v2/db/schema" -import type { User } from "@/v2/db/schema" -import { R2Bucket } from "@cloudflare/workers-types" -import { eq } from "drizzle-orm" -import { z } from "zod" - -/** - * Represents the schema for user attributes. - */ -const UserAttributesSchema = z - .object({ - displayName: z.string(), - username: z.string(), - bio: z.string(), - pronouns: z.string(), - }) - .partial() - -/** - * Manages user profiles and related operations. - */ -export class UserProfileManager { - constructor(private drizzle: DrizzleInstance) {} - - /** - * Updates the attributes of a user's profile. - * - * @param userId - The ID of the user to update. - * @param attributes - The new user attributes. - * @returns The updated user object. - * @throws Error if the provided attributes are invalid. - */ - public async updateUserAttributes( - userId: string, - attributes: z.infer - ): Promise { - try { - const validAttributes = UserAttributesSchema.safeParse(attributes) - if (!validAttributes.success) - throw new Error(`Invalid attributes provided`) - - const [user] = await this.drizzle - .update(authUser) - .set(attributes) - .where(eq(authUser.id, userId)) - .returning() - - return user - } catch (e) { - console.error(`Error updating user attributes`, e) - throw new Error(`Error updating user attributes`) - } - } - - /** - * Updates the user's profile picture. - * - * @param userId - The ID of the user to update. - * @param bucket - The R2Bucket where the picture will be stored. - * @param file - The new profile picture file. - * @returns The URL of the updated profile picture. - */ - public async updateProfilePicture( - userId: string, - bucket: R2Bucket, - file: File - ): Promise { - try { - const { key } = await bucket.put(`/avatars/${userId}.png`, file) - - const [user] = await this.drizzle - .update(authUser) - .set({ avatarUrl: key }) - .where(eq(authUser.id, userId)) - .returning() - - return user.avatarUrl - } catch (e) { - console.error(`Error updating profile picture`, e) - throw new Error(`Error updating profile picture`) - } - } - - /** - * Updates the user's profile banner image. - * - * @param userId - The ID of the user to update. - * @param bucket - The R2Bucket where the banner image will be stored. - * @param file - The new banner image file. - * @returns The URL of the updated banner image. - */ - public async updateBanner( - userId: string, - bucket: R2Bucket, - file: File - ): Promise { - try { - const { key } = await bucket.put(`/banners/${userId}.png`, file) - - const [user] = await this.drizzle - .update(authUser) - .set({ bannerUrl: key }) - .where(eq(authUser.id, userId)) - .returning() - - return user.bannerUrl - } catch (e) { - console.error(`Error updating banner`, e) - throw new Error(`Error updating banner`) - } - } - - /** - * Resets the user's profile picture to null. - * - * @param userId - The ID of the user to update. - * @param bucket - The R2Bucket where the picture is stored. - * @returns The URL of the reset profile picture (null). - */ - public async resetProfilePicture( - userId: string, - bucket: R2Bucket - ): Promise { - try { - await bucket.delete(`/avatars/${userId}.png`) - - const [user] = await this.drizzle - .update(authUser) - .set({ avatarUrl: null }) - .where(eq(authUser.id, userId)) - .returning() - - return user.avatarUrl - } catch (e) { - console.error(`Error resetting profile picture`, e) - throw new Error(`Error resetting profile picture`) - } - } - - /** - * Resets the user's profile banner image to null. - * - * @param userId - The ID of the user to update. - * @param bucket - The R2Bucket where the banner image is stored. - * @returns The URL of the reset banner image (null). - */ - public async resetBanner(userId: string, bucket: R2Bucket) { - try { - await bucket.delete(`/banners/${userId}.png`) - - const [user] = await this.drizzle - .update(authUser) - .set({ bannerUrl: null }) - .where(eq(authUser.id, userId)) - .returning() - - return user.bannerUrl - } catch (e) { - console.error(`Error resetting banner`, e) - throw new Error(`Error resetting banner`) - } - } -} diff --git a/src/v2/lib/managers/user/user-search-manager.ts b/src/v2/lib/managers/user/user-search-manager.ts deleted file mode 100644 index 30b0df1..0000000 --- a/src/v2/lib/managers/user/user-search-manager.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { DrizzleInstance } from "@/v2/db/turso" -import { authUser } from "@/v2/db/schema" -import { eq, like, or } from "drizzle-orm" - -/** - * Manages user search and retrieval operations. - */ -export class UserSearchManager { - constructor(private drizzle: DrizzleInstance) {} - - /** - * Retrieves a user by their user ID. - * - * @param userId - The ID of the user to retrieve. - * @returns The user object or undefined if not found. - */ - public async getUserById(userId: string) { - try { - const [user] = await this.drizzle - .select({ - id: authUser.id, - avatarUrl: authUser.avatarUrl, - displayName: authUser.displayName, - username: authUser.username, - usernameColour: authUser.usernameColour, - pronouns: authUser.pronouns, - verified: authUser.verified, - bio: authUser.bio, - dateJoined: authUser.dateJoined, - isSupporter: authUser.isSupporter, - role: authUser.role, - }) - .from(authUser) - .where(eq(authUser.id, userId)) - - return user ?? null - } catch (e) { - console.error(`Error getting user by ID ${userId}`, e) - throw new Error(`Error getting user by ID ${userId}`) - } - } - - // public async getUserByEmail(email: string) { - // try { - // const [user] = await this.drizzle - // .select() - // .from(authUser) - // .where(eq(authUser.email, email)) - - // return user ?? null - // } catch (e) { - // console.error(`Error getting user by email ${email}`, e) - // throw new Error(`Error getting user by email ${email}`) - // } - // } - - /** - * Retrieves a user by their username. - * - * @param username - The username of the user to retrieve. - * @returns The user object or undefined if not found. - */ - public async getUserByUsername(username: string) { - try { - const [user] = await this.drizzle - .select({ - id: authUser.id, - avatarUrl: authUser.avatarUrl, - displayName: authUser.displayName, - username: authUser.username, - usernameColour: authUser.usernameColour, - pronouns: authUser.pronouns, - verified: authUser.verified, - bio: authUser.bio, - dateJoined: authUser.dateJoined, - isSupporter: authUser.isSupporter, - role: authUser.role, - }) - .from(authUser) - .where(eq(authUser.username, username)) - - return user ?? null - } catch (e) { - console.error(`Error getting user by username ${username}`, e) - throw new Error(`Error getting user by username ${username}`) - } - } - - /** - * Retrieves users by partially matching their usernames. - * - * @param username - The partial username to search for. - * @returns An array of user objects matching the search criteria, limited to 25 results. - */ - public async getUsersByUsername(username: string) { - try { - const users = await this.drizzle - .select({ - id: authUser.id, - avatarUrl: authUser.avatarUrl, - displayName: authUser.displayName, - username: authUser.username, - usernameColour: authUser.usernameColour, - pronouns: authUser.pronouns, - verified: authUser.verified, - bio: authUser.bio, - dateJoined: authUser.dateJoined, - isSupporter: authUser.isSupporter, - role: authUser.role, - }) - .from(authUser) - .where(or(like(authUser.username, `%${username}%`))) - .limit(25) - - return users ?? null - } catch (e) { - console.error(`Error getting users by username ${username}`, e) - throw new Error(`Error getting users by username ${username}`) - } - } -} diff --git a/src/v2/routes/user/follows/follow/id/[id]/route.ts b/src/v2/routes/user/follows/follow/id/[id]/route.ts index bdaca9c..83b4b28 100644 --- a/src/v2/routes/user/follows/follow/id/[id]/route.ts +++ b/src/v2/routes/user/follows/follow/id/[id]/route.ts @@ -1,8 +1,9 @@ import { OpenAPIHono } from "@hono/zod-openapi" import { followUserByIdRoute } from "./openapi" import { getConnection } from "@/v2/db/turso" -import { UserFollowManager } from "@/v2/lib/managers/user/user-follow-manager" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +import { and, eq } from "drizzle-orm" +import { userFollowing } from "@/v2/db/schema" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() @@ -33,13 +34,16 @@ handler.openapi(followUserByIdRoute, async (ctx) => { 400 ) } - - const userFollowManager = new UserFollowManager(drizzle) - - const followStatus = await userFollowManager.checkFollowStatus( - user.id, - userId - ) + const [followStatus] = await drizzle + .select({ id: userFollowing.followerId }) + .from(userFollowing) + .where( + and( + eq(userFollowing.followerId, user.id), + eq(userFollowing.followingId, userId) + ) + ) + .limit(1) if (followStatus) { return ctx.json( @@ -52,12 +56,16 @@ handler.openapi(followUserByIdRoute, async (ctx) => { } try { - await userFollowManager.followUser(user.id, userId) + await drizzle.insert(userFollowing).values({ + followerId: user.id, + followingId: userId, + createdAt: new Date().toISOString(), + }) } catch (e) { return ctx.json( { success: false, - message: "Failed to follow user, does the user exist?", + message: "Failed to follow user.", }, 500 ) diff --git a/src/v2/routes/user/follows/followers/id/[id]/route.ts b/src/v2/routes/user/follows/followers/id/[id]/route.ts index 79b9eca..4973513 100644 --- a/src/v2/routes/user/follows/followers/id/[id]/route.ts +++ b/src/v2/routes/user/follows/followers/id/[id]/route.ts @@ -1,7 +1,6 @@ import { OpenAPIHono } from "@hono/zod-openapi" import { viewUserFollowsByIdRoute } from "./openapi" import { getConnection } from "@/v2/db/turso" -import { UserFollowManager } from "@/v2/lib/managers/user/user-follow-manager" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() @@ -11,12 +10,23 @@ handler.openapi(viewUserFollowsByIdRoute, async (ctx) => { const { drizzle } = await getConnection(ctx.env) - const userFollowManager = new UserFollowManager(drizzle) - - const followers = await userFollowManager.getUserFollowers( - id, - parseInt(offset) - ) + const followers = await drizzle.query.userFollowing.findMany({ + where: (userFollowing, { eq }) => eq(userFollowing.followingId, id), + with: { + follower: { + columns: { + id: true, + avatarUrl: true, + username: true, + isSupporter: true, + verified: true, + displayName: true, + }, + }, + }, + limit: 100, + offset: offset ? parseInt(offset) : 0, + }) return ctx.json( { diff --git a/src/v2/routes/user/follows/following/id/[id]/route.ts b/src/v2/routes/user/follows/following/id/[id]/route.ts index abf197d..382d789 100644 --- a/src/v2/routes/user/follows/following/id/[id]/route.ts +++ b/src/v2/routes/user/follows/following/id/[id]/route.ts @@ -1,7 +1,6 @@ import { OpenAPIHono } from "@hono/zod-openapi" import { viewUserfollowingbyIdRoute } from "./openapi" import { getConnection } from "@/v2/db/turso" -import { UserFollowManager } from "@/v2/lib/managers/user/user-follow-manager" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() @@ -11,12 +10,23 @@ handler.openapi(viewUserfollowingbyIdRoute, async (ctx) => { const { drizzle } = await getConnection(ctx.env) - const userFollowManager = new UserFollowManager(drizzle) - - const following = await userFollowManager.getUserFollowing( - id, - parseInt(offset) - ) + const following = await drizzle.query.userFollowing.findMany({ + where: (userFollowing, { eq }) => eq(userFollowing.followerId, id), + with: { + following: { + columns: { + id: true, + avatarUrl: true, + username: true, + isSupporter: true, + verified: true, + displayName: true, + }, + }, + }, + limit: 100, + offset: offset ? parseInt(offset) : 0, + }) return ctx.json( { diff --git a/src/v2/routes/user/follows/unfollow/id/[id]/route.ts b/src/v2/routes/user/follows/unfollow/id/[id]/route.ts index 6f03b99..43ccc82 100644 --- a/src/v2/routes/user/follows/unfollow/id/[id]/route.ts +++ b/src/v2/routes/user/follows/unfollow/id/[id]/route.ts @@ -1,8 +1,9 @@ import { OpenAPIHono } from "@hono/zod-openapi" import { unFollowUserByIdRoute } from "./openapi" import { getConnection } from "@/v2/db/turso" -import { UserFollowManager } from "@/v2/lib/managers/user/user-follow-manager" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +import { userFollowing } from "@/v2/db/schema" +import { and, eq } from "drizzle-orm" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() @@ -34,12 +35,16 @@ handler.openapi(unFollowUserByIdRoute, async (ctx) => { ) } - const userFollowManager = new UserFollowManager(drizzle) - - const followStatus = await userFollowManager.checkFollowStatus( - user.id, - userId - ) + const [followStatus] = await drizzle + .select({ id: userFollowing.followerId }) + .from(userFollowing) + .where( + and( + eq(userFollowing.followerId, user.id), + eq(userFollowing.followingId, userId) + ) + ) + .limit(1) if (!followStatus) { return ctx.json( @@ -52,7 +57,14 @@ handler.openapi(unFollowUserByIdRoute, async (ctx) => { } try { - await userFollowManager.unfollowUser(user.id, userId) + await drizzle + .delete(userFollowing) + .where( + and( + eq(userFollowing.followerId, user.id), + eq(userFollowing.followingId, userId) + ) + ) } catch (e) { return ctx.json( { diff --git a/src/v2/routes/user/get/id/[id]/route.ts b/src/v2/routes/user/get/id/[id]/route.ts index d1fcf01..bd7913a 100644 --- a/src/v2/routes/user/get/id/[id]/route.ts +++ b/src/v2/routes/user/get/id/[id]/route.ts @@ -1,7 +1,8 @@ import { OpenAPIHono } from "@hono/zod-openapi" import { getUserByIdRoute } from "./openapi" -import { UserSearchManager } from "@/v2/lib/managers/user/user-search-manager" import { getConnection } from "@/v2/db/turso" +import { eq } from "drizzle-orm" +import { authUser } from "@/v2/db/schema" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() @@ -9,8 +10,23 @@ handler.openapi(getUserByIdRoute, async (ctx) => { const userId = ctx.req.valid("param").id const { drizzle } = await getConnection(ctx.env) - const search = new UserSearchManager(drizzle) - const user = await search.getUserById(userId) + + const [user] = await drizzle + .select({ + id: authUser.id, + avatarUrl: authUser.avatarUrl, + displayName: authUser.displayName, + username: authUser.username, + usernameColour: authUser.usernameColour, + pronouns: authUser.pronouns, + verified: authUser.verified, + bio: authUser.bio, + dateJoined: authUser.dateJoined, + isSupporter: authUser.isSupporter, + role: authUser.role, + }) + .from(authUser) + .where(eq(authUser.id, userId)) return ctx.json( { diff --git a/src/v2/routes/user/get/username/[username]/route.ts b/src/v2/routes/user/get/username/[username]/route.ts index 0e4132d..775def3 100644 --- a/src/v2/routes/user/get/username/[username]/route.ts +++ b/src/v2/routes/user/get/username/[username]/route.ts @@ -1,16 +1,32 @@ import { OpenAPIHono } from "@hono/zod-openapi" import { getUserByNameRoute } from "./openapi" -import { UserSearchManager } from "@/v2/lib/managers/user/user-search-manager" +import { authUser } from "@/v2/db/schema" +import { eq } from "drizzle-orm" import { getConnection } from "@/v2/db/turso" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.openapi(getUserByNameRoute, async (ctx) => { - const userId = ctx.req.valid("param").username + const username = ctx.req.valid("param").username const { drizzle } = await getConnection(ctx.env) - const search = new UserSearchManager(drizzle) - const user = await search.getUserByUsername(userId) + + const [user] = await drizzle + .select({ + id: authUser.id, + avatarUrl: authUser.avatarUrl, + displayName: authUser.displayName, + username: authUser.username, + usernameColour: authUser.usernameColour, + pronouns: authUser.pronouns, + verified: authUser.verified, + bio: authUser.bio, + dateJoined: authUser.dateJoined, + isSupporter: authUser.isSupporter, + role: authUser.role, + }) + .from(authUser) + .where(eq(authUser.username, username)) return ctx.json( { diff --git a/src/v2/routes/user/search/username/[username]/route.ts b/src/v2/routes/user/search/username/[username]/route.ts index a6fd2bf..4d792a9 100644 --- a/src/v2/routes/user/search/username/[username]/route.ts +++ b/src/v2/routes/user/search/username/[username]/route.ts @@ -1,6 +1,7 @@ import { OpenAPIHono } from "@hono/zod-openapi" import { searchUsersByUsernameRoute } from "./openapi" -import { UserSearchManager } from "@/v2/lib/managers/user/user-search-manager" +import { authUser } from "@/v2/db/schema" +import { or, like } from "drizzle-orm" import { getConnection } from "@/v2/db/turso" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() @@ -9,8 +10,24 @@ handler.openapi(searchUsersByUsernameRoute, async (ctx) => { const userQuery = ctx.req.valid("param").username const { drizzle } = await getConnection(ctx.env) - const search = new UserSearchManager(drizzle) - const users = await search.getUsersByUsername(userQuery) + + const users = await drizzle + .select({ + id: authUser.id, + avatarUrl: authUser.avatarUrl, + displayName: authUser.displayName, + username: authUser.username, + usernameColour: authUser.usernameColour, + pronouns: authUser.pronouns, + verified: authUser.verified, + bio: authUser.bio, + dateJoined: authUser.dateJoined, + isSupporter: authUser.isSupporter, + role: authUser.role, + }) + .from(authUser) + .where(or(like(authUser.username, `%${userQuery}%`))) + .limit(25) return ctx.json({ success: true, From c965db7d081c6952e2ebff4fddd0f9bcec7146c3 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Tue, 12 Mar 2024 22:00:43 +0000 Subject: [PATCH 256/318] rm manager for some asset routes --- src/v2/routes/asset/delete/id/[id]/route.ts | 27 ++++----- src/v2/routes/asset/get/id/[id]/route.ts | 56 ++++++++++++------ src/v2/routes/asset/modify/id/[id]/route.ts | 61 ++++++++++++++++---- src/v2/routes/asset/modify/id/[id]/schema.ts | 2 - src/v2/routes/asset/search/all/route.ts | 50 +++++++++++++++- src/v2/routes/asset/upload/route.ts | 55 +++++++++++++----- 6 files changed, 186 insertions(+), 65 deletions(-) diff --git a/src/v2/routes/asset/delete/id/[id]/route.ts b/src/v2/routes/asset/delete/id/[id]/route.ts index b741baf..3d695ab 100644 --- a/src/v2/routes/asset/delete/id/[id]/route.ts +++ b/src/v2/routes/asset/delete/id/[id]/route.ts @@ -1,28 +1,23 @@ import { OpenAPIHono } from "@hono/zod-openapi" import { deleteAssetByIdRoute } from "./openapi" import { getConnection } from "@/v2/db/turso" -import { AssetManager } from "@/v2/lib/managers/asset/asset-manager" +import { eq } from "drizzle-orm" +import { asset } from "@/v2/db/schema" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.openapi(deleteAssetByIdRoute, async (ctx) => { const assetId = ctx.req.valid("param").id - if (isNaN(parseInt(assetId))) { - return ctx.json( - { - success: false, - message: "Invalid asset ID", - }, - 400 - ) - } - const { drizzle } = await getConnection(ctx.env) - const assetManager = new AssetManager(drizzle) - const asset = await assetManager.getAssetById(parseInt(assetId)) - if (!asset) { + const [existingAsset] = await drizzle + .select({ id: asset.id }) + .from(asset) + .where(eq(asset.id, parseInt(assetId))) + .limit(1) + + if (!existingAsset) { return ctx.json( { success: true, @@ -32,8 +27,8 @@ handler.openapi(deleteAssetByIdRoute, async (ctx) => { ) } - await assetManager.deleteAssetById(parseInt(assetId)) - await ctx.env.FILES_BUCKET.delete(asset.url) + await drizzle.delete(asset).where(eq(asset.id, parseInt(assetId))) + // await ctx.env.FILES_BUCKET.delete(asset.url) return ctx.json( { diff --git a/src/v2/routes/asset/get/id/[id]/route.ts b/src/v2/routes/asset/get/id/[id]/route.ts index 8dfe22b..67e6dd6 100644 --- a/src/v2/routes/asset/get/id/[id]/route.ts +++ b/src/v2/routes/asset/get/id/[id]/route.ts @@ -1,30 +1,45 @@ import { OpenAPIHono } from "@hono/zod-openapi" import { getAssetByIdRoute } from "./openapi" import { getConnection } from "@/v2/db/turso" -import { AssetManager } from "@/v2/lib/managers/asset/asset-manager" +import { asset } from "@/v2/db/schema" +import { eq, sql } from "drizzle-orm" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.openapi(getAssetByIdRoute, async (ctx) => { const assetId = ctx.req.valid("param").id - if (isNaN(parseInt(assetId))) { - return ctx.json( - { - success: false, - message: "Invalid asset ID", - }, - 400 - ) - } - - const parsedAssetId = parseInt(assetId) - const { drizzle } = await getConnection(ctx.env) - const assetManager = new AssetManager(drizzle) - const asset = await assetManager.getAssetById(parsedAssetId) - if (!asset) { + const foundAsset = await drizzle.query.asset.findFirst({ + where: (asset, { eq }) => eq(asset.id, parseInt(assetId)), + with: { + assetTagAsset: { + with: { + assetTag: true, + }, + }, + authUser: { + columns: { + id: true, + avatarUrl: true, + displayName: true, + username: true, + usernameColour: true, + pronouns: true, + verified: true, + bio: true, + dateJoined: true, + isSupporter: true, + role: true, + }, + }, + game: true, + assetCategory: true, + }, + }) + + if (!foundAsset) { return ctx.json( { success: false, @@ -34,12 +49,17 @@ handler.openapi(getAssetByIdRoute, async (ctx) => { ) } - await assetManager.updateAssetViews(parsedAssetId) + await drizzle + .update(asset) + .set({ + viewCount: sql`${asset.viewCount} + 1`, + }) + .where(eq(asset.id, parseInt(assetId))) return ctx.json( { success: true, - asset, + asset: foundAsset, }, 200 ) diff --git a/src/v2/routes/asset/modify/id/[id]/route.ts b/src/v2/routes/asset/modify/id/[id]/route.ts index 558cb16..b642ef0 100644 --- a/src/v2/routes/asset/modify/id/[id]/route.ts +++ b/src/v2/routes/asset/modify/id/[id]/route.ts @@ -2,9 +2,9 @@ import { OpenAPIHono } from "@hono/zod-openapi" import { getConnection } from "@/v2/db/turso" import { modifyAssetRoute } from "./openapi" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" -import { AssetManager } from "@/v2/lib/managers/asset/asset-manager" -import { asset } from "@/v2/db/schema" -import { eq } from "drizzle-orm" +import { asset, assetTag, assetTagAsset } from "@/v2/db/schema" +import { and, eq } from "drizzle-orm" +import { SplitQueryByCommas } from "@/v2/lib/helpers/split-query-by-commas" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() @@ -37,7 +37,6 @@ handler.openapi(modifyAssetRoute, async (ctx) => { } const { drizzle } = getConnection(ctx.env) - const assetManager = new AssetManager(drizzle) const [assetUser] = await drizzle .select({ @@ -56,17 +55,57 @@ handler.openapi(modifyAssetRoute, async (ctx) => { ) } - const updatedAsset = await assetManager.updateAssetById(parseInt(id), { - name, - tags, - assetCategoryId, - gameId, - }) + await drizzle + .update(asset) + .set({ + name, + assetCategoryId, + gameId, + }) + .where(eq(asset.id, parseInt(id))) + .returning() + + const newTags = SplitQueryByCommas(tags) ?? [] + + const oldTags = await drizzle + .select({ + assetTagId: assetTag.id, + }) + .from(assetTagAsset) + .innerJoin(assetTag, eq(assetTag.id, assetTagAsset.assetTagId)) + .where(eq(assetTagAsset.assetId, parseInt(id))) + + const oldTagIds = oldTags.map((t) => t.assetTagId) + const tagsToRemove = oldTagIds.filter((t) => !newTags.includes(t)) + const tagsToAdd = newTags.filter((t) => !oldTagIds.includes(t)) + + const tagBatchQueries = [ + ...tagsToRemove.map((tagId) => + drizzle + .delete(assetTagAsset) + .where( + and( + eq(assetTagAsset.assetId, parseInt(id)), + eq(assetTagAsset.assetTagId, tagId) + ) + ) + ), + ...tagsToAdd.map((tag) => + drizzle.insert(assetTagAsset).values({ + assetId: parseInt(id), + assetTagId: tag, + }) + ), + ] + + // https://github.com/drizzle-team/drizzle-orm/issues/1301 + type TagBatchQuery = (typeof tagBatchQueries)[number] + + await drizzle.batch(tagBatchQueries as [TagBatchQuery, ...TagBatchQuery[]]) return ctx.json( { success: true, - asset: updatedAsset, }, 200 ) diff --git a/src/v2/routes/asset/modify/id/[id]/schema.ts b/src/v2/routes/asset/modify/id/[id]/schema.ts index 3dc1ece..1bea70d 100644 --- a/src/v2/routes/asset/modify/id/[id]/schema.ts +++ b/src/v2/routes/asset/modify/id/[id]/schema.ts @@ -1,5 +1,4 @@ import { z } from "zod" -import { selectAssetSchema } from "@/v2/db/schema" export const modifyAssetPathSchema = z.object({ id: z.string().openapi({ @@ -47,5 +46,4 @@ export const modifyAssetSchema = z.object({ export const modifyAssetResponseSchema = z.object({ success: z.literal(true), - game: selectAssetSchema, }) diff --git a/src/v2/routes/asset/search/all/route.ts b/src/v2/routes/asset/search/all/route.ts index bf945d4..886beb1 100644 --- a/src/v2/routes/asset/search/all/route.ts +++ b/src/v2/routes/asset/search/all/route.ts @@ -1,14 +1,58 @@ import { OpenAPIHono } from "@hono/zod-openapi" import { assetSearchAllFilterRoute } from "./openapi" import { getConnection } from "@/v2/db/turso" -import { AssetManager } from "@/v2/lib/managers/asset/asset-manager" +import { sql, and, or, like, eq } from "drizzle-orm" +import { SplitQueryByCommas } from "@/v2/lib/helpers/split-query-by-commas" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.openapi(assetSearchAllFilterRoute, async (ctx) => { const { drizzle } = await getConnection(ctx.env) - const assetManager = new AssetManager(drizzle) - const assets = await assetManager.searchAssets(ctx.req.valid("query")) + + const { name, game, category, tags, offset } = ctx.req.valid("query") + + const gameList = game ? SplitQueryByCommas(game.toLowerCase()) : null + const categoryList = category + ? SplitQueryByCommas(category.toLowerCase()) + : null + const searchQuery = name ?? null + const tagList = tags ? SplitQueryByCommas(tags.toLowerCase()) : null + + // is this bad for performance? probably + const assets = await drizzle.query.asset.findMany({ + where: (asset, { and, or, like, eq, sql }) => + and( + tagList && tagList.length > 0 + ? or( + ...tagList.map( + (t) => + sql`EXISTS (SELECT 1 FROM assetTagAsset WHERE assetTagAsset.asset_id = ${asset.id} AND assetTagAsset.asset_tag_id = ${t})` + ) + ) + : undefined, + searchQuery ? like(asset.name, `%${searchQuery}%`) : undefined, + gameList + ? or(...gameList.map((game) => eq(asset.gameId, game))) + : undefined, + categoryList + ? or( + ...categoryList.map((category) => + eq(asset.assetCategoryId, category) + ) + ) + : undefined, + eq(asset.status, "approved") + ), + limit: 100, + offset: offset ? parseInt(offset) : 0, + with: { + assetTagAsset: { + with: { + assetTag: true, + }, + }, + }, + }) return ctx.json( { diff --git a/src/v2/routes/asset/upload/route.ts b/src/v2/routes/asset/upload/route.ts index 4e7b540..617e55c 100644 --- a/src/v2/routes/asset/upload/route.ts +++ b/src/v2/routes/asset/upload/route.ts @@ -1,8 +1,9 @@ import { OpenAPIHono } from "@hono/zod-openapi" import { uploadAssetRoute } from "./openapi" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" -import { AssetManager } from "@/v2/lib/managers/asset/asset-manager" import { getConnection } from "@/v2/db/turso" +import { SplitQueryByCommas } from "@/v2/lib/helpers/split-query-by-commas" +import { assetTagAsset } from "@/v2/db/schema" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.openapi(uploadAssetRoute, async (ctx) => { @@ -38,26 +39,50 @@ handler.openapi(uploadAssetRoute, async (ctx) => { } const { drizzle } = getConnection(ctx.env) - const assetManager = new AssetManager(drizzle) - const newAsset = await assetManager.createAsset( - user.id, - user.username, - { - name, - tags, - assetCategoryId, - gameId, - assetIsSuggestive, - }, - ctx.env.FILES_BUCKET, - asset as File + const { key } = await ctx.env.FILES_BUCKET.put( + `/assets/${gameId}/${assetCategoryId}/${name}.png`, + asset ) + const createdAsset = await drizzle + .insert(asset) + .values({ + name: name, + extension: "png", + gameId: gameId, + assetCategoryId: assetCategoryId, + url: key, + uploadedByName: user.username, + uploadedById: user.id, + status: "pending", + fileSize: 0, + width: 0, + height: 0, + assetIsSuggestive: Boolean(assetIsSuggestive), + }) + .returning() + + const tagsSplit = SplitQueryByCommas(tags) ?? [] + + if (tagsSplit.length > 0) { + const tagBatchQueries = tagsSplit.map((tag) => + drizzle.insert(assetTagAsset).values({ + assetId: createdAsset[0].id, + assetTagId: tag, + }) + ) + + type TagBatchQuery = (typeof tagBatchQueries)[number] + await drizzle.batch( + tagBatchQueries as [TagBatchQuery, ...TagBatchQuery[]] + ) + } + return ctx.json( { success: true, - asset: newAsset, + asset: createdAsset[0], }, 200 ) From 94a79dadad18358ae82991a6599219a37c980b7e Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Tue, 12 Mar 2024 22:01:51 +0000 Subject: [PATCH 257/318] fix: lint --- src/v2/routes/asset/search/all/route.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/v2/routes/asset/search/all/route.ts b/src/v2/routes/asset/search/all/route.ts index 886beb1..80dbe26 100644 --- a/src/v2/routes/asset/search/all/route.ts +++ b/src/v2/routes/asset/search/all/route.ts @@ -1,7 +1,6 @@ import { OpenAPIHono } from "@hono/zod-openapi" import { assetSearchAllFilterRoute } from "./openapi" import { getConnection } from "@/v2/db/turso" -import { sql, and, or, like, eq } from "drizzle-orm" import { SplitQueryByCommas } from "@/v2/lib/helpers/split-query-by-commas" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() From 24149698eb9efadae5727d1ccff7a12149ee6f91 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Tue, 12 Mar 2024 22:07:09 +0000 Subject: [PATCH 258/318] rm assetexternalfiletoasset (#75) --- src/v2/db/drizzle.ts | 1 - .../db/schema/asset/asset-external-files.ts | 71 +++---------------- src/v2/db/schema/asset/asset.ts | 4 +- 3 files changed, 13 insertions(+), 63 deletions(-) diff --git a/src/v2/db/drizzle.ts b/src/v2/db/drizzle.ts index ea92129..01bc950 100644 --- a/src/v2/db/drizzle.ts +++ b/src/v2/db/drizzle.ts @@ -14,7 +14,6 @@ export const tableNames = { // atlas: "atlas", // atlasToAsset: "atlasToAsset", assetExternalFile: "assetExternalFile", - assetExternalFileToAsset: "assetExternalFileToAsset", assetTag: "assetTag", assetTagLikes: "assetTagLikes", assetTagAsset: "assetTagAsset", diff --git a/src/v2/db/schema/asset/asset-external-files.ts b/src/v2/db/schema/asset/asset-external-files.ts index 5edb87c..8a9ba7d 100644 --- a/src/v2/db/schema/asset/asset-external-files.ts +++ b/src/v2/db/schema/asset/asset-external-files.ts @@ -34,6 +34,12 @@ export const assetExternalFile = sqliteTable( onUpdate: "cascade", onDelete: "cascade", }), + assetId: text("asset_id") + .notNull() + .references(() => asset.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), uploadedDate: text("uploaded_date") .notNull() .$defaultFn(() => { @@ -60,53 +66,14 @@ export type NewAssetExtrnalFile = typeof assetExternalFile.$inferInsert export const insertExtrnalFileSchema = createInsertSchema(assetExternalFile) export const selectExternalFileSchema = createSelectSchema(assetExternalFile) -export const assetExternalFileToAsset = sqliteTable( - tableNames.assetExternalFileToAsset, - { - id: text("id").primaryKey().notNull(), - assetExternalFileId: text("asset_external_file_id") - .notNull() - .references(() => assetExternalFile.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - assetId: integer("asset_id") - .notNull() - .references(() => asset.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - }, - (assetExternalFileToAsset) => { - return { - assetExternalFileToAssetIdx: index( - "asset_external_file_to_asset_id_idx" - ).on(assetExternalFileToAsset.id), - assetExternalFileToAssetFileIdx: index( - "asset_external_file_to_asset_file_id_idx" - ).on(assetExternalFileToAsset.assetExternalFileId), - assetExternalFileToAssetAssetIdx: index( - "asset_external_file_to_asset_asset_id_idx" - ).on(assetExternalFileToAsset.assetId), - } - } -) - -export type AssetExternalFileToAsset = - typeof assetExternalFileToAsset.$inferSelect -export type NewAssetExternalFileToAsset = - typeof assetExternalFileToAsset.$inferInsert -export const insertExternalFileToAssetSchema = createInsertSchema( - assetExternalFileToAsset -) -export const selectExternalFileToAssetSchema = createSelectSchema( - assetExternalFileToAsset -) - export const assetExternalFileRelations = relations( assetExternalFile, ({ one }) => ({ - assetExternalFileToAsset: one(assetExternalFileToAsset), + asset: one(asset, { + fields: [assetExternalFile.assetId], + references: [asset.id], + relationName: "asset_external_file_asset", + }), uploadedBy: one(authUser, { fields: [assetExternalFile.uploadedById], references: [authUser.id], @@ -114,19 +81,3 @@ export const assetExternalFileRelations = relations( }), }) ) - -export const assetExternalFileToAssetRelations = relations( - assetExternalFileToAsset, - ({ one }) => ({ - assetExternalFile: one(assetExternalFile, { - fields: [assetExternalFileToAsset.assetExternalFileId], - references: [assetExternalFile.id], - relationName: "asset_external_file_external_file", - }), - asset: one(asset, { - fields: [assetExternalFileToAsset.assetId], - references: [asset.id], - relationName: "asset_external_file_asset", - }), - }) -) diff --git a/src/v2/db/schema/asset/asset.ts b/src/v2/db/schema/asset/asset.ts index 7164719..5f4fdd2 100644 --- a/src/v2/db/schema/asset/asset.ts +++ b/src/v2/db/schema/asset/asset.ts @@ -11,9 +11,9 @@ import { authUser } from "../user/user" import { assetCategory } from "../categories/asset-categories" import { game } from "../game/game" import { assetTagAsset } from "../tags/asset-tags" -import { assetExternalFileToAsset } from "./asset-external-files" import { createInsertSchema, createSelectSchema } from "drizzle-zod" import { assetLikes } from "./asset-likes" +import { assetExternalFile } from "./asset-external-files" /* NOTE: Assets have a lot of relations, and can be quite complex in some cases. @@ -98,7 +98,7 @@ export const selectAssetSchema = createSelectSchema(asset) export const assetRelations = relations(asset, ({ one, many }) => ({ assetTagAsset: many(assetTagAsset), - assetExternalFileToAsset: many(assetExternalFileToAsset), + assetExternalFile: many(assetExternalFile), assetLikes: many(assetLikes), authUser: one(authUser, { fields: [asset.uploadedById, asset.uploadedByName], From acd1be3f55b5285685e5b907588aef8405a36e58 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Tue, 12 Mar 2024 22:24:35 +0000 Subject: [PATCH 259/318] rm asset like manager --- src/v2/lib/managers/asset/asset-likes.ts | 101 ------ src/v2/lib/managers/asset/asset-manager.ts | 323 ------------------ src/v2/routes/asset/likes/all/route.ts | 18 +- .../routes/asset/likes/like/id/[id]/route.ts | 37 +- .../asset/likes/unlike/id/[id]/route.ts | 41 ++- 5 files changed, 66 insertions(+), 454 deletions(-) delete mode 100644 src/v2/lib/managers/asset/asset-likes.ts delete mode 100644 src/v2/lib/managers/asset/asset-manager.ts diff --git a/src/v2/lib/managers/asset/asset-likes.ts b/src/v2/lib/managers/asset/asset-likes.ts deleted file mode 100644 index e0009af..0000000 --- a/src/v2/lib/managers/asset/asset-likes.ts +++ /dev/null @@ -1,101 +0,0 @@ -import { DrizzleInstance } from "@/v2/db/turso" -import { and, eq } from "drizzle-orm" -import { assetLikes } from "@/v2/db/schema/asset/asset-likes" - -export class AssetLikesManager { - constructor(private drizzle: DrizzleInstance) {} - - public async getUsersLikedAssets(userId: string, offset: number = 0) { - try { - // return await this.drizzle.select().from(assetLikes).where(eq(assetLikes.likedById, userId)).offset(offset) - return await this.drizzle.query.assetLikes.findMany({ - where: (assetLikes, { eq }) => eq(assetLikes.likedById, userId), - with: { - asset: { - with: { - assetTagAsset: { - with: { - assetTag: true, - }, - }, - }, - }, - }, - offset: offset, - }) - } catch (e) { - console.error(`Error getting assets liked by user ${userId}`, e) - throw new Error(`Error getting assets liked by user ${userId}`) - } - } - - public async checkAssetLikeStatus( - assetId: number, - userId: string - ): Promise { - try { - const [assetLike] = await this.drizzle - .select({ assetId: assetLikes.assetId }) - .from(assetLikes) - .where( - and( - eq(assetLikes.assetId, assetId), - eq(assetLikes.likedById, userId) - ) - ) - .limit(1) - - return assetLike ? true : false - } catch (e) { - console.error( - `Error checking if asset ${assetId} is liked by user ${userId}`, - e - ) - throw new Error( - `Error checking if asset ${assetId} is liked by user ${userId}` - ) - } - } - - /** - * Likes an asset for a user. - * @param assetId - The ID of the asset to like. - * @param userId - The ID of the user to like the asset for. - */ - public async likeAsset(assetId: number, userId: string) { - try { - return await this.drizzle - .insert(assetLikes) - .values({ - assetId, - likedById: userId, - }) - .returning() - } catch (e) { - console.error(`Error liking asset ${assetId} for user ${userId}`, e) - throw new Error(`Error liking asset ${assetId} for user ${userId}`) - } - } - - /** - * Unlikes an asset for a user. - * @param assetId - The ID of the asset to like. - * @param userId - The ID of the user to like the asset for. - */ - public async unlikeAsset(assetId: number, userId: string) { - try { - return await this.drizzle - .delete(assetLikes) - .where( - and( - eq(assetLikes.assetId, assetId), - eq(assetLikes.likedById, userId) - ) - ) - .returning() - } catch (e) { - console.error(`Error liking asset ${assetId} for user ${userId}`, e) - throw new Error(`Error liking asset ${assetId} for user ${userId}`) - } - } -} diff --git a/src/v2/lib/managers/asset/asset-manager.ts b/src/v2/lib/managers/asset/asset-manager.ts deleted file mode 100644 index 2a088d7..0000000 --- a/src/v2/lib/managers/asset/asset-manager.ts +++ /dev/null @@ -1,323 +0,0 @@ -import { DrizzleInstance } from "@/v2/db/turso" -import { asset, assetTag, assetTagAsset } from "@/v2/db/schema" -import { eq, and, sql } from "drizzle-orm" -import { R2Bucket } from "@cloudflare/workers-types" -import { SplitQueryByCommas } from "../../helpers/split-query-by-commas" -import { z } from "zod" -import type { AssetStatus, NewAsset } from "@/v2/db/schema" -import type { assetSearchAllFilter } from "@/v2/routes/asset/search/all/schema" -import { uploadAssetSchema } from "@/v2/routes/asset/upload/schema" -import { modifyAssetSchema } from "@/v2/routes/asset/modify/id/[id]/schema" -export class AssetManager { - constructor(private drizzle: DrizzleInstance) {} - - public async getBarebonesAssetById(assetId: number) { - try { - return await this.drizzle - .select() - .from(asset) - .where(eq(asset.id, assetId)) - .limit(1) - } catch (e) { - console.error(`Error getting asset by ID ${assetId}`, e) - throw new Error(`Error getting asset by ID ${assetId}`) - } - } - - public async updateAssetViews(assetId: number) { - try { - await this.drizzle - .update(asset) - .set({ - viewCount: sql`${asset.viewCount} + 1`, - }) - .where(eq(asset.id, assetId)) - } catch (e) { - console.error(`Error updating asset views by ID ${assetId}`, e) - throw new Error(`Error updating asset views by ID ${assetId}`) - } - } - - public async updateAssetStatus(assetId: number, status: AssetStatus) { - try { - await this.drizzle - .update(asset) - .set({ - status: status, - }) - .where(eq(asset.id, assetId)) - } catch (e) { - console.error(`Error updating asset status by ID ${assetId}`, e) - throw new Error(`Error updating asset status by ID ${assetId}`) - } - } - - public async updateAssetDownloads(assetId: number) { - try { - await this.drizzle - .update(asset) - .set({ - downloadCount: sql`${asset.downloadCount} + 1`, - }) - .where(eq(asset.id, assetId)) - } catch (e) { - console.error(`Error updating asset downloads by ID ${assetId}`, e) - throw new Error(`Error updating asset downloads by ID ${assetId}`) - } - } - - public async getAssetById(assetId: number) { - try { - return await this.drizzle.query.asset.findFirst({ - where: (asset, { eq }) => eq(asset.id, assetId), - with: { - assetTagAsset: { - with: { - assetTag: true, - }, - }, - authUser: { - columns: { - id: true, - avatarUrl: true, - displayName: true, - username: true, - usernameColour: true, - pronouns: true, - verified: true, - bio: true, - dateJoined: true, - isSupporter: true, - role: true, - }, - }, - game: true, - assetCategory: true, - }, - }) - } catch (e) { - console.error(`Error getting asset by ID ${assetId}`, e) - throw new Error(`Error getting asset by ID ${assetId}`) - } - } - - public async deleteAssetById(assetId: number) { - try { - return await this.drizzle - .delete(asset) - .where(eq(asset.id, assetId)) - .returning() - } catch (e) { - console.error(`Error deleting asset by ID ${assetId}`, e) - throw new Error(`Error deleting asset by ID ${assetId}`) - } - } - - public async updateAssetById( - assetId: number, - update: z.infer - ) { - const { tags, ...rest } = update - - try { - const [updatedAsset] = await this.drizzle - .update(asset) - .set({ - ...rest, - }) - .where(eq(asset.id, assetId)) - .returning() - - const newTags = SplitQueryByCommas(tags) ?? [] - if (newTags.length === 0) return updatedAsset - - const oldTags = await this.drizzle - .select({ - assetTagId: assetTag.id, - }) - .from(assetTagAsset) - .innerJoin(assetTag, eq(assetTag.id, assetTagAsset.assetTagId)) - .where(eq(assetTagAsset.assetId, assetId)) - - const oldTagIds = oldTags.map((t) => t.assetTagId) - const tagsToRemove = oldTagIds.filter((t) => !newTags.includes(t)) - const tagsToAdd = newTags.filter((t) => !oldTagIds.includes(t)) - - const tagBatchQueries = [ - ...tagsToRemove.map((tagId) => - this.drizzle - .delete(assetTagAsset) - .where( - and( - eq(assetTagAsset.assetId, assetId), - eq(assetTagAsset.assetTagId, tagId) - ) - ) - ), - ...tagsToAdd.map((tag) => - this.drizzle.insert(assetTagAsset).values({ - assetId: assetId, - assetTagId: tag, - }) - ), - ] - - // https://github.com/drizzle-team/drizzle-orm/issues/1301 - type TagBatchQuery = (typeof tagBatchQueries)[number] - - await this.drizzle.batch( - tagBatchQueries as [TagBatchQuery, ...TagBatchQuery[]] - ) - - return updatedAsset - } catch (e) { - console.error(`Error updating asset by ID ${assetId}`, e) - throw new Error(`Error updating asset by ID ${assetId}`) - } - } - - /** - * Retrieves a list of all assets. - * @returns A promise that resolves to an array of assets. - */ - public async listAssets() { - try { - return await this.drizzle.select().from(asset) - } catch (e) { - console.error("Error listing assets", e) - throw new Error("Error listing assets") - } - } - - /** - * Searches for assets based on optional query filters. - * @param query - An object containing optional search parameters. - * @returns A promise that resolves to an array of matching assets. - */ - public async searchAssets(query: assetSearchAllFilter) { - try { - const { name, game, category, tags, offset } = query - - const gameList = game - ? SplitQueryByCommas(game.toLowerCase()) - : null - const categoryList = category - ? SplitQueryByCommas(category.toLowerCase()) - : null - const searchQuery = name ?? null - const tagList = tags ? SplitQueryByCommas(tags.toLowerCase()) : null - - // TODO(dromzeh): this is really ugly imo, worried about performance a little - // when writing with raw sql, it makes joins really annoying - // i've seen people seperate this into two queries (one for the tags, one for the assets) then merge them together - // but i don't really want to do that lol - fine for now but should come back to this later :^) - const assets = await this.drizzle.query.asset.findMany({ - where: (asset, { and, or, like, eq, sql }) => - and( - tagList && tagList.length > 0 - ? or( - ...tagList.map( - (t) => - sql`EXISTS (SELECT 1 FROM assetTagAsset WHERE assetTagAsset.asset_id = ${asset.id} AND assetTagAsset.asset_tag_id = ${t})` - ) - ) - : undefined, - searchQuery - ? like(asset.name, `%${searchQuery}%`) - : undefined, - gameList - ? or( - ...gameList.map((game) => - eq(asset.gameId, game) - ) - ) - : undefined, - categoryList - ? or( - ...categoryList.map((category) => - eq(asset.assetCategoryId, category) - ) - ) - : undefined, - eq(asset.status, "approved") - ), - limit: 100, - offset: offset ? parseInt(offset) : 0, - with: { - assetTagAsset: { - with: { - assetTag: true, - }, - }, - }, - }) - return assets - } catch (e) { - console.error("Error searching assets", e) - throw new Error("Error searching assets") - } - } - - /** - * Creates a new asset. - * @param userId - The ID of the user creating the asset. - * @param newAsset - The new asset data, adhering to the UploadAssetSchema. - * @param bucket - The Cloudflare R2Bucket for asset storage. - * @param file - The File object representing the asset to be uploaded. - * @returns A promise that resolves to the created asset. - */ - public async createAsset( - userId: string, - userNickname: string, - newAsset: z.infer, - bucket: R2Bucket, // TODO(dromzeh): come back to this later :^) - file: File - ): Promise { - try { - const { key } = await bucket.put( - `/assets/${newAsset.gameId}/${newAsset.assetCategoryId}/${newAsset.name}.png`, - file - ) - // TODO(dromzeh): correct file size, width, and height - - const [createdAsset] = await this.drizzle - .insert(asset) - .values({ - name: newAsset.name, - extension: "png", - gameId: newAsset.gameId, - assetCategoryId: newAsset.assetCategoryId, - url: key, - uploadedByName: userNickname, - uploadedById: userId, - status: "pending", - fileSize: 0, - width: 0, - height: 0, - assetIsSuggestive: Boolean(newAsset.assetIsSuggestive), - }) - .returning() - - const tags = SplitQueryByCommas(newAsset.tags) ?? [] - - if (tags.length === 0) return createdAsset - - const tagBatchQueries = tags.map((tag) => - this.drizzle.insert(assetTagAsset).values({ - assetId: createdAsset.id, - assetTagId: tag, - }) - ) - - type TagBatchQuery = (typeof tagBatchQueries)[number] - await this.drizzle.batch( - tagBatchQueries as [TagBatchQuery, ...TagBatchQuery[]] - ) - - return createdAsset - } catch (e) { - console.error("Error creating asset", e) - throw new Error("Error creating asset") - } - } -} diff --git a/src/v2/routes/asset/likes/all/route.ts b/src/v2/routes/asset/likes/all/route.ts index 1661ba0..fb9b88e 100644 --- a/src/v2/routes/asset/likes/all/route.ts +++ b/src/v2/routes/asset/likes/all/route.ts @@ -1,7 +1,6 @@ import { OpenAPIHono } from "@hono/zod-openapi" import { allAssetLikesRoute } from "./openapi" import { getConnection } from "@/v2/db/turso" -import { AssetLikesManager } from "@/v2/lib/managers/asset/asset-likes" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() @@ -21,9 +20,22 @@ handler.openapi(allAssetLikesRoute, async (ctx) => { } const { drizzle } = await getConnection(ctx.env) - const assetLikeManager = new AssetLikesManager(drizzle) - const likes = await assetLikeManager.getUsersLikedAssets(user.id) + const likes = await drizzle.query.assetLikes.findMany({ + where: (assetLikes, { eq }) => eq(assetLikes.likedById, user.id), + with: { + asset: { + with: { + assetTagAsset: { + with: { + assetTag: true, + }, + }, + }, + }, + }, + offset: 0, + }) return ctx.json( { diff --git a/src/v2/routes/asset/likes/like/id/[id]/route.ts b/src/v2/routes/asset/likes/like/id/[id]/route.ts index ff8fead..6187722 100644 --- a/src/v2/routes/asset/likes/like/id/[id]/route.ts +++ b/src/v2/routes/asset/likes/like/id/[id]/route.ts @@ -1,9 +1,9 @@ import { OpenAPIHono } from "@hono/zod-openapi" import { likeAssetByIdRoute } from "./openapi" import { getConnection } from "@/v2/db/turso" -import { AssetManager } from "@/v2/lib/managers/asset/asset-manager" -import { AssetLikesManager } from "@/v2/lib/managers/asset/asset-likes" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +import { asset, assetLikes } from "@/v2/db/schema" +import { and, eq } from "drizzle-orm" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() @@ -21,10 +21,14 @@ handler.openapi(likeAssetByIdRoute, async (ctx) => { } const { drizzle } = await getConnection(ctx.env) - const assetManager = new AssetManager(drizzle) - const asset = await assetManager.getBarebonesAssetById(parseInt(assetId)) - if (!asset) { + const [existingAsset] = await drizzle + .select() + .from(asset) + .where(eq(asset.id, parseInt(assetId))) + .limit(1) + + if (!existingAsset) { return ctx.json( { success: true, @@ -47,14 +51,18 @@ handler.openapi(likeAssetByIdRoute, async (ctx) => { ) } - const assetLikeManager = new AssetLikesManager(drizzle) - - const likeStatus = await assetLikeManager.checkAssetLikeStatus( - parseInt(assetId), - user.id - ) + const [assetLikeStatus] = await drizzle + .select({ assetId: assetLikes.assetId }) + .from(assetLikes) + .where( + and( + eq(assetLikes.assetId, parseInt(assetId)), + eq(assetLikes.likedById, user.id) + ) + ) + .limit(1) - if (likeStatus) { + if (assetLikeStatus) { return ctx.json( { success: false, @@ -64,7 +72,10 @@ handler.openapi(likeAssetByIdRoute, async (ctx) => { ) } - await assetLikeManager.likeAsset(parseInt(assetId), user.id) + await drizzle.insert(assetLikes).values({ + assetId: parseInt(assetId), + likedById: user.id, + }) return ctx.json( { diff --git a/src/v2/routes/asset/likes/unlike/id/[id]/route.ts b/src/v2/routes/asset/likes/unlike/id/[id]/route.ts index da95fc3..e33f6ce 100644 --- a/src/v2/routes/asset/likes/unlike/id/[id]/route.ts +++ b/src/v2/routes/asset/likes/unlike/id/[id]/route.ts @@ -1,9 +1,9 @@ import { OpenAPIHono } from "@hono/zod-openapi" import { unlikeAssetByIdRoute } from "./openapi" import { getConnection } from "@/v2/db/turso" -import { AssetManager } from "@/v2/lib/managers/asset/asset-manager" -import { AssetLikesManager } from "@/v2/lib/managers/asset/asset-likes" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +import { asset, assetLikes } from "@/v2/db/schema" +import { and, eq } from "drizzle-orm" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() @@ -21,12 +21,14 @@ handler.openapi(unlikeAssetByIdRoute, async (ctx) => { } const { drizzle } = await getConnection(ctx.env) - const assetManager = new AssetManager(drizzle) - const asset = await assetManager.getBarebonesAssetById(parseInt(assetId)) - console.log(asset) + const [existingAsset] = await drizzle + .select() + .from(asset) + .where(eq(asset.id, parseInt(assetId))) + .limit(1) - if (!asset) { + if (!existingAsset) { return ctx.json( { success: true, @@ -49,14 +51,18 @@ handler.openapi(unlikeAssetByIdRoute, async (ctx) => { ) } - const assetLikeManager = new AssetLikesManager(drizzle) - - const likeStatus = await assetLikeManager.checkAssetLikeStatus( - parseInt(assetId), - user.id - ) + const [assetLikeStatus] = await drizzle + .select({ assetId: assetLikes.assetId }) + .from(assetLikes) + .where( + and( + eq(assetLikes.assetId, parseInt(assetId)), + eq(assetLikes.likedById, user.id) + ) + ) + .limit(1) - if (!likeStatus) { + if (!assetLikeStatus) { return ctx.json( { success: false, @@ -66,7 +72,14 @@ handler.openapi(unlikeAssetByIdRoute, async (ctx) => { ) } - await assetLikeManager.unlikeAsset(parseInt(assetId), user.id) + await drizzle + .delete(assetLikes) + .where( + and( + eq(assetLikes.assetId, parseInt(assetId)), + eq(assetLikes.likedById, user.id) + ) + ) return ctx.json( { From 1bbbd3cfe88d3c246393fa093cbaff3797fa0640 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Wed, 13 Mar 2024 01:12:21 +0000 Subject: [PATCH 260/318] user block table & relations --- src/v2/db/drizzle.ts | 1 + src/v2/db/schema.ts | 2 + src/v2/db/schema/user/user-blocked.ts | 58 +++++++++++++++++++++++++++ src/v2/db/schema/user/user.ts | 7 ++++ 4 files changed, 68 insertions(+) create mode 100644 src/v2/db/schema/user/user-blocked.ts diff --git a/src/v2/db/drizzle.ts b/src/v2/db/drizzle.ts index 01bc950..a19a3a3 100644 --- a/src/v2/db/drizzle.ts +++ b/src/v2/db/drizzle.ts @@ -5,6 +5,7 @@ export const tableNames = { authSession: "authSession", authUser: "authUser", userFollowing: "userFollowing", + userBlocked: "userBlocked", gameAssetCategory: "gameAssetCategory", assetLikes: "assetLikes", userCollectionLikes: "userCollectionLikes", diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index 06d7e17..b163137 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -17,6 +17,8 @@ export * from "./schema/collections/user-collections" export * from "./schema/user/user-connections" export * from "./schema/user/user-favorites" export * from "./schema/user/user-following" +export * from "./schema/user/user-blocked" + export * from "./schema/collections/user-collection-likes" export * from "./schema/collections/user-collections-collaborators" diff --git a/src/v2/db/schema/user/user-blocked.ts b/src/v2/db/schema/user/user-blocked.ts new file mode 100644 index 0000000..3d5e0f4 --- /dev/null +++ b/src/v2/db/schema/user/user-blocked.ts @@ -0,0 +1,58 @@ +import { tableNames } from "@/v2/db/drizzle" +import { relations } from "drizzle-orm" +import { + sqliteTable, + text, + // uniqueIndex, + index, +} from "drizzle-orm/sqlite-core" +import { authUser } from "./user" +import { createInsertSchema, createSelectSchema } from "drizzle-zod" + +export const userBlocked = sqliteTable( + tableNames.userBlocked, + { + id: text("id").primaryKey().notNull(), + blockedById: text("blocked_by_id") + .references(() => authUser.id, { + onUpdate: "cascade", + onDelete: "cascade", + }) + .notNull(), + blockedId: text("blocked_id") + .references(() => authUser.id, { + onUpdate: "cascade", + onDelete: "cascade", + }) + .notNull(), + }, + (table) => { + return { + idIdx: index("user_blocked_id_idx").on(table.id), + blockedByIdIdx: index("user_blocked_blocked_by_id_idx").on( + table.blockedById + ), + blockedIdIdx: index("user_blocked_blocked_id_idx").on( + table.blockedId + ), + } + } +) + +export type UserBlocked = typeof userBlocked.$inferSelect +export type NewUserBlocked = typeof userBlocked.$inferInsert +export const insertUserBlockedSchema = createInsertSchema(userBlocked) +export const selectUserBlockedSchema = createSelectSchema(userBlocked) + +export const userBlockedRelations = relations(userBlocked, ({ one }) => ({ + blockedBy: one(authUser, { + fields: [userBlocked.blockedById], + references: [authUser.id], + relationName: "blockedBy", + }), + blocked: one(authUser, { + fields: [userBlocked.blockedId], + references: [authUser.id], + relationName: "blocked", + }), +})) diff --git a/src/v2/db/schema/user/user.ts b/src/v2/db/schema/user/user.ts index fd58acc..d35675a 100644 --- a/src/v2/db/schema/user/user.ts +++ b/src/v2/db/schema/user/user.ts @@ -24,6 +24,7 @@ import { gameLikes } from "../game/game-likes" import { assetTagLikes } from "../tags/asset-tags-likes" import { assetCategoryLikes } from "../categories/asset-categories-likes" import { requestForm, requestFormUpvotes } from "../supporter/request-form" +import { userBlocked } from "./user-blocked" /* NOTE: Very basic user information @@ -160,6 +161,12 @@ export const usersRelations = relations(authUser, ({ one, many }) => ({ following: many(userFollowing, { relationName: "following", }), + blocked: many(userBlocked, { + relationName: "blocked", + }), + blockedBy: many(userBlocked, { + relationName: "blockedBy", + }), authCredentials: one(authCredentials), userSession: many(userSession), asset: many(asset), From 231e45a00bace3daf58b41f6fbf473b5a191e53e Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Wed, 13 Mar 2024 21:56:09 +0000 Subject: [PATCH 261/318] check block status before follow update --- .../user/follows/follow/id/[id]/route.ts | 39 ++++++++++++++++++- .../user/follows/unfollow/id/[id]/route.ts | 39 ++++++++++++++++++- 2 files changed, 74 insertions(+), 4 deletions(-) diff --git a/src/v2/routes/user/follows/follow/id/[id]/route.ts b/src/v2/routes/user/follows/follow/id/[id]/route.ts index 83b4b28..b9d8668 100644 --- a/src/v2/routes/user/follows/follow/id/[id]/route.ts +++ b/src/v2/routes/user/follows/follow/id/[id]/route.ts @@ -2,8 +2,8 @@ import { OpenAPIHono } from "@hono/zod-openapi" import { followUserByIdRoute } from "./openapi" import { getConnection } from "@/v2/db/turso" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" -import { and, eq } from "drizzle-orm" -import { userFollowing } from "@/v2/db/schema" +import { and, eq, or } from "drizzle-orm" +import { userFollowing, userBlocked } from "@/v2/db/schema" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() @@ -55,6 +55,41 @@ handler.openapi(followUserByIdRoute, async (ctx) => { ) } + const [blockedStatus] = await drizzle + .select({ + id: userBlocked.blockedId, + blockById: userBlocked.blockedById, + }) + .from(userBlocked) + .where( + or( + and( + eq(userBlocked.blockedId, user.id), + eq(userBlocked.blockedById, userId) + ), + and( + eq(userBlocked.blockedId, userId), + eq(userBlocked.blockedById, user.id) + ) + ) + ) + .limit(1) + + if (blockedStatus) { + const message = + blockedStatus.blockById === user.id + ? "You are blocked by this user" + : "You have blocked this user" + + return ctx.json( + { + success: false, + message, + }, + 400 + ) + } + try { await drizzle.insert(userFollowing).values({ followerId: user.id, diff --git a/src/v2/routes/user/follows/unfollow/id/[id]/route.ts b/src/v2/routes/user/follows/unfollow/id/[id]/route.ts index 43ccc82..6e1d72a 100644 --- a/src/v2/routes/user/follows/unfollow/id/[id]/route.ts +++ b/src/v2/routes/user/follows/unfollow/id/[id]/route.ts @@ -2,8 +2,8 @@ import { OpenAPIHono } from "@hono/zod-openapi" import { unFollowUserByIdRoute } from "./openapi" import { getConnection } from "@/v2/db/turso" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" -import { userFollowing } from "@/v2/db/schema" -import { and, eq } from "drizzle-orm" +import { userFollowing, userBlocked } from "@/v2/db/schema" +import { and, eq, or } from "drizzle-orm" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() @@ -56,6 +56,41 @@ handler.openapi(unFollowUserByIdRoute, async (ctx) => { ) } + const [blockedStatus] = await drizzle + .select({ + id: userBlocked.blockedId, + blockById: userBlocked.blockedById, + }) + .from(userBlocked) + .where( + or( + and( + eq(userBlocked.blockedId, user.id), + eq(userBlocked.blockedById, userId) + ), + and( + eq(userBlocked.blockedId, userId), + eq(userBlocked.blockedById, user.id) + ) + ) + ) + .limit(1) + + if (blockedStatus) { + const message = + blockedStatus.blockById === user.id + ? "You are blocked by this user" + : "You have blocked this user" + + return ctx.json( + { + success: false, + message, + }, + 400 + ) + } + try { await drizzle .delete(userFollowing) From 2192431d899cc16ac792d46b5ee0c584c8cb778d Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sat, 16 Mar 2024 17:43:55 +0000 Subject: [PATCH 262/318] replace isSupporter with plan, add stripe table --- src/scripts/seed/seed.ts | 4 +- src/v2/db/drizzle.ts | 1 + src/v2/db/schema/user/user.ts | 50 +++++++++++++++++-- .../lib/auth/definitions/auth-definitions.ts | 3 +- src/v2/lib/auth/lucia.ts | 2 +- src/v2/routes/asset/get/id/[id]/route.ts | 2 +- src/v2/routes/asset/get/id/[id]/schema.ts | 2 +- src/v2/routes/contributors/get/all/openapi.ts | 2 +- src/v2/routes/contributors/get/all/route.ts | 2 +- src/v2/routes/requests/form/create/route.ts | 2 +- .../routes/requests/form/delete/[id]/route.ts | 2 +- .../user/follows/followers/id/[id]/route.ts | 2 +- .../user/follows/followers/id/[id]/schema.ts | 2 +- .../user/follows/following/id/[id]/route.ts | 2 +- .../user/follows/following/id/[id]/schema.ts | 2 +- src/v2/routes/user/get/id/[id]/route.ts | 2 +- src/v2/routes/user/get/id/[id]/schema.ts | 2 +- .../user/get/username/[username]/route.ts | 2 +- .../user/get/username/[username]/schema.ts | 2 +- .../user/search/username/[username]/route.ts | 2 +- .../user/search/username/[username]/schema.ts | 2 +- src/worker-configuration.d.ts | 1 + 22 files changed, 70 insertions(+), 23 deletions(-) diff --git a/src/scripts/seed/seed.ts b/src/scripts/seed/seed.ts index dcffe9a..ce18f81 100644 --- a/src/scripts/seed/seed.ts +++ b/src/scripts/seed/seed.ts @@ -55,7 +55,7 @@ async function main() { bio: "test bio", role: "creator", isContributor: true, - isSupporter: true, + plan: "supporter", }, { username: "testuser2", @@ -73,7 +73,7 @@ async function main() { bio: "test bio 3", role: "uploader", isContributor: false, - isSupporter: true, + plan: "supporter", }, ]) .returning() diff --git a/src/v2/db/drizzle.ts b/src/v2/db/drizzle.ts index a19a3a3..8d31414 100644 --- a/src/v2/db/drizzle.ts +++ b/src/v2/db/drizzle.ts @@ -12,6 +12,7 @@ export const tableNames = { userCollectionCollaborators: "userCollectionCollaborators", game: "game", gameLikes: "gameLikes", + stripeUser: "stripeUser", // atlas: "atlas", // atlasToAsset: "atlasToAsset", assetExternalFile: "assetExternalFile", diff --git a/src/v2/db/schema/user/user.ts b/src/v2/db/schema/user/user.ts index d35675a..5a81921 100644 --- a/src/v2/db/schema/user/user.ts +++ b/src/v2/db/schema/user/user.ts @@ -39,6 +39,8 @@ export type UserRoles = | "uploader" | "user" +export type UserPlan = "free" | "supporter" + export const authUser = sqliteTable( tableNames.authUser, { @@ -63,9 +65,7 @@ export const authUser = sqliteTable( .$defaultFn(() => { return new Date().toISOString() }), - isSupporter: integer("is_supporter", { mode: "boolean" }) - .default(false) - .notNull(), + plan: text("plan").default("free").notNull().$type(), isBanned: integer("is_banned", { mode: "boolean" }) .default(false) .notNull(), @@ -91,6 +91,41 @@ export type NewUser = typeof authUser.$inferInsert export const insertUserSchema = createInsertSchema(authUser) export const selectUserSchema = createSelectSchema(authUser) +export const stripeUser = sqliteTable( + tableNames.stripeUser, + { + id: text("id") + .primaryKey() + .notNull() + .$defaultFn(() => { + return generateID() + }), + userId: text("user_id") + .notNull() + .references(() => authUser.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + customerId: text("stripe_customer_id"), + subscriptionId: text("stripe_subscription_id"), + endsAt: text("ends_at"), + paidUntil: text("paid_until"), + }, + (stripeUser) => { + return { + userIdx: index("stripe_user_user_id_idx").on(stripeUser.userId), + stripeCustomerIdIdx: index("stripe_user_stripe_customer_id_idx").on( + stripeUser.customerId + ), + } + } +) + +export type StripeUser = typeof stripeUser.$inferSelect +export type NewStripeUser = typeof stripeUser.$inferInsert +export const insertStripeUserSchema = createInsertSchema(stripeUser) +export const selectStripeUserSchema = createSelectSchema(stripeUser) + export const authCredentials = sqliteTable( tableNames.authCredentials, { @@ -176,6 +211,7 @@ export const usersRelations = relations(authUser, ({ one, many }) => ({ assetLikes: many(assetLikes), socialsConnection: one(socialsConnection), userCollection: many(userCollection), + stripeUser: one(stripeUser), passwordResetToken: one(passwordResetToken), emailVerificationToken: one(emailVerificationToken), gameLikes: many(gameLikes), @@ -186,6 +222,14 @@ export const usersRelations = relations(authUser, ({ one, many }) => ({ requestFormUpvotes: many(requestFormUpvotes), })) +export const stripeUserRelations = relations(stripeUser, ({ one }) => ({ + user: one(authUser, { + fields: [stripeUser.userId], + references: [authUser.id], + relationName: "stripe_user", + }), +})) + export const authCredentialsRelations = relations( authCredentials, ({ one }) => ({ diff --git a/src/v2/lib/auth/definitions/auth-definitions.ts b/src/v2/lib/auth/definitions/auth-definitions.ts index 2dcd0d6..ba7da39 100644 --- a/src/v2/lib/auth/definitions/auth-definitions.ts +++ b/src/v2/lib/auth/definitions/auth-definitions.ts @@ -1,5 +1,6 @@ import { UserRoles } from "@/v2/db/schema" import type { LuciaAuth } from "../lucia" +import type { UserPlan } from "@/v2/db/schema" declare module "lucia" { interface Register { @@ -21,7 +22,7 @@ declare module "lucia" { verified: boolean bio: string | null date_joined: string - is_supporter: boolean + plan: UserPlan is_banned: boolean role: UserRoles is_contributor: boolean diff --git a/src/v2/lib/auth/lucia.ts b/src/v2/lib/auth/lucia.ts index 32cb28d..284e213 100644 --- a/src/v2/lib/auth/lucia.ts +++ b/src/v2/lib/auth/lucia.ts @@ -29,7 +29,7 @@ export function luciaAuth(env: Bindings) { verified: user.verified, bio: user.bio, dateJoined: user.date_joined, - isSupporter: Boolean(user.is_supporter), + plan: user.plan, isBanned: Boolean(user.is_banned), isContributor: user.is_contributor, role: user.role as UserRoles, diff --git a/src/v2/routes/asset/get/id/[id]/route.ts b/src/v2/routes/asset/get/id/[id]/route.ts index 67e6dd6..12f9549 100644 --- a/src/v2/routes/asset/get/id/[id]/route.ts +++ b/src/v2/routes/asset/get/id/[id]/route.ts @@ -30,7 +30,7 @@ handler.openapi(getAssetByIdRoute, async (ctx) => { verified: true, bio: true, dateJoined: true, - isSupporter: true, + plan: true, role: true, }, }, diff --git a/src/v2/routes/asset/get/id/[id]/schema.ts b/src/v2/routes/asset/get/id/[id]/schema.ts index 39fc678..396f70e 100644 --- a/src/v2/routes/asset/get/id/[id]/schema.ts +++ b/src/v2/routes/asset/get/id/[id]/schema.ts @@ -39,7 +39,7 @@ export const getAssetByIdResponseSchema = z.object({ verified: true, bio: true, dateJoined: true, - isSupporter: true, + plan: true, role: true, }), game: selectGameSchema, diff --git a/src/v2/routes/contributors/get/all/openapi.ts b/src/v2/routes/contributors/get/all/openapi.ts index ef684ae..161aa1c 100644 --- a/src/v2/routes/contributors/get/all/openapi.ts +++ b/src/v2/routes/contributors/get/all/openapi.ts @@ -9,7 +9,7 @@ const contributorListSchema = z.object({ id: true, username: true, avatarUrl: true, - isSupporter: true, + plan: true, role: true, }) .array(), diff --git a/src/v2/routes/contributors/get/all/route.ts b/src/v2/routes/contributors/get/all/route.ts index 60b1a10..3cef571 100644 --- a/src/v2/routes/contributors/get/all/route.ts +++ b/src/v2/routes/contributors/get/all/route.ts @@ -14,7 +14,7 @@ handler.openapi(contributorsRoute, async (ctx) => { id: authUser.id, username: authUser.username, avatarUrl: authUser.avatarUrl, - isSupporter: authUser.isSupporter, + plan: authUser.plan, role: authUser.role, }) .from(authUser) diff --git a/src/v2/routes/requests/form/create/route.ts b/src/v2/routes/requests/form/create/route.ts index 92ad32a..adf7ed4 100644 --- a/src/v2/routes/requests/form/create/route.ts +++ b/src/v2/routes/requests/form/create/route.ts @@ -13,7 +13,7 @@ handler.openapi(createRequestFormEntryRoute, async (ctx) => { const { user } = await authSessionManager.validateSession() - if (!user || user.role != "creator" || !user.isSupporter) { + if (!user || user.role != "creator" || user.plan == "supporter") { return ctx.json( { success: false, diff --git a/src/v2/routes/requests/form/delete/[id]/route.ts b/src/v2/routes/requests/form/delete/[id]/route.ts index 6554468..fcd291b 100644 --- a/src/v2/routes/requests/form/delete/[id]/route.ts +++ b/src/v2/routes/requests/form/delete/[id]/route.ts @@ -13,7 +13,7 @@ handler.openapi(deleteRequestByIdRoute, async (ctx) => { const { user } = await authSessionManager.validateSession() - if (!user || user.role != "creator" || !user.isSupporter) { + if (!user || user.role != "creator" || user.plan == "supporter") { return ctx.json( { success: false, diff --git a/src/v2/routes/user/follows/followers/id/[id]/route.ts b/src/v2/routes/user/follows/followers/id/[id]/route.ts index 4973513..2b6cb12 100644 --- a/src/v2/routes/user/follows/followers/id/[id]/route.ts +++ b/src/v2/routes/user/follows/followers/id/[id]/route.ts @@ -18,7 +18,7 @@ handler.openapi(viewUserFollowsByIdRoute, async (ctx) => { id: true, avatarUrl: true, username: true, - isSupporter: true, + plan: true, verified: true, displayName: true, }, diff --git a/src/v2/routes/user/follows/followers/id/[id]/schema.ts b/src/v2/routes/user/follows/followers/id/[id]/schema.ts index b78b511..2455e26 100644 --- a/src/v2/routes/user/follows/followers/id/[id]/schema.ts +++ b/src/v2/routes/user/follows/followers/id/[id]/schema.ts @@ -34,7 +34,7 @@ export const viewUserFollowsbyIdResponseSchema = z.object({ id: true, avatarUrl: true, username: true, - isSupporter: true, + plan: true, verified: true, displayName: true, }), diff --git a/src/v2/routes/user/follows/following/id/[id]/route.ts b/src/v2/routes/user/follows/following/id/[id]/route.ts index 382d789..afd12e1 100644 --- a/src/v2/routes/user/follows/following/id/[id]/route.ts +++ b/src/v2/routes/user/follows/following/id/[id]/route.ts @@ -18,7 +18,7 @@ handler.openapi(viewUserfollowingbyIdRoute, async (ctx) => { id: true, avatarUrl: true, username: true, - isSupporter: true, + plan: true, verified: true, displayName: true, }, diff --git a/src/v2/routes/user/follows/following/id/[id]/schema.ts b/src/v2/routes/user/follows/following/id/[id]/schema.ts index 16af185..020800b 100644 --- a/src/v2/routes/user/follows/following/id/[id]/schema.ts +++ b/src/v2/routes/user/follows/following/id/[id]/schema.ts @@ -34,7 +34,7 @@ export const viewUserfollowingbyIdResponseSchema = z.object({ id: true, avatarUrl: true, username: true, - isSupporter: true, + plan: true, verified: true, displayName: true, }), diff --git a/src/v2/routes/user/get/id/[id]/route.ts b/src/v2/routes/user/get/id/[id]/route.ts index bd7913a..5434a2d 100644 --- a/src/v2/routes/user/get/id/[id]/route.ts +++ b/src/v2/routes/user/get/id/[id]/route.ts @@ -22,7 +22,7 @@ handler.openapi(getUserByIdRoute, async (ctx) => { verified: authUser.verified, bio: authUser.bio, dateJoined: authUser.dateJoined, - isSupporter: authUser.isSupporter, + plan: authUser.plan, role: authUser.role, }) .from(authUser) diff --git a/src/v2/routes/user/get/id/[id]/schema.ts b/src/v2/routes/user/get/id/[id]/schema.ts index 50a9d1c..7f0bc71 100644 --- a/src/v2/routes/user/get/id/[id]/schema.ts +++ b/src/v2/routes/user/get/id/[id]/schema.ts @@ -24,7 +24,7 @@ export const getUserByIdResponseSchema = z.object({ verified: true, bio: true, dateJoined: true, - isSupporter: true, + plan: true, role: true, }), }) diff --git a/src/v2/routes/user/get/username/[username]/route.ts b/src/v2/routes/user/get/username/[username]/route.ts index 775def3..08fe712 100644 --- a/src/v2/routes/user/get/username/[username]/route.ts +++ b/src/v2/routes/user/get/username/[username]/route.ts @@ -22,7 +22,7 @@ handler.openapi(getUserByNameRoute, async (ctx) => { verified: authUser.verified, bio: authUser.bio, dateJoined: authUser.dateJoined, - isSupporter: authUser.isSupporter, + plan: authUser.plan, role: authUser.role, }) .from(authUser) diff --git a/src/v2/routes/user/get/username/[username]/schema.ts b/src/v2/routes/user/get/username/[username]/schema.ts index d7def62..55c25ba 100644 --- a/src/v2/routes/user/get/username/[username]/schema.ts +++ b/src/v2/routes/user/get/username/[username]/schema.ts @@ -24,7 +24,7 @@ export const getUserByNameResponseSchema = z.object({ verified: true, bio: true, dateJoined: true, - isSupporter: true, + plan: true, role: true, }), }) diff --git a/src/v2/routes/user/search/username/[username]/route.ts b/src/v2/routes/user/search/username/[username]/route.ts index 4d792a9..5cc2334 100644 --- a/src/v2/routes/user/search/username/[username]/route.ts +++ b/src/v2/routes/user/search/username/[username]/route.ts @@ -22,7 +22,7 @@ handler.openapi(searchUsersByUsernameRoute, async (ctx) => { verified: authUser.verified, bio: authUser.bio, dateJoined: authUser.dateJoined, - isSupporter: authUser.isSupporter, + plan: authUser.plan, role: authUser.role, }) .from(authUser) diff --git a/src/v2/routes/user/search/username/[username]/schema.ts b/src/v2/routes/user/search/username/[username]/schema.ts index 3ff8bbc..27daaab 100644 --- a/src/v2/routes/user/search/username/[username]/schema.ts +++ b/src/v2/routes/user/search/username/[username]/schema.ts @@ -25,7 +25,7 @@ export const searchUsersByUsernameSchema = z.object({ verified: true, bio: true, dateJoined: true, - isSupporter: true, + plan: true, role: true, }) .array(), diff --git a/src/worker-configuration.d.ts b/src/worker-configuration.d.ts index a40d351..d174b07 100644 --- a/src/worker-configuration.d.ts +++ b/src/worker-configuration.d.ts @@ -16,6 +16,7 @@ declare global { DISCORD_REDIRECT_URI: string RESEND_API_KEY: string RATE_LIMITER: DurableObjectNamespace + REKOGNITION_LABEL_API_KEY: string } type Variables = { From cb6d078e7e29b7a137b6341f3369103c3f963f8d Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sat, 16 Mar 2024 17:44:53 +0000 Subject: [PATCH 263/318] update deps --- package.json | 10 +- pnpm-lock.yaml | 244 ++++++++++++++++++++++++------------------------- 2 files changed, 127 insertions(+), 127 deletions(-) diff --git a/package.json b/package.json index 7e7ef6f..35b0af7 100644 --- a/package.json +++ b/package.json @@ -20,8 +20,8 @@ }, "devDependencies": { "@asteasolutions/zod-to-openapi": "^6.4.0", - "@cloudflare/workers-types": "^4.20240312.0", - "@types/node": "^20.11.26", + "@cloudflare/workers-types": "^4.20240314.0", + "@types/node": "^20.11.28", "dotenv": "^16.4.5", "drizzle-kit": "^0.20.14", "eslint": "^8.57.0", @@ -29,7 +29,7 @@ "openapi-generator": "link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator", "tsx": "^4.7.1", "typescript": "^5.4.2", - "wrangler": "3.33.0" + "wrangler": "3.34.2" }, "private": true, "dependencies": { @@ -38,11 +38,11 @@ "@hono/zod-openapi": "^0.9.8", "@libsql/client": "0.5.6", "@lucia-auth/adapter-sqlite": "3.0.1", - "@scalar/hono-api-reference": "^0.4.1", + "@scalar/hono-api-reference": "^0.4.5", "@typescript-eslint/eslint-plugin": "^7.2.0", "better-sqlite3": "^9.4.3", "dayjs": "^1.11.10", - "drizzle-orm": "^0.30.1", + "drizzle-orm": "^0.30.2", "drizzle-zod": "^0.5.1", "hono": "^4.1.0", "lucia": "3.1.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 220a7ef..4825c7c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,8 +21,8 @@ dependencies: specifier: 3.0.1 version: 3.0.1(@libsql/client@0.5.6)(better-sqlite3@9.4.3)(lucia@3.1.1) "@scalar/hono-api-reference": - specifier: ^0.4.1 - version: 0.4.1(@scalar/use-codemirror@0.9.0)(hono@4.1.0)(postcss@8.4.35)(typescript@5.4.2)(unified@11.0.4)(vue@3.4.21)(yjs@13.6.14) + specifier: ^0.4.5 + version: 0.4.5(@scalar/use-codemirror@0.9.0)(hono@4.1.0)(postcss@8.4.35)(typescript@5.4.2)(unified@11.0.4)(vue@3.4.21)(yjs@13.6.14) "@typescript-eslint/eslint-plugin": specifier: ^7.2.0 version: 7.2.0(@typescript-eslint/parser@7.2.0)(eslint@8.57.0)(typescript@5.4.2) @@ -33,11 +33,11 @@ dependencies: specifier: ^1.11.10 version: 1.11.10 drizzle-orm: - specifier: ^0.30.1 - version: 0.30.1(@cloudflare/workers-types@4.20240312.0)(@libsql/client@0.5.6)(better-sqlite3@9.4.3) + specifier: ^0.30.2 + version: 0.30.2(@cloudflare/workers-types@4.20240314.0)(@libsql/client@0.5.6)(better-sqlite3@9.4.3) drizzle-zod: specifier: ^0.5.1 - version: 0.5.1(drizzle-orm@0.30.1)(zod@3.22.4) + version: 0.5.1(drizzle-orm@0.30.2)(zod@3.22.4) hono: specifier: ^4.1.0 version: 4.1.0 @@ -62,11 +62,11 @@ devDependencies: specifier: ^6.4.0 version: 6.4.0(zod@3.22.4) "@cloudflare/workers-types": - specifier: ^4.20240312.0 - version: 4.20240312.0 + specifier: ^4.20240314.0 + version: 4.20240314.0 "@types/node": - specifier: ^20.11.26 - version: 20.11.26 + specifier: ^20.11.28 + version: 20.11.28 dotenv: specifier: ^16.4.5 version: 16.4.5 @@ -89,8 +89,8 @@ devDependencies: specifier: ^5.4.2 version: 5.4.2 wrangler: - specifier: 3.33.0 - version: 3.33.0(@cloudflare/workers-types@4.20240312.0) + specifier: 3.34.2 + version: 3.34.2(@cloudflare/workers-types@4.20240314.0) packages: /@aashutoshrathi/word-wrap@1.2.6: @@ -253,16 +253,16 @@ packages: dev: true optional: true - /@cloudflare/workers-types@4.20240312.0: + /@cloudflare/workers-types@4.20240314.0: resolution: { - integrity: sha512-tpBNfijiXR/DSZkcUZHxP+80nIvKUWbGO2u4FBLudmJLGPhzgfoQ3tql+FeIhxYslSituMcVQNnJmWTF7FjURg==, + integrity: sha512-eg2dK/tYSiFvQu3sexjB32WEGi3GEmY6pLRF4nrV9Rwi2F2965o6f6604jQY8whhrmNdEoWErSjhuuUld6xgKQ==, } - /@codemirror/autocomplete@6.14.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.25.1)(@lezer/common@1.2.1): + /@codemirror/autocomplete@6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.0)(@lezer/common@1.2.1): resolution: { - integrity: sha512-Kx9BCSOLKmqNXEvmViuzsBQJ2VEa/wWwOATNpixOa+suttTV3rDnAUtAIt5ObAUFjXvZakWfFfF/EbxELnGLzQ==, + integrity: sha512-G2Zm0mXznxz97JhaaOdoEG2cVupn4JjPaS4AcNvZzhOsnnG9YVN68VzfoUw6dYTsIxT6a/cmoFEN47KAWhXaOg==, } peerDependencies: "@codemirror/language": ^6.0.0 @@ -272,7 +272,7 @@ packages: dependencies: "@codemirror/language": 6.10.1 "@codemirror/state": 6.4.1 - "@codemirror/view": 6.25.1 + "@codemirror/view": 6.26.0 "@lezer/common": 1.2.1 dev: false @@ -284,17 +284,17 @@ packages: dependencies: "@codemirror/language": 6.10.1 "@codemirror/state": 6.4.1 - "@codemirror/view": 6.25.1 + "@codemirror/view": 6.26.0 "@lezer/common": 1.2.1 dev: false - /@codemirror/lang-css@6.2.1(@codemirror/view@6.25.1): + /@codemirror/lang-css@6.2.1(@codemirror/view@6.26.0): resolution: { integrity: sha512-/UNWDNV5Viwi/1lpr/dIXJNWiwDxpw13I4pTUAsNxZdg6E0mI2kTQb0P2iHczg1Tu+H4EBgJR+hYhKiHKko7qg==, } dependencies: - "@codemirror/autocomplete": 6.14.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.25.1)(@lezer/common@1.2.1) + "@codemirror/autocomplete": 6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.0)(@lezer/common@1.2.1) "@codemirror/language": 6.10.1 "@codemirror/state": 6.4.1 "@lezer/common": 1.2.1 @@ -309,12 +309,12 @@ packages: integrity: sha512-tE2YK7wDlb9ZpAH6mpTPiYm6rhfdQKVDa5r9IwIFlwwgvVaKsCfuKKZoJGWsmMZIf3FQAuJ5CHMPLymOtg1hXw==, } dependencies: - "@codemirror/autocomplete": 6.14.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.25.1)(@lezer/common@1.2.1) - "@codemirror/lang-css": 6.2.1(@codemirror/view@6.25.1) + "@codemirror/autocomplete": 6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.0)(@lezer/common@1.2.1) + "@codemirror/lang-css": 6.2.1(@codemirror/view@6.26.0) "@codemirror/lang-javascript": 6.2.2 "@codemirror/language": 6.10.1 "@codemirror/state": 6.4.1 - "@codemirror/view": 6.25.1 + "@codemirror/view": 6.26.0 "@lezer/common": 1.2.1 "@lezer/css": 1.1.8 "@lezer/html": 1.3.9 @@ -326,11 +326,11 @@ packages: integrity: sha512-VGQfY+FCc285AhWuwjYxQyUQcYurWlxdKYT4bqwr3Twnd5wP5WSeu52t4tvvuWmljT4EmgEgZCqSieokhtY8hg==, } dependencies: - "@codemirror/autocomplete": 6.14.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.25.1)(@lezer/common@1.2.1) + "@codemirror/autocomplete": 6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.0)(@lezer/common@1.2.1) "@codemirror/language": 6.10.1 "@codemirror/lint": 6.5.0 "@codemirror/state": 6.4.1 - "@codemirror/view": 6.25.1 + "@codemirror/view": 6.26.0 "@lezer/common": 1.2.1 "@lezer/javascript": 1.4.13 dev: false @@ -345,13 +345,13 @@ packages: "@lezer/json": 1.0.2 dev: false - /@codemirror/lang-yaml@6.0.0(@codemirror/view@6.25.1): + /@codemirror/lang-yaml@6.0.0(@codemirror/view@6.26.0): resolution: { integrity: sha512-fVPapdX1oYr5HMC5bou1MHscGnNCvOHuhUW6C+V2gfIeIRcughvVfznV0OuUyHy0AdXoBCjOehjzFcmLRumu2Q==, } dependencies: - "@codemirror/autocomplete": 6.14.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.25.1)(@lezer/common@1.2.1) + "@codemirror/autocomplete": 6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.0)(@lezer/common@1.2.1) "@codemirror/language": 6.10.1 "@codemirror/state": 6.4.1 "@lezer/common": 1.2.1 @@ -367,7 +367,7 @@ packages: } dependencies: "@codemirror/state": 6.4.1 - "@codemirror/view": 6.25.1 + "@codemirror/view": 6.26.0 "@lezer/common": 1.2.1 "@lezer/highlight": 1.2.0 "@lezer/lr": 1.4.0 @@ -381,7 +381,7 @@ packages: } dependencies: "@codemirror/state": 6.4.1 - "@codemirror/view": 6.25.1 + "@codemirror/view": 6.26.0 crelt: 1.0.6 dev: false @@ -392,7 +392,7 @@ packages: } dependencies: "@codemirror/state": 6.4.1 - "@codemirror/view": 6.25.1 + "@codemirror/view": 6.26.0 crelt: 1.0.6 dev: false @@ -403,10 +403,10 @@ packages: } dev: false - /@codemirror/view@6.25.1: + /@codemirror/view@6.26.0: resolution: { - integrity: sha512-2LXLxsQnHDdfGzDvjzAwZh2ZviNJm7im6tGpa0IONIDnFd8RZ80D2SNi8PDi6YjKcMoMRK20v6OmKIdsrwsyoQ==, + integrity: sha512-nSSmzONpqsNzshPOxiKhK203R6BvABepugAe34QfQDbNDslyjkqBuKgrK5ZBvqNXpfxz5iLrlGTmEfhbQyH46A==, } dependencies: "@codemirror/state": 6.4.1 @@ -2549,7 +2549,7 @@ packages: "@nodelib/fs.scandir": 2.1.5 fastq: 1.17.1 - /@replit/codemirror-css-color-picker@6.1.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.25.1): + /@replit/codemirror-css-color-picker@6.1.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.0): resolution: { integrity: sha512-lkjtzOy8+C4VhuHegUfaqxsIsLVVW+FCRpKE+IOU4bX3Fp6Yo3sHS1PCHy1QlOtmL+Y+08Yb+giKuMXLyYzjew==, @@ -2561,7 +2561,7 @@ packages: dependencies: "@codemirror/language": 6.10.1 "@codemirror/state": 6.4.1 - "@codemirror/view": 6.25.1 + "@codemirror/view": 6.26.0 dev: false /@rollup/rollup-android-arm-eabi@4.13.0: @@ -2707,10 +2707,10 @@ packages: dev: false optional: true - /@scalar/api-client@1.0.0(@scalar/oas-utils@0.1.0)(typescript@5.4.2)(vue@3.4.21)(yjs@13.6.14): + /@scalar/api-client@1.0.2(@scalar/oas-utils@0.1.0)(typescript@5.4.2)(vue@3.4.21)(yjs@13.6.14): resolution: { - integrity: sha512-ZD1TP1k3AKuJQ15RAsWR7EKzKKqjAmyw+Ky/SUyr+GpJAg637IC0CGlALMg49NHKVcjPQA926Zo96T+18uVaTA==, + integrity: sha512-oKZWS1yXSEyv5A1Dn8SPps3qUu+SkEMV/2h7OUecjHFCmUEL6ndJn4RP+O/47435G0SkbllJrl34I/7tJ//Nzw==, } engines: { node: ">=18" } peerDependencies: @@ -2718,13 +2718,13 @@ packages: vue: ^3.3.0 dependencies: "@headlessui/vue": 1.7.19(vue@3.4.21) - "@scalar/components": 0.4.3(typescript@5.4.2)(vue@3.4.21) + "@scalar/components": 0.4.4(typescript@5.4.2)(vue@3.4.21) "@scalar/oas-utils": 0.1.0 - "@scalar/themes": 0.6.2(vue@3.4.21) + "@scalar/themes": 0.6.4(vue@3.4.21) "@scalar/use-codemirror": 0.9.0(vue@3.4.21)(yjs@13.6.14) "@scalar/use-modal": 0.2.9(@headlessui/vue@1.7.19)(vue@3.4.21) "@vueuse/core": 10.9.0(vue@3.4.21) - axios: 1.6.7 + axios: 1.6.8 content-type: 1.0.5 nanoid: 5.0.6 pretty-bytes: 6.1.1 @@ -2737,10 +2737,10 @@ packages: - yjs dev: false - /@scalar/api-reference@1.19.1(@scalar/use-codemirror@0.9.0)(postcss@8.4.35)(typescript@5.4.2)(unified@11.0.4)(vue@3.4.21)(yjs@13.6.14): + /@scalar/api-reference@1.19.5(@scalar/use-codemirror@0.9.0)(postcss@8.4.35)(typescript@5.4.2)(unified@11.0.4)(vue@3.4.21)(yjs@13.6.14): resolution: { - integrity: sha512-zbb2Xf+AovbB6VJgbnPLdhhXvPbxQCeVDNPXd7w3fe4CovVz7zncpiFaDr71aqG587p5Q5QkIZoIOnJwzMQRvg==, + integrity: sha512-DsBDRiGUlFnZdzJCLIHzZ392YYF6KXI2ElFV6chVCFMndNrdQwj7K+y/T0ivHH0jOZ89yKGqAcEJnA69O3A9Ow==, } engines: { node: ">=18" } peerDependencies: @@ -2749,20 +2749,20 @@ packages: dependencies: "@floating-ui/vue": 1.0.6(vue@3.4.21) "@headlessui/vue": 1.7.19(vue@3.4.21) - "@scalar/api-client": 1.0.0(@scalar/oas-utils@0.1.0)(typescript@5.4.2)(vue@3.4.21)(yjs@13.6.14) - "@scalar/components": 0.4.3(typescript@5.4.2)(vue@3.4.21) + "@scalar/api-client": 1.0.2(@scalar/oas-utils@0.1.0)(typescript@5.4.2)(vue@3.4.21)(yjs@13.6.14) + "@scalar/components": 0.4.4(typescript@5.4.2)(vue@3.4.21) "@scalar/oas-utils": 0.1.0 "@scalar/openapi-parser": 0.3.2 "@scalar/snippetz": 0.1.5 - "@scalar/swagger-editor": 1.0.0(@scalar/components@0.4.3)(@scalar/oas-utils@0.1.0)(@scalar/themes@0.6.2)(@scalar/use-codemirror@0.9.0)(@vueuse/core@10.9.0)(vue@3.4.21) - "@scalar/themes": 0.6.2(vue@3.4.21) + "@scalar/swagger-editor": 1.0.2(@scalar/components@0.4.4)(@scalar/oas-utils@0.1.0)(@scalar/themes@0.6.4)(@scalar/use-codemirror@0.9.0)(@vueuse/core@10.9.0)(vue@3.4.21) + "@scalar/themes": 0.6.4(vue@3.4.21) "@scalar/use-modal": 0.2.9(@headlessui/vue@1.7.19)(vue@3.4.21) "@scalar/use-tooltip": 0.5.12(vue@3.4.21) - "@unhead/schema": 1.8.14 + "@unhead/schema": 1.8.20 "@vcarl/remark-headings": 0.1.0 "@vueuse/core": 10.9.0(vue@3.4.21) "@xmldom/xmldom": 0.8.10 - axios: 1.6.7 + axios: 1.6.8 fuse.js: 6.6.2 github-slugger: 2.0.0 httpsnippet-lite: 3.0.5 @@ -2777,7 +2777,7 @@ packages: remark-parse: 11.0.0 remark-rehype: 11.1.0 remark-stringify: 11.0.0 - unhead: 1.8.14 + unhead: 1.8.20 unified: 11.0.4 vue: 3.4.21(typescript@5.4.2) vue-sonner: 1.1.2 @@ -2797,10 +2797,10 @@ packages: - yjs dev: false - /@scalar/components@0.4.3(typescript@5.4.2)(vue@3.4.21): + /@scalar/components@0.4.4(typescript@5.4.2)(vue@3.4.21): resolution: { - integrity: sha512-NnZQyXyKiJoL+KvdBcvon28ROqi/lLHmZaJlNNTK4zFKB37H+00FVPJduibhYHrzVmsrn+VjI35Llc34dyKoBQ==, + integrity: sha512-2q04mW1vY9/YH3r2Yp2wSHexf7YcoT5DBx3ThWZfoE2JDbRg58hiXqHwp3ePqLuIe/n6cnpcL29EWPQa12wFUA==, } engines: { node: ">=18" } peerDependencies: @@ -2820,16 +2820,16 @@ packages: - typescript dev: false - /@scalar/hono-api-reference@0.4.1(@scalar/use-codemirror@0.9.0)(hono@4.1.0)(postcss@8.4.35)(typescript@5.4.2)(unified@11.0.4)(vue@3.4.21)(yjs@13.6.14): + /@scalar/hono-api-reference@0.4.5(@scalar/use-codemirror@0.9.0)(hono@4.1.0)(postcss@8.4.35)(typescript@5.4.2)(unified@11.0.4)(vue@3.4.21)(yjs@13.6.14): resolution: { - integrity: sha512-Bk6/uH830rsIWASh2o0Wi3TfsX6Sdr083pE0Wv1Cyh7YnRW8RgUihFR4UXwV/GhjCPplGpj9VAKMCeCgvEnicQ==, + integrity: sha512-ckBwnP7tyyn11/f1miuZohChgKBDm9C5ngov4r4Ezn7+v0pP6xyLsDUvQPf8JQ72BdgrM9xqVqr3CKMkKhNo4w==, } engines: { node: ">=18" } peerDependencies: hono: ^3.0.0 || ^4.0.0 dependencies: - "@scalar/api-reference": 1.19.1(@scalar/use-codemirror@0.9.0)(postcss@8.4.35)(typescript@5.4.2)(unified@11.0.4)(vue@3.4.21)(yjs@13.6.14) + "@scalar/api-reference": 1.19.5(@scalar/use-codemirror@0.9.0)(postcss@8.4.35)(typescript@5.4.2)(unified@11.0.4)(vue@3.4.21)(yjs@13.6.14) hono: 4.1.0 transitivePeerDependencies: - "@scalar/use-codemirror" @@ -2867,7 +2867,7 @@ packages: engines: { node: ">=18" } dependencies: "@humanwhocodes/momoa": 3.0.1 - "@types/node": 20.11.26 + "@types/node": 20.11.28 ajv: 8.12.0 ajv-draft-04: 1.0.0(ajv@8.12.0) ajv-formats: 2.1.1(ajv@8.12.0) @@ -2875,7 +2875,7 @@ packages: jsonpointer: 5.0.1 leven: 4.0.0 openapi-types: 12.1.3 - vite: 5.1.6(@types/node@20.11.26) + vite: 5.1.6(@types/node@20.11.28) yaml: 2.4.1 transitivePeerDependencies: - less @@ -2934,32 +2934,32 @@ packages: "@scalar/snippetz-plugin-node-undici": 0.1.5 dev: false - /@scalar/swagger-editor@1.0.0(@scalar/components@0.4.3)(@scalar/oas-utils@0.1.0)(@scalar/themes@0.6.2)(@scalar/use-codemirror@0.9.0)(@vueuse/core@10.9.0)(vue@3.4.21): + /@scalar/swagger-editor@1.0.2(@scalar/components@0.4.4)(@scalar/oas-utils@0.1.0)(@scalar/themes@0.6.4)(@scalar/use-codemirror@0.9.0)(@vueuse/core@10.9.0)(vue@3.4.21): resolution: { - integrity: sha512-d2jfBrUlCfq5UQ/NzZaar23lKtJDubvJ9aDbulymYF0sTinGjI6Py5FiBhmoRXdobaerWbmVIoLCLwhY3rvOYQ==, + integrity: sha512-G7bIMyeiplnd8+v0MWzu0G89KJCLdy1R3E629MP2oJQRt833VZtMMWDkznLr9wbQM+XAYhMQf0RRf01OtTcWrw==, } engines: { node: ">=18" } peerDependencies: - "@scalar/components": 0.4.3 + "@scalar/components": 0.4.4 "@scalar/oas-utils": 0.1.0 - "@scalar/themes": 0.6.2 + "@scalar/themes": 0.6.4 "@scalar/use-codemirror": 0.9.0 "@vueuse/core": ^10.4.1 vue: ^3.3.0 dependencies: - "@scalar/components": 0.4.3(typescript@5.4.2)(vue@3.4.21) + "@scalar/components": 0.4.4(typescript@5.4.2)(vue@3.4.21) "@scalar/oas-utils": 0.1.0 - "@scalar/themes": 0.6.2(vue@3.4.21) + "@scalar/themes": 0.6.4(vue@3.4.21) "@scalar/use-codemirror": 0.9.0(vue@3.4.21)(yjs@13.6.14) "@vueuse/core": 10.9.0(vue@3.4.21) vue: 3.4.21(typescript@5.4.2) dev: false - /@scalar/themes@0.6.2(vue@3.4.21): + /@scalar/themes@0.6.4(vue@3.4.21): resolution: { - integrity: sha512-ZczOuImSC7pF/uiy7idiaweWrCsBt15DZS/FRXlA62mQiUXcgOV9ZuS/ifT4YI6vngSqdETVSJvjr/WKjQRbew==, + integrity: sha512-MNa0kaqKacSl9G8FKe3RNjIqYkBDLqOJBQVvn+DjelviVdfFAhfTf/o1KftQKJ1j+RIB1iXY+/JmSKEWA+RvgA==, } engines: { node: ">=18" } peerDependencies: @@ -2978,22 +2978,22 @@ packages: vue: ^3.3.0 yjs: ^13.6.0 dependencies: - "@codemirror/autocomplete": 6.14.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.25.1)(@lezer/common@1.2.1) - "@codemirror/lang-css": 6.2.1(@codemirror/view@6.25.1) + "@codemirror/autocomplete": 6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.0)(@lezer/common@1.2.1) + "@codemirror/lang-css": 6.2.1(@codemirror/view@6.26.0) "@codemirror/lang-html": 6.4.8 "@codemirror/lang-json": 6.0.1 - "@codemirror/lang-yaml": 6.0.0(@codemirror/view@6.25.1) + "@codemirror/lang-yaml": 6.0.0(@codemirror/view@6.26.0) "@codemirror/language": 6.10.1 "@codemirror/state": 6.4.1 - "@codemirror/view": 6.25.1 + "@codemirror/view": 6.26.0 "@lezer/common": 1.2.1 "@lezer/highlight": 1.2.0 "@lezer/lr": 1.4.0 - "@replit/codemirror-css-color-picker": 6.1.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.25.1) - "@uiw/codemirror-themes": 4.21.24(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.25.1) + "@replit/codemirror-css-color-picker": 6.1.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.0) + "@uiw/codemirror-themes": 4.21.24(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.0) codemirror: 6.0.1(@lezer/common@1.2.1) vue: 3.4.21(typescript@5.4.2) - y-codemirror.next: 0.3.2(@codemirror/state@6.4.1)(@codemirror/view@6.25.1)(yjs@13.6.14) + y-codemirror.next: 0.3.2(@codemirror/state@6.4.1)(@codemirror/view@6.26.0)(yjs@13.6.14) yjs: 13.6.14 dev: false @@ -3123,7 +3123,7 @@ packages: integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==, } dependencies: - "@types/node": 20.11.26 + "@types/node": 20.11.28 form-data: 4.0.0 dev: false @@ -3133,13 +3133,13 @@ packages: integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==, } dependencies: - "@types/node": 20.11.26 + "@types/node": 20.11.28 dev: true - /@types/node@20.11.26: + /@types/node@20.11.28: resolution: { - integrity: sha512-YwOMmyhNnAWijOBQweOJnQPl068Oqd4K3OFbTc6AHJwzweUwwWG3GIFY74OKks2PJUDkQPeddOQES9mLn1CTEQ==, + integrity: sha512-M/GPWVS2wLkSkNHVeLkrF2fD5Lx5UC4PxA0uZcKc6QqbIQUJyW1jVjueJYi1z8n0I5PxYrtpnPnWglE+y9A0KA==, } dependencies: undici-types: 5.26.5 @@ -3178,7 +3178,7 @@ packages: integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==, } dependencies: - "@types/node": 20.11.26 + "@types/node": 20.11.28 dev: false /@typescript-eslint/eslint-plugin@7.2.0(@typescript-eslint/parser@7.2.0)(eslint@8.57.0)(typescript@5.4.2): @@ -3337,7 +3337,7 @@ packages: eslint-visitor-keys: 3.4.3 dev: false - /@uiw/codemirror-themes@4.21.24(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.25.1): + /@uiw/codemirror-themes@4.21.24(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.0): resolution: { integrity: sha512-InY24KWP8YArDBACWHKFZ6ZU+WCvRHf3ZB2cCVxMVN35P1ANUmRzpAP2ernZQ5OIriL1/A/kXgD0Zg3Y65PNgg==, @@ -3349,7 +3349,7 @@ packages: dependencies: "@codemirror/language": 6.10.1 "@codemirror/state": 6.4.1 - "@codemirror/view": 6.25.1 + "@codemirror/view": 6.26.0 dev: false /@ungap/structured-clone@1.2.0: @@ -3358,33 +3358,33 @@ packages: integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==, } - /@unhead/dom@1.8.14: + /@unhead/dom@1.8.20: resolution: { - integrity: sha512-snh16hAT9spt9JW2ZSD3ar8V7k2EgiVIZ/iuZcbBCr9WfZosRRHROZHqo1l5hOaw8LH0jwbbhihHoYccF+qTJg==, + integrity: sha512-TXRQSVbqBOQc02m3wxgj55m93U8a3WBHV9xJi2zVX/iHEJgeQbZMJ+rV0YJkHy2OHAC0MfjVQA5NDLaVwtromw==, } dependencies: - "@unhead/schema": 1.8.14 - "@unhead/shared": 1.8.14 + "@unhead/schema": 1.8.20 + "@unhead/shared": 1.8.20 dev: false - /@unhead/schema@1.8.14: + /@unhead/schema@1.8.20: resolution: { - integrity: sha512-aM+syNezIXxCPJ99eG1WeONedfGXLAEGua3j+3+4GTjtH2T06E3SH6fcaHdfgjihnvMvo+C/lj2/rI6ShTVGLw==, + integrity: sha512-n0e5jsKino8JTHc4wpr4l8MXXIrj0muYYAEVa0WSYkIVnMiBr1Ik3l6elhCr4fdSyJ3M2DQQleea/oZCr11XCw==, } dependencies: hookable: 5.5.3 zhead: 2.2.4 dev: false - /@unhead/shared@1.8.14: + /@unhead/shared@1.8.20: resolution: { - integrity: sha512-ZuPfT7UKBIhb/E6+aVKPHwmAZUgja3YE4jc2p5K+eNTAGJD3MrNWmjRAA76ZUbKabdiYDr9/6mYWMdMWK0O87Q==, + integrity: sha512-J0fdtavcMtXcG0g9jmVW03toqfr8A0G7k+Q6jdpwuUPhWk/vhfZn3aiRV+F8LlU91c/AbGWDv8T1MrtMQbb0Sg==, } dependencies: - "@unhead/schema": 1.8.14 + "@unhead/schema": 1.8.20 dev: false /@vcarl/remark-headings@0.1.0: @@ -3673,13 +3673,13 @@ packages: } dev: false - /axios@1.6.7: + /axios@1.6.8: resolution: { - integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==, + integrity: sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==, } dependencies: - follow-redirects: 1.15.5 + follow-redirects: 1.15.6 form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -3717,10 +3717,10 @@ packages: prebuild-install: 7.1.2 dev: false - /binary-extensions@2.2.0: + /binary-extensions@2.3.0: resolution: { - integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==, + integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==, } engines: { node: ">=8" } dev: true @@ -3930,13 +3930,13 @@ packages: integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==, } dependencies: - "@codemirror/autocomplete": 6.14.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.25.1)(@lezer/common@1.2.1) + "@codemirror/autocomplete": 6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.0)(@lezer/common@1.2.1) "@codemirror/commands": 6.3.3 "@codemirror/language": 6.10.1 "@codemirror/lint": 6.5.0 "@codemirror/search": 6.5.6 "@codemirror/state": 6.4.1 - "@codemirror/view": 6.25.1 + "@codemirror/view": 6.26.0 transitivePeerDependencies: - "@lezer/common" dev: false @@ -4246,10 +4246,10 @@ packages: - supports-color dev: true - /drizzle-orm@0.30.1(@cloudflare/workers-types@4.20240312.0)(@libsql/client@0.5.6)(better-sqlite3@9.4.3): + /drizzle-orm@0.30.2(@cloudflare/workers-types@4.20240314.0)(@libsql/client@0.5.6)(better-sqlite3@9.4.3): resolution: { - integrity: sha512-5P6CXl4XyWtDDiYOX/jYOJp1HTUmBlXRAwaq+muUOgaSykMEy5sJesCxceMT0oCGvxeWkKfSXo5owLnfKwCIdw==, + integrity: sha512-DNd3djg03o+WxZX3pGD8YD+qrWT8gbrbhaZ2W0PVb6yH4rtM/VTB92cTGvumcRh7SSd2KfV0NWYDB70BHIXQTg==, } peerDependencies: "@aws-sdk/client-rds-data": ">=3" @@ -4323,12 +4323,12 @@ packages: sqlite3: optional: true dependencies: - "@cloudflare/workers-types": 4.20240312.0 + "@cloudflare/workers-types": 4.20240314.0 "@libsql/client": 0.5.6 better-sqlite3: 9.4.3 dev: false - /drizzle-zod@0.5.1(drizzle-orm@0.30.1)(zod@3.22.4): + /drizzle-zod@0.5.1(drizzle-orm@0.30.2)(zod@3.22.4): resolution: { integrity: sha512-C/8bvzUH/zSnVfwdSibOgFjLhtDtbKYmkbPbUCq46QZyZCH6kODIMSOgZ8R7rVjoI+tCj3k06MRJMDqsIeoS4A==, @@ -4337,7 +4337,7 @@ packages: drizzle-orm: ">=0.23.13" zod: "*" dependencies: - drizzle-orm: 0.30.1(@cloudflare/workers-types@4.20240312.0)(@libsql/client@0.5.6)(better-sqlite3@9.4.3) + drizzle-orm: 0.30.2(@cloudflare/workers-types@4.20240314.0)(@libsql/client@0.5.6)(better-sqlite3@9.4.3) zod: 3.22.4 dev: false @@ -4830,10 +4830,10 @@ packages: integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==, } - /follow-redirects@1.15.5: + /follow-redirects@1.15.6: resolution: { - integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==, + integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==, } engines: { node: ">=4.0" } peerDependencies: @@ -5381,7 +5381,7 @@ packages: } engines: { node: ">=8" } dependencies: - binary-extensions: 2.2.0 + binary-extensions: 2.3.0 dev: true /is-core-module@2.13.1: @@ -5562,10 +5562,10 @@ packages: prelude-ls: 1.2.1 type-check: 0.4.0 - /lib0@0.2.91: + /lib0@0.2.92: resolution: { - integrity: sha512-LRcTp8RmdHexL8olb7qErdROnJ2L6Js5Am99WQo0hiTRDWtk6vyUJJjTB6I/RcW8jwNQshM3NqH598DdhSOajA==, + integrity: sha512-cLaqTQmHqOY7hte7FazjG6h8KKR7S36I9FoEnK/RWtCmmwoZ4e8wDnMB1tkU0a54yf2l+SUNyR/jfKuBsXxVNw==, } engines: { node: ">=16" } hasBin: true @@ -6292,10 +6292,10 @@ packages: engines: { node: ">=10" } dev: false - /miniflare@3.20240304.1: + /miniflare@3.20240304.2: resolution: { - integrity: sha512-U9Br62mV//dI5IiNxGX3qOf6/3tVGsWe94TF+Hy23F5w41AwF+cIgbGW4/JAQQI1rY5uNNmMoS9jqIyoSdw06Q==, + integrity: sha512-yQ5TBKv7TlvF8khFvvH+1WWk8cBnaLgNzcbJ5DLQOdecxdDxUCVlN38HThd6Nhcz6EY+ckDkww8FkugUbSSpIQ==, } engines: { node: ">=16.13" } hasBin: true @@ -6650,13 +6650,13 @@ packages: postcss: ^8.2.14 dependencies: postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + postcss-selector-parser: 6.0.16 dev: false - /postcss-selector-parser@6.0.15: + /postcss-selector-parser@6.0.16: resolution: { - integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==, + integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==, } engines: { node: ">=4" } dependencies: @@ -7492,15 +7492,15 @@ packages: "@fastify/busboy": 2.1.1 dev: true - /unhead@1.8.14: + /unhead@1.8.20: resolution: { - integrity: sha512-yw2E89ORS0pjXk14ZXWfnCEuntGIR+dxQjLWLUBn7p1T7RuGJVdWFy4KJiIjQYzGfhjBexVscSG2s+Bt1BYTWA==, + integrity: sha512-IJOCYact/7Za3M7CeeCWs8Vze53kHvKDUy/EXtkTm/an5StgqOt2uCnS3HrkioIMKdHBpy/qtTc6E3BoGMOq7Q==, } dependencies: - "@unhead/dom": 1.8.14 - "@unhead/schema": 1.8.14 - "@unhead/shared": 1.8.14 + "@unhead/dom": 1.8.20 + "@unhead/schema": 1.8.20 + "@unhead/shared": 1.8.20 hookable: 5.5.3 dev: false @@ -7661,7 +7661,7 @@ packages: vfile-message: 4.0.2 dev: false - /vite@5.1.6(@types/node@20.11.26): + /vite@5.1.6(@types/node@20.11.28): resolution: { integrity: sha512-yYIAZs9nVfRJ/AiOLCA91zzhjsHUgMjB+EigzFb6W2XTLO8JixBCKCjvhKZaye+NKYHCrkv3Oh50dH9EdLU2RA==, @@ -7692,7 +7692,7 @@ packages: terser: optional: true dependencies: - "@types/node": 20.11.26 + "@types/node": 20.11.28 esbuild: 0.19.12 postcss: 8.4.35 rollup: 4.13.0 @@ -7824,10 +7824,10 @@ packages: "@cloudflare/workerd-windows-64": 1.20240304.0 dev: true - /wrangler@3.33.0(@cloudflare/workers-types@4.20240312.0): + /wrangler@3.34.2(@cloudflare/workers-types@4.20240314.0): resolution: { - integrity: sha512-1A8frPJSUQjkWAN4XhbykpEtqmfDYdTWPKlc4rTchNrERLwqHF87aCYblP4m5Wm43w4eVL+H4hGUgE2TySk9MA==, + integrity: sha512-j580WXlOe0GtYdcREym7FLcaaZq9+RZEBuzOtKXx74KKUlEC8cglgf5WWa2C2OpEtJCcrAieEHsNXe7mhy9knA==, } engines: { node: ">=16.17.0" } hasBin: true @@ -7838,13 +7838,13 @@ packages: optional: true dependencies: "@cloudflare/kv-asset-handler": 0.3.1 - "@cloudflare/workers-types": 4.20240312.0 + "@cloudflare/workers-types": 4.20240314.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.6.0 esbuild: 0.17.19 - miniflare: 3.20240304.1 + miniflare: 3.20240304.2 nanoid: 3.3.7 path-to-regexp: 6.2.1 resolve: 1.22.8 @@ -7888,7 +7888,7 @@ packages: } dev: true - /y-codemirror.next@0.3.2(@codemirror/state@6.4.1)(@codemirror/view@6.25.1)(yjs@13.6.14): + /y-codemirror.next@0.3.2(@codemirror/state@6.4.1)(@codemirror/view@6.26.0)(yjs@13.6.14): resolution: { integrity: sha512-3ksMXoietzNkrgluG9ut+5q4PNHCS6sQ+mHd44hNX1s7TBe4iDgOOIswfY3oLsdamZLAUPr+TnRdYgYuNDs7Qg==, @@ -7899,8 +7899,8 @@ packages: yjs: ^13.5.6 dependencies: "@codemirror/state": 6.4.1 - "@codemirror/view": 6.25.1 - lib0: 0.2.91 + "@codemirror/view": 6.26.0 + lib0: 0.2.92 yjs: 13.6.14 dev: false @@ -7925,7 +7925,7 @@ packages: } engines: { node: ">=16.0.0", npm: ">=8.0.0" } dependencies: - lib0: 0.2.91 + lib0: 0.2.92 dev: false /yocto-queue@0.1.0: From 284713cdb6808513d38f703bffca8af8151b4293 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sat, 16 Mar 2024 23:36:08 +0000 Subject: [PATCH 264/318] asset comment schema --- src/v2/db/drizzle.ts | 1 + src/v2/db/schema.ts | 1 + src/v2/db/schema/asset/asset-comments.ts | 60 ++++++++++++++++++++++++ src/v2/db/schema/asset/asset.ts | 2 + src/v2/db/schema/user/user.ts | 2 + 5 files changed, 66 insertions(+) create mode 100644 src/v2/db/schema/asset/asset-comments.ts diff --git a/src/v2/db/drizzle.ts b/src/v2/db/drizzle.ts index 8d31414..f978472 100644 --- a/src/v2/db/drizzle.ts +++ b/src/v2/db/drizzle.ts @@ -8,6 +8,7 @@ export const tableNames = { userBlocked: "userBlocked", gameAssetCategory: "gameAssetCategory", assetLikes: "assetLikes", + assetComments: "assetComments", userCollectionLikes: "userCollectionLikes", userCollectionCollaborators: "userCollectionCollaborators", game: "game", diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index b163137..22e9967 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -1,4 +1,5 @@ export * from "./schema/asset/asset" +export * from "./schema/asset/asset-comments" export * from "./schema/asset/asset-external-files" export * from "./schema/asset/asset-likes" diff --git a/src/v2/db/schema/asset/asset-comments.ts b/src/v2/db/schema/asset/asset-comments.ts new file mode 100644 index 0000000..4e15d77 --- /dev/null +++ b/src/v2/db/schema/asset/asset-comments.ts @@ -0,0 +1,60 @@ +import { tableNames } from "@/v2/db/drizzle" +import { relations } from "drizzle-orm" +import { + sqliteTable, + text, + // uniqueIndex, + index, + integer, +} from "drizzle-orm/sqlite-core" +import { authUser } from "../user/user" +import { asset } from "./asset" +import { createInsertSchema, createSelectSchema } from "drizzle-zod" + +export const assetComments = sqliteTable( + tableNames.assetComments, + { + assetId: integer("asset_id") + .notNull() + .references(() => asset.id), + commentedById: text("liked_by_id") + .notNull() + .references(() => authUser.id), + comment: text("comment").notNull(), + createdAt: text("created_at") + .notNull() + .$defaultFn(() => { + return new Date().toISOString() + }), + editedAt: text("edited_at").default(null), + }, + (assetComments) => { + return { + assetIdx: index("assetcomments_asset_idx").on( + assetComments.assetId + ), + commentedByIdx: index("assetcomments_commented_by_idx").on( + assetComments.commentedById + ), + } + } +) + +export type AssetComments = typeof assetComments.$inferSelect +export type NewAssetComments = typeof assetComments.$inferInsert + +export const insertAssetCommentsSchema = createInsertSchema(assetComments) +export const selectAssetCommentsSchema = createSelectSchema(assetComments) + +export const assetCommentsRelations = relations(assetComments, ({ one }) => ({ + asset: one(asset, { + fields: [assetComments.assetId], + references: [asset.id], + relationName: "assetcomments_asset", + }), + commentedBy: one(authUser, { + fields: [assetComments.commentedById], + references: [authUser.id], + relationName: "assetcomments_commented_by", + }), +})) diff --git a/src/v2/db/schema/asset/asset.ts b/src/v2/db/schema/asset/asset.ts index 5f4fdd2..94087a0 100644 --- a/src/v2/db/schema/asset/asset.ts +++ b/src/v2/db/schema/asset/asset.ts @@ -14,6 +14,7 @@ import { assetTagAsset } from "../tags/asset-tags" import { createInsertSchema, createSelectSchema } from "drizzle-zod" import { assetLikes } from "./asset-likes" import { assetExternalFile } from "./asset-external-files" +import { assetComments } from "./asset-comments" /* NOTE: Assets have a lot of relations, and can be quite complex in some cases. @@ -100,6 +101,7 @@ export const assetRelations = relations(asset, ({ one, many }) => ({ assetTagAsset: many(assetTagAsset), assetExternalFile: many(assetExternalFile), assetLikes: many(assetLikes), + assetComments: many(assetComments), authUser: one(authUser, { fields: [asset.uploadedById, asset.uploadedByName], references: [authUser.id, authUser.username], diff --git a/src/v2/db/schema/user/user.ts b/src/v2/db/schema/user/user.ts index 5a81921..825714a 100644 --- a/src/v2/db/schema/user/user.ts +++ b/src/v2/db/schema/user/user.ts @@ -25,6 +25,7 @@ import { assetTagLikes } from "../tags/asset-tags-likes" import { assetCategoryLikes } from "../categories/asset-categories-likes" import { requestForm, requestFormUpvotes } from "../supporter/request-form" import { userBlocked } from "./user-blocked" +import { assetComments } from "../asset/asset-comments" /* NOTE: Very basic user information @@ -209,6 +210,7 @@ export const usersRelations = relations(authUser, ({ one, many }) => ({ userFavorite: one(userFavorite), userCollectionLikes: many(userCollectionLikes), assetLikes: many(assetLikes), + assetComments: many(assetComments), socialsConnection: one(socialsConnection), userCollection: many(userCollection), stripeUser: one(stripeUser), From 4b3149b509d58b12d1dd32f0cdc968ba0a8562bb Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 17 Mar 2024 00:29:21 +0000 Subject: [PATCH 265/318] test nested asset comments + impl likes schema --- src/v2/db/drizzle.ts | 1 + src/v2/db/schema/asset/asset-comments.ts | 71 +++++++++++++++++++++++- src/v2/db/schema/asset/asset-likes.ts | 2 +- 3 files changed, 70 insertions(+), 4 deletions(-) diff --git a/src/v2/db/drizzle.ts b/src/v2/db/drizzle.ts index f978472..3d723be 100644 --- a/src/v2/db/drizzle.ts +++ b/src/v2/db/drizzle.ts @@ -9,6 +9,7 @@ export const tableNames = { gameAssetCategory: "gameAssetCategory", assetLikes: "assetLikes", assetComments: "assetComments", + assetCommentsLikes: "assetCommentsLikes", userCollectionLikes: "userCollectionLikes", userCollectionCollaborators: "userCollectionCollaborators", game: "game", diff --git a/src/v2/db/schema/asset/asset-comments.ts b/src/v2/db/schema/asset/asset-comments.ts index 4e15d77..c7023a7 100644 --- a/src/v2/db/schema/asset/asset-comments.ts +++ b/src/v2/db/schema/asset/asset-comments.ts @@ -10,13 +10,23 @@ import { import { authUser } from "../user/user" import { asset } from "./asset" import { createInsertSchema, createSelectSchema } from "drizzle-zod" +import { generateID } from "@/v2/lib/oslo" export const assetComments = sqliteTable( tableNames.assetComments, { - assetId: integer("asset_id") + id: text("comment_id") + .primaryKey() .notNull() + .$defaultFn(() => { + return generateID() + }), + assetId: integer("asset_id") + .default(null) .references(() => asset.id), + parentCommentId: text("parent_comment_id") + .default(null) + .references(() => assetComments.id), commentedById: text("liked_by_id") .notNull() .references(() => authUser.id), @@ -33,6 +43,9 @@ export const assetComments = sqliteTable( assetIdx: index("assetcomments_asset_idx").on( assetComments.assetId ), + parentCommentIdx: index("assetcomments_parent_comment_idx").on( + assetComments.parentCommentId + ), commentedByIdx: index("assetcomments_commented_by_idx").on( assetComments.commentedById ), @@ -46,15 +59,67 @@ export type NewAssetComments = typeof assetComments.$inferInsert export const insertAssetCommentsSchema = createInsertSchema(assetComments) export const selectAssetCommentsSchema = createSelectSchema(assetComments) +export const assetCommentsLikes = sqliteTable( + tableNames.assetCommentsLikes, + { + commentId: text("comment_id") + .notNull() + .references(() => assetComments.id), + likedById: text("liked_by_id") + .notNull() + .references(() => authUser.id), + createdAt: text("created_at") + .notNull() + .$defaultFn(() => { + return new Date().toISOString() + }), + }, + (assetCommentsLikes) => { + return { + commentIdx: index("assetcommentslikes_comment_idx").on( + assetCommentsLikes.commentId + ), + likedByIdx: index("assetcommentslikes_liked_by_idx").on( + assetCommentsLikes.likedById + ), + } + } +) + +export type AssetCommentsLikes = typeof assetCommentsLikes.$inferSelect +export type NewAssetCommentsLikes = typeof assetCommentsLikes.$inferInsert + +export const insertAssetCommentsLikesSchema = + createInsertSchema(assetCommentsLikes) +export const selectAssetCommentsLikesSchema = + createSelectSchema(assetCommentsLikes) + +// not too sure about this export const assetCommentsRelations = relations(assetComments, ({ one }) => ({ asset: one(asset, { fields: [assetComments.assetId], references: [asset.id], - relationName: "assetcomments_asset", + relationName: "asset_comments_asset", }), commentedBy: one(authUser, { fields: [assetComments.commentedById], references: [authUser.id], - relationName: "assetcomments_commented_by", + relationName: "asset_comments_commented_by", }), })) + +export const assetCommentsLikesRelations = relations( + assetComments, + ({ one }) => ({ + asset: one(asset, { + fields: [assetComments.assetId], + references: [asset.id], + relationName: "asset_comments_asset", + }), + commentedBy: one(authUser, { + fields: [assetComments.commentedById], + references: [authUser.id], + relationName: "asset_comments_commented_by", + }), + }) +) diff --git a/src/v2/db/schema/asset/asset-likes.ts b/src/v2/db/schema/asset/asset-likes.ts index 2786987..b6d4ab4 100644 --- a/src/v2/db/schema/asset/asset-likes.ts +++ b/src/v2/db/schema/asset/asset-likes.ts @@ -41,7 +41,7 @@ export type NewAssetLikes = typeof assetLikes.$inferInsert export const insertAssetLikesSchema = createInsertSchema(assetLikes) export const selectAssetLikesSchema = createSelectSchema(assetLikes) -export const assetNetworkingRelations = relations(assetLikes, ({ one }) => ({ +export const assetLikesRelations = relations(assetLikes, ({ one }) => ({ asset: one(asset, { fields: [assetLikes.assetId], references: [asset.id], From 46a397d2705d8bda4aac9df9452d0f956238403f Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 17 Mar 2024 01:03:18 +0000 Subject: [PATCH 266/318] upd reference & self nesting fix, new seed data :3 --- src/scripts/seed/seed.ts | 92 +++++++++++++++++++ src/v2/db/drizzle.ts | 2 - src/v2/db/schema/asset/asset-comments.ts | 33 +++++-- src/v2/db/schema/asset/asset-likes.ts | 10 +- .../categories/asset-categories-likes.ts | 10 +- .../collections/user-collection-likes.ts | 10 +- src/v2/db/schema/game/game-likes.ts | 10 +- src/v2/db/schema/user/user-following.ts | 10 +- 8 files changed, 156 insertions(+), 21 deletions(-) diff --git a/src/scripts/seed/seed.ts b/src/scripts/seed/seed.ts index ce18f81..23b76c7 100644 --- a/src/scripts/seed/seed.ts +++ b/src/scripts/seed/seed.ts @@ -16,6 +16,8 @@ import { userFollowing, requestFormUpvotes, requestForm, + assetComments, + assetCommentsLikes, } from "@/v2/db/schema" import { Scrypt } from "lucia" import "dotenv/config" @@ -397,6 +399,96 @@ async function main() { `[SEED] [assetTagAsset] inserted ${newAssetTagAsset.length} rows\n` ) + console.log("[SEED] [assetComments] Seeding asset comments...") + const newAssetComments = await db + .insert(assetComments) + .values([ + { + assetId: newAssets[0].id, + commentedById: newUsers[0].id, + comment: "test comment", + }, + { + assetId: newAssets[0].id, + commentedById: newUsers[1].id, + comment: "test comment 2", + }, + { + assetId: newAssets[1].id, + commentedById: newUsers[0].id, + comment: "test comment 3", + }, + ]) + .returning() + console.log( + `[SEED] [assetComments] inserted ${newAssetComments.length} rows\n` + ) + + console.log( + "[SEED] [assetComments] Seeding replies to comments [self ref]..." + ) + const newAssetCommentsReplies = await db + .insert(assetComments) + .values([ + { + commentedById: newUsers[1].id, + comment: "test comment reply", + parentCommentId: newAssetComments[0].id, + }, + { + commentedById: newUsers[0].id, + comment: "test comment reply 2", + parentCommentId: newAssetComments[1].id, + }, + { + commentedById: newUsers[1].id, + comment: "test comment reply 3", + parentCommentId: newAssetComments[2].id, + }, + ]) + .returning() + console.log( + `[SEED] [assetComments] inserted ${newAssetCommentsReplies.length} rows\n` + ) + + console.log( + "[SEED] [assetCommentsLikes] Seeding asset comments likes..." + ) + const newAssetCommentsLikes = await db + .insert(assetCommentsLikes) + .values([ + { + commentId: newAssetComments[0].id, + likedById: newUsers[1].id, + }, + { + commentId: newAssetComments[1].id, + likedById: newUsers[0].id, + }, + { + commentId: newAssetComments[2].id, + likedById: newUsers[1].id, + }, + { + commentId: newAssetCommentsReplies[0].id, + likedById: newUsers[0].id, + }, + { + commentId: newAssetCommentsReplies[1].id, + likedById: newUsers[1].id, + }, + { + commentId: newAssetCommentsReplies[2].id, + likedById: newUsers[0].id, + } + ]) + .returning() + console.log( + `[SEED] [assetCommentsLikes] inserted ${newAssetCommentsLikes.length} rows\n` + ) + + + console.log("[SEED] [userCollection] Seeding user collections...") const newUserCollections = await db .insert(userCollection) diff --git a/src/v2/db/drizzle.ts b/src/v2/db/drizzle.ts index 3d723be..0ce3ee5 100644 --- a/src/v2/db/drizzle.ts +++ b/src/v2/db/drizzle.ts @@ -15,8 +15,6 @@ export const tableNames = { game: "game", gameLikes: "gameLikes", stripeUser: "stripeUser", - // atlas: "atlas", - // atlasToAsset: "atlasToAsset", assetExternalFile: "assetExternalFile", assetTag: "assetTag", assetTagLikes: "assetTagLikes", diff --git a/src/v2/db/schema/asset/asset-comments.ts b/src/v2/db/schema/asset/asset-comments.ts index c7023a7..f9d491d 100644 --- a/src/v2/db/schema/asset/asset-comments.ts +++ b/src/v2/db/schema/asset/asset-comments.ts @@ -6,6 +6,7 @@ import { // uniqueIndex, index, integer, + foreignKey, } from "drizzle-orm/sqlite-core" import { authUser } from "../user/user" import { asset } from "./asset" @@ -21,15 +22,18 @@ export const assetComments = sqliteTable( .$defaultFn(() => { return generateID() }), - assetId: integer("asset_id") - .default(null) - .references(() => asset.id), - parentCommentId: text("parent_comment_id") - .default(null) - .references(() => assetComments.id), + assetId: integer("asset_id").references(() => asset.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + // typescript limitations means that the type will be set as `any` if we self reference, so we create FK manually + parentCommentId: text("parent_comment_id"), commentedById: text("liked_by_id") .notNull() - .references(() => authUser.id), + .references(() => authUser.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), comment: text("comment").notNull(), createdAt: text("created_at") .notNull() @@ -40,6 +44,11 @@ export const assetComments = sqliteTable( }, (assetComments) => { return { + parentCommentFk: foreignKey({ + name: "self_reference_parent_comment_id", + columns: [assetComments.parentCommentId], + foreignColumns: [assetComments.id], + }), assetIdx: index("assetcomments_asset_idx").on( assetComments.assetId ), @@ -64,10 +73,16 @@ export const assetCommentsLikes = sqliteTable( { commentId: text("comment_id") .notNull() - .references(() => assetComments.id), + .references(() => assetComments.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), likedById: text("liked_by_id") .notNull() - .references(() => authUser.id), + .references(() => authUser.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), createdAt: text("created_at") .notNull() .$defaultFn(() => { diff --git a/src/v2/db/schema/asset/asset-likes.ts b/src/v2/db/schema/asset/asset-likes.ts index b6d4ab4..9fe6dcd 100644 --- a/src/v2/db/schema/asset/asset-likes.ts +++ b/src/v2/db/schema/asset/asset-likes.ts @@ -16,10 +16,16 @@ export const assetLikes = sqliteTable( { assetId: integer("asset_id") .notNull() - .references(() => asset.id), + .references(() => asset.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), likedById: text("liked_by_id") .notNull() - .references(() => authUser.id), + .references(() => authUser.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), createdAt: text("created_at") .notNull() .$defaultFn(() => { diff --git a/src/v2/db/schema/categories/asset-categories-likes.ts b/src/v2/db/schema/categories/asset-categories-likes.ts index 0219cb6..cc0bc7f 100644 --- a/src/v2/db/schema/categories/asset-categories-likes.ts +++ b/src/v2/db/schema/categories/asset-categories-likes.ts @@ -10,10 +10,16 @@ export const assetCategoryLikes = sqliteTable( { assetCategoryId: text("asset_id") .notNull() - .references(() => assetCategory.id), + .references(() => assetCategory.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), likedById: text("liked_by_id") .notNull() - .references(() => authUser.id), + .references(() => authUser.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), createdAt: text("created_at") .notNull() .$defaultFn(() => { diff --git a/src/v2/db/schema/collections/user-collection-likes.ts b/src/v2/db/schema/collections/user-collection-likes.ts index 82bea97..bc9518b 100644 --- a/src/v2/db/schema/collections/user-collection-likes.ts +++ b/src/v2/db/schema/collections/user-collection-likes.ts @@ -15,10 +15,16 @@ export const userCollectionLikes = sqliteTable( { collectionId: text("collection_id") .notNull() - .references(() => userCollection.id), + .references(() => userCollection.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), likedById: text("liked_by_id") .notNull() - .references(() => authUser.id), + .references(() => authUser.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), createdAt: text("createdAt") .notNull() .$defaultFn(() => { diff --git a/src/v2/db/schema/game/game-likes.ts b/src/v2/db/schema/game/game-likes.ts index c5b21c6..db396c8 100644 --- a/src/v2/db/schema/game/game-likes.ts +++ b/src/v2/db/schema/game/game-likes.ts @@ -10,10 +10,16 @@ export const gameLikes = sqliteTable( { gameId: text("asset_id") .notNull() - .references(() => game.id), + .references(() => game.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), likedById: text("liked_by_id") .notNull() - .references(() => authUser.id), + .references(() => authUser.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), createdAt: text("created_at") .notNull() .$defaultFn(() => { diff --git a/src/v2/db/schema/user/user-following.ts b/src/v2/db/schema/user/user-following.ts index c4c5621..a95f244 100644 --- a/src/v2/db/schema/user/user-following.ts +++ b/src/v2/db/schema/user/user-following.ts @@ -19,10 +19,16 @@ export const userFollowing = sqliteTable( { followerId: text("followerId") .notNull() - .references(() => authUser.id), + .references(() => authUser.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), followingId: text("followingId") .notNull() - .references(() => authUser.id), + .references(() => authUser.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), createdAt: text("createdAt") .notNull() .$defaultFn(() => { From 73f87dd1b3d46b0839ecba4f51e069ade4565630 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 17 Mar 2024 01:51:06 +0000 Subject: [PATCH 267/318] fix incorrect relations --- src/scripts/seed/seed.ts | 12 ++++-------- src/v2/db/schema/asset/asset-comments.ts | 16 ++++++++-------- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/src/scripts/seed/seed.ts b/src/scripts/seed/seed.ts index 23b76c7..3d384be 100644 --- a/src/scripts/seed/seed.ts +++ b/src/scripts/seed/seed.ts @@ -447,13 +447,11 @@ async function main() { }, ]) .returning() - console.log( - `[SEED] [assetComments] inserted ${newAssetCommentsReplies.length} rows\n` - ) - console.log( - "[SEED] [assetCommentsLikes] Seeding asset comments likes..." + `[SEED] [assetComments] inserted ${newAssetCommentsReplies.length} rows\n` ) + + console.log("[SEED] [assetCommentsLikes] Seeding asset comments likes...") const newAssetCommentsLikes = await db .insert(assetCommentsLikes) .values([ @@ -480,15 +478,13 @@ async function main() { { commentId: newAssetCommentsReplies[2].id, likedById: newUsers[0].id, - } + }, ]) .returning() console.log( `[SEED] [assetCommentsLikes] inserted ${newAssetCommentsLikes.length} rows\n` ) - - console.log("[SEED] [userCollection] Seeding user collections...") const newUserCollections = await db .insert(userCollection) diff --git a/src/v2/db/schema/asset/asset-comments.ts b/src/v2/db/schema/asset/asset-comments.ts index f9d491d..c33b1b5 100644 --- a/src/v2/db/schema/asset/asset-comments.ts +++ b/src/v2/db/schema/asset/asset-comments.ts @@ -124,17 +124,17 @@ export const assetCommentsRelations = relations(assetComments, ({ one }) => ({ })) export const assetCommentsLikesRelations = relations( - assetComments, + assetCommentsLikes, ({ one }) => ({ - asset: one(asset, { - fields: [assetComments.assetId], - references: [asset.id], - relationName: "asset_comments_asset", + comment: one(assetComments, { + fields: [assetCommentsLikes.commentId], + references: [assetComments.id], + relationName: "asset_comments_likes_comment", }), - commentedBy: one(authUser, { - fields: [assetComments.commentedById], + likedBy: one(authUser, { + fields: [assetCommentsLikes.likedById], references: [authUser.id], - relationName: "asset_comments_commented_by", + relationName: "asset_comments_likes_liked_by", }), }) ) From f0e4114bb4b3f1b32a4497c1b37773ed9bcf04aa Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 17 Mar 2024 01:58:15 +0000 Subject: [PATCH 268/318] rm american english --- src/scripts/seed/seed.ts | 28 ++-- src/v2/db/drizzle.ts | 4 +- src/v2/db/schema.ts | 2 +- src/v2/db/schema/asset/asset.ts | 2 +- src/v2/db/schema/user/user-favorites.ts | 123 ------------------ src/v2/db/schema/user/user-favourites.ts | 123 ++++++++++++++++++ src/v2/db/schema/user/user.ts | 4 +- .../lib/managers/favorite/favorite-manager.ts | 120 ++++++++--------- 8 files changed, 203 insertions(+), 203 deletions(-) delete mode 100644 src/v2/db/schema/user/user-favorites.ts create mode 100644 src/v2/db/schema/user/user-favourites.ts diff --git a/src/scripts/seed/seed.ts b/src/scripts/seed/seed.ts index 3d384be..3b8ad94 100644 --- a/src/scripts/seed/seed.ts +++ b/src/scripts/seed/seed.ts @@ -11,8 +11,8 @@ import { gameAssetCategory, userCollection, userCollectionAsset, - userFavorite, - userFavoriteAsset, + userFavourite, + userFavouriteAsset, userFollowing, requestFormUpvotes, requestForm, @@ -519,10 +519,10 @@ async function main() { `[SEED] [userCollectionAsset] inserted ${newUserCollectionAssets.length} rows\n` ) - // only one user favorite per user - console.log("[SEED] [userFavorite] Seeding user favorites...") - const newUserFavorites = await db - .insert(userFavorite) + // only one user favourite per user + console.log("[SEED] [userFavourite] Seeding user favourites...") + const newUserFavourites = await db + .insert(userFavourite) .values([ { userId: newUsers[0].id, @@ -534,31 +534,31 @@ async function main() { ]) .returning() console.log( - `[SEED] [userFavorite] inserted ${newUserFavorites.length} rows\n` + `[SEED] [userFavourite] inserted ${newUserFavourites.length} rows\n` ) console.log( - "[SEED] [userFavoriteAsset] Linking user favorites to assets..." + "[SEED] [userFavouriteAsset] Linking user favourites to assets..." ) - const newUserFavoriteAssets = await db - .insert(userFavoriteAsset) + const newUserFavouriteAssets = await db + .insert(userFavouriteAsset) .values([ { - userFavoriteId: newUserFavorites[0].id, + userFavouriteId: newUserFavourites[0].id, assetId: newAssets[0].id, }, { - userFavoriteId: newUserFavorites[0].id, + userFavouriteId: newUserFavourites[0].id, assetId: newAssets[1].id, }, { - userFavoriteId: newUserFavorites[1].id, + userFavouriteId: newUserFavourites[1].id, assetId: newAssets[2].id, }, ]) .returning() console.log( - `[SEED] [userFavoriteAsset] inserted ${newUserFavoriteAssets.length} rows\n` + `[SEED] [userFavouriteAsset] inserted ${newUserFavouriteAssets.length} rows\n` ) console.log("[SEED] Seeded database successfully") diff --git a/src/v2/db/drizzle.ts b/src/v2/db/drizzle.ts index 0ce3ee5..c4be020 100644 --- a/src/v2/db/drizzle.ts +++ b/src/v2/db/drizzle.ts @@ -23,8 +23,8 @@ export const tableNames = { passwordResetToken: "passwordResetToken", assetCategory: "assetCategory", assetCategoryLikes: "assetCategoryLikes", - userFavorite: "userFavorite", - userFavoriteAsset: "userFavoriteAsset", + userFavourite: "userFavourite", + userFavouriteAsset: "userFavouriteAsset", userCollection: "userCollection", userCollectionAsset: "userCollectionAsset", socialsConnection: "socialsConnection", diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index 22e9967..068e9e7 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -16,7 +16,7 @@ export * from "./schema/user/user" export * from "./schema/user/user-attributes" export * from "./schema/collections/user-collections" export * from "./schema/user/user-connections" -export * from "./schema/user/user-favorites" +export * from "./schema/user/user-favourites" export * from "./schema/user/user-following" export * from "./schema/user/user-blocked" diff --git a/src/v2/db/schema/asset/asset.ts b/src/v2/db/schema/asset/asset.ts index 94087a0..e9c63a4 100644 --- a/src/v2/db/schema/asset/asset.ts +++ b/src/v2/db/schema/asset/asset.ts @@ -23,7 +23,7 @@ NOTE: Assets have a lot of relations, and can be quite complex in some cases. - AssetCategory: Linked to the category the asset is in, e.g "charcter sheets" - Game: Linked to the game the asset is for, e.g "genshin-impact" -Then, they are also used as relations when adding to collections or favorites. +Then, they are also used as relations when adding to collections or favourites. */ export type AssetStatus = "pending" | "approved" | "rejected" diff --git a/src/v2/db/schema/user/user-favorites.ts b/src/v2/db/schema/user/user-favorites.ts deleted file mode 100644 index 23eabf8..0000000 --- a/src/v2/db/schema/user/user-favorites.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { tableNames } from "@/v2/db/drizzle" -import { relations } from "drizzle-orm" -import { - sqliteTable, - text, - integer, - // uniqueIndex, - index, -} from "drizzle-orm/sqlite-core" -import { authUser } from "./user" -import { asset } from "../asset/asset" -import { createInsertSchema, createSelectSchema } from "drizzle-zod" -import { generateID } from "@/v2/lib/oslo" - -/* -NOTE: this file is users favorite assets. -- Think of it as being similar to likes, where you can favorite multiple assets but only have one set of favorites. -- Everything else is managed within collections when uers want to organize their assets. -*/ - -export const userFavorite = sqliteTable( - tableNames.userFavorite, - { - id: text("id") - .unique() - .notNull() - .$defaultFn(() => { - return generateID() - }), - userId: text("user_id") - .notNull() - .references(() => authUser.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - isPublic: integer("is_public", { mode: "boolean" }) - .default(false) - .notNull(), - }, - (userFavorite) => { - return { - favoritedAssetsIdx: index("favorited_assets_id_idx").on( - userFavorite.id - ), - favoritedAssetsUserIdx: index("favorited_assets_user_id_idx").on( - userFavorite.userId - ), - } - } -) - -export type UserFavorite = typeof userFavorite.$inferSelect -export type NewUserFavorite = typeof userFavorite.$inferInsert -export const insertUserFavoriteSchema = createInsertSchema(userFavorite) -export const selectUserFavoriteSchema = createSelectSchema(userFavorite) - -export const userFavoriteAsset = sqliteTable( - tableNames.userFavoriteAsset, - { - id: text("id") - .primaryKey() - .notNull() - .$defaultFn(() => { - return generateID() - }), - userFavoriteId: text("favorited_assets_id") - .notNull() - .references(() => userFavorite.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - assetId: integer("asset_id") - .notNull() - .references(() => asset.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - }, - (userFavoriteAsset) => { - return { - favoritedAssetsAssetsIdx: index( - "favorited_assets_assets_id_idx" - ).on(userFavoriteAsset.id), - favoritedAssetsAssetsUserIdx: index( - "favorited_assets_assets_user_id_idx" - ).on(userFavoriteAsset.userFavoriteId), - favoritedAssetsAssetsAssetIdx: index( - "favorited_assets_assets_asset_id_idx" - ).on(userFavoriteAsset.assetId), - } - } -) - -export type UserFavoriteAsset = typeof userFavoriteAsset.$inferSelect -export type NewUserFavoriteAsset = typeof userFavoriteAsset.$inferInsert -export const insertUserFavoriteAssetSchema = - createInsertSchema(userFavoriteAsset) -export const selectUserFavoriteAssetSchema = - createSelectSchema(userFavoriteAsset) - -export const userFavoriteRelations = relations(userFavorite, ({ one }) => ({ - user: one(authUser, { - fields: [userFavorite.userId], - references: [authUser.id], - relationName: "userfavorite_auth_user", - }), -})) - -export const userFavoriteAssetRelations = relations( - userFavoriteAsset, - ({ one }) => ({ - favoritedAssets: one(userFavorite, { - fields: [userFavoriteAsset.userFavoriteId], - references: [userFavorite.id], - relationName: "favoritedassets_userfavorite", - }), - asset: one(asset, { - fields: [userFavoriteAsset.assetId], - references: [asset.id], - relationName: "favoritedassets_asset", - }), - }) -) diff --git a/src/v2/db/schema/user/user-favourites.ts b/src/v2/db/schema/user/user-favourites.ts new file mode 100644 index 0000000..b090e1c --- /dev/null +++ b/src/v2/db/schema/user/user-favourites.ts @@ -0,0 +1,123 @@ +import { tableNames } from "@/v2/db/drizzle" +import { relations } from "drizzle-orm" +import { + sqliteTable, + text, + integer, + // uniqueIndex, + index, +} from "drizzle-orm/sqlite-core" +import { authUser } from "./user" +import { asset } from "../asset/asset" +import { createInsertSchema, createSelectSchema } from "drizzle-zod" +import { generateID } from "@/v2/lib/oslo" + +/* +NOTE: this file is users favourite assets. +- Think of it as being similar to likes, where you can favourite multiple assets but only have one set of favourites. +- Everything else is managed within collections when uers want to organize their assets. +*/ + +export const userFavourite = sqliteTable( + tableNames.userFavourite, + { + id: text("id") + .unique() + .notNull() + .$defaultFn(() => { + return generateID() + }), + userId: text("user_id") + .notNull() + .references(() => authUser.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + isPublic: integer("is_public", { mode: "boolean" }) + .default(false) + .notNull(), + }, + (userFavourite) => { + return { + favouritedAssetsIdx: index("favourited_assets_id_idx").on( + userFavourite.id + ), + favouritedAssetsUserIdx: index("favourited_assets_user_id_idx").on( + userFavourite.userId + ), + } + } +) + +export type UserFavourite = typeof userFavourite.$inferSelect +export type NewUserFavourite = typeof userFavourite.$inferInsert +export const insertUserFavouriteSchema = createInsertSchema(userFavourite) +export const selectUserFavouriteSchema = createSelectSchema(userFavourite) + +export const userFavouriteAsset = sqliteTable( + tableNames.userFavouriteAsset, + { + id: text("id") + .primaryKey() + .notNull() + .$defaultFn(() => { + return generateID() + }), + userFavouriteId: text("favourited_assets_id") + .notNull() + .references(() => userFavourite.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + assetId: integer("asset_id") + .notNull() + .references(() => asset.id, { + onUpdate: "cascade", + onDelete: "cascade", + }), + }, + (userFavouriteAsset) => { + return { + favouritedAssetsAssetsIdx: index( + "favourited_assets_assets_id_idx" + ).on(userFavouriteAsset.id), + favouritedAssetsAssetsUserIdx: index( + "favourited_assets_assets_user_id_idx" + ).on(userFavouriteAsset.userFavouriteId), + favouritedAssetsAssetsAssetIdx: index( + "favourited_assets_assets_asset_id_idx" + ).on(userFavouriteAsset.assetId), + } + } +) + +export type UserFavouriteAsset = typeof userFavouriteAsset.$inferSelect +export type NewUserFavouriteAsset = typeof userFavouriteAsset.$inferInsert +export const insertUserFavouriteAssetSchema = + createInsertSchema(userFavouriteAsset) +export const selectUserFavouriteAssetSchema = + createSelectSchema(userFavouriteAsset) + +export const userFavouriteRelations = relations(userFavourite, ({ one }) => ({ + user: one(authUser, { + fields: [userFavourite.userId], + references: [authUser.id], + relationName: "userfavourite_auth_user", + }), +})) + +export const userFavouriteAssetRelations = relations( + userFavouriteAsset, + ({ one }) => ({ + favouritedAssets: one(userFavourite, { + fields: [userFavouriteAsset.userFavouriteId], + references: [userFavourite.id], + relationName: "favouritedassets_userfavourite", + }), + asset: one(asset, { + fields: [userFavouriteAsset.assetId], + references: [asset.id], + relationName: "favouritedassets_asset", + }), + }) +) diff --git a/src/v2/db/schema/user/user.ts b/src/v2/db/schema/user/user.ts index 825714a..cb92ff9 100644 --- a/src/v2/db/schema/user/user.ts +++ b/src/v2/db/schema/user/user.ts @@ -11,7 +11,7 @@ import { createInsertSchema, createSelectSchema } from "drizzle-zod" import { generateID } from "@/v2/lib/oslo" import { userFollowing } from "./user-following" import { asset } from "../asset/asset" -import { userFavorite } from "./user-favorites" +import { userFavourite } from "./user-favourites" import { socialsConnection } from "./user-connections" import { userCollection } from "../collections/user-collections" import { passwordResetToken } from "./user-attributes" @@ -207,7 +207,7 @@ export const usersRelations = relations(authUser, ({ one, many }) => ({ userSession: many(userSession), asset: many(asset), assetExternalFile: many(assetExternalFile), - userFavorite: one(userFavorite), + userFavourite: one(userFavourite), userCollectionLikes: many(userCollectionLikes), assetLikes: many(assetLikes), assetComments: many(assetComments), diff --git a/src/v2/lib/managers/favorite/favorite-manager.ts b/src/v2/lib/managers/favorite/favorite-manager.ts index 4a7691a..43f9af5 100644 --- a/src/v2/lib/managers/favorite/favorite-manager.ts +++ b/src/v2/lib/managers/favorite/favorite-manager.ts @@ -1,98 +1,98 @@ -import { userFavorite, userFavoriteAsset } from "@/v2/db/schema" +import { userFavourite, userFavouriteAsset } from "@/v2/db/schema" import { and, eq } from "drizzle-orm" import { DrizzleInstance } from "@/v2/db/turso" import type { - NewUserFavorite, - NewUserFavoriteAsset, - UserFavorite, - UserFavoriteAsset, + NewUserFavourite, + NewUserFavouriteAsset, + UserFavourite, + UserFavouriteAsset, } from "@/v2/db/schema" /** - * Manages operations related to user favorites. + * Manages operations related to user favourites. */ export class FavoriteManager { constructor(private drizzle: DrizzleInstance) {} /** - * Get a user's favorite assets. - * @param userId - The ID of the user to retrieve favorites for. + * Get a user's favourite assets. + * @param userId - The ID of the user to retrieve favourites for. * @param currentUserId - The optional current user's ID. - * @returns A user's favorite assets. + * @returns A user's favourite assets. */ - public async getUserFavorite( + public async getUserFavourite( userId: string, currentUserId?: string - ): Promise { + ): Promise { try { - const favouriteExists = this.checkIfUserFavoriteExists(userId) + const favouriteExists = this.checkIfUserFavouriteExists(userId) if (!favouriteExists) { await this.createInitialFavorite(userId) } - const [favorite] = await this.drizzle + const [favourite] = await this.drizzle .select() - .from(userFavorite) + .from(userFavourite) .where( and( currentUserId - ? eq(userFavorite.userId, currentUserId) - : eq(userFavorite.isPublic, true), - eq(userFavorite.userId, userId) + ? eq(userFavourite.userId, currentUserId) + : eq(userFavourite.isPublic, true), + eq(userFavourite.userId, userId) ) ) - return favorite ?? null + return favourite ?? null } catch (e) { console.error( - `Error in getUserFavorite for userId ${userId} and currentUserId ${currentUserId}`, + `Error in getUserFavourite for userId ${userId} and currentUserId ${currentUserId}`, e ) throw new Error( - `Error in getUserFavorite for userId ${userId} and currentUserId ${currentUserId}` + `Error in getUserFavourite for userId ${userId} and currentUserId ${currentUserId}` ) } } - public async checkIfUserFavoriteExists(userId: string): Promise { + public async checkIfUserFavouriteExists(userId: string): Promise { try { - const [favorite] = await this.drizzle + const [favourite] = await this.drizzle .select({ - id: userFavorite.id, + id: userFavourite.id, }) - .from(userFavorite) - .where(and(eq(userFavorite.userId, userId))) + .from(userFavourite) + .where(and(eq(userFavourite.userId, userId))) - return favorite ? true : false + return favourite ? true : false } catch (e) { console.error( - `Error in checkIfUserFavoriteExists for userId ${userId}`, + `Error in checkIfUserFavouriteExists for userId ${userId}`, e ) throw new Error( - `Error in checkIfUserFavoriteExists for userId ${userId}` + `Error in checkIfUserFavouriteExists for userId ${userId}` ) } } /** - * Create initial user favorite (1 per user!) - * @param userId - The ID of the user to create favorites for. - * @returns A user's favorite item. + * Create initial user favourite (1 per user!) + * @param userId - The ID of the user to create favourites for. + * @returns A user's favourite item. */ public async createInitialFavorite( userId: string - ): Promise { + ): Promise { try { - const [favorite] = await this.drizzle - .insert(userFavorite) + const [favourite] = await this.drizzle + .insert(userFavourite) .values({ userId: userId, }) .returning() - return favorite + return favourite } catch (e) { console.error( `Error in createInitialFavorite for userId ${userId}`, @@ -104,77 +104,77 @@ export class FavoriteManager { } } /** - * Adds an asset to a user's favorites. - * @param assetId - The ID of the asset to add to favorites. - * @param userFavoriteId - User's unique favorite ID. + * Adds an asset to a user's favourites. + * @param assetId - The ID of the asset to add to favourites. + * @param userFavouriteId - User's unique favourite ID. */ public async addAssetToFavorites( assetId: number, userId: string, - userFavoriteId: string - ): Promise { + userFavouriteId: string + ): Promise { try { - const favouriteExists = this.checkIfUserFavoriteExists(userId) + const favouriteExists = this.checkIfUserFavouriteExists(userId) if (!favouriteExists) { await this.createInitialFavorite(userId) } - const [favorite] = await this.drizzle - .insert(userFavoriteAsset) + const [favourite] = await this.drizzle + .insert(userFavouriteAsset) .values({ - userFavoriteId: userFavoriteId, + userFavouriteId: userFavouriteId, assetId: assetId, }) .returning() - return favorite + return favourite } catch (e) { console.error( - `Error in addAssetToFavorites for userFavoriteId ${userFavoriteId} and assetId ${assetId}`, + `Error in addAssetToFavorites for userFavouriteId ${userFavouriteId} and assetId ${assetId}`, e ) throw new Error( - `Error in addAssetToFavorites for userFavoriteId ${userFavoriteId} and assetId ${assetId}` + `Error in addAssetToFavorites for userFavouriteId ${userFavouriteId} and assetId ${assetId}` ) } } /** - * Removes an asset from a user's favorites. - * @param assetId - The ID of the asset to remove from favorites. - * @param userFavoriteId - User's unique favorite ID. + * Removes an asset from a user's favourites. + * @param assetId - The ID of the asset to remove from favourites. + * @param userFavouriteId - User's unique favourite ID. */ public async removeAssetFromFavorites( assetId: number, userId: string, - userFavoriteId: string - ): Promise { + userFavouriteId: string + ): Promise { try { - const favouriteExists = this.checkIfUserFavoriteExists(userId) + const favouriteExists = this.checkIfUserFavouriteExists(userId) if (!favouriteExists) { await this.createInitialFavorite(userId) } - const [favorite] = await this.drizzle - .delete(userFavoriteAsset) + const [favourite] = await this.drizzle + .delete(userFavouriteAsset) .where( and( - eq(userFavoriteAsset.userFavoriteId, userFavoriteId), - eq(userFavoriteAsset.assetId, assetId) + eq(userFavouriteAsset.userFavouriteId, userFavouriteId), + eq(userFavouriteAsset.assetId, assetId) ) ) .returning() - return favorite ?? null + return favourite ?? null } catch (e) { console.error( - `Error in removeAssetFromFavorites for userFavoriteId ${userFavoriteId} and assetId ${assetId}`, + `Error in removeAssetFromFavorites for userFavouriteId ${userFavouriteId} and assetId ${assetId}`, e ) throw new Error( - `Error in removeAssetFromFavorites for userFavoriteId ${userFavoriteId} and assetId ${assetId}` + `Error in removeAssetFromFavorites for userFavouriteId ${userFavouriteId} and assetId ${assetId}` ) } } From f8e48c10a71b7e2cdb756c2fae5b89e4d7b28692 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 17 Mar 2024 03:44:12 +0000 Subject: [PATCH 269/318] rewrite route structure --- src/v2/routes/asset/delete-asset.ts | 81 +++++++++ src/v2/routes/asset/delete/id/[id]/openapi.ts | 25 --- src/v2/routes/asset/delete/id/[id]/route.ts | 41 ----- src/v2/routes/asset/delete/id/[id]/schema.ts | 17 -- .../get-asset-comments.ts} | 0 .../all/route.ts => get-asset-likes.ts} | 43 ++++- src/v2/routes/asset/get-asset.ts | 138 +++++++++++++++ src/v2/routes/asset/get/handler.ts | 8 - src/v2/routes/asset/get/id/[id]/openapi.ts | 24 --- src/v2/routes/asset/get/id/[id]/route.ts | 68 -------- src/v2/routes/asset/get/id/[id]/schema.ts | 48 ------ src/v2/routes/asset/handler.ts | 35 ++-- .../like/id/[id]/route.ts => like-asset.ts} | 41 ++++- src/v2/routes/asset/likes/all/openapi.ts | 21 --- src/v2/routes/asset/likes/all/schema.ts | 22 --- src/v2/routes/asset/likes/handler.ts | 12 -- .../asset/likes/like/id/[id]/openapi.ts | 24 --- .../routes/asset/likes/like/id/[id]/schema.ts | 17 -- .../asset/likes/unlike/id/[id]/openapi.ts | 24 --- .../asset/likes/unlike/id/[id]/schema.ts | 17 -- .../id/[id]/route.ts => modify-asset.ts} | 80 ++++++++- src/v2/routes/asset/modify/id/[id]/openapi.ts | 35 ---- src/v2/routes/asset/modify/id/[id]/schema.ts | 49 ------ src/v2/routes/asset/search-assets.ts | 162 ++++++++++++++++++ src/v2/routes/asset/search/all/openapi.ts | 27 --- src/v2/routes/asset/search/all/route.ts | 65 ------- src/v2/routes/asset/search/all/schema.ts | 76 -------- src/v2/routes/asset/search/handler.ts | 8 - .../id/[id]/route.ts => unlike-asset.ts} | 41 ++++- .../{upload/route.ts => upload-asset.ts} | 87 +++++++++- src/v2/routes/asset/upload/openapi.ts | 32 ---- src/v2/routes/asset/upload/schema.ts | 51 ------ src/v2/routes/collection/asset/handler.ts | 0 .../asset/remove/id/[id]/openapi.ts | 0 .../collection/asset/remove/id/[id]/route.ts | 0 .../collection/asset/remove/id/[id]/schema.ts | 0 src/v2/routes/collection/create/openapi.ts | 0 src/v2/routes/collection/create/route.ts | 0 src/v2/routes/collection/create/schema.ts | 0 .../collection/delete/id/[id]/openapi.ts | 0 .../routes/collection/delete/id/[id]/route.ts | 0 .../collection/delete/id/[id]/schema.ts | 0 .../routes/collection/get/id/[id]/openapi.ts | 0 src/v2/routes/collection/get/id/[id]/route.ts | 0 .../routes/collection/get/id/[id]/schema.ts | 0 .../collection/get/user/id/[id]/openapi.ts | 0 .../collection/get/user/id/[id]/route.ts | 0 .../collection/get/user/id/[id]/schema.ts | 0 .../get/user/username/[username]/openapi.ts | 0 .../get/user/username/[username]/route.ts | 0 .../get/user/username/[username]/schema.ts | 0 src/v2/routes/collection/handler.ts | 0 .../routes/contributors/all-contributors.ts | 67 ++++++++ src/v2/routes/contributors/get/all/openapi.ts | 35 ---- src/v2/routes/contributors/get/all/route.ts | 32 ---- src/v2/routes/contributors/handler.ts | 4 +- .../favorite/asset/add/id/[id]/openapi.ts | 0 .../favorite/asset/add/id/[id]/route.ts | 0 .../favorite/asset/add/id/[id]/schema.ts | 0 .../favorite/asset/remove/id/[id]/openapi.ts | 0 .../favorite/asset/remove/id/[id]/route.ts | 0 .../favorite/asset/remove/id/[id]/schema.ts | 0 .../get/user/username/[username]/openapi.ts | 0 .../get/user/username/[username]/route.ts | 0 .../get/user/username/[username]/schema.ts | 0 src/v2/routes/favorite/modify/openapi.ts | 0 src/v2/routes/favorite/modify/route.ts | 0 src/v2/routes/favorite/modify/schema.ts | 0 src/v2/routes/favorite/route.ts | 0 src/v2/routes/game/all-games.ts | 48 ++++++ .../game/{create/route.ts => create-game.ts} | 59 ++++++- src/v2/routes/game/create/openapi.ts | 30 ---- src/v2/routes/game/create/schema.ts | 29 ---- .../id/[id]/route.ts => delete-game.ts} | 41 ++++- src/v2/routes/game/delete/id/[id]/openapi.ts | 24 --- src/v2/routes/game/delete/id/[id]/schema.ts | 17 -- src/v2/routes/game/get-game.ts | 75 ++++++++ src/v2/routes/game/get/all/openapi.ts | 21 --- src/v2/routes/game/get/all/route.ts | 22 --- src/v2/routes/game/get/all/schema.ts | 7 - src/v2/routes/game/get/handler.ts | 12 -- src/v2/routes/game/get/id/[id]/openapi.ts | 24 --- src/v2/routes/game/get/id/[id]/route.ts | 35 ---- src/v2/routes/game/get/id/[id]/schema.ts | 19 -- src/v2/routes/game/get/name/[name]/openapi.ts | 24 --- src/v2/routes/game/get/name/[name]/route.ts | 38 ---- src/v2/routes/game/get/name/[name]/schema.ts | 19 -- src/v2/routes/game/handler.ts | 16 +- src/v2/routes/game/modify-game.ts | 136 +++++++++++++++ src/v2/routes/game/modify/id/[id]/openapi.ts | 35 ---- src/v2/routes/game/modify/id/[id]/route.ts | 66 ------- src/v2/routes/game/modify/id/[id]/schema.ts | 41 ----- src/v2/routes/handler.ts | 8 +- src/v2/routes/requests/all-requests.ts | 78 +++++++++ src/v2/routes/requests/create-request.ts | 104 +++++++++++ .../[id]/route.ts => delete-request.ts} | 42 ++++- src/v2/routes/requests/form/create/openapi.ts | 33 ---- src/v2/routes/requests/form/create/route.ts | 47 ----- src/v2/routes/requests/form/create/schema.ts | 29 ---- .../requests/form/delete/[id]/openapi.ts | 28 --- .../requests/form/delete/[id]/schema.ts | 17 -- .../requests/form/upvote/[id]/openapi.ts | 0 .../routes/requests/form/upvote/[id]/route.ts | 0 .../requests/form/upvote/[id]/schema.ts | 0 .../routes/requests/form/view/all/openapi.ts | 25 --- src/v2/routes/requests/form/view/all/route.ts | 28 --- .../routes/requests/form/view/all/schema.ts | 27 --- src/v2/routes/requests/handler.ts | 10 +- .../route.ts => requests/upvote-request.ts} | 0 .../schema.ts => requests/view-request.ts} | 0 .../id/[id]/route.ts => follow-user.ts} | 40 ++++- .../user/follows/follow/id/[id]/openapi.ts | 24 --- .../user/follows/follow/id/[id]/schema.ts | 16 -- .../user/follows/followers/id/[id]/openapi.ts | 30 ---- .../user/follows/followers/id/[id]/route.ts | 40 ----- .../user/follows/followers/id/[id]/schema.ts | 43 ----- .../following/id/[id]/count/openapi.ts | 0 .../follows/following/id/[id]/count/route.ts | 0 .../follows/following/id/[id]/count/schema.ts | 0 .../user/follows/following/id/[id]/openapi.ts | 30 ---- .../user/follows/following/id/[id]/route.ts | 40 ----- .../user/follows/following/id/[id]/schema.ts | 43 ----- src/v2/routes/user/follows/handler.ts | 16 -- .../user/follows/unfollow/id/[id]/openapi.ts | 27 --- .../user/follows/unfollow/id/[id]/schema.ts | 16 -- src/v2/routes/user/get-user.ts | 92 ++++++++++ src/v2/routes/user/get/handler.ts | 10 -- src/v2/routes/user/get/id/[id]/openapi.ts | 24 --- src/v2/routes/user/get/id/[id]/route.ts | 40 ----- src/v2/routes/user/get/id/[id]/schema.ts | 30 ---- .../user/get/username/[username]/openapi.ts | 25 --- .../user/get/username/[username]/route.ts | 40 ----- .../user/get/username/[username]/schema.ts | 30 ---- src/v2/routes/user/handler.ts | 21 ++- src/v2/routes/user/search-users.ts | 92 ++++++++++ src/v2/routes/user/search/handler.ts | 8 - .../search/username/[username]/openapi.ts | 24 --- .../user/search/username/[username]/route.ts | 38 ---- .../user/search/username/[username]/schema.ts | 32 ---- .../id/[id]/route.ts => unfollow-user.ts} | 40 ++++- src/v2/routes/user/user-followers.ts | 107 ++++++++++++ src/v2/routes/user/user-following.ts | 107 ++++++++++++ 142 files changed, 1848 insertions(+), 2148 deletions(-) create mode 100644 src/v2/routes/asset/delete-asset.ts delete mode 100644 src/v2/routes/asset/delete/id/[id]/openapi.ts delete mode 100644 src/v2/routes/asset/delete/id/[id]/route.ts delete mode 100644 src/v2/routes/asset/delete/id/[id]/schema.ts rename src/v2/routes/{collection/asset/add/id/[id]/openapi.ts => asset/get-asset-comments.ts} (100%) rename src/v2/routes/asset/{likes/all/route.ts => get-asset-likes.ts} (52%) create mode 100644 src/v2/routes/asset/get-asset.ts delete mode 100644 src/v2/routes/asset/get/handler.ts delete mode 100644 src/v2/routes/asset/get/id/[id]/openapi.ts delete mode 100644 src/v2/routes/asset/get/id/[id]/route.ts delete mode 100644 src/v2/routes/asset/get/id/[id]/schema.ts rename src/v2/routes/asset/{likes/like/id/[id]/route.ts => like-asset.ts} (67%) delete mode 100644 src/v2/routes/asset/likes/all/openapi.ts delete mode 100644 src/v2/routes/asset/likes/all/schema.ts delete mode 100644 src/v2/routes/asset/likes/handler.ts delete mode 100644 src/v2/routes/asset/likes/like/id/[id]/openapi.ts delete mode 100644 src/v2/routes/asset/likes/like/id/[id]/schema.ts delete mode 100644 src/v2/routes/asset/likes/unlike/id/[id]/openapi.ts delete mode 100644 src/v2/routes/asset/likes/unlike/id/[id]/schema.ts rename src/v2/routes/asset/{modify/id/[id]/route.ts => modify-asset.ts} (61%) delete mode 100644 src/v2/routes/asset/modify/id/[id]/openapi.ts delete mode 100644 src/v2/routes/asset/modify/id/[id]/schema.ts create mode 100644 src/v2/routes/asset/search-assets.ts delete mode 100644 src/v2/routes/asset/search/all/openapi.ts delete mode 100644 src/v2/routes/asset/search/all/route.ts delete mode 100644 src/v2/routes/asset/search/all/schema.ts delete mode 100644 src/v2/routes/asset/search/handler.ts rename src/v2/routes/asset/{likes/unlike/id/[id]/route.ts => unlike-asset.ts} (68%) rename src/v2/routes/asset/{upload/route.ts => upload-asset.ts} (50%) delete mode 100644 src/v2/routes/asset/upload/openapi.ts delete mode 100644 src/v2/routes/asset/upload/schema.ts delete mode 100644 src/v2/routes/collection/asset/handler.ts delete mode 100644 src/v2/routes/collection/asset/remove/id/[id]/openapi.ts delete mode 100644 src/v2/routes/collection/asset/remove/id/[id]/route.ts delete mode 100644 src/v2/routes/collection/asset/remove/id/[id]/schema.ts delete mode 100644 src/v2/routes/collection/create/openapi.ts delete mode 100644 src/v2/routes/collection/create/route.ts delete mode 100644 src/v2/routes/collection/create/schema.ts delete mode 100644 src/v2/routes/collection/delete/id/[id]/openapi.ts delete mode 100644 src/v2/routes/collection/delete/id/[id]/route.ts delete mode 100644 src/v2/routes/collection/delete/id/[id]/schema.ts delete mode 100644 src/v2/routes/collection/get/id/[id]/openapi.ts delete mode 100644 src/v2/routes/collection/get/id/[id]/route.ts delete mode 100644 src/v2/routes/collection/get/id/[id]/schema.ts delete mode 100644 src/v2/routes/collection/get/user/id/[id]/openapi.ts delete mode 100644 src/v2/routes/collection/get/user/id/[id]/route.ts delete mode 100644 src/v2/routes/collection/get/user/id/[id]/schema.ts delete mode 100644 src/v2/routes/collection/get/user/username/[username]/openapi.ts delete mode 100644 src/v2/routes/collection/get/user/username/[username]/route.ts delete mode 100644 src/v2/routes/collection/get/user/username/[username]/schema.ts delete mode 100644 src/v2/routes/collection/handler.ts create mode 100644 src/v2/routes/contributors/all-contributors.ts delete mode 100644 src/v2/routes/contributors/get/all/openapi.ts delete mode 100644 src/v2/routes/contributors/get/all/route.ts delete mode 100644 src/v2/routes/favorite/asset/add/id/[id]/openapi.ts delete mode 100644 src/v2/routes/favorite/asset/add/id/[id]/route.ts delete mode 100644 src/v2/routes/favorite/asset/add/id/[id]/schema.ts delete mode 100644 src/v2/routes/favorite/asset/remove/id/[id]/openapi.ts delete mode 100644 src/v2/routes/favorite/asset/remove/id/[id]/route.ts delete mode 100644 src/v2/routes/favorite/asset/remove/id/[id]/schema.ts delete mode 100644 src/v2/routes/favorite/get/user/username/[username]/openapi.ts delete mode 100644 src/v2/routes/favorite/get/user/username/[username]/route.ts delete mode 100644 src/v2/routes/favorite/get/user/username/[username]/schema.ts delete mode 100644 src/v2/routes/favorite/modify/openapi.ts delete mode 100644 src/v2/routes/favorite/modify/route.ts delete mode 100644 src/v2/routes/favorite/modify/schema.ts delete mode 100644 src/v2/routes/favorite/route.ts create mode 100644 src/v2/routes/game/all-games.ts rename src/v2/routes/game/{create/route.ts => create-game.ts} (50%) delete mode 100644 src/v2/routes/game/create/openapi.ts delete mode 100644 src/v2/routes/game/create/schema.ts rename src/v2/routes/game/{delete/id/[id]/route.ts => delete-game.ts} (59%) delete mode 100644 src/v2/routes/game/delete/id/[id]/openapi.ts delete mode 100644 src/v2/routes/game/delete/id/[id]/schema.ts create mode 100644 src/v2/routes/game/get-game.ts delete mode 100644 src/v2/routes/game/get/all/openapi.ts delete mode 100644 src/v2/routes/game/get/all/route.ts delete mode 100644 src/v2/routes/game/get/all/schema.ts delete mode 100644 src/v2/routes/game/get/handler.ts delete mode 100644 src/v2/routes/game/get/id/[id]/openapi.ts delete mode 100644 src/v2/routes/game/get/id/[id]/route.ts delete mode 100644 src/v2/routes/game/get/id/[id]/schema.ts delete mode 100644 src/v2/routes/game/get/name/[name]/openapi.ts delete mode 100644 src/v2/routes/game/get/name/[name]/route.ts delete mode 100644 src/v2/routes/game/get/name/[name]/schema.ts create mode 100644 src/v2/routes/game/modify-game.ts delete mode 100644 src/v2/routes/game/modify/id/[id]/openapi.ts delete mode 100644 src/v2/routes/game/modify/id/[id]/route.ts delete mode 100644 src/v2/routes/game/modify/id/[id]/schema.ts create mode 100644 src/v2/routes/requests/all-requests.ts create mode 100644 src/v2/routes/requests/create-request.ts rename src/v2/routes/requests/{form/delete/[id]/route.ts => delete-request.ts} (59%) delete mode 100644 src/v2/routes/requests/form/create/openapi.ts delete mode 100644 src/v2/routes/requests/form/create/route.ts delete mode 100644 src/v2/routes/requests/form/create/schema.ts delete mode 100644 src/v2/routes/requests/form/delete/[id]/openapi.ts delete mode 100644 src/v2/routes/requests/form/delete/[id]/schema.ts delete mode 100644 src/v2/routes/requests/form/upvote/[id]/openapi.ts delete mode 100644 src/v2/routes/requests/form/upvote/[id]/route.ts delete mode 100644 src/v2/routes/requests/form/upvote/[id]/schema.ts delete mode 100644 src/v2/routes/requests/form/view/all/openapi.ts delete mode 100644 src/v2/routes/requests/form/view/all/route.ts delete mode 100644 src/v2/routes/requests/form/view/all/schema.ts rename src/v2/routes/{collection/asset/add/id/[id]/route.ts => requests/upvote-request.ts} (100%) rename src/v2/routes/{collection/asset/add/id/[id]/schema.ts => requests/view-request.ts} (100%) rename src/v2/routes/user/{follows/follow/id/[id]/route.ts => follow-user.ts} (74%) delete mode 100644 src/v2/routes/user/follows/follow/id/[id]/openapi.ts delete mode 100644 src/v2/routes/user/follows/follow/id/[id]/schema.ts delete mode 100644 src/v2/routes/user/follows/followers/id/[id]/openapi.ts delete mode 100644 src/v2/routes/user/follows/followers/id/[id]/route.ts delete mode 100644 src/v2/routes/user/follows/followers/id/[id]/schema.ts delete mode 100644 src/v2/routes/user/follows/following/id/[id]/count/openapi.ts delete mode 100644 src/v2/routes/user/follows/following/id/[id]/count/route.ts delete mode 100644 src/v2/routes/user/follows/following/id/[id]/count/schema.ts delete mode 100644 src/v2/routes/user/follows/following/id/[id]/openapi.ts delete mode 100644 src/v2/routes/user/follows/following/id/[id]/route.ts delete mode 100644 src/v2/routes/user/follows/following/id/[id]/schema.ts delete mode 100644 src/v2/routes/user/follows/handler.ts delete mode 100644 src/v2/routes/user/follows/unfollow/id/[id]/openapi.ts delete mode 100644 src/v2/routes/user/follows/unfollow/id/[id]/schema.ts create mode 100644 src/v2/routes/user/get-user.ts delete mode 100644 src/v2/routes/user/get/handler.ts delete mode 100644 src/v2/routes/user/get/id/[id]/openapi.ts delete mode 100644 src/v2/routes/user/get/id/[id]/route.ts delete mode 100644 src/v2/routes/user/get/id/[id]/schema.ts delete mode 100644 src/v2/routes/user/get/username/[username]/openapi.ts delete mode 100644 src/v2/routes/user/get/username/[username]/route.ts delete mode 100644 src/v2/routes/user/get/username/[username]/schema.ts create mode 100644 src/v2/routes/user/search-users.ts delete mode 100644 src/v2/routes/user/search/handler.ts delete mode 100644 src/v2/routes/user/search/username/[username]/openapi.ts delete mode 100644 src/v2/routes/user/search/username/[username]/route.ts delete mode 100644 src/v2/routes/user/search/username/[username]/schema.ts rename src/v2/routes/user/{follows/unfollow/id/[id]/route.ts => unfollow-user.ts} (75%) create mode 100644 src/v2/routes/user/user-followers.ts create mode 100644 src/v2/routes/user/user-following.ts diff --git a/src/v2/routes/asset/delete-asset.ts b/src/v2/routes/asset/delete-asset.ts new file mode 100644 index 0000000..e2a145b --- /dev/null +++ b/src/v2/routes/asset/delete-asset.ts @@ -0,0 +1,81 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { getConnection } from "@/v2/db/turso" +import { eq } from "drizzle-orm" +import { asset } from "@/v2/db/schema" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" + +const deleteAssetByIdSchema = z.object({ + id: z.string().openapi({ + param: { + name: "id", + in: "path", + description: "The ID of the asset to delete.", + example: "1", + required: true, + }, + }), +}) + +const deleteAssetByIdResponseSchema = z.object({ + success: z.literal(true), +}) + +const deleteAssetByIdRoute = createRoute({ + path: "/{id}", + method: "delete", + description: + "Delete an asset from their ID. Must be the owner of the asset or an admin.", + tags: ["Asset"], + request: { + params: deleteAssetByIdSchema, + }, + responses: { + 200: { + description: "True if the asset was deleted.", + content: { + "application/json": { + schema: deleteAssetByIdResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.openapi(deleteAssetByIdRoute, async (ctx) => { + const assetId = ctx.req.valid("param").id + + const { drizzle } = await getConnection(ctx.env) + + const [existingAsset] = await drizzle + .select({ id: asset.id }) + .from(asset) + .where(eq(asset.id, parseInt(assetId))) + .limit(1) + + if (!existingAsset) { + return ctx.json( + { + success: true, + message: "Asset not found", + }, + 400 + ) + } + + await drizzle.delete(asset).where(eq(asset.id, parseInt(assetId))) + // await ctx.env.FILES_BUCKET.delete(asset.url) + + return ctx.json( + { + success: true, + }, + 200 + ) +}) + +export default handler diff --git a/src/v2/routes/asset/delete/id/[id]/openapi.ts b/src/v2/routes/asset/delete/id/[id]/openapi.ts deleted file mode 100644 index 994956d..0000000 --- a/src/v2/routes/asset/delete/id/[id]/openapi.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { createRoute } from "@hono/zod-openapi" -import { deleteAssetByIdResponseSchema, deleteAssetByIdSchema } from "./schema" -import { GenericResponses } from "@/v2/lib/response-schemas" - -export const deleteAssetByIdRoute = createRoute({ - path: "/{id}", - method: "delete", - description: - "Delete an asset from their ID. Must be the owner of the asset or an admin.", - tags: ["Asset"], - request: { - params: deleteAssetByIdSchema, - }, - responses: { - 200: { - description: "True if the asset was deleted.", - content: { - "application/json": { - schema: deleteAssetByIdResponseSchema, - }, - }, - }, - ...GenericResponses, - }, -}) diff --git a/src/v2/routes/asset/delete/id/[id]/route.ts b/src/v2/routes/asset/delete/id/[id]/route.ts deleted file mode 100644 index 3d695ab..0000000 --- a/src/v2/routes/asset/delete/id/[id]/route.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { OpenAPIHono } from "@hono/zod-openapi" -import { deleteAssetByIdRoute } from "./openapi" -import { getConnection } from "@/v2/db/turso" -import { eq } from "drizzle-orm" -import { asset } from "@/v2/db/schema" - -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() - -handler.openapi(deleteAssetByIdRoute, async (ctx) => { - const assetId = ctx.req.valid("param").id - - const { drizzle } = await getConnection(ctx.env) - - const [existingAsset] = await drizzle - .select({ id: asset.id }) - .from(asset) - .where(eq(asset.id, parseInt(assetId))) - .limit(1) - - if (!existingAsset) { - return ctx.json( - { - success: true, - message: "Asset not found", - }, - 400 - ) - } - - await drizzle.delete(asset).where(eq(asset.id, parseInt(assetId))) - // await ctx.env.FILES_BUCKET.delete(asset.url) - - return ctx.json( - { - success: true, - }, - 200 - ) -}) - -export default handler diff --git a/src/v2/routes/asset/delete/id/[id]/schema.ts b/src/v2/routes/asset/delete/id/[id]/schema.ts deleted file mode 100644 index 5030439..0000000 --- a/src/v2/routes/asset/delete/id/[id]/schema.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { z } from "@hono/zod-openapi" - -export const deleteAssetByIdSchema = z.object({ - id: z.string().openapi({ - param: { - name: "id", - in: "path", - description: "The ID of the asset to delete.", - example: "1", - required: true, - }, - }), -}) - -export const deleteAssetByIdResponseSchema = z.object({ - success: z.literal(true), -}) diff --git a/src/v2/routes/collection/asset/add/id/[id]/openapi.ts b/src/v2/routes/asset/get-asset-comments.ts similarity index 100% rename from src/v2/routes/collection/asset/add/id/[id]/openapi.ts rename to src/v2/routes/asset/get-asset-comments.ts diff --git a/src/v2/routes/asset/likes/all/route.ts b/src/v2/routes/asset/get-asset-likes.ts similarity index 52% rename from src/v2/routes/asset/likes/all/route.ts rename to src/v2/routes/asset/get-asset-likes.ts index fb9b88e..70abe2b 100644 --- a/src/v2/routes/asset/likes/all/route.ts +++ b/src/v2/routes/asset/get-asset-likes.ts @@ -1,7 +1,48 @@ import { OpenAPIHono } from "@hono/zod-openapi" -import { allAssetLikesRoute } from "./openapi" import { getConnection } from "@/v2/db/turso" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" +import { + selectAssetSchema, + selectAssetTagAssetSchema, + selectAssetTagSchema, + selectAssetLikesSchema, +} from "@/v2/db/schema" + +const allAssetLikesSchema = z.object({ + success: z.literal(true), + likes: z.array( + selectAssetLikesSchema.extend({ + asset: selectAssetSchema.extend({ + assetTagAsset: z.array( + selectAssetTagAssetSchema.extend({ + assetTag: selectAssetTagSchema, + }) + ), + }), + }) + ), +}) + +const allAssetLikesRoute = createRoute({ + path: "/", + method: "get", + description: "All your liked assets.", + tags: ["Asset"], + responses: { + 200: { + description: "Array of your liked assets.", + content: { + "application/json": { + schema: allAssetLikesSchema, + }, + }, + }, + ...GenericResponses, + }, +}) const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() diff --git a/src/v2/routes/asset/get-asset.ts b/src/v2/routes/asset/get-asset.ts new file mode 100644 index 0000000..6a5a398 --- /dev/null +++ b/src/v2/routes/asset/get-asset.ts @@ -0,0 +1,138 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { getConnection } from "@/v2/db/turso" +import { asset } from "@/v2/db/schema" +import { eq, sql } from "drizzle-orm" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" +import { + selectAssetCategorySchema, + selectGameSchema, + selectAssetSchema, + selectAssetTagAssetSchema, + selectAssetTagSchema, + selectUserSchema, +} from "@/v2/db/schema" + +const getAssetByIdSchema = z.object({ + id: z.string().openapi({ + param: { + name: "id", + in: "path", + description: "The ID of the asset to retrieve.", + required: true, + }, + }), +}) + +const getAssetByIdResponseSchema = z.object({ + success: z.literal(true), + // mmm nested schemas + asset: selectAssetSchema.extend({ + assetTagAsset: z.array( + selectAssetTagAssetSchema.extend({ + assetTag: selectAssetTagSchema, + }) + ), + }), + authUser: selectUserSchema.pick({ + id: true, + avatarUrl: true, + displayName: true, + username: true, + usernameColour: true, + pronouns: true, + verified: true, + bio: true, + dateJoined: true, + plan: true, + role: true, + }), + game: selectGameSchema, + assetCategory: selectAssetCategorySchema, + // similarAssets: selectAssetSchema.array(), +}) + +const getAssetByIdRoute = createRoute({ + path: "/{id}", + method: "get", + description: "Get an asset by their ID.", + tags: ["Asset"], + request: { + params: getAssetByIdSchema, + }, + responses: { + 200: { + description: "The found asset & similar assets are returned.", + content: { + "application/json": { + schema: getAssetByIdResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.openapi(getAssetByIdRoute, async (ctx) => { + const assetId = ctx.req.valid("param").id + + const { drizzle } = await getConnection(ctx.env) + + const foundAsset = await drizzle.query.asset.findFirst({ + where: (asset, { eq }) => eq(asset.id, parseInt(assetId)), + with: { + assetTagAsset: { + with: { + assetTag: true, + }, + }, + authUser: { + columns: { + id: true, + avatarUrl: true, + displayName: true, + username: true, + usernameColour: true, + pronouns: true, + verified: true, + bio: true, + dateJoined: true, + plan: true, + role: true, + }, + }, + game: true, + assetCategory: true, + }, + }) + + if (!foundAsset) { + return ctx.json( + { + success: false, + message: "Asset not found", + }, + 400 + ) + } + + await drizzle + .update(asset) + .set({ + viewCount: sql`${asset.viewCount} + 1`, + }) + .where(eq(asset.id, parseInt(assetId))) + + return ctx.json( + { + success: true, + asset: foundAsset, + }, + 200 + ) +}) + +export default handler diff --git a/src/v2/routes/asset/get/handler.ts b/src/v2/routes/asset/get/handler.ts deleted file mode 100644 index 36be2d7..0000000 --- a/src/v2/routes/asset/get/handler.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { OpenAPIHono } from "@hono/zod-openapi" -import GetAssetByIDRoute from "@/v2/routes/asset/get/id/[id]/route" - -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() - -handler.route("/id", GetAssetByIDRoute) - -export default handler diff --git a/src/v2/routes/asset/get/id/[id]/openapi.ts b/src/v2/routes/asset/get/id/[id]/openapi.ts deleted file mode 100644 index cbaa48c..0000000 --- a/src/v2/routes/asset/get/id/[id]/openapi.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { createRoute } from "@hono/zod-openapi" -import { getAssetByIdSchema, getAssetByIdResponseSchema } from "./schema" -import { GenericResponses } from "@/v2/lib/response-schemas" - -export const getAssetByIdRoute = createRoute({ - path: "/{id}", - method: "get", - description: "Get an asset by their ID.", - tags: ["Asset"], - request: { - params: getAssetByIdSchema, - }, - responses: { - 200: { - description: "The found asset & similar assets are returned.", - content: { - "application/json": { - schema: getAssetByIdResponseSchema, - }, - }, - }, - ...GenericResponses, - }, -}) diff --git a/src/v2/routes/asset/get/id/[id]/route.ts b/src/v2/routes/asset/get/id/[id]/route.ts deleted file mode 100644 index 12f9549..0000000 --- a/src/v2/routes/asset/get/id/[id]/route.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { OpenAPIHono } from "@hono/zod-openapi" -import { getAssetByIdRoute } from "./openapi" -import { getConnection } from "@/v2/db/turso" -import { asset } from "@/v2/db/schema" -import { eq, sql } from "drizzle-orm" - -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() - -handler.openapi(getAssetByIdRoute, async (ctx) => { - const assetId = ctx.req.valid("param").id - - const { drizzle } = await getConnection(ctx.env) - - const foundAsset = await drizzle.query.asset.findFirst({ - where: (asset, { eq }) => eq(asset.id, parseInt(assetId)), - with: { - assetTagAsset: { - with: { - assetTag: true, - }, - }, - authUser: { - columns: { - id: true, - avatarUrl: true, - displayName: true, - username: true, - usernameColour: true, - pronouns: true, - verified: true, - bio: true, - dateJoined: true, - plan: true, - role: true, - }, - }, - game: true, - assetCategory: true, - }, - }) - - if (!foundAsset) { - return ctx.json( - { - success: false, - message: "Asset not found", - }, - 400 - ) - } - - await drizzle - .update(asset) - .set({ - viewCount: sql`${asset.viewCount} + 1`, - }) - .where(eq(asset.id, parseInt(assetId))) - - return ctx.json( - { - success: true, - asset: foundAsset, - }, - 200 - ) -}) - -export default handler diff --git a/src/v2/routes/asset/get/id/[id]/schema.ts b/src/v2/routes/asset/get/id/[id]/schema.ts deleted file mode 100644 index 396f70e..0000000 --- a/src/v2/routes/asset/get/id/[id]/schema.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { z } from "@hono/zod-openapi" -import { - selectAssetCategorySchema, - selectGameSchema, - selectAssetSchema, - selectAssetTagAssetSchema, - selectAssetTagSchema, - selectUserSchema, -} from "@/v2/db/schema" - -export const getAssetByIdSchema = z.object({ - id: z.string().openapi({ - param: { - name: "id", - in: "path", - description: "The ID of the asset to retrieve.", - required: true, - }, - }), -}) - -export const getAssetByIdResponseSchema = z.object({ - success: z.literal(true), - // mmm nested schemas - asset: selectAssetSchema.extend({ - assetTagAsset: z.array( - selectAssetTagAssetSchema.extend({ - assetTag: selectAssetTagSchema, - }) - ), - }), - authUser: selectUserSchema.pick({ - id: true, - avatarUrl: true, - displayName: true, - username: true, - usernameColour: true, - pronouns: true, - verified: true, - bio: true, - dateJoined: true, - plan: true, - role: true, - }), - game: selectGameSchema, - assetCategory: selectAssetCategorySchema, - // similarAssets: selectAssetSchema.array(), -}) diff --git a/src/v2/routes/asset/handler.ts b/src/v2/routes/asset/handler.ts index 5b37d7b..c31337d 100644 --- a/src/v2/routes/asset/handler.ts +++ b/src/v2/routes/asset/handler.ts @@ -1,18 +1,29 @@ import { OpenAPIHono } from "@hono/zod-openapi" -import AssetGetRoute from "@/v2/routes/asset/get/handler" -import AssetSearchRoute from "@/v2/routes/asset/search/handler" -import AssetModifyRoute from "@/v2/routes/asset/modify/id/[id]/route" -import AssetUploadRoute from "@/v2/routes/asset/upload/route" -import AssetDeleteRoute from "@/v2/routes/asset/delete/id/[id]/route" -import AssetLikesRoute from "@/v2/routes/asset/likes/handler" + +import SearchAssetRoute from "@/v2/routes/asset/search-assets" +import GetAssetRoute from "@/v2/routes/asset/get-asset" + +import UploadAssetRoute from "@/v2/routes/asset/upload-asset" +import ModifyAssetRoute from "@/v2/routes/asset/modify-asset" +import DeleteAssetRoute from "@/v2/routes/asset/delete-asset" + +import LikeAssetByIdRoute from "@/v2/routes/asset/like-asset" +import UnlikeAssetByIdRoute from "@/v2/routes/asset/unlike-asset" + +import GetAssetLikesRoute from "@/v2/routes/asset/get-asset-likes" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() -handler.route("/get", AssetGetRoute) -handler.route("/search", AssetSearchRoute) -handler.route("/modify/id", AssetModifyRoute) -handler.route("/upload", AssetUploadRoute) -handler.route("/delete/id", AssetDeleteRoute) -handler.route("/likes", AssetLikesRoute) +handler.route("/search", SearchAssetRoute) +handler.route("/get", GetAssetRoute) + +handler.route("/upload", UploadAssetRoute) +handler.route("/modify", ModifyAssetRoute) +handler.route("/delete", DeleteAssetRoute) + +handler.route("/like", LikeAssetByIdRoute) +handler.route("/unlike", UnlikeAssetByIdRoute) + +handler.route("/likes", GetAssetLikesRoute) export default handler diff --git a/src/v2/routes/asset/likes/like/id/[id]/route.ts b/src/v2/routes/asset/like-asset.ts similarity index 67% rename from src/v2/routes/asset/likes/like/id/[id]/route.ts rename to src/v2/routes/asset/like-asset.ts index 6187722..9273cbe 100644 --- a/src/v2/routes/asset/likes/like/id/[id]/route.ts +++ b/src/v2/routes/asset/like-asset.ts @@ -1,9 +1,48 @@ import { OpenAPIHono } from "@hono/zod-openapi" -import { likeAssetByIdRoute } from "./openapi" import { getConnection } from "@/v2/db/turso" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" import { asset, assetLikes } from "@/v2/db/schema" import { and, eq } from "drizzle-orm" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" + +const likeAssetByIdSchema = z.object({ + id: z.string().openapi({ + param: { + description: "The id of the asset to like.", + example: "1", + in: "path", + name: "id", + required: true, + }, + }), +}) + +const likeAssetByIdResponseSchema = z.object({ + success: z.literal(true), +}) + +const likeAssetByIdRoute = createRoute({ + path: "/{id}", + method: "post", + description: "Like an asset from their ID.", + tags: ["Asset"], + request: { + params: likeAssetByIdSchema, + }, + responses: { + 200: { + description: "True if the asset was liked.", + content: { + "application/json": { + schema: likeAssetByIdResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() diff --git a/src/v2/routes/asset/likes/all/openapi.ts b/src/v2/routes/asset/likes/all/openapi.ts deleted file mode 100644 index f14cadc..0000000 --- a/src/v2/routes/asset/likes/all/openapi.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { createRoute } from "@hono/zod-openapi" -import { allAssetLikesSchema } from "./schema" -import { GenericResponses } from "@/v2/lib/response-schemas" - -export const allAssetLikesRoute = createRoute({ - path: "/", - method: "get", - description: "All liked assets.", - tags: ["Asset"], - responses: { - 200: { - description: "Array of your liked assets.", - content: { - "application/json": { - schema: allAssetLikesSchema, - }, - }, - }, - ...GenericResponses, - }, -}) diff --git a/src/v2/routes/asset/likes/all/schema.ts b/src/v2/routes/asset/likes/all/schema.ts deleted file mode 100644 index ac44a06..0000000 --- a/src/v2/routes/asset/likes/all/schema.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { z } from "@hono/zod-openapi" -import { - selectAssetSchema, - selectAssetTagAssetSchema, - selectAssetTagSchema, - selectAssetLikesSchema, -} from "@/v2/db/schema" - -export const allAssetLikesSchema = z.object({ - success: z.literal(true), - likes: z.array( - selectAssetLikesSchema.extend({ - asset: selectAssetSchema.extend({ - assetTagAsset: z.array( - selectAssetTagAssetSchema.extend({ - assetTag: selectAssetTagSchema, - }) - ), - }), - }) - ), -}) diff --git a/src/v2/routes/asset/likes/handler.ts b/src/v2/routes/asset/likes/handler.ts deleted file mode 100644 index f6a2dba..0000000 --- a/src/v2/routes/asset/likes/handler.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { OpenAPIHono } from "@hono/zod-openapi" -import UnlikeAssetByIdRoute from "@/v2/routes/asset/likes/unlike/id/[id]/route" -import LikeAssetByIdRoute from "@/v2/routes/asset/likes/like/id/[id]/route" -import AllAssetLikesRoute from "@/v2/routes/asset/likes/all/route" - -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() - -handler.route("/unlike", UnlikeAssetByIdRoute) -handler.route("/like", LikeAssetByIdRoute) -handler.route("/all", AllAssetLikesRoute) - -export default handler diff --git a/src/v2/routes/asset/likes/like/id/[id]/openapi.ts b/src/v2/routes/asset/likes/like/id/[id]/openapi.ts deleted file mode 100644 index 2d344e6..0000000 --- a/src/v2/routes/asset/likes/like/id/[id]/openapi.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { createRoute } from "@hono/zod-openapi" -import { likeAssetByIdSchema, likeAssetByIdResponseSchema } from "./schema" -import { GenericResponses } from "@/v2/lib/response-schemas" - -export const likeAssetByIdRoute = createRoute({ - path: "/{id}", - method: "post", - description: "Like an asset from their ID.", - tags: ["Asset"], - request: { - params: likeAssetByIdSchema, - }, - responses: { - 200: { - description: "True if the asset was liked.", - content: { - "application/json": { - schema: likeAssetByIdResponseSchema, - }, - }, - }, - ...GenericResponses, - }, -}) diff --git a/src/v2/routes/asset/likes/like/id/[id]/schema.ts b/src/v2/routes/asset/likes/like/id/[id]/schema.ts deleted file mode 100644 index 20c2158..0000000 --- a/src/v2/routes/asset/likes/like/id/[id]/schema.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { z } from "@hono/zod-openapi" - -export const likeAssetByIdSchema = z.object({ - id: z.string().openapi({ - param: { - description: "The id of the asset to like.", - example: "1", - in: "path", - name: "id", - required: true, - }, - }), -}) - -export const likeAssetByIdResponseSchema = z.object({ - success: z.literal(true), -}) diff --git a/src/v2/routes/asset/likes/unlike/id/[id]/openapi.ts b/src/v2/routes/asset/likes/unlike/id/[id]/openapi.ts deleted file mode 100644 index 8073a96..0000000 --- a/src/v2/routes/asset/likes/unlike/id/[id]/openapi.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { createRoute } from "@hono/zod-openapi" -import { unlikeAssetByIdSchema, unlikeAssetByIdResponseSchema } from "./schema" -import { GenericResponses } from "@/v2/lib/response-schemas" - -export const unlikeAssetByIdRoute = createRoute({ - path: "/{id}", - method: "post", - description: "Unlike an asset from their ID.", - tags: ["Asset"], - request: { - params: unlikeAssetByIdSchema, - }, - responses: { - 200: { - description: "True if the asset was unliked.", - content: { - "application/json": { - schema: unlikeAssetByIdResponseSchema, - }, - }, - }, - ...GenericResponses, - }, -}) diff --git a/src/v2/routes/asset/likes/unlike/id/[id]/schema.ts b/src/v2/routes/asset/likes/unlike/id/[id]/schema.ts deleted file mode 100644 index bbe6155..0000000 --- a/src/v2/routes/asset/likes/unlike/id/[id]/schema.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { z } from "@hono/zod-openapi" - -export const unlikeAssetByIdSchema = z.object({ - id: z.string().openapi({ - param: { - description: "The id of the asset to unlike.", - example: "1", - in: "path", - name: "id", - required: true, - }, - }), -}) - -export const unlikeAssetByIdResponseSchema = z.object({ - success: z.literal(true), -}) diff --git a/src/v2/routes/asset/modify/id/[id]/route.ts b/src/v2/routes/asset/modify-asset.ts similarity index 61% rename from src/v2/routes/asset/modify/id/[id]/route.ts rename to src/v2/routes/asset/modify-asset.ts index b642ef0..f0311bf 100644 --- a/src/v2/routes/asset/modify/id/[id]/route.ts +++ b/src/v2/routes/asset/modify-asset.ts @@ -1,10 +1,88 @@ import { OpenAPIHono } from "@hono/zod-openapi" import { getConnection } from "@/v2/db/turso" -import { modifyAssetRoute } from "./openapi" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" import { asset, assetTag, assetTagAsset } from "@/v2/db/schema" import { and, eq } from "drizzle-orm" import { SplitQueryByCommas } from "@/v2/lib/helpers/split-query-by-commas" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" + +const modifyAssetPathSchema = z.object({ + id: z.string().openapi({ + param: { + description: "The id of the asset to modify.", + example: "1", + in: "path", + required: true, + }, + }), +}) + +const modifyAssetSchema = z.object({ + name: z + .string() + .min(3) + .max(32) + .openapi({ + description: "The name of the asset.", + example: "keqing-nobg.png", + }) + .optional(), + tags: z + .string() + .openapi({ + description: "Comma seperated list of tags for the asset.", + example: "official,1.0", + }) + .optional(), + assetCategoryId: z + .string() + .openapi({ + description: "The asset category ID for the asset.", + example: "splash-art", + }) + .optional(), + gameId: z + .string() + .openapi({ + description: "The game ID for the asset.", + example: "genshin-impact", + }) + .optional(), +}) + +const modifyAssetResponseSchema = z.object({ + success: z.literal(true), +}) + +const modifyAssetRoute = createRoute({ + path: "/{id}", + method: "patch", + description: "Modify an existing asset.", + tags: ["Asset"], + request: { + params: modifyAssetPathSchema, + body: { + content: { + "application/json": { + schema: modifyAssetSchema, + }, + }, + }, + }, + responses: { + 200: { + description: "Returns the asset's new attributes", + content: { + "application/json": { + schema: modifyAssetResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() diff --git a/src/v2/routes/asset/modify/id/[id]/openapi.ts b/src/v2/routes/asset/modify/id/[id]/openapi.ts deleted file mode 100644 index 24561fa..0000000 --- a/src/v2/routes/asset/modify/id/[id]/openapi.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { createRoute } from "@hono/zod-openapi" -import { GenericResponses } from "@/v2/lib/response-schemas" -import { - modifyAssetSchema, - modifyAssetResponseSchema, - modifyAssetPathSchema, -} from "./schema" - -export const modifyAssetRoute = createRoute({ - path: "/{id}", - method: "patch", - description: "Modify an existing asset.", - tags: ["Asset"], - request: { - params: modifyAssetPathSchema, - body: { - content: { - "application/json": { - schema: modifyAssetSchema, - }, - }, - }, - }, - responses: { - 200: { - description: "Returns the asset's new attributes", - content: { - "application/json": { - schema: modifyAssetResponseSchema, - }, - }, - }, - ...GenericResponses, - }, -}) diff --git a/src/v2/routes/asset/modify/id/[id]/schema.ts b/src/v2/routes/asset/modify/id/[id]/schema.ts deleted file mode 100644 index 1bea70d..0000000 --- a/src/v2/routes/asset/modify/id/[id]/schema.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { z } from "zod" - -export const modifyAssetPathSchema = z.object({ - id: z.string().openapi({ - param: { - description: "The id of the asset to modify.", - example: "1", - in: "path", - required: true, - }, - }), -}) - -export const modifyAssetSchema = z.object({ - name: z - .string() - .min(3) - .max(32) - .openapi({ - description: "The name of the asset.", - example: "keqing-nobg.png", - }) - .optional(), - tags: z - .string() - .openapi({ - description: "Comma seperated list of tags for the asset.", - example: "official,1.0", - }) - .optional(), - assetCategoryId: z - .string() - .openapi({ - description: "The asset category ID for the asset.", - example: "splash-art", - }) - .optional(), - gameId: z - .string() - .openapi({ - description: "The game ID for the asset.", - example: "genshin-impact", - }) - .optional(), -}) - -export const modifyAssetResponseSchema = z.object({ - success: z.literal(true), -}) diff --git a/src/v2/routes/asset/search-assets.ts b/src/v2/routes/asset/search-assets.ts new file mode 100644 index 0000000..34f9340 --- /dev/null +++ b/src/v2/routes/asset/search-assets.ts @@ -0,0 +1,162 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { getConnection } from "@/v2/db/turso" +import { SplitQueryByCommas } from "@/v2/lib/helpers/split-query-by-commas" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" +import { + selectAssetSchema, + selectAssetTagAssetSchema, + selectAssetTagSchema, +} from "@/v2/db/schema" + +export const assetSearchAllFilterResponseSchema = z.object({ + success: z.literal(true), + assets: z.array( + selectAssetSchema.extend({ + assetTagAsset: z.array( + selectAssetTagAssetSchema.extend({ + assetTag: selectAssetTagSchema, + }) + ), + }) + ), +}) + +export const assetSearchAllFilterSchema = z + .object({ + name: z.string().openapi({ + param: { + description: + "The name of the asset(s) to retrieve. Doesn't have to be exact, uses 'like' operator to search.", + name: "name", + in: "query", + example: "keqing", + required: false, + }, + }), + game: z.string().openapi({ + param: { + description: + "The game id(s) of the asset(s) to retrieve. Comma seperated.", + name: "game", + in: "query", + example: "genshin-impact,honkai-impact-3rd", + required: false, + }, + }), + category: z.string().openapi({ + param: { + description: + "The category id(s) of the asset(s) to retrieve. Comma seperated.", + name: "category", + in: "query", + example: "character-sheets,splash-art", + required: false, + }, + }), + tags: z.string().openapi({ + param: { + description: "The tag id(s) of the asset(s) to retrieve.", + name: "tags", + in: "query", + example: "official,fanmade", + required: false, + }, + }), + offset: z.string().openapi({ + param: { + description: + "The offset of the asset(s) to retrieve. For pagination / infinite scrolling.", + name: "offset", + example: "0", + in: "query", + required: false, + }, + }), + }) + .partial() + +export type assetSearchAllFilter = z.infer + +const assetSearchAllFilterRoute = createRoute({ + path: "/", + method: "get", + description: "Filter all assets", + tags: ["Asset"], + request: { + query: assetSearchAllFilterSchema, + }, + responses: { + 200: { + description: "Found assets", + content: { + "application/json": { + schema: assetSearchAllFilterResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.openapi(assetSearchAllFilterRoute, async (ctx) => { + const { drizzle } = await getConnection(ctx.env) + + const { name, game, category, tags, offset } = ctx.req.valid("query") + + const gameList = game ? SplitQueryByCommas(game.toLowerCase()) : null + const categoryList = category + ? SplitQueryByCommas(category.toLowerCase()) + : null + const searchQuery = name ?? null + const tagList = tags ? SplitQueryByCommas(tags.toLowerCase()) : null + + // is this bad for performance? probably + const assets = await drizzle.query.asset.findMany({ + where: (asset, { and, or, like, eq, sql }) => + and( + tagList && tagList.length > 0 + ? or( + ...tagList.map( + (t) => + sql`EXISTS (SELECT 1 FROM assetTagAsset WHERE assetTagAsset.asset_id = ${asset.id} AND assetTagAsset.asset_tag_id = ${t})` + ) + ) + : undefined, + searchQuery ? like(asset.name, `%${searchQuery}%`) : undefined, + gameList + ? or(...gameList.map((game) => eq(asset.gameId, game))) + : undefined, + categoryList + ? or( + ...categoryList.map((category) => + eq(asset.assetCategoryId, category) + ) + ) + : undefined, + eq(asset.status, "approved") + ), + limit: 100, + offset: offset ? parseInt(offset) : 0, + with: { + assetTagAsset: { + with: { + assetTag: true, + }, + }, + }, + }) + + return ctx.json( + { + success: true, + assets, + }, + 200 + ) +}) + +export default handler diff --git a/src/v2/routes/asset/search/all/openapi.ts b/src/v2/routes/asset/search/all/openapi.ts deleted file mode 100644 index ba5cfb5..0000000 --- a/src/v2/routes/asset/search/all/openapi.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { createRoute } from "@hono/zod-openapi" -import { - assetSearchAllFilterSchema, - assetSearchAllFilterResponseSchema, -} from "./schema" -import { GenericResponses } from "@/v2/lib/response-schemas" - -export const assetSearchAllFilterRoute = createRoute({ - path: "/", - method: "get", - description: "Filter all assets", - tags: ["Asset"], - request: { - query: assetSearchAllFilterSchema, - }, - responses: { - 200: { - description: "Found assets", - content: { - "application/json": { - schema: assetSearchAllFilterResponseSchema, - }, - }, - }, - ...GenericResponses, - }, -}) diff --git a/src/v2/routes/asset/search/all/route.ts b/src/v2/routes/asset/search/all/route.ts deleted file mode 100644 index 80dbe26..0000000 --- a/src/v2/routes/asset/search/all/route.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { OpenAPIHono } from "@hono/zod-openapi" -import { assetSearchAllFilterRoute } from "./openapi" -import { getConnection } from "@/v2/db/turso" -import { SplitQueryByCommas } from "@/v2/lib/helpers/split-query-by-commas" - -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() - -handler.openapi(assetSearchAllFilterRoute, async (ctx) => { - const { drizzle } = await getConnection(ctx.env) - - const { name, game, category, tags, offset } = ctx.req.valid("query") - - const gameList = game ? SplitQueryByCommas(game.toLowerCase()) : null - const categoryList = category - ? SplitQueryByCommas(category.toLowerCase()) - : null - const searchQuery = name ?? null - const tagList = tags ? SplitQueryByCommas(tags.toLowerCase()) : null - - // is this bad for performance? probably - const assets = await drizzle.query.asset.findMany({ - where: (asset, { and, or, like, eq, sql }) => - and( - tagList && tagList.length > 0 - ? or( - ...tagList.map( - (t) => - sql`EXISTS (SELECT 1 FROM assetTagAsset WHERE assetTagAsset.asset_id = ${asset.id} AND assetTagAsset.asset_tag_id = ${t})` - ) - ) - : undefined, - searchQuery ? like(asset.name, `%${searchQuery}%`) : undefined, - gameList - ? or(...gameList.map((game) => eq(asset.gameId, game))) - : undefined, - categoryList - ? or( - ...categoryList.map((category) => - eq(asset.assetCategoryId, category) - ) - ) - : undefined, - eq(asset.status, "approved") - ), - limit: 100, - offset: offset ? parseInt(offset) : 0, - with: { - assetTagAsset: { - with: { - assetTag: true, - }, - }, - }, - }) - - return ctx.json( - { - success: true, - assets, - }, - 200 - ) -}) - -export default handler diff --git a/src/v2/routes/asset/search/all/schema.ts b/src/v2/routes/asset/search/all/schema.ts deleted file mode 100644 index e163fc3..0000000 --- a/src/v2/routes/asset/search/all/schema.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { z } from "@hono/zod-openapi" -import { - selectAssetSchema, - selectAssetTagAssetSchema, - selectAssetTagSchema, -} from "@/v2/db/schema" - -export const assetSearchAllFilterResponseSchema = z.object({ - success: z.literal(true), - // mmm nested schemas - assets: z.array( - selectAssetSchema.extend({ - assetTagAsset: z.array( - selectAssetTagAssetSchema.extend({ - assetTag: selectAssetTagSchema, - }) - ), - }) - ), -}) - -export const assetSearchAllFilterSchema = z - .object({ - name: z.string().openapi({ - param: { - description: - "The name of the asset(s) to retrieve. Doesn't have to be exact, uses 'like' operator to search.", - name: "name", - in: "query", - example: "keqing", - required: false, - }, - }), - game: z.string().openapi({ - param: { - description: - "The game id(s) of the asset(s) to retrieve. Comma seperated.", - name: "game", - in: "query", - example: "genshin-impact,honkai-impact-3rd", - required: false, - }, - }), - category: z.string().openapi({ - param: { - description: - "The category id(s) of the asset(s) to retrieve. Comma seperated.", - name: "category", - in: "query", - example: "character-sheets,splash-art", - required: false, - }, - }), - tags: z.string().openapi({ - param: { - description: "The tag id(s) of the asset(s) to retrieve.", - name: "tags", - in: "query", - example: "official,fanmade", - required: false, - }, - }), - offset: z.string().openapi({ - param: { - description: - "The offset of the asset(s) to retrieve. For pagination / infinite scrolling.", - name: "offset", - example: "0", - in: "query", - required: false, - }, - }), - }) - .partial() - -export type assetSearchAllFilter = z.infer diff --git a/src/v2/routes/asset/search/handler.ts b/src/v2/routes/asset/search/handler.ts deleted file mode 100644 index f3a0832..0000000 --- a/src/v2/routes/asset/search/handler.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { OpenAPIHono } from "@hono/zod-openapi" -import FilterAssetSearchAllRoute from "@/v2/routes/asset/search/all/route" - -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() - -handler.route("/all", FilterAssetSearchAllRoute) - -export default handler diff --git a/src/v2/routes/asset/likes/unlike/id/[id]/route.ts b/src/v2/routes/asset/unlike-asset.ts similarity index 68% rename from src/v2/routes/asset/likes/unlike/id/[id]/route.ts rename to src/v2/routes/asset/unlike-asset.ts index e33f6ce..911173d 100644 --- a/src/v2/routes/asset/likes/unlike/id/[id]/route.ts +++ b/src/v2/routes/asset/unlike-asset.ts @@ -1,9 +1,48 @@ import { OpenAPIHono } from "@hono/zod-openapi" -import { unlikeAssetByIdRoute } from "./openapi" import { getConnection } from "@/v2/db/turso" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" import { asset, assetLikes } from "@/v2/db/schema" import { and, eq } from "drizzle-orm" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" + +const unlikeAssetByIdSchema = z.object({ + id: z.string().openapi({ + param: { + description: "The id of the asset to unlike.", + example: "1", + in: "path", + name: "id", + required: true, + }, + }), +}) + +const unlikeAssetByIdResponseSchema = z.object({ + success: z.literal(true), +}) + +const unlikeAssetByIdRoute = createRoute({ + path: "/{id}", + method: "post", + description: "Unlike an asset from their ID.", + tags: ["Asset"], + request: { + params: unlikeAssetByIdSchema, + }, + responses: { + 200: { + description: "True if the asset was unliked.", + content: { + "application/json": { + schema: unlikeAssetByIdResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() diff --git a/src/v2/routes/asset/upload/route.ts b/src/v2/routes/asset/upload-asset.ts similarity index 50% rename from src/v2/routes/asset/upload/route.ts rename to src/v2/routes/asset/upload-asset.ts index 617e55c..5aea818 100644 --- a/src/v2/routes/asset/upload/route.ts +++ b/src/v2/routes/asset/upload-asset.ts @@ -1,9 +1,93 @@ import { OpenAPIHono } from "@hono/zod-openapi" -import { uploadAssetRoute } from "./openapi" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" import { getConnection } from "@/v2/db/turso" import { SplitQueryByCommas } from "@/v2/lib/helpers/split-query-by-commas" import { assetTagAsset } from "@/v2/db/schema" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" + +const AcceptedImageType = "image/png" +const MaxFileSize = 5 * 1024 * 1024 + +const uploadAssetSchema = z.object({ + asset: z + .any() + .openapi({ + description: "The image of the asset to upload.", + example: "asset", + }) + .refine((files) => files?.length == 1, "An image is required.") + .refine( + (files) => files?.[0]?.size <= MaxFileSize, + `Max file size is 5MB)` + ) + .refine( + (files) => files?.[0]?.type === AcceptedImageType, + `Only ${AcceptedImageType} is accepted.` + ), + name: z.string().min(3).max(32).openapi({ + description: "The name of the asset.", + example: "keqing-nobg.png", + }), + tags: z + .string() + .openapi({ + description: "Comma seperated list of tags for the asset.", + example: "official,1.0", + }) + .optional(), + assetCategoryId: z.string().openapi({ + description: "The asset category ID for the asset.", + example: "splash-art", + }), + gameId: z.string().openapi({ + description: "The game ID for the asset.", + example: "genshin-impact", + }), + assetIsSuggestive: z + .string() + .min(1) + .max(1) + .openapi({ + description: "If the asset contains suggestive content 0 or 1.", + example: "1", + }) + .transform((value) => parseInt(value)) + .refine((value) => value === 1 || value === 0), +}) + +const uploadAssetResponseSchema = z.object({ + success: z.literal(true), +}) + +const uploadAssetRoute = createRoute({ + path: "/", + method: "post", + description: "Upload a new asset.", + tags: ["Asset"], + request: { + body: { + content: { + "multipart/form-data": { + schema: uploadAssetSchema, + }, + }, + }, + }, + responses: { + 200: { + description: "The uploaded asset.", + content: { + "application/json": { + schema: uploadAssetResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.openapi(uploadAssetRoute, async (ctx) => { @@ -82,7 +166,6 @@ handler.openapi(uploadAssetRoute, async (ctx) => { return ctx.json( { success: true, - asset: createdAsset[0], }, 200 ) diff --git a/src/v2/routes/asset/upload/openapi.ts b/src/v2/routes/asset/upload/openapi.ts deleted file mode 100644 index d88821c..0000000 --- a/src/v2/routes/asset/upload/openapi.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { createRoute } from "@hono/zod-openapi" -import { uploadAssetSchema } from "./schema" - -export const uploadAssetRoute = createRoute({ - path: "/", - method: "post", - description: "Upload a new asset.", - tags: ["Asset"], - request: { - body: { - content: { - "multipart/form-data": { - schema: uploadAssetSchema, - }, - }, - }, - }, - responses: { - 200: { - description: "Returns the new asset.", - }, - 400: { - description: "Bad request.", - }, - 401: { - description: "Unauthorized.", - }, - 500: { - description: "Internal server error.", - }, - }, -}) diff --git a/src/v2/routes/asset/upload/schema.ts b/src/v2/routes/asset/upload/schema.ts deleted file mode 100644 index 6bad6a7..0000000 --- a/src/v2/routes/asset/upload/schema.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { z } from "@hono/zod-openapi" - -const AcceptedImageType = "image/png" -const MaxFileSize = 5 * 1024 * 1024 - -export const uploadAssetSchema = z.object({ - asset: z - .any() - .openapi({ - description: "The image of the asset to upload.", - example: "asset", - }) - .refine((files) => files?.length == 1, "An image is required.") - .refine( - (files) => files?.[0]?.size <= MaxFileSize, - `Max file size is 5MB)` - ) - .refine( - (files) => files?.[0]?.type === AcceptedImageType, - `Only ${AcceptedImageType} is accepted.` - ), - name: z.string().min(3).max(32).openapi({ - description: "The name of the asset.", - example: "keqing-nobg.png", - }), - tags: z - .string() - .openapi({ - description: "Comma seperated list of tags for the asset.", - example: "official,1.0", - }) - .optional(), - assetCategoryId: z.string().openapi({ - description: "The asset category ID for the asset.", - example: "splash-art", - }), - gameId: z.string().openapi({ - description: "The game ID for the asset.", - example: "genshin-impact", - }), - assetIsSuggestive: z - .string() - .min(1) - .max(1) - .openapi({ - description: "If the asset contains suggestive content 0 or 1.", - example: "1", - }) - .transform((value) => parseInt(value)) - .refine((value) => value === 1 || value === 0), -}) diff --git a/src/v2/routes/collection/asset/handler.ts b/src/v2/routes/collection/asset/handler.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/collection/asset/remove/id/[id]/openapi.ts b/src/v2/routes/collection/asset/remove/id/[id]/openapi.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/collection/asset/remove/id/[id]/route.ts b/src/v2/routes/collection/asset/remove/id/[id]/route.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/collection/asset/remove/id/[id]/schema.ts b/src/v2/routes/collection/asset/remove/id/[id]/schema.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/collection/create/openapi.ts b/src/v2/routes/collection/create/openapi.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/collection/create/route.ts b/src/v2/routes/collection/create/route.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/collection/create/schema.ts b/src/v2/routes/collection/create/schema.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/collection/delete/id/[id]/openapi.ts b/src/v2/routes/collection/delete/id/[id]/openapi.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/collection/delete/id/[id]/route.ts b/src/v2/routes/collection/delete/id/[id]/route.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/collection/delete/id/[id]/schema.ts b/src/v2/routes/collection/delete/id/[id]/schema.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/collection/get/id/[id]/openapi.ts b/src/v2/routes/collection/get/id/[id]/openapi.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/collection/get/id/[id]/route.ts b/src/v2/routes/collection/get/id/[id]/route.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/collection/get/id/[id]/schema.ts b/src/v2/routes/collection/get/id/[id]/schema.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/collection/get/user/id/[id]/openapi.ts b/src/v2/routes/collection/get/user/id/[id]/openapi.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/collection/get/user/id/[id]/route.ts b/src/v2/routes/collection/get/user/id/[id]/route.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/collection/get/user/id/[id]/schema.ts b/src/v2/routes/collection/get/user/id/[id]/schema.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/collection/get/user/username/[username]/openapi.ts b/src/v2/routes/collection/get/user/username/[username]/openapi.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/collection/get/user/username/[username]/route.ts b/src/v2/routes/collection/get/user/username/[username]/route.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/collection/get/user/username/[username]/schema.ts b/src/v2/routes/collection/get/user/username/[username]/schema.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/collection/handler.ts b/src/v2/routes/collection/handler.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/contributors/all-contributors.ts b/src/v2/routes/contributors/all-contributors.ts new file mode 100644 index 0000000..8c6b0b3 --- /dev/null +++ b/src/v2/routes/contributors/all-contributors.ts @@ -0,0 +1,67 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { getConnection } from "@/v2/db/turso" +import { authUser } from "@/v2/db/schema" +import { eq } from "drizzle-orm" +import { createRoute } from "@hono/zod-openapi" +import { selectUserSchema } from "@/v2/db/schema" +import { z } from "zod" + +const contributorListSchema = z.object({ + success: z.literal(true), + contributors: selectUserSchema + .pick({ + id: true, + username: true, + avatarUrl: true, + plan: true, + role: true, + }) + .array(), +}) + +const contributorsRoute = createRoute({ + path: "/", + method: "get", + description: "Get a list of all contributors.", + tags: ["Contributors"], + responses: { + 200: { + description: "All Contributors.", + content: { + "application/json": { + schema: contributorListSchema, + }, + }, + }, + 500: { + description: "Internal server error.", + }, + }, +}) + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.openapi(contributorsRoute, async (ctx) => { + const { drizzle } = await getConnection(ctx.env) + + const contributors = await drizzle + .select({ + id: authUser.id, + username: authUser.username, + avatarUrl: authUser.avatarUrl, + plan: authUser.plan, + role: authUser.role, + }) + .from(authUser) + .where(eq(authUser.isContributor, true)) + + return ctx.json( + { + success: true, + contributors, + }, + 200 + ) +}) + +export default handler diff --git a/src/v2/routes/contributors/get/all/openapi.ts b/src/v2/routes/contributors/get/all/openapi.ts deleted file mode 100644 index 161aa1c..0000000 --- a/src/v2/routes/contributors/get/all/openapi.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { createRoute } from "@hono/zod-openapi" -import { selectUserSchema } from "@/v2/db/schema" -import { z } from "zod" - -const contributorListSchema = z.object({ - success: z.literal(true), - contributors: selectUserSchema - .pick({ - id: true, - username: true, - avatarUrl: true, - plan: true, - role: true, - }) - .array(), -}) -export const contributorsRoute = createRoute({ - path: "/all", - method: "get", - description: "Get a list of all contributors.", - tags: ["Contributors"], - responses: { - 200: { - description: "All Contributors.", - content: { - "application/json": { - schema: contributorListSchema, - }, - }, - }, - 500: { - description: "Internal server error.", - }, - }, -}) diff --git a/src/v2/routes/contributors/get/all/route.ts b/src/v2/routes/contributors/get/all/route.ts deleted file mode 100644 index 3cef571..0000000 --- a/src/v2/routes/contributors/get/all/route.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { OpenAPIHono } from "@hono/zod-openapi" -import { contributorsRoute } from "./openapi" -import { getConnection } from "@/v2/db/turso" -import { authUser } from "@/v2/db/schema" -import { eq } from "drizzle-orm" - -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() - -handler.openapi(contributorsRoute, async (ctx) => { - const { drizzle } = await getConnection(ctx.env) - - const contributors = await drizzle - .select({ - id: authUser.id, - username: authUser.username, - avatarUrl: authUser.avatarUrl, - plan: authUser.plan, - role: authUser.role, - }) - .from(authUser) - .where(eq(authUser.isContributor, true)) - - return ctx.json( - { - success: true, - contributors, - }, - 200 - ) -}) - -export default handler diff --git a/src/v2/routes/contributors/handler.ts b/src/v2/routes/contributors/handler.ts index 88944d6..5b38368 100644 --- a/src/v2/routes/contributors/handler.ts +++ b/src/v2/routes/contributors/handler.ts @@ -1,8 +1,8 @@ import { OpenAPIHono } from "@hono/zod-openapi" -import AllContributorsRoute from "@/v2/routes/contributors/get/all/route" +import AllContributorsRoute from "./all-contributors" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() -handler.route("/get/list", AllContributorsRoute) +handler.route("/all", AllContributorsRoute) export default handler diff --git a/src/v2/routes/favorite/asset/add/id/[id]/openapi.ts b/src/v2/routes/favorite/asset/add/id/[id]/openapi.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/favorite/asset/add/id/[id]/route.ts b/src/v2/routes/favorite/asset/add/id/[id]/route.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/favorite/asset/add/id/[id]/schema.ts b/src/v2/routes/favorite/asset/add/id/[id]/schema.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/favorite/asset/remove/id/[id]/openapi.ts b/src/v2/routes/favorite/asset/remove/id/[id]/openapi.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/favorite/asset/remove/id/[id]/route.ts b/src/v2/routes/favorite/asset/remove/id/[id]/route.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/favorite/asset/remove/id/[id]/schema.ts b/src/v2/routes/favorite/asset/remove/id/[id]/schema.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/favorite/get/user/username/[username]/openapi.ts b/src/v2/routes/favorite/get/user/username/[username]/openapi.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/favorite/get/user/username/[username]/route.ts b/src/v2/routes/favorite/get/user/username/[username]/route.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/favorite/get/user/username/[username]/schema.ts b/src/v2/routes/favorite/get/user/username/[username]/schema.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/favorite/modify/openapi.ts b/src/v2/routes/favorite/modify/openapi.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/favorite/modify/route.ts b/src/v2/routes/favorite/modify/route.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/favorite/modify/schema.ts b/src/v2/routes/favorite/modify/schema.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/favorite/route.ts b/src/v2/routes/favorite/route.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/game/all-games.ts b/src/v2/routes/game/all-games.ts new file mode 100644 index 0000000..835ed66 --- /dev/null +++ b/src/v2/routes/game/all-games.ts @@ -0,0 +1,48 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { getConnection } from "@/v2/db/turso" +import { game } from "@/v2/db/schema" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { createRoute } from "@hono/zod-openapi" +import { z } from "@hono/zod-openapi" +import { selectGameSchema } from "@/v2/db/schema" + +export const getAllGamesResponse = z.object({ + success: z.literal(true), + games: selectGameSchema.array(), +}) + +const getAllGamesRoute = createRoute({ + path: "/all", + method: "get", + description: "Get all games.", + tags: ["Game"], + responses: { + 200: { + description: "All games.", + content: { + "application/json": { + schema: getAllGamesResponse, + }, + }, + }, + ...GenericResponses, + }, +}) + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.openapi(getAllGamesRoute, async (ctx) => { + const { drizzle } = await getConnection(ctx.env) + + const games = (await drizzle.select().from(game)) ?? [] + + return ctx.json( + { + success: true, + games, + }, + 200 + ) +}) + +export default handler diff --git a/src/v2/routes/game/create/route.ts b/src/v2/routes/game/create-game.ts similarity index 50% rename from src/v2/routes/game/create/route.ts rename to src/v2/routes/game/create-game.ts index 4f4671d..77b0e6a 100644 --- a/src/v2/routes/game/create/route.ts +++ b/src/v2/routes/game/create-game.ts @@ -1,9 +1,66 @@ import { OpenAPIHono } from "@hono/zod-openapi" -import { createGameRoute } from "./openapi" import { game } from "@/v2/db/schema" import { eq } from "drizzle-orm" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" import { getConnection } from "@/v2/db/turso" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" +import { selectGameSchema } from "@/v2/db/schema" + +export const createGameSchema = z.object({ + name: z.string().min(3).max(32).openapi({ + description: "The name of the game.", + example: "honkai-star-rail", + }), + formattedName: z.string().min(3).max(64).openapi({ + description: "The formatted name of the game.", + example: "Honkai: Star Rail", + }), + possibleSuggestiveContent: z + .string() + .min(0) + .max(1) + .openapi({ + description: + "If the game contains suggestive content. 1 = Yes, 0 = No.", + example: "1", + }) + .transform((value) => parseInt(value)) + .refine((value) => value === 1 || value === 0), +}) + +export const createGameResponse = z.object({ + success: z.literal(true), + game: selectGameSchema, +}) + +const createGameRoute = createRoute({ + path: "/", + method: "post", + description: "Create a new game.", + tags: ["Game"], + request: { + body: { + content: { + "application/json": { + schema: createGameSchema, + }, + }, + }, + }, + responses: { + 200: { + description: "Returns the new game.", + content: { + "application/json": { + schema: createGameResponse, + }, + }, + }, + ...GenericResponses, + }, +}) const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() diff --git a/src/v2/routes/game/create/openapi.ts b/src/v2/routes/game/create/openapi.ts deleted file mode 100644 index b6d5cc4..0000000 --- a/src/v2/routes/game/create/openapi.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { createRoute } from "@hono/zod-openapi" -import { createGameSchema, createGameResponse } from "./schema" -import { GenericResponses } from "@/v2/lib/response-schemas" - -export const createGameRoute = createRoute({ - path: "/", - method: "post", - description: "Create a new game.", - tags: ["Game"], - request: { - body: { - content: { - "application/json": { - schema: createGameSchema, - }, - }, - }, - }, - responses: { - 200: { - description: "Returns the new game.", - content: { - "application/json": { - schema: createGameResponse, - }, - }, - }, - ...GenericResponses, - }, -}) diff --git a/src/v2/routes/game/create/schema.ts b/src/v2/routes/game/create/schema.ts deleted file mode 100644 index 530710d..0000000 --- a/src/v2/routes/game/create/schema.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { z } from "@hono/zod-openapi" -import { selectGameSchema } from "@/v2/db/schema" - -export const createGameSchema = z.object({ - name: z.string().min(3).max(32).openapi({ - description: "The name of the game.", - example: "honkai-star-rail", - }), - formattedName: z.string().min(3).max(64).openapi({ - description: "The formatted name of the game.", - example: "Honkai: Star Rail", - }), - possibleSuggestiveContent: z - .string() - .min(0) - .max(1) - .openapi({ - description: - "If the game contains suggestive content. 1 = Yes, 0 = No.", - example: "1", - }) - .transform((value) => parseInt(value)) - .refine((value) => value === 1 || value === 0), -}) - -export const createGameResponse = z.object({ - success: z.literal(true), - game: selectGameSchema, -}) diff --git a/src/v2/routes/game/delete/id/[id]/route.ts b/src/v2/routes/game/delete-game.ts similarity index 59% rename from src/v2/routes/game/delete/id/[id]/route.ts rename to src/v2/routes/game/delete-game.ts index 47f9667..ae4e97e 100644 --- a/src/v2/routes/game/delete/id/[id]/route.ts +++ b/src/v2/routes/game/delete-game.ts @@ -1,9 +1,48 @@ import { OpenAPIHono } from "@hono/zod-openapi" -import { deleteGameRoute } from "./openapi" import { getConnection } from "@/v2/db/turso" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" import { game } from "@/v2/db/schema" import { eq } from "drizzle-orm" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" + +export const deleteGameSchema = z.object({ + id: z.string().openapi({ + param: { + name: "id", + in: "path", + description: "The ID of the game to delete.", + example: "genshin-impact", + required: true, + }, + }), +}) + +export const deleteGameResponse = z.object({ + success: z.literal(true), +}) + +const deleteGameRoute = createRoute({ + path: "/{id}", + method: "delete", + description: "Delete a game & all its related assets.", + tags: ["Game"], + request: { + params: deleteGameSchema, + }, + responses: { + 200: { + description: "Returns boolean indicating success.", + content: { + "application/json": { + schema: deleteGameResponse, + }, + }, + }, + ...GenericResponses, + }, +}) const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() diff --git a/src/v2/routes/game/delete/id/[id]/openapi.ts b/src/v2/routes/game/delete/id/[id]/openapi.ts deleted file mode 100644 index b595ac1..0000000 --- a/src/v2/routes/game/delete/id/[id]/openapi.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { createRoute } from "@hono/zod-openapi" -import { deleteGameSchema, deleteGameResponse } from "./schema" -import { GenericResponses } from "@/v2/lib/response-schemas" - -export const deleteGameRoute = createRoute({ - path: "/{id}", - method: "delete", - description: "Delete a game & all its related assets.", - tags: ["Game"], - request: { - params: deleteGameSchema, - }, - responses: { - 200: { - description: "Returns boolean indicating success.", - content: { - "application/json": { - schema: deleteGameResponse, - }, - }, - }, - ...GenericResponses, - }, -}) diff --git a/src/v2/routes/game/delete/id/[id]/schema.ts b/src/v2/routes/game/delete/id/[id]/schema.ts deleted file mode 100644 index 5c18992..0000000 --- a/src/v2/routes/game/delete/id/[id]/schema.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { z } from "@hono/zod-openapi" - -export const deleteGameSchema = z.object({ - id: z.string().openapi({ - param: { - name: "id", - in: "path", - description: "The ID of the game to delete.", - example: "genshin-impact", - required: true, - }, - }), -}) - -export const deleteGameResponse = z.object({ - success: z.literal(true), -}) diff --git a/src/v2/routes/game/get-game.ts b/src/v2/routes/game/get-game.ts new file mode 100644 index 0000000..2e5c15e --- /dev/null +++ b/src/v2/routes/game/get-game.ts @@ -0,0 +1,75 @@ +import { OpenAPIHono, createRoute } from "@hono/zod-openapi" +import { game } from "@/v2/db/schema" +import { getConnection } from "@/v2/db/turso" +import { eq } from "drizzle-orm" +import { z } from "@hono/zod-openapi" +import { selectGameSchema } from "@/v2/db/schema" +import { GenericResponses } from "@/v2/lib/response-schemas" + +const getGameByIdSchema = z.object({ + id: z.string().openapi({ + param: { + name: "id", + in: "path", + description: "The ID of the game to retrieve.", + example: "genshin-impact", + required: true, + }, + }), +}) + +const getGameByIDResponse = z.object({ + success: z.literal(true), + game: selectGameSchema, +}) + +const getGameByIdRoute = createRoute({ + path: "/{id}", + method: "get", + description: "Get a game by their ID.", + tags: ["Game"], + request: { + params: getGameByIdSchema, + }, + responses: { + 200: { + description: "Game was found.", + content: { + "application/json": { + schema: getGameByIDResponse, + }, + }, + }, + ...GenericResponses, + }, +}) + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.openapi(getGameByIdRoute, async (ctx) => { + const id = ctx.req.valid("param").id + + const { drizzle } = await getConnection(ctx.env) + + const [foundGame] = await drizzle.select().from(game).where(eq(game.id, id)) + + if (!foundGame) { + return ctx.json( + { + success: false, + message: "Game not found", + }, + 400 + ) + } + + return ctx.json( + { + success: true, + game: foundGame, + }, + 200 + ) +}) + +export default handler diff --git a/src/v2/routes/game/get/all/openapi.ts b/src/v2/routes/game/get/all/openapi.ts deleted file mode 100644 index 6a2d6af..0000000 --- a/src/v2/routes/game/get/all/openapi.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { GenericResponses } from "@/v2/lib/response-schemas" -import { createRoute } from "@hono/zod-openapi" -import { getAllGamesResponse } from "./schema" - -export const getAllGamesRoute = createRoute({ - path: "/all", - method: "get", - description: "Get all games.", - tags: ["Game"], - responses: { - 200: { - description: "All games.", - content: { - "application/json": { - schema: getAllGamesResponse, - }, - }, - }, - ...GenericResponses, - }, -}) diff --git a/src/v2/routes/game/get/all/route.ts b/src/v2/routes/game/get/all/route.ts deleted file mode 100644 index 88fbeed..0000000 --- a/src/v2/routes/game/get/all/route.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { OpenAPIHono } from "@hono/zod-openapi" -import { getAllGamesRoute } from "./openapi" -import { getConnection } from "@/v2/db/turso" -import { game } from "@/v2/db/schema" - -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() - -handler.openapi(getAllGamesRoute, async (ctx) => { - const { drizzle } = await getConnection(ctx.env) - - const games = (await drizzle.select().from(game)) ?? [] - - return ctx.json( - { - success: true, - games, - }, - 200 - ) -}) - -export default handler diff --git a/src/v2/routes/game/get/all/schema.ts b/src/v2/routes/game/get/all/schema.ts deleted file mode 100644 index 2aa3840..0000000 --- a/src/v2/routes/game/get/all/schema.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { z } from "@hono/zod-openapi" -import { selectGameSchema } from "@/v2/db/schema" - -export const getAllGamesResponse = z.object({ - success: z.literal(true), - games: selectGameSchema.array(), -}) diff --git a/src/v2/routes/game/get/handler.ts b/src/v2/routes/game/get/handler.ts deleted file mode 100644 index a6be1d7..0000000 --- a/src/v2/routes/game/get/handler.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { OpenAPIHono } from "@hono/zod-openapi" -import GetGameByNameRoute from "./name/[name]/route" -import GetGameByIdRoute from "./id/[id]/route" -import GetAllGamesRoute from "./all/route" - -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() - -handler.route("/name", GetGameByNameRoute) -handler.route("/id", GetGameByIdRoute) -handler.route("/list", GetAllGamesRoute) - -export default handler diff --git a/src/v2/routes/game/get/id/[id]/openapi.ts b/src/v2/routes/game/get/id/[id]/openapi.ts deleted file mode 100644 index 1b31047..0000000 --- a/src/v2/routes/game/get/id/[id]/openapi.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { createRoute } from "@hono/zod-openapi" -import { getGameByIdSchema, getGameByIDResponse } from "./schema" -import { GenericResponses } from "@/v2/lib/response-schemas" - -export const getGameByIdRoute = createRoute({ - path: "/{id}", - method: "get", - description: "Get a game by their ID.", - tags: ["Game"], - request: { - params: getGameByIdSchema, - }, - responses: { - 200: { - description: "Game was found.", - content: { - "application/json": { - schema: getGameByIDResponse, - }, - }, - }, - ...GenericResponses, - }, -}) diff --git a/src/v2/routes/game/get/id/[id]/route.ts b/src/v2/routes/game/get/id/[id]/route.ts deleted file mode 100644 index 0bacc6d..0000000 --- a/src/v2/routes/game/get/id/[id]/route.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { OpenAPIHono } from "@hono/zod-openapi" -import { getGameByIdRoute } from "./openapi" -import { game } from "@/v2/db/schema" -import { getConnection } from "@/v2/db/turso" -import { eq } from "drizzle-orm" - -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() - -handler.openapi(getGameByIdRoute, async (ctx) => { - const id = ctx.req.valid("param").id - - const { drizzle } = await getConnection(ctx.env) - - const [foundGame] = await drizzle.select().from(game).where(eq(game.id, id)) - - if (!foundGame) { - return ctx.json( - { - success: false, - message: "Game not found", - }, - 400 - ) - } - - return ctx.json( - { - success: true, - game: foundGame, - }, - 200 - ) -}) - -export default handler diff --git a/src/v2/routes/game/get/id/[id]/schema.ts b/src/v2/routes/game/get/id/[id]/schema.ts deleted file mode 100644 index 507dae6..0000000 --- a/src/v2/routes/game/get/id/[id]/schema.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { z } from "@hono/zod-openapi" -import { selectGameSchema } from "@/v2/db/schema" - -export const getGameByIdSchema = z.object({ - id: z.string().openapi({ - param: { - name: "id", - in: "path", - description: "The ID of the game to retrieve.", - example: "genshin-impact", - required: true, - }, - }), -}) - -export const getGameByIDResponse = z.object({ - success: z.literal(true), - game: selectGameSchema, -}) diff --git a/src/v2/routes/game/get/name/[name]/openapi.ts b/src/v2/routes/game/get/name/[name]/openapi.ts deleted file mode 100644 index 98a2f58..0000000 --- a/src/v2/routes/game/get/name/[name]/openapi.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { createRoute } from "@hono/zod-openapi" -import { getGameByNameSchema, getGameByNameResponse } from "./schema" -import { GenericResponses } from "@/v2/lib/response-schemas" - -export const getGameByNameRoute = createRoute({ - path: "/{name}", - method: "get", - description: "Search for games by their name.", - tags: ["Game"], - request: { - params: getGameByNameSchema, - }, - responses: { - 200: { - description: "Game was found.", - content: { - "application/json": { - schema: getGameByNameResponse, - }, - }, - }, - ...GenericResponses, - }, -}) diff --git a/src/v2/routes/game/get/name/[name]/route.ts b/src/v2/routes/game/get/name/[name]/route.ts deleted file mode 100644 index b8681fb..0000000 --- a/src/v2/routes/game/get/name/[name]/route.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { OpenAPIHono } from "@hono/zod-openapi" -import { getGameByNameRoute } from "./openapi" -import { game } from "@/v2/db/schema" -import { eq } from "drizzle-orm" -import { getConnection } from "@/v2/db/turso" - -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() - -handler.openapi(getGameByNameRoute, async (ctx) => { - const name = ctx.req.valid("param").name - - const { drizzle } = await getConnection(ctx.env) - - const [foundGame] = await drizzle - .select() - .from(game) - .where(eq(game.name, name)) - - if (!foundGame) { - return ctx.json( - { - success: true, - message: "Game not found", - }, - 400 - ) - } - - return ctx.json( - { - success: true, - game: foundGame, - }, - 200 - ) -}) - -export default handler diff --git a/src/v2/routes/game/get/name/[name]/schema.ts b/src/v2/routes/game/get/name/[name]/schema.ts deleted file mode 100644 index 9a9430e..0000000 --- a/src/v2/routes/game/get/name/[name]/schema.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { z } from "@hono/zod-openapi" -import { selectGameSchema } from "@/v2/db/schema" - -export const getGameByNameSchema = z.object({ - name: z.string().openapi({ - param: { - name: "name", - in: "path", - required: true, - description: "The name of the game to retrieve.", - example: "genshin-impact", - }, - }), -}) - -export const getGameByNameResponse = z.object({ - success: z.literal(true), - game: selectGameSchema, -}) diff --git a/src/v2/routes/game/handler.ts b/src/v2/routes/game/handler.ts index 9c8fc17..dac3175 100644 --- a/src/v2/routes/game/handler.ts +++ b/src/v2/routes/game/handler.ts @@ -1,14 +1,18 @@ import { OpenAPIHono } from "@hono/zod-openapi" -import GameGetRoute from "./get/handler" -import GameCreateRoute from "./create/route" -import DeleteGameRoute from "./delete/id/[id]/route" -import ModifyGameRoute from "./modify/id/[id]/route" +import GameCreateRoute from "./create-game" +import DeleteGameRoute from "./delete-game" +import ModifyGameRoute from "./modify-game" +import GameGetRoute from "./get-game" +import AllGamesRoute from "./all-games" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.route("/get", GameGetRoute) +handler.route("/modify", ModifyGameRoute) +handler.route("/delete", DeleteGameRoute) + handler.route("/create", GameCreateRoute) -handler.route("/modify/id", ModifyGameRoute) -handler.route("/delete/id", DeleteGameRoute) + +handler.route("/list", AllGamesRoute) export default handler diff --git a/src/v2/routes/game/modify-game.ts b/src/v2/routes/game/modify-game.ts new file mode 100644 index 0000000..88048ab --- /dev/null +++ b/src/v2/routes/game/modify-game.ts @@ -0,0 +1,136 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { eq } from "drizzle-orm" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +import { getConnection } from "@/v2/db/turso" +import { game } from "@/v2/db/schema" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" +import { selectGameSchema } from "@/v2/db/schema" + +export const modifyGamePathSchema = z.object({ + id: z.string().openapi({ + param: { + name: "id", + description: "The id of the game to modify.", + example: "honkai-star-rail", + in: "path", + required: true, + }, + }), +}) + +const modifyGameSchema = z.object({ + name: z.string().min(3).max(32).openapi({ + description: "The new name of the game.", + example: "honkai-star-rail", + }), + formattedName: z.string().min(3).max(64).openapi({ + description: "The new formatted name of the game.", + example: "Honkai: Star Rail", + }), + possibleSuggestiveContent: z + .string() + .min(0) + .max(1) + .openapi({ + description: + "If the game contains suggestive content. 1 = Yes, 0 = No.", + example: "1", + }) + .transform((value) => parseInt(value)) + .refine((value) => value === 1 || value === 0), +}) + +const modifyGameResponseSchema = z.object({ + success: z.literal(true), + game: selectGameSchema, +}) + +export const modifyGameRoute = createRoute({ + path: "/{id}", + method: "patch", + description: "Modify an existing game.", + tags: ["Game"], + request: { + params: modifyGamePathSchema, + body: { + content: { + "application/json": { + schema: modifyGameSchema, + }, + }, + }, + }, + responses: { + 200: { + description: "Returns the game's attributes", + content: { + "application/json": { + schema: modifyGameResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.openapi(modifyGameRoute, async (ctx) => { + const authSessionManager = new AuthSessionManager(ctx) + + const { user } = await authSessionManager.validateSession() + + if (!user || user.role != "creator") { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + const { name, formattedName, possibleSuggestiveContent } = + ctx.req.valid("json") + const { id } = ctx.req.valid("param") + + const { drizzle } = getConnection(ctx.env) + + const [existingGame] = await drizzle + .select({ id: game.id }) + .from(game) + .where(eq(game.id, id)) + + if (!existingGame.id) { + return ctx.json( + { + success: false, + message: "Game with ID not found", + }, + 400 + ) + } + + const [updatedGame] = await drizzle + .update(game) + .set({ + name, + formattedName, + possibleSuggestiveContent: Boolean(possibleSuggestiveContent), + lastUpdated: new Date().toISOString(), + }) + .where(eq(game.id, id)) + .returning() + + return ctx.json( + { + success: true, + game: updatedGame, + }, + 200 + ) +}) + +export default handler diff --git a/src/v2/routes/game/modify/id/[id]/openapi.ts b/src/v2/routes/game/modify/id/[id]/openapi.ts deleted file mode 100644 index cd78355..0000000 --- a/src/v2/routes/game/modify/id/[id]/openapi.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { createRoute } from "@hono/zod-openapi" -import { - modifyGameSchema, - modifyGameResponseSchema, - modifyGamePathSchema, -} from "./schema" -import { GenericResponses } from "@/v2/lib/response-schemas" - -export const modifyGameRoute = createRoute({ - path: "/{id}", - method: "patch", - description: "Modify an existing game.", - tags: ["Game"], - request: { - params: modifyGamePathSchema, - body: { - content: { - "application/json": { - schema: modifyGameSchema, - }, - }, - }, - }, - responses: { - 200: { - description: "Returns the game's attributes", - content: { - "application/json": { - schema: modifyGameResponseSchema, - }, - }, - }, - ...GenericResponses, - }, -}) diff --git a/src/v2/routes/game/modify/id/[id]/route.ts b/src/v2/routes/game/modify/id/[id]/route.ts deleted file mode 100644 index aaf7904..0000000 --- a/src/v2/routes/game/modify/id/[id]/route.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { OpenAPIHono } from "@hono/zod-openapi" -import { modifyGameRoute } from "./openapi" -import { eq } from "drizzle-orm" -import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" -import { getConnection } from "@/v2/db/turso" -import { game } from "@/v2/db/schema" - -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() - -handler.openapi(modifyGameRoute, async (ctx) => { - const authSessionManager = new AuthSessionManager(ctx) - - const { user } = await authSessionManager.validateSession() - - if (!user || user.role != "creator") { - return ctx.json( - { - success: false, - message: "Unauthorized", - }, - 401 - ) - } - - const { name, formattedName, possibleSuggestiveContent } = - ctx.req.valid("json") - const { id } = ctx.req.valid("param") - - const { drizzle } = getConnection(ctx.env) - - const [existingGame] = await drizzle - .select({ id: game.id }) - .from(game) - .where(eq(game.id, id)) - - if (!existingGame.id) { - return ctx.json( - { - success: false, - message: "Game with ID not found", - }, - 400 - ) - } - - const [updatedGame] = await drizzle - .update(game) - .set({ - name, - formattedName, - possibleSuggestiveContent: Boolean(possibleSuggestiveContent), - lastUpdated: new Date().toISOString(), - }) - .where(eq(game.id, id)) - .returning() - - return ctx.json( - { - success: true, - game: updatedGame, - }, - 200 - ) -}) - -export default handler diff --git a/src/v2/routes/game/modify/id/[id]/schema.ts b/src/v2/routes/game/modify/id/[id]/schema.ts deleted file mode 100644 index c936347..0000000 --- a/src/v2/routes/game/modify/id/[id]/schema.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { z } from "@hono/zod-openapi" -import { selectGameSchema } from "@/v2/db/schema" - -export const modifyGamePathSchema = z.object({ - id: z.string().openapi({ - param: { - name: "id", - description: "The id of the game to modify.", - example: "honkai-star-rail", - in: "path", - required: true, - }, - }), -}) - -export const modifyGameSchema = z.object({ - name: z.string().min(3).max(32).openapi({ - description: "The new name of the game.", - example: "honkai-star-rail", - }), - formattedName: z.string().min(3).max(64).openapi({ - description: "The new formatted name of the game.", - example: "Honkai: Star Rail", - }), - possibleSuggestiveContent: z - .string() - .min(0) - .max(1) - .openapi({ - description: - "If the game contains suggestive content. 1 = Yes, 0 = No.", - example: "1", - }) - .transform((value) => parseInt(value)) - .refine((value) => value === 1 || value === 0), -}) - -export const modifyGameResponseSchema = z.object({ - success: z.literal(true), - game: selectGameSchema, -}) diff --git a/src/v2/routes/handler.ts b/src/v2/routes/handler.ts index 6c594eb..632f6ec 100644 --- a/src/v2/routes/handler.ts +++ b/src/v2/routes/handler.ts @@ -4,17 +4,15 @@ import GameRoute from "@/v2/routes/game/handler" import AssetRoute from "@/v2/routes/asset/handler" import ContributorRoute from "@/v2/routes/contributors/handler" import AuthRoute from "@/v2/routes/auth/handler" -// import CategoryRoute from "@/v2/routes/category/handler" -// import RequestFormRoute from "@/v2/routes/requests/handler" dromzeh: need to figure out financial/supporter side of things before I can implement this +import RequestFormRoute from "@/v2/routes/requests/handler" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.route("/game", GameRoute) -// handler.route("/category", CategoryRoute) handler.route("/asset", AssetRoute) handler.route("/user", UserRoute) -handler.route("/contributor", ContributorRoute) +handler.route("/contributors", ContributorRoute) handler.route("/auth", AuthRoute) -// handler.route("/request", RequestFormRoute) +handler.route("/request", RequestFormRoute) export default handler diff --git a/src/v2/routes/requests/all-requests.ts b/src/v2/routes/requests/all-requests.ts new file mode 100644 index 0000000..4bd7720 --- /dev/null +++ b/src/v2/routes/requests/all-requests.ts @@ -0,0 +1,78 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { RequestFormManager } from "@/v2/lib/managers/request-form/request-form-manager" +import { getConnection } from "@/v2/db/turso" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" +import { selectRequestFormSchema } from "@/v2/db/schema" + +const viewAllRequestsSchema = z + .object({ + offset: z.string().openapi({ + param: { + description: + "The offset of requests to return. This is used for pagination.", + name: "offset", + example: "0", + in: "query", + required: false, + }, + }), + }) + .partial() + +const requestFormSchema = z.object({ + ...selectRequestFormSchema.shape, + upvotesCount: z.number().optional(), +}) + +const viewAllRequestsResponseSchema = z.object({ + success: z.literal(true), + requests: z.array(requestFormSchema), +}) + +const getAllRequestsRoute = createRoute({ + path: "/", + method: "get", + description: + "Get all requests. This will also return all associated upvotes count.", + tags: ["Requests"], + request: { + query: viewAllRequestsSchema, + }, + responses: { + 200: { + description: "List of all submitted requests.", + content: { + "application/json": { + schema: viewAllRequestsResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.openapi(getAllRequestsRoute, async (ctx) => { + const { offset } = ctx.req.valid("query") ?? { offset: "0" } + + const { drizzle } = await getConnection(ctx.env) + + const requestFormManager = new RequestFormManager(drizzle) + + const allRequests = await requestFormManager.getRequestFormEntries( + parseInt(offset) + ) + + return ctx.json( + { + success: true, + requests: allRequests, + }, + 200 + ) +}) + +export default handler diff --git a/src/v2/routes/requests/create-request.ts b/src/v2/routes/requests/create-request.ts new file mode 100644 index 0000000..3df71cd --- /dev/null +++ b/src/v2/routes/requests/create-request.ts @@ -0,0 +1,104 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +import { RequestFormManager } from "@/v2/lib/managers/request-form/request-form-manager" +import { getConnection } from "@/v2/db/turso" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" +import { selectRequestFormSchema } from "@/v2/db/schema" +import type { requestArea } from "@/v2/db/schema" + +const createRequestFormEntrySchema = z.object({ + title: z.string().min(3).max(32).openapi({ + description: "The title of the request.", + example: "Add HSR UI assets", + }), + area: z + .string() + .min(3) + .max(32) + .openapi({ + description: "The area of the request.", + example: "asset", + }) + .transform((value) => value as requestArea), + description: z.string().min(3).max(256).openapi({ + description: "The description of the request.", + example: + "Add the UI assets for Honkai: Star Rail, including the logo and other UI elements.", + }), +}) + +const createRequestFormEntryResponse = z.object({ + success: z.literal(true), + response: selectRequestFormSchema, +}) + +const createRequestFormEntryRoute = createRoute({ + path: "/", + method: "post", + description: "Create a new entry into the request form.", + tags: ["Requests"], + request: { + body: { + content: { + "application/json": { + schema: createRequestFormEntrySchema, + }, + }, + }, + }, + responses: { + 200: { + description: "Returns the new request form entry.", + content: { + "application/json": { + schema: createRequestFormEntryResponse, + }, + }, + }, + ...GenericResponses, + }, +}) + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.openapi(createRequestFormEntryRoute, async (ctx) => { + const { area, title, description } = ctx.req.valid("json") + + const authSessionManager = new AuthSessionManager(ctx) + + const { user } = await authSessionManager.validateSession() + + if (!user || user.role != "creator" || user.plan == "supporter") { + return ctx.json( + { + success: false, + message: + "Unauthorized. Only supporters can create request entries.", + }, + 401 + ) + } + + const { drizzle } = await getConnection(ctx.env) + + const requestFormManager = new RequestFormManager(drizzle) + + const [newRequestEntry] = await requestFormManager.createRequestFormEntry( + user.id, + title, + area, + description + ) + + return ctx.json( + { + success: true, + response: newRequestEntry, + }, + 200 + ) +}) + +export default handler diff --git a/src/v2/routes/requests/form/delete/[id]/route.ts b/src/v2/routes/requests/delete-request.ts similarity index 59% rename from src/v2/routes/requests/form/delete/[id]/route.ts rename to src/v2/routes/requests/delete-request.ts index fcd291b..d7a8979 100644 --- a/src/v2/routes/requests/form/delete/[id]/route.ts +++ b/src/v2/routes/requests/delete-request.ts @@ -1,8 +1,48 @@ import { OpenAPIHono } from "@hono/zod-openapi" -import { deleteRequestByIdRoute } from "./openapi" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" import { RequestFormManager } from "@/v2/lib/managers/request-form/request-form-manager" import { getConnection } from "@/v2/db/turso" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" + +export const deleteRequestByIdSchema = z.object({ + id: z.string().openapi({ + param: { + name: "id", + in: "path", + description: "The ID of the request to delete.", + example: "1", + required: true, + }, + }), +}) + +export const deleteRequestByIdResponseSchema = z.object({ + success: z.literal(true), +}) + +const deleteRequestByIdRoute = createRoute({ + path: "/{id}", + method: "delete", + description: + "Delete a request by its ID. This will also delete all associated upvotes.", + tags: ["Requests"], + request: { + params: deleteRequestByIdSchema, + }, + responses: { + 200: { + description: "True if the request was deleted successfully.", + content: { + "application/json": { + schema: deleteRequestByIdResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() diff --git a/src/v2/routes/requests/form/create/openapi.ts b/src/v2/routes/requests/form/create/openapi.ts deleted file mode 100644 index 711bdcb..0000000 --- a/src/v2/routes/requests/form/create/openapi.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { createRoute } from "@hono/zod-openapi" -import { - createRequestFormEntryResponse, - createRequestFormEntrySchema, -} from "./schema" -import { GenericResponses } from "@/v2/lib/response-schemas" - -export const createRequestFormEntryRoute = createRoute({ - path: "/", - method: "post", - description: "Create a new entry into the request form.", - tags: ["Requests"], - request: { - body: { - content: { - "application/json": { - schema: createRequestFormEntrySchema, - }, - }, - }, - }, - responses: { - 200: { - description: "Returns the new request form entry.", - content: { - "application/json": { - schema: createRequestFormEntryResponse, - }, - }, - }, - ...GenericResponses, - }, -}) diff --git a/src/v2/routes/requests/form/create/route.ts b/src/v2/routes/requests/form/create/route.ts deleted file mode 100644 index adf7ed4..0000000 --- a/src/v2/routes/requests/form/create/route.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { OpenAPIHono } from "@hono/zod-openapi" -import { createRequestFormEntryRoute } from "./openapi" -import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" -import { RequestFormManager } from "@/v2/lib/managers/request-form/request-form-manager" -import { getConnection } from "@/v2/db/turso" - -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() - -handler.openapi(createRequestFormEntryRoute, async (ctx) => { - const { area, title, description } = ctx.req.valid("json") - - const authSessionManager = new AuthSessionManager(ctx) - - const { user } = await authSessionManager.validateSession() - - if (!user || user.role != "creator" || user.plan == "supporter") { - return ctx.json( - { - success: false, - message: - "Unauthorized. Only supporters can create request entries.", - }, - 401 - ) - } - - const { drizzle } = await getConnection(ctx.env) - - const requestFormManager = new RequestFormManager(drizzle) - - const [newRequestEntry] = await requestFormManager.createRequestFormEntry( - user.id, - title, - area, - description - ) - - return ctx.json( - { - success: true, - response: newRequestEntry, - }, - 200 - ) -}) - -export default handler diff --git a/src/v2/routes/requests/form/create/schema.ts b/src/v2/routes/requests/form/create/schema.ts deleted file mode 100644 index 37d72d4..0000000 --- a/src/v2/routes/requests/form/create/schema.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { z } from "@hono/zod-openapi" -import { selectRequestFormSchema } from "@/v2/db/schema" -import type { requestArea } from "@/v2/db/schema" - -export const createRequestFormEntrySchema = z.object({ - title: z.string().min(3).max(32).openapi({ - description: "The title of the request.", - example: "Add HSR UI assets", - }), - area: z - .string() - .min(3) - .max(32) - .openapi({ - description: "The area of the request.", - example: "asset", - }) - .transform((value) => value as requestArea), - description: z.string().min(3).max(256).openapi({ - description: "The description of the request.", - example: - "Add the UI assets for Honkai: Star Rail, including the logo and other UI elements.", - }), -}) - -export const createRequestFormEntryResponse = z.object({ - success: z.literal(true), - response: selectRequestFormSchema, -}) diff --git a/src/v2/routes/requests/form/delete/[id]/openapi.ts b/src/v2/routes/requests/form/delete/[id]/openapi.ts deleted file mode 100644 index 3bfc1a7..0000000 --- a/src/v2/routes/requests/form/delete/[id]/openapi.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { createRoute } from "@hono/zod-openapi" -import { - deleteRequestByIdResponseSchema, - deleteRequestByIdSchema, -} from "./schema" -import { GenericResponses } from "@/v2/lib/response-schemas" - -export const deleteRequestByIdRoute = createRoute({ - path: "/{id}", - method: "delete", - description: - "Delete a request by its ID. This will also delete all associated upvotes.", - tags: ["Requests"], - request: { - params: deleteRequestByIdSchema, - }, - responses: { - 200: { - description: "True if the request was deleted successfully.", - content: { - "application/json": { - schema: deleteRequestByIdResponseSchema, - }, - }, - }, - ...GenericResponses, - }, -}) diff --git a/src/v2/routes/requests/form/delete/[id]/schema.ts b/src/v2/routes/requests/form/delete/[id]/schema.ts deleted file mode 100644 index 3bbd859..0000000 --- a/src/v2/routes/requests/form/delete/[id]/schema.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { z } from "@hono/zod-openapi" - -export const deleteRequestByIdSchema = z.object({ - id: z.string().openapi({ - param: { - name: "id", - in: "path", - description: "The ID of the request to delete.", - example: "1", - required: true, - }, - }), -}) - -export const deleteRequestByIdResponseSchema = z.object({ - success: z.literal(true), -}) diff --git a/src/v2/routes/requests/form/upvote/[id]/openapi.ts b/src/v2/routes/requests/form/upvote/[id]/openapi.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/requests/form/upvote/[id]/route.ts b/src/v2/routes/requests/form/upvote/[id]/route.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/requests/form/upvote/[id]/schema.ts b/src/v2/routes/requests/form/upvote/[id]/schema.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/requests/form/view/all/openapi.ts b/src/v2/routes/requests/form/view/all/openapi.ts deleted file mode 100644 index 5af4de4..0000000 --- a/src/v2/routes/requests/form/view/all/openapi.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { createRoute } from "@hono/zod-openapi" -import { viewAllRequestsResponseSchema, viewAllRequestsSchema } from "./schema" -import { GenericResponses } from "@/v2/lib/response-schemas" - -export const getAllRequestsRoute = createRoute({ - path: "/", - method: "get", - description: - "Get all requests. This will also return all associated upvotes count.", - tags: ["Requests"], - request: { - query: viewAllRequestsSchema, - }, - responses: { - 200: { - description: "List of all submitted requests.", - content: { - "application/json": { - schema: viewAllRequestsResponseSchema, - }, - }, - }, - ...GenericResponses, - }, -}) diff --git a/src/v2/routes/requests/form/view/all/route.ts b/src/v2/routes/requests/form/view/all/route.ts deleted file mode 100644 index fefba53..0000000 --- a/src/v2/routes/requests/form/view/all/route.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { OpenAPIHono } from "@hono/zod-openapi" -import { getAllRequestsRoute } from "./openapi" -import { RequestFormManager } from "@/v2/lib/managers/request-form/request-form-manager" -import { getConnection } from "@/v2/db/turso" - -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() - -handler.openapi(getAllRequestsRoute, async (ctx) => { - const { offset } = ctx.req.valid("query") ?? { offset: "0" } - - const { drizzle } = await getConnection(ctx.env) - - const requestFormManager = new RequestFormManager(drizzle) - - const allRequests = await requestFormManager.getRequestFormEntries( - parseInt(offset) - ) - - return ctx.json( - { - success: true, - requests: allRequests, - }, - 200 - ) -}) - -export default handler diff --git a/src/v2/routes/requests/form/view/all/schema.ts b/src/v2/routes/requests/form/view/all/schema.ts deleted file mode 100644 index bf29a84..0000000 --- a/src/v2/routes/requests/form/view/all/schema.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { z } from "@hono/zod-openapi" -import { selectRequestFormSchema } from "@/v2/db/schema" - -export const viewAllRequestsSchema = z - .object({ - offset: z.string().openapi({ - param: { - description: - "The offset of requests to return. This is used for pagination.", - name: "offset", - example: "0", - in: "query", - required: false, - }, - }), - }) - .partial() - -const requestFormSchema = z.object({ - ...selectRequestFormSchema.shape, - upvotesCount: z.number().optional(), -}) - -export const viewAllRequestsResponseSchema = z.object({ - success: z.literal(true), - requests: z.array(requestFormSchema), -}) diff --git a/src/v2/routes/requests/handler.ts b/src/v2/routes/requests/handler.ts index 11ca9d6..43c28be 100644 --- a/src/v2/routes/requests/handler.ts +++ b/src/v2/routes/requests/handler.ts @@ -1,12 +1,12 @@ import { OpenAPIHono } from "@hono/zod-openapi" -import RequestFormCreateRoute from "@/v2/routes/requests/form/create/route" -import RequestFormDeleteRoute from "@/v2/routes/requests/form/delete/[id]/route" -import ViewAllRequestsRoute from "@/v2/routes/requests/form/view/all/route" +import ViewAllRequestsRoute from "./all-requests" +import CreateRequestRoute from "./create-request" +import DeleteRequestRoute from "./delete-request" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() -handler.route("/create/form", RequestFormCreateRoute) -handler.route("/delete/form", RequestFormDeleteRoute) handler.route("/view/all", ViewAllRequestsRoute) +handler.route("/create", CreateRequestRoute) +handler.route("/delete", DeleteRequestRoute) export default handler diff --git a/src/v2/routes/collection/asset/add/id/[id]/route.ts b/src/v2/routes/requests/upvote-request.ts similarity index 100% rename from src/v2/routes/collection/asset/add/id/[id]/route.ts rename to src/v2/routes/requests/upvote-request.ts diff --git a/src/v2/routes/collection/asset/add/id/[id]/schema.ts b/src/v2/routes/requests/view-request.ts similarity index 100% rename from src/v2/routes/collection/asset/add/id/[id]/schema.ts rename to src/v2/routes/requests/view-request.ts diff --git a/src/v2/routes/user/follows/follow/id/[id]/route.ts b/src/v2/routes/user/follow-user.ts similarity index 74% rename from src/v2/routes/user/follows/follow/id/[id]/route.ts rename to src/v2/routes/user/follow-user.ts index b9d8668..242b5be 100644 --- a/src/v2/routes/user/follows/follow/id/[id]/route.ts +++ b/src/v2/routes/user/follow-user.ts @@ -1,9 +1,47 @@ import { OpenAPIHono } from "@hono/zod-openapi" -import { followUserByIdRoute } from "./openapi" import { getConnection } from "@/v2/db/turso" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" import { and, eq, or } from "drizzle-orm" import { userFollowing, userBlocked } from "@/v2/db/schema" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" + +const followUserByIdSchema = z.object({ + id: z.string().openapi({ + param: { + description: "The id of the user to follow.", + in: "path", + name: "id", + required: true, + }, + }), +}) + +const followUserByIdResponseSchema = z.object({ + success: z.literal(true), +}) + +export const followUserByIdRoute = createRoute({ + path: "/{id}", + method: "post", + description: "Follow a user from their ID.", + tags: ["User"], + request: { + params: followUserByIdSchema, + }, + responses: { + 200: { + description: "True if the user was followed.", + content: { + "application/json": { + schema: followUserByIdResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() diff --git a/src/v2/routes/user/follows/follow/id/[id]/openapi.ts b/src/v2/routes/user/follows/follow/id/[id]/openapi.ts deleted file mode 100644 index f82b23f..0000000 --- a/src/v2/routes/user/follows/follow/id/[id]/openapi.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { createRoute } from "@hono/zod-openapi" -import { followUserByIdResponseSchema, followUserByIdSchema } from "./schema" -import { GenericResponses } from "@/v2/lib/response-schemas" - -export const followUserByIdRoute = createRoute({ - path: "/{id}", - method: "post", - description: "Follow a user from their ID.", - tags: ["User"], - request: { - params: followUserByIdSchema, - }, - responses: { - 200: { - description: "True if the user was followed.", - content: { - "application/json": { - schema: followUserByIdResponseSchema, - }, - }, - }, - ...GenericResponses, - }, -}) diff --git a/src/v2/routes/user/follows/follow/id/[id]/schema.ts b/src/v2/routes/user/follows/follow/id/[id]/schema.ts deleted file mode 100644 index 3bc0a4d..0000000 --- a/src/v2/routes/user/follows/follow/id/[id]/schema.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { z } from "@hono/zod-openapi" - -export const followUserByIdSchema = z.object({ - id: z.string().openapi({ - param: { - description: "The id of the user to follow.", - in: "path", - name: "id", - required: true, - }, - }), -}) - -export const followUserByIdResponseSchema = z.object({ - success: z.literal(true), -}) diff --git a/src/v2/routes/user/follows/followers/id/[id]/openapi.ts b/src/v2/routes/user/follows/followers/id/[id]/openapi.ts deleted file mode 100644 index 211484b..0000000 --- a/src/v2/routes/user/follows/followers/id/[id]/openapi.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { createRoute } from "@hono/zod-openapi" -import { - viewUserFollowsbyIdSchema, - viewUserFollowsbyIdOffsetSchema, - viewUserFollowsbyIdResponseSchema, -} from "./schema" -import { GenericResponses } from "@/v2/lib/response-schemas" - -export const viewUserFollowsByIdRoute = createRoute({ - path: "/{id}", - method: "get", - description: "View a user's followers from their ID.", - tags: ["User"], - request: { - params: viewUserFollowsbyIdSchema, - query: viewUserFollowsbyIdOffsetSchema, - }, - responses: { - 200: { - description: - "List of a user's followers. Only 100 showed at a time, use pagination.", - content: { - "application/json": { - schema: viewUserFollowsbyIdResponseSchema, - }, - }, - }, - ...GenericResponses, - }, -}) diff --git a/src/v2/routes/user/follows/followers/id/[id]/route.ts b/src/v2/routes/user/follows/followers/id/[id]/route.ts deleted file mode 100644 index 2b6cb12..0000000 --- a/src/v2/routes/user/follows/followers/id/[id]/route.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { OpenAPIHono } from "@hono/zod-openapi" -import { viewUserFollowsByIdRoute } from "./openapi" -import { getConnection } from "@/v2/db/turso" - -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() - -handler.openapi(viewUserFollowsByIdRoute, async (ctx) => { - const { id } = ctx.req.valid("param") - const { offset } = ctx.req.valid("query") - - const { drizzle } = await getConnection(ctx.env) - - const followers = await drizzle.query.userFollowing.findMany({ - where: (userFollowing, { eq }) => eq(userFollowing.followingId, id), - with: { - follower: { - columns: { - id: true, - avatarUrl: true, - username: true, - plan: true, - verified: true, - displayName: true, - }, - }, - }, - limit: 100, - offset: offset ? parseInt(offset) : 0, - }) - - return ctx.json( - { - success: true, - followers, - }, - 200 - ) -}) - -export default handler diff --git a/src/v2/routes/user/follows/followers/id/[id]/schema.ts b/src/v2/routes/user/follows/followers/id/[id]/schema.ts deleted file mode 100644 index 2455e26..0000000 --- a/src/v2/routes/user/follows/followers/id/[id]/schema.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { z } from "@hono/zod-openapi" -import { selectUserFollowingSchema, selectUserSchema } from "@/v2/db/schema" - -export const viewUserFollowsbyIdSchema = z.object({ - id: z.string().openapi({ - param: { - description: "User ID to view who follows them", - in: "path", - name: "id", - required: true, - }, - }), -}) - -export const viewUserFollowsbyIdOffsetSchema = z.object({ - offset: z - .string() - .optional() - .openapi({ - param: { - description: "The offset to start at, optional.", - in: "query", - name: "offset", - required: false, - }, - }), -}) - -export const viewUserFollowsbyIdResponseSchema = z.object({ - success: z.literal(true), - followers: z.array( - selectUserFollowingSchema.extend({ - follower: selectUserSchema.pick({ - id: true, - avatarUrl: true, - username: true, - plan: true, - verified: true, - displayName: true, - }), - }) - ), -}) diff --git a/src/v2/routes/user/follows/following/id/[id]/count/openapi.ts b/src/v2/routes/user/follows/following/id/[id]/count/openapi.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/user/follows/following/id/[id]/count/route.ts b/src/v2/routes/user/follows/following/id/[id]/count/route.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/user/follows/following/id/[id]/count/schema.ts b/src/v2/routes/user/follows/following/id/[id]/count/schema.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/user/follows/following/id/[id]/openapi.ts b/src/v2/routes/user/follows/following/id/[id]/openapi.ts deleted file mode 100644 index 8f7ebf0..0000000 --- a/src/v2/routes/user/follows/following/id/[id]/openapi.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { createRoute } from "@hono/zod-openapi" -import { - viewUserfollowingbyIdSchema, - viewUserfollowingbyIdResponseSchema, - viewUserFollowingOffsetSchema, -} from "./schema" -import { GenericResponses } from "@/v2/lib/response-schemas" - -export const viewUserfollowingbyIdRoute = createRoute({ - path: "/{id}", - method: "get", - description: "View who a user's following from their ID.", - tags: ["User"], - request: { - params: viewUserfollowingbyIdSchema, - query: viewUserFollowingOffsetSchema, - }, - responses: { - 200: { - description: - "List of who a user's following. Only 100 showed at a time, use pagination.", - content: { - "application/json": { - schema: viewUserfollowingbyIdResponseSchema, - }, - }, - }, - ...GenericResponses, - }, -}) diff --git a/src/v2/routes/user/follows/following/id/[id]/route.ts b/src/v2/routes/user/follows/following/id/[id]/route.ts deleted file mode 100644 index afd12e1..0000000 --- a/src/v2/routes/user/follows/following/id/[id]/route.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { OpenAPIHono } from "@hono/zod-openapi" -import { viewUserfollowingbyIdRoute } from "./openapi" -import { getConnection } from "@/v2/db/turso" - -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() - -handler.openapi(viewUserfollowingbyIdRoute, async (ctx) => { - const { id } = ctx.req.valid("param") - const { offset } = ctx.req.valid("query") - - const { drizzle } = await getConnection(ctx.env) - - const following = await drizzle.query.userFollowing.findMany({ - where: (userFollowing, { eq }) => eq(userFollowing.followerId, id), - with: { - following: { - columns: { - id: true, - avatarUrl: true, - username: true, - plan: true, - verified: true, - displayName: true, - }, - }, - }, - limit: 100, - offset: offset ? parseInt(offset) : 0, - }) - - return ctx.json( - { - success: true, - following, - }, - 200 - ) -}) - -export default handler diff --git a/src/v2/routes/user/follows/following/id/[id]/schema.ts b/src/v2/routes/user/follows/following/id/[id]/schema.ts deleted file mode 100644 index 020800b..0000000 --- a/src/v2/routes/user/follows/following/id/[id]/schema.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { z } from "@hono/zod-openapi" -import { selectUserFollowingSchema, selectUserSchema } from "@/v2/db/schema" - -export const viewUserfollowingbyIdSchema = z.object({ - id: z.string().openapi({ - param: { - description: "User ID to view who they're following", - in: "path", - name: "id", - required: true, - }, - }), -}) - -export const viewUserFollowingOffsetSchema = z.object({ - offset: z - .string() - .optional() - .openapi({ - param: { - description: "The offset to start at, optional.", - in: "query", - name: "offset", - required: false, - }, - }), -}) - -export const viewUserfollowingbyIdResponseSchema = z.object({ - success: z.literal(true), - following: z.array( - selectUserFollowingSchema.extend({ - following: selectUserSchema.pick({ - id: true, - avatarUrl: true, - username: true, - plan: true, - verified: true, - displayName: true, - }), - }) - ), -}) diff --git a/src/v2/routes/user/follows/handler.ts b/src/v2/routes/user/follows/handler.ts deleted file mode 100644 index e490831..0000000 --- a/src/v2/routes/user/follows/handler.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { OpenAPIHono } from "@hono/zod-openapi" -import UserFollowRoute from "@/v2/routes/user/follows/follow/id/[id]/route" -import UserUnfollowRoute from "@/v2/routes/user/follows/unfollow/id/[id]/route" - -import GetUsersFollowingRoute from "@/v2/routes/user/follows/following/id/[id]/route" -import GetUsersFollowersRoute from "@/v2/routes/user/follows/followers/id/[id]/route" - -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() - -handler.route("/follow/id", UserFollowRoute) -handler.route("/unfollow/id", UserUnfollowRoute) - -handler.route("/following/id", GetUsersFollowingRoute) -handler.route("/followers/id", GetUsersFollowersRoute) - -export default handler diff --git a/src/v2/routes/user/follows/unfollow/id/[id]/openapi.ts b/src/v2/routes/user/follows/unfollow/id/[id]/openapi.ts deleted file mode 100644 index 33b6edb..0000000 --- a/src/v2/routes/user/follows/unfollow/id/[id]/openapi.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { createRoute } from "@hono/zod-openapi" -import { - unfollowUserByIdResponseSchema, - unfollowUserByIdSchema, -} from "./schema" -import { GenericResponses } from "@/v2/lib/response-schemas" - -export const unFollowUserByIdRoute = createRoute({ - path: "/{id}", - method: "post", - description: "Follow a user from their ID.", - tags: ["User"], - request: { - params: unfollowUserByIdSchema, - }, - responses: { - 200: { - description: "True if the user was unfollowed.", - content: { - "application/json": { - schema: unfollowUserByIdResponseSchema, - }, - }, - }, - ...GenericResponses, - }, -}) diff --git a/src/v2/routes/user/follows/unfollow/id/[id]/schema.ts b/src/v2/routes/user/follows/unfollow/id/[id]/schema.ts deleted file mode 100644 index 8f5b7d1..0000000 --- a/src/v2/routes/user/follows/unfollow/id/[id]/schema.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { z } from "@hono/zod-openapi" - -export const unfollowUserByIdSchema = z.object({ - id: z.string().openapi({ - param: { - description: "The id of the user to unfollow.", - in: "path", - name: "id", - required: true, - }, - }), -}) - -export const unfollowUserByIdResponseSchema = z.object({ - success: z.literal(true), -}) diff --git a/src/v2/routes/user/get-user.ts b/src/v2/routes/user/get-user.ts new file mode 100644 index 0000000..62d624c --- /dev/null +++ b/src/v2/routes/user/get-user.ts @@ -0,0 +1,92 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { getConnection } from "@/v2/db/turso" +import { eq } from "drizzle-orm" +import { authUser } from "@/v2/db/schema" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" +import { selectUserSchema } from "@/v2/db/schema" + +const getUserByIdSchema = z.object({ + id: z.string().openapi({ + param: { + name: "id", + in: "path", + required: true, + description: "The ID of the user to retrieve.", + }, + }), +}) + +const getUserByIdResponseSchema = z.object({ + success: z.literal(true), + user: selectUserSchema.pick({ + id: true, + avatarUrl: true, + displayName: true, + username: true, + usernameColour: true, + pronouns: true, + verified: true, + bio: true, + dateJoined: true, + plan: true, + role: true, + }), +}) + +const getUserByIdRoute = createRoute({ + path: "/{id}", + method: "get", + description: "Get a user by their ID.", + tags: ["User"], + request: { + params: getUserByIdSchema, + }, + responses: { + 200: { + description: "The user was found.", + content: { + "application/json": { + schema: getUserByIdResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.openapi(getUserByIdRoute, async (ctx) => { + const userId = ctx.req.valid("param").id + + const { drizzle } = await getConnection(ctx.env) + + const [user] = await drizzle + .select({ + id: authUser.id, + avatarUrl: authUser.avatarUrl, + displayName: authUser.displayName, + username: authUser.username, + usernameColour: authUser.usernameColour, + pronouns: authUser.pronouns, + verified: authUser.verified, + bio: authUser.bio, + dateJoined: authUser.dateJoined, + plan: authUser.plan, + role: authUser.role, + }) + .from(authUser) + .where(eq(authUser.id, userId)) + + return ctx.json( + { + success: true, + user, + }, + 200 + ) +}) + +export default handler diff --git a/src/v2/routes/user/get/handler.ts b/src/v2/routes/user/get/handler.ts deleted file mode 100644 index 8fe46da..0000000 --- a/src/v2/routes/user/get/handler.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { OpenAPIHono } from "@hono/zod-openapi" -import SearchUserByIdRoute from "@/v2/routes/user/get/id/[id]/route" -import SearchUserByNameRoute from "@/v2/routes/user/get/username/[username]/route" - -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() - -handler.route("/id", SearchUserByIdRoute) -handler.route("/username", SearchUserByNameRoute) - -export default handler diff --git a/src/v2/routes/user/get/id/[id]/openapi.ts b/src/v2/routes/user/get/id/[id]/openapi.ts deleted file mode 100644 index 09f1bbd..0000000 --- a/src/v2/routes/user/get/id/[id]/openapi.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { createRoute } from "@hono/zod-openapi" -import { getUserByIdSchema, getUserByIdResponseSchema } from "./schema" -import { GenericResponses } from "@/v2/lib/response-schemas" - -export const getUserByIdRoute = createRoute({ - path: "/{id}", - method: "get", - description: "Get a user by their ID.", - tags: ["User"], - request: { - params: getUserByIdSchema, - }, - responses: { - 200: { - description: "The user was found.", - content: { - "application/json": { - schema: getUserByIdResponseSchema, - }, - }, - }, - ...GenericResponses, - }, -}) diff --git a/src/v2/routes/user/get/id/[id]/route.ts b/src/v2/routes/user/get/id/[id]/route.ts deleted file mode 100644 index 5434a2d..0000000 --- a/src/v2/routes/user/get/id/[id]/route.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { OpenAPIHono } from "@hono/zod-openapi" -import { getUserByIdRoute } from "./openapi" -import { getConnection } from "@/v2/db/turso" -import { eq } from "drizzle-orm" -import { authUser } from "@/v2/db/schema" - -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() - -handler.openapi(getUserByIdRoute, async (ctx) => { - const userId = ctx.req.valid("param").id - - const { drizzle } = await getConnection(ctx.env) - - const [user] = await drizzle - .select({ - id: authUser.id, - avatarUrl: authUser.avatarUrl, - displayName: authUser.displayName, - username: authUser.username, - usernameColour: authUser.usernameColour, - pronouns: authUser.pronouns, - verified: authUser.verified, - bio: authUser.bio, - dateJoined: authUser.dateJoined, - plan: authUser.plan, - role: authUser.role, - }) - .from(authUser) - .where(eq(authUser.id, userId)) - - return ctx.json( - { - success: true, - user, - }, - 200 - ) -}) - -export default handler diff --git a/src/v2/routes/user/get/id/[id]/schema.ts b/src/v2/routes/user/get/id/[id]/schema.ts deleted file mode 100644 index 7f0bc71..0000000 --- a/src/v2/routes/user/get/id/[id]/schema.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { z } from "@hono/zod-openapi" -import { selectUserSchema } from "@/v2/db/schema" - -export const getUserByIdSchema = z.object({ - id: z.string().openapi({ - param: { - name: "id", - in: "path", - required: true, - description: "The ID of the user to retrieve.", - }, - }), -}) - -export const getUserByIdResponseSchema = z.object({ - success: z.literal(true), - user: selectUserSchema.pick({ - id: true, - avatarUrl: true, - displayName: true, - username: true, - usernameColour: true, - pronouns: true, - verified: true, - bio: true, - dateJoined: true, - plan: true, - role: true, - }), -}) diff --git a/src/v2/routes/user/get/username/[username]/openapi.ts b/src/v2/routes/user/get/username/[username]/openapi.ts deleted file mode 100644 index 0598439..0000000 --- a/src/v2/routes/user/get/username/[username]/openapi.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { createRoute } from "@hono/zod-openapi" -import { getUserByNameSchema } from "./schema" -import { GenericResponses } from "@/v2/lib/response-schemas" -import { getUserByNameResponseSchema } from "./schema" - -export const getUserByNameRoute = createRoute({ - path: "/{username}", - method: "get", - description: "Get a user by their exact username.", - tags: ["User"], - request: { - params: getUserByNameSchema, - }, - responses: { - 200: { - description: "The user was found.", - content: { - "application/json": { - schema: getUserByNameResponseSchema, - }, - }, - }, - ...GenericResponses, - }, -}) diff --git a/src/v2/routes/user/get/username/[username]/route.ts b/src/v2/routes/user/get/username/[username]/route.ts deleted file mode 100644 index 08fe712..0000000 --- a/src/v2/routes/user/get/username/[username]/route.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { OpenAPIHono } from "@hono/zod-openapi" -import { getUserByNameRoute } from "./openapi" -import { authUser } from "@/v2/db/schema" -import { eq } from "drizzle-orm" -import { getConnection } from "@/v2/db/turso" - -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() - -handler.openapi(getUserByNameRoute, async (ctx) => { - const username = ctx.req.valid("param").username - - const { drizzle } = await getConnection(ctx.env) - - const [user] = await drizzle - .select({ - id: authUser.id, - avatarUrl: authUser.avatarUrl, - displayName: authUser.displayName, - username: authUser.username, - usernameColour: authUser.usernameColour, - pronouns: authUser.pronouns, - verified: authUser.verified, - bio: authUser.bio, - dateJoined: authUser.dateJoined, - plan: authUser.plan, - role: authUser.role, - }) - .from(authUser) - .where(eq(authUser.username, username)) - - return ctx.json( - { - success: true, - user, - }, - 200 - ) -}) - -export default handler diff --git a/src/v2/routes/user/get/username/[username]/schema.ts b/src/v2/routes/user/get/username/[username]/schema.ts deleted file mode 100644 index 55c25ba..0000000 --- a/src/v2/routes/user/get/username/[username]/schema.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { z } from "@hono/zod-openapi" -import { selectUserSchema } from "@/v2/db/schema" - -export const getUserByNameSchema = z.object({ - username: z.string().openapi({ - param: { - name: "username", - in: "path", - required: true, - description: "The exact Username of the user to retrieve.", - }, - }), -}) - -export const getUserByNameResponseSchema = z.object({ - success: z.literal(true), - user: selectUserSchema.pick({ - id: true, - avatarUrl: true, - displayName: true, - username: true, - usernameColour: true, - pronouns: true, - verified: true, - bio: true, - dateJoined: true, - plan: true, - role: true, - }), -}) diff --git a/src/v2/routes/user/handler.ts b/src/v2/routes/user/handler.ts index 37ed459..b3119bf 100644 --- a/src/v2/routes/user/handler.ts +++ b/src/v2/routes/user/handler.ts @@ -1,12 +1,21 @@ import { OpenAPIHono } from "@hono/zod-openapi" -import UserGetRoute from "@/v2/routes/user/get/handler" -import UserSearchRoute from "@/v2/routes/user/search/handler" -import UserFollowRoute from "@/v2/routes/user/follows/handler" + +import GetUserRoute from "./get-user" +import SearchUserRoute from "./search-users" + +import FollowUserRoute from "./follow-user" +import UnfollowUserRoute from "./unfollow-user" + +import UserFollowingRoute from "./user-following" +import UserFollowersRoute from "./user-followers" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() -handler.route("/get", UserGetRoute) -handler.route("/search", UserSearchRoute) -handler.route("/follows", UserFollowRoute) +handler.route("/get", GetUserRoute) +handler.route("/search", SearchUserRoute) +handler.route("/follow", FollowUserRoute) +handler.route("/unfollow", UnfollowUserRoute) +handler.route("/following", UserFollowingRoute) +handler.route("/followers", UserFollowersRoute) export default handler diff --git a/src/v2/routes/user/search-users.ts b/src/v2/routes/user/search-users.ts new file mode 100644 index 0000000..171e9c0 --- /dev/null +++ b/src/v2/routes/user/search-users.ts @@ -0,0 +1,92 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { authUser } from "@/v2/db/schema" +import { or, like } from "drizzle-orm" +import { getConnection } from "@/v2/db/turso" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" +import { selectUserSchema } from "@/v2/db/schema" + +const getUsersByNameSchema = z.object({ + username: z.string().openapi({ + param: { + name: "username", + in: "path", + required: true, + description: "The username of the user(s) to retrieve.", + }, + }), +}) + +const searchUsersByUsernameSchema = z.object({ + success: z.literal(true), + users: selectUserSchema + .pick({ + id: true, + avatarUrl: true, + displayName: true, + username: true, + usernameColour: true, + pronouns: true, + verified: true, + bio: true, + dateJoined: true, + plan: true, + role: true, + }) + .array(), +}) + +const searchUsersByUsernameRoute = createRoute({ + path: "/{username}", + method: "get", + description: "Search for users by their username.", + tags: ["User"], + request: { + params: getUsersByNameSchema, + }, + responses: { + 200: { + description: "User(s) were found.", + content: { + "application/json": { + schema: searchUsersByUsernameSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.openapi(searchUsersByUsernameRoute, async (ctx) => { + const userQuery = ctx.req.valid("param").username + + const { drizzle } = await getConnection(ctx.env) + + const users = await drizzle + .select({ + id: authUser.id, + avatarUrl: authUser.avatarUrl, + displayName: authUser.displayName, + username: authUser.username, + usernameColour: authUser.usernameColour, + pronouns: authUser.pronouns, + verified: authUser.verified, + bio: authUser.bio, + dateJoined: authUser.dateJoined, + plan: authUser.plan, + role: authUser.role, + }) + .from(authUser) + .where(or(like(authUser.username, `%${userQuery}%`))) + .limit(25) + + return ctx.json({ + success: true, + users, + }) +}) + +export default handler diff --git a/src/v2/routes/user/search/handler.ts b/src/v2/routes/user/search/handler.ts deleted file mode 100644 index 7bd1d47..0000000 --- a/src/v2/routes/user/search/handler.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { OpenAPIHono } from "@hono/zod-openapi" -import SearchUsersByUsernameRoute from "./username/[username]/route" - -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() - -handler.route("/username", SearchUsersByUsernameRoute) - -export default handler diff --git a/src/v2/routes/user/search/username/[username]/openapi.ts b/src/v2/routes/user/search/username/[username]/openapi.ts deleted file mode 100644 index 436fa11..0000000 --- a/src/v2/routes/user/search/username/[username]/openapi.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { createRoute } from "@hono/zod-openapi" -import { getUsersByNameSchema, searchUsersByUsernameSchema } from "./schema" -import { GenericResponses } from "@/v2/lib/response-schemas" - -export const searchUsersByUsernameRoute = createRoute({ - path: "/{username}", - method: "get", - description: "Search for users by their username.", - tags: ["User"], - request: { - params: getUsersByNameSchema, - }, - responses: { - 200: { - description: "User(s) were found.", - content: { - "application/json": { - schema: searchUsersByUsernameSchema, - }, - }, - }, - ...GenericResponses, - }, -}) diff --git a/src/v2/routes/user/search/username/[username]/route.ts b/src/v2/routes/user/search/username/[username]/route.ts deleted file mode 100644 index 5cc2334..0000000 --- a/src/v2/routes/user/search/username/[username]/route.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { OpenAPIHono } from "@hono/zod-openapi" -import { searchUsersByUsernameRoute } from "./openapi" -import { authUser } from "@/v2/db/schema" -import { or, like } from "drizzle-orm" -import { getConnection } from "@/v2/db/turso" - -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() - -handler.openapi(searchUsersByUsernameRoute, async (ctx) => { - const userQuery = ctx.req.valid("param").username - - const { drizzle } = await getConnection(ctx.env) - - const users = await drizzle - .select({ - id: authUser.id, - avatarUrl: authUser.avatarUrl, - displayName: authUser.displayName, - username: authUser.username, - usernameColour: authUser.usernameColour, - pronouns: authUser.pronouns, - verified: authUser.verified, - bio: authUser.bio, - dateJoined: authUser.dateJoined, - plan: authUser.plan, - role: authUser.role, - }) - .from(authUser) - .where(or(like(authUser.username, `%${userQuery}%`))) - .limit(25) - - return ctx.json({ - success: true, - users, - }) -}) - -export default handler diff --git a/src/v2/routes/user/search/username/[username]/schema.ts b/src/v2/routes/user/search/username/[username]/schema.ts deleted file mode 100644 index 27daaab..0000000 --- a/src/v2/routes/user/search/username/[username]/schema.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { z } from "@hono/zod-openapi" -import { selectUserSchema } from "@/v2/db/schema" - -export const getUsersByNameSchema = z.object({ - username: z.string().openapi({ - param: { - name: "username", - in: "path", - required: true, - description: "The username of the user(s) to retrieve.", - }, - }), -}) - -export const searchUsersByUsernameSchema = z.object({ - success: z.literal(true), - users: selectUserSchema - .pick({ - id: true, - avatarUrl: true, - displayName: true, - username: true, - usernameColour: true, - pronouns: true, - verified: true, - bio: true, - dateJoined: true, - plan: true, - role: true, - }) - .array(), -}) diff --git a/src/v2/routes/user/follows/unfollow/id/[id]/route.ts b/src/v2/routes/user/unfollow-user.ts similarity index 75% rename from src/v2/routes/user/follows/unfollow/id/[id]/route.ts rename to src/v2/routes/user/unfollow-user.ts index 6e1d72a..054c612 100644 --- a/src/v2/routes/user/follows/unfollow/id/[id]/route.ts +++ b/src/v2/routes/user/unfollow-user.ts @@ -1,9 +1,47 @@ import { OpenAPIHono } from "@hono/zod-openapi" -import { unFollowUserByIdRoute } from "./openapi" import { getConnection } from "@/v2/db/turso" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" import { userFollowing, userBlocked } from "@/v2/db/schema" import { and, eq, or } from "drizzle-orm" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" + +const unfollowUserByIdSchema = z.object({ + id: z.string().openapi({ + param: { + description: "The id of the user to unfollow.", + in: "path", + name: "id", + required: true, + }, + }), +}) + +const unfollowUserByIdResponseSchema = z.object({ + success: z.literal(true), +}) + +const unFollowUserByIdRoute = createRoute({ + path: "/{id}", + method: "post", + description: "Follow a user from their ID.", + tags: ["User"], + request: { + params: unfollowUserByIdSchema, + }, + responses: { + 200: { + description: "True if the user was unfollowed.", + content: { + "application/json": { + schema: unfollowUserByIdResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() diff --git a/src/v2/routes/user/user-followers.ts b/src/v2/routes/user/user-followers.ts new file mode 100644 index 0000000..140c027 --- /dev/null +++ b/src/v2/routes/user/user-followers.ts @@ -0,0 +1,107 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { getConnection } from "@/v2/db/turso" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" +import { selectUserFollowingSchema, selectUserSchema } from "@/v2/db/schema" + +const viewUserFollowsbyIdSchema = z.object({ + id: z.string().openapi({ + param: { + description: "User ID to view who follows them", + in: "path", + name: "id", + required: true, + }, + }), +}) + +const viewUserFollowsbyIdOffsetSchema = z.object({ + offset: z + .string() + .optional() + .openapi({ + param: { + description: "The offset to start at, optional.", + in: "query", + name: "offset", + required: false, + }, + }), +}) + +export const viewUserFollowsbyIdResponseSchema = z.object({ + success: z.literal(true), + followers: z.array( + selectUserFollowingSchema.extend({ + follower: selectUserSchema.pick({ + id: true, + avatarUrl: true, + username: true, + plan: true, + verified: true, + displayName: true, + }), + }) + ), +}) + +const viewUserFollowsByIdRoute = createRoute({ + path: "/{id}", + method: "get", + description: "View a user's followers from their ID.", + tags: ["User"], + request: { + params: viewUserFollowsbyIdSchema, + query: viewUserFollowsbyIdOffsetSchema, + }, + responses: { + 200: { + description: + "List of a user's followers. Only 100 showed at a time, use pagination.", + content: { + "application/json": { + schema: viewUserFollowsbyIdResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.openapi(viewUserFollowsByIdRoute, async (ctx) => { + const { id } = ctx.req.valid("param") + const { offset } = ctx.req.valid("query") + + const { drizzle } = await getConnection(ctx.env) + + const followers = await drizzle.query.userFollowing.findMany({ + where: (userFollowing, { eq }) => eq(userFollowing.followingId, id), + with: { + follower: { + columns: { + id: true, + avatarUrl: true, + username: true, + plan: true, + verified: true, + displayName: true, + }, + }, + }, + limit: 100, + offset: offset ? parseInt(offset) : 0, + }) + + return ctx.json( + { + success: true, + followers, + }, + 200 + ) +}) + +export default handler diff --git a/src/v2/routes/user/user-following.ts b/src/v2/routes/user/user-following.ts new file mode 100644 index 0000000..0021c12 --- /dev/null +++ b/src/v2/routes/user/user-following.ts @@ -0,0 +1,107 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { getConnection } from "@/v2/db/turso" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" +import { selectUserFollowingSchema, selectUserSchema } from "@/v2/db/schema" + +const viewUserfollowingbyIdSchema = z.object({ + id: z.string().openapi({ + param: { + description: "User ID to view who they're following", + in: "path", + name: "id", + required: true, + }, + }), +}) + +const viewUserFollowingOffsetSchema = z.object({ + offset: z + .string() + .optional() + .openapi({ + param: { + description: "The offset to start at, optional.", + in: "query", + name: "offset", + required: false, + }, + }), +}) + +const viewUserfollowingbyIdResponseSchema = z.object({ + success: z.literal(true), + following: z.array( + selectUserFollowingSchema.extend({ + following: selectUserSchema.pick({ + id: true, + avatarUrl: true, + username: true, + plan: true, + verified: true, + displayName: true, + }), + }) + ), +}) + +const viewUserfollowingbyIdRoute = createRoute({ + path: "/{id}", + method: "get", + description: "View who a user's following from their ID.", + tags: ["User"], + request: { + params: viewUserfollowingbyIdSchema, + query: viewUserFollowingOffsetSchema, + }, + responses: { + 200: { + description: + "List of who a user's following. Only 100 showed at a time, use pagination.", + content: { + "application/json": { + schema: viewUserfollowingbyIdResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +handler.openapi(viewUserfollowingbyIdRoute, async (ctx) => { + const { id } = ctx.req.valid("param") + const { offset } = ctx.req.valid("query") + + const { drizzle } = await getConnection(ctx.env) + + const following = await drizzle.query.userFollowing.findMany({ + where: (userFollowing, { eq }) => eq(userFollowing.followerId, id), + with: { + following: { + columns: { + id: true, + avatarUrl: true, + username: true, + plan: true, + verified: true, + displayName: true, + }, + }, + }, + limit: 100, + offset: offset ? parseInt(offset) : 0, + }) + + return ctx.json( + { + success: true, + following, + }, + 200 + ) +}) + +export default handler From 242492c9771448324389283b6db55b50e317cd3b Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 17 Mar 2024 04:32:04 +0000 Subject: [PATCH 270/318] holy fuck --- src/v2/routes/asset/delete-asset.ts | 54 ++++--- src/v2/routes/asset/get-asset-likes.ts | 74 +++++----- src/v2/routes/asset/get-asset.ts | 104 +++++++------- src/v2/routes/asset/handler.ts | 35 +++-- src/v2/routes/asset/like-asset.ts | 136 +++++++++--------- src/v2/routes/asset/modify-asset.ts | 192 ++++++++++++------------- src/v2/routes/asset/search-assets.ts | 108 +++++++------- src/v2/routes/asset/unlike-asset.ts | 146 ++++++++++--------- src/v2/routes/asset/upload-asset.ts | 157 ++++++++++---------- src/v2/routes/handler.ts | 2 + 10 files changed, 500 insertions(+), 508 deletions(-) diff --git a/src/v2/routes/asset/delete-asset.ts b/src/v2/routes/asset/delete-asset.ts index e2a145b..8ad68ac 100644 --- a/src/v2/routes/asset/delete-asset.ts +++ b/src/v2/routes/asset/delete-asset.ts @@ -1,4 +1,4 @@ -import { OpenAPIHono } from "@hono/zod-openapi" +import { type Handler } from "../handler" import { getConnection } from "@/v2/db/turso" import { eq } from "drizzle-orm" import { asset } from "@/v2/db/schema" @@ -23,7 +23,7 @@ const deleteAssetByIdResponseSchema = z.object({ }) const deleteAssetByIdRoute = createRoute({ - path: "/{id}", + path: "/{id}/delete", method: "delete", description: "Delete an asset from their ID. Must be the owner of the asset or an admin.", @@ -44,38 +44,36 @@ const deleteAssetByIdRoute = createRoute({ }, }) -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() +export const DeleteAssetByIdRoute = (handler: Handler) => { + handler.openapi(deleteAssetByIdRoute, async (ctx) => { + const assetId = ctx.req.valid("param").id -handler.openapi(deleteAssetByIdRoute, async (ctx) => { - const assetId = ctx.req.valid("param").id + const { drizzle } = await getConnection(ctx.env) - const { drizzle } = await getConnection(ctx.env) + const [existingAsset] = await drizzle + .select({ id: asset.id }) + .from(asset) + .where(eq(asset.id, parseInt(assetId))) + .limit(1) - const [existingAsset] = await drizzle - .select({ id: asset.id }) - .from(asset) - .where(eq(asset.id, parseInt(assetId))) - .limit(1) + if (!existingAsset) { + return ctx.json( + { + success: true, + message: "Asset not found", + }, + 400 + ) + } + + await drizzle.delete(asset).where(eq(asset.id, parseInt(assetId))) + // await ctx.env.FILES_BUCKET.delete(asset.url) - if (!existingAsset) { return ctx.json( { success: true, - message: "Asset not found", }, - 400 + 200 ) - } - - await drizzle.delete(asset).where(eq(asset.id, parseInt(assetId))) - // await ctx.env.FILES_BUCKET.delete(asset.url) - - return ctx.json( - { - success: true, - }, - 200 - ) -}) - -export default handler + }) +} diff --git a/src/v2/routes/asset/get-asset-likes.ts b/src/v2/routes/asset/get-asset-likes.ts index 70abe2b..6c37e60 100644 --- a/src/v2/routes/asset/get-asset-likes.ts +++ b/src/v2/routes/asset/get-asset-likes.ts @@ -1,4 +1,3 @@ -import { OpenAPIHono } from "@hono/zod-openapi" import { getConnection } from "@/v2/db/turso" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" import { createRoute } from "@hono/zod-openapi" @@ -10,6 +9,7 @@ import { selectAssetTagSchema, selectAssetLikesSchema, } from "@/v2/db/schema" +import { Handler } from "../handler" const allAssetLikesSchema = z.object({ success: z.literal(true), @@ -27,7 +27,7 @@ const allAssetLikesSchema = z.object({ }) const allAssetLikesRoute = createRoute({ - path: "/", + path: "/likes", method: "get", description: "All your liked assets.", tags: ["Asset"], @@ -44,47 +44,45 @@ const allAssetLikesRoute = createRoute({ }, }) -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() +export const GetAssetLikesRoute = (handler: Handler) => { + handler.openapi(allAssetLikesRoute, async (ctx) => { + const authSessionManager = new AuthSessionManager(ctx) + const { user } = await authSessionManager.validateSession() -handler.openapi(allAssetLikesRoute, async (ctx) => { - const authSessionManager = new AuthSessionManager(ctx) - const { user } = await authSessionManager.validateSession() - - if (!user) { - return ctx.json( - { - success: false, - message: "Unauthorized", - }, - 401 - ) - } + if (!user) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } - const { drizzle } = await getConnection(ctx.env) + const { drizzle } = await getConnection(ctx.env) - const likes = await drizzle.query.assetLikes.findMany({ - where: (assetLikes, { eq }) => eq(assetLikes.likedById, user.id), - with: { - asset: { - with: { - assetTagAsset: { - with: { - assetTag: true, + const likes = await drizzle.query.assetLikes.findMany({ + where: (assetLikes, { eq }) => eq(assetLikes.likedById, user.id), + with: { + asset: { + with: { + assetTagAsset: { + with: { + assetTag: true, + }, }, }, }, }, - }, - offset: 0, - }) - - return ctx.json( - { - success: true, - likes, - }, - 200 - ) -}) + offset: 0, + }) -export default handler + return ctx.json( + { + success: true, + likes, + }, + 200 + ) + }) +} diff --git a/src/v2/routes/asset/get-asset.ts b/src/v2/routes/asset/get-asset.ts index 6a5a398..0c5677d 100644 --- a/src/v2/routes/asset/get-asset.ts +++ b/src/v2/routes/asset/get-asset.ts @@ -1,4 +1,4 @@ -import { OpenAPIHono } from "@hono/zod-openapi" +import { Handler } from "../handler" import { getConnection } from "@/v2/db/turso" import { asset } from "@/v2/db/schema" import { eq, sql } from "drizzle-orm" @@ -74,65 +74,63 @@ const getAssetByIdRoute = createRoute({ }, }) -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() +export const GetAssetByIdRoute = (handler: Handler) => { + handler.openapi(getAssetByIdRoute, async (ctx) => { + const assetId = ctx.req.valid("param").id -handler.openapi(getAssetByIdRoute, async (ctx) => { - const assetId = ctx.req.valid("param").id + const { drizzle } = await getConnection(ctx.env) - const { drizzle } = await getConnection(ctx.env) - - const foundAsset = await drizzle.query.asset.findFirst({ - where: (asset, { eq }) => eq(asset.id, parseInt(assetId)), - with: { - assetTagAsset: { - with: { - assetTag: true, + const foundAsset = await drizzle.query.asset.findFirst({ + where: (asset, { eq }) => eq(asset.id, parseInt(assetId)), + with: { + assetTagAsset: { + with: { + assetTag: true, + }, }, - }, - authUser: { - columns: { - id: true, - avatarUrl: true, - displayName: true, - username: true, - usernameColour: true, - pronouns: true, - verified: true, - bio: true, - dateJoined: true, - plan: true, - role: true, + authUser: { + columns: { + id: true, + avatarUrl: true, + displayName: true, + username: true, + usernameColour: true, + pronouns: true, + verified: true, + bio: true, + dateJoined: true, + plan: true, + role: true, + }, }, + game: true, + assetCategory: true, }, - game: true, - assetCategory: true, - }, - }) + }) + + if (!foundAsset) { + return ctx.json( + { + success: false, + message: "Asset not found", + }, + 400 + ) + } + + await drizzle + .update(asset) + .set({ + viewCount: sql`${asset.viewCount} + 1`, + }) + .where(eq(asset.id, parseInt(assetId))) - if (!foundAsset) { return ctx.json( { - success: false, - message: "Asset not found", + success: true, + asset: foundAsset, }, - 400 + 200 ) - } - - await drizzle - .update(asset) - .set({ - viewCount: sql`${asset.viewCount} + 1`, - }) - .where(eq(asset.id, parseInt(assetId))) - - return ctx.json( - { - success: true, - asset: foundAsset, - }, - 200 - ) -}) - -export default handler + }) +} diff --git a/src/v2/routes/asset/handler.ts b/src/v2/routes/asset/handler.ts index c31337d..f2f22e9 100644 --- a/src/v2/routes/asset/handler.ts +++ b/src/v2/routes/asset/handler.ts @@ -1,29 +1,26 @@ import { OpenAPIHono } from "@hono/zod-openapi" -import SearchAssetRoute from "@/v2/routes/asset/search-assets" -import GetAssetRoute from "@/v2/routes/asset/get-asset" - -import UploadAssetRoute from "@/v2/routes/asset/upload-asset" -import ModifyAssetRoute from "@/v2/routes/asset/modify-asset" -import DeleteAssetRoute from "@/v2/routes/asset/delete-asset" - -import LikeAssetByIdRoute from "@/v2/routes/asset/like-asset" -import UnlikeAssetByIdRoute from "@/v2/routes/asset/unlike-asset" - -import GetAssetLikesRoute from "@/v2/routes/asset/get-asset-likes" +import { GetAssetByIdRoute } from "./get-asset" +import { LikeAssetByIdRoute } from "./like-asset" +import { UnlikeAssetByIdRoute } from "./unlike-asset" +import { AssetSearchAllFilterRoute } from "./search-assets" +import { GetAssetLikesRoute } from "./get-asset-likes" +import { ModifyAssetRoute } from "./modify-asset" +import { UploadAssetRoute } from "./upload-asset" +import { DeleteAssetByIdRoute } from "./delete-asset" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() -handler.route("/search", SearchAssetRoute) -handler.route("/get", GetAssetRoute) +AssetSearchAllFilterRoute(handler) +UploadAssetRoute(handler) -handler.route("/upload", UploadAssetRoute) -handler.route("/modify", ModifyAssetRoute) -handler.route("/delete", DeleteAssetRoute) +GetAssetByIdRoute(handler) +ModifyAssetRoute(handler) +DeleteAssetByIdRoute(handler) -handler.route("/like", LikeAssetByIdRoute) -handler.route("/unlike", UnlikeAssetByIdRoute) +UnlikeAssetByIdRoute(handler) +LikeAssetByIdRoute(handler) -handler.route("/likes", GetAssetLikesRoute) +GetAssetLikesRoute(handler) export default handler diff --git a/src/v2/routes/asset/like-asset.ts b/src/v2/routes/asset/like-asset.ts index 9273cbe..1352c02 100644 --- a/src/v2/routes/asset/like-asset.ts +++ b/src/v2/routes/asset/like-asset.ts @@ -1,4 +1,4 @@ -import { OpenAPIHono } from "@hono/zod-openapi" +import { type Handler } from "../handler" import { getConnection } from "@/v2/db/turso" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" import { asset, assetLikes } from "@/v2/db/schema" @@ -24,7 +24,7 @@ const likeAssetByIdResponseSchema = z.object({ }) const likeAssetByIdRoute = createRoute({ - path: "/{id}", + path: "/{id}/like", method: "post", description: "Like an asset from their ID.", tags: ["Asset"], @@ -44,84 +44,82 @@ const likeAssetByIdRoute = createRoute({ }, }) -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() +export const LikeAssetByIdRoute = (handler: Handler) => { + handler.openapi(likeAssetByIdRoute, async (ctx) => { + const assetId = ctx.req.valid("param").id -handler.openapi(likeAssetByIdRoute, async (ctx) => { - const assetId = ctx.req.valid("param").id - - if (isNaN(parseInt(assetId))) { - return ctx.json( - { - success: false, - message: "Invalid asset ID", - }, - 400 - ) - } + if (isNaN(parseInt(assetId))) { + return ctx.json( + { + success: false, + message: "Invalid asset ID", + }, + 400 + ) + } - const { drizzle } = await getConnection(ctx.env) + const { drizzle } = await getConnection(ctx.env) - const [existingAsset] = await drizzle - .select() - .from(asset) - .where(eq(asset.id, parseInt(assetId))) - .limit(1) + const [existingAsset] = await drizzle + .select() + .from(asset) + .where(eq(asset.id, parseInt(assetId))) + .limit(1) - if (!existingAsset) { - return ctx.json( - { - success: true, - message: "Asset not found", - }, - 400 - ) - } + if (!existingAsset) { + return ctx.json( + { + success: true, + message: "Asset not found", + }, + 400 + ) + } - const authSessionManager = new AuthSessionManager(ctx) - const { user } = await authSessionManager.validateSession() + const authSessionManager = new AuthSessionManager(ctx) + const { user } = await authSessionManager.validateSession() - if (!user) { - return ctx.json( - { - success: false, - message: "Unauthorized", - }, - 401 - ) - } + if (!user) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + const [assetLikeStatus] = await drizzle + .select({ assetId: assetLikes.assetId }) + .from(assetLikes) + .where( + and( + eq(assetLikes.assetId, parseInt(assetId)), + eq(assetLikes.likedById, user.id) + ) + ) + .limit(1) - const [assetLikeStatus] = await drizzle - .select({ assetId: assetLikes.assetId }) - .from(assetLikes) - .where( - and( - eq(assetLikes.assetId, parseInt(assetId)), - eq(assetLikes.likedById, user.id) + if (assetLikeStatus) { + return ctx.json( + { + success: false, + message: "Asset is already liked", + }, + 400 ) - ) - .limit(1) + } + + await drizzle.insert(assetLikes).values({ + assetId: parseInt(assetId), + likedById: user.id, + }) - if (assetLikeStatus) { return ctx.json( { - success: false, - message: "Asset is already liked", + success: true, }, - 400 + 200 ) - } - - await drizzle.insert(assetLikes).values({ - assetId: parseInt(assetId), - likedById: user.id, }) - - return ctx.json( - { - success: true, - }, - 200 - ) -}) - -export default handler +} diff --git a/src/v2/routes/asset/modify-asset.ts b/src/v2/routes/asset/modify-asset.ts index f0311bf..8b79ce6 100644 --- a/src/v2/routes/asset/modify-asset.ts +++ b/src/v2/routes/asset/modify-asset.ts @@ -1,4 +1,3 @@ -import { OpenAPIHono } from "@hono/zod-openapi" import { getConnection } from "@/v2/db/turso" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" import { asset, assetTag, assetTagAsset } from "@/v2/db/schema" @@ -7,6 +6,7 @@ import { SplitQueryByCommas } from "@/v2/lib/helpers/split-query-by-commas" import { createRoute } from "@hono/zod-openapi" import { GenericResponses } from "@/v2/lib/response-schemas" import { z } from "@hono/zod-openapi" +import { Handler } from "../handler" const modifyAssetPathSchema = z.object({ id: z.string().openapi({ @@ -57,7 +57,7 @@ const modifyAssetResponseSchema = z.object({ }) const modifyAssetRoute = createRoute({ - path: "/{id}", + path: "/{id}/modify", method: "patch", description: "Modify an existing asset.", tags: ["Asset"], @@ -84,109 +84,109 @@ const modifyAssetRoute = createRoute({ }, }) -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() +export const ModifyAssetRoute = (handler: Handler) => { + handler.openapi(modifyAssetRoute, async (ctx) => { + const { name, tags, assetCategoryId, gameId } = ctx.req.valid("json") + const { id } = ctx.req.valid("param") -handler.openapi(modifyAssetRoute, async (ctx) => { - const { name, tags, assetCategoryId, gameId } = ctx.req.valid("json") - const { id } = ctx.req.valid("param") + if (isNaN(parseInt(id))) { + return ctx.json( + { + success: false, + message: "Invalid asset ID", + }, + 400 + ) + } - if (isNaN(parseInt(id))) { - return ctx.json( - { - success: false, - message: "Invalid asset ID", - }, - 400 - ) - } + const authSessionManager = new AuthSessionManager(ctx) - const authSessionManager = new AuthSessionManager(ctx) + const { user } = await authSessionManager.validateSession() - const { user } = await authSessionManager.validateSession() + if (!user) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } - if (!user) { - return ctx.json( - { - success: false, - message: "Unauthorized", - }, - 401 - ) - } + const { drizzle } = getConnection(ctx.env) - const { drizzle } = getConnection(ctx.env) + const [assetUser] = await drizzle + .select({ + uploadedById: asset.uploadedById, + }) + .from(asset) + .where(eq(asset.id, parseInt(id))) + + if (assetUser.uploadedById !== user.id || user.role != "creator") { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + await drizzle + .update(asset) + .set({ + name, + assetCategoryId, + gameId, + }) + .where(eq(asset.id, parseInt(id))) + .returning() - const [assetUser] = await drizzle - .select({ - uploadedById: asset.uploadedById, - }) - .from(asset) - .where(eq(asset.id, parseInt(id))) + const newTags = SplitQueryByCommas(tags) ?? [] + + const oldTags = await drizzle + .select({ + assetTagId: assetTag.id, + }) + .from(assetTagAsset) + .innerJoin(assetTag, eq(assetTag.id, assetTagAsset.assetTagId)) + .where(eq(assetTagAsset.assetId, parseInt(id))) + + const oldTagIds = oldTags.map((t) => t.assetTagId) + const tagsToRemove = oldTagIds.filter((t) => !newTags.includes(t)) + const tagsToAdd = newTags.filter((t) => !oldTagIds.includes(t)) + + const tagBatchQueries = [ + ...tagsToRemove.map((tagId) => + drizzle + .delete(assetTagAsset) + .where( + and( + eq(assetTagAsset.assetId, parseInt(id)), + eq(assetTagAsset.assetTagId, tagId) + ) + ) + ), + ...tagsToAdd.map((tag) => + drizzle.insert(assetTagAsset).values({ + assetId: parseInt(id), + assetTagId: tag, + }) + ), + ] + + // https://github.com/drizzle-team/drizzle-orm/issues/1301 + type TagBatchQuery = (typeof tagBatchQueries)[number] + + await drizzle.batch( + tagBatchQueries as [TagBatchQuery, ...TagBatchQuery[]] + ) - if (assetUser.uploadedById !== user.id || user.role != "creator") { return ctx.json( { - success: false, - message: "Unauthorized", + success: true, }, - 401 + 200 ) - } - - await drizzle - .update(asset) - .set({ - name, - assetCategoryId, - gameId, - }) - .where(eq(asset.id, parseInt(id))) - .returning() - - const newTags = SplitQueryByCommas(tags) ?? [] - - const oldTags = await drizzle - .select({ - assetTagId: assetTag.id, - }) - .from(assetTagAsset) - .innerJoin(assetTag, eq(assetTag.id, assetTagAsset.assetTagId)) - .where(eq(assetTagAsset.assetId, parseInt(id))) - - const oldTagIds = oldTags.map((t) => t.assetTagId) - const tagsToRemove = oldTagIds.filter((t) => !newTags.includes(t)) - const tagsToAdd = newTags.filter((t) => !oldTagIds.includes(t)) - - const tagBatchQueries = [ - ...tagsToRemove.map((tagId) => - drizzle - .delete(assetTagAsset) - .where( - and( - eq(assetTagAsset.assetId, parseInt(id)), - eq(assetTagAsset.assetTagId, tagId) - ) - ) - ), - ...tagsToAdd.map((tag) => - drizzle.insert(assetTagAsset).values({ - assetId: parseInt(id), - assetTagId: tag, - }) - ), - ] - - // https://github.com/drizzle-team/drizzle-orm/issues/1301 - type TagBatchQuery = (typeof tagBatchQueries)[number] - - await drizzle.batch(tagBatchQueries as [TagBatchQuery, ...TagBatchQuery[]]) - - return ctx.json( - { - success: true, - }, - 200 - ) -}) - -export default handler + }) +} diff --git a/src/v2/routes/asset/search-assets.ts b/src/v2/routes/asset/search-assets.ts index 34f9340..aba7a90 100644 --- a/src/v2/routes/asset/search-assets.ts +++ b/src/v2/routes/asset/search-assets.ts @@ -1,4 +1,3 @@ -import { OpenAPIHono } from "@hono/zod-openapi" import { getConnection } from "@/v2/db/turso" import { SplitQueryByCommas } from "@/v2/lib/helpers/split-query-by-commas" import { createRoute } from "@hono/zod-openapi" @@ -9,6 +8,7 @@ import { selectAssetTagAssetSchema, selectAssetTagSchema, } from "@/v2/db/schema" +import { type Handler } from "../handler" export const assetSearchAllFilterResponseSchema = z.object({ success: z.literal(true), @@ -80,7 +80,7 @@ export const assetSearchAllFilterSchema = z export type assetSearchAllFilter = z.infer const assetSearchAllFilterRoute = createRoute({ - path: "/", + path: "/search", method: "get", description: "Filter all assets", tags: ["Asset"], @@ -100,63 +100,63 @@ const assetSearchAllFilterRoute = createRoute({ }, }) -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() +export const AssetSearchAllFilterRoute = (handler: Handler) => { + handler.openapi(assetSearchAllFilterRoute, async (ctx) => { + const { drizzle } = await getConnection(ctx.env) -handler.openapi(assetSearchAllFilterRoute, async (ctx) => { - const { drizzle } = await getConnection(ctx.env) + const { name, game, category, tags, offset } = ctx.req.valid("query") - const { name, game, category, tags, offset } = ctx.req.valid("query") + const gameList = game ? SplitQueryByCommas(game.toLowerCase()) : null + const categoryList = category + ? SplitQueryByCommas(category.toLowerCase()) + : null + const searchQuery = name ?? null + const tagList = tags ? SplitQueryByCommas(tags.toLowerCase()) : null - const gameList = game ? SplitQueryByCommas(game.toLowerCase()) : null - const categoryList = category - ? SplitQueryByCommas(category.toLowerCase()) - : null - const searchQuery = name ?? null - const tagList = tags ? SplitQueryByCommas(tags.toLowerCase()) : null - - // is this bad for performance? probably - const assets = await drizzle.query.asset.findMany({ - where: (asset, { and, or, like, eq, sql }) => - and( - tagList && tagList.length > 0 - ? or( - ...tagList.map( - (t) => - sql`EXISTS (SELECT 1 FROM assetTagAsset WHERE assetTagAsset.asset_id = ${asset.id} AND assetTagAsset.asset_tag_id = ${t})` + // is this bad for performance? probably + const assets = await drizzle.query.asset.findMany({ + where: (asset, { and, or, like, eq, sql }) => + and( + tagList && tagList.length > 0 + ? or( + ...tagList.map( + (t) => + sql`EXISTS (SELECT 1 FROM assetTagAsset WHERE assetTagAsset.asset_id = ${asset.id} AND assetTagAsset.asset_tag_id = ${t})` + ) ) - ) - : undefined, - searchQuery ? like(asset.name, `%${searchQuery}%`) : undefined, - gameList - ? or(...gameList.map((game) => eq(asset.gameId, game))) - : undefined, - categoryList - ? or( - ...categoryList.map((category) => - eq(asset.assetCategoryId, category) + : undefined, + searchQuery + ? like(asset.name, `%${searchQuery}%`) + : undefined, + gameList + ? or(...gameList.map((game) => eq(asset.gameId, game))) + : undefined, + categoryList + ? or( + ...categoryList.map((category) => + eq(asset.assetCategoryId, category) + ) ) - ) - : undefined, - eq(asset.status, "approved") - ), - limit: 100, - offset: offset ? parseInt(offset) : 0, - with: { - assetTagAsset: { - with: { - assetTag: true, + : undefined, + eq(asset.status, "approved") + ), + limit: 100, + offset: offset ? parseInt(offset) : 0, + with: { + assetTagAsset: { + with: { + assetTag: true, + }, }, }, - }, - }) - - return ctx.json( - { - success: true, - assets, - }, - 200 - ) -}) + }) -export default handler + return ctx.json( + { + success: true, + assets, + }, + 200 + ) + }) +} diff --git a/src/v2/routes/asset/unlike-asset.ts b/src/v2/routes/asset/unlike-asset.ts index 911173d..c82a03c 100644 --- a/src/v2/routes/asset/unlike-asset.ts +++ b/src/v2/routes/asset/unlike-asset.ts @@ -1,4 +1,3 @@ -import { OpenAPIHono } from "@hono/zod-openapi" import { getConnection } from "@/v2/db/turso" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" import { asset, assetLikes } from "@/v2/db/schema" @@ -6,6 +5,7 @@ import { and, eq } from "drizzle-orm" import { createRoute } from "@hono/zod-openapi" import { GenericResponses } from "@/v2/lib/response-schemas" import { z } from "@hono/zod-openapi" +import type { Handler } from "../handler" const unlikeAssetByIdSchema = z.object({ id: z.string().openapi({ @@ -24,7 +24,7 @@ const unlikeAssetByIdResponseSchema = z.object({ }) const unlikeAssetByIdRoute = createRoute({ - path: "/{id}", + path: "/{id}/unlike", method: "post", description: "Unlike an asset from their ID.", tags: ["Asset"], @@ -44,88 +44,86 @@ const unlikeAssetByIdRoute = createRoute({ }, }) -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() +export const UnlikeAssetByIdRoute = (handler: Handler) => { + handler.openapi(unlikeAssetByIdRoute, async (ctx) => { + const assetId = ctx.req.valid("param").id -handler.openapi(unlikeAssetByIdRoute, async (ctx) => { - const assetId = ctx.req.valid("param").id - - if (isNaN(parseInt(assetId))) { - return ctx.json( - { - success: false, - message: "Invalid asset ID", - }, - 400 - ) - } + if (isNaN(parseInt(assetId))) { + return ctx.json( + { + success: false, + message: "Invalid asset ID", + }, + 400 + ) + } - const { drizzle } = await getConnection(ctx.env) + const { drizzle } = await getConnection(ctx.env) - const [existingAsset] = await drizzle - .select() - .from(asset) - .where(eq(asset.id, parseInt(assetId))) - .limit(1) + const [existingAsset] = await drizzle + .select() + .from(asset) + .where(eq(asset.id, parseInt(assetId))) + .limit(1) - if (!existingAsset) { - return ctx.json( - { - success: true, - message: "Asset not found", - }, - 400 - ) - } + if (!existingAsset) { + return ctx.json( + { + success: true, + message: "Asset not found", + }, + 400 + ) + } - const authSessionManager = new AuthSessionManager(ctx) - const { user } = await authSessionManager.validateSession() + const authSessionManager = new AuthSessionManager(ctx) + const { user } = await authSessionManager.validateSession() - if (!user) { - return ctx.json( - { - success: false, - message: "Unauthorized", - }, - 401 - ) - } + if (!user) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + const [assetLikeStatus] = await drizzle + .select({ assetId: assetLikes.assetId }) + .from(assetLikes) + .where( + and( + eq(assetLikes.assetId, parseInt(assetId)), + eq(assetLikes.likedById, user.id) + ) + ) + .limit(1) - const [assetLikeStatus] = await drizzle - .select({ assetId: assetLikes.assetId }) - .from(assetLikes) - .where( - and( - eq(assetLikes.assetId, parseInt(assetId)), - eq(assetLikes.likedById, user.id) + if (!assetLikeStatus) { + return ctx.json( + { + success: false, + message: "You have not liked this asset", + }, + 400 + ) + } + + await drizzle + .delete(assetLikes) + .where( + and( + eq(assetLikes.assetId, parseInt(assetId)), + eq(assetLikes.likedById, user.id) + ) ) - ) - .limit(1) - if (!assetLikeStatus) { return ctx.json( { - success: false, - message: "You have not liked this asset", + success: true, }, - 400 - ) - } - - await drizzle - .delete(assetLikes) - .where( - and( - eq(assetLikes.assetId, parseInt(assetId)), - eq(assetLikes.likedById, user.id) - ) + 200 ) - - return ctx.json( - { - success: true, - }, - 200 - ) -}) - -export default handler + }) +} diff --git a/src/v2/routes/asset/upload-asset.ts b/src/v2/routes/asset/upload-asset.ts index 5aea818..6c3eceb 100644 --- a/src/v2/routes/asset/upload-asset.ts +++ b/src/v2/routes/asset/upload-asset.ts @@ -1,4 +1,4 @@ -import { OpenAPIHono } from "@hono/zod-openapi" +import type { Handler } from "../handler" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" import { getConnection } from "@/v2/db/turso" import { SplitQueryByCommas } from "@/v2/lib/helpers/split-query-by-commas" @@ -62,7 +62,7 @@ const uploadAssetResponseSchema = z.object({ }) const uploadAssetRoute = createRoute({ - path: "/", + path: "/upload", method: "post", description: "Upload a new asset.", tags: ["Asset"], @@ -88,87 +88,90 @@ const uploadAssetRoute = createRoute({ }, }) -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() +export const UploadAssetRoute = (handler: Handler) => + handler.openapi(uploadAssetRoute, async (ctx) => { + const { + asset, + name, + tags, + assetCategoryId, + gameId, + assetIsSuggestive, + } = ctx.req.valid("form") + + const authSessionManager = new AuthSessionManager(ctx) + + const { user } = await authSessionManager.validateSession() + + if (!user) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + if ( + user.role != "creator" && + user.role != "contributor" && + user.role != "staff" + ) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } -handler.openapi(uploadAssetRoute, async (ctx) => { - const { asset, name, tags, assetCategoryId, gameId, assetIsSuggestive } = - ctx.req.valid("form") + const { drizzle } = getConnection(ctx.env) - const authSessionManager = new AuthSessionManager(ctx) + const { key } = await ctx.env.FILES_BUCKET.put( + `/assets/${gameId}/${assetCategoryId}/${name}.png`, + asset + ) - const { user } = await authSessionManager.validateSession() + const createdAsset = await drizzle + .insert(asset) + .values({ + name: name, + extension: "png", + gameId: gameId, + assetCategoryId: assetCategoryId, + url: key, + uploadedByName: user.username, + uploadedById: user.id, + status: "pending", + fileSize: 0, + width: 0, + height: 0, + assetIsSuggestive: Boolean(assetIsSuggestive), + }) + .returning() - if (!user) { - return ctx.json( - { - success: false, - message: "Unauthorized", - }, - 401 - ) - } + const tagsSplit = SplitQueryByCommas(tags) ?? [] + + if (tagsSplit.length > 0) { + const tagBatchQueries = tagsSplit.map((tag) => + drizzle.insert(assetTagAsset).values({ + assetId: createdAsset[0].id, + assetTagId: tag, + }) + ) + + type TagBatchQuery = (typeof tagBatchQueries)[number] + await drizzle.batch( + tagBatchQueries as [TagBatchQuery, ...TagBatchQuery[]] + ) + } - if ( - user.role != "creator" && - user.role != "contributor" && - user.role != "staff" - ) { return ctx.json( { - success: false, - message: "Unauthorized", + success: true, }, - 401 + 200 ) - } - - const { drizzle } = getConnection(ctx.env) - - const { key } = await ctx.env.FILES_BUCKET.put( - `/assets/${gameId}/${assetCategoryId}/${name}.png`, - asset - ) - - const createdAsset = await drizzle - .insert(asset) - .values({ - name: name, - extension: "png", - gameId: gameId, - assetCategoryId: assetCategoryId, - url: key, - uploadedByName: user.username, - uploadedById: user.id, - status: "pending", - fileSize: 0, - width: 0, - height: 0, - assetIsSuggestive: Boolean(assetIsSuggestive), - }) - .returning() - - const tagsSplit = SplitQueryByCommas(tags) ?? [] - - if (tagsSplit.length > 0) { - const tagBatchQueries = tagsSplit.map((tag) => - drizzle.insert(assetTagAsset).values({ - assetId: createdAsset[0].id, - assetTagId: tag, - }) - ) - - type TagBatchQuery = (typeof tagBatchQueries)[number] - await drizzle.batch( - tagBatchQueries as [TagBatchQuery, ...TagBatchQuery[]] - ) - } - - return ctx.json( - { - success: true, - }, - 200 - ) -}) - -export default handler + }) diff --git a/src/v2/routes/handler.ts b/src/v2/routes/handler.ts index 632f6ec..91a232c 100644 --- a/src/v2/routes/handler.ts +++ b/src/v2/routes/handler.ts @@ -16,3 +16,5 @@ handler.route("/auth", AuthRoute) handler.route("/request", RequestFormRoute) export default handler + +export type Handler = typeof handler From e0d9e023b9dcbfca264ba5942e23b66533966fcc Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 17 Mar 2024 04:41:08 +0000 Subject: [PATCH 271/318] convert game handler import --- src/v2/routes/asset/delete-asset.ts | 4 +- src/v2/routes/asset/get-asset.ts | 4 +- src/v2/routes/asset/handler.ts | 2 +- src/v2/routes/asset/like-asset.ts | 4 +- src/v2/routes/asset/modify-asset.ts | 4 +- src/v2/routes/asset/search-assets.ts | 4 +- src/v2/routes/asset/unlike-asset.ts | 4 +- src/v2/routes/asset/upload-asset.ts | 4 +- .../routes/contributors/all-contributors.ts | 50 +++++----- src/v2/routes/contributors/handler.ts | 4 +- src/v2/routes/game/all-games.ts | 30 +++--- src/v2/routes/game/create-game.ts | 96 +++++++++--------- src/v2/routes/game/delete-game.ts | 94 +++++++++--------- src/v2/routes/game/get-game.ts | 46 ++++----- src/v2/routes/game/handler.ts | 22 ++--- src/v2/routes/game/modify-game.ts | 98 +++++++++---------- src/v2/routes/handler.ts | 2 +- 17 files changed, 231 insertions(+), 241 deletions(-) diff --git a/src/v2/routes/asset/delete-asset.ts b/src/v2/routes/asset/delete-asset.ts index 8ad68ac..10a5d48 100644 --- a/src/v2/routes/asset/delete-asset.ts +++ b/src/v2/routes/asset/delete-asset.ts @@ -1,4 +1,4 @@ -import { type Handler } from "../handler" +import { type AppHandler } from "../handler" import { getConnection } from "@/v2/db/turso" import { eq } from "drizzle-orm" import { asset } from "@/v2/db/schema" @@ -44,7 +44,7 @@ const deleteAssetByIdRoute = createRoute({ }, }) -export const DeleteAssetByIdRoute = (handler: Handler) => { +export const DeleteAssetByIdRoute = (handler: AppHandler) => { handler.openapi(deleteAssetByIdRoute, async (ctx) => { const assetId = ctx.req.valid("param").id diff --git a/src/v2/routes/asset/get-asset.ts b/src/v2/routes/asset/get-asset.ts index 0c5677d..2922ec1 100644 --- a/src/v2/routes/asset/get-asset.ts +++ b/src/v2/routes/asset/get-asset.ts @@ -1,4 +1,4 @@ -import { Handler } from "../handler" +import { AppHandler } from "../handler" import { getConnection } from "@/v2/db/turso" import { asset } from "@/v2/db/schema" import { eq, sql } from "drizzle-orm" @@ -74,7 +74,7 @@ const getAssetByIdRoute = createRoute({ }, }) -export const GetAssetByIdRoute = (handler: Handler) => { +export const GetAssetByIdRoute = (handler: AppHandler) => { handler.openapi(getAssetByIdRoute, async (ctx) => { const assetId = ctx.req.valid("param").id diff --git a/src/v2/routes/asset/handler.ts b/src/v2/routes/asset/handler.ts index f2f22e9..ff8f15b 100644 --- a/src/v2/routes/asset/handler.ts +++ b/src/v2/routes/asset/handler.ts @@ -18,8 +18,8 @@ GetAssetByIdRoute(handler) ModifyAssetRoute(handler) DeleteAssetByIdRoute(handler) -UnlikeAssetByIdRoute(handler) LikeAssetByIdRoute(handler) +UnlikeAssetByIdRoute(handler) GetAssetLikesRoute(handler) diff --git a/src/v2/routes/asset/like-asset.ts b/src/v2/routes/asset/like-asset.ts index 1352c02..442e134 100644 --- a/src/v2/routes/asset/like-asset.ts +++ b/src/v2/routes/asset/like-asset.ts @@ -1,4 +1,4 @@ -import { type Handler } from "../handler" +import { type AppHandler } from "../handler" import { getConnection } from "@/v2/db/turso" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" import { asset, assetLikes } from "@/v2/db/schema" @@ -44,7 +44,7 @@ const likeAssetByIdRoute = createRoute({ }, }) -export const LikeAssetByIdRoute = (handler: Handler) => { +export const LikeAssetByIdRoute = (handler: AppHandler) => { handler.openapi(likeAssetByIdRoute, async (ctx) => { const assetId = ctx.req.valid("param").id diff --git a/src/v2/routes/asset/modify-asset.ts b/src/v2/routes/asset/modify-asset.ts index 8b79ce6..2d575cc 100644 --- a/src/v2/routes/asset/modify-asset.ts +++ b/src/v2/routes/asset/modify-asset.ts @@ -6,7 +6,7 @@ import { SplitQueryByCommas } from "@/v2/lib/helpers/split-query-by-commas" import { createRoute } from "@hono/zod-openapi" import { GenericResponses } from "@/v2/lib/response-schemas" import { z } from "@hono/zod-openapi" -import { Handler } from "../handler" +import { AppHandler } from "../handler" const modifyAssetPathSchema = z.object({ id: z.string().openapi({ @@ -84,7 +84,7 @@ const modifyAssetRoute = createRoute({ }, }) -export const ModifyAssetRoute = (handler: Handler) => { +export const ModifyAssetRoute = (handler: AppHandler) => { handler.openapi(modifyAssetRoute, async (ctx) => { const { name, tags, assetCategoryId, gameId } = ctx.req.valid("json") const { id } = ctx.req.valid("param") diff --git a/src/v2/routes/asset/search-assets.ts b/src/v2/routes/asset/search-assets.ts index aba7a90..cfe8ce0 100644 --- a/src/v2/routes/asset/search-assets.ts +++ b/src/v2/routes/asset/search-assets.ts @@ -8,7 +8,7 @@ import { selectAssetTagAssetSchema, selectAssetTagSchema, } from "@/v2/db/schema" -import { type Handler } from "../handler" +import { type AppHandler } from "../handler" export const assetSearchAllFilterResponseSchema = z.object({ success: z.literal(true), @@ -100,7 +100,7 @@ const assetSearchAllFilterRoute = createRoute({ }, }) -export const AssetSearchAllFilterRoute = (handler: Handler) => { +export const AssetSearchAllFilterRoute = (handler: AppHandler) => { handler.openapi(assetSearchAllFilterRoute, async (ctx) => { const { drizzle } = await getConnection(ctx.env) diff --git a/src/v2/routes/asset/unlike-asset.ts b/src/v2/routes/asset/unlike-asset.ts index c82a03c..7ce2300 100644 --- a/src/v2/routes/asset/unlike-asset.ts +++ b/src/v2/routes/asset/unlike-asset.ts @@ -5,7 +5,7 @@ import { and, eq } from "drizzle-orm" import { createRoute } from "@hono/zod-openapi" import { GenericResponses } from "@/v2/lib/response-schemas" import { z } from "@hono/zod-openapi" -import type { Handler } from "../handler" +import type { AppHandler } from "../handler" const unlikeAssetByIdSchema = z.object({ id: z.string().openapi({ @@ -44,7 +44,7 @@ const unlikeAssetByIdRoute = createRoute({ }, }) -export const UnlikeAssetByIdRoute = (handler: Handler) => { +export const UnlikeAssetByIdRoute = (handler: AppHandler) => { handler.openapi(unlikeAssetByIdRoute, async (ctx) => { const assetId = ctx.req.valid("param").id diff --git a/src/v2/routes/asset/upload-asset.ts b/src/v2/routes/asset/upload-asset.ts index 6c3eceb..c9f901d 100644 --- a/src/v2/routes/asset/upload-asset.ts +++ b/src/v2/routes/asset/upload-asset.ts @@ -1,4 +1,4 @@ -import type { Handler } from "../handler" +import type { AppHandler } from "../handler" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" import { getConnection } from "@/v2/db/turso" import { SplitQueryByCommas } from "@/v2/lib/helpers/split-query-by-commas" @@ -88,7 +88,7 @@ const uploadAssetRoute = createRoute({ }, }) -export const UploadAssetRoute = (handler: Handler) => +export const UploadAssetRoute = (handler: AppHandler) => handler.openapi(uploadAssetRoute, async (ctx) => { const { asset, diff --git a/src/v2/routes/contributors/all-contributors.ts b/src/v2/routes/contributors/all-contributors.ts index 8c6b0b3..50be279 100644 --- a/src/v2/routes/contributors/all-contributors.ts +++ b/src/v2/routes/contributors/all-contributors.ts @@ -1,4 +1,4 @@ -import { OpenAPIHono } from "@hono/zod-openapi" +import { AppHandler } from "../handler" import { getConnection } from "@/v2/db/turso" import { authUser } from "@/v2/db/schema" import { eq } from "drizzle-orm" @@ -20,7 +20,7 @@ const contributorListSchema = z.object({ }) const contributorsRoute = createRoute({ - path: "/", + path: "/all", method: "get", description: "Get a list of all contributors.", tags: ["Contributors"], @@ -39,29 +39,27 @@ const contributorsRoute = createRoute({ }, }) -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() +export const AllContributorsRoute = (handler: AppHandler) => { + handler.openapi(contributorsRoute, async (ctx) => { + const { drizzle } = await getConnection(ctx.env) -handler.openapi(contributorsRoute, async (ctx) => { - const { drizzle } = await getConnection(ctx.env) + const contributors = await drizzle + .select({ + id: authUser.id, + username: authUser.username, + avatarUrl: authUser.avatarUrl, + plan: authUser.plan, + role: authUser.role, + }) + .from(authUser) + .where(eq(authUser.isContributor, true)) - const contributors = await drizzle - .select({ - id: authUser.id, - username: authUser.username, - avatarUrl: authUser.avatarUrl, - plan: authUser.plan, - role: authUser.role, - }) - .from(authUser) - .where(eq(authUser.isContributor, true)) - - return ctx.json( - { - success: true, - contributors, - }, - 200 - ) -}) - -export default handler + return ctx.json( + { + success: true, + contributors, + }, + 200 + ) + }) +} diff --git a/src/v2/routes/contributors/handler.ts b/src/v2/routes/contributors/handler.ts index 5b38368..7b7200c 100644 --- a/src/v2/routes/contributors/handler.ts +++ b/src/v2/routes/contributors/handler.ts @@ -1,8 +1,8 @@ import { OpenAPIHono } from "@hono/zod-openapi" -import AllContributorsRoute from "./all-contributors" +import { AllContributorsRoute } from "./all-contributors" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() -handler.route("/all", AllContributorsRoute) +AllContributorsRoute(handler) export default handler diff --git a/src/v2/routes/game/all-games.ts b/src/v2/routes/game/all-games.ts index 835ed66..87b13c8 100644 --- a/src/v2/routes/game/all-games.ts +++ b/src/v2/routes/game/all-games.ts @@ -1,4 +1,4 @@ -import { OpenAPIHono } from "@hono/zod-openapi" +import { AppHandler } from "../handler" import { getConnection } from "@/v2/db/turso" import { game } from "@/v2/db/schema" import { GenericResponses } from "@/v2/lib/response-schemas" @@ -29,20 +29,18 @@ const getAllGamesRoute = createRoute({ }, }) -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() +export const AllGamesRoute = (handler: AppHandler) => { + handler.openapi(getAllGamesRoute, async (ctx) => { + const { drizzle } = await getConnection(ctx.env) -handler.openapi(getAllGamesRoute, async (ctx) => { - const { drizzle } = await getConnection(ctx.env) + const games = (await drizzle.select().from(game)) ?? [] - const games = (await drizzle.select().from(game)) ?? [] - - return ctx.json( - { - success: true, - games, - }, - 200 - ) -}) - -export default handler + return ctx.json( + { + success: true, + games, + }, + 200 + ) + }) +} diff --git a/src/v2/routes/game/create-game.ts b/src/v2/routes/game/create-game.ts index 77b0e6a..a1fb66c 100644 --- a/src/v2/routes/game/create-game.ts +++ b/src/v2/routes/game/create-game.ts @@ -1,4 +1,4 @@ -import { OpenAPIHono } from "@hono/zod-openapi" +import { AppHandler } from "../handler" import { game } from "@/v2/db/schema" import { eq } from "drizzle-orm" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" @@ -36,7 +36,7 @@ export const createGameResponse = z.object({ }) const createGameRoute = createRoute({ - path: "/", + path: "/create", method: "post", description: "Create a new game.", tags: ["Game"], @@ -62,61 +62,59 @@ const createGameRoute = createRoute({ }, }) -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() +export const CreateGameRoute = (handler: AppHandler) => { + handler.openapi(createGameRoute, async (ctx) => { + const authSessionManager = new AuthSessionManager(ctx) -handler.openapi(createGameRoute, async (ctx) => { - const authSessionManager = new AuthSessionManager(ctx) + const { user } = await authSessionManager.validateSession() - const { user } = await authSessionManager.validateSession() + if (!user || user.role != "creator") { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } - if (!user || user.role != "creator") { - return ctx.json( - { - success: false, - message: "Unauthorized", - }, - 401 - ) - } + const { name, formattedName, possibleSuggestiveContent } = + ctx.req.valid("json") + + const { drizzle } = getConnection(ctx.env) - const { name, formattedName, possibleSuggestiveContent } = - ctx.req.valid("json") + const [gameExists] = await drizzle + .select({ name: game.name }) + .from(game) + .where(eq(game.name, name)) - const { drizzle } = getConnection(ctx.env) + if (gameExists.name) { + return ctx.json( + { + success: false, + message: "Game already exists", + }, + 400 + ) + } - const [gameExists] = await drizzle - .select({ name: game.name }) - .from(game) - .where(eq(game.name, name)) + const [newGame] = await drizzle + .insert(game) + .values({ + id: name, + name, + formattedName, + possibleSuggestiveContent: Boolean(possibleSuggestiveContent), + lastUpdated: new Date().toISOString(), + }) + .returning() - if (gameExists.name) { return ctx.json( { - success: false, - message: "Game already exists", + success: true, + game: newGame, }, - 400 + 200 ) - } - - const [newGame] = await drizzle - .insert(game) - .values({ - id: name, - name, - formattedName, - possibleSuggestiveContent: Boolean(possibleSuggestiveContent), - lastUpdated: new Date().toISOString(), - }) - .returning() - - return ctx.json( - { - success: true, - game: newGame, - }, - 200 - ) -}) - -export default handler + }) +} diff --git a/src/v2/routes/game/delete-game.ts b/src/v2/routes/game/delete-game.ts index ae4e97e..901baed 100644 --- a/src/v2/routes/game/delete-game.ts +++ b/src/v2/routes/game/delete-game.ts @@ -1,4 +1,4 @@ -import { OpenAPIHono } from "@hono/zod-openapi" +import { AppHandler } from "../handler" import { getConnection } from "@/v2/db/turso" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" import { game } from "@/v2/db/schema" @@ -24,7 +24,7 @@ export const deleteGameResponse = z.object({ }) const deleteGameRoute = createRoute({ - path: "/{id}", + path: "/{id}/delete", method: "delete", description: "Delete a game & all its related assets.", tags: ["Game"], @@ -44,60 +44,58 @@ const deleteGameRoute = createRoute({ }, }) -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() +export const DeleteGameRoute = (handler: AppHandler) => { + handler.openapi(deleteGameRoute, async (ctx) => { + const id = ctx.req.valid("param").id -handler.openapi(deleteGameRoute, async (ctx) => { - const id = ctx.req.valid("param").id + const { drizzle } = await getConnection(ctx.env) - const { drizzle } = await getConnection(ctx.env) + const [foundGame] = await drizzle + .select({ id: game.id }) + .from(game) + .where(eq(game.id, id)) - const [foundGame] = await drizzle - .select({ id: game.id }) - .from(game) - .where(eq(game.id, id)) + if (!foundGame) { + return ctx.json( + { + success: false, + message: "Game not found", + }, + 400 + ) + } - if (!foundGame) { - return ctx.json( - { - success: false, - message: "Game not found", - }, - 400 - ) - } + const authSessionManager = new AuthSessionManager(ctx) + const { user } = await authSessionManager.validateSession() - const authSessionManager = new AuthSessionManager(ctx) - const { user } = await authSessionManager.validateSession() + if (!user) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } - if (!user) { - return ctx.json( - { - success: false, - message: "Unauthorized", - }, - 401 - ) - } + if (user.role != "creator") { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + await drizzle.delete(game).where(eq(game.id, id)) + // await ctx.env.FILES_BUCKET.delete("/assets/" + id) - if (user.role != "creator") { return ctx.json( { - success: false, - message: "Unauthorized", + success: true, }, - 401 + 200 ) - } - - await drizzle.delete(game).where(eq(game.id, id)) - // await ctx.env.FILES_BUCKET.delete("/assets/" + id) - - return ctx.json( - { - success: true, - }, - 200 - ) -}) - -export default handler + }) +} diff --git a/src/v2/routes/game/get-game.ts b/src/v2/routes/game/get-game.ts index 2e5c15e..6295c06 100644 --- a/src/v2/routes/game/get-game.ts +++ b/src/v2/routes/game/get-game.ts @@ -1,4 +1,5 @@ -import { OpenAPIHono, createRoute } from "@hono/zod-openapi" +import { AppHandler } from "../handler" +import { createRoute } from "@hono/zod-openapi" import { game } from "@/v2/db/schema" import { getConnection } from "@/v2/db/turso" import { eq } from "drizzle-orm" @@ -44,32 +45,33 @@ const getGameByIdRoute = createRoute({ }, }) -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() +export const GetGameByIdRoute = (handler: AppHandler) => { + handler.openapi(getGameByIdRoute, async (ctx) => { + const id = ctx.req.valid("param").id -handler.openapi(getGameByIdRoute, async (ctx) => { - const id = ctx.req.valid("param").id + const { drizzle } = await getConnection(ctx.env) - const { drizzle } = await getConnection(ctx.env) + const [foundGame] = await drizzle + .select() + .from(game) + .where(eq(game.id, id)) - const [foundGame] = await drizzle.select().from(game).where(eq(game.id, id)) + if (!foundGame) { + return ctx.json( + { + success: false, + message: "Game not found", + }, + 400 + ) + } - if (!foundGame) { return ctx.json( { - success: false, - message: "Game not found", + success: true, + game: foundGame, }, - 400 + 200 ) - } - - return ctx.json( - { - success: true, - game: foundGame, - }, - 200 - ) -}) - -export default handler + }) +} diff --git a/src/v2/routes/game/handler.ts b/src/v2/routes/game/handler.ts index dac3175..56d4dc4 100644 --- a/src/v2/routes/game/handler.ts +++ b/src/v2/routes/game/handler.ts @@ -1,18 +1,16 @@ import { OpenAPIHono } from "@hono/zod-openapi" -import GameCreateRoute from "./create-game" -import DeleteGameRoute from "./delete-game" -import ModifyGameRoute from "./modify-game" -import GameGetRoute from "./get-game" -import AllGamesRoute from "./all-games" +import { AllGamesRoute } from "./all-games" +import { CreateGameRoute } from "./create-game" +import { DeleteGameRoute } from "./delete-game" +import { GetGameByIdRoute } from "./get-game" +import { ModifyGameRoute } from "./modify-game" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() -handler.route("/get", GameGetRoute) -handler.route("/modify", ModifyGameRoute) -handler.route("/delete", DeleteGameRoute) - -handler.route("/create", GameCreateRoute) - -handler.route("/list", AllGamesRoute) +AllGamesRoute(handler) +GetGameByIdRoute(handler) +ModifyGameRoute(handler) +DeleteGameRoute(handler) +CreateGameRoute(handler) export default handler diff --git a/src/v2/routes/game/modify-game.ts b/src/v2/routes/game/modify-game.ts index 88048ab..d885d5a 100644 --- a/src/v2/routes/game/modify-game.ts +++ b/src/v2/routes/game/modify-game.ts @@ -1,4 +1,4 @@ -import { OpenAPIHono } from "@hono/zod-openapi" +import { AppHandler } from "../handler" import { eq } from "drizzle-orm" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" import { getConnection } from "@/v2/db/turso" @@ -48,7 +48,7 @@ const modifyGameResponseSchema = z.object({ }) export const modifyGameRoute = createRoute({ - path: "/{id}", + path: "/{id}/modify", method: "patch", description: "Modify an existing game.", tags: ["Game"], @@ -75,62 +75,60 @@ export const modifyGameRoute = createRoute({ }, }) -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() +export const ModifyGameRoute = (handler: AppHandler) => { + handler.openapi(modifyGameRoute, async (ctx) => { + const authSessionManager = new AuthSessionManager(ctx) -handler.openapi(modifyGameRoute, async (ctx) => { - const authSessionManager = new AuthSessionManager(ctx) + const { user } = await authSessionManager.validateSession() - const { user } = await authSessionManager.validateSession() + if (!user || user.role != "creator") { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } - if (!user || user.role != "creator") { - return ctx.json( - { - success: false, - message: "Unauthorized", - }, - 401 - ) - } + const { name, formattedName, possibleSuggestiveContent } = + ctx.req.valid("json") + const { id } = ctx.req.valid("param") + + const { drizzle } = getConnection(ctx.env) - const { name, formattedName, possibleSuggestiveContent } = - ctx.req.valid("json") - const { id } = ctx.req.valid("param") + const [existingGame] = await drizzle + .select({ id: game.id }) + .from(game) + .where(eq(game.id, id)) - const { drizzle } = getConnection(ctx.env) + if (!existingGame.id) { + return ctx.json( + { + success: false, + message: "Game with ID not found", + }, + 400 + ) + } - const [existingGame] = await drizzle - .select({ id: game.id }) - .from(game) - .where(eq(game.id, id)) + const [updatedGame] = await drizzle + .update(game) + .set({ + name, + formattedName, + possibleSuggestiveContent: Boolean(possibleSuggestiveContent), + lastUpdated: new Date().toISOString(), + }) + .where(eq(game.id, id)) + .returning() - if (!existingGame.id) { return ctx.json( { - success: false, - message: "Game with ID not found", + success: true, + game: updatedGame, }, - 400 + 200 ) - } - - const [updatedGame] = await drizzle - .update(game) - .set({ - name, - formattedName, - possibleSuggestiveContent: Boolean(possibleSuggestiveContent), - lastUpdated: new Date().toISOString(), - }) - .where(eq(game.id, id)) - .returning() - - return ctx.json( - { - success: true, - game: updatedGame, - }, - 200 - ) -}) - -export default handler + }) +} diff --git a/src/v2/routes/handler.ts b/src/v2/routes/handler.ts index 91a232c..5be228e 100644 --- a/src/v2/routes/handler.ts +++ b/src/v2/routes/handler.ts @@ -17,4 +17,4 @@ handler.route("/request", RequestFormRoute) export default handler -export type Handler = typeof handler +export type AppHandler = typeof handler From 4ec3163bab70470d69bccfc691ee27b9952b3ac5 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 17 Mar 2024 04:50:48 +0000 Subject: [PATCH 272/318] fix: handler type --- src/v2/routes/asset/get-asset-likes.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/v2/routes/asset/get-asset-likes.ts b/src/v2/routes/asset/get-asset-likes.ts index 6c37e60..e6f1f0e 100644 --- a/src/v2/routes/asset/get-asset-likes.ts +++ b/src/v2/routes/asset/get-asset-likes.ts @@ -9,7 +9,7 @@ import { selectAssetTagSchema, selectAssetLikesSchema, } from "@/v2/db/schema" -import { Handler } from "../handler" +import { AppHandler } from "../handler" const allAssetLikesSchema = z.object({ success: z.literal(true), @@ -44,7 +44,7 @@ const allAssetLikesRoute = createRoute({ }, }) -export const GetAssetLikesRoute = (handler: Handler) => { +export const GetAssetLikesRoute = (handler: AppHandler) => { handler.openapi(allAssetLikesRoute, async (ctx) => { const authSessionManager = new AuthSessionManager(ctx) const { user } = await authSessionManager.validateSession() From 9a3320bdbaa65b1abf78f0229e84e5aa707fc30d Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 17 Mar 2024 05:13:13 +0000 Subject: [PATCH 273/318] request route impl --- src/v2/routes/requests/all-requests.ts | 51 ++++--- src/v2/routes/requests/create-request.ts | 72 +++++----- src/v2/routes/requests/delete-request.ts | 104 ++++++++------- src/v2/routes/requests/handler.ts | 20 ++- .../routes/requests/remove-request-upvote.ts | 126 ++++++++++++++++++ src/v2/routes/requests/upvote-request.ts | 125 +++++++++++++++++ src/v2/routes/requests/view-request.ts | 92 +++++++++++++ 7 files changed, 476 insertions(+), 114 deletions(-) create mode 100644 src/v2/routes/requests/remove-request-upvote.ts diff --git a/src/v2/routes/requests/all-requests.ts b/src/v2/routes/requests/all-requests.ts index 4bd7720..4e54e2f 100644 --- a/src/v2/routes/requests/all-requests.ts +++ b/src/v2/routes/requests/all-requests.ts @@ -1,10 +1,10 @@ -import { OpenAPIHono } from "@hono/zod-openapi" -import { RequestFormManager } from "@/v2/lib/managers/request-form/request-form-manager" +import { AppHandler } from "../handler" import { getConnection } from "@/v2/db/turso" import { createRoute } from "@hono/zod-openapi" import { GenericResponses } from "@/v2/lib/response-schemas" import { z } from "@hono/zod-openapi" import { selectRequestFormSchema } from "@/v2/db/schema" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" const viewAllRequestsSchema = z .object({ @@ -32,7 +32,7 @@ const viewAllRequestsResponseSchema = z.object({ }) const getAllRequestsRoute = createRoute({ - path: "/", + path: "/all", method: "get", description: "Get all requests. This will also return all associated upvotes count.", @@ -53,26 +53,37 @@ const getAllRequestsRoute = createRoute({ }, }) -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() +export const AllRequestsRoute = (handler: AppHandler) => { + handler.openapi(getAllRequestsRoute, async (ctx) => { + const { offset } = ctx.req.valid("query") ?? { offset: "0" } -handler.openapi(getAllRequestsRoute, async (ctx) => { - const { offset } = ctx.req.valid("query") ?? { offset: "0" } + const authSessionManager = new AuthSessionManager(ctx) - const { drizzle } = await getConnection(ctx.env) + const { user } = await authSessionManager.validateSession() - const requestFormManager = new RequestFormManager(drizzle) + if (!user || user.role != "creator" || user.plan == "supporter") { + return ctx.json( + { + success: false, + message: "Unauthorized. Only supporters can view requests.", + }, + 401 + ) + } - const allRequests = await requestFormManager.getRequestFormEntries( - parseInt(offset) - ) + const { drizzle } = await getConnection(ctx.env) - return ctx.json( - { - success: true, - requests: allRequests, - }, - 200 - ) -}) + const allRequests = await drizzle.query.requestForm.findMany({ + offset: parseInt(offset), + limit: 50, + }) -export default handler + return ctx.json( + { + success: true, + requests: allRequests, + }, + 200 + ) + }) +} diff --git a/src/v2/routes/requests/create-request.ts b/src/v2/routes/requests/create-request.ts index 3df71cd..da147b1 100644 --- a/src/v2/routes/requests/create-request.ts +++ b/src/v2/routes/requests/create-request.ts @@ -1,11 +1,10 @@ -import { OpenAPIHono } from "@hono/zod-openapi" +import { AppHandler } from "../handler" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" -import { RequestFormManager } from "@/v2/lib/managers/request-form/request-form-manager" import { getConnection } from "@/v2/db/turso" import { createRoute } from "@hono/zod-openapi" import { GenericResponses } from "@/v2/lib/response-schemas" import { z } from "@hono/zod-openapi" -import { selectRequestFormSchema } from "@/v2/db/schema" +import { requestForm, selectRequestFormSchema } from "@/v2/db/schema" import type { requestArea } from "@/v2/db/schema" const createRequestFormEntrySchema = z.object({ @@ -35,7 +34,7 @@ const createRequestFormEntryResponse = z.object({ }) const createRequestFormEntryRoute = createRoute({ - path: "/", + path: "/create", method: "post", description: "Create a new entry into the request form.", tags: ["Requests"], @@ -61,44 +60,43 @@ const createRequestFormEntryRoute = createRoute({ }, }) -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() +export const CreateRequestFormEntryRoute = (handler: AppHandler) => { + handler.openapi(createRequestFormEntryRoute, async (ctx) => { + const { area, title, description } = ctx.req.valid("json") -handler.openapi(createRequestFormEntryRoute, async (ctx) => { - const { area, title, description } = ctx.req.valid("json") + const authSessionManager = new AuthSessionManager(ctx) - const authSessionManager = new AuthSessionManager(ctx) + const { user } = await authSessionManager.validateSession() - const { user } = await authSessionManager.validateSession() + if (!user || user.role != "creator" || user.plan == "supporter") { + return ctx.json( + { + success: false, + message: + "Unauthorized. Only supporters can create request entries.", + }, + 401 + ) + } + + const { drizzle } = await getConnection(ctx.env) + + const [newRequestEntry] = await drizzle + .insert(requestForm) + .values({ + userId: user.id, + title: title, + area: area, + description: description, + }) + .returning() - if (!user || user.role != "creator" || user.plan == "supporter") { return ctx.json( { - success: false, - message: - "Unauthorized. Only supporters can create request entries.", + success: true, + response: newRequestEntry, }, - 401 + 200 ) - } - - const { drizzle } = await getConnection(ctx.env) - - const requestFormManager = new RequestFormManager(drizzle) - - const [newRequestEntry] = await requestFormManager.createRequestFormEntry( - user.id, - title, - area, - description - ) - - return ctx.json( - { - success: true, - response: newRequestEntry, - }, - 200 - ) -}) - -export default handler + }) +} diff --git a/src/v2/routes/requests/delete-request.ts b/src/v2/routes/requests/delete-request.ts index d7a8979..a2ab291 100644 --- a/src/v2/routes/requests/delete-request.ts +++ b/src/v2/routes/requests/delete-request.ts @@ -1,10 +1,11 @@ -import { OpenAPIHono } from "@hono/zod-openapi" +import { AppHandler } from "../handler" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" -import { RequestFormManager } from "@/v2/lib/managers/request-form/request-form-manager" import { getConnection } from "@/v2/db/turso" import { createRoute } from "@hono/zod-openapi" import { GenericResponses } from "@/v2/lib/response-schemas" import { z } from "@hono/zod-openapi" +import { requestForm } from "@/v2/db/schema" +import { eq } from "drizzle-orm" export const deleteRequestByIdSchema = z.object({ id: z.string().openapi({ @@ -23,7 +24,7 @@ export const deleteRequestByIdResponseSchema = z.object({ }) const deleteRequestByIdRoute = createRoute({ - path: "/{id}", + path: "/{id}/delete", method: "delete", description: "Delete a request by its ID. This will also delete all associated upvotes.", @@ -44,60 +45,61 @@ const deleteRequestByIdRoute = createRoute({ }, }) -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() +export const DeleteRequestByIdRoute = (handler: AppHandler) => { + handler.openapi(deleteRequestByIdRoute, async (ctx) => { + const requestId = ctx.req.valid("param").id -handler.openapi(deleteRequestByIdRoute, async (ctx) => { - const requestId = ctx.req.valid("param").id + const authSessionManager = new AuthSessionManager(ctx) - const authSessionManager = new AuthSessionManager(ctx) + const { user } = await authSessionManager.validateSession() - const { user } = await authSessionManager.validateSession() - - if (!user || user.role != "creator" || user.plan == "supporter") { - return ctx.json( - { - success: false, - message: "Unauthorized. Only supporters can delete requests.", - }, - 401 - ) - } - - const { drizzle } = await getConnection(ctx.env) - - const requestFormManager = new RequestFormManager(drizzle) - - const request = - await requestFormManager.doesRequestFormEntryExist(requestId) + if (!user || user.role != "creator" || user.plan == "supporter") { + return ctx.json( + { + success: false, + message: + "Unauthorized. Only supporters can delete requests.", + }, + 401 + ) + } + + const { drizzle } = await getConnection(ctx.env) + + const [request] = await drizzle + .select({ id: requestForm.id, userId: requestForm.userId }) + .from(requestForm) + .where(eq(requestForm.id, requestId)) + .limit(1) + + if (!request) { + return ctx.json( + { + success: false, + message: "Request by ID not found", + }, + 404 + ) + } + + if (request.userId != user.id) { + return ctx.json( + { + success: false, + message: + "Unauthorized. You can only delete your own requests.", + }, + 401 + ) + } - if (!request) { - return ctx.json( - { - success: false, - message: "Request by ID not found", - }, - 404 - ) - } + await drizzle.delete(requestForm).where(eq(requestForm.id, requestId)) - if (request.userId != user.id) { return ctx.json( { - success: false, - message: "Unauthorized. You can only delete your own requests.", + success: true, }, - 401 + 200 ) - } - - await requestFormManager.deleteRequestFormEntry(requestId) - - return ctx.json( - { - success: true, - }, - 200 - ) -}) - -export default handler + }) +} diff --git a/src/v2/routes/requests/handler.ts b/src/v2/routes/requests/handler.ts index 43c28be..cb37929 100644 --- a/src/v2/routes/requests/handler.ts +++ b/src/v2/routes/requests/handler.ts @@ -1,12 +1,20 @@ import { OpenAPIHono } from "@hono/zod-openapi" -import ViewAllRequestsRoute from "./all-requests" -import CreateRequestRoute from "./create-request" -import DeleteRequestRoute from "./delete-request" +import { AllRequestsRoute } from "./all-requests" +import { DeleteRequestByIdRoute } from "./delete-request" +import { CreateRequestFormEntryRoute } from "./create-request" +import { UpvoteRequestRoute } from "./upvote-request" +import { ViewRequestRoute } from "./view-request" +import { RemoveRequestUpvoteRoute } from "./remove-request-upvote" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() -handler.route("/view/all", ViewAllRequestsRoute) -handler.route("/create", CreateRequestRoute) -handler.route("/delete", DeleteRequestRoute) +AllRequestsRoute(handler) +ViewRequestRoute(handler) + +UpvoteRequestRoute(handler) +RemoveRequestUpvoteRoute(handler) + +CreateRequestFormEntryRoute(handler) +DeleteRequestByIdRoute(handler) export default handler diff --git a/src/v2/routes/requests/remove-request-upvote.ts b/src/v2/routes/requests/remove-request-upvote.ts new file mode 100644 index 0000000..85fd720 --- /dev/null +++ b/src/v2/routes/requests/remove-request-upvote.ts @@ -0,0 +1,126 @@ +import { AppHandler } from "../handler" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +import { getConnection } from "@/v2/db/turso" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" +import { requestForm, requestFormUpvotes } from "@/v2/db/schema" +import { eq } from "drizzle-orm" + +export const removeRequestUpvoteByIdSchema = z.object({ + id: z.string().openapi({ + param: { + name: "id", + in: "path", + description: "The ID of the request to remove the upvote for.", + example: "1", + required: true, + }, + }), +}) + +export const removeRequestUpvoteByIdResponseSchema = z.object({ + success: z.literal(true), +}) + +const removeRequestUpvoteByIdRoute = createRoute({ + path: "/{id}/downvote", + method: "post", + description: "Remove a upvote on a request by its ID. Supporter required.", + tags: ["Requests"], + request: { + params: removeRequestUpvoteByIdSchema, + }, + responses: { + 200: { + description: + "True if the request's upvote was removed successfully.", + content: { + "application/json": { + schema: removeRequestUpvoteByIdResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +export const RemoveRequestUpvoteRoute = (handler: AppHandler) => { + handler.openapi(removeRequestUpvoteByIdRoute, async (ctx) => { + const requestId = ctx.req.valid("param").id + + const authSessionManager = new AuthSessionManager(ctx) + + const { user } = await authSessionManager.validateSession() + + if (!user || user.role != "creator" || user.plan == "supporter") { + return ctx.json( + { + success: false, + message: + "Unauthorized. Only supporters can upvote requests.", + }, + 401 + ) + } + + const { drizzle } = await getConnection(ctx.env) + + const [request] = await drizzle + .select({ id: requestForm.id, userId: requestForm.userId }) + .from(requestForm) + .where(eq(requestForm.id, requestId)) + .limit(1) + + if (!request) { + return ctx.json( + { + success: false, + message: "Request by ID not found", + }, + 404 + ) + } + + if (request.userId == user.id) { + return ctx.json( + { + success: false, + message: + "Unauthorized. You can't remove upvotes on your own requests.", + }, + 401 + ) + } + + const [isUpvoted] = await drizzle + .select({ + id: requestFormUpvotes.id, + }) + .from(requestFormUpvotes) + .where(eq(requestFormUpvotes.requestFormId, requestId)) + .limit(1) + + if (!isUpvoted) { + return ctx.json( + { + success: false, + message: + "Unauthorized. You can't remove upvotes on requests you haven't upvoted.", + }, + 401 + ) + } + + await drizzle + .delete(requestFormUpvotes) + .where(eq(requestFormUpvotes.requestFormId, requestId)) + + return ctx.json( + { + success: true, + }, + 200 + ) + }) +} diff --git a/src/v2/routes/requests/upvote-request.ts b/src/v2/routes/requests/upvote-request.ts index e69de29..66fcbcf 100644 --- a/src/v2/routes/requests/upvote-request.ts +++ b/src/v2/routes/requests/upvote-request.ts @@ -0,0 +1,125 @@ +import { AppHandler } from "../handler" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +import { getConnection } from "@/v2/db/turso" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" +import { requestForm, requestFormUpvotes } from "@/v2/db/schema" +import { eq } from "drizzle-orm" + +export const upvoteRequestByIdSchema = z.object({ + id: z.string().openapi({ + param: { + name: "id", + in: "path", + description: "The ID of the request to upvote.", + example: "1", + required: true, + }, + }), +}) + +export const upvoteRequestByIdResponseSchema = z.object({ + success: z.literal(true), +}) + +const upvoteRequestByIdRoute = createRoute({ + path: "/{id}/upvote", + method: "post", + description: "Upvote a request by its ID. Supporter required.", + tags: ["Requests"], + request: { + params: upvoteRequestByIdSchema, + }, + responses: { + 200: { + description: "True if the request was upvoted successfully.", + content: { + "application/json": { + schema: upvoteRequestByIdResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +export const UpvoteRequestRoute = (handler: AppHandler) => { + handler.openapi(upvoteRequestByIdRoute, async (ctx) => { + const requestId = ctx.req.valid("param").id + + const authSessionManager = new AuthSessionManager(ctx) + + const { user } = await authSessionManager.validateSession() + + if (!user || user.role != "creator" || user.plan == "supporter") { + return ctx.json( + { + success: false, + message: + "Unauthorized. Only supporters can upvote requests.", + }, + 401 + ) + } + + const { drizzle } = await getConnection(ctx.env) + + const [request] = await drizzle + .select({ id: requestForm.id, userId: requestForm.userId }) + .from(requestForm) + .where(eq(requestForm.id, requestId)) + .limit(1) + + if (!request) { + return ctx.json( + { + success: false, + message: "Request by ID not found", + }, + 404 + ) + } + + if (request.userId == user.id) { + return ctx.json( + { + success: false, + message: + "Unauthorized. You can't upvote your own requests.", + }, + 401 + ) + } + + const [isUpvoted] = await drizzle + .select({ + id: requestFormUpvotes.id, + }) + .from(requestFormUpvotes) + .where(eq(requestFormUpvotes.requestFormId, requestId)) + .limit(1) + + if (isUpvoted) { + return ctx.json( + { + success: false, + message: "Request already upvoted", + }, + 400 + ) + } + + await drizzle.insert(requestFormUpvotes).values({ + requestFormId: requestId, + userId: user.id, + }) + + return ctx.json( + { + success: true, + }, + 200 + ) + }) +} diff --git a/src/v2/routes/requests/view-request.ts b/src/v2/routes/requests/view-request.ts index e69de29..6c51f2a 100644 --- a/src/v2/routes/requests/view-request.ts +++ b/src/v2/routes/requests/view-request.ts @@ -0,0 +1,92 @@ +import { AppHandler } from "../handler" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +import { getConnection } from "@/v2/db/turso" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" +import { requestForm, selectRequestFormSchema } from "@/v2/db/schema" +import { eq } from "drizzle-orm" + +export const viewRequestByIdSchema = z.object({ + id: z.string().openapi({ + param: { + name: "id", + in: "path", + description: "The ID of the request to view.", + example: "1", + required: true, + }, + }), +}) + +export const viewRequestByIdResponseSchema = z.object({ + success: z.literal(true), + request: selectRequestFormSchema, +}) + +const viewRequestByIdRoute = createRoute({ + path: "/{id}", + method: "get", + description: "View a request by its ID. Supporter required.", + tags: ["Requests"], + request: { + params: viewRequestByIdSchema, + }, + responses: { + 200: { + description: "True if the request was upvoted successfully.", + content: { + "application/json": { + schema: viewRequestByIdResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +export const ViewRequestRoute = (handler: AppHandler) => { + handler.openapi(viewRequestByIdRoute, async (ctx) => { + const requestId = ctx.req.valid("param").id + + const authSessionManager = new AuthSessionManager(ctx) + + const { user } = await authSessionManager.validateSession() + + if (!user || user.role != "creator" || user.plan == "supporter") { + return ctx.json( + { + success: false, + message: "Unauthorized. Only supporters can view requests.", + }, + 401 + ) + } + + const { drizzle } = await getConnection(ctx.env) + + const [request] = await drizzle + .select() + .from(requestForm) + .where(eq(requestForm.id, requestId)) + .limit(1) + + if (!request) { + return ctx.json( + { + success: false, + message: "Request by ID not found", + }, + 404 + ) + } + + return ctx.json( + { + success: true, + request: request, + }, + 200 + ) + }) +} From 96ba39b6c16a65d4f326a254aa22754de95c71ef Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 17 Mar 2024 05:17:11 +0000 Subject: [PATCH 274/318] fix desc --- src/v2/routes/requests/all-requests.ts | 2 +- src/v2/routes/requests/create-request.ts | 3 ++- src/v2/routes/requests/delete-request.ts | 2 +- src/v2/routes/requests/view-request.ts | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/v2/routes/requests/all-requests.ts b/src/v2/routes/requests/all-requests.ts index 4e54e2f..6699ca4 100644 --- a/src/v2/routes/requests/all-requests.ts +++ b/src/v2/routes/requests/all-requests.ts @@ -35,7 +35,7 @@ const getAllRequestsRoute = createRoute({ path: "/all", method: "get", description: - "Get all requests. This will also return all associated upvotes count.", + "Get all requests & associated upvotes count. Supporter required.", tags: ["Requests"], request: { query: viewAllRequestsSchema, diff --git a/src/v2/routes/requests/create-request.ts b/src/v2/routes/requests/create-request.ts index da147b1..0ff942d 100644 --- a/src/v2/routes/requests/create-request.ts +++ b/src/v2/routes/requests/create-request.ts @@ -36,7 +36,8 @@ const createRequestFormEntryResponse = z.object({ const createRequestFormEntryRoute = createRoute({ path: "/create", method: "post", - description: "Create a new entry into the request form.", + description: + "Create a new entry into the request form. Supporter required.", tags: ["Requests"], request: { body: { diff --git a/src/v2/routes/requests/delete-request.ts b/src/v2/routes/requests/delete-request.ts index a2ab291..16ef9a4 100644 --- a/src/v2/routes/requests/delete-request.ts +++ b/src/v2/routes/requests/delete-request.ts @@ -12,7 +12,7 @@ export const deleteRequestByIdSchema = z.object({ param: { name: "id", in: "path", - description: "The ID of the request to delete.", + description: "The ID of the request to delete. Supporter required.", example: "1", required: true, }, diff --git a/src/v2/routes/requests/view-request.ts b/src/v2/routes/requests/view-request.ts index 6c51f2a..3744ad6 100644 --- a/src/v2/routes/requests/view-request.ts +++ b/src/v2/routes/requests/view-request.ts @@ -34,7 +34,7 @@ const viewRequestByIdRoute = createRoute({ }, responses: { 200: { - description: "True if the request was upvoted successfully.", + description: "The request was found and returned successfully.", content: { "application/json": { schema: viewRequestByIdResponseSchema, From 090856c76a7eeae8366048f1705e4b26018e3ea8 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 17 Mar 2024 05:32:03 +0000 Subject: [PATCH 275/318] remove managers, set asset type to txt over autoincrement int --- src/scripts/seed/seed.ts | 6 - src/v2/db/schema/asset/asset-comments.ts | 2 +- src/v2/db/schema/asset/asset-likes.ts | 2 +- src/v2/db/schema/asset/asset.ts | 8 +- .../db/schema/collections/user-collections.ts | 2 +- src/v2/db/schema/tags/asset-tags.ts | 2 +- src/v2/db/schema/user/user-favourites.ts | 2 +- .../asset-category/asset-category-likes.ts | 61 ---- .../asset-category/asset-category-manager.ts | 169 ---------- .../game-asset-category-manager.ts | 75 ----- .../collection/collection-collaborators.ts | 128 -------- .../managers/collection/collection-likes.ts | 61 ---- .../managers/collection/collection-manager.ts | 307 ------------------ .../lib/managers/favorite/favorite-manager.ts | 181 ----------- src/v2/lib/managers/game/game-likes.ts | 45 --- .../request-form/request-form-manager.ts | 132 -------- src/v2/lib/managers/tag/tag-likes.ts | 51 --- src/v2/lib/managers/tag/tag-manager.ts | 96 ------ src/v2/routes/asset/delete-asset.ts | 4 +- src/v2/routes/asset/get-asset-comments.ts | 79 +++++ src/v2/routes/asset/get-asset.ts | 4 +- src/v2/routes/asset/like-asset.ts | 16 +- src/v2/routes/asset/modify-asset.ts | 22 +- src/v2/routes/asset/unlike-asset.ts | 16 +- 24 files changed, 107 insertions(+), 1364 deletions(-) delete mode 100644 src/v2/lib/managers/asset-category/asset-category-likes.ts delete mode 100644 src/v2/lib/managers/asset-category/asset-category-manager.ts delete mode 100644 src/v2/lib/managers/asset-category/game-asset-category-manager.ts delete mode 100644 src/v2/lib/managers/collection/collection-collaborators.ts delete mode 100644 src/v2/lib/managers/collection/collection-likes.ts delete mode 100644 src/v2/lib/managers/collection/collection-manager.ts delete mode 100644 src/v2/lib/managers/favorite/favorite-manager.ts delete mode 100644 src/v2/lib/managers/game/game-likes.ts delete mode 100644 src/v2/lib/managers/request-form/request-form-manager.ts delete mode 100644 src/v2/lib/managers/tag/tag-likes.ts delete mode 100644 src/v2/lib/managers/tag/tag-manager.ts diff --git a/src/scripts/seed/seed.ts b/src/scripts/seed/seed.ts index 3b8ad94..994cd06 100644 --- a/src/scripts/seed/seed.ts +++ b/src/scripts/seed/seed.ts @@ -260,7 +260,6 @@ async function main() { .insert(asset) .values([ { - id: 1, name: "test-asset", extension: "image/png", gameId: "genshin-impact", @@ -276,7 +275,6 @@ async function main() { height: 512, }, { - id: 2, name: "test-asset-2", extension: "image/png", gameId: "honkai-impact-3rd", @@ -292,7 +290,6 @@ async function main() { height: 1080, }, { - id: 3, name: "test-asset-3", extension: "image/png", gameId: "genshin-impact", @@ -308,7 +305,6 @@ async function main() { height: 1920, }, { - id: 4, name: "test-asset-4", extension: "image/png", gameId: "genshin-impact", @@ -324,7 +320,6 @@ async function main() { height: 1080, }, { - id: 5, name: "test-asset-5", extension: "image/png", gameId: "genshin-impact", @@ -337,7 +332,6 @@ async function main() { downloadCount: 1337, }, { - id: 6, name: "test-asset-6", extension: "image/png", gameId: "honkai-impact-3rd", diff --git a/src/v2/db/schema/asset/asset-comments.ts b/src/v2/db/schema/asset/asset-comments.ts index c33b1b5..1438bd7 100644 --- a/src/v2/db/schema/asset/asset-comments.ts +++ b/src/v2/db/schema/asset/asset-comments.ts @@ -22,7 +22,7 @@ export const assetComments = sqliteTable( .$defaultFn(() => { return generateID() }), - assetId: integer("asset_id").references(() => asset.id, { + assetId: text("asset_id").references(() => asset.id, { onUpdate: "cascade", onDelete: "cascade", }), diff --git a/src/v2/db/schema/asset/asset-likes.ts b/src/v2/db/schema/asset/asset-likes.ts index 9fe6dcd..2abf342 100644 --- a/src/v2/db/schema/asset/asset-likes.ts +++ b/src/v2/db/schema/asset/asset-likes.ts @@ -14,7 +14,7 @@ import { createInsertSchema, createSelectSchema } from "drizzle-zod" export const assetLikes = sqliteTable( tableNames.assetLikes, { - assetId: integer("asset_id") + assetId: text("asset_id") .notNull() .references(() => asset.id, { onUpdate: "cascade", diff --git a/src/v2/db/schema/asset/asset.ts b/src/v2/db/schema/asset/asset.ts index e9c63a4..2f6bea5 100644 --- a/src/v2/db/schema/asset/asset.ts +++ b/src/v2/db/schema/asset/asset.ts @@ -15,6 +15,7 @@ import { createInsertSchema, createSelectSchema } from "drizzle-zod" import { assetLikes } from "./asset-likes" import { assetExternalFile } from "./asset-external-files" import { assetComments } from "./asset-comments" +import { generateID } from "@/v2/lib/oslo" /* NOTE: Assets have a lot of relations, and can be quite complex in some cases. @@ -31,7 +32,12 @@ export type AssetStatus = "pending" | "approved" | "rejected" export const asset = sqliteTable( tableNames.asset, { - id: integer("id").primaryKey(), // primary key auto increments on sqlite + id: text("id") + .primaryKey() + .notNull() + .$defaultFn(() => { + return generateID() + }), name: text("name").notNull(), extension: text("extension").notNull(), gameId: text("game") diff --git a/src/v2/db/schema/collections/user-collections.ts b/src/v2/db/schema/collections/user-collections.ts index db7d2b6..76d4345 100644 --- a/src/v2/db/schema/collections/user-collections.ts +++ b/src/v2/db/schema/collections/user-collections.ts @@ -79,7 +79,7 @@ export const userCollectionAsset = sqliteTable( onUpdate: "cascade", onDelete: "cascade", }), - assetId: integer("asset_id") + assetId: text("asset_id") .notNull() .references(() => asset.id, { onUpdate: "cascade", diff --git a/src/v2/db/schema/tags/asset-tags.ts b/src/v2/db/schema/tags/asset-tags.ts index 3ed2c3a..12b4d9a 100644 --- a/src/v2/db/schema/tags/asset-tags.ts +++ b/src/v2/db/schema/tags/asset-tags.ts @@ -47,7 +47,7 @@ export const assetTagAsset = sqliteTable( onUpdate: "cascade", onDelete: "cascade", }), - assetId: integer("asset_id") + assetId: text("asset_id") .notNull() .references(() => asset.id, { onUpdate: "cascade", diff --git a/src/v2/db/schema/user/user-favourites.ts b/src/v2/db/schema/user/user-favourites.ts index b090e1c..8275461 100644 --- a/src/v2/db/schema/user/user-favourites.ts +++ b/src/v2/db/schema/user/user-favourites.ts @@ -69,7 +69,7 @@ export const userFavouriteAsset = sqliteTable( onUpdate: "cascade", onDelete: "cascade", }), - assetId: integer("asset_id") + assetId: text("asset_id") .notNull() .references(() => asset.id, { onUpdate: "cascade", diff --git a/src/v2/lib/managers/asset-category/asset-category-likes.ts b/src/v2/lib/managers/asset-category/asset-category-likes.ts deleted file mode 100644 index 9eb0a51..0000000 --- a/src/v2/lib/managers/asset-category/asset-category-likes.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { DrizzleInstance } from "@/v2/db/turso" -import { and, eq } from "drizzle-orm" -import { assetCategoryLikes } from "@/v2/db/schema/categories/asset-categories-likes" - -export class AssetCategoryLikesManager { - constructor(private drizzle: DrizzleInstance) {} - - /** - * Likes a category for a user. - * @param assetCategoryId - The ID of the category to like. - * @param userId - The ID of the user to like the category for. - */ - public async likeAssetCategory( - assetCategoryId: string, - userId: string - ): Promise { - try { - await this.drizzle.insert(assetCategoryLikes).values({ - assetCategoryId, - likedById: userId, - }) - } catch (e) { - console.error( - `Error liking category ${assetCategoryId} for user ${userId}`, - e - ) - throw new Error( - `Error liking category ${assetCategoryId} for user ${userId}` - ) - } - } - - /** - * Unlikes a category for a user. - * @param assetCategoryId - The ID of the category to unlike. - * @param userId - The ID of the user to unlike the category for. - */ - public async unlikeAssetCategory( - assetCategoryId: string, - userId: string - ): Promise { - try { - await this.drizzle - .delete(assetCategoryLikes) - .where( - and( - eq(assetCategoryLikes.assetCategoryId, assetCategoryId), - eq(assetCategoryLikes.likedById, userId) - ) - ) - } catch (e) { - console.error( - `Error liking category ${assetCategoryId} for user ${userId}`, - e - ) - throw new Error( - `Error liking category ${assetCategoryId} for user ${userId}` - ) - } - } -} diff --git a/src/v2/lib/managers/asset-category/asset-category-manager.ts b/src/v2/lib/managers/asset-category/asset-category-manager.ts deleted file mode 100644 index 60413bc..0000000 --- a/src/v2/lib/managers/asset-category/asset-category-manager.ts +++ /dev/null @@ -1,169 +0,0 @@ -import { DrizzleInstance } from "@/v2/db/turso" -import { assetCategory } from "@/v2/db/schema" -import { eq, like, or } from "drizzle-orm" -import { z } from "zod" -import type { AssetCategory, NewAssetCategory } from "@/v2/db/schema" - -/** - * Represents the schema for inserting a new asset category. - */ -const insertAssetCategorySchema = z.object({ - name: z.string(), - formattedName: z.string(), -}) - -/** - * Manages operations related to asset categories. - */ -export class AssetCategoryManager { - constructor(private drizzle: DrizzleInstance) {} - - /** - * Retrieves an asset category by its ID. - * @param assetCategoryId - The unique ID of the asset category to retrieve. - * @returns A promise that resolves to the retrieved asset category. - */ - public async getAssetCategoryById( - assetCategoryId: string - ): Promise { - try { - const [foundAssetCategory] = await this.drizzle - .select() - .from(assetCategory) - .where(eq(assetCategory.id, assetCategoryId)) - - return foundAssetCategory ?? null - } catch (e) { - console.error( - `Error getting asset category by ID ${assetCategoryId}`, - e - ) - throw new Error( - `Error getting asset category by ID ${assetCategoryId}` - ) - } - } - - /** - * Retrieves a list of all asset categories. - * @returns A promise that resolves to an array of asset categories. - */ - public async listAssetCategories(): Promise { - try { - const assetCategories = await this.drizzle - .select() - .from(assetCategory) - - return assetCategories - } catch (e) { - console.error("Error listing asset categories", e) - throw new Error("Error listing asset categories") - } - } - - /** - * Retrieves asset categories with partial name matching. - * @param assetCategoryName - The partial name to search for within asset categories. - * @returns A promise that resolves to an array of matching asset categories. - */ - public async getAssetCategoriesByPartialName( - assetCategoryName: string - ): Promise { - try { - const assetCategories = await this.drizzle - .select() - .from(assetCategory) - .where(or(like(assetCategory.name, `%${assetCategoryName}%`))) - - return assetCategories - } catch (e) { - console.error("Error getting asset categories by partial name", e) - throw new Error("Error getting asset categories by partial name") - } - } - - /** - * Creates a new asset category. - * @param newAssetCategory - The new asset category to create, adhering to the insertAssetCategorySchema. - * @returns A promise that resolves to the created asset category. - */ - public async createAssetCategory( - newAssetCategory: z.infer - ): Promise { - try { - const [createdAssetCategory] = await this.drizzle - .insert(assetCategory) - .values({ - id: newAssetCategory.name, - name: newAssetCategory.name, - formattedName: newAssetCategory.name, - lastUpdated: new Date().toISOString(), - }) - .returning() - - return createdAssetCategory - } catch (e) { - console.error("Error creating asset category", e) - throw new Error("Error creating asset category") - } - } - - /** - * Deletes an asset category by its ID. - * @param assetCategoryId - The ID of the asset category to delete. - * @returns A promise that resolves to the deleted asset category. - */ - public async deleteAssetCategory( - assetCategoryId: string - ): Promise { - try { - const [deletedAssetCategory] = await this.drizzle - .delete(assetCategory) - .where(eq(assetCategory.id, assetCategoryId)) - .returning() - - return deletedAssetCategory - } catch (e) { - console.error( - `Error deleting asset category by ID ${assetCategoryId}`, - e - ) - throw new Error( - `Error deleting asset category by ID ${assetCategoryId}` - ) - } - } - - /** - * Updates an asset category by its ID. - * @param assetCategoryId - The ID of the asset category to update. - * @param newAssetCategory - The updated asset category data, adhering to the insertAssetCategorySchema. - * @returns A promise that resolves to the updated asset category. - */ - public async updateAssetCategory( - assetCategoryId: string, - newAssetCategory: z.infer - ): Promise { - try { - const [updatedAssetCategory] = await this.drizzle - .update(assetCategory) - .set({ - name: newAssetCategory.name, - formattedName: newAssetCategory.name, - lastUpdated: new Date().toISOString(), - }) - .where(eq(assetCategory.id, assetCategoryId)) - .returning() - - return updatedAssetCategory - } catch (e) { - console.error( - `Error updating asset category by ID ${assetCategoryId}`, - e - ) - throw new Error( - `Error updating asset category by ID ${assetCategoryId}` - ) - } - } -} diff --git a/src/v2/lib/managers/asset-category/game-asset-category-manager.ts b/src/v2/lib/managers/asset-category/game-asset-category-manager.ts deleted file mode 100644 index 79a3468..0000000 --- a/src/v2/lib/managers/asset-category/game-asset-category-manager.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { DrizzleInstance } from "@/v2/db/turso" -import { gameAssetCategory } from "@/v2/db/schema" -import { and, eq } from "drizzle-orm" -import type { GameAssetCategory } from "@/v2/db/schema" - -/** - * Manages operations related to game asset categories. - */ -export class GameAssetCategoryManager { - constructor(private drizzle: DrizzleInstance) {} - - /** - * Links an asset category to a game. - * @param assetCategoryId - The ID of the asset category to link. - * @param gameId - The ID of the game to which the asset category will be linked. - * @returns A promise that resolves to the created game asset category. - */ - public async linkAssetCategoryToGame( - assetCategoryId: string, - gameId: string - ): Promise { - try { - const [createdGameAssetCategory] = await this.drizzle - .insert(gameAssetCategory) - .values({ - assetCategoryId, - gameId, - }) - .returning() - - return createdGameAssetCategory - } catch (e) { - console.error( - `Error linking asset category ${assetCategoryId} to game ${gameId}`, - e - ) - throw new Error( - `Error linking asset category ${assetCategoryId} to game ${gameId}` - ) - } - } - - /** - * Unlinks an asset category from a game. - * @param assetCategoryId - The ID of the asset category to unlink. - * @param gameId - The ID of the game from which the asset category will be unlinked. - * @returns A promise that resolves to the deleted game asset category. - */ - public async unlinkAssetCategoryFromGame( - assetCategoryId: string, - gameId: string - ): Promise { - try { - const [deletedGameAssetCategory] = await this.drizzle - .delete(gameAssetCategory) - .where( - and( - eq(gameAssetCategory.assetCategoryId, assetCategoryId), - eq(gameAssetCategory.gameId, gameId) - ) - ) - .returning() - - return deletedGameAssetCategory - } catch (e) { - console.error( - `Error unlinking asset category ${assetCategoryId} from game ${gameId}`, - e - ) - throw new Error( - `Error unlinking asset category ${assetCategoryId} from game ${gameId}` - ) - } - } -} diff --git a/src/v2/lib/managers/collection/collection-collaborators.ts b/src/v2/lib/managers/collection/collection-collaborators.ts deleted file mode 100644 index ec9062f..0000000 --- a/src/v2/lib/managers/collection/collection-collaborators.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { DrizzleInstance } from "@/v2/db/turso" -import { and, eq } from "drizzle-orm" -import { userCollectionCollaborators } from "@/v2/db/schema/collections/user-collections-collaborators" -import { authUser } from "@/v2/db/schema/user/user" -import type { CollaboratorsRoles } from "@/v2/db/schema/collections/user-collections-collaborators" - -export class UserCollectionCollaboratorsManager { - constructor(private drizzle: DrizzleInstance) {} - - /** - * Adds a collaborator to a collection. - * @param collectionId - The ID of the collection to add a collaborator to. - * @param userId - The ID of the user to add as a collaborator. - */ - public async addCollaborator( - collectionId: string, - userId: string, - role: CollaboratorsRoles - ): Promise { - try { - await this.drizzle.insert(userCollectionCollaborators).values({ - collectionId: collectionId, - collaboratorId: userId, - role: role, - }) - } catch (e) { - console.error( - `Error adding collaborator ${userId} to collection ${collectionId}`, - e - ) - throw new Error( - `Error adding collaborator ${userId} to collection ${collectionId}` - ) - } - } - - public async updateCollaboratorRole( - collectionId: string, - userId: string, - role: CollaboratorsRoles - ): Promise { - try { - await this.drizzle - .update(userCollectionCollaborators) - .set({ - role: role, - }) - .where( - and( - eq( - userCollectionCollaborators.collectionId, - collectionId - ), - eq(userCollectionCollaborators.collaboratorId, userId) - ) - ) - } catch (e) { - console.error( - `Error updating collaborator ${userId} role in collection ${collectionId}`, - e - ) - throw new Error( - `Error updating collaborator ${userId} role in collection ${collectionId}` - ) - } - } - - /** - * Removes a collaborator from a collection. - * @param collectionId - The ID of the collection to remove a collaborator from. - * @param userId - The ID of the user to remove as a collaborator. - */ - public async removeCollaborator( - collectionId: string, - userId: string - ): Promise { - try { - await this.drizzle - .delete(userCollectionCollaborators) - .where( - and( - eq( - userCollectionCollaborators.collectionId, - collectionId - ), - eq(userCollectionCollaborators.collaboratorId, userId) - ) - ) - } catch (e) { - console.error( - `Error removing collaborator ${userId} from collection ${collectionId}`, - e - ) - throw new Error( - `Error removing collaborator ${userId} from collection ${collectionId}` - ) - } - } - - /** - * Gets the collaborators for a collection. - * @param collectionId - The ID of the collection to get collaborators for. - */ - public async getCollaborators(collectionId: string) { - try { - return await this.drizzle - .select({ - userId: authUser.id, - username: authUser.username, - avatarUrl: authUser.avatarUrl, - collectionId: userCollectionCollaborators.collectionId, - }) - .from(userCollectionCollaborators) - .fullJoin( - authUser, - eq(authUser.id, userCollectionCollaborators.collaboratorId) - ) - } catch (e) { - console.error( - `Error getting collaborators for collection ${collectionId}`, - e - ) - throw new Error( - `Error getting collaborators for collection ${collectionId}` - ) - } - } -} diff --git a/src/v2/lib/managers/collection/collection-likes.ts b/src/v2/lib/managers/collection/collection-likes.ts deleted file mode 100644 index f5b777b..0000000 --- a/src/v2/lib/managers/collection/collection-likes.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { DrizzleInstance } from "@/v2/db/turso" -import { and, eq } from "drizzle-orm" -import { userCollectionLikes } from "@/v2/db/schema/collections/user-collection-likes" - -export class UserCollectionLikesManager { - constructor(private drizzle: DrizzleInstance) {} - - /** - * Likes a collection for a user. - * @param collectionId - The ID of the collection to like. - * @param userId - The ID of the user to like the collection for. - */ - public async likeCollection( - collectionId: string, - userId: string - ): Promise { - try { - await this.drizzle.insert(userCollectionLikes).values({ - collectionId, - likedById: userId, - }) - } catch (e) { - console.error( - `Error liking game ${collectionId} for user ${userId}`, - e - ) - throw new Error( - `Error liking game ${collectionId} for user ${userId}` - ) - } - } - - /** - * Unlikes a collection for a user. - * @param collectionId - The ID of the collection to unlike. - * @param userId - The ID of the user to unlike the collection for. - */ - public async unlikeCollection( - collectionId: string, - userId: string - ): Promise { - try { - await this.drizzle - .delete(userCollectionLikes) - .where( - and( - eq(userCollectionLikes.collectionId, collectionId), - eq(userCollectionLikes.likedById, userId) - ) - ) - } catch (e) { - console.error( - `Error liking game ${collectionId} for user ${userId}`, - e - ) - throw new Error( - `Error liking game ${collectionId} for user ${userId}` - ) - } - } -} diff --git a/src/v2/lib/managers/collection/collection-manager.ts b/src/v2/lib/managers/collection/collection-manager.ts deleted file mode 100644 index d0776bb..0000000 --- a/src/v2/lib/managers/collection/collection-manager.ts +++ /dev/null @@ -1,307 +0,0 @@ -import { DrizzleInstance } from "@/v2/db/turso" -import { userCollection, userCollectionAsset } from "@/v2/db/schema" -import { and, eq, like } from "drizzle-orm" -import { z } from "zod" -import type { - NewUserCollection, - NewUserCollectionAsset, - UserCollection, - UserCollectionAsset, -} from "@/v2/db/schema" - -const insertCollectionSchema = z.object({ - name: z.string(), - description: z.string(), - isPublic: z.boolean(), -}) - -/** - * Manages operations related to collections. - */ -export class CollectionManager { - constructor(private drizzle: DrizzleInstance) {} - - /** - * Retrieves a collection by its ID. - * @param collectionId - The unique ID of the collection to retrieve. - * @returns A promise that resolves to the retrieved collection. - */ - public async getCollectionById( - collectionId: string, - currentUserId?: string - ): Promise { - try { - const [foundCollection] = await this.drizzle - .select() - .from(userCollection) - .where( - and( - currentUserId - ? eq(userCollection.userId, currentUserId) - : eq(userCollection.isPublic, true), - eq(userCollection.id, collectionId) - ) - ) - - return foundCollection ?? null - } catch (e) { - console.error( - `Error in getCollectionById for collectionId ${collectionId} and currentUserId ${currentUserId}`, - e - ) - throw new Error( - `Error in getCollectionById for collectionId ${collectionId} and currentUserId ${currentUserId}` - ) - } - } - - /** - * Retrieves a list of all collections. - * @returns A promise that resolves to an array of collections. - */ - public async listCollections( - currentUserId?: string - ): Promise { - try { - const collections = await this.drizzle - .select() - .from(userCollection) - .where( - currentUserId - ? eq(userCollection.userId, currentUserId) - : eq(userCollection.isPublic, true) - ) - - return collections ?? null - } catch (e) { - console.error( - `Error in listCollections for currentUserId ${currentUserId}`, - e - ) - throw new Error( - `Error in listCollections for currentUserId ${currentUserId}` - ) - } - } - - /** - * Retrieves collections with partial name matching. - * @param collectionName - The partial name to search for within collections. - * @returns A promise that resolves to an array of matching collections. - */ - public async getCollectionsByPartialName( - collectionName: string, - currentUserId?: string - ): Promise { - try { - const collections = await this.drizzle - .select() - .from(userCollection) - .where( - and( - currentUserId - ? eq(userCollection.userId, currentUserId) - : eq(userCollection.isPublic, true), - like(userCollection.name, `%${collectionName}%`) - ) - ) - - return collections ?? null - } catch (e) { - console.error( - `Error in getCollectionsByPartialName for collectionName ${collectionName} and currentUserId ${currentUserId}`, - e - ) - throw new Error( - `Error in getCollectionsByPartialName for collectionName ${collectionName} and currentUserId ${currentUserId}` - ) - } - } - /** - * Retrieves public collections for a specific user. - * @param userId - The ID of the user. - * @returns The list of public collections associated with the user. - */ - public async getCollectionsByUserId( - userId: string, - currentUserId?: string - ): Promise { - try { - const collections = await this.drizzle - .select() - .from(userCollection) - .where( - and( - currentUserId - ? eq(userCollection.userId, currentUserId) - : eq(userCollection.isPublic, true), - eq(userCollection.userId, userId) - ) - ) - - return collections ?? null - } catch (e) { - console.error( - `Error in getCollectionsByUserId for userId ${userId} and currentUserId ${currentUserId}`, - e - ) - throw new Error( - `Error in getCollectionsByUserId for userId ${userId} and currentUserId ${currentUserId}` - ) - } - } - - /** - * Removes an asset from a collection. - * @param collectionId - The ID of the collection. - * @param assetId - The ID of the asset to remove. - */ - public async removeAssetFromCollection( - collectionId: string, - assetId: number - ): Promise { - try { - const [removedAsset] = await this.drizzle - .delete(userCollectionAsset) - .where( - and( - eq(userCollectionAsset.collectionId, collectionId), - eq(userCollectionAsset.assetId, assetId) - ) - ) - .returning() - - return removedAsset ?? null - } catch (e) { - console.error( - `Error in removeAssetFromCollection for collectionId ${collectionId} and assetId ${assetId}`, - e - ) - throw new Error( - `Error in removeAssetFromCollection for collectionId ${collectionId} and assetId ${assetId}` - ) - } - } - - /** - * Deletes a collection by its ID. - * @param collectionId - The ID of the collection to delete. - */ - public async deleteCollection( - collectionId: string - ): Promise { - try { - const [deletedCollection] = await this.drizzle - .delete(userCollection) - .where(eq(userCollection.id, collectionId)) - .returning() - - return deletedCollection - } catch (e) { - console.error( - `Error in deleteCollection for collectionId ${collectionId}`, - e - ) - throw new Error( - `Error in deleteCollection for collectionId ${collectionId}` - ) - } - } - - /** - * Adds an asset to a collection. - * @param collectionId - The ID of the collection. - * @param assetId - The ID of the asset to add. - */ - public async addAssetToCollection( - collectionId: string, - assetId: number - ): Promise { - try { - const [addedAsset] = await this.drizzle - .insert(userCollectionAsset) - .values({ - collectionId: collectionId, - assetId: assetId, - }) - .returning() - - return addedAsset - } catch (e) { - console.error( - `Error in addAssetToCollection for collectionId ${collectionId} and assetId ${assetId}`, - e - ) - throw new Error( - `Error in addAssetToCollection for collectionId ${collectionId} and assetId ${assetId}` - ) - } - } - - /** - * Creates a new collection. - * @param userId - The ID of the user creating the collection. - * @param collectionSchema - The schema for the new collection. - * @returns The created collection. - */ - public async createCollection( - userId: string, - collectionSchema: z.infer - ): Promise { - try { - const [createdCollection] = await this.drizzle - .insert(userCollection) - .values({ - userId: userId, - description: collectionSchema.description, - name: collectionSchema.name, - isPublic: collectionSchema.isPublic, - }) - .returning() - - return createdCollection - } catch (e) { - console.error( - `Error in createCollection for userId ${userId} and collectionSchema ${collectionSchema}`, - e - ) - throw new Error( - `Error in createCollection for userId ${userId} and collectionSchema ${collectionSchema}` - ) - } - } - - /** - * Updates an existing collection. - * - * @param collectionId - The ID of the collection to update. - * @param collectionSchema - The updated schema for the collection. - * @returns The updated collection. - */ - public async updateCollection( - collectionId: string, - collectionSchema: z.infer - ): Promise { - try { - const [updatedCollection] = await this.drizzle - .update(userCollection) - .set({ - description: collectionSchema.description, - name: collectionSchema.name, - isPublic: collectionSchema.isPublic, - }) - .where(eq(userCollection.id, collectionId)) - .returning() - - return updatedCollection - } catch (e) { - console.error( - `Error in updateCollection for collectionId ${collectionId} and collectionSchema ${collectionSchema}`, - e - ) - throw new Error( - `Error in updateCollection for collectionId ${collectionId} and collectionSchema ${collectionSchema}` - ) - } - } -} diff --git a/src/v2/lib/managers/favorite/favorite-manager.ts b/src/v2/lib/managers/favorite/favorite-manager.ts deleted file mode 100644 index 43f9af5..0000000 --- a/src/v2/lib/managers/favorite/favorite-manager.ts +++ /dev/null @@ -1,181 +0,0 @@ -import { userFavourite, userFavouriteAsset } from "@/v2/db/schema" -import { and, eq } from "drizzle-orm" -import { DrizzleInstance } from "@/v2/db/turso" -import type { - NewUserFavourite, - NewUserFavouriteAsset, - UserFavourite, - UserFavouriteAsset, -} from "@/v2/db/schema" - -/** - * Manages operations related to user favourites. - */ -export class FavoriteManager { - constructor(private drizzle: DrizzleInstance) {} - - /** - * Get a user's favourite assets. - * @param userId - The ID of the user to retrieve favourites for. - * @param currentUserId - The optional current user's ID. - * @returns A user's favourite assets. - */ - public async getUserFavourite( - userId: string, - currentUserId?: string - ): Promise { - try { - const favouriteExists = this.checkIfUserFavouriteExists(userId) - - if (!favouriteExists) { - await this.createInitialFavorite(userId) - } - - const [favourite] = await this.drizzle - .select() - .from(userFavourite) - .where( - and( - currentUserId - ? eq(userFavourite.userId, currentUserId) - : eq(userFavourite.isPublic, true), - eq(userFavourite.userId, userId) - ) - ) - - return favourite ?? null - } catch (e) { - console.error( - `Error in getUserFavourite for userId ${userId} and currentUserId ${currentUserId}`, - e - ) - throw new Error( - `Error in getUserFavourite for userId ${userId} and currentUserId ${currentUserId}` - ) - } - } - - public async checkIfUserFavouriteExists(userId: string): Promise { - try { - const [favourite] = await this.drizzle - .select({ - id: userFavourite.id, - }) - .from(userFavourite) - .where(and(eq(userFavourite.userId, userId))) - - return favourite ? true : false - } catch (e) { - console.error( - `Error in checkIfUserFavouriteExists for userId ${userId}`, - e - ) - throw new Error( - `Error in checkIfUserFavouriteExists for userId ${userId}` - ) - } - } - - /** - * Create initial user favourite (1 per user!) - * @param userId - The ID of the user to create favourites for. - * @returns A user's favourite item. - */ - public async createInitialFavorite( - userId: string - ): Promise { - try { - const [favourite] = await this.drizzle - .insert(userFavourite) - .values({ - userId: userId, - }) - .returning() - - return favourite - } catch (e) { - console.error( - `Error in createInitialFavorite for userId ${userId}`, - e - ) - throw new Error( - `Error in createInitialFavorite for userId ${userId}` - ) - } - } - /** - * Adds an asset to a user's favourites. - * @param assetId - The ID of the asset to add to favourites. - * @param userFavouriteId - User's unique favourite ID. - */ - public async addAssetToFavorites( - assetId: number, - userId: string, - userFavouriteId: string - ): Promise { - try { - const favouriteExists = this.checkIfUserFavouriteExists(userId) - - if (!favouriteExists) { - await this.createInitialFavorite(userId) - } - - const [favourite] = await this.drizzle - .insert(userFavouriteAsset) - .values({ - userFavouriteId: userFavouriteId, - assetId: assetId, - }) - .returning() - - return favourite - } catch (e) { - console.error( - `Error in addAssetToFavorites for userFavouriteId ${userFavouriteId} and assetId ${assetId}`, - e - ) - throw new Error( - `Error in addAssetToFavorites for userFavouriteId ${userFavouriteId} and assetId ${assetId}` - ) - } - } - - /** - * Removes an asset from a user's favourites. - * @param assetId - The ID of the asset to remove from favourites. - * @param userFavouriteId - User's unique favourite ID. - */ - public async removeAssetFromFavorites( - assetId: number, - userId: string, - userFavouriteId: string - ): Promise { - try { - const favouriteExists = this.checkIfUserFavouriteExists(userId) - - if (!favouriteExists) { - await this.createInitialFavorite(userId) - } - - const [favourite] = await this.drizzle - .delete(userFavouriteAsset) - .where( - and( - eq(userFavouriteAsset.userFavouriteId, userFavouriteId), - eq(userFavouriteAsset.assetId, assetId) - ) - ) - .returning() - - return favourite ?? null - } catch (e) { - console.error( - `Error in removeAssetFromFavorites for userFavouriteId ${userFavouriteId} and assetId ${assetId}`, - e - ) - throw new Error( - `Error in removeAssetFromFavorites for userFavouriteId ${userFavouriteId} and assetId ${assetId}` - ) - } - } -} diff --git a/src/v2/lib/managers/game/game-likes.ts b/src/v2/lib/managers/game/game-likes.ts deleted file mode 100644 index 36c20a5..0000000 --- a/src/v2/lib/managers/game/game-likes.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { DrizzleInstance } from "@/v2/db/turso" -import { and, eq } from "drizzle-orm" -import { gameLikes } from "@/v2/db/schema/game/game-likes" - -export class GameLikesManager { - constructor(private drizzle: DrizzleInstance) {} - - /** - * Likes a game for a user. - * @param gameId - The ID of the game to like. - * @param userId - The ID of the user to unlike the game for. - */ - public async likeGame(gameId: string, userId: string): Promise { - try { - await this.drizzle.insert(gameLikes).values({ - gameId, - likedById: userId, - }) - } catch (e) { - console.error(`Error liking game ${gameId} for user ${userId}`, e) - throw new Error(`Error liking game ${gameId} for user ${userId}`) - } - } - - /** - * Unlikes a game for a user. - * @param gameId - The ID of the game to unlike. - * @param userId - The ID of the user to unlike the game for. - */ - public async unlikeGame(gameId: string, userId: string): Promise { - try { - await this.drizzle - .delete(gameLikes) - .where( - and( - eq(gameLikes.gameId, gameId), - eq(gameLikes.likedById, userId) - ) - ) - } catch (e) { - console.error(`Error liking game ${gameId} for user ${userId}`, e) - throw new Error(`Error liking game ${gameId} for user ${userId}`) - } - } -} diff --git a/src/v2/lib/managers/request-form/request-form-manager.ts b/src/v2/lib/managers/request-form/request-form-manager.ts deleted file mode 100644 index 7cb3889..0000000 --- a/src/v2/lib/managers/request-form/request-form-manager.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { DrizzleInstance } from "@/v2/db/turso" -import { and, eq } from "drizzle-orm" -import { requestArea, requestForm, requestFormUpvotes } from "@/v2/db/schema" - -export class RequestFormManager { - constructor(private drizzle: DrizzleInstance) {} - - public async getRequestFormEntries(offset: number = 0, limit: number = 50) { - try { - return await this.drizzle.query.requestForm.findMany({ - offset: offset, - limit: limit, - // with: { - // requestFormUpvotes: { - // columns: { - // userId: true, - // }, - // }, - // }, - // extras: { - // upvoteCount: - // sql`SELECT COUNT(*) FROM ${requestFormUpvotes} WHERE ${requestFormUpvotes.requestFormId} = ${requestForm.id}`.as( - // "upvoteCount" - // ), - // }, - }) - } catch (e) { - console.error(`Error getting request form entries`, e) - throw new Error(`Error getting request form entries`) - } - } - - public async doesRequestFormEntryExist(id: string) { - try { - const [response] = await this.drizzle - .select({ id: requestForm.id, userId: requestForm.userId }) - .from(requestForm) - .where(eq(requestForm.id, id)) - .limit(1) - - return response - } catch (e) { - console.error(`Error checking if request form entry exists`, e) - throw new Error(`Error checking if request form entry exists`) - } - } - - public async createRequestFormEntry( - userId: string, - title: string, - area: requestArea, - description: string - ) { - try { - return await this.drizzle - .insert(requestForm) - .values({ - userId, - title, - area, - description, - }) - .returning() - } catch (e) { - console.error(`Error creating request form entry`, e) - throw new Error(`Error creating request form entry`) - } - } - - public async checkIfUserUpvotedRequestFormEntry( - requestFormId: string, - userId: string - ): Promise { - try { - const response = - await this.drizzle.query.requestFormUpvotes.findFirst({ - where: and( - eq(requestFormUpvotes.requestFormId, requestFormId), - eq(requestFormUpvotes.userId, userId) - ), - }) - - return response !== null - } catch (e) { - console.error( - `Error checking if user upvoted request form entry`, - e - ) - throw new Error(`Error checking if user upvoted request form entry`) - } - } - - public async deleteRequestFormEntry(id: string) { - try { - await this.drizzle.delete(requestForm).where(eq(requestForm.id, id)) - } catch (e) { - console.error(`Error deleting request form entry`, e) - throw new Error(`Error deleting request form entry`) - } - } - - public async upvoteRequestFormEntry(requestFormId: string, userId: string) { - try { - await this.drizzle.insert(requestFormUpvotes).values({ - requestFormId, - userId, - }) - } catch (e) { - console.error(`Error upvoting request form entry`, e) - throw new Error(`Error upvoting request form entry`) - } - } - - public async removeUpvoteRequestFormEntry( - requestFormId: string, - userId: string - ) { - try { - await this.drizzle - .delete(requestFormUpvotes) - .where( - and( - eq(requestFormUpvotes.requestFormId, requestFormId), - eq(requestFormUpvotes.userId, userId) - ) - ) - } catch (e) { - console.error(`Error removing upvote from request form entry`, e) - throw new Error(`Error removing upvote from request form entry`) - } - } -} diff --git a/src/v2/lib/managers/tag/tag-likes.ts b/src/v2/lib/managers/tag/tag-likes.ts deleted file mode 100644 index 3bbf5c9..0000000 --- a/src/v2/lib/managers/tag/tag-likes.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { DrizzleInstance } from "@/v2/db/turso" -import { and, eq } from "drizzle-orm" -import { assetTagLikes } from "@/v2/db/schema/tags/asset-tags-likes" - -export class AssetTagLikesManager { - constructor(private drizzle: DrizzleInstance) {} - - /** - * Likes a game for a user. - * @param assetTagId - The ID of the tag to like. - * @param userId - The ID of the user to like the tag for. - */ - public async likeTag(assetTagId: string, userId: string): Promise { - try { - await this.drizzle.insert(assetTagLikes).values({ - assetTagId, - likedById: userId, - }) - } catch (e) { - console.error( - `Error liking tag ${assetTagId} for user ${userId}`, - e - ) - throw new Error(`Error liking tag ${assetTagId} for user ${userId}`) - } - } - - /** - * Likes a tag for a user. - * @param assetTagId - The ID of the tag to unlike. - * @param userId - The ID of the user to unlike the tag for. - */ - public async unlikeTag(assetTagId: string, userId: string): Promise { - try { - await this.drizzle - .delete(assetTagLikes) - .where( - and( - eq(assetTagLikes.assetTagId, assetTagId), - eq(assetTagLikes.likedById, userId) - ) - ) - } catch (e) { - console.error( - `Error liking tag ${assetTagId} for user ${userId}`, - e - ) - throw new Error(`Error liking tag ${assetTagId} for user ${userId}`) - } - } -} diff --git a/src/v2/lib/managers/tag/tag-manager.ts b/src/v2/lib/managers/tag/tag-manager.ts deleted file mode 100644 index 0043633..0000000 --- a/src/v2/lib/managers/tag/tag-manager.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { DrizzleInstance } from "@/v2/db/turso" -import { assetTag } from "@/v2/db/schema" -import { eq, like, or } from "drizzle-orm" -import { z } from "zod" -import type { AssetTag, NewAssetTag } from "@/v2/db/schema" - -/** - * Represents the schema for inserting a new asset tag. - */ -const insertAssetTagSchema = z.object({ - name: z.string(), - formattedName: z.string(), -}) - -/** - * Manages operations related to asset tags. - */ -export class TagManager { - constructor(private drizzle: DrizzleInstance) {} - - /** - * Retrieves an asset tag by its ID. - * @param tagId - The unique ID of the tag to retrieve. - * @returns A promise that resolves to the retrieved asset tag. - */ - public async getTagById(tagId: string): Promise { - try { - const [foundTag] = await this.drizzle - .select() - .from(assetTag) - .where(eq(assetTag.id, tagId)) - - return foundTag ?? null - } catch (e) { - throw new Error(`Error getting tag by ID ${tagId}`) - } - } - - /** - * Retrieves a list of all asset tags. - * @returns A promise that resolves to an array of asset tags. - */ - public async listTags(): Promise { - try { - const tags = await this.drizzle.select().from(assetTag) - return tags ?? null - } catch (e) { - throw new Error("Error listing tags") - } - } - - /** - * Retrieves asset tags with partial name matching. - * @param tagName - The partial name to search for within asset tags. - * @returns A promise that resolves to an array of matching asset tags. - */ - public async getTagsByPartialName( - tagName: string - ): Promise { - try { - const tags = await this.drizzle - .select() - .from(assetTag) - .where(or(like(assetTag.name, `%${tagName}%`))) - - return tags ?? null - } catch (e) { - throw new Error("Error getting tags by partial name") - } - } - - /** - * Creates a new asset tag. - * @param newTag - The new asset tag to create, adhering to the insertAssetTagSchema. - * @returns A promise that resolves to the created asset tag. - */ - public async createTag( - newTag: z.infer - ): Promise { - try { - const [createdTag] = await this.drizzle - .insert(assetTag) - .values({ - id: newTag.name, - name: newTag.name, - formattedName: newTag.name, - lastUpdated: new Date().toISOString(), - }) - .returning() - - return createdTag - } catch (e) { - throw new Error("Error creating tag") - } - } -} diff --git a/src/v2/routes/asset/delete-asset.ts b/src/v2/routes/asset/delete-asset.ts index 10a5d48..4e8ab2b 100644 --- a/src/v2/routes/asset/delete-asset.ts +++ b/src/v2/routes/asset/delete-asset.ts @@ -53,7 +53,7 @@ export const DeleteAssetByIdRoute = (handler: AppHandler) => { const [existingAsset] = await drizzle .select({ id: asset.id }) .from(asset) - .where(eq(asset.id, parseInt(assetId))) + .where(eq(asset.id, assetId)) .limit(1) if (!existingAsset) { @@ -66,7 +66,7 @@ export const DeleteAssetByIdRoute = (handler: AppHandler) => { ) } - await drizzle.delete(asset).where(eq(asset.id, parseInt(assetId))) + await drizzle.delete(asset).where(eq(asset.id, assetId)) // await ctx.env.FILES_BUCKET.delete(asset.url) return ctx.json( diff --git a/src/v2/routes/asset/get-asset-comments.ts b/src/v2/routes/asset/get-asset-comments.ts index e69de29..1672e0a 100644 --- a/src/v2/routes/asset/get-asset-comments.ts +++ b/src/v2/routes/asset/get-asset-comments.ts @@ -0,0 +1,79 @@ +import { getConnection } from "@/v2/db/turso" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" +import { AppHandler } from "../handler" + +const getAssetCommentsSchema = z.object({ + id: z.string().openapi({ + param: { + name: "id", + in: "path", + description: "The ID of the asset to retrieve.", + required: true, + }, + }), +}) + +const getAssetCommentsResponseSchema = z.object({ + success: z.literal(true), +}) + +const getAssetCommentsRoute = createRoute({ + path: "/{id}/comments", + method: "get", + description: "Get an asset's comments.", + tags: ["Asset"], + request: { + params: getAssetCommentsSchema, + }, + responses: { + 200: { + description: "Array of your asset comments.", + content: { + "application/json": { + schema: getAssetCommentsResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +export const ViewAssetCommentsRoute = (handler: AppHandler) => { + handler.openapi(getAssetCommentsRoute, async (ctx) => { + const assetId = ctx.req.valid("param").id + + const authSessionManager = new AuthSessionManager(ctx) + const { user } = await authSessionManager.validateSession() + + if (!user) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + const { drizzle } = await getConnection(ctx.env) + + const comments = await drizzle.query.assetComments.findMany({ + where: (assetComments, { eq }) => + eq(assetComments.assetId, assetId), + with: { + assetCommentsLikes: true, + }, + }) + + return ctx.json( + { + success: true, + comments, + }, + 200 + ) + }) +} diff --git a/src/v2/routes/asset/get-asset.ts b/src/v2/routes/asset/get-asset.ts index 2922ec1..152a0b4 100644 --- a/src/v2/routes/asset/get-asset.ts +++ b/src/v2/routes/asset/get-asset.ts @@ -81,7 +81,7 @@ export const GetAssetByIdRoute = (handler: AppHandler) => { const { drizzle } = await getConnection(ctx.env) const foundAsset = await drizzle.query.asset.findFirst({ - where: (asset, { eq }) => eq(asset.id, parseInt(assetId)), + where: (asset, { eq }) => eq(asset.id, assetId), with: { assetTagAsset: { with: { @@ -123,7 +123,7 @@ export const GetAssetByIdRoute = (handler: AppHandler) => { .set({ viewCount: sql`${asset.viewCount} + 1`, }) - .where(eq(asset.id, parseInt(assetId))) + .where(eq(asset.id, assetId)) return ctx.json( { diff --git a/src/v2/routes/asset/like-asset.ts b/src/v2/routes/asset/like-asset.ts index 442e134..a298c29 100644 --- a/src/v2/routes/asset/like-asset.ts +++ b/src/v2/routes/asset/like-asset.ts @@ -48,22 +48,12 @@ export const LikeAssetByIdRoute = (handler: AppHandler) => { handler.openapi(likeAssetByIdRoute, async (ctx) => { const assetId = ctx.req.valid("param").id - if (isNaN(parseInt(assetId))) { - return ctx.json( - { - success: false, - message: "Invalid asset ID", - }, - 400 - ) - } - const { drizzle } = await getConnection(ctx.env) const [existingAsset] = await drizzle .select() .from(asset) - .where(eq(asset.id, parseInt(assetId))) + .where(eq(asset.id, assetId)) .limit(1) if (!existingAsset) { @@ -94,7 +84,7 @@ export const LikeAssetByIdRoute = (handler: AppHandler) => { .from(assetLikes) .where( and( - eq(assetLikes.assetId, parseInt(assetId)), + eq(assetLikes.assetId, assetId), eq(assetLikes.likedById, user.id) ) ) @@ -111,7 +101,7 @@ export const LikeAssetByIdRoute = (handler: AppHandler) => { } await drizzle.insert(assetLikes).values({ - assetId: parseInt(assetId), + assetId: assetId, likedById: user.id, }) diff --git a/src/v2/routes/asset/modify-asset.ts b/src/v2/routes/asset/modify-asset.ts index 2d575cc..50ce6e4 100644 --- a/src/v2/routes/asset/modify-asset.ts +++ b/src/v2/routes/asset/modify-asset.ts @@ -87,17 +87,7 @@ const modifyAssetRoute = createRoute({ export const ModifyAssetRoute = (handler: AppHandler) => { handler.openapi(modifyAssetRoute, async (ctx) => { const { name, tags, assetCategoryId, gameId } = ctx.req.valid("json") - const { id } = ctx.req.valid("param") - - if (isNaN(parseInt(id))) { - return ctx.json( - { - success: false, - message: "Invalid asset ID", - }, - 400 - ) - } + const assetId = ctx.req.valid("param").id const authSessionManager = new AuthSessionManager(ctx) @@ -120,7 +110,7 @@ export const ModifyAssetRoute = (handler: AppHandler) => { uploadedById: asset.uploadedById, }) .from(asset) - .where(eq(asset.id, parseInt(id))) + .where(eq(asset.id, assetId)) if (assetUser.uploadedById !== user.id || user.role != "creator") { return ctx.json( @@ -139,7 +129,7 @@ export const ModifyAssetRoute = (handler: AppHandler) => { assetCategoryId, gameId, }) - .where(eq(asset.id, parseInt(id))) + .where(eq(asset.id, assetId)) .returning() const newTags = SplitQueryByCommas(tags) ?? [] @@ -150,7 +140,7 @@ export const ModifyAssetRoute = (handler: AppHandler) => { }) .from(assetTagAsset) .innerJoin(assetTag, eq(assetTag.id, assetTagAsset.assetTagId)) - .where(eq(assetTagAsset.assetId, parseInt(id))) + .where(eq(assetTagAsset.assetId, assetId)) const oldTagIds = oldTags.map((t) => t.assetTagId) const tagsToRemove = oldTagIds.filter((t) => !newTags.includes(t)) @@ -162,14 +152,14 @@ export const ModifyAssetRoute = (handler: AppHandler) => { .delete(assetTagAsset) .where( and( - eq(assetTagAsset.assetId, parseInt(id)), + eq(assetTagAsset.assetId, assetId), eq(assetTagAsset.assetTagId, tagId) ) ) ), ...tagsToAdd.map((tag) => drizzle.insert(assetTagAsset).values({ - assetId: parseInt(id), + assetId: assetId, assetTagId: tag, }) ), diff --git a/src/v2/routes/asset/unlike-asset.ts b/src/v2/routes/asset/unlike-asset.ts index 7ce2300..6039623 100644 --- a/src/v2/routes/asset/unlike-asset.ts +++ b/src/v2/routes/asset/unlike-asset.ts @@ -48,22 +48,12 @@ export const UnlikeAssetByIdRoute = (handler: AppHandler) => { handler.openapi(unlikeAssetByIdRoute, async (ctx) => { const assetId = ctx.req.valid("param").id - if (isNaN(parseInt(assetId))) { - return ctx.json( - { - success: false, - message: "Invalid asset ID", - }, - 400 - ) - } - const { drizzle } = await getConnection(ctx.env) const [existingAsset] = await drizzle .select() .from(asset) - .where(eq(asset.id, parseInt(assetId))) + .where(eq(asset.id, assetId)) .limit(1) if (!existingAsset) { @@ -94,7 +84,7 @@ export const UnlikeAssetByIdRoute = (handler: AppHandler) => { .from(assetLikes) .where( and( - eq(assetLikes.assetId, parseInt(assetId)), + eq(assetLikes.assetId, assetId), eq(assetLikes.likedById, user.id) ) ) @@ -114,7 +104,7 @@ export const UnlikeAssetByIdRoute = (handler: AppHandler) => { .delete(assetLikes) .where( and( - eq(assetLikes.assetId, parseInt(assetId)), + eq(assetLikes.assetId, assetId), eq(assetLikes.likedById, user.id) ) ) From 6a1568c745a1261ce8ed44e7128404dca1466c38 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 17 Mar 2024 05:41:07 +0000 Subject: [PATCH 276/318] update user routes --- src/v2/db/schema/asset/asset-comments.ts | 1 - src/v2/db/schema/asset/asset-likes.ts | 1 - src/v2/db/schema/tags/asset-tags.ts | 1 - src/v2/routes/user/follow-user.ts | 194 +++++++++++----------- src/v2/routes/user/get-user.ts | 62 ++++--- src/v2/routes/user/handler.ts | 26 +-- src/v2/routes/user/search-users.ts | 56 ++++--- src/v2/routes/user/unfollow-user.ts | 196 +++++++++++------------ src/v2/routes/user/user-followers.ts | 64 ++++---- src/v2/routes/user/user-following.ts | 63 ++++---- 10 files changed, 325 insertions(+), 339 deletions(-) diff --git a/src/v2/db/schema/asset/asset-comments.ts b/src/v2/db/schema/asset/asset-comments.ts index 1438bd7..5ba7bd9 100644 --- a/src/v2/db/schema/asset/asset-comments.ts +++ b/src/v2/db/schema/asset/asset-comments.ts @@ -5,7 +5,6 @@ import { text, // uniqueIndex, index, - integer, foreignKey, } from "drizzle-orm/sqlite-core" import { authUser } from "../user/user" diff --git a/src/v2/db/schema/asset/asset-likes.ts b/src/v2/db/schema/asset/asset-likes.ts index 2abf342..e827a81 100644 --- a/src/v2/db/schema/asset/asset-likes.ts +++ b/src/v2/db/schema/asset/asset-likes.ts @@ -5,7 +5,6 @@ import { text, // uniqueIndex, index, - integer, } from "drizzle-orm/sqlite-core" import { authUser } from "../user/user" import { asset } from "./asset" diff --git a/src/v2/db/schema/tags/asset-tags.ts b/src/v2/db/schema/tags/asset-tags.ts index 12b4d9a..988de3d 100644 --- a/src/v2/db/schema/tags/asset-tags.ts +++ b/src/v2/db/schema/tags/asset-tags.ts @@ -3,7 +3,6 @@ import { relations } from "drizzle-orm" import { sqliteTable, text, - integer, // uniqueIndex, index, } from "drizzle-orm/sqlite-core" diff --git a/src/v2/routes/user/follow-user.ts b/src/v2/routes/user/follow-user.ts index 242b5be..cf3925d 100644 --- a/src/v2/routes/user/follow-user.ts +++ b/src/v2/routes/user/follow-user.ts @@ -1,4 +1,4 @@ -import { OpenAPIHono } from "@hono/zod-openapi" +import { AppHandler } from "../handler" import { getConnection } from "@/v2/db/turso" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" import { and, eq, or } from "drizzle-orm" @@ -23,7 +23,7 @@ const followUserByIdResponseSchema = z.object({ }) export const followUserByIdRoute = createRoute({ - path: "/{id}", + path: "/{id}/follow", method: "post", description: "Follow a user from their ID.", tags: ["User"], @@ -43,113 +43,111 @@ export const followUserByIdRoute = createRoute({ }, }) -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() +export const FollowUserRoute = (handler: AppHandler) => { + handler.openapi(followUserByIdRoute, async (ctx) => { + const userId = ctx.req.valid("param").id -handler.openapi(followUserByIdRoute, async (ctx) => { - const userId = ctx.req.valid("param").id + const { drizzle } = await getConnection(ctx.env) - const { drizzle } = await getConnection(ctx.env) + const authSessionManager = new AuthSessionManager(ctx) + const { user } = await authSessionManager.validateSession() - const authSessionManager = new AuthSessionManager(ctx) - const { user } = await authSessionManager.validateSession() - - if (!user) { - return ctx.json( - { - success: false, - message: "Unauthorized", - }, - 401 - ) - } - - if (userId == user.id) { - return ctx.json( - { - success: false, - message: "You cannot follow yourself", - }, - 400 - ) - } - const [followStatus] = await drizzle - .select({ id: userFollowing.followerId }) - .from(userFollowing) - .where( - and( - eq(userFollowing.followerId, user.id), - eq(userFollowing.followingId, userId) + if (!user) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 ) - ) - .limit(1) + } - if (followStatus) { - return ctx.json( - { - success: false, - message: "You are already following this user", - }, - 400 - ) - } - - const [blockedStatus] = await drizzle - .select({ - id: userBlocked.blockedId, - blockById: userBlocked.blockedById, - }) - .from(userBlocked) - .where( - or( - and( - eq(userBlocked.blockedId, user.id), - eq(userBlocked.blockedById, userId) - ), + if (userId == user.id) { + return ctx.json( + { + success: false, + message: "You cannot follow yourself", + }, + 400 + ) + } + const [followStatus] = await drizzle + .select({ id: userFollowing.followerId }) + .from(userFollowing) + .where( and( - eq(userBlocked.blockedId, userId), - eq(userBlocked.blockedById, user.id) + eq(userFollowing.followerId, user.id), + eq(userFollowing.followingId, userId) ) ) - ) - .limit(1) - - if (blockedStatus) { - const message = - blockedStatus.blockById === user.id - ? "You are blocked by this user" - : "You have blocked this user" + .limit(1) - return ctx.json( - { - success: false, - message, - }, - 400 - ) - } + if (followStatus) { + return ctx.json( + { + success: false, + message: "You are already following this user", + }, + 400 + ) + } + + const [blockedStatus] = await drizzle + .select({ + id: userBlocked.blockedId, + blockById: userBlocked.blockedById, + }) + .from(userBlocked) + .where( + or( + and( + eq(userBlocked.blockedId, user.id), + eq(userBlocked.blockedById, userId) + ), + and( + eq(userBlocked.blockedId, userId), + eq(userBlocked.blockedById, user.id) + ) + ) + ) + .limit(1) + + if (blockedStatus) { + const message = + blockedStatus.blockById === user.id + ? "You are blocked by this user" + : "You have blocked this user" + + return ctx.json( + { + success: false, + message, + }, + 400 + ) + } + + try { + await drizzle.insert(userFollowing).values({ + followerId: user.id, + followingId: userId, + createdAt: new Date().toISOString(), + }) + } catch (e) { + return ctx.json( + { + success: false, + message: "Failed to follow user.", + }, + 500 + ) + } - try { - await drizzle.insert(userFollowing).values({ - followerId: user.id, - followingId: userId, - createdAt: new Date().toISOString(), - }) - } catch (e) { return ctx.json( { - success: false, - message: "Failed to follow user.", + success: true, }, - 500 + 200 ) - } - - return ctx.json( - { - success: true, - }, - 200 - ) -}) - -export default handler + }) +} diff --git a/src/v2/routes/user/get-user.ts b/src/v2/routes/user/get-user.ts index 62d624c..4c22f66 100644 --- a/src/v2/routes/user/get-user.ts +++ b/src/v2/routes/user/get-user.ts @@ -1,4 +1,4 @@ -import { OpenAPIHono } from "@hono/zod-openapi" +import { AppHandler } from "../handler" import { getConnection } from "@/v2/db/turso" import { eq } from "drizzle-orm" import { authUser } from "@/v2/db/schema" @@ -56,37 +56,35 @@ const getUserByIdRoute = createRoute({ }, }) -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() +export const GetUserByIdRoute = (handler: AppHandler) => { + handler.openapi(getUserByIdRoute, async (ctx) => { + const userId = ctx.req.valid("param").id -handler.openapi(getUserByIdRoute, async (ctx) => { - const userId = ctx.req.valid("param").id + const { drizzle } = await getConnection(ctx.env) - const { drizzle } = await getConnection(ctx.env) + const [user] = await drizzle + .select({ + id: authUser.id, + avatarUrl: authUser.avatarUrl, + displayName: authUser.displayName, + username: authUser.username, + usernameColour: authUser.usernameColour, + pronouns: authUser.pronouns, + verified: authUser.verified, + bio: authUser.bio, + dateJoined: authUser.dateJoined, + plan: authUser.plan, + role: authUser.role, + }) + .from(authUser) + .where(eq(authUser.id, userId)) - const [user] = await drizzle - .select({ - id: authUser.id, - avatarUrl: authUser.avatarUrl, - displayName: authUser.displayName, - username: authUser.username, - usernameColour: authUser.usernameColour, - pronouns: authUser.pronouns, - verified: authUser.verified, - bio: authUser.bio, - dateJoined: authUser.dateJoined, - plan: authUser.plan, - role: authUser.role, - }) - .from(authUser) - .where(eq(authUser.id, userId)) - - return ctx.json( - { - success: true, - user, - }, - 200 - ) -}) - -export default handler + return ctx.json( + { + success: true, + user, + }, + 200 + ) + }) +} diff --git a/src/v2/routes/user/handler.ts b/src/v2/routes/user/handler.ts index b3119bf..559f43a 100644 --- a/src/v2/routes/user/handler.ts +++ b/src/v2/routes/user/handler.ts @@ -1,21 +1,23 @@ import { OpenAPIHono } from "@hono/zod-openapi" -import GetUserRoute from "./get-user" -import SearchUserRoute from "./search-users" +import { GetUserByIdRoute } from "./get-user" +import { SearchUsersByUsernameRoute } from "./search-users" -import FollowUserRoute from "./follow-user" -import UnfollowUserRoute from "./unfollow-user" +import { ViewUsersFollowersRoute } from "./user-followers" +import { ViewUsersFollowingRoute } from "./user-following" -import UserFollowingRoute from "./user-following" -import UserFollowersRoute from "./user-followers" +import { FollowUserRoute } from "./follow-user" +import { UnfollowUserRoute } from "./unfollow-user" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() -handler.route("/get", GetUserRoute) -handler.route("/search", SearchUserRoute) -handler.route("/follow", FollowUserRoute) -handler.route("/unfollow", UnfollowUserRoute) -handler.route("/following", UserFollowingRoute) -handler.route("/followers", UserFollowersRoute) +GetUserByIdRoute(handler) +SearchUsersByUsernameRoute(handler) + +ViewUsersFollowersRoute(handler) +ViewUsersFollowingRoute(handler) + +FollowUserRoute(handler) +UnfollowUserRoute(handler) export default handler diff --git a/src/v2/routes/user/search-users.ts b/src/v2/routes/user/search-users.ts index 171e9c0..8a120a6 100644 --- a/src/v2/routes/user/search-users.ts +++ b/src/v2/routes/user/search-users.ts @@ -1,4 +1,4 @@ -import { OpenAPIHono } from "@hono/zod-openapi" +import { AppHandler } from "../handler" import { authUser } from "@/v2/db/schema" import { or, like } from "drizzle-orm" import { getConnection } from "@/v2/db/turso" @@ -38,7 +38,7 @@ const searchUsersByUsernameSchema = z.object({ }) const searchUsersByUsernameRoute = createRoute({ - path: "/{username}", + path: "/search/{username}", method: "get", description: "Search for users by their username.", tags: ["User"], @@ -58,35 +58,33 @@ const searchUsersByUsernameRoute = createRoute({ }, }) -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() +export const SearchUsersByUsernameRoute = (handler: AppHandler) => { + handler.openapi(searchUsersByUsernameRoute, async (ctx) => { + const userQuery = ctx.req.valid("param").username -handler.openapi(searchUsersByUsernameRoute, async (ctx) => { - const userQuery = ctx.req.valid("param").username + const { drizzle } = await getConnection(ctx.env) - const { drizzle } = await getConnection(ctx.env) + const users = await drizzle + .select({ + id: authUser.id, + avatarUrl: authUser.avatarUrl, + displayName: authUser.displayName, + username: authUser.username, + usernameColour: authUser.usernameColour, + pronouns: authUser.pronouns, + verified: authUser.verified, + bio: authUser.bio, + dateJoined: authUser.dateJoined, + plan: authUser.plan, + role: authUser.role, + }) + .from(authUser) + .where(or(like(authUser.username, `%${userQuery}%`))) + .limit(25) - const users = await drizzle - .select({ - id: authUser.id, - avatarUrl: authUser.avatarUrl, - displayName: authUser.displayName, - username: authUser.username, - usernameColour: authUser.usernameColour, - pronouns: authUser.pronouns, - verified: authUser.verified, - bio: authUser.bio, - dateJoined: authUser.dateJoined, - plan: authUser.plan, - role: authUser.role, + return ctx.json({ + success: true, + users, }) - .from(authUser) - .where(or(like(authUser.username, `%${userQuery}%`))) - .limit(25) - - return ctx.json({ - success: true, - users, }) -}) - -export default handler +} diff --git a/src/v2/routes/user/unfollow-user.ts b/src/v2/routes/user/unfollow-user.ts index 054c612..5fe1e5c 100644 --- a/src/v2/routes/user/unfollow-user.ts +++ b/src/v2/routes/user/unfollow-user.ts @@ -1,4 +1,4 @@ -import { OpenAPIHono } from "@hono/zod-openapi" +import { AppHandler } from "../handler" import { getConnection } from "@/v2/db/turso" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" import { userFollowing, userBlocked } from "@/v2/db/schema" @@ -23,7 +23,7 @@ const unfollowUserByIdResponseSchema = z.object({ }) const unFollowUserByIdRoute = createRoute({ - path: "/{id}", + path: "/{id}/unfollow", method: "post", description: "Follow a user from their ID.", tags: ["User"], @@ -43,117 +43,115 @@ const unFollowUserByIdRoute = createRoute({ }, }) -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() +export const UnfollowUserRoute = (handler: AppHandler) => { + handler.openapi(unFollowUserByIdRoute, async (ctx) => { + const userId = ctx.req.valid("param").id -handler.openapi(unFollowUserByIdRoute, async (ctx) => { - const userId = ctx.req.valid("param").id + const { drizzle } = await getConnection(ctx.env) - const { drizzle } = await getConnection(ctx.env) + const authSessionManager = new AuthSessionManager(ctx) + const { user } = await authSessionManager.validateSession() - const authSessionManager = new AuthSessionManager(ctx) - const { user } = await authSessionManager.validateSession() - - if (!user) { - return ctx.json( - { - success: false, - message: "Unauthorized", - }, - 401 - ) - } - - if (userId == user.id) { - return ctx.json( - { - success: false, - message: "You cannot unfollow yourself", - }, - 400 - ) - } - - const [followStatus] = await drizzle - .select({ id: userFollowing.followerId }) - .from(userFollowing) - .where( - and( - eq(userFollowing.followerId, user.id), - eq(userFollowing.followingId, userId) + if (!user) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 ) - ) - .limit(1) - - if (!followStatus) { - return ctx.json( - { - success: false, - message: "You are not following this user", - }, - 400 - ) - } + } - const [blockedStatus] = await drizzle - .select({ - id: userBlocked.blockedId, - blockById: userBlocked.blockedById, - }) - .from(userBlocked) - .where( - or( - and( - eq(userBlocked.blockedId, user.id), - eq(userBlocked.blockedById, userId) - ), - and( - eq(userBlocked.blockedId, userId), - eq(userBlocked.blockedById, user.id) - ) + if (userId == user.id) { + return ctx.json( + { + success: false, + message: "You cannot unfollow yourself", + }, + 400 ) - ) - .limit(1) + } - if (blockedStatus) { - const message = - blockedStatus.blockById === user.id - ? "You are blocked by this user" - : "You have blocked this user" - - return ctx.json( - { - success: false, - message, - }, - 400 - ) - } - - try { - await drizzle - .delete(userFollowing) + const [followStatus] = await drizzle + .select({ id: userFollowing.followerId }) + .from(userFollowing) .where( and( eq(userFollowing.followerId, user.id), eq(userFollowing.followingId, userId) ) ) - } catch (e) { + .limit(1) + + if (!followStatus) { + return ctx.json( + { + success: false, + message: "You are not following this user", + }, + 400 + ) + } + + const [blockedStatus] = await drizzle + .select({ + id: userBlocked.blockedId, + blockById: userBlocked.blockedById, + }) + .from(userBlocked) + .where( + or( + and( + eq(userBlocked.blockedId, user.id), + eq(userBlocked.blockedById, userId) + ), + and( + eq(userBlocked.blockedId, userId), + eq(userBlocked.blockedById, user.id) + ) + ) + ) + .limit(1) + + if (blockedStatus) { + const message = + blockedStatus.blockById === user.id + ? "You are blocked by this user" + : "You have blocked this user" + + return ctx.json( + { + success: false, + message, + }, + 400 + ) + } + + try { + await drizzle + .delete(userFollowing) + .where( + and( + eq(userFollowing.followerId, user.id), + eq(userFollowing.followingId, userId) + ) + ) + } catch (e) { + return ctx.json( + { + success: false, + message: "Failed to unfollow user, does the user exist?", + }, + 500 + ) + } + return ctx.json( { - success: false, - message: "Failed to unfollow user, does the user exist?", + success: true, }, - 500 + 200 ) - } - - return ctx.json( - { - success: true, - }, - 200 - ) -}) - -export default handler + }) +} diff --git a/src/v2/routes/user/user-followers.ts b/src/v2/routes/user/user-followers.ts index 140c027..84f4c8c 100644 --- a/src/v2/routes/user/user-followers.ts +++ b/src/v2/routes/user/user-followers.ts @@ -1,4 +1,4 @@ -import { OpenAPIHono } from "@hono/zod-openapi" +import { AppHandler } from "../handler" import { getConnection } from "@/v2/db/turso" import { createRoute } from "@hono/zod-openapi" import { GenericResponses } from "@/v2/lib/response-schemas" @@ -47,7 +47,7 @@ export const viewUserFollowsbyIdResponseSchema = z.object({ }) const viewUserFollowsByIdRoute = createRoute({ - path: "/{id}", + path: "/{id}/followers", method: "get", description: "View a user's followers from their ID.", tags: ["User"], @@ -69,39 +69,37 @@ const viewUserFollowsByIdRoute = createRoute({ }, }) -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() +export const ViewUsersFollowersRoute = (handler: AppHandler) => { + handler.openapi(viewUserFollowsByIdRoute, async (ctx) => { + const { id } = ctx.req.valid("param") + const { offset } = ctx.req.valid("query") -handler.openapi(viewUserFollowsByIdRoute, async (ctx) => { - const { id } = ctx.req.valid("param") - const { offset } = ctx.req.valid("query") + const { drizzle } = await getConnection(ctx.env) - const { drizzle } = await getConnection(ctx.env) - - const followers = await drizzle.query.userFollowing.findMany({ - where: (userFollowing, { eq }) => eq(userFollowing.followingId, id), - with: { - follower: { - columns: { - id: true, - avatarUrl: true, - username: true, - plan: true, - verified: true, - displayName: true, + const followers = await drizzle.query.userFollowing.findMany({ + where: (userFollowing, { eq }) => eq(userFollowing.followingId, id), + with: { + follower: { + columns: { + id: true, + avatarUrl: true, + username: true, + plan: true, + verified: true, + displayName: true, + }, }, }, - }, - limit: 100, - offset: offset ? parseInt(offset) : 0, - }) - - return ctx.json( - { - success: true, - followers, - }, - 200 - ) -}) + limit: 100, + offset: offset ? parseInt(offset) : 0, + }) -export default handler + return ctx.json( + { + success: true, + followers, + }, + 200 + ) + }) +} diff --git a/src/v2/routes/user/user-following.ts b/src/v2/routes/user/user-following.ts index 0021c12..c5b227d 100644 --- a/src/v2/routes/user/user-following.ts +++ b/src/v2/routes/user/user-following.ts @@ -1,4 +1,4 @@ -import { OpenAPIHono } from "@hono/zod-openapi" +import { AppHandler } from "../handler" import { getConnection } from "@/v2/db/turso" import { createRoute } from "@hono/zod-openapi" import { GenericResponses } from "@/v2/lib/response-schemas" @@ -47,7 +47,7 @@ const viewUserfollowingbyIdResponseSchema = z.object({ }) const viewUserfollowingbyIdRoute = createRoute({ - path: "/{id}", + path: "/{id}/following", method: "get", description: "View who a user's following from their ID.", tags: ["User"], @@ -69,39 +69,36 @@ const viewUserfollowingbyIdRoute = createRoute({ }, }) -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() +export const ViewUsersFollowingRoute = (handler: AppHandler) => + handler.openapi(viewUserfollowingbyIdRoute, async (ctx) => { + const { id } = ctx.req.valid("param") + const { offset } = ctx.req.valid("query") -handler.openapi(viewUserfollowingbyIdRoute, async (ctx) => { - const { id } = ctx.req.valid("param") - const { offset } = ctx.req.valid("query") + const { drizzle } = await getConnection(ctx.env) - const { drizzle } = await getConnection(ctx.env) - - const following = await drizzle.query.userFollowing.findMany({ - where: (userFollowing, { eq }) => eq(userFollowing.followerId, id), - with: { - following: { - columns: { - id: true, - avatarUrl: true, - username: true, - plan: true, - verified: true, - displayName: true, + const following = await drizzle.query.userFollowing.findMany({ + where: (userFollowing, { eq }) => eq(userFollowing.followerId, id), + with: { + following: { + columns: { + id: true, + avatarUrl: true, + username: true, + plan: true, + verified: true, + displayName: true, + }, }, }, - }, - limit: 100, - offset: offset ? parseInt(offset) : 0, - }) - - return ctx.json( - { - success: true, - following, - }, - 200 - ) -}) + limit: 100, + offset: offset ? parseInt(offset) : 0, + }) -export default handler + return ctx.json( + { + success: true, + following, + }, + 200 + ) + }) From 5a1b050a8f9cfbdb6f0cdd5657ffae7eab3e715f Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 17 Mar 2024 05:53:04 +0000 Subject: [PATCH 277/318] update auth routes --- src/v2/routes/auth/account-create.ts | 119 ++++++++++++++++++ src/v2/routes/auth/account-login.ts | 100 +++++++++++++++ src/v2/routes/auth/create/openapi.ts | 30 ----- src/v2/routes/auth/create/route.ts | 69 ---------- src/v2/routes/auth/create/schema.ts | 24 ---- src/v2/routes/auth/get-all-sessions.ts | 68 ++++++++++ src/v2/routes/auth/handler.ts | 17 ++- src/v2/routes/auth/invalidate-session.ts | 0 src/v2/routes/auth/login/openapi.ts | 31 ----- src/v2/routes/auth/login/route.ts | 54 -------- src/v2/routes/auth/login/schema.ts | 20 --- src/v2/routes/auth/logout-current-session.ts | 57 +++++++++ src/v2/routes/auth/session/all/openapi.ts | 21 ---- src/v2/routes/auth/session/all/route.ts | 39 ------ src/v2/routes/auth/session/all/schema.ts | 12 -- src/v2/routes/auth/session/handler.ts | 12 -- src/v2/routes/auth/session/logout/openapi.ts | 21 ---- src/v2/routes/auth/session/logout/route.ts | 35 ------ src/v2/routes/auth/session/logout/schema.ts | 5 - .../routes/auth/session/validate/openapi.ts | 21 ---- src/v2/routes/auth/session/validate/route.ts | 31 ----- src/v2/routes/auth/session/validate/schema.ts | 7 -- .../routes/auth/validate-current-session.ts | 55 ++++++++ 23 files changed, 410 insertions(+), 438 deletions(-) create mode 100644 src/v2/routes/auth/account-create.ts create mode 100644 src/v2/routes/auth/account-login.ts delete mode 100644 src/v2/routes/auth/create/openapi.ts delete mode 100644 src/v2/routes/auth/create/route.ts delete mode 100644 src/v2/routes/auth/create/schema.ts create mode 100644 src/v2/routes/auth/get-all-sessions.ts create mode 100644 src/v2/routes/auth/invalidate-session.ts delete mode 100644 src/v2/routes/auth/login/openapi.ts delete mode 100644 src/v2/routes/auth/login/route.ts delete mode 100644 src/v2/routes/auth/login/schema.ts create mode 100644 src/v2/routes/auth/logout-current-session.ts delete mode 100644 src/v2/routes/auth/session/all/openapi.ts delete mode 100644 src/v2/routes/auth/session/all/route.ts delete mode 100644 src/v2/routes/auth/session/all/schema.ts delete mode 100644 src/v2/routes/auth/session/handler.ts delete mode 100644 src/v2/routes/auth/session/logout/openapi.ts delete mode 100644 src/v2/routes/auth/session/logout/route.ts delete mode 100644 src/v2/routes/auth/session/logout/schema.ts delete mode 100644 src/v2/routes/auth/session/validate/openapi.ts delete mode 100644 src/v2/routes/auth/session/validate/route.ts delete mode 100644 src/v2/routes/auth/session/validate/schema.ts create mode 100644 src/v2/routes/auth/validate-current-session.ts diff --git a/src/v2/routes/auth/account-create.ts b/src/v2/routes/auth/account-create.ts new file mode 100644 index 0000000..f53226f --- /dev/null +++ b/src/v2/routes/auth/account-create.ts @@ -0,0 +1,119 @@ +import { AppHandler } from "../handler" +import { UserAuthenticationManager } from "@/v2/lib/managers/auth/user-auth-manager" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" + +const createAccountSchema = z.object({ + username: z.string().min(3).max(32).openapi({ + description: "The username of the user.", + example: "user", + }), + email: z.string().min(3).max(32).openapi({ + description: "The email of the user.", + example: "user@domain.com", + }), + password: z.string().min(8).max(64).openapi({ + description: "The password of the user.", + example: "password1234", + }), + passwordConfirmation: z.string().min(8).max(64).openapi({ + description: "The password confirmation of the user.", + example: "password1234", + }), +}) + +const createAccountResponseSchema = z.object({ + success: z.literal(true), +}) + +const userCreateAccountRoute = createRoute({ + path: "/create", + method: "post", + description: "Create a new user account with an email and password.", + tags: ["Auth"], + request: { + body: { + content: { + "application/json": { + schema: createAccountSchema, + }, + }, + }, + }, + responses: { + 200: { + description: "Returns true.", + content: { + "application/json": { + schema: createAccountResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +export const UserCreateAccountRoute = (handler: AppHandler) => { + handler.openapi(userCreateAccountRoute, async (ctx) => { + const authSessionManager = new AuthSessionManager(ctx) + + const { user } = await authSessionManager.validateSession() + + if (user) { + return ctx.json( + { + success: false, + message: "Already logged in", + }, + 401 + ) + } + + const { email, password, username } = ctx.req.valid("json") + + const userAuthManager = new UserAuthenticationManager(ctx) + + const existingUser = false + + if (existingUser) { + return ctx.json( + { + success: false, + message: "User already exists with that email", + }, + 400 + ) + } + + const newLoginCookie = await userAuthManager.createAccount( + { + email, + username, + }, + password + ) + + if (!newLoginCookie) { + return ctx.json( + { + success: false, + message: "Failed to create account", + }, + 500 + ) + } + + ctx.header("Set-Cookie", newLoginCookie.serialize(), { + append: true, + }) + + return ctx.json( + { + success: true, + }, + 200 + ) + }) +} diff --git a/src/v2/routes/auth/account-login.ts b/src/v2/routes/auth/account-login.ts new file mode 100644 index 0000000..13ea9e0 --- /dev/null +++ b/src/v2/routes/auth/account-login.ts @@ -0,0 +1,100 @@ +import { AppHandler } from "../handler" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +import { UserAuthenticationManager } from "@/v2/lib/managers/auth/user-auth-manager" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" + +const loginSchema = z.object({ + email: z.string().min(3).max(32).openapi({ + description: "The email of the user.", + example: "user@domain.com", + }), + password: z.string().min(8).max(64).openapi({ + description: "The password of the user.", + example: "password1234", + }), + passwordConfirmation: z.string().min(8).max(64).openapi({ + description: "The password confirmation of the user.", + example: "password1234", + }), +}) + +const loginResponseSchema = z.object({ + success: z.literal(true), +}) + +export const userLoginRoute = createRoute({ + path: "/login", + method: "post", + description: "Login to a user with an email and password.", + tags: ["Auth"], + request: { + body: { + content: { + "application/json": { + schema: loginSchema, + }, + }, + }, + }, + responses: { + 200: { + description: "Returns true.", + content: { + "application/json": { + schema: loginResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +export const UserLoginRoute = (handler: AppHandler) => { + handler.openapi(userLoginRoute, async (ctx) => { + const authSessionManager = new AuthSessionManager(ctx) + + const { user } = await authSessionManager.validateSession() + + if (user) { + return ctx.json( + { + success: false, + message: "Already logged in", + }, + 401 + ) + } + + const { email, password } = ctx.req.valid("json") + + const userAuthManager = new UserAuthenticationManager(ctx) + + const newLoginCookie = await userAuthManager.loginViaPassword( + email, + password + ) + + if (!newLoginCookie) { + return ctx.json( + { + success: false, + message: "Invalid credentials", + }, + 401 + ) + } + + ctx.header("Set-Cookie", newLoginCookie.serialize(), { + append: true, + }) + + return ctx.json( + { + success: true, + }, + 200 + ) + }) +} diff --git a/src/v2/routes/auth/create/openapi.ts b/src/v2/routes/auth/create/openapi.ts deleted file mode 100644 index 14e4652..0000000 --- a/src/v2/routes/auth/create/openapi.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { createRoute } from "@hono/zod-openapi" -import { createAccountSchema, createAccountResponseSchema } from "./schema" -import { GenericResponses } from "@/v2/lib/response-schemas" - -export const userCreateAccountRoute = createRoute({ - path: "/", - method: "post", - description: "Create a new user account with an email and password.", - tags: ["Auth"], - request: { - body: { - content: { - "application/json": { - schema: createAccountSchema, - }, - }, - }, - }, - responses: { - 200: { - description: "Returns true.", - content: { - "application/json": { - schema: createAccountResponseSchema, - }, - }, - }, - ...GenericResponses, - }, -}) diff --git a/src/v2/routes/auth/create/route.ts b/src/v2/routes/auth/create/route.ts deleted file mode 100644 index dfdaef3..0000000 --- a/src/v2/routes/auth/create/route.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { OpenAPIHono } from "@hono/zod-openapi" -import { userCreateAccountRoute } from "./openapi" -import { UserAuthenticationManager } from "@/v2/lib/managers/auth/user-auth-manager" -import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" - -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() - -handler.openapi(userCreateAccountRoute, async (ctx) => { - const authSessionManager = new AuthSessionManager(ctx) - - const { user } = await authSessionManager.validateSession() - - if (user) { - return ctx.json( - { - success: false, - message: "Already logged in", - }, - 401 - ) - } - - const { email, password, username } = ctx.req.valid("json") - - const userAuthManager = new UserAuthenticationManager(ctx) - - const existingUser = false - - if (existingUser) { - return ctx.json( - { - success: false, - message: "User already exists with that email", - }, - 400 - ) - } - - const newLoginCookie = await userAuthManager.createAccount( - { - email, - username, - }, - password - ) - - if (!newLoginCookie) { - return ctx.json( - { - success: false, - message: "Failed to create account", - }, - 500 - ) - } - - ctx.header("Set-Cookie", newLoginCookie.serialize(), { - append: true, - }) - - return ctx.json( - { - success: true, - }, - 200 - ) -}) - -export default handler diff --git a/src/v2/routes/auth/create/schema.ts b/src/v2/routes/auth/create/schema.ts deleted file mode 100644 index 1fda7c1..0000000 --- a/src/v2/routes/auth/create/schema.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { z } from "@hono/zod-openapi" - -export const createAccountSchema = z.object({ - username: z.string().min(3).max(32).openapi({ - description: "The username of the user.", - example: "user", - }), - email: z.string().min(3).max(32).openapi({ - description: "The email of the user.", - example: "user@domain.com", - }), - password: z.string().min(8).max(64).openapi({ - description: "The password of the user.", - example: "password1234", - }), - passwordConfirmation: z.string().min(8).max(64).openapi({ - description: "The password confirmation of the user.", - example: "password1234", - }), -}) - -export const createAccountResponseSchema = z.object({ - success: z.literal(true), -}) diff --git a/src/v2/routes/auth/get-all-sessions.ts b/src/v2/routes/auth/get-all-sessions.ts new file mode 100644 index 0000000..e39dadb --- /dev/null +++ b/src/v2/routes/auth/get-all-sessions.ts @@ -0,0 +1,68 @@ +import { AppHandler } from "../handler" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { selectSessionSchema } from "@/v2/db/schema" +import { z } from "@hono/zod-openapi" + +const sessionListSchema = z.object({ + success: z.literal(true), + currentSessions: selectSessionSchema + .pick({ + id: true, + expiresAt: true, + }) + .array(), +}) + +const authAllCurrentSessions = createRoute({ + path: "/sessions", + method: "get", + description: "Get all current sessions.", + tags: ["Auth"], + responses: { + 200: { + description: "All current sessions are returned", + content: { + "application/json": { + schema: sessionListSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +export const UserAllCurrentSessionsRoute = (handler: AppHandler) => { + handler.openapi(authAllCurrentSessions, async (ctx) => { + const authSessionManager = new AuthSessionManager(ctx) + + const { user } = await authSessionManager.validateSession() + + if (!user) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + const sessions = await authSessionManager.getAllSessions() + + return ctx.json( + { + success: true, + currentSessions: sessions.map((session) => { + return { + id: session.id, + expiresAt: session.expiresAt.toISOString(), + userAgent: session.userAgent, + } + }), + }, + 200 + ) + }) +} diff --git a/src/v2/routes/auth/handler.ts b/src/v2/routes/auth/handler.ts index 76019cb..56d1776 100644 --- a/src/v2/routes/auth/handler.ts +++ b/src/v2/routes/auth/handler.ts @@ -1,12 +1,17 @@ import { OpenAPIHono } from "@hono/zod-openapi" -import SessionHandler from "@/v2/routes/auth/session/handler" -import LoginRoute from "@/v2/routes/auth/login/route" -import CreateAccountRoute from "@/v2/routes/auth/create/route" +import { UserCreateAccountRoute } from "./account-create" +import { UserLoginRoute } from "./account-login" +import { UserAllCurrentSessionsRoute } from "./get-all-sessions" +import { LogoutCurrentSessionRoute } from "./logout-current-session" +import { ValidateSessionRoute } from "./validate-current-session" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() -handler.route("/session", SessionHandler) -handler.route("/login", LoginRoute) -handler.route("/create", CreateAccountRoute) +UserCreateAccountRoute(handler) +UserLoginRoute(handler) + +ValidateSessionRoute(handler) +UserAllCurrentSessionsRoute(handler) +LogoutCurrentSessionRoute(handler) export default handler diff --git a/src/v2/routes/auth/invalidate-session.ts b/src/v2/routes/auth/invalidate-session.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/auth/login/openapi.ts b/src/v2/routes/auth/login/openapi.ts deleted file mode 100644 index e75bc18..0000000 --- a/src/v2/routes/auth/login/openapi.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { createRoute } from "@hono/zod-openapi" -import { loginSchema } from "./schema" -import { GenericResponses } from "@/v2/lib/response-schemas" -import { loginResponseSchema } from "./schema" - -export const userLoginRoute = createRoute({ - path: "/", - method: "post", - description: "Login to a user with an email and password.", - tags: ["Auth"], - request: { - body: { - content: { - "application/json": { - schema: loginSchema, - }, - }, - }, - }, - responses: { - 200: { - description: "Returns true.", - content: { - "application/json": { - schema: loginResponseSchema, - }, - }, - }, - ...GenericResponses, - }, -}) diff --git a/src/v2/routes/auth/login/route.ts b/src/v2/routes/auth/login/route.ts deleted file mode 100644 index 8625225..0000000 --- a/src/v2/routes/auth/login/route.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { OpenAPIHono } from "@hono/zod-openapi" -import { userLoginRoute } from "./openapi" -import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" -import { UserAuthenticationManager } from "@/v2/lib/managers/auth/user-auth-manager" - -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() - -handler.openapi(userLoginRoute, async (ctx) => { - const authSessionManager = new AuthSessionManager(ctx) - - const { user } = await authSessionManager.validateSession() - - if (user) { - return ctx.json( - { - success: false, - message: "Already logged in", - }, - 401 - ) - } - - const { email, password } = ctx.req.valid("json") - - const userAuthManager = new UserAuthenticationManager(ctx) - - const newLoginCookie = await userAuthManager.loginViaPassword( - email, - password - ) - - if (!newLoginCookie) { - return ctx.json( - { - success: false, - message: "Invalid credentials", - }, - 401 - ) - } - - ctx.header("Set-Cookie", newLoginCookie.serialize(), { - append: true, - }) - - return ctx.json( - { - success: true, - }, - 200 - ) -}) - -export default handler diff --git a/src/v2/routes/auth/login/schema.ts b/src/v2/routes/auth/login/schema.ts deleted file mode 100644 index 7e61833..0000000 --- a/src/v2/routes/auth/login/schema.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { z } from "@hono/zod-openapi" - -export const loginSchema = z.object({ - email: z.string().min(3).max(32).openapi({ - description: "The email of the user.", - example: "user@domain.com", - }), - password: z.string().min(8).max(64).openapi({ - description: "The password of the user.", - example: "password1234", - }), - passwordConfirmation: z.string().min(8).max(64).openapi({ - description: "The password confirmation of the user.", - example: "password1234", - }), -}) - -export const loginResponseSchema = z.object({ - success: z.literal(true), -}) diff --git a/src/v2/routes/auth/logout-current-session.ts b/src/v2/routes/auth/logout-current-session.ts new file mode 100644 index 0000000..315c95f --- /dev/null +++ b/src/v2/routes/auth/logout-current-session.ts @@ -0,0 +1,57 @@ +import { AppHandler } from "../handler" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +import { deleteCookie } from "hono/cookie" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" + +const logoutResponseSchema = z.object({ + success: z.literal(true), +}) + +const authLogoutRoute = createRoute({ + path: "/logout", + method: "get", + description: "Logout current session.", + tags: ["Auth"], + responses: { + 200: { + description: "Logout successful.", + content: { + "application/json": { + schema: logoutResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +export const LogoutCurrentSessionRoute = (handler: AppHandler) => { + handler.openapi(authLogoutRoute, async (ctx) => { + const authSessionManager = new AuthSessionManager(ctx) + + const { user } = await authSessionManager.validateSession() + + if (!user) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + await authSessionManager.invalidateCurrentSession() + + deleteCookie(ctx, "user_auth_session") + + return ctx.json( + { + success: true, + }, + 200 + ) + }) +} diff --git a/src/v2/routes/auth/session/all/openapi.ts b/src/v2/routes/auth/session/all/openapi.ts deleted file mode 100644 index 2443e41..0000000 --- a/src/v2/routes/auth/session/all/openapi.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { createRoute } from "@hono/zod-openapi" -import { sessionListSchema } from "./schema" -import { GenericResponses } from "@/v2/lib/response-schemas" - -export const authAllCurrentSessions = createRoute({ - path: "/", - method: "get", - description: "Get all current sessions.", - tags: ["Auth"], - responses: { - 200: { - description: "All current sessions are returned", - content: { - "application/json": { - schema: sessionListSchema, - }, - }, - }, - ...GenericResponses, - }, -}) diff --git a/src/v2/routes/auth/session/all/route.ts b/src/v2/routes/auth/session/all/route.ts deleted file mode 100644 index b888a6b..0000000 --- a/src/v2/routes/auth/session/all/route.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { OpenAPIHono } from "@hono/zod-openapi" -import { authAllCurrentSessions } from "./openapi" -import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" - -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() - -handler.openapi(authAllCurrentSessions, async (ctx) => { - const authSessionManager = new AuthSessionManager(ctx) - - const { user } = await authSessionManager.validateSession() - - if (!user) { - return ctx.json( - { - success: false, - message: "Unauthorized", - }, - 401 - ) - } - - const sessions = await authSessionManager.getAllSessions() - - return ctx.json( - { - success: true, - currentSessions: sessions.map((session) => { - return { - id: session.id, - expiresAt: session.expiresAt.toISOString(), - userAgent: session.userAgent, - } - }), - }, - 200 - ) -}) - -export default handler diff --git a/src/v2/routes/auth/session/all/schema.ts b/src/v2/routes/auth/session/all/schema.ts deleted file mode 100644 index 91c6a3c..0000000 --- a/src/v2/routes/auth/session/all/schema.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { selectSessionSchema } from "@/v2/db/schema" -import { z } from "@hono/zod-openapi" - -export const sessionListSchema = z.object({ - success: z.literal(true), - currentSessions: selectSessionSchema - .pick({ - id: true, - expiresAt: true, - }) - .array(), -}) diff --git a/src/v2/routes/auth/session/handler.ts b/src/v2/routes/auth/session/handler.ts deleted file mode 100644 index fa44045..0000000 --- a/src/v2/routes/auth/session/handler.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { OpenAPIHono } from "@hono/zod-openapi" -import GetAllSessionsRoute from "@/v2/routes/auth/session/all/route" -import ValidateSessionRoute from "@/v2/routes/auth/session/validate/route" -import LogoutCurrentSessionRoute from "@/v2/routes/auth/session/logout/route" - -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() - -handler.route("/all", GetAllSessionsRoute) -handler.route("/validate", ValidateSessionRoute) -handler.route("/logout", LogoutCurrentSessionRoute) - -export default handler diff --git a/src/v2/routes/auth/session/logout/openapi.ts b/src/v2/routes/auth/session/logout/openapi.ts deleted file mode 100644 index d0dd680..0000000 --- a/src/v2/routes/auth/session/logout/openapi.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { createRoute } from "@hono/zod-openapi" -import { GenericResponses } from "@/v2/lib/response-schemas" -import { logoutResponseSchema } from "./schema" - -export const authLogoutRoute = createRoute({ - path: "/", - method: "get", - description: "Logout current session.", - tags: ["Auth"], - responses: { - 200: { - description: "Logout successful.", - content: { - "application/json": { - schema: logoutResponseSchema, - }, - }, - }, - ...GenericResponses, - }, -}) diff --git a/src/v2/routes/auth/session/logout/route.ts b/src/v2/routes/auth/session/logout/route.ts deleted file mode 100644 index e8e7bf5..0000000 --- a/src/v2/routes/auth/session/logout/route.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { OpenAPIHono } from "@hono/zod-openapi" -import { authLogoutRoute } from "./openapi" -import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" -import { deleteCookie } from "hono/cookie" - -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() - -handler.openapi(authLogoutRoute, async (ctx) => { - const authSessionManager = new AuthSessionManager(ctx) - - const { user } = await authSessionManager.validateSession() - - if (!user) { - return ctx.json( - { - success: false, - message: "Unauthorized", - }, - 401 - ) - } - - await authSessionManager.invalidateCurrentSession() - - deleteCookie(ctx, "user_auth_session") - - return ctx.json( - { - success: true, - }, - 200 - ) -}) - -export default handler diff --git a/src/v2/routes/auth/session/logout/schema.ts b/src/v2/routes/auth/session/logout/schema.ts deleted file mode 100644 index 4350c74..0000000 --- a/src/v2/routes/auth/session/logout/schema.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { z } from "@hono/zod-openapi" - -export const logoutResponseSchema = z.object({ - success: z.literal(true), -}) diff --git a/src/v2/routes/auth/session/validate/openapi.ts b/src/v2/routes/auth/session/validate/openapi.ts deleted file mode 100644 index ee50239..0000000 --- a/src/v2/routes/auth/session/validate/openapi.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { createRoute } from "@hono/zod-openapi" -import { authValidationSchema } from "./schema" -import { GenericResponses } from "@/v2/lib/response-schemas" - -export const authValidationRoute = createRoute({ - path: "/", - method: "get", - description: "Validate current session.", - tags: ["Auth"], - responses: { - 200: { - description: "All user information is returned.", - content: { - "application/json": { - schema: authValidationSchema, - }, - }, - }, - ...GenericResponses, - }, -}) diff --git a/src/v2/routes/auth/session/validate/route.ts b/src/v2/routes/auth/session/validate/route.ts deleted file mode 100644 index 2ee78f7..0000000 --- a/src/v2/routes/auth/session/validate/route.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { OpenAPIHono } from "@hono/zod-openapi" -import { authValidationRoute } from "./openapi" -import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" - -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() - -handler.openapi(authValidationRoute, async (ctx) => { - const authSessionManager = new AuthSessionManager(ctx) - - const { user } = await authSessionManager.validateSession() - - if (!user) { - return ctx.json( - { - success: false, - message: "Unauthorized", - }, - 401 - ) - } - - return ctx.json( - { - success: true, - user, - }, - 200 - ) -}) - -export default handler diff --git a/src/v2/routes/auth/session/validate/schema.ts b/src/v2/routes/auth/session/validate/schema.ts deleted file mode 100644 index 14d1a73..0000000 --- a/src/v2/routes/auth/session/validate/schema.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { z } from "@hono/zod-openapi" -import { selectUserSchema } from "@/v2/db/schema" - -export const authValidationSchema = z.object({ - success: z.literal(true), - user: selectUserSchema, -}) diff --git a/src/v2/routes/auth/validate-current-session.ts b/src/v2/routes/auth/validate-current-session.ts new file mode 100644 index 0000000..18e3a81 --- /dev/null +++ b/src/v2/routes/auth/validate-current-session.ts @@ -0,0 +1,55 @@ +import { AppHandler } from "../handler" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" +import { selectUserSchema } from "@/v2/db/schema" + +const authValidationSchema = z.object({ + success: z.literal(true), + user: selectUserSchema, +}) + +const authValidationRoute = createRoute({ + path: "/validate", + method: "get", + description: "Validate current session.", + tags: ["Auth"], + responses: { + 200: { + description: "All user information is returned.", + content: { + "application/json": { + schema: authValidationSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +export const ValidateSessionRoute = (handler: AppHandler) => { + handler.openapi(authValidationRoute, async (ctx) => { + const authSessionManager = new AuthSessionManager(ctx) + + const { user } = await authSessionManager.validateSession() + + if (!user) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + return ctx.json( + { + success: true, + user, + }, + 200 + ) + }) +} From ef1924bda4ef79746e64bdf080b58f28251012ce Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 17 Mar 2024 06:00:01 +0000 Subject: [PATCH 278/318] invalidate session via id route --- .../lib/managers/auth/user-session-manager.ts | 12 +++ src/v2/routes/asset/delete-asset.ts | 2 +- src/v2/routes/asset/like-asset.ts | 2 +- src/v2/routes/asset/modify-asset.ts | 2 +- src/v2/routes/asset/unlike-asset.ts | 2 +- src/v2/routes/asset/upload-asset.ts | 3 +- src/v2/routes/auth/handler.ts | 2 + src/v2/routes/auth/invalidate-session.ts | 94 +++++++++++++++++++ src/v2/routes/requests/delete-request.ts | 2 +- .../routes/requests/remove-request-upvote.ts | 2 +- src/v2/routes/requests/upvote-request.ts | 2 +- src/v2/routes/requests/view-request.ts | 2 +- 12 files changed, 118 insertions(+), 9 deletions(-) diff --git a/src/v2/lib/managers/auth/user-session-manager.ts b/src/v2/lib/managers/auth/user-session-manager.ts index 528c809..f010cb0 100644 --- a/src/v2/lib/managers/auth/user-session-manager.ts +++ b/src/v2/lib/managers/auth/user-session-manager.ts @@ -67,4 +67,16 @@ export class AuthSessionManager { return true } + + public async invalidateSessionById(id: string) { + const { user } = await this.validateAndGetSession() + + if (!user) { + return null + } + + await this.lucia.invalidateSession(id) + + return true + } } diff --git a/src/v2/routes/asset/delete-asset.ts b/src/v2/routes/asset/delete-asset.ts index 4e8ab2b..caaef55 100644 --- a/src/v2/routes/asset/delete-asset.ts +++ b/src/v2/routes/asset/delete-asset.ts @@ -12,7 +12,7 @@ const deleteAssetByIdSchema = z.object({ name: "id", in: "path", description: "The ID of the asset to delete.", - example: "1", + example: "asset_id", required: true, }, }), diff --git a/src/v2/routes/asset/like-asset.ts b/src/v2/routes/asset/like-asset.ts index a298c29..95269f2 100644 --- a/src/v2/routes/asset/like-asset.ts +++ b/src/v2/routes/asset/like-asset.ts @@ -11,7 +11,7 @@ const likeAssetByIdSchema = z.object({ id: z.string().openapi({ param: { description: "The id of the asset to like.", - example: "1", + example: "asset_id", in: "path", name: "id", required: true, diff --git a/src/v2/routes/asset/modify-asset.ts b/src/v2/routes/asset/modify-asset.ts index 50ce6e4..e3f8bc8 100644 --- a/src/v2/routes/asset/modify-asset.ts +++ b/src/v2/routes/asset/modify-asset.ts @@ -12,7 +12,7 @@ const modifyAssetPathSchema = z.object({ id: z.string().openapi({ param: { description: "The id of the asset to modify.", - example: "1", + example: "asset_id", in: "path", required: true, }, diff --git a/src/v2/routes/asset/unlike-asset.ts b/src/v2/routes/asset/unlike-asset.ts index 6039623..c19e570 100644 --- a/src/v2/routes/asset/unlike-asset.ts +++ b/src/v2/routes/asset/unlike-asset.ts @@ -11,7 +11,7 @@ const unlikeAssetByIdSchema = z.object({ id: z.string().openapi({ param: { description: "The id of the asset to unlike.", - example: "1", + example: "asset_id", in: "path", name: "id", required: true, diff --git a/src/v2/routes/asset/upload-asset.ts b/src/v2/routes/asset/upload-asset.ts index c9f901d..81f3f61 100644 --- a/src/v2/routes/asset/upload-asset.ts +++ b/src/v2/routes/asset/upload-asset.ts @@ -50,7 +50,8 @@ const uploadAssetSchema = z.object({ .min(1) .max(1) .openapi({ - description: "If the asset contains suggestive content 0 or 1.", + description: + "If the asset contains suggestive content. 1 = Yes, 0 = No.", example: "1", }) .transform((value) => parseInt(value)) diff --git a/src/v2/routes/auth/handler.ts b/src/v2/routes/auth/handler.ts index 56d1776..9ceebee 100644 --- a/src/v2/routes/auth/handler.ts +++ b/src/v2/routes/auth/handler.ts @@ -4,6 +4,7 @@ import { UserLoginRoute } from "./account-login" import { UserAllCurrentSessionsRoute } from "./get-all-sessions" import { LogoutCurrentSessionRoute } from "./logout-current-session" import { ValidateSessionRoute } from "./validate-current-session" +import { InvalidateSessionRoute } from "./invalidate-session" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() @@ -11,6 +12,7 @@ UserCreateAccountRoute(handler) UserLoginRoute(handler) ValidateSessionRoute(handler) +InvalidateSessionRoute(handler) UserAllCurrentSessionsRoute(handler) LogoutCurrentSessionRoute(handler) diff --git a/src/v2/routes/auth/invalidate-session.ts b/src/v2/routes/auth/invalidate-session.ts index e69de29..6163188 100644 --- a/src/v2/routes/auth/invalidate-session.ts +++ b/src/v2/routes/auth/invalidate-session.ts @@ -0,0 +1,94 @@ +import { AppHandler } from "../handler" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +// import { deleteCookie } from "hono/cookie" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" + +const invalidateSessionSchema = z.object({ + id: z.string().openapi({ + param: { + description: "The id of the session to invalidate.", + example: "session_id", + in: "path", + name: "id", + required: true, + }, + }), +}) + +const invalidateSessionResponseSchema = z.object({ + success: z.literal(true), +}) + +const invalidateSessionRoute = createRoute({ + path: "/invalidate/{id}", + method: "get", + description: "Invalidate a session by its ID.", + tags: ["Auth"], + request: { + params: invalidateSessionSchema, + }, + responses: { + 200: { + description: "Logout successful.", + content: { + "application/json": { + schema: invalidateSessionResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +export const InvalidateSessionRoute = (handler: AppHandler) => { + handler.openapi(invalidateSessionRoute, async (ctx) => { + const sessionId = ctx.req.valid("param").id + + const authSessionManager = new AuthSessionManager(ctx) + + const { user, session } = await authSessionManager.validateSession() + + if (!user) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + if (sessionId == session.id) { + return ctx.json( + { + success: false, + message: "Cannot invalidate the current session.", + }, + 400 + ) + } + + const sessions = await authSessionManager.getAllSessions() + + if (!sessions.find((s) => s.id === sessionId)) { + return ctx.json( + { + success: false, + message: "Session not found.", + }, + 400 + ) + } + + await authSessionManager.invalidateSessionById(sessionId) + + return ctx.json( + { + success: true, + }, + 200 + ) + }) +} diff --git a/src/v2/routes/requests/delete-request.ts b/src/v2/routes/requests/delete-request.ts index 16ef9a4..fc9df68 100644 --- a/src/v2/routes/requests/delete-request.ts +++ b/src/v2/routes/requests/delete-request.ts @@ -13,7 +13,7 @@ export const deleteRequestByIdSchema = z.object({ name: "id", in: "path", description: "The ID of the request to delete. Supporter required.", - example: "1", + example: "request_id", required: true, }, }), diff --git a/src/v2/routes/requests/remove-request-upvote.ts b/src/v2/routes/requests/remove-request-upvote.ts index 85fd720..afe244c 100644 --- a/src/v2/routes/requests/remove-request-upvote.ts +++ b/src/v2/routes/requests/remove-request-upvote.ts @@ -13,7 +13,7 @@ export const removeRequestUpvoteByIdSchema = z.object({ name: "id", in: "path", description: "The ID of the request to remove the upvote for.", - example: "1", + example: "request_id", required: true, }, }), diff --git a/src/v2/routes/requests/upvote-request.ts b/src/v2/routes/requests/upvote-request.ts index 66fcbcf..ea23d7b 100644 --- a/src/v2/routes/requests/upvote-request.ts +++ b/src/v2/routes/requests/upvote-request.ts @@ -13,7 +13,7 @@ export const upvoteRequestByIdSchema = z.object({ name: "id", in: "path", description: "The ID of the request to upvote.", - example: "1", + example: "request_id", required: true, }, }), diff --git a/src/v2/routes/requests/view-request.ts b/src/v2/routes/requests/view-request.ts index 3744ad6..c0d860e 100644 --- a/src/v2/routes/requests/view-request.ts +++ b/src/v2/routes/requests/view-request.ts @@ -13,7 +13,7 @@ export const viewRequestByIdSchema = z.object({ name: "id", in: "path", description: "The ID of the request to view.", - example: "1", + example: "request_id", required: true, }, }), From 2815656d29d60f9c63e0a4e100a3ad60379e1c84 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 17 Mar 2024 06:12:32 +0000 Subject: [PATCH 279/318] init collection route files, remove favourites --- src/scripts/seed/seed.ts | 44 ------- src/v2/db/schema.ts | 1 - src/v2/db/schema/user/user-favourites.ts | 123 ------------------ src/v2/db/schema/user/user.ts | 2 - src/v2/routes/collection/add-asset.ts | 0 src/v2/routes/collection/add-contributor.ts | 0 src/v2/routes/collection/create-collection.ts | 0 src/v2/routes/collection/delete-collection.ts | 0 src/v2/routes/collection/modify-collection.ts | 0 src/v2/routes/collection/remove-asset.ts | 0 .../routes/collection/remove-contributor.ts | 0 .../collection/update-contributor-status.ts | 0 src/v2/routes/collection/view-collection.ts | 0 13 files changed, 170 deletions(-) delete mode 100644 src/v2/db/schema/user/user-favourites.ts create mode 100644 src/v2/routes/collection/add-asset.ts create mode 100644 src/v2/routes/collection/add-contributor.ts create mode 100644 src/v2/routes/collection/create-collection.ts create mode 100644 src/v2/routes/collection/delete-collection.ts create mode 100644 src/v2/routes/collection/modify-collection.ts create mode 100644 src/v2/routes/collection/remove-asset.ts create mode 100644 src/v2/routes/collection/remove-contributor.ts create mode 100644 src/v2/routes/collection/update-contributor-status.ts create mode 100644 src/v2/routes/collection/view-collection.ts diff --git a/src/scripts/seed/seed.ts b/src/scripts/seed/seed.ts index 994cd06..8f3fa29 100644 --- a/src/scripts/seed/seed.ts +++ b/src/scripts/seed/seed.ts @@ -11,8 +11,6 @@ import { gameAssetCategory, userCollection, userCollectionAsset, - userFavourite, - userFavouriteAsset, userFollowing, requestFormUpvotes, requestForm, @@ -513,48 +511,6 @@ async function main() { `[SEED] [userCollectionAsset] inserted ${newUserCollectionAssets.length} rows\n` ) - // only one user favourite per user - console.log("[SEED] [userFavourite] Seeding user favourites...") - const newUserFavourites = await db - .insert(userFavourite) - .values([ - { - userId: newUsers[0].id, - }, - { - userId: newUsers[1].id, - isPublic: false, - }, - ]) - .returning() - console.log( - `[SEED] [userFavourite] inserted ${newUserFavourites.length} rows\n` - ) - - console.log( - "[SEED] [userFavouriteAsset] Linking user favourites to assets..." - ) - const newUserFavouriteAssets = await db - .insert(userFavouriteAsset) - .values([ - { - userFavouriteId: newUserFavourites[0].id, - assetId: newAssets[0].id, - }, - { - userFavouriteId: newUserFavourites[0].id, - assetId: newAssets[1].id, - }, - { - userFavouriteId: newUserFavourites[1].id, - assetId: newAssets[2].id, - }, - ]) - .returning() - console.log( - `[SEED] [userFavouriteAsset] inserted ${newUserFavouriteAssets.length} rows\n` - ) - console.log("[SEED] Seeded database successfully") process.exit(0) } diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index 068e9e7..7a12216 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -16,7 +16,6 @@ export * from "./schema/user/user" export * from "./schema/user/user-attributes" export * from "./schema/collections/user-collections" export * from "./schema/user/user-connections" -export * from "./schema/user/user-favourites" export * from "./schema/user/user-following" export * from "./schema/user/user-blocked" diff --git a/src/v2/db/schema/user/user-favourites.ts b/src/v2/db/schema/user/user-favourites.ts deleted file mode 100644 index 8275461..0000000 --- a/src/v2/db/schema/user/user-favourites.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { tableNames } from "@/v2/db/drizzle" -import { relations } from "drizzle-orm" -import { - sqliteTable, - text, - integer, - // uniqueIndex, - index, -} from "drizzle-orm/sqlite-core" -import { authUser } from "./user" -import { asset } from "../asset/asset" -import { createInsertSchema, createSelectSchema } from "drizzle-zod" -import { generateID } from "@/v2/lib/oslo" - -/* -NOTE: this file is users favourite assets. -- Think of it as being similar to likes, where you can favourite multiple assets but only have one set of favourites. -- Everything else is managed within collections when uers want to organize their assets. -*/ - -export const userFavourite = sqliteTable( - tableNames.userFavourite, - { - id: text("id") - .unique() - .notNull() - .$defaultFn(() => { - return generateID() - }), - userId: text("user_id") - .notNull() - .references(() => authUser.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - isPublic: integer("is_public", { mode: "boolean" }) - .default(false) - .notNull(), - }, - (userFavourite) => { - return { - favouritedAssetsIdx: index("favourited_assets_id_idx").on( - userFavourite.id - ), - favouritedAssetsUserIdx: index("favourited_assets_user_id_idx").on( - userFavourite.userId - ), - } - } -) - -export type UserFavourite = typeof userFavourite.$inferSelect -export type NewUserFavourite = typeof userFavourite.$inferInsert -export const insertUserFavouriteSchema = createInsertSchema(userFavourite) -export const selectUserFavouriteSchema = createSelectSchema(userFavourite) - -export const userFavouriteAsset = sqliteTable( - tableNames.userFavouriteAsset, - { - id: text("id") - .primaryKey() - .notNull() - .$defaultFn(() => { - return generateID() - }), - userFavouriteId: text("favourited_assets_id") - .notNull() - .references(() => userFavourite.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - assetId: text("asset_id") - .notNull() - .references(() => asset.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - }, - (userFavouriteAsset) => { - return { - favouritedAssetsAssetsIdx: index( - "favourited_assets_assets_id_idx" - ).on(userFavouriteAsset.id), - favouritedAssetsAssetsUserIdx: index( - "favourited_assets_assets_user_id_idx" - ).on(userFavouriteAsset.userFavouriteId), - favouritedAssetsAssetsAssetIdx: index( - "favourited_assets_assets_asset_id_idx" - ).on(userFavouriteAsset.assetId), - } - } -) - -export type UserFavouriteAsset = typeof userFavouriteAsset.$inferSelect -export type NewUserFavouriteAsset = typeof userFavouriteAsset.$inferInsert -export const insertUserFavouriteAssetSchema = - createInsertSchema(userFavouriteAsset) -export const selectUserFavouriteAssetSchema = - createSelectSchema(userFavouriteAsset) - -export const userFavouriteRelations = relations(userFavourite, ({ one }) => ({ - user: one(authUser, { - fields: [userFavourite.userId], - references: [authUser.id], - relationName: "userfavourite_auth_user", - }), -})) - -export const userFavouriteAssetRelations = relations( - userFavouriteAsset, - ({ one }) => ({ - favouritedAssets: one(userFavourite, { - fields: [userFavouriteAsset.userFavouriteId], - references: [userFavourite.id], - relationName: "favouritedassets_userfavourite", - }), - asset: one(asset, { - fields: [userFavouriteAsset.assetId], - references: [asset.id], - relationName: "favouritedassets_asset", - }), - }) -) diff --git a/src/v2/db/schema/user/user.ts b/src/v2/db/schema/user/user.ts index cb92ff9..71e4858 100644 --- a/src/v2/db/schema/user/user.ts +++ b/src/v2/db/schema/user/user.ts @@ -11,7 +11,6 @@ import { createInsertSchema, createSelectSchema } from "drizzle-zod" import { generateID } from "@/v2/lib/oslo" import { userFollowing } from "./user-following" import { asset } from "../asset/asset" -import { userFavourite } from "./user-favourites" import { socialsConnection } from "./user-connections" import { userCollection } from "../collections/user-collections" import { passwordResetToken } from "./user-attributes" @@ -207,7 +206,6 @@ export const usersRelations = relations(authUser, ({ one, many }) => ({ userSession: many(userSession), asset: many(asset), assetExternalFile: many(assetExternalFile), - userFavourite: one(userFavourite), userCollectionLikes: many(userCollectionLikes), assetLikes: many(assetLikes), assetComments: many(assetComments), diff --git a/src/v2/routes/collection/add-asset.ts b/src/v2/routes/collection/add-asset.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/collection/add-contributor.ts b/src/v2/routes/collection/add-contributor.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/collection/create-collection.ts b/src/v2/routes/collection/create-collection.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/collection/delete-collection.ts b/src/v2/routes/collection/delete-collection.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/collection/modify-collection.ts b/src/v2/routes/collection/modify-collection.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/collection/remove-asset.ts b/src/v2/routes/collection/remove-asset.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/collection/remove-contributor.ts b/src/v2/routes/collection/remove-contributor.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/collection/update-contributor-status.ts b/src/v2/routes/collection/update-contributor-status.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/collection/view-collection.ts b/src/v2/routes/collection/view-collection.ts new file mode 100644 index 0000000..e69de29 From b6bd6bcdfaaf46962d8fb8a07dd51ea9d9d8be36 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 17 Mar 2024 06:51:58 +0000 Subject: [PATCH 280/318] asset comments show likes count --- src/v2/db/schema/asset/asset-comments.ts | 30 +++++++------ src/v2/routes/asset/get-asset-comments.ts | 53 ++++++++++++++--------- src/v2/routes/asset/handler.ts | 4 ++ 3 files changed, 53 insertions(+), 34 deletions(-) diff --git a/src/v2/db/schema/asset/asset-comments.ts b/src/v2/db/schema/asset/asset-comments.ts index 5ba7bd9..6d05134 100644 --- a/src/v2/db/schema/asset/asset-comments.ts +++ b/src/v2/db/schema/asset/asset-comments.ts @@ -27,7 +27,7 @@ export const assetComments = sqliteTable( }), // typescript limitations means that the type will be set as `any` if we self reference, so we create FK manually parentCommentId: text("parent_comment_id"), - commentedById: text("liked_by_id") + commentedById: text("commented_by_id") .notNull() .references(() => authUser.id, { onUpdate: "cascade", @@ -109,18 +109,22 @@ export const selectAssetCommentsLikesSchema = createSelectSchema(assetCommentsLikes) // not too sure about this -export const assetCommentsRelations = relations(assetComments, ({ one }) => ({ - asset: one(asset, { - fields: [assetComments.assetId], - references: [asset.id], - relationName: "asset_comments_asset", - }), - commentedBy: one(authUser, { - fields: [assetComments.commentedById], - references: [authUser.id], - relationName: "asset_comments_commented_by", - }), -})) +export const assetCommentsRelations = relations( + assetComments, + ({ one, many }) => ({ + asset: one(asset, { + fields: [assetComments.assetId], + references: [asset.id], + relationName: "asset_comments_asset", + }), + commentedBy: one(authUser, { + fields: [assetComments.commentedById], + references: [authUser.id], + relationName: "asset_comments_commented_by", + }), + assetCommentsLikes: many(assetCommentsLikes), + }) +) export const assetCommentsLikesRelations = relations( assetCommentsLikes, diff --git a/src/v2/routes/asset/get-asset-comments.ts b/src/v2/routes/asset/get-asset-comments.ts index 1672e0a..9411bd5 100644 --- a/src/v2/routes/asset/get-asset-comments.ts +++ b/src/v2/routes/asset/get-asset-comments.ts @@ -1,9 +1,11 @@ import { getConnection } from "@/v2/db/turso" -import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" import { createRoute } from "@hono/zod-openapi" import { GenericResponses } from "@/v2/lib/response-schemas" import { z } from "@hono/zod-openapi" import { AppHandler } from "../handler" +import { assetComments, assetCommentsLikes } from "@/v2/db/schema" +import { selectAssetCommentsSchema } from "@/v2/db/schema" +import { sql, eq } from "drizzle-orm" const getAssetCommentsSchema = z.object({ id: z.string().openapi({ @@ -18,6 +20,19 @@ const getAssetCommentsSchema = z.object({ const getAssetCommentsResponseSchema = z.object({ success: z.literal(true), + comments: z.array( + selectAssetCommentsSchema + .pick({ + id: true, + parentCommentId: true, + commentedById: true, + comment: true, + createdAt: true, + }) + .extend({ + likes: z.number(), + }) + ), }) const getAssetCommentsRoute = createRoute({ @@ -45,28 +60,24 @@ export const ViewAssetCommentsRoute = (handler: AppHandler) => { handler.openapi(getAssetCommentsRoute, async (ctx) => { const assetId = ctx.req.valid("param").id - const authSessionManager = new AuthSessionManager(ctx) - const { user } = await authSessionManager.validateSession() - - if (!user) { - return ctx.json( - { - success: false, - message: "Unauthorized", - }, - 401 - ) - } - const { drizzle } = await getConnection(ctx.env) - const comments = await drizzle.query.assetComments.findMany({ - where: (assetComments, { eq }) => - eq(assetComments.assetId, assetId), - with: { - assetCommentsLikes: true, - }, - }) + const comments = await drizzle + .select({ + id: assetComments.id, + parentCommentId: assetComments.parentCommentId, + commentedById: assetComments.commentedById, + comment: assetComments.comment, + createdAt: assetComments.createdAt, + likes: sql`COUNT(${assetCommentsLikes.commentId})`, + }) + .from(assetComments) + .where(eq(assetComments.assetId, assetId)) + .leftJoin( + assetCommentsLikes, + eq(assetComments.id, assetCommentsLikes.commentId) + ) + .groupBy(assetComments.id) return ctx.json( { diff --git a/src/v2/routes/asset/handler.ts b/src/v2/routes/asset/handler.ts index ff8f15b..1bea453 100644 --- a/src/v2/routes/asset/handler.ts +++ b/src/v2/routes/asset/handler.ts @@ -9,6 +9,8 @@ import { ModifyAssetRoute } from "./modify-asset" import { UploadAssetRoute } from "./upload-asset" import { DeleteAssetByIdRoute } from "./delete-asset" +import { ViewAssetCommentsRoute } from "./get-asset-comments" + const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() AssetSearchAllFilterRoute(handler) @@ -23,4 +25,6 @@ UnlikeAssetByIdRoute(handler) GetAssetLikesRoute(handler) +ViewAssetCommentsRoute(handler) + export default handler From 1e9dca106d851a5b3ad519bb2b10b82e87f3066c Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 17 Mar 2024 06:57:29 +0000 Subject: [PATCH 281/318] comment offset and limit, sort by creation date (for now) --- src/v2/routes/asset/get-asset-comments.ts | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/v2/routes/asset/get-asset-comments.ts b/src/v2/routes/asset/get-asset-comments.ts index 9411bd5..a26ac36 100644 --- a/src/v2/routes/asset/get-asset-comments.ts +++ b/src/v2/routes/asset/get-asset-comments.ts @@ -5,7 +5,7 @@ import { z } from "@hono/zod-openapi" import { AppHandler } from "../handler" import { assetComments, assetCommentsLikes } from "@/v2/db/schema" import { selectAssetCommentsSchema } from "@/v2/db/schema" -import { sql, eq } from "drizzle-orm" +import { sql, eq, desc } from "drizzle-orm" const getAssetCommentsSchema = z.object({ id: z.string().openapi({ @@ -18,6 +18,20 @@ const getAssetCommentsSchema = z.object({ }), }) +const getAssetCommentsOffsetSchema = z.object({ + offset: z + .string() + .optional() + .openapi({ + param: { + name: "offset", + in: "query", + description: "The offset to start from.", + required: false, + }, + }), +}) + const getAssetCommentsResponseSchema = z.object({ success: z.literal(true), comments: z.array( @@ -42,6 +56,7 @@ const getAssetCommentsRoute = createRoute({ tags: ["Asset"], request: { params: getAssetCommentsSchema, + query: getAssetCommentsOffsetSchema, }, responses: { 200: { @@ -59,6 +74,7 @@ const getAssetCommentsRoute = createRoute({ export const ViewAssetCommentsRoute = (handler: AppHandler) => { handler.openapi(getAssetCommentsRoute, async (ctx) => { const assetId = ctx.req.valid("param").id + const offset = parseInt(ctx.req.valid("query").offset) || 0 const { drizzle } = await getConnection(ctx.env) @@ -78,6 +94,9 @@ export const ViewAssetCommentsRoute = (handler: AppHandler) => { eq(assetComments.id, assetCommentsLikes.commentId) ) .groupBy(assetComments.id) + .offset(offset) + .limit(10) + .orderBy(desc(assetComments.createdAt)) return ctx.json( { From 8c808b57cd31006b4f8bb98504df0704ed2fbfdc Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 17 Mar 2024 07:22:36 +0000 Subject: [PATCH 282/318] fix get single asset schema --- src/v2/routes/asset/get-asset.ts | 114 +++++++++++++----- ...sset-likes.ts => get-users-asset-likes.ts} | 0 src/v2/routes/asset/handler.ts | 2 +- 3 files changed, 84 insertions(+), 32 deletions(-) rename src/v2/routes/asset/{get-asset-likes.ts => get-users-asset-likes.ts} (100%) diff --git a/src/v2/routes/asset/get-asset.ts b/src/v2/routes/asset/get-asset.ts index 152a0b4..8ac39e2 100644 --- a/src/v2/routes/asset/get-asset.ts +++ b/src/v2/routes/asset/get-asset.ts @@ -1,6 +1,6 @@ import { AppHandler } from "../handler" import { getConnection } from "@/v2/db/turso" -import { asset } from "@/v2/db/schema" +import { asset, assetLikes } from "@/v2/db/schema" import { eq, sql } from "drizzle-orm" import { createRoute } from "@hono/zod-openapi" import { GenericResponses } from "@/v2/lib/response-schemas" @@ -28,29 +28,46 @@ const getAssetByIdSchema = z.object({ const getAssetByIdResponseSchema = z.object({ success: z.literal(true), // mmm nested schemas - asset: selectAssetSchema.extend({ - assetTagAsset: z.array( - selectAssetTagAssetSchema.extend({ - assetTag: selectAssetTagSchema, - }) - ), - }), - authUser: selectUserSchema.pick({ - id: true, - avatarUrl: true, - displayName: true, - username: true, - usernameColour: true, - pronouns: true, - verified: true, - bio: true, - dateJoined: true, - plan: true, - role: true, - }), - game: selectGameSchema, - assetCategory: selectAssetCategorySchema, - // similarAssets: selectAssetSchema.array(), + asset: selectAssetSchema + .pick({ + id: true, + name: true, + extension: true, + url: true, + viewCount: true, + downloadCount: true, + fileSize: true, + width: true, + height: true, + }) + .extend({ + assetTagAsset: z.array( + selectAssetTagAssetSchema.pick({}).extend({ + assetTag: selectAssetTagSchema.pick({ + id: true, + formattedName: true, + }), + }) + ), + authUser: selectUserSchema.pick({ + id: true, + avatarUrl: true, + displayName: true, + username: true, + usernameColour: true, + plan: true, + role: true, + }), + game: selectGameSchema.pick({ + id: true, + formattedName: true, + }), + assetCategory: selectAssetCategorySchema.pick({ + id: true, + formattedName: true, + }), + }), + assetLikes: z.number(), }) const getAssetByIdRoute = createRoute({ @@ -81,11 +98,31 @@ export const GetAssetByIdRoute = (handler: AppHandler) => { const { drizzle } = await getConnection(ctx.env) const foundAsset = await drizzle.query.asset.findFirst({ + columns: { + id: true, + name: true, + extension: true, + url: true, + viewCount: true, + downloadCount: true, + fileSize: true, + width: true, + height: true, + }, where: (asset, { eq }) => eq(asset.id, assetId), with: { assetTagAsset: { + columns: { + assetTagId: false, + assetId: false, + }, with: { - assetTag: true, + assetTag: { + columns: { + id: true, + formattedName: true, + }, + }, }, }, authUser: { @@ -95,19 +132,33 @@ export const GetAssetByIdRoute = (handler: AppHandler) => { displayName: true, username: true, usernameColour: true, - pronouns: true, - verified: true, - bio: true, - dateJoined: true, plan: true, role: true, }, }, - game: true, - assetCategory: true, + game: { + columns: { + id: true, + formattedName: true, + }, + }, + assetCategory: { + columns: { + id: true, + formattedName: true, + }, + }, }, }) + const [totalAssetLikes] = await drizzle + .select({ + likeCount: sql`COUNT(${assetLikes.assetId})`, + }) + .from(asset) + .where(eq(asset.id, assetId)) + .limit(1) + if (!foundAsset) { return ctx.json( { @@ -129,6 +180,7 @@ export const GetAssetByIdRoute = (handler: AppHandler) => { { success: true, asset: foundAsset, + assetLikes: totalAssetLikes.likeCount, }, 200 ) diff --git a/src/v2/routes/asset/get-asset-likes.ts b/src/v2/routes/asset/get-users-asset-likes.ts similarity index 100% rename from src/v2/routes/asset/get-asset-likes.ts rename to src/v2/routes/asset/get-users-asset-likes.ts diff --git a/src/v2/routes/asset/handler.ts b/src/v2/routes/asset/handler.ts index 1bea453..e50c75d 100644 --- a/src/v2/routes/asset/handler.ts +++ b/src/v2/routes/asset/handler.ts @@ -4,7 +4,7 @@ import { GetAssetByIdRoute } from "./get-asset" import { LikeAssetByIdRoute } from "./like-asset" import { UnlikeAssetByIdRoute } from "./unlike-asset" import { AssetSearchAllFilterRoute } from "./search-assets" -import { GetAssetLikesRoute } from "./get-asset-likes" +import { GetAssetLikesRoute } from "./get-users-asset-likes" import { ModifyAssetRoute } from "./modify-asset" import { UploadAssetRoute } from "./upload-asset" import { DeleteAssetByIdRoute } from "./delete-asset" From 18f0647b813e3aa15ddaa6c640f802b09f7f7a2f Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 17 Mar 2024 07:27:25 +0000 Subject: [PATCH 283/318] decrease returned columns for asset search route --- src/v2/routes/asset/search-assets.ts | 51 +++++++++++++++++++++++----- 1 file changed, 43 insertions(+), 8 deletions(-) diff --git a/src/v2/routes/asset/search-assets.ts b/src/v2/routes/asset/search-assets.ts index cfe8ce0..d7b33bd 100644 --- a/src/v2/routes/asset/search-assets.ts +++ b/src/v2/routes/asset/search-assets.ts @@ -13,13 +13,28 @@ import { type AppHandler } from "../handler" export const assetSearchAllFilterResponseSchema = z.object({ success: z.literal(true), assets: z.array( - selectAssetSchema.extend({ - assetTagAsset: z.array( - selectAssetTagAssetSchema.extend({ - assetTag: selectAssetTagSchema, - }) - ), - }) + selectAssetSchema + .pick({ + id: true, + name: true, + extension: true, + url: true, + viewCount: true, + downloadCount: true, + fileSize: true, + width: true, + height: true, + }) + .extend({ + assetTagAsset: z.array( + selectAssetTagAssetSchema.pick({}).extend({ + assetTag: selectAssetTagSchema.pick({ + id: true, + formattedName: true, + }), + }) + ), + }) ), }) @@ -142,10 +157,30 @@ export const AssetSearchAllFilterRoute = (handler: AppHandler) => { ), limit: 100, offset: offset ? parseInt(offset) : 0, + columns: { + id: true, + name: true, + extension: true, + url: true, + viewCount: true, + downloadCount: true, + fileSize: true, + width: true, + height: true, + }, with: { assetTagAsset: { + columns: { + assetTagId: false, + assetId: false, + }, with: { - assetTag: true, + assetTag: { + columns: { + id: true, + formattedName: true, + }, + }, }, }, }, From f870e28cb2f77afbb9f897ec1ccac8194ec52b40 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 17 Mar 2024 07:47:00 +0000 Subject: [PATCH 284/318] dl route, add more data for /contributors --- src/v2/routes/asset/download-asset.ts | 84 +++++++++++++++++++ src/v2/routes/asset/handler.ts | 2 + .../routes/contributors/all-contributors.ts | 4 + 3 files changed, 90 insertions(+) create mode 100644 src/v2/routes/asset/download-asset.ts diff --git a/src/v2/routes/asset/download-asset.ts b/src/v2/routes/asset/download-asset.ts new file mode 100644 index 0000000..77f26b8 --- /dev/null +++ b/src/v2/routes/asset/download-asset.ts @@ -0,0 +1,84 @@ +import { AppHandler } from "../handler" +import { getConnection } from "@/v2/db/turso" +import { asset } from "@/v2/db/schema" +import { eq, sql } from "drizzle-orm" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" + +const downloadAssetByIdSchema = z.object({ + id: z.string().openapi({ + param: { + name: "id", + in: "path", + description: "The ID of the asset to retrieve.", + required: true, + }, + }), +}) + +const downloadAssetByIdResponseSchema = z.object({ + success: z.literal(true), + downloadUrl: z.string(), +}) + +const downloadAssetByIdRoute = createRoute({ + path: "/{id}/download", + method: "get", + description: "Download an asset by their ID.", + tags: ["Asset"], + request: { + params: downloadAssetByIdSchema, + }, + responses: { + 200: { + description: "Asset downloaded successfully.", + response: { + content: { + "application/json": { + schema: downloadAssetByIdResponseSchema, + }, + }, + }, + }, + ...GenericResponses, + }, +}) + +export const DownloadAssetRoute = (handler: AppHandler) => { + handler.openapi(downloadAssetByIdRoute, async (ctx) => { + const assetId = ctx.req.valid("param").id + + const { drizzle } = await getConnection(ctx.env) + + const [foundAsset] = await drizzle + .select({ + url: asset.url, + }) + .from(asset) + .where(eq(asset.id, assetId)) + .limit(1) + + if (!foundAsset) { + return ctx.json( + { + success: false, + message: "Asset not found", + }, + 404 + ) + } + + await drizzle + .update(asset) + .set({ + viewCount: sql`${asset.downloadCount} + 1`, + }) + .where(eq(asset.id, assetId)) + + return ctx.json({ + success: true, + downloadUrl: foundAsset.url, + }) + }) +} diff --git a/src/v2/routes/asset/handler.ts b/src/v2/routes/asset/handler.ts index e50c75d..c47b5b0 100644 --- a/src/v2/routes/asset/handler.ts +++ b/src/v2/routes/asset/handler.ts @@ -8,6 +8,7 @@ import { GetAssetLikesRoute } from "./get-users-asset-likes" import { ModifyAssetRoute } from "./modify-asset" import { UploadAssetRoute } from "./upload-asset" import { DeleteAssetByIdRoute } from "./delete-asset" +import { DownloadAssetRoute } from "./download-asset" import { ViewAssetCommentsRoute } from "./get-asset-comments" @@ -17,6 +18,7 @@ AssetSearchAllFilterRoute(handler) UploadAssetRoute(handler) GetAssetByIdRoute(handler) +DownloadAssetRoute(handler) ModifyAssetRoute(handler) DeleteAssetByIdRoute(handler) diff --git a/src/v2/routes/contributors/all-contributors.ts b/src/v2/routes/contributors/all-contributors.ts index 50be279..168fd0e 100644 --- a/src/v2/routes/contributors/all-contributors.ts +++ b/src/v2/routes/contributors/all-contributors.ts @@ -13,6 +13,8 @@ const contributorListSchema = z.object({ id: true, username: true, avatarUrl: true, + displayName: true, + usernameColour: true, plan: true, role: true, }) @@ -48,6 +50,8 @@ export const AllContributorsRoute = (handler: AppHandler) => { id: authUser.id, username: authUser.username, avatarUrl: authUser.avatarUrl, + displayName: authUser.displayName, + usernameColour: authUser.usernameColour, plan: authUser.plan, role: authUser.role, }) From 57667af59c03f5c880f1d75d1ba675d3eb8763fe Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 17 Mar 2024 08:03:50 +0000 Subject: [PATCH 285/318] add summary to all openapi routes --- src/openapi/config.ts | 2 +- src/v2/routes/asset/delete-asset.ts | 1 + src/v2/routes/asset/download-asset.ts | 1 + src/v2/routes/asset/get-asset-comments.ts | 1 + src/v2/routes/asset/get-asset.ts | 1 + src/v2/routes/asset/get-users-asset-likes.ts | 3 ++- src/v2/routes/asset/like-asset.ts | 1 + src/v2/routes/asset/modify-asset.ts | 1 + src/v2/routes/asset/search-assets.ts | 1 + src/v2/routes/asset/unlike-asset.ts | 1 + src/v2/routes/asset/upload-asset.ts | 1 + src/v2/routes/auth/account-create.ts | 1 + src/v2/routes/auth/account-login.ts | 1 + src/v2/routes/auth/get-all-sessions.ts | 1 + src/v2/routes/auth/invalidate-session.ts | 1 + src/v2/routes/auth/logout-current-session.ts | 1 + src/v2/routes/auth/validate-current-session.ts | 1 + src/v2/routes/contributors/all-contributors.ts | 1 + src/v2/routes/game/all-games.ts | 1 + src/v2/routes/game/create-game.ts | 1 + src/v2/routes/game/delete-game.ts | 1 + src/v2/routes/game/get-game.ts | 1 + src/v2/routes/game/modify-game.ts | 1 + src/v2/routes/requests/all-requests.ts | 1 + src/v2/routes/requests/create-request.ts | 1 + src/v2/routes/requests/delete-request.ts | 1 + src/v2/routes/requests/remove-request-upvote.ts | 1 + src/v2/routes/requests/upvote-request.ts | 1 + src/v2/routes/requests/view-request.ts | 1 + src/v2/routes/user/follow-user.ts | 1 + src/v2/routes/user/get-user.ts | 1 + src/v2/routes/user/search-users.ts | 1 + src/v2/routes/user/unfollow-user.ts | 1 + src/v2/routes/user/user-followers.ts | 1 + src/v2/routes/user/user-following.ts | 1 + 35 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/openapi/config.ts b/src/openapi/config.ts index 6ef0304..d4814fd 100644 --- a/src/openapi/config.ts +++ b/src/openapi/config.ts @@ -5,7 +5,7 @@ export const OpenAPIConfig: OpenAPIObjectConfig = { info: { version: "2.0.0", title: "api.wanderer.moe", - description: `Public Zod OpenAPI documentation for wanderer.moe's API. This API is used to power the website & all routes are documented.`, + description: `Public Zod OpenAPI documentation for wanderer.moe's API. This API is used to power the website & all routes are documented. Rate limits are imposed to prevent abuse.`, license: { name: "GNU General Public License v3.0", url: "https://www.gnu.org/licenses/gpl-3.0.en.html", diff --git a/src/v2/routes/asset/delete-asset.ts b/src/v2/routes/asset/delete-asset.ts index caaef55..f074ed5 100644 --- a/src/v2/routes/asset/delete-asset.ts +++ b/src/v2/routes/asset/delete-asset.ts @@ -25,6 +25,7 @@ const deleteAssetByIdResponseSchema = z.object({ const deleteAssetByIdRoute = createRoute({ path: "/{id}/delete", method: "delete", + summary: "Delete an asset", description: "Delete an asset from their ID. Must be the owner of the asset or an admin.", tags: ["Asset"], diff --git a/src/v2/routes/asset/download-asset.ts b/src/v2/routes/asset/download-asset.ts index 77f26b8..bce112c 100644 --- a/src/v2/routes/asset/download-asset.ts +++ b/src/v2/routes/asset/download-asset.ts @@ -25,6 +25,7 @@ const downloadAssetByIdResponseSchema = z.object({ const downloadAssetByIdRoute = createRoute({ path: "/{id}/download", method: "get", + summary: "Download an asset", description: "Download an asset by their ID.", tags: ["Asset"], request: { diff --git a/src/v2/routes/asset/get-asset-comments.ts b/src/v2/routes/asset/get-asset-comments.ts index a26ac36..ad93fe4 100644 --- a/src/v2/routes/asset/get-asset-comments.ts +++ b/src/v2/routes/asset/get-asset-comments.ts @@ -52,6 +52,7 @@ const getAssetCommentsResponseSchema = z.object({ const getAssetCommentsRoute = createRoute({ path: "/{id}/comments", method: "get", + summary: "Get an asset's comments", description: "Get an asset's comments.", tags: ["Asset"], request: { diff --git a/src/v2/routes/asset/get-asset.ts b/src/v2/routes/asset/get-asset.ts index 8ac39e2..0a27308 100644 --- a/src/v2/routes/asset/get-asset.ts +++ b/src/v2/routes/asset/get-asset.ts @@ -73,6 +73,7 @@ const getAssetByIdResponseSchema = z.object({ const getAssetByIdRoute = createRoute({ path: "/{id}", method: "get", + summary: "Get an asset", description: "Get an asset by their ID.", tags: ["Asset"], request: { diff --git a/src/v2/routes/asset/get-users-asset-likes.ts b/src/v2/routes/asset/get-users-asset-likes.ts index e6f1f0e..c2823a6 100644 --- a/src/v2/routes/asset/get-users-asset-likes.ts +++ b/src/v2/routes/asset/get-users-asset-likes.ts @@ -29,7 +29,8 @@ const allAssetLikesSchema = z.object({ const allAssetLikesRoute = createRoute({ path: "/likes", method: "get", - description: "All your liked assets.", + summary: "Your liked assets", + description: "List of all your liked assets.", tags: ["Asset"], responses: { 200: { diff --git a/src/v2/routes/asset/like-asset.ts b/src/v2/routes/asset/like-asset.ts index 95269f2..be38694 100644 --- a/src/v2/routes/asset/like-asset.ts +++ b/src/v2/routes/asset/like-asset.ts @@ -26,6 +26,7 @@ const likeAssetByIdResponseSchema = z.object({ const likeAssetByIdRoute = createRoute({ path: "/{id}/like", method: "post", + summary: "Like an asset", description: "Like an asset from their ID.", tags: ["Asset"], request: { diff --git a/src/v2/routes/asset/modify-asset.ts b/src/v2/routes/asset/modify-asset.ts index e3f8bc8..8ab9af5 100644 --- a/src/v2/routes/asset/modify-asset.ts +++ b/src/v2/routes/asset/modify-asset.ts @@ -59,6 +59,7 @@ const modifyAssetResponseSchema = z.object({ const modifyAssetRoute = createRoute({ path: "/{id}/modify", method: "patch", + summary: "Modify an asset", description: "Modify an existing asset.", tags: ["Asset"], request: { diff --git a/src/v2/routes/asset/search-assets.ts b/src/v2/routes/asset/search-assets.ts index d7b33bd..317bfc1 100644 --- a/src/v2/routes/asset/search-assets.ts +++ b/src/v2/routes/asset/search-assets.ts @@ -97,6 +97,7 @@ export type assetSearchAllFilter = z.infer const assetSearchAllFilterRoute = createRoute({ path: "/search", method: "get", + summary: "Search for assets", description: "Filter all assets", tags: ["Asset"], request: { diff --git a/src/v2/routes/asset/unlike-asset.ts b/src/v2/routes/asset/unlike-asset.ts index c19e570..89a9372 100644 --- a/src/v2/routes/asset/unlike-asset.ts +++ b/src/v2/routes/asset/unlike-asset.ts @@ -26,6 +26,7 @@ const unlikeAssetByIdResponseSchema = z.object({ const unlikeAssetByIdRoute = createRoute({ path: "/{id}/unlike", method: "post", + summary: "Unlike an asset", description: "Unlike an asset from their ID.", tags: ["Asset"], request: { diff --git a/src/v2/routes/asset/upload-asset.ts b/src/v2/routes/asset/upload-asset.ts index 81f3f61..20058be 100644 --- a/src/v2/routes/asset/upload-asset.ts +++ b/src/v2/routes/asset/upload-asset.ts @@ -65,6 +65,7 @@ const uploadAssetResponseSchema = z.object({ const uploadAssetRoute = createRoute({ path: "/upload", method: "post", + summary: "Upload an asset", description: "Upload a new asset.", tags: ["Asset"], request: { diff --git a/src/v2/routes/auth/account-create.ts b/src/v2/routes/auth/account-create.ts index f53226f..970be21 100644 --- a/src/v2/routes/auth/account-create.ts +++ b/src/v2/routes/auth/account-create.ts @@ -31,6 +31,7 @@ const createAccountResponseSchema = z.object({ const userCreateAccountRoute = createRoute({ path: "/create", method: "post", + summary: "Create a new account", description: "Create a new user account with an email and password.", tags: ["Auth"], request: { diff --git a/src/v2/routes/auth/account-login.ts b/src/v2/routes/auth/account-login.ts index 13ea9e0..597d5d4 100644 --- a/src/v2/routes/auth/account-login.ts +++ b/src/v2/routes/auth/account-login.ts @@ -27,6 +27,7 @@ const loginResponseSchema = z.object({ export const userLoginRoute = createRoute({ path: "/login", method: "post", + summary: "Login", description: "Login to a user with an email and password.", tags: ["Auth"], request: { diff --git a/src/v2/routes/auth/get-all-sessions.ts b/src/v2/routes/auth/get-all-sessions.ts index e39dadb..17a06e1 100644 --- a/src/v2/routes/auth/get-all-sessions.ts +++ b/src/v2/routes/auth/get-all-sessions.ts @@ -18,6 +18,7 @@ const sessionListSchema = z.object({ const authAllCurrentSessions = createRoute({ path: "/sessions", method: "get", + summary: "Get all current sessions", description: "Get all current sessions.", tags: ["Auth"], responses: { diff --git a/src/v2/routes/auth/invalidate-session.ts b/src/v2/routes/auth/invalidate-session.ts index 6163188..0a7e2db 100644 --- a/src/v2/routes/auth/invalidate-session.ts +++ b/src/v2/routes/auth/invalidate-session.ts @@ -24,6 +24,7 @@ const invalidateSessionResponseSchema = z.object({ const invalidateSessionRoute = createRoute({ path: "/invalidate/{id}", method: "get", + summary: "Invalidate a session", description: "Invalidate a session by its ID.", tags: ["Auth"], request: { diff --git a/src/v2/routes/auth/logout-current-session.ts b/src/v2/routes/auth/logout-current-session.ts index 315c95f..5973eab 100644 --- a/src/v2/routes/auth/logout-current-session.ts +++ b/src/v2/routes/auth/logout-current-session.ts @@ -12,6 +12,7 @@ const logoutResponseSchema = z.object({ const authLogoutRoute = createRoute({ path: "/logout", method: "get", + summary: "Logout", description: "Logout current session.", tags: ["Auth"], responses: { diff --git a/src/v2/routes/auth/validate-current-session.ts b/src/v2/routes/auth/validate-current-session.ts index 18e3a81..c4ac625 100644 --- a/src/v2/routes/auth/validate-current-session.ts +++ b/src/v2/routes/auth/validate-current-session.ts @@ -13,6 +13,7 @@ const authValidationSchema = z.object({ const authValidationRoute = createRoute({ path: "/validate", method: "get", + summary: "Validate current session", description: "Validate current session.", tags: ["Auth"], responses: { diff --git a/src/v2/routes/contributors/all-contributors.ts b/src/v2/routes/contributors/all-contributors.ts index 168fd0e..9ef28cc 100644 --- a/src/v2/routes/contributors/all-contributors.ts +++ b/src/v2/routes/contributors/all-contributors.ts @@ -24,6 +24,7 @@ const contributorListSchema = z.object({ const contributorsRoute = createRoute({ path: "/all", method: "get", + summary: "Get all contributors", description: "Get a list of all contributors.", tags: ["Contributors"], responses: { diff --git a/src/v2/routes/game/all-games.ts b/src/v2/routes/game/all-games.ts index 87b13c8..15633a4 100644 --- a/src/v2/routes/game/all-games.ts +++ b/src/v2/routes/game/all-games.ts @@ -14,6 +14,7 @@ export const getAllGamesResponse = z.object({ const getAllGamesRoute = createRoute({ path: "/all", method: "get", + summary: "Get all games", description: "Get all games.", tags: ["Game"], responses: { diff --git a/src/v2/routes/game/create-game.ts b/src/v2/routes/game/create-game.ts index a1fb66c..5a93a97 100644 --- a/src/v2/routes/game/create-game.ts +++ b/src/v2/routes/game/create-game.ts @@ -38,6 +38,7 @@ export const createGameResponse = z.object({ const createGameRoute = createRoute({ path: "/create", method: "post", + summary: "Create a game", description: "Create a new game.", tags: ["Game"], request: { diff --git a/src/v2/routes/game/delete-game.ts b/src/v2/routes/game/delete-game.ts index 901baed..e8a02d5 100644 --- a/src/v2/routes/game/delete-game.ts +++ b/src/v2/routes/game/delete-game.ts @@ -26,6 +26,7 @@ export const deleteGameResponse = z.object({ const deleteGameRoute = createRoute({ path: "/{id}/delete", method: "delete", + summary: "Delete a game", description: "Delete a game & all its related assets.", tags: ["Game"], request: { diff --git a/src/v2/routes/game/get-game.ts b/src/v2/routes/game/get-game.ts index 6295c06..c59a690 100644 --- a/src/v2/routes/game/get-game.ts +++ b/src/v2/routes/game/get-game.ts @@ -27,6 +27,7 @@ const getGameByIDResponse = z.object({ const getGameByIdRoute = createRoute({ path: "/{id}", method: "get", + summary: "Get a game", description: "Get a game by their ID.", tags: ["Game"], request: { diff --git a/src/v2/routes/game/modify-game.ts b/src/v2/routes/game/modify-game.ts index d885d5a..79c6052 100644 --- a/src/v2/routes/game/modify-game.ts +++ b/src/v2/routes/game/modify-game.ts @@ -50,6 +50,7 @@ const modifyGameResponseSchema = z.object({ export const modifyGameRoute = createRoute({ path: "/{id}/modify", method: "patch", + summary: "Modify a game", description: "Modify an existing game.", tags: ["Game"], request: { diff --git a/src/v2/routes/requests/all-requests.ts b/src/v2/routes/requests/all-requests.ts index 6699ca4..5557955 100644 --- a/src/v2/routes/requests/all-requests.ts +++ b/src/v2/routes/requests/all-requests.ts @@ -34,6 +34,7 @@ const viewAllRequestsResponseSchema = z.object({ const getAllRequestsRoute = createRoute({ path: "/all", method: "get", + summary: "Get all requests", description: "Get all requests & associated upvotes count. Supporter required.", tags: ["Requests"], diff --git a/src/v2/routes/requests/create-request.ts b/src/v2/routes/requests/create-request.ts index 0ff942d..232dc3a 100644 --- a/src/v2/routes/requests/create-request.ts +++ b/src/v2/routes/requests/create-request.ts @@ -36,6 +36,7 @@ const createRequestFormEntryResponse = z.object({ const createRequestFormEntryRoute = createRoute({ path: "/create", method: "post", + summary: "Create request entry", description: "Create a new entry into the request form. Supporter required.", tags: ["Requests"], diff --git a/src/v2/routes/requests/delete-request.ts b/src/v2/routes/requests/delete-request.ts index fc9df68..63d9f34 100644 --- a/src/v2/routes/requests/delete-request.ts +++ b/src/v2/routes/requests/delete-request.ts @@ -26,6 +26,7 @@ export const deleteRequestByIdResponseSchema = z.object({ const deleteRequestByIdRoute = createRoute({ path: "/{id}/delete", method: "delete", + summary: "Delete a request", description: "Delete a request by its ID. This will also delete all associated upvotes.", tags: ["Requests"], diff --git a/src/v2/routes/requests/remove-request-upvote.ts b/src/v2/routes/requests/remove-request-upvote.ts index afe244c..92d10b0 100644 --- a/src/v2/routes/requests/remove-request-upvote.ts +++ b/src/v2/routes/requests/remove-request-upvote.ts @@ -26,6 +26,7 @@ export const removeRequestUpvoteByIdResponseSchema = z.object({ const removeRequestUpvoteByIdRoute = createRoute({ path: "/{id}/downvote", method: "post", + summary: "Remove upvote on a request", description: "Remove a upvote on a request by its ID. Supporter required.", tags: ["Requests"], request: { diff --git a/src/v2/routes/requests/upvote-request.ts b/src/v2/routes/requests/upvote-request.ts index ea23d7b..c6f1fe2 100644 --- a/src/v2/routes/requests/upvote-request.ts +++ b/src/v2/routes/requests/upvote-request.ts @@ -26,6 +26,7 @@ export const upvoteRequestByIdResponseSchema = z.object({ const upvoteRequestByIdRoute = createRoute({ path: "/{id}/upvote", method: "post", + summary: "Upvote a request", description: "Upvote a request by its ID. Supporter required.", tags: ["Requests"], request: { diff --git a/src/v2/routes/requests/view-request.ts b/src/v2/routes/requests/view-request.ts index c0d860e..f1560d8 100644 --- a/src/v2/routes/requests/view-request.ts +++ b/src/v2/routes/requests/view-request.ts @@ -27,6 +27,7 @@ export const viewRequestByIdResponseSchema = z.object({ const viewRequestByIdRoute = createRoute({ path: "/{id}", method: "get", + summary: "View a request", description: "View a request by its ID. Supporter required.", tags: ["Requests"], request: { diff --git a/src/v2/routes/user/follow-user.ts b/src/v2/routes/user/follow-user.ts index cf3925d..2a0d44c 100644 --- a/src/v2/routes/user/follow-user.ts +++ b/src/v2/routes/user/follow-user.ts @@ -25,6 +25,7 @@ const followUserByIdResponseSchema = z.object({ export const followUserByIdRoute = createRoute({ path: "/{id}/follow", method: "post", + summary: "Follow a user", description: "Follow a user from their ID.", tags: ["User"], request: { diff --git a/src/v2/routes/user/get-user.ts b/src/v2/routes/user/get-user.ts index 4c22f66..2834bbd 100644 --- a/src/v2/routes/user/get-user.ts +++ b/src/v2/routes/user/get-user.ts @@ -38,6 +38,7 @@ const getUserByIdResponseSchema = z.object({ const getUserByIdRoute = createRoute({ path: "/{id}", method: "get", + summary: "Get a user", description: "Get a user by their ID.", tags: ["User"], request: { diff --git a/src/v2/routes/user/search-users.ts b/src/v2/routes/user/search-users.ts index 8a120a6..98cc4b5 100644 --- a/src/v2/routes/user/search-users.ts +++ b/src/v2/routes/user/search-users.ts @@ -40,6 +40,7 @@ const searchUsersByUsernameSchema = z.object({ const searchUsersByUsernameRoute = createRoute({ path: "/search/{username}", method: "get", + summary: "Search for users", description: "Search for users by their username.", tags: ["User"], request: { diff --git a/src/v2/routes/user/unfollow-user.ts b/src/v2/routes/user/unfollow-user.ts index 5fe1e5c..b8ed00f 100644 --- a/src/v2/routes/user/unfollow-user.ts +++ b/src/v2/routes/user/unfollow-user.ts @@ -25,6 +25,7 @@ const unfollowUserByIdResponseSchema = z.object({ const unFollowUserByIdRoute = createRoute({ path: "/{id}/unfollow", method: "post", + summary: "Unfollow a user", description: "Follow a user from their ID.", tags: ["User"], request: { diff --git a/src/v2/routes/user/user-followers.ts b/src/v2/routes/user/user-followers.ts index 84f4c8c..05828fb 100644 --- a/src/v2/routes/user/user-followers.ts +++ b/src/v2/routes/user/user-followers.ts @@ -49,6 +49,7 @@ export const viewUserFollowsbyIdResponseSchema = z.object({ const viewUserFollowsByIdRoute = createRoute({ path: "/{id}/followers", method: "get", + summary: "View a user's followers", description: "View a user's followers from their ID.", tags: ["User"], request: { diff --git a/src/v2/routes/user/user-following.ts b/src/v2/routes/user/user-following.ts index c5b227d..63db50c 100644 --- a/src/v2/routes/user/user-following.ts +++ b/src/v2/routes/user/user-following.ts @@ -49,6 +49,7 @@ const viewUserfollowingbyIdResponseSchema = z.object({ const viewUserfollowingbyIdRoute = createRoute({ path: "/{id}/following", method: "get", + summary: "View who a user's following", description: "View who a user's following from their ID.", tags: ["User"], request: { From d7f12db92996b0a80577d3b3c7ccba3592898d5c Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 17 Mar 2024 17:39:43 +0000 Subject: [PATCH 286/318] tag routes --- .../all-categories.ts} | 0 src/v2/routes/category/create-category.ts | 0 src/v2/routes/category/delete-category.ts | 0 src/v2/routes/category/modify-category.ts | 0 src/v2/routes/category/view-category.ts | 0 src/v2/routes/collection/get-collection.ts | 0 src/v2/routes/collection/like-collection.ts | 0 src/v2/routes/collection/unlike-collection.ts | 0 src/v2/routes/handler.ts | 2 + src/v2/routes/tags/all-tags.ts | 47 +++++++ src/v2/routes/tags/create-tag.ts | 108 ++++++++++++++++ src/v2/routes/tags/delete-tag.ts | 91 +++++++++++++ src/v2/routes/tags/get-tag.ts | 78 +++++++++++ src/v2/routes/tags/handler.ts | 16 +++ src/v2/routes/tags/modify-tag.ts | 121 ++++++++++++++++++ 15 files changed, 463 insertions(+) rename src/v2/routes/{collection/view-collection.ts => category/all-categories.ts} (100%) create mode 100644 src/v2/routes/category/create-category.ts create mode 100644 src/v2/routes/category/delete-category.ts create mode 100644 src/v2/routes/category/modify-category.ts create mode 100644 src/v2/routes/category/view-category.ts create mode 100644 src/v2/routes/collection/get-collection.ts create mode 100644 src/v2/routes/collection/like-collection.ts create mode 100644 src/v2/routes/collection/unlike-collection.ts create mode 100644 src/v2/routes/tags/all-tags.ts create mode 100644 src/v2/routes/tags/create-tag.ts create mode 100644 src/v2/routes/tags/delete-tag.ts create mode 100644 src/v2/routes/tags/get-tag.ts create mode 100644 src/v2/routes/tags/handler.ts create mode 100644 src/v2/routes/tags/modify-tag.ts diff --git a/src/v2/routes/collection/view-collection.ts b/src/v2/routes/category/all-categories.ts similarity index 100% rename from src/v2/routes/collection/view-collection.ts rename to src/v2/routes/category/all-categories.ts diff --git a/src/v2/routes/category/create-category.ts b/src/v2/routes/category/create-category.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/category/delete-category.ts b/src/v2/routes/category/delete-category.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/category/modify-category.ts b/src/v2/routes/category/modify-category.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/category/view-category.ts b/src/v2/routes/category/view-category.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/collection/get-collection.ts b/src/v2/routes/collection/get-collection.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/collection/like-collection.ts b/src/v2/routes/collection/like-collection.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/collection/unlike-collection.ts b/src/v2/routes/collection/unlike-collection.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/handler.ts b/src/v2/routes/handler.ts index 5be228e..194f9d6 100644 --- a/src/v2/routes/handler.ts +++ b/src/v2/routes/handler.ts @@ -2,6 +2,7 @@ import { OpenAPIHono } from "@hono/zod-openapi" import UserRoute from "@/v2/routes/user/handler" import GameRoute from "@/v2/routes/game/handler" import AssetRoute from "@/v2/routes/asset/handler" +import TagRoute from "@/v2/routes/tags/handler" import ContributorRoute from "@/v2/routes/contributors/handler" import AuthRoute from "@/v2/routes/auth/handler" import RequestFormRoute from "@/v2/routes/requests/handler" @@ -10,6 +11,7 @@ const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.route("/game", GameRoute) handler.route("/asset", AssetRoute) +handler.route("/tags", TagRoute) handler.route("/user", UserRoute) handler.route("/contributors", ContributorRoute) handler.route("/auth", AuthRoute) diff --git a/src/v2/routes/tags/all-tags.ts b/src/v2/routes/tags/all-tags.ts new file mode 100644 index 0000000..f689594 --- /dev/null +++ b/src/v2/routes/tags/all-tags.ts @@ -0,0 +1,47 @@ +import { AppHandler } from "../handler" +import { getConnection } from "@/v2/db/turso" +import { assetTag } from "@/v2/db/schema" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { createRoute } from "@hono/zod-openapi" +import { z } from "@hono/zod-openapi" +import { selectAssetTagSchema } from "@/v2/db/schema" + +export const getAllTagsResponse = z.object({ + success: z.literal(true), + tags: selectAssetTagSchema.array(), +}) + +const getAllTagsRoute = createRoute({ + path: "/all", + method: "get", + summary: "Get all tags", + description: "Get all tags.", + tags: ["Tags"], + responses: { + 200: { + description: "All games.", + content: { + "application/json": { + schema: getAllTagsResponse, + }, + }, + }, + ...GenericResponses, + }, +}) + +export const AllTagsRoute = (handler: AppHandler) => { + handler.openapi(getAllTagsRoute, async (ctx) => { + const { drizzle } = await getConnection(ctx.env) + + const tags = (await drizzle.select().from(assetTag)) ?? [] + + return ctx.json( + { + success: true, + tags, + }, + 200 + ) + }) +} diff --git a/src/v2/routes/tags/create-tag.ts b/src/v2/routes/tags/create-tag.ts new file mode 100644 index 0000000..5e0e3fe --- /dev/null +++ b/src/v2/routes/tags/create-tag.ts @@ -0,0 +1,108 @@ +import { AppHandler } from "../handler" +import { assetTag, game } from "@/v2/db/schema" +import { eq } from "drizzle-orm" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +import { getConnection } from "@/v2/db/turso" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" +import { selectAssetTagSchema } from "@/v2/db/schema" + +export const createTagSchema = z.object({ + name: z.string().min(3).max(32).openapi({ + description: "The name of the tag.", + example: "official", + }), + formattedName: z.string().min(3).max(64).openapi({ + description: "The formatted name of the tag.", + example: "Official", + }), +}) + +export const createTagResponse = z.object({ + success: z.literal(true), + tag: selectAssetTagSchema, +}) + +const createTagRoute = createRoute({ + path: "/create", + method: "post", + summary: "Create a tag", + description: "Create a new tag.", + tags: ["Tags"], + request: { + body: { + content: { + "application/json": { + schema: createTagSchema, + }, + }, + }, + }, + responses: { + 200: { + description: "Returns the new tag.", + content: { + "application/json": { + schema: createTagResponse, + }, + }, + }, + ...GenericResponses, + }, +}) + +export const CreateTagRoute = (handler: AppHandler) => { + handler.openapi(createTagRoute, async (ctx) => { + const authSessionManager = new AuthSessionManager(ctx) + + const { user } = await authSessionManager.validateSession() + + if (!user || user.role != "creator") { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + const { name, formattedName } = ctx.req.valid("json") + + const { drizzle } = getConnection(ctx.env) + + const [tagExists] = await drizzle + .select({ name: assetTag.name }) + .from(assetTag) + .where(eq(assetTag.name, name)) + + if (tagExists) { + return ctx.json( + { + success: false, + message: "Tag already exists", + }, + 400 + ) + } + + const [newTag] = await drizzle + .insert(game) + .values({ + id: name, + name, + formattedName, + lastUpdated: new Date().toISOString(), + }) + .returning() + + return ctx.json( + { + success: true, + tag: newTag, + }, + 200 + ) + }) +} diff --git a/src/v2/routes/tags/delete-tag.ts b/src/v2/routes/tags/delete-tag.ts new file mode 100644 index 0000000..37600ea --- /dev/null +++ b/src/v2/routes/tags/delete-tag.ts @@ -0,0 +1,91 @@ +import { AppHandler } from "../handler" +import { getConnection } from "@/v2/db/turso" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +import { assetTag } from "@/v2/db/schema" +import { eq } from "drizzle-orm" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" + +export const deleteTagSchema = z.object({ + id: z.string().openapi({ + param: { + name: "id", + in: "path", + description: "The ID of the tag to delete.", + example: "official", + required: true, + }, + }), +}) + +export const deleteTagResponseSchema = z.object({ + success: z.literal(true), +}) + +const deleteTagRoute = createRoute({ + path: "/{id}/delete", + method: "delete", + summary: "Delete a tag", + description: "Delete a tag.", + tags: ["Tags"], + request: { + params: deleteTagSchema, + }, + responses: { + 200: { + description: "Returns boolean indicating success.", + content: { + "application/json": { + schema: deleteTagResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +export const DeleteTagRoute = (handler: AppHandler) => { + handler.openapi(deleteTagRoute, async (ctx) => { + const id = ctx.req.valid("param").id + + const { drizzle } = await getConnection(ctx.env) + + const [foundTag] = await drizzle + .select({ id: assetTag.id }) + .from(assetTag) + .where(eq(assetTag.id, id)) + + if (!foundTag) { + return ctx.json( + { + success: false, + message: "Game not found", + }, + 400 + ) + } + + const authSessionManager = new AuthSessionManager(ctx) + const { user } = await authSessionManager.validateSession() + + if (!user || user.role != "creator") { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + await drizzle.delete(assetTag).where(eq(assetTag.id, id)) + + return ctx.json( + { + success: true, + }, + 200 + ) + }) +} diff --git a/src/v2/routes/tags/get-tag.ts b/src/v2/routes/tags/get-tag.ts new file mode 100644 index 0000000..c92a2a7 --- /dev/null +++ b/src/v2/routes/tags/get-tag.ts @@ -0,0 +1,78 @@ +import { AppHandler } from "../handler" +import { createRoute } from "@hono/zod-openapi" +import { assetTag } from "@/v2/db/schema" +import { getConnection } from "@/v2/db/turso" +import { eq } from "drizzle-orm" +import { z } from "@hono/zod-openapi" +import { selectAssetTagSchema } from "@/v2/db/schema" +import { GenericResponses } from "@/v2/lib/response-schemas" + +const getTagByIdSchema = z.object({ + id: z.string().openapi({ + param: { + name: "id", + in: "path", + description: "The ID of the tag to retrieve.", + example: "official", + required: true, + }, + }), +}) + +const getTagByIDResponseSchema = z.object({ + success: z.literal(true), + tag: selectAssetTagSchema, +}) + +const getTagByIdRoute = createRoute({ + path: "/{id}", + method: "get", + summary: "Get a tag", + description: "Get tag game by their ID.", + tags: ["Tags"], + request: { + params: getTagByIdSchema, + }, + responses: { + 200: { + description: "Tag was found.", + content: { + "application/json": { + schema: getTagByIDResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +export const GetTagByIdRoute = (handler: AppHandler) => { + handler.openapi(getTagByIdRoute, async (ctx) => { + const id = ctx.req.valid("param").id + + const { drizzle } = await getConnection(ctx.env) + + const [foundTag] = await drizzle + .select() + .from(assetTag) + .where(eq(assetTag.id, id)) + + if (!foundTag) { + return ctx.json( + { + success: false, + message: "Tag not found", + }, + 400 + ) + } + + return ctx.json( + { + success: true, + tag: foundTag, + }, + 200 + ) + }) +} diff --git a/src/v2/routes/tags/handler.ts b/src/v2/routes/tags/handler.ts new file mode 100644 index 0000000..704811f --- /dev/null +++ b/src/v2/routes/tags/handler.ts @@ -0,0 +1,16 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { AllTagsRoute } from "./all-tags" +import { CreateTagRoute } from "./create-tag" +import { GetTagByIdRoute } from "./get-tag" +import { DeleteTagRoute } from "./delete-tag" +import { ModifyTagRoute } from "./modify-tag" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +AllTagsRoute(handler) +GetTagByIdRoute(handler) +CreateTagRoute(handler) +ModifyTagRoute(handler) +DeleteTagRoute(handler) + +export default handler diff --git a/src/v2/routes/tags/modify-tag.ts b/src/v2/routes/tags/modify-tag.ts new file mode 100644 index 0000000..bd629ef --- /dev/null +++ b/src/v2/routes/tags/modify-tag.ts @@ -0,0 +1,121 @@ +import { AppHandler } from "../handler" +import { eq } from "drizzle-orm" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +import { getConnection } from "@/v2/db/turso" +import { assetTag, selectAssetTagSchema } from "@/v2/db/schema" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" + +export const modifyAssetTagPathSchema = z.object({ + id: z.string().openapi({ + param: { + name: "id", + description: "The id of the tag to modify.", + example: "official", + in: "path", + required: true, + }, + }), +}) + +const modifyTagSchema = z.object({ + name: z.string().min(3).max(32).openapi({ + description: "The new name of the tag.", + example: "official", + }), + formattedName: z.string().min(3).max(64).openapi({ + description: "The new formatted name of the tag.", + example: "Official", + }), +}) + +const modifyTagResponseSchema = z.object({ + success: z.literal(true), + tag: selectAssetTagSchema, +}) + +export const modifyTagRoute = createRoute({ + path: "/{id}/modify", + method: "patch", + summary: "Modify a tag", + description: "Modify an existing tag.", + tags: ["Tags"], + request: { + params: modifyAssetTagPathSchema, + body: { + content: { + "application/json": { + schema: modifyTagSchema, + }, + }, + }, + }, + responses: { + 200: { + description: "Returns the tag's attributes", + content: { + "application/json": { + schema: modifyTagResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +export const ModifyTagRoute = (handler: AppHandler) => { + handler.openapi(modifyTagRoute, async (ctx) => { + const authSessionManager = new AuthSessionManager(ctx) + + const { user } = await authSessionManager.validateSession() + + if (!user || user.role != "creator") { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + const { name, formattedName } = ctx.req.valid("json") + const { id } = ctx.req.valid("param") + + const { drizzle } = getConnection(ctx.env) + + const [existingTag] = await drizzle + .select({ id: assetTag.id }) + .from(assetTag) + .where(eq(assetTag.id, id)) + + if (!existingTag.id) { + return ctx.json( + { + success: false, + message: "Game with ID not found", + }, + 400 + ) + } + + const [updatedTag] = await drizzle + .update(assetTag) + .set({ + name, + formattedName, + lastUpdated: new Date().toISOString(), + }) + .where(eq(assetTag.id, id)) + .returning() + + return ctx.json( + { + success: true, + tag: updatedTag, + }, + 200 + ) + }) +} From 5809f87846f5e610c41c0dfcfba5246df9d8e617 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 17 Mar 2024 17:41:25 +0000 Subject: [PATCH 287/318] oh --- src/v2/routes/tags/all-tags.ts | 2 +- src/v2/routes/tags/create-tag.ts | 4 ++-- src/v2/routes/tags/delete-tag.ts | 2 +- src/v2/routes/tags/get-tag.ts | 2 +- src/v2/routes/tags/modify-tag.ts | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/v2/routes/tags/all-tags.ts b/src/v2/routes/tags/all-tags.ts index f689594..84822ac 100644 --- a/src/v2/routes/tags/all-tags.ts +++ b/src/v2/routes/tags/all-tags.ts @@ -19,7 +19,7 @@ const getAllTagsRoute = createRoute({ tags: ["Tags"], responses: { 200: { - description: "All games.", + description: "All tags.", content: { "application/json": { schema: getAllTagsResponse, diff --git a/src/v2/routes/tags/create-tag.ts b/src/v2/routes/tags/create-tag.ts index 5e0e3fe..c9d1efb 100644 --- a/src/v2/routes/tags/create-tag.ts +++ b/src/v2/routes/tags/create-tag.ts @@ -1,5 +1,5 @@ import { AppHandler } from "../handler" -import { assetTag, game } from "@/v2/db/schema" +import { assetTag } from "@/v2/db/schema" import { eq } from "drizzle-orm" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" import { getConnection } from "@/v2/db/turso" @@ -88,7 +88,7 @@ export const CreateTagRoute = (handler: AppHandler) => { } const [newTag] = await drizzle - .insert(game) + .insert(assetTag) .values({ id: name, name, diff --git a/src/v2/routes/tags/delete-tag.ts b/src/v2/routes/tags/delete-tag.ts index 37600ea..76b0023 100644 --- a/src/v2/routes/tags/delete-tag.ts +++ b/src/v2/routes/tags/delete-tag.ts @@ -60,7 +60,7 @@ export const DeleteTagRoute = (handler: AppHandler) => { return ctx.json( { success: false, - message: "Game not found", + message: "Tag not found", }, 400 ) diff --git a/src/v2/routes/tags/get-tag.ts b/src/v2/routes/tags/get-tag.ts index c92a2a7..1f0699e 100644 --- a/src/v2/routes/tags/get-tag.ts +++ b/src/v2/routes/tags/get-tag.ts @@ -28,7 +28,7 @@ const getTagByIdRoute = createRoute({ path: "/{id}", method: "get", summary: "Get a tag", - description: "Get tag game by their ID.", + description: "Get tag by their ID.", tags: ["Tags"], request: { params: getTagByIdSchema, diff --git a/src/v2/routes/tags/modify-tag.ts b/src/v2/routes/tags/modify-tag.ts index bd629ef..42a6f52 100644 --- a/src/v2/routes/tags/modify-tag.ts +++ b/src/v2/routes/tags/modify-tag.ts @@ -94,7 +94,7 @@ export const ModifyTagRoute = (handler: AppHandler) => { return ctx.json( { success: false, - message: "Game with ID not found", + message: "Tag with ID not found", }, 400 ) From 63f191aa95f6b5e280e43308e169d16c808cd5e8 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 17 Mar 2024 18:12:30 +0000 Subject: [PATCH 288/318] category routes impl --- src/v2/routes/category/all-categories.ts | 48 +++++++++ src/v2/routes/category/create-category.ts | 108 +++++++++++++++++++ src/v2/routes/category/delete-category.ts | 91 ++++++++++++++++ src/v2/routes/category/get-category.ts | 78 ++++++++++++++ src/v2/routes/category/handler.ts | 16 +++ src/v2/routes/category/modify-category.ts | 120 ++++++++++++++++++++++ src/v2/routes/category/view-category.ts | 0 src/v2/routes/handler.ts | 2 + 8 files changed, 463 insertions(+) create mode 100644 src/v2/routes/category/get-category.ts create mode 100644 src/v2/routes/category/handler.ts delete mode 100644 src/v2/routes/category/view-category.ts diff --git a/src/v2/routes/category/all-categories.ts b/src/v2/routes/category/all-categories.ts index e69de29..8298568 100644 --- a/src/v2/routes/category/all-categories.ts +++ b/src/v2/routes/category/all-categories.ts @@ -0,0 +1,48 @@ +import { AppHandler } from "../handler" +import { getConnection } from "@/v2/db/turso" +import { assetCategory } from "@/v2/db/schema" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { createRoute } from "@hono/zod-openapi" +import { z } from "@hono/zod-openapi" +import { selectAssetCategorySchema } from "@/v2/db/schema" + +export const getAllCategoriesResponseSchema = z.object({ + success: z.literal(true), + categories: selectAssetCategorySchema.array(), +}) + +const getAllCategoriesRoute = createRoute({ + path: "/all", + method: "get", + summary: "Get all categories", + description: "Get all categories.", + tags: ["Category"], + responses: { + 200: { + description: "All categories.", + content: { + "application/json": { + schema: getAllCategoriesResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +export const AllCategoriesRoute = (handler: AppHandler) => { + handler.openapi(getAllCategoriesRoute, async (ctx) => { + const { drizzle } = await getConnection(ctx.env) + + const assetCategories = + (await drizzle.select().from(assetCategory)) ?? [] + + return ctx.json( + { + success: true, + categories: assetCategories, + }, + 200 + ) + }) +} diff --git a/src/v2/routes/category/create-category.ts b/src/v2/routes/category/create-category.ts index e69de29..cad0c0d 100644 --- a/src/v2/routes/category/create-category.ts +++ b/src/v2/routes/category/create-category.ts @@ -0,0 +1,108 @@ +import { AppHandler } from "../handler" +import { assetCategory } from "@/v2/db/schema" +import { eq } from "drizzle-orm" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +import { getConnection } from "@/v2/db/turso" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" +import { selectAssetCategorySchema } from "@/v2/db/schema" + +export const createAssetCategorySchema = z.object({ + name: z.string().min(3).max(32).openapi({ + description: "The name of the asset category.", + example: "splash-art", + }), + formattedName: z.string().min(3).max(64).openapi({ + description: "The formatted name of the category.", + example: "Splash Art", + }), +}) + +export const createAssetCategoryResponseSchema = z.object({ + success: z.literal(true), + assetCategory: selectAssetCategorySchema, +}) + +const createAssetCategoryRoute = createRoute({ + path: "/create", + method: "post", + summary: "Create a category", + description: "Create a new category.", + tags: ["Category"], + request: { + body: { + content: { + "application/json": { + schema: createAssetCategorySchema, + }, + }, + }, + }, + responses: { + 200: { + description: "Returns the new category.", + content: { + "application/json": { + schema: createAssetCategoryResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +export const CreateCategoryRoute = (handler: AppHandler) => { + handler.openapi(createAssetCategoryRoute, async (ctx) => { + const authSessionManager = new AuthSessionManager(ctx) + + const { user } = await authSessionManager.validateSession() + + if (!user || user.role != "creator") { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + const { name, formattedName } = ctx.req.valid("json") + + const { drizzle } = getConnection(ctx.env) + + const [categoryExists] = await drizzle + .select({ name: assetCategory.name }) + .from(assetCategory) + .where(eq(assetCategory.name, name)) + + if (categoryExists) { + return ctx.json( + { + success: false, + message: "Category already exists", + }, + 400 + ) + } + + const [newCategory] = await drizzle + .insert(assetCategory) + .values({ + id: name, + name, + formattedName, + lastUpdated: new Date().toISOString(), + }) + .returning() + + return ctx.json( + { + success: true, + assetCategory: newCategory, + }, + 200 + ) + }) +} diff --git a/src/v2/routes/category/delete-category.ts b/src/v2/routes/category/delete-category.ts index e69de29..469e4bd 100644 --- a/src/v2/routes/category/delete-category.ts +++ b/src/v2/routes/category/delete-category.ts @@ -0,0 +1,91 @@ +import { AppHandler } from "../handler" +import { getConnection } from "@/v2/db/turso" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +import { assetCategory } from "@/v2/db/schema" +import { eq } from "drizzle-orm" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" + +export const deleteAssetCategorySchema = z.object({ + id: z.string().openapi({ + param: { + name: "id", + in: "path", + description: "The ID of the category to delete.", + example: "splash-art", + required: true, + }, + }), +}) + +export const deleteAssetCategoryResponseSchema = z.object({ + success: z.literal(true), +}) + +const deleteCategoryRoute = createRoute({ + path: "/{id}/delete", + method: "delete", + summary: "Delete a category", + description: "Delete a category.", + tags: ["Category"], + request: { + params: deleteAssetCategorySchema, + }, + responses: { + 200: { + description: "Returns boolean indicating success.", + content: { + "application/json": { + schema: deleteAssetCategoryResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +export const DeleteAssetCategoryRoute = (handler: AppHandler) => { + handler.openapi(deleteCategoryRoute, async (ctx) => { + const id = ctx.req.valid("param").id + + const { drizzle } = await getConnection(ctx.env) + + const [foundCategory] = await drizzle + .select({ id: assetCategory.id }) + .from(assetCategory) + .where(eq(assetCategory.id, id)) + + if (!foundCategory) { + return ctx.json( + { + success: false, + message: "Category not found", + }, + 404 + ) + } + + const authSessionManager = new AuthSessionManager(ctx) + const { user } = await authSessionManager.validateSession() + + if (!user || user.role != "creator") { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + await drizzle.delete(assetCategory).where(eq(assetCategory.id, id)) + + return ctx.json( + { + success: true, + }, + 200 + ) + }) +} diff --git a/src/v2/routes/category/get-category.ts b/src/v2/routes/category/get-category.ts new file mode 100644 index 0000000..c5c839e --- /dev/null +++ b/src/v2/routes/category/get-category.ts @@ -0,0 +1,78 @@ +import { AppHandler } from "../handler" +import { createRoute } from "@hono/zod-openapi" +import { assetCategory } from "@/v2/db/schema" +import { getConnection } from "@/v2/db/turso" +import { eq } from "drizzle-orm" +import { z } from "@hono/zod-openapi" +import { selectAssetCategorySchema } from "@/v2/db/schema" +import { GenericResponses } from "@/v2/lib/response-schemas" + +const getAssetCategoryByIdSchema = z.object({ + id: z.string().openapi({ + param: { + name: "id", + in: "path", + description: "The ID of the category to retrieve.", + example: "splash-art", + required: true, + }, + }), +}) + +const getAssetCategoryByIdResponseSchema = z.object({ + success: z.literal(true), + category: selectAssetCategorySchema, +}) + +const getAssetCategoryByIdRoute = createRoute({ + path: "/{id}", + method: "get", + summary: "Get a category", + description: "Get a category by their ID.", + tags: ["Category"], + request: { + params: getAssetCategoryByIdSchema, + }, + responses: { + 200: { + description: "Category was found.", + content: { + "application/json": { + schema: getAssetCategoryByIdResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +export const GetCategoryByIdRoute = (handler: AppHandler) => { + handler.openapi(getAssetCategoryByIdRoute, async (ctx) => { + const id = ctx.req.valid("param").id + + const { drizzle } = await getConnection(ctx.env) + + const [foundCategory] = await drizzle + .select() + .from(assetCategory) + .where(eq(assetCategory.id, id)) + + if (!foundCategory) { + return ctx.json( + { + success: false, + message: "Category not found", + }, + 400 + ) + } + + return ctx.json( + { + success: true, + category: foundCategory, + }, + 200 + ) + }) +} diff --git a/src/v2/routes/category/handler.ts b/src/v2/routes/category/handler.ts new file mode 100644 index 0000000..909ff67 --- /dev/null +++ b/src/v2/routes/category/handler.ts @@ -0,0 +1,16 @@ +import { OpenAPIHono } from "@hono/zod-openapi" +import { AllCategoriesRoute } from "./all-categories" +import { CreateCategoryRoute } from "./create-category" +import { GetCategoryByIdRoute } from "./get-category" +import { ModifyAssetCategoryRoute } from "./modify-category" +import { DeleteAssetCategoryRoute } from "./delete-category" + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() + +AllCategoriesRoute(handler) +GetCategoryByIdRoute(handler) +CreateCategoryRoute(handler) +ModifyAssetCategoryRoute(handler) +DeleteAssetCategoryRoute(handler) + +export default handler diff --git a/src/v2/routes/category/modify-category.ts b/src/v2/routes/category/modify-category.ts index e69de29..c696e40 100644 --- a/src/v2/routes/category/modify-category.ts +++ b/src/v2/routes/category/modify-category.ts @@ -0,0 +1,120 @@ +import { AppHandler } from "../handler" +import { eq } from "drizzle-orm" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +import { getConnection } from "@/v2/db/turso" +import { assetCategory, selectAssetCategorySchema } from "@/v2/db/schema" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" + +export const modifyAssetCategoryPathSchema = z.object({ + id: z.string().openapi({ + param: { + name: "id", + description: "The id of the category to modify.", + example: "splash-art", + in: "path", + required: true, + }, + }), +}) + +const modifyAssetCategorySchema = z.object({ + name: z.string().min(3).max(32).openapi({ + description: "The new name of the category.", + example: "splash-art", + }), + formattedName: z.string().min(3).max(64).openapi({ + description: "The new formatted name of the category.", + example: "Splash Art", + }), +}) + +const modifyAssetCategoryResponseSchema = z.object({ + success: z.literal(true), + assetCategory: selectAssetCategorySchema, +}) + +export const modifyAssetCategoryRoute = createRoute({ + path: "/{id}/modify", + method: "patch", + summary: "Modify a category", + description: "Modify an existing category.", + tags: ["Category"], + request: { + params: modifyAssetCategoryPathSchema, + body: { + content: { + "application/json": { + schema: modifyAssetCategorySchema, + }, + }, + }, + }, + responses: { + 200: { + description: "Returns the new category attributes", + content: { + "application/json": { + schema: modifyAssetCategoryResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +export const ModifyAssetCategoryRoute = (handler: AppHandler) => { + handler.openapi(modifyAssetCategoryRoute, async (ctx) => { + const authSessionManager = new AuthSessionManager(ctx) + const { user } = await authSessionManager.validateSession() + + if (!user || user.role != "creator") { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + const { name, formattedName } = ctx.req.valid("json") + const { id } = ctx.req.valid("param") + + const { drizzle } = getConnection(ctx.env) + + const [existingCategory] = await drizzle + .select({ id: assetCategory.id }) + .from(assetCategory) + .where(eq(assetCategory.id, id)) + + if (!existingCategory) { + return ctx.json( + { + success: false, + message: "Category not found", + }, + 404 + ) + } + + const [updatedCategory] = await drizzle + .update(assetCategory) + .set({ + name, + formattedName, + lastUpdated: new Date().toISOString(), + }) + .where(eq(assetCategory.id, id)) + .returning() + + return ctx.json( + { + success: true, + assetCategory: updatedCategory, + }, + 200 + ) + }) +} diff --git a/src/v2/routes/category/view-category.ts b/src/v2/routes/category/view-category.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/v2/routes/handler.ts b/src/v2/routes/handler.ts index 194f9d6..03d569c 100644 --- a/src/v2/routes/handler.ts +++ b/src/v2/routes/handler.ts @@ -6,11 +6,13 @@ import TagRoute from "@/v2/routes/tags/handler" import ContributorRoute from "@/v2/routes/contributors/handler" import AuthRoute from "@/v2/routes/auth/handler" import RequestFormRoute from "@/v2/routes/requests/handler" +import CategoriesRoute from "@/v2/routes/category/handler" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() handler.route("/game", GameRoute) handler.route("/asset", AssetRoute) +handler.route("/category", CategoriesRoute) handler.route("/tags", TagRoute) handler.route("/user", UserRoute) handler.route("/contributors", ContributorRoute) From 235cc18bf7f8fc3bc6d9af572776e25717add5a6 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 17 Mar 2024 19:08:18 +0000 Subject: [PATCH 289/318] block/unblock user --- src/v2/db/schema/user/user-blocked.ts | 8 +- src/v2/routes/user/block-user.ts | 124 ++++++++++++++++++++++++++ src/v2/routes/user/handler.ts | 6 ++ src/v2/routes/user/unblock-user.ts | 110 +++++++++++++++++++++++ 4 files changed, 247 insertions(+), 1 deletion(-) create mode 100644 src/v2/routes/user/block-user.ts create mode 100644 src/v2/routes/user/unblock-user.ts diff --git a/src/v2/db/schema/user/user-blocked.ts b/src/v2/db/schema/user/user-blocked.ts index 3d5e0f4..55312ce 100644 --- a/src/v2/db/schema/user/user-blocked.ts +++ b/src/v2/db/schema/user/user-blocked.ts @@ -7,12 +7,18 @@ import { index, } from "drizzle-orm/sqlite-core" import { authUser } from "./user" +import { generateID } from "@/v2/lib/oslo" import { createInsertSchema, createSelectSchema } from "drizzle-zod" export const userBlocked = sqliteTable( tableNames.userBlocked, { - id: text("id").primaryKey().notNull(), + id: text("id") + .primaryKey() + .notNull() + .$defaultFn(() => { + return generateID() + }), blockedById: text("blocked_by_id") .references(() => authUser.id, { onUpdate: "cascade", diff --git a/src/v2/routes/user/block-user.ts b/src/v2/routes/user/block-user.ts new file mode 100644 index 0000000..f954fc1 --- /dev/null +++ b/src/v2/routes/user/block-user.ts @@ -0,0 +1,124 @@ +import { AppHandler } from "../handler" +import { getConnection } from "@/v2/db/turso" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +import { and, eq, or } from "drizzle-orm" +import { userBlocked, userFollowing } from "@/v2/db/schema" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" + +const blockUserByIdSchema = z.object({ + id: z.string().openapi({ + param: { + description: "The id of the user to block.", + in: "path", + name: "id", + required: true, + }, + }), +}) + +const blockUserByIdResponseSchema = z.object({ + success: z.literal(true), +}) + +export const blockUserByIdRoute = createRoute({ + path: "/{id}/block", + method: "post", + summary: "Block a user", + description: "Block a user from their ID.", + tags: ["User"], + request: { + params: blockUserByIdSchema, + }, + responses: { + 200: { + description: "True if the user was blocked.", + content: { + "application/json": { + schema: blockUserByIdResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +export const BlockUserRoute = (handler: AppHandler) => { + handler.openapi(blockUserByIdRoute, async (ctx) => { + const userId = ctx.req.valid("param").id + + const { drizzle } = await getConnection(ctx.env) + + const authSessionManager = new AuthSessionManager(ctx) + const { user } = await authSessionManager.validateSession() + + if (!user) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + if (userId == user.id) { + return ctx.json( + { + success: false, + message: "You cannot block yourself", + }, + 400 + ) + } + + const [blockedStatus] = await drizzle + .select({ + id: userBlocked.blockedId, + blockedById: userBlocked.blockedById, + }) + .from(userBlocked) + .where(eq(userBlocked.blockedId, userId)) + + if (blockedStatus) { + return ctx.json( + { + success: false, + message: "User already blocked", + }, + 400 + ) + } + + await drizzle + .delete(userFollowing) + .where( + or( + and( + eq(userFollowing.followerId, user.id), + eq(userFollowing.followingId, userId) + ), + and( + eq(userFollowing.followerId, userId), + eq(userFollowing.followingId, user.id) + ) + ) + ) + + await drizzle + .insert(userBlocked) + .values({ + blockedId: userId, + blockedById: user.id, + }) + .execute() + + return ctx.json( + { + success: true, + }, + 200 + ) + }) +} diff --git a/src/v2/routes/user/handler.ts b/src/v2/routes/user/handler.ts index 559f43a..8295374 100644 --- a/src/v2/routes/user/handler.ts +++ b/src/v2/routes/user/handler.ts @@ -9,6 +9,9 @@ import { ViewUsersFollowingRoute } from "./user-following" import { FollowUserRoute } from "./follow-user" import { UnfollowUserRoute } from "./unfollow-user" +import { BlockUserRoute } from "./block-user" +import { UnblockUserRoute } from "./unblock-user" + const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() GetUserByIdRoute(handler) @@ -20,4 +23,7 @@ ViewUsersFollowingRoute(handler) FollowUserRoute(handler) UnfollowUserRoute(handler) +BlockUserRoute(handler) +UnblockUserRoute(handler) + export default handler diff --git a/src/v2/routes/user/unblock-user.ts b/src/v2/routes/user/unblock-user.ts new file mode 100644 index 0000000..633376f --- /dev/null +++ b/src/v2/routes/user/unblock-user.ts @@ -0,0 +1,110 @@ +import { AppHandler } from "../handler" +import { getConnection } from "@/v2/db/turso" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +import { and, eq } from "drizzle-orm" +import { userBlocked } from "@/v2/db/schema" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" + +const unblockUserByIdSchema = z.object({ + id: z.string().openapi({ + param: { + description: "The id of the user to unblock.", + in: "path", + name: "id", + required: true, + }, + }), +}) + +const unblockUserByIdResponseSchema = z.object({ + success: z.literal(true), +}) + +export const unblockUserByIdRoute = createRoute({ + path: "/{id}/block", + method: "post", + summary: "Unblock a user", + description: "Unblock a user from their ID.", + tags: ["User"], + request: { + params: unblockUserByIdSchema, + }, + responses: { + 200: { + description: "True if the user was unblocked.", + content: { + "application/json": { + schema: unblockUserByIdResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +export const UnblockUserRoute = (handler: AppHandler) => { + handler.openapi(unblockUserByIdRoute, async (ctx) => { + const userId = ctx.req.valid("param").id + + const { drizzle } = await getConnection(ctx.env) + + const authSessionManager = new AuthSessionManager(ctx) + const { user } = await authSessionManager.validateSession() + + if (!user) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + if (userId == user.id) { + return ctx.json( + { + success: false, + message: "You cannot unblock yourself", + }, + 400 + ) + } + + const [blockedStatus] = await drizzle + .select({ + id: userBlocked.blockedId, + blockedById: userBlocked.blockedById, + }) + .from(userBlocked) + .where( + and( + eq(userBlocked.blockedId, userId), + eq(userBlocked.blockedById, user.id) + ) + ) + + if (!blockedStatus) { + return ctx.json( + { + success: false, + message: "You have not blocked this user", + }, + 400 + ) + } + + await drizzle + .delete(userBlocked) + .where(eq(userBlocked.id, blockedStatus.id)) + + return ctx.json( + { + success: true, + }, + 200 + ) + }) +} From e9b8c1c46b3b65fd1545cdaa3d91762125643791 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 17 Mar 2024 23:45:25 +0000 Subject: [PATCH 290/318] just one more infinite nesting bro trust me bro --- src/v2/routes/asset/get-comment-replies.ts | 115 +++++++++++++++++++++ src/v2/routes/asset/handler.ts | 2 + 2 files changed, 117 insertions(+) create mode 100644 src/v2/routes/asset/get-comment-replies.ts diff --git a/src/v2/routes/asset/get-comment-replies.ts b/src/v2/routes/asset/get-comment-replies.ts new file mode 100644 index 0000000..6bd4133 --- /dev/null +++ b/src/v2/routes/asset/get-comment-replies.ts @@ -0,0 +1,115 @@ +import { getConnection } from "@/v2/db/turso" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" +import { AppHandler } from "../handler" +import { assetComments, assetCommentsLikes } from "@/v2/db/schema" +import { selectAssetCommentsSchema } from "@/v2/db/schema" +import { sql, eq, desc } from "drizzle-orm" + +const getCommentRepliesSchema = z.object({ + id: z.string().openapi({ + param: { + name: "id", + in: "path", + description: "The ID of the comment to check replies for.", + required: true, + }, + }), +}) + +const getCommentRepliesOffsetSchema = z.object({ + offset: z + .string() + .optional() + .openapi({ + param: { + name: "offset", + in: "query", + description: "The offset to start from.", + required: false, + }, + }), +}) + +const getCommentRepliesResponseSchema = z.object({ + success: z.literal(true), + replies: z.array( + selectAssetCommentsSchema + .pick({ + id: true, + parentCommentId: true, + commentedById: true, + comment: true, + createdAt: true, + }) + .extend({ + hasReplies: z.boolean(), + likes: z.number(), + }) + ), +}) + +const getCommentsRepliesRoute = createRoute({ + path: "/comment/{id}/replies", + method: "get", + summary: "Get a comment's replies.", + description: "Get a comment's replies.", + tags: ["Asset"], + request: { + params: getCommentRepliesSchema, + query: getCommentRepliesOffsetSchema, + }, + responses: { + 200: { + description: "Array of replies to a comment.", + content: { + "application/json": { + schema: getCommentRepliesResponseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +export const GetCommentsRepliesRoute = (handler: AppHandler) => { + handler.openapi(getCommentsRepliesRoute, async (ctx) => { + const commentId = ctx.req.valid("param").id + const offset = parseInt(ctx.req.valid("query").offset) || 0 + + const { drizzle } = await getConnection(ctx.env) + + const replies = await drizzle + .select({ + id: assetComments.id, + parentCommentId: assetComments.parentCommentId, + commentedById: assetComments.commentedById, + comment: assetComments.comment, + createdAt: assetComments.createdAt, + hasReplies: sql`EXISTS (SELECT 1 FROM ${assetComments} WHERE ${assetComments.parentCommentId} = ${assetComments.id})`, + likes: sql`COUNT(${assetCommentsLikes.commentId})`, + }) + .from(assetComments) + .where(eq(assetComments.parentCommentId, commentId)) + .leftJoin( + assetCommentsLikes, + eq(assetComments.id, assetCommentsLikes.commentId) + ) + .groupBy(assetComments.id) + .offset(offset) + .limit(10) + .orderBy(desc(assetComments.createdAt)) + + return ctx.json( + { + success: true, + replies: replies.map((reply) => ({ + ...reply, + hasReplies: !!reply.hasReplies, + })), + }, + 200 + ) + }) +} diff --git a/src/v2/routes/asset/handler.ts b/src/v2/routes/asset/handler.ts index c47b5b0..1787f5a 100644 --- a/src/v2/routes/asset/handler.ts +++ b/src/v2/routes/asset/handler.ts @@ -9,6 +9,7 @@ import { ModifyAssetRoute } from "./modify-asset" import { UploadAssetRoute } from "./upload-asset" import { DeleteAssetByIdRoute } from "./delete-asset" import { DownloadAssetRoute } from "./download-asset" +import { GetCommentsRepliesRoute } from "./get-comment-replies" import { ViewAssetCommentsRoute } from "./get-asset-comments" @@ -28,5 +29,6 @@ UnlikeAssetByIdRoute(handler) GetAssetLikesRoute(handler) ViewAssetCommentsRoute(handler) +GetCommentsRepliesRoute(handler) export default handler From 32e0c55cf217658c747cea2e869dae314b1d6683 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Mon, 18 Mar 2024 00:11:19 +0000 Subject: [PATCH 291/318] fix comment/replies support --- src/scripts/seed/seed.ts | 36 ++++++++++++++++++++++ src/v2/routes/asset/get-asset-comments.ts | 7 ++++- src/v2/routes/asset/get-comment-replies.ts | 4 +-- 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/src/scripts/seed/seed.ts b/src/scripts/seed/seed.ts index 8f3fa29..cd0187b 100644 --- a/src/scripts/seed/seed.ts +++ b/src/scripts/seed/seed.ts @@ -443,6 +443,30 @@ async function main() { `[SEED] [assetComments] inserted ${newAssetCommentsReplies.length} rows\n` ) + const newAssetCommentsRepliesReplies = await db + .insert(assetComments) + .values([ + { + commentedById: newUsers[0].id, + comment: "test comment reply reply", + parentCommentId: newAssetCommentsReplies[0].id, + }, + { + commentedById: newUsers[1].id, + comment: "test comment reply reply 2", + parentCommentId: newAssetCommentsReplies[1].id, + }, + { + commentedById: newUsers[0].id, + comment: "test comment reply reply 3", + parentCommentId: newAssetCommentsReplies[2].id, + }, + ]) + .returning() + console.log( + `[SEED] [assetComments] inserted ${newAssetCommentsRepliesReplies.length} rows\n` + ) + console.log("[SEED] [assetCommentsLikes] Seeding asset comments likes...") const newAssetCommentsLikes = await db .insert(assetCommentsLikes) @@ -471,6 +495,18 @@ async function main() { commentId: newAssetCommentsReplies[2].id, likedById: newUsers[0].id, }, + { + commentId: newAssetCommentsRepliesReplies[0].id, + likedById: newUsers[1].id, + }, + { + commentId: newAssetCommentsRepliesReplies[1].id, + likedById: newUsers[0].id, + }, + { + commentId: newAssetCommentsRepliesReplies[2].id, + likedById: newUsers[1].id, + }, ]) .returning() console.log( diff --git a/src/v2/routes/asset/get-asset-comments.ts b/src/v2/routes/asset/get-asset-comments.ts index ad93fe4..6ded168 100644 --- a/src/v2/routes/asset/get-asset-comments.ts +++ b/src/v2/routes/asset/get-asset-comments.ts @@ -44,6 +44,7 @@ const getAssetCommentsResponseSchema = z.object({ createdAt: true, }) .extend({ + hasReplies: z.boolean(), likes: z.number(), }) ), @@ -86,6 +87,7 @@ export const ViewAssetCommentsRoute = (handler: AppHandler) => { commentedById: assetComments.commentedById, comment: assetComments.comment, createdAt: assetComments.createdAt, + hasReplies: sql`EXISTS (SELECT 1 FROM assetComments AS ac WHERE ac.parent_comment_id = ${assetComments.id})`, likes: sql`COUNT(${assetCommentsLikes.commentId})`, }) .from(assetComments) @@ -102,7 +104,10 @@ export const ViewAssetCommentsRoute = (handler: AppHandler) => { return ctx.json( { success: true, - comments, + comments: comments.map((c) => ({ + ...c, + hasReplies: !!c.hasReplies, + })), }, 200 ) diff --git a/src/v2/routes/asset/get-comment-replies.ts b/src/v2/routes/asset/get-comment-replies.ts index 6bd4133..866148b 100644 --- a/src/v2/routes/asset/get-comment-replies.ts +++ b/src/v2/routes/asset/get-comment-replies.ts @@ -53,7 +53,7 @@ const getCommentRepliesResponseSchema = z.object({ const getCommentsRepliesRoute = createRoute({ path: "/comment/{id}/replies", method: "get", - summary: "Get a comment's replies.", + summary: "Get a comment's replies", description: "Get a comment's replies.", tags: ["Asset"], request: { @@ -87,7 +87,7 @@ export const GetCommentsRepliesRoute = (handler: AppHandler) => { commentedById: assetComments.commentedById, comment: assetComments.comment, createdAt: assetComments.createdAt, - hasReplies: sql`EXISTS (SELECT 1 FROM ${assetComments} WHERE ${assetComments.parentCommentId} = ${assetComments.id})`, + hasReplies: sql`EXISTS (SELECT 1 FROM assetComments AS ac WHERE ac.parent_comment_id = ${assetComments.id})`, likes: sql`COUNT(${assetCommentsLikes.commentId})`, }) .from(assetComments) From c7be96b69c319ed91e7431bf45dc463c68a1dcd7 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Wed, 20 Mar 2024 00:00:58 +0000 Subject: [PATCH 292/318] organize routes (rare) --- src/v2/db/schema/asset/asset.ts | 3 ++ src/v2/routes/asset/delete-asset.ts | 12 +++---- src/v2/routes/asset/download-asset.ts | 12 +++---- src/v2/routes/asset/get-asset-comments.ts | 36 ++++++++++++++----- src/v2/routes/asset/get-asset.ts | 12 +++---- src/v2/routes/asset/get-comment-replies.ts | 16 ++++----- src/v2/routes/asset/get-users-asset-likes.ts | 8 ++--- src/v2/routes/asset/like-asset.ts | 12 +++---- src/v2/routes/asset/modify-asset.ts | 20 +++++++---- src/v2/routes/asset/search-assets.ts | 14 ++++---- src/v2/routes/asset/unlike-asset.ts | 12 +++---- src/v2/routes/asset/upload-asset.ts | 17 +++++---- src/v2/routes/auth/account-create.ts | 12 +++---- src/v2/routes/auth/account-login.ts | 12 +++---- src/v2/routes/auth/get-all-sessions.ts | 8 ++--- src/v2/routes/auth/invalidate-session.ts | 12 +++---- src/v2/routes/auth/logout-current-session.ts | 8 ++--- .../routes/auth/validate-current-session.ts | 8 ++--- src/v2/routes/category/all-categories.ts | 8 ++--- src/v2/routes/category/create-category.ts | 12 +++---- src/v2/routes/category/delete-category.ts | 12 +++---- src/v2/routes/category/get-category.ts | 12 +++---- src/v2/routes/category/modify-category.ts | 16 ++++----- .../routes/contributors/all-contributors.ts | 8 ++--- src/v2/routes/game/all-games.ts | 8 ++--- src/v2/routes/game/create-game.ts | 12 +++---- src/v2/routes/game/delete-game.ts | 12 +++---- src/v2/routes/game/get-game.ts | 12 +++---- src/v2/routes/game/modify-game.ts | 16 ++++----- src/v2/routes/requests/all-requests.ts | 12 +++---- src/v2/routes/requests/create-request.ts | 12 +++---- src/v2/routes/requests/delete-request.ts | 12 +++---- .../routes/requests/remove-request-upvote.ts | 12 +++---- src/v2/routes/requests/upvote-request.ts | 12 +++---- src/v2/routes/requests/view-request.ts | 12 +++---- src/v2/routes/tags/all-tags.ts | 8 ++--- src/v2/routes/tags/create-tag.ts | 12 +++---- src/v2/routes/tags/delete-tag.ts | 12 +++---- src/v2/routes/tags/get-tag.ts | 12 +++---- src/v2/routes/tags/modify-tag.ts | 16 ++++----- src/v2/routes/user/block-user.ts | 12 +++---- src/v2/routes/user/follow-user.ts | 12 +++---- src/v2/routes/user/get-user.ts | 12 +++---- src/v2/routes/user/search-users.ts | 12 +++---- src/v2/routes/user/unblock-user.ts | 12 +++---- src/v2/routes/user/unfollow-user.ts | 12 +++---- src/v2/routes/user/user-followers.ts | 16 ++++----- src/v2/routes/user/user-following.ts | 16 ++++----- 48 files changed, 315 insertions(+), 283 deletions(-) diff --git a/src/v2/db/schema/asset/asset.ts b/src/v2/db/schema/asset/asset.ts index 2f6bea5..5871d19 100644 --- a/src/v2/db/schema/asset/asset.ts +++ b/src/v2/db/schema/asset/asset.ts @@ -77,6 +77,9 @@ export const asset = sqliteTable( assetIsSuggestive: integer("asset_is_suggestive", { mode: "boolean" }) .default(false) .notNull(), + allowComments: integer("comments_is_locked", { mode: "boolean" }) + .default(true) + .notNull(), viewCount: integer("view_count").default(0).notNull(), downloadCount: integer("download_count").default(0).notNull(), fileSize: integer("file_size").default(0).notNull(), diff --git a/src/v2/routes/asset/delete-asset.ts b/src/v2/routes/asset/delete-asset.ts index f074ed5..8b21405 100644 --- a/src/v2/routes/asset/delete-asset.ts +++ b/src/v2/routes/asset/delete-asset.ts @@ -6,7 +6,7 @@ import { createRoute } from "@hono/zod-openapi" import { GenericResponses } from "@/v2/lib/response-schemas" import { z } from "@hono/zod-openapi" -const deleteAssetByIdSchema = z.object({ +const paramsSchema = z.object({ id: z.string().openapi({ param: { name: "id", @@ -18,11 +18,11 @@ const deleteAssetByIdSchema = z.object({ }), }) -const deleteAssetByIdResponseSchema = z.object({ +const responseSchema = z.object({ success: z.literal(true), }) -const deleteAssetByIdRoute = createRoute({ +const openRoute = createRoute({ path: "/{id}/delete", method: "delete", summary: "Delete an asset", @@ -30,14 +30,14 @@ const deleteAssetByIdRoute = createRoute({ "Delete an asset from their ID. Must be the owner of the asset or an admin.", tags: ["Asset"], request: { - params: deleteAssetByIdSchema, + params: paramsSchema, }, responses: { 200: { description: "True if the asset was deleted.", content: { "application/json": { - schema: deleteAssetByIdResponseSchema, + schema: responseSchema, }, }, }, @@ -46,7 +46,7 @@ const deleteAssetByIdRoute = createRoute({ }) export const DeleteAssetByIdRoute = (handler: AppHandler) => { - handler.openapi(deleteAssetByIdRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const assetId = ctx.req.valid("param").id const { drizzle } = await getConnection(ctx.env) diff --git a/src/v2/routes/asset/download-asset.ts b/src/v2/routes/asset/download-asset.ts index bce112c..8f58894 100644 --- a/src/v2/routes/asset/download-asset.ts +++ b/src/v2/routes/asset/download-asset.ts @@ -6,7 +6,7 @@ import { createRoute } from "@hono/zod-openapi" import { GenericResponses } from "@/v2/lib/response-schemas" import { z } from "@hono/zod-openapi" -const downloadAssetByIdSchema = z.object({ +const paramsSchema = z.object({ id: z.string().openapi({ param: { name: "id", @@ -17,19 +17,19 @@ const downloadAssetByIdSchema = z.object({ }), }) -const downloadAssetByIdResponseSchema = z.object({ +const responseSchema = z.object({ success: z.literal(true), downloadUrl: z.string(), }) -const downloadAssetByIdRoute = createRoute({ +const openRoute = createRoute({ path: "/{id}/download", method: "get", summary: "Download an asset", description: "Download an asset by their ID.", tags: ["Asset"], request: { - params: downloadAssetByIdSchema, + params: paramsSchema, }, responses: { 200: { @@ -37,7 +37,7 @@ const downloadAssetByIdRoute = createRoute({ response: { content: { "application/json": { - schema: downloadAssetByIdResponseSchema, + schema: responseSchema, }, }, }, @@ -47,7 +47,7 @@ const downloadAssetByIdRoute = createRoute({ }) export const DownloadAssetRoute = (handler: AppHandler) => { - handler.openapi(downloadAssetByIdRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const assetId = ctx.req.valid("param").id const { drizzle } = await getConnection(ctx.env) diff --git a/src/v2/routes/asset/get-asset-comments.ts b/src/v2/routes/asset/get-asset-comments.ts index 6ded168..a7cd5be 100644 --- a/src/v2/routes/asset/get-asset-comments.ts +++ b/src/v2/routes/asset/get-asset-comments.ts @@ -3,11 +3,11 @@ import { createRoute } from "@hono/zod-openapi" import { GenericResponses } from "@/v2/lib/response-schemas" import { z } from "@hono/zod-openapi" import { AppHandler } from "../handler" -import { assetComments, assetCommentsLikes } from "@/v2/db/schema" +import { asset, assetComments, assetCommentsLikes } from "@/v2/db/schema" import { selectAssetCommentsSchema } from "@/v2/db/schema" import { sql, eq, desc } from "drizzle-orm" -const getAssetCommentsSchema = z.object({ +const pathSchema = z.object({ id: z.string().openapi({ param: { name: "id", @@ -18,7 +18,7 @@ const getAssetCommentsSchema = z.object({ }), }) -const getAssetCommentsOffsetSchema = z.object({ +const querySchema = z.object({ offset: z .string() .optional() @@ -32,7 +32,7 @@ const getAssetCommentsOffsetSchema = z.object({ }), }) -const getAssetCommentsResponseSchema = z.object({ +const responseSchema = z.object({ success: z.literal(true), comments: z.array( selectAssetCommentsSchema @@ -50,22 +50,22 @@ const getAssetCommentsResponseSchema = z.object({ ), }) -const getAssetCommentsRoute = createRoute({ +const openRoute = createRoute({ path: "/{id}/comments", method: "get", summary: "Get an asset's comments", description: "Get an asset's comments.", tags: ["Asset"], request: { - params: getAssetCommentsSchema, - query: getAssetCommentsOffsetSchema, + params: pathSchema, + query: querySchema, }, responses: { 200: { description: "Array of your asset comments.", content: { "application/json": { - schema: getAssetCommentsResponseSchema, + schema: responseSchema, }, }, }, @@ -74,12 +74,30 @@ const getAssetCommentsRoute = createRoute({ }) export const ViewAssetCommentsRoute = (handler: AppHandler) => { - handler.openapi(getAssetCommentsRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const assetId = ctx.req.valid("param").id const offset = parseInt(ctx.req.valid("query").offset) || 0 const { drizzle } = await getConnection(ctx.env) + const [assetAllowsComments] = await drizzle + .select({ + allowComments: asset.allowComments, + }) + .from(asset) + .where(eq(asset.id, assetId)) + .limit(1) + + if (assetAllowsComments.allowComments) { + return ctx.json( + { + success: false, + message: "Comments are locked for this asset.", + }, + 403 + ) + } + const comments = await drizzle .select({ id: assetComments.id, diff --git a/src/v2/routes/asset/get-asset.ts b/src/v2/routes/asset/get-asset.ts index 0a27308..a3b842a 100644 --- a/src/v2/routes/asset/get-asset.ts +++ b/src/v2/routes/asset/get-asset.ts @@ -14,7 +14,7 @@ import { selectUserSchema, } from "@/v2/db/schema" -const getAssetByIdSchema = z.object({ +const paramsSchema = z.object({ id: z.string().openapi({ param: { name: "id", @@ -25,7 +25,7 @@ const getAssetByIdSchema = z.object({ }), }) -const getAssetByIdResponseSchema = z.object({ +const responseSchema = z.object({ success: z.literal(true), // mmm nested schemas asset: selectAssetSchema @@ -70,21 +70,21 @@ const getAssetByIdResponseSchema = z.object({ assetLikes: z.number(), }) -const getAssetByIdRoute = createRoute({ +const openRoute = createRoute({ path: "/{id}", method: "get", summary: "Get an asset", description: "Get an asset by their ID.", tags: ["Asset"], request: { - params: getAssetByIdSchema, + params: paramsSchema, }, responses: { 200: { description: "The found asset & similar assets are returned.", content: { "application/json": { - schema: getAssetByIdResponseSchema, + schema: responseSchema, }, }, }, @@ -93,7 +93,7 @@ const getAssetByIdRoute = createRoute({ }) export const GetAssetByIdRoute = (handler: AppHandler) => { - handler.openapi(getAssetByIdRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const assetId = ctx.req.valid("param").id const { drizzle } = await getConnection(ctx.env) diff --git a/src/v2/routes/asset/get-comment-replies.ts b/src/v2/routes/asset/get-comment-replies.ts index 866148b..de3eb8b 100644 --- a/src/v2/routes/asset/get-comment-replies.ts +++ b/src/v2/routes/asset/get-comment-replies.ts @@ -7,7 +7,7 @@ import { assetComments, assetCommentsLikes } from "@/v2/db/schema" import { selectAssetCommentsSchema } from "@/v2/db/schema" import { sql, eq, desc } from "drizzle-orm" -const getCommentRepliesSchema = z.object({ +const paramsSchema = z.object({ id: z.string().openapi({ param: { name: "id", @@ -18,7 +18,7 @@ const getCommentRepliesSchema = z.object({ }), }) -const getCommentRepliesOffsetSchema = z.object({ +const querySchema = z.object({ offset: z .string() .optional() @@ -32,7 +32,7 @@ const getCommentRepliesOffsetSchema = z.object({ }), }) -const getCommentRepliesResponseSchema = z.object({ +const responseSchema = z.object({ success: z.literal(true), replies: z.array( selectAssetCommentsSchema @@ -50,22 +50,22 @@ const getCommentRepliesResponseSchema = z.object({ ), }) -const getCommentsRepliesRoute = createRoute({ +const openRoute = createRoute({ path: "/comment/{id}/replies", method: "get", summary: "Get a comment's replies", description: "Get a comment's replies.", tags: ["Asset"], request: { - params: getCommentRepliesSchema, - query: getCommentRepliesOffsetSchema, + params: paramsSchema, + query: querySchema, }, responses: { 200: { description: "Array of replies to a comment.", content: { "application/json": { - schema: getCommentRepliesResponseSchema, + schema: responseSchema, }, }, }, @@ -74,7 +74,7 @@ const getCommentsRepliesRoute = createRoute({ }) export const GetCommentsRepliesRoute = (handler: AppHandler) => { - handler.openapi(getCommentsRepliesRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const commentId = ctx.req.valid("param").id const offset = parseInt(ctx.req.valid("query").offset) || 0 diff --git a/src/v2/routes/asset/get-users-asset-likes.ts b/src/v2/routes/asset/get-users-asset-likes.ts index c2823a6..889060c 100644 --- a/src/v2/routes/asset/get-users-asset-likes.ts +++ b/src/v2/routes/asset/get-users-asset-likes.ts @@ -11,7 +11,7 @@ import { } from "@/v2/db/schema" import { AppHandler } from "../handler" -const allAssetLikesSchema = z.object({ +const responseSchema = z.object({ success: z.literal(true), likes: z.array( selectAssetLikesSchema.extend({ @@ -26,7 +26,7 @@ const allAssetLikesSchema = z.object({ ), }) -const allAssetLikesRoute = createRoute({ +const openRoute = createRoute({ path: "/likes", method: "get", summary: "Your liked assets", @@ -37,7 +37,7 @@ const allAssetLikesRoute = createRoute({ description: "Array of your liked assets.", content: { "application/json": { - schema: allAssetLikesSchema, + schema: responseSchema, }, }, }, @@ -46,7 +46,7 @@ const allAssetLikesRoute = createRoute({ }) export const GetAssetLikesRoute = (handler: AppHandler) => { - handler.openapi(allAssetLikesRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const authSessionManager = new AuthSessionManager(ctx) const { user } = await authSessionManager.validateSession() diff --git a/src/v2/routes/asset/like-asset.ts b/src/v2/routes/asset/like-asset.ts index be38694..1962dd1 100644 --- a/src/v2/routes/asset/like-asset.ts +++ b/src/v2/routes/asset/like-asset.ts @@ -7,7 +7,7 @@ import { createRoute } from "@hono/zod-openapi" import { GenericResponses } from "@/v2/lib/response-schemas" import { z } from "@hono/zod-openapi" -const likeAssetByIdSchema = z.object({ +const paramsSchema = z.object({ id: z.string().openapi({ param: { description: "The id of the asset to like.", @@ -19,25 +19,25 @@ const likeAssetByIdSchema = z.object({ }), }) -const likeAssetByIdResponseSchema = z.object({ +const responseSchema = z.object({ success: z.literal(true), }) -const likeAssetByIdRoute = createRoute({ +const openRoute = createRoute({ path: "/{id}/like", method: "post", summary: "Like an asset", description: "Like an asset from their ID.", tags: ["Asset"], request: { - params: likeAssetByIdSchema, + params: paramsSchema, }, responses: { 200: { description: "True if the asset was liked.", content: { "application/json": { - schema: likeAssetByIdResponseSchema, + schema: responseSchema, }, }, }, @@ -46,7 +46,7 @@ const likeAssetByIdRoute = createRoute({ }) export const LikeAssetByIdRoute = (handler: AppHandler) => { - handler.openapi(likeAssetByIdRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const assetId = ctx.req.valid("param").id const { drizzle } = await getConnection(ctx.env) diff --git a/src/v2/routes/asset/modify-asset.ts b/src/v2/routes/asset/modify-asset.ts index 8ab9af5..8ec962e 100644 --- a/src/v2/routes/asset/modify-asset.ts +++ b/src/v2/routes/asset/modify-asset.ts @@ -8,7 +8,7 @@ import { GenericResponses } from "@/v2/lib/response-schemas" import { z } from "@hono/zod-openapi" import { AppHandler } from "../handler" -const modifyAssetPathSchema = z.object({ +const paramsSchema = z.object({ id: z.string().openapi({ param: { description: "The id of the asset to modify.", @@ -19,7 +19,7 @@ const modifyAssetPathSchema = z.object({ }), }) -const modifyAssetSchema = z.object({ +const requestBodySchema = z.object({ name: z .string() .min(3) @@ -50,24 +50,28 @@ const modifyAssetSchema = z.object({ example: "genshin-impact", }) .optional(), + allowComments: z.string().min(0).max(1).optional().openapi({ + description: "If comments are allowed on the asset. 1 = Yes, 0 = No.", + example: "1", + }), }) const modifyAssetResponseSchema = z.object({ success: z.literal(true), }) -const modifyAssetRoute = createRoute({ +const openRoute = createRoute({ path: "/{id}/modify", method: "patch", summary: "Modify an asset", description: "Modify an existing asset.", tags: ["Asset"], request: { - params: modifyAssetPathSchema, + params: paramsSchema, body: { content: { "application/json": { - schema: modifyAssetSchema, + schema: requestBodySchema, }, }, }, @@ -86,8 +90,9 @@ const modifyAssetRoute = createRoute({ }) export const ModifyAssetRoute = (handler: AppHandler) => { - handler.openapi(modifyAssetRoute, async (ctx) => { - const { name, tags, assetCategoryId, gameId } = ctx.req.valid("json") + handler.openapi(openRoute, async (ctx) => { + const { name, tags, assetCategoryId, gameId, allowComments } = + ctx.req.valid("json") const assetId = ctx.req.valid("param").id const authSessionManager = new AuthSessionManager(ctx) @@ -129,6 +134,7 @@ export const ModifyAssetRoute = (handler: AppHandler) => { name, assetCategoryId, gameId, + allowComments: Boolean(allowComments), }) .where(eq(asset.id, assetId)) .returning() diff --git a/src/v2/routes/asset/search-assets.ts b/src/v2/routes/asset/search-assets.ts index 317bfc1..d7bf0ac 100644 --- a/src/v2/routes/asset/search-assets.ts +++ b/src/v2/routes/asset/search-assets.ts @@ -10,7 +10,7 @@ import { } from "@/v2/db/schema" import { type AppHandler } from "../handler" -export const assetSearchAllFilterResponseSchema = z.object({ +const responseSchema = z.object({ success: z.literal(true), assets: z.array( selectAssetSchema @@ -38,7 +38,7 @@ export const assetSearchAllFilterResponseSchema = z.object({ ), }) -export const assetSearchAllFilterSchema = z +const querySchema = z .object({ name: z.string().openapi({ param: { @@ -92,23 +92,23 @@ export const assetSearchAllFilterSchema = z }) .partial() -export type assetSearchAllFilter = z.infer +export type assetSearchAllFilter = z.infer -const assetSearchAllFilterRoute = createRoute({ +const openRoute = createRoute({ path: "/search", method: "get", summary: "Search for assets", description: "Filter all assets", tags: ["Asset"], request: { - query: assetSearchAllFilterSchema, + query: querySchema, }, responses: { 200: { description: "Found assets", content: { "application/json": { - schema: assetSearchAllFilterResponseSchema, + schema: responseSchema, }, }, }, @@ -117,7 +117,7 @@ const assetSearchAllFilterRoute = createRoute({ }) export const AssetSearchAllFilterRoute = (handler: AppHandler) => { - handler.openapi(assetSearchAllFilterRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const { drizzle } = await getConnection(ctx.env) const { name, game, category, tags, offset } = ctx.req.valid("query") diff --git a/src/v2/routes/asset/unlike-asset.ts b/src/v2/routes/asset/unlike-asset.ts index 89a9372..4c5a81a 100644 --- a/src/v2/routes/asset/unlike-asset.ts +++ b/src/v2/routes/asset/unlike-asset.ts @@ -7,7 +7,7 @@ import { GenericResponses } from "@/v2/lib/response-schemas" import { z } from "@hono/zod-openapi" import type { AppHandler } from "../handler" -const unlikeAssetByIdSchema = z.object({ +const paramsSchema = z.object({ id: z.string().openapi({ param: { description: "The id of the asset to unlike.", @@ -19,25 +19,25 @@ const unlikeAssetByIdSchema = z.object({ }), }) -const unlikeAssetByIdResponseSchema = z.object({ +const responseSchema = z.object({ success: z.literal(true), }) -const unlikeAssetByIdRoute = createRoute({ +const openRoute = createRoute({ path: "/{id}/unlike", method: "post", summary: "Unlike an asset", description: "Unlike an asset from their ID.", tags: ["Asset"], request: { - params: unlikeAssetByIdSchema, + params: paramsSchema, }, responses: { 200: { description: "True if the asset was unliked.", content: { "application/json": { - schema: unlikeAssetByIdResponseSchema, + schema: responseSchema, }, }, }, @@ -46,7 +46,7 @@ const unlikeAssetByIdRoute = createRoute({ }) export const UnlikeAssetByIdRoute = (handler: AppHandler) => { - handler.openapi(unlikeAssetByIdRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const assetId = ctx.req.valid("param").id const { drizzle } = await getConnection(ctx.env) diff --git a/src/v2/routes/asset/upload-asset.ts b/src/v2/routes/asset/upload-asset.ts index 20058be..c574c45 100644 --- a/src/v2/routes/asset/upload-asset.ts +++ b/src/v2/routes/asset/upload-asset.ts @@ -10,7 +10,7 @@ import { z } from "@hono/zod-openapi" const AcceptedImageType = "image/png" const MaxFileSize = 5 * 1024 * 1024 -const uploadAssetSchema = z.object({ +const requestBodySchema = z.object({ asset: z .any() .openapi({ @@ -56,13 +56,17 @@ const uploadAssetSchema = z.object({ }) .transform((value) => parseInt(value)) .refine((value) => value === 1 || value === 0), + allowComments: z.string().min(0).max(1).optional().openapi({ + description: "If comments are allowed on the asset. 1 = Yes, 0 = No.", + example: "1", + }), }) -const uploadAssetResponseSchema = z.object({ +const responseSchema = z.object({ success: z.literal(true), }) -const uploadAssetRoute = createRoute({ +const openRoute = createRoute({ path: "/upload", method: "post", summary: "Upload an asset", @@ -72,7 +76,7 @@ const uploadAssetRoute = createRoute({ body: { content: { "multipart/form-data": { - schema: uploadAssetSchema, + schema: requestBodySchema, }, }, }, @@ -82,7 +86,7 @@ const uploadAssetRoute = createRoute({ description: "The uploaded asset.", content: { "application/json": { - schema: uploadAssetResponseSchema, + schema: responseSchema, }, }, }, @@ -91,7 +95,7 @@ const uploadAssetRoute = createRoute({ }) export const UploadAssetRoute = (handler: AppHandler) => - handler.openapi(uploadAssetRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const { asset, name, @@ -150,6 +154,7 @@ export const UploadAssetRoute = (handler: AppHandler) => fileSize: 0, width: 0, height: 0, + allowComments: true, assetIsSuggestive: Boolean(assetIsSuggestive), }) .returning() diff --git a/src/v2/routes/auth/account-create.ts b/src/v2/routes/auth/account-create.ts index 970be21..a4170ae 100644 --- a/src/v2/routes/auth/account-create.ts +++ b/src/v2/routes/auth/account-create.ts @@ -5,7 +5,7 @@ import { createRoute } from "@hono/zod-openapi" import { GenericResponses } from "@/v2/lib/response-schemas" import { z } from "@hono/zod-openapi" -const createAccountSchema = z.object({ +const requestBodySchema = z.object({ username: z.string().min(3).max(32).openapi({ description: "The username of the user.", example: "user", @@ -24,11 +24,11 @@ const createAccountSchema = z.object({ }), }) -const createAccountResponseSchema = z.object({ +const responseSchema = z.object({ success: z.literal(true), }) -const userCreateAccountRoute = createRoute({ +const openRoute = createRoute({ path: "/create", method: "post", summary: "Create a new account", @@ -38,7 +38,7 @@ const userCreateAccountRoute = createRoute({ body: { content: { "application/json": { - schema: createAccountSchema, + schema: requestBodySchema, }, }, }, @@ -48,7 +48,7 @@ const userCreateAccountRoute = createRoute({ description: "Returns true.", content: { "application/json": { - schema: createAccountResponseSchema, + schema: responseSchema, }, }, }, @@ -57,7 +57,7 @@ const userCreateAccountRoute = createRoute({ }) export const UserCreateAccountRoute = (handler: AppHandler) => { - handler.openapi(userCreateAccountRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const authSessionManager = new AuthSessionManager(ctx) const { user } = await authSessionManager.validateSession() diff --git a/src/v2/routes/auth/account-login.ts b/src/v2/routes/auth/account-login.ts index 597d5d4..ff7a5d8 100644 --- a/src/v2/routes/auth/account-login.ts +++ b/src/v2/routes/auth/account-login.ts @@ -5,7 +5,7 @@ import { createRoute } from "@hono/zod-openapi" import { GenericResponses } from "@/v2/lib/response-schemas" import { z } from "@hono/zod-openapi" -const loginSchema = z.object({ +const requestBodySchema = z.object({ email: z.string().min(3).max(32).openapi({ description: "The email of the user.", example: "user@domain.com", @@ -20,11 +20,11 @@ const loginSchema = z.object({ }), }) -const loginResponseSchema = z.object({ +const responseSchema = z.object({ success: z.literal(true), }) -export const userLoginRoute = createRoute({ +const openRoute = createRoute({ path: "/login", method: "post", summary: "Login", @@ -34,7 +34,7 @@ export const userLoginRoute = createRoute({ body: { content: { "application/json": { - schema: loginSchema, + schema: requestBodySchema, }, }, }, @@ -44,7 +44,7 @@ export const userLoginRoute = createRoute({ description: "Returns true.", content: { "application/json": { - schema: loginResponseSchema, + schema: responseSchema, }, }, }, @@ -53,7 +53,7 @@ export const userLoginRoute = createRoute({ }) export const UserLoginRoute = (handler: AppHandler) => { - handler.openapi(userLoginRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const authSessionManager = new AuthSessionManager(ctx) const { user } = await authSessionManager.validateSession() diff --git a/src/v2/routes/auth/get-all-sessions.ts b/src/v2/routes/auth/get-all-sessions.ts index 17a06e1..087eba6 100644 --- a/src/v2/routes/auth/get-all-sessions.ts +++ b/src/v2/routes/auth/get-all-sessions.ts @@ -5,7 +5,7 @@ import { GenericResponses } from "@/v2/lib/response-schemas" import { selectSessionSchema } from "@/v2/db/schema" import { z } from "@hono/zod-openapi" -const sessionListSchema = z.object({ +const responseSchema = z.object({ success: z.literal(true), currentSessions: selectSessionSchema .pick({ @@ -15,7 +15,7 @@ const sessionListSchema = z.object({ .array(), }) -const authAllCurrentSessions = createRoute({ +const openRoute = createRoute({ path: "/sessions", method: "get", summary: "Get all current sessions", @@ -26,7 +26,7 @@ const authAllCurrentSessions = createRoute({ description: "All current sessions are returned", content: { "application/json": { - schema: sessionListSchema, + schema: responseSchema, }, }, }, @@ -35,7 +35,7 @@ const authAllCurrentSessions = createRoute({ }) export const UserAllCurrentSessionsRoute = (handler: AppHandler) => { - handler.openapi(authAllCurrentSessions, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const authSessionManager = new AuthSessionManager(ctx) const { user } = await authSessionManager.validateSession() diff --git a/src/v2/routes/auth/invalidate-session.ts b/src/v2/routes/auth/invalidate-session.ts index 0a7e2db..e46da7a 100644 --- a/src/v2/routes/auth/invalidate-session.ts +++ b/src/v2/routes/auth/invalidate-session.ts @@ -5,7 +5,7 @@ import { createRoute } from "@hono/zod-openapi" import { GenericResponses } from "@/v2/lib/response-schemas" import { z } from "@hono/zod-openapi" -const invalidateSessionSchema = z.object({ +const paramsSchema = z.object({ id: z.string().openapi({ param: { description: "The id of the session to invalidate.", @@ -17,25 +17,25 @@ const invalidateSessionSchema = z.object({ }), }) -const invalidateSessionResponseSchema = z.object({ +const responseSchema = z.object({ success: z.literal(true), }) -const invalidateSessionRoute = createRoute({ +const openRoute = createRoute({ path: "/invalidate/{id}", method: "get", summary: "Invalidate a session", description: "Invalidate a session by its ID.", tags: ["Auth"], request: { - params: invalidateSessionSchema, + params: paramsSchema, }, responses: { 200: { description: "Logout successful.", content: { "application/json": { - schema: invalidateSessionResponseSchema, + schema: responseSchema, }, }, }, @@ -44,7 +44,7 @@ const invalidateSessionRoute = createRoute({ }) export const InvalidateSessionRoute = (handler: AppHandler) => { - handler.openapi(invalidateSessionRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const sessionId = ctx.req.valid("param").id const authSessionManager = new AuthSessionManager(ctx) diff --git a/src/v2/routes/auth/logout-current-session.ts b/src/v2/routes/auth/logout-current-session.ts index 5973eab..5697ec9 100644 --- a/src/v2/routes/auth/logout-current-session.ts +++ b/src/v2/routes/auth/logout-current-session.ts @@ -5,11 +5,11 @@ import { createRoute } from "@hono/zod-openapi" import { GenericResponses } from "@/v2/lib/response-schemas" import { z } from "@hono/zod-openapi" -const logoutResponseSchema = z.object({ +const responseSchema = z.object({ success: z.literal(true), }) -const authLogoutRoute = createRoute({ +const openRoute = createRoute({ path: "/logout", method: "get", summary: "Logout", @@ -20,7 +20,7 @@ const authLogoutRoute = createRoute({ description: "Logout successful.", content: { "application/json": { - schema: logoutResponseSchema, + schema: responseSchema, }, }, }, @@ -29,7 +29,7 @@ const authLogoutRoute = createRoute({ }) export const LogoutCurrentSessionRoute = (handler: AppHandler) => { - handler.openapi(authLogoutRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const authSessionManager = new AuthSessionManager(ctx) const { user } = await authSessionManager.validateSession() diff --git a/src/v2/routes/auth/validate-current-session.ts b/src/v2/routes/auth/validate-current-session.ts index c4ac625..c30ee05 100644 --- a/src/v2/routes/auth/validate-current-session.ts +++ b/src/v2/routes/auth/validate-current-session.ts @@ -5,12 +5,12 @@ import { GenericResponses } from "@/v2/lib/response-schemas" import { z } from "@hono/zod-openapi" import { selectUserSchema } from "@/v2/db/schema" -const authValidationSchema = z.object({ +const responseSchema = z.object({ success: z.literal(true), user: selectUserSchema, }) -const authValidationRoute = createRoute({ +const openRoute = createRoute({ path: "/validate", method: "get", summary: "Validate current session", @@ -21,7 +21,7 @@ const authValidationRoute = createRoute({ description: "All user information is returned.", content: { "application/json": { - schema: authValidationSchema, + schema: responseSchema, }, }, }, @@ -30,7 +30,7 @@ const authValidationRoute = createRoute({ }) export const ValidateSessionRoute = (handler: AppHandler) => { - handler.openapi(authValidationRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const authSessionManager = new AuthSessionManager(ctx) const { user } = await authSessionManager.validateSession() diff --git a/src/v2/routes/category/all-categories.ts b/src/v2/routes/category/all-categories.ts index 8298568..7724565 100644 --- a/src/v2/routes/category/all-categories.ts +++ b/src/v2/routes/category/all-categories.ts @@ -6,12 +6,12 @@ import { createRoute } from "@hono/zod-openapi" import { z } from "@hono/zod-openapi" import { selectAssetCategorySchema } from "@/v2/db/schema" -export const getAllCategoriesResponseSchema = z.object({ +export const responseSchema = z.object({ success: z.literal(true), categories: selectAssetCategorySchema.array(), }) -const getAllCategoriesRoute = createRoute({ +const openRoute = createRoute({ path: "/all", method: "get", summary: "Get all categories", @@ -22,7 +22,7 @@ const getAllCategoriesRoute = createRoute({ description: "All categories.", content: { "application/json": { - schema: getAllCategoriesResponseSchema, + schema: responseSchema, }, }, }, @@ -31,7 +31,7 @@ const getAllCategoriesRoute = createRoute({ }) export const AllCategoriesRoute = (handler: AppHandler) => { - handler.openapi(getAllCategoriesRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const { drizzle } = await getConnection(ctx.env) const assetCategories = diff --git a/src/v2/routes/category/create-category.ts b/src/v2/routes/category/create-category.ts index cad0c0d..9bc5185 100644 --- a/src/v2/routes/category/create-category.ts +++ b/src/v2/routes/category/create-category.ts @@ -8,7 +8,7 @@ import { GenericResponses } from "@/v2/lib/response-schemas" import { z } from "@hono/zod-openapi" import { selectAssetCategorySchema } from "@/v2/db/schema" -export const createAssetCategorySchema = z.object({ +export const requestBodySchema = z.object({ name: z.string().min(3).max(32).openapi({ description: "The name of the asset category.", example: "splash-art", @@ -19,12 +19,12 @@ export const createAssetCategorySchema = z.object({ }), }) -export const createAssetCategoryResponseSchema = z.object({ +export const responseSchema = z.object({ success: z.literal(true), assetCategory: selectAssetCategorySchema, }) -const createAssetCategoryRoute = createRoute({ +const openRoute = createRoute({ path: "/create", method: "post", summary: "Create a category", @@ -34,7 +34,7 @@ const createAssetCategoryRoute = createRoute({ body: { content: { "application/json": { - schema: createAssetCategorySchema, + schema: requestBodySchema, }, }, }, @@ -44,7 +44,7 @@ const createAssetCategoryRoute = createRoute({ description: "Returns the new category.", content: { "application/json": { - schema: createAssetCategoryResponseSchema, + schema: responseSchema, }, }, }, @@ -53,7 +53,7 @@ const createAssetCategoryRoute = createRoute({ }) export const CreateCategoryRoute = (handler: AppHandler) => { - handler.openapi(createAssetCategoryRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const authSessionManager = new AuthSessionManager(ctx) const { user } = await authSessionManager.validateSession() diff --git a/src/v2/routes/category/delete-category.ts b/src/v2/routes/category/delete-category.ts index 469e4bd..567faf5 100644 --- a/src/v2/routes/category/delete-category.ts +++ b/src/v2/routes/category/delete-category.ts @@ -7,7 +7,7 @@ import { createRoute } from "@hono/zod-openapi" import { GenericResponses } from "@/v2/lib/response-schemas" import { z } from "@hono/zod-openapi" -export const deleteAssetCategorySchema = z.object({ +const paramsSchema = z.object({ id: z.string().openapi({ param: { name: "id", @@ -19,25 +19,25 @@ export const deleteAssetCategorySchema = z.object({ }), }) -export const deleteAssetCategoryResponseSchema = z.object({ +const responseSchema = z.object({ success: z.literal(true), }) -const deleteCategoryRoute = createRoute({ +const openRoute = createRoute({ path: "/{id}/delete", method: "delete", summary: "Delete a category", description: "Delete a category.", tags: ["Category"], request: { - params: deleteAssetCategorySchema, + params: paramsSchema, }, responses: { 200: { description: "Returns boolean indicating success.", content: { "application/json": { - schema: deleteAssetCategoryResponseSchema, + schema: responseSchema, }, }, }, @@ -46,7 +46,7 @@ const deleteCategoryRoute = createRoute({ }) export const DeleteAssetCategoryRoute = (handler: AppHandler) => { - handler.openapi(deleteCategoryRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const id = ctx.req.valid("param").id const { drizzle } = await getConnection(ctx.env) diff --git a/src/v2/routes/category/get-category.ts b/src/v2/routes/category/get-category.ts index c5c839e..3086605 100644 --- a/src/v2/routes/category/get-category.ts +++ b/src/v2/routes/category/get-category.ts @@ -7,7 +7,7 @@ import { z } from "@hono/zod-openapi" import { selectAssetCategorySchema } from "@/v2/db/schema" import { GenericResponses } from "@/v2/lib/response-schemas" -const getAssetCategoryByIdSchema = z.object({ +const paramsSchema = z.object({ id: z.string().openapi({ param: { name: "id", @@ -19,26 +19,26 @@ const getAssetCategoryByIdSchema = z.object({ }), }) -const getAssetCategoryByIdResponseSchema = z.object({ +const responseSchema = z.object({ success: z.literal(true), category: selectAssetCategorySchema, }) -const getAssetCategoryByIdRoute = createRoute({ +const openRoute = createRoute({ path: "/{id}", method: "get", summary: "Get a category", description: "Get a category by their ID.", tags: ["Category"], request: { - params: getAssetCategoryByIdSchema, + params: paramsSchema, }, responses: { 200: { description: "Category was found.", content: { "application/json": { - schema: getAssetCategoryByIdResponseSchema, + schema: responseSchema, }, }, }, @@ -47,7 +47,7 @@ const getAssetCategoryByIdRoute = createRoute({ }) export const GetCategoryByIdRoute = (handler: AppHandler) => { - handler.openapi(getAssetCategoryByIdRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const id = ctx.req.valid("param").id const { drizzle } = await getConnection(ctx.env) diff --git a/src/v2/routes/category/modify-category.ts b/src/v2/routes/category/modify-category.ts index c696e40..ceb9fab 100644 --- a/src/v2/routes/category/modify-category.ts +++ b/src/v2/routes/category/modify-category.ts @@ -7,7 +7,7 @@ import { createRoute } from "@hono/zod-openapi" import { GenericResponses } from "@/v2/lib/response-schemas" import { z } from "@hono/zod-openapi" -export const modifyAssetCategoryPathSchema = z.object({ +const paramsSchema = z.object({ id: z.string().openapi({ param: { name: "id", @@ -19,7 +19,7 @@ export const modifyAssetCategoryPathSchema = z.object({ }), }) -const modifyAssetCategorySchema = z.object({ +const requestBodySchema = z.object({ name: z.string().min(3).max(32).openapi({ description: "The new name of the category.", example: "splash-art", @@ -30,23 +30,23 @@ const modifyAssetCategorySchema = z.object({ }), }) -const modifyAssetCategoryResponseSchema = z.object({ +const responseSchema = z.object({ success: z.literal(true), assetCategory: selectAssetCategorySchema, }) -export const modifyAssetCategoryRoute = createRoute({ +const openRoute = createRoute({ path: "/{id}/modify", method: "patch", summary: "Modify a category", description: "Modify an existing category.", tags: ["Category"], request: { - params: modifyAssetCategoryPathSchema, + params: paramsSchema, body: { content: { "application/json": { - schema: modifyAssetCategorySchema, + schema: requestBodySchema, }, }, }, @@ -56,7 +56,7 @@ export const modifyAssetCategoryRoute = createRoute({ description: "Returns the new category attributes", content: { "application/json": { - schema: modifyAssetCategoryResponseSchema, + schema: responseSchema, }, }, }, @@ -65,7 +65,7 @@ export const modifyAssetCategoryRoute = createRoute({ }) export const ModifyAssetCategoryRoute = (handler: AppHandler) => { - handler.openapi(modifyAssetCategoryRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const authSessionManager = new AuthSessionManager(ctx) const { user } = await authSessionManager.validateSession() diff --git a/src/v2/routes/contributors/all-contributors.ts b/src/v2/routes/contributors/all-contributors.ts index 9ef28cc..5bdc69e 100644 --- a/src/v2/routes/contributors/all-contributors.ts +++ b/src/v2/routes/contributors/all-contributors.ts @@ -6,7 +6,7 @@ import { createRoute } from "@hono/zod-openapi" import { selectUserSchema } from "@/v2/db/schema" import { z } from "zod" -const contributorListSchema = z.object({ +const responseSchema = z.object({ success: z.literal(true), contributors: selectUserSchema .pick({ @@ -21,7 +21,7 @@ const contributorListSchema = z.object({ .array(), }) -const contributorsRoute = createRoute({ +const openRoute = createRoute({ path: "/all", method: "get", summary: "Get all contributors", @@ -32,7 +32,7 @@ const contributorsRoute = createRoute({ description: "All Contributors.", content: { "application/json": { - schema: contributorListSchema, + schema: responseSchema, }, }, }, @@ -43,7 +43,7 @@ const contributorsRoute = createRoute({ }) export const AllContributorsRoute = (handler: AppHandler) => { - handler.openapi(contributorsRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const { drizzle } = await getConnection(ctx.env) const contributors = await drizzle diff --git a/src/v2/routes/game/all-games.ts b/src/v2/routes/game/all-games.ts index 15633a4..d8d9ca0 100644 --- a/src/v2/routes/game/all-games.ts +++ b/src/v2/routes/game/all-games.ts @@ -6,12 +6,12 @@ import { createRoute } from "@hono/zod-openapi" import { z } from "@hono/zod-openapi" import { selectGameSchema } from "@/v2/db/schema" -export const getAllGamesResponse = z.object({ +const responseSchema = z.object({ success: z.literal(true), games: selectGameSchema.array(), }) -const getAllGamesRoute = createRoute({ +const openRoute = createRoute({ path: "/all", method: "get", summary: "Get all games", @@ -22,7 +22,7 @@ const getAllGamesRoute = createRoute({ description: "All games.", content: { "application/json": { - schema: getAllGamesResponse, + schema: responseSchema, }, }, }, @@ -31,7 +31,7 @@ const getAllGamesRoute = createRoute({ }) export const AllGamesRoute = (handler: AppHandler) => { - handler.openapi(getAllGamesRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const { drizzle } = await getConnection(ctx.env) const games = (await drizzle.select().from(game)) ?? [] diff --git a/src/v2/routes/game/create-game.ts b/src/v2/routes/game/create-game.ts index 5a93a97..17e197c 100644 --- a/src/v2/routes/game/create-game.ts +++ b/src/v2/routes/game/create-game.ts @@ -8,7 +8,7 @@ import { GenericResponses } from "@/v2/lib/response-schemas" import { z } from "@hono/zod-openapi" import { selectGameSchema } from "@/v2/db/schema" -export const createGameSchema = z.object({ +const requestBodySchema = z.object({ name: z.string().min(3).max(32).openapi({ description: "The name of the game.", example: "honkai-star-rail", @@ -30,12 +30,12 @@ export const createGameSchema = z.object({ .refine((value) => value === 1 || value === 0), }) -export const createGameResponse = z.object({ +const responseSchema = z.object({ success: z.literal(true), game: selectGameSchema, }) -const createGameRoute = createRoute({ +const openRoute = createRoute({ path: "/create", method: "post", summary: "Create a game", @@ -45,7 +45,7 @@ const createGameRoute = createRoute({ body: { content: { "application/json": { - schema: createGameSchema, + schema: requestBodySchema, }, }, }, @@ -55,7 +55,7 @@ const createGameRoute = createRoute({ description: "Returns the new game.", content: { "application/json": { - schema: createGameResponse, + schema: responseSchema, }, }, }, @@ -64,7 +64,7 @@ const createGameRoute = createRoute({ }) export const CreateGameRoute = (handler: AppHandler) => { - handler.openapi(createGameRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const authSessionManager = new AuthSessionManager(ctx) const { user } = await authSessionManager.validateSession() diff --git a/src/v2/routes/game/delete-game.ts b/src/v2/routes/game/delete-game.ts index e8a02d5..ffdf357 100644 --- a/src/v2/routes/game/delete-game.ts +++ b/src/v2/routes/game/delete-game.ts @@ -7,7 +7,7 @@ import { createRoute } from "@hono/zod-openapi" import { GenericResponses } from "@/v2/lib/response-schemas" import { z } from "@hono/zod-openapi" -export const deleteGameSchema = z.object({ +const paramsSchema = z.object({ id: z.string().openapi({ param: { name: "id", @@ -19,25 +19,25 @@ export const deleteGameSchema = z.object({ }), }) -export const deleteGameResponse = z.object({ +const responseSchema = z.object({ success: z.literal(true), }) -const deleteGameRoute = createRoute({ +const openRoute = createRoute({ path: "/{id}/delete", method: "delete", summary: "Delete a game", description: "Delete a game & all its related assets.", tags: ["Game"], request: { - params: deleteGameSchema, + params: paramsSchema, }, responses: { 200: { description: "Returns boolean indicating success.", content: { "application/json": { - schema: deleteGameResponse, + schema: responseSchema, }, }, }, @@ -46,7 +46,7 @@ const deleteGameRoute = createRoute({ }) export const DeleteGameRoute = (handler: AppHandler) => { - handler.openapi(deleteGameRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const id = ctx.req.valid("param").id const { drizzle } = await getConnection(ctx.env) diff --git a/src/v2/routes/game/get-game.ts b/src/v2/routes/game/get-game.ts index c59a690..615fcb4 100644 --- a/src/v2/routes/game/get-game.ts +++ b/src/v2/routes/game/get-game.ts @@ -7,7 +7,7 @@ import { z } from "@hono/zod-openapi" import { selectGameSchema } from "@/v2/db/schema" import { GenericResponses } from "@/v2/lib/response-schemas" -const getGameByIdSchema = z.object({ +const paramsSchema = z.object({ id: z.string().openapi({ param: { name: "id", @@ -19,26 +19,26 @@ const getGameByIdSchema = z.object({ }), }) -const getGameByIDResponse = z.object({ +const responseSchema = z.object({ success: z.literal(true), game: selectGameSchema, }) -const getGameByIdRoute = createRoute({ +const openRoute = createRoute({ path: "/{id}", method: "get", summary: "Get a game", description: "Get a game by their ID.", tags: ["Game"], request: { - params: getGameByIdSchema, + params: paramsSchema, }, responses: { 200: { description: "Game was found.", content: { "application/json": { - schema: getGameByIDResponse, + schema: responseSchema, }, }, }, @@ -47,7 +47,7 @@ const getGameByIdRoute = createRoute({ }) export const GetGameByIdRoute = (handler: AppHandler) => { - handler.openapi(getGameByIdRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const id = ctx.req.valid("param").id const { drizzle } = await getConnection(ctx.env) diff --git a/src/v2/routes/game/modify-game.ts b/src/v2/routes/game/modify-game.ts index 79c6052..9e65954 100644 --- a/src/v2/routes/game/modify-game.ts +++ b/src/v2/routes/game/modify-game.ts @@ -8,7 +8,7 @@ import { GenericResponses } from "@/v2/lib/response-schemas" import { z } from "@hono/zod-openapi" import { selectGameSchema } from "@/v2/db/schema" -export const modifyGamePathSchema = z.object({ +export const paramsSchema = z.object({ id: z.string().openapi({ param: { name: "id", @@ -20,7 +20,7 @@ export const modifyGamePathSchema = z.object({ }), }) -const modifyGameSchema = z.object({ +const requestBodySchema = z.object({ name: z.string().min(3).max(32).openapi({ description: "The new name of the game.", example: "honkai-star-rail", @@ -42,23 +42,23 @@ const modifyGameSchema = z.object({ .refine((value) => value === 1 || value === 0), }) -const modifyGameResponseSchema = z.object({ +const responseSchema = z.object({ success: z.literal(true), game: selectGameSchema, }) -export const modifyGameRoute = createRoute({ +const openRoute = createRoute({ path: "/{id}/modify", method: "patch", summary: "Modify a game", description: "Modify an existing game.", tags: ["Game"], request: { - params: modifyGamePathSchema, + params: paramsSchema, body: { content: { "application/json": { - schema: modifyGameSchema, + schema: requestBodySchema, }, }, }, @@ -68,7 +68,7 @@ export const modifyGameRoute = createRoute({ description: "Returns the game's attributes", content: { "application/json": { - schema: modifyGameResponseSchema, + schema: responseSchema, }, }, }, @@ -77,7 +77,7 @@ export const modifyGameRoute = createRoute({ }) export const ModifyGameRoute = (handler: AppHandler) => { - handler.openapi(modifyGameRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const authSessionManager = new AuthSessionManager(ctx) const { user } = await authSessionManager.validateSession() diff --git a/src/v2/routes/requests/all-requests.ts b/src/v2/routes/requests/all-requests.ts index 5557955..680b4ec 100644 --- a/src/v2/routes/requests/all-requests.ts +++ b/src/v2/routes/requests/all-requests.ts @@ -6,7 +6,7 @@ import { z } from "@hono/zod-openapi" import { selectRequestFormSchema } from "@/v2/db/schema" import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" -const viewAllRequestsSchema = z +const querySchema = z .object({ offset: z.string().openapi({ param: { @@ -26,12 +26,12 @@ const requestFormSchema = z.object({ upvotesCount: z.number().optional(), }) -const viewAllRequestsResponseSchema = z.object({ +const responseSchema = z.object({ success: z.literal(true), requests: z.array(requestFormSchema), }) -const getAllRequestsRoute = createRoute({ +const openRoute = createRoute({ path: "/all", method: "get", summary: "Get all requests", @@ -39,14 +39,14 @@ const getAllRequestsRoute = createRoute({ "Get all requests & associated upvotes count. Supporter required.", tags: ["Requests"], request: { - query: viewAllRequestsSchema, + query: querySchema, }, responses: { 200: { description: "List of all submitted requests.", content: { "application/json": { - schema: viewAllRequestsResponseSchema, + schema: responseSchema, }, }, }, @@ -55,7 +55,7 @@ const getAllRequestsRoute = createRoute({ }) export const AllRequestsRoute = (handler: AppHandler) => { - handler.openapi(getAllRequestsRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const { offset } = ctx.req.valid("query") ?? { offset: "0" } const authSessionManager = new AuthSessionManager(ctx) diff --git a/src/v2/routes/requests/create-request.ts b/src/v2/routes/requests/create-request.ts index 232dc3a..74fbccd 100644 --- a/src/v2/routes/requests/create-request.ts +++ b/src/v2/routes/requests/create-request.ts @@ -7,7 +7,7 @@ import { z } from "@hono/zod-openapi" import { requestForm, selectRequestFormSchema } from "@/v2/db/schema" import type { requestArea } from "@/v2/db/schema" -const createRequestFormEntrySchema = z.object({ +const requestBodySchema = z.object({ title: z.string().min(3).max(32).openapi({ description: "The title of the request.", example: "Add HSR UI assets", @@ -28,12 +28,12 @@ const createRequestFormEntrySchema = z.object({ }), }) -const createRequestFormEntryResponse = z.object({ +const responseSchema = z.object({ success: z.literal(true), response: selectRequestFormSchema, }) -const createRequestFormEntryRoute = createRoute({ +const openRoute = createRoute({ path: "/create", method: "post", summary: "Create request entry", @@ -44,7 +44,7 @@ const createRequestFormEntryRoute = createRoute({ body: { content: { "application/json": { - schema: createRequestFormEntrySchema, + schema: requestBodySchema, }, }, }, @@ -54,7 +54,7 @@ const createRequestFormEntryRoute = createRoute({ description: "Returns the new request form entry.", content: { "application/json": { - schema: createRequestFormEntryResponse, + schema: responseSchema, }, }, }, @@ -63,7 +63,7 @@ const createRequestFormEntryRoute = createRoute({ }) export const CreateRequestFormEntryRoute = (handler: AppHandler) => { - handler.openapi(createRequestFormEntryRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const { area, title, description } = ctx.req.valid("json") const authSessionManager = new AuthSessionManager(ctx) diff --git a/src/v2/routes/requests/delete-request.ts b/src/v2/routes/requests/delete-request.ts index 63d9f34..f1c5678 100644 --- a/src/v2/routes/requests/delete-request.ts +++ b/src/v2/routes/requests/delete-request.ts @@ -7,7 +7,7 @@ import { z } from "@hono/zod-openapi" import { requestForm } from "@/v2/db/schema" import { eq } from "drizzle-orm" -export const deleteRequestByIdSchema = z.object({ +const paramsSchema = z.object({ id: z.string().openapi({ param: { name: "id", @@ -19,11 +19,11 @@ export const deleteRequestByIdSchema = z.object({ }), }) -export const deleteRequestByIdResponseSchema = z.object({ +const responseSchema = z.object({ success: z.literal(true), }) -const deleteRequestByIdRoute = createRoute({ +const openRoute = createRoute({ path: "/{id}/delete", method: "delete", summary: "Delete a request", @@ -31,14 +31,14 @@ const deleteRequestByIdRoute = createRoute({ "Delete a request by its ID. This will also delete all associated upvotes.", tags: ["Requests"], request: { - params: deleteRequestByIdSchema, + params: paramsSchema, }, responses: { 200: { description: "True if the request was deleted successfully.", content: { "application/json": { - schema: deleteRequestByIdResponseSchema, + schema: responseSchema, }, }, }, @@ -47,7 +47,7 @@ const deleteRequestByIdRoute = createRoute({ }) export const DeleteRequestByIdRoute = (handler: AppHandler) => { - handler.openapi(deleteRequestByIdRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const requestId = ctx.req.valid("param").id const authSessionManager = new AuthSessionManager(ctx) diff --git a/src/v2/routes/requests/remove-request-upvote.ts b/src/v2/routes/requests/remove-request-upvote.ts index 92d10b0..38132e2 100644 --- a/src/v2/routes/requests/remove-request-upvote.ts +++ b/src/v2/routes/requests/remove-request-upvote.ts @@ -7,7 +7,7 @@ import { z } from "@hono/zod-openapi" import { requestForm, requestFormUpvotes } from "@/v2/db/schema" import { eq } from "drizzle-orm" -export const removeRequestUpvoteByIdSchema = z.object({ +const paramsSchema = z.object({ id: z.string().openapi({ param: { name: "id", @@ -19,18 +19,18 @@ export const removeRequestUpvoteByIdSchema = z.object({ }), }) -export const removeRequestUpvoteByIdResponseSchema = z.object({ +const responseSchema = z.object({ success: z.literal(true), }) -const removeRequestUpvoteByIdRoute = createRoute({ +const openRoute = createRoute({ path: "/{id}/downvote", method: "post", summary: "Remove upvote on a request", description: "Remove a upvote on a request by its ID. Supporter required.", tags: ["Requests"], request: { - params: removeRequestUpvoteByIdSchema, + params: paramsSchema, }, responses: { 200: { @@ -38,7 +38,7 @@ const removeRequestUpvoteByIdRoute = createRoute({ "True if the request's upvote was removed successfully.", content: { "application/json": { - schema: removeRequestUpvoteByIdResponseSchema, + schema: responseSchema, }, }, }, @@ -47,7 +47,7 @@ const removeRequestUpvoteByIdRoute = createRoute({ }) export const RemoveRequestUpvoteRoute = (handler: AppHandler) => { - handler.openapi(removeRequestUpvoteByIdRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const requestId = ctx.req.valid("param").id const authSessionManager = new AuthSessionManager(ctx) diff --git a/src/v2/routes/requests/upvote-request.ts b/src/v2/routes/requests/upvote-request.ts index c6f1fe2..e5eef30 100644 --- a/src/v2/routes/requests/upvote-request.ts +++ b/src/v2/routes/requests/upvote-request.ts @@ -7,7 +7,7 @@ import { z } from "@hono/zod-openapi" import { requestForm, requestFormUpvotes } from "@/v2/db/schema" import { eq } from "drizzle-orm" -export const upvoteRequestByIdSchema = z.object({ +const paramsSchema = z.object({ id: z.string().openapi({ param: { name: "id", @@ -19,25 +19,25 @@ export const upvoteRequestByIdSchema = z.object({ }), }) -export const upvoteRequestByIdResponseSchema = z.object({ +const responseSchema = z.object({ success: z.literal(true), }) -const upvoteRequestByIdRoute = createRoute({ +const openRoute = createRoute({ path: "/{id}/upvote", method: "post", summary: "Upvote a request", description: "Upvote a request by its ID. Supporter required.", tags: ["Requests"], request: { - params: upvoteRequestByIdSchema, + params: paramsSchema, }, responses: { 200: { description: "True if the request was upvoted successfully.", content: { "application/json": { - schema: upvoteRequestByIdResponseSchema, + schema: responseSchema, }, }, }, @@ -46,7 +46,7 @@ const upvoteRequestByIdRoute = createRoute({ }) export const UpvoteRequestRoute = (handler: AppHandler) => { - handler.openapi(upvoteRequestByIdRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const requestId = ctx.req.valid("param").id const authSessionManager = new AuthSessionManager(ctx) diff --git a/src/v2/routes/requests/view-request.ts b/src/v2/routes/requests/view-request.ts index f1560d8..06b3f0e 100644 --- a/src/v2/routes/requests/view-request.ts +++ b/src/v2/routes/requests/view-request.ts @@ -7,7 +7,7 @@ import { z } from "@hono/zod-openapi" import { requestForm, selectRequestFormSchema } from "@/v2/db/schema" import { eq } from "drizzle-orm" -export const viewRequestByIdSchema = z.object({ +const paramsSchema = z.object({ id: z.string().openapi({ param: { name: "id", @@ -19,26 +19,26 @@ export const viewRequestByIdSchema = z.object({ }), }) -export const viewRequestByIdResponseSchema = z.object({ +const responseSchema = z.object({ success: z.literal(true), request: selectRequestFormSchema, }) -const viewRequestByIdRoute = createRoute({ +const openRoute = createRoute({ path: "/{id}", method: "get", summary: "View a request", description: "View a request by its ID. Supporter required.", tags: ["Requests"], request: { - params: viewRequestByIdSchema, + params: paramsSchema, }, responses: { 200: { description: "The request was found and returned successfully.", content: { "application/json": { - schema: viewRequestByIdResponseSchema, + schema: responseSchema, }, }, }, @@ -47,7 +47,7 @@ const viewRequestByIdRoute = createRoute({ }) export const ViewRequestRoute = (handler: AppHandler) => { - handler.openapi(viewRequestByIdRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const requestId = ctx.req.valid("param").id const authSessionManager = new AuthSessionManager(ctx) diff --git a/src/v2/routes/tags/all-tags.ts b/src/v2/routes/tags/all-tags.ts index 84822ac..5ef4e47 100644 --- a/src/v2/routes/tags/all-tags.ts +++ b/src/v2/routes/tags/all-tags.ts @@ -6,12 +6,12 @@ import { createRoute } from "@hono/zod-openapi" import { z } from "@hono/zod-openapi" import { selectAssetTagSchema } from "@/v2/db/schema" -export const getAllTagsResponse = z.object({ +const responseSchema = z.object({ success: z.literal(true), tags: selectAssetTagSchema.array(), }) -const getAllTagsRoute = createRoute({ +const openRoute = createRoute({ path: "/all", method: "get", summary: "Get all tags", @@ -22,7 +22,7 @@ const getAllTagsRoute = createRoute({ description: "All tags.", content: { "application/json": { - schema: getAllTagsResponse, + schema: responseSchema, }, }, }, @@ -31,7 +31,7 @@ const getAllTagsRoute = createRoute({ }) export const AllTagsRoute = (handler: AppHandler) => { - handler.openapi(getAllTagsRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const { drizzle } = await getConnection(ctx.env) const tags = (await drizzle.select().from(assetTag)) ?? [] diff --git a/src/v2/routes/tags/create-tag.ts b/src/v2/routes/tags/create-tag.ts index c9d1efb..011f94e 100644 --- a/src/v2/routes/tags/create-tag.ts +++ b/src/v2/routes/tags/create-tag.ts @@ -8,7 +8,7 @@ import { GenericResponses } from "@/v2/lib/response-schemas" import { z } from "@hono/zod-openapi" import { selectAssetTagSchema } from "@/v2/db/schema" -export const createTagSchema = z.object({ +const requestBodySchema = z.object({ name: z.string().min(3).max(32).openapi({ description: "The name of the tag.", example: "official", @@ -19,12 +19,12 @@ export const createTagSchema = z.object({ }), }) -export const createTagResponse = z.object({ +const responseSchema = z.object({ success: z.literal(true), tag: selectAssetTagSchema, }) -const createTagRoute = createRoute({ +const openRoute = createRoute({ path: "/create", method: "post", summary: "Create a tag", @@ -34,7 +34,7 @@ const createTagRoute = createRoute({ body: { content: { "application/json": { - schema: createTagSchema, + schema: requestBodySchema, }, }, }, @@ -44,7 +44,7 @@ const createTagRoute = createRoute({ description: "Returns the new tag.", content: { "application/json": { - schema: createTagResponse, + schema: responseSchema, }, }, }, @@ -53,7 +53,7 @@ const createTagRoute = createRoute({ }) export const CreateTagRoute = (handler: AppHandler) => { - handler.openapi(createTagRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const authSessionManager = new AuthSessionManager(ctx) const { user } = await authSessionManager.validateSession() diff --git a/src/v2/routes/tags/delete-tag.ts b/src/v2/routes/tags/delete-tag.ts index 76b0023..f202eb0 100644 --- a/src/v2/routes/tags/delete-tag.ts +++ b/src/v2/routes/tags/delete-tag.ts @@ -7,7 +7,7 @@ import { createRoute } from "@hono/zod-openapi" import { GenericResponses } from "@/v2/lib/response-schemas" import { z } from "@hono/zod-openapi" -export const deleteTagSchema = z.object({ +const paramsSchema = z.object({ id: z.string().openapi({ param: { name: "id", @@ -19,25 +19,25 @@ export const deleteTagSchema = z.object({ }), }) -export const deleteTagResponseSchema = z.object({ +const responseSchema = z.object({ success: z.literal(true), }) -const deleteTagRoute = createRoute({ +const openRoute = createRoute({ path: "/{id}/delete", method: "delete", summary: "Delete a tag", description: "Delete a tag.", tags: ["Tags"], request: { - params: deleteTagSchema, + params: paramsSchema, }, responses: { 200: { description: "Returns boolean indicating success.", content: { "application/json": { - schema: deleteTagResponseSchema, + schema: responseSchema, }, }, }, @@ -46,7 +46,7 @@ const deleteTagRoute = createRoute({ }) export const DeleteTagRoute = (handler: AppHandler) => { - handler.openapi(deleteTagRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const id = ctx.req.valid("param").id const { drizzle } = await getConnection(ctx.env) diff --git a/src/v2/routes/tags/get-tag.ts b/src/v2/routes/tags/get-tag.ts index 1f0699e..df35e2c 100644 --- a/src/v2/routes/tags/get-tag.ts +++ b/src/v2/routes/tags/get-tag.ts @@ -7,7 +7,7 @@ import { z } from "@hono/zod-openapi" import { selectAssetTagSchema } from "@/v2/db/schema" import { GenericResponses } from "@/v2/lib/response-schemas" -const getTagByIdSchema = z.object({ +const paramsSchema = z.object({ id: z.string().openapi({ param: { name: "id", @@ -19,26 +19,26 @@ const getTagByIdSchema = z.object({ }), }) -const getTagByIDResponseSchema = z.object({ +const responseSchema = z.object({ success: z.literal(true), tag: selectAssetTagSchema, }) -const getTagByIdRoute = createRoute({ +const openRoute = createRoute({ path: "/{id}", method: "get", summary: "Get a tag", description: "Get tag by their ID.", tags: ["Tags"], request: { - params: getTagByIdSchema, + params: paramsSchema, }, responses: { 200: { description: "Tag was found.", content: { "application/json": { - schema: getTagByIDResponseSchema, + schema: responseSchema, }, }, }, @@ -47,7 +47,7 @@ const getTagByIdRoute = createRoute({ }) export const GetTagByIdRoute = (handler: AppHandler) => { - handler.openapi(getTagByIdRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const id = ctx.req.valid("param").id const { drizzle } = await getConnection(ctx.env) diff --git a/src/v2/routes/tags/modify-tag.ts b/src/v2/routes/tags/modify-tag.ts index 42a6f52..96ddd7d 100644 --- a/src/v2/routes/tags/modify-tag.ts +++ b/src/v2/routes/tags/modify-tag.ts @@ -7,7 +7,7 @@ import { createRoute } from "@hono/zod-openapi" import { GenericResponses } from "@/v2/lib/response-schemas" import { z } from "@hono/zod-openapi" -export const modifyAssetTagPathSchema = z.object({ +const paramsSchema = z.object({ id: z.string().openapi({ param: { name: "id", @@ -19,7 +19,7 @@ export const modifyAssetTagPathSchema = z.object({ }), }) -const modifyTagSchema = z.object({ +const requestBodySchema = z.object({ name: z.string().min(3).max(32).openapi({ description: "The new name of the tag.", example: "official", @@ -30,23 +30,23 @@ const modifyTagSchema = z.object({ }), }) -const modifyTagResponseSchema = z.object({ +const responseSchema = z.object({ success: z.literal(true), tag: selectAssetTagSchema, }) -export const modifyTagRoute = createRoute({ +const openRoute = createRoute({ path: "/{id}/modify", method: "patch", summary: "Modify a tag", description: "Modify an existing tag.", tags: ["Tags"], request: { - params: modifyAssetTagPathSchema, + params: paramsSchema, body: { content: { "application/json": { - schema: modifyTagSchema, + schema: requestBodySchema, }, }, }, @@ -56,7 +56,7 @@ export const modifyTagRoute = createRoute({ description: "Returns the tag's attributes", content: { "application/json": { - schema: modifyTagResponseSchema, + schema: responseSchema, }, }, }, @@ -65,7 +65,7 @@ export const modifyTagRoute = createRoute({ }) export const ModifyTagRoute = (handler: AppHandler) => { - handler.openapi(modifyTagRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const authSessionManager = new AuthSessionManager(ctx) const { user } = await authSessionManager.validateSession() diff --git a/src/v2/routes/user/block-user.ts b/src/v2/routes/user/block-user.ts index f954fc1..11a04a5 100644 --- a/src/v2/routes/user/block-user.ts +++ b/src/v2/routes/user/block-user.ts @@ -7,7 +7,7 @@ import { createRoute } from "@hono/zod-openapi" import { GenericResponses } from "@/v2/lib/response-schemas" import { z } from "@hono/zod-openapi" -const blockUserByIdSchema = z.object({ +const paramsSchema = z.object({ id: z.string().openapi({ param: { description: "The id of the user to block.", @@ -18,25 +18,25 @@ const blockUserByIdSchema = z.object({ }), }) -const blockUserByIdResponseSchema = z.object({ +const responseSchema = z.object({ success: z.literal(true), }) -export const blockUserByIdRoute = createRoute({ +const openRoute = createRoute({ path: "/{id}/block", method: "post", summary: "Block a user", description: "Block a user from their ID.", tags: ["User"], request: { - params: blockUserByIdSchema, + params: paramsSchema, }, responses: { 200: { description: "True if the user was blocked.", content: { "application/json": { - schema: blockUserByIdResponseSchema, + schema: responseSchema, }, }, }, @@ -45,7 +45,7 @@ export const blockUserByIdRoute = createRoute({ }) export const BlockUserRoute = (handler: AppHandler) => { - handler.openapi(blockUserByIdRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const userId = ctx.req.valid("param").id const { drizzle } = await getConnection(ctx.env) diff --git a/src/v2/routes/user/follow-user.ts b/src/v2/routes/user/follow-user.ts index 2a0d44c..62a0b5d 100644 --- a/src/v2/routes/user/follow-user.ts +++ b/src/v2/routes/user/follow-user.ts @@ -7,7 +7,7 @@ import { createRoute } from "@hono/zod-openapi" import { GenericResponses } from "@/v2/lib/response-schemas" import { z } from "@hono/zod-openapi" -const followUserByIdSchema = z.object({ +const paramsSchema = z.object({ id: z.string().openapi({ param: { description: "The id of the user to follow.", @@ -18,25 +18,25 @@ const followUserByIdSchema = z.object({ }), }) -const followUserByIdResponseSchema = z.object({ +const responseSchema = z.object({ success: z.literal(true), }) -export const followUserByIdRoute = createRoute({ +const openRoute = createRoute({ path: "/{id}/follow", method: "post", summary: "Follow a user", description: "Follow a user from their ID.", tags: ["User"], request: { - params: followUserByIdSchema, + params: paramsSchema, }, responses: { 200: { description: "True if the user was followed.", content: { "application/json": { - schema: followUserByIdResponseSchema, + schema: responseSchema, }, }, }, @@ -45,7 +45,7 @@ export const followUserByIdRoute = createRoute({ }) export const FollowUserRoute = (handler: AppHandler) => { - handler.openapi(followUserByIdRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const userId = ctx.req.valid("param").id const { drizzle } = await getConnection(ctx.env) diff --git a/src/v2/routes/user/get-user.ts b/src/v2/routes/user/get-user.ts index 2834bbd..e178029 100644 --- a/src/v2/routes/user/get-user.ts +++ b/src/v2/routes/user/get-user.ts @@ -7,7 +7,7 @@ import { GenericResponses } from "@/v2/lib/response-schemas" import { z } from "@hono/zod-openapi" import { selectUserSchema } from "@/v2/db/schema" -const getUserByIdSchema = z.object({ +const paramsSchema = z.object({ id: z.string().openapi({ param: { name: "id", @@ -18,7 +18,7 @@ const getUserByIdSchema = z.object({ }), }) -const getUserByIdResponseSchema = z.object({ +const responseSchema = z.object({ success: z.literal(true), user: selectUserSchema.pick({ id: true, @@ -35,21 +35,21 @@ const getUserByIdResponseSchema = z.object({ }), }) -const getUserByIdRoute = createRoute({ +const openRoute = createRoute({ path: "/{id}", method: "get", summary: "Get a user", description: "Get a user by their ID.", tags: ["User"], request: { - params: getUserByIdSchema, + params: paramsSchema, }, responses: { 200: { description: "The user was found.", content: { "application/json": { - schema: getUserByIdResponseSchema, + schema: responseSchema, }, }, }, @@ -58,7 +58,7 @@ const getUserByIdRoute = createRoute({ }) export const GetUserByIdRoute = (handler: AppHandler) => { - handler.openapi(getUserByIdRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const userId = ctx.req.valid("param").id const { drizzle } = await getConnection(ctx.env) diff --git a/src/v2/routes/user/search-users.ts b/src/v2/routes/user/search-users.ts index 98cc4b5..b09368a 100644 --- a/src/v2/routes/user/search-users.ts +++ b/src/v2/routes/user/search-users.ts @@ -7,7 +7,7 @@ import { GenericResponses } from "@/v2/lib/response-schemas" import { z } from "@hono/zod-openapi" import { selectUserSchema } from "@/v2/db/schema" -const getUsersByNameSchema = z.object({ +const paramsSchema = z.object({ username: z.string().openapi({ param: { name: "username", @@ -18,7 +18,7 @@ const getUsersByNameSchema = z.object({ }), }) -const searchUsersByUsernameSchema = z.object({ +const responseSchema = z.object({ success: z.literal(true), users: selectUserSchema .pick({ @@ -37,21 +37,21 @@ const searchUsersByUsernameSchema = z.object({ .array(), }) -const searchUsersByUsernameRoute = createRoute({ +const openRoute = createRoute({ path: "/search/{username}", method: "get", summary: "Search for users", description: "Search for users by their username.", tags: ["User"], request: { - params: getUsersByNameSchema, + params: paramsSchema, }, responses: { 200: { description: "User(s) were found.", content: { "application/json": { - schema: searchUsersByUsernameSchema, + schema: responseSchema, }, }, }, @@ -60,7 +60,7 @@ const searchUsersByUsernameRoute = createRoute({ }) export const SearchUsersByUsernameRoute = (handler: AppHandler) => { - handler.openapi(searchUsersByUsernameRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const userQuery = ctx.req.valid("param").username const { drizzle } = await getConnection(ctx.env) diff --git a/src/v2/routes/user/unblock-user.ts b/src/v2/routes/user/unblock-user.ts index 633376f..4bebe67 100644 --- a/src/v2/routes/user/unblock-user.ts +++ b/src/v2/routes/user/unblock-user.ts @@ -7,7 +7,7 @@ import { createRoute } from "@hono/zod-openapi" import { GenericResponses } from "@/v2/lib/response-schemas" import { z } from "@hono/zod-openapi" -const unblockUserByIdSchema = z.object({ +const paramsSchema = z.object({ id: z.string().openapi({ param: { description: "The id of the user to unblock.", @@ -18,25 +18,25 @@ const unblockUserByIdSchema = z.object({ }), }) -const unblockUserByIdResponseSchema = z.object({ +const responseSchema = z.object({ success: z.literal(true), }) -export const unblockUserByIdRoute = createRoute({ +const openRoute = createRoute({ path: "/{id}/block", method: "post", summary: "Unblock a user", description: "Unblock a user from their ID.", tags: ["User"], request: { - params: unblockUserByIdSchema, + params: paramsSchema, }, responses: { 200: { description: "True if the user was unblocked.", content: { "application/json": { - schema: unblockUserByIdResponseSchema, + schema: responseSchema, }, }, }, @@ -45,7 +45,7 @@ export const unblockUserByIdRoute = createRoute({ }) export const UnblockUserRoute = (handler: AppHandler) => { - handler.openapi(unblockUserByIdRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const userId = ctx.req.valid("param").id const { drizzle } = await getConnection(ctx.env) diff --git a/src/v2/routes/user/unfollow-user.ts b/src/v2/routes/user/unfollow-user.ts index b8ed00f..47cda2e 100644 --- a/src/v2/routes/user/unfollow-user.ts +++ b/src/v2/routes/user/unfollow-user.ts @@ -7,7 +7,7 @@ import { createRoute } from "@hono/zod-openapi" import { GenericResponses } from "@/v2/lib/response-schemas" import { z } from "@hono/zod-openapi" -const unfollowUserByIdSchema = z.object({ +const paramsSchema = z.object({ id: z.string().openapi({ param: { description: "The id of the user to unfollow.", @@ -18,25 +18,25 @@ const unfollowUserByIdSchema = z.object({ }), }) -const unfollowUserByIdResponseSchema = z.object({ +const responseSchema = z.object({ success: z.literal(true), }) -const unFollowUserByIdRoute = createRoute({ +const openRoute = createRoute({ path: "/{id}/unfollow", method: "post", summary: "Unfollow a user", description: "Follow a user from their ID.", tags: ["User"], request: { - params: unfollowUserByIdSchema, + params: paramsSchema, }, responses: { 200: { description: "True if the user was unfollowed.", content: { "application/json": { - schema: unfollowUserByIdResponseSchema, + schema: responseSchema, }, }, }, @@ -45,7 +45,7 @@ const unFollowUserByIdRoute = createRoute({ }) export const UnfollowUserRoute = (handler: AppHandler) => { - handler.openapi(unFollowUserByIdRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const userId = ctx.req.valid("param").id const { drizzle } = await getConnection(ctx.env) diff --git a/src/v2/routes/user/user-followers.ts b/src/v2/routes/user/user-followers.ts index 05828fb..3248041 100644 --- a/src/v2/routes/user/user-followers.ts +++ b/src/v2/routes/user/user-followers.ts @@ -5,7 +5,7 @@ import { GenericResponses } from "@/v2/lib/response-schemas" import { z } from "@hono/zod-openapi" import { selectUserFollowingSchema, selectUserSchema } from "@/v2/db/schema" -const viewUserFollowsbyIdSchema = z.object({ +const paramsSchema = z.object({ id: z.string().openapi({ param: { description: "User ID to view who follows them", @@ -16,7 +16,7 @@ const viewUserFollowsbyIdSchema = z.object({ }), }) -const viewUserFollowsbyIdOffsetSchema = z.object({ +const querySchema = z.object({ offset: z .string() .optional() @@ -30,7 +30,7 @@ const viewUserFollowsbyIdOffsetSchema = z.object({ }), }) -export const viewUserFollowsbyIdResponseSchema = z.object({ +const responseSchema = z.object({ success: z.literal(true), followers: z.array( selectUserFollowingSchema.extend({ @@ -46,15 +46,15 @@ export const viewUserFollowsbyIdResponseSchema = z.object({ ), }) -const viewUserFollowsByIdRoute = createRoute({ +const openRoute = createRoute({ path: "/{id}/followers", method: "get", summary: "View a user's followers", description: "View a user's followers from their ID.", tags: ["User"], request: { - params: viewUserFollowsbyIdSchema, - query: viewUserFollowsbyIdOffsetSchema, + params: paramsSchema, + query: querySchema, }, responses: { 200: { @@ -62,7 +62,7 @@ const viewUserFollowsByIdRoute = createRoute({ "List of a user's followers. Only 100 showed at a time, use pagination.", content: { "application/json": { - schema: viewUserFollowsbyIdResponseSchema, + schema: responseSchema, }, }, }, @@ -71,7 +71,7 @@ const viewUserFollowsByIdRoute = createRoute({ }) export const ViewUsersFollowersRoute = (handler: AppHandler) => { - handler.openapi(viewUserFollowsByIdRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const { id } = ctx.req.valid("param") const { offset } = ctx.req.valid("query") diff --git a/src/v2/routes/user/user-following.ts b/src/v2/routes/user/user-following.ts index 63db50c..ad4d078 100644 --- a/src/v2/routes/user/user-following.ts +++ b/src/v2/routes/user/user-following.ts @@ -5,7 +5,7 @@ import { GenericResponses } from "@/v2/lib/response-schemas" import { z } from "@hono/zod-openapi" import { selectUserFollowingSchema, selectUserSchema } from "@/v2/db/schema" -const viewUserfollowingbyIdSchema = z.object({ +const paramsSchema = z.object({ id: z.string().openapi({ param: { description: "User ID to view who they're following", @@ -16,7 +16,7 @@ const viewUserfollowingbyIdSchema = z.object({ }), }) -const viewUserFollowingOffsetSchema = z.object({ +const querySchema = z.object({ offset: z .string() .optional() @@ -30,7 +30,7 @@ const viewUserFollowingOffsetSchema = z.object({ }), }) -const viewUserfollowingbyIdResponseSchema = z.object({ +const responseSchema = z.object({ success: z.literal(true), following: z.array( selectUserFollowingSchema.extend({ @@ -46,15 +46,15 @@ const viewUserfollowingbyIdResponseSchema = z.object({ ), }) -const viewUserfollowingbyIdRoute = createRoute({ +const openRoute = createRoute({ path: "/{id}/following", method: "get", summary: "View who a user's following", description: "View who a user's following from their ID.", tags: ["User"], request: { - params: viewUserfollowingbyIdSchema, - query: viewUserFollowingOffsetSchema, + params: paramsSchema, + query: querySchema, }, responses: { 200: { @@ -62,7 +62,7 @@ const viewUserfollowingbyIdRoute = createRoute({ "List of who a user's following. Only 100 showed at a time, use pagination.", content: { "application/json": { - schema: viewUserfollowingbyIdResponseSchema, + schema: responseSchema, }, }, }, @@ -71,7 +71,7 @@ const viewUserfollowingbyIdRoute = createRoute({ }) export const ViewUsersFollowingRoute = (handler: AppHandler) => - handler.openapi(viewUserfollowingbyIdRoute, async (ctx) => { + handler.openapi(openRoute, async (ctx) => { const { id } = ctx.req.valid("param") const { offset } = ctx.req.valid("query") From 22151a64ee175b0eb55f34e91a82bdd3296817b8 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Wed, 20 Mar 2024 00:13:55 +0000 Subject: [PATCH 293/318] allow collection order --- src/scripts/seed/seed.ts | 2 ++ src/v2/db/schema/collections/user-collections.ts | 1 + 2 files changed, 3 insertions(+) diff --git a/src/scripts/seed/seed.ts b/src/scripts/seed/seed.ts index cd0187b..917c59e 100644 --- a/src/scripts/seed/seed.ts +++ b/src/scripts/seed/seed.ts @@ -535,10 +535,12 @@ async function main() { .values([ { collectionId: newUserCollections[0].id, + order: 0, assetId: newAssets[0].id, }, { collectionId: newUserCollections[0].id, + order: 1, assetId: newAssets[1].id, }, ]) diff --git a/src/v2/db/schema/collections/user-collections.ts b/src/v2/db/schema/collections/user-collections.ts index 76d4345..4c12f46 100644 --- a/src/v2/db/schema/collections/user-collections.ts +++ b/src/v2/db/schema/collections/user-collections.ts @@ -85,6 +85,7 @@ export const userCollectionAsset = sqliteTable( onUpdate: "cascade", onDelete: "cascade", }), + order: integer("order").notNull(), dateAdded: text("date_added") .notNull() .$defaultFn(() => { From d547d7b037e7c25a4669e7ccf300b4154e6a7885 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Wed, 20 Mar 2024 00:25:40 +0000 Subject: [PATCH 294/318] ok bro --- src/v2/routes/asset/upload-asset.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/v2/routes/asset/upload-asset.ts b/src/v2/routes/asset/upload-asset.ts index c574c45..3edaee6 100644 --- a/src/v2/routes/asset/upload-asset.ts +++ b/src/v2/routes/asset/upload-asset.ts @@ -6,6 +6,7 @@ import { assetTagAsset } from "@/v2/db/schema" import { createRoute } from "@hono/zod-openapi" import { GenericResponses } from "@/v2/lib/response-schemas" import { z } from "@hono/zod-openapi" +import { generateID } from "@/v2/lib/oslo" const AcceptedImageType = "image/png" const MaxFileSize = 5 * 1024 * 1024 @@ -135,14 +136,17 @@ export const UploadAssetRoute = (handler: AppHandler) => const { drizzle } = getConnection(ctx.env) + const randomId = generateID() + const { key } = await ctx.env.FILES_BUCKET.put( - `/assets/${gameId}/${assetCategoryId}/${name}.png`, + `/assets/${randomId}.png`, asset ) const createdAsset = await drizzle .insert(asset) .values({ + id: randomId, name: name, extension: "png", gameId: gameId, From 726d52deecdfa83f2fcc0a02481317f45ee0b6f0 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Thu, 21 Mar 2024 03:07:02 +0000 Subject: [PATCH 295/318] what the fuck --- src/v2/lib/helpers/check-image-tags.ts | 39 ++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/v2/lib/helpers/check-image-tags.ts diff --git a/src/v2/lib/helpers/check-image-tags.ts b/src/v2/lib/helpers/check-image-tags.ts new file mode 100644 index 0000000..99b2993 --- /dev/null +++ b/src/v2/lib/helpers/check-image-tags.ts @@ -0,0 +1,39 @@ +type ModerationResponse = { + moderationLabels: { + labels: { + name: string + confidence: number + }[] + }[] +} + +export async function CheckLabels( + ctx: APIContext, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + image: any // yolo +): Promise { + if (ctx.env.ENVIRONMENT === "DEV") return + + try { + const res = await fetch( + "https://aws-moderation.dromzeh.workers.dev/labels", + { + method: "POST", + body: image, + headers: { + Authorization: `Bearer ${ctx.env.REKOGNITION_LABEL_API_KEY}`, + }, + } + ) + + if (res.status !== 200) { + throw new Error("Failed to check image labels") + } + + const data = (await res.json()) as ModerationResponse + + return data.moderationLabels.length > 0 + } catch (error) { + throw new Error("Failed to check image labels") + } +} From 006d36fceff387520f89852879d97178ab7172f2 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Thu, 21 Mar 2024 19:33:29 +0000 Subject: [PATCH 296/318] upload banner/avatar, rekognition support --- src/v2/routes/asset/get-comment-replies.ts | 2 +- src/v2/routes/asset/upload-asset.ts | 13 +++ src/v2/routes/auth/handler.ts | 5 + src/v2/routes/auth/upload-avatar.ts | 117 +++++++++++++++++++++ src/v2/routes/auth/upload-banner.ts | 117 +++++++++++++++++++++ src/v2/routes/category/all-categories.ts | 2 +- src/v2/routes/category/create-category.ts | 4 +- 7 files changed, 256 insertions(+), 4 deletions(-) create mode 100644 src/v2/routes/auth/upload-avatar.ts create mode 100644 src/v2/routes/auth/upload-banner.ts diff --git a/src/v2/routes/asset/get-comment-replies.ts b/src/v2/routes/asset/get-comment-replies.ts index de3eb8b..577f583 100644 --- a/src/v2/routes/asset/get-comment-replies.ts +++ b/src/v2/routes/asset/get-comment-replies.ts @@ -88,7 +88,7 @@ export const GetCommentsRepliesRoute = (handler: AppHandler) => { comment: assetComments.comment, createdAt: assetComments.createdAt, hasReplies: sql`EXISTS (SELECT 1 FROM assetComments AS ac WHERE ac.parent_comment_id = ${assetComments.id})`, - likes: sql`COUNT(${assetCommentsLikes.commentId})`, + likes: sql`COUNT(${assetCommentsLikes.commentId})`, }) .from(assetComments) .where(eq(assetComments.parentCommentId, commentId)) diff --git a/src/v2/routes/asset/upload-asset.ts b/src/v2/routes/asset/upload-asset.ts index 3edaee6..cd6c0e2 100644 --- a/src/v2/routes/asset/upload-asset.ts +++ b/src/v2/routes/asset/upload-asset.ts @@ -7,6 +7,7 @@ import { createRoute } from "@hono/zod-openapi" import { GenericResponses } from "@/v2/lib/response-schemas" import { z } from "@hono/zod-openapi" import { generateID } from "@/v2/lib/oslo" +import { CheckLabels } from "@/v2/lib/helpers/check-image-tags" const AcceptedImageType = "image/png" const MaxFileSize = 5 * 1024 * 1024 @@ -134,6 +135,18 @@ export const UploadAssetRoute = (handler: AppHandler) => ) } + const labels = await CheckLabels(ctx, asset) + + if (labels) { + return ctx.json( + { + success: false, + message: "Image contains potentially suggestive content.", + }, + 400 + ) + } + const { drizzle } = getConnection(ctx.env) const randomId = generateID() diff --git a/src/v2/routes/auth/handler.ts b/src/v2/routes/auth/handler.ts index 9ceebee..7602300 100644 --- a/src/v2/routes/auth/handler.ts +++ b/src/v2/routes/auth/handler.ts @@ -5,6 +5,8 @@ import { UserAllCurrentSessionsRoute } from "./get-all-sessions" import { LogoutCurrentSessionRoute } from "./logout-current-session" import { ValidateSessionRoute } from "./validate-current-session" import { InvalidateSessionRoute } from "./invalidate-session" +import { UploadAvatarRoute } from "./upload-avatar" +import { UploadBannerRoute } from "./upload-banner" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() @@ -16,4 +18,7 @@ InvalidateSessionRoute(handler) UserAllCurrentSessionsRoute(handler) LogoutCurrentSessionRoute(handler) +UploadAvatarRoute(handler) +UploadBannerRoute(handler) + export default handler diff --git a/src/v2/routes/auth/upload-avatar.ts b/src/v2/routes/auth/upload-avatar.ts new file mode 100644 index 0000000..582f262 --- /dev/null +++ b/src/v2/routes/auth/upload-avatar.ts @@ -0,0 +1,117 @@ +import { AppHandler } from "../handler" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" +import { CheckLabels } from "@/v2/lib/helpers/check-image-tags" +import { generateID } from "@/v2/lib/oslo" +import { getConnection } from "@/v2/db/turso" +import { authUser } from "@/v2/db/schema" +import { eq } from "drizzle-orm" + +const responseSchema = z.object({ + success: z.literal(true), +}) + +const requestBodySchema = z.object({ + avatar: z + .any() + .openapi({ + description: "The image of the avatar to upload.", + example: "avatar", + }) + .refine((files) => files?.length == 1, "An image is required.") + .refine( + (files) => files?.[0]?.size <= 5 * 1024 * 1024, + `Max file size is 5MB)` + ) + .refine( + (files) => files?.[0]?.type === "image/png", + `Only image/png is accepted.` + ), +}) + +const openRoute = createRoute({ + path: "/upload/avatar", + method: "post", + summary: "Upload an avatar", + description: "Upload a new avatar, png only.", + tags: ["Auth"], + request: { + body: { + content: { + "multipart/form-data": { + schema: requestBodySchema, + }, + }, + }, + }, + responses: { + 200: { + description: "The uploaded avatar", + content: { + "application/json": { + schema: responseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +export const UploadAvatarRoute = (handler: AppHandler) => { + handler.openapi(openRoute, async (ctx) => { + const { avatar } = ctx.req.valid("form") + + const authSessionManager = new AuthSessionManager(ctx) + + const { user } = await authSessionManager.validateSession() + + if (!user) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + const labels = await CheckLabels(ctx, avatar) + + if (labels) { + return ctx.json( + { + success: false, + message: "Image contains potentially inappropriate content", + }, + 400 + ) + } + + const { drizzle } = await getConnection(ctx.env) + + if (user.avatarUrl) { + await ctx.env.FILES_BUCKET.delete(user.avatarUrl) + } + + const { key } = await ctx.env.FILES_BUCKET.put( + `/avatars/${user.id}/${generateID(12)}.png`, + avatar.content + ) + + await drizzle + .update(authUser) + .set({ + avatarUrl: key, + }) + .where(eq(authUser.id, user.id)) + + return ctx.json( + { + success: true, + }, + 200 + ) + }) +} diff --git a/src/v2/routes/auth/upload-banner.ts b/src/v2/routes/auth/upload-banner.ts new file mode 100644 index 0000000..4542e04 --- /dev/null +++ b/src/v2/routes/auth/upload-banner.ts @@ -0,0 +1,117 @@ +import { AppHandler } from "../handler" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" +import { CheckLabels } from "@/v2/lib/helpers/check-image-tags" +import { generateID } from "@/v2/lib/oslo" +import { getConnection } from "@/v2/db/turso" +import { authUser } from "@/v2/db/schema" +import { eq } from "drizzle-orm" + +const responseSchema = z.object({ + success: z.literal(true), +}) + +const requestBodySchema = z.object({ + banner: z + .any() + .openapi({ + description: "The image of the banner to upload.", + example: "banner", + }) + .refine((files) => files?.length == 1, "An image is required.") + .refine( + (files) => files?.[0]?.size <= 5 * 1024 * 1024, + `Max file size is 5MB)` + ) + .refine( + (files) => files?.[0]?.type === "image/png", + `Only image/png is accepted.` + ), +}) + +const openRoute = createRoute({ + path: "/upload/banner", + method: "post", + summary: "Upload a banner", + description: "Upload a new banner, png only, supporter only.", + tags: ["Auth"], + request: { + body: { + content: { + "multipart/form-data": { + schema: requestBodySchema, + }, + }, + }, + }, + responses: { + 200: { + description: "The uploaded banner", + content: { + "application/json": { + schema: responseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +export const UploadBannerRoute = (handler: AppHandler) => { + handler.openapi(openRoute, async (ctx) => { + const { banner } = ctx.req.valid("form") + + const authSessionManager = new AuthSessionManager(ctx) + + const { user } = await authSessionManager.validateSession() + + if (!user || user.plan !== "supporter") { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + const labels = await CheckLabels(ctx, banner) + + if (labels) { + return ctx.json( + { + success: false, + message: "Image contains potentially inappropriate content", + }, + 400 + ) + } + + const { drizzle } = await getConnection(ctx.env) + + if (user.bannerUrl) { + await ctx.env.FILES_BUCKET.delete(user.bannerUrl) + } + + const { key } = await ctx.env.FILES_BUCKET.put( + `/banners/${user.id}/${generateID(12)}.png`, + banner.content + ) + + await drizzle + .update(authUser) + .set({ + bannerUrl: key, + }) + .where(eq(authUser.id, user.id)) + + return ctx.json( + { + success: true, + }, + 200 + ) + }) +} diff --git a/src/v2/routes/category/all-categories.ts b/src/v2/routes/category/all-categories.ts index 7724565..f032121 100644 --- a/src/v2/routes/category/all-categories.ts +++ b/src/v2/routes/category/all-categories.ts @@ -6,7 +6,7 @@ import { createRoute } from "@hono/zod-openapi" import { z } from "@hono/zod-openapi" import { selectAssetCategorySchema } from "@/v2/db/schema" -export const responseSchema = z.object({ +const responseSchema = z.object({ success: z.literal(true), categories: selectAssetCategorySchema.array(), }) diff --git a/src/v2/routes/category/create-category.ts b/src/v2/routes/category/create-category.ts index 9bc5185..b55d25e 100644 --- a/src/v2/routes/category/create-category.ts +++ b/src/v2/routes/category/create-category.ts @@ -8,7 +8,7 @@ import { GenericResponses } from "@/v2/lib/response-schemas" import { z } from "@hono/zod-openapi" import { selectAssetCategorySchema } from "@/v2/db/schema" -export const requestBodySchema = z.object({ +const requestBodySchema = z.object({ name: z.string().min(3).max(32).openapi({ description: "The name of the asset category.", example: "splash-art", @@ -19,7 +19,7 @@ export const requestBodySchema = z.object({ }), }) -export const responseSchema = z.object({ +const responseSchema = z.object({ success: z.literal(true), assetCategory: selectAssetCategorySchema, }) From 6bed8400bfcd64caf7c5b4a4cc1bcfe0f687385b Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Thu, 21 Mar 2024 23:36:36 +0000 Subject: [PATCH 297/318] wagmi --- src/scripts/seed/seed.ts | 24 ++- src/v2/db/schema.ts | 6 +- src/v2/db/schema/asset/asset-comments.ts | 2 +- src/v2/db/schema/asset/asset.ts | 4 +- .../categories/asset-categories-likes.ts | 118 +++++++-------- .../db/schema/categories/asset-categories.ts | 4 +- src/v2/db/schema/game/game-likes.ts | 100 ++++++------- src/v2/db/schema/game/game.ts | 4 +- src/v2/db/schema/tags/asset-tags.ts | 4 +- src/v2/db/schema/user/user.ts | 12 +- src/v2/routes/asset/comment-on-asset.ts | 137 ++++++++++++++++++ src/v2/routes/asset/like-comment.ts | 0 src/v2/routes/asset/unlike-comment.ts | 0 13 files changed, 282 insertions(+), 133 deletions(-) create mode 100644 src/v2/routes/asset/comment-on-asset.ts create mode 100644 src/v2/routes/asset/like-comment.ts create mode 100644 src/v2/routes/asset/unlike-comment.ts diff --git a/src/scripts/seed/seed.ts b/src/scripts/seed/seed.ts index 917c59e..9fe7b08 100644 --- a/src/scripts/seed/seed.ts +++ b/src/scripts/seed/seed.ts @@ -20,6 +20,7 @@ import { import { Scrypt } from "lucia" import "dotenv/config" import * as dotenv from "dotenv" +import { generateID } from "@/v2/lib/oslo" dotenv.config({ path: ".dev.vars" }) @@ -254,15 +255,21 @@ async function main() { ) console.log("[SEED] [asset] Seeding assets...") + + const assetIDArray = new Array(6).fill(null).map(() => { + return generateID() + }) + const newAssets = await db .insert(asset) .values([ { + id: assetIDArray[0], name: "test-asset", extension: "image/png", gameId: "genshin-impact", assetCategoryId: "character-sheets", - url: "/genshin-impact/character-sheets/test-asset.png", + url: `/assets/${assetIDArray[0]}.png`, status: "approved", uploadedById: newUsers[0].id, uploadedByName: newUsers[0].username, @@ -273,11 +280,12 @@ async function main() { height: 512, }, { + id: assetIDArray[1], name: "test-asset-2", extension: "image/png", gameId: "honkai-impact-3rd", assetCategoryId: "character-sheets", - url: "/honkai-impact-3rd/character-sheets/test-asset2.png", + url: `/assets/${assetIDArray[1]}.png`, status: "approved", uploadedById: newUsers[1].id, uploadedByName: newUsers[1].username, @@ -288,11 +296,12 @@ async function main() { height: 1080, }, { + id: assetIDArray[2], name: "test-asset-3", extension: "image/png", gameId: "genshin-impact", assetCategoryId: "splash-art", - url: "/genshin-impact/splash-art/test-asset3.png", + url: `/assets/${assetIDArray[2]}.png`, status: "approved", uploadedById: newUsers[1].id, uploadedByName: newUsers[1].username, @@ -303,11 +312,12 @@ async function main() { height: 1920, }, { + id: assetIDArray[3], name: "test-asset-4", extension: "image/png", gameId: "genshin-impact", assetCategoryId: "splash-art", - url: "/genshin-impact/splash-art/test-asset4.png", + url: `/assets/${assetIDArray[3]}.png`, status: "approved", uploadedById: newUsers[1].id, uploadedByName: newUsers[1].username, @@ -318,11 +328,12 @@ async function main() { height: 1080, }, { + id: assetIDArray[4], name: "test-asset-5", extension: "image/png", gameId: "genshin-impact", assetCategoryId: "splash-art", - url: "/genshin-impact/splash-art/test-asset5.png", + url: `/assets/${assetIDArray[4]}.png`, status: "approved", uploadedById: newUsers[2].id, uploadedByName: newUsers[2].username, @@ -330,11 +341,12 @@ async function main() { downloadCount: 1337, }, { + id: assetIDArray[5], name: "test-asset-6", extension: "image/png", gameId: "honkai-impact-3rd", assetCategoryId: "character-sheets", - url: "/honkai-impact-3rd/character-sheets/test-asset6.png", + url: `/assets/${assetIDArray[5]}.png`, status: "approved", uploadedById: newUsers[2].id, uploadedByName: newUsers[2].username, diff --git a/src/v2/db/schema.ts b/src/v2/db/schema.ts index 7a12216..18bdb84 100644 --- a/src/v2/db/schema.ts +++ b/src/v2/db/schema.ts @@ -4,13 +4,13 @@ export * from "./schema/asset/asset-external-files" export * from "./schema/asset/asset-likes" export * from "./schema/categories/asset-categories" -export * from "./schema/categories/asset-categories-likes" +// export * from "./schema/categories/asset-categories-likes" export * from "./schema/game/game" -export * from "./schema/game/game-likes" +// export * from "./schema/game/game-likes" export * from "./schema/tags/asset-tags" -export * from "./schema/tags/asset-tags-likes" +// export * from "./schema/tags/asset-tags-likes" export * from "./schema/user/user" export * from "./schema/user/user-attributes" diff --git a/src/v2/db/schema/asset/asset-comments.ts b/src/v2/db/schema/asset/asset-comments.ts index 6d05134..86f0e42 100644 --- a/src/v2/db/schema/asset/asset-comments.ts +++ b/src/v2/db/schema/asset/asset-comments.ts @@ -19,7 +19,7 @@ export const assetComments = sqliteTable( .primaryKey() .notNull() .$defaultFn(() => { - return generateID() + return generateID(20) }), assetId: text("asset_id").references(() => asset.id, { onUpdate: "cascade", diff --git a/src/v2/db/schema/asset/asset.ts b/src/v2/db/schema/asset/asset.ts index 5871d19..aad3330 100644 --- a/src/v2/db/schema/asset/asset.ts +++ b/src/v2/db/schema/asset/asset.ts @@ -36,7 +36,7 @@ export const asset = sqliteTable( .primaryKey() .notNull() .$defaultFn(() => { - return generateID() + return generateID(15) }), name: text("name").notNull(), extension: text("extension").notNull(), @@ -78,7 +78,7 @@ export const asset = sqliteTable( .default(false) .notNull(), allowComments: integer("comments_is_locked", { mode: "boolean" }) - .default(true) + .default(false) .notNull(), viewCount: integer("view_count").default(0).notNull(), downloadCount: integer("download_count").default(0).notNull(), diff --git a/src/v2/db/schema/categories/asset-categories-likes.ts b/src/v2/db/schema/categories/asset-categories-likes.ts index cc0bc7f..59eaab8 100644 --- a/src/v2/db/schema/categories/asset-categories-likes.ts +++ b/src/v2/db/schema/categories/asset-categories-likes.ts @@ -1,62 +1,62 @@ -import { tableNames } from "@/v2/db/drizzle" -import { relations } from "drizzle-orm" -import { index, sqliteTable, text } from "drizzle-orm/sqlite-core" -import { authUser } from "../user/user" -import { createInsertSchema, createSelectSchema } from "drizzle-zod" -import { assetCategory } from "./asset-categories" +// import { tableNames } from "@/v2/db/drizzle" +// import { relations } from "drizzle-orm" +// import { index, sqliteTable, text } from "drizzle-orm/sqlite-core" +// import { authUser } from "../user/user" +// import { createInsertSchema, createSelectSchema } from "drizzle-zod" +// import { assetCategory } from "./asset-categories" -export const assetCategoryLikes = sqliteTable( - tableNames.assetCategoryLikes, - { - assetCategoryId: text("asset_id") - .notNull() - .references(() => assetCategory.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - likedById: text("liked_by_id") - .notNull() - .references(() => authUser.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - createdAt: text("created_at") - .notNull() - .$defaultFn(() => { - return new Date().toISOString() - }), - }, - (gameLikes) => { - return { - assetCategoryIdx: index("assetCategoryLikes_asset_idx").on( - gameLikes.assetCategoryId - ), - likedByIdx: index("assetCategoryLikes_likedby_idx").on( - gameLikes.likedById - ), - } - } -) +// export const assetCategoryLikes = sqliteTable( +// tableNames.assetCategoryLikes, +// { +// assetCategoryId: text("asset_id") +// .notNull() +// .references(() => assetCategory.id, { +// onUpdate: "cascade", +// onDelete: "cascade", +// }), +// likedById: text("liked_by_id") +// .notNull() +// .references(() => authUser.id, { +// onUpdate: "cascade", +// onDelete: "cascade", +// }), +// createdAt: text("created_at") +// .notNull() +// .$defaultFn(() => { +// return new Date().toISOString() +// }), +// }, +// (gameLikes) => { +// return { +// assetCategoryIdx: index("assetCategoryLikes_asset_idx").on( +// gameLikes.assetCategoryId +// ), +// likedByIdx: index("assetCategoryLikes_likedby_idx").on( +// gameLikes.likedById +// ), +// } +// } +// ) -export type AssetCategoryLikes = typeof assetCategoryLikes.$inferSelect -export type NewAssetCategoryLikes = typeof assetCategoryLikes.$inferInsert -export const insertAssetCategoryLikesSchema = - createInsertSchema(assetCategoryLikes) -export const selectAssetCategoryLikesSchema = - createSelectSchema(assetCategoryLikes) +// export type AssetCategoryLikes = typeof assetCategoryLikes.$inferSelect +// export type NewAssetCategoryLikes = typeof assetCategoryLikes.$inferInsert +// export const insertAssetCategoryLikesSchema = +// createInsertSchema(assetCategoryLikes) +// export const selectAssetCategoryLikesSchema = +// createSelectSchema(assetCategoryLikes) -export const assetCategoryLikesRelations = relations( - assetCategoryLikes, - ({ one }) => ({ - assetCategory: one(assetCategory, { - fields: [assetCategoryLikes.assetCategoryId], - references: [assetCategory.id], - relationName: "assetCategoryLikes_liked_assetCategory", - }), - likedBy: one(authUser, { - fields: [assetCategoryLikes.likedById], - references: [authUser.id], - relationName: "assetTagLikes_liked_by", - }), - }) -) +// export const assetCategoryLikesRelations = relations( +// assetCategoryLikes, +// ({ one }) => ({ +// assetCategory: one(assetCategory, { +// fields: [assetCategoryLikes.assetCategoryId], +// references: [assetCategory.id], +// relationName: "assetCategoryLikes_liked_assetCategory", +// }), +// likedBy: one(authUser, { +// fields: [assetCategoryLikes.likedById], +// references: [authUser.id], +// relationName: "assetTagLikes_liked_by", +// }), +// }) +// ) diff --git a/src/v2/db/schema/categories/asset-categories.ts b/src/v2/db/schema/categories/asset-categories.ts index 030a008..5885244 100644 --- a/src/v2/db/schema/categories/asset-categories.ts +++ b/src/v2/db/schema/categories/asset-categories.ts @@ -9,7 +9,7 @@ import { import { game } from "../game/game" import { asset } from "../asset/asset" import { createInsertSchema, createSelectSchema } from "drizzle-zod" -import { assetCategoryLikes } from "./asset-categories-likes" +// import { assetCategoryLikes } from "./asset-categories-likes" export const assetCategory = sqliteTable( tableNames.assetCategory, @@ -78,7 +78,7 @@ export const selectGameAssetCategorySchema = export const assetCategoryRelations = relations(assetCategory, ({ many }) => ({ asset: many(asset), gameAssetCategory: many(gameAssetCategory), - assetCategoryLikes: many(assetCategoryLikes), + // assetCategoryLikes: many(assetCategoryLikes), })) export const gameAssetCategoryRelations = relations( diff --git a/src/v2/db/schema/game/game-likes.ts b/src/v2/db/schema/game/game-likes.ts index db396c8..9eda813 100644 --- a/src/v2/db/schema/game/game-likes.ts +++ b/src/v2/db/schema/game/game-likes.ts @@ -1,53 +1,53 @@ -import { tableNames } from "@/v2/db/drizzle" -import { relations } from "drizzle-orm" -import { index, sqliteTable, text } from "drizzle-orm/sqlite-core" -import { authUser } from "../user/user" -import { game } from "./game" -import { createInsertSchema, createSelectSchema } from "drizzle-zod" +// import { tableNames } from "@/v2/db/drizzle" +// import { relations } from "drizzle-orm" +// import { index, sqliteTable, text } from "drizzle-orm/sqlite-core" +// import { authUser } from "../user/user" +// import { game } from "./game" +// import { createInsertSchema, createSelectSchema } from "drizzle-zod" -export const gameLikes = sqliteTable( - tableNames.gameLikes, - { - gameId: text("asset_id") - .notNull() - .references(() => game.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - likedById: text("liked_by_id") - .notNull() - .references(() => authUser.id, { - onUpdate: "cascade", - onDelete: "cascade", - }), - createdAt: text("created_at") - .notNull() - .$defaultFn(() => { - return new Date().toISOString() - }), - }, - (gameLikes) => { - return { - gameIdx: index("gamelikes_game_idx").on(gameLikes.gameId), - likedByIdx: index("gamelikes_likedby_idx").on(gameLikes.likedById), - } - } -) +// export const gameLikes = sqliteTable( +// tableNames.gameLikes, +// { +// gameId: text("asset_id") +// .notNull() +// .references(() => game.id, { +// onUpdate: "cascade", +// onDelete: "cascade", +// }), +// likedById: text("liked_by_id") +// .notNull() +// .references(() => authUser.id, { +// onUpdate: "cascade", +// onDelete: "cascade", +// }), +// createdAt: text("created_at") +// .notNull() +// .$defaultFn(() => { +// return new Date().toISOString() +// }), +// }, +// (gameLikes) => { +// return { +// gameIdx: index("gamelikes_game_idx").on(gameLikes.gameId), +// likedByIdx: index("gamelikes_likedby_idx").on(gameLikes.likedById), +// } +// } +// ) -export type GameLikes = typeof gameLikes.$inferSelect -export type NewGameLikes = typeof gameLikes.$inferInsert -export const insertGameLikesSchema = createInsertSchema(gameLikes) -export const selectGameLikesSchema = createSelectSchema(gameLikes) +// export type GameLikes = typeof gameLikes.$inferSelect +// export type NewGameLikes = typeof gameLikes.$inferInsert +// export const insertGameLikesSchema = createInsertSchema(gameLikes) +// export const selectGameLikesSchema = createSelectSchema(gameLikes) -export const gameLikesRelations = relations(gameLikes, ({ one }) => ({ - game: one(game, { - fields: [gameLikes.gameId], - references: [game.id], - relationName: "gamelikes_liked_game", - }), - likedBy: one(authUser, { - fields: [gameLikes.likedById], - references: [authUser.id], - relationName: "gamelikes_liked_by", - }), -})) +// export const gameLikesRelations = relations(gameLikes, ({ one }) => ({ +// game: one(game, { +// fields: [gameLikes.gameId], +// references: [game.id], +// relationName: "gamelikes_liked_game", +// }), +// likedBy: one(authUser, { +// fields: [gameLikes.likedById], +// references: [authUser.id], +// relationName: "gamelikes_liked_by", +// }), +// })) diff --git a/src/v2/db/schema/game/game.ts b/src/v2/db/schema/game/game.ts index 5299b61..1b45efb 100644 --- a/src/v2/db/schema/game/game.ts +++ b/src/v2/db/schema/game/game.ts @@ -9,7 +9,7 @@ import { } from "drizzle-orm/sqlite-core" import { asset } from "../asset/asset" import { gameAssetCategory } from "../categories/asset-categories" -import { gameLikes } from "./game-likes" +// import { gameLikes } from "./game-likes" import { createInsertSchema, createSelectSchema } from "drizzle-zod" /* @@ -50,5 +50,5 @@ export const selectGameSchema = createSelectSchema(game) export const gameRelations = relations(game, ({ many }) => ({ asset: many(asset), gameAssetCategory: many(gameAssetCategory), - gameLikes: many(gameLikes), + // gameLikes: many(gameLikes), })) diff --git a/src/v2/db/schema/tags/asset-tags.ts b/src/v2/db/schema/tags/asset-tags.ts index 988de3d..c7da71f 100644 --- a/src/v2/db/schema/tags/asset-tags.ts +++ b/src/v2/db/schema/tags/asset-tags.ts @@ -7,7 +7,7 @@ import { index, } from "drizzle-orm/sqlite-core" import { asset } from "../asset/asset" -import { assetTagLikes } from "./asset-tags-likes" +// import { assetTagLikes } from "./asset-tags-likes" import { createInsertSchema, createSelectSchema } from "drizzle-zod" /* @@ -72,7 +72,7 @@ export const selectAssetTagAssetSchema = createSelectSchema(assetTagAsset) export const assetTagRelations = relations(assetTag, ({ many }) => ({ assetTagAsset: many(assetTagAsset), - assetTagLikes: many(assetTagLikes), + // assetTagLikes: many(assetTagLikes), })) export const assetTagAssetRelations = relations(assetTagAsset, ({ one }) => ({ diff --git a/src/v2/db/schema/user/user.ts b/src/v2/db/schema/user/user.ts index 71e4858..6081d82 100644 --- a/src/v2/db/schema/user/user.ts +++ b/src/v2/db/schema/user/user.ts @@ -19,9 +19,9 @@ import { assetExternalFile } from "../asset/asset-external-files" import { userCollectionLikes } from "../collections/user-collection-likes" import { userCollectionCollaborators } from "../collections/user-collections-collaborators" import { assetLikes } from "../asset/asset-likes" -import { gameLikes } from "../game/game-likes" -import { assetTagLikes } from "../tags/asset-tags-likes" -import { assetCategoryLikes } from "../categories/asset-categories-likes" +// import { gameLikes } from "../game/game-likes" +// import { assetTagLikes } from "../tags/asset-tags-likes" +// import { assetCategoryLikes } from "../categories/asset-categories-likes" import { requestForm, requestFormUpvotes } from "../supporter/request-form" import { userBlocked } from "./user-blocked" import { assetComments } from "../asset/asset-comments" @@ -214,9 +214,9 @@ export const usersRelations = relations(authUser, ({ one, many }) => ({ stripeUser: one(stripeUser), passwordResetToken: one(passwordResetToken), emailVerificationToken: one(emailVerificationToken), - gameLikes: many(gameLikes), - assetTagLikes: many(assetTagLikes), - assetCategoryLikes: many(assetCategoryLikes), + // gameLikes: many(gameLikes), + // assetTagLikes: many(assetTagLikes), + // assetCategoryLikes: many(assetCategoryLikes), userCollectionCollaborators: many(userCollectionCollaborators), requestForm: many(requestForm), requestFormUpvotes: many(requestFormUpvotes), diff --git a/src/v2/routes/asset/comment-on-asset.ts b/src/v2/routes/asset/comment-on-asset.ts new file mode 100644 index 0000000..d3319de --- /dev/null +++ b/src/v2/routes/asset/comment-on-asset.ts @@ -0,0 +1,137 @@ +import { AppHandler } from "../handler" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" +import { getConnection } from "@/v2/db/turso" +import { asset, assetComments } from "@/v2/db/schema" +import { eq } from "drizzle-orm" + +const requestBodySchema = z.object({ + comment: z.string().min(3).max(128).openapi({ + description: "The comment to post.", + example: "This is a comment.", + }), +}) + +const pathSchema = z.object({ + id: z.string().openapi({ + param: { + name: "id", + in: "path", + description: "The ID of the asset/comment to comment on.", + required: true, + }, + }), +}) + +const responseSchema = z.object({ + success: z.literal(true), +}) + +const openRoute = createRoute({ + path: "/comment/{id}/comment", + method: "post", + summary: "Post comment or reply.", + description: "Accepts Asset IDs or Comment IDs.", + tags: ["Asset"], + request: { + params: pathSchema, + body: { + content: { + "application/json": { + schema: requestBodySchema, + }, + }, + }, + }, + responses: { + 200: { + description: "Returns true if the comment was posted.", + content: { + "application/json": { + schema: responseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +export const CommentRoute = (handler: AppHandler) => { + handler.openapi(openRoute, async (ctx) => { + const authSessionManager = new AuthSessionManager(ctx) + + const { user } = await authSessionManager.validateSession() + + if (!user) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + const { id } = ctx.req.valid("param") + const { comment } = ctx.req.valid("json") + + const isAsset = id.length === 15 + const isComment = id.length === 20 + + const { drizzle } = await getConnection(ctx.env) + + if (isAsset) { + const validAsset = await drizzle + .select({ + id: asset.id, + }) + .from(asset) + .where(eq(asset.id, id)) + + if (!validAsset) { + return ctx.json( + { + success: false, + message: "Invalid asset ID", + }, + 400 + ) + } + } + + if (isComment) { + const validComment = await drizzle + .select({ + id: assetComments.id, + }) + .from(assetComments) + .where(eq(assetComments.id, id)) + + if (!validComment) { + return ctx.json( + { + success: false, + message: "Invalid comment ID", + }, + 400 + ) + } + } + + await drizzle.insert(assetComments).values({ + assetId: isAsset ? id : null, + parentCommentId: isComment ? id : null, + comment: comment, + commentedById: user.id, + }) + + return ctx.json( + { + success: true, + }, + 200 + ) + }) +} diff --git a/src/v2/routes/asset/like-comment.ts b/src/v2/routes/asset/like-comment.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/asset/unlike-comment.ts b/src/v2/routes/asset/unlike-comment.ts new file mode 100644 index 0000000..e69de29 From 54c4f8b8948687f3102e2527b30bce383721f713 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Fri, 29 Mar 2024 05:11:34 +0000 Subject: [PATCH 298/318] fix --- src/v2/db/schema/tags/asset-tags-likes.ts | 96 +++++++++++------------ 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/src/v2/db/schema/tags/asset-tags-likes.ts b/src/v2/db/schema/tags/asset-tags-likes.ts index 8c2f63c..e1ddbc0 100644 --- a/src/v2/db/schema/tags/asset-tags-likes.ts +++ b/src/v2/db/schema/tags/asset-tags-likes.ts @@ -1,50 +1,50 @@ -import { tableNames } from "@/v2/db/drizzle" -import { relations } from "drizzle-orm" -import { index, sqliteTable, text } from "drizzle-orm/sqlite-core" -import { authUser } from "../user/user" -import { assetTag } from "./asset-tags" -import { createInsertSchema, createSelectSchema } from "drizzle-zod" -export const assetTagLikes = sqliteTable( - tableNames.assetTagLikes, - { - assetTagId: text("asset_id") - .notNull() - .references(() => assetTag.id), - likedById: text("liked_by_id") - .notNull() - .references(() => authUser.id), - createdAt: text("created_at") - .notNull() - .$defaultFn(() => { - return new Date().toISOString() - }), - }, - (gameLikes) => { - return { - assetTagIdx: index("assetTagLikes_asset_idx").on( - gameLikes.assetTagId - ), - likedByIdx: index("assetTagLikes_likedby_idx").on( - gameLikes.likedById - ), - } - } -) +// import { tableNames } from "@/v2/db/drizzle" +// import { relations } from "drizzle-orm" +// import { index, sqliteTable, text } from "drizzle-orm/sqlite-core" +// import { authUser } from "../user/user" +// import { assetTag } from "./asset-tags" +// import { createInsertSchema, createSelectSchema } from "drizzle-zod" +// export const assetTagLikes = sqliteTable( +// tableNames.assetTagLikes, +// { +// assetTagId: text("asset_id") +// .notNull() +// .references(() => assetTag.id), +// likedById: text("liked_by_id") +// .notNull() +// .references(() => authUser.id), +// createdAt: text("created_at") +// .notNull() +// .$defaultFn(() => { +// return new Date().toISOString() +// }), +// }, +// (gameLikes) => { +// return { +// assetTagIdx: index("assetTagLikes_asset_idx").on( +// gameLikes.assetTagId +// ), +// likedByIdx: index("assetTagLikes_likedby_idx").on( +// gameLikes.likedById +// ), +// } +// } +// ) -export type AssetTagLikes = typeof assetTagLikes.$inferSelect -export type NewAssetTagLikes = typeof assetTagLikes.$inferInsert -export const insertAssetTagLikesSchema = createInsertSchema(assetTagLikes) -export const selectAssetTagLikesSchema = createSelectSchema(assetTagLikes) +// export type AssetTagLikes = typeof assetTagLikes.$inferSelect +// export type NewAssetTagLikes = typeof assetTagLikes.$inferInsert +// export const insertAssetTagLikesSchema = createInsertSchema(assetTagLikes) +// export const selectAssetTagLikesSchema = createSelectSchema(assetTagLikes) -export const assetTagLikesRelations = relations(assetTagLikes, ({ one }) => ({ - assetTag: one(assetTag, { - fields: [assetTagLikes.assetTagId], - references: [assetTag.id], - relationName: "assetTagLikes_liked_assetTag", - }), - likedBy: one(authUser, { - fields: [assetTagLikes.likedById], - references: [authUser.id], - relationName: "assetTagLikes_liked_by", - }), -})) +// export const assetTagLikesRelations = relations(assetTagLikes, ({ one }) => ({ +// assetTag: one(assetTag, { +// fields: [assetTagLikes.assetTagId], +// references: [assetTag.id], +// relationName: "assetTagLikes_liked_assetTag", +// }), +// likedBy: one(authUser, { +// fields: [assetTagLikes.likedById], +// references: [authUser.id], +// relationName: "assetTagLikes_liked_by", +// }), +// })) From f8f09d20c12fd4658788b514b7eb38c0d6d1ba2e Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Mon, 1 Apr 2024 20:09:19 +0100 Subject: [PATCH 299/318] bun --- .github/workflows/check.yml | 44 +- .github/workflows/deploy.yml | 11 +- .github/workflows/test.yml | 13 +- .gitignore | 1 - .husky/pre-commit | 2 +- README.md | 2 +- bun.lockb | Bin 0 -> 294049 bytes package.json | 1 - pnpm-lock.yaml | 7976 ---------------------------------- src/openapi/config.ts | 4 +- 10 files changed, 37 insertions(+), 8017 deletions(-) create mode 100644 bun.lockb delete mode 100644 pnpm-lock.yaml diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index f01bad0..9b35e52 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -18,21 +18,20 @@ jobs: uses: actions/checkout@v3 - name: Setup Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 20.9.0 - - name: Install pnpm - uses: pnpm/action-setup@v2 + - name: Install bun + uses: oven-sh/setup-bun@v1 with: - version: latest - run_install: false + bun-version: latest - name: Install dependencies - run: pnpm install + run: bun i - name: Prettier check - run: pnpm run prettier:check + run: bun run prettier:check lint: name: ESLint @@ -42,21 +41,25 @@ jobs: uses: actions/checkout@v3 - name: Setup Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 20.9.0 - - name: Install pnpm - uses: pnpm/action-setup@v2 + - name: Setup Node.js + uses: oven-sh/setup-bun@v1 + with: + bun-version: latest + + - name: Install bun + uses: oven-sh/setup-bun@v1 with: - version: latest - run_install: false + bun-version: latest - name: Install dependencies - run: pnpm install + run: bun i - name: Lint - run: pnpm run lint + run: bun run lint typecheck: name: TypeScript types @@ -66,18 +69,17 @@ jobs: uses: actions/checkout@v3 - name: Setup Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 20.9.0 - - name: Install pnpm - uses: pnpm/action-setup@v2 + - name: Install bun + uses: oven-sh/setup-bun@v1 with: - version: latest - run_install: false + bun-version: latest - name: Install dependencies - run: pnpm install + run: bun i - name: Lint - run: pnpm run typecheck + run: bun run typecheck diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 3b52f3e..7102a30 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -14,18 +14,17 @@ jobs: uses: actions/checkout@v3 - name: Setup Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 20.9.0 - - name: Install pnpm - uses: pnpm/action-setup@v2 + - name: Install bun + uses: oven-sh/setup-bun@v1 with: - version: latest - run_install: false + bun-version: latest - name: Install dependencies - run: pnpm install + run: bun i - name: Deploy to Cloudflare Workers using Wrangler uses: cloudflare/wrangler-action@2.0.0 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 53189cf..5246f55 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -25,18 +25,17 @@ jobs: uses: actions/checkout@v3 - name: Setup Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 20.9.0 - - name: Install pnpm - uses: pnpm/action-setup@v2 + - name: Install bun + uses: oven-sh/setup-bun@v1 with: - version: latest - run_install: false + bun-version: latest - name: Install dependencies - run: pnpm install + run: bun i - name: Create .dev.vars file run: | @@ -44,4 +43,4 @@ jobs: echo TURSO_DEV_DATABASE_URL=$TURSO_DEV_DATABASE_URL >> .dev.vars - name: Initialize Drizzle - run: pnpm drizzle:dev:init + run: bun run drizzle:dev:init diff --git a/.gitignore b/.gitignore index cae754a..6c67312 100644 --- a/.gitignore +++ b/.gitignore @@ -18,7 +18,6 @@ npm-debug.log_ yarn-debug.log* yarn-error.log* lerna-debug.log* -.pnpm-debug.log* # Diagnostic reports (https://nodejs.org/api/report.html) diff --git a/.husky/pre-commit b/.husky/pre-commit index 06458ce..8bc4880 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,4 +1,4 @@ #!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh" -pnpm run typecheck && pnpm run lint && pnpm run prettier:check +bun run typecheck && bun run lint && bun run prettier:check diff --git a/README.md b/README.md index 823bf55..069eab3 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ To install `sqld` for dev db `wget https://github.com/libsql/sqld/releases/downl The API will connect to the local database if the environment is set to `DEV` in `.dev.vars`, else - it will connect to your production database. -To generate seed data, generate and migrate, you can run `pnpm drizzle:init:dev`. +To generate seed data, generate and migrate, you can run `bun run drizzle:init:dev`. ### Wrangler diff --git a/bun.lockb b/bun.lockb new file mode 100644 index 0000000000000000000000000000000000000000..89ee23df6640711a08a0fe34efb30b8132821f3e GIT binary patch literal 294049 zcmeFa2VBi<{QrMSl+Y%kQVFS~VU>oo%#=Nn#%XC!D#?gY_KM78uZ)arWo1-INRmx5 zQa1nhyU*v%x$pn2KIfe8IK;C%bW3_l&p6`(vaBGBIx z%EKX#oDXPo&|=`*gB}Le1Wjk#O90h?{5Vh@PzzA3*Ot|9U?1y0096M)%j#xOo$+kB6)5s;LDBBlW=y?%tR4r&`s+c_?hIDFL6LI; zMY~-=(QaUrm%j(}`%iH@p~U00gnIw4#lL2XK5BHCZP=h@3EkJR8h6H=@VK{g( z;U1x(Q+PbjK+J(g`S|d|c|3nUpWm~)8E-8NKFyhT^0-yxuiP|j!bt&JE? z8WhWiK{>Yf$&j%(z8lldVDJz9E`mIcOAKxnkjkMR`g6#b;bl#j`r|=mp*+Yxh;Qia z$r}uL?0BQSzzX3gXa*?K-OUksx{c^{!1xk^?;@e<<^ z2~G#XJdNa4+A!zO0Eg>vYG1})xPMT%hYyce=LGcM#FjblAM6w8@9P)Y3G&$PB>t3W zj8C_IOx`EZBQlcj&D#&{VLbQ|QIY=OA3q{2iXT3O=V8aR&yRpB4fJC@)Ki9f_n;j6 zMX`v>#A`JPd}P%j7v7g8jgM}K1c{Js1j4-0KF zG|%&QWc=vk#LV+hk4Qg5aN5hyBXAOe{h4_Cc|;h3@4huq58Js2<+v_X2QdD61k`nt z7ZvVrh!ZL_DtL+)tm!Rq9{oxI#p{3@_@N3q7!>2_;}H=V24=$fQ4#(=Q+N{xG5s}$ z1%myX3W{;k0>%19z~S{p1r)DehleoN8Cl5VJo*CTj`e82Npoh}u^Gy!DJc4V4HV;9 z(4Cp5rNCjk(?N0GT7kmWk|^iOtjCU^u(c&dK{@(`+Zx*Y`+Uav;5miIiwN|Hz&Ho- z!+rU%R_6?7>~$N#aM7S>-!t69ix2U7&6b;vWa6C!isxy*di#ghO?azOOnE%ChvV=9 z{BMtbfM2aaCyi$MHwIJ*@=c)}uh0453&wx#7-k=ej>6FgU&b@z699_)RmnI;rQI0* zD&)~l9ON->!L0IwBmLn%D8hrye}Q@!cV%~m4*ZyQsfO^PDgJSzCpm=@~dwv)wj>}LeNB;~#bwE!*Ir<$siLt+p&3|I^OWFLE zK*o13^_GKawr)2a22#dtM#1Zr!u_>O_Vw z2gQ2%pg8XigQDGy?Dwr91Pv3D30*V`UYT!-@M%=O^p8m50WplVQl6I2Uy zE2t{y0?;;~x7RWK%Lc{stJ(ZaP^=fosxv5#(+uFyK7S))@5@-m-%7}1eW?r{4{rSv zA8lgVI}eK7Mo?YQ>7eaF$AESQEdvhY;j@LQ=L(8(>%NsK?*Vy?za}WQ&jZEvnX!$D z58WSmd4)vb{q0Ne2gmWnc4i(P-oeDza3|B>mY_IJ8=)N6Un(fti(~8gviY%~I6j+p zGk(_6okUt2DcJ6^c@}L3x7(WWxc%5PW3=D~> zyRTfH#l&?Gs3O$2+0V3V0E+${g!<@D;sK`J-k?g5cLT-oAIRpLA7c7hdyw&OJ#grs zZZ_k`V#s5>PeLB!3D<0Xgcsb`u;o5c5&W)j9dUs?_U}*Yg4XNb=ea3x82_+i%s8up zqJ3vjZBPSH^cT8WH!oqC)%7>yI1^XM*6rV}Cz$y@1M=8j3@Fb3s3^Rv0N+nCd3eqZ z_6_8RZ$HJ%$0;FEb@#!GPc!H5g5r1t!g*ABZiCz2NZc1H&M@%}ii(Kz@bcq(!G7Tn z8&ph4_#}R~H*eZG#vd&+ye%lsmtjzj z^DLYn5fT{9=S{uL_!$9;cKD#^2i)(&13r&;IG>qM_P}BJzxBEX?<*$xdwYb3!&Lz8 zr9fptvv4{d~`f z%)YYhJ~Kb6VBKK9BbnPm-t02wd=V(FGry>aNpLH~8x04}H+l}Le!$FUZwPcyNN6Oi z4{vk4T<(2;6T)*M+`rA8y|>CD!@XyxR(|I;&-;uK8}*-iyo`Tf_MXht;*9Xgjl? zLQtRb=QA}O*5BW;Nj2w_f5s-cBT7p4Wj`0+_tm}L#WZWC_w&Gz{Lasn<)7QPem}Z8 z{==5b8#2?(mCmbR_Oi6PO0|?NcqQVx$6(Sp6*nhd}~0|*I`|KpFi5%{$Ag<&FnI} zY_=+!H%j?b!K?GBCU=S^sxRL-d-wg)wV(pMqKFi!|%u2&R%Wp?u`-tGaz-4qIse>Z(J zY+=WZ@pIR?9D7$|uw%B=#?Qw$ozh>i^huv~I@Q-U8;|tUx@R<@(*&(&RTmxn+ivi? zIB@yw(yJ1;^73Cd9^JR&sUDk5i-)Yw{M<9A=&9$nh=X$!SHDzk{otnWyosHLe=IhW z>m;$+A@-2f`-}T*(^gIPkj+iMbFEW+^w+#DgRfq{qcvg*huJhT+|;~yMdXcc_a9t&)UN07MgtXF zge~Z&_9*33&bOV4)@GZ1-<&R;xkdfeBIn(OF|Tj8>7I6fS+>jUr`;|kED1dz^DugV zPlW2&aUNA8dzn1$r@u$GW&bB5TP*4D=xy%Q(Dd6^ZoFT)uUIW!>;1%vA%WKN<7eDS zvf8(|Q^3M@ACrp4H~kjt_c=aM%KDJw${lMiMnr#*NsNAVbJTzy-?WFSe)xV;a>6L9 z47G#uO^a6ah}fUk?)(9x=<-EPi?wzKNi;2 z6#0TlR;l(s!{#sf@Vb}YsPX4=)%zXouVkb4#Y3i5kEkevq^i(GwV4}^sW+O@qN|zh z!x}pm>n$(7nP>#pjM?_;g5Aa|G2sJ_RvDBS?(BJHe)fuf53j#)P03YlUD!M$f7O)r z0Y(0cjmD;SJY?CsX-J>*FI`sWNK5sfdSpSL`~$DkTBmQTxio*+^67yAQ)L&XIr_bC zyTiyxV(H2W`5qt6| z@4wSjMt5-kLF4B2T4A_M>zvZ11DB>PvGv`hd&Fk_wSm0jHFtEb>dtbiv}vi3l@q%# zc$KDP#RQkCs?af~sv4)4z3zM|HC|3t^48>0E;k3ey}$G@_;c@1g9BXKj#P6h)O>f~ z(tXiRZJj>SNmJ&`u5lZh@;%~m7o)9Kr=KQyPBjTUP<{EjpYH`d z_r#coKJwc?#Rk?a80hXZDz!>&%n0G$s!OcC{nmgKDT-@}2(!QOOyOg($Kb;#~Y+CcY#evTJNtVl! z!)}yb*rIA5(CT=y$+JCE7LTe3`?zYEP43Mjqg&tkxX}C9hR5&Lq;)tscY!+j)MLl)<3CnUM6Q#I-qZ-7K!J_ z>(865XXQD!r(9#VJINh?SdB|=I?MWI+W`d^9rw4<9C$`qNBWe(n!6SwS`Ub>7;vN8 zkW@GM4)(*Xmm7?~+I;ZMv4`I1&5_nyH#lSeRtrt139(BC44m)1EbI8)OApMA2M$-8 z{$Q8okkBdWNoV_5CA)0;>>e23s__{0A?hw@>3#-qU=I$j!T#zx<8gp3Zy`_i5#f0ir*{+K|Zs=dsIQ-%Zvt3d9$|@HhK6lPv+c^2`vc*SDBAUi2*!%ABmbY0kBi)rQ?H*))CSZ-(y1^31zQ<0;P4N0rbGo;t zeyj8Pw=%*DC+#19cG{4KArEpUH1qr9Z?>aglYBpid-9gAd&%rEIJZP`#j%(k-}njh z9ZNGiKJb$muy1tl+Q{b3rYv2&d!tQRgU3YI9tIxRD zWKi;rrV~CadtW$rTb7Pe#VNi0dRAGznonDIK`UbM<+6=WuWmLke|c;8qxWtJ<4%}{ zE`IW;x4pdTv-vZxYkqQF-F`voi3KK)T};*eK2Q3vaL1E-mI~L@&&=GQ>@j!ez&-qx za^F*nv|9bpwm-G^#)9TM3JT1n(*5>X_RhN&yJ8E)y{m7}t1nZBnG7o%_h{Vx#AdC> zNuDYF@gZP$x^?D^Zt8|B!uoCZ$X-3MfFF2K+Tvr*liZI3#!DU@?c;K-W4KaKzFen* zZ57i(k~XxnRh!Ch_3r7`tiw~a4z{^9Q#U2vw)ReL`G)ZI?(f?vELvZ<`QS6Y^NDQ> ztzPu62;Y0Kk;DpK*_h%sd4Z>9Z>Q^K$1_Vk8Xwl5&~{?=;#uQb4ehn>`=Se%(mpOY z*5cXfj17uywHvK>*r*wd&&4U+LJ4^X1I5zz<`N*Ofs!3JJWkUn+Imu`CU7Q@g zrqli8{w?Gy3XKiE<$qI;b(VM%e=E^i+Qlb4`I7hWvQr!9e3-7bWO}Z&T6 z4TV1r{j7X1t9Ds8N2QgL+rqRNRud$T-+UwUKtac{UyOA1;U0soWN%z@FjhvMFws*WF*T2$%;q^?d*mfGd#u4q2_*^0>b8?9?|JX?KhDzB+h z8#r;(&*H^L`*u<4Y$`GT(Z<4!3hKF?UpVh{@OKNh?v%c1dqO~!jBe4rnLZB2EAF20 zKiX%TS(BirXL(hQ9bZV=v{1Esv2IWFg>JU1-48dBmt5Dj+p!xjyvDZv^2ONoau2?% zRe^pxb;Ye0rH8I`cph}NtnAdbodT!4z)5hM= z?eAN@@=+M=_v6}L$e!H&$4lDhWnyXyljeBZ+s4_9=&EK}(e2pU^&XFnKHrf}eKu-N z>NXFTd+8N-6Rfv8s~4s(DayI?V4IXe{G>Slhlw2mN?i(G*vZsR$dilPuK(1j<*@l5 zXN_3sS0k-=)@;TiEsN`CI(B^cP5yhAibSJVBfeHRXb)(uVLMKHy51p671u#Ml6G&H z7y?(QP7nRdCYlYOWA-Td?u+J;PmkOT@xR{x(aoVPT)f7{&tJH7b=yU^5AoiIYvkT&{P} zR8#(bK(@_+j;bwF)_CpmwUF5xAClBNB5%gC{d)&UZ4Fzo$grqaiebB?39A;Kc2uhx z)z!8(9@sqEU&0Z%Sf10k}&*4nJSyfREJ7)yW znS4G^);vI`lY??uTxfAwqpdz?a(ne3q9O6LL+$x&=Sf;Wq>g6Y&pRlsGdS#V-}2LI zvYT%X^R{g4xSSR!&!y<5tC2v)w7bC+%Nusr02>vnZsAPJT$0CsaXAS zO%IbBSDtm(9_6U{Lw#V+-5av}_Xj&F&(cx#c{MbBt>Vo!RRy0Pq^R^P_z=IRbAjK7 zLY1|1$L!R3*&-?Wc!Fv?K-Xre!3SNZbT_;tule?)a<6r&wtC6>U5(y& zg^!Yvl*%ag*5tRCv*LpB=&oTZJyy-vXqtM^`CeqZ?#E4ayBsMSzcEyL-`8vDcfO{M ze=J*RV$w3Zpl#Kl{sp=k`K7T_xySb`fs`Vxbm3V>Gt0X>AB4_`r+ZX9hbd%s^xDrM|-=S&t5Ap<(7JT zmfqO>*m&6M#%ls(yeeylF3qx%ba~#t(FR^W|1`Dk(>ot2R2$?qJ>30Tg@yaf@VrNs zmvnFUTff+A+7%yb850?+WA_6RG!BL>*U^5+m+0ob)B01W{xRv-$=i}5TN-3db{#lZ zdHsf|7BO1KRh~INwcgOiQdY8u^c2}C?+%sRvp$|MvAxC2dG{v5(H| z+pp!POFn$Ec4pPtUJE4jWts@*~AI%7ej+*jgoVt_s{HAjUlozZ?yQ~%#bfj6cXy0kK z9{kY%w_ewLPtS8}Yi)E)TXSU_b#2%A@lD*;Sf*qK+sW_S8kt%!&pRc1q<`tUs!vg$ zXN`EZATdN)KGx*K1d*$)})_&9V-11tP`i2E}Lx&c1@7P+pBYm(?B(5GV;U6dRdhQ0@qM1L(v#-{U$+ikr*qQx z>DX3TzV^eW8*aY;X5;Xl2Yh`u|J)UE^W_$^+2>^zJ}>#u-s#TQO}idQN|zrEP+p-~ zx$d=0_Ka%Jr|$-hw+}CDwBv%O$t=Hst3OKgPAtqmYRQ|p@A>O_`I}zF>PL>Ro^!pr zXKsA=Xghk2r{_6;^#MH&lzg>aJ+$!s*lR0fi{*L;E43WhpPq~7G+xsAp2fX;a$B!t zx~#nKIppMi>*#4e^j0V&_BD0eV?XQXp>^XgpWpOP$T0u7nNdwFcHu@J2h9|)ik z@Qr|l-{bP6IJQCjPT+g7JeG0wf%r$jcVqphGA=GqU1RuQ$@1{~BhHC$jZP0!@((${msCm|CnzA z2bDL}2-PbF-kP;<*bpRep7@qvw6_@i5a8W`$9{`4e|7`!CI&AnE#CZd2Y#Fw_KyM2 z7lYS?Nh41D62#>1120be&0)~Th|&M0V)B*1i!*+X@XPH{V)(xf_+eu3?|`TM7p4;D zMC-Q@eko7;uPA&+_@y+>KT-H3;A#Gd!dCzaJg6Tgx0 zm2CZLF`aelbJ{Nd##!nNzbVTb{6#t`vr}Zlee+hWH|G;aYu-E^u zz|;L3E`DKoeWl;~2VQ?^U%Wa3p4Oiz{9yQ!kT~(*1U#)DQS5&Qp7uXcc+ZyN#qW%m ze0zB45-0vsfv5dXl>Qfs$s56!-^3ZedBD^DCyM_MfgdJt|3d4szO{?zsGb>o`P!1@ zasQ-pu6!8qH2+26&jU~ER}@~i&F}dm3O@sQas0mxJdM97_D$4&uU}F4mB5P=zgjW* z5pBhb|9;?U{fg56X7J^2ad>aw#Tma-z|;B_#s607zt^uQyg%@G{{gR2>aO3|2A4$Z zJPmlfej@{~B80wwDF@z~9oA)ps!UYo8neJjM@WhkX+E{$(lfX226GEMEwGAC{+>f*TDcs@q-b_xn5SKb1Gs z0M%OwJdPjvP32tqdjdSyvB$Q_j;1zq|44b9LtGNo9|gRPfd5=rtV8@t;B8qRZ3}Dv z4)FB+z?BuW-&BX0KcdFp5_kjfA8k_`*nUHa`tQ%$$N5idupt)D6Tb!c9&G%ujH?gC zmjX}ke?{59T6JLJ--wIT0(Ho~1Mqg>Kb}JST-zaj9`LySvEO(|!NDaFe-e0H|HKI! zKQ-Oo^B3(3%Z~?s2-p{9??gM~{}JHrfXBFTwJpeh10Lruve+iP4&{`{zC%aGf68<9 zf$A>IJ3Bcq2gL4P>Fg&;<;#UEW^B);e=C3Mj{y6{9J|5IAwpU-GdWpc}{Gome zJOA?q>{FZd*`;$-*8sjeF;u{R>;soXd_3?2fERWDI1l_Ff&O!ChwLlC%{SUdpONLd z2NKT*9XiZC7kKm=UgZewzos#d2UEDte}#H2 z{`Dl;_XeK!AB-RNflDI(Jn(j4AM?2PH{$|B9paTunDtBZpCkT@_W|CLwU7SmaBP6= zX8_+5cw}K7a8AVE1s<>e$Ya8J#3d2m)%35=-&|O%Lwq>!c>TvRVPZ)94&dqi1J}J1 zZ4v*L<+-jqWHAwM1wqI4Px}tVk*W3PpTy4t9+prd)ueVP|0gB>81NK7QTG4$z~lR8 zjQyqCW?bF>)qh90`GF?t<`1qNVfUXn;L$#gohakK6>h$viMstml;?-R5Inm7qnQ3F z=7Qx^cP`7*eIwTZ5`UfLY5obzH-k=-|4qR`Vdu{*;PL)}{Gomb_Vu4WQ~fKz)BMHp z6W0H40{)9K{=MMl3Hy(B(I;W;M*>gRf8>Sj|4HES`47-K+g$rV@%sQg?Y~@Ev_-tR z#qaw^iUFQ)C=ovscttpd8)!PJoxPX0O{nv(zH$DGzWd-ez1|Iis@`r01RDTih7(ZI~q+I)dQ^0>@gymJ> z;F*T>HQJ1T-N~ge*wUF{lWbceHYgLS>Ry_CJJL4%>0@^-+;&QYXN1g z@dU?2{#(K?uV4u!BBlZdm1DlXMD->EkMW~@i^}U`@f_951|H`xU4I(l=sfX~HjI6) z)gY-#CPw@Tz{$mT-zXi z4)D1C(0?k!_8Ur6_Z;xJerVlOIamH8@Ob^l`!{5%9j?5s?O)&D3ETg9z~lH6M{(q8 z|19u0e#AG#(Ru7^UFyg5ALl>LL9Xk7cnjdsKE;izAH+`qp5`yMAuPWacn8)#vg8MR ztT&PU8rDALh2{0_82{0>Fl(6XO#&Y0KeAkHW5Cicwrhy15 zW81{r13#4I8?q^Qp7`a!XRU{6!f*Ir!xPYyrR45Bb-SlK-y2qyJpz9komRJm7Kuh`Ro6 z0gv&g_Joa}7Cb!T{!6jv+7Ghl20Xk%ue*Q6cehQbgAFM0$AHKE8|~sDtp8QOWBjo_ zoP)yh9S1V|7oZ~9j|P4`YoDuav_<_d0^S*TWT_0#Ht#B{YDlO z#V-YTTj0rWQl{3Qe-eKic)WiTX73ZUuLzR|E+KXP%l_Hi|L+Xh9}B!I%L@|&;x7OX zw;*-bUs3o0V0@Su{952~|B;3siekS4csDV4YjEBMcpP_8=HGna>G=u$=i0`v_ydpg zrzx^&44C#GeJ;jEz6WkE;*F*8)%L z4}G9=v{7H8dgieC}$Zo z3);u^FA5(AJjP#C{*0J>8@TwwD*%!0Cj(FWwg+W{}?_;+v@Z~jaH-c}6zIl$xd zEBcRpN9B^J|L?@~zu!dW`(L>4;TU#=gG(a&vnKw2f5U~NI>cWCp05AcciKm(-k+3s zNsr(E{*eY$7Iy!h06gBmW9+g2!tQ@rz}vGtwt@GNToUB-C=WRR!whT5Qd(}3>= z_A!tCV;fu&@q2-{1s)kJqx*2o*O!QY2RvRs(Jqdia($4%IpUqYe(#@DCQ$8kkhuiTHcKTLRw%AT>CIjh}(<@B2q=Q`q$z06g8lqHXdE zKGvJ4-e%T5`Y+1*sQ@0YU&vz;w*NMMJf0295}D$$zeM z2mK=ZRlwV`{^R=_@}oZA1$k5d-|v4h{#+B;_W_>vA1o8r{zl;Yvhkxfx%fbJD}c9S z`!CA+=@`KL{SJ;B*J}^@NA@Ft$M>%oJG}R9gC{v8;&XxbVg2VCJ8Yi#E|Zx1C$963 zTq8aX_?}>&Y*RVa`;$_={eQDh?fi+Oa^f2Wif7*(cn3CqI0iCgpaCWO`+)Dx_8)y0 zmVYAPKhD3V4cMjAWWQYy^Zpda56h^W>itQn-ZbEG{-f{Me_^kG=UATX3p;+&!OZ@J zeqtNa_<=(r|N8-t{v(3^3mgBVEKjkccCo$s64h%K!d(B*Z&99q#slxn`j4>}Hhw#S zr}d{^pTmDUNB+M79`E1j+JR%hB@wR^`g{Hha-RH1kFLh>|E%-a>A!SH#A(5E_?dWb z;OYMN?{(_S6Tb|2cmR_m5=a$JK9YoA?aias3icO7;Gv#NP%Uw!mNg zr}95>R8IBmqnPIx+|&P$NvYX32PtcAlG$3_D=#&{*w;m#AJ9@VI|t+^|g8{m*jpU%!9Dbq$gIS-^J(`#68_8J^1FW4(#$ z&5dRL{Vh@X$H2oYc#-W}!pt5g2EPjUVPf#FfQNS$BKz+Y&*Q-(l*oJ*@E&6DN>j!2 zKLmKb81`=h53g`V?!Re*c>EIJ#TmahV%i@vO}zQP6?oeJMOnW;fVY77)7~lU{%x1Y z+&|-Hp#lf(3z)AjQ9b(^zn?!u;pYPH0RE#bQTXe?lVM6o{#cyavC0A8%|174i@V?0~D`5OhiIQCBf zFHZcL&Jizu&cM_2n<(R-2D~`^e+axd{WnY&&wdo}c4F**M}hALd~?`9@fy+yH&PCX z_Wy6d-@td9Hp_yTs1}-UjT8%3lV)FYq+(T-zc0&F260{-X&w*nkr62fQ`d z$Ld%nto^M5_R%)=1KX=Fk^O4mE!p^S^&Q(KzFP|O{aY++3pDHy%_D zAL~t2?*Q;Ufp5mv=DH4vmrP~WFZEs6_)h@d7VMKp$1nVLQa{W$laV|09;C`6K9KeV@s` z>cZds$NJ<)eJq|MejxCI@2{zxD<8+&NB^6`LGy?!e-U_EKcetbi^St?fXC|}_8Sjj z{SODe7x1`u;2~`McL0yyzY;Zm<-qp`p7sxLfm5P!9=Mpt8xB0?MVbG+C4ZfN!p6@G zcqcY~oE&E>k^dWk$KRiby8nF!-d2F;>I2!gSjyu~WaGz`#d^fIS;ph}0Z*}~@`l=? zdP{*HBw(M)x$+NycNO3p;^;itF<#E&!7WJL{K0e7532VkB|Zmu96!u+WwA}-JFQ^u zzbOAFdw(yd`Y|leb>31t#9sg&fB#0juCBXLs9`_GX z`1imM2EK)ee9S7Q|G0MwlPLaqz~l9U;?A`X#7m^{coTr9JXas6ekAbXte^A1_Z0A- z=21g_kp1t#_XS?m{eR@@-|Md-n}X-b{$1dM#fYENn&01_6Kubs&tzXO{rBG=H^c~@ zCq4;yy8a2CZ|F1ecf_>ceJzg{AV&Pw13yv>z6SWQV(``L#Jm0tTQ6S!PXIqr4FA

IU8HgFgWFv6vO^A;KkX$Ew?e>pCx~U z9siTS{xX$SNC zCB^a-$A+3C`wlyq>n~T1+9iGi@T1xIag80eLHsA+1@C{Tob3EbsotPn%=qK;H^zXg z55%VfKM4F6wg1mq`=au_b~DfaH2&n*pZZPZRBs>fxc^aJ*#3V29_K$^dy%Df$j+aX z>UG}3JU_|&sp22XiH`h86 ze^qGU1MydY$Mr+&w*lR4OidMPqM!e_`bm7^DC`EJl{|vz5;mMzeOFt5&N0>OYv{WE}bX) zTY<;>53cLx@BByLZGjin{;C7a{1tWny#-#J{kPA-zkdIg`qz+B{B{5@XrJpGB3}29 zc-PNqz~lZW>iFFN9``>{d9!S0|DgFRZ2x0{$LkM`zp(r*;71AY3Jnb$d!FLo<1lmm z61D#Uz@z`v9!K-P_K!Wl_h9|U7;tTe>OBU2Fz{%XYwWNt@y17({S(Izc`C;`^(Cq| z1$eyv;QB|NYaEF$1m2eAv5adUh*v(!yg#5k*ZXLyKNxu0|ER3Ke$zRsyOy<2{g$T+ z4Jh%qfwvJDKd$>I@r#e~coPNq2F(6CP5e9H@%n=&L>WJe93IbGfERZB)&uV&zzf^| z#>an;AN2vXp+x;BVc zs^<>86&pXSN7s>mVg$>GKLmVl;L)}=98@k?_n$sfz5G+ZzrVB({{KBx{!ffx8P#(? z&HVlz?b9Jx?@ynJPX`|Rk9iyeuFny~KL*~CUy!upKUm?5{n?{QZNd{5RmoiD7?KF7x*%qS`+Kyqg&ITjue2 zUSjZ*f$t7Hj$J!Aa1C=w6#wJE)B3|0a2-J6KLbzuFIN`*Bi{5pbN`BEIET5mL3|AG zXdm-<2+L;y-wSv^Isfe%)+PHdfQO4q-TM=aJ(Xjf`V!UCy}&#_U|rlhh4p_q@IzSt z(LUFA0A&9Q@Ob})EZU}W_*ieEdUh9?`ve-U`R{!rYg zoa+5asa}&y%=lqml=qn!dGd1x@EAWV7KOh6yrUSr+*RiHPoml% z1-v-^r;BO-3Gm|d-{6{f{)YkIUyS%41Aed=y!3VP><?6nD%80#f#r4;KhmGI^YM2G5#-r7ia#P6p7dWX~2tP|03|Xf8({k32uTM z6YbyaZivSZ2OjS~(7rHZVXj?hhxpgP4#gWq_JD1hVIe_XeK!4^jB-z|;B_g?|e?&3{q& z-o@hip8&i#_AdZ0PXFa@i|79^;KlJj9eBF_i4y-8V%j$;`F;Hs#r|~Q#qs|d@ZyYL z%RA!5e**C0tiKE~?NL`LzfY%mk0bH_WFy@{#4GDSG@oG_cwU|BCP+zfbYxpzYXwB z8#2tECqFZQ$M+v-7vJ9q`~Knu@PgNGVecPCm+^RA!9LoShC|r?F9F_0fEU(&1@KP5 zbF~XD)+LHxmj}$h-%D|CMim-R;@yC^0sB~81r9m{)_9}!M2G%!}6lW|1>E8~-k&0aWf(^;iFkM5 zG5(Yn*8X1L@%=a2#25%`{{w3uSvR#D@ZJCeVMbJ`kS;Jifoi zJocT+8*+o{Jp|sCjUTRkVV^&A9`SfxfG5AHU9R>A1CQf}wy_Oi$A2#Hxc?!`b?nhM z^7An8Ho#LJ{os)E{`8LB;uVP|K2|+h8*x;{?7#-x&iSv$Y-=XR+`>CvbuJaaIOyvIsmd9(CDE1|uG2@S{Fg}odQ{d_Pi+*t( z1LA{#?+@|AJjR}DABexo^5{DrR1P2OO;oS*^WXRXXuD;-)bEqTCjxH;{$s!Kpz_}} z|M?TuI|)3#zr$KeaNs=DMm6EXeo`s(-m6(#<0z>70}xxmx!UqrF5Tq&Oa6M+|J{I&uwPXFHmFV6UP ze=VN<1mNlYjVSTY2VR``DOLS`e3_AD_WQhH{{0Txvpdm;29);i zWZ>!f3Co1NeqIOO7WOZ?b~kRoE}bU(if@_kZ_xdh0##^0iFX3NJJ?4K+Yr|NRN#jL zkJoHf$evL1M3^JY66N070XRA0|^!L@N8G7(8s#; zzoF=FKRD1|Setd}e?zgqPHDcJ!3K)n4bqnb2wJOfqt!o0~0Ea-x@e@O>BSz zK-~fdCRF6N!+~~p!huOpv3z%3>0cGOeQY@@wwuM~QPIysY`#84E*lQi!>k?w#l%IC zJ6czpQM7vkj;3&&XUqR56x+QF2lo3a9BB6%92lPhI57Q_;`t&tu>K8JZ-Qb%#q;p% zzB(;o^)4vdf!DxwTp1`PRBQ)cPu3+t#daRTf%>TK>|YhR$85Qvwt%vCaCC%26)Uld zA6v6|)FzPEVDqSGr#&bZX|d(?DOS;jAINoJ>({4PMVGB7s94mIEw4|pN+-4+Dt_z? zKhS;`wj32d>a%LVsv#CaLdB0=;RlX~F`G95#d!3>ldNL9=4>7nKU%Q)`V_15Ve6ry z9cwm^iXUy*JSy6;Wy|}q<*4}4j#YcM92MJhV$1up<*4{^0Gk(7Y=01YelU9;6+aGP z)tN0v#dR@^Eg#O7*QeP2NVfhcwmvGBk73KlvgQAz*dI6cyrANG_hHLXu{}RFkBT4t z*}R})y-84x;~55u`3SZistn}gK(Q#EEl0(VQ&~*_MSd0*{!MY8o(tvJ?tJzx`SO^IfKQ3f-5nC>(*xnK-NB>r{=LHq*u7`50w-Hnm^fV~?c^(wwc!@oq&+1iB zjPMXo2S=Aal~Yc_8S3jgu!*t{bs#%m~>AI9oPQ1r`<%})fycKD!Z*9R2mK`@&S zVKo#K(?2Pm3TMxwVmlF_=zk0-o|?jz$6^MOpknuLzX?!|I-NcLPl~5zvgiLv zk)O?;7u04@z8K0;)7kT=ijd#U=KoKsD)^Dh`tg60;&|slzi@tBV*4kkc>Xe5j*8=V zmCd8#$LsI|>lLtCh=q_)aekM8B6klIPu+(fSicN24Jg)oz}6E~^!E|l&SOxl@|3M7 zs95wIexUtVptzo@*?Op0UJHsvpWp}D`wWWhe`oVQ@FXNb#d<%X98XDLBdlV%B;-*W zf#Uhb?0HmN-?E^%A1H%jJr(vmDt=UD^Qd^fH7NSi4iujsIT8MX>5KiDDs;?F`?qeOtyRnt9wC_KY%CyrdX5>KQKOLL9ySt zY&|ZD{mX;;c;8&aa;R8-0~Gze%a)^Je=0!H&SOyY{{<-4f610tg2I2iH>|z~#d;sv z{1-e42^IVG0~FiC47MWyigucUA}0rm=M_LPp<;PUP^{mIRaH=oyE-T)ROB>S)nd#4 zNwJ;|oJZF>vh_QIV*7e5hl=?wtm=c}DI+%Dja6e-O;|Mr#ddpu!hbw-_<{ENuxbU0 z?OL;H!70bifyr5#eNVXgm>qW77RP6s`HZQ1HZwgyKmOU@1t>FA3w*23u zxGq+){Yqo~N5%fGX7i{Rw{$j-ig8*Gir4dOw*23y*w4dke~y7-K8NiOD&~)~c~s1w z0LA{FX7gv*^MZ=+&91ZO3)uQM*!)elJ}S0%i_N3ry15IA@h)Y{QSoCrtB=`oRIK-u z)#t3f1jTk=fuf&Ppg7L8Z23n}OsM$rEBwHAzO&_mivCE#4{WayDAsF?g$*dylV5pQc3}Gad(0PX6^rV7PmcBRJl6Z~eK~VK@!$J$W)xB=`uOjCIdfh3?|nHlF9hGC zpai8M;zWj&$4+Q=v6SOD6 zW7-vLTI#yFp5FS(MGHMAte&Cp=|}Ruc`J**y&cjsR#oN8`N9ox``SFPznOTejob%k zonuRUE9_28EKhp8An)>*784EUPG-J~$F$4dcGr0=m27leJGIyH+vC6R1Ns%TseIhS zK->K1h;ByZU8{rk2SHd?B=Ghe9{en*Y` z#b+N%QV-s(m{h!=nS+M>{+kKavr9^5URGY=@HJ}b%hE2&dpsjr-%H*kyK3UvCz>7l zB)OIC^lsnj$i9#lj)_BaCM8+tl?$}X{+g$*X({vRqh9W-?0#<1a9-_n-p}iUt18~< zj9F6Mv9!Z#=|a_t?S1XvMoXwF?fZJABs`<(oYOJutsh*L$rtRDXyb(5jEdTbI1-gd5+TJ9?VlsqDTg^N_^XkKW@xwD+i1 znyRj`V9=g18~VmMb{==?>%6*l;dl9<_&az?QkO^0UOjE(!e&3^)4~qzGCZt);l;r0 zF=mBTBQov6mOl46)lGfG!kHOP{8n#6Otr>bJ{s!~v_5)^#FN9*Z)R$j9v1Kyzl%Ug zs>8C7`eDai<32C)upJs!_T0m6jX=BjT^CAH?;o{o zV*c=I@Rz~KQlo-P9y|XW=lgTHvCoB5^7mRyZMiHf;E2=DQ}Miai!MK$an`@Z`Q}X= z)bbN*_8YXln*C@C^PNp*{>oCLpi*u0mCv>3S1d6-pwRl6>~ntUBK^*zmO94w=`bey zVA>rIiCd@L_N<+iI5D){!x=tBGFC5sHb3#Bk)GtKir8r#9Pzu1G=K3sXq2RQ4#t}I zAGIF#?ECIb!<)CNJ`_B3uHwxR!#ity?b)btRp>A|n^(K7FKl^mahG;v-^nBI9l0UZ zQ}f9Ri*uVjx0`mmBhW5>SAmk0bK5QRCO@qVh@I6KauOQ$({#+hYSyy6mFX^q-| zr;}@DzLcUxT%F4?};|BiEtbG-brKDz4bRDus~&+`gc;Si8#oL%>9J^z%pDE4>ZP@- zIyWxzF}dz@q^@0_49;ErP6#C_SN?%Zx}T(04g02PoMvA2QpQhaOY&%r_6|95A5WqNEa1V4L_ID@sz)723x( zTNzgNk?4@<8Jy;@wPU>EinAAw-wMBZ&f0vEN8#&cUq+>*-(RF+JOA`NCokEvUE)q3 zx|wFf*FN^?^C-`{b|ve4#qYLKl6t>GwfvKWnPvK@W^Dt^d1F(rp1FOgkA3-O{Wg7< zD_&3CX42#Q<<_nq$Bd-(JG2>`D|Jlrok9=k(RpL%X?TqJELGR8R9$@W-$tS&byw3o zaYBKrmT51GnXUY%$*mpaw7ShgrOEjnYLyOu>M_V5S#Hpd6qTfbop-lulaz3>M4#Vg z&-2~KwQq;Ynw;+x!?ufYP@zUarGA_>>fBAD*FuF}{qyCII4vAJeMH8PBigN`cD@T; zy1V*u)#-Hy(o%=(q$!=cJ+;QCLc{FE$K!?)4tM%B*)weRcV-<+)y1KuV7o)gC0`DT z?0;CM(cC49UKO9p)8)(xhF*%k9rro$96!4-K|Xn%R(kB_x910E$UVQhuz6&eOpv5> z4}L+;$(j@GUbFt<;NkD;DM@`^eNnPx!$`l9C0m9L?&Uag{D;rR$K)T*RQDUv+`{%Yi9MmmD*NmMzVs}S*cI3h@RKA%ghJ-?g%9*d4rA3Ln{s1 zO6pq%`HmiV!of9S=;eYDW~bI>=x>tfr}pSx(ylOF%d0DM=DxXA>*&*Hy56&W?wR~= za_6%H_!@mLq&j3jQ@XW> zcPB?zEqM;>FSe^jje<&5EW6xhSL>LZ7D_$)zt${#m9x)g>WEW~?i6-dX5yQwe!Sn4 zrlGu=`^~3D?F`y;bwuUy!Z9zy7B!J?k+F1{T6(N&UAxS_j^90?Bz3i>S;U*yX?f}A zr)|}6c<+^e{lOzWrA-U$b4(8>b=b0HViVqJ-fW{Irqiyy&>SM|ld;pM!=~ladTsE2 z^tk+}(y6Z9hy&twMrSy4o%_!p?ar^pyb(g4>+PkHVhfe-A&t+LzPR1{%thJbG zX{G9+XrtKr>*->>F9*^azsS3vV7x(d{v2sJV^h0lb?q|yq&hi^?H(<7x#Xnt2j_hr zQ(b*|EiFsed)6jZ96vE6WbucinoiNxqo;OF8gd{drG>+~r(Y7(O&o0abFcx zC0=h`#ZP&8H79dS`(oW_pS!IM6(08<&}4g>WH=Ltx_uJ=W`L5E*0+Pzdwb53Qy3B5 zSv%O(#cS1L(~Hh;Q>1McIajFX@!EfL-?25J$CnWuCO7N%B&X<5vl$mY+FL|FTW_v$ z=h7hj+X(otZl7#Vje<)3NS!b>ag|Q%2ghcOzNk`Bl5(o zOWxgOZIj)>N%}%dpzB^<3$vCF+S zup>np51J=G2r~P8F6UU<`DC-)-a%SbZx1HulvzzQPJnOZm#1){o;HZP4vI8%SC!{YU_;`BPJwju1S1~ ze*+-_-*&?Nw}W82>5HCs`_cOToGxltq{=O>-?-ZC`RgMN{&@<$^9x_B)j8*vGvRUf z#0cx)$-T_~J!@pxg_tZv>6U+>vd;u$t`K~dCs)+C6?X=eG)GBTt58H?w`twv=k4& zt!tN=4;=;DRr2fN{ldL`&CaD?O~;L1n&ql=A$VMufi0V@*?n-)%@woC_sPh#QJs-# zFLz7*$mZ6;AMEB%T2OK7oa?ms#P~^HQrUJBq0LT$?bgmaGN4^jz@R?7pr;Pw%p?=H z=PHh$=VScl`5U)#&61b%%-(Eql3V9n`c+SQxvZg;(?b<6`)>x~O?%PB1kMAmf`CQ&m zbB2r2Dc4V3tb6P^_&y}q|5A&)D-Sxd{^CBVC)n=Oi^IHe;kz~&d+B#rpLBLm%+N=AJ*{LSWxmcGl9ygI%p_-3>SWEjcA0&$ zi(tE+&C1v9$Wh<(#A9Tdgz4KwZ)*>D>+TP(@eMEwF_`9mpl|#bx29^{o}TlZzd67p zKV|dYDX$e|N&|a+&)gQ!v|Xh@yZVCd#$KrQIet?8-3I-4Gd!Iv8n+o36Y2P5WgHOiAi%>iV0q555PtnAFwFEl8?S$&%!5b7#tKUpltpy4P&` zhjN21K9Y&=w)Pzp-@1L>P_SL=A*bts1ZS$j9qW zvP`q4nauq!)2@+VyY~;jTxzlS=B9Vgj^0TyuQfZGXFmJQB}26#SMDlIoV~-R`Eawb zYM*5IN6z#t2; zmm3(}`oZSvsnhJ$Z@#yk^)pvR{n6p1I)9n#8~zV%8Mw%$f#lJ71LS-tjM+2XHl=g-rLnAz5~uU4$-gM`k#Pp8aD zHIN>-qiFQ?cOGidjyrFRo$NgJlJW!1|BtD=4(h7;8URjrg96eZNJxu_gfvJ?w{%H| zbR*r}-3`)6cXxx7bcb}j`tb9e-Erp2U!OU1?!9|=&+c7w|L6YgfB$~p|F6L)GUZLU zbLC|XA}Zh!!%-0>_OlI7w~l`*(+{F*Tj0a=ewVxRra3-SCQINM;kV8(G{WQ35_Pi0 zx-gNQ46E1w^845QcTT`x8wU3W`eh251QK=UM@^ZZ2=gzBdJV)5@v5z;F>y7fn`${O ztArYfu4!LZkl8`})HR!B=8Vw@bL{b{qKLH0UVW+Gxxo%Bqa+4j2I{d@u z@~3eYc%KF1sq8bgSwfyeb8(B`r4(^>mp|<9Z-=9jV9iP9m9j1I^wN+%`dgR;^-ZYu zR=)UO9{#?ExInk^RIJ?Kj0r^wK9RC+^OeI-yzm^Bg`7wh#9Hb#GOur!qkh4G$`A9* zl8=c+6k^bZ{DebIGri3M^$})RBGUif^M74#&^_Nh6=TwQsLt%^P*MIcQ9M0l1C2Kx zPR?X6J~17ToWfamm2qa}>!)h6%Ga(X6Fg8C^?88lz19ZaGlWEe1oQvmed;H9K=;b6 zz{ZB{$G3YOtNP#H8gnaFeUpBlKjIDGD-k<(4ZX{CH)#$}?>f|uH76MQ{c@KqEbK^N zzQz?}H}{6D*?sLPzyG~2K7j65$_+&p6A#7q-sz3Vzjh6C}va4m`f9_L1$qTxw&wi}he77TpcxU(y zCaKpufnP{Qd^~37?yTLp6ROYj-KCSW!UVrv;Fkqlvk=Df!GK)dVUaf^H^a&6^f(hw z`Ge2=fb_bEPKk5k zk7b@*y){B$l*8cO&CQjB{`) z6s%3HDEdN7Ct`kd#cSvPNa`KpH9%?^E^-N;Vet#gLcj14*l2b8Tkrhy@4tC~0Og5m+X@QAi|q7aU3zD@Q35nlr9%>A#JVK7{=Ft%Ye2M-&G>i_{Ws?DmY8kMJx< zDn%nZL+6>{Gmn=4+^2bfAm}3Ccphi<9#=K4;Ib}FzxZPD>l^=JEf1q8XO{{eW(@hv zjqVcK3;duQ^m>62+?lEwbO>|uYAxCvdcn<~<0$U`xljG15a@ozf-DJn_hD`!38gI; z5|fuB_fPK&o1BUvc~R@L7Cv}gg31|?!+(`1oH*)f;L%%N-h;TN{Qr@9bO#=U;pmj zOXNayQh1{gX9Yst9oP0<5fU-rih%BRxm*KULV&hv`2Eb{eDOi_;DiH}6=mFNP-mJM zye|&SuhG5AAMAtkzF{JW{)_$8-dHG{S%<5YS3aFC^Y0M;=l;ETqM(bopxSF2OhJ06 zh!g*u_87X^*~V|1e?KZTx!6NioCH4XoZ%3S^z&~m<-iZoeYrbER4K0{(0fZ`OhogV zRo;R3!$;7CMc%m~KcFq7BH^LkTvDYCSi1-!ZQ`BW>^37r6iSNwB=yNJji$f~mRAy! z1JA|poFSNWL~;LKFJHv#weEJzfAK;fc>FQ{?xX+LU|K{Sm+S}+v9(kwGsp8#ES=Xc zubJwCM9&wI={%af7AKZ?ZLPMnUA*oH<&dPXaZLv6rsCAH$-ctTzohaS!unqx{`P0$ z|Ik0bFy90+YT)1{B))%6B4v)z(A*h*vsXN8SD^Mv=+}oatrP>p=5HGKT{)2NM&Bn5 z(-Cn6&eP0Yjhpus3XB{frS$(V-oLH{=*HY~5V@CZg;ajJWZZ^pVO#Z{wu9<;iRxw3 ziQk)jBv-zpVeczwXX-#DtyYU*L(>Zm#@tI-Ef_~ z3-KLAL3gC2bpKaU@fq`Tn>@p~b@;23m7~IM?Ab52%tF6IXcW;6-x1)ybfJCUPphK7 zfFAI^?ddFxCszt|ksk?K*x(=E7*MSNe7p{?72v(_WK318`D zrbsvJbS_cerr6^Tb9}Si`H|^;G1)HG%71xya-~7{1P@i#fb*4Px9~45SWQ`@C^a3Z zDIRuN<;fN^d;})XgE?k?=#cy9B-Gqo+>;^}>i+DGo<9SwTv zt$R-A*q2}8(A2EMY#sI&&)?bI1!fIPM-5g+6viIy@~S*+(5K=&gDQJjU~<0x?CaW! zD4na?2!x|((tln0Q@o!*SJp<)*&4&5h}5JOpOlT=^Ea-dt9 zGM**XZ#9=oQ&HxbWyMGS<)9+wqY8)k813Zef}AR&Bk6d@^phww0s9VV_Eqnlx-A{E zn7UgpO%rpSYcFtqArHDrVi&p#gbC$iuPHQp9y4?~cOJRoLr>HQ&$JX+()fRWvB+oe zmtO9Cj5C)R5|OlPn5QupshGEUXKSOdt+k&DAHrRzh^l?Z1{~5wlTL;$#q-*p9M$n}P+p|WCayQ*vNWzXBfdPxG;YOo<4mO0NuS}5kEpgODedh{Ouu1b| zoG=VbqrhZxI^ZgSF2?b7ky>1@`p0bAf#g?g$&R}}p%b^?@@2Fl_=iLplX@J;1WfS@ zFy})J2H?K!!gJx)Fe-bbXT~_g^Ea3LccN%e}s+g zDx|?`g_KiR4j+NI;pRDu=wMTYsf=0nUo!_oMI$S*9E z=$_Zv`6ZAcrM3aCD(DVmd9?fZyH{8Tw=-S_HCrSuecKcad*igIcdD0AUq}oYbP(?i z)ovNK%%!Nu7&RV*U9uA;mbA}9bmI=&Tb>2DYM^_w&lYG6FMm#LtmZdF7-w&$V>yzX z`V(r9=Zo4p{|v(LrpgiMcFcM3hln&{?A{x2y@11QhoM7dQ zvzT;$wKdX>(O?fgZyNv5Kff?>J_UDgOq~MnTbq5FG@7M;z1p*v2)~+p=y%l=C6f@I zIxmnGSC_9yIXpVW;0$K2ZsS|6qv1VQ7qNwE+8_CQR?WZrK@)VR%s4Gaw8YaF8RClc zPh`V3rx~Wh@G1OMvDXOLHk)MC1Z#!QzQErV++j^sE9S&Nr$W%&XKYIGnOhUIYOL-7 z?q|@&uxBAXmRZ5^jlF7{Dd3=mKwK#IFaP>sHrxOaM>8vo<)Vt6IfqrnwO>(2byaGx z&-E?Ql)bUSPI|$ zkQtM<)&jlG9hw`VPcM#2>cXj#I9<{wA~~ST7_x%ICaIXJqTUWUoF0$7_z^^Fw62<} z48*Ggx{PqvH!0)Khot*w+(Z26*O4sN$JVrHQ-0&CZ^URs3AvpFAML(zgi~Rc#1CUs zI@p^$`M{5&r{ku4B0r0%-2u3|pzD#jC@4Tyv-znFgCzfc?3qOrotFtz3}4k6NwqRX z9fUE|yp_*MB5Kc(Ikp8luZusok!;IBm+SRg_7}QYrcd*Lr#$F^Zg2`g(c8*c9WzB6 zts(Zv_ao5UMLTBxFl86#S}h-Db!$5#$jGe>e6nzo`DH?qa_K7L@Ra2TMx;yI6=Mn@ zpU!G}a`i#iyzw?KCY?ldlQ;3V9@8>4Yow!o`qhSYwuLM7gN2sv?yEwpfQ*5GzLP5D zHs}VFFOr(3=vr<>=1gQJ?>A1sI+p?HT9KJS+At&cyd}|!oWBfRIJ86s*U=3@*Vyd3FX}yP%T;=U zN=gU(Y9=LfuZX2Ui1or|z$j%`I9ZtxXI@PyW)>IQe^eQ@ZUfNKJ}YY;9eC7iBX&lCmx zcL?4&SKYk%^(!cXim__)>#zNt##+p|@xHzT`BXaRK2kmO@}6-9hmiOg#bt98`r*|# zG=TdBbQfNGi1d4gFU>aK2AJ5b3qd|5JDvVEX@DiI1(w( zvmT*$)qe|*6jNAW;?dQ_`ZT|Iy3b5Om-6#z1MJsEwtD|g*?@2sv`L~H7c*IhpA1Vc zEN3h)`;ZtK4~5h{&%{jy1$>U^x)tGazNJR6S>|Fm;!tB%Jgpx;x&OW+{ma9=UOge* z4AUOlpd{euJML9T`rL7w#yV1@$W!+l3x24t<%cPTkd@i?`Yx$Lagu%~%Xd+%sffKG zyvYhA^e?UNfIOIk@uH=9oX1oMWtI}&Uz0TVuJHyswVwX6gT~TJ4k-E7Z;v9e(JDHa zzK|mH>q;n{iK8L?3kv(Pe}h_~(_H-2^bO!zfG(B`u5Z1idLOq(QT_e3)#kvXiJLQ& zpmDU>szm7zwTe$D%h^{Oo?)dDM@_EpdAa7S+q!FUN3;FHHm(u2rNHOd5_G9TQ(j3y zB~Tv@yC8m~-}$tWYkzX?dcF~1x6&5h>{KF;WD?#=?dH&k$Kg?~yKEPvt?K7*2O|L0 z6By-VuW~6g{E%pBkT4w+#?MzR%w*Fp`H2HgTLhb( zb$V$+!RO5ubT#}AsR!0q4zAsAq}0DBrHo^?yySU2^zd0(y;_S6n`~NNrXh5EBpqNS z*`^;m<`>dMb(2&POSM`=NK3SS+YH2O2fCl!ieK!MHD@Pk!i(XHlj@r!%aP+6-p)zY zf0Dk+Hz&`)Yhq>ev(Ic>|GAqJqa$|1SR8~g{%9F0FYwKLSLkW~&eL=86?F4VT57K| zn%A@LMS@~9>-RFeACU9gRnL7~_@hIfUziW71RzgpkTHZ+LGGKL+lC=c+I_TrBf&k$ zR5+ubzYqY#YY)0(Np9b*Zx!y zm9Lghh;fulzNF+N`IXJ4lXsAQM`X0s9^aC2DAr}{pwOH($$Vb%^t{0!ME@}zLHDs6 zMe@gUoa-V~10F5e+K9jyE)^6{q@SbAxv*Keq5dd#ubTI@H)n2|AXBR$jbZ9rj);w# zP0{G{gQt87c8C9q_o@Ei1iCg4MIj5qGL=PC{3|XE1kbjH&CW`?*}CIjjdVX0l!+8@ zy^6*fAVDqfb>O>qg(V&KM_|^5Z~O2%D<%5XRn*k~+`n}rXV49w^A~wRrG)G%zJ=W9 zQ+HY6{u8zfH}I~_?5j4Zj5lWEuUL{=sa7H-msb_NZ_)D$@R5hOU*G5}ZA`pRmHP2C z-+Zdexq$9BmyiN^o&9z5J_EatZpBWE;$v{(`vIroUwasKO@kIV-$wbOCoSf@jSpy- zD%3$pI?S#e=yNmSG{jde_B{Q!&*pEuuAqCQ7c!~v;z#2d(G0)%aCN_J0l&SvS|T!D zI=ftJCG!=6UN9oWCFgAzPME5`nj~4ZrPYd-v9+^MUKtW~u)X$wd3ai9a0A`>jh&zw zm%>H=_su)K<}c2AZ?qkVlgQz*hGNar!g!QQqRG+A<(si9F^GQLDZy-i>y;Yne~JIG z8g^I)d4;q6fBF4ehj9m8(J9GYH(E9k2{olYCY6e{f~&M>L(M_mXSJ-k65aQjn~yP? z5^8qVc*52-84{L7%WDmeSc;T<7(|$b!G!2h|BLsp>jAn#c@-E+BM_>j_IV#;3uur8 zPrfz>&iL9c4CiEwBOWg{9_p8>k?JWIe?Ah3SFvkl#YTK4)Vxz*hwDCE@wg-PpZoM2 zdxCBR>#ALHlmLd?0+NnUn_@9LamX+tMUfuQuf|W|zH6EZO~ZO}S8xJ1tUqj5r)(Xo z8KYy4NnWhahjNVuQ~N!wlRdd!pnF)J7qe|UqLrA#EwP3nJNf+3E3wCwmmXvO7q`GZ0HsZQS-zRvO?A!o_>If|1AwGuT5Ndl`vo8)uL#MEM+W zeL&X^!}+v-=s`2R;7g7PiEJ5ed>U?wt!M4TYG{7h{d?J|-a2-|>%AS?P!+aN^=wOI zLtiZ#{H+PedTK_o1}*SC{|$7_x5`Oa8MT_4LT17xWsw~_6ZHxX?y(d@efe>tV)uld zj!tq#%k|#LaTXFuQ@C`!9al4symmyc{!u$WxKHu4&hV69U(h`w#mMH4W=b9ilG$x( z_@-mCV07oKe~8lzA(#Y7&_%*uxaWhb87d@nVJvC zgCFSH>nOgaE=!2T77ZkIo_OsclTiB8c@i(%N;^K1sX7v0-;CWm+9YB210#Cdhv?WJ z%KAwb-#3y*W+=ZolSa%L0G&i*`xz}%a zayKAr@;H`)Jz59h9QnkA{b%o{0-L7YehbqJo#gsvsR;{?D@G9{Q7Z*T2(=gzfb*e1 z&_x@cCUtGfw8ImTBp)@FSrSo~#Av{HV7NqIJ^x|+DN<3e6*DSNrY$ufVmaI%*0>J3 z$ezIN^d4z`4Nt`W7`)GdK(|>B>r>BsY$WX%iOJ!w?Rka$omKzbWy>1tC6-5V#YhSS z^oRP3Pgxua8A>^1{uMoH=?GZfzV6)3&MFCYW<8!rlox^0p z(DP*s-$W#dVi7-Oa~U&-4N|+=6uxL}k6ljaic_-c1KcpsWq$GQQ(qQ@){CV)j_n5M zU#o0C%?ifVs^rC0kabm<`$<`^7B_x#>r7z$%pD1qb!*h(3s%%(y2dc7s{SfR_Ow3# zl!tK8T?iHmn{>RX9er74&6-;1xBp6kimcDFrbY}hWkGpNx~#q-q~cq5=vLdjZ%GC7uAW*cJhKtPmVDWVuD|dw@ zC_Cl_eRA~K&Mh8{@A?Zu#_ul>FDLW9F2~evJoNN`d;!)8B0*R0EsyDS{m`4P>p=cu zSnlK!91o9pZf=ZfZb^M@i?xwvi8(?~#i((#=2fCn3U3O2uG4Z$yAgs|#uT!lytp7B z-YC#5|NX9Bb4f?-Ksnj61G8iFHuIaD4tCWkWEICpQvn1LgHJ)jUJV$Wa2UL6VXs>K zO{J?b+4SFgRm;%l$vNPG7hm z+ZdtvN=6a2rBYl4(RZ2FcoFps#d1ySjsw!w>{RDrksGoR-?ur6g=r zjwXN0vwzR<{#Qp#0NvT}SIZwDL<-mGI&)70$B;$c&HCKYGH=no@^A@R3cZLzeVIvxK zINy{uQy~uAVD0>FNX54N-v>OgCS?`g8e!G4k?;g`0)9+gc><= z7Y(ddyx(1bn+&>;KUSJvQV?{g2L)U4icm(Yo~g# zd1gh5yy)gH+Tc(+_x|;9qd)r9CrIk2?|h!FTMFnlGZ7B$>`TF@=QCr{2}aD>FqMBk z5W7B#eTcEt@FmB4FHX$zF33Hwk!}j3uRPzsm#_~lJYSPCw#Wh{-!(Y}h&L5^kO^ z%j|2|Oo>2Rs?<^P_GOwcV{lhKqPm(jU+?JoPtiAxC?Z>|4DDjxOrciE(2n8|W=>;ZO8 z37W4jZTd)T?qff)$USdy+kLlrpEIt{%!dTl!LvY@iYdQ8(Ji>(cg+|qHleoDXrM!q z>o5i>)MfoMtFw$aqmT5Trw?7Qf`qV%pE(+!0 zw%=+&-|K_7V!Bo*c`glw@yZ+IDv8y>XqCyBIH4MPL@dv^$z|RbTyTtGe*o?^>;%|ag7D%piBoX z6&=sgFrdF2^(fG7VG#yB>-}(qoGh~Qs8tb%_V*$w;1+;xy7yURUzB&)U@3K?mTq&VP>1x7 zgS0z#tR#!aZ7i}0BHDJN@k1zAZ=siW&8y_Wb+o=6rp(Fc(Sp6~wcRadfLjQ<9J&H0 z+qH@l{1?PidtzzswlNtMdzU}Gq!F0w>sa_aX}m3L{l;z0_k9p1K04#WCMBVnymKVb za1!!hv+0%)2izjiebwOf6GsP%i|q|FQ-?xhklO=1IUR>?y#@@#P|6fX`#INQQhVH{ z(wXfRGw%ot_ovrBR&FIr0?l->g|N{6B!F8Cy8d)wgv?sScDE#7Iw>Bk^0+yN$l4|Z zcN&l~5`q-sI~uk=Qz8A5NZ*8w8H0=yWjkw3%VJk0h7GjxRNGVa1?!U~pnFeyw7S65 z2hHc^FP!(mXvg=GfP1`zcNfO(i`2HTNKHnK;w-J5Rfj=4PN#lIIwz*pyha*RxxJCC z+Cn5&?$ds*r{|&+bbtD!${b)bYc~2U@g`L7(*-9MNF9WdZCKz4=ZmLWWh_@1S&yExeHWzT;E1myxQz;Eym@X#wCl(xB zd@+i^HZMWw;^D19G7%g3Oh(O8%-8*FrsER@WLn|EMJF6;NAqs~65xIZ-Df{ZA)Y_< zwRyxBGMucFRM8cP(O$<8nz;LVKU~^cau?co4orN{LfrFXX~E3$$Y;*;qGqza*C@? z`FEZKyHEp6Jl z)Wu>fSac=jOIwtFYMgH0-7o`oAfdB2MW6E?q?UdZ!7qz**v|mm8qlTEA2cjx_`wn6 zZ$%Zim_3};5C^H2aSun}_0rP7hix&#YeDyyddbKsol);@9{kdB0P#Y{gnaK@a6}E$^>yucpVbX0nVCBnxJHYZXz}II z=H}eiUs(Hn@0%7-QbVj%>eOF|Hh$^(rG ze9t$4F56KmcHsE~WnMOlz*)-oMf8wS0!P8+$G0q&LQ63?R#auLncb824U`>33Us

aYzo2-)%J$%&oQtK7K%}Q!^UA6+aKS1|rWJH78GP<(EldI$V zpOyGon-TFD^!=^dA1v7-b*{F|NQMRlC&d`&%!#Ctydm?!3a(StvXy6M#nC!y1>NBO zohHyVk(L>V<_z(@P=hBPh%jzO4NQmspyw|x`aKd(&!8WAp8)Zh;u48|32o^F>y3E{ zB@?`BG}m)S&y}`1deg>7Al_!s^}i6?*`%<*G5@*ZaBpCb)rPVuOP{4%{VWp1m5CMgU_aRk zx{}_B$wS8k(83i_U#;Y4xsZ<6Q<+m7t_$_QO;u1s4)a(^Z^u={_%#qYUF}TDiF{pM zT+EfQR5I_9QnD!u5CYRF#QO%6^!1*5DKbZ3!KEdD&RVLJLvA4nBLn}CRF~KgPNuDw#n`& z(qSdD4OXfPI-P?seJzy}x=TcRsi!)!m`DC`ky2DK;`}|mNHeNY(|1<-F+T7+pAOJP z^n+n5`&QkB#9*Xd^ol;G&$OrtcDY|HBw`dyR)3?X@5ai#y zmgh&aKSRrL(bs-^&F6F>sv#u>ITCexFCmvif#b6-&`p-N9c+-F^GFmSq((>@*b#3h z(GluZ5N&}ODEGUVMD~jwcnPhnEjh=-pomztqg=ai^YxY$T}xOvUHs-H(r+N%ZqS8P zJYM4e>O8%>7c_3n$eSdx?kqQd8rxm)Wg%GI4|r6-PLMG*z>Q6d7}~u%}Pnq+%pdbNg4h@6Lk=d-hG56HVHXz9tBXI z329lkxf%^O=U}ZbnYvgSB^aEW=Tdwj`3S^20J@)hXqhV4oGXjjc*pJ8Lyi@ZE-L6( zIGy(Q;Oa9c>G_%GFwhRp+8>5huqUM(< z4zWYNaajf2A<&IbBP?)y_m0--gv$1-C=88q!((sOvLq6$USE-G*!?uI%A0b!5XC+& z)#xQnVJ!~BDV)3Nd-MuLF@0B2IObiz9R^)(s2SM=-qv`izDdqwZ^QvOeyd&DC{_3g zIiEl0%}|cq%4xC0A*_m$cVNwzdk@(KjAK2{^vXqK5j6FBu>>mu?g;2I_3#RB2nxIl zkz5lveuq+MWGSM-CxpHT^H{(zP4tmtd9fYs#ax) zOl-%8RHhjb$y?(Px1KcoM`n#Sz#RkK_BbAT`^0sq)(Y7y-!@C*o)tT#)%u5pS8#Y$0g&STUus%6{YRY59P}# z@EKqKRo%O3U%d?)rJ59E5)_Y(o~(AaBU+t;wWz(ITo{Mj3vQ|Ua%5u9>H~6`O%$0K zPaxh2(AAwEbBU-AX%EHb4GQcg$Yi4+uY|!ahht^>AZ89(DTDg0s@am2#sgQK`-5G2 z>Tq3}wpO^+)}*dEp+ahfizeVsg0Ah}*U7^TiCzKLjr(|FxX&wdB}x1;Q3H>N>Qcql zWyGRC4iI$4k-yH5;v>18y2*~CU@7XRolnvQcci<*>5~KQ6zI|#_A`FHA^4^A;}LcG z=2EIekMRcTIpPJ|x6YcZySt_xnnHPK&mWcws_7cza;~)qJh=VQ?ygt)#K!bNWfNe2 zr$JY0Uj0qV3^bShi?Y`$gnh<}S;9jMN*Hgo5Q!|5H|GM-M?4#xU}2$2+0&8^Fnl## zt~pdnaWpDR#pC+JV^TbTcxOPjk1>3ceiini8&1T5+Tz8*%AZQ2F#TJf4!GyC)V*56 zXQhhJth_?%4(r^;iiYx92f`_KasFsVO~D#HiTU9RfIADi+|Rxd|B7B(IpB>tN}lGV z>?5vKKCg``ecxuob+_-tdp(!nQXtYrdP4pkc9;BQ8voO+5r8`f zy5+{`JsY|#a~|7W7l$72a4-d5%On{3)M@7Va#)t_4anWRy=;~q>&uM&ATU8kSrT6r zJl2wEC)nB4$i^k?2gW-Ox&as?FLTi41q2SpMmYO_neL3_k)C?Cc2yhgIO_6yGd}-d zGGp^>;Dqy~&@amE-L_ft2bsiquOX9}2y?sP?mZyh1<-}5WS7#AQ?ogWYoc7Ht<^0h zzb>X}b1KGr{yb7FxaRAO*LUb!>f6$1RgtUEJuIr)R#}+lMxKRYZ`zRF^sbo#?jq<4 zx=1jj=_hA&6XCD?hSV0MAkcz;mh0A3spo55vb#3k9g?Ck$xgb$*azICMOp->1 zDp*GbM`0}X{UtF4;4Xn~xXYJ?x5hd%2E|JzXz%wvU)Yrp=@GP^+#u4>eX4VGEYlpM zvXs=8)Kb)z*eJ8J%Vj_fz13M*U>7k!0o&kCINRDbTc_p z*~L z6rf9g@El==A3ltl--uR8Iltycihi@FTo(_xtDsvL?$LzrTDcHPd>L5j)|1lysrkWn zI`f5P@o4nX10#z1zq8fB5x8aW#`LSX)I16G}Gc3C#ASX~5P~UsD z7(Qdix|RUz1nZzXRPI_#&MU3D5K1XvVPr!6X-MmbR*f|3Cqk7)UrTf=r?-o08qrXx zwwaUl%vT=U-zGMmr_?OK^1k-h)QiS?`Y!3I9`y@!g)pIbdT#@dPAn3Uv$R-G_!t4eDxVtXqn9*;XSJ5RyXoW1X^7Gy_C!98R>Gj2x0~$Sf||pUEBTU zMda9}l5(~h5%P8X9Cp&+FF|s*o{YCiRuQfoUpumTmRF8g6jS-!Mbg9vd@=$#iaf0j zrn%q4z-dCf<^}S*3A$nSQw+!xSt*SsF7drlzLH*Q1bbU4aE#a=>l2L$r&yZPFlcgl zgP6R|jZ=xt75LwJM*8A6M=`(Cm&k_mCI$CZY=Q1!W%L03rGR?!WxvcM6BWZE?u@k1 z0Sk$$Lbdihm#T(NkbElft5iR}9+%6Yxieh4;`8r4$+RP%i|K->u9v`h%QomX1v$%b z%l|fdKjZ$|r&0XYE?WfjsPhZdXk^NgThnl-zMGj4wgPzO~D--JzOOF~!$6gPTG$7lK6nivD&V zUJ?G_ABqW4!##D1w03Tz4zDhYTgiSM>Glpa zh4sZ5Op_A8-3Q%tEjKxQEtOu3NEGU0Ll^@1+ze*3MOn1px$~y@i3G5{=~xL@dZ*)2 zzt3WSzCas@rFLf{8&}eA{jOp->_jLAxCfwH@l4>SLJXN*`Zi(1NtAQ*3+^wfGM3BJ zFp3^ftsS@=A46~8dIau9s_kl<(u-w3QxVi^UGOy=)Vo(Eb{GxK0PZ2^%FXqhb=SI% z{0t|vi<6%GAWL0I=O6ZR^$^2CLk?aCR^8>x!P(Cluk8z&wGM|+J_6&$hkX{KYPp?@ z17w)f5x_kH-R6=yxRTSPh)#a95Ng`XKFi~f;UlRw>~9!bktyDE^L7oHV^_?Fr4~aR z@83|H_h{L1Iwgu3a1Zw9GBDxZ%meN*=x%C0>x*{Tu5pj%QjsLi%5Q zyC2*Sa|*h`qS8Dm-%Hb5dC@O|XAOsE(4o|BR_(RPQ|FID9iS5#Day^G@aXruZtE8z z8eLW<*=e{X=|=1nrd}l$Uc9>k@^A*a76d<)zPYr-60F(7N^Sx;O`6{7<)cu!u2FfiK}78WYhtWZQJ_lIOt%6uDzQn-VNaVGwCnEid4$-2uH(Tv zc>n$e-E9eSF|OxY4?B{5aND7py)vl5R|Y(6xaZO0pI!}dF?4$g)XOUy+AS5}Y4jfUeF+t+(F1S{($+nhnn~yJ!+W8aBnB0Wp(;%>BE2 ze^fq~piBSVGpK0$T%NM{U*z~+`)CSOVC{?Q(2zC+JpUA(~lFU zfxIV_5{ac?ds4HCMy$_#nQG+}n=~$liL?wuf$IKINDGJOY;~U^zwSoYd5?;I#)#4hc|6$l0b?ltH(ZQ^}{Yetucq~kdH#&=@TGvBRxEbC(Gz(fF*%CRrW z^m;ab?t3Jy!|b2@T>E*Vsslc>4jSrzv z6ULcDz(G9gyg2Ia}XkkQMLa)oJuxu_0qwJeIc+LX8-)=z{ zAJs?Yg^be3_7w`3PSI!msAaZi2|B`Sw$gf=4f+olwasHauqU~*ertcWgJ1VUzYv?G z31`N(-mXm`tiaa>zdN`C-4Ct0P+dp*j4`Ba2s6qeh>(m&zSw&;I6;vgai;w9n`$>( z4MN;_iby0Hu1z=TPTvTq*Al<)f*M`QKE!T(Z4Bh$9(0k8oIWmj4$OJ6aeWOU4^1qw zZ86LGB+oc5|0-J7dZrNOGL5@eIvj#^p}5T}9L>%$SJvC+@IJdwfjN!wCQAlzA3%5J z7GiagZV-dTQ4C`@Sk=cmw(1ceNjoVe0xG=@C-42ht&)kIdJ zQ`f8ttDNRVS}XV*KZ35osb8n{;dgkSPwI5|&t^WUcX`=m1R}ko+U*Pz5yn+hvovxt zUwd$3S_;Ds?|!JP?q+Ks$eT_nPU?*no6`d8_7Hz!|JPt9IG_%^-vqcRuPYlR2obBv z_*F;SPL`aSv$Dly6ApVbe4)psonN?gWV{S#mN6v?Hn~}|F-cx2kN@a2ljQ<_Hv5uq$gof%`Jr&m_GW3{~X8Wwa`=jDQ3GgtyXwM zmt$#fjbD&J`+D-AJ1<*n8ZRw;C!AaSCAB%NCJ%7kph5Q&G(uK`+KHY~e74==I;?!v zUV2c6;sowuX{apiUBC6|APJ&VUH+dPQxeDqZ!W5xcuCo7(9vJrDD9`0O!0vGjsCuq z{xuld?@NoPi3kn1$K5$zuMv|`>)%?yLm67KJH~(V)grhf9}MKi%+F(!N4UK6Hn~-J zhW*vgk*of``?YfhN-qpC5HBp~3OXd(%#|4vzUi^V6NYG?e9ilzV#0EM595``i7%p~ z@lMu3_^(&#)$#M0Q&DOd-Af|A&`Q+UQaU6mVIdzb5&`$`*z#Y4(X>QpLMLY3f!fJI z?kQ&AfBme|Wj|=fUX5^SQB_ewi|t&qW?F*Cyp<3qXN87uPIa(3AvBXw4PN@056BNM(0Gx&eq+lU#i%J4D#k;LX+irAZDa0Tp0t|M}0qNm5Rs__^-iGN**}a z4uxvJl_&c)yvc>>(vGSQlTVa*a*NOc7g^=Ns~kbBuw*m^aW_i&{yI)j!#2o_j)4(M zH=IC@oQH0tXkU-NVdZfn=KZMC`BF>Odtw^aF5D!6FxM@kxE zl<&jTeYnjoNg^JiacJ~9en<7W9ktDm0xlZp=I?UjZb`^$)zEie!B$%&XIe>IwI}`h zlygXmwpujIe;Y5Pe?L1bb`WZZ8urEYEqfqs1T}YHbCywcz?@)A4&eS>8~E2?_M&cs zc;dFm=%xkmaP4vBU=V=VBM)iA5dO6xAQbDCR2UX6Uf;?9Ii< zXJe{+wXt^mr(!usbfi~X>9}NyJZosyk$ibx#7e;-cup5?dS%S0k_EVb=l1^^jH=jl z-dMy+&N8(D>%01>I(?lfp>OWU>__$YR>O`D(>G|lmAHlK0^tPyRr3(=q3f?!MDOwX~|dWoI;iFoX~0157QRYVQEx{#{f5*I@R# zOfbgk2}>ILW7G1hO;59$g$2|P*uNt##FvraQN`@eK_)DVZ?Z)MybP~9TYr}3Sz}A- zk`yba=rZPvGgS+?f9K%;8VnncZG77qLdd$JgIukZ$4~1>l|BWJ7(127-&Pace#SE*|J^ zZH*j1qTq}+LsRjizi69Jz{ffHUH}_C9G%**A>M59jJcnV&9@A$5Y`6khZ)KhfA`kf zHyF&Fx>lBD8#*{}zXm?&E`)YUuCA0#MG5x%nN<;upsY4h1)NMwG}1+5w4xTVV#2Gg zKhA$6U&E!Vw|(ZWbFQ#Jv?3Gtz%Wt}Uq{CI_uc+)|KtnM4Iq~>ayKrFf|Rq6a(i=K zEaL`aUC(!1GtwkEHqQQ-*X*XAp#v#Xl73`g<}^#7MfY_|J)9+^Ud$#cQdh~Z25<>L zcZ3A*QN%lXYm-KVfs8*+Y3Dds!A=DyK#p9V*uJDOcDCmVrHta9S@NSl6Y^)eHY%Du zZc5_*m+gLpN_9%i0f75AC;uAECf=#i)c}T<_rqJt)$TIpzB4+6L0W(FlJz?$j!R!m ziuPyz-waC!o3dXboW=dFRP069O^qDzbr_}JQ0%o*2V5f1HP+DjOdiReZF5_Izbkfq zRd2T%yh&DDs&cs3o8XwZ=FkXJu6q$#ZM)V(d?SsBj}y5$l}-tLGOo<;fK46zbUy7< zz3=ZB0UH$>9lq?P=r7@4H356;m)`8rUl2jOWOJDl11&R2*w~!-_ zO&P991@7cr?`tgrYl<|ognt6KUii1x^RK~>g*V_7GF5Y%#_>k{daoo#2DwpOew2tk zSD!eENv2fwN#t{~JJep+P{K)Ki=ej6t3i&kNqU66i4X*$G=3zoPW!hH`qyAs*ycN) zf1ab7`_3|=`}`Xc*XMv5y5Xju+LaaUkz?nAs5idf1L$h=bJSWfF~ekGNlDP?Manyg z4el^)f=cW&|5*R-GcwTSS<^f`?hVRO7Na@DtVZC6Mi7cfXYHvIS#7?b#EugB{YJ#X z>vpB3zPaSun?xCZgp}?5yKU7zMq;HgwsR72yh9GUf#Zs&YU9v?Gg$FD!oKC@G_O;Y z?!@UfaaqV>=RJtk;_OFg!e6;rSt}4R9oy2LQ*hB#(^M@-!t;yEH_GF%0P+4^8~E2? zgsxxS^}C}q_bIa1HhzZfRLkO*9}+QX;5)-&B5wUbYIP|m9Ck7PlQ(Usgk)z*zyfVH z2KO=f{nlYL9m4DIN5Fjvx=NzDB!0p?B)nOPwk$r%+s{mDA+r2<$|xcyj-ecXxz~9w zUo};nOolqR(&N_miTg0O7N0};_jYu@4LUhH@dI2+&@~8C-(NbhUBf7zE!eN+Za1IZd_4kME)PX3$oVAVMh$2u4hQBM}X8tzbJ`A{2pzC${ zfII`6v$rqs{Ffk3_1hROq++oSk)-^Afws2r;(4oGqzE)W6WVkhXnhrfXl~)i8u!IC z?=Cg96B=6uv{!)p_wRoVCI?x&a+4KXVG%!hOQPU*(d_k%pBH8CJj0Fs9ZRaV39NDJ zy_c*}p&VcL()8T0?7FxU!Ydl?$1DO#$tC{NV!)*aU0K{bazpjerVp$6!pLN-Ha9Bl zuv*rL!UJPdgDHGPx>OfA!`Y9Ry_4&i0Zb3jUa|_~SPTD0)m=ta)pZR6CXRGBNT+lu z9fEWt-Q9?ED-F`!-HmihcQ?}AC9UM^xqTSl{^sC^zpgRIIxFYe?w!1FO}gveZyyru z0C2&z_Ll&$Yehv3dX_`A*RWhM{QOjkfy$IrK=7G?ixBJd;~qj>sysF4;Lbahv7Pn2 zKcfN+&lFXJU*%4xm>O$*(<-6G0WKZTO+H;M@INop$i8GFnHi+nnlmF!Ug2+fHY-z<{!vX2YV2nSrjWPH7LNO`LEd(OW~5%8P@;5d+KcZr^byRIK+XWX;E#!o9j8=O&AOd|9kj zEb5Yqrg~TXv`kZ)l`IRNe_6N#To#}k%2?2D?bv2EmE~t`l!la#Y$HBM>{@_iGhm}z zH}5>a_x+S(mW4}Gdf@$Uo9i1GSWxP7YBgo(ej}VCe~TP=EWFIWtU&jEE%l~MJbkKk zg<6ADNv~ini(4_Bz~Rinb3^8jzoB(`Wn^w|Elzfx6YoG2jGD~&i zbUxm}Ow&x_@_P?zI~#49h=&R<8+k5hr?*tbAeS$#;5 zdf)fhYwrpVpRREXvc2C?yC=wL=QESMwu`-m|_0NHBig(3|DycJ3(Q;#IW*B5Il? ztQxZ5AxRlE1YT%E=x=?jn^LPoxP8NbGryT7m!)Vg=|{|%C*M7O#P%H_A%M#XbieX4 zdR$o&4vl*lCxkBK8rzEZ;i$KK8YC`_@w@wNDXfDla^Kn8#E5M|xW{3v)cT1cAGm=odkjJ~nWW*t$NNr##Qvud zgv^~m>bcuBE%9Dd-1VN!ieOFJR!*Je2gy`^m@4%K{pptXWFJc&-a0A z5ibGa3ktJ#4{Pw=Q+OPKJ~wd?>WTk0qK$CetyxKxNPRODePP*<*sUJQD$~G7s|6|8 zzy?ENhd`g1>po@*)y@q(4}ohDF9E9f_zX?-?xXJ9^wjY?7$Ghl zv)ID!9<;iHCd*FVKQ%jgh(b&``j(wECtFBuPi4WDD{F%2!y_6=(Xs&S55+5#N z;i@@sVQ($xVs!A-aYV>hXw7h;&w%&n0zkLR_L_vsGA|x(X)nZVuV_|=G~izTh&~`- z-Lm*BRh^CzhNYffm8Nb}f)SHpg@Q}%k%&RGPJ*$8)#%UgL1ii+UqPTNEX4Mae4{c2 zKf0v=KiRrVpA5RvM@cr}yTE1ZSB&z3Oq-#~c*krNSDu~6v!^BQlTRz9)CCxgVS#V1 z&72+90q%RCOEd74p6Tmk@y+!kjJA*#*1bh=U>a7(i*CMNjK5?*xPT z=+9;c5!LTUol**&nx9Wq49cIU+5j$i?7al2B9_#Cz#~_v0`48|oBLng2Nev+7Dx#J z6)Ej-WGDGh>fd81@FjVfrWLxj~Q09P33svw8GI+!k1 zn==u5M2Z!wXWFKF@^?i{`tE|*jg8|UTK6e$QI{C*b9_BQ_G}6D?}wpOeM8G{KNdcB z2Alra*#x*BfbM+)TW}YFIgFH2SL3oj`8kXIp@F+E+20qj-E*!cZ&x-H2k$QS(YmjG!FyB=mZ z#e60u5mQdyvZ{|$PhLNZW}0eWCns zTJeVOw>C$PS;vOyoM?nG-MYk;vqP8Q8p+Fe1MdM}0;E~n#E#-rX?ak>ZLqQ`=y^ku8_1%uFiaJR;9B>><0A0sZ zGFu%Ie8EpGN?SAhk*!we;Tw6@Owss#wg-s38>~<0EBb#on8^}E3uUUUfg;76v5lJR zbBd5N`R=yg4Q2rON&?;2rlwOSmzji*$4Q#zd**1L(o_%4)|199m>_JI7RE5kGVFdB zD7l|&uVu^dIQbt_VBJ~WQfDb5Z&iD1VlRT{+?RHc0=kGEUTr>zy>M4<`34p0?B)kk z5H)(|HEE*Ne|pxembQ(Z`+9k-MiZS>0<}e8Yo_o=jTFt5suE2EP z>pQrR#@^warU_&Cc|a& zeLd^NJv(s}H{e+dIlB*fGvGJM&;i^Is`A^lG;!Ld@Mu-k=tRGzmNg`o{<_B}{Y@C%R%Xdxbk;X6Y z#T*MC*5I`ur+vph%HadrK_2M#INk{QH@U4Rp)rKK{cW|;*TcM|eTm8`@qmu_^)`3O z-?^oamcyJ%0j4ju%w!NLPU4H!r*VfL8Qm+MqQ)q|bzTAJ*2*T)w?fCaYve)RrNoT~ z2RB#XuDs9xV3qPn0re^oiS&nRNF~kbn*wu6ld_~f2`@VZs7*IG2UKR-hWiwb!Ho+=!KwmPWp zg*7R+zIAdG7!YP{VBn~O&p_SU5wRLFyf7_JNukg{hq@nH@XSAf3Z!VoRS>%TcfKnhyjp<^74=DrZ z_yPg0GSI~nR~{Nt5`*P-fr4?Xqx|#O=`MYUZX#jW#RS240Nvl(Igs}nLPOM8b1NNj zYMds^q(Y&UCWVPD5^K*$P(BafssP=`52{GBZmJCA&l(orZzZ&2RYM`p3z1zYLX;E` zk$V&M_hqRmEHH(Bpe~Xvk0C3yZ2U&UgBRad_b&>flj1D_xT-)mEI0M%+q_8^y1k2? zCV1Tk0gUnJ-Mgu7K38eyXUzp-&swq5?_##bD;DZbD;}f`HN`}!@)4%m+LyET@{n#d z09Os@5*=$CyI1g^t>s`>%x2JZT=A_$j6=+WU)BcxGqh)XO zkt4gt&LmmBk2_gKpwxw{z<8?4)9{H1ZW$&w;QSWX1mCf|^al-~`x}Ejo$#Uv_h|_t zwztcF4PwjF%r{$+XC^O*Aep_Sdh?>p5*I>OLHnDF8EZ6m!CvAelEv=yv2Smgy>InQ zI>6Ngx=z6x#6&dIek2)U*83I({u(q8##YSSV=c+cS6xqNX<}`y?j$XLUp#lHnpMHy zJ@ovziqgC#jGL{a{l(r5#s%PN0bP2M>+Z3V$3rQ5E8Vl0(K0E_JC%n#0?oGd*RAo< zIwkicf)o{#Up+j2o~2t%lE7ZMy#Eg4D>KnO;wmWFB{d6h!8O~L0F@Kex_0j4rwu8<>x6{RmY{ItM$nBJ=HSEV z>u_cAIxaR8A!*IV?6#k>)|m#lxHg0E`FPx5fke3i{R0MgP zLn9gUuMvuN(Np_s4oplX9xsWw#!Ng~RiR#fn0h&}d)otm3!d9v0u=Um zZs0nv4|Jckw&a36CEd=Ca4V67Go?i|pZ_fT`7BLvB!@y}o-D3=4kKX6DE!vgLz_oF z*c*5Es*4KSU_^kCW+X-yl>^pO4S+7%Mk}rD1SdQ^X%p)c^m11FeXCbCHvy!15sb%a z!il0xD>eLA17}CmGjE=KReL^0x#wu!*5t-XV}0d$L0K87|2HlSf$qmWXEKZBB-p_p zH~~hyf4FRSLN~N{`3#jsh#1JD-n3?qucA_r2``f^lT<;oL(%-2K0%dhQBatRM+&G$O>C$D%$t|csD`4-uly%$tQ)}G}J zPRWI`&*nimsi&Tbn-7hh>2Ixm2e@WHH~AGazFdlevOw9=G$|~8lR>onT(egJz297a zjW6{Zy&z*Ugu7&+Hd}lHa5*ZWX3i84HLd`<2_;OXm5t$R$MJ7=Z zzrX=p3!q!(o`XZAn~)WCZ8S{E3^$3o{tWkrMlCFsjvTeH=skie;p40Nk1Z9&8_5O3 zJ1TfraZvVUENx0DQb*ad0#8teS)H}vmzr@PJ zTG@dJmLpLIuOufydYvIF5Ouy;F`;4tQZ8Z7AncM1ca7=8?<_#RRzNq=-<}v`iMNWk zb|y)rIa+j9&M7s!J<@Wx)AZyKv0koq_`v>NN`EfQ<^9s_S1xqj_GE*gNfDO zkKBRJm@nhP8t77pLaJSljjL>vM)xSN<3qM~$zcnUbet#C>^hnu2sjzEnCRh@+-~wb zp0y1O=KXBPTXizGRQ{Ha#tY^6Bz6dJKLOpTH>IZOr^;Nj1Zx&sbFr31+n4@FzKY0b zyd_^2G(KqVBTgj5{o#SSeL$03c-KKE5d16Z)1Us}+iuir8D|JLfNKMEg+9BbjYQ zFKJO+VQp4i5C*=Og~VRLYzIUB@4LVM_Uqu9;!A+ixemW{h+@!5IoW>S@Saeo*|n{g zN*y(E)S-n6QEI2_#aCSx&wW;gAlkMWy_Z({-a{8G%ZOe0VgF+z$CNFwPHP8r+i%4G zey?$D!LN|i99sh<+wavlZ&z+?<>x$b`We~h9{Py< ziN_suNo5-fJO|hVUDV@kZnRYB`RlsbXnGM%c%nXmCr8^6?e7A(7jn|FRM0crEL%+> zlwt}T2Lp9j+gfmp79vHn*rFmnKTKQ$z;pRaKXU-Ooks2pzL@B_#S#^s>tbqDh5a*- z#k@T#-jaGTJ4-T$<9a~@p2zPi$wVgKt;%xDn~Y|qu_xfJeE_VR z;Jw;QfLMa1efwn!Dm%5A8w0!7M@{~|@8SoX96OK1b4$^aSQQ_`|tgU9I%?GHYKN-bG$&0~P=gf{R=7QqlOry7{9F;h1&`^M0QEW`DnPSW zEd70lGX7R1^C$Ow#fk;ykt=q{gCqNTQeWt$^;N;71TulFSqhIpWR;$W!+seJXVQ@y zU7D*}<$wE~|Gobg=$;Y}F1l0NO|SA#RY$L})QzK+6w~#D%#7E-MizvBA0c>!E%-3i zt?FPT>>kBicv#PK0zZF}Uwg`x#a0FafzR-N|KPyC8@Oih5}-jTP@CNq7H;OlT<6?r z`m%%AP>VO6gU5RFIOMMhW`~A_lkMg0Os1N3iR7%$4ufSls-6$!hc@{BkeZ9m7C-;F zP-uTaPoSF^@b(R>?Fj!}WYvmihL_x}{|B`hIabm4PnP6s`Y>7gEsCvA?^8-+^QM!D zc36MlcJ0(Xj%0^ou_GUGe02Ob-u``a{R_|?yFP;y3Pk_bT=z{I#q_aDDJ@#{6!r9S z)p{U}G8Tf|6&YbgqGnWaeZUrkvo_6Hn%iA+7^-=CkaqIeM1el~FW>*Zcl#CSBHG2! zT{1fFiNmdmJL@A!;-D`|lKD($4xX}16JCTc?YPxhZ8rM)8u7&A#UR+5Eg`Fo*K3T} zS1>i6@0Hia{^$Pto|+fX{i$4rITy9R+;o4%Sp%ZM1?U;vv5KF|IUT~zE9>2bnyd+Yoh6EUJ2@sE#kY^ zI5=84N(?z$LRBDbP+12sOa1ZuapVV{CgXqk z{x|3#e1PtXodi;T76R_JDB8|y6JwQ+7svQ*^DbmfM#Hf@i6 z+iK?DfU{VTg%L|9(MIO-f@7cz5ewPn) z1olzn>aL~@KSKRoKL_vkv;INiBp)nN+w`kB(k~8(m_xP<&PHh-nQ_ggL411{MRoa+ z6t?|d zou?ZL$UOVj_thKy)^PlxG20xB;xKi;!` ztm1k0wZVt~x-OjeUoaTxaz?6cepFj(&%faqrlm_hs1A>O%S@E_KOn>o%-)YYeBQtOYyJI$BmL`!16|i4 zsdya>ISkXJByu&1FX8Ni3kvcjdv|nedr%=fD3Bdls~+^a8oqcz=EH|!3>i;5TzaVu z1{9>q81I5ShRXlv{$(K|fG+)bw?Cn_3Ou{P80SEIxAdDG?2QRZyrPbDCgrx+oF7~G zuv2&rvQ)iQ?`pnXJQ-hFS{as&x4^R#uME!e8-mZ6fB*jbK4c`&o$0rw$c>QepZIdX zSJ_HB#GVLsR!N7^lbstX$FUh9=f7YSZW#S&B3r;Q^EE!*XY-i;?ud?HM-N-@6WiqX z*Zo9~&9Tq+f4Ti? z45K;hJ@Obw?h=gejAy2Lg22UR`(Hc!w+=-E-D*#2P(d13cCFUC1$w78=l{&Qkon8$-+*0g^T28e0*z%@xo2=D*g7@%9m zKU9@i$|7#5-abN{W!;I-~0K01ov4m2i`x#0bPFLTjBS`^eGNUyH&xzAg|s&H>K}kbl4C4$e0L=-wpUmEraMV3iH2ug9v! zDdHAvD*V0JQ_UbxG1oLxaD2?gVtK4}(BX{Vi#pKo{Q3`c%q$K`31q0Y*LNzmxTLRDZt>N&LFV2dnX!}Nz7j6p+xr3xZpZq7u_C%%}4 z9A2i=#x2v?F%eRFjsZ#c$^Dlv#DCvoO#-?u>zjr2{bGmyu44`;^h0VND|Ee7-LUW4 z@=8d#Sja9X8lX`(IsB>+q0Uuvj|CRUFs@Q9{hrVz$NxougM%J8*p)=#{0Gv=s6f}#Oi9SV9A zeD^Da{z}6y$w6A+v+Li#|MsaVK(`hbw{R-F0DqK3Trcn$!BET~d^~8y))+TxsD1?A zM#Y0p`4KI=Eqt911;VIsg-=~NDM7awcL$^HeI`btedT}dzjZSe=&omc6BVqRNMEG< zvNO-n>Gh3fm@KSsu$1*i2LnQBdd3q2o}{+>w-Y+^ z$p88;960GTplh?-)A#D@lM)OPN8PP=nj(DDstfDrx|Mn&jqSQ!BU7OxK0=?}3Rd#N zq5d}?R>bNMtkhT3R~lqe8RCW~Z^3uF;C=>n(}8X>;TB^ddcEF>hAc*_AeDm5>m%*R z>!GOJ;(g@UXWm}p&cZ1p7}r7T`c1LI3synWPW1fXWwDj??(heO$9Zs@LPGpoJTri9 z!y39(iS2@_Utq2(uTgQ3;rwU89;(6Nq?|rb8mQChnG)J_S-W7ajxSMIS-m1CDsYZ# zB1W=QZ?pgAEtcK$f37!JhR6iEs2h-6(esXT+6-|*G3dx|KjTC&=J|}jH=D{4_#xSp zbj-0FG}c1GNbqxNfrG@f21*kWZL>*} zw-C>4yLM%neI1Q<%2BpF*m3T^L+e+S-dbOeYr8I8=EH$O6ZlyAobwh(gXWkn^zvZ9 z0pMl>-GaSrXlI0&ll|)49ggEZWTC@zOIzJTWj_`7cP=Vxoo&ADSy6 z1HRLIsS|+j%w7Ui^|~%55#^Tr#0X8Qt#I0%L~1meh1W55@Qb+oDU>;1*S@;uafIHQ#>!!ucTL6meS!DTM|@7(flToeOc z^u@6RuI&OzI#c(9VsX@5LD^PM8@YFk62Tk$M$Btlgv0yfMrNSJ=#86ZO*>rtg)Iz3 z-29t&c^ZyeOs3p>fP71U?llW?VRmHJu=*(Mr@dejXbS3ay`st{HD_dhj%KVgzN5N7 zN=(gNPwMn!H!&VN6_f4!c!h-WE$7i2|U>y`J=F=T=szV>x1^z z$TzE1jdwm#PFzgxL64s?<`SbsN_lere0e4F#od-*##V2a!5G(`cuGdt4FXuN2A^SG z0>t0>_4i1gukqG0IU6_35cKa4BkSZv;k$u{$Xfx?2q6+RTBKP#Sev2t>#3HOf)}ga zGY5ZWrEJh%i#0SP)!qT}1@F~f0+h#AO|V?nkC`@TAcz`mFS6bq=(nO3l7@VY7=USOB&FazU98eK#NF@a4mB_B{_h<7?{}*JxWmzZbqi}=epM%v=@Fo+nUbiusJAX6mJ6(HY? z1m9V_j5lzbyadQH7B!Q63(~86*st_miO0}EwK6mnJ+Xv_Y-J+fjFYe26)MSGrs)$> zCGL6HLR7E)Th#BwUs%T->EWxYgQll;OU~sx=MTsE%M|{zT@F&CnvhJF3g=0M+a;J|->;DXnVmjM0#O@4RDq_6-#AY;h#+KpV%oSnSzd)fv~07IdGr~1AS zZrmHPm~B2`~AAYcekZn&NCLx(GrWBKvWr1SiFbP}6tN!4CP2dZesM zj2c6N8{=Rj*o8_mwJt>;MFc(z`WC8lK>&n)TmYRApwfp6ynkx~y3?4=$w3~JL`m)= zALx=bzYth|J05SCbzGR2hpYcNj|0QEbF)5k!I@5%E~5{3i;?X|Mi<5OifbYpM;J=< z|NH+J;5F$bKtd{ShwY0xU)S3<&iCFH$mE*)S1>!uuvro?j49HH^MkgrMn&T=YC33g zEQ-o3;@Kg}pRcpL1Zy zuF`nZ#WrcP6szStt{cyUJ{;)bsCm|?!_DfaXAxpY`TG>Etv$&1F#z0Fp!<*!Vt|@b zl-tx;IjuCI_LcIzXZr5@g@9c+7YZ8J;)H~+MaM{{aOSX$J&=)UX|^z51Bf-wgl~i- zEK6IIAcq0&51{)?2ZbWhLfxC2)S&6D6Y0&cCMwdi@q6Gl4X$`n!(x^Iw+-kTjQa?kVYCJG&sT5?9bb>-OeR-ymythJ z(dHezGp`YzQ@NCYt?5heHz8ZS*JA6F@OGok&yvkms0d5D-o!Ks6Tv_ZOIk_k_N82J8O-8P|R&t9VksDyQgVfPpY?bpL-H5I%8{BcK zKsX$X#maiZ$9Ct9BtOU?r-L2`?{QwnMJLdeB#KY-AyS?QwtlKU6;+~!9uB^>Iyb=D z3MUcT<1KQB<(7HQO3zK2v2=XPS>6~^yR)>Y?}yJ@Sy>^+FM$U>YrnW%K=+d!mmSHr zN|Ka`*JRi^Nt|$*+Dx&{uRhU+ZFn_vya0yZVj=>%v~dWC2@_`D1>*u zPBg{u;5WeS2D+?7T+P3prW;riAF@?3_t4;CvTn zJWavIy7ocZjAL@LpgT>zK{PhL>9+q3ah6JfNzt4?+SiT}Pue`=)eqG5D&RZ9mv$Hc zy48dp*~k!`2hXoCh+?>z$1_mVgy0?|erdn`W}3fUb=NvP0{G=GQ!54pU`^ z#1%Rg0u!A8|CRv)nT#zOL6*bkGFxSo+I8Lt?LH-5jnAdB`oCfItfWL1gaZ>Xu5|$U zg6FoE0MT8>tL-NnrA@+!j5R8(%B%4GkpHmLEsOqX;84Tp zx?VadV?)Q$xLc~T#(K(R7{L5a=9j>QD8NlW3i7kP+Y%%l+yl6yKzHIRS1VURX1eHP z7;`WA$5e4&q)jC;jqph#dl+I^CPCX^oe!BJZ?sL%uwLaZVtuPq-a*h8og)Z|3yXWD zC@lbR!DH_wKuiNCB_jcUR@w)YlFV1?|GryzhR!yo@ySmv@ba)+q1Yhja_(}DteAF< zZu)f$ynkJY_##re$Sk5uS!?ouHx9rBuXQg0lFNbWrXQq^vTfBzGUfVBV{xU|gH!lP z>qh6z$__`Dpl(DPzhEtb6gM(O8|EQ=w9Qs?>I)2%-4Vk?Xo3 zFn>3`XA$5|0^M;B$udNasL*#%IdH=z4#fJfaXJPXs1Z&Pf`QKoy(fSEe#wTmFPHht zrh??HXG;>McgF{6(`P=euK?{ZT>E zxzO&sPOAwtvoj(RN`f%R;n_Y5t+ zefV}X(Y0u5D2S25kO<%SVUEN&iyI;%UZApJ`kZngdvuwBxM@zUhGm5FV%!_yz zuLU$(8{FpQf$cjFbk*+#KGm}9WaZuy=bKL^FnsydMs|`#|19WLREwv@gQ5R=s62lH zDW0W@X$eyuWtc=M`>{%xxWjCceQNj975ZQ6Wq$Yxbg>vr-qeW2I5vIyew|>c9>R__ z`X!?VyQvo;SBsFt)lN^^2*W9RmUPlIkVl|sMKvHvHpH^lDGHNwQGCMt2wW?AaTkDY zW(_7!`{jN2d%XwhK(wvU?uJjV$7S_qru@4sVvHj&r)b$Xq&;oEs7vALG0eqy@Dii> z`eGetAG;IrOP^WE09^1Gc?r-Gp1Qm=N$!{^TODex3u>3J}%+E_h781St2OXv*P@*C5`P=h)(o z^A+V%Z>(k0xbFrXuw>^O?eXs$7jh~YjDm=hQn6b36lp&%|548m;a^^xV&_(;kC^sL@dwv!~91YzSP=!y=P4lZ>366`Un za&4U-32b209C&gYc540#a94n?rG2ZU#oszOu2W9dc#>qRX-lFkU2 z039cfFKZ$nA1Bt-?YmaG?RHYkZDDK6*zQPC`ZzZ5p7-TFWHQRnOAdt1jQ+_uhcw{4_{&19D$X7``=qeT+Ton*F7d2)J zaKUZ;5}+RmhPjcH$6JnHlpEkBURlltWfd$jvbC2B9E`=d!tl6JbK|>}qJORZ(bb`Y z6jN^-)6Y7HYqC5pNp}s~*9bfxuLE6~k|zf5`Nd>NDm&@1w8$a#Oa1bZdJ7ZQ4=BiQ z;mO3i30y#uB|f*}T36m!4gwIyP@+z2ShwuOH_LTfne^bj(@Q&S0Nrpdx$!%dBp9rE zseLuuKMtA<*tSUR^R+|Keq4bz@ax34ddH|)=9tF0V=GrfJ0~5xSgDi|{(WT+*Y-iO zIp8z=i@OPQdlr5R6jLmwM*9~^$$e&=_33&*qv+4_??hM2m{}BkKA$friLNMW(qyXt z9OW#GA*X!rVLfvqhwrQ~Otli`0C2Z}uC&bR0*M&O-szU&`_qJ}qS*+W$nA01hqARN zQVZ4RP~k&wD4uc1``wK@W-T=evkn@jn7-bw4pWapMNWavxd#NqxuTZjek zMl(0WI;;Z9hzlENlriQ84T0x?U7#yUw0T=XW^AVW{DdQUwn9B3r&oGTj;a)5*dguO zh=KMVmjoj(pB`DMh_H+p3RyQSD&iwPa-owzTmyjOMoIL`pThpA0?JS8Cm_uIwMbL_ppvbrxw>P)A(ksRqN{M$5nxYYOo`5pk>w9oFZor(_%*`S~-@k=SVIG!wq29AqA2~gUN zILxO#j(Uf;+QdPNJ-Otl9^yN%*+aTnz6nY?IWL5ym5y1t0l0@iS83%tHH3V0E0@WA zJ2_Q-HixvtkA;Hg3W^%Gg~L`FjI5IS04I4o1@kntzr_LSRrAkLNSfaqkVshB{oR$$ z!L^r{ad8B6+q%5V5y|asPNw+-o8h78=5zz|sn;}#@vyyUm5a)atIv~Vp`I@4Sq*-a zTzn*rqY5eey$ITeG{{Hnlo^WxkA)Za80gwX$d8!ODAb2s;8(!rcz1T zuP!=1I$KL=pRW}25F)@`#>9raIeioMM+wL7ldwRZKoK#Lz=509$$yla%vV2gbsz^Dp#lrzcD0-7a1hc-3@lUA~48j@E-Qnjtb2(#&gw1+>E@&?RsA%<=mi zQSwUzp_h?8?#O%_l9RWo@a5CPC*UHTZFd zEOP=uN3sC-3h18of`05?j^7PZV4Pvre?ne6BSS_fer{kR{vf_ueA3fG++m>a3x$MM zaXyUs&PeWXLiKC@xW)l`Gk?I_jR;eKdku8Wl%!WUuGyDiH|#JfNqb^?i)cAb6bpwO zLOx9x+lI>|nv-e#ndkH~D=i|fN%dfdHpG%*noYY9$bB}-#QPEiaKUrMOMsGcQg3yY zaJPJSQ;l}2J=B%uokDGhAK7FHr52|?hpvApZX$o(=+W~0kz(9T1corV#JR^2@k%i2 z^;4x(?TIeHy#>0v?6C{Yn35Vu=_tc;4eptbo-t(SDvM++CCawR}f{9Tjlfoz(Uijnd56GLb5;uE5zTms9mjFq8 zs*8^9Lv)&yr6Q{jT8JWCkcpMq*@Frd3Hj-VkW4jsaoLc+`4s&_Zdza=adeArsr+>? zx90QQiO#dW$0hJQ1ipiM3DDDR(piiaO9jRJo3kbv8`XiBCxYiqvg0e|>4O1G4?-PG z;fp7DZCf?izvEzV71GE&#jgW7C6*2<-Afq&h1a`CjqYEFyNnbW=tumwBt`=4)ww z9rJuz$&^9!Q6e=WK)#PamrOC61CF;9+C~96k*@ZxauZGfCdt$-wBOAOj>4P%!->xw zY>NUlLQy&36JJ*u01gc>d_Gzo4y>%c9xJ9y|k9tEF7J)Xt zM=A{c8nq=v97}s}AKv_WPTwd%8tJ}VH-{o0FD$Fj;u!H^+wy(|#fD^o7yMhj%)ie- zS1k5mvJ~^VG*j&JGeo>?zIw8?kszDI1TKcQ9Y{RMKj8UOILs1k(W?UHvxAfmb6ElK zPSzQ!YO#shY>u{=z`F8(4_ExJLxAR<)_g!lhxk(+nwB%twL|XDaI7p-b^AYw>x$in z-%TzgU1WW3IFwecr-5`V^DnxoxDR9FQ|^S#LNL3?+BXK|3kiN`$5>=ri7P+h8eRtjL%B>{A8@3tv~S<^16fltl?d?BE@@c^qANIkG%xwPYs}9 z#~|=o@TDD~fG(Faqt1Pkd3c$$;T$%FTLqL+ISMTzGx;2EDrG~x@a3ytF<*Z>O)CVb zVl~WD2S$9o!HbZM;p}qmP{AQJnFg-&&_LH(s^};eUAGse*I;(r?}}f-TMGdcUf-z9 zus+e)OG%*Ze-rCP(?!eL{Ao<|Vh_P>^l*=@Wmy_4Z zknxJ>re_Z{k}lbv}YhbiLJ7`AtMzJRX{ezi(Ww6cY``^{Nnl`mp#r6Oq&gL7QH z4=isfzc+)!I^z?ZRL~ZGO<1 zt`0eN5{P5uMrA0i*xM+>iQ4hY5e*mlrKf-4-`%&+(As!+2)=`T`Q2cFE+W^pMqYe= z3B@$b20PoXy1)-hcW3plz1kgLGL@?@Z$xo_?#EMNvzx#X#m|<*XFrXXJHz!zP$96l(O_ij87h-@orQ0U3g-eN7lE zx}#GMo%s9bn7rQHhU}RhGVLX%N8$opc%X}ON=CJG=|L;}1^VEcEFpN&p=_A9j%TMO zU+dg1MZ}Eq929OGW3lIjQ{Gm~Smx^afPNHUXcW=P6@d8(UktczA^=^C_JL5GKEd?{dHIyDV;>H-91Nj9zX}OTF!y+QGER zGF9Xrfq#D-2kFD*8~*iv=?*d<1>hn9UB~Y75i+7>2xT{NI4R2>Ir55O8sm9nTC07~ z(;;7$4m&^6x#o$(YDj^nmq$_ze8Sq{j73h*$uB*4?6#CU?R0ub}x>z^lP#a|3>{JtpO8tmIRd1esS_;$2Gqyz|!Sy9X4ECy5MjDYc)*ZQA5Na z{)W5#h2_5Ha*HVKv)Hm4+?bgxvy&a+YVNvX^I1zY32OKGKy^<52M*C&ZEklu3U$i3 z`86P4ETD^S?mwgKT{a>AF6!1exor@kyL3u*PqW(sP z{UQc>Gz}%WzEUxBnLBNJWD#70dg*7_K-bckU_#0{wMb+Un*D784$>bn*H_6X5VgrG1DmsFnpvoX3(H0=~pNG2(`|$xT4$xI8{*vNxLuM&$ zJ$>kKr|kYYA$!r5f%M(gCcX3^oem=IDWp~8_c_0QoWxt}dg}7S+9#d9rnQgT z8^3|~0k}XnY7CBIkRHx0E{I^Ko%LhE(xN6&>xAaLf{~xmfx4vbl0T@0BpLDy%tLTZ{iQ#=2D*pDwJH~!jaXPc?y&QPnbV#()Xa^y{VN#~!+$Ka>Qxgg{qW@#ju6M|vb| zux???LApaF zBovVbDFHzm0i_!h6r`jCK?G?Kd_E)m)|&sl&sq08>#TF{IrrJKd^z9!*|XpKGw+#i zOzc60t$tHesjsB6UVE1?{F~s~T%{}+H+uA~WhM=pO##U(u+M&*d^r4>7Yj3=ZPFVN@vSkb!iO7|L8 zj!&1w1~)DE`i4=0UoJXJe&#}KNq-!Ua<+nxyzIpl z&MP)LrK!8lsC?Pbx`!`oo_e##rbui0ri|$3tgLmeTN!R3$BXJauD{yWw+-~KaVqD8 zycn+Ve|FFG;`s``8vom)KA$rSH}IHTr{%*?y2sJFyBGejx3qn_WiH5pm-1Hm!WWK` z4}umaG|0|K?+WvnXgiQqHcXa0YTkWNcPqh8h;iikJB5rls!xAR$u%aE{JDYBJ%QF` zON&@fh%XhH$}JTzBJ?77ST8zQUaCP*lB3sHTV~t#c&7n%GpDVh<^9Jd` z&6%0A3;ZrTKgq1n$3rL4x_4qjqA7eE&YxioBF8asI7TO+yQ68!y-4Bj*F;C)GAJfg z>zeVi(oCW~{7j5ikfUAJ+29$^Nb*i864NMP2cmB|9&3xv<0f z`rngR`-r*uE*@=joV}4MZRBA>Kw|OcTj+>dYJttE@*N%GK$Pxjv~JblWIIPg(8F&T zyUIIkp(LiNwvSu241QPSsp$nF=kgoU^VJ{?U=VrlNA4 zYXe!bULS?w(H>b;7j+5FpT71le_!tmT30L3e9x8dq6Vo_x=*7>hft+)!32@heV1B? zm~#P{Bs+|fp}R-xQh#cn@Li+rXHz@F;&O-wZz3+B{HV)r@S#(ve9xkF&pkN2ZHnVX z8*Z(^Nmly2BV;>Tnt9~JafcbID*~0KAuitOC96^y&tvgi>lVM44bRjznJ5aU=|tK$ z45^4;L?5?sp>@NZ#eSzfTK||C9SX;M!e_L|dJ=8GP%eZ9K=S35{N6q8kk1w$G;+p<3 zH)U7MqVF$6u37w3FV3TN)w9pMA$Zep7-tDL`II3o)-}mWdcuBM(lf&`WTM%wZ`);l z1W-&ay?k^_oYS^xtJOL5V|e+cyT2HgE>)K=UhGEc@}PAcJ`@n-|GD~V!fwVmz(AOP z6T3WvGUI!4qzOKWnw>50xEjsTioxxkQDtKn+ef~Q#?`wdtQFViI&b^g-{Vl?KbsGS&CTSfs>OnMjG93@}YHW*Z*`YJ#G*Y|7LMQ{~Y=5&)IP#H6aV9K`?P&q{WCVJ@$|m>W3{Xip}-<`w;()yawJ{pX=9c^;R;2K^tr|)+x~6$>n$Nl)=d5_xAq)<c1%2yDr8&EK%Jn@zH&<@{f4R%$nLquHjvqC2Fw<}F2 z)rHpx%xC!D*%N%N{TeCq<`{DmZZB;PVSWd3>mNZDGfBcb#OUi;7tp$OjGDakWqW^k zSwclZS_`{A2j@yP^>yuqJ1aA3VkKXf(Y{Q2-XbreHKMd!jqD31)?BLuNy_ zN#=sMQ2Aa&>*5}|cHv5Ov%4`I6~8aMiYNc*X82r{DQd>Odx3+|*f=(fvTkBB-Rv;m<fX6G(Mw9R>xZA~hCV+jj@CUBpSE7^y>;pK58=7Mm(4$yiXA>mrX7+KEHZf@U*H~i zuZm`CGd5eJNXwx;muGo{lRhqZm>T30~Qij;47?sMVe>Cx$CDIbk5+*(?8!|Lp` zy@A@*eBtLTv-f&rRNf4Q^kM}Go_yRE(A3=f>C2k(^DN&n??dS8^U`SDrX4y;cETi? ztCO}`_8%zTCv)*Q$*3v5bC*qvJ2qJ{Ch$}R=Q|C{N3w^Vho0XajDMdW?#0V}t2@E+ z3%AK`YX&M`8MLlbjwf+&oc62pnt^7998RYxx9B&WnFFsEy?*c+SLyPPZmP$`6W7%C zek}#)TD~Wackt!XeEf#pH}XpXU(#cN3Y0GLteAf$oS)j+8C-?AvB!SyXd1I6L>ytY zRmC4&yx#pHi6#HU5$&_TzAiO&KU2ucd8Qkz#V?Sci2al11n0RN@eL4nqGW>fyvjCN^ELwMOfYn>Fj??`m~3u^!U|z>%$PQ0nSb-UYd z=JPdz&~wTZuSGu5iKrZLUotW$nG7~36CxuQ7R7#JQz%3Kf|6`BEE{(|v}R+zPxn*L z=TrORo&Dd>%cFIVUAx>_Ev~G_%(o%*CDM5^in-+6Sh**Wh;&NP#P^N!GiA|Zq?W8f zgmDT5IXy?h-`Ub13jEQjBY#I}y(%DM|Nf}`-%Bf?b-5}eU4K{o5U`s&95{Sjo-WQF`jyAqQE0EH9eJc$)Wp-^(80n|c-F|DCWBT9@taqXu_!XF8U{7mv(_&YnPil%7=$-&b>+Njo);JXiYsMfAxRmENz$x8(_YO+8?fN_3#IPPFRtS7NPljt@$#CeBTW31i z>YMZCy6ze%UF6w=|4ca5bgJWnjt}Pa^Krh}zGBFJM&hqJwCWRsLnA&^R0ax{+KKj=CKg3jwjc0HYZ2}_- zG9O6OkIZPZiQT?quHStoL{8DM-|wywGqFo4qc@2cD&K2pUA;UlEbeBFot=VLn;pBf z#7^o4lC>va8nlz&ixq8LQGWgWRZOJtcj|i`xBTMVN6(3brwiY>^C4N*+Oljq@FbO8J zwdoYH$(MVA^qRs(o*Q|>R$k*MT{W~WTgz3itg92fvpi}Xe~SH=-aP#@Ad*dgk+hWK2$F*3er&ZhnHm@jote zQK9H|T?4IaOGV{<{Dh>fI{(FDNutb*PV?BOg>eKTXgmlV7hUwSxObrF1R4 zUGTEz>_=90!KAIgh#Hx#P@N&pv#5ME(YjC4T=Y2Fh^&GBmzi+HDo-3w1_^8F~u zTyCWC^6u-yp1baN^Ay&W;?H6)_PG-D^%iZkZYi_$c+HcouVJ|w{Xx~8mv7(9JVPZ+ z%iLzf=XwM;i-c!wB&Q|!NBP=?@PwcmZ=QEAOO2D` z>njqmFC5m9)mNP6HGA4lI3B)mPBBpK@tagz3x4Fgej@C|y0Y zZgR#8F)pi&(SRpaO0GI`-TH{H`ko*&m}%SoxSRhb=>IVV|}zP7oVf}bsUOS&-Tas8+QaK zNBC~la$+$C-h4bY9mr%vr2S>rzi|F!;j{0H>OoD_xf*k8ZoHMrL=UWvb+KXnE=Kua zfY$YQYk9P8P_Wb)8c@=O^A*5sudT3$-{fA%n_iN>1# zNUkuQFxvja)@;m{es>~%xVP9*)_3f9VXw5?4m`NyxSa)Zt{zhUJDxN_>pmfHa4^c! zn2)^u<@%f4Yw~K{(z`Ejb5b%~4tUY*hm|({OSeK{o@n=n&8@|oJsZLi4*2eA>nAod zUVO0sLcg(ponikuTBc}SH-f{Q*{#Kb+=PRg#h0bGnYQW%b!YadwH41ytm{41y68Z_?Wz23b`&A;!xR`J~NQ&Zv~ivH{G{&Td<(7LVRp1;IS*I(h*96Eca z`D&anJ9n^ZlkfzSp^^_n(1MTYHMtTs>#{R5oH4ud*JJN}F)tHTl^rii*zqgj{KR1O zS9kw8TIOio>XYg}Pi%C0C2$(*Oa30YlAhyy`+-pCO}T;@TPI#+!*3^!amsy8&Xi>& zX;mZmmiEMr=UghmLVgJ6{8B6R`u_bT`_Iv`K`*qL&kfS zXkB7#t4XU*ge=szgIhdf-r3TwzDhJs%OYpH)MshKZ>uI`@$J(_TAcBFk<)|u;w_>w z7nsS6JxRprvK)qRCdQC^;SpWr`9@Y~-TBt>!-Ka!dlpB=@nzZO7wNkGvNY8BR2}CU z!fnZSuJRtsVVVM0!Qzz*Wwq&y!S;MY?5qrpnXdHxTpbQdr}nS&V*P!NmNi^g-?qThz@b%#_SCAA&xF5`S2qZYURKmj%Cpz+8CbfLl$gN6qEr#$k$FXc&nYo<(MaG}OMZ*AS`vNs7hj4U%6A_bZjss@-;x`>#CLS7 zbl=~<`P!j%xl&EvbP;QQAYyK7boav(*mep`Zal1+U3RZw0Gp5hew*4#s_36x3Hqld zuAgPs*=I?Zlsy@)Huk-w&oxlY7)R;aqjiT^Ieg^m#oEfp2Htl68K?ev15e9>FVSYo zH1GQ9GmO>k9Q`j%N)5AcU$xnu>-)K>Z|3S7In!w%BoWfE(?_s>ooxR(T6fU8?|mr) zxZY@1kv2G8%lPWcsF-S(rLNBWMzixb)&`esRg8B&nV4cvulL3(!>?yvZt)BEmLFzV z(BS3ZIXxa0*}rbOe_VJMt?MwN?&lm>KhnJ&sGY+hVHkPuwWH}^6$ekciM<;?vt>tb zZ)_Dk`BmW`So#SP7(qEJ7GbW^z0i~mGaQXx$0jw@HoZz4vd1E9g>gjI`T0d~>ywSBZ)f{d$D)wV!7W2U%#wmZ-xE zVN#au!L;UeYehLDzWh5>)3QE!PqzO#-b5<06IwT&@t9-bqNnbYd*;T9Dr#Yq8%ln- zQv#CoYp1TB`px86-5ZH@%Ia6d@8UEy7Qw>PR(V3p{+6}vZ1p2olOLYAdyp^kyjN$m zE^D;V$pqp6y0aVfw&%~Pa zO5kpp1$AmAr3=(t(A~f8w10f;g4SJ8#!2RA+@nv7>rL03q8OnW zeUtTN;Fz+b6y=diLO&L(bcb3#44hV{x-#Dw^guwHg1Bq{IvKQQkhd#Zx8m{#$8b3T zfgMBEvsu5tl$w1Nz2Z+%;6*7|x@IX@N=I{&af40gr?-NCom>su#ILt*O8G{WU$5L5 zET@SV9ew}ThyCYh-9zi1rlzZwvq)jyi@qR$H}FBmgA6-Rl&IykvqV|Obq0xkZF&VQ zTe(NA&sfI_+ZtYV(mM~`p;F24-?Z!_44Nru_^S(oFu#x1&GSuk6-jxTyTi-*l7`cd z?d^*}J9nQc8~#yNElbzs-(U4Q&MeYd5a}kbT@D_Kynduc#LJgV?Cu=RhxD5qkxPGd z_wQeKL+k#~SR2_&OYO^MI3uImcUg)!k78MZ>O4nW!T9(!srZnRBa>l#Gc^J{v%dwi zdn0&>YKA3V>7+Acis7)54wOowbluUq{!=9@LmbQWcG&}8YshrQ3I!-nFXT$(B+|2Z zzNZ;`e4lP=B%AZ?k8;H?efF&L*d)>%R-Tt6e%g+Rh-)5I?m+22KO4kFeYf?{XI4_beme}?+)up*gq<;C$Yf&AoCsg6%@|&XhBfM&y@fUOlFRQkF zZaJzV`1+@vg2&vI`&u~sqchJw${C<^J<+;^v!09L_p=w6OK{-(u*9n0V{qkA9X6Gbmjjv@W-^yG&z93IPLM7?V=b5SG4sAc6{}joZTadp6ADIM?JAGC>DB}^+~xJrR$5A&MtKeVo@2A??VyOzcwQ8!0CX^&Y|UOt6L!#6l4SR-FPz7{h} z$fc$Y9y%U2sdu(4_9XUc^>m#U#flh>;D^G`UA#RQ|K__tPW4CYZbkclk2%RRVUTdt z$3*d}DD%2Nj)L`aqfmWuRrB}GL-(Wbw=H>d@5BZaevaYsBs>#+JnQ(|#j6~HvYkH) zj&T0f-5;k0pmnbw;g;7@d|_B%&{dx4Aw3vyZ#Vy);D>pFtJ;==1qc+dRfU)}w2Y9Lyd@nvg0!@#fUd_uw=QAw-2S7)xr zt6wLc_?9k4vf9qY;%7~CT>A5ZQ9;_K_`>RATDqS3O#_)nxNWD;aTRwf+&j=^h5jN4 ztt(qOrp%&tvu!ofGGV=KjDBKw%srg+OASu=$l*$^p%H3*ipWPLe1wzv^SE~lYGqDK zFm5Ns`=8$Uc*n%Ban$}m7i6)5(Ym9$#+NGA(hl9Gt@52$PurRPS|2vG-qcr_Uk@b0%W#?B}EBE?0RklfuC(x|E80)bkO?hqEQzr$y4}yngVezBogv zN|^U#iD+NIFSt-HCI@$t)snt9%YZJkMu_h9yze|$`QPkh7%Tb@n8TcAT z_&Fzddi+RxN?Gx*oukB;l-1i_h~|1Sq9zzb_O6E}6#qkF6;8;{UUi~eIbN#}=D+#w zk5j|Zx{1D0UslOOZ}*5WS#z2v3VbU&x*;Z>`EkK%Bg8phP_DPrsb+fMvLA3%lRk76SzD>9zOO-Z)?CSX8(7do*>V|5d!9pqeMk0%6krb+UaQ9-(#5v5)AH zat((@$_ZEI>&IE%rdE9CtkGT+x2rH;-!{p!L^&s`FZk$v^7*`>mS&^@xf<& z#FUVD0{i|sq;dG?d9RPrx+=#QCavZr4W6)?#dbehZ0+sCnWa{HfL%9Kv956Y1R?j? zJhz^E1s+vJ>nE=F!e80o4+}3Q_P9h$d`3DlrenW-*dM1xpmnMICtJhAD%8iEek~l; z)Ff^y$+{*>w__>A<8`};&GJFgpV;BflouEEuSK#v`g-oly(AZv9PXOMi2>n_nY{B( zfAifRr$(Z6IpVvYb^kd-^RRZJtDjrlK$9*@_c?!>oBqT$+eIa9MVYD&ddZrM)%OA& z0xO-f=~`z3s58WF<9h7%Iy}B&bl~sbacUG=mok*zJm^7FkA=qQJ8Inc&wlp;A8j{X zpwDLS5NyW1!j$2g7WhY_Ufh;Xl1Z2SsrW>0*&7d*)_3~%iHTB|#C-qeyZ^k`XteIv zbbFeBnL7N#_~cR*<2{2RO$icLz6XxZC_YwgytVVE=yx>j>C;Si8S!Ti&)Y?775?5k z`^r^@93Ow1zQ)-uVt+sT`@GjDXkGst+K9Zy5D{u$ukwMElp+}|I<*rGk0%v_o_e__ zyWRe5rlp`4ZdiNR&F!^Zj3@UDv*03|UBHZc+zf4!%GKe6e39{Q3|bdIm01bzc8PKm z@x!#j$MHr#b%q@xo05*Ix}FK#GNN!hpIhH&U`GE--Qte$&N@~oyJM7v68CDOcJ#Tr zGdy|7Zwlex-*IXzT6a`sFh#cVQs$X}&k9xr1Lj3bcuyPgG;2OY-kj(-u?X$6dqyWJbCb=~U9KP>5J z``Jfw^r>vuOw>m1MBvgY(`eA%E4o|K*~AoosGH6zx^}iwf5{MetJ-ue)c=*(UtJJ{ zc|2M-hrIo<&Z}XLYfpG_Lae5VgPw^eDs>IxarC%x{M!Gw8 zpI)V;>RK(}MyeUOmBuud?B8#+|Gd|yXk9z2L&ofh6g5kvhiGj(isd;%&kHJ+J)zc=V{i-+cGSzt7OR6H>XS zS6jcoE8jcRzN>PrQ{%TIm0rq9iLlCM=^f`)eE|n+Z%(e}Z#&0BKi`cFYNQf7|NaJ+ z|5ie^vDA0ov&ksk1hj7EXK`^7{$jVYNx@S-4(?ye7G~D@KlVJ0IZ1*mB~X`zmla=; zPAVnp+I8)U{_@<{qf&1}a@2`=>E2s3&}fqVLFqn6>ryCrTsZnM8c)oMW8417>FVW< zCsbT5%OZDWhYw8_MKMeetUa()9PU5TiFdPDl}SIHQ|Z{Uhzmeo*#;;QNlIoYjV~k9Zg#(nwQ(~Zz+rlo z%SmI!tervjBD2jGo$m{@uAHIMq4)g0BNe$KIozF|yhSqs!%nHZE_6FW`i?o>W-7Q3 zRw9%ccl)lHoWeik`E%exzX;FK2L-2!j&9;pm!p5DmW0+_9ZpXbysvipUM!KY(xY2t z;j`m%3CRPipa1u6xIcs*57w>)H3m zDWd=7`9^7I-J+>d74b@CS`}hr1xKqccbig^#ZfOR>XK5uqbIT$9aSzBriVxwyqDn_ zY!zveVUs-c^>km~67^euC37D_t8SDJ>1bUn<_x+UOYe`L;qCn#ba-@Ip^Mn@`PA+= z70T1POAMm7wMKtkdT89(=)0UMdsO66q@YI$(~mk!NiNE>;sSA}s8PBZXx-lBpCi6F zmhw~@tAVYVJ`ZMV?5u7+64E{SNwtWYKy96gTTi;`Q((B)DcR1R=%W63g+$u!X@6Vo zmUs*OimeuuZYEl{kn#7i^%FPl`FCe4i47?=K49pGD|a+7pj>k~!cRX-(AYgmzdk;| z7E`TX7859aV`PiKS@e$|ZSL=EuBq!%S}5HtwC-J>t7iUIk4wp?ykpz7Aev2;|J2C-`PBXWHwUe|7H}uNX|*1^=fYdXbvqv= ziKOUIgCqV;Qj>X`lCp6Vq(XuL!aHBtt{Pt03-n>Sj^|yw+Nbw!ai{b2T`fiGpQwD1 zdszONa0aWGeL_w${!IDv0ng4eRHt5Ox_;1mi8L+h6MfNnosX-n;{Luh4JT&myS{NZDBidK)5Ma>1Jn}^oz(wXy9=yW*MnYY+t8pI9=)T95Zn zm5!i_l;X)K^Pk^MTf#s5Y9zGYd6ypbnP*+M5bNp}tmYrTEMJDwH#~E+ z-6cieZ}bYSOX#W*9G7YL-nc@9qL%Kpc%;XTm$r-ag|B~?7EV8VP&F}_#}X@PCUh== zF<7`S^wW~By>_N}y}x7!Q+n#*1@wKz1!&zYYYws_VV16y&M$3>)ka(y{1c|q%SHQ_ z2V10UNp6Y-WxOZ#aCl7p^PQveTM0%*gF8YE#`-j;w^BN>)tD2Jb5Q?W=Pg9*MhX%f zNtcZ0Z%j@+t+{ck<>_WHMQ`TkPL1#-Rt@*kj5udC@y4YKmphK^;q|3Qmc`275Kw5h zO6ttMJ{X+9gns@*5n9((*#60&?JVxc1t~Sp2rfsCYm2z`+tE#hTVtnOEQ9-`$s}4V zp7%VV(>~gJ{40xm{DyR`>5TS^c(oyF>k2bs)c)`qtxG=Cn>1V%QT&Z#Rynt%_QkQ; zvn1y=VpH(AeI#sL?ba74`^t1br!Lp2G4SvGv~Pdj#WA;iacl69L8SgwqD4KFZZTSy z=X+3fW5C8AWrOS$YnkNg>zmBcG(FPyE2KVUd)1d6(^&dc-%HY4l0@dd7gcfYq#a|i z#`6=dqYa1s+6wp{>>nTR*S8Y1uKGYDo#5{hZEqD~6Ar!cFG-FDu;NLd2Sw-Yob(MQy>|3t<;I%<t3VHJQX$Q`XpMyuA5g;<^5`3`{+9V!f&6B zh?$K?iLAYsmH+fsWVc>yEA!g=D0CSw`KgSDom2OgrxulXu*v@Qi+z8~(YknX+EHVd zt1TZ0uLY4FZc)6c7x!GJlx|ON=NLu#7B=oO{PE0Jtb=TLCvc)05}x%<+HyTiq~=oY zb$F%ZbVNHJiqyAO zIN(EI@)f}^LB$`hWtk+nJIxgU$?Qs;8Sy`!y@T(oW-CixkKRIIH+B&_EtGcyBz6bG>;?Baex-_KQr*2S*A z^Re=+ip%ly-gfuh!mWOk4zBcx)!Vif;Jd`+b^q2pbRz>?&9aTziE!w*+ zO`|jN#i!*659;7oRm6qQ_*<)-;fstEbyZ=Gy8^gbEB$r^p$fqd!$J&n%bsD^(diu6~Qw zEoiZ%5{jSpHP!2{xp`g0v@wIVA-uZ&b!69}eI z`PQR#UHUYxes|=xZBJNHZKU6*+Y^~Ir3>U+FCx*~;Viw~vX-#C-obxOM61~H_Y@1^ zc40erxYN?Hmk~0}+@$tj_Rml5*SB|QUCv{oI@j9#x*p#=>zzX}k4^aDR#dK~)*;8- zMyHy4Ii+5tjfE8qqBnx$Z)IzVmQ)NQUL)ugRL@iU_-mlV`F6sobi-(Kw~*BCSMT3sYU}f;W8GR8 zGft_O`GV4IKjr{Cd@@$b$N@mTRf={BNu=_yH$%P74FayYF1j8F-urj#-&(3JZH z)9!R*Rj=XFsd~J_TU2Iu^H+OYM$Tlo+^e4d{#-@dnO^UeDUJTL#Qu4seSe$Kx`nG! zN#rulXDQ>an7_Uid&}G*=R50-2-nuc5x+wQ?j7@@0t;GYgl}!ma^8TOZz}MD13AVm zaxR^>#v5wM;6jf}n$f!Dlplv{hP&SJ89KzRG>_z2op1c;o5JfS`y$HFT}_^9P@Q*t z>d*G9yIW-dJM+)WWs<+x_Rj)XStDqNQCI2@;g6DTNLH8jD4Sp(FTY&Cmi7uvuyQ1`P+)t zz5Bf=<(o!+)9av8QB%){&ZX}=OjN?yrM=IQzdEk&PZg!Hmi7Gl;34^z0X6kyY!gxJ z&6iW93QwsfiRTy$u#saRkp6p}p$)AYdC@?&A(eEM(fW6dR0xOP)o0a74++!H=QXFr z*15_a+bUGGmJ9L`^M7U*Rm3Q>B2VXVZpF4(ef@{+lGabw`+xJ@zs}H(*1fscgU8)M zzTGPZXY}!|kx>Hfk8%DFrF)HnNV095-zTo>-y9`P9Soj+{n_F@|9!U z%cHFIQL`Qz)45tVH3dim`-D?DqTgOt^>{Wa@i*W7>kOS}-G~c~mv1^5J?YWB`ThE+ z?A4Iiv`3CdGea6a0%pT1U7+u>AW^;Os;jP2r~r2OfpQM?Z(=}S0%gstAaxXY7x zpvwve09|NZ_qcMyv*)DOHXZ5t{K!8N{KApUJH}d@=kCrc-jm8(bOqPC#O;&{$D5br z-)#vhXC6i<^;?RbNd9xe@pg>#ql5F+fA5FsM(YOu(A$|-ou|cCv$SP;MpDAgB%#xN zw8tVL^{i+x-|1yp4XV^+-%~e2DW@J^OuSe)eJTFc)p6E%T{9N?$?%fdgM5+e3_WPw z>!GRHbJ_lJq=nbHBD*#olGU#Z@jSHZv*x;4f9{FK4Y`|zSf$F7jc2k_T4fAq^Sus@ zbgCAp#E}{?m`}Pt-me$?_rvs}b$2?;J{oh4-o`0q4zbn_?ajBjRC zw_hMcHKD4e5m&JEx{X37e zSUib{tA%SO&Ce(-j`3XQx=d9JO2syiMl2}$#AlAaF#$8lYm z2VIq~*lOz*JL^yF%|H69yMI5-09scvC|{ST@_2*3sJT$YD&gjh51>_=MIS3|zQl@Z@|+ z1hyJyqV?yx?y_^Od}PL7-90R+Yll+!aZl&9I1XO1XM2)qnXp`d6-FI4uS>CKXgJDy zg2~5zzrWbO&hQzn`zN+JqA@G?I_sGl&8@(d(N04hx08#v8?QA8-LZATUMs7sxgdVZ zXhz!dcFtUhD674x_sOu{JHl^YhJEr{&)z@2*#En7gJ|7S+(@yVh@z3+c)B}QMKMfI z&X-+m!1+FUVc{}Qik@r45Shng8%Be=vJ;atFJ1(@JM<6R-hU(&@|*EdCLx#b{(YJI z*BOS;x^2llEaxbg=I40uiUO&4Zm*pG*n6mMz9s$k(+H`o71CH5=Sga!`lLHA1OmB2 zO1(lNY1}OKHajbIT}kERJyrMjhribuzMyq8x^6eAA8r<|_~iEZXkh}`9GOdf{u%mZ za=lj0d+!JvMIS9Xi54?sCoxVa^|8MXK52M;JJ03Q2@=il<1)XaTMxDya-Crqt!qys zulp2V-HZQ#CD8TjyV-6n{+QH*tz&!TzM}EzceoZlYROzcy0xq3*}k3itBZ z*2cXt{d9y29qyJq{4E#f(Lwwf9b_E&f!l4 zS8mi_4COiZncvuKq3MC!e8waPQ##4osYKE1zfvRA4)R5GN71?$CC;)pvmFt=EO?8V zCxg^Fb?uATdI!a)$|HYn2sy9t=HNfV4lBmyWuNq&YxNZ{BrqUNd@hkF>!bDAKB=7eH#clfhtO_t=**FApmqjbNbb$_uH z{EW~R&gZ=x**3F!g^KqA%Vv4(ocd!C4SkM_ROAeiJKB#FBS;Gfv1x>cD)c%Z1jsuu z%LN4xcJ(&6A3^_aaRRN|!p7j4p#J9VvFM^ON+Ob_48<%87AGog%Lm0$3KY@=NAlzS zvKm6-jWUccR1yX^kbL3B{&4Fw>Bq_d;wN%_^Qe3$(Yj{TJXB%FXr5yA2FpJ08CUK) z+8|(aCFQ%yqwhu00?QjIt#ky2`FzZa*S}kw9`O3jhxZuw-s4c?_diRAG;Xk>pRY0X zFS_PehN@Dx#$AjFY;=WM5?P32zUVOCp1q`-%+h6fAR9fYEKr!$zuVT z&L3}H-zk0B|H06pfw zGMpRRb844fq)HNY48BkbcXWCflu750V(Nf}b(aGRixe~7_}2}Cd4+M{zpw*H{WW#8v9xo-!g_WAQ-A-n zHWlKtl_U3kLt7gx8gVQvGE6)9pJny`r2DsTw6t|FG{eHejD7wmd;TSWcx7m8?_dY> zKv^s-!vA9XDU#nkc`Pg<$jcYznDZO|viUGCFb@1r4j||5k?EiL{wvJ?7zh5(Ie?tz z_SDD1qWv${zx?9}($Cl#+Syy0U}4qW{?8e&A>Z+LKnQbWTw?ow@T3gVHXz^um-x?*7w{~P@XvYdmxjg9jicuvSY zEG+VWV>v_zGyVG29x$eB$ntmAM0?eitbIS;r_{V(S{ zkk4kTYS(6F$O?{zSBw6}3F#X8aUe|B3UxnRzX{5y9T%wqo`2Qd5Ef5<+} zhyOn~fb45dj&K4UCgst8yI=jg!2j?c@>vUKN9+4A|K~a<64M5deiw-u{~Omnk>ys# z_Qx9+#xeK%fE}3Wzn}xiev0Y${|j!I|BF-l5B^m2|6*q_tA=p^;{e71i~|@4Fb-fG zz&L<$0OJ700gM9}2QUs`9Kbk$aRB20#sQ227zZ#8U>v|WfN=oh0LB4~0~iM|4qzO> zIDl~g;{e71i~|@4Fb-fGz&L<$0OJ700gM9}2QUs`9Kbk$aRB20#sQ227zZ#8U>v|W zfN=oh0LB4~0~iM|4qzO>IDl~g;{e71i~|@4Fb-fGz&L<$0OJ700gM9}2QUs`9Kbk$ zaRB20#sQ227zZ#8U>v|WfN=oh0LB4~0~iM|4qzO>IDl~g;{e71i~|@4Fb-fGz&L<$ z0OJ700gM9}2QUs`9Kbk$aRB20#sQ227zZ#8U>v|WfN=oh0LB4~0~iM|4qzO>IDl~g z;{e71i~|@4Fb-fGz&L<$0OP=a4+khl5B*Iveqw)4B)w30mu|~5Tk%{Dk1_?_(6;k%6SK|hX*k#h`l<9JvxX{ zL#*N;_V^%11F^RUv512hEySK3#3B!3$ofSA$P{%DqldBrfUI{k#E^A30w^BDQVwEA z;Wa*ZfOt^=F+__2;5qn?#sj@$5JNmd*0Jdz#t3D^4`gaSh%rGK$sd_o4r0tuW;@tM ztp_m{h#fzOwLuK|2rKXaDZtcmupAqd8DTlZ$IgS;aVX;-e75T#b^>Aq2eIyh*hz@3 z!H$Xe-E$CQhw>7#v%=JS5IY6sqX)6RgBS7 zb_Qa+5JP09mM#cObIb$9oG+H{7_zmGBRx(!~~$c3}s}! zHxFWhQ0_Qb->rk#1&Dbc#I_G&7a?W?Akz-S;2)L{APCDL{_GwsCk*BMgPivcmTNg^ z!CDRyA`)}v=aYbj>i@mT0)>5#k?%mH5L=LHjnrYJ&LZsw(oP`l0#YB4eI2RiNS#3H zF|to1`xmmGAoUQbcSt=$>H^|FQg4uYf^5%|Ap8O5_3$O{fcHQH&u8Q>Cd89>@nc|ZYB1eAa)fHH6uPyti{DL@*y z2vk6dl|U6x4J3i~G|Xp!Z@?_D2>b+sfe--M=aGF}0zS_Mo+9mV5|opH6d)By1JZ#E zAQQ*}UIN)b4v-7v0r|iypa3WYih$QZF;D`$0d|2s;17Te-?ant-#`!03-kfqKq=&8 z1o@i+HvtVm6SxLk2h;#1;0hoM$N}=eWk3p$2E+hyfEzdsZ~~_QcHkty46p!40S15x zpa<&U`xAi(AQFfMVt`n{8E^qy0SCYlxC^KO8h|En1JDAr0Uh8bpbO{$NMF?qv;sB2 zTc8%G1L}cyzVz_B%}>O+8m^f5dlO2F+d!U03-n^KpKz%koFbnmskNd;5cvsI0>)=rvRkQMA}27 z-ACFnq+LG_`x5~m47v7$*8{*O;4?4?d;~rK9`Jq{EN=#Lb3hBw25tcAz*RsQPy`f! zbHI6k2RH+q07^k80SJTgQ<&ca>;PN98ZZOQ0Smwqumbb}1K>9B3BJD(wCow&v60Vz&T(FV$%Q{l#c_BP<8^G0T;jz@CO0_cL3?r zJpd+HmKmT2jsgt8G2jq@1K%`mVr8;9(V`52O0nuAQ!wU z0$v08Kmia3JOg5ZOTcA77LWr@z&=3;e1mlv0Y-r_Upn1JOc z0V*g{1IV~x3qZyu$XKKW%B?^f&;fJ;JwPu|4pabdfjS@>cml)#u|OPP3)lhnz#ZT& z-~c!R%m5p395?}-1lR#GfE@S%-;Z?t$N`N5U&7w`iLK|TRU1d;$`OoNQG=D@Ry z@IDt%1?7h@H--6Ecy9uD4&U(tNCJ`pWW1dUqygzb29OD40WX1UAP2|=@_B2QC8k@ERFAn*fTyRp1gJ0dN9z00VFg zpa2G7T^<9$Kqlmn0`LMepd|;$1B!qWpaPfydhodu06CBi%jN*v0CK!02fkbY2hajE05w1bPy!SHIY0*B0i*y4Km_0e1OOpG zjDi!&$hZU{n8kIc0Jr2Zpqf*x=SK-!&umNA6#Z2t6<`6F2WEhAUVfw_JJ1R=0F6Kk&5G; zZ^66`=mtIjeE_oFNVy+C;t0t44+3Mr2=E0M21bEN;43fzOaapX;?;Lx4)_Ml0zZKt zz#{MqSOS)TH30D*$!+GKjQEcDi)`2bhr0IwkfM0vM)wc}Q8EakND>fXFLMM5Cs9B_ zK#Zily}i4Iz1?HO9S4YjA}C2zKm;Y5QHcr$K*216N>G9X0Rv({F@oRk*WI%-yEn6Y zod5T|_fCtQnVPDuuI{d`t`74jfI21q55V7mzX1OLC@agE^&$aK4xrTwKIb#O!(Z)r z1zb~q7vk54U)C4e@{0h}buIkTAE^Xj`iz-W1W;zyo9ejcvr7P#0ha=*0ICA20mz#% z6fI5G!MeET*xe{6)257+ne~}Epe%fL1%7YBZ#sU1fL7(?__ry3hvR+};A&hq0dQQ< z5WiOe>Hw+(=$};q&2e=im5|9SqIPywBBLL$M98)#} zF#bS2@%dE%<2!uT5YQBGHJ}NgF@VoosNd%5_Zs!fclll-fMXfH&-BQfyhv*Y(03*- z3GggH)5&mLQx63I>VUptF2Ds~zL+Qa-pmtaWj<2@q~|^T75-+Z-(L8=0Wb(~Gl1i) z8v)$_odF#HJperc-2r_7y#bkk>j31{7Qpd+d-bc)@j0(M0XhP-w8*mpCk^$)c!Wkv{R{x`z5eQ#deUh4 zOPrP-^R4BT&u;fpBEc;=AA%MYvy8yQXi02sjPQXw=dG(u(Und|7 z-~h01;k&%f0r&v<05`w`7zr2wU|;6NZvZeG*M9sy1DKBM<@kLXuna)^v=qNf0E+=3 z0PEUR0PA)Upb$Vhrfv2&MZI%BekTL&1KbOk1egez0JsM*9&k5c9AGS944@b=8n6iP zB;X0aLcjvRTC@EqU;^~-DOcMV_z;1$4nz&gNMz{>#QRs&WUuKDa$z?*mJ_fu4cpLB*fVgddt%hqp`w;K};C;ZmfcMlj?>_=)eECcI zJ?hz~_+`4xhxY7y=!5y(1^68B8Gz|)d1YF=0p!iJ$@2>U(=q0Oa*z-6un$1_n3pdB znq1TyufGAX-_U3dgq9loRS)?~E0r%cB8jo04-N8SAb_#Utquo*xd{tWmD@FU<9 z;0M4-0QJB;kZ*L_R?juPFi+H*CM%yC^~}6dry8EJ8t+-ge*k_5oB{j_I1OOkWj@G{ z?-=iYi+UD~*Y24%dHf9^pFaUipU?gRXmx%MuFnFfBVM!qk%sZE3jyT;7XVnV%i%Wx za1PgOI~-8`i(k@dw5;ollQCwd(J_W*tn(M)p7d8MI;Qmst~LG|UgJsJrFe&Uwi(9Y z_zq>&+8KE;E~oJzErIbQ{!%W=z-#79qpOAM8UU?568{RIrlMmSjBnKj@LFr@eD88R zBaU$|>WMM1x&Yb|Bc3>oj_+%@`nbLlpgrSr0%hg11_0`tvNghQOZ+y*?`^THJ6ZT;Jnt^R?SRgJ+W>_u9LwalHyaI_(+ndA$yxT@z1w?VXLdChZ2ms{r!U($n6d9He;z z@H)UaR^Ehrj+L1g)-C4w9RT(7KHy!zdw|Y>uK))D2LSs4`v6}8z5wh6>;dcs>;ila z_zdtVU?*S);1j@hz{h}(03QNA02~G!0UQOi2H=0prCfl2QFaf=-%1_sO3fG&YK!Gs z8R4}LDG|%H7|WZmw%@+sm91Y-tC%n}BQZTO8P)?_E(hkpO&hB1+kbR&#RR;^SlrSnI3Yd0@ zAW5+W1EcXAEu&Yh$7X(a!JELOC$>pUk#Vz1NM}*g39VXAb}^mS5FiyT*zfS>dR+b^ z-9`i-?{wwQ6%*1D(aMjH~jLx$majo+vQw65Gm1P8DDp-(2U{vu~CgS}q|uv2|hw-sd==9x%66ELVQn zq3j0bAOW(2rynZJTaV7(kQ)5PC%92r_|7oz4dou7Ye z_1yjCm;4D#JLEJC_Qg>=A^?tkKiHW5{eyEZ1ttYrOH4_w2^!{fRmKvENeL)hf!`Gjx?TSLLz4%rZn~_x<3Q*Zr@1!o1f)|9}UhWV+9#!wYB-G=|reAZu+AX^G5 z2uMWlNlfsa^%HX&fAbD8s8+yuLBsOtdHIa)b(U|cMexE$(Z5^{5 z7`C5Pznoq-Y-mrXj(H21`oO%f^+@scmELHjV`vYENnRb8zVpPX2(e8kh+ z=hze9&@oq_IX48RZ>D`;!+Q#5>X_>kW=@0jk>}bBsiV_pGUUSJOXJNrOx(@(BNnIOj`S8-QW0`gTjLk#`I{{hE%+28QM1eBkcQUB?XgTgOZS zhIOZV^0A`!J(ql@V-_jQ$^-j7oQHVKWEAPI%Xd*EV&17tGQ{% z_wUTmF@Gz}6_<2daqaR>2X)L9D7Ge`NzDD`=<x8rKI1^|@;YWNFqCc74@nEhoVixC5~;WKirZe_KkM4O z6zr-0l!#Zg+?=w>!j`+Z|%e?G7>Kc83^qyF-k* z-66)@?hs>ccZe~!JH(jV9b(Mw4l(9-hnP2NU>t{9Rr}MgTmAJ(@j78cM5kp^ckrC8 z-ozp)jI~Aj-&qPuZEh)uF}D=Nm|F^B%q;~m=9YpOb4x*txuqb++)@x@ZYhW{w-m&f zTMA;#Ed?>=mVy}TdJyd+RZG|dgUg;G+S{m>z!5Y58o=z;#Tysq_8$4wB`puvO6b&) zeN0I&TE{E{*61hJ3Uh0txb>=Pd-&#Nt45JVT9cXbmC(qO|yMbX}|Hen_dQ_a><1QT&?cFk+HcZBL3^bH&?8)4Zr`Gtsu}*Ue7<5|` z6080&W%t)#&l9rIyG$PGb%_B({mO%F$6Czqq0@{k4!ArRWK_Pf;n$(J_Se)g`Ne@z z9w;|`*sN`TeE)TAa+A6)$Q6Rvj&(iq=AbDxY7iq-U@Pzig1LTIpmFNY&+omy@r}gD zdf<0CoEYTT9y+o2;N=f(eN@OMh>%Jm-Swiw|Mb~-?*)E=5eWd}4!Y88OJ;8A8nn-y zMGPEe{QZfX)8rJwXEA=1JxMdRk zcn*z#`5G9?HvC9mPv@$GCkYx+<-NXam)()&zO`-Y*Iiq_SP2*m+bCN>D8GQZ=&^ds zg_9m%=MWeng5SyKi1TjVfA3TEzkf(@OHD-e`4#EVE4*~~+~8-)2fhLZex2~_9DX|; z#Z&L~a9^=F?>%5pZ-_Yu8rJwLo1EUhJmuCrV3HFvi0R!>>aEefq@m4+HaY|%8g`eY@V>Z$C!1Uei0G~dr%J;=I6oT&2RaAcX}0p5jk~x^IU#+ zFi`#R@9Nb3>hoNYj^Ne|G^__7{&3;#*Eidg0gM{zS<{RK4NLpAPmgCk6Ie^xlnx$H zn5AjE`z~7XXB#B}v{O=}<6FzouFvaqF{kgn+-3e_qaCaVv~MT{jOz;u(1N!v{9=3a zafN?lJjWODmlev%aiJ8p_3AeLnlW2YM^QeaEm%kmjhg0Er1J!vUfP}81}wCl`|+<2 zgapt6Vtg)_t4-^4+kJyV=LR(B#_@v4X_|Q{2%o| zdW{Aw^!NVwhYQwJJX}~VVSI{ga~5qI+|t0UCbZLU<<6oX_FUc?G;BZ6PQaC4$Wo}? z>)5T8AHMo1(rE*3Fl4KnOO5`t_3na&dp`OM7?smvY&V1nvHddd<=yqhHDc{m?ey*z z(o#$){QmRXdT0E@(Ywf~tvWhm*6XB}t6VqzIDWFoj|jZf2Zq-2vW!ru)#OtJIwl1e zmg$CGH8Sh{<)F1p!{7|EVFU>Ci1I;Dde4t@J*S5uNgWuj-zpKEA zabrn4N)@1K+r}vgW_15|)U=0x{h>UprC?@z2$&k+*1v|mxay9Popj7nVCn!<)MRP3 zucnXl=$H+_)CK1GtqVr}xuBg_$Ls`#eSLny#k;3G>Rha2jstTUFiC}n9=dpUqm?@5 zABCBl5m>$L%6Hc2m_v4%&YBxE( zD+n(@)GHH>qL*XaUI&`$pqVys&P30MyJ;;`(PtrYdK2Up<#qb#@Z2|J&Mk)~&)xvNu_gi&^rtiEYHOc!c<=mm_o1DR z2L=1aRw$zy;I{nQgVRF2TJ#1t24X>DU3+(+ZqxHVJau1iRo@S2DG;A!`FsmZLtwmD zo!+!-@73+fCA5*sv0aSx8LOH7%G+dXwG0lKs3$D<2Y*9grQ(bgSCt%=kOenYi z{&9~zkOu8&+_GI+Av&Hj@3o~LuJ-}rmXIKg^=$}fSaMtMNdCRj^!4oLRNu%w*?#n! z-wk-@{k^WIMgYV96f`-YVae65w(7Mpv%HV#G^X}i)awvvSbMkEzTx`izmE7u(1nXe=ls6nnbYG0*0}tj(rP?>rZ}* zelKK3RZLF;h7z<->2piHiC?{-=jSG1n9inF3%2?nGWYks9vH|>Wjpg6o{_+Oa&%(yjh7AH3yf-6L2zShym`Fm z_5G{XPy*@=ZO5XtiSapuez({4;Gh;g>^t6OzpZNTJ>XUg+-5FWJ?QM+pA6E|c?1}i z+=BU6zj@OmPqQ_076IHA0aFv06E7CezU|1U-vu`@i{J_%R*$;#RGsc4E_;1yDlqM6 zL(t{|qe3o!v2AzSZ{Jj2bBzla);Dl-1wui$Ctw?W?V&5iZQhF7E4*l6RwEtOx69v~ zeer?GFVptY4?%0(0t|JX>REI8gHQ74q0kFJIyo52*h2-jD#zVb>aFV^07kX?ouHxK zp1l9HuFssU@|2=MI=LQSmID$bzWHimm(*+6Z^K%rAi#g#tpsJdU!{{&wPIF-*=xQ7 zH(D3eH+R6!q-;g^gRT<6RE|L)!~XJ=8{) zsrS!zf7~=;z!id921}tCFti5^${iWn|CI1|sB2)XTYVB}*nS!o_I}x4tM_J+PCH87 zPGRadKHOyU#f>)rqsphN!VLQ2aLXDE`fzlJy2}>4O=0d#Sh%mp?~CYhvE(3i&vr7M zHSgc^aF^T{ngYX?1x&WfRbY1qY+p3_xaoa2oXiy5L=EW=8d{fEGZ$^|V|$%m0BNXE z#jWjJ`=gECt|2`X(KA`=EeIOcx6vDZYja`yUaX09(_mSwWhk>zPSVqzHXomyb+?dBw1vB`m-%_O#jpuQ zhjXeb8unQpM=Tp@Wh-9?_)30yJc%cy>@$Z zaL!3yu=a{pZ+(Ac$L9(|dr)HRj3mULMQcR)Sd8b8PAVi|9o_cfck9LvyK$5*fi;cw zI5@eh%ujxctFoSZG^?LJ@9gL%bv?4nLZHU~^mp4*uR+K=*Q{=Tf=FFh0nIdunIqtR*Fo@sU4mji2jw@0Vx zaDyB-R{Hj~`kfa~|4XDJxcvqU+g#tIx0YW1!P~WfQ8Vn^;zUc){cWf7mSj`ooI$o{;Im2cnofuIrG-UAKCr&*(}?wEN=)waMWOHrq{EbX1QKewaTuZxZe z|625B7QHj_GaWRXy}YmU=U4RJ@m^2G4H7&B484snrZzj*>8`2No9dZDez%=2U}h)3P63_4=3Z zBhE(^kXs5c>@}xUXz}Dt%T_-vXs`ePtFVBfhjLwm8-|W~xOX3c5mLX>SI*ORn%aNq zpTj)kfFV2N$HGg4-b`D)5W(6{wBUwxEPOGPg0;V6;roMTem|*$gX^EK>Kw3QG4jJG zIi$AsP)ze98c@l|k7z&OmUgqOiO)B>ed%A5|GiphRMgQ-U|0$#|HwKptY*b@U{qhS z9T-}d?=Nk5`6ZK@((6>-t*LbpmLhruQMH5@`b(eRdTdr@fEY})w8S_0FY3ZKuKrYy3t?qn5XM7ekPJ@vi+irx&4 z1I&xHe^9a>a7h+AP4hTkoN*%q_4IeN)mqgsk0A$vCf<{>V%FZ%xLc$h-Tw6(1&_`A zjnRD?dDQr9w_mvHfvwy2eK_aGJXNbuN2h>>^)03I@}}eNtzJ)Hgim4Je)3)ZTo+p9 zuTRxjSnlB*IlmyvC*W}e*f0F>#KpB*xMpnEYi~)5q}dRQu_jb%GRk4^jFe3!5N#oO zkksh+`CAv4H_>Tx;(|8{ao}4{UxIpI9mTPh;E6kAytma4T^r{g z+%cIkJ1*XAU1D`$wS?7pw;D8A!%0!o5CKM&q`!Lys51%?(0=}ZKMQt!IA>GW}3&U^t3`z*K{vlY!9 z&o}w5^5nwT1vk-t76DTmG+#}x)n>=9<6cxW;I|sT|EaF6=mBA4DG1Xe^2q9zN_BUG5dg_SJQ4>!(qQ3TE7YyHJ&|gwr1x#N zif4vyt1?!jNw?X-jX8B6o^bVu{rz_c8qoo@0j35pTkc(4)A7Lb@ZVV02t?R=0aG2A zUX|w5`E~Bn;lxPa|4v|7t7biSY+uJ}+v^h}s(~#Jn3}+R@zpcstBo582~eP%`ml{v z+!kK<)`iEe8{eB4(P7x8149Y6Us_>Yov9yO##Vy=VBZQu91~!-K*rxE?>&BcJ))p$ z7W-q+(Dy(0+vau+T3+@J$7bjOL96YQR`_N-L<}YBV z>xwV7di&w(b2sXkN?5F33z+#o4I1>)&tE^KW1{uGYpFs0Y@vIRk-U zae>R$?o9B~ONt+v4Q?D!qF!6m)Ep)?T9omRYy7mH`}O=-(~JNO+xCiPU*#qAe);y& z&{%87S_f^0%T_;keV=6&+iaz^M2ky?x#W5mRbxSHcRX~fK>hLy*j zBZnMO{8`;K@?84Ij4(0gjUMm}Fl=+l8=qL@_&VuN#SJy2EInXZ`mBqvSegCY6~j-@ zzVEKfZdMYY|FQ0wOtho?w;GDu@uye4a(AP(mxCLk{`C2-0*0PlmF7F1IdYE=UI0p4 z^nlj3*V@812RC{F*ZlbElH-jIt*0Gr$7Ety*pk*ov!l^Az8bhm8!tlc;F|u|rElCe zXO(Q*ax|s-M$JQkRaQ&0tC%1g+x^fAv@PvJcDUGN*^Y8|9`p4#D z?HLq_fM;z_vgr81xAeP9|49^e{gWg@sF3cKO``sb9_c&Y8=_rVs(p72LIp< zg_-o;MK@0U>|*Loc@Cedbbburl%;ob1_%s%hZNg!VAwA__1FM{3tAMVN_PTRx&xJ*c?ym?83XT<_7BHk)RB`u?L5ae;5Cg?s z4Ge4ICnq*+IoNZ|m4Zg3V+W=QFwfWf?1e8sPeG3^YAP1E3T?N zk+mvK1gx;81acr2UA^yv`+pn8s0Uq#wi&iAh)`1p8yepJne*ftMx}^>w{Ag`o?1fJ zNJop*N9kI}n9IgRGS($m7n9D^^|ni23N?Q6HF~#bJuHPrz|eO&xp(|4tG=G}DKLna zQEJoLD=dX+?G+f)S|u=7VMtvK=~Vyw(9=zvV>#oga+(MXJ+7K7eHUGJcEc_mW11hq z&9o*8Oj&50ewQbRGQDwZ-tnPtX59%1*q6Ze{=do%Ei2i)Wr>nAZCOGGrY%cgOzVNb zn6}_J80*qD)tj{qu}(+i^gPoM+)Qgo3Wi$d8WlAEvvf?k=`A=~J31y>Y8_+U8p|TJ zX=w|qTrg7FgI^#0W#rQymD|o&pVf!0&e5a`cxWYGJL*N9fvAJ7Pq6o;nZ`Sm)FtKN!oH z))2wX+7q%K|5%T5rg){_TlcPVTlSy(bp-T=fhJ4NS%`ra{t|QBeEi*vfzaq8yvuQq z^;o9B?+)Z6n)h{8-a89VLDLoc`OJ`D^4ex(}HVinX-^rW&{%+xmO&!R0m}766A_Y-{cX z40F1}<$15db-%x+V~|sOwkzK~cU0GB9qS)QTukgD!A|aP!V#nI?|*6S1qpL;DyjML^>R>*oK3K-fgvq7VTWV_5?>$T91(=Wz$y+D}=4&YT+p% zS#paDrEFI;zF<-R#p%Zcw-ox<)~jn@1`W$+=Elk=9$&V&x}>3Y<`v1(?lLxWP-4A~ zl$v^j)Hk92ur%})#?Rwj=EG!m8S9m4MAqUBww8)TzwMknB}?`Tq7*g*LvEin?Uj3I z-qBG=hx2Ag$9g{aLq&7JfC>+^`Rg9~y()fyl~*n_6x)ESnvJf0!C+Z(BAwl!VVPF_ zYQfQznZt{iQzn#VE5tr0kl^HAceS1u|20~0Lqs0uuW-Q}{z{JCU4g8S+mmgp)}&+C zq6(*90S#LM#I}k`wYB+u9uF22+HUsjyP@ie>**h$PSN=01Sobe@ajX8>P$X075kmX za}Ern>S$fpO1NsYZ0#NwLSOiMyu+v8d{FsXIt^lmo)GwTe$tUvrPJii223ayOTPlP4Ieu{-*n-7FY1_}3roWM zIN55_o&P@FB;k6b!_zKMcQ!x*>bld=a<6~>V?{*WS$i=ovC1iI{5znz0yMAHx~#^K zS@S2APY}uh<}fhaslM*tlfP7|_d!z~a~7Be!1RCo)TzwHJJ0EuD>1Xo)wLG|Kh5@R zKV448vfh;@$5lGV zuWwrMx31l`>X=u7X$YD&%~!Tf{d-3b9kUmhtATlV;+1!dFZ}Hq9rKUkcFVy{OQ!rf zv7U~pH%6{P>|CLLj(_U=I2}UMP8u-v!L9z7ehJ6M?V6xtZU%;Wt9oQ-N~?c9{71)l z6wOrsg60RN_NuI7#!is-^x(lwPduOcMmz4u5R3L~Gk~cDZtqpNd0vli^54=iOMqc) zV?d`JEw8L!{b?QZilV9e*Iy|EKFDzCm=A$rOz6ogk~e<#t@BPDa|oE4z$ABheAp`& zRYl2Z5}a1)RIbzQ+b3Tvd{@U@JWo%Mbw&?C?KT&t7|E0@6`lO_swg`m8U%y)=0I)z5vvDBm*MRp{}d{~7MX zTEFIpIkT!X>KcuclMuJ-SZlzI8IxBo*14Tg>D0Zd%Uz8pwpa%YEIjoV^!q}&7|$eq zKj`lxJsM*sQcI_hpXsw9(%AC&4YdbOl^C07h+n2n&J$K||p+_YJbJbp!KXsjg|BPX$K z!GE_dtMqLZ&dRGOXjvp^F;))@wcHKdLRMqR1z|iho_UEKp4Kk}x0#y??1H+!_qeho!)_*7e z1|9P`Fzf*X+a{e@{ZjApy3{`bQw^A_8`P_Lc1Zn$7UjxHFxZbJT61$x7F(#xe#h<`51m@{cb04yQ z+IBiH%2G^xR9Zg!m6L})HfwWFoyMA*HKyiVS#teq{F&bVmpeIPQ4*X_-MJR+jepiO z*5$Kno@~Jbj-6TZ#GXx@6;bugn%g1J(E8_QRm=M5#28`YC6RSou(pY1k-&5xm?&*) z8{hdc>0jrM9P@MGn%g*fSGv9v7{&rFuR3Swr6V3>t5-V62Bs!3r#iQOfAodolmpdD ztlN)uPRmkzhs~FDG^6M5%l7=)V4*Ixb*(CyPW&3u>2cY9{vMtF!-Ut58`80^qt>Nu zU3W^#rs>+c%~_YJwdH#e`QeDX$McgsQ%1kD4SG}7(%K$aTgz9#jj@fEU3+Zldf%x~ zX-dIbZ`OUib(v0DAbX}$T^)OB2RALz^JBW!P_%`zXmlphxg0qi_4W0KHZNFzsh-oP zfuV=LVby_cYb!LtiYTr9Sliw=LBn2iY{Bk>7d)M_MW^{3m`1>yd1rmUk&Vt7dM4}g zv2F|2tH-ufKLe-wz+xOThySYoeq5zdbwdIry=Tv96={ zDw<~B-GAjP4KFhIZ;t~*A8EsgYpYJMO**V|v(Blt-qwQ~>-C3=E_`)Zm6=<0ZhKTZ z%SUB*seI2)j+s=gDogGC-_}vp!T;O*{BOCrmdGBkyZ@F3Pu+gq zB>fx=>)!bwXgK<4{r%jfW40bCKpj<{&`Ds}=GHoM4_tIrkUgNnSg%Tswf5M2g>ka& zj-`l0Bb_Z5O?t3Nt?w4-tz;rF4T0I!#re~iu?xI9W(hD&fqAvol`HGidxo)f)w13J zhOxny+h4t@-j2OFI_4-ajer?Ap?OZ{ACA$(S2X39VgDE~OSk>emM-Dg=_ zKI^*kf2)=Je_1wb?UcpBTKDy3v0~P;{cn9FYwK_Ap_C;**4E{Jn~wEJf}c*~%)_~< z|8AT4T2StE5}s-UU}#-Boc^@icZ*Xm)Z1JJFzlTxU6ix3-?#s4)-eNsVbmjO>N8sw zF7G%`$K(LRR$pbp_@OU-HS~2IV;#k@wu#pDz&fY@+jLq#Ev@p!bAGFF-TXdW>8EV( z|5k$kEjLrWA&P?iW|m`3YrR>w66=z4I(;FYZQr8rUf_%sNu??XxoKe(&YEAAQh#SUuDbZVZL4 zt;gur+^omw)*9{hoE+&D6^*+iG~-MKz0KVT4CB{J#-{%>vem-tb=h)(VGCX|et+Yh zZees^#UPge!%^svTaITe zfA_<0fYCf}mCo^*)3YD%GKQm26(z8Uf~F%H^Sq3d+&MDg>eSRpSht~ZvjfAi^ScwC z-}Tt46^1yHwXUr()}>$_{Tj1UMvHcLy!p!BS^e8WHnm4!7BGxtRao$G>ar>M#X6=e zx)y6nFrD4>t>;%XY!vc-E4oKh_b=X5hy1sr&uv zD*X!j-34ySzFFtgT59WbtaV^ra%&+QXC7KU>pXTQv}_qjddpa}H8*S9TNYj4xJvdiJ$CM?o4)Sv`MO3uz9Mll zPn%bpwj90Ul%dxwOPt&~Ki2hn4rIF&rQQFl^_T3a@(bp`#$%r=m*81*v#yD)R?D90 zKw$Ldms)gUzo7b`Okg-?bnNVj+fHBo7W*t!+RBY(m&`~^S&l^a=zzIL8Z~M zNMJ3SHOADs2tUzUf~M=`KG$n@Yr5f!U&@bfO}nG?W^tBvD$d!!{5E|{!<@J}SIR^- zl^>H9to%fiTBTaOiMP&ELNMW67H-xwCSwex12Y;i9c-(!QQ9i++5yF_?eACR9#64s z-PQ^iw(S;ETP7y`==4hr96DP+U>XC{;HTefwtccr7l}c3Y@>i-{H@VpXHuU5m&}kD zbWAbQv07o=ItGok)CkN8Z$taGmpE+}S}6H7u38C$UYF6&=&xi|!+Pb>;3NO8LVmPw zuc20{^U0Tiwk9y6YGph&?W&7KPQ{i;lk+z4g#jLCnpX1b6lsaqibSHn;KfsRupb^` zm!v_x#$lN$wgGQQPqpc_uO1w{q=2I-EO+DzFH;(^K+$@wZb=EGWGJ~eWjg!E++D@d z$WvSBK%D0g3UT)~#=@s=?6srmRh%uy*$|ZA6lj`3J4dQ5?X%#yx9`;rads1fTqQ~D&K5AQ=MU@8HV(6ZtUvlms-;siN z8=l?CwjdV9*$RPSP7fb@;@(qlwdF1at{ef)L|_=n`eS>gYv=b}zne7Nfs1uwz;Lem z&^Ft|o94HBs9eGmctUT+VqG*e+7fgeYii#Itd+1DG#qDNx>-iQF7H^WTt%P|!{b&@iWsUaxhc-|@~||3=#jjMGuzEwBdzeIBT}Xz|_G6#=7mgrtFn zQa>{}Si9A#(F1_t$}423128Ow&VLlN+*sjGb|oZdKMxFSCDRGv z!x>IDc2R$n)45`5#ZJKBtYipbEAshAy8PL;1tTgtPoBB?k#Y$G!G+o}KOLOxihUt* zLSWC`+Xi&{wF~PtH+`G5ABo`sq)x1Ib7R@wBcCn*I%VJwj6w3y5y+Mw3IrX_JXg+3 zot!mmw|Eg4c}$jVHY8zbzxYn0g&!9V-vkWnbz7XD7_bMqW-hDn@GCzxd-O+OSP#-N zY+r(gx<1nR$ca~bJ*CZF;&2m_lh{@NQ?kB6Hc{b@Y?1xk@kZ`WQyM?pO{Ie!$`#(0 z_PXQyP4{$NG#lT>)AZIH7{*7pAGvPWz5Z=Sbxb#48UXX^&U!aGC;Er!7$-2Sy|%9I z`Sn^)#F}l5+daV0j;`uduKzc^E?BH%R&J9mYvX|tEQrQn`sF53 z6UV(PYkcv~>-O&J{Q7v=e%jga1x{e-Qw;Cryrl61gT6#M>>FVZx;kVuFZ$ewWPB$j zpG!1tIZf{0^F!5%l(WCd5B+wuTf{PjeP=xw2nwR$FS|auwq3ssA{`#V ztADn_KmwdQiBFs0i&UMbUHm}rLpuaFq0v`9l&yck{157l%72yf+iY2=@iQjK8e&|x zF74FxOu3MLwR}_tL-MYkl2uy9z7}u>!jM=(%i8-y(F|J#e7_)Wj5@WV*U1H4E ztxJsAx^;;$TemJTX6x1^#%$fX#F(vHml(5k>k?zOZe3!`)~!p7*}8R!FaN{)u4Zb{=9F{_Ybebs2Z)5wW{QKcEE^Uv*fvXF?}emXc~$AjQTYl(VY@@%^C^vTh>swkRq7Y$j^aXPWlLZSJH<)*M z{l){P2@J-evG&-Qp0y|Xto=x*I%Lb9zW!GC{wGiAEvuvi!nz8e>%3 zCGBX(?FZ{Gp7~_~(xLZ+oJRXQ`uEMoqW#o>Y{oq)bQ4p}+qS@%wrzniZQBB4+O`G8 zv~3HFY1TudW7@U_#&c{Yk89U7ubSPuT9RPQrCFgZVS;E zw0hVHWGMOmgHpEIReIg&%-ho*-1t>$*eVMzIt}0X22C|ceN|cy$2VibF?t7$@L_q{tPOvL^VU&1EbTmpcZ3_5j<(@1fAhnGAA*KCMSe~z z33m4EwEWpF4c5}*5}TUM&R6D#QlL@m6E>qqu0l33av$Y%2|9IbNV}XY2Eo9r$<1BdHvT1Y$-L43B6(4cSidB!?GrRRj$IJ4I^sKRZ>Gc_#U#)J;vo~aPr9? zDz2Y&TF{`hTiaHEhTh=JdEa)Jbob(yBsY44u0V7;$Pdy<&-flRtZ%jh3)1onoQS$Z zEb(V8LCz7G&Ua6x-~UdRqXu(!GNJ%d#fu@6!G;Ad- zAM12VaucNu8^V(2-`-yv-tfiWOJ9I&>a?=+;TBJ}wAL2o140YgfU(MH>$K#rWlj9} z+};*%%v#Se2HOux+qx7wfQB{kg6H1NO1&>{grE^)=N`bYzGWT%`NqNB{fK%{qqHH` zHRSy3b*f2DGxw=1_z&>0t{O{ zY~ugpU#DPP84_53X~NoCT8ygGSwkXs>sL#-@3<_>^(SO+*7wcToeS?d$1yEqX{hlQ z{V7U2nw#u{5vxhQ>>KF?%&j)z`m`Z0b{91SJza_|1Pmi3_x-!>$-nE?h95693T_s$ z4Pa(WFd4Zr8JnqhD=@Dpnuw9Bz?gcs0&@s7H6fdE$90Opn0mJYW9r=sjH!1kFs9zE zz?gcs0%Pjk3XG|DD=?fH*Asdp0_azcbP8MJ&NqkoI;Ia;<>W|tO z#0;4q-}xN!S;L6~a{Byn&p>JS?`zxoqlD2_&aHCE`whM8ZS;RpFyRf{(_0UEZus`? zTYu@2EXeVF+y%Qbk57K6+9$wMN8NkXZT-`~ZExIy47v;-7C*IanBajf6hGbj{0}CDa3tM+#fmh=WExl{iSd+?iqRd zaq5I8@w`auE*s+(rrZW@lIF%{KT8`{c?YeUtjOTYVW*&d-go{oVoad$whne zqw#H(jxQcpUg)V(hfrH6Gpx%LgD&|(CcbLoLM+XL52pFNfh72*_Mp%1D{y%o1#Xmj zYI16NavIMN%5-{sp=^BY#qUazp=d;QalUY1C{H^lC%BpF=IR~J3iMa z9yQg$?>T8~(lpV1{(S8c(oi6m-|zG11%m~F_DM;8S1vvc>n~397T{>7M4vxbC{MhT zWY@3lnB76XgSlg3Qz{ztI5@hJud{07(|17}741)SjtImc*Iok;?b6OLf9p8O`T`yw zX!rv$=@22^O!2L2e;^5SQ9f^K_%_SwFD?kikRs|$FqR}>%{7=t)(U~?t|GVBJ~|^k ziq@_$4u5`097xhqNrbbU3Z2oE9=A6%T3~a%p=hMTo9)MG%yv`0l2V}TCbUL0CPF;X zyro!@+*&Z;$=ro+iRa}+v(RNXOCSf|LCgwdo2g5t?RG#fW=R{eZD-2S=@vNx`5?uQ zyY%JD*EK4=tPKwh;+K&~b;cH}` zlV)HMgEBhvU=UV>T})QSVIU@nKqY?d{I+hqd`77sw5lMGUV3~(rIE8FLCc>~5^7dO zHT~!+31$`;y&A>RWEA_T2BCA0LX?TQp&{yw4G+u2G_vjMd?TO#2i6gmCz^i*vP_9Y zn?F5;XiS;dM_XT=eKh7jvxj*$=MF@fm>cSPM!L>A;&GW6>vh9KW_FNel~@*;*2U@~ zM?No;%*LKwXKZ}>U)VzA5=@zmunSTe8zLPa@R1iFX7t+VzbJ%>{}PE2-axpwRk%nc zMq?w&G#VLEWulSBhJb>Pg^qA9BE%9BM>-J-A7*djzeKzus*TY>Qdon9jFwHRq@@3% zC=J<;^j{R-;B=I}e53rAlC1P{KM$tSqUyCM8dE0rQHs*JMIP!t9o8t-|u2KV!Xan8-}?QdWs&kqHBZp<{GWYR}80X=4wjGd4c`FKi)N38oY` z+%?50HW4uawTzr_k}D<7up%-pz^RQmNc*n45ML?iZN8F=%N%A-J$4e zkH+XKi>V#N?Wj#n|zeEuI;NAxDT z++ka)dq!nSB)UV3KpBg8zXfer4!247XpAfHS}QNSL^9;qf@?f&cl zrsjfEAc5^mMxEGKh=E{`kUg*nqC`0bem z9*5V3xqFAlm87v!Gsuw>vg%<$uDZaoMrTl6gF8NxorxKLr^}PXFK*;wgInfkh?eN~ zDY3IcUO7|k8eQPi1cEG1tTk}*KB*wrgHM0NP*$Ww&{yOGJC~}aQDc~Y6)TMFYJEct zp3$#@YxE;Kw)x3^Gust}ymrimJCO@CVSCV(4;2P64IRu2W!ZE5zI=Ou!#UEC>&hR= z{Q!2S2VePcJH;qT3dI>VJOZK1o{OpFkk{+-*g@fqHL+`a4MG}kQCGO*9T^Wea$NST zP!8tYW8~TJ7C0I1>|6#MZ{!qo`0Y6XiXbj9;iX1fyvJlb*1N_?TYpJ$kQCseX1;Oq zz1^3i7-1&Qi4_q+2foI_9Twcf7C()sH<3`(6HG{|NjjvCCNeDB<;1wl&yvAckWc}f zDAO3Zh4(P+zdR2-+S&Su_Qorg-G?;jeJlexx))|^LI31!{ z#Iu?vt_)b2JVimoH$72)5;#RY5mhdp@i91F;9$5D)bVnJ;?71d&t6iygeKHF8-5+f z&My^V#bp63PKpUzh=}EQXhypH{C%4lZNl%bWm8jO1X*Zz-7Rf~uf(1?D#rPCG%!diuSsLzD7UM zChqWGtA)l^2`0u{NPv%hvftKTb_aak5#qIfj@e-qlnlnR3Z6_HKYFo0f>}#b6eG2Ta1(x`&A20Gu3GwrV*% zStf2d=r4h%ego$Uo_f6X)8hT?ER8Zdi@ud=(lN3TB`3(Eo`{yE#yuWKaX3dYcxJnd zFM?&{gHp9sN1)j2#EuzIYnNzE9I>K&Vx+BGVNmKf(4iW1a5Gm?E{t+4d#k?$F8U2x zgL1WD&D_}@M#T_r4RE_q44F#4Os*w3z#6LYcnn@ae|iR}`6K$)c-B*ERgsI-RgV}W z9m^d~6kQy?rFJ}_%FBIG{Dym+!pU|NkD#d#zo-UiZKbqu)*F_5Ctiw$vV2g*7QS#mlj1A#P!K z*;dd1*w4g^8b=u_q#E@EX~*x6!_5Ws;cN7CYAR2h7=~afX7SjI#wfO^H^DCI3HuY} zzhzrpR>6vXS0I(}>&iv&au2QuwawBdMdGSY^FI`V<= zq~du-AYlg~iA7hz+AOGmf+6R#7&S(JNwQEB!ds6kzup~@SidV(%j5w7V#}etfZ1ky zitQJN{STxUzAjY@rWza`S`T$)$4Ql`s^trNnBxk>nj#9n0~XMhWD->%;Zg>k!40ocM#_Rl|-7&C; zex&;?I7=ZIcP>YNiM+xT$X0yM$?wkhJ90oLFNBGRSAkgJLBSskD{!1Ot1BE@tYh%7 z3W#a|JK)F?r$)q5W%R3H8~sSPx-rVs?ZpXaxp^#9?NZRi^8pM}gVb;*sN)qSMlgjS z;}7b4Yw0_Pu0#fUVhC(_3mgo0q6FfZEf#Xnl}(Z56{zAHyQpyisUt@U;KIqz*e25z z5Q8I7t1Hnp#iv56!m=(>i7O~r&2hm@`W=iH#HuLzOM-<)A&h*yV#3@#&P5P(yueB< zM6{So2ZsM%jAlm1C@7QhmEeS#j-cH*>Vopr0!fcLW!8jYbiFm5|v0 zS1>6#?k!cPk_{V8}&rzq9H`sB8J!z?->{hx>A*%=rv%7L9AU0YZlLviql3xBz{rqY5*oi|AAmJ zSFDB#7`x$GKTpiFeIj3EE+QyJR~b*Yh{V`o(sMzrU6!iS8{`G4;Z9U!k*W}1g=S;< zr4jE@Gt9O|CyG|+R6h1P@?%+T{iQG?Qo#1dA80#9uy4h`@P;s{A$oGrUzv{8Lh~Mp+i3T2KkKsVZm%~~K;A)M8 ztno*l7V$_hMkgH+qC^?S_b#KuofJ?8J_Wg$KQX?8SSJ?4#9AH9{Ebri9L0L17DC1- zYriWLK(rD>>I!7>XWvc4lF};~g*xRVCM~s!=^|tbJ$X4C!!jvXtjQGPYn07ErR!D< zMeJDC=l2C2fsrwC8TBSOMm-TsQ;#Txtf}`2^p;JdOfQX@bles%+4_kJm8gXHmJ!GgV z5HU$8o|y26coRD>VmS&XoE%rN#s+Llt}>hByK2X37H}@rwo%T(r@lbEScdnx@dN&>R5 zRKoa)zCd)=VumG#r20!to87yh5SC7KvITA!YfjU|U=n@@Ji^z|czl;sloGoEc_CCK zgy(`gI}ezR)mZhHsDUsA>b#m1LJU=o+~RSHd=cCtABb?Ss6B`#dPDhHF*lBd-vOWS zwGb+vwPj(d2s&sDcMw1g2xAlj99C`0M7tCU6@rVwC>v)C2H|&*c=)bRo zP^5-LL2tN|l{l`StD9TxxL`h!OJTrJzbT#0xW(1aJNzTBFrq z$7x7A-;v9c6NF)mA%`;N;G>!Kwj8mD$RK@M5kZbs_w|>^BTRw1tGs_PcjEBkO!qiP zBwP z7k6f)_XB!%uRMArKIDjudYdy8S_{#*L95)Av;xiW-$t znPkJuk}>L&--QpiU=$`?Kj8$HE;R!KCTF;#y~HgTF?zsDKvhDTlAfLB0ph+n`D9fM*P8CBsPADN-SoF>6RCzIjOifQ=x{pz{_w4)1^*Oh*8kt#6TOqhL;rI zNS3JBf&&XXqZB67pau5y;Y!W@Y$cj9BhnGcxg7qO0j!cQQ#e5d>EiFkabit9r>MlQ z=<(yN_cEqPaX~EN=u9o1ryD^FOGL9ldUeTZYNeDI1sS#!r1XnkJ8rs0%fs9X69m#y zES8s~VLJut@U>tNH*LMlMY^=eN(5da&*#^ajMg4}jJMQZDGI^VdJ2)kl~Y<&v<{4U z@xk3V4L!caj^rL~&nfqL*B!AI9DGIZB^;RWDK4sp@L~LV#J9jkaG(_N##+&JSZw9d znDfL8xnlqtGE|ptNq7y}xQCfmmY& z{Us#Da-_d25{aKfC7_Uv1EsjGqM_wPiLK>R&j@m>*4il%byR%G^mkbTVdV(hB0Yjw zJfg*fS~U5nAqpl8eJmcz|C8+w)T#mU;J0`KC~Xu#7f^=DK(F7RuU6GSoK%Mm(|$Mi zu!yg_`Ea;cu^8t`k2@vkaC>mj1~#~GHYbL}kuOr>2ujf9Q)32ML|gJa~2;HZu9 z^~eLKM1-FOS1>+9lefvWBoC+vr5vw}3jFRszF6_3u4w+%)>Oj?IcAtCdVox89k0W6 z7CKm$)dLnq>utSq71P!YF zpfTiN=mUdA)J^@fR_O1w&(?_v0dbl`mM7#w{5F`UQQ$mFoDGN*F%<_HpX0!hJ(fMk zJ(>kzyoZ|{z71g0r86($4f!axFRjrd+uEh9D562i@5%Bziz(rdjt|QsFwbg7I6w_! zo7QwptWI)b>`rM+|vOcW0$JXRxI5XiXLRukJ12uCtN9=^tM z9Ti53kqHrF#97@WWDpmZ7&n)K&Jah@6BS_<;Z($H(?TS}#0YpqKN51ti5saX#D?v1 zT7>_KQ$DzSEj)o?mn)oN`-;3c@ihdSEVdID_%T`JNBk&I zoS)^xVjP~X$E7hb(hR?Y#KPCoqQr6U@HTQJ$#5ZP;_0;%LW5x`-V)l6=aNN~1NcVV z!--Y4UCiW3^O+VyQ>^$X4jgl;pGpI!W{<%;Y?0#*hofr`cTs57IeO*C&ayqYN zix1E}FYsa5>tY)e=kJMf6}<~)R^xOjcmo1qYQlwe5ezg!jG_4WH);_hj-5JUmKgtu zNmegH$M7Fxs6Qv*Dny`)C8}MbgIB}JY@RSkvHU3AP%P6RUjP$%!I+4qAz5eTgjA+_ zPrYS4)hh~xajoG4u#sf)6gPSJm-vcmBpRUvd{|bZaavgvVuKVdB@>BzJ1 zqL5N99=KchW$Zm23{VGVKhTBmcy<1#UhRFcj)@_Ct9 z>jk5;)t{A#rOa=*Cg^;l5dVRBR8@>lA`1N<5;C-j=tK;tG9?hzBz5*th%zyks)n`E zErOna39?LyL|Y|2g=kEf*oVbL`!{Q=%GCb1)*3d*y70zy|67Yy63TDIDLW%eSI3k| zH3t2PPje{V5s%Bn*x2{!8ZkaCC0k?v3Px(>2c0J2%CY-)1;hcrG3={)L(t2^fW=r% z`ZyZW;T~--V7G(?_TnXMaSQj-X3tFCU(OLl8GccFYJ4+Xp~7#4 zpBU1W&)7vrz2@=xytyS_%y$5E!J>XMn0NI8mF@8 z$UqAv8Sc(kCe0}z7wx)qJR+hWAdk4WW4C$yrI6xuK9GuEI7|$E#EumiqA#E`-09m~ zVsw*+Fb?yp2XzoMVWcW{+IU}4;aCv0g3OQ8ArUf@p)wi5jgh{|+u&&ORLs)E3wnx) zV!0h4yj@=@MeWfIKNhjUc)F!Nw1Ah&sCHW_db4O6_=u>Qh~mamaAwqcNf2}1h0d^; zB8$LtExqx5u^S+U?n}N5_Hs83y1BT8A3-h`xpQqhBdBr{iBXn#%bBC!g(M^q+~Spz z7UbljOSQ#;8PV_1da>gwUge=;5y`|{s?xH&fe4I4$8HGNOPJ#pCnu>Z?lx4X0jRw} zKm>xAH^8UU++NNe#3-3U9^FML_=`y!wE#%45Su*I3TU35iUrPMhE2YU9UlQKAd1Hu zQ`zFZa2o1fSe#O17MmtnQB1_3=9yC~e5q`jQDtFR;MW0yVm2zhyEmb@s{>`b<+(BtD-dGbQkv3TiZi(_{M4bR^d1~J|QOBNO& zfPz1zGN5Wl70Zxok|7trFNpkWd#z|=v~5>nLr9F87WpE?P+LgCOiM#6_I8n09>P)@ z+A(5Rm_14SiYg$o5F@obpKl~*5s{8|iQbbZJ;pA2Er&+yrxX?=wdmblNHzMAG#{cy zsJ4Jf)j&}EBU=`>v~r_cHl{&iBxO#31kDjpma6YKE;<*H7dh!S((rZxju#GK7RK-h zqR4(;?KsBvJ7FC7RWTe*EO7>-AokqH5PFPQn*br@g{ZjkN-&x|sG}bVe@Lj*fN^60 z9ky0NFtuYh)*O=+iCLnUy61G1Zp33`+`v~HARKWoIK;CNu}XlYF1Li67LZW0;2-rC z&am=h^N`CQ^;{LNn1aWiobYRyGsUMkU06;PMIdM9H8LF7gk#Ay-a1hX{lp_h4&%K7 zi>7)JJ!zDW*eMnx<&rNWt&$Ig4&(JvrdlakI8s}Bsl<>jile3ju8lA+n3Ac*rxB9G z^H-xJ32Ufif?*W+Dw`8UEaJeW&$SF2m#E|7ap|;33mZ1B(rQs|lgH=d#0dH@ACBna z^(uxGHESED7lu`PS}OM>(vpKw>Lt>M8?kylk9rB#7+rA;aZTSZnV96GCliCCp)P=rC_Z}d@j7x3$HPLZLBh|f=-pDPqW!c6MbF9N0KGpwHQg)|gi9tGgRCVxA=Zh>wDgTPqZ%S%CB zQs-uA=#s@KfpBUOJi{?1RY2lk((tQdyC44Hb~GwgN94c<@Zn=0_n{s41umGZlZPmX4-N#PUeHeC!r@s_m_R5i=o{(sLbIjGpezgnQACdANLA-}e#(=) zRSrw?Rfw|iG-SUdUjwo%yi4l7WD+IcInR_Lsze0;2+VnM6>%TE21f9W!s(p#`lBVy z)u(QJL<5VDOCmiy8=>T5_<!9>4MXY9L@F*;I$wW%NbDk-c)Luj)CDCQ%FAB|+wZN2-tEeHSTm`0# zTn&}dl(zw2suYYi91OKXrV+9fqY#D8k2RPLze9oev6?oCX{GF>afA(sR2PjK-7Pls zsCcf|ZV@8mw`c5lT&nsSK@p*|2#oNnqDHTgFK|;Jyuy*YPs4uSCTnoqL{tK~?Ae{#!Lv-`HtSmG8G|v|i^_W?6o#p5Z8P>KkTVR&N%i z!|YJc1jR6|GRniddUV!5TiXX{75@jng&|nO)ZN{if4p+SGw=5+7!};uO#zFmJUPP% zb6eE-Hoe~2ekkKsCG|6Os3Bx-uXsJCwE8(yyqw4OiO10P%QdLOel;Z3#EB~(jL<^_6`rY2;yU9w47ug*J^1z4Wga`?-ZkwYe{5L1a&iI4|3RPFgwk zX(Iiw`?}tE#=K_BK*Q{Bd46`j(nM)tsa)Qh`-y(l)-q0WTv#SsuhFN_zS>f@PkmVs zr;<5fX+L-#_Z`s2iHrC+)i(t#_21lOJMrlF6%cV9HGx|RUzJ^|Y5SZjWt4^_dE6)4 zR^`68gQzo7ahitxkt*s0Rar0LXQ(!k7!9)L$I7Ya=vQJy9(Wq*daubG zsEbrgsDH}4NT}KF=F-lBOfEJ#n=xDe$z~#fY{H(Rl<4T&uE{f(Bf%Au zV_MMGxF1VA1(_vvGXjCNAI{K*?h4bEk zGyT@0ij9`Ih=~hYF5qGcD7Tr3Y{Z{swWV)ioUbUiM8!%odk}_c^va}=%mBK~?Q#3M zI*R`1$#cvzTc)C5fY;fmlEw^h<`%I36zoJ`M%kZ;~TIob7g4uhOP4^nhC zY0cPXEH>Bx2c%BW-mDmwZYy9kBJ2#FnG!`E1FTS)-tv_vZ@hYE@8?tyGJqEXnTbxB z+9En->jaf?S}WBZ7j45j5JM2&_Mkm&tsM%YHredAqmQ<=X?_AJ=5W2j1uyr(-11qQcdk5uKzZET85=pb47WLl|Y0~HtRF6GnB(ydhBczg3+RPGm^rKSS z?2E%sRKkR>F;_|WHGgf7=ZDK?zgB~6@33=qV&Pbwzloy;!0QB^>Xhm~-u`^Edh_R7 z&-3mV@qF>_*Kxaw&vU>lVi1QpVI5UD=XdUSVAROn=}hE~$f-2g3x+xaYqwSx*P?|| z+8DVtu{nVWD4Ms7Ic`?2YxN=*L zQi;N1Vpw)VVlzy)r`ku+vc5dOCSxs^%YN(h6!{q_`NI}ET4{0e7gbQKh^dU77Th1= zWe6V@tZf$j=%892AT3D0p`j9OuP3H>!?sBf%!}?)&gD;2k zV{q#e-6COKOkLu=#psoImPMYpJMX_f?Y7zd!q1b#H2lIVc}PP@el}==ymS zTAuP@ZaGQ^zhl>-7{c~r@pyXv=jozYN8mXLPZeCd3KMnaf<;Sn;;7NixbSE$z(Xss z<1pmsRnYeQc!Gz&TS5GmYT3ZxQ`+AIJ|w^FKRs0>*)57`Y)oW5mDgY5kPto5yW7k8 z_UO%zgPeS_P(-K4*4&h4a*CxeEokom>lK0GbpqqIeYCT)<%QxY4Bc&!ZL>Z-oe;Yy zXhCXh8-LA98zpmOkreaATQh+xmW8;GLK3gE^>Y?3V06V3Ur;B`HNDX@SBAPO462D{ ztV>TbcAb@#XJI8p392Y!EZOa?d^wK{r5oUeNlJ99dp_FBvW2=eSr>8x6VO?R%uz!n&OBM4eU-G$BETgQMjTDIIO*4&?pHN zjU4*zTS}WuDS$bmWm~4t>o!xqPLPSX{iWF@9Dj)E{Se6CA2IH4@^L)Lr^*LT z6{j8T5nS(Wj1NibN6Xlrn9Z(~SP?TTU?0q@lGCSbBbE(DQGaPX>I#r4>rq$0q{V*! zbn|g#hElqK&SrOuMx`(_U>AsJ4x&LXV2W5TP&OI`PLA}#1c`8LLaM7#0c6^S)D=L{ zXcX-Vz}bk@6=2g=q^!MR7QKD%v#fwJ*lqGZ$QSUDt;|hfYH7JY9Y|( z9_0aSp|Ay!8^xLnTPjv%me4g1>SUqIZ~P?YtW20--(rzmOov!7V>;#P3MgGCERtty zlEJ7GM6w8Niw#Tf13b0QC@;99G@wP`_I1S-YwYYMGBW zQK8oC4t2HwtJFM9rzb@ZJ<$$pd6sfI9$tAUa`4zUDdBK{(Nf(R*;%TA#7e^H2bq*` z`eAJB25Qm_*8_B(lW=-K3YiAp6fqh8JwREgk#3M|qxQmt6=_1k>7gZn%t$!>K#qjd z4>lv=^aGhd1G__eE#W$rI}%PmZIcpCKa35MB&MiM+pcbziY7Jz+RGsmL?$Jio@N=4 zHLQyFQk8`o+Lj|%!Wc-Ub$hVN?<81~NmL0%PHYAl}Lc zocA*|L?u9-Yyb2Y7n2=vXe#@tu7IMVkuIlIA$g_ZEzIN0LwrR*#`uFa_>xUDfv#tu zB289tc+fueD?Nw4@=+iw)hFQTJCN0tv-e1lSuN2n5`obf)S$CSUecu22#hbzh+(|Px=9sV(!A75c zf3b9KqC9dGbJ^~X>0?RB-5C=*$Mtsiyy1n&VY5DC>y5`)Po&@;N%u6|R}4Bgj_G;J zyn9ybtlRzFokN~n5-=$~g}LeeiB8VhpDKIJo0g&eq{&?k}Z_6bR*`!%;(dU##;pAGrO9*KfZ#~B6s-)B;e>8tfL7ZAn zp%i8wine)n=YPtxb6(VOiG-t$XRh44FA8!d0CNOd#DhJY5^v+H7rc}^tWJ5rNMY3z zx0t;`Ic5Fxb7l@`1C1TJGj8>)$X33de988Q$Q>uv zW&KE5+Pb^=xO+Te??;c=Vh~<%*rm*ncKq0_A7pAp@4(gh$33TF&zIFV97TF}KT;lu zN@4Attrq2aD4HX*CT`lDK2g#exnbll;s!Ud{*vo;`WI@W_mjhsi?{c0#r(tzwrX&5 zC_|Ok3l1qc6L>kI-KW*j2K50jNMZex(;UAO%F<0yJ(QO-=oaJC%uk^d)~nXK3OH>Y zt~meK63>7B%~bL6&A&c)fVP?ml7&?!Y&9Y+h?GoW7U@{IQzx%z4-ZmG{?hEW z?klarQp#3jeIVBQG&9S(v^K5rbXf6Z&o{1e>(OdU4xTBYJi)$q5Q60jo=#-rTMG`G z#+gAKCo*`r$)bD+7v9t~y@Oli0xgL;02M2G8n9SxqKv@X~PLA}#1P#iBMy`jJ05YSI>j!c)a{XX4 z8o7QTQ^3LQ&|XWpj^&OdF7)BMbr9cxqcYwkc9t<`YLDh4? zTefVAopq3#Od*c|SXhN$T}(H})9Z?pwwHVV=3tc%s4A|KR7(g&^u~~jZ1G|!2%Rli haEleUr|*;sfz<~w@X@O4OXu?&!PKSwAOENS{s&|f5l8?4 literal 0 HcmV?d00001 diff --git a/package.json b/package.json index 35b0af7..3b98ab3 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,6 @@ "drizzle-kit": "^0.20.14", "eslint": "^8.57.0", "husky": "^9.0.11", - "openapi-generator": "link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator", "tsx": "^4.7.1", "typescript": "^5.4.2", "wrangler": "3.34.2" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml deleted file mode 100644 index 4825c7c..0000000 --- a/pnpm-lock.yaml +++ /dev/null @@ -1,7976 +0,0 @@ -lockfileVersion: "6.0" - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -dependencies: - "@axiomhq/js": - specifier: 1.0.0-rc.2 - version: 1.0.0-rc.2 - "@hono/swagger-ui": - specifier: ^0.2.1 - version: 0.2.1(hono@4.1.0) - "@hono/zod-openapi": - specifier: ^0.9.8 - version: 0.9.8(hono@4.1.0)(zod@3.22.4) - "@libsql/client": - specifier: 0.5.6 - version: 0.5.6 - "@lucia-auth/adapter-sqlite": - specifier: 3.0.1 - version: 3.0.1(@libsql/client@0.5.6)(better-sqlite3@9.4.3)(lucia@3.1.1) - "@scalar/hono-api-reference": - specifier: ^0.4.5 - version: 0.4.5(@scalar/use-codemirror@0.9.0)(hono@4.1.0)(postcss@8.4.35)(typescript@5.4.2)(unified@11.0.4)(vue@3.4.21)(yjs@13.6.14) - "@typescript-eslint/eslint-plugin": - specifier: ^7.2.0 - version: 7.2.0(@typescript-eslint/parser@7.2.0)(eslint@8.57.0)(typescript@5.4.2) - better-sqlite3: - specifier: ^9.4.3 - version: 9.4.3 - dayjs: - specifier: ^1.11.10 - version: 1.11.10 - drizzle-orm: - specifier: ^0.30.2 - version: 0.30.2(@cloudflare/workers-types@4.20240314.0)(@libsql/client@0.5.6)(better-sqlite3@9.4.3) - drizzle-zod: - specifier: ^0.5.1 - version: 0.5.1(drizzle-orm@0.30.2)(zod@3.22.4) - hono: - specifier: ^4.1.0 - version: 4.1.0 - lucia: - specifier: 3.1.1 - version: 3.1.1 - oslo: - specifier: ^1.1.3 - version: 1.1.3 - prettier: - specifier: ^3.2.5 - version: 3.2.5 - zod: - specifier: ^3.22.4 - version: 3.22.4 - zod-error: - specifier: ^1.5.0 - version: 1.5.0 - -devDependencies: - "@asteasolutions/zod-to-openapi": - specifier: ^6.4.0 - version: 6.4.0(zod@3.22.4) - "@cloudflare/workers-types": - specifier: ^4.20240314.0 - version: 4.20240314.0 - "@types/node": - specifier: ^20.11.28 - version: 20.11.28 - dotenv: - specifier: ^16.4.5 - version: 16.4.5 - drizzle-kit: - specifier: ^0.20.14 - version: 0.20.14 - eslint: - specifier: ^8.57.0 - version: 8.57.0 - husky: - specifier: ^9.0.11 - version: 9.0.11 - openapi-generator: - specifier: link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator - version: link:@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator - tsx: - specifier: ^4.7.1 - version: 4.7.1 - typescript: - specifier: ^5.4.2 - version: 5.4.2 - wrangler: - specifier: 3.34.2 - version: 3.34.2(@cloudflare/workers-types@4.20240314.0) - -packages: - /@aashutoshrathi/word-wrap@1.2.6: - resolution: - { - integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==, - } - engines: { node: ">=0.10.0" } - - /@asteasolutions/zod-to-openapi@5.5.0(zod@3.22.4): - resolution: - { - integrity: sha512-d5HwrvM6dOKr3XdeF+DmashGvfEc+1oiEfbscugsiwSTrFtuMa7ETpW9sTNnVgn+hJaz+PRxPQUYD7q9/5dUig==, - } - peerDependencies: - zod: ^3.20.2 - dependencies: - openapi3-ts: 4.2.2 - zod: 3.22.4 - dev: false - - /@asteasolutions/zod-to-openapi@6.4.0(zod@3.22.4): - resolution: - { - integrity: sha512-8cxfF7AHHx2PqnN4Cd8/O8CBu/nVYJP9DpnfVLW3BFb66VJDnqI/CczZnkqMc3SNh6J9GiX7JbJ5T4BSP4HZ2Q==, - } - peerDependencies: - zod: ^3.20.2 - dependencies: - openapi3-ts: 4.2.2 - zod: 3.22.4 - dev: true - - /@axiomhq/js@1.0.0-rc.2: - resolution: - { - integrity: sha512-BQJQNkumdKZgbLGhf3DZb6A8w/31jtX3hWtdv0mMiSE3O5PioeIZNxRTMoWRChxt8TylZrJoVezqrw/ooWPoyQ==, - } - engines: { node: ">=16" } - dependencies: - fetch-retry: 5.0.6 - uuid: 8.3.2 - dev: false - - /@babel/helper-string-parser@7.23.4: - resolution: - { - integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==, - } - engines: { node: ">=6.9.0" } - dev: false - - /@babel/helper-validator-identifier@7.22.20: - resolution: - { - integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==, - } - engines: { node: ">=6.9.0" } - dev: false - - /@babel/parser@7.24.0: - resolution: - { - integrity: sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==, - } - engines: { node: ">=6.0.0" } - hasBin: true - dependencies: - "@babel/types": 7.24.0 - dev: false - - /@babel/runtime@7.24.0: - resolution: - { - integrity: sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==, - } - engines: { node: ">=6.9.0" } - dependencies: - regenerator-runtime: 0.14.1 - dev: false - - /@babel/types@7.24.0: - resolution: - { - integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==, - } - engines: { node: ">=6.9.0" } - dependencies: - "@babel/helper-string-parser": 7.23.4 - "@babel/helper-validator-identifier": 7.22.20 - to-fast-properties: 2.0.0 - dev: false - - /@cloudflare/kv-asset-handler@0.3.1: - resolution: - { - integrity: sha512-lKN2XCfKCmpKb86a1tl4GIwsJYDy9TGuwjhDELLmpKygQhw8X2xR4dusgpC5Tg7q1pB96Eb0rBo81kxSILQMwA==, - } - dependencies: - mime: 3.0.0 - dev: true - - /@cloudflare/workerd-darwin-64@1.20240304.0: - resolution: - { - integrity: sha512-rfHlvsWzkqEEQNvm14AOE/BYHYzB9wxQHCaZZEgwOuTl5KpDcs9La0N0LaDTR78ESumIWOcifVmko2VTrZb7TQ==, - } - engines: { node: ">=16" } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workerd-darwin-arm64@1.20240304.0: - resolution: - { - integrity: sha512-IXGOxHsPdRYfAzcY6IroI1PDvx3hhXf18qFCloHp8Iw5bzLgq/PTjcp10Z/2xedZ2hVlfpHy1eEptsTmi9YeNw==, - } - engines: { node: ">=16" } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workerd-linux-64@1.20240304.0: - resolution: - { - integrity: sha512-G1BEzbw9TFIeMvc425F145IetC7fuH4KOkGhseLq9y/mt5PfDWkghwmXSK+q0BiMwm0XAobtzVlHcEr2u4WlRQ==, - } - engines: { node: ">=16" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workerd-linux-arm64@1.20240304.0: - resolution: - { - integrity: sha512-LLk/d/y77TRu6QOG3CJUI2cD3Ff2lSg0ts6G83bsm9ZK+WKObWFFSPBy9l81m3EnlKFh7RZCzxN4J10kuDaO8w==, - } - engines: { node: ">=16" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workerd-windows-64@1.20240304.0: - resolution: - { - integrity: sha512-I/j6nVpM+WDPg+bYUAiKLkwQsjrXFjpOGHvwYmcM44hnDjgODzk7AbVssEIXnhEO3oupBeuKvffr0lvX0Ngmpw==, - } - engines: { node: ">=16" } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@cloudflare/workers-types@4.20240314.0: - resolution: - { - integrity: sha512-eg2dK/tYSiFvQu3sexjB32WEGi3GEmY6pLRF4nrV9Rwi2F2965o6f6604jQY8whhrmNdEoWErSjhuuUld6xgKQ==, - } - - /@codemirror/autocomplete@6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.0)(@lezer/common@1.2.1): - resolution: - { - integrity: sha512-G2Zm0mXznxz97JhaaOdoEG2cVupn4JjPaS4AcNvZzhOsnnG9YVN68VzfoUw6dYTsIxT6a/cmoFEN47KAWhXaOg==, - } - peerDependencies: - "@codemirror/language": ^6.0.0 - "@codemirror/state": ^6.0.0 - "@codemirror/view": ^6.0.0 - "@lezer/common": ^1.0.0 - dependencies: - "@codemirror/language": 6.10.1 - "@codemirror/state": 6.4.1 - "@codemirror/view": 6.26.0 - "@lezer/common": 1.2.1 - dev: false - - /@codemirror/commands@6.3.3: - resolution: - { - integrity: sha512-dO4hcF0fGT9tu1Pj1D2PvGvxjeGkbC6RGcZw6Qs74TH+Ed1gw98jmUgd2axWvIZEqTeTuFrg1lEB1KV6cK9h1A==, - } - dependencies: - "@codemirror/language": 6.10.1 - "@codemirror/state": 6.4.1 - "@codemirror/view": 6.26.0 - "@lezer/common": 1.2.1 - dev: false - - /@codemirror/lang-css@6.2.1(@codemirror/view@6.26.0): - resolution: - { - integrity: sha512-/UNWDNV5Viwi/1lpr/dIXJNWiwDxpw13I4pTUAsNxZdg6E0mI2kTQb0P2iHczg1Tu+H4EBgJR+hYhKiHKko7qg==, - } - dependencies: - "@codemirror/autocomplete": 6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.0)(@lezer/common@1.2.1) - "@codemirror/language": 6.10.1 - "@codemirror/state": 6.4.1 - "@lezer/common": 1.2.1 - "@lezer/css": 1.1.8 - transitivePeerDependencies: - - "@codemirror/view" - dev: false - - /@codemirror/lang-html@6.4.8: - resolution: - { - integrity: sha512-tE2YK7wDlb9ZpAH6mpTPiYm6rhfdQKVDa5r9IwIFlwwgvVaKsCfuKKZoJGWsmMZIf3FQAuJ5CHMPLymOtg1hXw==, - } - dependencies: - "@codemirror/autocomplete": 6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.0)(@lezer/common@1.2.1) - "@codemirror/lang-css": 6.2.1(@codemirror/view@6.26.0) - "@codemirror/lang-javascript": 6.2.2 - "@codemirror/language": 6.10.1 - "@codemirror/state": 6.4.1 - "@codemirror/view": 6.26.0 - "@lezer/common": 1.2.1 - "@lezer/css": 1.1.8 - "@lezer/html": 1.3.9 - dev: false - - /@codemirror/lang-javascript@6.2.2: - resolution: - { - integrity: sha512-VGQfY+FCc285AhWuwjYxQyUQcYurWlxdKYT4bqwr3Twnd5wP5WSeu52t4tvvuWmljT4EmgEgZCqSieokhtY8hg==, - } - dependencies: - "@codemirror/autocomplete": 6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.0)(@lezer/common@1.2.1) - "@codemirror/language": 6.10.1 - "@codemirror/lint": 6.5.0 - "@codemirror/state": 6.4.1 - "@codemirror/view": 6.26.0 - "@lezer/common": 1.2.1 - "@lezer/javascript": 1.4.13 - dev: false - - /@codemirror/lang-json@6.0.1: - resolution: - { - integrity: sha512-+T1flHdgpqDDlJZ2Lkil/rLiRy684WMLc74xUnjJH48GQdfJo/pudlTRreZmKwzP8/tGdKf83wlbAdOCzlJOGQ==, - } - dependencies: - "@codemirror/language": 6.10.1 - "@lezer/json": 1.0.2 - dev: false - - /@codemirror/lang-yaml@6.0.0(@codemirror/view@6.26.0): - resolution: - { - integrity: sha512-fVPapdX1oYr5HMC5bou1MHscGnNCvOHuhUW6C+V2gfIeIRcughvVfznV0OuUyHy0AdXoBCjOehjzFcmLRumu2Q==, - } - dependencies: - "@codemirror/autocomplete": 6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.0)(@lezer/common@1.2.1) - "@codemirror/language": 6.10.1 - "@codemirror/state": 6.4.1 - "@lezer/common": 1.2.1 - "@lezer/yaml": 1.0.2 - transitivePeerDependencies: - - "@codemirror/view" - dev: false - - /@codemirror/language@6.10.1: - resolution: - { - integrity: sha512-5GrXzrhq6k+gL5fjkAwt90nYDmjlzTIJV8THnxNFtNKWotMIlzzN+CpqxqwXOECnUdOndmSeWntVrVcv5axWRQ==, - } - dependencies: - "@codemirror/state": 6.4.1 - "@codemirror/view": 6.26.0 - "@lezer/common": 1.2.1 - "@lezer/highlight": 1.2.0 - "@lezer/lr": 1.4.0 - style-mod: 4.1.2 - dev: false - - /@codemirror/lint@6.5.0: - resolution: - { - integrity: sha512-+5YyicIaaAZKU8K43IQi8TBy6mF6giGeWAH7N96Z5LC30Wm5JMjqxOYIE9mxwMG1NbhT2mA3l9hA4uuKUM3E5g==, - } - dependencies: - "@codemirror/state": 6.4.1 - "@codemirror/view": 6.26.0 - crelt: 1.0.6 - dev: false - - /@codemirror/search@6.5.6: - resolution: - { - integrity: sha512-rpMgcsh7o0GuCDUXKPvww+muLA1pDJaFrpq/CCHtpQJYz8xopu4D1hPcKRoDD0YlF8gZaqTNIRa4VRBWyhyy7Q==, - } - dependencies: - "@codemirror/state": 6.4.1 - "@codemirror/view": 6.26.0 - crelt: 1.0.6 - dev: false - - /@codemirror/state@6.4.1: - resolution: - { - integrity: sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==, - } - dev: false - - /@codemirror/view@6.26.0: - resolution: - { - integrity: sha512-nSSmzONpqsNzshPOxiKhK203R6BvABepugAe34QfQDbNDslyjkqBuKgrK5ZBvqNXpfxz5iLrlGTmEfhbQyH46A==, - } - dependencies: - "@codemirror/state": 6.4.1 - style-mod: 4.1.2 - w3c-keyname: 2.2.8 - 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 - - /@drizzle-team/studio@0.0.39: - resolution: - { - integrity: sha512-c5Hkm7MmQC2n5qAsKShjQrHoqlfGslB8+qWzsGGZ+2dHMRTNG60UuzalF0h0rvBax5uzPXuGkYLGaQ+TUX3yMw==, - } - dependencies: - superjson: 2.2.1 - dev: true - - /@emnapi/core@0.45.0: - resolution: - { - integrity: sha512-DPWjcUDQkCeEM4VnljEOEcXdAD7pp8zSZsgOujk/LGIwCXWbXJngin+MO4zbH429lzeC3WbYLGjE2MaUOwzpyw==, - } - requiresBuild: true - dependencies: - tslib: 2.6.2 - dev: false - optional: true - - /@emnapi/runtime@0.45.0: - resolution: - { - integrity: sha512-Txumi3td7J4A/xTTwlssKieHKTGl3j4A1tglBx72auZ49YK7ePY6XZricgIg9mnZT4xPfA+UPCUdnhRuEFDL+w==, - } - requiresBuild: true - dependencies: - tslib: 2.6.2 - dev: false - optional: 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.3 - 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/aix-ppc64@0.19.12: - resolution: - { - integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==, - } - engines: { node: ">=12" } - cpu: [ppc64] - os: [aix] - requiresBuild: 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-arm64@0.19.12: - resolution: - { - integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==, - } - engines: { node: ">=12" } - cpu: [arm64] - os: [android] - requiresBuild: true - optional: 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-arm@0.19.12: - resolution: - { - integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==, - } - engines: { node: ">=12" } - cpu: [arm] - os: [android] - requiresBuild: 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/android-x64@0.19.12: - resolution: - { - integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [android] - requiresBuild: 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-arm64@0.19.12: - resolution: - { - integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==, - } - engines: { node: ">=12" } - cpu: [arm64] - os: [darwin] - requiresBuild: 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/darwin-x64@0.19.12: - resolution: - { - integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [darwin] - requiresBuild: 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-arm64@0.19.12: - resolution: - { - integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==, - } - engines: { node: ">=12" } - cpu: [arm64] - os: [freebsd] - requiresBuild: 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/freebsd-x64@0.19.12: - resolution: - { - integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [freebsd] - requiresBuild: 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-arm64@0.19.12: - resolution: - { - integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==, - } - engines: { node: ">=12" } - cpu: [arm64] - os: [linux] - requiresBuild: 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-arm@0.19.12: - resolution: - { - integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==, - } - engines: { node: ">=12" } - cpu: [arm] - os: [linux] - requiresBuild: 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-ia32@0.19.12: - resolution: - { - integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==, - } - engines: { node: ">=12" } - cpu: [ia32] - os: [linux] - requiresBuild: 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-loong64@0.19.12: - resolution: - { - integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==, - } - engines: { node: ">=12" } - cpu: [loong64] - os: [linux] - requiresBuild: 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-mips64el@0.19.12: - resolution: - { - integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==, - } - engines: { node: ">=12" } - cpu: [mips64el] - os: [linux] - requiresBuild: 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-ppc64@0.19.12: - resolution: - { - integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==, - } - engines: { node: ">=12" } - cpu: [ppc64] - os: [linux] - requiresBuild: 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-riscv64@0.19.12: - resolution: - { - integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==, - } - engines: { node: ">=12" } - cpu: [riscv64] - os: [linux] - requiresBuild: 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-s390x@0.19.12: - resolution: - { - integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==, - } - engines: { node: ">=12" } - cpu: [s390x] - os: [linux] - requiresBuild: 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/linux-x64@0.19.12: - resolution: - { - integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [linux] - requiresBuild: 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/netbsd-x64@0.19.12: - resolution: - { - integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [netbsd] - requiresBuild: 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/openbsd-x64@0.19.12: - resolution: - { - integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [openbsd] - requiresBuild: 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/sunos-x64@0.19.12: - resolution: - { - integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [sunos] - requiresBuild: 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-arm64@0.19.12: - resolution: - { - integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==, - } - engines: { node: ">=12" } - cpu: [arm64] - os: [win32] - requiresBuild: 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-ia32@0.19.12: - resolution: - { - integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==, - } - engines: { node: ">=12" } - cpu: [ia32] - os: [win32] - requiresBuild: 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 - - /@esbuild/win32-x64@0.19.12: - resolution: - { - integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==, - } - engines: { node: ">=12" } - cpu: [x64] - os: [win32] - requiresBuild: true - optional: true - - /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): - resolution: - { - integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.57.0 - eslint-visitor-keys: 3.4.3 - - /@eslint-community/regexpp@4.10.0: - resolution: - { - integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==, - } - engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } - - /@eslint/eslintrc@2.1.4: - resolution: - { - integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.1 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - /@eslint/js@8.57.0: - resolution: - { - integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - - /@fastify/busboy@2.1.1: - resolution: - { - integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==, - } - engines: { node: ">=14" } - dev: true - - /@floating-ui/core@1.6.0: - resolution: - { - integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==, - } - dependencies: - "@floating-ui/utils": 0.2.1 - dev: false - - /@floating-ui/dom@1.6.3: - resolution: - { - integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==, - } - dependencies: - "@floating-ui/core": 1.6.0 - "@floating-ui/utils": 0.2.1 - dev: false - - /@floating-ui/utils@0.2.1: - resolution: - { - integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==, - } - dev: false - - /@floating-ui/vue@1.0.6(vue@3.4.21): - resolution: - { - integrity: sha512-EdrOljjkpkkqZnrpqUcPoz9NvHxuTjUtSInh6GMv3+Mcy+giY2cE2pHh9rpacRcZ2eMSCxel9jWkWXTjLmY55w==, - } - dependencies: - "@floating-ui/dom": 1.6.3 - "@floating-ui/utils": 0.2.1 - vue-demi: 0.14.7(vue@3.4.21) - transitivePeerDependencies: - - "@vue/composition-api" - - vue - dev: false - - /@headlessui/vue@1.7.19(vue@3.4.21): - resolution: - { - integrity: sha512-VFjKPybogux/5/QYGSq4zgG/x3RcxId15W8uguAJAjPBxelI23dwjOjTx/mIiMkM/Hd3rzFxcf2aIp56eEWRcA==, - } - engines: { node: ">=10" } - peerDependencies: - vue: ^3.2.0 - dependencies: - "@tanstack/vue-virtual": 3.1.3(vue@3.4.21) - vue: 3.4.21(typescript@5.4.2) - dev: false - - /@hono/swagger-ui@0.2.1(hono@4.1.0): - resolution: - { - integrity: sha512-wBxVMRe3/v8xH4o6icmwztiIq0DG0s7+jHVMHVUAoFFCWEQNL2iskMmQtrhSDtsFmBZUeUFQUaaJ6Ir6DOmHLA==, - } - peerDependencies: - hono: "*" - dependencies: - hono: 4.1.0 - dev: false - - /@hono/zod-openapi@0.9.8(hono@4.1.0)(zod@3.22.4): - resolution: - { - integrity: sha512-NS6lvQEGnsjyQkp+aQjMARREz3WGf19y0+RiiJMVrihWlmKbGaJkPuOWpfFQG6FU9q+FVUyUCryXK+3J07GPAw==, - } - engines: { node: ">=16.0.0" } - peerDependencies: - hono: ">=3.11.3" - zod: 3.* - dependencies: - "@asteasolutions/zod-to-openapi": 5.5.0(zod@3.22.4) - "@hono/zod-validator": 0.1.11(hono@4.1.0)(zod@3.22.4) - hono: 4.1.0 - zod: 3.22.4 - dev: false - - /@hono/zod-validator@0.1.11(hono@4.1.0)(zod@3.22.4): - resolution: - { - integrity: sha512-PQXeHUP0+36qpRt8yfeD7N2jbK3ETlGvSN6dMof/HwUC/APRokQRjpXZm4rrlG71Ft0aWE01+Bm4XejqPie5Uw==, - } - peerDependencies: - hono: ">=3.9.0" - zod: ^3.19.1 - dependencies: - hono: 4.1.0 - zod: 3.22.4 - dev: false - - /@humanwhocodes/config-array@0.11.14: - resolution: - { - integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==, - } - engines: { node: ">=10.10.0" } - dependencies: - "@humanwhocodes/object-schema": 2.0.2 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - /@humanwhocodes/module-importer@1.0.1: - resolution: - { - integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, - } - engines: { node: ">=12.22" } - - /@humanwhocodes/momoa@3.0.1: - resolution: - { - integrity: sha512-Yj2GOwIDb77+A5p4oV2x27edQ7NX86+vKBGWySnfwjKesxn8JCa90Q0Z0eyBBy2G1FulTDrRtfIdmPpIOGhCmQ==, - } - engines: { node: ">=18" } - dev: false - - /@humanwhocodes/object-schema@2.0.2: - resolution: - { - integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==, - } - - /@jridgewell/resolve-uri@3.1.2: - resolution: - { - integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==, - } - engines: { node: ">=6.0.0" } - dev: true - - /@jridgewell/sourcemap-codec@1.4.15: - resolution: - { - integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==, - } - - /@jridgewell/trace-mapping@0.3.9: - resolution: - { - integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==, - } - dependencies: - "@jridgewell/resolve-uri": 3.1.2 - "@jridgewell/sourcemap-codec": 1.4.15 - dev: true - - /@lezer/common@1.2.1: - resolution: - { - integrity: sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==, - } - dev: false - - /@lezer/css@1.1.8: - resolution: - { - integrity: sha512-7JhxupKuMBaWQKjQoLtzhGj83DdnZY9MckEOG5+/iLKNK2ZJqKc6hf6uc0HjwCX7Qlok44jBNqZhHKDhEhZYLA==, - } - dependencies: - "@lezer/common": 1.2.1 - "@lezer/highlight": 1.2.0 - "@lezer/lr": 1.4.0 - dev: false - - /@lezer/highlight@1.2.0: - resolution: - { - integrity: sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==, - } - dependencies: - "@lezer/common": 1.2.1 - dev: false - - /@lezer/html@1.3.9: - resolution: - { - integrity: sha512-MXxeCMPyrcemSLGaTQEZx0dBUH0i+RPl8RN5GwMAzo53nTsd/Unc/t5ZxACeQoyPUM5/GkPLRUs2WliOImzkRA==, - } - dependencies: - "@lezer/common": 1.2.1 - "@lezer/highlight": 1.2.0 - "@lezer/lr": 1.4.0 - dev: false - - /@lezer/javascript@1.4.13: - resolution: - { - integrity: sha512-5IBr8LIO3xJdJH1e9aj/ZNLE4LSbdsx25wFmGRAZsj2zSmwAYjx26JyU/BYOCpRQlu1jcv1z3vy4NB9+UkfRow==, - } - dependencies: - "@lezer/common": 1.2.1 - "@lezer/highlight": 1.2.0 - "@lezer/lr": 1.4.0 - dev: false - - /@lezer/json@1.0.2: - resolution: - { - integrity: sha512-xHT2P4S5eeCYECyKNPhr4cbEL9tc8w83SPwRC373o9uEdrvGKTZoJVAGxpOsZckMlEh9W23Pc72ew918RWQOBQ==, - } - dependencies: - "@lezer/common": 1.2.1 - "@lezer/highlight": 1.2.0 - "@lezer/lr": 1.4.0 - dev: false - - /@lezer/lr@1.4.0: - resolution: - { - integrity: sha512-Wst46p51km8gH0ZUmeNrtpRYmdlRHUpN1DQd3GFAyKANi8WVz8c2jHYTf1CVScFaCjQw1iO3ZZdqGDxQPRErTg==, - } - dependencies: - "@lezer/common": 1.2.1 - dev: false - - /@lezer/yaml@1.0.2: - resolution: - { - integrity: sha512-XCkwuxe+eumJ28nA9e1S6XKsXz9W7V/AG+WBiWOtiIuUpKcZ/bHuvN8bLxSDREIcybSRpEd/jvphh4vgm6Ed2g==, - } - dependencies: - "@lezer/common": 1.2.1 - "@lezer/highlight": 1.2.0 - "@lezer/lr": 1.4.0 - dev: false - - /@libsql/client@0.5.6: - resolution: - { - integrity: sha512-UBjmDoxz75Z2sHdP+ETCROpeLA/77VMesiff8R4UWK1rnaWbh6/YoCLDILMJL3Rh0udQeKxjL8MjXthqohax+g==, - } - dependencies: - "@libsql/core": 0.5.6 - "@libsql/hrana-client": 0.5.6 - js-base64: 3.7.7 - libsql: 0.3.10 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - dev: false - - /@libsql/core@0.5.6: - resolution: - { - integrity: sha512-3vicUAydq6jPth410n4AsHHm1n2psTwvkSf94nfJlSXutGSZsl0updn2N/mJBgqUHkbuFoWZtlMifF0SwBj1xQ==, - } - dependencies: - js-base64: 3.7.7 - dev: false - - /@libsql/darwin-arm64@0.3.10: - resolution: - { - integrity: sha512-RaexEFfPAFogd6dJlqkpCkTxdr6K14Z0286lodIJ8Ny77mWuWyBkWKxf70OYWXXAMxMJFUW+6al1F3/Osf/pTg==, - } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@libsql/darwin-x64@0.3.10: - resolution: - { - integrity: sha512-SNVN6n4qNUdMW1fJMFmx4qn4n5RnXsxjFbczpkzG/V7m/5VeTFt1chhGcrahTHCr3+K6eRJWJUEQHRGqjBwPkw==, - } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@libsql/hrana-client@0.5.6: - resolution: - { - integrity: sha512-mjQoAmejZ1atG+M3YR2ZW+rg6ceBByH/S/h17ZoYZkqbWrvohFhXyz2LFxj++ARMoY9m6w3RJJIRdJdmnEUlFg==, - } - dependencies: - "@libsql/isomorphic-fetch": 0.1.12 - "@libsql/isomorphic-ws": 0.1.5 - js-base64: 3.7.7 - node-fetch: 3.3.2 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - dev: false - - /@libsql/isomorphic-fetch@0.1.12: - resolution: - { - integrity: sha512-MRo4UcmjAGAa3ac56LoD5OE13m2p0lu0VEtZC2NZMcogM/jc5fU9YtMQ3qbPjFJ+u2BBjFZgMPkQaLS1dlMhpg==, - } - dependencies: - "@types/node-fetch": 2.6.11 - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding - dev: false - - /@libsql/isomorphic-ws@0.1.5: - resolution: - { - integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==, - } - dependencies: - "@types/ws": 8.5.10 - ws: 8.16.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: false - - /@libsql/linux-arm64-gnu@0.3.10: - resolution: - { - integrity: sha512-2uXpi9d8qtyIOr7pyG4a88j6YXgemyIHEs2Wbp+PPletlCIPsFS+E7IQHbz8VwTohchOzcokGUm1Bc5QC+A7wg==, - } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@libsql/linux-arm64-musl@0.3.10: - resolution: - { - integrity: sha512-72SN1FUavLvzHddCS861ynSpQndcW5oLGKA3U8CyMfgIZIwJAPc7+48Uj1plW00htXBx4GBpcntFp68KKIx3YQ==, - } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@libsql/linux-x64-gnu@0.3.10: - resolution: - { - integrity: sha512-hXyNqVRi7ONuyWZ1SX6setxL0QaQ7InyS3bHLupsi9s7NpOGD5vcpTaYicJOqmIIm+6kt8vJfmo7ZxlarIHy7Q==, - } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@libsql/linux-x64-musl@0.3.10: - resolution: - { - integrity: sha512-kNmIRxomVwt9S+cLyYS497F/3gXFF4r8wW12YSBQgxG75JYft07AHVd8J7HINg+oqRkLzT0s+mVX5dM6nk68EQ==, - } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@libsql/win32-x64-msvc@0.3.10: - resolution: - { - integrity: sha512-c/6rjdtGULKrJkLgfLobFefObfOtxjXGmCfPxv6pr0epPCeUEssfDbDIeEH9fQUgzogIMWEHwT8so52UJ/iT1Q==, - } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@lucia-auth/adapter-sqlite@3.0.1(@libsql/client@0.5.6)(better-sqlite3@9.4.3)(lucia@3.1.1): - resolution: - { - integrity: sha512-bzr8+HALrbiYMb/+oL1SAnjbgFqlPs/Kj4lO57t/VvbXzmbpQEKk5Nv6hMpvWSkGAR9LbxYeQAtecikpKZVB0w==, - } - peerDependencies: - "@libsql/client": ^0.3.0 - better-sqlite3: 8.x - 9.x - lucia: 3.x - peerDependenciesMeta: - "@libsql/client": - optional: true - better-sqlite3: - optional: true - dependencies: - "@libsql/client": 0.5.6 - better-sqlite3: 9.4.3 - lucia: 3.1.1 - dev: false - - /@napi-rs/wasm-runtime@0.1.1: - resolution: - { - integrity: sha512-ATj9ua659JgrkICjJscaeZdmPr44cb/KFjNWuD0N6pux0SpzaM7+iOuuK11mAnQM2N9q0DT4REu6NkL8ZEhopw==, - } - requiresBuild: true - dependencies: - "@emnapi/core": 0.45.0 - "@emnapi/runtime": 0.45.0 - "@tybys/wasm-util": 0.8.1 - dev: false - optional: true - - /@neon-rs/load@0.0.4: - resolution: - { - integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==, - } - requiresBuild: true - dev: false - - /@node-rs/argon2-android-arm-eabi@1.7.0: - resolution: - { - integrity: sha512-udDqkr5P9E+wYX1SZwAVPdyfYvaF4ry9Tm+R9LkfSHbzWH0uhU6zjIwNRp7m+n4gx691rk+lqqDAIP8RLKwbhg==, - } - engines: { node: ">= 10" } - cpu: [arm] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-android-arm-eabi@1.7.2: - resolution: - { - integrity: sha512-WhW84XOzdR4AOGc4BJvIg5lCRVBL0pXp/PPCe8QCyWw493p7VdNCdYpr2xdtjS/0zImmY85HNB/6zpzjLRTT/A==, - } - engines: { node: ">= 10" } - cpu: [arm] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-android-arm64@1.7.0: - resolution: - { - integrity: sha512-s9j/G30xKUx8WU50WIhF0fIl1EdhBGq0RQ06lEhZ0Gi0ap8lhqbE2Bn5h3/G2D1k0Dx+yjeVVNmt/xOQIRG38A==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-android-arm64@1.7.2: - resolution: - { - integrity: sha512-CdtayHSMIyDuVhSYFirwA757c4foQuyTjpysgFJLHweP9C7uDiBf9WBYij+UyabpaCadJ0wPyK6Vakinvlk4/g==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-darwin-arm64@1.7.0: - resolution: - { - integrity: sha512-ZIz4L6HGOB9U1kW23g+m7anGNuTZ0RuTw0vNp3o+2DWpb8u8rODq6A8tH4JRL79S+Co/Nq608m9uackN2pe0Rw==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-darwin-arm64@1.7.2: - resolution: - { - integrity: sha512-hUOhtgYHTEyzX5sgMZVdXunONOus2HWpWydF5D/RYJ1mZ76FXRnFpQE40DqbzisdPIraKdn40m7JqkPP7wqdyg==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-darwin-x64@1.7.0: - resolution: - { - integrity: sha512-5oi/pxqVhODW/pj1+3zElMTn/YukQeywPHHYDbcAW3KsojFjKySfhcJMd1DjKTc+CHQI+4lOxZzSUzK7mI14Hw==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-darwin-x64@1.7.2: - resolution: - { - integrity: sha512-lfs5HX+t542yUfcv6Aa/NeGD1nUCwyQNgnPEGcik71Ow6V13hkR1bHgmT1u3CHN4fBts0gW+DQEDsq1xlVgkvw==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-freebsd-x64@1.7.0: - resolution: - { - integrity: sha512-Ify08683hA4QVXYoIm5SUWOY5DPIT/CMB0CQT+IdxQAg/F+qp342+lUkeAtD5bvStQuCx/dFO3bnnzoe2clMhA==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-freebsd-x64@1.7.2: - resolution: - { - integrity: sha512-ROoF+4VaCBJUjddrTN1hjuqSl89ppRcjVXJscSPJjWzTlbzFmGGovJvIzUBmCr/Oq3yM1zKHj6MP9oRD5cB+/g==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-arm-gnueabihf@1.7.0: - resolution: - { - integrity: sha512-7DjDZ1h5AUHAtRNjD19RnQatbhL+uuxBASuuXIBu4/w6Dx8n7YPxwTP4MXfsvuRgKuMWiOb/Ub/HJ3kXVCXRkg==, - } - engines: { node: ">= 10" } - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-arm-gnueabihf@1.7.2: - resolution: - { - integrity: sha512-CBSB8KPI8LS74Bcz3dYaa2/khULutz4vSDvFWUERlSLX+mPdDhoZi6UPuUPPF9e01w8AbiK1YCqlLUTm3tIMfw==, - } - engines: { node: ">= 10" } - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-arm64-gnu@1.7.0: - resolution: - { - integrity: sha512-nJDoMP4Y3YcqGswE4DvP080w6O24RmnFEDnL0emdI8Nou17kNYBzP2546Nasx9GCyLzRcYQwZOUjrtUuQ+od2g==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-arm64-gnu@1.7.2: - resolution: - { - integrity: sha512-6LBTug6ZiWFakP3X3Nqs7ZTM03gmcSWX4YvEn20HhhQE5NDrsrw3zNqGj0cJiNzKKIMSDDuj7uGy+ITEfNo4CA==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-arm64-musl@1.7.0: - resolution: - { - integrity: sha512-BKWS8iVconhE3jrb9mj6t1J9vwUqQPpzCbUKxfTGJfc+kNL58F1SXHBoe2cDYGnHrFEHTY0YochzXoAfm4Dm/A==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-arm64-musl@1.7.2: - resolution: - { - integrity: sha512-KjhQ+ZPne29t9VRVeIif7JdKwQba+tM6CBNYBoJB1iON0CUKeqSQtZcHuTj9gkf2SNRG5bsU4ABcfxd0OKsKHg==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-x64-gnu@1.7.0: - resolution: - { - integrity: sha512-EmgqZOlf4Jurk/szW1iTsVISx25bKksVC5uttJDUloTgsAgIGReCpUUO1R24pBhu9ESJa47iv8NSf3yAfGv6jQ==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-x64-gnu@1.7.2: - resolution: - { - integrity: sha512-BQvp+iLtKqomHz4q5t1aKoni9osgvUDU5sZtHAlFm5dRTlGHnympcQVATRE5GHyH9C6MIM9W7P1kqEeCLGPolQ==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-x64-musl@1.7.0: - resolution: - { - integrity: sha512-/o1efYCYIxjfuoRYyBTi2Iy+1iFfhqHCvvVsnjNSgO1xWiWrX0Rrt/xXW5Zsl7vS2Y+yu8PL8KFWRzZhaVxfKA==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-linux-x64-musl@1.7.2: - resolution: - { - integrity: sha512-yXJudpBZQ98g+lWaHn9EzZ5KsAyqRdlpub/K+5NP7gHehb8wzBRIFAejIHAG0fvzQEEc86VOnV2koWIVZxWAvw==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-wasm32-wasi@1.7.0: - resolution: - { - integrity: sha512-Evmk9VcxqnuwQftfAfYEr6YZYSPLzmKUsbFIMep5nTt9PT4XYRFAERj7wNYp+rOcBenF3X4xoB+LhwcOMTNE5w==, - } - engines: { node: ">=14.0.0" } - cpu: [wasm32] - requiresBuild: true - dependencies: - "@emnapi/core": 0.45.0 - "@emnapi/runtime": 0.45.0 - "@tybys/wasm-util": 0.8.1 - memfs-browser: 3.5.10302 - dev: false - optional: true - - /@node-rs/argon2-wasm32-wasi@1.7.2: - resolution: - { - integrity: sha512-diXlVjJZY2GIV8ZDwUqXPhacXsFR0klGSv5D9f+XidwWXK4udtzDhkM/7N/Mb7h1HAWaxZ6IN9spYFjvWH1wqg==, - } - engines: { node: ">=14.0.0" } - cpu: [wasm32] - requiresBuild: true - dependencies: - "@napi-rs/wasm-runtime": 0.1.1 - dev: false - optional: true - - /@node-rs/argon2-win32-arm64-msvc@1.7.0: - resolution: - { - integrity: sha512-qgsU7T004COWWpSA0tppDqDxbPLgg8FaU09krIJ7FBl71Sz8SFO40h7fDIjfbTT5w7u6mcaINMQ5bSHu75PCaA==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-win32-arm64-msvc@1.7.2: - resolution: - { - integrity: sha512-dhIBrY04P9nbmwzBpgERQDmmSu4YBZyeEE32t4TikMz5rQ07iaVC+JpGmtCBZoDIsLDHGC8cikENd3YEqpqIcA==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-win32-ia32-msvc@1.7.0: - resolution: - { - integrity: sha512-JGafwWYQ/HpZ3XSwP4adQ6W41pRvhcdXvpzIWtKvX+17+xEXAe2nmGWM6s27pVkg1iV2ZtoYLRDkOUoGqZkCcg==, - } - engines: { node: ">= 10" } - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-win32-ia32-msvc@1.7.2: - resolution: - { - integrity: sha512-o1tfqr8gyALCzuxBoQfvhxkeYMaw/0H8Gmt7klTYyEIBvEFu7SD5qytXO9Px7t5420nZL/Wy5cflg3IB1s57Pg==, - } - engines: { node: ">= 10" } - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-win32-x64-msvc@1.7.0: - resolution: - { - integrity: sha512-9oq4ShyFakw8AG3mRls0AoCpxBFcimYx7+jvXeAf2OqKNO+mSA6eZ9z7KQeVCi0+SOEUYxMGf5UiGiDb9R6+9Q==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2-win32-x64-msvc@1.7.2: - resolution: - { - integrity: sha512-v0h53XUc7hNgWiWi0qcMcHvj9/kwuItI9NwLK4C+gtzT3UB0cedhfIL8HFMKThMXasy41ZdbpCF2Bi0kJoLNEg==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/argon2@1.7.0: - resolution: - { - integrity: sha512-zfULc+/tmcWcxn+nHkbyY8vP3+MpEqKORbszt4UkpqZgBgDAAIYvuDN/zukfTgdmo6tmJKKVfzigZOPk4LlIog==, - } - engines: { node: ">= 10" } - optionalDependencies: - "@node-rs/argon2-android-arm-eabi": 1.7.0 - "@node-rs/argon2-android-arm64": 1.7.0 - "@node-rs/argon2-darwin-arm64": 1.7.0 - "@node-rs/argon2-darwin-x64": 1.7.0 - "@node-rs/argon2-freebsd-x64": 1.7.0 - "@node-rs/argon2-linux-arm-gnueabihf": 1.7.0 - "@node-rs/argon2-linux-arm64-gnu": 1.7.0 - "@node-rs/argon2-linux-arm64-musl": 1.7.0 - "@node-rs/argon2-linux-x64-gnu": 1.7.0 - "@node-rs/argon2-linux-x64-musl": 1.7.0 - "@node-rs/argon2-wasm32-wasi": 1.7.0 - "@node-rs/argon2-win32-arm64-msvc": 1.7.0 - "@node-rs/argon2-win32-ia32-msvc": 1.7.0 - "@node-rs/argon2-win32-x64-msvc": 1.7.0 - dev: false - - /@node-rs/argon2@1.7.2: - resolution: - { - integrity: sha512-+H6pc3M1vIX9YnG59YW7prHhhpv19P8YyxlXHnnFzTimf2q+kKDF7mGWbhvN9STqIY+P70Patn0Q6qb6Ib5/4g==, - } - engines: { node: ">= 10" } - optionalDependencies: - "@node-rs/argon2-android-arm-eabi": 1.7.2 - "@node-rs/argon2-android-arm64": 1.7.2 - "@node-rs/argon2-darwin-arm64": 1.7.2 - "@node-rs/argon2-darwin-x64": 1.7.2 - "@node-rs/argon2-freebsd-x64": 1.7.2 - "@node-rs/argon2-linux-arm-gnueabihf": 1.7.2 - "@node-rs/argon2-linux-arm64-gnu": 1.7.2 - "@node-rs/argon2-linux-arm64-musl": 1.7.2 - "@node-rs/argon2-linux-x64-gnu": 1.7.2 - "@node-rs/argon2-linux-x64-musl": 1.7.2 - "@node-rs/argon2-wasm32-wasi": 1.7.2 - "@node-rs/argon2-win32-arm64-msvc": 1.7.2 - "@node-rs/argon2-win32-ia32-msvc": 1.7.2 - "@node-rs/argon2-win32-x64-msvc": 1.7.2 - dev: false - - /@node-rs/bcrypt-android-arm-eabi@1.9.0: - resolution: - { - integrity: sha512-nOCFISGtnodGHNiLrG0WYLWr81qQzZKYfmwHc7muUeq+KY0sQXyHOwZk9OuNQAWv/lnntmtbwkwT0QNEmOyLvA==, - } - engines: { node: ">= 10" } - cpu: [arm] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-android-arm-eabi@1.9.2: - resolution: - { - integrity: sha512-er/Q2khwpan9pczvTTqY/DJE4UU65u31xd0NkZlHUTKyB7djRhWfzoGexGx2GN+k831/RR3U8kKE/8QUHeO3hQ==, - } - engines: { node: ">= 10" } - cpu: [arm] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-android-arm64@1.9.0: - resolution: - { - integrity: sha512-+ZrIAtigVmjYkqZQTThHVlz0+TG6D+GDHWhVKvR2DifjtqJ0i+mb9gjo++hN+fWEQdWNGxKCiBBjwgT4EcXd6A==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-android-arm64@1.9.2: - resolution: - { - integrity: sha512-OUYatOEG5vbLbF73q2TC8UqrDO81zUQxnaFD/OAB1hcm6J+ur0zJ8E53c35/DIqkTp7JarPMraC4rouJ2ugN4w==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-darwin-arm64@1.9.0: - resolution: - { - integrity: sha512-CQiS+F9Pa0XozvkXR1g7uXE9QvBOPOplDg0iCCPRYTN9PqA5qYxhwe48G3o+v2UeQceNRrbnEtWuANm7JRqIhw==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-darwin-arm64@1.9.2: - resolution: - { - integrity: sha512-svJKsGbzMAxOB5oluOYneN4YkKUy26WSMgm3KOIhgoX30IeMilj+2jFN/5qrI0oDZ0Iczb3XyL5DuZFtEkdP8A==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-darwin-x64@1.9.0: - resolution: - { - integrity: sha512-4pTKGawYd7sNEjdJ7R/R67uwQH1VvwPZ0SSUMmeNHbxD5QlwAPXdDH11q22uzVXsvNFZ6nGQBg8No5OUGpx6Ug==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-darwin-x64@1.9.2: - resolution: - { - integrity: sha512-9OrySjBi/rWix8NZWD/TrNbNcwMY0pAiMHdL09aJnJ07uPih83GGh1pq4UHCYFCMy7iTX8swOmDlGBUImkOZbg==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-freebsd-x64@1.9.0: - resolution: - { - integrity: sha512-UmWzySX4BJhT/B8xmTru6iFif3h0Rpx3TqxRLCcbgmH43r7k5/9QuhpiyzpvKGpKHJCFNm4F3rC2wghvw5FCIg==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-freebsd-x64@1.9.2: - resolution: - { - integrity: sha512-/djXV71RO6g5L1mI2pVvmp3x3pH7G4uKI3ODG1JBIXoz334oOcCMh40sB0uq0ljP8WEadker01p4T1rJE98fpg==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-arm-gnueabihf@1.9.0: - resolution: - { - integrity: sha512-8qoX4PgBND2cVwsbajoAWo3NwdfJPEXgpCsZQZURz42oMjbGyhhSYbovBCskGU3EBLoC8RA2B1jFWooeYVn5BA==, - } - engines: { node: ">= 10" } - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-arm-gnueabihf@1.9.2: - resolution: - { - integrity: sha512-F7wP950OTAooxEleUN4I2hqryGZK7hi1cSgRF13Wvbc597RFux35KiSxIXUA3mNt2DE7lV2PeceEtCOScaThWQ==, - } - engines: { node: ">= 10" } - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-arm64-gnu@1.9.0: - resolution: - { - integrity: sha512-TuAC6kx0SbcIA4mSEWPi+OCcDjTQUMl213v5gMNlttF+D4ieIZx6pPDGTaMO6M2PDHTeCG0CBzZl0Lu+9b0c7Q==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-arm64-gnu@1.9.2: - resolution: - { - integrity: sha512-MehG+yQ0TgKMgKR1rO4hdvHkVsTM91Cof8qI9EJlS5+7+QSwfFA5O0zGwCkISD7bsyauJ5uJgcByGjpEobAHOg==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-arm64-musl@1.9.0: - resolution: - { - integrity: sha512-/sIvKDABOI8QOEnLD7hIj02BVaNOuCIWBKvxcJOt8+TuwJ6zmY1UI5kSv9d99WbiHjTp97wtAUbZQwauU4b9ew==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-arm64-musl@1.9.2: - resolution: - { - integrity: sha512-PRZTAJjOwKEGsIhmBvfNh81So+wGl4QyCFAt23j+KwBujLStjC0N3YaqtTlWVKG9tcriPtmMYiAQtXWIyIgg/w==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-x64-gnu@1.9.0: - resolution: - { - integrity: sha512-DyyhDHDsLBsCKz1tZ1hLvUZSc1DK0FU0v52jK6IBQxrj24WscSU9zZe7ie/V9kdmA4Ep57BfpWX8Dsa2JxGdgQ==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-x64-gnu@1.9.2: - resolution: - { - integrity: sha512-5WfGO+O1m7nJ55WZ8XDq+ItA98Z4O7sNWsR+1nIj9YGT+Tx5zkQ2RBhpK6oCWZMluuZ0eKQ0FDmyP6K+2NDRIA==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-x64-musl@1.9.0: - resolution: - { - integrity: sha512-duIiuqQ+Lew8ASSAYm6ZRqcmfBGWwsi81XLUwz86a2HR7Qv6V4yc3ZAUQovAikhjCsIqe8C11JlAZSK6+PlXYg==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-linux-x64-musl@1.9.2: - resolution: - { - integrity: sha512-VjCn0388p6PMCVUYHgYmHZrKNc7WwNJRr2WLJsHbQRGDOKbpNL6YolCjQxUchcSPDhzwrq1cIdy4j0fpoXEsdw==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-wasm32-wasi@1.9.0: - resolution: - { - integrity: sha512-ylaGmn9Wjwv/D5lxtawttx3H6Uu2WTTR7lWlRHGT6Ga/MB1Vj4OjSGUW8G8zIVnKuXpGbZ92pgHlt4HUpSLctw==, - } - engines: { node: ">=14.0.0" } - cpu: [wasm32] - requiresBuild: true - dependencies: - "@emnapi/core": 0.45.0 - "@emnapi/runtime": 0.45.0 - "@tybys/wasm-util": 0.8.1 - memfs-browser: 3.5.10302 - dev: false - optional: true - - /@node-rs/bcrypt-wasm32-wasi@1.9.2: - resolution: - { - integrity: sha512-P06aHfMzm9makwU+nM7WA65yQnS1xuqJ8l/6I/LvXjnl+lfB3DtJ2B0CSLtjnUGpUgcHbWl5gEbNnTPxSAirjQ==, - } - engines: { node: ">=14.0.0" } - cpu: [wasm32] - requiresBuild: true - dependencies: - "@napi-rs/wasm-runtime": 0.1.1 - dev: false - optional: true - - /@node-rs/bcrypt-win32-arm64-msvc@1.9.0: - resolution: - { - integrity: sha512-2h86gF7QFyEzODuDFml/Dp1MSJoZjxJ4yyT2Erf4NkwsiA5MqowUhUsorRwZhX6+2CtlGa7orbwi13AKMsYndw==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-win32-arm64-msvc@1.9.2: - resolution: - { - integrity: sha512-Iyo/Q5/eNw27VRd3mLBgh1b9b5fnT3QHTVwxv3Siv/MRAIfJXH/cTOe18qSwYQzNh0ZioW4yemFPYCWSZi7szA==, - } - engines: { node: ">= 10" } - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-win32-ia32-msvc@1.9.0: - resolution: - { - integrity: sha512-kqxalCvhs4FkN0+gWWfa4Bdy2NQAkfiqq/CEf6mNXC13RSV673Ev9V8sRlQyNpCHCNkeXfOT9pgoBdJmMs9muA==, - } - engines: { node: ">= 10" } - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-win32-ia32-msvc@1.9.2: - resolution: - { - integrity: sha512-6LHWMaPylyyHoS5863YpxAACVB8DWCxro5W6pQ4h8WKSgHpJp8Um9jphTdN0A2w45HZjUnfcFuiFFC+TbftjCw==, - } - engines: { node: ">= 10" } - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-win32-x64-msvc@1.9.0: - resolution: - { - integrity: sha512-2y0Tuo6ZAT2Cz8V7DHulSlv1Bip3zbzeXyeur+uR25IRNYXKvI/P99Zl85Fbuu/zzYAZRLLlGTRe6/9IHofe/w==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt-win32-x64-msvc@1.9.2: - resolution: - { - integrity: sha512-vZ9T1MOaYkLO9FTyl28YX0SYJneiYTKNFgM8PUv8nas8xrD+7OzokA0fEtlNp6413T7IKSD/iG9qi8nTWsiyGg==, - } - engines: { node: ">= 10" } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@node-rs/bcrypt@1.9.0: - resolution: - { - integrity: sha512-u2OlIxW264bFUfvbFqDz9HZKFjwe8FHFtn7T/U8mYjPZ7DWYpbUB+/dkW/QgYfMSfR0ejkyuWaBBe0coW7/7ig==, - } - engines: { node: ">= 10" } - optionalDependencies: - "@node-rs/bcrypt-android-arm-eabi": 1.9.0 - "@node-rs/bcrypt-android-arm64": 1.9.0 - "@node-rs/bcrypt-darwin-arm64": 1.9.0 - "@node-rs/bcrypt-darwin-x64": 1.9.0 - "@node-rs/bcrypt-freebsd-x64": 1.9.0 - "@node-rs/bcrypt-linux-arm-gnueabihf": 1.9.0 - "@node-rs/bcrypt-linux-arm64-gnu": 1.9.0 - "@node-rs/bcrypt-linux-arm64-musl": 1.9.0 - "@node-rs/bcrypt-linux-x64-gnu": 1.9.0 - "@node-rs/bcrypt-linux-x64-musl": 1.9.0 - "@node-rs/bcrypt-wasm32-wasi": 1.9.0 - "@node-rs/bcrypt-win32-arm64-msvc": 1.9.0 - "@node-rs/bcrypt-win32-ia32-msvc": 1.9.0 - "@node-rs/bcrypt-win32-x64-msvc": 1.9.0 - dev: false - - /@node-rs/bcrypt@1.9.2: - resolution: - { - integrity: sha512-FKUo9iCSIti+ldwoOlY1ztyIFhZxEgT7jZ/UCt/9bg1rLmNdbQQD2JKIMImDCqmTWuLPY4ZF4Q5MyOMIfDCd8Q==, - } - engines: { node: ">= 10" } - optionalDependencies: - "@node-rs/bcrypt-android-arm-eabi": 1.9.2 - "@node-rs/bcrypt-android-arm64": 1.9.2 - "@node-rs/bcrypt-darwin-arm64": 1.9.2 - "@node-rs/bcrypt-darwin-x64": 1.9.2 - "@node-rs/bcrypt-freebsd-x64": 1.9.2 - "@node-rs/bcrypt-linux-arm-gnueabihf": 1.9.2 - "@node-rs/bcrypt-linux-arm64-gnu": 1.9.2 - "@node-rs/bcrypt-linux-arm64-musl": 1.9.2 - "@node-rs/bcrypt-linux-x64-gnu": 1.9.2 - "@node-rs/bcrypt-linux-x64-musl": 1.9.2 - "@node-rs/bcrypt-wasm32-wasi": 1.9.2 - "@node-rs/bcrypt-win32-arm64-msvc": 1.9.2 - "@node-rs/bcrypt-win32-ia32-msvc": 1.9.2 - "@node-rs/bcrypt-win32-x64-msvc": 1.9.2 - dev: false - - /@nodelib/fs.scandir@2.1.5: - resolution: - { - integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, - } - engines: { node: ">= 8" } - dependencies: - "@nodelib/fs.stat": 2.0.5 - run-parallel: 1.2.0 - - /@nodelib/fs.stat@2.0.5: - resolution: - { - integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, - } - engines: { node: ">= 8" } - - /@nodelib/fs.walk@1.2.8: - resolution: - { - integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, - } - engines: { node: ">= 8" } - dependencies: - "@nodelib/fs.scandir": 2.1.5 - fastq: 1.17.1 - - /@replit/codemirror-css-color-picker@6.1.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.0): - resolution: - { - integrity: sha512-lkjtzOy8+C4VhuHegUfaqxsIsLVVW+FCRpKE+IOU4bX3Fp6Yo3sHS1PCHy1QlOtmL+Y+08Yb+giKuMXLyYzjew==, - } - peerDependencies: - "@codemirror/language": ^6.0.0 - "@codemirror/state": ^6.0.0 - "@codemirror/view": ^6.0.0 - dependencies: - "@codemirror/language": 6.10.1 - "@codemirror/state": 6.4.1 - "@codemirror/view": 6.26.0 - dev: false - - /@rollup/rollup-android-arm-eabi@4.13.0: - resolution: - { - integrity: sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==, - } - cpu: [arm] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@rollup/rollup-android-arm64@4.13.0: - resolution: - { - integrity: sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==, - } - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@rollup/rollup-darwin-arm64@4.13.0: - resolution: - { - integrity: sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==, - } - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@rollup/rollup-darwin-x64@4.13.0: - resolution: - { - integrity: sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==, - } - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@rollup/rollup-linux-arm-gnueabihf@4.13.0: - resolution: - { - integrity: sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==, - } - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@rollup/rollup-linux-arm64-gnu@4.13.0: - resolution: - { - integrity: sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==, - } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@rollup/rollup-linux-arm64-musl@4.13.0: - resolution: - { - integrity: sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==, - } - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@rollup/rollup-linux-riscv64-gnu@4.13.0: - resolution: - { - integrity: sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==, - } - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@rollup/rollup-linux-x64-gnu@4.13.0: - resolution: - { - integrity: sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==, - } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@rollup/rollup-linux-x64-musl@4.13.0: - resolution: - { - integrity: sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==, - } - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@rollup/rollup-win32-arm64-msvc@4.13.0: - resolution: - { - integrity: sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==, - } - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@rollup/rollup-win32-ia32-msvc@4.13.0: - resolution: - { - integrity: sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==, - } - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@rollup/rollup-win32-x64-msvc@4.13.0: - resolution: - { - integrity: sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==, - } - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@scalar/api-client@1.0.2(@scalar/oas-utils@0.1.0)(typescript@5.4.2)(vue@3.4.21)(yjs@13.6.14): - resolution: - { - integrity: sha512-oKZWS1yXSEyv5A1Dn8SPps3qUu+SkEMV/2h7OUecjHFCmUEL6ndJn4RP+O/47435G0SkbllJrl34I/7tJ//Nzw==, - } - engines: { node: ">=18" } - peerDependencies: - "@scalar/oas-utils": 0.1.0 - vue: ^3.3.0 - dependencies: - "@headlessui/vue": 1.7.19(vue@3.4.21) - "@scalar/components": 0.4.4(typescript@5.4.2)(vue@3.4.21) - "@scalar/oas-utils": 0.1.0 - "@scalar/themes": 0.6.4(vue@3.4.21) - "@scalar/use-codemirror": 0.9.0(vue@3.4.21)(yjs@13.6.14) - "@scalar/use-modal": 0.2.9(@headlessui/vue@1.7.19)(vue@3.4.21) - "@vueuse/core": 10.9.0(vue@3.4.21) - axios: 1.6.8 - content-type: 1.0.5 - nanoid: 5.0.6 - pretty-bytes: 6.1.1 - pretty-ms: 8.0.0 - vue: 3.4.21(typescript@5.4.2) - transitivePeerDependencies: - - "@vue/composition-api" - - debug - - typescript - - yjs - dev: false - - /@scalar/api-reference@1.19.5(@scalar/use-codemirror@0.9.0)(postcss@8.4.35)(typescript@5.4.2)(unified@11.0.4)(vue@3.4.21)(yjs@13.6.14): - resolution: - { - integrity: sha512-DsBDRiGUlFnZdzJCLIHzZ392YYF6KXI2ElFV6chVCFMndNrdQwj7K+y/T0ivHH0jOZ89yKGqAcEJnA69O3A9Ow==, - } - engines: { node: ">=18" } - peerDependencies: - unified: ^11.0.0 - vue: ^3.3.0 - dependencies: - "@floating-ui/vue": 1.0.6(vue@3.4.21) - "@headlessui/vue": 1.7.19(vue@3.4.21) - "@scalar/api-client": 1.0.2(@scalar/oas-utils@0.1.0)(typescript@5.4.2)(vue@3.4.21)(yjs@13.6.14) - "@scalar/components": 0.4.4(typescript@5.4.2)(vue@3.4.21) - "@scalar/oas-utils": 0.1.0 - "@scalar/openapi-parser": 0.3.2 - "@scalar/snippetz": 0.1.5 - "@scalar/swagger-editor": 1.0.2(@scalar/components@0.4.4)(@scalar/oas-utils@0.1.0)(@scalar/themes@0.6.4)(@scalar/use-codemirror@0.9.0)(@vueuse/core@10.9.0)(vue@3.4.21) - "@scalar/themes": 0.6.4(vue@3.4.21) - "@scalar/use-modal": 0.2.9(@headlessui/vue@1.7.19)(vue@3.4.21) - "@scalar/use-tooltip": 0.5.12(vue@3.4.21) - "@unhead/schema": 1.8.20 - "@vcarl/remark-headings": 0.1.0 - "@vueuse/core": 10.9.0(vue@3.4.21) - "@xmldom/xmldom": 0.8.10 - axios: 1.6.8 - fuse.js: 6.6.2 - github-slugger: 2.0.0 - httpsnippet-lite: 3.0.5 - postcss-nested: 6.0.1(postcss@8.4.35) - rehype-external-links: 3.0.0 - rehype-format: 5.0.0 - rehype-highlight: 7.0.0 - rehype-raw: 7.0.0 - rehype-sanitize: 6.0.0 - rehype-stringify: 10.0.0 - remark-gfm: 4.0.0 - remark-parse: 11.0.0 - remark-rehype: 11.1.0 - remark-stringify: 11.0.0 - unhead: 1.8.20 - unified: 11.0.4 - vue: 3.4.21(typescript@5.4.2) - vue-sonner: 1.1.2 - transitivePeerDependencies: - - "@scalar/use-codemirror" - - "@vue/composition-api" - - debug - - less - - lightningcss - - postcss - - sass - - stylus - - sugarss - - supports-color - - terser - - typescript - - yjs - dev: false - - /@scalar/components@0.4.4(typescript@5.4.2)(vue@3.4.21): - resolution: - { - integrity: sha512-2q04mW1vY9/YH3r2Yp2wSHexf7YcoT5DBx3ThWZfoE2JDbRg58hiXqHwp3ePqLuIe/n6cnpcL29EWPQa12wFUA==, - } - engines: { node: ">=18" } - peerDependencies: - vue: ^3.3.0 - dependencies: - "@headlessui/vue": 1.7.19(vue@3.4.21) - "@vueuse/core": 10.9.0(vue@3.4.21) - "@xmldom/xmldom": 0.8.10 - class-variance-authority: 0.7.0 - cva: 1.0.0-beta.1(typescript@5.4.2) - nanoid: 5.0.6 - prismjs: 1.29.0 - tailwind-merge: 2.2.1 - vue: 3.4.21(typescript@5.4.2) - transitivePeerDependencies: - - "@vue/composition-api" - - typescript - dev: false - - /@scalar/hono-api-reference@0.4.5(@scalar/use-codemirror@0.9.0)(hono@4.1.0)(postcss@8.4.35)(typescript@5.4.2)(unified@11.0.4)(vue@3.4.21)(yjs@13.6.14): - resolution: - { - integrity: sha512-ckBwnP7tyyn11/f1miuZohChgKBDm9C5ngov4r4Ezn7+v0pP6xyLsDUvQPf8JQ72BdgrM9xqVqr3CKMkKhNo4w==, - } - engines: { node: ">=18" } - peerDependencies: - hono: ^3.0.0 || ^4.0.0 - dependencies: - "@scalar/api-reference": 1.19.5(@scalar/use-codemirror@0.9.0)(postcss@8.4.35)(typescript@5.4.2)(unified@11.0.4)(vue@3.4.21)(yjs@13.6.14) - hono: 4.1.0 - transitivePeerDependencies: - - "@scalar/use-codemirror" - - "@vue/composition-api" - - debug - - less - - lightningcss - - postcss - - sass - - stylus - - sugarss - - supports-color - - terser - - typescript - - unified - - vue - - yjs - dev: false - - /@scalar/oas-utils@0.1.0: - resolution: - { - integrity: sha512-IVL1OYGK+qXHo0DURGqoiY6J88HBP9tE1GpUfs5nT9bcNr5A/b1qDlzXz4Xuxctl4gdn1GmIWzVXFhj1Cq8ydA==, - } - engines: { node: ">=18" } - dependencies: - yaml: 2.4.1 - dev: false - - /@scalar/openapi-parser@0.3.2: - resolution: - { - integrity: sha512-o38wF1rKqCc7R0zFMta5rPTiY4cWwVcZPJkV1OCcnPsF2eE79uPkhYU2j/kdocJXVwMqqAe9a6+0o4R8YjgPVw==, - } - engines: { node: ">=18" } - dependencies: - "@humanwhocodes/momoa": 3.0.1 - "@types/node": 20.11.28 - ajv: 8.12.0 - ajv-draft-04: 1.0.0(ajv@8.12.0) - ajv-formats: 2.1.1(ajv@8.12.0) - js-yaml: 4.1.0 - jsonpointer: 5.0.1 - leven: 4.0.0 - openapi-types: 12.1.3 - vite: 5.1.6(@types/node@20.11.28) - yaml: 2.4.1 - transitivePeerDependencies: - - less - - lightningcss - - sass - - stylus - - sugarss - - terser - dev: false - - /@scalar/snippetz-core@0.1.3: - resolution: - { - integrity: sha512-pHRi23VhxMddKMo/2zEnaRcc1QUTEva5H2tryuq+tER7imGWf2O09IGexiV9vY/8jzYh0QVl/2dlJUmnF9Ww5w==, - } - dependencies: - "@types/har-format": 1.2.15 - dev: false - - /@scalar/snippetz-plugin-js-fetch@0.1.0: - resolution: - { - integrity: sha512-lliZSIqtbZawm+XXmMXEpCcpIQprRwJXNUxLAvryB9AGm9qTu0dIfsvjJPjiTAfRew5+sgebNQ8cEF4esMnnlQ==, - } - dependencies: - "@scalar/snippetz-core": 0.1.3 - dev: false - - /@scalar/snippetz-plugin-node-fetch@0.1.1: - resolution: - { - integrity: sha512-U6kqtQi1xAME8AWgJmEVAFA/uhcJ1RUNKtyVDjupd77LQu2FEOPwqI5dPSltxvnJdYrUjLhDcfIa8EO8uO43zw==, - } - dependencies: - "@scalar/snippetz-core": 0.1.3 - dev: false - - /@scalar/snippetz-plugin-node-undici@0.1.5: - resolution: - { - integrity: sha512-ctOvCK3/Ta7ibuZjhV85M/gBuKURpeqgkWQHDFJubTHgUhQZudn60N5MY3ZtjoLFY7z9DCC5UenNYINveCdKJw==, - } - dependencies: - "@scalar/snippetz-core": 0.1.3 - dev: false - - /@scalar/snippetz@0.1.5: - resolution: - { - integrity: sha512-jHU8/KOO9vKbQFhsruflKugekgAtDm5GIAKZCYN+XtzqQ3jPGAjzkEZMXXvRDS2YPtFSzH2vzfqNMLB+q2Zupw==, - } - dependencies: - "@scalar/snippetz-core": 0.1.3 - "@scalar/snippetz-plugin-js-fetch": 0.1.0 - "@scalar/snippetz-plugin-node-fetch": 0.1.1 - "@scalar/snippetz-plugin-node-undici": 0.1.5 - dev: false - - /@scalar/swagger-editor@1.0.2(@scalar/components@0.4.4)(@scalar/oas-utils@0.1.0)(@scalar/themes@0.6.4)(@scalar/use-codemirror@0.9.0)(@vueuse/core@10.9.0)(vue@3.4.21): - resolution: - { - integrity: sha512-G7bIMyeiplnd8+v0MWzu0G89KJCLdy1R3E629MP2oJQRt833VZtMMWDkznLr9wbQM+XAYhMQf0RRf01OtTcWrw==, - } - engines: { node: ">=18" } - peerDependencies: - "@scalar/components": 0.4.4 - "@scalar/oas-utils": 0.1.0 - "@scalar/themes": 0.6.4 - "@scalar/use-codemirror": 0.9.0 - "@vueuse/core": ^10.4.1 - vue: ^3.3.0 - dependencies: - "@scalar/components": 0.4.4(typescript@5.4.2)(vue@3.4.21) - "@scalar/oas-utils": 0.1.0 - "@scalar/themes": 0.6.4(vue@3.4.21) - "@scalar/use-codemirror": 0.9.0(vue@3.4.21)(yjs@13.6.14) - "@vueuse/core": 10.9.0(vue@3.4.21) - vue: 3.4.21(typescript@5.4.2) - dev: false - - /@scalar/themes@0.6.4(vue@3.4.21): - resolution: - { - integrity: sha512-MNa0kaqKacSl9G8FKe3RNjIqYkBDLqOJBQVvn+DjelviVdfFAhfTf/o1KftQKJ1j+RIB1iXY+/JmSKEWA+RvgA==, - } - engines: { node: ">=18" } - peerDependencies: - vue: ^3.3.0 - dependencies: - vue: 3.4.21(typescript@5.4.2) - dev: false - - /@scalar/use-codemirror@0.9.0(vue@3.4.21)(yjs@13.6.14): - resolution: - { - integrity: sha512-1qtov9NeLcEKEc4XFXBmo4FsZkuDFxr/qlxBkVYsJlpnujeWBZ+MnfUJQUskwD095kza5GQdjPt6oIEA3r7oxg==, - } - engines: { node: ">=18" } - peerDependencies: - vue: ^3.3.0 - yjs: ^13.6.0 - dependencies: - "@codemirror/autocomplete": 6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.0)(@lezer/common@1.2.1) - "@codemirror/lang-css": 6.2.1(@codemirror/view@6.26.0) - "@codemirror/lang-html": 6.4.8 - "@codemirror/lang-json": 6.0.1 - "@codemirror/lang-yaml": 6.0.0(@codemirror/view@6.26.0) - "@codemirror/language": 6.10.1 - "@codemirror/state": 6.4.1 - "@codemirror/view": 6.26.0 - "@lezer/common": 1.2.1 - "@lezer/highlight": 1.2.0 - "@lezer/lr": 1.4.0 - "@replit/codemirror-css-color-picker": 6.1.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.0) - "@uiw/codemirror-themes": 4.21.24(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.0) - codemirror: 6.0.1(@lezer/common@1.2.1) - vue: 3.4.21(typescript@5.4.2) - y-codemirror.next: 0.3.2(@codemirror/state@6.4.1)(@codemirror/view@6.26.0)(yjs@13.6.14) - yjs: 13.6.14 - dev: false - - /@scalar/use-modal@0.2.9(@headlessui/vue@1.7.19)(vue@3.4.21): - resolution: - { - integrity: sha512-h+Je4bjtF38kQsgfvAZ4TanhJaqHxL3nk7jM8tBYQmKYHCMyFo7oELglu830f0wNrO0TmhDrrQem745Z5uyb2Q==, - } - engines: { node: ">=18" } - peerDependencies: - "@headlessui/vue": ^1.7.0 - vue: ^3.3.0 - dependencies: - "@headlessui/vue": 1.7.19(vue@3.4.21) - vue: 3.4.21(typescript@5.4.2) - dev: false - - /@scalar/use-tooltip@0.5.12(vue@3.4.21): - resolution: - { - integrity: sha512-pDKyGtysxxOcyWE/D5FyRODE1Nqb3LO5cc2X9m7JwjClTqeD3VuKnA3sC4UTcGNKUIDTqVXGyjnHeXoC10t6OA==, - } - engines: { node: ">=18" } - peerDependencies: - vue: ^3.3.0 - dependencies: - vue: 3.4.21(typescript@5.4.2) - dev: false - - /@tanstack/virtual-core@3.1.3: - resolution: - { - integrity: sha512-Y5B4EYyv1j9V8LzeAoOVeTg0LI7Fo5InYKgAjkY1Pu9GjtUwX/EKxNcU7ng3sKr99WEf+bPTcktAeybyMOYo+g==, - } - dev: false - - /@tanstack/vue-virtual@3.1.3(vue@3.4.21): - resolution: - { - integrity: sha512-OoRCSgp8Bc85Te3pg4OHFUukbWZeB25/O5rNd7MgMtrYIfJjNOaicZeJcvwqK6lDVTMpzohWUMVK/loqR1H8ig==, - } - peerDependencies: - vue: ^2.7.0 || ^3.0.0 - dependencies: - "@tanstack/virtual-core": 3.1.3 - vue: 3.4.21(typescript@5.4.2) - dev: false - - /@tybys/wasm-util@0.8.1: - resolution: - { - integrity: sha512-GSsTwyBl4pIzsxAY5wroZdyQKyhXk0d8PCRZtrSZ2WEB1cBdrp2EgGBwHOGCZtIIPun/DL3+AykCv+J6fyRH4Q==, - } - requiresBuild: true - dependencies: - tslib: 2.6.2 - dev: false - optional: true - - /@types/debug@4.1.12: - resolution: - { - integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==, - } - dependencies: - "@types/ms": 0.7.34 - dev: false - - /@types/estree@1.0.5: - resolution: - { - integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==, - } - dev: false - - /@types/har-format@1.2.15: - resolution: - { - integrity: sha512-RpQH4rXLuvTXKR0zqHq3go0RVXYv/YVqv4TnPH95VbwUxZdQlK1EtcMvQvMpDngHbt13Csh9Z4qT9AbkiQH5BA==, - } - dev: false - - /@types/hast@3.0.4: - resolution: - { - integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==, - } - dependencies: - "@types/unist": 3.0.2 - dev: false - - /@types/json-schema@7.0.15: - resolution: - { - integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, - } - dev: false - - /@types/mdast@3.0.15: - resolution: - { - integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==, - } - dependencies: - "@types/unist": 2.0.10 - dev: false - - /@types/mdast@4.0.3: - resolution: - { - integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==, - } - dependencies: - "@types/unist": 3.0.2 - dev: false - - /@types/ms@0.7.34: - resolution: - { - integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==, - } - dev: false - - /@types/node-fetch@2.6.11: - resolution: - { - integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==, - } - dependencies: - "@types/node": 20.11.28 - form-data: 4.0.0 - dev: false - - /@types/node-forge@1.3.11: - resolution: - { - integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==, - } - dependencies: - "@types/node": 20.11.28 - dev: true - - /@types/node@20.11.28: - resolution: - { - integrity: sha512-M/GPWVS2wLkSkNHVeLkrF2fD5Lx5UC4PxA0uZcKc6QqbIQUJyW1jVjueJYi1z8n0I5PxYrtpnPnWglE+y9A0KA==, - } - dependencies: - undici-types: 5.26.5 - - /@types/semver@7.5.8: - resolution: - { - integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==, - } - dev: false - - /@types/unist@2.0.10: - resolution: - { - integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==, - } - dev: false - - /@types/unist@3.0.2: - resolution: - { - integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==, - } - dev: false - - /@types/web-bluetooth@0.0.20: - resolution: - { - integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==, - } - dev: false - - /@types/ws@8.5.10: - resolution: - { - integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==, - } - dependencies: - "@types/node": 20.11.28 - dev: false - - /@typescript-eslint/eslint-plugin@7.2.0(@typescript-eslint/parser@7.2.0)(eslint@8.57.0)(typescript@5.4.2): - resolution: - { - integrity: sha512-mdekAHOqS9UjlmyF/LSs6AIEvfceV749GFxoBAjwAv0nkevfKHWQFDMcBZWUiIC5ft6ePWivXoS36aKQ0Cy3sw==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - peerDependencies: - "@typescript-eslint/parser": ^7.0.0 - eslint: ^8.56.0 - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - dependencies: - "@eslint-community/regexpp": 4.10.0 - "@typescript-eslint/parser": 7.2.0(eslint@8.57.0)(typescript@5.4.2) - "@typescript-eslint/scope-manager": 7.2.0 - "@typescript-eslint/type-utils": 7.2.0(eslint@8.57.0)(typescript@5.4.2) - "@typescript-eslint/utils": 7.2.0(eslint@8.57.0)(typescript@5.4.2) - "@typescript-eslint/visitor-keys": 7.2.0 - debug: 4.3.4 - eslint: 8.57.0 - graphemer: 1.4.0 - ignore: 5.3.1 - natural-compare: 1.4.0 - semver: 7.6.0 - ts-api-utils: 1.3.0(typescript@5.4.2) - typescript: 5.4.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.2): - resolution: - { - integrity: sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - peerDependencies: - eslint: ^8.56.0 - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - dependencies: - "@typescript-eslint/scope-manager": 7.2.0 - "@typescript-eslint/types": 7.2.0 - "@typescript-eslint/typescript-estree": 7.2.0(typescript@5.4.2) - "@typescript-eslint/visitor-keys": 7.2.0 - debug: 4.3.4 - eslint: 8.57.0 - typescript: 5.4.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/scope-manager@7.2.0: - resolution: - { - integrity: sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - dependencies: - "@typescript-eslint/types": 7.2.0 - "@typescript-eslint/visitor-keys": 7.2.0 - dev: false - - /@typescript-eslint/type-utils@7.2.0(eslint@8.57.0)(typescript@5.4.2): - resolution: - { - integrity: sha512-xHi51adBHo9O9330J8GQYQwrKBqbIPJGZZVQTHHmy200hvkLZFWJIFtAG/7IYTWUyun6DE6w5InDReePJYJlJA==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - peerDependencies: - eslint: ^8.56.0 - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - dependencies: - "@typescript-eslint/typescript-estree": 7.2.0(typescript@5.4.2) - "@typescript-eslint/utils": 7.2.0(eslint@8.57.0)(typescript@5.4.2) - debug: 4.3.4 - eslint: 8.57.0 - ts-api-utils: 1.3.0(typescript@5.4.2) - typescript: 5.4.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/types@7.2.0: - resolution: - { - integrity: sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - dev: false - - /@typescript-eslint/typescript-estree@7.2.0(typescript@5.4.2): - resolution: - { - integrity: sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - peerDependencies: - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - dependencies: - "@typescript-eslint/types": 7.2.0 - "@typescript-eslint/visitor-keys": 7.2.0 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.3 - semver: 7.6.0 - ts-api-utils: 1.3.0(typescript@5.4.2) - typescript: 5.4.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@typescript-eslint/utils@7.2.0(eslint@8.57.0)(typescript@5.4.2): - resolution: - { - integrity: sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - peerDependencies: - eslint: ^8.56.0 - dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.57.0) - "@types/json-schema": 7.0.15 - "@types/semver": 7.5.8 - "@typescript-eslint/scope-manager": 7.2.0 - "@typescript-eslint/types": 7.2.0 - "@typescript-eslint/typescript-estree": 7.2.0(typescript@5.4.2) - eslint: 8.57.0 - semver: 7.6.0 - transitivePeerDependencies: - - supports-color - - typescript - dev: false - - /@typescript-eslint/visitor-keys@7.2.0: - resolution: - { - integrity: sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==, - } - engines: { node: ^16.0.0 || >=18.0.0 } - dependencies: - "@typescript-eslint/types": 7.2.0 - eslint-visitor-keys: 3.4.3 - dev: false - - /@uiw/codemirror-themes@4.21.24(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.0): - resolution: - { - integrity: sha512-InY24KWP8YArDBACWHKFZ6ZU+WCvRHf3ZB2cCVxMVN35P1ANUmRzpAP2ernZQ5OIriL1/A/kXgD0Zg3Y65PNgg==, - } - peerDependencies: - "@codemirror/language": ">=6.0.0" - "@codemirror/state": ">=6.0.0" - "@codemirror/view": ">=6.0.0" - dependencies: - "@codemirror/language": 6.10.1 - "@codemirror/state": 6.4.1 - "@codemirror/view": 6.26.0 - dev: false - - /@ungap/structured-clone@1.2.0: - resolution: - { - integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==, - } - - /@unhead/dom@1.8.20: - resolution: - { - integrity: sha512-TXRQSVbqBOQc02m3wxgj55m93U8a3WBHV9xJi2zVX/iHEJgeQbZMJ+rV0YJkHy2OHAC0MfjVQA5NDLaVwtromw==, - } - dependencies: - "@unhead/schema": 1.8.20 - "@unhead/shared": 1.8.20 - dev: false - - /@unhead/schema@1.8.20: - resolution: - { - integrity: sha512-n0e5jsKino8JTHc4wpr4l8MXXIrj0muYYAEVa0WSYkIVnMiBr1Ik3l6elhCr4fdSyJ3M2DQQleea/oZCr11XCw==, - } - dependencies: - hookable: 5.5.3 - zhead: 2.2.4 - dev: false - - /@unhead/shared@1.8.20: - resolution: - { - integrity: sha512-J0fdtavcMtXcG0g9jmVW03toqfr8A0G7k+Q6jdpwuUPhWk/vhfZn3aiRV+F8LlU91c/AbGWDv8T1MrtMQbb0Sg==, - } - dependencies: - "@unhead/schema": 1.8.20 - dev: false - - /@vcarl/remark-headings@0.1.0: - resolution: - { - integrity: sha512-ffQxJUcapJ9Bk+fiGN49YJ9RaYMibrSTSezB1Fcrtu+0YSZxA3bsaLlIv1u/4sjPIeW/BKrs4xtMT3l3P9Ba5Q==, - } - dependencies: - mdast-util-to-string: 3.2.0 - unist-util-visit: 4.1.2 - dev: false - - /@vue/compiler-core@3.4.21: - resolution: - { - integrity: sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==, - } - dependencies: - "@babel/parser": 7.24.0 - "@vue/shared": 3.4.21 - entities: 4.5.0 - estree-walker: 2.0.2 - source-map-js: 1.0.2 - dev: false - - /@vue/compiler-dom@3.4.21: - resolution: - { - integrity: sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==, - } - dependencies: - "@vue/compiler-core": 3.4.21 - "@vue/shared": 3.4.21 - dev: false - - /@vue/compiler-sfc@3.4.21: - resolution: - { - integrity: sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==, - } - dependencies: - "@babel/parser": 7.24.0 - "@vue/compiler-core": 3.4.21 - "@vue/compiler-dom": 3.4.21 - "@vue/compiler-ssr": 3.4.21 - "@vue/shared": 3.4.21 - estree-walker: 2.0.2 - magic-string: 0.30.8 - postcss: 8.4.35 - source-map-js: 1.0.2 - dev: false - - /@vue/compiler-ssr@3.4.21: - resolution: - { - integrity: sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==, - } - dependencies: - "@vue/compiler-dom": 3.4.21 - "@vue/shared": 3.4.21 - dev: false - - /@vue/reactivity@3.4.21: - resolution: - { - integrity: sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==, - } - dependencies: - "@vue/shared": 3.4.21 - dev: false - - /@vue/runtime-core@3.4.21: - resolution: - { - integrity: sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==, - } - dependencies: - "@vue/reactivity": 3.4.21 - "@vue/shared": 3.4.21 - dev: false - - /@vue/runtime-dom@3.4.21: - resolution: - { - integrity: sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==, - } - dependencies: - "@vue/runtime-core": 3.4.21 - "@vue/shared": 3.4.21 - csstype: 3.1.3 - dev: false - - /@vue/server-renderer@3.4.21(vue@3.4.21): - resolution: - { - integrity: sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==, - } - peerDependencies: - vue: 3.4.21 - dependencies: - "@vue/compiler-ssr": 3.4.21 - "@vue/shared": 3.4.21 - vue: 3.4.21(typescript@5.4.2) - dev: false - - /@vue/shared@3.4.21: - resolution: - { - integrity: sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==, - } - dev: false - - /@vueuse/core@10.9.0(vue@3.4.21): - resolution: - { - integrity: sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==, - } - dependencies: - "@types/web-bluetooth": 0.0.20 - "@vueuse/metadata": 10.9.0 - "@vueuse/shared": 10.9.0(vue@3.4.21) - vue-demi: 0.14.7(vue@3.4.21) - transitivePeerDependencies: - - "@vue/composition-api" - - vue - dev: false - - /@vueuse/metadata@10.9.0: - resolution: - { - integrity: sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA==, - } - dev: false - - /@vueuse/shared@10.9.0(vue@3.4.21): - resolution: - { - integrity: sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw==, - } - dependencies: - vue-demi: 0.14.7(vue@3.4.21) - transitivePeerDependencies: - - "@vue/composition-api" - - vue - dev: false - - /@xmldom/xmldom@0.8.10: - resolution: - { - integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==, - } - engines: { node: ">=10.0.0" } - dev: false - - /acorn-jsx@5.3.2(acorn@8.11.3): - resolution: - { - integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, - } - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.11.3 - - /acorn-walk@8.3.2: - resolution: - { - integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==, - } - engines: { node: ">=0.4.0" } - dev: true - - /acorn@8.11.3: - resolution: - { - integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==, - } - engines: { node: ">=0.4.0" } - hasBin: true - - /ajv-draft-04@1.0.0(ajv@8.12.0): - resolution: - { - integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==, - } - peerDependencies: - ajv: ^8.5.0 - peerDependenciesMeta: - ajv: - optional: true - dependencies: - ajv: 8.12.0 - dev: false - - /ajv-formats@2.1.1(ajv@8.12.0): - resolution: - { - integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==, - } - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - dependencies: - ajv: 8.12.0 - dev: false - - /ajv@6.12.6: - resolution: - { - integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, - } - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - - /ajv@8.12.0: - resolution: - { - integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==, - } - dependencies: - fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - uri-js: 4.4.1 - dev: false - - /ansi-regex@5.0.1: - resolution: - { - integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, - } - engines: { node: ">=8" } - - /ansi-styles@4.3.0: - resolution: - { - integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, - } - engines: { node: ">=8" } - dependencies: - color-convert: 2.0.1 - - /anymatch@3.1.3: - resolution: - { - integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, - } - engines: { node: ">= 8" } - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - - /argparse@2.0.1: - resolution: - { - integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, - } - - /array-union@2.1.0: - resolution: - { - integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, - } - engines: { node: ">=8" } - dev: false - - /as-table@1.0.55: - resolution: - { - integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==, - } - dependencies: - printable-characters: 1.0.42 - dev: true - - /asynckit@0.4.0: - resolution: - { - integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, - } - dev: false - - /axios@1.6.8: - resolution: - { - integrity: sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==, - } - dependencies: - follow-redirects: 1.15.6 - form-data: 4.0.0 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - dev: false - - /bail@2.0.2: - resolution: - { - integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==, - } - dev: false - - /balanced-match@1.0.2: - resolution: - { - integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, - } - - /base64-js@1.5.1: - resolution: - { - integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, - } - dev: false - - /better-sqlite3@9.4.3: - resolution: - { - integrity: sha512-ud0bTmD9O3uWJGuXDltyj3R47Nz0OHX8iqPOT5PMspGqlu/qQFn+5S2eFBUCrySpavTjFXbi4EgrfVvPAHlImw==, - } - requiresBuild: true - dependencies: - bindings: 1.5.0 - prebuild-install: 7.1.2 - dev: false - - /binary-extensions@2.3.0: - resolution: - { - integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==, - } - 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 - - /brace-expansion@1.1.11: - resolution: - { - integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, - } - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - /brace-expansion@2.0.1: - resolution: - { - integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, - } - dependencies: - balanced-match: 1.0.2 - - /braces@3.0.2: - resolution: - { - integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==, - } - engines: { node: ">=8" } - dependencies: - fill-range: 7.0.1 - - /buffer-from@1.1.2: - resolution: - { - integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, - } - dev: true - - /buffer@5.7.1: - resolution: - { - integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, - } - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: false - - /callsites@3.1.0: - resolution: - { - integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, - } - engines: { node: ">=6" } - - /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 - - /ccount@2.0.1: - resolution: - { - integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==, - } - dev: false - - /chalk@4.1.2: - resolution: - { - integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, - } - engines: { node: ">=10" } - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - /chalk@5.3.0: - resolution: - { - integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==, - } - engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } - dev: true - - /character-entities-html4@2.1.0: - resolution: - { - integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==, - } - dev: false - - /character-entities-legacy@3.0.0: - resolution: - { - integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==, - } - dev: false - - /character-entities@2.0.2: - resolution: - { - integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==, - } - dev: false - - /chokidar@3.6.0: - resolution: - { - integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==, - } - engines: { node: ">= 8.10.0" } - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /chownr@1.1.4: - resolution: - { - integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==, - } - dev: false - - /class-variance-authority@0.7.0: - resolution: - { - integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==, - } - dependencies: - clsx: 2.0.0 - dev: false - - /cli-color@2.0.4: - resolution: - { - integrity: sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==, - } - engines: { node: ">=0.10" } - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - es6-iterator: 2.0.3 - memoizee: 0.4.15 - timers-ext: 0.1.7 - dev: true - - /clsx@2.0.0: - resolution: - { - integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==, - } - engines: { node: ">=6" } - dev: false - - /codemirror@6.0.1(@lezer/common@1.2.1): - resolution: - { - integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==, - } - dependencies: - "@codemirror/autocomplete": 6.15.0(@codemirror/language@6.10.1)(@codemirror/state@6.4.1)(@codemirror/view@6.26.0)(@lezer/common@1.2.1) - "@codemirror/commands": 6.3.3 - "@codemirror/language": 6.10.1 - "@codemirror/lint": 6.5.0 - "@codemirror/search": 6.5.6 - "@codemirror/state": 6.4.1 - "@codemirror/view": 6.26.0 - transitivePeerDependencies: - - "@lezer/common" - dev: false - - /color-convert@2.0.1: - resolution: - { - integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, - } - engines: { node: ">=7.0.0" } - dependencies: - color-name: 1.1.4 - - /color-name@1.1.4: - resolution: - { - integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, - } - - /combined-stream@1.0.8: - resolution: - { - integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, - } - engines: { node: ">= 0.8" } - dependencies: - delayed-stream: 1.0.0 - dev: false - - /comma-separated-tokens@2.0.3: - resolution: - { - integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==, - } - dev: false - - /commander@9.5.0: - resolution: - { - integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==, - } - engines: { node: ^12.20.0 || >=14 } - dev: true - - /concat-map@0.0.1: - resolution: - { - integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, - } - - /content-type@1.0.5: - resolution: - { - integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==, - } - engines: { node: ">= 0.6" } - dev: false - - /cookie@0.5.0: - resolution: - { - integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==, - } - engines: { node: ">= 0.6" } - dev: true - - /copy-anything@3.0.5: - resolution: - { - integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==, - } - engines: { node: ">=12.13" } - dependencies: - is-what: 4.1.16 - dev: true - - /crelt@1.0.6: - resolution: - { - integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==, - } - dev: false - - /cross-spawn@7.0.3: - resolution: - { - integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, - } - engines: { node: ">= 8" } - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - /cssesc@3.0.0: - resolution: - { - integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==, - } - engines: { node: ">=4" } - hasBin: true - dev: false - - /csstype@3.1.3: - resolution: - { - integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==, - } - dev: false - - /cva@1.0.0-beta.1(typescript@5.4.2): - resolution: - { - integrity: sha512-gznFqTgERU9q4wg7jfgqtt34+RUt9S5t0xDAAEuDwQEAXEgjdDkKXpLLNjwSxsB4Ln/sqWJEH7yhE8Ny0mxd0w==, - } - peerDependencies: - typescript: ">= 4.5.5 < 6" - peerDependenciesMeta: - typescript: - optional: true - dependencies: - clsx: 2.0.0 - typescript: 5.4.2 - dev: false - - /d@1.0.2: - resolution: - { - integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==, - } - engines: { node: ">=0.12" } - dependencies: - es5-ext: 0.10.64 - type: 2.7.2 - dev: true - - /data-uri-to-buffer@2.0.2: - resolution: - { - integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==, - } - dev: true - - /data-uri-to-buffer@4.0.1: - resolution: - { - integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==, - } - engines: { node: ">= 12" } - dev: false - - /dayjs@1.11.10: - resolution: - { - integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==, - } - dev: false - - /debug@4.3.4: - resolution: - { - integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, - } - engines: { node: ">=6.0" } - peerDependencies: - supports-color: "*" - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - - /decode-named-character-reference@1.0.2: - resolution: - { - integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==, - } - dependencies: - character-entities: 2.0.2 - dev: false - - /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==, - } - - /delayed-stream@1.0.0: - resolution: - { - integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, - } - engines: { node: ">=0.4.0" } - dev: false - - /dequal@2.0.3: - resolution: - { - integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==, - } - engines: { node: ">=6" } - dev: false - - /detect-libc@2.0.2: - resolution: - { - integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==, - } - engines: { node: ">=8" } - dev: false - - /devlop@1.1.0: - resolution: - { - integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==, - } - dependencies: - dequal: 2.0.3 - dev: false - - /difflib@0.2.4: - resolution: - { - integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==, - } - dependencies: - heap: 0.2.7 - dev: true - - /dir-glob@3.0.1: - resolution: - { - integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, - } - engines: { node: ">=8" } - dependencies: - path-type: 4.0.0 - dev: false - - /doctrine@3.0.0: - resolution: - { - integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==, - } - engines: { node: ">=6.0.0" } - dependencies: - esutils: 2.0.3 - - /dotenv@16.4.5: - resolution: - { - integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==, - } - engines: { node: ">=12" } - dev: true - - /dreamopt@0.8.0: - resolution: - { - integrity: sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==, - } - engines: { node: ">=0.4.0" } - dependencies: - wordwrap: 1.0.0 - dev: true - - /drizzle-kit@0.20.14: - resolution: - { - integrity: sha512-0fHv3YIEaUcSVPSGyaaBfOi9bmpajjhbJNdPsRMIUvYdLVxBu9eGjH8mRc3Qk7HVmEidFc/lhG1YyJhoXrn5yA==, - } - hasBin: true - dependencies: - "@drizzle-team/studio": 0.0.39 - "@esbuild-kit/esm-loader": 2.6.5 - camelcase: 7.0.1 - chalk: 5.3.0 - commander: 9.5.0 - env-paths: 3.0.0 - esbuild: 0.19.12 - esbuild-register: 3.5.0(esbuild@0.19.12) - glob: 8.1.0 - hanji: 0.0.5 - json-diff: 0.9.0 - minimatch: 7.4.6 - semver: 7.6.0 - zod: 3.22.4 - transitivePeerDependencies: - - supports-color - dev: true - - /drizzle-orm@0.30.2(@cloudflare/workers-types@4.20240314.0)(@libsql/client@0.5.6)(better-sqlite3@9.4.3): - resolution: - { - integrity: sha512-DNd3djg03o+WxZX3pGD8YD+qrWT8gbrbhaZ2W0PVb6yH4rtM/VTB92cTGvumcRh7SSd2KfV0NWYDB70BHIXQTg==, - } - peerDependencies: - "@aws-sdk/client-rds-data": ">=3" - "@cloudflare/workers-types": ">=3" - "@libsql/client": "*" - "@neondatabase/serverless": ">=0.1" - "@op-engineering/op-sqlite": ">=2" - "@opentelemetry/api": ^1.4.1 - "@planetscale/database": ">=1" - "@types/better-sqlite3": "*" - "@types/pg": "*" - "@types/react": ">=18" - "@types/sql.js": "*" - "@vercel/postgres": "*" - better-sqlite3: ">=7" - bun-types: "*" - expo-sqlite: ">=13.2.0" - knex: "*" - kysely: "*" - mysql2: ">=2" - pg: ">=8" - postgres: ">=3" - react: ">=18" - 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 - "@op-engineering/op-sqlite": - optional: true - "@opentelemetry/api": - optional: true - "@planetscale/database": - optional: true - "@types/better-sqlite3": - optional: true - "@types/pg": - optional: true - "@types/react": - optional: true - "@types/sql.js": - optional: true - "@vercel/postgres": - optional: true - better-sqlite3: - optional: true - bun-types: - optional: true - expo-sqlite: - optional: true - knex: - optional: true - kysely: - optional: true - mysql2: - optional: true - pg: - optional: true - postgres: - optional: true - react: - optional: true - sql.js: - optional: true - sqlite3: - optional: true - dependencies: - "@cloudflare/workers-types": 4.20240314.0 - "@libsql/client": 0.5.6 - better-sqlite3: 9.4.3 - dev: false - - /drizzle-zod@0.5.1(drizzle-orm@0.30.2)(zod@3.22.4): - resolution: - { - integrity: sha512-C/8bvzUH/zSnVfwdSibOgFjLhtDtbKYmkbPbUCq46QZyZCH6kODIMSOgZ8R7rVjoI+tCj3k06MRJMDqsIeoS4A==, - } - peerDependencies: - drizzle-orm: ">=0.23.13" - zod: "*" - dependencies: - drizzle-orm: 0.30.2(@cloudflare/workers-types@4.20240314.0)(@libsql/client@0.5.6)(better-sqlite3@9.4.3) - zod: 3.22.4 - dev: false - - /end-of-stream@1.4.4: - resolution: - { - integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, - } - dependencies: - once: 1.4.0 - dev: false - - /entities@4.5.0: - resolution: - { - integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==, - } - engines: { node: ">=0.12" } - dev: false - - /env-paths@3.0.0: - resolution: - { - integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - dev: true - - /es5-ext@0.10.64: - resolution: - { - integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==, - } - engines: { node: ">=0.10" } - requiresBuild: true - dependencies: - es6-iterator: 2.0.3 - es6-symbol: 3.1.4 - esniff: 2.0.1 - next-tick: 1.1.0 - dev: true - - /es6-iterator@2.0.3: - resolution: - { - integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==, - } - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - es6-symbol: 3.1.4 - dev: true - - /es6-symbol@3.1.4: - resolution: - { - integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==, - } - engines: { node: ">=0.12" } - dependencies: - d: 1.0.2 - ext: 1.7.0 - dev: true - - /es6-weak-map@2.0.3: - resolution: - { - integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==, - } - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - es6-iterator: 2.0.3 - es6-symbol: 3.1.4 - dev: true - - /esbuild-register@3.5.0(esbuild@0.19.12): - resolution: - { - integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==, - } - peerDependencies: - esbuild: ">=0.12 <1" - dependencies: - debug: 4.3.4 - esbuild: 0.19.12 - 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 - - /esbuild@0.19.12: - resolution: - { - integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==, - } - engines: { node: ">=12" } - hasBin: true - requiresBuild: true - optionalDependencies: - "@esbuild/aix-ppc64": 0.19.12 - "@esbuild/android-arm": 0.19.12 - "@esbuild/android-arm64": 0.19.12 - "@esbuild/android-x64": 0.19.12 - "@esbuild/darwin-arm64": 0.19.12 - "@esbuild/darwin-x64": 0.19.12 - "@esbuild/freebsd-arm64": 0.19.12 - "@esbuild/freebsd-x64": 0.19.12 - "@esbuild/linux-arm": 0.19.12 - "@esbuild/linux-arm64": 0.19.12 - "@esbuild/linux-ia32": 0.19.12 - "@esbuild/linux-loong64": 0.19.12 - "@esbuild/linux-mips64el": 0.19.12 - "@esbuild/linux-ppc64": 0.19.12 - "@esbuild/linux-riscv64": 0.19.12 - "@esbuild/linux-s390x": 0.19.12 - "@esbuild/linux-x64": 0.19.12 - "@esbuild/netbsd-x64": 0.19.12 - "@esbuild/openbsd-x64": 0.19.12 - "@esbuild/sunos-x64": 0.19.12 - "@esbuild/win32-arm64": 0.19.12 - "@esbuild/win32-ia32": 0.19.12 - "@esbuild/win32-x64": 0.19.12 - - /escape-string-regexp@4.0.0: - resolution: - { - integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, - } - engines: { node: ">=10" } - - /escape-string-regexp@5.0.0: - resolution: - { - integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==, - } - engines: { node: ">=12" } - dev: false - - /eslint-scope@7.2.2: - resolution: - { - integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - /eslint-visitor-keys@3.4.3: - resolution: - { - integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - - /eslint@8.57.0: - resolution: - { - integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - hasBin: true - dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.57.0) - "@eslint-community/regexpp": 4.10.0 - "@eslint/eslintrc": 2.1.4 - "@eslint/js": 8.57.0 - "@humanwhocodes/config-array": 0.11.14 - "@humanwhocodes/module-importer": 1.0.1 - "@nodelib/fs.walk": 1.2.8 - "@ungap/structured-clone": 1.2.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 - ignore: 5.3.1 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.3 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - - /esniff@2.0.1: - resolution: - { - integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==, - } - engines: { node: ">=0.10" } - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - event-emitter: 0.3.5 - type: 2.7.2 - dev: true - - /espree@9.6.1: - resolution: - { - integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) - eslint-visitor-keys: 3.4.3 - - /esquery@1.5.0: - resolution: - { - integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==, - } - engines: { node: ">=0.10" } - dependencies: - estraverse: 5.3.0 - - /esrecurse@4.3.0: - resolution: - { - integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, - } - engines: { node: ">=4.0" } - dependencies: - estraverse: 5.3.0 - - /estraverse@5.3.0: - resolution: - { - integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, - } - engines: { node: ">=4.0" } - - /estree-walker@0.6.1: - resolution: - { - integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==, - } - dev: true - - /estree-walker@2.0.2: - resolution: - { - integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==, - } - dev: false - - /esutils@2.0.3: - resolution: - { - integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, - } - engines: { node: ">=0.10.0" } - - /event-emitter@0.3.5: - resolution: - { - integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==, - } - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - dev: true - - /exit-hook@2.2.1: - resolution: - { - integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==, - } - engines: { node: ">=6" } - dev: true - - /expand-template@2.0.3: - resolution: - { - integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==, - } - engines: { node: ">=6" } - dev: false - - /ext@1.7.0: - resolution: - { - integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==, - } - dependencies: - type: 2.7.2 - dev: true - - /extend@3.0.2: - resolution: - { - integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==, - } - dev: false - - /fast-deep-equal@3.1.3: - resolution: - { - integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, - } - - /fast-glob@3.3.2: - resolution: - { - integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==, - } - engines: { node: ">=8.6.0" } - dependencies: - "@nodelib/fs.stat": 2.0.5 - "@nodelib/fs.walk": 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: false - - /fast-json-stable-stringify@2.1.0: - resolution: - { - integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, - } - - /fast-levenshtein@2.0.6: - resolution: - { - integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, - } - - /fastq@1.17.1: - resolution: - { - integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==, - } - dependencies: - reusify: 1.0.4 - - /fetch-blob@3.2.0: - resolution: - { - integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==, - } - engines: { node: ^12.20 || >= 14.13 } - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 3.3.3 - dev: false - - /fetch-retry@5.0.6: - resolution: - { - integrity: sha512-3yurQZ2hD9VISAhJJP9bpYFNQrHHBXE2JxxjY5aLEcDi46RmAzJE2OC9FAde0yis5ElW0jTTzs0zfg/Cca4XqQ==, - } - dev: false - - /file-entry-cache@6.0.1: - resolution: - { - integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==, - } - engines: { node: ^10.12.0 || >=12.0.0 } - dependencies: - flat-cache: 3.2.0 - - /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" } - dependencies: - to-regex-range: 5.0.1 - - /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 - - /flat-cache@3.2.0: - resolution: - { - integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==, - } - engines: { node: ^10.12.0 || >=12.0.0 } - dependencies: - flatted: 3.3.1 - keyv: 4.5.4 - rimraf: 3.0.2 - - /flatted@3.3.1: - resolution: - { - integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==, - } - - /follow-redirects@1.15.6: - resolution: - { - integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==, - } - engines: { node: ">=4.0" } - peerDependencies: - debug: "*" - peerDependenciesMeta: - debug: - optional: true - dev: false - - /form-data@4.0.0: - resolution: - { - integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==, - } - engines: { node: ">= 6" } - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: false - - /formdata-node@4.4.1: - resolution: - { - integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==, - } - engines: { node: ">= 12.20" } - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 4.0.0-beta.3 - dev: false - - /formdata-polyfill@4.0.10: - resolution: - { - integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==, - } - engines: { node: ">=12.20.0" } - dependencies: - fetch-blob: 3.2.0 - dev: false - - /fs-constants@1.0.0: - resolution: - { - integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==, - } - dev: false - - /fs-monkey@1.0.5: - resolution: - { - integrity: sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==, - } - requiresBuild: true - dev: false - optional: true - - /fs.realpath@1.0.0: - resolution: - { - integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, - } - - /fsevents@2.3.3: - resolution: - { - integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, - } - engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } - os: [darwin] - requiresBuild: true - optional: true - - /function-bind@1.1.2: - resolution: - { - integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, - } - dev: true - - /fuse.js@6.6.2: - resolution: - { - integrity: sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==, - } - engines: { node: ">=10" } - dev: false - - /get-own-enumerable-property-symbols@3.0.2: - resolution: - { - integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==, - } - dev: false - - /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-tsconfig@4.7.3: - resolution: - { - integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==, - } - dependencies: - resolve-pkg-maps: 1.0.0 - dev: true - - /github-from-package@0.0.0: - resolution: - { - integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==, - } - dev: false - - /github-slugger@2.0.0: - resolution: - { - integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==, - } - dev: false - - /glob-parent@5.1.2: - resolution: - { - integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, - } - engines: { node: ">= 6" } - dependencies: - is-glob: 4.0.3 - - /glob-parent@6.0.2: - resolution: - { - integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, - } - engines: { node: ">=10.13.0" } - dependencies: - is-glob: 4.0.3 - - /glob-to-regexp@0.4.1: - resolution: - { - integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==, - } - dev: true - - /glob@7.2.3: - resolution: - { - integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, - } - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - /glob@8.1.0: - resolution: - { - integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==, - } - engines: { node: ">=12" } - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - dev: true - - /globals@13.24.0: - resolution: - { - integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==, - } - engines: { node: ">=8" } - dependencies: - type-fest: 0.20.2 - - /globby@11.1.0: - resolution: - { - integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, - } - engines: { node: ">=10" } - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.1 - merge2: 1.4.1 - slash: 3.0.0 - dev: false - - /graphemer@1.4.0: - resolution: - { - integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, - } - - /hanji@0.0.5: - resolution: - { - integrity: sha512-Abxw1Lq+TnYiL4BueXqMau222fPSPMFtya8HdpWsz/xVAhifXou71mPh/kY2+08RgFcVccjG3uZHs6K5HAe3zw==, - } - dependencies: - lodash.throttle: 4.1.1 - sisteransi: 1.0.5 - dev: true - - /has-flag@4.0.0: - resolution: - { - integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, - } - engines: { node: ">=8" } - - /hasown@2.0.2: - resolution: - { - integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==, - } - engines: { node: ">= 0.4" } - dependencies: - function-bind: 1.1.2 - dev: true - - /hast-util-embedded@3.0.0: - resolution: - { - integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==, - } - dependencies: - "@types/hast": 3.0.4 - hast-util-is-element: 3.0.0 - dev: false - - /hast-util-from-parse5@8.0.1: - resolution: - { - integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==, - } - dependencies: - "@types/hast": 3.0.4 - "@types/unist": 3.0.2 - devlop: 1.1.0 - hastscript: 8.0.0 - property-information: 6.4.1 - vfile: 6.0.1 - vfile-location: 5.0.2 - web-namespaces: 2.0.1 - dev: false - - /hast-util-has-property@3.0.0: - resolution: - { - integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==, - } - dependencies: - "@types/hast": 3.0.4 - dev: false - - /hast-util-is-body-ok-link@3.0.0: - resolution: - { - integrity: sha512-VFHY5bo2nY8HiV6nir2ynmEB1XkxzuUffhEGeVx7orbu/B1KaGyeGgMZldvMVx5xWrDlLLG/kQ6YkJAMkBEx0w==, - } - dependencies: - "@types/hast": 3.0.4 - dev: false - - /hast-util-is-element@3.0.0: - resolution: - { - integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==, - } - dependencies: - "@types/hast": 3.0.4 - dev: false - - /hast-util-parse-selector@4.0.0: - resolution: - { - integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==, - } - dependencies: - "@types/hast": 3.0.4 - dev: false - - /hast-util-phrasing@3.0.1: - resolution: - { - integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==, - } - dependencies: - "@types/hast": 3.0.4 - hast-util-embedded: 3.0.0 - hast-util-has-property: 3.0.0 - hast-util-is-body-ok-link: 3.0.0 - hast-util-is-element: 3.0.0 - dev: false - - /hast-util-raw@9.0.2: - resolution: - { - integrity: sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA==, - } - dependencies: - "@types/hast": 3.0.4 - "@types/unist": 3.0.2 - "@ungap/structured-clone": 1.2.0 - hast-util-from-parse5: 8.0.1 - hast-util-to-parse5: 8.0.0 - html-void-elements: 3.0.0 - mdast-util-to-hast: 13.1.0 - parse5: 7.1.2 - unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.1 - web-namespaces: 2.0.1 - zwitch: 2.0.4 - dev: false - - /hast-util-sanitize@5.0.1: - resolution: - { - integrity: sha512-IGrgWLuip4O2nq5CugXy4GI2V8kx4sFVy5Hd4vF7AR2gxS0N9s7nEAVUyeMtZKZvzrxVsHt73XdTsno1tClIkQ==, - } - dependencies: - "@types/hast": 3.0.4 - "@ungap/structured-clone": 1.2.0 - unist-util-position: 5.0.0 - dev: false - - /hast-util-to-html@9.0.0: - resolution: - { - integrity: sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw==, - } - dependencies: - "@types/hast": 3.0.4 - "@types/unist": 3.0.2 - ccount: 2.0.1 - comma-separated-tokens: 2.0.3 - hast-util-raw: 9.0.2 - hast-util-whitespace: 3.0.0 - html-void-elements: 3.0.0 - mdast-util-to-hast: 13.1.0 - property-information: 6.4.1 - space-separated-tokens: 2.0.2 - stringify-entities: 4.0.3 - zwitch: 2.0.4 - dev: false - - /hast-util-to-parse5@8.0.0: - resolution: - { - integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==, - } - dependencies: - "@types/hast": 3.0.4 - comma-separated-tokens: 2.0.3 - devlop: 1.1.0 - property-information: 6.4.1 - space-separated-tokens: 2.0.2 - web-namespaces: 2.0.1 - zwitch: 2.0.4 - dev: false - - /hast-util-to-text@4.0.0: - resolution: - { - integrity: sha512-EWiE1FSArNBPUo1cKWtzqgnuRQwEeQbQtnFJRYV1hb1BWDgrAlBU0ExptvZMM/KSA82cDpm2sFGf3Dmc5Mza3w==, - } - dependencies: - "@types/hast": 3.0.4 - "@types/unist": 3.0.2 - hast-util-is-element: 3.0.0 - unist-util-find-after: 5.0.0 - dev: false - - /hast-util-whitespace@3.0.0: - resolution: - { - integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==, - } - dependencies: - "@types/hast": 3.0.4 - dev: false - - /hastscript@8.0.0: - resolution: - { - integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==, - } - dependencies: - "@types/hast": 3.0.4 - comma-separated-tokens: 2.0.3 - hast-util-parse-selector: 4.0.0 - property-information: 6.4.1 - space-separated-tokens: 2.0.2 - dev: false - - /heap@0.2.7: - resolution: - { - integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==, - } - dev: true - - /highlight.js@11.9.0: - resolution: - { - integrity: sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==, - } - engines: { node: ">=12.0.0" } - dev: false - - /hono@4.1.0: - resolution: - { - integrity: sha512-9no6DCHb4ijB1tWdFXU6JnrnFgzwVZ1cnIcS1BjAFnMcjbtBTOMsQrDrPH3GXbkNEEEkj8kWqcYBy8Qc0bBkJQ==, - } - engines: { node: ">=16.0.0" } - dev: false - - /hookable@5.5.3: - resolution: - { - integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==, - } - dev: false - - /html-void-elements@3.0.0: - resolution: - { - integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==, - } - dev: false - - /html-whitespace-sensitive-tag-names@3.0.0: - resolution: - { - integrity: sha512-KlClZ3/Qy5UgvpvVvDomGhnQhNWH5INE8GwvSIQ9CWt1K0zbbXrl7eN5bWaafOZgtmO3jMPwUqmrmEwinhPq1w==, - } - dev: false - - /httpsnippet-lite@3.0.5: - resolution: - { - integrity: sha512-So4qTXY5iFj5XtFDwyz2PicUu+8NWrI8e8h+ZeZoVtMNcFQp4FFIntBHUE+JPUG6QQU8o1VHCy+X4ETRDwt9CA==, - } - engines: { node: ">=14.13" } - dependencies: - "@types/har-format": 1.2.15 - formdata-node: 4.4.1 - stringify-object: 3.3.0 - dev: false - - /husky@9.0.11: - resolution: - { - integrity: sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==, - } - engines: { node: ">=18" } - hasBin: true - dev: true - - /ieee754@1.2.1: - resolution: - { - integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, - } - dev: false - - /ignore@5.3.1: - resolution: - { - integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==, - } - engines: { node: ">= 4" } - - /import-fresh@3.3.0: - resolution: - { - integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, - } - engines: { node: ">=6" } - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - /imurmurhash@0.1.4: - resolution: - { - integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, - } - engines: { node: ">=0.8.19" } - - /inflight@1.0.6: - resolution: - { - integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, - } - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - /inherits@2.0.4: - resolution: - { - integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, - } - - /ini@1.3.8: - resolution: - { - integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, - } - dev: false - - /is-absolute-url@4.0.1: - resolution: - { - integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - dev: false - - /is-binary-path@2.1.0: - resolution: - { - integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, - } - engines: { node: ">=8" } - dependencies: - binary-extensions: 2.3.0 - dev: true - - /is-core-module@2.13.1: - resolution: - { - integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==, - } - dependencies: - hasown: 2.0.2 - dev: true - - /is-extglob@2.1.1: - resolution: - { - integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, - } - engines: { node: ">=0.10.0" } - - /is-glob@4.0.3: - resolution: - { - integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, - } - engines: { node: ">=0.10.0" } - dependencies: - is-extglob: 2.1.1 - - /is-number@7.0.0: - resolution: - { - integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, - } - engines: { node: ">=0.12.0" } - - /is-obj@1.0.1: - resolution: - { - integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==, - } - engines: { node: ">=0.10.0" } - dev: false - - /is-path-inside@3.0.3: - resolution: - { - integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, - } - engines: { node: ">=8" } - - /is-plain-obj@4.1.0: - resolution: - { - integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==, - } - engines: { node: ">=12" } - dev: false - - /is-promise@2.2.2: - resolution: - { - integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==, - } - dev: true - - /is-regexp@1.0.0: - resolution: - { - integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==, - } - engines: { node: ">=0.10.0" } - dev: false - - /is-what@4.1.16: - resolution: - { - integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==, - } - engines: { node: ">=12.13" } - dev: true - - /isexe@2.0.0: - resolution: - { - integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, - } - - /isomorphic.js@0.2.5: - resolution: - { - integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==, - } - dev: false - - /js-base64@3.7.7: - resolution: - { - integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==, - } - dev: false - - /js-yaml@4.1.0: - resolution: - { - integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, - } - hasBin: true - dependencies: - argparse: 2.0.1 - - /json-buffer@3.0.1: - resolution: - { - integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, - } - - /json-diff@0.9.0: - resolution: - { - integrity: sha512-cVnggDrVkAAA3OvFfHpFEhOnmcsUpleEKq4d4O8sQWWSH40MBrWstKigVB1kGrgLWzuom+7rRdaCsnBD6VyObQ==, - } - hasBin: true - dependencies: - cli-color: 2.0.4 - difflib: 0.2.4 - dreamopt: 0.8.0 - dev: true - - /json-schema-traverse@0.4.1: - resolution: - { - integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, - } - - /json-schema-traverse@1.0.0: - resolution: - { - integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==, - } - dev: false - - /json-stable-stringify-without-jsonify@1.0.1: - resolution: - { - integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, - } - - /jsonpointer@5.0.1: - resolution: - { - integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==, - } - engines: { node: ">=0.10.0" } - dev: false - - /keyv@4.5.4: - resolution: - { - integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, - } - dependencies: - json-buffer: 3.0.1 - - /leven@4.0.0: - resolution: - { - integrity: sha512-puehA3YKku3osqPlNuzGDUHq8WpwXupUg1V6NXdV38G+gr+gkBwFC8g1b/+YcIvp8gnqVIus+eJCH/eGsRmJNw==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - dev: false - - /levn@0.4.1: - resolution: - { - integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, - } - engines: { node: ">= 0.8.0" } - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - - /lib0@0.2.92: - resolution: - { - integrity: sha512-cLaqTQmHqOY7hte7FazjG6h8KKR7S36I9FoEnK/RWtCmmwoZ4e8wDnMB1tkU0a54yf2l+SUNyR/jfKuBsXxVNw==, - } - engines: { node: ">=16" } - hasBin: true - dependencies: - isomorphic.js: 0.2.5 - dev: false - - /libsql@0.3.10: - resolution: - { - integrity: sha512-/8YMTbwWFPmrDWY+YFK3kYqVPFkMgQre0DGmBaOmjogMdSe+7GHm1/q9AZ61AWkEub/vHmi+bA4tqIzVhKnqzg==, - } - cpu: [x64, arm64, wasm32] - os: [darwin, linux, win32] - dependencies: - "@neon-rs/load": 0.0.4 - detect-libc: 2.0.2 - optionalDependencies: - "@libsql/darwin-arm64": 0.3.10 - "@libsql/darwin-x64": 0.3.10 - "@libsql/linux-arm64-gnu": 0.3.10 - "@libsql/linux-arm64-musl": 0.3.10 - "@libsql/linux-x64-gnu": 0.3.10 - "@libsql/linux-x64-musl": 0.3.10 - "@libsql/win32-x64-msvc": 0.3.10 - dev: false - - /locate-path@6.0.0: - resolution: - { - integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, - } - engines: { node: ">=10" } - dependencies: - p-locate: 5.0.0 - - /lodash.merge@4.6.2: - resolution: - { - integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, - } - - /lodash.throttle@4.1.1: - resolution: - { - integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==, - } - dev: true - - /longest-streak@3.1.0: - resolution: - { - integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==, - } - dev: false - - /lowlight@3.1.0: - resolution: - { - integrity: sha512-CEbNVoSikAxwDMDPjXlqlFYiZLkDJHwyGu/MfOsJnF3d7f3tds5J3z8s/l9TMXhzfsJCCJEAsD78842mwmg0PQ==, - } - dependencies: - "@types/hast": 3.0.4 - devlop: 1.1.0 - highlight.js: 11.9.0 - dev: false - - /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.64 - dev: true - - /lucia@3.1.1: - resolution: - { - integrity: sha512-Ygvgnqq7Ha7lYVaZATPwkPD2s2Qlsm71Z2o0byx/abNBfFldCRow5sNii6RqMsuMpK957RAI3Gw4/aWoagkc7A==, - } - dependencies: - oslo: 1.0.1 - dev: false - - /magic-string@0.25.9: - resolution: - { - integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==, - } - dependencies: - sourcemap-codec: 1.4.8 - dev: true - - /magic-string@0.30.8: - resolution: - { - integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==, - } - engines: { node: ">=12" } - dependencies: - "@jridgewell/sourcemap-codec": 1.4.15 - dev: false - - /markdown-table@3.0.3: - resolution: - { - integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==, - } - dev: false - - /mdast-util-find-and-replace@3.0.1: - resolution: - { - integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==, - } - dependencies: - "@types/mdast": 4.0.3 - escape-string-regexp: 5.0.0 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 - dev: false - - /mdast-util-from-markdown@2.0.0: - resolution: - { - integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==, - } - dependencies: - "@types/mdast": 4.0.3 - "@types/unist": 3.0.2 - decode-named-character-reference: 1.0.2 - devlop: 1.1.0 - mdast-util-to-string: 4.0.0 - micromark: 4.0.0 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-decode-string: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - unist-util-stringify-position: 4.0.0 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-gfm-autolink-literal@2.0.0: - resolution: - { - integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==, - } - dependencies: - "@types/mdast": 4.0.3 - ccount: 2.0.1 - devlop: 1.1.0 - mdast-util-find-and-replace: 3.0.1 - micromark-util-character: 2.1.0 - dev: false - - /mdast-util-gfm-footnote@2.0.0: - resolution: - { - integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==, - } - dependencies: - "@types/mdast": 4.0.3 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 - micromark-util-normalize-identifier: 2.0.0 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-gfm-strikethrough@2.0.0: - resolution: - { - integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==, - } - dependencies: - "@types/mdast": 4.0.3 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-gfm-table@2.0.0: - resolution: - { - integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==, - } - dependencies: - "@types/mdast": 4.0.3 - devlop: 1.1.0 - markdown-table: 3.0.3 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-gfm-task-list-item@2.0.0: - resolution: - { - integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==, - } - dependencies: - "@types/mdast": 4.0.3 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-gfm@3.0.0: - resolution: - { - integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==, - } - dependencies: - mdast-util-from-markdown: 2.0.0 - mdast-util-gfm-autolink-literal: 2.0.0 - mdast-util-gfm-footnote: 2.0.0 - mdast-util-gfm-strikethrough: 2.0.0 - mdast-util-gfm-table: 2.0.0 - mdast-util-gfm-task-list-item: 2.0.0 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-phrasing@4.1.0: - resolution: - { - integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==, - } - dependencies: - "@types/mdast": 4.0.3 - unist-util-is: 6.0.0 - dev: false - - /mdast-util-to-hast@13.1.0: - resolution: - { - integrity: sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==, - } - dependencies: - "@types/hast": 3.0.4 - "@types/mdast": 4.0.3 - "@ungap/structured-clone": 1.2.0 - devlop: 1.1.0 - micromark-util-sanitize-uri: 2.0.0 - trim-lines: 3.0.1 - unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.1 - dev: false - - /mdast-util-to-markdown@2.1.0: - resolution: - { - integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==, - } - dependencies: - "@types/mdast": 4.0.3 - "@types/unist": 3.0.2 - longest-streak: 3.1.0 - mdast-util-phrasing: 4.1.0 - mdast-util-to-string: 4.0.0 - micromark-util-decode-string: 2.0.0 - unist-util-visit: 5.0.0 - zwitch: 2.0.4 - dev: false - - /mdast-util-to-string@3.2.0: - resolution: - { - integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==, - } - dependencies: - "@types/mdast": 3.0.15 - dev: false - - /mdast-util-to-string@4.0.0: - resolution: - { - integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==, - } - dependencies: - "@types/mdast": 4.0.3 - dev: false - - /memfs-browser@3.5.10302: - resolution: - { - integrity: sha512-JJTc/nh3ig05O0gBBGZjTCPOyydaTxNF0uHYBrcc1gHNnO+KIHIvo0Y1FKCJsaei6FCl8C6xfQomXqu+cuzkIw==, - } - requiresBuild: true - dependencies: - memfs: 3.5.3 - dev: false - optional: true - - /memfs@3.5.3: - resolution: - { - integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==, - } - engines: { node: ">= 4.0.0" } - requiresBuild: true - dependencies: - fs-monkey: 1.0.5 - dev: false - optional: true - - /memoizee@0.4.15: - resolution: - { - integrity: sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==, - } - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - 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 - - /merge2@1.4.1: - resolution: - { - integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, - } - engines: { node: ">= 8" } - dev: false - - /micromark-core-commonmark@2.0.0: - resolution: - { - integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==, - } - dependencies: - decode-named-character-reference: 1.0.2 - devlop: 1.1.0 - micromark-factory-destination: 2.0.0 - micromark-factory-label: 2.0.0 - micromark-factory-space: 2.0.0 - micromark-factory-title: 2.0.0 - micromark-factory-whitespace: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-classify-character: 2.0.0 - micromark-util-html-tag-name: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-subtokenize: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-extension-gfm-autolink-literal@2.0.0: - resolution: - { - integrity: sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==, - } - dependencies: - micromark-util-character: 2.1.0 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-extension-gfm-footnote@2.0.0: - resolution: - { - integrity: sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==, - } - dependencies: - devlop: 1.1.0 - micromark-core-commonmark: 2.0.0 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-extension-gfm-strikethrough@2.0.0: - resolution: - { - integrity: sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==, - } - dependencies: - devlop: 1.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-classify-character: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-extension-gfm-table@2.0.0: - resolution: - { - integrity: sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==, - } - dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-extension-gfm-tagfilter@2.0.0: - resolution: - { - integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==, - } - dependencies: - micromark-util-types: 2.0.0 - dev: false - - /micromark-extension-gfm-task-list-item@2.0.1: - resolution: - { - integrity: sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==, - } - dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-extension-gfm@3.0.0: - resolution: - { - integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==, - } - dependencies: - micromark-extension-gfm-autolink-literal: 2.0.0 - micromark-extension-gfm-footnote: 2.0.0 - micromark-extension-gfm-strikethrough: 2.0.0 - micromark-extension-gfm-table: 2.0.0 - micromark-extension-gfm-tagfilter: 2.0.0 - micromark-extension-gfm-task-list-item: 2.0.1 - micromark-util-combine-extensions: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-factory-destination@2.0.0: - resolution: - { - integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==, - } - dependencies: - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-factory-label@2.0.0: - resolution: - { - integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==, - } - dependencies: - devlop: 1.1.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-factory-space@2.0.0: - resolution: - { - integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==, - } - dependencies: - micromark-util-character: 2.1.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-factory-title@2.0.0: - resolution: - { - integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==, - } - dependencies: - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-factory-whitespace@2.0.0: - resolution: - { - integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==, - } - dependencies: - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-util-character@2.1.0: - resolution: - { - integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==, - } - dependencies: - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-util-chunked@2.0.0: - resolution: - { - integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==, - } - dependencies: - micromark-util-symbol: 2.0.0 - dev: false - - /micromark-util-classify-character@2.0.0: - resolution: - { - integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==, - } - dependencies: - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-util-combine-extensions@2.0.0: - resolution: - { - integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==, - } - dependencies: - micromark-util-chunked: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-util-decode-numeric-character-reference@2.0.1: - resolution: - { - integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==, - } - dependencies: - micromark-util-symbol: 2.0.0 - dev: false - - /micromark-util-decode-string@2.0.0: - resolution: - { - integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==, - } - dependencies: - decode-named-character-reference: 1.0.2 - micromark-util-character: 2.1.0 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-symbol: 2.0.0 - dev: false - - /micromark-util-encode@2.0.0: - resolution: - { - integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==, - } - dev: false - - /micromark-util-html-tag-name@2.0.0: - resolution: - { - integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==, - } - dev: false - - /micromark-util-normalize-identifier@2.0.0: - resolution: - { - integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==, - } - dependencies: - micromark-util-symbol: 2.0.0 - dev: false - - /micromark-util-resolve-all@2.0.0: - resolution: - { - integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==, - } - dependencies: - micromark-util-types: 2.0.0 - dev: false - - /micromark-util-sanitize-uri@2.0.0: - resolution: - { - integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==, - } - dependencies: - micromark-util-character: 2.1.0 - micromark-util-encode: 2.0.0 - micromark-util-symbol: 2.0.0 - dev: false - - /micromark-util-subtokenize@2.0.0: - resolution: - { - integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==, - } - dependencies: - devlop: 1.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - dev: false - - /micromark-util-symbol@2.0.0: - resolution: - { - integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==, - } - dev: false - - /micromark-util-types@2.0.0: - resolution: - { - integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==, - } - dev: false - - /micromark@4.0.0: - resolution: - { - integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==, - } - dependencies: - "@types/debug": 4.1.12 - debug: 4.3.4 - decode-named-character-reference: 1.0.2 - devlop: 1.1.0 - micromark-core-commonmark: 2.0.0 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-combine-extensions: 2.0.0 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-encode: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-subtokenize: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - transitivePeerDependencies: - - supports-color - dev: false - - /micromatch@4.0.5: - resolution: - { - integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, - } - engines: { node: ">=8.6" } - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - dev: false - - /mime-db@1.52.0: - resolution: - { - integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, - } - engines: { node: ">= 0.6" } - dev: false - - /mime-types@2.1.35: - resolution: - { - integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, - } - engines: { node: ">= 0.6" } - dependencies: - mime-db: 1.52.0 - dev: false - - /mime@3.0.0: - resolution: - { - integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==, - } - engines: { node: ">=10.0.0" } - hasBin: true - dev: true - - /mimic-response@3.1.0: - resolution: - { - integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==, - } - engines: { node: ">=10" } - dev: false - - /miniflare@3.20240304.2: - resolution: - { - integrity: sha512-yQ5TBKv7TlvF8khFvvH+1WWk8cBnaLgNzcbJ5DLQOdecxdDxUCVlN38HThd6Nhcz6EY+ckDkww8FkugUbSSpIQ==, - } - engines: { node: ">=16.13" } - hasBin: true - dependencies: - "@cspotcode/source-map-support": 0.8.1 - acorn: 8.11.3 - acorn-walk: 8.3.2 - capnp-ts: 0.7.0 - exit-hook: 2.2.1 - glob-to-regexp: 0.4.1 - stoppable: 1.1.0 - undici: 5.28.3 - workerd: 1.20240304.0 - ws: 8.16.0 - 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 - - /minimatch@5.1.6: - resolution: - { - integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==, - } - engines: { node: ">=10" } - dependencies: - brace-expansion: 2.0.1 - dev: true - - /minimatch@7.4.6: - resolution: - { - integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==, - } - engines: { node: ">=10" } - dependencies: - brace-expansion: 2.0.1 - dev: true - - /minimatch@9.0.3: - resolution: - { - integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==, - } - engines: { node: ">=16 || 14 >=14.17" } - dependencies: - brace-expansion: 2.0.1 - dev: false - - /minimist@1.2.8: - resolution: - { - integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, - } - dev: false - - /mkdirp-classic@0.5.3: - resolution: - { - integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==, - } - dev: false - - /ms@2.1.2: - resolution: - { - integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, - } - - /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 - - /nanoid@5.0.6: - resolution: - { - integrity: sha512-rRq0eMHoGZxlvaFOUdK1Ev83Bd1IgzzR+WJ3IbDJ7QOSdAxYjlurSPqFs9s4lJg29RT6nPwizFtJhQS6V5xgiA==, - } - engines: { node: ^18 || >=20 } - hasBin: true - dev: false - - /napi-build-utils@1.0.2: - resolution: - { - integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==, - } - dev: false - - /natural-compare@1.4.0: - resolution: - { - integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, - } - - /next-tick@1.1.0: - resolution: - { - integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==, - } - dev: true - - /node-abi@3.56.0: - resolution: - { - integrity: sha512-fZjdhDOeRcaS+rcpve7XuwHBmktS1nS1gzgghwKUQQ8nTy2FdSDr6ZT8k6YhvlJeHmmQMYiT/IH9hfco5zeW2Q==, - } - engines: { node: ">=10" } - dependencies: - semver: 7.6.0 - dev: false - - /node-domexception@1.0.0: - resolution: - { - integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==, - } - engines: { node: ">=10.5.0" } - dev: false - - /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-fetch@3.3.2: - resolution: - { - integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - dependencies: - data-uri-to-buffer: 4.0.1 - fetch-blob: 3.2.0 - formdata-polyfill: 4.0.10 - dev: false - - /node-forge@1.3.1: - resolution: - { - integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==, - } - engines: { node: ">= 6.13.0" } - dev: true - - /normalize-path@3.0.0: - resolution: - { - integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, - } - engines: { node: ">=0.10.0" } - dev: true - - /once@1.4.0: - resolution: - { - integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, - } - dependencies: - wrappy: 1.0.2 - - /openapi-types@12.1.3: - resolution: - { - integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==, - } - dev: false - - /openapi3-ts@4.2.2: - resolution: - { - integrity: sha512-+9g4actZKeb3czfi9gVQ4Br2Ju3KwhCAQJBNaKgye5KggqcBLIhFHH+nIkcm0BUX00TrAJl6dH4JWgM4G4JWrw==, - } - dependencies: - yaml: 2.4.1 - - /optionator@0.9.3: - resolution: - { - integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==, - } - engines: { node: ">= 0.8.0" } - dependencies: - "@aashutoshrathi/word-wrap": 1.2.6 - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - - /oslo@1.0.1: - resolution: - { - integrity: sha512-esfzZry+HfGgK/GCYkg7BRlLd3RH5aHa08wgLJPYjENXybi0BvXxGk0LbUj+lXfz2TkjPDHe4rB/o6JxRLHxBg==, - } - dependencies: - "@node-rs/argon2": 1.7.2 - "@node-rs/bcrypt": 1.9.2 - dev: false - - /oslo@1.1.3: - resolution: - { - integrity: sha512-hCz528UlNTiegplcyBg6AvG0HLNrnq06EJMp88Ze308GX1hszkb8u3puhNC4aqLMbYQ0hXpl+wQGnwxMtt5+5w==, - } - dependencies: - "@node-rs/argon2": 1.7.0 - "@node-rs/bcrypt": 1.9.0 - dev: false - - /p-limit@3.1.0: - resolution: - { - integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, - } - engines: { node: ">=10" } - dependencies: - yocto-queue: 0.1.0 - - /p-locate@5.0.0: - resolution: - { - integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, - } - engines: { node: ">=10" } - dependencies: - p-limit: 3.1.0 - - /parent-module@1.0.1: - resolution: - { - integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, - } - engines: { node: ">=6" } - dependencies: - callsites: 3.1.0 - - /parse-ms@3.0.0: - resolution: - { - integrity: sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==, - } - engines: { node: ">=12" } - dev: false - - /parse5@7.1.2: - resolution: - { - integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==, - } - dependencies: - entities: 4.5.0 - dev: false - - /path-exists@4.0.0: - resolution: - { - integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, - } - engines: { node: ">=8" } - - /path-is-absolute@1.0.1: - resolution: - { - integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, - } - engines: { node: ">=0.10.0" } - - /path-key@3.1.1: - resolution: - { - integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, - } - engines: { node: ">=8" } - - /path-parse@1.0.7: - resolution: - { - integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, - } - dev: true - - /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" } - dev: false - - /picocolors@1.0.0: - resolution: - { - integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==, - } - dev: false - - /picomatch@2.3.1: - resolution: - { - integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, - } - engines: { node: ">=8.6" } - - /postcss-nested@6.0.1(postcss@8.4.35): - resolution: - { - integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==, - } - engines: { node: ">=12.0" } - peerDependencies: - postcss: ^8.2.14 - dependencies: - postcss: 8.4.35 - postcss-selector-parser: 6.0.16 - dev: false - - /postcss-selector-parser@6.0.16: - resolution: - { - integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==, - } - engines: { node: ">=4" } - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - dev: false - - /postcss@8.4.35: - resolution: - { - integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==, - } - engines: { node: ^10 || ^12 || >=14 } - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.0.2 - dev: false - - /prebuild-install@7.1.2: - resolution: - { - integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==, - } - 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.56.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 - - /prelude-ls@1.2.1: - resolution: - { - integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, - } - engines: { node: ">= 0.8.0" } - - /prettier@3.2.5: - resolution: - { - integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==, - } - engines: { node: ">=14" } - hasBin: true - dev: false - - /pretty-bytes@6.1.1: - resolution: - { - integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==, - } - engines: { node: ^14.13.1 || >=16.0.0 } - dev: false - - /pretty-ms@8.0.0: - resolution: - { - integrity: sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==, - } - engines: { node: ">=14.16" } - dependencies: - parse-ms: 3.0.0 - dev: false - - /printable-characters@1.0.42: - resolution: - { - integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==, - } - dev: true - - /prismjs@1.29.0: - resolution: - { - integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==, - } - engines: { node: ">=6" } - dev: false - - /property-information@6.4.1: - resolution: - { - integrity: sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==, - } - dev: false - - /proxy-from-env@1.1.0: - resolution: - { - integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==, - } - 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" } - - /queue-microtask@1.2.3: - resolution: - { - integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, - } - - /rc@1.2.8: - resolution: - { - integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==, - } - hasBin: true - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - dev: false - - /readable-stream@3.6.2: - resolution: - { - integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, - } - engines: { node: ">= 6" } - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - dev: false - - /readdirp@3.6.0: - resolution: - { - integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, - } - engines: { node: ">=8.10.0" } - dependencies: - picomatch: 2.3.1 - dev: true - - /regenerator-runtime@0.14.1: - resolution: - { - integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==, - } - dev: false - - /rehype-external-links@3.0.0: - resolution: - { - integrity: sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==, - } - dependencies: - "@types/hast": 3.0.4 - "@ungap/structured-clone": 1.2.0 - hast-util-is-element: 3.0.0 - is-absolute-url: 4.0.1 - space-separated-tokens: 2.0.2 - unist-util-visit: 5.0.0 - dev: false - - /rehype-format@5.0.0: - resolution: - { - integrity: sha512-kM4II8krCHmUhxrlvzFSptvaWh280Fr7UGNJU5DCMuvmAwGCNmGfi9CvFAQK6JDjsNoRMWQStglK3zKJH685Wg==, - } - dependencies: - "@types/hast": 3.0.4 - hast-util-embedded: 3.0.0 - hast-util-is-element: 3.0.0 - hast-util-phrasing: 3.0.1 - hast-util-whitespace: 3.0.0 - html-whitespace-sensitive-tag-names: 3.0.0 - rehype-minify-whitespace: 6.0.0 - unist-util-visit-parents: 6.0.1 - dev: false - - /rehype-highlight@7.0.0: - resolution: - { - integrity: sha512-QtobgRgYoQaK6p1eSr2SD1i61f7bjF2kZHAQHxeCHAuJf7ZUDMvQ7owDq9YTkmar5m5TSUol+2D3bp3KfJf/oA==, - } - dependencies: - "@types/hast": 3.0.4 - hast-util-to-text: 4.0.0 - lowlight: 3.1.0 - unist-util-visit: 5.0.0 - vfile: 6.0.1 - dev: false - - /rehype-minify-whitespace@6.0.0: - resolution: - { - integrity: sha512-i9It4YHR0Sf3GsnlR5jFUKXRr9oayvEk9GKQUkwZv6hs70OH9q3OCZrq9PpLvIGKt3W+JxBOxCidNVpH/6rWdA==, - } - dependencies: - "@types/hast": 3.0.4 - hast-util-embedded: 3.0.0 - hast-util-is-element: 3.0.0 - hast-util-whitespace: 3.0.0 - unist-util-is: 6.0.0 - dev: false - - /rehype-raw@7.0.0: - resolution: - { - integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==, - } - dependencies: - "@types/hast": 3.0.4 - hast-util-raw: 9.0.2 - vfile: 6.0.1 - dev: false - - /rehype-sanitize@6.0.0: - resolution: - { - integrity: sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==, - } - dependencies: - "@types/hast": 3.0.4 - hast-util-sanitize: 5.0.1 - dev: false - - /rehype-stringify@10.0.0: - resolution: - { - integrity: sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ==, - } - dependencies: - "@types/hast": 3.0.4 - hast-util-to-html: 9.0.0 - unified: 11.0.4 - dev: false - - /remark-gfm@4.0.0: - resolution: - { - integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==, - } - dependencies: - "@types/mdast": 4.0.3 - mdast-util-gfm: 3.0.0 - micromark-extension-gfm: 3.0.0 - remark-parse: 11.0.0 - remark-stringify: 11.0.0 - unified: 11.0.4 - transitivePeerDependencies: - - supports-color - dev: false - - /remark-parse@11.0.0: - resolution: - { - integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==, - } - dependencies: - "@types/mdast": 4.0.3 - mdast-util-from-markdown: 2.0.0 - micromark-util-types: 2.0.0 - unified: 11.0.4 - transitivePeerDependencies: - - supports-color - dev: false - - /remark-rehype@11.1.0: - resolution: - { - integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==, - } - dependencies: - "@types/hast": 3.0.4 - "@types/mdast": 4.0.3 - mdast-util-to-hast: 13.1.0 - unified: 11.0.4 - vfile: 6.0.1 - dev: false - - /remark-stringify@11.0.0: - resolution: - { - integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==, - } - dependencies: - "@types/mdast": 4.0.3 - mdast-util-to-markdown: 2.1.0 - unified: 11.0.4 - dev: false - - /require-from-string@2.0.2: - resolution: - { - integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==, - } - engines: { node: ">=0.10.0" } - dev: false - - /resolve-from@4.0.0: - resolution: - { - integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, - } - engines: { node: ">=4" } - - /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" } - dev: true - - /resolve@1.22.8: - resolution: - { - integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==, - } - hasBin: true - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - - /reusify@1.0.4: - resolution: - { - integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, - } - engines: { iojs: ">=1.0.0", node: ">=0.10.0" } - - /rimraf@3.0.2: - resolution: - { - integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, - } - hasBin: true - dependencies: - glob: 7.2.3 - - /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. - 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 - dev: true - - /rollup@4.13.0: - resolution: - { - integrity: sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==, - } - engines: { node: ">=18.0.0", npm: ">=8.0.0" } - hasBin: true - dependencies: - "@types/estree": 1.0.5 - optionalDependencies: - "@rollup/rollup-android-arm-eabi": 4.13.0 - "@rollup/rollup-android-arm64": 4.13.0 - "@rollup/rollup-darwin-arm64": 4.13.0 - "@rollup/rollup-darwin-x64": 4.13.0 - "@rollup/rollup-linux-arm-gnueabihf": 4.13.0 - "@rollup/rollup-linux-arm64-gnu": 4.13.0 - "@rollup/rollup-linux-arm64-musl": 4.13.0 - "@rollup/rollup-linux-riscv64-gnu": 4.13.0 - "@rollup/rollup-linux-x64-gnu": 4.13.0 - "@rollup/rollup-linux-x64-musl": 4.13.0 - "@rollup/rollup-win32-arm64-msvc": 4.13.0 - "@rollup/rollup-win32-ia32-msvc": 4.13.0 - "@rollup/rollup-win32-x64-msvc": 4.13.0 - fsevents: 2.3.3 - dev: false - - /run-parallel@1.2.0: - resolution: - { - integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, - } - dependencies: - queue-microtask: 1.2.3 - - /safe-buffer@5.2.1: - resolution: - { - integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, - } - dev: false - - /selfsigned@2.4.1: - resolution: - { - integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==, - } - engines: { node: ">=10" } - dependencies: - "@types/node-forge": 1.3.11 - node-forge: 1.3.1 - dev: true - - /semver@7.6.0: - resolution: - { - integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==, - } - engines: { node: ">=10" } - hasBin: true - dependencies: - lru-cache: 6.0.0 - - /shebang-command@2.0.0: - resolution: - { - integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, - } - engines: { node: ">=8" } - dependencies: - shebang-regex: 3.0.0 - - /shebang-regex@3.0.0: - resolution: - { - integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, - } - engines: { node: ">=8" } - - /simple-concat@1.0.1: - resolution: - { - integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==, - } - dev: false - - /simple-get@4.0.1: - resolution: - { - integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==, - } - dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 - 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: false - - /source-map-js@1.0.2: - resolution: - { - integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==, - } - engines: { node: ">=0.10.0" } - dev: false - - /source-map-support@0.5.21: - resolution: - { - integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, - } - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - dev: true - - /source-map@0.6.1: - resolution: - { - integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, - } - engines: { node: ">=0.10.0" } - dev: true - - /sourcemap-codec@1.4.8: - resolution: - { - integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==, - } - deprecated: Please use @jridgewell/sourcemap-codec instead - dev: true - - /space-separated-tokens@2.0.2: - resolution: - { - integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==, - } - dev: false - - /stacktracey@2.1.8: - resolution: - { - integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==, - } - dependencies: - as-table: 1.0.55 - get-source: 2.0.12 - dev: true - - /stoppable@1.1.0: - resolution: - { - integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==, - } - engines: { node: ">=4", npm: ">=6" } - dev: true - - /string_decoder@1.3.0: - resolution: - { - integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, - } - dependencies: - safe-buffer: 5.2.1 - dev: false - - /stringify-entities@4.0.3: - resolution: - { - integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==, - } - dependencies: - character-entities-html4: 2.1.0 - character-entities-legacy: 3.0.0 - dev: false - - /stringify-object@3.3.0: - resolution: - { - integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==, - } - engines: { node: ">=4" } - dependencies: - get-own-enumerable-property-symbols: 3.0.2 - is-obj: 1.0.1 - is-regexp: 1.0.0 - dev: false - - /strip-ansi@6.0.1: - resolution: - { - integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, - } - engines: { node: ">=8" } - dependencies: - ansi-regex: 5.0.1 - - /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" } - - /style-mod@4.1.2: - resolution: - { - integrity: sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==, - } - dev: false - - /superjson@2.2.1: - resolution: - { - integrity: sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==, - } - engines: { node: ">=16" } - dependencies: - copy-anything: 3.0.5 - dev: true - - /supports-color@7.2.0: - resolution: - { - integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, - } - engines: { node: ">=8" } - dependencies: - has-flag: 4.0.0 - - /supports-preserve-symlinks-flag@1.0.0: - resolution: - { - integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, - } - engines: { node: ">= 0.4" } - dev: true - - /tailwind-merge@2.2.1: - resolution: - { - integrity: sha512-o+2GTLkthfa5YUt4JxPfzMIpQzZ3adD1vLVkvKE1Twl9UAhGsEbIZhHHZVRttyW177S8PDJI3bTQNaebyofK3Q==, - } - dependencies: - "@babel/runtime": 7.24.0 - dev: false - - /tar-fs@2.1.1: - resolution: - { - integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==, - } - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.0 - tar-stream: 2.2.0 - dev: false - - /tar-stream@2.2.0: - resolution: - { - integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==, - } - engines: { node: ">=6" } - 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 - - /text-table@0.2.0: - resolution: - { - integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, - } - - /timers-ext@0.1.7: - resolution: - { - integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==, - } - dependencies: - es5-ext: 0.10.64 - next-tick: 1.1.0 - dev: true - - /to-fast-properties@2.0.0: - resolution: - { - integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==, - } - engines: { node: ">=4" } - dev: false - - /to-regex-range@5.0.1: - resolution: - { - integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, - } - engines: { node: ">=8.0" } - dependencies: - is-number: 7.0.0 - - /tr46@0.0.3: - resolution: - { - integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, - } - dev: false - - /trim-lines@3.0.1: - resolution: - { - integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==, - } - dev: false - - /trough@2.2.0: - resolution: - { - integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==, - } - dev: false - - /ts-api-utils@1.3.0(typescript@5.4.2): - resolution: - { - integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==, - } - engines: { node: ">=16" } - peerDependencies: - typescript: ">=4.2.0" - dependencies: - typescript: 5.4.2 - dev: false - - /tslib@2.6.2: - resolution: - { - integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==, - } - - /tsx@4.7.1: - resolution: - { - integrity: sha512-8d6VuibXHtlN5E3zFkgY8u4DX7Y3Z27zvvPKVmLon/D4AjuKzarkUBTLDBgj9iTQ0hg5xM7c/mYiRVM+HETf0g==, - } - engines: { node: ">=18.0.0" } - hasBin: true - dependencies: - esbuild: 0.19.12 - get-tsconfig: 4.7.3 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /tunnel-agent@0.6.0: - resolution: - { - integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==, - } - dependencies: - safe-buffer: 5.2.1 - dev: false - - /type-check@0.4.0: - resolution: - { - integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, - } - engines: { node: ">= 0.8.0" } - dependencies: - prelude-ls: 1.2.1 - - /type-fest@0.20.2: - resolution: - { - integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==, - } - engines: { node: ">=10" } - - /type@2.7.2: - resolution: - { - integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==, - } - dev: true - - /typescript@5.4.2: - resolution: - { - integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==, - } - engines: { node: ">=14.17" } - hasBin: true - - /undici-types@5.26.5: - resolution: - { - integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==, - } - - /undici@5.28.3: - resolution: - { - integrity: sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==, - } - engines: { node: ">=14.0" } - dependencies: - "@fastify/busboy": 2.1.1 - dev: true - - /unhead@1.8.20: - resolution: - { - integrity: sha512-IJOCYact/7Za3M7CeeCWs8Vze53kHvKDUy/EXtkTm/an5StgqOt2uCnS3HrkioIMKdHBpy/qtTc6E3BoGMOq7Q==, - } - dependencies: - "@unhead/dom": 1.8.20 - "@unhead/schema": 1.8.20 - "@unhead/shared": 1.8.20 - hookable: 5.5.3 - dev: false - - /unified@11.0.4: - resolution: - { - integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==, - } - dependencies: - "@types/unist": 3.0.2 - bail: 2.0.2 - devlop: 1.1.0 - extend: 3.0.2 - is-plain-obj: 4.1.0 - trough: 2.2.0 - vfile: 6.0.1 - dev: false - - /unist-util-find-after@5.0.0: - resolution: - { - integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==, - } - dependencies: - "@types/unist": 3.0.2 - unist-util-is: 6.0.0 - dev: false - - /unist-util-is@5.2.1: - resolution: - { - integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==, - } - dependencies: - "@types/unist": 2.0.10 - dev: false - - /unist-util-is@6.0.0: - resolution: - { - integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==, - } - dependencies: - "@types/unist": 3.0.2 - dev: false - - /unist-util-position@5.0.0: - resolution: - { - integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==, - } - dependencies: - "@types/unist": 3.0.2 - dev: false - - /unist-util-stringify-position@4.0.0: - resolution: - { - integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==, - } - dependencies: - "@types/unist": 3.0.2 - dev: false - - /unist-util-visit-parents@5.1.3: - resolution: - { - integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==, - } - dependencies: - "@types/unist": 2.0.10 - unist-util-is: 5.2.1 - dev: false - - /unist-util-visit-parents@6.0.1: - resolution: - { - integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==, - } - dependencies: - "@types/unist": 3.0.2 - unist-util-is: 6.0.0 - dev: false - - /unist-util-visit@4.1.2: - resolution: - { - integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==, - } - dependencies: - "@types/unist": 2.0.10 - unist-util-is: 5.2.1 - unist-util-visit-parents: 5.1.3 - dev: false - - /unist-util-visit@5.0.0: - resolution: - { - integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==, - } - dependencies: - "@types/unist": 3.0.2 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 - dev: false - - /uri-js@4.4.1: - resolution: - { - integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, - } - dependencies: - punycode: 2.3.1 - - /util-deprecate@1.0.2: - resolution: - { - integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, - } - dev: false - - /uuid@8.3.2: - resolution: - { - integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==, - } - hasBin: true - dev: false - - /vfile-location@5.0.2: - resolution: - { - integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==, - } - dependencies: - "@types/unist": 3.0.2 - vfile: 6.0.1 - dev: false - - /vfile-message@4.0.2: - resolution: - { - integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==, - } - dependencies: - "@types/unist": 3.0.2 - unist-util-stringify-position: 4.0.0 - dev: false - - /vfile@6.0.1: - resolution: - { - integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==, - } - dependencies: - "@types/unist": 3.0.2 - unist-util-stringify-position: 4.0.0 - vfile-message: 4.0.2 - dev: false - - /vite@5.1.6(@types/node@20.11.28): - resolution: - { - integrity: sha512-yYIAZs9nVfRJ/AiOLCA91zzhjsHUgMjB+EigzFb6W2XTLO8JixBCKCjvhKZaye+NKYHCrkv3Oh50dH9EdLU2RA==, - } - engines: { node: ^18.0.0 || >=20.0.0 } - hasBin: true - peerDependencies: - "@types/node": ^18.0.0 || >=20.0.0 - less: "*" - lightningcss: ^1.21.0 - sass: "*" - stylus: "*" - sugarss: "*" - terser: ^5.4.0 - peerDependenciesMeta: - "@types/node": - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - "@types/node": 20.11.28 - esbuild: 0.19.12 - postcss: 8.4.35 - rollup: 4.13.0 - optionalDependencies: - fsevents: 2.3.3 - dev: false - - /vue-demi@0.14.7(vue@3.4.21): - resolution: - { - integrity: sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==, - } - engines: { node: ">=12" } - hasBin: true - requiresBuild: true - peerDependencies: - "@vue/composition-api": ^1.0.0-rc.1 - vue: ^3.0.0-0 || ^2.6.0 - peerDependenciesMeta: - "@vue/composition-api": - optional: true - dependencies: - vue: 3.4.21(typescript@5.4.2) - dev: false - - /vue-sonner@1.1.2: - resolution: - { - integrity: sha512-yg4f5s0a3oiiI7cNvO0Dajux1Y7s04lxww3vnQtnwQawJ3KqaKA9RIRMdI9wGTosRGIOwgYFniFRGl4+IuKPZw==, - } - dev: false - - /vue@3.4.21(typescript@5.4.2): - resolution: - { - integrity: sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==, - } - peerDependencies: - typescript: "*" - peerDependenciesMeta: - typescript: - optional: true - dependencies: - "@vue/compiler-dom": 3.4.21 - "@vue/compiler-sfc": 3.4.21 - "@vue/runtime-dom": 3.4.21 - "@vue/server-renderer": 3.4.21(vue@3.4.21) - "@vue/shared": 3.4.21 - typescript: 5.4.2 - dev: false - - /w3c-keyname@2.2.8: - resolution: - { - integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==, - } - dev: false - - /web-namespaces@2.0.1: - resolution: - { - integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==, - } - dev: false - - /web-streams-polyfill@3.3.3: - resolution: - { - integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==, - } - engines: { node: ">= 8" } - dev: false - - /web-streams-polyfill@4.0.0-beta.3: - resolution: - { - integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==, - } - engines: { node: ">= 14" } - dev: false - - /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@2.0.2: - resolution: - { - integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, - } - engines: { node: ">= 8" } - hasBin: true - dependencies: - isexe: 2.0.0 - - /wordwrap@1.0.0: - resolution: - { - integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==, - } - dev: true - - /workerd@1.20240304.0: - resolution: - { - integrity: sha512-/tYxdypPh9NKQje9r7bgBB73vAQfCQZbEPjNlxE/ml7jNKMHnRZv/D+By4xO0IPAifa37D0sJFokvYOahz1Lqw==, - } - engines: { node: ">=16" } - hasBin: true - requiresBuild: true - optionalDependencies: - "@cloudflare/workerd-darwin-64": 1.20240304.0 - "@cloudflare/workerd-darwin-arm64": 1.20240304.0 - "@cloudflare/workerd-linux-64": 1.20240304.0 - "@cloudflare/workerd-linux-arm64": 1.20240304.0 - "@cloudflare/workerd-windows-64": 1.20240304.0 - dev: true - - /wrangler@3.34.2(@cloudflare/workers-types@4.20240314.0): - resolution: - { - integrity: sha512-j580WXlOe0GtYdcREym7FLcaaZq9+RZEBuzOtKXx74KKUlEC8cglgf5WWa2C2OpEtJCcrAieEHsNXe7mhy9knA==, - } - engines: { node: ">=16.17.0" } - hasBin: true - peerDependencies: - "@cloudflare/workers-types": ^4.20230914.0 - peerDependenciesMeta: - "@cloudflare/workers-types": - optional: true - dependencies: - "@cloudflare/kv-asset-handler": 0.3.1 - "@cloudflare/workers-types": 4.20240314.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.6.0 - esbuild: 0.17.19 - miniflare: 3.20240304.2 - nanoid: 3.3.7 - path-to-regexp: 6.2.1 - resolve: 1.22.8 - resolve.exports: 2.0.2 - selfsigned: 2.4.1 - source-map: 0.6.1 - xxhash-wasm: 1.0.2 - optionalDependencies: - fsevents: 2.3.3 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - /wrappy@1.0.2: - resolution: - { - integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, - } - - /ws@8.16.0: - resolution: - { - integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==, - } - engines: { node: ">=10.0.0" } - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - /xxhash-wasm@1.0.2: - resolution: - { - integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==, - } - dev: true - - /y-codemirror.next@0.3.2(@codemirror/state@6.4.1)(@codemirror/view@6.26.0)(yjs@13.6.14): - resolution: - { - integrity: sha512-3ksMXoietzNkrgluG9ut+5q4PNHCS6sQ+mHd44hNX1s7TBe4iDgOOIswfY3oLsdamZLAUPr+TnRdYgYuNDs7Qg==, - } - peerDependencies: - "@codemirror/state": ^6.0.0 - "@codemirror/view": ^6.0.0 - yjs: ^13.5.6 - dependencies: - "@codemirror/state": 6.4.1 - "@codemirror/view": 6.26.0 - lib0: 0.2.92 - yjs: 13.6.14 - dev: false - - /yallist@4.0.0: - resolution: - { - integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, - } - - /yaml@2.4.1: - resolution: - { - integrity: sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==, - } - engines: { node: ">= 14" } - hasBin: true - - /yjs@13.6.14: - resolution: - { - integrity: sha512-D+7KcUr0j+vBCUSKXXEWfA+bG4UQBviAwP3gYBhkstkgwy5+8diOPMx0iqLIOxNo/HxaREUimZRxqHGAHCL2BQ==, - } - engines: { node: ">=16.0.0", npm: ">=8.0.0" } - dependencies: - lib0: 0.2.92 - dev: false - - /yocto-queue@0.1.0: - resolution: - { - integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, - } - engines: { node: ">=10" } - - /youch@3.3.3: - resolution: - { - integrity: sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==, - } - dependencies: - cookie: 0.5.0 - mustache: 4.2.0 - stacktracey: 2.1.8 - dev: true - - /zhead@2.2.4: - resolution: - { - integrity: sha512-8F0OI5dpWIA5IGG5NHUg9staDwz/ZPxZtvGVf01j7vHqSyZ0raHY+78atOVxRqb73AotX22uV1pXt3gYSstGag==, - } - dev: false - - /zod-error@1.5.0: - resolution: - { - integrity: sha512-zzopKZ/skI9iXpqCEPj+iLCKl9b88E43ehcU+sbRoHuwGd9F1IDVGQ70TyO6kmfiRL1g4IXkjsXK+g1gLYl4WQ==, - } - dependencies: - zod: 3.22.4 - dev: false - - /zod@3.22.4: - resolution: - { - integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==, - } - - /zwitch@2.0.4: - resolution: - { - integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==, - } - dev: false diff --git a/src/openapi/config.ts b/src/openapi/config.ts index d4814fd..86f9672 100644 --- a/src/openapi/config.ts +++ b/src/openapi/config.ts @@ -1,6 +1,4 @@ -import { OpenAPIObjectConfig } from "@asteasolutions/zod-to-openapi/dist/v3.0/openapi-generator" - -export const OpenAPIConfig: OpenAPIObjectConfig = { +export const OpenAPIConfig = { openapi: "3.1.0", info: { version: "2.0.0", From 7260f4c146758a279e9ca43ac86444038e91f9d1 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Mon, 1 Apr 2024 20:15:59 +0100 Subject: [PATCH 300/318] readme update --- README.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 069eab3..f68448c 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,19 @@ ![Quality] -Source code for the API powering [**wanderer.moe**](https://wanderer.moe) — using **Cloudflare Workers** and **Hono** with **R2 Storage** for the CDN, **Turso** and **Drizzle**. Durable Objects are used for rate limiting requests. +Source code for the API powering [**wanderer.moe**](https://wanderer.moe). + +Tech Stack: + +- Turso - Database (Libsql, fork of SQLite) +- Drizzle - ORM +- Hono - Framework +- Scalar - OpenAPI Documentation +- Bun - Bun +- Resend - Emails +- Cloudflare R2 - Storage +- Cloudflare DO - Ratelimiting +- Lucia Auth - Authentication @@ -12,6 +24,10 @@ Source code for the API powering [**wanderer.moe**](https://wanderer.moe) — us ## Usage +### Bun + +Bun is relatively lightweight and easy to use. You can install it with `npm i bun -g` globally using `npm`. + ### Turso We use Turso (libsql, very lightweight fork of SQLite) as our database. You will need to install the [Turso CLI](https://docs.turso.tech/reference/turso-cli#installation) then run `turso dev` to start a local database. You can persist data by passing `--db-file `. From 0a8e248f6e43a1abddfecb90ab339183a75d50c3 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Mon, 1 Apr 2024 20:16:48 +0100 Subject: [PATCH 301/318] smartest backend dev activities --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f68448c..69d2fd2 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,8 @@ Source code for the API powering [**wanderer.moe**](https://wanderer.moe). + + Tech Stack: - Turso - Database (Libsql, fork of SQLite) @@ -18,8 +20,6 @@ Tech Stack: - Cloudflare DO - Ratelimiting - Lucia Auth - Authentication - - --- ## Usage From d96c3e55bd66dc4041173789317503fd3c4484d3 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Thu, 4 Apr 2024 14:44:17 +0100 Subject: [PATCH 302/318] so back --- .gitignore | 3 - .../db/migrations/0000_lazy_krista_starr.sql | 303 +++ src/v2/db/migrations/meta/0000_snapshot.json | 1855 +++++++++++++++++ src/v2/db/migrations/meta/_journal.json | 13 + src/v2/routes/asset/search-assets.ts | 4 + 5 files changed, 2175 insertions(+), 3 deletions(-) create mode 100644 src/v2/db/migrations/0000_lazy_krista_starr.sql create mode 100644 src/v2/db/migrations/meta/0000_snapshot.json create mode 100644 src/v2/db/migrations/meta/_journal.json diff --git a/.gitignore b/.gitignore index 6c67312..8b9ded3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,6 @@ # webstorm .idea -# migrations (temporary) -src/v2/db/migrations - # Wrangler & env .env diff --git a/src/v2/db/migrations/0000_lazy_krista_starr.sql b/src/v2/db/migrations/0000_lazy_krista_starr.sql new file mode 100644 index 0000000..7707a9c --- /dev/null +++ b/src/v2/db/migrations/0000_lazy_krista_starr.sql @@ -0,0 +1,303 @@ +CREATE TABLE `asset` ( + `id` text PRIMARY KEY NOT NULL, + `name` text NOT NULL, + `extension` text NOT NULL, + `game` text NOT NULL, + `asset_category` text NOT NULL, + `uploaded_by_id` text NOT NULL, + `uploaded_by_name` text NOT NULL, + `url` text NOT NULL, + `status` text DEFAULT 'pending' NOT NULL, + `uploaded_date` text NOT NULL, + `asset_is_suggestive` integer DEFAULT false NOT NULL, + `comments_is_locked` integer DEFAULT false NOT NULL, + `view_count` integer DEFAULT 0 NOT NULL, + `download_count` integer DEFAULT 0 NOT NULL, + `file_size` integer DEFAULT 0 NOT NULL, + `width` integer DEFAULT 0 NOT NULL, + `height` integer DEFAULT 0 NOT NULL, + FOREIGN KEY (`game`) REFERENCES `game`(`id`) ON UPDATE cascade ON DELETE cascade, + FOREIGN KEY (`asset_category`) REFERENCES `assetCategory`(`id`) ON UPDATE cascade ON DELETE cascade, + FOREIGN KEY (`uploaded_by_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade, + FOREIGN KEY (`uploaded_by_name`) REFERENCES `authUser`(`username`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `assetComments` ( + `comment_id` text PRIMARY KEY NOT NULL, + `asset_id` text, + `parent_comment_id` text, + `commented_by_id` text NOT NULL, + `comment` text NOT NULL, + `created_at` text NOT NULL, + `edited_at` text DEFAULT null, + FOREIGN KEY (`asset_id`) REFERENCES `asset`(`id`) ON UPDATE cascade ON DELETE cascade, + FOREIGN KEY (`commented_by_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade, + FOREIGN KEY (`parent_comment_id`) REFERENCES `assetComments`(`comment_id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE TABLE `assetCommentsLikes` ( + `comment_id` text NOT NULL, + `liked_by_id` text NOT NULL, + `created_at` text NOT NULL, + FOREIGN KEY (`comment_id`) REFERENCES `assetComments`(`comment_id`) ON UPDATE cascade ON DELETE cascade, + FOREIGN KEY (`liked_by_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `assetExternalFile` ( + `id` text PRIMARY KEY NOT NULL, + `url` text NOT NULL, + `uploaded_by` text NOT NULL, + `uploaded_by_name` text NOT NULL, + `asset_id` text NOT NULL, + `uploaded_date` text NOT NULL, + `file_size` integer DEFAULT 0 NOT NULL, + `file_type` text NOT NULL, + FOREIGN KEY (`uploaded_by`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade, + FOREIGN KEY (`uploaded_by_name`) REFERENCES `authUser`(`username`) ON UPDATE cascade ON DELETE cascade, + FOREIGN KEY (`asset_id`) REFERENCES `asset`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `assetLikes` ( + `asset_id` text NOT NULL, + `liked_by_id` text NOT NULL, + `created_at` text NOT NULL, + FOREIGN KEY (`asset_id`) REFERENCES `asset`(`id`) ON UPDATE cascade ON DELETE cascade, + FOREIGN KEY (`liked_by_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `assetCategory` ( + `id` text PRIMARY KEY NOT NULL, + `name` text NOT NULL, + `formatted_name` text NOT NULL, + `last_updated` text NOT NULL +); +--> statement-breakpoint +CREATE TABLE `gameAssetCategory` ( + `game_id` text NOT NULL, + `asset_category_id` text NOT NULL, + FOREIGN KEY (`game_id`) REFERENCES `game`(`id`) ON UPDATE cascade ON DELETE cascade, + FOREIGN KEY (`asset_category_id`) REFERENCES `assetCategory`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `game` ( + `id` text PRIMARY KEY NOT NULL, + `name` text NOT NULL, + `formatted_name` text NOT NULL, + `possible_suggestive_content` integer DEFAULT false NOT NULL, + `last_updated` text NOT NULL +); +--> statement-breakpoint +CREATE TABLE `assetTag` ( + `id` text PRIMARY KEY NOT NULL, + `name` text NOT NULL, + `formatted_name` text NOT NULL, + `last_updated` text NOT NULL +); +--> statement-breakpoint +CREATE TABLE `assetTagAsset` ( + `asset_tag_id` text NOT NULL, + `asset_id` text NOT NULL, + FOREIGN KEY (`asset_tag_id`) REFERENCES `assetTag`(`id`) ON UPDATE cascade ON DELETE cascade, + FOREIGN KEY (`asset_id`) REFERENCES `asset`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `authCredentials` ( + `id` text PRIMARY KEY NOT NULL, + `user_id` text NOT NULL, + `hashed_password` text, + FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `authUser` ( + `id` text PRIMARY KEY NOT NULL, + `avatar_url` text, + `banner_url` text, + `display_name` text, + `username` text NOT NULL, + `username_colour` text, + `email` text NOT NULL, + `email_verified` integer DEFAULT 0 NOT NULL, + `pronouns` text, + `verified` integer DEFAULT 0 NOT NULL, + `bio` text DEFAULT 'No bio set' NOT NULL, + `date_joined` text NOT NULL, + `plan` text DEFAULT 'free' NOT NULL, + `is_banned` integer DEFAULT false NOT NULL, + `is_contributor` integer DEFAULT false NOT NULL, + `role` text DEFAULT 'user' NOT NULL +); +--> statement-breakpoint +CREATE TABLE `stripeUser` ( + `id` text PRIMARY KEY NOT NULL, + `user_id` text NOT NULL, + `stripe_customer_id` text, + `stripe_subscription_id` text, + `ends_at` text, + `paid_until` text, + FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `authSession` ( + `id` text PRIMARY KEY NOT NULL, + `user_id` text NOT NULL, + `expires_at` text NOT NULL, + `user_agent` text NOT NULL, + `country_code` text NOT NULL, + `ip_address` text NOT NULL, + FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `emailVerificationToken` ( + `id` text PRIMARY KEY NOT NULL, + `user_id` text NOT NULL, + `token` text NOT NULL, + `expires_at` text NOT NULL, + FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `passwordResetToken` ( + `id` text PRIMARY KEY NOT NULL, + `user_id` text NOT NULL, + `token` text NOT NULL, + `expires_at` text NOT NULL, + FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `userCollection` ( + `id` text PRIMARY KEY NOT NULL, + `name` text NOT NULL, + `description` text NOT NULL, + `user_id` text NOT NULL, + `date_created` text NOT NULL, + `accent_colour` text, + `is_public` integer DEFAULT false NOT NULL, + FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `userCollectionAsset` ( + `collection_id` text NOT NULL, + `asset_id` text NOT NULL, + `order` integer NOT NULL, + `date_added` text NOT NULL, + FOREIGN KEY (`collection_id`) REFERENCES `userCollection`(`id`) ON UPDATE cascade ON DELETE cascade, + FOREIGN KEY (`asset_id`) REFERENCES `asset`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `socialsConnection` ( + `id` text PRIMARY KEY NOT NULL, + `user_id` text NOT NULL, + `discord_id` text, + FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `userFollowing` ( + `followerId` text NOT NULL, + `followingId` text NOT NULL, + `createdAt` text NOT NULL, + FOREIGN KEY (`followerId`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade, + FOREIGN KEY (`followingId`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `userBlocked` ( + `id` text PRIMARY KEY NOT NULL, + `blocked_by_id` text NOT NULL, + `blocked_id` text NOT NULL, + FOREIGN KEY (`blocked_by_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade, + FOREIGN KEY (`blocked_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `userCollectionLikes` ( + `collection_id` text NOT NULL, + `liked_by_id` text NOT NULL, + `createdAt` text NOT NULL, + FOREIGN KEY (`collection_id`) REFERENCES `userCollection`(`id`) ON UPDATE cascade ON DELETE cascade, + FOREIGN KEY (`liked_by_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `userCollectionCollaborators` ( + `collection_id` text NOT NULL, + `collaborator_id` text NOT NULL, + `role` text DEFAULT 'collaborator' NOT NULL, + `createdAt` text NOT NULL, + FOREIGN KEY (`collection_id`) REFERENCES `userCollection`(`id`) ON UPDATE no action ON DELETE no action, + FOREIGN KEY (`collaborator_id`) REFERENCES `authUser`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE TABLE `requestForm` ( + `id` text NOT NULL, + `user_id` text NOT NULL, + `type` text NOT NULL, + `title` text NOT NULL, + `description` text NOT NULL, + FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `requestFormUpvotes` ( + `id` text NOT NULL, + `request_form_id` text NOT NULL, + `user_id` text NOT NULL, + FOREIGN KEY (`request_form_id`) REFERENCES `requestForm`(`id`) ON UPDATE cascade ON DELETE cascade, + FOREIGN KEY (`user_id`) REFERENCES `authUser`(`id`) ON UPDATE cascade ON DELETE cascade +); +--> statement-breakpoint +CREATE INDEX `assets_id_idx` ON `asset` (`id`);--> statement-breakpoint +CREATE INDEX `assets_name_idx` ON `asset` (`name`);--> statement-breakpoint +CREATE INDEX `assets_game_name_idx` ON `asset` (`game`);--> statement-breakpoint +CREATE INDEX `assets_asset_category_name_idx` ON `asset` (`asset_category`);--> statement-breakpoint +CREATE INDEX `assets_uploaded_by_id_idx` ON `asset` (`uploaded_by_id`);--> statement-breakpoint +CREATE INDEX `assetcomments_asset_idx` ON `assetComments` (`asset_id`);--> statement-breakpoint +CREATE INDEX `assetcomments_parent_comment_idx` ON `assetComments` (`parent_comment_id`);--> statement-breakpoint +CREATE INDEX `assetcomments_commented_by_idx` ON `assetComments` (`commented_by_id`);--> statement-breakpoint +CREATE INDEX `assetcommentslikes_comment_idx` ON `assetCommentsLikes` (`comment_id`);--> statement-breakpoint +CREATE INDEX `assetcommentslikes_liked_by_idx` ON `assetCommentsLikes` (`liked_by_id`);--> statement-breakpoint +CREATE INDEX `asset_external_file_id_idx` ON `assetExternalFile` (`id`);--> statement-breakpoint +CREATE INDEX `asset_external_file_uploaded_by_id_idx` ON `assetExternalFile` (`uploaded_by`);--> statement-breakpoint +CREATE INDEX `asset_external_file_uploaded_by_name_idx` ON `assetExternalFile` (`uploaded_by_name`);--> statement-breakpoint +CREATE INDEX `assetlikes_asset_idx` ON `assetLikes` (`asset_id`);--> statement-breakpoint +CREATE INDEX `assetlikes_likedBy_idx` ON `assetLikes` (`liked_by_id`);--> statement-breakpoint +CREATE UNIQUE INDEX `assetCategory_name_unique` ON `assetCategory` (`name`);--> statement-breakpoint +CREATE INDEX `asset_category_id_idx` ON `assetCategory` (`id`);--> statement-breakpoint +CREATE INDEX `asset_category_name_idx` ON `assetCategory` (`name`);--> statement-breakpoint +CREATE INDEX `game_asset_category_game_id_idx` ON `gameAssetCategory` (`game_id`);--> statement-breakpoint +CREATE INDEX `game_asset_category_asset_category_id_idx` ON `gameAssetCategory` (`asset_category_id`);--> statement-breakpoint +CREATE UNIQUE INDEX `game_name_unique` ON `game` (`name`);--> statement-breakpoint +CREATE INDEX `game_id_idx` ON `game` (`id`);--> statement-breakpoint +CREATE INDEX `game_name_idx` ON `game` (`name`);--> statement-breakpoint +CREATE UNIQUE INDEX `assetTag_name_unique` ON `assetTag` (`name`);--> statement-breakpoint +CREATE INDEX `asset_tag_id_idx` ON `assetTag` (`id`);--> statement-breakpoint +CREATE INDEX `asset_tag_name_idx` ON `assetTag` (`name`);--> statement-breakpoint +CREATE INDEX `asset_tags_assets_asset_tag_id_idx` ON `assetTagAsset` (`asset_tag_id`);--> statement-breakpoint +CREATE INDEX `asset_tags_assets_asset_id_idx` ON `assetTagAsset` (`asset_id`);--> statement-breakpoint +CREATE INDEX `key_user_id_idx` ON `authCredentials` (`user_id`);--> statement-breakpoint +CREATE UNIQUE INDEX `authUser_username_unique` ON `authUser` (`username`);--> statement-breakpoint +CREATE INDEX `user_id_idx` ON `authUser` (`id`);--> statement-breakpoint +CREATE INDEX `user_username_idx` ON `authUser` (`username`);--> statement-breakpoint +CREATE INDEX `user_email_idx` ON `authUser` (`email`);--> statement-breakpoint +CREATE INDEX `user_contributor_idx` ON `authUser` (`is_contributor`);--> statement-breakpoint +CREATE INDEX `stripe_user_user_id_idx` ON `stripeUser` (`user_id`);--> statement-breakpoint +CREATE INDEX `stripe_user_stripe_customer_id_idx` ON `stripeUser` (`stripe_customer_id`);--> statement-breakpoint +CREATE INDEX `session_user_id_idx` ON `authSession` (`user_id`);--> statement-breakpoint +CREATE INDEX `email_verification_token_user_id_idx` ON `emailVerificationToken` (`user_id`);--> statement-breakpoint +CREATE INDEX `email_verification_token_token_idx` ON `emailVerificationToken` (`token`);--> statement-breakpoint +CREATE INDEX `password_reset_token_user_id_idx` ON `passwordResetToken` (`user_id`);--> statement-breakpoint +CREATE INDEX `password_reset_token_token_idx` ON `passwordResetToken` (`token`);--> statement-breakpoint +CREATE INDEX `collection_id_idx` ON `userCollection` (`id`);--> statement-breakpoint +CREATE INDEX `user_collection_id_idx` ON `userCollection` (`user_id`);--> statement-breakpoint +CREATE INDEX `collection_assets_collection_id_idx` ON `userCollectionAsset` (`collection_id`);--> statement-breakpoint +CREATE INDEX `collection_assets_asset_id_idx` ON `userCollectionAsset` (`asset_id`);--> statement-breakpoint +CREATE UNIQUE INDEX `socialsConnection_user_id_unique` ON `socialsConnection` (`user_id`);--> statement-breakpoint +CREATE INDEX `socials_connection_user_id_idx` ON `socialsConnection` (`user_id`);--> statement-breakpoint +CREATE INDEX `socials_connection_discord_id_idx` ON `socialsConnection` (`discord_id`);--> statement-breakpoint +CREATE INDEX `userfollowing_follower_idx` ON `userFollowing` (`followerId`);--> statement-breakpoint +CREATE INDEX `userfollowing_following_idx` ON `userFollowing` (`followingId`);--> statement-breakpoint +CREATE INDEX `user_blocked_id_idx` ON `userBlocked` (`id`);--> statement-breakpoint +CREATE INDEX `user_blocked_blocked_by_id_idx` ON `userBlocked` (`blocked_by_id`);--> statement-breakpoint +CREATE INDEX `user_blocked_blocked_id_idx` ON `userBlocked` (`blocked_id`);--> statement-breakpoint +CREATE INDEX `userCollectionNetworking_collection_idx` ON `userCollectionLikes` (`collection_id`);--> statement-breakpoint +CREATE INDEX `userCollectionNetworking_likedBy_idx` ON `userCollectionLikes` (`liked_by_id`);--> statement-breakpoint +CREATE INDEX `userCollectionCollaborators_collectionId_idx` ON `userCollectionCollaborators` (`collection_id`);--> statement-breakpoint +CREATE INDEX `userCollectionCollaborators_collaboratorId_idx` ON `userCollectionCollaborators` (`collaborator_id`);--> statement-breakpoint +CREATE UNIQUE INDEX `requestForm_id_unique` ON `requestForm` (`id`);--> statement-breakpoint +CREATE INDEX `request_form_user_id_idx` ON `requestForm` (`user_id`);--> statement-breakpoint +CREATE UNIQUE INDEX `requestFormUpvotes_id_unique` ON `requestFormUpvotes` (`id`);--> statement-breakpoint +CREATE INDEX `request_form_upvotes_idx` ON `requestFormUpvotes` (`request_form_id`,`user_id`); \ No newline at end of file diff --git a/src/v2/db/migrations/meta/0000_snapshot.json b/src/v2/db/migrations/meta/0000_snapshot.json new file mode 100644 index 0000000..26f1754 --- /dev/null +++ b/src/v2/db/migrations/meta/0000_snapshot.json @@ -0,0 +1,1855 @@ +{ + "version": "5", + "dialect": "sqlite", + "id": "e832f8e6-9b8a-46d2-9434-1c0ff8f8f453", + "prevId": "00000000-0000-0000-0000-000000000000", + "tables": { + "asset": { + "name": "asset", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "extension": { + "name": "extension", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "game": { + "name": "game", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_category": { + "name": "asset_category", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by_id": { + "name": "uploaded_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by_name": { + "name": "uploaded_by_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'pending'" + }, + "uploaded_date": { + "name": "uploaded_date", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_is_suggestive": { + "name": "asset_is_suggestive", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "comments_is_locked": { + "name": "comments_is_locked", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "view_count": { + "name": "view_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "download_count": { + "name": "download_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "file_size": { + "name": "file_size", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "width": { + "name": "width", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "height": { + "name": "height", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "assets_id_idx": { + "name": "assets_id_idx", + "columns": ["id"], + "isUnique": false + }, + "assets_name_idx": { + "name": "assets_name_idx", + "columns": ["name"], + "isUnique": false + }, + "assets_game_name_idx": { + "name": "assets_game_name_idx", + "columns": ["game"], + "isUnique": false + }, + "assets_asset_category_name_idx": { + "name": "assets_asset_category_name_idx", + "columns": ["asset_category"], + "isUnique": false + }, + "assets_uploaded_by_id_idx": { + "name": "assets_uploaded_by_id_idx", + "columns": ["uploaded_by_id"], + "isUnique": false + } + }, + "foreignKeys": { + "asset_game_game_id_fk": { + "name": "asset_game_game_id_fk", + "tableFrom": "asset", + "tableTo": "game", + "columnsFrom": ["game"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "asset_asset_category_assetCategory_id_fk": { + "name": "asset_asset_category_assetCategory_id_fk", + "tableFrom": "asset", + "tableTo": "assetCategory", + "columnsFrom": ["asset_category"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "asset_uploaded_by_id_authUser_id_fk": { + "name": "asset_uploaded_by_id_authUser_id_fk", + "tableFrom": "asset", + "tableTo": "authUser", + "columnsFrom": ["uploaded_by_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "asset_uploaded_by_name_authUser_username_fk": { + "name": "asset_uploaded_by_name_authUser_username_fk", + "tableFrom": "asset", + "tableTo": "authUser", + "columnsFrom": ["uploaded_by_name"], + "columnsTo": ["username"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetComments": { + "name": "assetComments", + "columns": { + "comment_id": { + "name": "comment_id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "parent_comment_id": { + "name": "parent_comment_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "commented_by_id": { + "name": "commented_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "comment": { + "name": "comment", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "edited_at": { + "name": "edited_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": null + } + }, + "indexes": { + "assetcomments_asset_idx": { + "name": "assetcomments_asset_idx", + "columns": ["asset_id"], + "isUnique": false + }, + "assetcomments_parent_comment_idx": { + "name": "assetcomments_parent_comment_idx", + "columns": ["parent_comment_id"], + "isUnique": false + }, + "assetcomments_commented_by_idx": { + "name": "assetcomments_commented_by_idx", + "columns": ["commented_by_id"], + "isUnique": false + } + }, + "foreignKeys": { + "assetComments_asset_id_asset_id_fk": { + "name": "assetComments_asset_id_asset_id_fk", + "tableFrom": "assetComments", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "assetComments_commented_by_id_authUser_id_fk": { + "name": "assetComments_commented_by_id_authUser_id_fk", + "tableFrom": "assetComments", + "tableTo": "authUser", + "columnsFrom": ["commented_by_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "self_reference_parent_comment_id": { + "name": "self_reference_parent_comment_id", + "tableFrom": "assetComments", + "tableTo": "assetComments", + "columnsFrom": ["parent_comment_id"], + "columnsTo": ["comment_id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetCommentsLikes": { + "name": "assetCommentsLikes", + "columns": { + "comment_id": { + "name": "comment_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetcommentslikes_comment_idx": { + "name": "assetcommentslikes_comment_idx", + "columns": ["comment_id"], + "isUnique": false + }, + "assetcommentslikes_liked_by_idx": { + "name": "assetcommentslikes_liked_by_idx", + "columns": ["liked_by_id"], + "isUnique": false + } + }, + "foreignKeys": { + "assetCommentsLikes_comment_id_assetComments_comment_id_fk": { + "name": "assetCommentsLikes_comment_id_assetComments_comment_id_fk", + "tableFrom": "assetCommentsLikes", + "tableTo": "assetComments", + "columnsFrom": ["comment_id"], + "columnsTo": ["comment_id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "assetCommentsLikes_liked_by_id_authUser_id_fk": { + "name": "assetCommentsLikes_liked_by_id_authUser_id_fk", + "tableFrom": "assetCommentsLikes", + "tableTo": "authUser", + "columnsFrom": ["liked_by_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetExternalFile": { + "name": "assetExternalFile", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by": { + "name": "uploaded_by", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by_name": { + "name": "uploaded_by_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_date": { + "name": "uploaded_date", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "file_size": { + "name": "file_size", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "file_type": { + "name": "file_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "asset_external_file_id_idx": { + "name": "asset_external_file_id_idx", + "columns": ["id"], + "isUnique": false + }, + "asset_external_file_uploaded_by_id_idx": { + "name": "asset_external_file_uploaded_by_id_idx", + "columns": ["uploaded_by"], + "isUnique": false + }, + "asset_external_file_uploaded_by_name_idx": { + "name": "asset_external_file_uploaded_by_name_idx", + "columns": ["uploaded_by_name"], + "isUnique": false + } + }, + "foreignKeys": { + "assetExternalFile_uploaded_by_authUser_id_fk": { + "name": "assetExternalFile_uploaded_by_authUser_id_fk", + "tableFrom": "assetExternalFile", + "tableTo": "authUser", + "columnsFrom": ["uploaded_by"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "assetExternalFile_uploaded_by_name_authUser_username_fk": { + "name": "assetExternalFile_uploaded_by_name_authUser_username_fk", + "tableFrom": "assetExternalFile", + "tableTo": "authUser", + "columnsFrom": ["uploaded_by_name"], + "columnsTo": ["username"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "assetExternalFile_asset_id_asset_id_fk": { + "name": "assetExternalFile_asset_id_asset_id_fk", + "tableFrom": "assetExternalFile", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetLikes": { + "name": "assetLikes", + "columns": { + "asset_id": { + "name": "asset_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetlikes_asset_idx": { + "name": "assetlikes_asset_idx", + "columns": ["asset_id"], + "isUnique": false + }, + "assetlikes_likedBy_idx": { + "name": "assetlikes_likedBy_idx", + "columns": ["liked_by_id"], + "isUnique": false + } + }, + "foreignKeys": { + "assetLikes_asset_id_asset_id_fk": { + "name": "assetLikes_asset_id_asset_id_fk", + "tableFrom": "assetLikes", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "assetLikes_liked_by_id_authUser_id_fk": { + "name": "assetLikes_liked_by_id_authUser_id_fk", + "tableFrom": "assetLikes", + "tableTo": "authUser", + "columnsFrom": ["liked_by_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetCategory": { + "name": "assetCategory", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetCategory_name_unique": { + "name": "assetCategory_name_unique", + "columns": ["name"], + "isUnique": true + }, + "asset_category_id_idx": { + "name": "asset_category_id_idx", + "columns": ["id"], + "isUnique": false + }, + "asset_category_name_idx": { + "name": "asset_category_name_idx", + "columns": ["name"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "gameAssetCategory": { + "name": "gameAssetCategory", + "columns": { + "game_id": { + "name": "game_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_category_id": { + "name": "asset_category_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "game_asset_category_game_id_idx": { + "name": "game_asset_category_game_id_idx", + "columns": ["game_id"], + "isUnique": false + }, + "game_asset_category_asset_category_id_idx": { + "name": "game_asset_category_asset_category_id_idx", + "columns": ["asset_category_id"], + "isUnique": false + } + }, + "foreignKeys": { + "gameAssetCategory_game_id_game_id_fk": { + "name": "gameAssetCategory_game_id_game_id_fk", + "tableFrom": "gameAssetCategory", + "tableTo": "game", + "columnsFrom": ["game_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "gameAssetCategory_asset_category_id_assetCategory_id_fk": { + "name": "gameAssetCategory_asset_category_id_assetCategory_id_fk", + "tableFrom": "gameAssetCategory", + "tableTo": "assetCategory", + "columnsFrom": ["asset_category_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "game": { + "name": "game", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "possible_suggestive_content": { + "name": "possible_suggestive_content", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "game_name_unique": { + "name": "game_name_unique", + "columns": ["name"], + "isUnique": true + }, + "game_id_idx": { + "name": "game_id_idx", + "columns": ["id"], + "isUnique": false + }, + "game_name_idx": { + "name": "game_name_idx", + "columns": ["name"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetTag": { + "name": "assetTag", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetTag_name_unique": { + "name": "assetTag_name_unique", + "columns": ["name"], + "isUnique": true + }, + "asset_tag_id_idx": { + "name": "asset_tag_id_idx", + "columns": ["id"], + "isUnique": false + }, + "asset_tag_name_idx": { + "name": "asset_tag_name_idx", + "columns": ["name"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetTagAsset": { + "name": "assetTagAsset", + "columns": { + "asset_tag_id": { + "name": "asset_tag_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "asset_tags_assets_asset_tag_id_idx": { + "name": "asset_tags_assets_asset_tag_id_idx", + "columns": ["asset_tag_id"], + "isUnique": false + }, + "asset_tags_assets_asset_id_idx": { + "name": "asset_tags_assets_asset_id_idx", + "columns": ["asset_id"], + "isUnique": false + } + }, + "foreignKeys": { + "assetTagAsset_asset_tag_id_assetTag_id_fk": { + "name": "assetTagAsset_asset_tag_id_assetTag_id_fk", + "tableFrom": "assetTagAsset", + "tableTo": "assetTag", + "columnsFrom": ["asset_tag_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "assetTagAsset_asset_id_asset_id_fk": { + "name": "assetTagAsset_asset_id_asset_id_fk", + "tableFrom": "assetTagAsset", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "authCredentials": { + "name": "authCredentials", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "hashed_password": { + "name": "hashed_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "key_user_id_idx": { + "name": "key_user_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "authCredentials_user_id_authUser_id_fk": { + "name": "authCredentials_user_id_authUser_id_fk", + "tableFrom": "authCredentials", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "authUser": { + "name": "authUser", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "avatar_url": { + "name": "avatar_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "banner_url": { + "name": "banner_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "display_name": { + "name": "display_name", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "username_colour": { + "name": "username_colour", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "email_verified": { + "name": "email_verified", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "pronouns": { + "name": "pronouns", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "verified": { + "name": "verified", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "bio": { + "name": "bio", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'No bio set'" + }, + "date_joined": { + "name": "date_joined", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "plan": { + "name": "plan", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'free'" + }, + "is_banned": { + "name": "is_banned", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "is_contributor": { + "name": "is_contributor", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'user'" + } + }, + "indexes": { + "authUser_username_unique": { + "name": "authUser_username_unique", + "columns": ["username"], + "isUnique": true + }, + "user_id_idx": { + "name": "user_id_idx", + "columns": ["id"], + "isUnique": false + }, + "user_username_idx": { + "name": "user_username_idx", + "columns": ["username"], + "isUnique": false + }, + "user_email_idx": { + "name": "user_email_idx", + "columns": ["email"], + "isUnique": false + }, + "user_contributor_idx": { + "name": "user_contributor_idx", + "columns": ["is_contributor"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "stripeUser": { + "name": "stripeUser", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "stripe_customer_id": { + "name": "stripe_customer_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "stripe_subscription_id": { + "name": "stripe_subscription_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "ends_at": { + "name": "ends_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "paid_until": { + "name": "paid_until", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "stripe_user_user_id_idx": { + "name": "stripe_user_user_id_idx", + "columns": ["user_id"], + "isUnique": false + }, + "stripe_user_stripe_customer_id_idx": { + "name": "stripe_user_stripe_customer_id_idx", + "columns": ["stripe_customer_id"], + "isUnique": false + } + }, + "foreignKeys": { + "stripeUser_user_id_authUser_id_fk": { + "name": "stripeUser_user_id_authUser_id_fk", + "tableFrom": "stripeUser", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "authSession": { + "name": "authSession", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_agent": { + "name": "user_agent", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "country_code": { + "name": "country_code", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "ip_address": { + "name": "ip_address", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "session_user_id_idx": { + "name": "session_user_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "authSession_user_id_authUser_id_fk": { + "name": "authSession_user_id_authUser_id_fk", + "tableFrom": "authSession", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "emailVerificationToken": { + "name": "emailVerificationToken", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "email_verification_token_user_id_idx": { + "name": "email_verification_token_user_id_idx", + "columns": ["user_id"], + "isUnique": false + }, + "email_verification_token_token_idx": { + "name": "email_verification_token_token_idx", + "columns": ["token"], + "isUnique": false + } + }, + "foreignKeys": { + "emailVerificationToken_user_id_authUser_id_fk": { + "name": "emailVerificationToken_user_id_authUser_id_fk", + "tableFrom": "emailVerificationToken", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "passwordResetToken": { + "name": "passwordResetToken", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "password_reset_token_user_id_idx": { + "name": "password_reset_token_user_id_idx", + "columns": ["user_id"], + "isUnique": false + }, + "password_reset_token_token_idx": { + "name": "password_reset_token_token_idx", + "columns": ["token"], + "isUnique": false + } + }, + "foreignKeys": { + "passwordResetToken_user_id_authUser_id_fk": { + "name": "passwordResetToken_user_id_authUser_id_fk", + "tableFrom": "passwordResetToken", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userCollection": { + "name": "userCollection", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "date_created": { + "name": "date_created", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "accent_colour": { + "name": "accent_colour", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": { + "collection_id_idx": { + "name": "collection_id_idx", + "columns": ["id"], + "isUnique": false + }, + "user_collection_id_idx": { + "name": "user_collection_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "userCollection_user_id_authUser_id_fk": { + "name": "userCollection_user_id_authUser_id_fk", + "tableFrom": "userCollection", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userCollectionAsset": { + "name": "userCollectionAsset", + "columns": { + "collection_id": { + "name": "collection_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "date_added": { + "name": "date_added", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "collection_assets_collection_id_idx": { + "name": "collection_assets_collection_id_idx", + "columns": ["collection_id"], + "isUnique": false + }, + "collection_assets_asset_id_idx": { + "name": "collection_assets_asset_id_idx", + "columns": ["asset_id"], + "isUnique": false + } + }, + "foreignKeys": { + "userCollectionAsset_collection_id_userCollection_id_fk": { + "name": "userCollectionAsset_collection_id_userCollection_id_fk", + "tableFrom": "userCollectionAsset", + "tableTo": "userCollection", + "columnsFrom": ["collection_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "userCollectionAsset_asset_id_asset_id_fk": { + "name": "userCollectionAsset_asset_id_asset_id_fk", + "tableFrom": "userCollectionAsset", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "socialsConnection": { + "name": "socialsConnection", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "discord_id": { + "name": "discord_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "socialsConnection_user_id_unique": { + "name": "socialsConnection_user_id_unique", + "columns": ["user_id"], + "isUnique": true + }, + "socials_connection_user_id_idx": { + "name": "socials_connection_user_id_idx", + "columns": ["user_id"], + "isUnique": false + }, + "socials_connection_discord_id_idx": { + "name": "socials_connection_discord_id_idx", + "columns": ["discord_id"], + "isUnique": false + } + }, + "foreignKeys": { + "socialsConnection_user_id_authUser_id_fk": { + "name": "socialsConnection_user_id_authUser_id_fk", + "tableFrom": "socialsConnection", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userFollowing": { + "name": "userFollowing", + "columns": { + "followerId": { + "name": "followerId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "followingId": { + "name": "followingId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "userfollowing_follower_idx": { + "name": "userfollowing_follower_idx", + "columns": ["followerId"], + "isUnique": false + }, + "userfollowing_following_idx": { + "name": "userfollowing_following_idx", + "columns": ["followingId"], + "isUnique": false + } + }, + "foreignKeys": { + "userFollowing_followerId_authUser_id_fk": { + "name": "userFollowing_followerId_authUser_id_fk", + "tableFrom": "userFollowing", + "tableTo": "authUser", + "columnsFrom": ["followerId"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "userFollowing_followingId_authUser_id_fk": { + "name": "userFollowing_followingId_authUser_id_fk", + "tableFrom": "userFollowing", + "tableTo": "authUser", + "columnsFrom": ["followingId"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userBlocked": { + "name": "userBlocked", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "blocked_by_id": { + "name": "blocked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "blocked_id": { + "name": "blocked_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "user_blocked_id_idx": { + "name": "user_blocked_id_idx", + "columns": ["id"], + "isUnique": false + }, + "user_blocked_blocked_by_id_idx": { + "name": "user_blocked_blocked_by_id_idx", + "columns": ["blocked_by_id"], + "isUnique": false + }, + "user_blocked_blocked_id_idx": { + "name": "user_blocked_blocked_id_idx", + "columns": ["blocked_id"], + "isUnique": false + } + }, + "foreignKeys": { + "userBlocked_blocked_by_id_authUser_id_fk": { + "name": "userBlocked_blocked_by_id_authUser_id_fk", + "tableFrom": "userBlocked", + "tableTo": "authUser", + "columnsFrom": ["blocked_by_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "userBlocked_blocked_id_authUser_id_fk": { + "name": "userBlocked_blocked_id_authUser_id_fk", + "tableFrom": "userBlocked", + "tableTo": "authUser", + "columnsFrom": ["blocked_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userCollectionLikes": { + "name": "userCollectionLikes", + "columns": { + "collection_id": { + "name": "collection_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "userCollectionNetworking_collection_idx": { + "name": "userCollectionNetworking_collection_idx", + "columns": ["collection_id"], + "isUnique": false + }, + "userCollectionNetworking_likedBy_idx": { + "name": "userCollectionNetworking_likedBy_idx", + "columns": ["liked_by_id"], + "isUnique": false + } + }, + "foreignKeys": { + "userCollectionLikes_collection_id_userCollection_id_fk": { + "name": "userCollectionLikes_collection_id_userCollection_id_fk", + "tableFrom": "userCollectionLikes", + "tableTo": "userCollection", + "columnsFrom": ["collection_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "userCollectionLikes_liked_by_id_authUser_id_fk": { + "name": "userCollectionLikes_liked_by_id_authUser_id_fk", + "tableFrom": "userCollectionLikes", + "tableTo": "authUser", + "columnsFrom": ["liked_by_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userCollectionCollaborators": { + "name": "userCollectionCollaborators", + "columns": { + "collection_id": { + "name": "collection_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "collaborator_id": { + "name": "collaborator_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'collaborator'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "userCollectionCollaborators_collectionId_idx": { + "name": "userCollectionCollaborators_collectionId_idx", + "columns": ["collection_id"], + "isUnique": false + }, + "userCollectionCollaborators_collaboratorId_idx": { + "name": "userCollectionCollaborators_collaboratorId_idx", + "columns": ["collaborator_id"], + "isUnique": false + } + }, + "foreignKeys": { + "userCollectionCollaborators_collection_id_userCollection_id_fk": { + "name": "userCollectionCollaborators_collection_id_userCollection_id_fk", + "tableFrom": "userCollectionCollaborators", + "tableTo": "userCollection", + "columnsFrom": ["collection_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "userCollectionCollaborators_collaborator_id_authUser_id_fk": { + "name": "userCollectionCollaborators_collaborator_id_authUser_id_fk", + "tableFrom": "userCollectionCollaborators", + "tableTo": "authUser", + "columnsFrom": ["collaborator_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "requestForm": { + "name": "requestForm", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "requestForm_id_unique": { + "name": "requestForm_id_unique", + "columns": ["id"], + "isUnique": true + }, + "request_form_user_id_idx": { + "name": "request_form_user_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "requestForm_user_id_authUser_id_fk": { + "name": "requestForm_user_id_authUser_id_fk", + "tableFrom": "requestForm", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "requestFormUpvotes": { + "name": "requestFormUpvotes", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "request_form_id": { + "name": "request_form_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "requestFormUpvotes_id_unique": { + "name": "requestFormUpvotes_id_unique", + "columns": ["id"], + "isUnique": true + }, + "request_form_upvotes_idx": { + "name": "request_form_upvotes_idx", + "columns": ["request_form_id", "user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "requestFormUpvotes_request_form_id_requestForm_id_fk": { + "name": "requestFormUpvotes_request_form_id_requestForm_id_fk", + "tableFrom": "requestFormUpvotes", + "tableTo": "requestForm", + "columnsFrom": ["request_form_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "requestFormUpvotes_user_id_authUser_id_fk": { + "name": "requestFormUpvotes_user_id_authUser_id_fk", + "tableFrom": "requestFormUpvotes", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + } + }, + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + } +} diff --git a/src/v2/db/migrations/meta/_journal.json b/src/v2/db/migrations/meta/_journal.json new file mode 100644 index 0000000..eb5f8ff --- /dev/null +++ b/src/v2/db/migrations/meta/_journal.json @@ -0,0 +1,13 @@ +{ + "version": "5", + "dialect": "sqlite", + "entries": [ + { + "idx": 0, + "version": "5", + "when": 1712221494215, + "tag": "0000_lazy_krista_starr", + "breakpoints": true + } + ] +} diff --git a/src/v2/routes/asset/search-assets.ts b/src/v2/routes/asset/search-assets.ts index d7bf0ac..4b15fe4 100644 --- a/src/v2/routes/asset/search-assets.ts +++ b/src/v2/routes/asset/search-assets.ts @@ -19,6 +19,8 @@ const responseSchema = z.object({ name: true, extension: true, url: true, + assetCategoryId: true, + gameId: true, viewCount: true, downloadCount: true, fileSize: true, @@ -163,6 +165,8 @@ export const AssetSearchAllFilterRoute = (handler: AppHandler) => { name: true, extension: true, url: true, + assetCategoryId: true, + gameId: true, viewCount: true, downloadCount: true, fileSize: true, From b22112ed37e1ed20f2ab9cf5efe6ef3fdaeeac03 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Thu, 4 Apr 2024 16:07:43 +0100 Subject: [PATCH 303/318] ok bro --- src/v2/db/turso.ts | 5 ++--- src/v2/lib/auth/lucia.ts | 4 ++-- wrangler.toml | 5 +++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/v2/db/turso.ts b/src/v2/db/turso.ts index f612eab..c04b785 100644 --- a/src/v2/db/turso.ts +++ b/src/v2/db/turso.ts @@ -26,11 +26,10 @@ export function getConnection(env: Bindings) { * The `url` option is set to the `TURSO_DATABASE_URL` environment variable. * The `authToken` option is set to the `TURSO_DATABASE_AUTH_TOKEN` environment variable. **/ - const isDev = env.ENVIRONMENT !== "PROD" const turso = createClient({ - url: isDev ? "http://127.0.0.1:8080" : env.TURSO_DATABASE_URL!, - authToken: isDev ? undefined : env.TURSO_DATABASE_AUTH_TOKEN!, + url: env.TURSO_DATABASE_URL!, + authToken: env.TURSO_DATABASE_AUTH_TOKEN!, }) /** diff --git a/src/v2/lib/auth/lucia.ts b/src/v2/lib/auth/lucia.ts index 284e213..3ed4b32 100644 --- a/src/v2/lib/auth/lucia.ts +++ b/src/v2/lib/auth/lucia.ts @@ -51,8 +51,8 @@ export function luciaAuth(env: Bindings) { // plus i feel this is better user experience in general lol expires: false, attributes: { - secure: env.ENVIRONMENT === "PROD", - sameSite: env.ENVIRONMENT === "PROD" ? "strict" : "lax", + secure: true, + sameSite: "strict", path: "/", }, }, diff --git a/wrangler.toml b/wrangler.toml index 3056f29..bb4bda8 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -7,8 +7,9 @@ workers_dev = true [[r2_buckets]] binding = 'FILES_BUCKET' -bucket_name = 'files' -preview_bucket_name = 'files' +bucket_name = 'files-wanderer-moe' +preview_bucket_name = 'files-wanderer-moe' +jurisdiction = 'eu' [durable_objects] bindings = [ From 5cdaa89c3f1927c8e405e444c811517579514f72 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Thu, 4 Apr 2024 17:49:30 +0100 Subject: [PATCH 304/318] display session in validation --- src/v2/routes/auth/validate-current-session.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/v2/routes/auth/validate-current-session.ts b/src/v2/routes/auth/validate-current-session.ts index c30ee05..02d2816 100644 --- a/src/v2/routes/auth/validate-current-session.ts +++ b/src/v2/routes/auth/validate-current-session.ts @@ -3,11 +3,12 @@ import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" import { createRoute } from "@hono/zod-openapi" import { GenericResponses } from "@/v2/lib/response-schemas" import { z } from "@hono/zod-openapi" -import { selectUserSchema } from "@/v2/db/schema" +import { selectSessionSchema, selectUserSchema } from "@/v2/db/schema" const responseSchema = z.object({ success: z.literal(true), user: selectUserSchema, + session: selectSessionSchema, }) const openRoute = createRoute({ @@ -33,7 +34,7 @@ export const ValidateSessionRoute = (handler: AppHandler) => { handler.openapi(openRoute, async (ctx) => { const authSessionManager = new AuthSessionManager(ctx) - const { user } = await authSessionManager.validateSession() + const { user, session } = await authSessionManager.validateSession() if (!user) { return ctx.json( @@ -48,7 +49,8 @@ export const ValidateSessionRoute = (handler: AppHandler) => { return ctx.json( { success: true, - user, + user: user, + session: session, }, 200 ) From b3df3a0d507b9d1e0c4fca7839a2916baf691db5 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Thu, 4 Apr 2024 21:56:19 +0100 Subject: [PATCH 305/318] add limit to asset query etc --- src/index.ts | 2 +- src/v2/routes/asset/get-asset.ts | 2 ++ src/v2/routes/asset/search-assets.ts | 19 +++++++++++++++---- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/index.ts b/src/index.ts index e287f47..7fd646e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -19,7 +19,7 @@ app.use( "*", cors({ // todo(dromzeh): this should be set dependant on ENV, PROD or DEV w/ next() for context - origin: "*", + origin: "http://localhost:3000", credentials: true, }) ) diff --git a/src/v2/routes/asset/get-asset.ts b/src/v2/routes/asset/get-asset.ts index a3b842a..814bcb1 100644 --- a/src/v2/routes/asset/get-asset.ts +++ b/src/v2/routes/asset/get-asset.ts @@ -36,6 +36,7 @@ const responseSchema = z.object({ url: true, viewCount: true, downloadCount: true, + uploadedDate: true, fileSize: true, width: true, height: true, @@ -106,6 +107,7 @@ export const GetAssetByIdRoute = (handler: AppHandler) => { url: true, viewCount: true, downloadCount: true, + uploadedDate: true, fileSize: true, width: true, height: true, diff --git a/src/v2/routes/asset/search-assets.ts b/src/v2/routes/asset/search-assets.ts index 4b15fe4..e2a67bd 100644 --- a/src/v2/routes/asset/search-assets.ts +++ b/src/v2/routes/asset/search-assets.ts @@ -23,6 +23,7 @@ const responseSchema = z.object({ gameId: true, viewCount: true, downloadCount: true, + uploadedDate: true, fileSize: true, width: true, height: true, @@ -83,14 +84,22 @@ const querySchema = z }), offset: z.string().openapi({ param: { - description: - "The offset of the asset(s) to retrieve. For pagination / infinite scrolling.", + description: "The offset for the asset(s) to retrieve.", name: "offset", example: "0", in: "query", required: false, }, }), + limit: z.string().openapi({ + param: { + description: "The limit for the asset(s) to retrieve.", + name: "limit", + example: "25", + in: "query", + required: false, + }, + }), }) .partial() @@ -122,7 +131,8 @@ export const AssetSearchAllFilterRoute = (handler: AppHandler) => { handler.openapi(openRoute, async (ctx) => { const { drizzle } = await getConnection(ctx.env) - const { name, game, category, tags, offset } = ctx.req.valid("query") + const { name, game, category, tags, offset, limit } = + ctx.req.valid("query") const gameList = game ? SplitQueryByCommas(game.toLowerCase()) : null const categoryList = category @@ -158,7 +168,7 @@ export const AssetSearchAllFilterRoute = (handler: AppHandler) => { : undefined, eq(asset.status, "approved") ), - limit: 100, + limit: limit ? parseInt(limit) : 50, offset: offset ? parseInt(offset) : 0, columns: { id: true, @@ -169,6 +179,7 @@ export const AssetSearchAllFilterRoute = (handler: AppHandler) => { gameId: true, viewCount: true, downloadCount: true, + uploadedDate: true, fileSize: true, width: true, height: true, From 014fa58157360491ab4a6c20d784bc0a775701fc Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Thu, 4 Apr 2024 22:59:01 +0100 Subject: [PATCH 306/318] ? --- src/v2/routes/auth/account-login.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/v2/routes/auth/account-login.ts b/src/v2/routes/auth/account-login.ts index ff7a5d8..aad1385 100644 --- a/src/v2/routes/auth/account-login.ts +++ b/src/v2/routes/auth/account-login.ts @@ -14,10 +14,6 @@ const requestBodySchema = z.object({ description: "The password of the user.", example: "password1234", }), - passwordConfirmation: z.string().min(8).max(64).openapi({ - description: "The password confirmation of the user.", - example: "password1234", - }), }) const responseSchema = z.object({ From 6ea1be4f4b81f83eb807b264d84ffb8361ae60e7 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Fri, 5 Apr 2024 19:38:56 +0100 Subject: [PATCH 307/318] search asset support uploader parameter --- src/v2/routes/asset/search-assets.ts | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/v2/routes/asset/search-assets.ts b/src/v2/routes/asset/search-assets.ts index e2a67bd..5c4460d 100644 --- a/src/v2/routes/asset/search-assets.ts +++ b/src/v2/routes/asset/search-assets.ts @@ -82,6 +82,16 @@ const querySchema = z required: false, }, }), + uploader: z.string().openapi({ + param: { + description: + "The uploader usernames(s) of the asset(s) to retrieve. Comma seperated.", + name: "uploaders", + in: "query", + example: "user1,user2", + required: false, + }, + }), offset: z.string().openapi({ param: { description: "The offset for the asset(s) to retrieve.", @@ -131,7 +141,7 @@ export const AssetSearchAllFilterRoute = (handler: AppHandler) => { handler.openapi(openRoute, async (ctx) => { const { drizzle } = await getConnection(ctx.env) - const { name, game, category, tags, offset, limit } = + const { name, game, category, tags, offset, limit, uploader } = ctx.req.valid("query") const gameList = game ? SplitQueryByCommas(game.toLowerCase()) : null @@ -166,6 +176,13 @@ export const AssetSearchAllFilterRoute = (handler: AppHandler) => { ) ) : undefined, + uploader + ? or( + ...SplitQueryByCommas(uploader).map((uploader) => + eq(asset.uploadedByName, uploader) + ) + ) + : undefined, eq(asset.status, "approved") ), limit: limit ? parseInt(limit) : 50, From 79e005301b1fed2c8eec17a119dbaf9764b413a9 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sat, 6 Apr 2024 02:02:57 +0100 Subject: [PATCH 308/318] rm real examples from seed data --- src/scripts/seed/seed.ts | 131 +++++++++++++++++++-------------------- 1 file changed, 65 insertions(+), 66 deletions(-) diff --git a/src/scripts/seed/seed.ts b/src/scripts/seed/seed.ts index 9fe7b08..af66fb3 100644 --- a/src/scripts/seed/seed.ts +++ b/src/scripts/seed/seed.ts @@ -19,23 +19,16 @@ import { } from "@/v2/db/schema" import { Scrypt } from "lucia" import "dotenv/config" -import * as dotenv from "dotenv" import { generateID } from "@/v2/lib/oslo" -dotenv.config({ path: ".dev.vars" }) - -const { ENVIRONMENT, TURSO_DEV_DATABASE_URL = "http://127.0.0.1:8080" } = - process.env async function main() { - if (ENVIRONMENT !== "DEV") { - console.log("This script can only be run in development mode.") - process.exit(1) - } console.log("[SEED] Connecting to database client...") + + // this script will only be ran in local dev so we can hardcode the url here const client = createClient({ - url: TURSO_DEV_DATABASE_URL, + url: "http://127.0.0.1:8080", }) const db = drizzleORM(client) console.log( @@ -60,7 +53,7 @@ async function main() { }, { username: "testuser2", - email: "testuser2@dromzeh.dev", + email: "testuser2@wanderer.moe", emailVerified: 1, bio: "test bio 2", pronouns: "he/him/his", @@ -167,21 +160,21 @@ async function main() { .insert(assetTag) .values([ { - id: "official", - name: "official", - formattedName: "Official", + id: "test-tag-1", + name: "test-tag-1", + formattedName: "Test Tag 1", lastUpdated: new Date().toISOString(), }, { - id: "1.0", - name: "1.0", - formattedName: "1.0", + id: "test-tag-2", + name: "test-tag-2", + formattedName: "Test Tag 2", lastUpdated: new Date().toISOString(), }, { - id: "fanmade", - name: "fanmade", - formattedName: "Fanmade", + id: "test-tag-3", + name: "test-tag-3", + formattedName: "Test Tag 3", lastUpdated: new Date().toISOString(), }, ]) @@ -193,15 +186,21 @@ async function main() { .insert(game) .values([ { - id: "genshin-impact", - name: "genshin-impact", - formattedName: "Genshin Impact", + id: "test-game-1", + name: "test-game-1", + formattedName: "Test Game 1", lastUpdated: new Date().toISOString(), }, { - id: "honkai-impact-3rd", - name: "honkai-impact-3rd", - formattedName: "Honkai Impact: 3rd", + id: "test-game-2", + name: "test-game-2", + formattedName: "Test Game 2", + lastUpdated: new Date().toISOString(), + }, + { + id: "test-game-3", + name: "test-game-3", + formattedName: "Test Game 3", lastUpdated: new Date().toISOString(), }, ]) @@ -213,15 +212,15 @@ async function main() { .insert(assetCategory) .values([ { - id: "character-sheets", - name: "character-sheets", - formattedName: "Character Sheets", + id: "test-category-1", + name: "test-category-1", + formattedName: "Test Category 1", lastUpdated: new Date().toISOString(), }, { - id: "splash-art", - name: "splash-art", - formattedName: "Splash Art", + id: "test-category-2", + name: "test-category-2", + formattedName: "Test Category 2", lastUpdated: new Date().toISOString(), }, ]) @@ -237,16 +236,16 @@ async function main() { .insert(gameAssetCategory) .values([ { - gameId: "genshin-impact", - assetCategoryId: "character-sheets", + gameId: newGames[0].id, + assetCategoryId: newAssetCategories[0].id, }, { - gameId: "genshin-impact", - assetCategoryId: "splash-art", + gameId: newGames[1].id, + assetCategoryId: newAssetCategories[1].id, }, { - gameId: "honkai-impact-3rd", - assetCategoryId: "character-sheets", + gameId: newGames[0].id, + assetCategoryId: newAssetCategories[1].id, }, ]) .returning() @@ -267,9 +266,9 @@ async function main() { id: assetIDArray[0], name: "test-asset", extension: "image/png", - gameId: "genshin-impact", - assetCategoryId: "character-sheets", - url: `/assets/${assetIDArray[0]}.png`, + gameId: "test-game-1", + assetCategoryId: "test-category-2", + url: `/asset/${assetIDArray[0]}.png`, status: "approved", uploadedById: newUsers[0].id, uploadedByName: newUsers[0].username, @@ -283,9 +282,9 @@ async function main() { id: assetIDArray[1], name: "test-asset-2", extension: "image/png", - gameId: "honkai-impact-3rd", - assetCategoryId: "character-sheets", - url: `/assets/${assetIDArray[1]}.png`, + gameId: "test-game-2", + assetCategoryId: "test-category-2", + url: `/asset/${assetIDArray[1]}.png`, status: "approved", uploadedById: newUsers[1].id, uploadedByName: newUsers[1].username, @@ -299,9 +298,9 @@ async function main() { id: assetIDArray[2], name: "test-asset-3", extension: "image/png", - gameId: "genshin-impact", - assetCategoryId: "splash-art", - url: `/assets/${assetIDArray[2]}.png`, + gameId: "test-game-1", + assetCategoryId: "test-category-1", + url: `/asset/${assetIDArray[2]}.png`, status: "approved", uploadedById: newUsers[1].id, uploadedByName: newUsers[1].username, @@ -315,9 +314,9 @@ async function main() { id: assetIDArray[3], name: "test-asset-4", extension: "image/png", - gameId: "genshin-impact", - assetCategoryId: "splash-art", - url: `/assets/${assetIDArray[3]}.png`, + gameId: "test-game-1", + assetCategoryId: "test-category-2", + url: `/asset/${assetIDArray[3]}.png`, status: "approved", uploadedById: newUsers[1].id, uploadedByName: newUsers[1].username, @@ -331,9 +330,9 @@ async function main() { id: assetIDArray[4], name: "test-asset-5", extension: "image/png", - gameId: "genshin-impact", - assetCategoryId: "splash-art", - url: `/assets/${assetIDArray[4]}.png`, + gameId: "test-game-1", + assetCategoryId: "test-category-2", + url: `/asset/${assetIDArray[4]}.png`, status: "approved", uploadedById: newUsers[2].id, uploadedByName: newUsers[2].username, @@ -342,11 +341,11 @@ async function main() { }, { id: assetIDArray[5], - name: "test-asset-6", + name: "test-asset-5", extension: "image/png", - gameId: "honkai-impact-3rd", - assetCategoryId: "character-sheets", - url: `/assets/${assetIDArray[5]}.png`, + gameId: "test-game-3", + assetCategoryId: "test-category-2", + url: `/asset/${assetIDArray[5]}.png`, status: "approved", uploadedById: newUsers[2].id, uploadedByName: newUsers[2].username, @@ -363,39 +362,39 @@ async function main() { .values([ { assetId: newAssets[0].id, - assetTagId: "official", + assetTagId: "test-tag-1", }, { assetId: newAssets[0].id, - assetTagId: "1.0", + assetTagId: "test-tag-2", }, { assetId: newAssets[1].id, - assetTagId: "official", + assetTagId: "test-tag-1", }, { assetId: newAssets[2].id, - assetTagId: "official", + assetTagId: "test-tag-1", }, { assetId: newAssets[2].id, - assetTagId: "1.0", + assetTagId: "test-tag-2", }, { assetId: newAssets[3].id, - assetTagId: "fanmade", + assetTagId: "test-tag-3", }, { assetId: newAssets[4].id, - assetTagId: "fanmade", + assetTagId: "test-tag-3", }, { assetId: newAssets[5].id, - assetTagId: "fanmade", + assetTagId: "test-tag-3", }, { assetId: newAssets[5].id, - assetTagId: "1.0", + assetTagId: "test-tag-2", }, ]) .returning() From 09cac3f41d95cece575ffd7d09f12f2fc4bc3e34 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sat, 6 Apr 2024 02:03:48 +0100 Subject: [PATCH 309/318] prettier --- src/scripts/seed/seed.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/scripts/seed/seed.ts b/src/scripts/seed/seed.ts index af66fb3..7a20ad1 100644 --- a/src/scripts/seed/seed.ts +++ b/src/scripts/seed/seed.ts @@ -21,11 +21,9 @@ import { Scrypt } from "lucia" import "dotenv/config" import { generateID } from "@/v2/lib/oslo" - async function main() { - console.log("[SEED] Connecting to database client...") - + // this script will only be ran in local dev so we can hardcode the url here const client = createClient({ url: "http://127.0.0.1:8080", From 431c54d05701c130c5804e75b5eb195291b9a68d Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 5 May 2024 21:19:11 +0100 Subject: [PATCH 310/318] fix openapi spec, update scalar css --- src/openapi/config.ts | 212 ++++++++++----------------- src/v2/routes/asset/search-assets.ts | 2 +- src/v2/routes/auth/account-create.ts | 11 ++ 3 files changed, 90 insertions(+), 135 deletions(-) diff --git a/src/openapi/config.ts b/src/openapi/config.ts index 86f9672..fbab324 100644 --- a/src/openapi/config.ts +++ b/src/openapi/config.ts @@ -16,137 +16,81 @@ export const OpenAPIConfig = { } export const CustomCSS: string = ` - :root { - --theme-font: 'Inter', var(--system-fonts); - } - - ::moz-selection { - background: var(--theme-color-accent); - color: #fff; - } - - ::selection { - background: var(--theme-color-accent); - color: #fff; - } - - /* basic theme */ - .light-mode { - --theme-color-1: #2a2f45; - --theme-color-2: #757575; - --theme-color-3: #8e8e8e; - --theme-color-accent: #EA8FEA; - - --theme-background-1: #fff; - --theme-background-2: #f6f6f6; - --theme-background-3: #e7e7e7; - --theme-background-accent: #8ab4f81f; - - --theme-border-color: rgba(0, 0, 0, 0.1); - } - .dark-mode { - --theme-color-1: rgba(255, 255, 255, 0.9); - --theme-color-2: rgba(255, 255, 255, 0.62); - --theme-color-3: rgba(255, 255, 255, 0.44); - --theme-color-accent: #EA8FEA; - - --theme-background-1: #09090B; - --theme-background-2: #111113; - --theme-background-3: #19191A; - --theme-background-accent: #8ab4f81f; - - --theme-border-color: rgba(255, 255, 255, 0.1); - } - /* Document header */ - .light-mode .t-doc__header { - --header-background-1: var(--theme-background-1); - --header-border-color: var(--theme-border-color); - --header-color-1: var(--theme-color-1); - --header-color-2: var(--theme-color-2); - --header-background-toggle: var(--theme-color-3); - --header-call-to-action-color: var(--theme-color-accent); - } - - .dark-mode .t-doc__header { - --header-background-1: var(--theme-background-1); - --header-border-color: var(--theme-border-color); - --header-color-1: var(--theme-color-1); - --header-color-2: var(--theme-color-2); - --header-background-toggle: var(--theme-color-3); - --header-call-to-action-color: var(--theme-color-accent); - } - /* Document Sidebar */ - .light-mode .t-doc__sidebar { - --sidebar-background-1: var(--theme-background-1); - --sidebar-item-hover-color: currentColor; - --sidebar-item-hover-background: var(--theme-background-2); - --sidebar-item-active-background: var(--theme-background-accent); - --sidebar-border-color: var(--theme-border-color); - --sidebar-color-1: var(--theme-color-1); - --sidebar-color-2: var(--theme-color-2); - --sidebar-color-active: var(--theme-color-accent); - --sidebar-search-background: transparent; - --sidebar-search-border-color: var(--theme-border-color); - --sidebar-search--color: var(--theme-color-3); - } - - .dark-mode .sidebar { - --sidebar-background-1: var(--theme-background-1); - --sidebar-item-hover-color: currentColor; - --sidebar-item-hover-background: var(--theme-background-2); - --sidebar-item-active-background: var(--theme-background-accent); - --sidebar-border-color: var(--theme-border-color); - --sidebar-color-1: var(--theme-color-1); - --sidebar-color-2: var(--theme-color-2); - --sidebar-color-active: var(--theme-color-accent); - --sidebar-search-background: transparent; - --sidebar-search-border-color: var(--theme-border-color); - --sidebar-search--color: var(--theme-color-3); - } - - .sidebar-heading-link { - font-weight: 600; - } - - .item-entry-description { - color: rgba(255, 255, 255, 0.44) !important; - } - - /* advanced */ - .light-mode { - --theme-button-1: rgb(49 53 56); - --theme-button-1-color: #fff; - --theme-button-1-hover: rgb(28 31 33); - - --theme-color-green: #C8FFD4; - --theme-color-red: #FF8080; - --theme-color-yellow: #edbe20; - --theme-color-blue: #B8E8FC; - --theme-color-orange: #FFCF96; - --theme-color-purple: #EA8FEA; - - --theme-scrollbar-color: rgba(0, 0, 0, 0.18); - --theme-scrollbar-color-active: rgba(0, 0, 0, 0.36); - } - .dark-mode { - --theme-button-1: #f6f6f6; - --theme-button-1-color: #000; - --theme-button-1-hover: #e7e7e7; - - --theme-color-green: #C8FFD4; - --theme-color-red: #FF8080; - --theme-color-yellow: #ffc90d; - --theme-color-blue: #B8E8FC; - --theme-color-orange: #FFCF96; - --theme-color-purple: #EA8FEA; - - --theme-scrollbar-color: rgba(255, 255, 255, 0.24); - --theme-scrollbar-color-active: rgba(255, 255, 255, 0.48); - } - :root { - --theme-radius: 3px; - --theme-radius-lg: 6px; - --theme-radius-xl: 8px; - - --theme-header-height: 50px; - }` +:root { + --scalar-font: 'Inter'; + } + /* basic theme */ + .light-mode { + --scalar-background-1: #fff; + --scalar-background-2: #f5f6f8; + --scalar-background-3: #e7e7e7; + + --scalar-color-1: #2a2f45; + --scalar-color-2: #757575; + --scalar-color-3: #8e8e8e; + + --scalar-color-accent: #EA8FEA; + --scalar-background-accent: #8ab4f81f; + + --scalar-border-color: rgba(215, 215, 206, 0.5); + } + .dark-mode { + --scalar-background-1: #09090B; + --scalar-background-2: #111113; + --scalar-background-3: #19191A; + + --scalar-color-1: rgba(255, 255, 255, 0.9); + --scalar-color-2: rgba(255, 255, 255, 0.62); + --scalar-color-3: rgba(255, 255, 255, 0.44); + + --scalar-color-accent: #EA8FEA; + --scalar-background-accent: #8ab4f81f; + + --scalar-border-color: rgba(255, 255, 255, 0.12); + } + /* Document header */ + .light-mode .t-doc__header, + .dark-mode .t-doc__header { + --header-background-1: var(--scalar-background-1); + --header-border-color: var(--scalar-border-color); + --header-color-1: var(--scalar-color-1); + --header-color-2: var(--scalar-color-2); + --header-call-to-action-color: var(--scalar-color-accent); + } + /* Document Sidebar */ + .light-mode .t-doc__sidebar, + .dark-mode .t-doc__sidebar { + --scalar-sidebar-background-1: var(--scalar-background-1); + --scalar-sidebar-color-1: var(--scalar-color-1); + --scalar-sidebar-color-2: var(--scalar-color-2); + --scalar-sidebar-border-color: var(--scalar-border-color); + + --scalar-sidebar-item-hover-background: var(--scalar-background-3); + --scalar-sidebar-item-hover-color: currentColor; + + --scalar-sidebar-item-active-background: var(--scalar-background-accent); + --scalar-sidebar-color-active: var(--scalar-color-accent); + + --scalar-sidebar-search-background: var(--scalar-background-1); + --scalar-sidebar-search-color: var(--scalar-color-3); + --scalar-sidebar-search-border-color: var(--scalar-border-color); + } + + /* advanced */ + .light-mode { + --scalar-color-green: #C8FFD4; + --scalar-color-red: #FF8080; + --scalar-color-yellow: #edbe20; + --scalar-color-blue: #B8E8FC; + --scalar-color-orange: #FFCF96; + --scalar-color-purple: #EA8FEA; + } + .dark-mode { + --scalar-color-green: #C8FFD4; + --scalar-color-red: #FF8080; + --scalar-color-yellow: #ffc90d; + --scalar-color-blue: #B8E8FC; + --scalar-color-orange: #FFCF96; + --scalar-color-purple: #EA8FEA; + } +` diff --git a/src/v2/routes/asset/search-assets.ts b/src/v2/routes/asset/search-assets.ts index 5c4460d..a43f611 100644 --- a/src/v2/routes/asset/search-assets.ts +++ b/src/v2/routes/asset/search-assets.ts @@ -86,7 +86,7 @@ const querySchema = z param: { description: "The uploader usernames(s) of the asset(s) to retrieve. Comma seperated.", - name: "uploaders", + name: "uploader", in: "query", example: "user1,user2", required: false, diff --git a/src/v2/routes/auth/account-create.ts b/src/v2/routes/auth/account-create.ts index a4170ae..19f6fbd 100644 --- a/src/v2/routes/auth/account-create.ts +++ b/src/v2/routes/auth/account-create.ts @@ -58,6 +58,17 @@ const openRoute = createRoute({ export const UserCreateAccountRoute = (handler: AppHandler) => { handler.openapi(openRoute, async (ctx) => { + const returnUnauth = true + + if (returnUnauth) { + return ctx.json( + { + success: true, + }, + 401 + ) + } + const authSessionManager = new AuthSessionManager(ctx) const { user } = await authSessionManager.validateSession() From ac016bf4f9ad08066cb8cc3728480c1dafc60afa Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Sun, 5 May 2024 23:57:22 +0100 Subject: [PATCH 311/318] we are so locked in (trust me) --- src/index.ts | 2 +- src/v2/routes/collection/create-collection.ts | 88 +++++++++++++++ src/v2/routes/collection/delete-collection.ts | 101 ++++++++++++++++++ src/v2/routes/collection/handler.ts | 10 ++ src/v2/routes/handler.ts | 2 + 5 files changed, 202 insertions(+), 1 deletion(-) create mode 100644 src/v2/routes/collection/handler.ts diff --git a/src/index.ts b/src/index.ts index 7fd646e..fe898a6 100644 --- a/src/index.ts +++ b/src/index.ts @@ -61,4 +61,4 @@ app.onError((err, ctx) => { ) }) -export default app +export default app \ No newline at end of file diff --git a/src/v2/routes/collection/create-collection.ts b/src/v2/routes/collection/create-collection.ts index e69de29..ee4582c 100644 --- a/src/v2/routes/collection/create-collection.ts +++ b/src/v2/routes/collection/create-collection.ts @@ -0,0 +1,88 @@ +import { AppHandler } from "../handler" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" +import { getConnection } from "@/v2/db/turso" +import { selectUserCollectionSchema, userCollection } from "@/v2/db/schema" +import { ColourType } from "@/v2/lib/colour" + +const requestBodySchema = z.object({ + name: z.string().min(1).max(32), + description: z.string().min(1).max(256), + isPublic: z.number().int().min(0).max(1), + accentColour: z.string().length(7).optional(), // hex +}) + +const responseSchema = z.object({ + success: z.literal(true), + collection: selectUserCollectionSchema, +}) + +const openRoute = createRoute({ + path: "/collection/create", + method: "post", + summary: "Create a new collection.", + description: "Create a new collection, accent colours available for supporters", + tags: ["Collection"], + request: { + body: { + content: { + "application/json": { + schema: requestBodySchema, + }, + }, + }, + }, + responses: { + 200: { + description: "Returns the collection + true if the collection was made.", + content: { + "application/json": { + schema: responseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +export const CreateCollectionRoute = (handler: AppHandler) => { + handler.openapi(openRoute, async (ctx) => { + const authSessionManager = new AuthSessionManager(ctx) + + const { user } = await authSessionManager.validateSession() + + if (!user) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + const { name, description, isPublic, accentColour } = + ctx.req.valid("json") + + const { drizzle } = await getConnection(ctx.env) + + const [newCollection] = await drizzle.insert(userCollection) + .values({ + name: name, + userId: user.id, + description: description, + isPublic: Boolean(isPublic), + accentColour: accentColour as ColourType, + }).returning() + + return ctx.json( + { + success: true, + collection: newCollection, + }, + 200 + ) + }) +} diff --git a/src/v2/routes/collection/delete-collection.ts b/src/v2/routes/collection/delete-collection.ts index e69de29..d7a3499 100644 --- a/src/v2/routes/collection/delete-collection.ts +++ b/src/v2/routes/collection/delete-collection.ts @@ -0,0 +1,101 @@ +import { AppHandler } from "../handler" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" +import { getConnection } from "@/v2/db/turso" +import { userCollection } from "@/v2/db/schema" +import { eq } from "drizzle-orm" + +const pathSchema = z.object({ + id: z.string().openapi({ + param: { + name: "id", + in: "path", + description: "The ID of the collection to delete.", + required: true, + }, + }), +}) + +const responseSchema = z.object({ + success: z.literal(true), +}) + +const openRoute = createRoute({ + path: "/collection/{id}/delete", + method: "post", + summary: "Delete a collection.", + description: + "Delete a collection. Only the owner of the collection can delete it.", + tags: ["Collection"], + request: { + params: pathSchema, + }, + responses: { + 200: { + description: + "Returns true if the collection was deleted successfully.", + content: { + "application/json": { + schema: responseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +export const DeleteCollectionRoute = (handler: AppHandler) => { + handler.openapi(openRoute, async (ctx) => { + const authSessionManager = new AuthSessionManager(ctx) + + const { user } = await authSessionManager.validateSession() + + if (!user) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + const { id } = ctx.req.valid("param") + + const { drizzle } = await getConnection(ctx.env) + + const [existingCollection] = await drizzle + .select().from(userCollection) + + if (!existingCollection) { + return ctx.json( + { + success: false, + message: "Collection not found.", + }, + 404 + ) + } + + if (existingCollection.userId !== user.id) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + await drizzle.delete(userCollection).where(eq(userCollection.id, id)) + + return ctx.json( + { + success: true, + }, + 200 + ) + }) +} diff --git a/src/v2/routes/collection/handler.ts b/src/v2/routes/collection/handler.ts new file mode 100644 index 0000000..c8c8629 --- /dev/null +++ b/src/v2/routes/collection/handler.ts @@ -0,0 +1,10 @@ +import { OpenAPIHono } from "@hono/zod-openapi"; +import { CreateCollectionRoute } from "./create-collection"; +import { DeleteCollectionRoute } from "./delete-collection"; + +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>(); + +CreateCollectionRoute(handler); +DeleteCollectionRoute(handler); + +export default handler; \ No newline at end of file diff --git a/src/v2/routes/handler.ts b/src/v2/routes/handler.ts index 03d569c..93038c3 100644 --- a/src/v2/routes/handler.ts +++ b/src/v2/routes/handler.ts @@ -7,6 +7,7 @@ import ContributorRoute from "@/v2/routes/contributors/handler" import AuthRoute from "@/v2/routes/auth/handler" import RequestFormRoute from "@/v2/routes/requests/handler" import CategoriesRoute from "@/v2/routes/category/handler" +import CollectionsRoute from "@/v2/routes/collection/handler" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() @@ -18,6 +19,7 @@ handler.route("/user", UserRoute) handler.route("/contributors", ContributorRoute) handler.route("/auth", AuthRoute) handler.route("/request", RequestFormRoute) +handler.route("/collection", CollectionsRoute) export default handler From 3032fa8da0944e9fa495bf119812b656ba14ae03 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Mon, 6 May 2024 00:10:59 +0100 Subject: [PATCH 312/318] shdjgfsfkdhjkldfj;fdgdgkfjbh --- src/index.ts | 2 +- .../db/schema/collections/user-collections.ts | 2 +- src/v2/routes/collection/create-collection.ts | 12 +- src/v2/routes/collection/delete-collection.ts | 9 +- .../routes/collection/get-collection-assets | 0 src/v2/routes/collection/get-collection.ts | 165 ++++++++++++++++++ src/v2/routes/collection/handler.ts | 14 +- 7 files changed, 186 insertions(+), 18 deletions(-) create mode 100644 src/v2/routes/collection/get-collection-assets diff --git a/src/index.ts b/src/index.ts index fe898a6..7fd646e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -61,4 +61,4 @@ app.onError((err, ctx) => { ) }) -export default app \ No newline at end of file +export default app diff --git a/src/v2/db/schema/collections/user-collections.ts b/src/v2/db/schema/collections/user-collections.ts index 4c12f46..9c5dda6 100644 --- a/src/v2/db/schema/collections/user-collections.ts +++ b/src/v2/db/schema/collections/user-collections.ts @@ -114,7 +114,7 @@ export const selectUserCollectionAssetSchema = export const collectionRelations = relations( userCollection, ({ one, many }) => ({ - user: one(authUser, { + authUser: one(authUser, { fields: [userCollection.userId], references: [authUser.id], relationName: "collection_auth_user", diff --git a/src/v2/routes/collection/create-collection.ts b/src/v2/routes/collection/create-collection.ts index ee4582c..98e6643 100644 --- a/src/v2/routes/collection/create-collection.ts +++ b/src/v2/routes/collection/create-collection.ts @@ -23,7 +23,8 @@ const openRoute = createRoute({ path: "/collection/create", method: "post", summary: "Create a new collection.", - description: "Create a new collection, accent colours available for supporters", + description: + "Create a new collection, accent colours available for supporters", tags: ["Collection"], request: { body: { @@ -36,7 +37,8 @@ const openRoute = createRoute({ }, responses: { 200: { - description: "Returns the collection + true if the collection was made.", + description: + "Returns the collection + true if the collection was made.", content: { "application/json": { schema: responseSchema, @@ -68,14 +70,16 @@ export const CreateCollectionRoute = (handler: AppHandler) => { const { drizzle } = await getConnection(ctx.env) - const [newCollection] = await drizzle.insert(userCollection) + const [newCollection] = await drizzle + .insert(userCollection) .values({ name: name, userId: user.id, description: description, isPublic: Boolean(isPublic), accentColour: accentColour as ColourType, - }).returning() + }) + .returning() return ctx.json( { diff --git a/src/v2/routes/collection/delete-collection.ts b/src/v2/routes/collection/delete-collection.ts index d7a3499..73f0fca 100644 --- a/src/v2/routes/collection/delete-collection.ts +++ b/src/v2/routes/collection/delete-collection.ts @@ -61,14 +61,13 @@ export const DeleteCollectionRoute = (handler: AppHandler) => { 401 ) } - + const { id } = ctx.req.valid("param") const { drizzle } = await getConnection(ctx.env) - const [existingCollection] = await drizzle - .select().from(userCollection) - + const [existingCollection] = await drizzle.select().from(userCollection) + if (!existingCollection) { return ctx.json( { @@ -90,7 +89,7 @@ export const DeleteCollectionRoute = (handler: AppHandler) => { } await drizzle.delete(userCollection).where(eq(userCollection.id, id)) - + return ctx.json( { success: true, diff --git a/src/v2/routes/collection/get-collection-assets b/src/v2/routes/collection/get-collection-assets new file mode 100644 index 0000000..e69de29 diff --git a/src/v2/routes/collection/get-collection.ts b/src/v2/routes/collection/get-collection.ts index e69de29..1e2bae5 100644 --- a/src/v2/routes/collection/get-collection.ts +++ b/src/v2/routes/collection/get-collection.ts @@ -0,0 +1,165 @@ +import { AppHandler } from "../handler" +import { getConnection } from "@/v2/db/turso" +import { + userCollection, + userCollectionCollaborators, + selectUserCollectionSchema, + selectUserSchema, +} from "@/v2/db/schema" +import { and, eq } from "drizzle-orm" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" + +const paramsSchema = z.object({ + id: z.string().openapi({ + param: { + name: "id", + in: "path", + description: "The ID of the collection to retrieve.", + required: true, + }, + }), +}) + +const responseSchema = z.object({ + success: z.literal(true), + collection: selectUserCollectionSchema + .pick({ + id: true, + name: true, + accentColour: true, + isPublic: true, + userId: true, + }) + .extend({ + authUser: selectUserSchema.pick({ + id: true, + avatarUrl: true, + displayName: true, + username: true, + usernameColour: true, + plan: true, + role: true, + }), + }), +}) + +const openRoute = createRoute({ + path: "/{id}", + method: "get", + summary: "Get a collection", + description: + "Get a collection by its ID. If you do not have access to the collection (it is private/you do not have edit permission), it will not be returned.", + tags: ["Asset"], + request: { + params: paramsSchema, + }, + responses: { + 200: { + description: "Basic information about the collection is returned.", + content: { + "application/json": { + schema: responseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +export const GetCollectionByIdRoute = (handler: AppHandler) => { + handler.openapi(openRoute, async (ctx) => { + const { id } = ctx.req.valid("param") + + const { drizzle } = await getConnection(ctx.env) + + const [validCollection] = await drizzle + .select({ + id: userCollection.id, + userId: userCollection.userId, + isPublic: userCollection.isPublic, + }) + .from(userCollection) + .where(eq(userCollection.id, id)) + + if (!validCollection) { + return ctx.json( + { + success: false, + message: "Collection not found", + }, + 404 + ) + } + + const authSessionManager = new AuthSessionManager(ctx) + + const { user } = await authSessionManager.validateSession() + + if (!validCollection.isPublic) { + if (!user) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + const [collaborator] = await drizzle + .select() + .from(userCollectionCollaborators) + .where( + and( + eq(userCollectionCollaborators.collectionId, id), + eq(userCollectionCollaborators.collaboratorId, user.id) + ) + ) + + if (!collaborator && validCollection.userId != user.id) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + } + + const collectionInfo = await drizzle.query.userCollection.findFirst({ + columns: { + id: true, + name: true, + accentColour: true, + isPublic: true, + userId: true, + }, + where: (collection, { eq }) => eq(collection.id, id), + with: { + authUser: { + columns: { + id: true, + avatarUrl: true, + displayName: true, + username: true, + usernameColour: true, + plan: true, + role: true, + }, + }, + }, + }) + + return ctx.json( + { + success: true, + collection: collectionInfo, + }, + 200 + ) + }) +} diff --git a/src/v2/routes/collection/handler.ts b/src/v2/routes/collection/handler.ts index c8c8629..678274e 100644 --- a/src/v2/routes/collection/handler.ts +++ b/src/v2/routes/collection/handler.ts @@ -1,10 +1,10 @@ -import { OpenAPIHono } from "@hono/zod-openapi"; -import { CreateCollectionRoute } from "./create-collection"; -import { DeleteCollectionRoute } from "./delete-collection"; +import { OpenAPIHono } from "@hono/zod-openapi" +import { CreateCollectionRoute } from "./create-collection" +import { DeleteCollectionRoute } from "./delete-collection" -const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>(); +const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() -CreateCollectionRoute(handler); -DeleteCollectionRoute(handler); +CreateCollectionRoute(handler) +DeleteCollectionRoute(handler) -export default handler; \ No newline at end of file +export default handler From b7033d8812ae2224713841d5d70ebfae10b6741e Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Mon, 6 May 2024 00:19:21 +0100 Subject: [PATCH 313/318] + modify collection, fix request method --- src/v2/routes/collection/create-collection.ts | 2 +- src/v2/routes/collection/delete-collection.ts | 4 +- ...ection-assets => get-collection-assets.ts} | 0 src/v2/routes/collection/get-collection.ts | 2 +- src/v2/routes/collection/handler.ts | 4 + src/v2/routes/collection/modify-collection.ts | 141 ++++++++++++++++++ 6 files changed, 149 insertions(+), 4 deletions(-) rename src/v2/routes/collection/{get-collection-assets => get-collection-assets.ts} (100%) diff --git a/src/v2/routes/collection/create-collection.ts b/src/v2/routes/collection/create-collection.ts index 98e6643..ab7457b 100644 --- a/src/v2/routes/collection/create-collection.ts +++ b/src/v2/routes/collection/create-collection.ts @@ -22,7 +22,7 @@ const responseSchema = z.object({ const openRoute = createRoute({ path: "/collection/create", method: "post", - summary: "Create a new collection.", + summary: "Create a new collection", description: "Create a new collection, accent colours available for supporters", tags: ["Collection"], diff --git a/src/v2/routes/collection/delete-collection.ts b/src/v2/routes/collection/delete-collection.ts index 73f0fca..3490227 100644 --- a/src/v2/routes/collection/delete-collection.ts +++ b/src/v2/routes/collection/delete-collection.ts @@ -24,8 +24,8 @@ const responseSchema = z.object({ const openRoute = createRoute({ path: "/collection/{id}/delete", - method: "post", - summary: "Delete a collection.", + method: "delete", + summary: "Delete a collection", description: "Delete a collection. Only the owner of the collection can delete it.", tags: ["Collection"], diff --git a/src/v2/routes/collection/get-collection-assets b/src/v2/routes/collection/get-collection-assets.ts similarity index 100% rename from src/v2/routes/collection/get-collection-assets rename to src/v2/routes/collection/get-collection-assets.ts diff --git a/src/v2/routes/collection/get-collection.ts b/src/v2/routes/collection/get-collection.ts index 1e2bae5..38a6ebc 100644 --- a/src/v2/routes/collection/get-collection.ts +++ b/src/v2/routes/collection/get-collection.ts @@ -52,7 +52,7 @@ const openRoute = createRoute({ summary: "Get a collection", description: "Get a collection by its ID. If you do not have access to the collection (it is private/you do not have edit permission), it will not be returned.", - tags: ["Asset"], + tags: ["Collection"], request: { params: paramsSchema, }, diff --git a/src/v2/routes/collection/handler.ts b/src/v2/routes/collection/handler.ts index 678274e..56685c2 100644 --- a/src/v2/routes/collection/handler.ts +++ b/src/v2/routes/collection/handler.ts @@ -1,9 +1,13 @@ import { OpenAPIHono } from "@hono/zod-openapi" import { CreateCollectionRoute } from "./create-collection" import { DeleteCollectionRoute } from "./delete-collection" +import { GetCollectionByIdRoute } from "./get-collection" +import { ModifyCollectionRoute } from "./modify-collection" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() +GetCollectionByIdRoute(handler) +ModifyCollectionRoute(handler) CreateCollectionRoute(handler) DeleteCollectionRoute(handler) diff --git a/src/v2/routes/collection/modify-collection.ts b/src/v2/routes/collection/modify-collection.ts index e69de29..c00a1d0 100644 --- a/src/v2/routes/collection/modify-collection.ts +++ b/src/v2/routes/collection/modify-collection.ts @@ -0,0 +1,141 @@ +import { getConnection } from "@/v2/db/turso" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +import { selectUserCollectionSchema, userCollection } from "@/v2/db/schema" +import { and, eq } from "drizzle-orm" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" +import { AppHandler } from "../handler" +import { ColourType } from "@/v2/lib/colour" + +const paramsSchema = z.object({ + id: z.string().openapi({ + param: { + description: "The id of the collection to modify.", + example: "collection_id", + in: "path", + required: true, + }, + }), +}) + +const requestBodySchema = z.object({ + name: z.string().min(1).max(32).optional(), + description: z.string().min(1).max(256).optional(), + isPublic: z.number().int().min(0).max(1).optional(), + accentColour: z.string().length(7).optional(), +}) + +const responseSchema = z.object({ + success: z.literal(true), + collection: selectUserCollectionSchema, +}) + +const openRoute = createRoute({ + path: "/{id}/modify", + method: "patch", + summary: "Modify a collection", + description: + "Modify an existing collection, you must be the owner of the collection to modify these details..", + tags: ["Collection"], + request: { + params: paramsSchema, + body: { + content: { + "application/json": { + schema: requestBodySchema, + }, + }, + }, + }, + responses: { + 200: { + description: "Returns the collection's new attributes", + content: { + "application/json": { + schema: responseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +export const ModifyCollectionRoute = (handler: AppHandler) => { + handler.openapi(openRoute, async (ctx) => { + const { name, description, isPublic, accentColour } = + ctx.req.valid("json") + + const { id } = ctx.req.valid("param") + + const authSessionManager = new AuthSessionManager(ctx) + + const { user } = await authSessionManager.validateSession() + + if (!user) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + const { drizzle } = await getConnection(ctx.env) + + const [collection] = await drizzle + .select({ + id: userCollection.id, + isPublic: userCollection.isPublic, + userId: userCollection.userId, + }) + .from(userCollection) + .where( + and( + eq(userCollection.id, id), + eq(userCollection.userId, user.id) + ) + ) + + if (!collection || collection.isPublic) { + return ctx.json( + { + success: false, + message: "Collection not found", + }, + 404 + ) + } + + if (collection.userId !== user.id) { + return ctx.json( + { + success: false, + message: + "Unauthorized. You are not the owner of this collection.", + }, + 401 + ) + } + + const [updatedCollection] = await drizzle + .update(userCollection) + .set({ + name: name, + description: description, + isPublic: Boolean(isPublic), + accentColour: accentColour as ColourType, + }) + .where(eq(userCollection.id, id)) + .returning() + + return ctx.json( + { + success: true, + collection: updatedCollection, + }, + 200 + ) + }) +} From 2ba99596c4d015417d5a1869e3bb205c18afc6f8 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Mon, 6 May 2024 00:32:25 +0100 Subject: [PATCH 314/318] get collection assets (&inc offset) --- .../collection/get-collection-assets.ts | 188 ++++++++++++++++++ src/v2/routes/collection/handler.ts | 2 + 2 files changed, 190 insertions(+) diff --git a/src/v2/routes/collection/get-collection-assets.ts b/src/v2/routes/collection/get-collection-assets.ts index e69de29..2ad48de 100644 --- a/src/v2/routes/collection/get-collection-assets.ts +++ b/src/v2/routes/collection/get-collection-assets.ts @@ -0,0 +1,188 @@ +import { AppHandler } from "../handler" +import { getConnection } from "@/v2/db/turso" +import { + userCollection, + userCollectionCollaborators, + selectUserCollectionAssetSchema, + selectAssetSchema, +} from "@/v2/db/schema" +import { and, eq } from "drizzle-orm" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" + +const paramsSchema = z.object({ + id: z.string().openapi({ + param: { + name: "id", + in: "path", + description: "The ID of the collection to retrieve.", + required: true, + }, + }), +}) + +const querySchema = z.object({ + offset: z + .string() + .optional() + .openapi({ + param: { + name: "offset", + in: "query", + description: "The offset to start from.", + required: false, + }, + }), +}) + +const responseSchema = z.object({ + success: z.literal(true), + assets: z.array( + selectUserCollectionAssetSchema + .pick({ order: true, dateAdded: true }) + .extend({ + asset: selectAssetSchema.pick({ + id: true, + name: true, + extension: true, + url: true, + viewCount: true, + downloadCount: true, + uploadedDate: true, + fileSize: true, + width: true, + height: true, + }), + }) + ), +}) + +const openRoute = createRoute({ + path: "/{id}/assets", + method: "get", + summary: "Get a collection's assets", + description: + "Get a collection's assets by its ID. Returns 50 per request. If you do not have access to the collection (it is private/you do not have edit permission), it will not be returned.", + tags: ["Collection"], + request: { + params: paramsSchema, + query: querySchema, + }, + responses: { + 200: { + description: "Asset information", + content: { + "application/json": { + schema: responseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +export const GetCollectionAssetsByIdRoute = (handler: AppHandler) => { + handler.openapi(openRoute, async (ctx) => { + const { id } = ctx.req.valid("param") + const { offset } = ctx.req.valid("query") + + const { drizzle } = await getConnection(ctx.env) + + const [validCollection] = await drizzle + .select({ + id: userCollection.id, + userId: userCollection.userId, + isPublic: userCollection.isPublic, + }) + .from(userCollection) + .where(eq(userCollection.id, id)) + + if (!validCollection) { + return ctx.json( + { + success: false, + message: "Collection not found", + }, + 404 + ) + } + + const authSessionManager = new AuthSessionManager(ctx) + + const { user } = await authSessionManager.validateSession() + + if (!validCollection.isPublic) { + if (!user) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + const [collaborator] = await drizzle + .select() + .from(userCollectionCollaborators) + .where( + and( + eq(userCollectionCollaborators.collectionId, id), + eq(userCollectionCollaborators.collaboratorId, user.id) + ) + ) + + if (!collaborator && validCollection.userId != user.id) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + } + + const collectionAssets = + await drizzle.query.userCollectionAsset.findMany({ + columns: { + collectionId: true, + order: true, + dateAdded: true, + }, + where: (userCollectionAsset) => + eq(userCollectionAsset.collectionId, id), + with: { + asset: { + columns: { + id: true, + name: true, + extension: true, + url: true, + viewCount: true, + downloadCount: true, + uploadedDate: true, + fileSize: true, + width: true, + height: true, + }, + }, + }, + offset: parseInt(offset) || 0, + limit: 50, + orderBy: (userCollectionAsset, { asc }) => [ + asc(userCollectionAsset.order), + ], + }) + + return ctx.json( + { + success: true, + assets: collectionAssets, + }, + 200 + ) + }) +} diff --git a/src/v2/routes/collection/handler.ts b/src/v2/routes/collection/handler.ts index 56685c2..3ad295a 100644 --- a/src/v2/routes/collection/handler.ts +++ b/src/v2/routes/collection/handler.ts @@ -3,10 +3,12 @@ import { CreateCollectionRoute } from "./create-collection" import { DeleteCollectionRoute } from "./delete-collection" import { GetCollectionByIdRoute } from "./get-collection" import { ModifyCollectionRoute } from "./modify-collection" +import { GetCollectionAssetsByIdRoute } from "./get-collection-assets" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() GetCollectionByIdRoute(handler) +GetCollectionAssetsByIdRoute(handler) ModifyCollectionRoute(handler) CreateCollectionRoute(handler) DeleteCollectionRoute(handler) From 03ce16221e72700c452318ecca24923769378daa Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Mon, 6 May 2024 00:45:22 +0100 Subject: [PATCH 315/318] collection like/unlike frfr --- src/v2/routes/collection/handler.ts | 6 + src/v2/routes/collection/like-collection.ts | 114 +++++++++++++++++ src/v2/routes/collection/unlike-collection.ts | 115 ++++++++++++++++++ 3 files changed, 235 insertions(+) diff --git a/src/v2/routes/collection/handler.ts b/src/v2/routes/collection/handler.ts index 3ad295a..92fc3d5 100644 --- a/src/v2/routes/collection/handler.ts +++ b/src/v2/routes/collection/handler.ts @@ -4,13 +4,19 @@ import { DeleteCollectionRoute } from "./delete-collection" import { GetCollectionByIdRoute } from "./get-collection" import { ModifyCollectionRoute } from "./modify-collection" import { GetCollectionAssetsByIdRoute } from "./get-collection-assets" +import { UnlikeCollectionByIDRoute } from "./unlike-collection" +import { LikeCollectionByIdRoute } from "./like-collection" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() GetCollectionByIdRoute(handler) GetCollectionAssetsByIdRoute(handler) + ModifyCollectionRoute(handler) CreateCollectionRoute(handler) DeleteCollectionRoute(handler) +LikeCollectionByIdRoute(handler) +UnlikeCollectionByIDRoute(handler) + export default handler diff --git a/src/v2/routes/collection/like-collection.ts b/src/v2/routes/collection/like-collection.ts index e69de29..f0d7c09 100644 --- a/src/v2/routes/collection/like-collection.ts +++ b/src/v2/routes/collection/like-collection.ts @@ -0,0 +1,114 @@ +import { type AppHandler } from "../handler" +import { getConnection } from "@/v2/db/turso" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +import { userCollection, userCollectionLikes } from "@/v2/db/schema" +import { and, eq } from "drizzle-orm" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" + +const paramsSchema = z.object({ + id: z.string().openapi({ + param: { + description: "The id of the collection to like.", + example: "collection_id", + in: "path", + name: "id", + required: true, + }, + }), +}) + +const responseSchema = z.object({ + success: z.literal(true), +}) + +const openRoute = createRoute({ + path: "/{id}/like", + method: "post", + summary: "Like a collection", + description: "Like a collection from their ID.", + tags: ["Collection"], + request: { + params: paramsSchema, + }, + responses: { + 200: { + description: "True if the collection was liked.", + content: { + "application/json": { + schema: responseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +export const LikeCollectionByIdRoute = (handler: AppHandler) => { + handler.openapi(openRoute, async (ctx) => { + const assetId = ctx.req.valid("param").id + + const { drizzle } = await getConnection(ctx.env) + + const authSessionManager = new AuthSessionManager(ctx) + + const { user } = await authSessionManager.validateSession() + + const [existingCollection] = await drizzle + .select() + .from(userCollection) + .where(eq(userCollection.id, assetId)) + .limit(1) + + if ( + !existingCollection || + (!existingCollection.isPublic && + existingCollection.userId !== user.id) + ) { + // i don't know the best way to handle the logic for this, + // so i'm just rolling with completely disabling liking for private collections + // in the case that it is private and there's contributors, too bad i guess LOL + return ctx.json( + { + success: false, + message: "Collection not found", + }, + 404 + ) + } + + const [collectionLikeStatus] = await drizzle + .select() + .from(userCollectionLikes) + .where( + and( + eq(userCollectionLikes.collectionId, assetId), + eq(userCollectionLikes.likedById, user.id) + ) + ) + .limit(1) + + if (collectionLikeStatus) { + return ctx.json( + { + success: false, + message: "Collection already liked", + }, + 400 + ) + } + + await drizzle.insert(userCollectionLikes).values({ + collectionId: assetId, + likedById: user.id, + }) + + return ctx.json( + { + success: true, + }, + 200 + ) + }) +} diff --git a/src/v2/routes/collection/unlike-collection.ts b/src/v2/routes/collection/unlike-collection.ts index e69de29..cca3a47 100644 --- a/src/v2/routes/collection/unlike-collection.ts +++ b/src/v2/routes/collection/unlike-collection.ts @@ -0,0 +1,115 @@ +import { type AppHandler } from "../handler" +import { getConnection } from "@/v2/db/turso" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" +import { userCollection, userCollectionLikes } from "@/v2/db/schema" +import { and, eq } from "drizzle-orm" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" + +const paramsSchema = z.object({ + id: z.string().openapi({ + param: { + description: "The id of the collection to unlike.", + example: "collection_id", + in: "path", + name: "id", + required: true, + }, + }), +}) + +const responseSchema = z.object({ + success: z.literal(true), +}) + +const openRoute = createRoute({ + path: "/{id}/unlike", + method: "post", + summary: "Unlike a collection", + description: "Unlike a collection from their ID.", + tags: ["Collection"], + request: { + params: paramsSchema, + }, + responses: { + 200: { + description: "True if the collection was unliked.", + content: { + "application/json": { + schema: responseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +export const UnlikeCollectionByIDRoute = (handler: AppHandler) => { + handler.openapi(openRoute, async (ctx) => { + const assetId = ctx.req.valid("param").id + + const { drizzle } = await getConnection(ctx.env) + + const authSessionManager = new AuthSessionManager(ctx) + + const { user } = await authSessionManager.validateSession() + + const [existingCollection] = await drizzle + .select() + .from(userCollection) + .where(eq(userCollection.id, assetId)) + .limit(1) + + if ( + !existingCollection || + (!existingCollection.isPublic && + existingCollection.userId !== user.id) + ) { + return ctx.json( + { + success: false, + message: "Collection not found", + }, + 404 + ) + } + + const [collectionLikeStatus] = await drizzle + .select() + .from(userCollectionLikes) + .where( + and( + eq(userCollectionLikes.collectionId, assetId), + eq(userCollectionLikes.likedById, user.id) + ) + ) + .limit(1) + + if (!collectionLikeStatus) { + return ctx.json( + { + success: false, + message: "Collection not liked", + }, + 400 + ) + } + + await drizzle + .delete(userCollectionLikes) + .where( + and( + eq(userCollectionLikes.collectionId, assetId), + eq(userCollectionLikes.likedById, user.id) + ) + ) + + return ctx.json( + { + success: true, + }, + 200 + ) + }) +} From 651cbc59b1bb29b961bac8ef5840724b91d8407b Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Mon, 6 May 2024 01:10:08 +0100 Subject: [PATCH 316/318] asset add/rm 2 collection (probably works) --- src/v2/routes/collection/add-asset.ts | 190 +++++++++++++++++++++++ src/v2/routes/collection/handler.ts | 5 + src/v2/routes/collection/remove-asset.ts | 184 ++++++++++++++++++++++ 3 files changed, 379 insertions(+) diff --git a/src/v2/routes/collection/add-asset.ts b/src/v2/routes/collection/add-asset.ts index e69de29..5e0b7da 100644 --- a/src/v2/routes/collection/add-asset.ts +++ b/src/v2/routes/collection/add-asset.ts @@ -0,0 +1,190 @@ +import { AppHandler } from "../handler" +import { getConnection } from "@/v2/db/turso" +import { + userCollection, + userCollectionCollaborators, + asset, + userCollectionAsset, +} from "@/v2/db/schema" +import { and, desc, eq, not } from "drizzle-orm" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" + +const paramsSchema = z.object({ + id: z.string().openapi({ + param: { + name: "id", + in: "path", + description: "The ID of the collection to add asset to", + required: true, + }, + }), + assetId: z.string().openapi({ + param: { + name: "assetId", + in: "path", + description: "The ID of the asset to add.", + required: true, + }, + }), +}) + +const responseSchema = z.object({ + success: z.literal(true), +}) + +const openRoute = createRoute({ + path: "/{id}/add/{assetId}", + method: "post", + summary: "Add asset to collection", + description: + "Add an asset to a collection, you must be the collection owner or a collaborator to add an asset.", + tags: ["Collection"], + request: { + params: paramsSchema, + }, + responses: { + 200: { + description: + "Returns true if the asset was added to the collection.", + content: { + "application/json": { + schema: responseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +export const AddAssetToCollectionRoute = (handler: AppHandler) => { + handler.openapi(openRoute, async (ctx) => { + const { id, assetId } = ctx.req.valid("param") + const { drizzle } = await getConnection(ctx.env) + + const authSessionManager = new AuthSessionManager(ctx) + const { user } = await authSessionManager.validateSession() + + if (!user) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + const [existingCollection] = await drizzle + .select({ + id: userCollection.id, + userId: userCollection.userId, + }) + .from(userCollection) + .where(eq(userCollection.id, id)) + .limit(1) + + if (!existingCollection) { + return ctx.json( + { + success: false, + message: "Collection ID provided does not exist", + }, + 404 + ) + } + + const [existingAsset] = await drizzle + .select({ + id: asset.id, + }) + .from(asset) + .where(eq(asset.id, assetId)) + .limit(1) + + if (!existingAsset) { + return ctx.json( + { + success: false, + message: "Asset ID provided does not exist", + }, + 404 + ) + } + + const [existingCollaborator] = await drizzle + .select({ + role: userCollectionCollaborators.role, + collaboratorId: userCollectionCollaborators.collaboratorId, + }) + .from(userCollectionCollaborators) + .where( + and( + eq(userCollectionCollaborators.collectionId, id), + eq(userCollectionCollaborators.collaboratorId, user.id), + not(eq(userCollectionCollaborators.role, "viewer")) + ) + ) + .limit(1) + + if (!existingCollaborator && existingCollection.userId !== user.id) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + // check if asset is already in collection + + const [existingAssetInCollection] = await drizzle + .select({ + collectionId: userCollectionAsset.collectionId, + assetId: userCollectionAsset.assetId, + }) + .from(userCollectionAsset) + .where( + and( + eq(userCollectionAsset.collectionId, id), + eq(userCollectionAsset.assetId, assetId) + ) + ) + .limit(1) + + if (existingAssetInCollection) { + return ctx.json( + { + success: false, + message: "Asset already in collection", + }, + 400 + ) + } + + const [lastOrder] = await drizzle + .select({ + order: userCollectionAsset.order, + }) + .from(userCollectionAsset) + .where(eq(userCollectionAsset.collectionId, id)) + .orderBy(desc(userCollectionAsset.order)) + .limit(1) + + await drizzle.insert(userCollectionAsset).values({ + collectionId: id, + order: lastOrder ? lastOrder.order + 1 : 0, + assetId: assetId, + }) + + return ctx.json( + { + success: true, + }, + 200 + ) + }) +} diff --git a/src/v2/routes/collection/handler.ts b/src/v2/routes/collection/handler.ts index 92fc3d5..7855c02 100644 --- a/src/v2/routes/collection/handler.ts +++ b/src/v2/routes/collection/handler.ts @@ -6,6 +6,8 @@ import { ModifyCollectionRoute } from "./modify-collection" import { GetCollectionAssetsByIdRoute } from "./get-collection-assets" import { UnlikeCollectionByIDRoute } from "./unlike-collection" import { LikeCollectionByIdRoute } from "./like-collection" +import { AddAssetToCollectionRoute } from "./add-asset" +import { RemoveAssetFromCollectionRoute } from "./remove-asset" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() @@ -16,6 +18,9 @@ ModifyCollectionRoute(handler) CreateCollectionRoute(handler) DeleteCollectionRoute(handler) +AddAssetToCollectionRoute(handler) +RemoveAssetFromCollectionRoute(handler) + LikeCollectionByIdRoute(handler) UnlikeCollectionByIDRoute(handler) diff --git a/src/v2/routes/collection/remove-asset.ts b/src/v2/routes/collection/remove-asset.ts index e69de29..befce58 100644 --- a/src/v2/routes/collection/remove-asset.ts +++ b/src/v2/routes/collection/remove-asset.ts @@ -0,0 +1,184 @@ +import { AppHandler } from "../handler" +import { getConnection } from "@/v2/db/turso" +import { + userCollection, + userCollectionCollaborators, + asset, + userCollectionAsset, +} from "@/v2/db/schema" +import { and, eq, not } from "drizzle-orm" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" + +const paramsSchema = z.object({ + id: z.string().openapi({ + param: { + name: "id", + in: "path", + description: "The ID of the collection to remove asset from", + required: true, + }, + }), + assetId: z.string().openapi({ + param: { + name: "assetId", + in: "path", + description: "The ID of the asset to remove", + required: true, + }, + }), +}) + +const responseSchema = z.object({ + success: z.literal(true), +}) + +const openRoute = createRoute({ + path: "/{id}/remove/{assetId}", + method: "post", + summary: "Remove collection asset", + description: + "Remove an asset from a collection, you must be the collection owner or a collaborator to remove an asset.", + tags: ["Collection"], + request: { + params: paramsSchema, + }, + responses: { + 200: { + description: + "Returns true if the asset was removed to the collection.", + content: { + "application/json": { + schema: responseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +export const RemoveAssetFromCollectionRoute = (handler: AppHandler) => { + handler.openapi(openRoute, async (ctx) => { + const { id, assetId } = ctx.req.valid("param") + const { drizzle } = await getConnection(ctx.env) + + const authSessionManager = new AuthSessionManager(ctx) + const { user } = await authSessionManager.validateSession() + + if (!user) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + const [existingCollection] = await drizzle + .select({ + id: userCollection.id, + userId: userCollection.userId, + }) + .from(userCollection) + .where(eq(userCollection.id, id)) + .limit(1) + + if (!existingCollection) { + return ctx.json( + { + success: false, + message: "Collection ID provided does not exist", + }, + 404 + ) + } + + const [existingAsset] = await drizzle + .select({ + id: asset.id, + }) + .from(asset) + .where(eq(asset.id, assetId)) + .limit(1) + + if (!existingAsset) { + return ctx.json( + { + success: false, + message: "Asset ID provided does not exist", + }, + 404 + ) + } + + const [existingCollaborator] = await drizzle + .select({ + role: userCollectionCollaborators.role, + collaboratorId: userCollectionCollaborators.collaboratorId, + }) + .from(userCollectionCollaborators) + .where( + and( + eq(userCollectionCollaborators.collectionId, id), + eq(userCollectionCollaborators.collaboratorId, user.id), + not(eq(userCollectionCollaborators.role, "viewer")) + ) + ) + .limit(1) + + if (!existingCollaborator && existingCollection.userId !== user.id) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + // check if asset is already in collection + + const [existingAssetInCollection] = await drizzle + .select({ + collectionId: userCollectionAsset.collectionId, + assetId: userCollectionAsset.assetId, + }) + .from(userCollectionAsset) + .where( + and( + eq(userCollectionAsset.collectionId, id), + eq(userCollectionAsset.assetId, assetId) + ) + ) + .limit(1) + + if (!existingAssetInCollection) { + return ctx.json( + { + success: false, + message: "Asset is not in collection", + }, + 400 + ) + } + + await drizzle + .delete(userCollectionAsset) + .where( + and( + eq(userCollectionAsset.collectionId, id), + eq(userCollectionAsset.assetId, assetId) + ) + ) + + return ctx.json( + { + success: true, + }, + 200 + ) + }) +} From 43ef7cad979dc0af28cf62ae1dfd05d797aecc30 Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Mon, 6 May 2024 01:27:55 +0100 Subject: [PATCH 317/318] finalize collections(?) --- src/v2/routes/collection/add-contributor.ts | 122 ++++++++++++++ src/v2/routes/collection/handler.ts | 7 + .../routes/collection/remove-contributor.ts | 129 +++++++++++++++ .../collection/update-contributor-status.ts | 156 ++++++++++++++++++ 4 files changed, 414 insertions(+) diff --git a/src/v2/routes/collection/add-contributor.ts b/src/v2/routes/collection/add-contributor.ts index e69de29..4e5b594 100644 --- a/src/v2/routes/collection/add-contributor.ts +++ b/src/v2/routes/collection/add-contributor.ts @@ -0,0 +1,122 @@ +import { AppHandler } from "../handler" +import { getConnection } from "@/v2/db/turso" +import { userCollection, userCollectionCollaborators } from "@/v2/db/schema" +import { and, eq } from "drizzle-orm" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" + +const paramsSchema = z.object({ + id: z.string().openapi({ + param: { + name: "id", + in: "path", + description: "The ID of the collection to add contributor to", + required: true, + }, + }), + contributorId: z.string().openapi({ + param: { + name: "contributorId", + in: "path", + description: "The user ID of the contribitor to add.", + required: true, + }, + }), +}) + +const responseSchema = z.object({ + success: z.literal(true), +}) + +const openRoute = createRoute({ + path: "/{id}/contributor/{contributorId}/add", + method: "post", + summary: "Add contributor to collection", + description: + "Add a contributor to a collection, you must be the collection owner to add a contributor.", + tags: ["Collection"], + request: { + params: paramsSchema, + }, + responses: { + 200: { + description: + "Returns true if the contributor was added to the collection.", + content: { + "application/json": { + schema: responseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +export const AddContributorToCollectionRoute = (handler: AppHandler) => { + handler.openapi(openRoute, async (ctx) => { + const { id, contributorId } = ctx.req.valid("param") + const { drizzle } = await getConnection(ctx.env) + + const authSessionManager = new AuthSessionManager(ctx) + const { user } = await authSessionManager.validateSession() + + const [existingCollection] = await drizzle + .select({ + id: userCollection.id, + userId: userCollection.userId, + }) + .from(userCollection) + .where(eq(userCollection.id, id)) + + if (!existingCollection || existingCollection.userId !== user.id) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + const [contributor] = await drizzle + .select({ + collectionId: userCollectionCollaborators.collectionId, + collaboratorId: userCollectionCollaborators.collaboratorId, + }) + .from(userCollectionCollaborators) + .where( + and( + eq(userCollectionCollaborators.collectionId, id), + eq( + userCollectionCollaborators.collaboratorId, + contributorId + ) + ) + ) + .limit(1) + + if (contributor) { + return ctx.json( + { + success: false, + message: "Contributor already exists", + }, + 400 + ) + } + + await drizzle.insert(userCollectionCollaborators).values({ + collectionId: id, + collaboratorId: contributorId, + }) + + return ctx.json( + { + success: true, + }, + 200 + ) + }) +} diff --git a/src/v2/routes/collection/handler.ts b/src/v2/routes/collection/handler.ts index 7855c02..e8764eb 100644 --- a/src/v2/routes/collection/handler.ts +++ b/src/v2/routes/collection/handler.ts @@ -8,6 +8,9 @@ import { UnlikeCollectionByIDRoute } from "./unlike-collection" import { LikeCollectionByIdRoute } from "./like-collection" import { AddAssetToCollectionRoute } from "./add-asset" import { RemoveAssetFromCollectionRoute } from "./remove-asset" +import { AddContributorToCollectionRoute } from "./add-contributor" +import { RemoveContributorFromCollectionRoute } from "./remove-contributor" +import { UpdateContributorStatusRoute } from "./update-contributor-status" const handler = new OpenAPIHono<{ Bindings: Bindings; Variables: Variables }>() @@ -20,6 +23,10 @@ DeleteCollectionRoute(handler) AddAssetToCollectionRoute(handler) RemoveAssetFromCollectionRoute(handler) +UpdateContributorStatusRoute(handler) + +AddContributorToCollectionRoute(handler) +RemoveContributorFromCollectionRoute(handler) LikeCollectionByIdRoute(handler) UnlikeCollectionByIDRoute(handler) diff --git a/src/v2/routes/collection/remove-contributor.ts b/src/v2/routes/collection/remove-contributor.ts index e69de29..c01f3d5 100644 --- a/src/v2/routes/collection/remove-contributor.ts +++ b/src/v2/routes/collection/remove-contributor.ts @@ -0,0 +1,129 @@ +import { AppHandler } from "../handler" +import { getConnection } from "@/v2/db/turso" +import { userCollection, userCollectionCollaborators } from "@/v2/db/schema" +import { and, eq } from "drizzle-orm" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" + +const paramsSchema = z.object({ + id: z.string().openapi({ + param: { + name: "id", + in: "path", + description: "The ID of the collection to remove contributor from", + required: true, + }, + }), + contributorId: z.string().openapi({ + param: { + name: "contributorId", + in: "path", + description: "The user ID of the contribitor to remove.", + required: true, + }, + }), +}) + +const responseSchema = z.object({ + success: z.literal(true), +}) + +const openRoute = createRoute({ + path: "/{id}/contributor/{contributorId}/remove", + method: "post", + summary: "Remove collection contributor", + description: + "Remove a contributor from a collection, you must be the collection owner to remove a contributor.", + tags: ["Collection"], + request: { + params: paramsSchema, + }, + responses: { + 200: { + description: + "Returns true if the contributor was removed from the collection.", + content: { + "application/json": { + schema: responseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +export const RemoveContributorFromCollectionRoute = (handler: AppHandler) => { + handler.openapi(openRoute, async (ctx) => { + const { id, contributorId } = ctx.req.valid("param") + const { drizzle } = await getConnection(ctx.env) + + const authSessionManager = new AuthSessionManager(ctx) + const { user } = await authSessionManager.validateSession() + + const [existingCollection] = await drizzle + .select({ + id: userCollection.id, + userId: userCollection.userId, + }) + .from(userCollection) + .where(eq(userCollection.id, id)) + + if (!existingCollection || existingCollection.userId !== user.id) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + const [contributor] = await drizzle + .select({ + collectionId: userCollectionCollaborators.collectionId, + collaboratorId: userCollectionCollaborators.collaboratorId, + }) + .from(userCollectionCollaborators) + .where( + and( + eq(userCollectionCollaborators.collectionId, id), + eq( + userCollectionCollaborators.collaboratorId, + contributorId + ) + ) + ) + .limit(1) + + if (!contributor) { + return ctx.json( + { + success: false, + message: "Contributor not found in collection", + }, + 400 + ) + } + + await drizzle + .delete(userCollectionCollaborators) + .where( + and( + eq(userCollectionCollaborators.collectionId, id), + eq( + userCollectionCollaborators.collaboratorId, + contributorId + ) + ) + ) + + return ctx.json( + { + success: true, + }, + 200 + ) + }) +} diff --git a/src/v2/routes/collection/update-contributor-status.ts b/src/v2/routes/collection/update-contributor-status.ts index e69de29..1b97117 100644 --- a/src/v2/routes/collection/update-contributor-status.ts +++ b/src/v2/routes/collection/update-contributor-status.ts @@ -0,0 +1,156 @@ +import { AppHandler } from "../handler" +import { getConnection } from "@/v2/db/turso" +import { userCollection, userCollectionCollaborators } from "@/v2/db/schema" +import { and, eq } from "drizzle-orm" +import { createRoute } from "@hono/zod-openapi" +import { GenericResponses } from "@/v2/lib/response-schemas" +import { z } from "@hono/zod-openapi" +import type { CollaboratorsRoles } from "@/v2/db/schema" +import { AuthSessionManager } from "@/v2/lib/managers/auth/user-session-manager" + +const paramsSchema = z.object({ + id: z.string().openapi({ + param: { + name: "id", + in: "path", + description: "The ID of the collection to add contributor to", + required: true, + }, + }), + contributorId: z.string().openapi({ + param: { + name: "contributorId", + in: "path", + description: "The user ID of the contribitor to add.", + required: true, + }, + }), +}) + +const bodySchema = z.object({ + role: z.string().optional().openapi({ + description: "The role of the contributor.", + }), +}) + +const responseSchema = z.object({ + success: z.literal(true), +}) + +const openRoute = createRoute({ + path: "/{id}/contributor/{contributorId}/update", + method: "patch", + summary: "Modify collection contributor", + description: + "Modify the role of a contributor in a collection, you must be the collection owner to modify a contributor.", + tags: ["Collection"], + request: { + params: paramsSchema, + body: { + content: { + "application/json": { + schema: bodySchema, + }, + }, + }, + }, + responses: { + 200: { + description: + "Returns true if the contributor was modified in the collection.", + content: { + "application/json": { + schema: responseSchema, + }, + }, + }, + ...GenericResponses, + }, +}) + +export const UpdateContributorStatusRoute = (handler: AppHandler) => { + handler.openapi(openRoute, async (ctx) => { + const { id, contributorId } = ctx.req.valid("param") + const { role } = ctx.req.valid("json") + + if (role && !["viewer", "collaborator", "editor"].includes(role)) { + return ctx.json( + { + success: false, + message: "Invalid role", + }, + 400 + ) + } + + const { drizzle } = await getConnection(ctx.env) + + const authSessionManager = new AuthSessionManager(ctx) + const { user } = await authSessionManager.validateSession() + + const [existingCollection] = await drizzle + .select({ + id: userCollection.id, + userId: userCollection.userId, + }) + .from(userCollection) + .where(eq(userCollection.id, id)) + + if (!existingCollection || existingCollection.userId !== user.id) { + return ctx.json( + { + success: false, + message: "Unauthorized", + }, + 401 + ) + } + + const [contributor] = await drizzle + .select({ + collectionId: userCollectionCollaborators.collectionId, + collaboratorId: userCollectionCollaborators.collaboratorId, + }) + .from(userCollectionCollaborators) + .where( + and( + eq(userCollectionCollaborators.collectionId, id), + eq( + userCollectionCollaborators.collaboratorId, + contributorId + ) + ) + ) + .limit(1) + + if (!contributor) { + return ctx.json( + { + success: false, + message: "Contributor not found", + }, + 400 + ) + } + + await drizzle + .update(userCollectionCollaborators) + .set({ role: role as CollaboratorsRoles }) + .where( + and( + eq(userCollectionCollaborators.collectionId, id), + eq( + userCollectionCollaborators.collaboratorId, + contributorId + ) + ) + ) + + return ctx.json( + { + success: true, + }, + 200 + ) + }) +} From 6ae19ece90d3c14396807cfda919fa4a0ed4f98e Mon Sep 17 00:00:00 2001 From: Marcel <65048232+dromzeh@users.noreply.github.com> Date: Thu, 9 May 2024 16:21:56 +0100 Subject: [PATCH 318/318] lmao --- src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index 7fd646e..6ca0601 100644 --- a/src/index.ts +++ b/src/index.ts @@ -19,7 +19,7 @@ app.use( "*", cors({ // todo(dromzeh): this should be set dependant on ENV, PROD or DEV w/ next() for context - origin: "http://localhost:3000", + origin: "https://staging.wanderer.moe/", credentials: true, }) )