From 213b9ed4825494bf6ae6bf3189e13b2ff77b58f3 Mon Sep 17 00:00:00 2001 From: Nicolas Meienberger Date: Sun, 26 Nov 2023 09:13:06 +0100 Subject: [PATCH] feat(ThemeProvider): add some magic --- package.json | 1 + packages/shared/src/schemas/env-schemas.ts | 10 +- pnpm-lock.yaml | 1974 ++++++++++++++++- public/tipi-christmas.png | Bin 0 -> 44889 bytes src/app/(auth)/layout.tsx | 5 +- src/app/(dashboard)/apps/page.tsx | 2 +- .../(dashboard)/components/Header/Header.tsx | 6 +- src/app/(dashboard)/layout.tsx | 4 +- .../SettingsContainer/SettingsContainer.tsx | 4 + .../components/SettingsForm/SettingsForm.tsx | 24 + .../ClientProviders/ClientProviders.tsx | 7 +- .../ThemeProvider/ThemeProvider.tsx | 17 +- src/app/layout.tsx | 5 +- src/app/page.tsx | 4 +- .../components/StatusScreen/StatusScreen.tsx | 3 +- .../UnauthenticatedPage.tsx | 5 +- src/client/messages/en.json | 2 + src/lib/themes.ts | 38 + src/server/core/TipiConfig/TipiConfig.ts | 1 + 19 files changed, 2094 insertions(+), 18 deletions(-) create mode 100644 public/tipi-christmas.png create mode 100644 src/lib/themes.ts diff --git a/package.json b/package.json index 8617d1b9..e7306622 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ "connect-redis": "^7.1.0", "drizzle-orm": "^0.28.6", "fs-extra": "^11.1.1", + "let-it-go": "^1.0.0", "lodash.merge": "^4.6.2", "next": "14.0.1", "next-client-cookies": "^1.0.6", diff --git a/packages/shared/src/schemas/env-schemas.ts b/packages/shared/src/schemas/env-schemas.ts index 4a8b7132..122fc0b0 100644 --- a/packages/shared/src/schemas/env-schemas.ts +++ b/packages/shared/src/schemas/env-schemas.ts @@ -58,9 +58,17 @@ export const envSchema = z.object({ if (typeof value === 'boolean') return value; return value === 'true'; }), + allowAutoThemes: z + .string() + .or(z.boolean()) + .optional() + .transform((value) => { + if (typeof value === 'boolean') return value; + return value === 'true'; + }), }); export const settingsSchema = envSchema .partial() - .pick({ dnsIp: true, internalIp: true, postgresPort: true, appsRepoUrl: true, domain: true, storagePath: true, localDomain: true, demoMode: true, guestDashboard: true }) + .pick({ dnsIp: true, internalIp: true, postgresPort: true, appsRepoUrl: true, domain: true, storagePath: true, localDomain: true, demoMode: true, guestDashboard: true, allowAutoThemes: true }) .and(z.object({ port: z.number(), sslPort: z.number(), listenIp: z.string().ip().trim() }).partial()); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b52ac87e..65c8e0fb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -68,6 +68,9 @@ importers: fs-extra: specifier: ^11.1.1 version: 11.1.1 + let-it-go: + specifier: ^1.0.0 + version: 1.0.0 lodash.merge: specifier: ^4.6.2 version: 4.6.2 @@ -389,6 +392,63 @@ importers: specifier: ^0.34.6 version: 0.34.6(sass@1.69.5) + packages/cli/dist/bin/repos/7a92c8307e0a8074763c80be1fcfa4f87da6641daea9211aea6743b0116aba3b: + devDependencies: + '@commitlint/cli': + specifier: ^17.0.3 + version: 17.8.1 + '@commitlint/config-conventional': + specifier: ^17.0.3 + version: 17.8.1 + '@commitlint/cz-commitlint': + specifier: ^17.0.3 + version: 17.8.1(commitizen@4.3.0)(inquirer@8.2.5) + '@types/jest': + specifier: ^28.1.6 + version: 28.1.8 + '@types/js-yaml': + specifier: ^4.0.5 + version: 4.0.9 + '@types/node': + specifier: ^18.6.2 + version: 18.18.13 + '@types/semver': + specifier: ^7.5.0 + version: 7.5.4 + commitizen: + specifier: ^4.2.5 + version: 4.3.0(typescript@4.9.5) + eslint: + specifier: ^8.22.0 + version: 8.52.0 + eslint-plugin-json-schema-validator: + specifier: ^4.0.1 + version: 4.7.3(eslint@8.52.0) + eslint-plugin-jsonc: + specifier: ^2.4.0 + version: 2.10.0(eslint@8.52.0) + husky: + specifier: ^8.0.1 + version: 8.0.3 + jest: + specifier: ^28.1.3 + version: 28.1.3(@types/node@18.18.13)(ts-node@10.9.1) + js-yaml: + specifier: ^4.1.0 + version: 4.1.0 + prettier: + specifier: ^2.8.8 + version: 2.8.8 + semver: + specifier: ^7.5.2 + version: 7.5.4 + ts-jest: + specifier: ^28.0.7 + version: 28.0.8(@babel/core@7.23.2)(jest@28.1.3)(typescript@4.9.5) + typescript: + specifier: ^4.7.4 + version: 4.9.5 + packages/shared: dependencies: winston: @@ -878,6 +938,256 @@ packages: engines: {node: '>=0.1.90'} dev: false + /@commitlint/cli@17.8.1: + resolution: {integrity: sha512-ay+WbzQesE0Rv4EQKfNbSMiJJ12KdKTDzIt0tcK4k11FdsWmtwP0Kp1NWMOUswfIWo6Eb7p7Ln721Nx9FLNBjg==} + engines: {node: '>=v14'} + hasBin: true + dependencies: + '@commitlint/format': 17.8.1 + '@commitlint/lint': 17.8.1 + '@commitlint/load': 17.8.1 + '@commitlint/read': 17.8.1 + '@commitlint/types': 17.8.1 + execa: 5.1.1 + lodash.isfunction: 3.0.9 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + dev: true + + /@commitlint/config-conventional@17.8.1: + resolution: {integrity: sha512-NxCOHx1kgneig3VLauWJcDWS40DVjg7nKOpBEEK9E5fjJpQqLCilcnKkIIjdBH98kEO1q3NpE5NSrZ2kl/QGJg==} + engines: {node: '>=v14'} + dependencies: + conventional-changelog-conventionalcommits: 6.1.0 + dev: true + + /@commitlint/config-validator@17.8.1: + resolution: {integrity: sha512-UUgUC+sNiiMwkyiuIFR7JG2cfd9t/7MV8VB4TZ+q02ZFkHoduUS4tJGsCBWvBOGD9Btev6IecPMvlWUfJorkEA==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.8.1 + ajv: 8.12.0 + dev: true + + /@commitlint/config-validator@18.4.3: + resolution: {integrity: sha512-FPZZmTJBARPCyef9ohRC9EANiQEKSWIdatx5OlgeHKu878dWwpyeFauVkhzuBRJFcCA4Uvz/FDtlDKs008IHcA==} + engines: {node: '>=v18'} + requiresBuild: true + dependencies: + '@commitlint/types': 18.4.3 + ajv: 8.12.0 + dev: true + optional: true + + /@commitlint/cz-commitlint@17.8.1(commitizen@4.3.0)(inquirer@8.2.5): + resolution: {integrity: sha512-7/13k+NxxqwYnrrb52g70qrXs5NQS7r/qV9GAwcoE/8LLWoziV38nsgELajFu6sNgai9X8d8IX5UyiB1M1zGjg==} + engines: {node: '>=v14'} + peerDependencies: + commitizen: ^4.0.3 + inquirer: ^8.0.0 + dependencies: + '@commitlint/ensure': 17.8.1 + '@commitlint/load': 17.8.1 + '@commitlint/types': 17.8.1 + chalk: 4.1.2 + commitizen: 4.3.0(typescript@4.9.5) + inquirer: 8.2.5 + lodash.isplainobject: 4.0.6 + word-wrap: 1.2.5 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + dev: true + + /@commitlint/ensure@17.8.1: + resolution: {integrity: sha512-xjafwKxid8s1K23NFpL8JNo6JnY/ysetKo8kegVM7c8vs+kWLP8VrQq+NbhgVlmCojhEDbzQKp4eRXSjVOGsow==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.8.1 + lodash.camelcase: 4.3.0 + lodash.kebabcase: 4.1.1 + lodash.snakecase: 4.1.1 + lodash.startcase: 4.4.0 + lodash.upperfirst: 4.3.1 + dev: true + + /@commitlint/execute-rule@17.8.1: + resolution: {integrity: sha512-JHVupQeSdNI6xzA9SqMF+p/JjrHTcrJdI02PwesQIDCIGUrv04hicJgCcws5nzaoZbROapPs0s6zeVHoxpMwFQ==} + engines: {node: '>=v14'} + dev: true + + /@commitlint/execute-rule@18.4.3: + resolution: {integrity: sha512-t7FM4c+BdX9WWZCPrrbV5+0SWLgT3kCq7e7/GhHCreYifg3V8qyvO127HF796vyFql75n4TFF+5v1asOOWkV1Q==} + engines: {node: '>=v18'} + requiresBuild: true + dev: true + optional: true + + /@commitlint/format@17.8.1: + resolution: {integrity: sha512-f3oMTyZ84M9ht7fb93wbCKmWxO5/kKSbwuYvS867duVomoOsgrgljkGGIztmT/srZnaiGbaK8+Wf8Ik2tSr5eg==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.8.1 + chalk: 4.1.2 + dev: true + + /@commitlint/is-ignored@17.8.1: + resolution: {integrity: sha512-UshMi4Ltb4ZlNn4F7WtSEugFDZmctzFpmbqvpyxD3la510J+PLcnyhf9chs7EryaRFJMdAKwsEKfNK0jL/QM4g==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.8.1 + semver: 7.5.4 + dev: true + + /@commitlint/lint@17.8.1: + resolution: {integrity: sha512-aQUlwIR1/VMv2D4GXSk7PfL5hIaFSfy6hSHV94O8Y27T5q+DlDEgd/cZ4KmVI+MWKzFfCTiTuWqjfRSfdRllCA==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/is-ignored': 17.8.1 + '@commitlint/parse': 17.8.1 + '@commitlint/rules': 17.8.1 + '@commitlint/types': 17.8.1 + dev: true + + /@commitlint/load@17.8.1: + resolution: {integrity: sha512-iF4CL7KDFstP1kpVUkT8K2Wl17h2yx9VaR1ztTc8vzByWWcbO/WaKwxsnCOqow9tVAlzPfo1ywk9m2oJ9ucMqA==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/config-validator': 17.8.1 + '@commitlint/execute-rule': 17.8.1 + '@commitlint/resolve-extends': 17.8.1 + '@commitlint/types': 17.8.1 + '@types/node': 20.5.1 + chalk: 4.1.2 + cosmiconfig: 8.3.6(typescript@5.2.2) + cosmiconfig-typescript-loader: 4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6)(ts-node@10.9.1)(typescript@5.2.2) + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + lodash.uniq: 4.5.0 + resolve-from: 5.0.0 + ts-node: 10.9.1(@types/node@18.18.13)(typescript@4.9.5) + typescript: 5.2.2 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + dev: true + + /@commitlint/load@18.4.3(typescript@4.9.5): + resolution: {integrity: sha512-v6j2WhvRQJrcJaj5D+EyES2WKTxPpxENmNpNG3Ww8MZGik3jWRXtph0QTzia5ZJyPh2ib5aC/6BIDymkUUM58Q==} + engines: {node: '>=v18'} + requiresBuild: true + dependencies: + '@commitlint/config-validator': 18.4.3 + '@commitlint/execute-rule': 18.4.3 + '@commitlint/resolve-extends': 18.4.3 + '@commitlint/types': 18.4.3 + '@types/node': 18.18.13 + chalk: 4.1.2 + cosmiconfig: 8.3.6(typescript@4.9.5) + cosmiconfig-typescript-loader: 5.0.0(@types/node@18.18.13)(cosmiconfig@8.3.6)(typescript@4.9.5) + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + lodash.uniq: 4.5.0 + resolve-from: 5.0.0 + transitivePeerDependencies: + - typescript + dev: true + optional: true + + /@commitlint/message@17.8.1: + resolution: {integrity: sha512-6bYL1GUQsD6bLhTH3QQty8pVFoETfFQlMn2Nzmz3AOLqRVfNNtXBaSY0dhZ0dM6A2MEq4+2d7L/2LP8TjqGRkA==} + engines: {node: '>=v14'} + dev: true + + /@commitlint/parse@17.8.1: + resolution: {integrity: sha512-/wLUickTo0rNpQgWwLPavTm7WbwkZoBy3X8PpkUmlSmQJyWQTj0m6bDjiykMaDt41qcUbfeFfaCvXfiR4EGnfw==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.8.1 + conventional-changelog-angular: 6.0.0 + conventional-commits-parser: 4.0.0 + dev: true + + /@commitlint/read@17.8.1: + resolution: {integrity: sha512-Fd55Oaz9irzBESPCdMd8vWWgxsW3OWR99wOntBDHgf9h7Y6OOHjWEdS9Xzen1GFndqgyoaFplQS5y7KZe0kO2w==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/top-level': 17.8.1 + '@commitlint/types': 17.8.1 + fs-extra: 11.1.1 + git-raw-commits: 2.0.11 + minimist: 1.2.8 + dev: true + + /@commitlint/resolve-extends@17.8.1: + resolution: {integrity: sha512-W/ryRoQ0TSVXqJrx5SGkaYuAaE/BUontL1j1HsKckvM6e5ZaG0M9126zcwL6peKSuIetJi7E87PRQF8O86EW0Q==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/config-validator': 17.8.1 + '@commitlint/types': 17.8.1 + import-fresh: 3.3.0 + lodash.mergewith: 4.6.2 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + dev: true + + /@commitlint/resolve-extends@18.4.3: + resolution: {integrity: sha512-30sk04LZWf8+SDgJrbJCjM90gTg2LxsD9cykCFeFu+JFHvBFq5ugzp2eO/DJGylAdVaqxej3c7eTSE64hR/lnw==} + engines: {node: '>=v18'} + requiresBuild: true + dependencies: + '@commitlint/config-validator': 18.4.3 + '@commitlint/types': 18.4.3 + import-fresh: 3.3.0 + lodash.mergewith: 4.6.2 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + dev: true + optional: true + + /@commitlint/rules@17.8.1: + resolution: {integrity: sha512-2b7OdVbN7MTAt9U0vKOYKCDsOvESVXxQmrvuVUZ0rGFMCrCPJWWP1GJ7f0lAypbDAhaGb8zqtdOr47192LBrIA==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/ensure': 17.8.1 + '@commitlint/message': 17.8.1 + '@commitlint/to-lines': 17.8.1 + '@commitlint/types': 17.8.1 + execa: 5.1.1 + dev: true + + /@commitlint/to-lines@17.8.1: + resolution: {integrity: sha512-LE0jb8CuR/mj6xJyrIk8VLz03OEzXFgLdivBytoooKO5xLt5yalc8Ma5guTWobw998sbR3ogDd+2jed03CFmJA==} + engines: {node: '>=v14'} + dev: true + + /@commitlint/top-level@17.8.1: + resolution: {integrity: sha512-l6+Z6rrNf5p333SHfEte6r+WkOxGlWK4bLuZKbtf/2TXRN+qhrvn1XE63VhD8Oe9oIHQ7F7W1nG2k/TJFhx2yA==} + engines: {node: '>=v14'} + dependencies: + find-up: 5.0.0 + dev: true + + /@commitlint/types@17.8.1: + resolution: {integrity: sha512-PXDQXkAmiMEG162Bqdh9ChML/GJZo6vU+7F03ALKDK8zYc6SuAr47LjG7hGYRqUOz+WK0dU7bQ0xzuqFMdxzeQ==} + engines: {node: '>=v14'} + dependencies: + chalk: 4.1.2 + dev: true + + /@commitlint/types@18.4.3: + resolution: {integrity: sha512-cvzx+vtY/I2hVBZHCLrpoh+sA0hfuzHwDc+BAFPimYLjJkpHnghQM+z8W/KyLGkygJh3BtI3xXXq+dKjnSWEmA==} + engines: {node: '>=v18'} + requiresBuild: true + dependencies: + chalk: 4.1.2 + dev: true + optional: true + /@cspotcode/source-map-support@0.8.1: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} @@ -1573,6 +1883,18 @@ packages: engines: {node: '>=8'} dev: true + /@jest/console@28.1.3: + resolution: {integrity: sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/types': 28.1.3 + '@types/node': 18.18.13 + chalk: 4.1.2 + jest-message-util: 28.1.3 + jest-util: 28.1.3 + slash: 3.0.0 + dev: true + /@jest/console@29.7.0: resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -1585,6 +1907,49 @@ packages: slash: 3.0.0 dev: true + /@jest/core@28.1.3(ts-node@10.9.1): + resolution: {integrity: sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 28.1.3 + '@jest/reporters': 28.1.3 + '@jest/test-result': 28.1.3 + '@jest/transform': 28.1.3 + '@jest/types': 28.1.3 + '@types/node': 18.18.13 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.8.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 28.1.3 + jest-config: 28.1.3(@types/node@18.18.13)(ts-node@10.9.1) + jest-haste-map: 28.1.3 + jest-message-util: 28.1.3 + jest-regex-util: 28.0.2 + jest-resolve: 28.1.3 + jest-resolve-dependencies: 28.1.3 + jest-runner: 28.1.3 + jest-runtime: 28.1.3 + jest-snapshot: 28.1.3 + jest-util: 28.1.3 + jest-validate: 28.1.3 + jest-watcher: 28.1.3 + micromatch: 4.0.5 + pretty-format: 28.1.3 + rimraf: 3.0.2 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - supports-color + - ts-node + dev: true + /@jest/core@29.7.0(ts-node@10.9.1): resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -1628,6 +1993,16 @@ packages: - ts-node dev: true + /@jest/environment@28.1.3: + resolution: {integrity: sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/fake-timers': 28.1.3 + '@jest/types': 28.1.3 + '@types/node': 18.18.13 + jest-mock: 28.1.3 + dev: true + /@jest/environment@29.7.0: resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -1638,6 +2013,13 @@ packages: jest-mock: 29.7.0 dev: true + /@jest/expect-utils@28.1.3: + resolution: {integrity: sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + jest-get-type: 28.0.2 + dev: true + /@jest/expect-utils@29.7.0: resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -1645,6 +2027,16 @@ packages: jest-get-type: 29.6.3 dev: true + /@jest/expect@28.1.3: + resolution: {integrity: sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + expect: 28.1.3 + jest-snapshot: 28.1.3 + transitivePeerDependencies: + - supports-color + dev: true + /@jest/expect@29.7.0: resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -1655,6 +2047,18 @@ packages: - supports-color dev: true + /@jest/fake-timers@28.1.3: + resolution: {integrity: sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/types': 28.1.3 + '@sinonjs/fake-timers': 9.1.2 + '@types/node': 18.18.13 + jest-message-util: 28.1.3 + jest-mock: 28.1.3 + jest-util: 28.1.3 + dev: true + /@jest/fake-timers@29.7.0: resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -1667,6 +2071,17 @@ packages: jest-util: 29.7.0 dev: true + /@jest/globals@28.1.3: + resolution: {integrity: sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/environment': 28.1.3 + '@jest/expect': 28.1.3 + '@jest/types': 28.1.3 + transitivePeerDependencies: + - supports-color + dev: true + /@jest/globals@29.7.0: resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -1679,6 +2094,44 @@ packages: - supports-color dev: true + /@jest/reporters@28.1.3: + resolution: {integrity: sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 28.1.3 + '@jest/test-result': 28.1.3 + '@jest/transform': 28.1.3 + '@jest/types': 28.1.3 + '@jridgewell/trace-mapping': 0.3.19 + '@types/node': 18.18.13 + chalk: 4.1.2 + collect-v8-coverage: 1.0.1 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-instrument: 5.2.1 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.5 + jest-message-util: 28.1.3 + jest-util: 28.1.3 + jest-worker: 28.1.3 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + terminal-link: 2.1.1 + v8-to-istanbul: 9.1.0 + transitivePeerDependencies: + - supports-color + dev: true + /@jest/reporters@29.7.0: resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -1716,6 +2169,13 @@ packages: - supports-color dev: true + /@jest/schemas@28.1.3: + resolution: {integrity: sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@sinclair/typebox': 0.24.51 + dev: true + /@jest/schemas@29.6.3: resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -1723,6 +2183,15 @@ packages: '@sinclair/typebox': 0.27.8 dev: true + /@jest/source-map@28.1.2: + resolution: {integrity: sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jridgewell/trace-mapping': 0.3.19 + callsites: 3.1.0 + graceful-fs: 4.2.11 + dev: true + /@jest/source-map@29.6.3: resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -1732,6 +2201,16 @@ packages: graceful-fs: 4.2.11 dev: true + /@jest/test-result@28.1.3: + resolution: {integrity: sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/console': 28.1.3 + '@jest/types': 28.1.3 + '@types/istanbul-lib-coverage': 2.0.4 + collect-v8-coverage: 1.0.1 + dev: true + /@jest/test-result@29.7.0: resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -1742,6 +2221,16 @@ packages: collect-v8-coverage: 1.0.1 dev: true + /@jest/test-sequencer@28.1.3: + resolution: {integrity: sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/test-result': 28.1.3 + graceful-fs: 4.2.11 + jest-haste-map: 28.1.3 + slash: 3.0.0 + dev: true + /@jest/test-sequencer@29.7.0: resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -1752,6 +2241,29 @@ packages: slash: 3.0.0 dev: true + /@jest/transform@28.1.3: + resolution: {integrity: sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@babel/core': 7.23.2 + '@jest/types': 28.1.3 + '@jridgewell/trace-mapping': 0.3.19 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 1.9.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 28.1.3 + jest-regex-util: 28.0.2 + jest-util: 28.1.3 + micromatch: 4.0.5 + pirates: 4.0.5 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: true + /@jest/transform@29.7.0: resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -1775,6 +2287,18 @@ packages: - supports-color dev: true + /@jest/types@28.1.3: + resolution: {integrity: sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/schemas': 28.1.3 + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 18.18.13 + '@types/yargs': 17.0.22 + chalk: 4.1.2 + dev: true + /@jest/types@29.6.3: resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -2058,6 +2582,18 @@ packages: requiresBuild: true dev: true + /@pkgr/utils@2.4.2: + resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + dependencies: + cross-spawn: 7.0.3 + fast-glob: 3.3.1 + is-glob: 4.0.3 + open: 9.1.0 + picocolors: 1.0.0 + tslib: 2.6.2 + dev: true + /@playwright/test@1.39.0: resolution: {integrity: sha512-3u1iFqgzl7zr004bGPYiN/5EZpRUSFddQBra8Rqll5N0/vfpqlP9I9EXqAoGacuAbX6c9Ulg/Cjqglp5VkK6UQ==} engines: {node: '>=16'} @@ -2925,10 +3461,20 @@ packages: resolution: {integrity: sha512-EF3948ckf3f5uPgYbQ6GhyA56Dmv8yg0+ir+BroRjwdxyZJsekhZzawOecC2rOTPCz173t7ZcR1HHZu0dZgOCw==} dev: true + /@sinclair/typebox@0.24.51: + resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} + dev: true + /@sinclair/typebox@0.27.8: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} dev: true + /@sinonjs/commons@1.8.6: + resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} + dependencies: + type-detect: 4.0.8 + dev: true + /@sinonjs/commons@2.0.0: resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} dependencies: @@ -2941,6 +3487,12 @@ packages: '@sinonjs/commons': 2.0.0 dev: true + /@sinonjs/fake-timers@9.1.2: + resolution: {integrity: sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==} + dependencies: + '@sinonjs/commons': 1.8.6 + dev: true + /@snyk/github-codeowners@1.1.0: resolution: {integrity: sha512-lGFf08pbkEac0NYgVf4hdANpAgApRjNByLXB+WBip3qj1iendOIyAwP2GKkKbQMNVy2r1xxDf0ssfWscoiC+Vw==} engines: {node: '>=8.10'} @@ -3236,6 +3788,13 @@ packages: '@types/istanbul-lib-report': 3.0.0 dev: true + /@types/jest@28.1.8: + resolution: {integrity: sha512-8TJkV++s7B6XqnDrzR1m/TT0A0h948Pnl/097veySPN67VRAgQ4gZ7n2KfJo2rVq6njQjdxU3GCCyDvAeuHoiw==} + dependencies: + expect: 28.1.3 + pretty-format: 28.1.3 + dev: true + /@types/jest@29.5.7: resolution: {integrity: sha512-HLyetab6KVPSiF+7pFcUyMeLsx25LDNDemw9mGsJBkai/oouwrjTycocSDYopMEwFhN2Y4s9oPyOCZNofgSt2g==} dependencies: @@ -3247,6 +3806,10 @@ packages: resolution: {integrity: sha512-qC4bCqYGy1y/NP7dDVr7KJarn+PbX1nSpwA7JXdu0HxT3QYjO8MJ+cntENtHFVy2dRAyBV23OZ6MxsW1AM1L8g==} dev: true + /@types/js-yaml@4.0.9: + resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} + dev: true + /@types/jsdom@20.0.1: resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} dependencies: @@ -3285,14 +3848,32 @@ packages: '@types/unist': 3.0.0 dev: false + /@types/minimist@1.2.5: + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + dev: true + /@types/ms@0.7.31: resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} + /@types/node@18.18.13: + resolution: {integrity: sha512-vXYZGRrSCreZmq1rEjMRLXJhiy8MrIeVasx+PCVlP414N7CJLHnMf+juVvjdprHyH+XRy3zKZLHeNueOpJCn0g==} + dependencies: + undici-types: 5.26.5 + dev: true + + /@types/node@20.5.1: + resolution: {integrity: sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==} + dev: true + /@types/node@20.8.10: resolution: {integrity: sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==} dependencies: undici-types: 5.26.5 + /@types/normalize-package-data@2.4.4: + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + dev: true + /@types/parse-json@4.0.0: resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} dev: false @@ -3304,6 +3885,10 @@ packages: pg-protocol: 1.6.0 pg-types: 4.0.1 + /@types/prettier@2.7.3: + resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} + dev: true + /@types/prop-types@15.7.5: resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} @@ -3718,6 +4303,14 @@ packages: dev: true optional: true + /JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + dev: true + /abab@2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} dev: true @@ -3791,6 +4384,15 @@ packages: uri-js: 4.4.1 dev: true + /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: true + /ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} dependencies: @@ -3921,6 +4523,10 @@ packages: is-array-buffer: 3.0.2 dev: true + /array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + dev: true + /array-includes@3.1.6: resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} engines: {node: '>= 0.4'} @@ -4019,6 +4625,11 @@ packages: is-shared-array-buffer: 1.0.2 dev: true + /arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + dev: true + /asn1.js@5.4.1: resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} dependencies: @@ -4084,6 +4695,24 @@ packages: resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==} dev: false + /babel-jest@28.1.3(@babel/core@7.23.2): + resolution: {integrity: sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + dependencies: + '@babel/core': 7.23.2 + '@jest/transform': 28.1.3 + '@types/babel__core': 7.20.3 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 28.1.3(@babel/core@7.23.2) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + /babel-jest@29.7.0(@babel/core@7.23.2): resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4115,6 +4744,16 @@ packages: - supports-color dev: true + /babel-plugin-jest-hoist@28.1.3: + resolution: {integrity: sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@babel/template': 7.22.15 + '@babel/types': 7.23.0 + '@types/babel__core': 7.20.3 + '@types/babel__traverse': 7.18.3 + dev: true + /babel-plugin-jest-hoist@29.6.3: resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4154,6 +4793,17 @@ packages: '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.2) dev: true + /babel-preset-jest@28.1.3(@babel/core@7.23.2): + resolution: {integrity: sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + babel-plugin-jest-hoist: 28.1.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.2) + dev: true + /babel-preset-jest@29.6.3(@babel/core@7.23.2): resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4180,6 +4830,11 @@ packages: /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + /big-integer@1.6.52: + resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} + engines: {node: '>=0.6'} + dev: true + /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} @@ -4224,6 +4879,13 @@ packages: wrap-ansi: 8.1.0 dev: false + /bplist-parser@0.2.0: + resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} + engines: {node: '>= 5.10.0'} + dependencies: + big-integer: 1.6.52 + dev: true + /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: @@ -4305,6 +4967,13 @@ packages: - supports-color dev: false + /bundle-name@3.0.0: + resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} + engines: {node: '>=12'} + dependencies: + run-applescript: 5.0.0 + dev: true + /busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} @@ -4316,6 +4985,11 @@ packages: engines: {node: '>=8'} dev: true + /cachedir@2.3.0: + resolution: {integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==} + engines: {node: '>=6'} + dev: true + /call-bind@1.0.2: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: @@ -4327,6 +5001,15 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} + /camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + dev: true + /camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} @@ -4600,6 +5283,36 @@ packages: engines: {node: '>= 6'} dev: true + /commitizen@4.3.0(typescript@4.9.5): + resolution: {integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==} + engines: {node: '>= 12'} + hasBin: true + dependencies: + cachedir: 2.3.0 + cz-conventional-changelog: 3.3.0(typescript@4.9.5) + dedent: 0.7.0 + detect-indent: 6.1.0 + find-node-modules: 2.1.3 + find-root: 1.1.0 + fs-extra: 9.1.0 + glob: 7.2.3 + inquirer: 8.2.5 + is-utf8: 0.2.1 + lodash: 4.17.21 + minimist: 1.2.7 + strip-bom: 4.0.0 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - typescript + dev: true + + /compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + dev: true + /compose-function@3.0.3: resolution: {integrity: sha512-xzhzTJ5eC+gmIzvZq+C3kCJHsp9os6tJkrigDRZclyGtOKINbZtE8n1Tzmeh32jW+BUDPbvZpibwvJHBLGMVwg==} dependencies: @@ -4626,6 +5339,35 @@ packages: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} dev: false + /conventional-changelog-angular@6.0.0: + resolution: {integrity: sha512-6qLgrBF4gueoC7AFVHu51nHL9pF9FRjXrH+ceVf7WmAfH3gs+gEYOkvxhjMPjZu57I4AGUGoNTY8V7Hrgf1uqg==} + engines: {node: '>=14'} + dependencies: + compare-func: 2.0.0 + dev: true + + /conventional-changelog-conventionalcommits@6.1.0: + resolution: {integrity: sha512-3cS3GEtR78zTfMzk0AizXKKIdN4OvSh7ibNz6/DPbhWWQu7LqE/8+/GqSodV+sywUR2gpJAdP/1JFf4XtN7Zpw==} + engines: {node: '>=14'} + dependencies: + compare-func: 2.0.0 + dev: true + + /conventional-commit-types@3.0.0: + resolution: {integrity: sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==} + dev: true + + /conventional-commits-parser@4.0.0: + resolution: {integrity: sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==} + engines: {node: '>=14'} + hasBin: true + dependencies: + JSONStream: 1.3.5 + is-text-path: 1.0.1 + meow: 8.1.2 + split2: 3.2.2 + dev: true + /convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} @@ -4644,6 +5386,37 @@ packages: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} dev: true + /cosmiconfig-typescript-loader@4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6)(ts-node@10.9.1)(typescript@5.2.2): + resolution: {integrity: sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw==} + engines: {node: '>=v14.21.3'} + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=7' + ts-node: '>=10' + typescript: '>=4' + dependencies: + '@types/node': 20.5.1 + cosmiconfig: 8.3.6(typescript@5.2.2) + ts-node: 10.9.1(@types/node@18.18.13)(typescript@4.9.5) + typescript: 5.2.2 + dev: true + + /cosmiconfig-typescript-loader@5.0.0(@types/node@18.18.13)(cosmiconfig@8.3.6)(typescript@4.9.5): + resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==} + engines: {node: '>=v16'} + requiresBuild: true + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=8.2' + typescript: '>=4' + dependencies: + '@types/node': 18.18.13 + cosmiconfig: 8.3.6(typescript@4.9.5) + jiti: 1.21.0 + typescript: 4.9.5 + dev: true + optional: true + /cosmiconfig@7.1.0: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} @@ -4655,6 +5428,39 @@ packages: yaml: 1.10.2 dev: false + /cosmiconfig@8.3.6(typescript@4.9.5): + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + typescript: 4.9.5 + dev: true + optional: true + + /cosmiconfig@8.3.6(typescript@5.2.2): + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + typescript: 5.2.2 + dev: true + /create-jest@29.7.0(@types/node@20.8.10)(ts-node@10.9.1): resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4721,10 +5527,31 @@ packages: /csstype@3.1.1: resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} + /cz-conventional-changelog@3.3.0(typescript@4.9.5): + resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==} + engines: {node: '>= 10'} + dependencies: + chalk: 2.4.2 + commitizen: 4.3.0(typescript@4.9.5) + conventional-commit-types: 3.0.0 + lodash.map: 4.6.0 + longest: 2.0.1 + word-wrap: 1.2.5 + optionalDependencies: + '@commitlint/load': 18.4.3(typescript@4.9.5) + transitivePeerDependencies: + - typescript + dev: true + /damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} dev: true + /dargs@7.0.0: + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + engines: {node: '>=8'} + dev: true + /data-uri-to-buffer@3.0.1: resolution: {integrity: sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==} engines: {node: '>= 6'} @@ -4773,6 +5600,19 @@ packages: dependencies: ms: 2.1.2 + /decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + dev: true + + /decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + dev: true + /decimal.js@10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} dev: true @@ -4789,6 +5629,10 @@ packages: dependencies: mimic-response: 3.1.0 + /dedent@0.7.0: + resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + dev: true + /dedent@1.5.1: resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} peerDependencies: @@ -4844,6 +5688,24 @@ packages: engines: {node: '>=0.10.0'} dev: true + /default-browser-id@3.0.0: + resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} + engines: {node: '>=12'} + dependencies: + bplist-parser: 0.2.0 + untildify: 4.0.0 + dev: true + + /default-browser@4.0.0: + resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} + engines: {node: '>=14.16'} + dependencies: + bundle-name: 3.0.0 + default-browser-id: 3.0.0 + execa: 7.2.0 + titleize: 3.0.0 + dev: true + /defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} requiresBuild: true @@ -4860,6 +5722,11 @@ packages: has-property-descriptors: 1.0.0 dev: true + /define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + dev: true + /define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} @@ -4891,6 +5758,16 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + /detect-file@1.0.0: + resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} + engines: {node: '>=0.10.0'} + dev: true + + /detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + dev: true + /detect-libc@2.0.2: resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} engines: {node: '>=8'} @@ -4910,6 +5787,11 @@ packages: dequal: 2.0.3 dev: false + /diff-sequences@28.1.1: + resolution: {integrity: sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dev: true + /diff-sequences@29.6.3: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4959,6 +5841,13 @@ packages: webidl-conversions: 7.0.0 dev: true + /dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + dependencies: + is-obj: 2.0.0 + dev: true + /dotenv-cli@7.3.0: resolution: {integrity: sha512-314CA4TyK34YEJ6ntBf80eUY+t1XaFLyem1k9P0sX1gn30qThZ5qZr/ZwE318gEnzyYP9yj9HJk6SqwE0upkfw==} hasBin: true @@ -5064,6 +5953,11 @@ packages: /electron-to-chromium@1.4.549: resolution: {integrity: sha512-gpXfJslSi4hYDkA0mTLEpYKRv9siAgSUgZ+UWyk+J5Cttpd1ThCVwdclzIwQSclz3hYn049+M2fgrP1WpvF8xg==} + /emittery@0.10.2: + resolution: {integrity: sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==} + engines: {node: '>=12'} + dev: true + /emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} @@ -5305,6 +6199,15 @@ packages: source-map: 0.6.1 dev: true + /eslint-compat-utils@0.1.2(eslint@8.52.0): + resolution: {integrity: sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==} + engines: {node: '>=12'} + peerDependencies: + eslint: '>=6.0.0' + dependencies: + eslint: 8.52.0 + dev: true + /eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.29.0)(eslint@8.52.0): resolution: {integrity: sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==} engines: {node: ^10.12.0 || >=12.0.0} @@ -5525,6 +6428,41 @@ packages: - typescript dev: true + /eslint-plugin-json-schema-validator@4.7.3(eslint@8.52.0): + resolution: {integrity: sha512-odFpNM997t484eprsTEk7YTt7JXgZ5ewCIekcOPGJLe5OFGKoRkJWtQ5lUJdRqqaOOD5vE8kGmV8fDvs0h9iNg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) + ajv: 8.12.0 + debug: 4.3.4 + eslint: 8.52.0 + eslint-compat-utils: 0.1.2(eslint@8.52.0) + json-schema-migrate: 2.0.0 + jsonc-eslint-parser: 2.4.0 + minimatch: 8.0.4 + synckit: 0.8.5 + toml-eslint-parser: 0.9.3 + tunnel-agent: 0.6.0 + yaml-eslint-parser: 1.2.2 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-jsonc@2.10.0(eslint@8.52.0): + resolution: {integrity: sha512-9d//o6Jyh4s1RxC9fNSt1+MMaFN2ruFdXPG9XZcb/mR2KkfjADYiNL/hbU6W0Cyxfg3tS/XSFuhl5LgtMD8hmw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) + eslint: 8.52.0 + eslint-compat-utils: 0.1.2(eslint@8.52.0) + jsonc-eslint-parser: 2.4.0 + natural-compare: 1.4.0 + dev: true + /eslint-plugin-jsx-a11y@6.8.0(eslint@8.52.0): resolution: {integrity: sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==} engines: {node: '>=4.0'} @@ -5729,6 +6667,21 @@ packages: strip-final-newline: 2.0.0 dev: true + /execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 4.3.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.1.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + dev: true + /exit@0.1.2: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} @@ -5738,6 +6691,24 @@ packages: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} + /expand-tilde@2.0.2: + resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} + engines: {node: '>=0.10.0'} + dependencies: + homedir-polyfill: 1.0.3 + dev: true + + /expect@28.1.3: + resolution: {integrity: sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/expect-utils': 28.1.3 + jest-get-type: 28.0.2 + jest-matcher-utils: 28.1.3 + jest-message-util: 28.1.3 + jest-util: 28.1.3 + dev: true + /expect@29.7.0: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5868,9 +6839,15 @@ packages: engines: {node: '>=0.10.0'} dev: true + /find-node-modules@2.1.3: + resolution: {integrity: sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==} + dependencies: + findup-sync: 4.0.0 + merge: 2.1.1 + dev: true + /find-root@1.1.0: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} - dev: false /find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} @@ -5888,6 +6865,16 @@ packages: path-exists: 4.0.0 dev: true + /findup-sync@4.0.0: + resolution: {integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==} + engines: {node: '>= 8'} + dependencies: + detect-file: 1.0.0 + is-glob: 4.0.3 + micromatch: 4.0.5 + resolve-dir: 1.0.1 + dev: true + /flat-cache@3.0.4: resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -5962,7 +6949,6 @@ packages: graceful-fs: 4.2.10 jsonfile: 6.1.0 universalify: 2.0.0 - dev: false /fs-extra@9.1.0: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} @@ -6091,6 +7077,18 @@ packages: resolve-pkg-maps: 1.0.0 dev: true + /git-raw-commits@2.0.11: + resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + dargs: 7.0.0 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + dev: true + /github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} @@ -6154,6 +7152,33 @@ packages: once: 1.4.0 dev: false + /global-dirs@0.1.1: + resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} + engines: {node: '>=4'} + dependencies: + ini: 1.3.8 + dev: true + + /global-modules@1.0.0: + resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} + engines: {node: '>=0.10.0'} + dependencies: + global-prefix: 1.0.2 + is-windows: 1.0.2 + resolve-dir: 1.0.1 + dev: true + + /global-prefix@1.0.2: + resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} + engines: {node: '>=0.10.0'} + dependencies: + expand-tilde: 2.0.2 + homedir-polyfill: 1.0.3 + ini: 1.3.8 + is-windows: 1.0.2 + which: 1.3.1 + dev: true + /globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} @@ -6215,7 +7240,6 @@ packages: /graceful-fs@4.2.10: resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} - dev: false /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -6229,6 +7253,11 @@ packages: engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} dev: true + /hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + dev: true + /has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} dev: true @@ -6375,6 +7404,17 @@ packages: react-is: 16.13.1 dev: false + /homedir-polyfill@1.0.3: + resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} + engines: {node: '>=0.10.0'} + dependencies: + parse-passwd: 1.0.0 + dev: true + + /hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true + /hosted-git-info@4.1.0: resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} engines: {node: '>=10'} @@ -6443,6 +7483,17 @@ packages: engines: {node: '>=10.17.0'} dev: true + /human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + dev: true + + /husky@8.0.3: + resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} + engines: {node: '>=14'} + hasBin: true + dev: true + /hyperdyperid@1.2.0: resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} engines: {node: '>=10.18'} @@ -6676,6 +7727,18 @@ packages: has-tostringtag: 1.0.0 dev: true + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: true + + /is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + dev: true + /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -6713,6 +7776,14 @@ packages: dependencies: is-extglob: 2.1.1 + /is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + dependencies: + is-docker: 3.0.0 + dev: true + /is-interactive@1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} @@ -6752,11 +7823,21 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + /is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + dev: true + /is-path-inside@3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} dev: true + /is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + dev: true + /is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} @@ -6788,6 +7869,11 @@ packages: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + /is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} @@ -6802,6 +7888,13 @@ packages: has-symbols: 1.0.3 dev: true + /is-text-path@1.0.1: + resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} + engines: {node: '>=0.10.0'} + dependencies: + text-extensions: 1.9.0 + dev: true + /is-typed-array@1.1.12: resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} engines: {node: '>= 0.4'} @@ -6814,6 +7907,10 @@ packages: engines: {node: '>=10'} dev: true + /is-utf8@0.2.1: + resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} + dev: true + /is-weakmap@2.0.1: resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} dev: true @@ -6831,6 +7928,18 @@ packages: get-intrinsic: 1.2.1 dev: true + /is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + dev: true + + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + dev: true + /isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} dev: true @@ -6926,6 +8035,14 @@ packages: '@pkgjs/parseargs': 0.11.0 dev: true + /jest-changed-files@28.1.3: + resolution: {integrity: sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + execa: 5.1.1 + p-limit: 3.1.0 + dev: true + /jest-changed-files@29.7.0: resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -6935,6 +8052,33 @@ packages: p-limit: 3.1.0 dev: true + /jest-circus@28.1.3: + resolution: {integrity: sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/environment': 28.1.3 + '@jest/expect': 28.1.3 + '@jest/test-result': 28.1.3 + '@jest/types': 28.1.3 + '@types/node': 18.18.13 + chalk: 4.1.2 + co: 4.6.0 + dedent: 0.7.0 + is-generator-fn: 2.1.0 + jest-each: 28.1.3 + jest-matcher-utils: 28.1.3 + jest-message-util: 28.1.3 + jest-runtime: 28.1.3 + jest-snapshot: 28.1.3 + jest-util: 28.1.3 + p-limit: 3.1.0 + pretty-format: 28.1.3 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - supports-color + dev: true + /jest-circus@29.7.0: resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -6964,6 +8108,34 @@ packages: - supports-color dev: true + /jest-cli@28.1.3(@types/node@18.18.13)(ts-node@10.9.1): + resolution: {integrity: sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 28.1.3(ts-node@10.9.1) + '@jest/test-result': 28.1.3 + '@jest/types': 28.1.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + import-local: 3.1.0 + jest-config: 28.1.3(@types/node@18.18.13)(ts-node@10.9.1) + jest-util: 28.1.3 + jest-validate: 28.1.3 + prompts: 2.4.2 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + /jest-cli@29.7.0(@types/node@20.8.10)(ts-node@10.9.1): resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -6992,6 +8164,46 @@ packages: - ts-node dev: true + /jest-config@28.1.3(@types/node@18.18.13)(ts-node@10.9.1): + resolution: {integrity: sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.23.2 + '@jest/test-sequencer': 28.1.3 + '@jest/types': 28.1.3 + '@types/node': 18.18.13 + babel-jest: 28.1.3(@babel/core@7.23.2) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.0 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 28.1.3 + jest-environment-node: 28.1.3 + jest-get-type: 28.0.2 + jest-regex-util: 28.0.2 + jest-resolve: 28.1.3 + jest-runner: 28.1.3 + jest-util: 28.1.3 + jest-validate: 28.1.3 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 28.1.3 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 10.9.1(@types/node@18.18.13)(typescript@4.9.5) + transitivePeerDependencies: + - supports-color + dev: true + /jest-config@29.7.0(@types/node@20.8.10)(ts-node@10.9.1): resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -7033,6 +8245,16 @@ packages: - supports-color dev: true + /jest-diff@28.1.3: + resolution: {integrity: sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 28.1.1 + jest-get-type: 28.0.2 + pretty-format: 28.1.3 + dev: true + /jest-diff@29.7.0: resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -7043,6 +8265,13 @@ packages: pretty-format: 29.7.0 dev: true + /jest-docblock@28.1.1: + resolution: {integrity: sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + detect-newline: 3.1.0 + dev: true + /jest-docblock@29.7.0: resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -7050,6 +8279,17 @@ packages: detect-newline: 3.1.0 dev: true + /jest-each@28.1.3: + resolution: {integrity: sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/types': 28.1.3 + chalk: 4.1.2 + jest-get-type: 28.0.2 + jest-util: 28.1.3 + pretty-format: 28.1.3 + dev: true + /jest-each@29.7.0: resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -7084,6 +8324,18 @@ packages: - utf-8-validate dev: true + /jest-environment-node@28.1.3: + resolution: {integrity: sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/environment': 28.1.3 + '@jest/fake-timers': 28.1.3 + '@jest/types': 28.1.3 + '@types/node': 18.18.13 + jest-mock: 28.1.3 + jest-util: 28.1.3 + dev: true + /jest-environment-node@29.7.0: resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -7096,11 +8348,35 @@ packages: jest-util: 29.7.0 dev: true + /jest-get-type@28.0.2: + resolution: {integrity: sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dev: true + /jest-get-type@29.6.3: resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true + /jest-haste-map@28.1.3: + resolution: {integrity: sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/types': 28.1.3 + '@types/graceful-fs': 4.1.6 + '@types/node': 18.18.13 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 28.0.2 + jest-util: 28.1.3 + jest-worker: 28.1.3 + micromatch: 4.0.5 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + dev: true + /jest-haste-map@29.7.0: resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -7120,6 +8396,14 @@ packages: fsevents: 2.3.3 dev: true + /jest-leak-detector@28.1.3: + resolution: {integrity: sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + jest-get-type: 28.0.2 + pretty-format: 28.1.3 + dev: true + /jest-leak-detector@29.7.0: resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -7128,6 +8412,16 @@ packages: pretty-format: 29.7.0 dev: true + /jest-matcher-utils@28.1.3: + resolution: {integrity: sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + chalk: 4.1.2 + jest-diff: 28.1.3 + jest-get-type: 28.0.2 + pretty-format: 28.1.3 + dev: true + /jest-matcher-utils@29.7.0: resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -7138,6 +8432,21 @@ packages: pretty-format: 29.7.0 dev: true + /jest-message-util@28.1.3: + resolution: {integrity: sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@babel/code-frame': 7.22.13 + '@jest/types': 28.1.3 + '@types/stack-utils': 2.0.1 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.5 + pretty-format: 28.1.3 + slash: 3.0.0 + stack-utils: 2.0.6 + dev: true + /jest-message-util@29.7.0: resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -7153,6 +8462,14 @@ packages: stack-utils: 2.0.6 dev: true + /jest-mock@28.1.3: + resolution: {integrity: sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/types': 28.1.3 + '@types/node': 18.18.13 + dev: true + /jest-mock@29.7.0: resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -7162,6 +8479,18 @@ packages: jest-util: 29.7.0 dev: true + /jest-pnp-resolver@1.2.3(jest-resolve@28.1.3): + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: 28.1.3 + dev: true + /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} engines: {node: '>=6'} @@ -7174,11 +8503,26 @@ packages: jest-resolve: 29.7.0 dev: true + /jest-regex-util@28.0.2: + resolution: {integrity: sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dev: true + /jest-regex-util@29.6.3: resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true + /jest-resolve-dependencies@28.1.3: + resolution: {integrity: sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + jest-regex-util: 28.0.2 + jest-snapshot: 28.1.3 + transitivePeerDependencies: + - supports-color + dev: true + /jest-resolve-dependencies@29.7.0: resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -7189,6 +8533,21 @@ packages: - supports-color dev: true + /jest-resolve@28.1.3: + resolution: {integrity: sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 28.1.3 + jest-pnp-resolver: 1.2.3(jest-resolve@28.1.3) + jest-util: 28.1.3 + jest-validate: 28.1.3 + resolve: 1.22.8 + resolve.exports: 1.1.1 + slash: 3.0.0 + dev: true + /jest-resolve@29.7.0: resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -7204,6 +8563,35 @@ packages: slash: 3.0.0 dev: true + /jest-runner@28.1.3: + resolution: {integrity: sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/console': 28.1.3 + '@jest/environment': 28.1.3 + '@jest/test-result': 28.1.3 + '@jest/transform': 28.1.3 + '@jest/types': 28.1.3 + '@types/node': 18.18.13 + chalk: 4.1.2 + emittery: 0.10.2 + graceful-fs: 4.2.11 + jest-docblock: 28.1.1 + jest-environment-node: 28.1.3 + jest-haste-map: 28.1.3 + jest-leak-detector: 28.1.3 + jest-message-util: 28.1.3 + jest-resolve: 28.1.3 + jest-runtime: 28.1.3 + jest-util: 28.1.3 + jest-watcher: 28.1.3 + jest-worker: 28.1.3 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + dev: true + /jest-runner@29.7.0: resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -7233,6 +8621,36 @@ packages: - supports-color dev: true + /jest-runtime@28.1.3: + resolution: {integrity: sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/environment': 28.1.3 + '@jest/fake-timers': 28.1.3 + '@jest/globals': 28.1.3 + '@jest/source-map': 28.1.2 + '@jest/test-result': 28.1.3 + '@jest/transform': 28.1.3 + '@jest/types': 28.1.3 + chalk: 4.1.2 + cjs-module-lexer: 1.2.2 + collect-v8-coverage: 1.0.1 + execa: 5.1.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-haste-map: 28.1.3 + jest-message-util: 28.1.3 + jest-mock: 28.1.3 + jest-regex-util: 28.0.2 + jest-resolve: 28.1.3 + jest-snapshot: 28.1.3 + jest-util: 28.1.3 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + /jest-runtime@29.7.0: resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -7263,6 +8681,37 @@ packages: - supports-color dev: true + /jest-snapshot@28.1.3: + resolution: {integrity: sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@babel/core': 7.23.2 + '@babel/generator': 7.23.0 + '@babel/plugin-syntax-typescript': 7.20.0(@babel/core@7.23.2) + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 + '@jest/expect-utils': 28.1.3 + '@jest/transform': 28.1.3 + '@jest/types': 28.1.3 + '@types/babel__traverse': 7.18.3 + '@types/prettier': 2.7.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.2) + chalk: 4.1.2 + expect: 28.1.3 + graceful-fs: 4.2.11 + jest-diff: 28.1.3 + jest-get-type: 28.0.2 + jest-haste-map: 28.1.3 + jest-matcher-utils: 28.1.3 + jest-message-util: 28.1.3 + jest-util: 28.1.3 + natural-compare: 1.4.0 + pretty-format: 28.1.3 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + dev: true + /jest-snapshot@29.7.0: resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -7291,6 +8740,18 @@ packages: - supports-color dev: true + /jest-util@28.1.3: + resolution: {integrity: sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/types': 28.1.3 + '@types/node': 18.18.13 + chalk: 4.1.2 + ci-info: 3.8.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + dev: true + /jest-util@29.7.0: resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -7303,6 +8764,18 @@ packages: picomatch: 2.3.1 dev: true + /jest-validate@28.1.3: + resolution: {integrity: sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/types': 28.1.3 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 28.0.2 + leven: 3.1.0 + pretty-format: 28.1.3 + dev: true + /jest-validate@29.7.0: resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -7315,6 +8788,20 @@ packages: pretty-format: 29.7.0 dev: true + /jest-watcher@28.1.3: + resolution: {integrity: sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/test-result': 28.1.3 + '@jest/types': 28.1.3 + '@types/node': 18.18.13 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.10.2 + jest-util: 28.1.3 + string-length: 4.0.2 + dev: true + /jest-watcher@29.7.0: resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -7329,6 +8816,15 @@ packages: string-length: 4.0.2 dev: true + /jest-worker@28.1.3: + resolution: {integrity: sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@types/node': 18.18.13 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + /jest-worker@29.7.0: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -7339,6 +8835,26 @@ packages: supports-color: 8.1.1 dev: true + /jest@28.1.3(@types/node@18.18.13)(ts-node@10.9.1): + resolution: {integrity: sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 28.1.3(ts-node@10.9.1) + '@jest/types': 28.1.3 + import-local: 3.1.0 + jest-cli: 28.1.3(@types/node@18.18.13)(ts-node@10.9.1) + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + /jest@29.7.0(@types/node@20.8.10)(ts-node@10.9.1): resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -7463,10 +8979,20 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: true + /json-schema-migrate@2.0.0: + resolution: {integrity: sha512-r38SVTtojDRp4eD6WsCqiE0eNDt4v1WalBXb9cyZYw9ai5cGtBwzRNWjHzJl38w6TxFkXAIA7h+fyX3tnrAFhQ==} + dependencies: + ajv: 8.12.0 + dev: true + /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: true + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: true + /json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true @@ -7487,6 +9013,16 @@ packages: engines: {node: '>=6'} hasBin: true + /jsonc-eslint-parser@2.4.0: + resolution: {integrity: sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.10.0 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + semver: 7.5.4 + dev: true + /jsonc-parser@3.2.0: resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} dev: true @@ -7498,6 +9034,11 @@ packages: optionalDependencies: graceful-fs: 4.2.11 + /jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + dev: true + /jsx-ast-utils@3.3.3: resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==} engines: {node: '>=4.0'} @@ -7531,6 +9072,11 @@ packages: safe-buffer: 5.2.1 dev: false + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: true + /kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} @@ -7580,6 +9126,10 @@ packages: language-subtag-registry: 0.3.22 dev: true + /let-it-go@1.0.0: + resolution: {integrity: sha512-yzn7EFjddUpsSzhCsJSh8aWGNcTelVaPOUfOvHuR/4VZjpRQNZFznkiTT5dw4txP0aUQ4/B4lLsY37PwBHw0kA==} + dev: false + /leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} @@ -7633,6 +9183,10 @@ packages: p-locate: 5.0.0 dev: true + /lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: true + /lodash.clonedeep@4.5.0: resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} dev: true @@ -7653,6 +9207,22 @@ packages: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} dev: true + /lodash.isfunction@3.0.9: + resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} + dev: true + + /lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + dev: true + + /lodash.kebabcase@4.1.1: + resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + dev: true + + /lodash.map@4.6.0: + resolution: {integrity: sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==} + dev: true + /lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} dev: true @@ -7660,6 +9230,26 @@ packages: /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + /lodash.mergewith@4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + dev: true + + /lodash.snakecase@4.1.1: + resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + dev: true + + /lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + dev: true + + /lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + dev: true + + /lodash.upperfirst@4.3.1: + resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} + dev: true + /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} @@ -7697,6 +9287,11 @@ packages: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} dev: false + /longest@2.0.1: + resolution: {integrity: sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==} + engines: {node: '>=0.10.0'} + dev: true + /loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -7779,11 +9374,21 @@ packages: p-defer: 1.0.0 dev: true + /map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + dev: true + /map-obj@2.0.0: resolution: {integrity: sha512-TzQSV2DiMYgoF5RycneKVUzIa9bQsj/B3tTgsE3dOGqlzHnGIDaC7XBE7grnA+8kZPnfqSGFe95VHc2oc0VFUQ==} engines: {node: '>=4'} dev: true + /map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + dev: true + /markdown-table@3.0.3: resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} dev: false @@ -7965,6 +9570,23 @@ packages: resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} dev: false + /meow@8.1.2: + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} + dependencies: + '@types/minimist': 1.2.5 + camelcase-keys: 6.2.2 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + dev: true + /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} dev: true @@ -7974,6 +9596,10 @@ packages: engines: {node: '>= 8'} dev: true + /merge@2.1.1: + resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==} + dev: true + /micromark-core-commonmark@2.0.0: resolution: {integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==} dependencies: @@ -8248,6 +9874,11 @@ packages: engines: {node: '>=8'} dev: true + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true + /mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} @@ -8273,6 +9904,13 @@ packages: brace-expansion: 2.0.1 dev: false + /minimatch@8.0.4: + resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + /minimatch@9.0.3: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} @@ -8280,6 +9918,19 @@ packages: brace-expansion: 2.0.1 dev: true + /minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + dev: true + + /minimist@1.2.7: + resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} + dev: true + /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -8606,6 +10257,25 @@ packages: abbrev: 1.1.1 dev: false + /normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.8 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.13.1 + semver: 7.5.4 + validate-npm-package-license: 3.0.4 + dev: true + /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -8622,6 +10292,13 @@ packages: path-key: 3.1.1 dev: true + /npm-run-path@5.1.0: + resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: true + /npmlog@5.0.1: resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} dependencies: @@ -8770,6 +10447,23 @@ packages: dependencies: mimic-fn: 2.1.0 + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: true + + /open@9.1.0: + resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} + engines: {node: '>=14.16'} + dependencies: + default-browser: 4.0.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 2.2.0 + dev: true + /optionator@0.8.3: resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} engines: {node: '>= 0.8.0'} @@ -8914,6 +10608,11 @@ packages: semver: 6.3.1 dev: true + /parse-passwd@1.0.0: + resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} + engines: {node: '>=0.10.0'} + dev: true + /parse5@7.1.2: resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} dependencies: @@ -8938,6 +10637,11 @@ packages: engines: {node: '>=8'} dev: true + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: true + /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -9217,6 +10921,12 @@ packages: engines: {node: '>= 0.8.0'} dev: true + /prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + /prettier@3.0.3: resolution: {integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==} engines: {node: '>=14'} @@ -9232,6 +10942,16 @@ packages: react-is: 17.0.2 dev: true + /pretty-format@28.1.3: + resolution: {integrity: sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/schemas': 28.1.3 + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 18.2.0 + dev: true + /pretty-format@29.7.0: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -9323,6 +11043,11 @@ packages: resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} dev: false + /quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + dev: true + /quill-delta@5.1.0: resolution: {integrity: sha512-X74oCeRI4/p0ucjb5Ma8adTXd9Scumz367kkMK5V/IatcX6A0vlgLgKbzXWy5nZmCGeNJm2oQX0d2Eqj+ZIlCA==} engines: {node: '>= 12.0.0'} @@ -9530,6 +11255,25 @@ packages: npm-normalize-package-bin: 3.0.1 dev: true + /read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + dev: true + + /read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + dev: true + /readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} dependencies: @@ -9689,6 +11433,11 @@ packages: engines: {node: '>=0.10.0'} dev: true + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: true + /requireindex@1.2.0: resolution: {integrity: sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==} engines: {node: '>=0.10.5'} @@ -9705,6 +11454,14 @@ packages: resolve-from: 5.0.0 dev: true + /resolve-dir@1.0.1: + resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} + engines: {node: '>=0.10.0'} + dependencies: + expand-tilde: 2.0.2 + global-modules: 1.0.0 + dev: true + /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -9714,10 +11471,22 @@ packages: engines: {node: '>=8'} dev: true + /resolve-global@1.0.0: + resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} + engines: {node: '>=8'} + dependencies: + global-dirs: 0.1.1 + dev: true + /resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} dev: true + /resolve.exports@1.1.1: + resolution: {integrity: sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==} + engines: {node: '>=10'} + dev: true + /resolve.exports@2.0.0: resolution: {integrity: sha512-6K/gDlqgQscOlg9fSRpWstA8sYe8rbELsSTNpx+3kTrsVCzvSl0zIvRErM7fdl9ERWDsKnrLnwB+Ne89918XOg==} engines: {node: '>=10'} @@ -9788,6 +11557,13 @@ packages: fsevents: 2.3.3 dev: true + /run-applescript@5.0.0: + resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} + engines: {node: '>=12'} + dependencies: + execa: 5.1.1 + dev: true + /run-async@2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} @@ -9859,6 +11635,11 @@ packages: dependencies: loose-envify: 1.4.0 + /semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + dev: true + /semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -10015,6 +11796,28 @@ packages: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} dev: false + /spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.16 + dev: true + + /spdx-exceptions@2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + dev: true + + /spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.16 + dev: true + + /spdx-license-ids@3.0.16: + resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} + dev: true + /split2@3.2.2: resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} dependencies: @@ -10203,6 +12006,11 @@ packages: engines: {node: '>=6'} dev: true + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true + /strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -10281,6 +12089,14 @@ packages: has-flag: 4.0.0 dev: true + /supports-hyperlinks@2.3.0: + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + dev: true + /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -10299,6 +12115,14 @@ packages: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} dev: true + /synckit@0.8.5: + resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} + engines: {node: ^14.18.0 || >=16.0.0} + dependencies: + '@pkgr/utils': 2.4.2 + tslib: 2.6.2 + dev: true + /systeminformation@5.21.15: resolution: {integrity: sha512-vMLwsGgJZW6GvoBXVWNZuRQG0MPxlfQnIIIY9ZxoogWftUpJ9C33qD+32e1meFlXuWpN0moNApPFLpbsSi4OaQ==} engines: {node: '>=8.0.0'} @@ -10357,6 +12181,14 @@ packages: yallist: 4.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: true + /test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} @@ -10366,6 +12198,11 @@ packages: minimatch: 3.1.2 dev: true + /text-extensions@1.9.0: + resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} + engines: {node: '>=0.10'} + dev: true + /text-hex@1.0.0: resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} dev: false @@ -10412,6 +12249,11 @@ packages: engines: {node: '>=14.0.0'} dev: true + /titleize@3.0.0: + resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} + engines: {node: '>=12'} + dev: true + /tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -10449,6 +12291,13 @@ packages: to-no-case: 1.0.2 dev: true + /toml-eslint-parser@0.9.3: + resolution: {integrity: sha512-moYoCvkNUAPCxSW9jmHmRElhm4tVJpHL8ItC/+uYD0EpPSFXbck7yREz9tNdJVTSpHVod8+HoipcpbQ0oE6gsw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + eslint-visitor-keys: 3.4.3 + dev: true + /touch@3.1.0: resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} hasBin: true @@ -10480,6 +12329,11 @@ packages: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} dev: false + /trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + dev: true + /triple-beam@1.3.0: resolution: {integrity: sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==} dev: false @@ -10497,6 +12351,40 @@ packages: typescript: 5.2.2 dev: true + /ts-jest@28.0.8(@babel/core@7.23.2)(jest@28.1.3)(typescript@4.9.5): + resolution: {integrity: sha512-5FaG0lXmRPzApix8oFG8RKjAz4ehtm8yMKOTy5HX3fY6W8kmvOrmcY0hKDElW52FJov+clhUbrKAqofnj4mXTg==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/types': ^28.0.0 + babel-jest: ^28.0.0 + esbuild: '*' + jest: ^28.0.0 + typescript: '>=4.3' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + dependencies: + '@babel/core': 7.23.2 + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 28.1.3(@types/node@18.18.13)(ts-node@10.9.1) + jest-util: 28.1.3 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.5.4 + typescript: 4.9.5 + yargs-parser: 21.1.1 + dev: true + /ts-jest@29.1.1(@babel/core@7.23.2)(jest@29.7.0)(typescript@5.2.2): resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10531,6 +12419,37 @@ packages: yargs-parser: 21.1.1 dev: true + /ts-node@10.9.1(@types/node@18.18.13)(typescript@4.9.5): + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.3 + '@types/node': 18.18.13 + acorn: 8.8.2 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 4.9.5 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + /ts-node@10.9.1(@types/node@20.8.10)(typescript@5.2.2): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true @@ -10636,6 +12555,11 @@ packages: engines: {node: '>=4'} dev: true + /type-fest@0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + dev: true + /type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} @@ -10651,6 +12575,11 @@ packages: engines: {node: '>=8'} dev: true + /type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + dev: true + /type-fest@1.4.0: resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} engines: {node: '>=10'} @@ -10698,6 +12627,12 @@ packages: is-typed-array: 1.1.12 dev: true + /typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + /typescript@5.2.2: resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} engines: {node: '>=14.17'} @@ -10798,6 +12733,11 @@ packages: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} engines: {node: '>= 10.0.0'} + /untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + dev: true + /update-browserslist-db@1.0.13(browserslist@4.22.1): resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true @@ -10919,6 +12859,13 @@ packages: convert-source-map: 1.9.0 dev: true + /validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + dev: true + /validate-npm-package-name@4.0.0: resolution: {integrity: sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -11243,6 +13190,13 @@ packages: has-tostringtag: 1.0.0 dev: true + /which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -11370,11 +13324,25 @@ packages: /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + /yaml-eslint-parser@1.2.2: + resolution: {integrity: sha512-pEwzfsKbTrB8G3xc/sN7aw1v6A6c/pKxLAkjclnAyo5g5qOh6eL9WGu0o3cSDQZKrTNk4KL4lQSwZW+nBkANEg==} + engines: {node: ^14.17.0 || >=16.0.0} + dependencies: + eslint-visitor-keys: 3.4.3 + lodash: 4.17.21 + yaml: 2.3.4 + dev: true + /yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} dev: false + /yaml@2.3.4: + resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} + engines: {node: '>= 14'} + dev: true + /yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} diff --git a/public/tipi-christmas.png b/public/tipi-christmas.png new file mode 100644 index 0000000000000000000000000000000000000000..34a36c8afabce09caa93a566f24c72e4fed7e653 GIT binary patch literal 44889 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�G4hG#n}A1k{2j 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ⅆcmY*g0+DYbR~=d`l%FMm@wH7d{Y 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 @@ -15,7 +18,7 @@ export default async function AuthLayout({ children }: { children: React.ReactNo
Tipi logo + ); diff --git a/src/app/(dashboard)/components/Header/Header.tsx b/src/app/(dashboard)/components/Header/Header.tsx index 0e1ad03d..8f7713b4 100644 --- a/src/app/(dashboard)/components/Header/Header.tsx +++ b/src/app/(dashboard)/components/Header/Header.tsx @@ -13,14 +13,16 @@ import { useAction } from 'next-safe-action/hook'; import { logoutAction } from '@/actions/logout/logout-action'; import Script from 'next/script'; import { useRouter } from 'next/navigation'; +import { getLogo } from '@/lib/themes'; import { NavBar } from '../NavBar'; interface IProps { isUpdateAvailable?: boolean; authenticated?: boolean; + autoTheme: boolean; } -export const Header: React.FC = ({ isUpdateAvailable, authenticated = true }) => { +export const Header: React.FC = ({ isUpdateAvailable, authenticated = true, autoTheme }) => { const { setDarkMode } = useUIStore(); const t = useTranslations('header'); @@ -55,7 +57,7 @@ export const Header: React.FC = ({ isUpdateAvailable, authenticated = tr className={clsx('navbar-brand-image me-3')} width={100} height={100} - src="/tipi.png" + src={getLogo(autoTheme)} style={{ width: '30px', maxWidth: '30px', diff --git a/src/app/(dashboard)/layout.tsx b/src/app/(dashboard)/layout.tsx index 24f08a37..b8ea25ad 100644 --- a/src/app/(dashboard)/layout.tsx +++ b/src/app/(dashboard)/layout.tsx @@ -5,6 +5,7 @@ import { SystemServiceClass } from '@/server/services/system'; import semver from 'semver'; import clsx from 'clsx'; import { AppServiceClass } from '@/server/services/apps/apps.service'; +import { getConfig } from '@/server/core/TipiConfig'; import { Header } from './components/Header'; import { PageTitle } from './components/PageTitle'; import styles from './layout.module.scss'; @@ -12,6 +13,7 @@ import { LayoutActions } from './components/LayoutActions/LayoutActions'; export default async function DashboardLayout({ children }: { children: React.ReactNode }) { const user = await getUserFromCookie(); + const { allowAutoThemes } = getConfig(); const { apps } = await AppServiceClass.listApps(); @@ -25,7 +27,7 @@ export default async function DashboardLayout({ children }: { children: React.Re return (
-
+
diff --git a/src/app/(dashboard)/settings/components/SettingsContainer/SettingsContainer.tsx b/src/app/(dashboard)/settings/components/SettingsContainer/SettingsContainer.tsx index f9458e26..b7bc96b7 100644 --- a/src/app/(dashboard)/settings/components/SettingsContainer/SettingsContainer.tsx +++ b/src/app/(dashboard)/settings/components/SettingsContainer/SettingsContainer.tsx @@ -6,6 +6,7 @@ import { useTranslations } from 'next-intl'; import { useAction } from 'next-safe-action/hook'; import { updateSettingsAction } from '@/actions/settings/update-settings'; import { Locale } from '@/shared/internationalization/locales'; +import { useRouter } from 'next/navigation'; import { SettingsForm, SettingsFormValues } from '../SettingsForm'; type Props = { @@ -16,12 +17,15 @@ type Props = { export const SettingsContainer = ({ initialValues, currentLocale }: Props) => { const t = useTranslations(); + const router = useRouter(); + const updateSettingsMutation = useAction(updateSettingsAction, { onSuccess: (data) => { if (!data.success) { toast.error(data.failure.reason); } else { toast.success(t('settings.settings.settings-updated')); + router.refresh(); } }, }); diff --git a/src/app/(dashboard)/settings/components/SettingsForm/SettingsForm.tsx b/src/app/(dashboard)/settings/components/SettingsForm/SettingsForm.tsx index 1d700178..b9adefe2 100644 --- a/src/app/(dashboard)/settings/components/SettingsForm/SettingsForm.tsx +++ b/src/app/(dashboard)/settings/components/SettingsForm/SettingsForm.tsx @@ -19,6 +19,7 @@ export type SettingsFormValues = { storagePath?: string; localDomain?: string; guestDashboard?: boolean; + allowAutoThemes?: boolean; }; interface IProps { @@ -139,6 +140,29 @@ export const SettingsForm = (props: IProps) => { )} />
+
+ ( + + {t('allow-auto-themes')} + {t('allow-auto-themes-hint')} + ? + + } + /> + )} + /> +
['value']; initialTheme?: string; + allowAutoThemes: boolean; }; -export const ClientProviders = ({ children, initialTheme, cookies }: Props) => { +export const ClientProviders = ({ children, initialTheme, cookies, allowAutoThemes }: Props) => { return ( - {children} + + {children} + ); }; diff --git a/src/app/components/ClientProviders/ThemeProvider/ThemeProvider.tsx b/src/app/components/ClientProviders/ThemeProvider/ThemeProvider.tsx index 878a377e..98f3d909 100644 --- a/src/app/components/ClientProviders/ThemeProvider/ThemeProvider.tsx +++ b/src/app/components/ClientProviders/ThemeProvider/ThemeProvider.tsx @@ -3,14 +3,22 @@ import { useUIStore } from '@/client/state/uiStore'; import React, { useEffect } from 'react'; import { useCookies } from 'next-client-cookies'; +import { getAutoTheme } from '@/lib/themes'; type Props = { children: React.ReactNode; + allowAutoThemes: boolean; initialTheme?: string; }; +const loadChristmasTheme = async () => { + const { default: LetItGo } = await import('let-it-go'); + const snow = new LetItGo({ number: 50 }); + snow.letItGoAgain(); +}; + export const ThemeProvider = (props: Props) => { - const { children, initialTheme } = props; + const { children, initialTheme, allowAutoThemes } = props; const cookies = useCookies(); const { theme, setDarkMode } = useUIStore(); @@ -30,5 +38,12 @@ export const ThemeProvider = (props: Props) => { setDarkMode(cookieTheme === 'dark'); }, [cookies, initialTheme, setDarkMode, theme]); + useEffect(() => { + const autoTheme = getAutoTheme(); + if (autoTheme === 'christmas' && allowAutoThemes && typeof window !== 'undefined') { + loadChristmasTheme(); + } + }, [allowAutoThemes]); + return children; }; diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 6d6abd42..c68b9e50 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -5,6 +5,7 @@ import { cookies } from 'next/headers'; import { Inter } from 'next/font/google'; import merge from 'lodash.merge'; import { NextIntlClientProvider } from 'next-intl'; +import { getConfig } from '@/server/core/TipiConfig'; import './global.css'; import clsx from 'clsx'; @@ -31,10 +32,12 @@ export default async function RootLayout({ children }: { children: React.ReactNo const theme = cookies().get('theme'); + const { allowAutoThemes } = getConfig(); + return ( - + {children} diff --git a/src/app/page.tsx b/src/app/page.tsx index eb70ef3a..be54275d 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -14,7 +14,7 @@ export const dynamic = 'force-dynamic'; export default async function RootPage() { const appService = new AppServiceClass(db); - const { guestDashboard } = getConfig(); + const { guestDashboard, allowAutoThemes } = getConfig(); const headersList = headers(); const host = headersList.get('host'); @@ -24,7 +24,7 @@ export default async function RootPage() { const apps = await appService.getGuestDashboardApps(); return ( - + {apps.length === 0 ? ( ) : ( diff --git a/src/client/components/StatusScreen/StatusScreen.tsx b/src/client/components/StatusScreen/StatusScreen.tsx index dabd025a..b41c05de 100644 --- a/src/client/components/StatusScreen/StatusScreen.tsx +++ b/src/client/components/StatusScreen/StatusScreen.tsx @@ -1,5 +1,6 @@ import Image from 'next/image'; import React from 'react'; +import { getLogo } from '@/lib/themes'; import { Button } from '../ui/Button'; interface IProps { @@ -16,7 +17,7 @@ export const StatusScreen: React.FC = ({ title, subtitle, onAction, acti Tipi log { - const { children, title, subtitle } = props; + const { children, title, subtitle, autoTheme } = props; const t = useTranslations(); return (
-
+
diff --git a/src/client/messages/en.json b/src/client/messages/en.json index c4c16e00..786e8f40 100644 --- a/src/client/messages/en.json +++ b/src/client/messages/en.json @@ -251,6 +251,8 @@ "invalid-domain": "Invalid domain", "guest-dashboard": "Enable guest dashboard", "guest-dashboard-hint": "This will allow non-authenticated users to see a limited dashboard and easily access the running apps on your instance.", + "allow-auto-themes": "Allow auto themes", + "allow-auto-themes-hint": "Be surprised by themes that change automatically based on the time of the year.", "domain-name": "Domain name", "domain-name-hint": "Make sure this exact domain contains an A record pointing to your IP.", "dns-ip": "DNS IP", diff --git a/src/lib/themes.ts b/src/lib/themes.ts new file mode 100644 index 00000000..5ffe37a3 --- /dev/null +++ b/src/lib/themes.ts @@ -0,0 +1,38 @@ +export const THEMES = { + christmas: { + name: 'christmas', + month: 11, + day: 1, + durationInDays: 26, + }, +}; + +export type Theme = keyof typeof THEMES | 'default'; + +export const getAutoTheme = (): Theme => { + const date = new Date(); + + const theme = Object.entries(THEMES).find(([, { month, day, durationInDays }]) => { + const startDate = new Date(date.getFullYear(), month, day); + const endDate = new Date(date.getFullYear(), month, day + durationInDays); + + return startDate <= date && date <= endDate; + }); + + return theme ? (theme[0] as Theme) : 'default'; +}; + +export const getLogo = (autoTheme: boolean) => { + if (!autoTheme) { + return '/tipi.png'; + } + + const theme = getAutoTheme(); + + switch (theme) { + case 'christmas': + return '/tipi-christmas.png'; + default: + return '/tipi.png'; + } +}; diff --git a/src/server/core/TipiConfig/TipiConfig.ts b/src/server/core/TipiConfig/TipiConfig.ts index 1f501bbb..d6a5fbd1 100644 --- a/src/server/core/TipiConfig/TipiConfig.ts +++ b/src/server/core/TipiConfig/TipiConfig.ts @@ -52,6 +52,7 @@ export class TipiConfig { demoMode: conf.DEMO_MODE, guestDashboard: conf.GUEST_DASHBOARD, seePreReleaseVersions: false, + allowAutoThemes: true, }; const parsedConfig = envSchema.safeParse({ ...envConfig, ...this.getFileConfig() });